diff --git a/client/basic/KB.htm b/client/basic/KB.htm index ada56fc..bfba08f 100644 --- a/client/basic/KB.htm +++ b/client/basic/KB.htm @@ -119,8 +119,9 @@ are also set to indicate current connection state and error conditions (if any). none POLL + TCPSEND - Send a string (up to 255 bytes) over a previously opened connection.Integer variables CO% and ER% ae aset to indicate current connection state and any error condition which may occur during the sending of the file. NB - in the current implementation of Kipper BASIC, it is possible for data to arrive during a call to TCPSEND, which may not be passed through to the BASIC program. + Send a string (up to 255 bytes) over a previously opened connection.Integer variables CO% and ER% are set to indicate current connection state and any error condition which may occur during the sending of the file. NB - in the current implementation of Kipper BASIC, it is possible for data to arrive during a call to TCPSEND, which may not be passed through to the BASIC program.
  • data (string)
  • TCPSEND"HELLO "+"WORLD" @@ -129,7 +130,17 @@ are also set to indicate current connection state and error conditions (if any). Send a file (of any length) over a previously opened connection. The file will be looked for on the current 'default' device, i.e. which ever drive was last accessed. Integer variables CO% and ER% ae aset to indicate current connection state and any error condition which may occur during the sending of the file. NB - in the current implementation of Kipper BASIC, it is possible for data to arrive during a call to TCPSEND, which may not be passed through to the BASIC program.
  • filename (string)
  • TCPBLAT"GOPHERMAP.TXT" - + + + UDPSEND + Send a string (up to 255 bytes) over UDP . There is no need to connect first + +
  • destination hostname or IP address (string) +
  • destination port number (1..65535) +
  • local port number (1..65535) +
  • data (string) + +
  • UDPSEND"JAMTRONIX.COM",7,6464,"echo test" diff --git a/client/basic/Makefile b/client/basic/Makefile index 2cd4580..c2d6d83 100644 --- a/client/basic/Makefile +++ b/client/basic/Makefile @@ -32,18 +32,11 @@ kipperbasv20.prg: kipperbasv20.o $(IP65LIB) $(VIC20RRNETLIB) $(INCFILES) ../cfg/ bails.d64: bails.prg -# ripxplore.rb -r -e kbload $@ -o kbload -# ripxplore.rb -r -e kbapp $@ -o kbapp -# ripxplore.rb $@ -I CbmDos -a kipperbas.prg - ripxplore.rb $@ -a bails.prg + c1541 -format bails,bb d64 $@ -attach $@ -write bails.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 - cp chat autoexec.bas - ripxplore.rb $@ -a autoexec.bas -t C64Prg +kipperbas.d64: kipperbas.prg + c1541 -format kipperbas,kb d64 $@ -attach $@ -write kipperbas.prg + clean: rm -f *.o *.bin *.map *.prg diff --git a/client/basic/bails.d64 b/client/basic/bails.d64 index 41be75c..ff05287 100644 Binary files a/client/basic/bails.d64 and b/client/basic/bails.d64 differ diff --git a/client/basic/kipperbas.d64 b/client/basic/kipperbas.d64 index 1f41bdd..a006c14 100644 Binary files a/client/basic/kipperbas.d64 and b/client/basic/kipperbas.d64 differ diff --git a/client/basic/kipperbas.s b/client/basic/kipperbas.s index 5068258..8ee2a5f 100644 --- a/client/basic/kipperbas.s +++ b/client/basic/kipperbas.s @@ -92,6 +92,14 @@ crunched_line = $0200 ;Input buffer .import timer_read .import native_to_ascii .import ascii_to_native +.import udp_send_dest +.import udp_send_dest_port +.import udp_send_src_port +.import udp_send_len +.import udp_send +.import udp_add_listener +.import udp_remove_listener +.import udp_callback .zeropage temp: .res 2 temp2: .res 2 @@ -1335,12 +1343,16 @@ tcpconnect_callback: sta connection_state rts @not_end_packet: + + stax inbound_data_length +set_packet_vars: + jsr copymem - ldx tcp_inbound_data_length+1 + ldx inbound_data_length+1 beq @short_packet lda #$ff @short_packet: - lda tcp_inbound_data_length + lda inbound_data_length set_input_string: pha lda #'I' @@ -1374,10 +1386,10 @@ set_input_string: lda #'I'+$80 ldx #'L'+$80 jsr find_var - lda tcp_inbound_data_length+1 + lda inbound_data_length+1 sta (VARPNT),y iny - lda tcp_inbound_data_length + lda inbound_data_length sta (VARPNT),y rts @@ -1461,6 +1473,7 @@ tcpblat_keyword: @eof: and #$40 ; end of file? beq @readerror + beq @readerror lda #$00 sty tcp_send_data_len sta tcp_send_data_len+1 @@ -1486,6 +1499,53 @@ tcpblat_keyword: lda #KPR_ERROR_FILE_ACCESS_FAILURE jmp @store_error +;send udp packet + +udpsend_keyword: + ldax #udp_send_dest + jsr get_ip_parameter + bcc @no_error + rts +@no_error: + jsr skip_comma_get_integer + stax udp_send_dest_port + + jsr skip_comma_get_integer + stax udp_send_src_port + jsr CHRGOT + jsr CHKCOM ;make sure next char is a comma (and skip it) + jsr extract_string + inc $d020 + + ldy param_length + sty udp_send_len + ldy #0 + sty udp_send_len+1 + ldax #transfer_buffer + jsr udp_send + + lda #0 + sta ip65_error + clc + rts + +udplisten_keyword: + ldax #udp_handler + stax udp_callback + jsr get_integer ;port number + stax port + jsr udp_remove_listener + ldax port + jsr udp_add_listener + bcc @ok + ldax #too_many_listeners + jmp print_error +@ok: + rts + +udp_handler: + inc $d020 + rts evaluate: lda #$00 @@ -1557,6 +1617,8 @@ dhcp_server_msg: tftp_server_msg: .byte "TFTP SERVER : ", 0 +too_many_listeners: +.byte "TOO MANY LISTENERS",0 address_resolution: .byte "ADDRESS RESOLUTION",0 @@ -1604,8 +1666,10 @@ keywords: .byte "TCP",$A0,$F0 ;TCPLOSE - BASIC will replace CLOSE with $A0 .byte "TCPBLAT",$F1 .byte "MAC",$F2 - .byte $00 ;end of list -HITOKEN=$F3 + .byte "UDPS",$80,$F3 ;UDPSEND - BASIC will replace END with $80 + .byte "UDP",$9B,"EN",$F4 ;UDPLISTEN - BASIC will replace LIST with $9b + .byte $00 ;end of list +HITOKEN=$F5 ; ; Table of token locations-1 @@ -1630,6 +1694,8 @@ EF: .word tcpsend_keyword-1 FO: .word tcpclose_keyword-1 F1: .word tcpblat_keyword-1 F2: .word mac_keyword-1 +F3: .word udpsend_keyword-1 +F4: .word udplisten_keyword-1 .segment "SELF_MODIFIED_CODE" @@ -1669,3 +1735,5 @@ connection_state: .res 1 netcat_timeout: .res 1 buffer_length: .res 2 cursor_state: .res 1 +port: .res 2 +inbound_data_length: .res 2 \ No newline at end of file diff --git a/client/basic/timestamp.rb b/client/basic/timestamp.rb new file mode 100644 index 0000000..a061cf9 --- /dev/null +++ b/client/basic/timestamp.rb @@ -0,0 +1 @@ +puts Time.now.strftime(".byte \" (%Y-%m-%d)\"") \ No newline at end of file diff --git a/client/carts/Makefile b/client/carts/Makefile index 82e4826..3c012cf 100644 --- a/client/carts/Makefile +++ b/client/carts/Makefile @@ -103,9 +103,7 @@ kipperkart_rr.bin: kipperkart.bin ruby fix_cart.rb $@ 32768 kipperdisk.d64: kipperkart.prg kipperterm.prg kipperkart.prg kippergo.prg - ripxplore.rb --init CbmDos $@ -a kipperkart.prg - ripxplore.rb $@ -a kipperterm.prg - ripxplore.rb $@ -a kippergo.prg + c1541 -format kipperdisk,kd d64 $@ -attach $@ -write kipperkart.prg -write kipperterm.prg -write kippergo.prg cp $@ ../../server/boot/ bobcart.bin: bobcart.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64_8kcart.cfg @@ -132,7 +130,7 @@ telnetd.prg: telnetd.bin cartheader.prg d64_upload.d64: d64_upload.prg cp d64_upload.prg ../../server/boot/ - ripxplore.rb --init CbmDos $@ -a d64_upload.prg + c1541 -format d64upload,kd d64 $@ -attach $@ -write d64_upload.prg clean: rm -f *.o *.bin *.map *.prg *.pg2 *.dsk *.d64 diff --git a/client/carts/set_ip_config.rb b/client/carts/set_ip_config.rb index d211d16..6ba2649 100644 --- a/client/carts/set_ip_config.rb +++ b/client/carts/set_ip_config.rb @@ -62,13 +62,14 @@ end end option_offset=start_of_kipper_cart_image+offsets[0]-7 option_length=offsets[1] - + if option_length==6 then if value.downcase=="auto" then require 'digest/md5' - digest = Digest::MD5.digest(Time.now.to_s) + digest = Digest::MD5.digest(Time.now.to_s).bytes.to_a mac=[0x00,0x80,0x10,digest[0],digest[1],Kernel.rand(255)] else + split_values=value.split(":") if (split_values.length!=6) || (split_values[5].nil?) then puts "'#{value}' is not a valid MAC address. (e.g. 12:34:56:78:ab:cd)" diff --git a/client/examples/Makefile b/client/examples/Makefile index 9acb5ec..5def230 100644 --- a/client/examples/Makefile +++ b/client/examples/Makefile @@ -56,16 +56,12 @@ upnatom.prg: upnatom.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64prg.c upnatom.d64: upnatom.prg url.cfg cp upnatom.prg autoexec.prg - ripxplore.rb --init CbmDos upnatom.d64 -a autoexec.prg - ripxplore.rb upnatom.d64 -a url.cfg -t C64Seq - + c1541 -format upnatom,up d64 $@ -attach $@ -write ../carts/kipperkart.prg "kipperkart.prg" -write autoexec.prg -write "url.cfg" "url.cfg,s" webnoter.d64: webnoter.prg cp webnoter.prg autoexec.prg - ripxplore.rb --init CbmDos webnoter.d64 -a ../carts/kipperkart.prg - ripxplore.rb webnoter.d64 -a autoexec.prg - + c1541 -format webnoter,wn d64 $@ -attach $@ -write ../carts/kipperkart.prg "kipperkart.prg" -write autoexec.prg httpd.prg: httpd.asm $(DA) httpd.asm -ohttpd.prg @@ -74,9 +70,8 @@ httpd.prg: httpd.asm %.d64: %.prg cp $*.prg autoexec.prg - ripxplore.rb --init CbmDos $*.d64 -a autoexec.prg - - + c1541 -format kipper,kp d64 $@ -attach $@ -write autoexec.prg + clean: rm -f *.o *.pg2 *.prg *.map upnatom.d64 diff --git a/client/inc/version.i b/client/inc/version.i index c97a20a..df55af9 100644 --- a/client/inc/version.i +++ b/client/inc/version.i @@ -1 +1 @@ -.byte "1.0.39" +.byte "1.0.41" diff --git a/client/ip65/Makefile b/client/ip65/Makefile index b856361..eb6fd65 100644 --- a/client/ip65/Makefile +++ b/client/ip65/Makefile @@ -38,6 +38,7 @@ ETHOBJS= \ url.o \ arithmetic.o\ ip.o \ + sntp.o \ icmp.o \ cifs.o \ udp.o diff --git a/client/ip65/sntp.s b/client/ip65/sntp.s new file mode 100644 index 0000000..3a132ec --- /dev/null +++ b/client/ip65/sntp.s @@ -0,0 +1,213 @@ +; Simple Network Time Protocol implementation - per RFC 2030 + +MAX_SNTP_MESSAGES_SENT=8 +.include "../inc/common.i" +.ifndef KPR_API_VERSION_NUMBER + .define EQU = + .include "../inc/kipper_constants.i" +.endif + +.export sntp_ip +.export sntp_utc_timestamp +.export sntp_get_time + +.import ip65_process +.import ip65_error + + +.import udp_add_listener +.import udp_remove_listener + +.import udp_callback +.import udp_send + +.import udp_inp +.import output_buffer +.importzp udp_data + +.import udp_send_dest +.import udp_send_src_port +.import udp_send_dest_port +.import udp_send_len +.import check_for_abort_key +.import timer_read + +.segment "IP65ZP" : zeropage + + +.data +sntp_ip: .byte $ff,$ff,$ff,$ff ;can be set to ip address of server that will be queried via sntp (default is a local LAN broadcast) + +.bss + +; sntp packet offsets +sntp_inp = udp_inp + udp_data + +sntp_server_port=123 +sntp_client_port=123 + +sntp_utc_timestamp: .res 4 ; will be set to seconds (only) part of utc timestamp (seconds since 00:00 on Jan 1, 1900) + +; sntp state machine +sntp_initializing = 1 ; initial state +sntp_query_sent = 2 ; sent a query, waiting for a response +sntp_completed = 3 ; got a good response + +sntp_timer: .res 1 +sntp_loop_count: .res 1 +sntp_break_polling_loop: .res 1 + +sntp_state: .res 1 +sntp_message_sent_count: .res 1 + + +.code + +; query an sntp server for current UTC time +; inputs: +; sntp_ip must point to an SNTP server +; outputs: +; carry flag is set if there was an error, clear otherwise +; sntp_utc_timestamp: set to the number of seconds (seconds since 00:00 on Jan 1, 1900) - timezone is UTC +sntp_get_time: + ldax #sntp_in + stax udp_callback + ldax #sntp_client_port + jsr udp_add_listener + bcc :+ + rts +: + + lda #sntp_initializing + sta sntp_state + lda #0 ;reset the "message sent" counter + sta sntp_message_sent_count + jsr send_sntp_query + +@sntp_polling_loop: + lda sntp_message_sent_count + adc #10 + sta sntp_loop_count +@outer_delay_loop: + lda #0 + sta sntp_break_polling_loop + jsr timer_read + stx sntp_timer ;we only care about the high byte + +@inner_delay_loop: + jsr ip65_process + jsr check_for_abort_key + bcc @no_abort + lda #KPR_ERROR_ABORTED_BY_USER + sta ip65_error + rts +@no_abort: + + lda sntp_state + cmp #sntp_completed + beq @complete + + lda sntp_break_polling_loop + bne @break_polling_loop + jsr timer_read + cpx sntp_timer ;this will tick over after about 1/4 of a second + beq @inner_delay_loop + + dec sntp_loop_count + bne @outer_delay_loop + +@break_polling_loop: + jsr send_sntp_query + inc sntp_message_sent_count + lda sntp_message_sent_count + cmp #MAX_SNTP_MESSAGES_SENT-1 + bpl @too_many_messages_sent + jmp @sntp_polling_loop + +@complete: + + ldax #sntp_client_port + jsr udp_remove_listener + rts + +@too_many_messages_sent: +@failed: + ldax #sntp_client_port + jsr udp_remove_listener + lda #KPR_ERROR_TIMEOUT_ON_RECEIVE + sta ip65_error + sec ;signal an error + rts + + + +send_sntp_query: + + ;make a zero filled buffer + lda #$0 + ldx #$30 + stx udp_send_len + sta udp_send_len+1 +: + sta output_buffer,x + dex + bpl :- + + ;set the flags field + lda #$E3 ; flags - LI=11 (unknown), VN=100 (4), MODE=011 (client) + sta output_buffer + + ldax #sntp_client_port + stax udp_send_src_port + ldax #sntp_server_port + stax udp_send_dest_port + ldx #3 ; set destination address +: lda sntp_ip,x + sta udp_send_dest,x + dex + bpl :- + + ldax #output_buffer + jsr udp_send + bcs @error_on_send + lda #sntp_query_sent + sta sntp_state +@error_on_send: + rts + + +sntp_in: + + ldx #3 + ldy #0 +: + lda sntp_inp+$28,x ;the 'transmit' timestamp (in big end order) + sta sntp_utc_timestamp,y + iny + dex + bpl :- + + inc sntp_break_polling_loop + lda #sntp_completed + sta sntp_state + rts + + +;-- LICENSE FOR sntp.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 ip65. +; +; The Initial Developer of the Original Code is Jonno Downes, +; jonno@jamtronix.com. +; Portions created by the Initial Developer are Copyright (C) 2009,2011 +; Jonno Downes. All Rights Reserved. +; -- LICENSE END -- diff --git a/client/kipperterm2/Makefile b/client/kipperterm2/Makefile index b1d8b20..662ce63 100644 --- a/client/kipperterm2/Makefile +++ b/client/kipperterm2/Makefile @@ -38,15 +38,11 @@ kt2wiz.prg: kipperterm2.o $(IP65WIZNETLIB) $(C64WIZNETLIB) $(INCFILES) ../cfg/c6 kipperterm2.d64: kipperterm2.prg addresses.txt abe.bas - ripxplore.rb --init CbmDos $@ -a kipperterm2.prg - ripxplore.rb $@ -a addresses.txt -t C64Seq - ripxplore.rb $@ -a abe -t C64Prg + c1541 -format kipperterm2,k2 d64 $@ -attach $@ -write kipperterm2.prg -write "addresses.txt " "addresses.txt,s" -write abe cp kipperterm2.d64 ../../server/boot kt2wiz.d64: kt2wiz.prg addresses.txt abe.bas - ripxplore.rb --init CbmDos $@ -a kt2wiz.prg - ripxplore.rb $@ -a addresses.txt -t C64Seq - ripxplore.rb $@ -a abe -t C64Prg + c1541 -format kt2wiz,kw d64 $@ -attach $@ -write kt2wiz.prg -write "addresses.txt " "addresses.txt,s" -write abe cp kt2wiz.d64 ../wiznet/ clean: diff --git a/client/kipperterm2/timestamp.i b/client/kipperterm2/timestamp.i index fb8e6dc..9d25b40 100644 --- a/client/kipperterm2/timestamp.i +++ b/client/kipperterm2/timestamp.i @@ -1 +1 @@ -.byte "2011-06-10" +.byte "2012-01-08" diff --git a/client/test/Makefile b/client/test/Makefile index ac01ae5..473adbf 100644 --- a/client/test/Makefile +++ b/client/test/Makefile @@ -33,7 +33,7 @@ all: \ testtftp.pg2 \ test_cart_api.prg \ test_vt100.prg \ - testdottedquad.pg2 \ + test_sntp.prg \ testdottedquad.prg \ test_tcp.prg \ test_xmodem.prg \ @@ -44,7 +44,8 @@ all: \ test_get_url.prg \ test_wiznet.prg \ test_parse_querystring.prg \ - test_lancegs.pg2 \ + test_sntp.prg \ +# test_lancegs.pg2 \ # test_xmodem.d64 \ # httpd_test.d64 \ # ip65test.dsk \ @@ -71,7 +72,6 @@ test_tcp.prg: test_tcp.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64prg. test_xmodem.o: test_xmodem.s ../ip65/xmodem.s $(AS) $(AFLAGS) $< - test_xmodem.prg: test_xmodem.o $(IP65TCPLIB) $(C64RRNETLIB) $(INCFILES) ../cfg/c64prg.cfg $(LD) -m test_xmodem.map -vm -C ../cfg/c64prg.cfg -o test_xmodem.prg $(AFLAGS) $< $(IP65TCPLIB) $(C64RRNETLIB) diff --git a/client/wiznet/Makefile b/client/wiznet/Makefile index ca00765..a0bd917 100644 --- a/client/wiznet/Makefile +++ b/client/wiznet/Makefile @@ -68,10 +68,7 @@ wizbobcart.prg: wizbobcart.bin cartheader.prg cat cartheader.prg wizbobcart.bin > $@ wiztest.d64: wiztest.prg wizboot.prg wizflash.prg - ripxplore.rb -I CbmDos $@ - ripxplore.rb -a wizboot.prg $@ - ripxplore.rb -a wiztest.prg $@ - ripxplore.rb -a wizflash.prg $@ + c1541 -format wiztest,wt d64 $@ -attach $@ -write wizboot.prg -write wiztest.prg -write wizflash.prg clean: rm -f *.o *.bin *.map *.prg *.pg2 *.dsk *.d64 diff --git a/dist/version_number.txt b/dist/version_number.txt index 99f7422..8ef0958 100644 --- a/dist/version_number.txt +++ b/dist/version_number.txt @@ -1 +1 @@ -1.0.39 \ No newline at end of file +1.0.41 \ No newline at end of file