From 06e822c721547edfbb2dfc11b72ee6efe9aebb46 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Sun, 8 Aug 2010 09:02:30 +0000 Subject: [PATCH] git-svn-id: http://svn.code.sf.net/p/netboot65/code@263 93682198-c243-4bdb-bd91-e943c89aac3b --- client/basic/Makefile | 15 +- client/basic/kbload | Bin 156 -> 154 bytes client/basic/kipperbas.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.s | 724 +++++++++++++++++++++++++++++++++++-- client/basic/mlstub.s | 1 + client/cfg/kipperbas.cfg | 25 ++ client/ip65/tftp.s | 9 +- 7 files changed, 719 insertions(+), 55 deletions(-) create mode 100644 client/cfg/kipperbas.cfg diff --git a/client/basic/Makefile b/client/basic/Makefile index 15f4884..4b01c12 100644 --- a/client/basic/Makefile +++ b/client/basic/Makefile @@ -17,26 +17,19 @@ IP65LIB=../ip65/ip65_tcp.lib C64PROGLIB=../drivers/c64prog.lib -all: gopherd.d64 kipperbas.d64 +all: kipperbas.d64 %.o: %.s $(INCFILES) $(AS) $(AFLAGS) $< -%.prg: %.o $(IP65LIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64_mlstub.cfg - $(LD) -m $*.map -vm -C ../cfg/c64_mlstub.cfg -o $*.prg $(AFLAGS) $< $(IP65LIB) $(C64PROGLIB) - +%.prg: %.o $(IP65LIB) $(C64PROGLIB) $(INCFILES) ../cfg/kipperbas.cfg + $(LD) -m $*.map -vm -C ../cfg/kipperbas.cfg -o $*.prg $(AFLAGS) $< $(IP65LIB) $(C64PROGLIB) + kipperbas.d64: kipperbas.prg ripxplore.rb -r -e kbload $@ -o kbload ripxplore.rb -r -e kbapp $@ -o kbapp ripxplore.rb $@ -a kipperbas.prg - - -gopherd.d64: mlstub.prg gophermap.txt addresses.txt - ripxplore.rb -r -e gopherd $@ -o gopherd.bas - ripxplore.rb $@ -a mlstub.prg - ripxplore.rb $@ -a gophermap.txt -t C64Seq - ripxplore.rb $@ -a addresses.txt -t C64Seq clean: rm -f *.o *.bin *.map *.prg diff --git a/client/basic/kbload b/client/basic/kbload index 19cfcf89dcd75640e558344c1f2486166ca349d2..1ee3da0681f32d0b4be4f2e1bb2561b278c0ee1e 100644 GIT binary patch delta 24 fcmbQkIE!&Yr{Hvs0EWp*-cF7I0ZKX+3=9kaT2Tf2 delta 26 hcmbQmIEQgUr|?XU0EWp*-kt#gu0f6g0ZI%E3;=852H5}r diff --git a/client/basic/kipperbas.d64 b/client/basic/kipperbas.d64 index 1577517b7d216303dfdbe17739fcd66eefe4c759..19ef2f54bb58c7e40bc2e73665db0891254010cd 100644 GIT binary patch literal 174848 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 delta 453 zcmZp;#?^3*Yr)=y0)6!Yf(#Bm%nplK_p&h0{pD~<;5(4{*g_Mv{m>G)Gc1#U)AEdfZ@~!?h`v9CY`wO3CJ>FQ@Hg1#D%Xw%h;EAYW~mp z23bC@pZ!1#Xq-@}Y7%+nbI82>Xd%%9E_&Dbe4n zvXZxFK!9tIV?cnCj>SgCWZ`M4j2hDwQW-fAgpBb2|1!dV{>uyg`Ogkyqu}W=sf;Vw z8NHo+{2g7UFHB<;Rb^mk5)gox>*N@$7ZBvWV8H^AlfZxpNHz&FOrM>`C_SAyf$`r) Mfe(8&3T$cv0JA;9WdHyG diff --git a/client/basic/kipperbas.s b/client/basic/kipperbas.s index eb743ed..1af4261 100644 --- a/client/basic/kipperbas.s +++ b/client/basic/kipperbas.s @@ -1,11 +1,12 @@ .include "../inc/common.i" -;.include "../inc/commonprint.i" VARTAB = $2D ;BASIC variable table storage ARYTAB = $2F ;BASIC array table storage FREETOP = $33 ;bottom of string text storage area MEMSIZ = $37 ;highest address used by BASIC +VARNAM = $45 ;current BASIC variable name +VARPNT = $47 ; pointer to current BASIC variable value SETNAM = $FFBD SETLFS = $FFBA @@ -30,22 +31,74 @@ CHKCOM = $AEFD NEW = $A642 CLR = $A65E NEWSTT = $A7AE - +GETVAR = $B0E7 ;find or create a variable +FRMEVL = $AD9E ;evaluate expression +FRESTR = $B6A3 ;free temporary string + +VALTYP=$0D ;00=number, $FF=string + LINNUM = $14 ;Number returned by GETPAR crunched_line = $0200 ;Input buffer +.import copymem +.importzp copy_dest +.import dhcp_init +.import ip65_init +.import cfg_get_configuration_ptr +.import tcp_listen +.import tcp_callback +.import tcp_connect_ip +.import tcp_send +.import tcp_connect +.import tcp_close +.import tcp_send_data_len +.import tcp_inbound_data_ptr +.import tcp_inbound_data_length +.import dns_set_hostname +.import dns_resolve +.import dns_ip +.import ip65_process +.import ip65_error +.import cfg_ip +.import cfg_dns +.import cfg_gateway +.import cfg_netmask +.import cfg_tftp_server +.import icmp_ping +.import icmp_echo_ip +.import print_a +.import print_cr +.import dhcp_server +.import cfg_mac +.import cs_driver_name +.importzp tftp_filename +.import tftp_ip +.import tftp_download +.import tftp_set_callback_vector +.import tftp_data_block_length + .zeropage temp: .res 2 temp2: .res 2 - +pptr=temp .segment "STARTUP" ;this is what gets put at the start of the file on the C64 .word jump_table ; load address jump_table: jmp init ; $4000 (PTR 16384) - vars io$,io%,er% should be created (in that order!) before calling -.code +safe_getvar: ;if GETVAR doesn't find the desired variable name in the VARTABLE, a routine at $B11D will create it + ;however that routine checks if the low byte of the return address of the caller is $2A. if it is, + ;it assumes the caller is the routine at $AF28 which just wants to get the variable value, and + ;returns a pointer to a dummy 'zero' pointer. + ;so if user code that is calling GETVAR happens to be compiled to an address $xx28, it will + ;trigger this check, and not create a new variable, which (from painful experience) will create + ;a really nasty condition to debug! + ;so vector to GETVAR via here, so the return address seen by $B11D is here, and never $xx28 + jsr GETVAR + rts +.code ; ;BASIC extensions derived from BLARG - http://www.ffd2.com/fridge/programs/blarg/blarg.s ; @@ -65,9 +118,18 @@ install_new_vectors_loop: sta ICRUNCH,x dex bpl install_new_vectors_loop - rts - -; + + + ;BASIC keywords installed, now bring up the ip65 stack + + jsr ip65_init + bcs @init_failed + lda #0 + sta ip65_error + +@init_failed: + jmp set_error + ; CRUNCH -- If this is one of our keywords, then tokenize it ; crunch: @@ -215,16 +277,19 @@ list: jmp $A700 ;Normal exit -execute: - -; -; EXECUTE -- if this is one of my -; tokens, then execute it. -; -; jmp (oldexec) +; +; EXECUTE -- if this is one of our new +; tokens, then execute it. +execute: jsr CHRGET +execute_a: php + + cmp #$8B ;is it 'IF'? + bne @not_if + lda #$E0 ;our dummy IF token +@not_if: cmp #$E0 bcc @notmine cmp #HITOKEN @@ -243,21 +308,599 @@ execute: jmp CHRGET ;exit to routine (via RTS) @notmine: plp - cmp #0 + cmp #0 ;reset flags jmp $A7E7 - -goober: - inc $d020 - rts + +;the standard BASIC IF routine calls the BASIC EXECUTE routine directly, +;without going through the vector. That means an extended keyword following THEN +;will lead to a syntax error. So we have to reimpliment IF here +;this is taken from TransBASIC - The Transactor, vol 5, Issue 04 (March 1985) page 34 +if_keyword: + jsr FRMEVL ;evaluate expression + jsr CHRGOT + cmp #$89 ;is next token GOTO? + beq @ok + lda #$A7 ;is next token THEN + jsr $AEFF ;will generate SYNTAX ERROR if not +@ok: + jsr CHRGOT + ldx $61 ;result of expression : 0 means false + bne @expression_was_true + jmp $A93B ;go to REM implementation - skips rest of line +@expression_was_true: + bcs @not_numeric;CHRGOT clears carry flag if current char is a number + jmp $A8A0 ;do a GOTO +@not_numeric: + pla + pla ;pop the return address off the stack + jsr CHRGOT + jmp execute_a ;execute current token + +set_result_code: + pha + txa + pha + lda #'R'+$80 + sta VARNAM + lda #'C'+$80 + sta VARNAM+1 + jsr safe_getvar + ldy #0 + pla + sta (VARPNT),y + iny + pla + sta (VARPNT),y +clear_error: + lda #0 + sta ip65_error +set_error: + lda #'E'+$80 + sta VARNAM + lda #'R'+$80 + sta VARNAM+1 + jsr safe_getvar + lda #0 + tay + sta (VARPNT),y + iny + lda ip65_error + sta (VARPNT),y + + rts + + +;emit the 4 bytes pointed at by AX as dotted decimals +emit_dotted_quad: + sta pptr + stx pptr + 1 + ldy #0 + lda (pptr),y + jsr emit_decimal + lda #'.' + jsr emit_a + + ldy #1 + lda (pptr),y + jsr emit_decimal + lda #'.' + jsr emit_a + + ldy #2 + lda (pptr),y + jsr emit_decimal + lda #'.' + jsr emit_a + + ldy #3 + lda (pptr),y + jsr emit_decimal + + rts + +emit_decimal: ;emit byte in A as a decimal number + pha + sta temp_bin ;save + sed ; Switch to decimal mode + lda #0 ; Ensure the result is clear + sta temp_bcd + sta temp_bcd+1 + ldx #8 ; The number of source bits + : + asl temp_bin+0 ; Shift out one bit + lda temp_bcd+0 ; And add into result + adc temp_bcd+0 + sta temp_bcd+0 + lda temp_bcd+1 ; propagating any carry + adc temp_bcd+1 + sta temp_bcd+1 + dex ; And repeat for next bit + bne :- + + cld ;back to binary + + pla ;get back the original passed in number + bmi @emit_hundreds ; if N is set, the number is >=128 so emit all 3 digits + cmp #10 + bmi @emit_units + cmp #100 + bmi @emit_tens +@emit_hundreds: + lda temp_bcd+1 ;get the most significant digit + and #$0f + clc + adc #'0' + jsr emit_a + +@emit_tens: + lda temp_bcd + lsr + lsr + lsr + lsr + clc + adc #'0' + jsr emit_a +@emit_units: + lda temp_bcd + and #$0f + clc + adc #'0' + jsr emit_a + + rts + +print: + sta pptr + stx pptr + 1 + +@print_loop: + ldy #0 + lda (pptr),y + beq @done_print + jsr print_a + inc pptr + bne @print_loop + inc pptr+1 + bne @print_loop ;if we ever get to $ffff, we've probably gone far enough ;-) +@done_print: + rts +extract_string: + jsr FRMEVL + jsr $AD8F ;check result is a string, if not create type mismatch error + ldy $19 ;temp string created by FRMEVL + sty param_length + lda #0 + sta transfer_buffer,y + dey +@loop: + lda ($1a),y + sta transfer_buffer,y + dey + bpl @loop + jmp FRESTR ;free up the temp string created by FRMEVL + +;get a string value from BASIC command, turn into a 32 bit IP address,save it in the 4 bytes pointed at by AX +get_ip_parameter: + stax temp2 + jsr extract_string + ldax #transfer_buffer + jsr dns_set_hostname + + bcs @error + jsr dns_resolve + bcc @ok +@error: + ldax #dns_error + jsr print + sec + rts +@ok: + ldax #dns_ip + ldx #4 +@copy_dns_ip: + lda dns_ip,y + sta (temp2),y + iny + dex + bne @copy_dns_ip + rts + +print_dotted_quad: + ldy #string_buffer + sty current_output_ptr+1 + jsr emit_dotted_quad +make_null_terminated_and_print: + lda #0 + jsr emit_a + ldax #string_buffer + jmp print + +print_mac: + ldy #string_buffer + sty current_output_ptr+1 + jsr emit_mac + jmp make_null_terminated_and_print + +;print 6 bytes printed at by AX as a MAC address +emit_mac: + stax pptr + ldy #0 +@one_mac_digit: + tya ;just to set the Z flag + pha + beq @dont_print_colon + lda #':' + jsr emit_a +@dont_print_colon: + pla + tay + lda (pptr),y + jsr emit_hex + iny + cpy #06 + bne @one_mac_digit + rts + +emit_hex: + pha + pha + lsr + lsr + lsr + lsr + tax + lda hexdigits,x + jsr emit_a + pla + and #$0F + tax + lda hexdigits,x + jsr emit_a + pla + rts + +get_optional_byte: + jsr CHRGOT + beq @no_param ;leave X as it was + jsr CHKCOM ;make sure next char is a comma (and skip it) + jsr CHRGOT + beq @eol + jsr GETBYT +@no_param: + rts +@eol: + jmp $AF08 ;SYNTAX ERROR +ipcfg_keyword: + + ldax #interface_type + jsr print + + ldax #cs_driver_name + jsr print + jsr print_cr + + ldax #mac_address_msg + jsr print + ldax #cfg_mac + jsr print_mac + jsr print_cr + + ldax #ip_address_msg + jsr print + ldax #cfg_ip + jsr print_dotted_quad + jsr print_cr + + ldax #netmask_msg + jsr print + ldax #cfg_netmask + jsr print_dotted_quad + jsr print_cr + + ldax #gateway_msg + jsr print + ldax #cfg_gateway + jsr print_dotted_quad + jsr print_cr + + ldax #dns_server_msg + jsr print + ldax #cfg_dns + jsr print_dotted_quad + jsr print_cr + + + ldax #dhcp_server_msg + jsr print + ldax #dhcp_server + jsr print_dotted_quad + jsr print_cr + + ldax #tftp_server_msg + jsr print + ldax #cfg_tftp_server + jsr print_dotted_quad + jsr print_cr + + jmp clear_error + +dhcp_keyword: + jsr dhcp_init + bcc @init_ok + jsr ip65_init ;if DHCP failed, then reinit the IP stack (which will reset IP address etc that DHCP messed with to default values) + +@init_failed: + jsr set_error + ldax #dhcp_error + jmp print +@init_ok: + jmp clear_error + rts + +ping_keyword: + ldax #icmp_echo_ip + jsr get_ip_parameter + bcc @no_error + rts +@no_error: + + ;is there an optional parameter? + ldx #3 + jsr get_optional_byte + stx ping_counter + + ldax #pinging + jsr print + ldax #dns_ip + jsr print_dotted_quad + jsr print_cr + +@ping_loop: + jsr icmp_ping + bcs @error + jsr set_result_code + lda #'.' +@print_and_loop: + jsr print_a + dec ping_counter + bne @ping_loop + jsr print_cr + jmp set_error +@error: + lda #'!' + jmp @print_and_loop + + +myip_keyword: + ldax #cfg_ip + jmp get_ip_parameter + +dns_keyword: + ldax #cfg_dns + jmp get_ip_parameter + +gateway_keyword: + ldax #cfg_gateway + jmp get_ip_parameter + +netmask_keyword: + ldax #cfg_netmask + jmp get_ip_parameter + +tftp_keyword: + ldax #cfg_tftp_server + jmp get_ip_parameter + +tfget_keyword: + jsr extract_string + ldax #get_msg + jsr print + ldax #transfer_buffer + stax tftp_filename + jsr print + ldax #from_msg + jsr print + ldax #cfg_tftp_server + jsr print_dotted_quad + jsr print_cr + + ldx #$03 +: + lda cfg_tftp_server,x + sta tftp_ip,x + dex + bpl :- + ldax #tftp_download_callback + jsr tftp_set_callback_vector + lda #0 + sta file_opened +;make file output name + lda #'@' + sta string_buffer + lda #':' + sta string_buffer+1 + ldy #$FF +@loop: + iny + lda transfer_buffer,y + sta string_buffer+2,y + bne @loop + iny + iny + lda #',' + sta string_buffer,y + iny + lda #'P' + sta string_buffer,y + iny + lda #',' + sta string_buffer,y + iny + lda #'W' + sta string_buffer,y + iny + sta string_length + + jsr tftp_download + bcs @error + jsr close_file + rts +@error: + ldax #tftp_error +@error_set: + jsr print + jsr close_file + jmp set_error + +close_file: + lda #$02 ; filenumber 2 + jsr $FFC3 ; call CLOSE + rts + + +tftp_download_callback: + + ;buffer pointed at by AX now contains "tftp_data_block_length" bytes + stax temp + + lda #'.' + jsr print_a + lda file_opened + bne @already_opened + lda string_length + ldx #string_buffer + + ;A,X,Y set up ready for a call to SETNAM for file #2 + jsr $FFBD ; call SETNAM + lda #$02 ; file number 2 + ldx $BA ; last used drive + + ldy #$02 ; secondary address 2 + jsr $FFBA ; call SETLFS + + jsr $FFC0 ; call OPEN + +@already_opened: + + ldx #$02 ; filenumber 2 = output file + jsr $FFC9 ; call CHKOUT + +@copy_one_byte: + lda tftp_data_block_length + bne @not_done + lda tftp_data_block_length+1 + beq @done + +@not_done: + ldy #2 ;we want to skip the first 2 bytes in the buffer + lda (temp),y + jsr $ffd2 ;write byte + inc temp + bne :+ + inc temp+1 +: + lda tftp_data_block_length + dec tftp_data_block_length + cmp #0 + bne @copy_one_byte + dec tftp_data_block_length+1 + jmp @copy_one_byte +@done: + + ldx #$00 ; filenumber 0 = console + jsr $FFC9 ; call CHKOUT + + rts + .rodata vectors: .word crunch .word list .word execute - -.data + +; Keyword list +; Keywords are stored as normal text, +; followed by the token number. +; All tokens are >$80, +; so they easily mark the end of the keyword +hexdigits: +.byte "0123456789ABCDEF" + +pinging: +.byte"PINGING ",0 +interface_type: +.byte "INTERFACE : ",0 + +mac_address_msg: +.byte "MAC ADDRESS : ", 0 + +ip_address_msg: +.byte "IP ADDRESS : ", 0 + +netmask_msg: +.byte "NETMASK : ", 0 + +gateway_msg: +.byte "GATEWAY : ", 0 + +dns_server_msg: +.byte "DNS SERVER : ", 0 + +dhcp_server_msg: +.byte "DHCP SERVER : ", 0 + +tftp_server_msg: +.byte "TFTP SERVER : ", 0 + +dns_error: +.byte "ADDRESS RESOLUTION ERROR",0 +get_msg: +.byte "GETTING ",0 +from_msg: +.byte " FROM ",0 +tftp_error: +.byte "TFTP ERROR",0 +dhcp_error: +.byte "DHCP INITIALIZATION ERROR",13,0 +keywords: + .byte "IF",$E0 ;our dummy 'IF' entry takes $E0 + .byte "IPCFG",$E1 + .byte "DHCP",$E2 + .byte "PING",$E3 + .byte "MYIP",$E4 + .byte "NETMASK",$E5 + .byte "GATEWAY",$E6 + .byte "DNS",$E7 + .byte "TFTP",$E8 + .byte "TFGET",$E9 + .byte "TF",$A1,$E9 ;since BASIC will replace GET with A1 + + .byte $00 ;end of list +HITOKEN=$EA + +; +; Table of token locations-1 +; +token_routines: +E0: .word if_keyword-1 +E1: .word ipcfg_keyword-1 +E2: .word dhcp_keyword-1 +E3: .word ping_keyword-1 +E4: .word myip_keyword-1 +E5: .word netmask_keyword-1 +E6: .word gateway_keyword-1 +E7: .word dns_keyword-1 +E8: .word tftp_keyword-1 +E9: .word tfget_keyword-1 +.segment "SELF_MODIFIED_CODE" jmp_crunch: .byte $4C ;JMP @@ -265,22 +908,29 @@ oldcrunch: .res 2 ;Old CRUNCH vector oldlist: .res 2 oldexec: .res 2 +emit_a: +current_output_ptr=emit_a+1 + sta $ffff + inc string_length + inc current_output_ptr + bne :+ + inc current_output_ptr+1 +: + rts -; Keyword list -; Keywords are stored as normal text, -; followed by the token number. -; All tokens are >$80, -; so they easily mark the end of the keyword -keywords: - .byte "FIZZ",$E0 - .byte $00 ;end of list -HITOKEN=$E1 -; -; Table of token locations-1 -; Subtract $E0 first -; Then check to make sure number isn't greater than NUMWORDS -; -token_routines: -E0: .word goober-1 \ No newline at end of file +.bss +string_length: .res 1 +param_length: .res 1 +ip_string: .res 15 +netmask_string: .res 15 +dns_string: .res 15 +gateway_string: .res 15 + temp_bin: .res 1 +temp_bcd: .res 2 +ping_counter: .res 1 +string_buffer: .res 128 +transfer_buffer: .res 256 +file_opened: .res 1 + \ No newline at end of file diff --git a/client/basic/mlstub.s b/client/basic/mlstub.s index 59d0a89..23ad8e0 100644 --- a/client/basic/mlstub.s +++ b/client/basic/mlstub.s @@ -33,6 +33,7 @@ CLOSE=$FFC3 .import dns_resolve .import dns_ip .import ip65_process +.import icmp_echo_ip .zeropage temp_buff: .res 2 diff --git a/client/cfg/kipperbas.cfg b/client/cfg/kipperbas.cfg new file mode 100644 index 0000000..a074110 --- /dev/null +++ b/client/cfg/kipperbas.cfg @@ -0,0 +1,25 @@ +# CA65 config for a M/L stub that will use memory from $6000..$A000 and $c010..$cfff + +MEMORY { + IP65ZP: start = $A3, size = $12, type = rw; + MAINRAM: start = $3ffe, size = $3FC9, define = yes, file = %O; + HIRAM: start = $C010, size = $0fE0; + +} + + + SEGMENTS { + STARTUP: load = MAINRAM, type = ro; + IP65_DEFAULTS: load = MAINRAM, type = ro; + CODE: load = MAINRAM, type = ro; + SELF_MODIFIED_CODE: load = MAINRAM, type = rw; + RODATA: load = MAINRAM, type = ro; + DATA: load = MAINRAM, type = rw, define = yes; + BSS: load = MAINRAM, type = bss; + + IP65ZP: load = IP65ZP, type = zp; + + ZEROPAGE: load = IP65ZP, type = zp; + + TCP_VARS: load = HIRAM, type = bss; + } diff --git a/client/ip65/tftp.s b/client/ip65/tftp.s index 3bd3d41..6b6bd53 100644 --- a/client/ip65/tftp.s +++ b/client/ip65/tftp.s @@ -18,7 +18,6 @@ .export tftp_upload .export tftp_data_block_length .export tftp_set_callback_vector - .export tftp_data_block_length .export tftp_clear_callbacks .export tftp_filesize .export tftp_upload_from_memory @@ -105,12 +104,7 @@ tftp_bytes_remaining: .res 2 ; outputs: carry flag is set if there was an error ; if a callback vector has been set with tftp_set_callback_vector ; then the specified routine will be called once for each 512 byte packet -; sent from the tftp server (each time AX will point at data block just arrived, -; and tftp_data_block_length will contain number of bytes in that data block) -; otherwise, the buffer at tftp_load_address will be filled -; with file downloaded. -; tftp_load_address: will be set to the actual address loaded into (NB - this field is -; ignored if a callback vector has been set with tftp_set_callback_vector) +; to be sent to the tftp server tftp_upload_from_memory: ldax #copy_ram_to_tftp_block jsr tftp_set_callback_vector @@ -559,6 +553,7 @@ copy_ram_to_tftp_block: ; outputs: none tftp_set_callback_vector: stax tftp_callback_vector+1 + inc tftp_callback_address_set rts ;clear callback vectors, i.e. all future transfers read from/write to RAM