From 9821cf7e95bb9eebe9dcbd24825b9967907c8235 Mon Sep 17 00:00:00 2001 From: jonnosan Date: Thu, 12 Jan 2012 09:43:40 +0000 Subject: [PATCH] resurrect sntp git-svn-id: http://svn.code.sf.net/p/netboot65/code@325 93682198-c243-4bdb-bd91-e943c89aac3b --- client/basic/KB.htm | 15 ++- client/basic/Makefile | 15 +-- client/basic/bails.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.d64 | Bin 174848 -> 174848 bytes client/basic/kipperbas.s | 80 ++++++++++++- client/basic/timestamp.rb | 1 + client/carts/Makefile | 6 +- client/carts/set_ip_config.rb | 5 +- client/examples/Makefile | 13 +- client/inc/version.i | 2 +- client/ip65/Makefile | 1 + client/ip65/sntp.s | 213 +++++++++++++++++++++++++++++++++ client/kipperterm2/Makefile | 8 +- client/kipperterm2/timestamp.i | 2 +- client/test/Makefile | 6 +- client/wiznet/Makefile | 5 +- dist/version_number.txt | 2 +- 17 files changed, 324 insertions(+), 50 deletions(-) create mode 100644 client/basic/timestamp.rb create mode 100644 client/ip65/sntp.s 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 41be75c7cd31c26f95fa7319bbd0ce3242f20fe5..ff05287db00981f02a83399f2ec8dc369517774e 100644 GIT binary patch delta 432 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 literal 174848 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 S2oM1xKm>>Y5%@n!;C};di0fhi 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