diff --git a/client/inc/nb65_constants.i b/client/inc/nb65_constants.i index b87b924..afeae16 100644 --- a/client/inc/nb65_constants.i +++ b/client/inc/nb65_constants.i @@ -34,7 +34,7 @@ NB65_UDP_ADD_LISTENER EQU $06 ;inputs: AX points to a UDP listener para NB65_GET_INPUT_PACKET_INFO EQU $07 ;inputs: AX points to a UDP packet parameter structure, outputs: UDP packet structure filled in NB65_SEND_UDP_PACKET EQU $08 ;inputs: AX points to a UDP packet parameter structure, outputs: none packet is sent NB65_DEACTIVATE EQU $09 ;inputs: none, outputs: none (removes call to NB65_VBL_VECTOR on IRQ chain) - +NB65_TFTP_CALLBACK_DOWNLOAD EQU $0A ;inputs: AX points to a TFTP parameter structure, outputs: none NB65_PRINT_ASCIIZ EQU $80 ;inputs: AX=pointer to null terminated string to be printed to screen, outputs: none NB65_PRINT_HEX EQU $81 ;inputs: A=byte digit to be displayed on screen as (zero padded) hex digit, outputs: none NB65_PRINT_DOTTED_QUAD EQU $82 ;inputs: AX=pointer to 4 bytes that will be displayed as a decimal dotted quad (e.g. 192.168.1.1) @@ -56,7 +56,7 @@ NB65_DRIVER_NAME EQU $1A ;2 byte pointer to name of driver ;offsets in TFTP parameter structure (used by NB65_TFTP_DIRECTORY_LISTING & NB65_TFTP_DOWNLOAD) NB65_TFTP_IP EQU $00 ;4 byte IP address of TFTP server NB65_TFTP_FILENAME EQU $04 ;2 byte pointer to asciiz filename (or filemask in case of NB65_TFTP_DIRECTORY_LISTING) -NB65_TFTP_POINTER EQU $06 ;2 byte pointer to memory location data to be stored in +NB65_TFTP_POINTER EQU $06 ;2 byte pointer to memory location data to be stored in OR address of callback function ;offsets in DNS parameter structure (used by NB65_DNS_RESOLVE) NB65_DNS_HOSTNAME EQU $00 ;2 byte pointer to asciiz hostname to resolve (can also be a dotted quad string) diff --git a/client/ip65/function_dispatcher.s b/client/ip65/function_dispatcher.s index 81c8821..1abf2c6 100644 --- a/client/ip65/function_dispatcher.s +++ b/client/ip65/function_dispatcher.s @@ -21,6 +21,7 @@ .import ip65_error .import tftp_clear_callbacks .import tftp_download +.import tftp_set_download_callback .import dns_ip .import dns_resolve .import dns_set_hostname @@ -88,7 +89,6 @@ set_tftp_params: jsr tftp_clear_callbacks - clc rts nb65_dispatcher: @@ -151,7 +151,6 @@ irq_handler_installed: cpy #NB65_TFTP_DOWNLOAD bne :+ jsr set_tftp_params - bcs @tftp_error jsr tftp_download jmp @after_tftp_call : @@ -292,6 +291,19 @@ irq_handler_installed: rts : + cpy #NB65_TFTP_CALLBACK_DOWNLOAD + bne :+ + jsr set_tftp_params + ldy #NB65_TFTP_POINTER+1 + lda (nb65_params),y + tax + dey + lda (nb65_params),y + jsr tftp_set_download_callback + jmp tftp_download +: + + cpy #NB65_PRINT_ASCIIZ bne :+ jsr print diff --git a/client/nb65/Makefile b/client/nb65/Makefile index fdd0233..30845f5 100644 --- a/client/nb65/Makefile +++ b/client/nb65/Makefile @@ -56,6 +56,7 @@ utherboot.dsk: utherboot.pg2 c64boot.d64: nb65_c64_ram.prg ripxplore.rb --init CbmDos $@ -a nb65_c64_ram.prg + ripxplore.rb $@ -a ..\test\test_cart_api.prg $(BOOTA2.PG2): bootmenu.o $(IP65LIB) $(APPLE2PROGLIB) $(INCFILES) ../cfg/a2language_card.cfg $(LD) -m bootmenu.map -C ../cfg/a2language_card.cfg -o $(BOOTA2.PG2) $< $(IP65LIB) $(APPLE2PROGLIB) diff --git a/client/test/test_cart_api.s b/client/test/test_cart_api.s index 4b9001f..8c93777 100644 --- a/client/test/test_cart_api.s +++ b/client/test/test_cart_api.s @@ -33,7 +33,8 @@ print_a = $ffd2 .bss nb65_param_buffer: .res $20 - + block_number: .res $0 + .segment "STARTUP" ;this is what gets put at the start of the file on the C64 .word basicstub ; load address @@ -136,7 +137,24 @@ init: call #NB65_PRINT_DOTTED_QUAD print_cr -;callback test +;tftp callback test + lda #0 + sta block_number + lda #$FF + ldx #$03 +: + sta nb65_param_buffer,x ;set TFTP server as broadcast address + dex + bpl :- + ldax #test_file + stax nb65_param_buffer+NB65_TFTP_FILENAME + ldax #tftp_callback + stax nb65_param_buffer+NB65_TFTP_POINTER + ldax #nb65_param_buffer + call #NB65_TFTP_CALLBACK_DOWNLOAD + + +;udp callback test ldax #64 ;listen on port 64 stax nb65_param_buffer+NB65_UDP_LISTENER_PORT @@ -157,6 +175,15 @@ init: jsr NB65_PERIODIC_PROCESSING_VECTOR jmp @loop_forever + +tftp_callback: + inc block_number + print #block_no + lda block_number + jsr print_hex + print_cr + rts + udp_callback: ldax #nb65_param_buffer @@ -260,7 +287,28 @@ get_key: beq get_key rts - .rodata + print_hex: + pha + pha + lsr + lsr + lsr + lsr + tax + lda hexdigits,x + jsr print_a + pla + and #$0F + tax + lda hexdigits,x + jsr print_a + pla + rts + +.rodata +hexdigits: +.byte "0123456789ABCDEF" + test_hostname: .byte "RETROHACKERS.COM",0 ;this should be an A record @@ -286,7 +334,10 @@ length: data: .byte "DATA: ",0 - + +block_no: + .byte "BLOCK: $",0 + error_code: .asciiz "ERROR CODE: $" press_a_key_to_continue: @@ -309,5 +360,8 @@ reply_message: reply_message_end: reply_message_length=reply_message_end-reply_message +test_file: +.byte "BOOTA2.PG2",0 + nb65_signature: .byte $4E,$42,$36,$35 ; "NB65" - API signature \ No newline at end of file diff --git a/doc/nb65_api_technical_reference.doc b/doc/nb65_api_technical_reference.doc index 695f8bf..d937267 100644 Binary files a/doc/nb65_api_technical_reference.doc and b/doc/nb65_api_technical_reference.doc differ