From 4d2c3279517eba7c64eec627d462269f39bcdcd9 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Wed, 29 Dec 2010 09:53:50 +0000 Subject: [PATCH] kipperkart works with w5100 git-svn-id: http://svn.code.sf.net/p/netboot65/code@296 93682198-c243-4bdb-bd91-e943c89aac3b --- client/Makefile | 73 ++++++++++++++++++++------------ client/basic/bails.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.d64 | Bin 174848 -> 174848 bytes client/carts/Makefile | 37 ++++++++++++++-- client/cfg/c64_16kcart.cfg | 3 ++ client/drivers/w5100.s | 50 ++++++++++++++++++---- client/kipperterm2/Makefile | 11 +++-- client/test/Makefile | 2 +- client/test/test_wiznet.s | 3 +- client/wiznet/Makefile | 13 ++++++ client/wiznet/kipperwizdisk.d64 | Bin 0 -> 174848 bytes 11 files changed, 145 insertions(+), 47 deletions(-) create mode 100644 client/wiznet/Makefile create mode 100644 client/wiznet/kipperwizdisk.d64 diff --git a/client/Makefile b/client/Makefile index ff7f533..3099b42 100644 --- a/client/Makefile +++ b/client/Makefile @@ -1,45 +1,62 @@ TARGET=c64 -.PHONY: ip65 drivers test clean distclean carts examples basic kipperterm2 +.PHONY: ip65 drivers test clean distclean kipperterm2 examples carts basic wiznet -all: ip65 drivers test carts examples basic kipperterm2 +all: ip65 drivers test carts examples basic kipperterm2 wiznet ip65: make -C ip65 all -drivers: - make -C drivers all - -examples: - make -C examples all - -test: - make -C test TARGET=$(TARGET) all - -carts: - make -C carts all - -basic: - make -C basic all - -kipperterm2: - make -C kipperterm2 all +drivers: + make -C drivers all + +examples: + make -C examples all + + + +test: + make -C test TARGET=$(TARGET) all + + +kipperterm2: + make -C kipperterm2 all + + +carts: + make -C carts all + +basic: + make -C basic all + +wiznet: + make -C wiznet all + clean: - make -C ip65 clean + make -C ip65 clean + make -C drivers clean make -C test clean - make -C carts clean - make -C kipperterm2 clean - make -C basic clean + make -C carts clean + + make -C kipperterm2 clean + + make -C basic clean + distclean: - make -C ip65 distclean + make -C ip65 distclean + make -C drivers clean - make -C test distclean - make -C carts distclean - make -C kipperterm2 distclean - make -C basic distclean + make -C test distclean + + make -C carts distclean + + make -C kipperterm2 distclean + + make -C basic distclean + rm -f *~ diff --git a/client/basic/bails.d64 b/client/basic/bails.d64 index 9807d690c0362a4fa3f5f2d14060e21a921c74b9..319b598239e49e8e12d37d0f114970a6a263411f 100644 GIT binary patch delta 27 hcmZp;#?=5sTNvHaCJL}@cS~d3CfHWNxU7Q77yy-*3B&*Z delta 27 hcmZp;#?=5sTNvHawtJ;9ZWEj+z|vO1xU7Q77yy`d3CI8d diff --git a/client/basic/kipperbas.d64 b/client/basic/kipperbas.d64 index 9940325967c54c688876eebcb84ed97388063778..524b33b5d4df6bf789cb03cfa607b290bf65856c 100644 GIT binary patch delta 24 ecmZp;#?=5sTNq2zCJL~$m!>gpFHK`=cL4x<{Rub# delta 24 ecmZp;#?=5sTNq2z+AGr-w^ybywYy9dU;zMuAqhYL diff --git a/client/carts/Makefile b/client/carts/Makefile index 0a3339a..cb533a7 100644 --- a/client/carts/Makefile +++ b/client/carts/Makefile @@ -12,12 +12,28 @@ INCFILES=\ ../inc/version.i\ IP65LIB=../ip65/ip65.lib - IP65TCPLIB=../ip65/ip65_tcp.lib - C64RRNETLIB=../drivers/c64rrnet.lib +C64WIZNETLIB=../drivers/c64wiznet.lib +IP65WIZNETLIB=../ip65/ip65_wiznet.lib + +all: ip65 drivers\ + kkwiz.bin \ + kkwiz.prg \ + bobcart.bin \ + kipperkart.bin \ + kipperkart_rr.bin \ + netboot.bin \ + kipperterm.bin \ + kipperkart.prg \ + kipperterm.prg \ + kipperterm_rr.bin \ + kippergo.bin \ + kipperkart.prg \ + kippergo.prg \ + kippergo_rr.bin \ + kipperdisk.d64 \ -all: bobcart.bin kipperkart.bin kipperkart_rr.bin netboot.bin kipperterm.bin kipperkart.prg kipperterm.prg kipperterm_rr.bin kippergo.bin kipperkart.prg kippergo.prg kippergo_rr.bin kipperdisk.d64 kipperkart.o: kipperkart.s $(INCFILES) ../inc/ping.i ../inc/disk_transfer.i ../inc/sidplay.i ../inc/config_menu.i $(AS) $(AFLAGS) -o $@ $< @@ -34,6 +50,9 @@ kippergo.o: kippergo.s $(INCFILES) ../inc/gopher.i ../inc/telnet.i ../inc/config kipperkart.prg: kipperkart.bin c64_cart_ram_header.prg cat c64_cart_ram_header.prg kipperkart.bin > kipperkart.prg +kkwiz.prg: kkwiz.bin c64_cart_ram_header.prg + cat c64_cart_ram_header.prg kkwiz.bin > kkwiz.prg + kipperterm.prg: kipperterm.bin c64_cart_ram_header.prg cat c64_cart_ram_header.prg kipperterm.bin > kipperterm.prg @@ -89,6 +108,12 @@ bobcart.bin: bobcart.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64_8kcar $(LD) -m bobcart.map -vm -C ../cfg/c64_8kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64RRNETLIB) ruby fix_cart.rb $@ 8192 +kkwiz.bin: kipperkart.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c64_16kcart.cfg + $(LD) -m kkwiz.map -vm -C ../cfg/c64_16kcart.cfg -o $@ $< $(IP65WIZNETLIB) $(C64WIZNETLIB) + ruby fix_cart.rb $@ 16384 +# ruby set_ip_config.rb $@ mac auto + + d64_upload.d64: d64_upload.prg cp d64_upload.prg ../../server/boot/ @@ -99,3 +124,9 @@ clean: distclean: clean rm -f *~ + +ip65: + make -C ../ip65 all + +drivers: + make -C ../drivers all diff --git a/client/cfg/c64_16kcart.cfg b/client/cfg/c64_16kcart.cfg index 352bace..7823820 100644 --- a/client/cfg/c64_16kcart.cfg +++ b/client/cfg/c64_16kcart.cfg @@ -16,13 +16,16 @@ SEGMENTS { CARTRIDGE_HEADER: load = HEADER, type = ro; IP65_DEFAULTS: load = DEFAULTS, type = ro; CODE: load = ROM, type = ro; + RODATA: load = ROM, run=ROM, type = ro; DATA: load = ROM, run = RAM, type = rw, define = yes; SELF_MODIFIED_CODE: load = ROM, run = RAM2, type = rw, define = yes; + BSS: load = RAM, type = bss; APP_SCRATCH: load = RAM4, type = bss; TCP_VARS: load = RAM2, type = bss; HTTP_VARS: load=ROM, run = RAM3, type = rw,define = yes; + IP65ZP: load = IP65ZP, type = zp; ZEROPAGE: load = ZP, type = zp, optional=yes; } diff --git a/client/drivers/w5100.s b/client/drivers/w5100.s index 8001a43..a86f66f 100644 --- a/client/drivers/w5100.s +++ b/client/drivers/w5100.s @@ -66,9 +66,6 @@ DEFAULT_W5100_BASE = $DF20 .import ip65_process .import check_for_abort_key - .segment "IP65ZP" : zeropage - - .code @@ -752,6 +749,7 @@ tcp_rx: lda #$ff sta tcp_inbound_data_length sta tcp_inbound_data_length+1 + jsr @make_fake_eth_header jsr jmp_to_callback ;let the caller see the connection has closed sec ;don't poll the MAC RAW socket, else it may clobber the output buffer rts @@ -768,8 +766,11 @@ tcp_rx: ;20 bytes of TCP header stax tcp_inbound_data_ptr + + sta eth_ptr_lo stx eth_ptr_hi + lda #0 sta byte_ctr_lo sta byte_ctr_hi @@ -789,7 +790,7 @@ tcp_rx: ldax rx_rd_ptr jsr w5100_read_register jsr next_eth_packet_byte - + jsr @inc_rx_rd_ptr inc byte_ctr_lo @@ -824,7 +825,7 @@ tcp_rx: ldy #W5100_CMD_RECV jsr w5100_write_register - + jsr @make_fake_eth_header jsr jmp_to_callback ;let the caller see the connection has closed sec ;don't poll the MAC RAW socket, else it may clobber the output buffer rts @@ -850,7 +851,38 @@ tcp_rx: jsr w5100_read_register sta rx_rd_ptr rts + +;the function dispatcher (and possibly other parts of the ip65 stack) expect to find valid values in the eth_inp frame +;when processing tcp data +@make_fake_eth_header: + + .import ip_inp + .import udp_inp + ;first set the TCP protocol value + lda #6 ;TCP protocol number + sta ip_inp+9 ;proto number + ;now copy the remote IP address + ldx #0 +@ip_loop: + lda tcp_remote_ip,x + sta ip_inp+12,x ;src IP + inx + cpx #$04 + bne @ip_loop + + ;now the local & remote ports + lda tcp_connect_remote_port + sta udp_inp+1 ;remote port (lo byte) + lda tcp_connect_remote_port+1 + sta udp_inp+0 ;remote port (high byte) + lda tcp_local_port + sta udp_inp+3 ;local port (lo byte) + lda tcp_local_port+1 + sta udp_inp+2 ;local port (high byte) + + rts + jmp_to_callback: jmp (tcp_callback) @@ -988,9 +1020,11 @@ next_eth_packet_byte: eth_ptr_lo=next_eth_packet_byte+1 eth_ptr_hi=next_eth_packet_byte+2 +; .bss +; don't use BSS because we are out of room in the location that lives in the +; config used for 16K carts ($C010..$CFFF) +;there seems to be a little room still free in the seg used for SELF_MODIFIED_CODE - - .bss w5100_addr: .res 2 byte_ctr_lo: .res 1 byte_ctr_hi: .res 1 @@ -1009,8 +1043,8 @@ tcp_send_data_len: .res 2 tcp_send_data_ptr = eth_ptr_lo -tcp_inbound_data_ptr: .res 2 tcp_inbound_data_length: .res 2 +tcp_inbound_data_ptr: .res 2 tcp_connect_remote_port: .res 2 tcp_remote_ip = tcp_connect_ip diff --git a/client/kipperterm2/Makefile b/client/kipperterm2/Makefile index ce7d755..011397b 100644 --- a/client/kipperterm2/Makefile +++ b/client/kipperterm2/Makefile @@ -18,7 +18,7 @@ IP65WIZNETLIB=../ip65/ip65_wiznet.lib C64WIZNETLIB=../drivers/c64wiznet.lib -all: ip65 drivers kipperterm2.prg kipperterm2wiz.prg kipperterm2.d64 +all: ip65 drivers kipperterm2.prg kt2wiz.prg kipperterm2.d64 kipperterm2.o: kipperterm2.s $(INCFILES) ../inc/telnet.i ../inc/config_menu.i ../inc/gopher.i @@ -31,14 +31,13 @@ kipperterm2.o: kipperterm2.s $(INCFILES) ../inc/telnet.i ../inc/config_menu.i .. $(LD) -m $*.map -vm -C ../cfg/c64fullprg.cfg -o $*.prg $(AFLAGS) $< $(IP65TCPLIB) $(C64RRNETLIB) ruby ../carts/set_ip_config.rb $@ mac auto -kipperterm2wiz.prg: kipperterm2.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c64fullprg.cfg - $(LD) -m kipperterm2wiz.map -vm -C ../cfg/c64fullprg.cfg -o kipperterm2wiz.prg $(AFLAGS) $< $(IP65WIZNETLIB) $(C64WIZNETLIB) - cp kipperterm2wiz.prg ../../server/boot/autoexec.prg +kt2wiz.prg: kipperterm2.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c64fullprg.cfg + $(LD) -m kt2wiz.map -vm -C ../cfg/c64fullprg.cfg -o kt2wiz.prg $(AFLAGS) $< $(IP65WIZNETLIB) $(C64WIZNETLIB) + cp kt2wiz.prg ../../server/boot/autoexec.prg -kipperterm2.d64: kipperterm2.prg kipperterm2wiz.prg addresses.txt abe.bas +kipperterm2.d64: kipperterm2.prg kt2wiz.prg addresses.txt abe.bas ripxplore.rb --init CbmDos $@ -a kipperterm2.prg - ripxplore.rb $@ -a kipperterm2wiz.prg -t C64Prg ripxplore.rb $@ -a 80columns -t C64Prg ripxplore.rb $@ -a addresses.txt -t C64Seq ripxplore.rb $@ -a abe -t C64Prg diff --git a/client/test/Makefile b/client/test/Makefile index 26bb1ae..1517c2c 100644 --- a/client/test/Makefile +++ b/client/test/Makefile @@ -7,10 +7,10 @@ AFLAGS= IP65LIB=../ip65/ip65.lib -IP65WIZNETLIB=../ip65/ip65_wiznet.lib IP65TCPLIB=../ip65/ip65_tcp.lib C64RRNETLIB=../drivers/c64rrnet.lib C64WIZNETLIB=../drivers/c64wiznet.lib +IP65WIZNETLIB=../ip65/ip65_wiznet.lib APPLE2PROGLIB=../drivers/apple2prog.lib INCFILES=\ diff --git a/client/test/test_wiznet.s b/client/test/test_wiznet.s index 415e935..c27523c 100644 --- a/client/test/test_wiznet.s +++ b/client/test/test_wiznet.s @@ -365,7 +365,8 @@ tcp_callback_routine: @not_end_of_file: lda #14 jsr print_a ;switch to lower case - + + ldax tcp_inbound_data_ptr stax get_next_byte+1 diff --git a/client/wiznet/Makefile b/client/wiznet/Makefile new file mode 100644 index 0000000..dcc869c --- /dev/null +++ b/client/wiznet/Makefile @@ -0,0 +1,13 @@ + + +all: kipperwizdisk.d64 + +#../basic/wizkb.prg ../basic/wizbob.prg + +kipperwizdisk.d64: ../carts/kkwiz.prg ../kipperterm2/kt2wiz.prg + ripxplore.rb --init CbmDos $@ -a ../carts/kkwiz.prg + ripxplore.rb $@ -a ../kipperterm2/addresses.txt -t C64Seq + ripxplore.rb $@ -a ../kipperterm2/abe -t C64Prg + ripxplore.rb $@ -a ../kipperterm2/kt2wiz.prg -t C64Prg + ripxplore.rb $@ -a ../examples/webnoter.prg -t C64Prg + cp $@ ../../server/boot/ diff --git a/client/wiznet/kipperwizdisk.d64 b/client/wiznet/kipperwizdisk.d64 new file mode 100644 index 0000000000000000000000000000000000000000..2428a760b66ccc5f8b0b1f615e423d599e4186d3 GIT binary patch literal 174848 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 Sa0R#mTmh~CSK$A91^yRaiOE9% literal 0 HcmV?d00001