git-svn-id: http://svn.code.sf.net/p/netboot65/code@163 93682198-c243-4bdb-bd91-e943c89aac3b

This commit is contained in:
jonnosan 2009-07-19 10:57:28 +00:00
parent f52b8dc1e4
commit b2b0210657
10 changed files with 559 additions and 28 deletions

View File

@ -21,10 +21,10 @@ all: $(DRIVERS)
apple2prog.lib: a2print.o uthernet.o a2timer.o a2kernal.o a2input.o
ar65 a $@ $^
c64prog.lib: c64print.o rr-net.o c64timer.o c64kernal.o c64inputs.o
c64prog.lib: c64print.o rr-net.o c64timer.o c64kernal.o c64inputs.o c64_disk_access.o
ar65 a $@ $^
c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o
c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o c64_disk_access.o
ar65 a $@ $^
clean:

View File

@ -0,0 +1,239 @@
;C64 disk access routines
;
.ifndef NB65_API_VERSION_NUMBER
.define EQU =
.include "../inc/nb65_constants.i"
.endif
.include "../inc/common.i"
.export io_device_no
.export io_sector_no
.export io_track_no
.export io_read_sector
.importzp copy_src
.import ip65_error
.import output_buffer
;.importzp copy_dest
;reuse the copy_src zero page location
buffer_ptr = copy_src
;######### KERNEL functions
CHKIN = $ffc6
CHKOUT = $ffc9
CHRIN = $ffcf
CHROUT = $ffd2
CLALL = $FFE7
CLOSE = $ffc3
OPEN = $ffc0
READST = $ffb7
SETNAM = $ffbd
SETLFS = $ffba
.bss
io_track_no: .res 2
io_sector_no: .res 1
io_device_no: .res 1
error_buffer = output_buffer + 256
command_buffer = error_buffer+128
sector_buffer_address: .res 2
.data
drive_id: .byte 08 ;default to drive 8
.code
; init
; jsr CLALL
;close
; lda #15 ; filenumber 15 - command channel
; jsr CLOSE
;jsr read_sector
; lda #$30
;routine to read a sector
;cribbed from http://codebase64.org/doku.php?id=base:reading_a_sector
;inputs:
; io_device_number set to specify drive to use ($00 = same as last time, $01 = first disk (i.e. #8), $02 = 2nd disk (drive #9))
; io_sector_no - set to sector number to be read
; io_track_no - set to track number to be read (only lo byte is used)
; AX - address of buffer to read sector into
; outputs:
; on errror, carry flag is set. otherwise buffer will be filled with 256 bytes
io_read_sector:
stax sector_buffer_address
lda io_device_no
beq @drive_id_set
clc
adc #07 ;so 01->08, 02->09 etc
sta drive_id
jsr make_read_sector_command
@drive_id_set:
lda #1
ldx #<cname
ldy #>cname
jsr SETNAM
lda #02
ldx drive_id
ldy #02
jsr SETLFS
jsr OPEN
bcs @error
ldx #<command_buffer
ldy #>command_buffer
lda #12
jsr SETNAM
lda #15
ldx $BA ;use whatever was last device #
ldy #15
jsr SETLFS
jsr OPEN
bcs @error
jsr check_error_channel
lda #$30
cmp error_buffer
beq @was_not_an_error
lda #NB65_ERROR_DEVICE_FAILURE
sta ip65_error
sec
rts
@was_not_an_error:
ldx #$02 ; filenumber 2
jsr CHKIN ;(file 2 now used as input)
lda sector_buffer_address
sta buffer_ptr
lda sector_buffer_address+1
sta buffer_ptr+1
ldy #$00
@loop:
jsr CHRIN ;(get a byte from file)
sta (buffer_ptr),Y ; write byte to memory
iny
bne @loop ; next byte, end when 256 bytes are read
@close:
lda #15 ; filenumber 15
jsr CLOSE
lda #$02 ; filenumber 2
jsr CLOSE
ldx #$00 ; filenumber 0 = keyboard
jsr CHKIN ;(keyboard now input device again)
clc
rts
@error:
lda #NB65_ERROR_DEVICE_FAILURE
sta ip65_error
jmp @close
check_error_channel:
LDX #$0F ; filenumber 15
JSR CHKIN ;(file 15 now used as input)
LDY #$00
@loop:
JSR READST ;(read status byte)
BNE @eof ; either EOF or read error
JSR CHRIN ;(get a byte from file)
sta error_buffer,y
iny
JMP @loop ; next byte
@eof:
lda #0
sta error_buffer,y
LDX #$00 ; filenumber 0 = keyboard
JSR CHKIN ;(keyboard now input device again)
rts
make_read_sector_command:
;fill command buffer with command to read in track & sector
;returns length of command in Y
ldy #0
lda #85 ;"U"
sta command_buffer,y
iny
lda #$31 ;"1"
sta command_buffer,y
iny
lda #$20 ;" "
sta command_buffer,y
iny
lda #$32 ;"2" - file number
sta command_buffer,y
iny
lda #$20 ;" "
sta command_buffer,y
iny
lda #$30 ;"0" - drive number
sta command_buffer,y
iny
lda #$20 ;" "
sta command_buffer,y
iny
lda io_track_no
jsr byte_to_ascii
pha
txa
sta command_buffer,y
pla
iny
sta command_buffer,y
iny
lda #$20 ;" "
sta command_buffer,y
iny
lda io_sector_no
jsr byte_to_ascii
pha
txa
sta command_buffer,y
pla
iny
sta command_buffer,y
iny
lda #0
sta command_buffer,y ;make it ASCIIZ so we can print it
rts
byte_to_ascii:
cmp #30
bmi @not_30
ldx #$33
clc
adc #18
rts
@not_30:
cmp #20
bmi @not_20
ldx #$32
clc
adc #28
rts
@not_20:
cmp #10
bmi @not_10
ldx #$31
clc
adc #38
rts
@not_10:
ldx #$30
clc
adc #48
rts
.rodata
cname: .byte '#'

View File

@ -43,8 +43,8 @@
;some routines & zero page variables
print_a equ $ffd2
temp_ptr equ $FB ; scratch space in page zero
print_a equ $ffd2
temp_ptr equ $FB ; scratch space in page zero
;start of code
@ -88,7 +88,11 @@ found_nb65_signature
;print out the current configuration
nb65call #NB65_PRINT_IP_CONFIG
listen_on_port_80
ldaxi #scratch_buffer
stax tcp_buffer_ptr
print #waiting
ldaxi #80 ;port number
stax nb65_param_buffer+NB65_TCP_PORT
@ -98,8 +102,7 @@ listen_on_port_80
stx nb65_param_buffer+NB65_TCP_REMOTE_IP+3
ldaxi #http_callback
stax nb65_param_buffer+NB65_TCP_CALLBACK
ldaxi #nb65_param_buffer
ldaxi #nb65_param_buffer
nb65call #NB65_TCP_CONNECT ;wait for inbound connect
bcc .connected_ok
print #error_while_waiting
@ -109,30 +112,38 @@ listen_on_port_80
print #ok
lda #0
sta connection_closed
sta found_eol
.main_polling_loop
jsr NB65_PERIODIC_PROCESSING_VECTOR
lda found_eol
beq .no_eol_yet
nb65call #NB65_PRINT_HEX
lda #"!"
jsr print_a
ldaxi #4
stax nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
ldaxi #press_a_key_to_continue
stax nb65_param_buffer+NB65_TCP_PAYLOAD_POINTER
ldaxi #nb65_param_buffer
nb65call #NB65_SEND_TCP_PACKET
ldaxi #4
stax nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
ldaxi #nb65_signature
stax nb65_param_buffer+NB65_TCP_PAYLOAD_POINTER
ldaxi #nb65_param_buffer
nb65call #NB65_SEND_TCP_PACKET
nb65call #NB65_TCP_CLOSE_CONNECTION
jmp listen_on_port_80
.no_eol_yet
lda connection_closed
beq .main_polling_loop
jmp listen_on_port_80
;http callback - will be executed whenever data arrives on the TCP connection
http_callback
ldaxi #nb65_param_buffer
nb65call #NB65_GET_INPUT_PACKET_INFO
lda nb65_param_buffer+NB65_PAYLOAD_LENGTH+1
cmp #$ff
bne .not_eof
lda #1
sta connection_closed
rts
.not_eof
ldax nb65_param_buffer+NB65_PAYLOAD_POINTER
stax temp_ptr
ldax nb65_param_buffer+NB65_PAYLOAD_LENGTH
stax buffer_length
rts
;look for NB65 signature at location pointed at by AX
look_for_signature subroutine
@ -181,7 +192,73 @@ print_errorcode
print_cr
rts
;http callback - will be executed whenever data arrives on the TCP connection
http_callback
ldaxi #nb65_param_buffer
nb65call #NB65_GET_INPUT_PACKET_INFO
lda nb65_param_buffer+NB65_PAYLOAD_LENGTH+1
cmp #$ff
bne .not_eof
lda #1
sta connection_closed
rts
.not_eof
lda #"*"
jsr print_a
ldax nb65_param_buffer+NB65_PAYLOAD_POINTER
stax tcp_inbound_data_ptr
ldax nb65_param_buffer+NB65_PAYLOAD_LENGTH
stax tcp_inbound_data_length
;copy this chunk to our input buffer
ldax tcp_buffer_ptr
stax nb65_param_buffer+NB65_BLOCK_DEST
ldax tcp_inbound_data_ptr
stax nb65_param_buffer+NB65_BLOCK_SRC
ldax tcp_inbound_data_length
stax nb65_param_buffer+NB65_BLOCK_SIZE
ldaxi #nb65_param_buffer
nb65call #NB65_BLOCK_COPY
;increment the pointer into the input buffer
clc
lda tcp_buffer_ptr
adc tcp_inbound_data_length
sta tcp_buffer_ptr
sta temp_ptr
lda tcp_buffer_ptr+1
adc tcp_inbound_data_length+1
sta tcp_buffer_ptr+1
sta temp_ptr
;put a null byte at the end (assumes we have set temp_ptr already)
lda #0
tay
sta (temp_ptr),y
;look for EOL ($0D) in input
sta found_eol
ldaxi #scratch_buffer
stax get_next_byte+1
.look_for_eol
jsr get_next_byte
cmp #$0a
bne .found_eol
cmp #$0d
bne .not_eol
.found_eol
inc found_eol
rts
.not_eol
cmp #0
bne .look_for_eol
rts
;constants
nb65_api_not_found_message dc.b "ERROR - NB65 API NOT FOUND.",13,0
@ -198,9 +275,24 @@ disconnected dc.b 13,"CONNECTION CLOSED",13,0
failed dc.b "FAILED ", 0
ok dc.b "OK ", 0
transmission_error dc.b "ERROR WHILE SENDING ",0
;self modifying code
get_next_byte
lda $ffff
inc get_next_byte+1
bne .skip
inc get_next_byte+2
.skip
rts
;variables
connection_closed ds.b 1
found_eol ds.b 1
nb65_param_buffer DS.B $20
buffer_length: ds.b 2
buffer_pointer: ds.b 2
tcp_buffer_ptr ds.b 2
scan_ptr ds.b 2
tcp_inbound_data_ptr ds.b 2
tcp_inbound_data_length ds.b 2
scratch_buffer: DS.B $1000

View File

@ -56,6 +56,8 @@ NB65_PRINT_IP_CONFIG EQU $83 ;no inputs, no outputs, prints to screen
NB65_INPUT_HOSTNAME EQU $90 ;no inputs, outputs: AX = pointer to hostname (which may be IP address).
NB65_INPUT_PORT_NUMBER EQU $91 ;no inputs, outputs: AX = port number entered ($0000..$FFFF)
NB65_BLOCK_COPY EQU $A0 ;inputs: AX points to a block copy structure, outputs: none
NB65_GET_LAST_ERROR EQU $FF ;no inputs, outputs A EQU error code (from last function that set the global error value, not necessarily the
;last function that was called)
@ -68,8 +70,8 @@ NB65_CFG_DNS_SERVER EQU $12 ;4 byte IP address of DNS server (will be overw
NB65_CFG_DHCP_SERVER EQU $16 ;4 byte IP address of DHCP server (will only be set by DHCP initialisation)
NB65_DRIVER_NAME EQU $1A ;2 byte pointer to name of driver
;offsets in TFTP transfer parameter structure (used by NB65_TFTP_DIRECTORY_LISTING & NB65_TFTP_DOWNLOAD)
NB65_TFTP_FILENAME EQU $00 ;2 byte pointer to asciiz filename (or filemask in case of NB65_TFTP_DIRECTORY_LISTING)
;offsets in TFTP transfer parameter structure (used by NB65_TFTP_DOWNLOAD, NB65_TFTP_CALLBACK_DOWNLOAD, NB65_TFTP_UPLOAD, NB65_TFTP_CALLBACK_UPLOAD)
NB65_TFTP_FILENAME EQU $00 ;2 byte pointer to asciiz filename (or filemask)
NB65_TFTP_POINTER EQU $02 ;2 byte pointer to memory location data to be stored in OR address of callback function
NB65_TFTP_FILESIZE EQU $04 ;2 byte file length (filled in by NB65_TFTP_DOWNLOAD, must be passed in to NB65_TFTP_UPLOAD)
@ -84,6 +86,11 @@ NB65_DNS_HOSTNAME_IP EQU $00 ;4 byte IP address (filled
NB65_UDP_LISTENER_PORT EQU $00 ;2 byte port number
NB65_UDP_LISTENER_CALLBACK EQU $02 ;2 byte address of routine to call when UDP packet arrives for specified port
;offsets in block copy parameter structure
NB65_BLOCK_SRC EQU $00 ;2 byte address of start of source block
NB65_BLOCK_DEST EQU $02 ;2 byte address of start of destination block
NB65_BLOCK_SIZE EQU $04 ;2 byte length of block to be copied (in bytes
;offsets in TCP connect parameter structure
NB65_TCP_REMOTE_IP EQU $00 ;4 byte IP address of remote host (0.0.0.0 means wait for inbound i.e. server mode)

View File

@ -557,6 +557,45 @@ cpy #NB65_INPUT_PORT_NUMBER
@no_port_entered:
rts
:
cpy #NB65_BLOCK_COPY
bne :+
;this is where we pay the price for trying to save a few 'zero page' pointers
;by reusing the 'copy_src' and 'copy_dest' addresses!
.segment "TCP_VARS"
tmp_copy_src: .res 2
tmp_copy_dest: .res 2
tmp_copy_length: .res 2
.code
ldy #NB65_BLOCK_SRC
lda (nb65_params),y
sta tmp_copy_src
iny
lda (nb65_params),y
sta tmp_copy_src+1
ldy #NB65_BLOCK_DEST
lda (nb65_params),y
sta tmp_copy_dest
iny
lda (nb65_params),y
sta tmp_copy_dest+1
ldy #NB65_BLOCK_SIZE
lda (nb65_params),y
sta tmp_copy_length
iny
lda (nb65_params),y
sta tmp_copy_length+1
ldax tmp_copy_src
stax copy_src
ldax tmp_copy_dest
stax copy_dest
ldax tmp_copy_length
jmp copymem
:
.endif
.endif

View File

@ -187,7 +187,8 @@ tcp_listen:
lda #tcp_cxn_state_listening
cmp tcp_state
beq @listen_loop
clc
jmp tcp_connection_established
rts
;make outbound tcp connection
@ -277,6 +278,7 @@ tcp_connect:
sec ;signal an error
rts
@got_a_response:
tcp_connection_established:
;inc the sequence number to cover the SYN we have sent
ldax #tcp_connect_sequence_number
stax acc32

View File

@ -258,6 +258,10 @@ main_menu:
@get_key_config_menu:
jsr ip65_process
jsr get_key
cmp #KEYCODE_ABORT
bne @not_abort
jmp main_menu
@not_abort:
cmp #KEYCODE_F1
bne @not_ip
ldax #new
@ -547,6 +551,10 @@ net_apps_menu:
@get_key:
jsr ip65_process
jsr get_key
cmp #KEYCODE_ABORT
bne @not_abort
jmp main_menu
@not_abort:
cmp #KEYCODE_F1
bne @not_telnet
jsr cls

View File

@ -21,7 +21,8 @@ INCFILES=\
all: \
ip65test.dsk \
testdns.prg \
gopher_browser.prg \
test_disk_io.prg \
test_disk_io.d64 \
testdns.pg2 \
testtftp.prg \
testtftp.pg2\
@ -54,6 +55,9 @@ ip65test.dsk: testdns.pg2 testdottedquad.pg2 testtftp.pg2
ripxplore.rb ip65test.dsk -a testtftp.pg2 -t AppleBinary
ripxplore.rb ip65test.dsk -a testdottedquad.pg2 -t AppleBinary
ripxplore.rb ip65test.dsk -a testdns.pg2 -t AppleBinary
test_disk_io.d64: test_disk_io.prg
ripxplore.rb --init CbmDos test_disk_io.d64 -a test_disk_io.prg
clean:
rm -f *.o *.pg2 *.prg

140
client/test/test_disk_io.s Normal file
View File

@ -0,0 +1,140 @@
.ifndef NB65_API_VERSION_NUMBER
.define EQU =
.include "../inc/nb65_constants.i"
.endif
.include "../inc/common.i"
.include "../inc/commonprint.i"
.import print_a
.import cfg_get_configuration_ptr
.import io_device_no
.import io_sector_no
.import io_track_no
.import io_read_sector
.import ip65_error
.macro cout arg
lda arg
jsr print_a
.endmacro
.bss
sector_buffer: .res 256
output_buffer: .res 520
.export output_buffer
current_byte: .res 1
.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:
lda #01
sta io_track_no
lda #01
sta io_sector_no
lda #01
sta io_device_no
ldax #sector_buffer
jsr io_read_sector
bcs @error
; jsr dump_sector ;DEBUG
lda #$12
sta io_track_no
lda #01
sta io_sector_no
lda #01
sta io_device_no
ldax #sector_buffer
jsr io_read_sector
bcs @error
jsr dump_sector ;DEBUG
@error:
jsr print_cr
lda ip65_error
jsr print_hex
rts
dump_sector:
;hex dump sector
lda #0
sta current_byte
@dump_byte:
ldy current_byte
lda sector_buffer,y
jsr print_hex
lda sector_buffer,y
jsr print_a
inc current_byte
bne @dump_byte
rts
.rodata
error_code:
.byte "ERROR CODE: $",0
press_a_key_to_continue:
.byte "PRESS A KEY TO CONTINUE",13,0
failed:
.byte "FAILED ", 0
ok:
.byte "OK ", 0
initializing:
.byte "INITIALIZING ",0
track_no:
.byte "TRACK ",0
sector_no:
.byte " SECTOR ",0
signon_message:
.byte "D64 UPLOADER V0.1",13,0
enter_filename:
.byte "SEND AS: ",0
drive_error:
.byte "DRIVE ACCESS ERROR - ",0
nb65_signature_not_found_message:
.byte "NO NB65 API FOUND",13,"PRESS ANY KEY TO RESET", 0
error_opening_channel:
.byte "ERROR OPENING CHANNEL $",0
disk_access:
.byte 13,13,13,13,13,"SENDING TO CHANNEL $",0
nb65_signature:
.byte $4E,$42,$36,$35 ; "NB65" - API signature
.byte ' ',0 ; so we can use this as a string
position_cursor_for_track_display:
; .byte $13,13,13,13,13,13,13,13,13,13,13," SENDING ",0
.byte $13,13,13,"SENDING ",0
position_cursor_for_error_display:
.byte $13,13,13,13,"LAST ",0
cname: .byte '#'

Binary file not shown.