From c006b14720554041f98a73a4aa470d2c5058f6e3 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Mon, 4 Jul 2011 18:51:51 +0000 Subject: [PATCH] git-svn-id: http://svn.code.sf.net/p/netboot65/code@318 93682198-c243-4bdb-bd91-e943c89aac3b --- client/basic/Makefile | 12 +- client/basic/bails.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.s | 10 +- client/carts/Makefile | 9 + client/carts/cartheader.s | 54 ++++ client/carts/telnetd.s | 366 ++++++++++++++++++++++++++ client/carts/timestamp.rb | 1 + client/drivers/w5100.s | 31 ++- client/ip65/udp.s | 4 +- client/wiznet/Makefile | 11 +- client/wiznet/wiztest.s | 514 +++++++++++++++++++++++++++---------- dist/version_number.txt | 2 +- server/lib/tftp_server.rb | 6 +- 14 files changed, 854 insertions(+), 166 deletions(-) create mode 100644 client/carts/cartheader.s create mode 100644 client/carts/telnetd.s create mode 100644 client/carts/timestamp.rb diff --git a/client/basic/Makefile b/client/basic/Makefile index 62c3a66..3034cf7 100644 --- a/client/basic/Makefile +++ b/client/basic/Makefile @@ -20,7 +20,8 @@ all: ip65 kipperbas.d64 bails.d64 kipperbasv20.prg ip65: make -C ../ip65 all -%.o: %.s $(INCFILES) +%.o: %.s $(INCFILES) timestamp.rb + ruby timestamp.rb > timestamp.i $(AS) $(AFLAGS) $< %.prg: %.o $(IP65LIB) $(C64RRNETLIB) $(INCFILES) ../cfg/kipperbas.cfg @@ -36,12 +37,13 @@ bails.d64: bails.prg # ripxplore.rb $@ -I CbmDos -a kipperbas.prg ripxplore.rb $@ -a bails.prg -kipperbas.d64: kipperbas.prg +kipperbas.d64: kipperbas.prg chat # ripxplore.rb -r -e kbload $@ -o kbload # ripxplore.rb -r -e kbapp $@ -o kbapp -# ripxplore.rb $@ -I CbmDos -a kipperbas.prg - ripxplore.rb $@ -a kipperbas.prg - + ripxplore.rb $@ -I CbmDos -a kipperbas.prg +# ripxplore.rb $@ -a kipperbas.prg + cp chat autoexec.bas +# ripxplore.rb $@ -a autoexec.bas -t C64Prg clean: rm -f *.o *.bin *.map *.prg diff --git a/client/basic/bails.d64 b/client/basic/bails.d64 index 83a7710d8ef17d0eaee084205b81a06d1e4f6a55..0bd5f6b2811f68b6d1ea251914b872007cb3a894 100644 GIT binary patch delta 6761 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 CX|FN> delta 6837 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 KPV02nX8#|rg=x0{ delta 7888 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 timestamp.i $(AS) $(AFLAGS) $< kipperkart.prg: kipperkart.bin c64_cart_ram_header.prg @@ -120,6 +122,13 @@ kkwiz_rr.bin: kkwiz.bin cat rrnet_header.bin kkwiz.bin > kkwiz_rr.bin ruby fix_cart.rb $@ 32768 cp kkwiz_rr.bin ../wiznet/ + +telnetd.bin: telnetd.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64_8kcart.cfg + $(LD) -m telnetd.map -vm -C ../cfg/c64_8kcart.cfg -o $@ $< $(IP65TCPLIB) $(C64RRNETLIB) + ruby ../carts/fix_cart.rb $@ 8192 + +telnetd.prg: telnetd.bin cartheader.prg + cat cartheader.prg telnetd.bin > $@ d64_upload.d64: d64_upload.prg cp d64_upload.prg ../../server/boot/ diff --git a/client/carts/cartheader.s b/client/carts/cartheader.s new file mode 100644 index 0000000..f49c65c --- /dev/null +++ b/client/carts/cartheader.s @@ -0,0 +1,54 @@ + +.include "../inc/common.i" + +.import copymem +.importzp copy_src +.importzp copy_dest + +.segment "STARTUP" ;this is what gets put at the start of the file on the C64 + +.word basicstub ; load address + +basicstub: + .word @nextline + .word 2003 + .byte $9e + .byte <(((init / 1000) .mod 10) + $30) + .byte <(((init / 100 ) .mod 10) + $30) + .byte <(((init / 10 ) .mod 10) + $30) + .byte <(((init ) .mod 10) + $30) + .byte 0 +@nextline: + .word 0 + +init: + +;copy BASIC to RAM + ldax #$A000 + stax copy_src + stax copy_dest + ldax #$2000 + jsr copymem + +;copy cart data from end of file to $8000 (RAM) + ldax #cart_data + stax copy_src + ldax #$8000 + stax copy_dest + ldax #$2000 + jsr copymem + +;swap out the cartridge (also swaps out BASIC) + + lda $01 + and #$fe ;reset bit 0 + sta $01 + +;execute the cartridge from RAM + jmp ($8002) + + +.bss + +cart_data: ;this should point to where the cart data gets appended. + .res $2000 \ No newline at end of file diff --git a/client/carts/telnetd.s b/client/carts/telnetd.s new file mode 100644 index 0000000..9846b00 --- /dev/null +++ b/client/carts/telnetd.s @@ -0,0 +1,366 @@ +; ############# +; +; jonno@jamtronix.com - June 2011 +; Telnet server cartridge +; + +TELNET_PORT=6400 + .include "../inc/common.i" + .include "../inc/commonprint.i" + + .import ip65_init + .import dhcp_init + .import w5100_set_ip_config + .import cls + .import beep + .import exit_to_basic + .import timer_vbl_handler + .import get_key_ip65 + .import cfg_mac + .import cfg_size + .import cfg_ip + .import cfg_netmask + .import cfg_gateway + .import cfg_dns + .import cfg_tftp_server + .import cfg_get_configuration_ptr + .import ip65_process + .import copymem + .import tcp_listen + .import tcp_callback + .import tcp_send + .import tcp_send_data_len + .import tcp_inbound_data_length + .import tcp_inbound_data_ptr + .import tcp_state + .importzp copy_src + .importzp copy_dest + buffer_ptr=copy_dest + .import __DATA_LOAD__ + .import __DATA_RUN__ + .import __DATA_SIZE__ + .import __SELF_MODIFIED_CODE_LOAD__ + .import __SELF_MODIFIED_CODE_RUN__ + .import __SELF_MODIFIED_CODE_SIZE__ + + + CINV=$314 ;vector to IRQ interrupt routine + ISTOP=$328;vector to kernal routine to check if STOP key pressed + KEYD=$277 ;input keyboard buffer + NDX=$C6 ;number of keypresses in buffer + XMAX=$289 ;max keypresses in buffer + STKEY=$91 ;last key pressed + + INIT_MAGIC_VALUE=$C7 +.segment "CARTRIDGE_HEADER" +.word cold_init ;cold start vector +.word warm_init ;warm start vector +.byte $C3,$C2,$CD,$38,$30 ; "CBM80" +.byte $0,$0,$0 ;reserved for future use +.byte $0,$0,$0 ;reserved for future use +.byte $0,$0,$0 ;reserved for future use +.byte $0,$0,$0 ;reserved for future use +.byte $0,$0,$0 ;reserved for future use + +.code + + + +cold_init: + + ;first let the kernal do a normal startup + sei + jsr $fda3 ;initialize CIA I/O + jsr $fd50 ;RAM test, set pointers + jsr $fd15 ;set vectors for KERNAL + jsr $ff5B ;init. VIC + cli ;KERNAL init. finished + +warm_init: + lda #INIT_MAGIC_VALUE + cmp init_flag + bne @real_init + jmp $fe5e ; contine on to real RESTORE routine +@real_init: + sta init_flag + + + ;we need to set up BASIC as well + jsr $e453 ;set BASIC vectors + jsr $e3bf ;initialize zero page + +;relocate our r/w data + ldax #__DATA_LOAD__ + stax copy_src + ldax #__DATA_RUN__ + stax copy_dest + ldax #__DATA_SIZE__ + jsr copymem + ldax #__SELF_MODIFIED_CODE_LOAD__ + stax copy_src + ldax #__SELF_MODIFIED_CODE_RUN__ + stax copy_dest + ldax #__SELF_MODIFIED_CODE_SIZE__ + jsr copymem + + +;set normal BASIC colour + LDA #$0e ;light blue + STA $D020 ;border + LDA #$06 ;dark blue + STA $D021 ;background + lda #$9a + jsr print_a + + ;copy KERNAL to RAM so we can patch it + + + ldax #startup_msg + jsr print + jsr ip65_init + + bcs init_failed + jsr dhcp_init + bcc init_ok +init_failed: + + jsr print_errorcode + jsr print_ip_config + jsr print_cr + +flash_forever: + inc $d020 + jmp flash_forever +init_ok: + +;install our new IRQ handler + sei + ldax CINV + stax old_tick_handler + ldax #tick_handler + stax CINV + +;install our new STOP handler + + ldax ISTOP + stax old_stop_handler + ldax #stop_handler + stax ISTOP + + cli + +start_listening: + + ldax #telnet_callback + stax tcp_callback + ldax #listening + jsr print + ldax #cfg_ip + jsr print_dotted_quad + ldax #port + jsr print + + ;we need to copy BASIC as well since swapping KERNAL forces swap of BASIC + ldax #$8000 + stax copy_src + stax copy_dest + ldax #$4000 + jsr copymem + + ldax #$E000 + stax copy_src + stax copy_dest + ldax #$2000 + jsr copymem + + ;now intercept calls to $E716 + ;we do this instead of using the $326 vector because the BASIC + ;'READY' loop calls $E716 directly rather than calling $FFD2 + + lda #$4C ;JMP + sta $e716 + ldax #new_charout + stax $e717 + + + ;swap out BASIC & KERNAL + lda #$35 + sta $01 + + + ldax #TELNET_PORT + jsr tcp_listen + ldax #term_setup_string_length + sta tcp_send_data_len + ldax #term_setup_string + jsr tcp_send + + + jmp $E397 + +wait_for_keypress: + ldax #press_a_key_to_continue + jsr print +@loop: + jsr $ffe4 + beq @loop + rts + +get_key: +@loop: + jsr $ffe4 + beq @loop + rts + + +tick_handler: ;called at least 60hz via $314 + lda sending_flag + bne @done + inc jiffy_count + lda jiffy_count + cmp #$06 ;about 100ms + bne @done + lda #0 + sta jiffy_count + lda tcp_state + beq @done + jsr ip65_process +@done: + jmp (old_tick_handler) + + +telnet_callback: + lda tcp_inbound_data_length+1 + cmp #$ff + bne @not_eof + ldax #connection_closed + jsr print + + jmp start_listening + +@not_eof: + ldax tcp_inbound_data_ptr + stax buffer_ptr + ldy #0 + +@next_byte: + ldx NDX + cpx XMAX + beq @done + + lda (buffer_ptr),y + cmp #$03 ;is ^C? + bne @not_ctrl_c + inc break_flag + jmp @key_done +@not_ctrl_c: + inc NDX + sta KEYD,x +@key_done: + iny + cpy tcp_inbound_data_length + bne @next_byte + @done: + rts + +new_charout: + pha ;original $e716 code we patched over + sta $d7 ;original $e716 code we patched over + stx temp_x + sty temp_y + sta output_buffer + pha + ldax #1 + sta tcp_send_data_len + sta sending_flag + ldax #output_buffer + jsr tcp_send + dec sending_flag + pla + ldx temp_x + ldy temp_y + jmp $e719 ;after the code we patched + +stop_handler: + + lda break_flag + beq @no_stop + + lda #$7F + sta $91 + lda #0 + sta break_flag +@no_stop: + jmp (old_stop_handler) + +.bss +init_flag: .res 1 +old_tick_handler: .res 2 +old_stop_handler: .res 2 +temp_x : .res 1 +temp_y : .res 1 +output_buffer: .res 64 + +.data +jiffy_count: .byte 0 +break_flag: .byte 0 +sending_flag: .byte 0 +.rodata + +startup_msg: +.byte 147 ;cls +;.byte 14 ;lower case +.byte 142 ;upper case +.byte 13,"TELNETD " +.include "../inc/version.i" +.include "timestamp.i" +.byte 13 +.byte 0 +listening: +.byte 13,"LISTENING ON " +.byte 0 +port: +.byte ":" +.if (TELNET_PORT > 999 ) +.byte <(((TELNET_PORT / 1000) .mod 10) + $30) +.endif +.if TELNET_PORT>99 +.byte <(((TELNET_PORT / 100 ) .mod 10) + $30) +.endif +.byte <(((TELNET_PORT / 10 ) .mod 10) + $30) +.byte <(((TELNET_PORT ) .mod 10) + $30) +.byte 13 +.byte "HIT RUN/STOP TO ABORT" +.byte 0 + +connection_closed: +.byte 13,"CONNECTION CLOSED",13,0 + +term_setup_string: + + .byte 142 ;upper case + .byte 147 ;cls +term_setup_string_length=*-term_setup_string + +;we need a 'dummy' segment here - some drivers use this segment (e.g. wiznet), some don't (e.g. rr-net) +;if we don't declare this, we get an 'undefined segment' error when linking to a driver that doesn't use it. +.segment "SELF_MODIFIED_CODE" + +;-- LICENSE FOR wizboot.s -- +; The contents of this file are subject to the Mozilla Public License +; Version 1.1 (the "License"); you may not use this file except in +; compliance with the License. You may obtain a copy of the License at +; http://www.mozilla.org/MPL/ +; +; Software distributed under the License is distributed on an "AS IS" +; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +; License for the specific language governing rights and limitations +; under the License. +; +; The Original Code is wizboot. +; +; The Initial Developer of the Original Code is Jonno Downes, +; jonno@jamtronix.com. +; Portions created by the Initial Developer are Copyright (C) 2011 +; Jonno Downes. All Rights Reserved. +; -- LICENSE END -- diff --git a/client/carts/timestamp.rb b/client/carts/timestamp.rb new file mode 100644 index 0000000..a061cf9 --- /dev/null +++ b/client/carts/timestamp.rb @@ -0,0 +1 @@ +puts Time.now.strftime(".byte \" (%Y-%m-%d)\"") \ No newline at end of file diff --git a/client/drivers/w5100.s b/client/drivers/w5100.s index 68cb16c..f04e10f 100644 --- a/client/drivers/w5100.s +++ b/client/drivers/w5100.s @@ -57,7 +57,7 @@ WIZNET_DATA_REG = WIZNET_BASE+3 .export tcp_send .export tcp_send_keep_alive .export tcp_close - .export tcp_connected + .export tcp_state .export tcp_connect_remote_port .export tcp_remote_ip @@ -160,9 +160,9 @@ eth_init: sta WIZNET_ADDR_LO lda #W5100_CMD_OPEN sta WIZNET_DATA_REG - - lda #0 - sta tcp_connected + + lda #tcp_cxn_state_closed + sta tcp_state clc rts @@ -203,7 +203,7 @@ eth_rx: ;we shoe horn a check for data on the TCP socket here ;if we do get TCP data, we will call the TCP callback routine ;but we hide all of this from the ip65 stack proper. - lda tcp_connected + lda tcp_state beq @no_tcp jsr tcp_rx @@ -479,7 +479,9 @@ tcp_listen: jsr w5100_read_register cmp #W5100_STATUS_SOCK_ESTABLISHED bne @listen_loop - inc tcp_connected + + lda #tcp_cxn_state_established + sta tcp_state ;copy the remote IP address & port number ldax #W5100_S1_DIPR0 @@ -557,7 +559,9 @@ tcp_connect: jmp @set_error_and_exit @ok: - inc tcp_connected + lda #tcp_cxn_state_established + sta tcp_state + clc rts @error: @@ -751,8 +755,8 @@ tcp_rx: cmp #W5100_STATUS_SOCK_ESTABLISHED beq @connected_but_no_data ;no longer connected - lda #0 - sta tcp_connected + lda #tcp_cxn_state_closed + sta tcp_state lda #$ff sta tcp_inbound_data_length @@ -938,7 +942,7 @@ setup_tcp_socket: sta WIZNET_DATA_REG lda #0 - sta tcp_connected + sta tcp_state ldax #W5100_S1_MR ldy #W5100_MODE_TCP @@ -1011,7 +1015,7 @@ eth_ptr_hi=next_eth_packet_byte+2 rx_rd_ptr: .res 2 tcp_local_port: .res 2 -tcp_connected: .res 1 +tcp_state: .res 1 tcp_connect_ip: .res 4 ;ip address of remote server to connect to tcp_callback: .res 2 ;vector to routine to be called when data is received over tcp connection @@ -1027,6 +1031,11 @@ tcp_inbound_data_ptr: .res 2 tcp_connect_remote_port: .res 2 tcp_remote_ip = tcp_connect_ip +tcp_cxn_state_closed = 0 +tcp_cxn_state_listening = 1 ;(waiting for an inbound SYN) +tcp_cxn_state_syn_sent = 2 ;(waiting for an inbound SYN/ACK) +tcp_cxn_state_established = 3 ; + ;-- LICENSE FOR w5100a.s -- ; The contents of this file are subject to the Mozilla Public License diff --git a/client/ip65/udp.s b/client/ip65/udp.s index cabbb71..7a4ebe9 100644 --- a/client/ip65/udp.s +++ b/client/ip65/udp.s @@ -135,9 +135,7 @@ udp_process: bpl @checkport @drop: - lda #KPR_ERROR_NO_SUCH_LISTENER - sta ip65_error - sec + sec rts @handle: diff --git a/client/wiznet/Makefile b/client/wiznet/Makefile index 874edb8..ecc6925 100644 --- a/client/wiznet/Makefile +++ b/client/wiznet/Makefile @@ -28,6 +28,7 @@ all: ip65 drivers\ telnetd.prg \ wizbobcart.prg \ kt2wiz.d64 \ + wiztest.d64 \ bootc64.prg \ %.o: %.s $(INCFILES) timestamp.rb @@ -46,6 +47,9 @@ wizboot.bin: wizboot.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c64_8 wizboot.prg: wizboot.bin cartheader.prg cat cartheader.prg wizboot.bin > $@ +telnetd.o: ../carts/telnetd.s $(INCFILES) timestamp.rb + $(AS) $(AFLAGS) ../carts/telnetd.s -o telnetd.o + telnetd.bin: telnetd.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c64_8kcart.cfg $(LD) -m telnetd.map -vm -C ../cfg/c64_8kcart.cfg -o $@ $< $(IP65WIZNETLIB) $(C64WIZNETLIB) ruby ../carts/fix_cart.rb $@ 8192 @@ -60,6 +64,9 @@ wizbobcart.bin: wizbobcart.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) wizbob wizbobcart.prg: wizbobcart.bin cartheader.prg cat cartheader.prg wizbobcart.bin > $@ +wiztest.d64: wiztest.prg + ripxplore.rb -I CbmDos -a wiztest.prg $@ + clean: rm -f *.o *.bin *.map *.prg *.pg2 *.dsk *.d64 @@ -77,7 +84,7 @@ kt2wiz.d64: bootc64.prg: - cp wizbobcart.prg ../../server/boot/bootc64.prg +# cp wizbobcart.prg ../../server/boot/bootc64.prg # cp telnetd.prg ../../server/boot/bootc64.prg # cp wizboot2.prg ../../server/boot/bootc64.prg -# cp wiztest.prg ../../server/boot/bootc64.prg \ No newline at end of file + cp wiztest.prg ../../server/boot/bootc64.prg \ No newline at end of file diff --git a/client/wiznet/wiztest.s b/client/wiznet/wiztest.s index 8e1bee3..2ac58a5 100644 --- a/client/wiznet/wiztest.s +++ b/client/wiznet/wiztest.s @@ -7,16 +7,18 @@ WIZNET_BASE=$DE04 -;WIZNET_BASE=$DF20 WIZNET_MODE_REG = WIZNET_BASE WIZNET_ADDR_HI = WIZNET_BASE+1 WIZNET_ADDR_LO = WIZNET_BASE+2 WIZNET_DATA_REG = WIZNET_BASE+3 -TEST_LOOPS=$1F +TEST_LOOPS=$FF TX_BUFFER_START_PAGE=$40 +TIMER_POSITION_ROW=5 +TIMER_POSITION_COL=15 +TIMER_POSITION=$400+TIMER_POSITION_ROW*40+TIMER_POSITION_COL ; load A/X macro .macro ldax arg @@ -56,43 +58,262 @@ basicstub: .word 0 init: + - lda $de01 - eor #$01 - sta $de01 ;enable clock port + ;set funky colours + lda #$06 ; + sta $D020 ;border + lda #$00 ;dark blue + sta $D021 ;background + + + ldax #banner + jsr print + + lda $de01 + ora #1 ;turn on clockport + sta $de01 - lda #147 ;cls - jsr print_a - lda #142 ;go to upper case mode - jsr print_a lda #$80 ;reset sta WIZNET_MODE_REG lda WIZNET_MODE_REG beq @reset_ok - jmp @error ;writing a byte to the MODE register with bit 7 set should reset. + ;writing a byte to the MODE register with bit 7 set should reset. ;after a reset, mode register is zero ;therefore, if there is a real W5100 at the specified address, ;we should be able to write a $80 and read back a $00 +@error: + ldax #not_found + jsr print + lda #>WIZNET_MODE_REG + jsr print_hex + lda #WIZNET_MODE_REG + jsr print_hex + lda #WIZNET_MODE_REG - jsr print_hex - lda #