emailler/test/testsend.s

332 lines
4.2 KiB
ArmAsm

.include "../inc/common.i"
.include "../inc/petscii.i"
.import eth_init
.import eth_init
.import eth_rx
.import eth_tx
.import eth_inp
.import eth_inp_len
.import arp_init
.import arp_lookup
.import arp_process
.import ip_init
.import ip_process
.import ip_create_packet
.import ip_send
.import ip_calc_cksum
.import ip_inp
.import ip_outp
.importzp ip_cksum_ptr
.importzp ip_header_cksum
.importzp ip_src
.importzp ip_dest
.importzp ip_data
.importzp ip_len
.importzp ip_id
.importzp ip_proto
.import icmp_inp
.import icmp_outp
.importzp icmp_type
.importzp icmp_code
.importzp icmp_cksum
.importzp icmp_data
.zeropage
printptr: .res 2
pptr: .res 2
.bss
pbtemp: .res 1
cnt: .res 2
.segment "STARTUP"
.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
.code
init:
lda #0
sta $d021
jsr eth_init ; initialize ethernet driver
ldx #0
bcc :+
ldax #failmsg
jmp print
: ldax #startmsg
jsr print
jsr arp_init ; initialize arp
jsr ip_init ; initialize ip and icmp
@waitpacket:
; call ip_create_packet
; set length
; set ID
; set protocol
; set destination address
; send ping
jsr ip_create_packet ; create packet template
lda #0
sta ip_outp + ip_len ; set length
lda #64
sta ip_outp + ip_len + 1
lda #$12
sta ip_outp + ip_id ; set id
lda #$34
sta ip_outp + ip_id + 1
lda #$01
sta ip_outp + ip_proto ; set protocol
ldx #3
: lda pingdest,x ; set destination
sta ip_outp + ip_dest,x
dex
bpl :-
inc cnt ; increment ping counter
bne :+
inc cnt + 1
:
lda #8
sta icmp_outp + icmp_type
lda #0
sta icmp_outp + icmp_code
sta icmp_outp + icmp_cksum
sta icmp_outp + icmp_cksum + 1
lda #$12
sta icmp_outp + icmp_data
lda #$34
sta icmp_outp + icmp_data + 1
lda cnt + 1
sta icmp_outp + icmp_data + 2
lda cnt
sta icmp_outp + icmp_data + 3
ldx #35
: txa
ora #$20
sta icmp_outp + icmp_data + 4,x
dex
bpl :-
ldax #icmp_outp
stax ip_cksum_ptr
ldax #44
jsr ip_calc_cksum
stax icmp_outp + icmp_cksum
jsr ip_send
bcc @wait
inc $d020
@wait:
jsr eth_rx
bcs @wait
lda eth_inp + 12
cmp #8
beq :+
jmp @waitpacket
:
lda eth_inp + 13
beq @ip ; ip
cmp #6 ; arp
beq @arp
jmp @waitpacket
@arp:
ldax #arpmsg
jsr print
ldax eth_inp_len
jsr printint
ldax #bytesmsg
jsr print
jsr arp_process ; process arp packet
jmp @dontprint
ldax #eth_inp
stax pptr
ldy #petscii_ltred ; dest addr
lda #6
jsr printbytes
ldy #petscii_ltgreen ; src addr
lda #6
jsr printbytes
ldy #petscii_ltgray ; type
lda #2
jsr printbytes
lda #13
jsr $ffd2
ldy #petscii_yellow ; hw, proto, hwlen, protolen, op
lda #8
jsr printbytes
lda #13
jsr $ffd2
ldy #petscii_cyan
lda #10
jsr printbytes
lda #13
jsr $ffd2
ldy #petscii_white
lda #10
jsr printbytes
lda #13
jsr $ffd2
@dontprint:
lda #petscii_ltblue
jsr $ffd2
@wp:
jmp @waitpacket
@ip:
lda ip_inp + ip_proto
cmp #1
bne @wp
ldax #ipmsg
jsr print
ldax eth_inp_len
jsr printint
ldax #bytesmsg
jsr print
lda #petscii_white
jsr $ffd2
lda ip_inp + ip_proto
jsr printhex
ldax #ip_inp + ip_src
stax pptr
ldy #petscii_ltgreen
lda #4
jsr printbytes
ldax #ip_inp + ip_dest
stax pptr
ldy #petscii_ltred
lda #4
jsr printbytes
lda #petscii_ltblue
jsr $ffd2
lda #13
jsr $ffd2
; jsr $ffd2
jsr ip_process ; handle packet
jmp @waitpacket
printbytes:
sta pbtemp
tya
jsr $ffd2
ldy #0
: lda (pptr),y
jsr printhex
iny
cpy pbtemp
bne :-
lda pbtemp
clc
adc pptr
sta pptr
bcc :+
inc pptr+1
: rts
print:
sta printptr
stx printptr + 1
ldy #0
: lda (printptr),y
beq :+
jsr $ffd2
iny
bne :-
: rts
printint:
pha
txa
jsr printhex
pla
printhex:
pha
lsr
lsr
lsr
lsr
tax
lda hexdigit,x
jsr $ffd2
pla
and #$0f
tax
lda hexdigit,x
jsr $ffd2
rts
.data
hexdigit:
.byte "0123456789ABCDEF"
startmsg:
.byte 14, "rr-nET INITIALIZED", 13, 0
failmsg:
.byte 14, "rr-nET INIT FAILED", 13, 0
arpmsg:
.byte "arp PACKET RECEIVED: ",0
ipmsg:
.byte "ip PACKET RECEIVED: ",0
bytesmsg:
.byte " BYTES", 13, 0
pingdest:
.byte 192, 168, 0, 2