mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-07-31 23:28:55 +00:00
Removed unused stuff.
This commit is contained in:
parent
244df7212e
commit
90c83387f2
@ -10,12 +10,10 @@ all: ip65.lib ip65_tcp.lib
|
|||||||
ca65 -DTCP -o $@ $<
|
ca65 -DTCP -o $@ $<
|
||||||
|
|
||||||
IP65OBJS=\
|
IP65OBJS=\
|
||||||
arithmetic.o\
|
arithmetic.o \
|
||||||
arp.o \
|
arp.o \
|
||||||
cifs.o \
|
|
||||||
config.o \
|
config.o \
|
||||||
copymem.o \
|
copymem.o \
|
||||||
debug.o \
|
|
||||||
dhcp.o \
|
dhcp.o \
|
||||||
dns.o \
|
dns.o \
|
||||||
dottedquad.o \
|
dottedquad.o \
|
||||||
@ -25,9 +23,8 @@ IP65OBJS=\
|
|||||||
ip65.o \
|
ip65.o \
|
||||||
tftp.o \
|
tftp.o \
|
||||||
timer.o \
|
timer.o \
|
||||||
output_buffer.o\
|
output_buffer.o \
|
||||||
parser.o \
|
parser.o \
|
||||||
printf.o \
|
|
||||||
sntp.o \
|
sntp.o \
|
||||||
string_utils.o \
|
string_utils.o \
|
||||||
udp.o \
|
udp.o \
|
||||||
|
880
ip65/cifs.s
880
ip65/cifs.s
@ -1,880 +0,0 @@
|
|||||||
; a simple NETBIOS over TCP server
|
|
||||||
; aka "Common Internet File System"
|
|
||||||
;
|
|
||||||
; refs: RFC1001, RFC1002, "Implementing CIFS" - http://ubiqx.org/cifs/
|
|
||||||
|
|
||||||
.include "zeropage.inc"
|
|
||||||
.include "../inc/common.i"
|
|
||||||
|
|
||||||
.ifndef KPR_API_VERSION_NUMBER
|
|
||||||
.define EQU =
|
|
||||||
.include "../inc/kipper_constants.i"
|
|
||||||
.endif
|
|
||||||
|
|
||||||
DEFAULT_CIFS_CMD_BUFFER = $6800
|
|
||||||
DEFAULT_SMB_RESPONSE_BUFFER = $6000
|
|
||||||
|
|
||||||
.export cifs_l1_encode
|
|
||||||
.export cifs_l1_decode
|
|
||||||
.export cifs_start
|
|
||||||
|
|
||||||
.import copymem
|
|
||||||
.importzp copy_src
|
|
||||||
.importzp copy_dest
|
|
||||||
|
|
||||||
.import cfg_ip
|
|
||||||
.import output_buffer
|
|
||||||
.importzp udp_data
|
|
||||||
.import udp_send
|
|
||||||
.import udp_inp
|
|
||||||
.importzp udp_data
|
|
||||||
.import udp_send_dest
|
|
||||||
.import udp_send_src_port
|
|
||||||
.import udp_send_dest_port
|
|
||||||
.import udp_send_len
|
|
||||||
.importzp ip_src
|
|
||||||
.importzp ip_dest
|
|
||||||
.import ip_data
|
|
||||||
.import ip_inp
|
|
||||||
.import tcp_close
|
|
||||||
.import tcp_listen
|
|
||||||
.import tcp_callback
|
|
||||||
.import tcp_inbound_data_length
|
|
||||||
.import tcp_inbound_data_ptr
|
|
||||||
.import tcp_send
|
|
||||||
.import tcp_send_data_len
|
|
||||||
|
|
||||||
.import ip65_process
|
|
||||||
.import udp_add_listener
|
|
||||||
.import udp_callback
|
|
||||||
|
|
||||||
nbns_txn_id = 0
|
|
||||||
nbns_opcode = 2
|
|
||||||
nbns_flags_rcode = 3
|
|
||||||
nbns_qdcount = 4
|
|
||||||
nbns_ancount = 6
|
|
||||||
nbns_nscount = 8
|
|
||||||
nbns_arcount = 10
|
|
||||||
nbns_question_name = 12
|
|
||||||
nbns_service_type = 43
|
|
||||||
|
|
||||||
nbns_my_ip = 64
|
|
||||||
nbns_registration_message_length = 68
|
|
||||||
|
|
||||||
; given an ASCII (or PETSCII) hostname, convert to
|
|
||||||
; canonical 'level 1 encoded' form.
|
|
||||||
;
|
|
||||||
; only supports the default scope (' ' : 0x20)
|
|
||||||
; inputs:
|
|
||||||
; AX: pointer to null terminated hostname to be encoded
|
|
||||||
; outputs:
|
|
||||||
; AX: pointer to decoded hostname
|
|
||||||
cifs_l1_encode:
|
|
||||||
stax ptr1
|
|
||||||
lda #0
|
|
||||||
tax
|
|
||||||
sta hostname_buffer+32
|
|
||||||
@empty_buffer_loop:
|
|
||||||
lda #$43
|
|
||||||
sta hostname_buffer,x
|
|
||||||
inx
|
|
||||||
lda #$41
|
|
||||||
sta hostname_buffer,x
|
|
||||||
inx
|
|
||||||
cpx #$20
|
|
||||||
bmi @empty_buffer_loop
|
|
||||||
ldy #0
|
|
||||||
ldx #0
|
|
||||||
@copy_loop:
|
|
||||||
lda (ptr1),y
|
|
||||||
beq @done
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
clc
|
|
||||||
adc #$41
|
|
||||||
sta hostname_buffer,x
|
|
||||||
inx
|
|
||||||
lda (ptr1),y
|
|
||||||
and #$0F
|
|
||||||
clc
|
|
||||||
adc #$41
|
|
||||||
sta hostname_buffer,x
|
|
||||||
inx
|
|
||||||
iny
|
|
||||||
cpx #$1D
|
|
||||||
bmi @copy_loop
|
|
||||||
@done:
|
|
||||||
ldax #hostname_buffer
|
|
||||||
rts
|
|
||||||
|
|
||||||
; given a 'level 1 encoded' hostname, decode to ASCII.
|
|
||||||
;
|
|
||||||
; inputs:
|
|
||||||
; AX: pointer to encoded hostname to be decoded
|
|
||||||
; outputs:
|
|
||||||
; AX: pointer to decoded hostname (will be 16 byte hostname, right padded with spaces, nul terminated)
|
|
||||||
cifs_l1_decode:
|
|
||||||
stax ptr1
|
|
||||||
ldy #0
|
|
||||||
ldx #0
|
|
||||||
@decode_loop:
|
|
||||||
lda (ptr1),y
|
|
||||||
sec
|
|
||||||
sbc #$41
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
sta hi_nibble
|
|
||||||
iny
|
|
||||||
lda (ptr1),y
|
|
||||||
sec
|
|
||||||
sbc #$41
|
|
||||||
clc
|
|
||||||
adc hi_nibble
|
|
||||||
sta hostname_buffer,x
|
|
||||||
iny
|
|
||||||
inx
|
|
||||||
cpx #$10
|
|
||||||
bmi @decode_loop
|
|
||||||
lda #0
|
|
||||||
sta hostname_buffer,x
|
|
||||||
ldax #hostname_buffer
|
|
||||||
rts
|
|
||||||
|
|
||||||
; start a CIFS (SMB) server process, and advertise the specified hostname on the local LAN
|
|
||||||
;
|
|
||||||
; inputs:
|
|
||||||
; AX = ptr to hostname to be used
|
|
||||||
; outputs:
|
|
||||||
; none
|
|
||||||
cifs_start:
|
|
||||||
; save the hostname in 'raw' form
|
|
||||||
stax copy_src
|
|
||||||
ldax #raw_local_hostname
|
|
||||||
stax copy_dest
|
|
||||||
ldax #$0f
|
|
||||||
stx raw_local_hostname+15
|
|
||||||
jsr copymem
|
|
||||||
|
|
||||||
; set up callbacks
|
|
||||||
ldax #nbns_callback
|
|
||||||
stax udp_callback
|
|
||||||
ldax #137
|
|
||||||
jsr udp_add_listener
|
|
||||||
|
|
||||||
ldax #nbns_callback
|
|
||||||
stax udp_callback
|
|
||||||
ldax #137
|
|
||||||
jsr udp_add_listener
|
|
||||||
|
|
||||||
ldax #raw_local_hostname
|
|
||||||
jsr cifs_l1_encode
|
|
||||||
ldx #0
|
|
||||||
@copy_hostname_loop:
|
|
||||||
lda hostname_buffer,x
|
|
||||||
sta local_hostname,x
|
|
||||||
inx
|
|
||||||
cpx #$21
|
|
||||||
bmi @copy_hostname_loop
|
|
||||||
|
|
||||||
jsr cifs_advertise_hostname
|
|
||||||
jsr cifs_advertise_hostname
|
|
||||||
|
|
||||||
ldax #nb_session_callback
|
|
||||||
stax tcp_callback
|
|
||||||
@listen:
|
|
||||||
ldax #-4 ; start at -4, to skip the NBT header length
|
|
||||||
stax cifs_cmd_length
|
|
||||||
|
|
||||||
ldax cifs_cmd_buffer
|
|
||||||
stax cifs_cmd_buffer_ptr
|
|
||||||
ldax #139
|
|
||||||
stx connection_closed
|
|
||||||
|
|
||||||
jsr tcp_listen
|
|
||||||
|
|
||||||
@loop:
|
|
||||||
inc $d020 ; FIXME
|
|
||||||
jsr ip65_process
|
|
||||||
lda connection_closed
|
|
||||||
beq @loop
|
|
||||||
|
|
||||||
jmp @listen
|
|
||||||
rts
|
|
||||||
|
|
||||||
; broadcast a Name Registration Request message to the local LAN
|
|
||||||
cifs_advertise_hostname:
|
|
||||||
; advertise the 'server' service for own hostname
|
|
||||||
; overwrite the hostname in 'DNS compressed form'
|
|
||||||
; we assume this hostname ends with <20>
|
|
||||||
lda #$20 ; indicates what follows is a netbios name
|
|
||||||
sta output_buffer+nbns_question_name
|
|
||||||
|
|
||||||
ldx #0
|
|
||||||
@copy_hostname_loop:
|
|
||||||
lda local_hostname,x
|
|
||||||
sta registration_request_servername+1,x
|
|
||||||
inx
|
|
||||||
cpx #$21
|
|
||||||
bmi @copy_hostname_loop
|
|
||||||
|
|
||||||
jsr @send_nbns_message
|
|
||||||
|
|
||||||
; copy our encode hostname to the host announcment
|
|
||||||
ldax #local_hostname
|
|
||||||
stax copy_src
|
|
||||||
ldax #host_announce_hostname
|
|
||||||
stax copy_dest
|
|
||||||
ldax #$20
|
|
||||||
jsr copymem
|
|
||||||
|
|
||||||
; copy our raw hostname to the host announcment
|
|
||||||
ldax #raw_local_hostname
|
|
||||||
stax copy_src
|
|
||||||
ldax #host_announce_servername
|
|
||||||
stax copy_dest
|
|
||||||
ldax #$10
|
|
||||||
jsr copymem
|
|
||||||
|
|
||||||
; copy the local IP address to the 'sender' field of the host announcment
|
|
||||||
ldx #03
|
|
||||||
@copy_sending_address_loop:
|
|
||||||
lda cfg_ip,x
|
|
||||||
sta host_announce_my_ip,x
|
|
||||||
dex
|
|
||||||
bpl @copy_sending_address_loop
|
|
||||||
|
|
||||||
ldax #138
|
|
||||||
stax udp_send_dest_port
|
|
||||||
stax udp_send_src_port
|
|
||||||
|
|
||||||
ldax #host_announce_message_length
|
|
||||||
stax udp_send_len
|
|
||||||
|
|
||||||
ldax #host_announce_message
|
|
||||||
jsr udp_send
|
|
||||||
rts
|
|
||||||
|
|
||||||
@send_nbns_message:
|
|
||||||
; copy the local IP address
|
|
||||||
ldx #03
|
|
||||||
@copy_my_address_loop:
|
|
||||||
lda cfg_ip,x
|
|
||||||
sta nbns_my_ip,x
|
|
||||||
dex
|
|
||||||
bpl @copy_my_address_loop
|
|
||||||
|
|
||||||
; send to the broadcast address
|
|
||||||
lda #$ff
|
|
||||||
ldx #03
|
|
||||||
@copy_broadcast_address_loop:
|
|
||||||
sta udp_send_dest,x
|
|
||||||
dex
|
|
||||||
bpl @copy_broadcast_address_loop
|
|
||||||
|
|
||||||
ldax #137
|
|
||||||
stax udp_send_dest_port
|
|
||||||
stax udp_send_src_port
|
|
||||||
|
|
||||||
ldax #nbns_registration_message_length
|
|
||||||
stax udp_send_len
|
|
||||||
|
|
||||||
ldax #registration_request
|
|
||||||
jsr udp_send
|
|
||||||
rts
|
|
||||||
|
|
||||||
nbns_callback:
|
|
||||||
lda udp_inp+udp_data+nbns_opcode
|
|
||||||
and #$f8 ; mask the lower three bits
|
|
||||||
beq @name_request
|
|
||||||
rts
|
|
||||||
@name_request:
|
|
||||||
; this is a NB NAME REQUEST.
|
|
||||||
; is it a unicast message?
|
|
||||||
ldx #3
|
|
||||||
@check_unicast_loop:
|
|
||||||
lda ip_inp+ip_dest,x
|
|
||||||
cmp cfg_ip,x
|
|
||||||
bne @not_unicast
|
|
||||||
dex
|
|
||||||
bpl @check_unicast_loop
|
|
||||||
|
|
||||||
jmp @looking_for_us
|
|
||||||
|
|
||||||
@not_unicast:
|
|
||||||
; is it looking for our local hostname?
|
|
||||||
ldax #udp_inp+udp_data+nbns_question_name+1
|
|
||||||
stax ptr1
|
|
||||||
ldy #0
|
|
||||||
@cmp_loop:
|
|
||||||
lda (ptr1),y
|
|
||||||
cmp local_hostname,y
|
|
||||||
bne @not_us
|
|
||||||
iny
|
|
||||||
cpy #30
|
|
||||||
bne @cmp_loop
|
|
||||||
|
|
||||||
@looking_for_us:
|
|
||||||
; this is a request for our name!
|
|
||||||
; copy the txn id
|
|
||||||
ldax udp_inp+udp_data ; first 2 bytes of data are txn id
|
|
||||||
stax netbios_name_query_response
|
|
||||||
|
|
||||||
; set the sender & recipients IP address
|
|
||||||
ldx #03
|
|
||||||
@copy_address_loop:
|
|
||||||
lda ip_inp+ip_src,x
|
|
||||||
sta udp_send_dest,x
|
|
||||||
lda cfg_ip,x
|
|
||||||
sta netbios_name_query_response_ip,x
|
|
||||||
dex
|
|
||||||
bpl @copy_address_loop
|
|
||||||
|
|
||||||
; copy our encoded hostname
|
|
||||||
ldax #local_hostname
|
|
||||||
stax copy_src
|
|
||||||
ldax #netbios_name_query_response_hostname
|
|
||||||
stax copy_dest
|
|
||||||
ldax #30
|
|
||||||
jsr copymem
|
|
||||||
|
|
||||||
.import eth_inp
|
|
||||||
|
|
||||||
; copy the service identifier - last 2 bytes in the query hostname
|
|
||||||
ldax eth_inp+$55
|
|
||||||
stax netbios_name_query_response_hostname+30
|
|
||||||
|
|
||||||
ldax #137
|
|
||||||
stax udp_send_dest_port
|
|
||||||
stax udp_send_src_port
|
|
||||||
|
|
||||||
ldax #netbios_name_query_response_length
|
|
||||||
stax udp_send_len
|
|
||||||
|
|
||||||
ldax #netbios_name_query_response
|
|
||||||
jmp udp_send
|
|
||||||
|
|
||||||
@not_us:
|
|
||||||
rts
|
|
||||||
|
|
||||||
nb_session_callback:
|
|
||||||
lda tcp_inbound_data_length+1
|
|
||||||
cmp #$ff
|
|
||||||
bne @not_eof
|
|
||||||
@eof:
|
|
||||||
inc connection_closed
|
|
||||||
@done:
|
|
||||||
rts
|
|
||||||
@not_eof:
|
|
||||||
; copy this chunk to our input buffer
|
|
||||||
ldax cifs_cmd_buffer_ptr
|
|
||||||
stax copy_dest
|
|
||||||
ldax tcp_inbound_data_ptr
|
|
||||||
stax copy_src
|
|
||||||
ldax tcp_inbound_data_length
|
|
||||||
jsr copymem
|
|
||||||
|
|
||||||
; increment the pointer into the input buffer
|
|
||||||
clc
|
|
||||||
lda cifs_cmd_buffer_ptr
|
|
||||||
adc tcp_inbound_data_length
|
|
||||||
sta cifs_cmd_buffer_ptr
|
|
||||||
lda cifs_cmd_buffer_ptr+1
|
|
||||||
adc tcp_inbound_data_length+1
|
|
||||||
sta cifs_cmd_buffer_ptr+1
|
|
||||||
|
|
||||||
; increment the cmd buffer length
|
|
||||||
clc
|
|
||||||
lda cifs_cmd_length
|
|
||||||
adc tcp_inbound_data_length
|
|
||||||
sta cifs_cmd_length
|
|
||||||
lda cifs_cmd_length+1
|
|
||||||
adc tcp_inbound_data_length+1
|
|
||||||
sta cifs_cmd_length+1
|
|
||||||
|
|
||||||
; have we got a complete message?
|
|
||||||
ldax cifs_cmd_buffer
|
|
||||||
stax ptr1
|
|
||||||
ldy #3
|
|
||||||
lda (ptr1),y
|
|
||||||
cmp cifs_cmd_length
|
|
||||||
bne @not_got_full_message
|
|
||||||
dey
|
|
||||||
lda (ptr1),y
|
|
||||||
cmp cifs_cmd_length+1
|
|
||||||
bne @not_got_full_message
|
|
||||||
|
|
||||||
; we have a complete message!
|
|
||||||
ldy #0
|
|
||||||
lda (ptr1),y ; get the message type
|
|
||||||
cmp #$81 ; is it a session request?
|
|
||||||
bne @not_session_request
|
|
||||||
ldax #positive_session_response_packet_length
|
|
||||||
stax tcp_send_data_len
|
|
||||||
ldax #positive_session_response_packet
|
|
||||||
jsr tcp_send
|
|
||||||
jmp @message_handled
|
|
||||||
|
|
||||||
@not_session_request:
|
|
||||||
cmp #$00 ; is it a session message?
|
|
||||||
bne @not_session_message
|
|
||||||
|
|
||||||
; this SHOULD be a SMB - best check the header
|
|
||||||
ldy #4
|
|
||||||
lda (ptr1),y ; get the message data
|
|
||||||
cmp #$FF ; start of SMB header
|
|
||||||
bne @not_smb
|
|
||||||
iny
|
|
||||||
lda (ptr1),y ; get the message data
|
|
||||||
cmp #'S' ; start of SMB header
|
|
||||||
bne @not_smb
|
|
||||||
|
|
||||||
jsr smb_handler
|
|
||||||
|
|
||||||
jmp @message_handled
|
|
||||||
|
|
||||||
; this doesn't look like a NBT session message or SMB, so give up
|
|
||||||
@not_session_message:
|
|
||||||
@not_smb:
|
|
||||||
jsr tcp_close
|
|
||||||
jmp @eof
|
|
||||||
|
|
||||||
@message_handled:
|
|
||||||
; reset ready for next message on this connection
|
|
||||||
ldax #-4 ; start at -4, to skip the NBT header length
|
|
||||||
stax cifs_cmd_length
|
|
||||||
|
|
||||||
ldax cifs_cmd_buffer
|
|
||||||
stax cifs_cmd_buffer_ptr
|
|
||||||
|
|
||||||
@not_got_full_message:
|
|
||||||
rts
|
|
||||||
|
|
||||||
smb_handler:
|
|
||||||
; at this point, ptr1 points to an SMB block encapsulated in an NBT session header
|
|
||||||
clc
|
|
||||||
lda ptr1
|
|
||||||
adc #4
|
|
||||||
sta smb_ptr ; skip past the NBT header
|
|
||||||
lda ptr1+1
|
|
||||||
adc #00
|
|
||||||
sta smb_ptr+1
|
|
||||||
|
|
||||||
ldy #8
|
|
||||||
lda (ptr1),y ; get the SMB type
|
|
||||||
cmp #$72
|
|
||||||
bne @not_negotiate_protocol
|
|
||||||
jmp @negotiate_protocol
|
|
||||||
|
|
||||||
@not_negotiate_protocol:
|
|
||||||
; we assume it is an "AndX" command
|
|
||||||
sta andx_opcode
|
|
||||||
lda smb_ptr
|
|
||||||
clc
|
|
||||||
adc #$20 ; skip over SMB header
|
|
||||||
sta andx_ptr
|
|
||||||
|
|
||||||
lda smb_ptr+1
|
|
||||||
adc #00
|
|
||||||
sta andx_ptr+1
|
|
||||||
|
|
||||||
jsr start_smb_response
|
|
||||||
|
|
||||||
@parse_andx_block:
|
|
||||||
ldax andx_ptr
|
|
||||||
stax ptr1
|
|
||||||
lda andx_opcode
|
|
||||||
|
|
||||||
cmp #$ff
|
|
||||||
beq @done_all_andx_blocks
|
|
||||||
|
|
||||||
ldy #0
|
|
||||||
@andx_opcode_scan:
|
|
||||||
lda andx_opcodes,y
|
|
||||||
beq @opcode_not_found
|
|
||||||
cmp andx_opcode
|
|
||||||
beq @opcode_found
|
|
||||||
iny
|
|
||||||
iny
|
|
||||||
iny
|
|
||||||
jmp @andx_opcode_scan
|
|
||||||
@opcode_found:
|
|
||||||
lda andx_opcodes+1,y
|
|
||||||
sta andx_handler+1
|
|
||||||
lda andx_opcodes+2,y
|
|
||||||
sta andx_handler+2
|
|
||||||
jsr andx_handler
|
|
||||||
jmp @go_to_next_andx_block
|
|
||||||
|
|
||||||
@opcode_not_found:
|
|
||||||
jsr unknown_andx
|
|
||||||
|
|
||||||
@go_to_next_andx_block:
|
|
||||||
ldy #3
|
|
||||||
lda (ptr1),y ; get the AndX offset low byte
|
|
||||||
clc
|
|
||||||
adc smb_ptr
|
|
||||||
sta andx_ptr
|
|
||||||
iny
|
|
||||||
lda (ptr1),y ; get the AndX offset high byte
|
|
||||||
adc smb_ptr+1
|
|
||||||
sta andx_ptr+1
|
|
||||||
ldy #1
|
|
||||||
lda (ptr1),y ; get the subsequent AndX opcode
|
|
||||||
sta andx_opcode
|
|
||||||
|
|
||||||
jmp @parse_andx_block
|
|
||||||
|
|
||||||
@done_all_andx_blocks:
|
|
||||||
ldax smb_response_length
|
|
||||||
inx ; FIXME! this is to force wireshark to dump as SMB even tho packet is incorrect
|
|
||||||
stax tcp_send_data_len
|
|
||||||
ldax smb_response_buffer
|
|
||||||
jsr tcp_send
|
|
||||||
rts
|
|
||||||
|
|
||||||
@negotiate_protocol:
|
|
||||||
; copy the request TID,PID,UID,MID into the response
|
|
||||||
ldy #28 ; offset of TID from start of message
|
|
||||||
ldx #0
|
|
||||||
: lda (ptr1),y
|
|
||||||
sta negotiate_protocol_response_tid,x
|
|
||||||
inx
|
|
||||||
iny
|
|
||||||
cpx #8
|
|
||||||
bne :-
|
|
||||||
|
|
||||||
lda #$ff
|
|
||||||
sta dialect_index
|
|
||||||
sta dialect_index+1
|
|
||||||
clc
|
|
||||||
lda cifs_cmd_buffer
|
|
||||||
adc #$26
|
|
||||||
sta ptr1
|
|
||||||
lda cifs_cmd_buffer+1
|
|
||||||
adc #$00
|
|
||||||
sta ptr1+1
|
|
||||||
|
|
||||||
ldy #$0
|
|
||||||
@dialect_scan_loop:
|
|
||||||
iny
|
|
||||||
bmi @end_of_dialects ; if we go to offset $80, we have gone too far
|
|
||||||
lda dialect_index
|
|
||||||
cmp #$10 ; if we've scanned more than $10 dialects, something is wrong
|
|
||||||
beq @end_of_dialects
|
|
||||||
lda (ptr1),y
|
|
||||||
cmp #$02
|
|
||||||
bne @test_dialect
|
|
||||||
inc dialect_index
|
|
||||||
jmp @dialect_scan_loop
|
|
||||||
@test_dialect:
|
|
||||||
tya
|
|
||||||
clc
|
|
||||||
adc ptr1
|
|
||||||
sta ptr1
|
|
||||||
bcc :+
|
|
||||||
inc ptr1+1
|
|
||||||
: ldy #0
|
|
||||||
|
|
||||||
@test_dialect_loop:
|
|
||||||
lda (ptr1),y
|
|
||||||
cmp preferred_dialect_id,y
|
|
||||||
bne @dialect_scan_loop
|
|
||||||
iny
|
|
||||||
cpy #preferred_dialect_id_length
|
|
||||||
bne @test_dialect_loop
|
|
||||||
inc dialect_index+1
|
|
||||||
jmp @found_preferred_dialect
|
|
||||||
|
|
||||||
@end_of_dialects:
|
|
||||||
lda #$ff
|
|
||||||
sta dialect_index
|
|
||||||
|
|
||||||
@found_preferred_dialect:
|
|
||||||
ldax #negotiate_protocol_response_message_length
|
|
||||||
stax tcp_send_data_len
|
|
||||||
ldax #negotiate_protocol_response_message
|
|
||||||
jsr tcp_send
|
|
||||||
rts
|
|
||||||
|
|
||||||
start_smb_response:
|
|
||||||
ldax smb_response_buffer
|
|
||||||
stax ptr2
|
|
||||||
ldy #0
|
|
||||||
@copy_header_loop:
|
|
||||||
lda (ptr1),y ; copy_src should be the SMB request - cloning this will set PID / MID etc
|
|
||||||
sta (ptr2),y
|
|
||||||
iny
|
|
||||||
cpy #smb_response_header_length
|
|
||||||
bne @copy_header_loop
|
|
||||||
lda #0
|
|
||||||
sta smb_response_length+1
|
|
||||||
lda #smb_response_header_length
|
|
||||||
sta smb_response_length
|
|
||||||
ldy #3
|
|
||||||
sta (ptr2),y
|
|
||||||
|
|
||||||
; set the flags correctly
|
|
||||||
ldy #smb_response_flags_offset
|
|
||||||
lda #$82 ; FLAGS byte
|
|
||||||
sta (ptr2),y
|
|
||||||
iny
|
|
||||||
lda #$01 ; FLAGS2 low byte
|
|
||||||
sta (ptr2),y
|
|
||||||
iny
|
|
||||||
lda #$00 ; FLAGS2 hi byte
|
|
||||||
sta (ptr2),y
|
|
||||||
rts
|
|
||||||
|
|
||||||
add_andx_response:
|
|
||||||
rts
|
|
||||||
|
|
||||||
.import print_a
|
|
||||||
.import print_hex
|
|
||||||
session_setup_andx:
|
|
||||||
lda #'S'
|
|
||||||
jsr print_a
|
|
||||||
rts
|
|
||||||
|
|
||||||
tree_connect_andx:
|
|
||||||
lda #'T'
|
|
||||||
jsr print_a
|
|
||||||
rts
|
|
||||||
|
|
||||||
unknown_andx:
|
|
||||||
lda andx_opcode
|
|
||||||
jsr print_hex
|
|
||||||
lda #'?'
|
|
||||||
jsr print_a
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
.rodata
|
|
||||||
|
|
||||||
andx_opcodes:
|
|
||||||
.byte $73
|
|
||||||
.word session_setup_andx
|
|
||||||
.byte $75
|
|
||||||
.word tree_connect_andx
|
|
||||||
.byte $00
|
|
||||||
|
|
||||||
|
|
||||||
.data
|
|
||||||
|
|
||||||
andx_handler:
|
|
||||||
jmp $FFFF ; filled in later
|
|
||||||
|
|
||||||
smb_response_header:
|
|
||||||
negotiate_protocol_response_message:
|
|
||||||
.byte $00 ; message type = session message
|
|
||||||
.byte $00,$00,negotiate_protocol_response_message_length-4 ; NBT header
|
|
||||||
.byte $FF,"SMB" ; SMB header
|
|
||||||
.byte $72 ; command = negotiate protocol
|
|
||||||
.byte $00,$00,$00,$00 ; status = OK
|
|
||||||
smb_response_flags_offset = *-smb_response_header
|
|
||||||
.byte $82 ; flags : oplocks not supported, paths are case sensitive
|
|
||||||
.byte $01,$00 ; flags 2 - long file names allowed
|
|
||||||
.byte $00, $00 ; PID HIGH
|
|
||||||
.byte $00,$00,$00,$00,$00,$00,$00,$00 ; signature
|
|
||||||
.byte $00, $00 ; reserved
|
|
||||||
negotiate_protocol_response_tid:
|
|
||||||
.byte $00,$00 ; tree ID
|
|
||||||
.byte $98,$76 ; PID - to be overwritten
|
|
||||||
.byte $65,$64 ; USER ID - to be overwritten
|
|
||||||
.byte $ab,$cd ; multiplex ID - to be overwritten
|
|
||||||
smb_response_header_length = *-smb_response_header
|
|
||||||
.byte $11 ; word count
|
|
||||||
dialect_index:
|
|
||||||
.byte $00, $00 ; index of selected dialect
|
|
||||||
.byte $00 ; security mode: share, no encryption
|
|
||||||
.byte $01,$00 ; Max MPX count
|
|
||||||
.byte $01,$00 ; Max VCs count
|
|
||||||
.byte $00,$08,$00,$00 ; max buffer size
|
|
||||||
.byte $00,$08,$00,$00 ; max raw size
|
|
||||||
.byte $12,$34,$56,$78 ; session key
|
|
||||||
.byte $00,$00,$00,$00 ; capabilities
|
|
||||||
.byte $00,$00,$00,$00 ; server time low
|
|
||||||
.byte $00,$00,$00,$00 ; server time high
|
|
||||||
.byte $00,$00 ; server GMT offset
|
|
||||||
.byte $00 ; encryption key length
|
|
||||||
.word negotiate_protocol_response_message_data_length ; data length
|
|
||||||
negotiate_protocol_response_message_data:
|
|
||||||
.byte "WORKGROUP",0
|
|
||||||
.byte "SERVERNAME",0
|
|
||||||
|
|
||||||
negotiate_protocol_response_message_length = *-negotiate_protocol_response_message
|
|
||||||
negotiate_protocol_response_message_data_length = *-negotiate_protocol_response_message_data
|
|
||||||
|
|
||||||
host_announce_message:
|
|
||||||
.byte $11 ; message type = direct group datagram
|
|
||||||
.byte $02 ; no more fragments, this is first fragment, node type = B
|
|
||||||
.byte $ab,$cd ; txn id
|
|
||||||
host_announce_my_ip:
|
|
||||||
.byte $0,0,0,0 ; source IP
|
|
||||||
.byte $0,138 ; source port
|
|
||||||
.byte $00,<(host_announce_message_length-4) ; datagram length
|
|
||||||
.byte $00,$00 ; packet offset
|
|
||||||
.byte $20 ; hostname length
|
|
||||||
host_announce_hostname:
|
|
||||||
.res 32 ; hostname
|
|
||||||
.byte $0 ; nul at end of hostname
|
|
||||||
; now WORKGROUP<1D> encoded
|
|
||||||
|
|
||||||
.byte $20, $46, $48, $45, $50, $46, $43, $45, $4c, $45, $48, $46, $43, $45, $50, $46
|
|
||||||
.byte $46, $46, $41, $43, $41, $43, $41, $43, $41, $43, $41, $43, $41, $43, $41, $42, $4E, $00
|
|
||||||
|
|
||||||
.byte $ff,"SMB" ; Server Message Block header
|
|
||||||
.byte $25 ; SMB command = Transaction
|
|
||||||
.byte $00 ; error class = success
|
|
||||||
.byte $00 ; reserved
|
|
||||||
.byte $00,$00 ; no error
|
|
||||||
.byte $00 ; flags
|
|
||||||
.byte $00,$00 ; flags2
|
|
||||||
.byte $00,$00 ; PID high
|
|
||||||
.byte $00,$00,$00,$00,$00,$00,$00,$00 ; Signature
|
|
||||||
.byte $00,$00 ; reserved
|
|
||||||
.byte $00,$00 ; tree ID
|
|
||||||
.byte $00,$00 ; process ID
|
|
||||||
.byte $00,$00 ; user ID
|
|
||||||
.byte $00,$00 ; multiplex ID
|
|
||||||
.byte $11 ; txn word count
|
|
||||||
.byte $00,$00 ; txn paramater count
|
|
||||||
.byte $21,$00 ; txn total data count
|
|
||||||
.byte $00,$00 ; txn max paramater count
|
|
||||||
.byte $00,$00 ; txn max data count
|
|
||||||
.byte $00 ; txn max setup count
|
|
||||||
.byte $00 ; reserved
|
|
||||||
.byte $00,$00 ; flags
|
|
||||||
.byte $ed,$03,$00,$00 ; timeout = 1 second
|
|
||||||
.byte $00,$00 ; reserved
|
|
||||||
.byte $00,$00 ; paramater count
|
|
||||||
.byte $00,$00 ; paramater offset
|
|
||||||
.byte $21,$00 ; data count
|
|
||||||
.byte $56,$00 ; data offset
|
|
||||||
.byte $03 ; setup count
|
|
||||||
.byte $00 ; reserved
|
|
||||||
|
|
||||||
.byte $01,$00 ; opcode = WRITE MAIL SLOT
|
|
||||||
.byte $00,$00 ; priority 0
|
|
||||||
.byte $02,$00 ; class = unreliable & broadcast
|
|
||||||
.byte $32,$00 ; byte count
|
|
||||||
.byte "\MAILSLOT\BROWSE", 0
|
|
||||||
.byte $01 ; command - HOST ANNOUNCEMENT
|
|
||||||
.byte $0 ; update count 0
|
|
||||||
.byte $80,$fc,03,00 ; update period
|
|
||||||
host_announce_servername:
|
|
||||||
.res 16
|
|
||||||
.byte $01 ; OS major version
|
|
||||||
.byte $64 ; OS minor version
|
|
||||||
.byte $03,$02,$0,$0 ; advertise as a workstation, server & print host
|
|
||||||
.byte $0F ; browser major version
|
|
||||||
.byte $01 ; browser minor version
|
|
||||||
.byte $55,$aa ; signature
|
|
||||||
.byte $0 ; host comment
|
|
||||||
host_announce_message_length = *-host_announce_message
|
|
||||||
|
|
||||||
netbios_name_query_response:
|
|
||||||
.byte $12,$34 ; transaction id
|
|
||||||
.byte $85,$00 ; flags: name query response, no error
|
|
||||||
.byte $00,$00 ; questions = 0
|
|
||||||
.byte $00,$01 ; answers = 1
|
|
||||||
.byte $00,$00 ; authority records = 0
|
|
||||||
.byte $00,$00 ; additional records = 0
|
|
||||||
.byte $20
|
|
||||||
netbios_name_query_response_hostname:
|
|
||||||
.res 30 ; will be replaced with encoded hostname
|
|
||||||
.byte $43,$41
|
|
||||||
.byte $00
|
|
||||||
.byte $00,$20 ; type = NB
|
|
||||||
.byte $00,$01 ; class = IN
|
|
||||||
.byte $00,$00,$01,$40 ; TTL = 64 seconds
|
|
||||||
.byte $00,$06 ; data length
|
|
||||||
.byte $00,$00 ; FLAGS = B-NODE, UNIQUE NAME
|
|
||||||
netbios_name_query_response_ip:
|
|
||||||
.res 4 ; filled in with our IP
|
|
||||||
netbios_name_query_response_length = *-netbios_name_query_response
|
|
||||||
|
|
||||||
registration_request:
|
|
||||||
.byte $0c,$64 ; txn ID
|
|
||||||
.byte $29,$10 ; Registration Request opcode & flags
|
|
||||||
.byte $00,$01 ; questions = 1
|
|
||||||
.byte $00,$00 ; answers = 0
|
|
||||||
.byte $00,$00 ; authority records = 0
|
|
||||||
.byte $00,$01 ; additional records = 1
|
|
||||||
registration_request_servername:
|
|
||||||
; now WORKGROUP<00> encoded
|
|
||||||
.byte $20, $46, $48, $45, $50, $46, $43, $45, $4c, $45, $48, $46, $43, $45, $50, $46
|
|
||||||
.byte $46, $46, $41, $43, $41, $43, $41, $43, $41, $43, $41, $43, $41, $43, $41, $41, $41, $00
|
|
||||||
|
|
||||||
.byte $00,$20 ; question_type = NB
|
|
||||||
.byte $00,$01 ; question_class = IN
|
|
||||||
.byte $c0,$0c ; additional record name : ptr to string in QUESTION NAME
|
|
||||||
.byte $00,$20 ; question_type = NB
|
|
||||||
.byte $00,$01 ; question_class = IN
|
|
||||||
.byte $00,$00,$01,$40 ; TTL = 64 seconds
|
|
||||||
.byte $00,$06 ; data length
|
|
||||||
.byte $00,$00 ; FLAGS = B-NODE, UNIQUE NAME
|
|
||||||
|
|
||||||
|
|
||||||
.rodata
|
|
||||||
|
|
||||||
preferred_dialect_id: .byte "NT LM 0.12"
|
|
||||||
preferred_dialect_id_length = *-preferred_dialect_id
|
|
||||||
|
|
||||||
positive_session_response_packet:
|
|
||||||
.byte $82 ; packet type = Positive session response
|
|
||||||
.byte $00 ; flags
|
|
||||||
.byte $00,$00 ; message length
|
|
||||||
positive_session_response_packet_length = *-positive_session_response_packet
|
|
||||||
|
|
||||||
|
|
||||||
.data
|
|
||||||
|
|
||||||
cifs_cmd_buffer: .word DEFAULT_CIFS_CMD_BUFFER
|
|
||||||
|
|
||||||
smb_response_buffer: .word DEFAULT_SMB_RESPONSE_BUFFER
|
|
||||||
|
|
||||||
|
|
||||||
.bss
|
|
||||||
|
|
||||||
hostname_buffer: .res 33
|
|
||||||
|
|
||||||
local_hostname: .res 33
|
|
||||||
|
|
||||||
raw_local_hostname: .res 16
|
|
||||||
|
|
||||||
hi_nibble: .res 1
|
|
||||||
|
|
||||||
connection_closed: .res 1
|
|
||||||
|
|
||||||
cifs_cmd_buffer_ptr: .res 2
|
|
||||||
cifs_cmd_length: .res 2
|
|
||||||
|
|
||||||
andx_opcode: .res 1
|
|
||||||
andx_ptr: .res 2 ; pointer to next 'AndX' command
|
|
||||||
andx_length: .res 2
|
|
||||||
smb_ptr: .res 2
|
|
||||||
smb_response_length: .res 2
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; 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
|
|
||||||
; Jonno Downes. All Rights Reserved.
|
|
||||||
; -- LICENSE END --
|
|
161
ip65/debug.s
161
ip65/debug.s
@ -1,161 +0,0 @@
|
|||||||
; routines for dumping debug information
|
|
||||||
|
|
||||||
.include "zeropage.inc"
|
|
||||||
.include "../inc/common.i"
|
|
||||||
.include "../inc/printf.i"
|
|
||||||
|
|
||||||
.export dbgout16
|
|
||||||
.export dbg_dump_eth_header
|
|
||||||
.export dbg_dump_ip_header
|
|
||||||
.export dbg_dump_udp_header
|
|
||||||
|
|
||||||
.export console_out
|
|
||||||
.export console_strout
|
|
||||||
|
|
||||||
.import eth_outp, eth_outp_len
|
|
||||||
.import ip_outp
|
|
||||||
.import udp_outp
|
|
||||||
|
|
||||||
|
|
||||||
.code
|
|
||||||
|
|
||||||
; prints out the header of ethernet packet that is ready to be sent;
|
|
||||||
; inputs:
|
|
||||||
; eth_outp: pointer to ethernet packet
|
|
||||||
; eth_outp_len: length of ethernet packet
|
|
||||||
; outputs: none
|
|
||||||
dbg_dump_eth_header:
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
tya
|
|
||||||
pha
|
|
||||||
|
|
||||||
printf "\rethernet header:\r"
|
|
||||||
printf "len: %04x\r", eth_outp_len
|
|
||||||
printf "dest: %04x:%04x:%04x\r", eth_outp, eth_outp + 2, eth_outp + 4
|
|
||||||
printf "src: %04x:%04x:%04x\r", eth_outp + 6, eth_outp + 8, eth_outp + 10
|
|
||||||
printf "type: %04x\r", eth_outp + 12
|
|
||||||
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
; prints out the header of ip packet that is ready to be sent;
|
|
||||||
; inputs:
|
|
||||||
; eth_outp: pointer to ethernet packet containing an ip packet
|
|
||||||
; eth_outp_len: length of ethernet packet
|
|
||||||
; outputs: none
|
|
||||||
dbg_dump_ip_header:
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
tya
|
|
||||||
pha
|
|
||||||
|
|
||||||
printf "\rip header:\r"
|
|
||||||
printf "ver,ihl,tos: %04x\r", ip_outp
|
|
||||||
printf "len: %04x\r", ip_outp + 2
|
|
||||||
printf "id: %04x\r", ip_outp + 4
|
|
||||||
printf "frag: %04x\r", ip_outp + 6
|
|
||||||
printf "ttl: %02x\r", ip_outp + 8
|
|
||||||
printf "proto: %02x\r", ip_outp + 9
|
|
||||||
printf "cksum: %04x\r", ip_outp + 10
|
|
||||||
printf "src: %04x%04x\r", ip_outp + 12, ip_outp + 14
|
|
||||||
printf "dest: %04x%04x\r", ip_outp + 16, ip_outp + 18
|
|
||||||
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
; prints out the header of udp packet that is ready to be sent;
|
|
||||||
; inputs:
|
|
||||||
; eth_outp: pointer to ethernet packet containing a udp packet
|
|
||||||
; eth_outp_len: length of ethernet packet
|
|
||||||
; outputs: none
|
|
||||||
dbg_dump_udp_header:
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
tya
|
|
||||||
pha
|
|
||||||
|
|
||||||
printf "\rudp header:\r"
|
|
||||||
printf "srcport: %04x\r", ip_outp
|
|
||||||
printf "destport: %04x\r", ip_outp + 2
|
|
||||||
printf "len: %04x\r", ip_outp + 4
|
|
||||||
printf "cksum: %04x\r", ip_outp + 6
|
|
||||||
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
console_out = $ffd2
|
|
||||||
|
|
||||||
; print a string to the console
|
|
||||||
; inputs: AX = address of (null terminated) string to print
|
|
||||||
; outputs: none
|
|
||||||
console_strout:
|
|
||||||
stax ptr1
|
|
||||||
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
tya
|
|
||||||
pha
|
|
||||||
ldy #0
|
|
||||||
: lda (ptr1),y
|
|
||||||
beq @done
|
|
||||||
jsr console_out
|
|
||||||
iny
|
|
||||||
bne :-
|
|
||||||
@done:
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
; print a 32 bit number as 4 hex digits
|
|
||||||
; inputs: AX = 32 bit number to print
|
|
||||||
; outputs: none
|
|
||||||
dbgout16:
|
|
||||||
stax val16
|
|
||||||
printf "%04x", val16
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
.bss
|
|
||||||
|
|
||||||
val16: .res 2
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; -- LICENSE FOR debug.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 Per Olofsson,
|
|
||||||
; MagerValp@gmail.com.
|
|
||||||
; Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
; Per Olofsson. All Rights Reserved.
|
|
||||||
; -- LICENSE END --
|
|
@ -1,8 +1,6 @@
|
|||||||
.include "zeropage.inc"
|
.include "zeropage.inc"
|
||||||
.include "../inc/common.i"
|
.include "../inc/common.i"
|
||||||
|
|
||||||
; .import dbg_dump_ip_header
|
|
||||||
|
|
||||||
.export ip_init
|
.export ip_init
|
||||||
.export ip_process
|
.export ip_process
|
||||||
.export ip_calc_cksum
|
.export ip_calc_cksum
|
||||||
@ -362,7 +360,6 @@ ip_send:
|
|||||||
adc #0
|
adc #0
|
||||||
sta eth_outp_len + 1
|
sta eth_outp_len + 1
|
||||||
|
|
||||||
; jsr dbg_dump_ip_header
|
|
||||||
jmp eth_tx ; send packet and return status
|
jmp eth_tx ; send packet and return status
|
||||||
|
|
||||||
; calculate checksum for a buffer according to the standard IP checksum algorithm
|
; calculate checksum for a buffer according to the standard IP checksum algorithm
|
||||||
|
@ -31,8 +31,6 @@
|
|||||||
|
|
||||||
.importzp eth_proto_arp
|
.importzp eth_proto_arp
|
||||||
|
|
||||||
.export ip65_random_word
|
|
||||||
|
|
||||||
|
|
||||||
.bss
|
.bss
|
||||||
|
|
||||||
|
419
ip65/printf.s
419
ip65/printf.s
@ -1,419 +0,0 @@
|
|||||||
.include "../inc/common.i"
|
|
||||||
|
|
||||||
.export console_printf
|
|
||||||
|
|
||||||
.import console_out
|
|
||||||
.import console_strout
|
|
||||||
|
|
||||||
|
|
||||||
.segment "IP65ZP" : zeropage
|
|
||||||
|
|
||||||
strptr: .res 2
|
|
||||||
argptr: .res 2
|
|
||||||
valptr: .res 2
|
|
||||||
|
|
||||||
|
|
||||||
.bss
|
|
||||||
|
|
||||||
ysave: .res 1
|
|
||||||
arg: .res 1
|
|
||||||
fieldwidth: .res 1
|
|
||||||
fieldwcnt: .res 1
|
|
||||||
leadzero: .res 1
|
|
||||||
argtemp: .res 1
|
|
||||||
int: .res 2
|
|
||||||
num: .res 5
|
|
||||||
ext: .res 2
|
|
||||||
|
|
||||||
|
|
||||||
.code
|
|
||||||
|
|
||||||
; print a string to console, with (some) standard printf % codes converted
|
|
||||||
; inputs: AX = pointer to 'argument list'
|
|
||||||
; first word in argument list is the string to be printed
|
|
||||||
; subsequent words in argument list are interpolated in to the string as
|
|
||||||
; it is displayed. (argument list is automagically created by the 'printf' macro
|
|
||||||
; defined in inc/printf.i)
|
|
||||||
; outputs: none
|
|
||||||
; supported % codes:
|
|
||||||
; %s: string (argument interpreted as pointer to null terminated string)
|
|
||||||
; %d: decimal number (arguement interpreted as 16 bit number)
|
|
||||||
; %x: hex number (arguement interpreted as 16 bit number)
|
|
||||||
; %c: char (arguement interpreted as pointer to single ASCII char)
|
|
||||||
; "field width" modifiers are also supported, e.g "%02x" to print 2 hex digits
|
|
||||||
console_printf:
|
|
||||||
stax argptr
|
|
||||||
ldy #0
|
|
||||||
lda (argptr),y
|
|
||||||
sta strptr
|
|
||||||
iny
|
|
||||||
lda (argptr),y
|
|
||||||
sta strptr + 1
|
|
||||||
iny
|
|
||||||
sty arg
|
|
||||||
|
|
||||||
ldy #0
|
|
||||||
@nextchar:
|
|
||||||
lda (strptr),y
|
|
||||||
bne :+
|
|
||||||
rts
|
|
||||||
: cmp #'%'
|
|
||||||
beq @printarg
|
|
||||||
|
|
||||||
cmp #'\'
|
|
||||||
beq @printescape
|
|
||||||
|
|
||||||
jsr console_out
|
|
||||||
|
|
||||||
@next:
|
|
||||||
iny
|
|
||||||
bne @nextchar
|
|
||||||
|
|
||||||
inc strptr + 1
|
|
||||||
jmp @nextchar
|
|
||||||
|
|
||||||
@printescape:
|
|
||||||
iny
|
|
||||||
bne :+
|
|
||||||
inc strptr + 1
|
|
||||||
: lda (strptr),y
|
|
||||||
ldx #esc_count - 1
|
|
||||||
: cmp esc_code,x
|
|
||||||
beq @escmatch
|
|
||||||
dex
|
|
||||||
bpl :-
|
|
||||||
bmi @next
|
|
||||||
@escmatch:
|
|
||||||
lda esc_char,x
|
|
||||||
jsr console_out
|
|
||||||
jmp @next
|
|
||||||
|
|
||||||
@printarg:
|
|
||||||
lda #0
|
|
||||||
sta fieldwidth
|
|
||||||
sta leadzero
|
|
||||||
lda #$ff
|
|
||||||
sta fieldwcnt
|
|
||||||
@argnext:
|
|
||||||
iny
|
|
||||||
bne :+
|
|
||||||
inc strptr + 1
|
|
||||||
: tya
|
|
||||||
pha
|
|
||||||
|
|
||||||
lda (strptr),y
|
|
||||||
|
|
||||||
cmp #'0' ; check for field width
|
|
||||||
bcc @notdigit
|
|
||||||
cmp #'9'+1
|
|
||||||
bcs @notdigit
|
|
||||||
and #$0f
|
|
||||||
bne :+ ; check for leading 0
|
|
||||||
inc fieldwcnt
|
|
||||||
bne :+
|
|
||||||
lda #$80
|
|
||||||
sta leadzero
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
jmp @argnext
|
|
||||||
: pha ; multiply old value by 10
|
|
||||||
asl fieldwidth
|
|
||||||
lda fieldwidth
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
clc
|
|
||||||
adc fieldwidth
|
|
||||||
sta fieldwidth
|
|
||||||
pla
|
|
||||||
clc ; add new value
|
|
||||||
adc fieldwidth
|
|
||||||
sta fieldwidth
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
jmp @argnext
|
|
||||||
|
|
||||||
@notdigit:
|
|
||||||
cmp #'s'
|
|
||||||
beq @argstr
|
|
||||||
|
|
||||||
cmp #'d'
|
|
||||||
beq @argint
|
|
||||||
|
|
||||||
cmp #'x'
|
|
||||||
beq @arghex
|
|
||||||
|
|
||||||
cmp #'c'
|
|
||||||
beq @argchar
|
|
||||||
|
|
||||||
@argdone:
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
jmp @next
|
|
||||||
|
|
||||||
@argstr:
|
|
||||||
jsr @argax
|
|
||||||
jsr console_strout
|
|
||||||
|
|
||||||
jmp @argdone
|
|
||||||
|
|
||||||
@argint:
|
|
||||||
jsr @argax
|
|
||||||
stax valptr
|
|
||||||
jsr @valax
|
|
||||||
jsr printint
|
|
||||||
|
|
||||||
jmp @argdone
|
|
||||||
|
|
||||||
@arghex:
|
|
||||||
jsr @argax
|
|
||||||
stax valptr
|
|
||||||
jsr @valax
|
|
||||||
jsr printhex
|
|
||||||
|
|
||||||
jmp @argdone
|
|
||||||
|
|
||||||
@argchar:
|
|
||||||
jsr @argax
|
|
||||||
stax valptr
|
|
||||||
ldy #0
|
|
||||||
lda (valptr),y
|
|
||||||
jsr console_out
|
|
||||||
|
|
||||||
jmp @argdone
|
|
||||||
|
|
||||||
@argax:
|
|
||||||
ldy arg
|
|
||||||
lda (argptr),y
|
|
||||||
pha
|
|
||||||
iny
|
|
||||||
lda (argptr),y
|
|
||||||
tax
|
|
||||||
iny
|
|
||||||
sty arg
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
@valax:
|
|
||||||
ldy #0
|
|
||||||
lda (valptr),y
|
|
||||||
pha
|
|
||||||
iny
|
|
||||||
lda (valptr),y
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
rts
|
|
||||||
|
|
||||||
@printx:
|
|
||||||
txa
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
tay
|
|
||||||
lda hex2asc,y
|
|
||||||
jsr console_out
|
|
||||||
txa
|
|
||||||
and #$0f
|
|
||||||
tay
|
|
||||||
lda hex2asc,y
|
|
||||||
jmp console_out
|
|
||||||
|
|
||||||
; print 16-bit hexadecimal number
|
|
||||||
printhex:
|
|
||||||
tay
|
|
||||||
and #$0f
|
|
||||||
sta num + 3
|
|
||||||
tya
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
sta num + 2
|
|
||||||
|
|
||||||
txa
|
|
||||||
and #$0f
|
|
||||||
sta num + 1
|
|
||||||
txa
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
sta num
|
|
||||||
|
|
||||||
lda #4
|
|
||||||
sec
|
|
||||||
sbc fieldwidth
|
|
||||||
tax
|
|
||||||
bpl :+
|
|
||||||
jsr printlong
|
|
||||||
: cpx #4
|
|
||||||
beq @nowidth
|
|
||||||
|
|
||||||
@printlead:
|
|
||||||
lda num,x
|
|
||||||
bne @printrest
|
|
||||||
lda #' '
|
|
||||||
bit leadzero
|
|
||||||
bpl :+
|
|
||||||
lda #'0'
|
|
||||||
: jsr console_out
|
|
||||||
inx
|
|
||||||
cpx #3
|
|
||||||
bne @printlead
|
|
||||||
|
|
||||||
@nowidth:
|
|
||||||
ldx #0
|
|
||||||
: lda num,x
|
|
||||||
bne @printrest
|
|
||||||
inx
|
|
||||||
cpx #4
|
|
||||||
bne :-
|
|
||||||
lda #'0'
|
|
||||||
jsr console_out
|
|
||||||
rts
|
|
||||||
|
|
||||||
@printrest:
|
|
||||||
lda num,x
|
|
||||||
tay
|
|
||||||
lda hex2asc,y
|
|
||||||
jsr console_out
|
|
||||||
inx
|
|
||||||
cpx #4
|
|
||||||
bne @printrest
|
|
||||||
rts
|
|
||||||
|
|
||||||
printlong:
|
|
||||||
lda #' '
|
|
||||||
bit leadzero
|
|
||||||
bpl :+
|
|
||||||
lda #'0'
|
|
||||||
: jsr console_out
|
|
||||||
inx
|
|
||||||
bne :-
|
|
||||||
rts
|
|
||||||
|
|
||||||
; print a 16-bit integer
|
|
||||||
printint:
|
|
||||||
stax int
|
|
||||||
|
|
||||||
ldx #4
|
|
||||||
@next:
|
|
||||||
lda #0
|
|
||||||
sta num,x
|
|
||||||
jsr div10
|
|
||||||
lda ext
|
|
||||||
sta num,x
|
|
||||||
dex
|
|
||||||
bpl @next
|
|
||||||
|
|
||||||
lda fieldwidth
|
|
||||||
beq @nowidth
|
|
||||||
lda #5
|
|
||||||
sec
|
|
||||||
sbc fieldwidth
|
|
||||||
tax
|
|
||||||
bpl :+
|
|
||||||
jsr printlong
|
|
||||||
:
|
|
||||||
@printlead:
|
|
||||||
lda num,x
|
|
||||||
bne @print
|
|
||||||
|
|
||||||
lda #' '
|
|
||||||
bit leadzero
|
|
||||||
bpl :+
|
|
||||||
lda #'0'
|
|
||||||
: jsr console_out
|
|
||||||
inx
|
|
||||||
cpx #5
|
|
||||||
bne @printlead
|
|
||||||
beq @printzero
|
|
||||||
|
|
||||||
@nowidth:
|
|
||||||
inx
|
|
||||||
cpx #5
|
|
||||||
beq @printzero
|
|
||||||
lda num,x
|
|
||||||
beq @nowidth
|
|
||||||
|
|
||||||
@print:
|
|
||||||
clc
|
|
||||||
adc #'0'
|
|
||||||
jsr console_out
|
|
||||||
inx
|
|
||||||
cpx #5
|
|
||||||
beq @done
|
|
||||||
@printall:
|
|
||||||
lda num,x
|
|
||||||
jmp @print
|
|
||||||
|
|
||||||
@done:
|
|
||||||
rts
|
|
||||||
|
|
||||||
@printzero:
|
|
||||||
lda #'0'
|
|
||||||
jmp console_out
|
|
||||||
|
|
||||||
; 16/16-bit division, from the fridge
|
|
||||||
; int/aux -> int, remainder in ext
|
|
||||||
div10:
|
|
||||||
lda #0
|
|
||||||
sta ext+1
|
|
||||||
ldy #$10
|
|
||||||
@dloop:
|
|
||||||
asl int
|
|
||||||
rol int+1
|
|
||||||
rol
|
|
||||||
rol ext+1
|
|
||||||
pha
|
|
||||||
cmp #10
|
|
||||||
lda ext+1
|
|
||||||
sbc #0 ; is this a nop?
|
|
||||||
bcc @div2
|
|
||||||
sta ext+1
|
|
||||||
pla
|
|
||||||
sbc #10
|
|
||||||
pha
|
|
||||||
inc int
|
|
||||||
@div2:
|
|
||||||
pla
|
|
||||||
dey
|
|
||||||
bne @dloop
|
|
||||||
sta ext
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
.rodata
|
|
||||||
|
|
||||||
msg_unimplemented:
|
|
||||||
.byte "<unimplemented>",0
|
|
||||||
|
|
||||||
hex2asc:
|
|
||||||
.byte "0123456789abcdef"
|
|
||||||
|
|
||||||
esc_code:
|
|
||||||
.byte "eabfnrt", '\'
|
|
||||||
esc_count = * - esc_code
|
|
||||||
esc_char:
|
|
||||||
.byte 27, 7, 8, 12, 10, 13, 9, '\'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; -- LICENSE FOR printf.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 Per Olofsson,
|
|
||||||
; MagerValp@gmail.com.
|
|
||||||
; Portions created by the Initial Developer are Copyright (C) 2009
|
|
||||||
; Per Olofsson. All Rights Reserved.
|
|
||||||
; -- LICENSE END --
|
|
@ -7,8 +7,6 @@
|
|||||||
.include "../inc/kipper_constants.i"
|
.include "../inc/kipper_constants.i"
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
; .import dbg_dump_udp_header
|
|
||||||
|
|
||||||
.import ip65_error
|
.import ip65_error
|
||||||
|
|
||||||
.export udp_init
|
.export udp_init
|
||||||
@ -339,7 +337,6 @@ udp_send_internal:
|
|||||||
lda #ip_proto_udp ; set protocol
|
lda #ip_proto_udp ; set protocol
|
||||||
sta ip_outp + ip_proto
|
sta ip_outp + ip_proto
|
||||||
|
|
||||||
; jsr dbg_dump_udp_header
|
|
||||||
jmp ip_send ; send packet, sec on error
|
jmp ip_send ; send packet, sec on error
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user