mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-07-13 02:28:59 +00:00
git-svn-id: http://svn.code.sf.net/p/netboot65/code@167 93682198-c243-4bdb-bd91-e943c89aac3b
This commit is contained in:
parent
9f811d4f3e
commit
675f2cc4b9
@ -13,6 +13,8 @@ SEGMENTS {
|
|||||||
IP65_DEFAULTS: load = RAM, run=RAM, type = ro , define = yes;
|
IP65_DEFAULTS: load = RAM, run=RAM, type = ro , define = yes;
|
||||||
DATA: load = RAM, run=RAM, type = rw , define = yes;
|
DATA: load = RAM, run=RAM, type = rw , define = yes;
|
||||||
BSS: load=RAM, type = bss, define = yes;
|
BSS: load=RAM, type = bss, define = yes;
|
||||||
|
TCP_VARS: load = RAM, type = bss;
|
||||||
|
APP_SCRATCH: load = RAM, type = bss;
|
||||||
ZEROPAGE: load = ZP, type = zp;
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
IP65ZP: load = IP65ZP, type = zp;
|
IP65ZP: load = IP65ZP, type = zp;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# CA65 config for a 16KB cart
|
# CA65 config for a 16KB cart
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
IP65ZP: start = $A3, size = $11, type = rw, define = yes;
|
IP65ZP: start = $A3, size = $13, type = rw, define = yes;
|
||||||
HEADER: start = $8000, size = $18, file = %O;
|
HEADER: start = $8000, size = $18, file = %O;
|
||||||
DEFAULTS: start = $8018, size = $1E, file = %O;
|
DEFAULTS: start = $8018, size = $1E, file = %O;
|
||||||
ROM: start = $8036, size = $3FC8, define = yes, file = %O;
|
ROM: start = $8036, size = $3FC8, define = yes, file = %O;
|
||||||
|
@ -18,13 +18,13 @@ DRIVERS=\
|
|||||||
all: $(DRIVERS)
|
all: $(DRIVERS)
|
||||||
|
|
||||||
|
|
||||||
apple2prog.lib: a2print.o uthernet.o a2timer.o a2kernal.o a2input.o
|
apple2prog.lib: a2print.o uthernet.o a2timer.o a2kernal.o a2input.o a2charconv.o
|
||||||
ar65 a $@ $^
|
ar65 a $@ $^
|
||||||
|
|
||||||
c64prog.lib: c64print.o rr-net.o c64timer.o c64kernal.o c64inputs.o c64_disk_access.o
|
c64prog.lib: c64print.o rr-net.o c64timer.o c64kernal.o c64inputs.o c64_disk_access.o c64charconv.o
|
||||||
ar65 a $@ $^
|
ar65 a $@ $^
|
||||||
|
|
||||||
c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o c64_disk_access.o
|
c64nb65.lib: c64print.o rr-net.o c64timer_nb65.o c64kernal.o c64inputs.o c64_disk_access.o c64charconv.o
|
||||||
ar65 a $@ $^
|
ar65 a $@ $^
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
19
client/drivers/a2charconv.s
Normal file
19
client/drivers/a2charconv.s
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
;ASCII/PETSCII conversion tables
|
||||||
|
;cribbed from http://www.ffd2.com/fridge/misc/petcom.c
|
||||||
|
|
||||||
|
|
||||||
|
.export ascii_to_native
|
||||||
|
.export native_to_ascii
|
||||||
|
|
||||||
|
;given an A2 Screen Code char in A, return equivalent ASCII
|
||||||
|
native_to_ascii:
|
||||||
|
;just strip high bit
|
||||||
|
and #$7f
|
||||||
|
rts
|
||||||
|
|
||||||
|
;given an ASCII char in A, return equivalent A2 Screen Code
|
||||||
|
ascii_to_native:
|
||||||
|
;set high bit
|
||||||
|
ora #$80
|
||||||
|
rts
|
||||||
|
|
@ -1,12 +1,40 @@
|
|||||||
.export get_key
|
.export get_key
|
||||||
.export check_for_abort_key
|
.export check_for_abort_key
|
||||||
|
.export get_filtered_input
|
||||||
|
.export filter_text
|
||||||
|
.export filter_ip
|
||||||
|
.export filter_dns
|
||||||
|
.export filter_number
|
||||||
|
.export get_key_ip65
|
||||||
|
.export get_key_if_available
|
||||||
|
|
||||||
|
.import ip65_process
|
||||||
|
.import print_a
|
||||||
|
.import print_hex
|
||||||
|
|
||||||
|
.importzp copy_src
|
||||||
|
|
||||||
|
.include "../inc/common.i"
|
||||||
|
|
||||||
|
allowed_ptr=copy_src ;reuse zero page
|
||||||
.code
|
.code
|
||||||
;use Apple 2 monitor ROM function to read from keyboard
|
;use Apple 2 monitor ROM function to read from keyboard
|
||||||
;inputs: none
|
;inputs: none
|
||||||
;outputs: A contains ASCII code of key pressed
|
;outputs: A contains ASCII code of key pressed
|
||||||
get_key:
|
get_key:
|
||||||
|
lda #$a0
|
||||||
jmp $fd1b
|
jmp $fd1b
|
||||||
|
|
||||||
|
;inputs: none
|
||||||
|
;outputs: A contains ASCII value of key just pressed (0 if no key pressed)
|
||||||
|
get_key_if_available:
|
||||||
|
bit $c000 ;Key down?
|
||||||
|
bmi get_key
|
||||||
|
lda #0
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;check whether the escape key is being pressed
|
;check whether the escape key is being pressed
|
||||||
;inputs: none
|
;inputs: none
|
||||||
@ -20,3 +48,139 @@ rts
|
|||||||
:
|
:
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
;process inbound ip packets while waiting for a keypress
|
||||||
|
get_key_ip65:
|
||||||
|
jsr ip65_process
|
||||||
|
bit $c000 ;Key down?
|
||||||
|
bpl get_key_ip65
|
||||||
|
jmp get_key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;cribbed from http://codebase64.org/doku.php?id=base:robust_string_input
|
||||||
|
;======================================================================
|
||||||
|
;Input a string and store it in GOTINPUT, terminated with a null byte.
|
||||||
|
;AX is a pointer to the allowed list of characters, null-terminated.
|
||||||
|
;set AX to $0000 for no filter on input
|
||||||
|
;max # of chars in y returns num of chars entered in y.
|
||||||
|
;======================================================================
|
||||||
|
|
||||||
|
|
||||||
|
; Main entry
|
||||||
|
get_filtered_input:
|
||||||
|
sty MAXCHARS
|
||||||
|
stax temp_allowed
|
||||||
|
|
||||||
|
;Zero characters received.
|
||||||
|
lda #$00
|
||||||
|
sta INPUT_Y
|
||||||
|
|
||||||
|
;Wait for a character.
|
||||||
|
@input_get:
|
||||||
|
jsr get_key_ip65
|
||||||
|
;convert to standard ASCII by turning off high bit
|
||||||
|
and #$7f
|
||||||
|
sta LASTCHAR
|
||||||
|
cmp #$08 ;Delete
|
||||||
|
beq @delete
|
||||||
|
|
||||||
|
cmp #$0d ;Return
|
||||||
|
beq @input_done
|
||||||
|
|
||||||
|
;End reached?
|
||||||
|
lda INPUT_Y
|
||||||
|
cmp MAXCHARS
|
||||||
|
beq @input_get
|
||||||
|
|
||||||
|
;Check the allowed list of characters.
|
||||||
|
ldax temp_allowed
|
||||||
|
stax allowed_ptr ;since we are reusing this zero page, it may not stil be the same value since last time!
|
||||||
|
ldy #$00
|
||||||
|
lda allowed_ptr+1 ;was the input filter point nul?
|
||||||
|
beq @input_ok
|
||||||
|
@check_allowed:
|
||||||
|
lda (allowed_ptr),y ;Overwritten
|
||||||
|
beq @input_get ;Reached end of list (0)
|
||||||
|
|
||||||
|
cmp LASTCHAR
|
||||||
|
beq @input_ok ;Match found
|
||||||
|
|
||||||
|
;Not end or match, keep checking
|
||||||
|
iny
|
||||||
|
jmp @check_allowed
|
||||||
|
|
||||||
|
@input_ok:
|
||||||
|
lda LASTCHAR ;Get the char back
|
||||||
|
ldy INPUT_Y
|
||||||
|
sta GOTINPUT,y ;Add it to string
|
||||||
|
|
||||||
|
inc INPUT_Y ;Next character
|
||||||
|
jsr print_a
|
||||||
|
;Not yet.
|
||||||
|
jmp @input_get
|
||||||
|
|
||||||
|
@input_done:
|
||||||
|
ldy INPUT_Y
|
||||||
|
beq @no_input
|
||||||
|
lda #$00
|
||||||
|
sta GOTINPUT,y ;Zero-terminate
|
||||||
|
clc
|
||||||
|
ldax #GOTINPUT
|
||||||
|
rts
|
||||||
|
@no_input:
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
; Delete last character.
|
||||||
|
@delete:
|
||||||
|
;First, check if we're at the beginning. If so, just exit.
|
||||||
|
lda INPUT_Y
|
||||||
|
bne @delete_ok
|
||||||
|
jmp @input_get
|
||||||
|
|
||||||
|
;At least one character entered.
|
||||||
|
@delete_ok:
|
||||||
|
;Move pointer back.
|
||||||
|
dec INPUT_Y
|
||||||
|
|
||||||
|
;Store a zero over top of last character, just in case no other characters are entered.
|
||||||
|
ldy INPUT_Y
|
||||||
|
lda #$00
|
||||||
|
sta GOTINPUT,y
|
||||||
|
|
||||||
|
;Print the backspace char
|
||||||
|
lda #$88
|
||||||
|
jsr print_a
|
||||||
|
|
||||||
|
;Print the a space
|
||||||
|
lda #$a0
|
||||||
|
jsr print_a
|
||||||
|
|
||||||
|
;Print the backspace char
|
||||||
|
lda #$88
|
||||||
|
jsr print_a
|
||||||
|
|
||||||
|
;Wait for next char
|
||||||
|
jmp @input_get
|
||||||
|
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
;Some example filters
|
||||||
|
;=================================================
|
||||||
|
|
||||||
|
filter_text:
|
||||||
|
.byte ",+!#$%&'()* "
|
||||||
|
filter_dns:
|
||||||
|
.byte "-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
filter_ip:
|
||||||
|
.byte "."
|
||||||
|
filter_number:
|
||||||
|
.byte "1234567890",0
|
||||||
|
|
||||||
|
;=================================================
|
||||||
|
.bss
|
||||||
|
temp_allowed: .res 2
|
||||||
|
MAXCHARS: .res 1
|
||||||
|
LASTCHAR: .res 1
|
||||||
|
INPUT_Y: .res 1
|
||||||
|
GOTINPUT: .res 40
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
;outputs: none
|
;outputs: none
|
||||||
print_a:
|
print_a:
|
||||||
ora #$80 ;turn ASCII into Apple 2 screen codes
|
ora #$80 ;turn ASCII into Apple 2 screen codes
|
||||||
jmp $fdf0
|
jmp $fded
|
||||||
|
|
||||||
|
|
||||||
;use Apple 2 monitor ROM function to move to new line
|
;use Apple 2 monitor ROM function to move to new line
|
||||||
|
55
client/drivers/c64charconv.s
Normal file
55
client/drivers/c64charconv.s
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
;ASCII/PETSCII conversion tables
|
||||||
|
;cribbed from http://www.ffd2.com/fridge/misc/petcom.c
|
||||||
|
|
||||||
|
|
||||||
|
.export ascii_to_native
|
||||||
|
.export native_to_ascii
|
||||||
|
|
||||||
|
;given a PETSCII char in A, return equivalent ASCII
|
||||||
|
native_to_ascii:
|
||||||
|
tax
|
||||||
|
lda petscii_to_ascii_table,x
|
||||||
|
rts
|
||||||
|
|
||||||
|
;given an ASCII char in A, return equivalent PETSCII
|
||||||
|
ascii_to_native:
|
||||||
|
tax
|
||||||
|
lda ascii_to_petscii_table,x
|
||||||
|
rts
|
||||||
|
|
||||||
|
.rodata
|
||||||
|
ascii_to_petscii_table:
|
||||||
|
.byte $00,$01,$02,$03,$04,$05,$06,$07,$14,$09,$0d,$11,$93,$0a,$0e,$0f
|
||||||
|
.byte $10,$0b,$12,$13,$08,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
|
||||||
|
.byte $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
|
||||||
|
.byte $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
|
||||||
|
.byte $40,$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$ca,$cb,$cc,$cd,$ce,$cf
|
||||||
|
.byte $d0,$d1,$d2,$d3,$d4,$d5,$d6,$d7,$d8,$d9,$da,$5b,$5c,$5d,$5e,$5f
|
||||||
|
.byte $c0,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
|
||||||
|
.byte $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5a,$db,$dc,$dd,$de,$df
|
||||||
|
.byte $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8a,$8b,$8c,$8d,$8e,$8f
|
||||||
|
.byte $90,$91,$92,$0c,$94,$95,$96,$97,$98,$99,$9a,$9b,$9c,$9d,$9e,$9f
|
||||||
|
.byte $a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$aa,$ab,$ac,$ad,$ae,$af
|
||||||
|
.byte $b0,$b1,$b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9,$ba,$bb,$bc,$bd,$be,$bf
|
||||||
|
.byte $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6a,$6b,$6c,$6d,$6e,$6f
|
||||||
|
.byte $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7a,$7b,$7c,$7d,$7e,$7f
|
||||||
|
.byte $e0,$e1,$e2,$e3,$e4,$e5,$e6,$e7,$e8,$e9,$ea,$eb,$ec,$ed,$ee,$ef
|
||||||
|
.byte $f0,$f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$fa,$fb,$fc,$fd,$fe,$ff
|
||||||
|
|
||||||
|
petscii_to_ascii_table:
|
||||||
|
.byte $00,$01,$02,$03,$04,$05,$06,$07,$14,$09,$0d,$11,$93,$0a,$0e,$0f
|
||||||
|
.byte $10,$0b,$12,$13,$08,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f
|
||||||
|
.byte $20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f
|
||||||
|
.byte $30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$3a,$3b,$3c,$3d,$3e,$3f
|
||||||
|
.byte $40,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6a,$6b,$6c,$6d,$6e,$6f
|
||||||
|
.byte $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7a,$5b,$5c,$5d,$5e,$5f
|
||||||
|
.byte $c0,$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$ca,$cb,$cc,$cd,$ce,$cf
|
||||||
|
.byte $d0,$d1,$d2,$d3,$d4,$d5,$d6,$d7,$d8,$d9,$da,$db,$dc,$dd,$de,$df
|
||||||
|
.byte $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,$8a,$8b,$8c,$8d,$8e,$8f
|
||||||
|
.byte $90,$91,$92,$0c,$94,$95,$96,$97,$98,$99,$9a,$9b,$9c,$9d,$9e,$9f
|
||||||
|
.byte $20,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$aa,$ab,$ac,$ad,$ae,$af
|
||||||
|
.byte $b0,$b1,$b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9,$ba,$bb,$bc,$bd,$be,$bf
|
||||||
|
.byte $60,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f
|
||||||
|
.byte $50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5a,$7b,$7c,$7d,$7e,$7f
|
||||||
|
.byte $a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$aa,$ab,$ac,$ad,$ae,$af
|
||||||
|
.byte $b0,$b1,$b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9,$ba,$bb,$bc,$bd,$be,$bf
|
@ -71,7 +71,7 @@ check_for_abort_key:
|
|||||||
; Main entry
|
; Main entry
|
||||||
get_filtered_input:
|
get_filtered_input:
|
||||||
sty MAXCHARS
|
sty MAXCHARS
|
||||||
stax allowed_ptr
|
stax temp_allowed
|
||||||
|
|
||||||
;Zero characters received.
|
;Zero characters received.
|
||||||
lda #$00
|
lda #$00
|
||||||
@ -94,6 +94,9 @@ get_filtered_input:
|
|||||||
beq @input_get
|
beq @input_get
|
||||||
|
|
||||||
;Check the allowed list of characters.
|
;Check the allowed list of characters.
|
||||||
|
ldax temp_allowed
|
||||||
|
stax allowed_ptr ;since we are reusing this zero page, it may not stil be the same value since last time!
|
||||||
|
|
||||||
ldy #$00
|
ldy #$00
|
||||||
lda allowed_ptr+1 ;was the input filter point nul?
|
lda allowed_ptr+1 ;was the input filter point nul?
|
||||||
beq @input_ok
|
beq @input_ok
|
||||||
@ -170,6 +173,7 @@ filter_number:
|
|||||||
|
|
||||||
;=================================================
|
;=================================================
|
||||||
.bss
|
.bss
|
||||||
|
temp_allowed: .res 2
|
||||||
MAXCHARS: .res 1
|
MAXCHARS: .res 1
|
||||||
LASTCHAR: .res 1
|
LASTCHAR: .res 1
|
||||||
INPUT_Y: .res 1
|
INPUT_Y: .res 1
|
||||||
|
@ -5,3 +5,4 @@ KEYCODE_LEFT=$88
|
|||||||
KEYCODE_RIGHT=$95
|
KEYCODE_RIGHT=$95
|
||||||
KEYCODE_ABORT=$9B
|
KEYCODE_ABORT=$9B
|
||||||
.define KEYNAME_ABORT "ESC"
|
.define KEYNAME_ABORT "ESC"
|
||||||
|
.export KEYCODE_ABORT
|
@ -13,3 +13,4 @@ KEYCODE_F7=$88
|
|||||||
KEYCODE_F8=$8c
|
KEYCODE_F8=$8c
|
||||||
KEYCODE_ABORT=$03 ;RUN/STOP
|
KEYCODE_ABORT=$03 ;RUN/STOP
|
||||||
.define KEYNAME_ABORT "RUN/STOP"
|
.define KEYNAME_ABORT "RUN/STOP"
|
||||||
|
.export KEYCODE_ABORT
|
@ -19,7 +19,9 @@
|
|||||||
.export gateway_msg
|
.export gateway_msg
|
||||||
.export dns_server_msg
|
.export dns_server_msg
|
||||||
.export tftp_server_msg
|
.export tftp_server_msg
|
||||||
|
.import ip65_error
|
||||||
|
.export print_errorcode
|
||||||
|
|
||||||
.import arp_cache
|
.import arp_cache
|
||||||
.importzp ac_size
|
.importzp ac_size
|
||||||
|
|
||||||
@ -321,6 +323,13 @@ print_hex:
|
|||||||
pla
|
pla
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
print_errorcode:
|
||||||
|
ldax #error_code
|
||||||
|
jsr print
|
||||||
|
lda ip65_error
|
||||||
|
jsr print_hex
|
||||||
|
jmp print_cr
|
||||||
|
|
||||||
.rodata
|
.rodata
|
||||||
hexdigits:
|
hexdigits:
|
||||||
.byte "0123456789ABCDEF"
|
.byte "0123456789ABCDEF"
|
||||||
@ -366,3 +375,7 @@ ok_msg:
|
|||||||
|
|
||||||
dns_lookup_failed_msg:
|
dns_lookup_failed_msg:
|
||||||
.byte "DNS LOOKUP FAILED", 0
|
.byte "DNS LOOKUP FAILED", 0
|
||||||
|
|
||||||
|
error_code:
|
||||||
|
.asciiz "ERROR CODE: "
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
.importzp copy_src
|
.importzp copy_src
|
||||||
.importzp copy_dest
|
.importzp copy_dest
|
||||||
.import copymem
|
.import copymem
|
||||||
|
.import ascii_to_native
|
||||||
.import tcp_connect
|
.import tcp_connect
|
||||||
.import tcp_send
|
.import tcp_send
|
||||||
.import tcp_send_data_len
|
.import tcp_send_data_len
|
||||||
@ -126,14 +126,14 @@ display_resource_in_buffer:
|
|||||||
;if this is a text file, just convert ascii->petscii and print to screen
|
;if this is a text file, just convert ascii->petscii and print to screen
|
||||||
@show_one_char:
|
@show_one_char:
|
||||||
jsr get_next_byte
|
jsr get_next_byte
|
||||||
tax ;this both sets up X as index into ascii_to_petscii_table, and sets Z flag
|
tax ;this sets Z flag
|
||||||
bne :+
|
bne :+
|
||||||
lda #1
|
lda #1
|
||||||
sta this_is_last_page
|
sta this_is_last_page
|
||||||
jmp @get_keypress
|
jmp @get_keypress
|
||||||
:
|
:
|
||||||
|
|
||||||
lda ascii_to_petscii_table,x
|
jsr ascii_to_native
|
||||||
jsr print_a
|
jsr print_a
|
||||||
lda $d6
|
lda $d6
|
||||||
cmp #DISPLAY_LINES
|
cmp #DISPLAY_LINES
|
||||||
@ -210,8 +210,7 @@ display_resource_in_buffer:
|
|||||||
jsr get_next_byte
|
jsr get_next_byte
|
||||||
cmp #$09
|
cmp #$09
|
||||||
beq @skip_to_end_of_line
|
beq @skip_to_end_of_line
|
||||||
tax
|
jsr ascii_to_native
|
||||||
lda ascii_to_petscii_table,x
|
|
||||||
jsr print_a
|
jsr print_a
|
||||||
jmp @next_byte
|
jmp @next_byte
|
||||||
|
|
||||||
@ -525,11 +524,12 @@ load_resource_into_buffer:
|
|||||||
stx dl_loop_counter
|
stx dl_loop_counter
|
||||||
stx dl_loop_counter+1
|
stx dl_loop_counter+1
|
||||||
lda resource_selector_length
|
lda resource_selector_length
|
||||||
|
beq @empty_selector
|
||||||
stax tcp_send_data_len
|
stax tcp_send_data_len
|
||||||
ldax #resource_selector
|
ldax #resource_selector
|
||||||
jsr tcp_send
|
jsr tcp_send
|
||||||
|
|
||||||
|
@empty_selector:
|
||||||
;send the tab and query string (if supplied)
|
;send the tab and query string (if supplied)
|
||||||
lda displayed_resource_type
|
lda displayed_resource_type
|
||||||
cmp #'7' ;is it a 'search' resource?
|
cmp #'7' ;is it a 'search' resource?
|
||||||
|
@ -5,11 +5,16 @@
|
|||||||
; .include "../inc/common.i"
|
; .include "../inc/common.i"
|
||||||
; .include "../inc/commonprint.i"
|
; .include "../inc/commonprint.i"
|
||||||
; .include "../inc/net.i"
|
; .include "../inc/net.i"
|
||||||
; .include "../inc/char_conv.i"
|
|
||||||
; .include "../inc/c64keycodes.i"
|
|
||||||
; 3) define a routine called 'exit_telnet'
|
; 3) define a routine called 'exit_telnet'
|
||||||
; 4) define a buffer called 'scratch_buffer'
|
|
||||||
; 5) define a zero page var called buffer_ptr
|
.import telnet_connect
|
||||||
|
.import telnet_local_echo
|
||||||
|
.import telnet_line_mode
|
||||||
|
.import telnet_use_native_charset
|
||||||
|
.import telnet_port
|
||||||
|
.import telnet_ip
|
||||||
|
|
||||||
|
|
||||||
.code
|
.code
|
||||||
telnet_main_entry:
|
telnet_main_entry:
|
||||||
;prompt for a hostname, then resolve to an IP address
|
;prompt for a hostname, then resolve to an IP address
|
||||||
@ -75,26 +80,24 @@ telnet_main_entry:
|
|||||||
jmp @char_mode_input
|
jmp @char_mode_input
|
||||||
@ascii_mode:
|
@ascii_mode:
|
||||||
lda #0
|
lda #0
|
||||||
sta character_set
|
sta telnet_use_native_charset
|
||||||
sta line_mode
|
sta telnet_line_mode
|
||||||
lda #1
|
lda #1
|
||||||
sta local_echo
|
sta telnet_local_echo
|
||||||
lda #telnet_state_normal
|
|
||||||
sta telnet_state
|
|
||||||
jmp @after_mode_set
|
jmp @after_mode_set
|
||||||
@petscii_mode:
|
@petscii_mode:
|
||||||
lda #1
|
lda #1
|
||||||
sta character_set
|
sta telnet_use_native_charset
|
||||||
lda #0
|
lda #0
|
||||||
sta local_echo
|
sta telnet_local_echo
|
||||||
sta line_mode
|
sta telnet_line_mode
|
||||||
jmp @after_mode_set
|
jmp @after_mode_set
|
||||||
@line_mode:
|
@line_mode:
|
||||||
lda #0
|
lda #0
|
||||||
sta character_set
|
sta telnet_use_native_charset
|
||||||
lda #1
|
lda #1
|
||||||
sta local_echo
|
sta telnet_local_echo
|
||||||
sta line_mode
|
sta telnet_line_mode
|
||||||
|
|
||||||
@after_mode_set:
|
@after_mode_set:
|
||||||
|
|
||||||
@ -103,12 +106,12 @@ telnet_main_entry:
|
|||||||
|
|
||||||
ldax #connecting_in
|
ldax #connecting_in
|
||||||
jsr print
|
jsr print
|
||||||
lda character_set
|
lda telnet_use_native_charset
|
||||||
beq @a_mode
|
beq @a_mode
|
||||||
ldax #petscii
|
ldax #petscii
|
||||||
jmp @c_mode
|
jmp @c_mode
|
||||||
@a_mode:
|
@a_mode:
|
||||||
lda line_mode
|
lda telnet_line_mode
|
||||||
bne @l_mode
|
bne @l_mode
|
||||||
ldax #ascii
|
ldax #ascii
|
||||||
jmp @c_mode
|
jmp @c_mode
|
||||||
@ -118,334 +121,16 @@ telnet_main_entry:
|
|||||||
jsr print
|
jsr print
|
||||||
ldax #mode
|
ldax #mode
|
||||||
jsr print
|
jsr print
|
||||||
|
jsr telnet_connect
|
||||||
telnet_connect:
|
jmp telnet_main_entry
|
||||||
ldax #telnet_callback
|
|
||||||
stax nb65_param_buffer+NB65_TCP_CALLBACK
|
|
||||||
ldx #3
|
|
||||||
@copy_dest_ip:
|
|
||||||
lda telnet_ip,x
|
|
||||||
sta nb65_param_buffer+NB65_TCP_REMOTE_IP,x
|
|
||||||
dex
|
|
||||||
bpl @copy_dest_ip
|
|
||||||
ldax telnet_port
|
|
||||||
stax nb65_param_buffer+NB65_TCP_PORT
|
|
||||||
ldax #nb65_param_buffer
|
|
||||||
nb65call #NB65_TCP_CONNECT
|
|
||||||
|
|
||||||
bcc @connect_ok
|
|
||||||
jsr print_cr
|
|
||||||
print_failed
|
|
||||||
jsr print_errorcode
|
|
||||||
jmp telnet_main_entry
|
|
||||||
@connect_ok:
|
|
||||||
print_ok
|
|
||||||
jsr print_cr
|
|
||||||
lda #0
|
|
||||||
sta connection_closed
|
|
||||||
@main_polling_loop:
|
|
||||||
jsr NB65_PERIODIC_PROCESSING_VECTOR
|
|
||||||
lda connection_closed
|
|
||||||
beq @not_disconnected
|
|
||||||
ldax #disconnected
|
|
||||||
jsr print
|
|
||||||
jmp telnet_main_entry
|
|
||||||
@not_disconnected:
|
|
||||||
lda line_mode
|
|
||||||
beq @not_line_mode
|
|
||||||
|
|
||||||
nb65call #NB65_INPUT_STRING
|
|
||||||
stax buffer_ptr
|
|
||||||
ldy #0
|
|
||||||
@copy_one_char:
|
|
||||||
lda (buffer_ptr),y
|
|
||||||
tax
|
|
||||||
lda petscii_to_ascii_table,x
|
|
||||||
beq @end_of_input_string
|
|
||||||
sta scratch_buffer,y
|
|
||||||
iny
|
|
||||||
bne @copy_one_char
|
|
||||||
@end_of_input_string:
|
|
||||||
lda #$0d
|
|
||||||
sta scratch_buffer,y
|
|
||||||
iny
|
|
||||||
lda #$0a
|
|
||||||
sta scratch_buffer,y
|
|
||||||
iny
|
|
||||||
sty nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
lda #0
|
|
||||||
sta nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH+1
|
|
||||||
jsr print_cr
|
|
||||||
jmp @no_more_input
|
|
||||||
|
|
||||||
@not_line_mode:
|
|
||||||
|
|
||||||
;is there anything in the input buffer?
|
|
||||||
lda $c6 ;NDX - chars in keyboard buffer
|
|
||||||
beq @main_polling_loop
|
|
||||||
lda #0
|
|
||||||
sta nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
sta nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH+1
|
|
||||||
@get_next_char:
|
|
||||||
jsr $ffe4 ;getkey - 0 means no input
|
|
||||||
; pha
|
|
||||||
; jsr print_hex
|
|
||||||
; pla
|
|
||||||
tax
|
|
||||||
beq @no_more_input
|
|
||||||
cmp #$03 ;RUN/STOP
|
|
||||||
bne @not_runstop
|
|
||||||
lda #0
|
|
||||||
sta $cb ;overwrite "current key pressed" else it's seen by the tcp stack and the close aborts
|
|
||||||
|
|
||||||
ldax #closing_connection
|
|
||||||
jsr print
|
|
||||||
nb65call #NB65_TCP_CLOSE_CONNECTION
|
|
||||||
bcs @error_on_disconnect
|
|
||||||
ldax #disconnected
|
|
||||||
jsr print
|
|
||||||
jmp telnet_main_entry
|
|
||||||
@error_on_disconnect:
|
|
||||||
jsr print_errorcode
|
|
||||||
jsr print_cr
|
|
||||||
jmp telnet_main_entry
|
|
||||||
@not_runstop:
|
|
||||||
lda character_set
|
|
||||||
bne @no_conversion_required
|
|
||||||
txa
|
|
||||||
cmp #$0d
|
|
||||||
bne @not_cr
|
|
||||||
|
|
||||||
;if we get a CR in ascii mode, send CR/LF
|
|
||||||
ldy nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
sta scratch_buffer,y
|
|
||||||
inc nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
ldx #$0a
|
|
||||||
jmp @no_conversion_required
|
|
||||||
@not_cr:
|
|
||||||
lda petscii_to_ascii_table,x
|
|
||||||
tax
|
|
||||||
@no_conversion_required:
|
|
||||||
txa
|
|
||||||
ldy nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
sta scratch_buffer,y
|
|
||||||
inc nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
jmp @get_next_char
|
|
||||||
@no_more_input:
|
|
||||||
ldax #scratch_buffer
|
|
||||||
stax nb65_param_buffer+NB65_TCP_PAYLOAD_POINTER
|
|
||||||
ldax #nb65_param_buffer
|
|
||||||
nb65call #NB65_SEND_TCP_PACKET
|
|
||||||
bcs @error_on_send
|
|
||||||
jmp @main_polling_loop
|
|
||||||
|
|
||||||
@error_on_send:
|
|
||||||
ldax #transmission_error
|
|
||||||
jsr print
|
|
||||||
jsr print_errorcode
|
|
||||||
jmp telnet_main_entry
|
|
||||||
|
|
||||||
;tcp callback - will be executed whenever data arrives on the TCP connection
|
|
||||||
telnet_callback:
|
|
||||||
ldax #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 buffer_ptr
|
|
||||||
lda nb65_param_buffer+NB65_PAYLOAD_LENGTH
|
|
||||||
sta buffer_length
|
|
||||||
lda nb65_param_buffer+NB65_PAYLOAD_LENGTH+1
|
|
||||||
sta buffer_length+1
|
|
||||||
|
|
||||||
;since we don't check the buffer length till the end of the loop, set 'buffer length' to be 1 less than the actual number of bytes
|
|
||||||
dec buffer_length
|
|
||||||
bpl :+
|
|
||||||
dec buffer_length+1
|
|
||||||
:
|
|
||||||
ldy #0
|
|
||||||
sty iac_response_buffer_length
|
|
||||||
@next_byte:
|
|
||||||
lda (buffer_ptr),y
|
|
||||||
tax
|
|
||||||
lda character_set
|
|
||||||
beq :+
|
|
||||||
jmp @no_conversion_req
|
|
||||||
:
|
|
||||||
|
|
||||||
lda line_mode
|
|
||||||
beq :+
|
|
||||||
jmp@convert_to_petscii
|
|
||||||
:
|
|
||||||
;if we get here, we are in ASCII 'char at a time' mode, so look for (and process) Telnet style IAC bytes
|
|
||||||
lda telnet_state
|
|
||||||
cmp #telnet_state_got_command
|
|
||||||
beq @waiting_for_option
|
|
||||||
cmp #telnet_state_got_iac
|
|
||||||
beq @waiting_for_command
|
|
||||||
; we must be in 'normal' mode
|
|
||||||
txa
|
|
||||||
cmp #255
|
|
||||||
beq :+
|
|
||||||
jmp @not_iac
|
|
||||||
:
|
|
||||||
lda #telnet_state_got_iac
|
|
||||||
sta telnet_state
|
|
||||||
jmp @byte_processed
|
|
||||||
@waiting_for_command:
|
|
||||||
txa
|
|
||||||
sta telnet_command
|
|
||||||
cmp #$fb ;WILL
|
|
||||||
beq @option
|
|
||||||
cmp #$fc ;WONT
|
|
||||||
beq @option
|
|
||||||
cmp #$fd ; DO
|
|
||||||
beq @option
|
|
||||||
cmp #$fe ;DONT
|
|
||||||
beq @option
|
|
||||||
;we got a command we don't understand - just ignore it
|
|
||||||
lda #telnet_state_normal
|
|
||||||
sta telnet_state
|
|
||||||
jmp @byte_processed
|
|
||||||
@option:
|
|
||||||
lda #telnet_state_got_command
|
|
||||||
sta telnet_state
|
|
||||||
jmp @byte_processed
|
|
||||||
|
|
||||||
@waiting_for_option:
|
|
||||||
;we have now got IAC, <command>, <option>
|
|
||||||
txa
|
|
||||||
sta telnet_option
|
|
||||||
lda telnet_command
|
|
||||||
|
|
||||||
cmp #$fb
|
|
||||||
beq @iac_will
|
|
||||||
|
|
||||||
cmp #$fc
|
|
||||||
beq @iac_wont
|
|
||||||
|
|
||||||
;if we get here, then it's a "do" or "don't", both of which we should send a "wont" back for
|
|
||||||
;(since there are no "do" options we actually honour)
|
|
||||||
lda #$fc ;wont
|
|
||||||
@add_iac_response:
|
|
||||||
ldx iac_response_buffer_length
|
|
||||||
sta iac_response_buffer+1,x
|
|
||||||
lda #255
|
|
||||||
sta iac_response_buffer,x
|
|
||||||
lda telnet_option
|
|
||||||
sta iac_response_buffer+2,x
|
|
||||||
|
|
||||||
inc iac_response_buffer_length
|
|
||||||
inc iac_response_buffer_length
|
|
||||||
inc iac_response_buffer_length
|
|
||||||
|
|
||||||
lda #telnet_state_normal
|
|
||||||
sta telnet_state
|
|
||||||
jmp @byte_processed
|
|
||||||
@iac_will:
|
|
||||||
lda telnet_option
|
|
||||||
cmp #$01 ;ECHO
|
|
||||||
beq @will_echo
|
|
||||||
cmp #$03 ;DO SUPPRESS GA
|
|
||||||
beq @will_suppress_ga
|
|
||||||
|
|
||||||
@iac_wont:
|
|
||||||
lda #$fe ;dont
|
|
||||||
jmp @add_iac_response
|
|
||||||
|
|
||||||
@will_echo:
|
|
||||||
lda #0
|
|
||||||
sta local_echo
|
|
||||||
lda #$fd ;DO
|
|
||||||
jmp @add_iac_response
|
|
||||||
|
|
||||||
@will_suppress_ga:
|
|
||||||
lda #0
|
|
||||||
sta line_mode
|
|
||||||
lda #$fd ;DO
|
|
||||||
jmp @add_iac_response
|
|
||||||
|
|
||||||
@not_iac:
|
|
||||||
@convert_to_petscii:
|
|
||||||
|
|
||||||
lda ascii_to_petscii_table,x
|
|
||||||
tax
|
|
||||||
@no_conversion_req:
|
|
||||||
tya
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
jsr print_a
|
|
||||||
pla
|
|
||||||
tay
|
|
||||||
@byte_processed:
|
|
||||||
iny
|
|
||||||
bne :+
|
|
||||||
inc buffer_ptr+1
|
|
||||||
:
|
|
||||||
dec buffer_length
|
|
||||||
lda #$ff
|
|
||||||
cmp buffer_length
|
|
||||||
beq :+
|
|
||||||
jmp @next_byte
|
|
||||||
:
|
|
||||||
|
|
||||||
dec buffer_length+1
|
|
||||||
bmi @finished
|
|
||||||
jmp @next_byte
|
|
||||||
@finished:
|
|
||||||
|
|
||||||
lda iac_response_buffer_length
|
|
||||||
beq @no_iac_response
|
|
||||||
ldx #0
|
|
||||||
stax nb65_param_buffer+NB65_TCP_PAYLOAD_LENGTH
|
|
||||||
ldax #iac_response_buffer
|
|
||||||
stax nb65_param_buffer+NB65_TCP_PAYLOAD_POINTER
|
|
||||||
ldax #nb65_param_buffer
|
|
||||||
nb65call #NB65_SEND_TCP_PACKET
|
|
||||||
@no_iac_response:
|
|
||||||
rts
|
|
||||||
|
|
||||||
;constants
|
;constants
|
||||||
closing_connection: .byte "CLOSING CONNECTION",13,0
|
|
||||||
connecting_in: .byte "CONNECTING IN ",0
|
connecting_in: .byte "CONNECTING IN ",0
|
||||||
|
|
||||||
ascii: .byte "ASCII",0
|
ascii: .byte "ASCII",0
|
||||||
petscii: .byte "PETSCII",0
|
petscii: .byte "PETSCII",0
|
||||||
line: .byte "LINE",0
|
line: .byte "LINE",0
|
||||||
mode: .byte " MODE",13,0
|
mode: .byte " MODE",13,0
|
||||||
disconnected: .byte 13,"CONNECTION CLOSED",13,0
|
|
||||||
remote_host: .byte "HOSTNAME (LEAVE BLANK TO QUIT)",13,": ",0
|
remote_host: .byte "HOSTNAME (LEAVE BLANK TO QUIT)",13,": ",0
|
||||||
remote_port: .byte "PORT # (LEAVE BLANK FOR DEFAULT)",13,": ",0
|
remote_port: .byte "PORT # (LEAVE BLANK FOR DEFAULT)",13,": ",0
|
||||||
char_mode_prompt: .byte "MODE - A=ASCII, P=PETSCII, L=LINE",13,0
|
char_mode_prompt: .byte "MODE - A=ASCII, P=PETSCII, L=LINE",13,0
|
||||||
transmission_error: .byte "ERROR WHILE SENDING ",0
|
|
||||||
|
|
||||||
;variables
|
|
||||||
.segment "APP_SCRATCH"
|
|
||||||
telnet_ip: .res 4
|
|
||||||
telnet_port: .res 2
|
|
||||||
|
|
||||||
connection_closed: .res 1
|
|
||||||
character_set: .res 1
|
|
||||||
buffer_offset: .res 1
|
|
||||||
local_echo: .res 1
|
|
||||||
line_mode: .res 1
|
|
||||||
telnet_state: .res 1
|
|
||||||
telnet_command: .res 1
|
|
||||||
telnet_option: .res 1
|
|
||||||
|
|
||||||
telnet_state_normal = 0
|
|
||||||
telnet_state_got_iac = 1
|
|
||||||
telnet_state_got_command = 2
|
|
||||||
|
|
||||||
;nb65_param_buffer DS.B $20
|
|
||||||
buffer_length: .res 2
|
|
||||||
|
|
||||||
iac_response_buffer: .res 256
|
|
||||||
iac_response_buffer_length: .res 1
|
|
@ -26,8 +26,8 @@ ETHOBJS= \
|
|||||||
dottedquad.o \
|
dottedquad.o \
|
||||||
output_buffer.o\
|
output_buffer.o\
|
||||||
tftp.o \
|
tftp.o \
|
||||||
arithmetic.o\
|
telnet.o \
|
||||||
|
arithmetic.o\
|
||||||
|
|
||||||
all: ip65.lib ip65_tcp.lib
|
all: ip65.lib ip65_tcp.lib
|
||||||
|
|
||||||
|
@ -452,17 +452,13 @@ send_dhcprequest:
|
|||||||
|
|
||||||
: lda dhcp_server,x
|
: lda dhcp_server,x
|
||||||
sta output_buffer+dhcp_options+11,x
|
sta output_buffer+dhcp_options+11,x
|
||||||
|
lda #$ff ;bugfix by ShadowM - DHCP request should be broadcast
|
||||||
|
sta udp_send_dest,x
|
||||||
dex
|
dex
|
||||||
bpl :-
|
bpl :-
|
||||||
|
|
||||||
;bugfix by ShadowM - DHCP request should be broadcast
|
;A still = option FF = end of options
|
||||||
lda #$ff
|
|
||||||
ldx #3
|
|
||||||
: sta udp_send_dest,x
|
|
||||||
dex
|
|
||||||
bpl :-
|
|
||||||
|
|
||||||
lda #$FF ;option FF = end of options
|
|
||||||
sta output_buffer+dhcp_options+17
|
sta output_buffer+dhcp_options+17
|
||||||
|
|
||||||
ldax #dhcp_options+18
|
ldax #dhcp_options+18
|
||||||
|
356
client/ip65/telnet.s
Normal file
356
client/ip65/telnet.s
Normal file
@ -0,0 +1,356 @@
|
|||||||
|
;telnet implementation
|
||||||
|
;
|
||||||
|
|
||||||
|
.include "../inc/common.i"
|
||||||
|
|
||||||
|
.import tcp_connect
|
||||||
|
.import tcp_callback
|
||||||
|
.import tcp_connect_ip
|
||||||
|
.import tcp_listen
|
||||||
|
.importzp KEYCODE_ABORT
|
||||||
|
.import tcp_inbound_data_ptr
|
||||||
|
.import tcp_inbound_data_length
|
||||||
|
.import tcp_send
|
||||||
|
.import tcp_send_data_len
|
||||||
|
.import tcp_close
|
||||||
|
.import print_a
|
||||||
|
.import print_cr
|
||||||
|
|
||||||
|
|
||||||
|
.import ip65_process
|
||||||
|
.import get_key_ip65
|
||||||
|
.import get_filtered_input
|
||||||
|
.import ok_msg
|
||||||
|
.import failed_msg
|
||||||
|
.import print
|
||||||
|
.import print_errorcode
|
||||||
|
.import native_to_ascii
|
||||||
|
.import ascii_to_native
|
||||||
|
|
||||||
|
.export telnet_connect
|
||||||
|
.export telnet_local_echo
|
||||||
|
.export telnet_line_mode
|
||||||
|
.export telnet_use_native_charset
|
||||||
|
.export telnet_port
|
||||||
|
.export telnet_ip
|
||||||
|
|
||||||
|
.segment "IP65ZP" : zeropage
|
||||||
|
|
||||||
|
; pointer for moving through buffers
|
||||||
|
buffer_ptr: .res 2 ; source pointer
|
||||||
|
|
||||||
|
.code
|
||||||
|
telnet_connect:
|
||||||
|
ldax #telnet_callback
|
||||||
|
stax tcp_callback
|
||||||
|
ldx #3
|
||||||
|
@copy_dest_ip:
|
||||||
|
lda telnet_ip,x
|
||||||
|
sta tcp_connect_ip,x
|
||||||
|
dex
|
||||||
|
bpl @copy_dest_ip
|
||||||
|
|
||||||
|
ldax telnet_port
|
||||||
|
jsr tcp_connect
|
||||||
|
|
||||||
|
bcc @connect_ok
|
||||||
|
jsr print_cr
|
||||||
|
ldax #failed_msg
|
||||||
|
jsr print
|
||||||
|
jsr print_errorcode
|
||||||
|
rts
|
||||||
|
@connect_ok:
|
||||||
|
ldax #ok_msg
|
||||||
|
jsr print
|
||||||
|
jsr print_cr
|
||||||
|
lda #0
|
||||||
|
sta connection_closed
|
||||||
|
@main_polling_loop:
|
||||||
|
jsr ip65_process
|
||||||
|
lda connection_closed
|
||||||
|
beq @not_disconnected
|
||||||
|
ldax #disconnected
|
||||||
|
jsr print
|
||||||
|
rts
|
||||||
|
@not_disconnected:
|
||||||
|
lda telnet_line_mode
|
||||||
|
beq @not_line_mode
|
||||||
|
|
||||||
|
ldy #40 ;max chars
|
||||||
|
ldax #$0000
|
||||||
|
jsr get_filtered_input
|
||||||
|
stax buffer_ptr
|
||||||
|
ldy #0
|
||||||
|
@copy_one_char:
|
||||||
|
lda (buffer_ptr),y
|
||||||
|
jsr native_to_ascii
|
||||||
|
beq @end_of_input_string
|
||||||
|
sta scratch_buffer,y
|
||||||
|
iny
|
||||||
|
bne @copy_one_char
|
||||||
|
@end_of_input_string:
|
||||||
|
lda #$0d
|
||||||
|
sta scratch_buffer,y
|
||||||
|
iny
|
||||||
|
lda #$0a
|
||||||
|
sta scratch_buffer,y
|
||||||
|
iny
|
||||||
|
sty tcp_send_data_len
|
||||||
|
lda #0
|
||||||
|
sta tcp_send_data_len+1
|
||||||
|
jsr print_cr
|
||||||
|
jmp @send_char
|
||||||
|
|
||||||
|
@not_line_mode:
|
||||||
|
|
||||||
|
jsr get_key_ip65
|
||||||
|
tax
|
||||||
|
; beq @send_char
|
||||||
|
cmp #KEYCODE_ABORT
|
||||||
|
bne @not_abort
|
||||||
|
|
||||||
|
ldax #closing_connection
|
||||||
|
jsr print
|
||||||
|
jsr tcp_close
|
||||||
|
bcs @error_on_disconnect
|
||||||
|
ldax #disconnected
|
||||||
|
jsr print
|
||||||
|
rts
|
||||||
|
@error_on_disconnect:
|
||||||
|
jsr print_errorcode
|
||||||
|
jsr print_cr
|
||||||
|
rts
|
||||||
|
@not_abort:
|
||||||
|
lda #0
|
||||||
|
sta tcp_send_data_len
|
||||||
|
sta tcp_send_data_len+1
|
||||||
|
|
||||||
|
lda telnet_use_native_charset
|
||||||
|
bne @no_conversion_required
|
||||||
|
txa
|
||||||
|
cmp #$0d
|
||||||
|
bne @not_cr
|
||||||
|
|
||||||
|
;if we get a CR in ascii mode, send CR/LF
|
||||||
|
ldy tcp_send_data_len
|
||||||
|
sta scratch_buffer,y
|
||||||
|
inc tcp_send_data_len
|
||||||
|
ldx #$0a
|
||||||
|
jmp @no_conversion_required
|
||||||
|
@not_cr:
|
||||||
|
txa
|
||||||
|
jsr native_to_ascii
|
||||||
|
tax
|
||||||
|
@no_conversion_required:
|
||||||
|
txa
|
||||||
|
ldy tcp_send_data_len
|
||||||
|
sta scratch_buffer,y
|
||||||
|
inc tcp_send_data_len
|
||||||
|
@send_char:
|
||||||
|
ldax #scratch_buffer
|
||||||
|
jsr tcp_send
|
||||||
|
bcs @error_on_send
|
||||||
|
jmp @main_polling_loop
|
||||||
|
|
||||||
|
@error_on_send:
|
||||||
|
ldax #transmission_error
|
||||||
|
jsr print
|
||||||
|
jsr print_errorcode
|
||||||
|
rts
|
||||||
|
|
||||||
|
;tcp callback - will be executed whenever data arrives on the TCP connection
|
||||||
|
telnet_callback:
|
||||||
|
|
||||||
|
lda tcp_inbound_data_length+1
|
||||||
|
cmp #$ff
|
||||||
|
bne @not_eof
|
||||||
|
lda #1
|
||||||
|
sta connection_closed
|
||||||
|
rts
|
||||||
|
@not_eof:
|
||||||
|
|
||||||
|
ldax tcp_inbound_data_ptr
|
||||||
|
stax buffer_ptr
|
||||||
|
lda tcp_inbound_data_length
|
||||||
|
sta buffer_length
|
||||||
|
lda tcp_inbound_data_length+1
|
||||||
|
sta buffer_length+1
|
||||||
|
|
||||||
|
;since we don't check the buffer length till the end of the loop, set 'buffer length' to be 1 less than the actual number of bytes
|
||||||
|
dec buffer_length
|
||||||
|
bpl :+
|
||||||
|
dec buffer_length+1
|
||||||
|
:
|
||||||
|
ldy #0
|
||||||
|
sty iac_response_buffer_length
|
||||||
|
@next_byte:
|
||||||
|
lda (buffer_ptr),y
|
||||||
|
tax
|
||||||
|
lda telnet_use_native_charset
|
||||||
|
beq :+
|
||||||
|
jmp @no_conversion_req
|
||||||
|
:
|
||||||
|
|
||||||
|
lda telnet_line_mode
|
||||||
|
beq :+
|
||||||
|
jmp@convert_to_native
|
||||||
|
:
|
||||||
|
;if we get here, we are in ASCII 'char at a time' mode, so look for (and process) Telnet style IAC bytes
|
||||||
|
lda telnet_state
|
||||||
|
cmp #telnet_state_got_command
|
||||||
|
beq @waiting_for_option
|
||||||
|
cmp #telnet_state_got_iac
|
||||||
|
beq @waiting_for_command
|
||||||
|
; we must be in 'normal' mode
|
||||||
|
txa
|
||||||
|
cmp #255
|
||||||
|
beq :+
|
||||||
|
jmp @not_iac
|
||||||
|
:
|
||||||
|
lda #telnet_state_got_iac
|
||||||
|
sta telnet_state
|
||||||
|
jmp @byte_processed
|
||||||
|
@waiting_for_command:
|
||||||
|
txa
|
||||||
|
sta telnet_command
|
||||||
|
cmp #$fb ;WILL
|
||||||
|
beq @option
|
||||||
|
cmp #$fc ;WONT
|
||||||
|
beq @option
|
||||||
|
cmp #$fd ; DO
|
||||||
|
beq @option
|
||||||
|
cmp #$fe ;DONT
|
||||||
|
beq @option
|
||||||
|
;we got a command we don't understand - just ignore it
|
||||||
|
lda #telnet_state_normal
|
||||||
|
sta telnet_state
|
||||||
|
jmp @byte_processed
|
||||||
|
@option:
|
||||||
|
lda #telnet_state_got_command
|
||||||
|
sta telnet_state
|
||||||
|
jmp @byte_processed
|
||||||
|
|
||||||
|
@waiting_for_option:
|
||||||
|
;we have now got IAC, <command>, <option>
|
||||||
|
txa
|
||||||
|
sta telnet_option
|
||||||
|
lda telnet_command
|
||||||
|
|
||||||
|
cmp #$fb
|
||||||
|
beq @iac_will
|
||||||
|
|
||||||
|
cmp #$fc
|
||||||
|
beq @iac_wont
|
||||||
|
|
||||||
|
;if we get here, then it's a "do" or "don't", both of which we should send a "wont" back for
|
||||||
|
;(since there are no "do" options we actually honour)
|
||||||
|
lda #$fc ;wont
|
||||||
|
@add_iac_response:
|
||||||
|
ldx iac_response_buffer_length
|
||||||
|
sta iac_response_buffer+1,x
|
||||||
|
lda #255
|
||||||
|
sta iac_response_buffer,x
|
||||||
|
lda telnet_option
|
||||||
|
sta iac_response_buffer+2,x
|
||||||
|
|
||||||
|
inc iac_response_buffer_length
|
||||||
|
inc iac_response_buffer_length
|
||||||
|
inc iac_response_buffer_length
|
||||||
|
|
||||||
|
lda #telnet_state_normal
|
||||||
|
sta telnet_state
|
||||||
|
jmp @byte_processed
|
||||||
|
@iac_will:
|
||||||
|
lda telnet_option
|
||||||
|
cmp #$01 ;ECHO
|
||||||
|
beq @will_echo
|
||||||
|
cmp #$03 ;DO SUPPRESS GA
|
||||||
|
beq @will_suppress_ga
|
||||||
|
|
||||||
|
@iac_wont:
|
||||||
|
lda #$fe ;dont
|
||||||
|
jmp @add_iac_response
|
||||||
|
|
||||||
|
@will_echo:
|
||||||
|
lda #0
|
||||||
|
sta telnet_local_echo
|
||||||
|
lda #$fd ;DO
|
||||||
|
jmp @add_iac_response
|
||||||
|
|
||||||
|
@will_suppress_ga:
|
||||||
|
lda #0
|
||||||
|
sta telnet_line_mode
|
||||||
|
lda #$fd ;DO
|
||||||
|
jmp @add_iac_response
|
||||||
|
|
||||||
|
@not_iac:
|
||||||
|
@convert_to_native:
|
||||||
|
txa
|
||||||
|
cmp #$0a ;suppress LF (since it probably follows a CR which will have done the LF as well)
|
||||||
|
beq @byte_processed
|
||||||
|
jsr ascii_to_native
|
||||||
|
tax
|
||||||
|
@no_conversion_req:
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
; pha
|
||||||
|
; jsr print_hex
|
||||||
|
; pla
|
||||||
|
jsr print_a
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
@byte_processed:
|
||||||
|
iny
|
||||||
|
bne :+
|
||||||
|
inc buffer_ptr+1
|
||||||
|
:
|
||||||
|
dec buffer_length
|
||||||
|
lda #$ff
|
||||||
|
cmp buffer_length
|
||||||
|
beq :+
|
||||||
|
jmp @next_byte
|
||||||
|
:
|
||||||
|
|
||||||
|
dec buffer_length+1
|
||||||
|
bmi @finished
|
||||||
|
jmp @next_byte
|
||||||
|
@finished:
|
||||||
|
|
||||||
|
lda iac_response_buffer_length
|
||||||
|
beq @no_iac_response
|
||||||
|
ldx #0
|
||||||
|
stax tcp_send_data_len
|
||||||
|
ldax #iac_response_buffer
|
||||||
|
jsr tcp_send
|
||||||
|
@no_iac_response:
|
||||||
|
rts
|
||||||
|
|
||||||
|
;constants
|
||||||
|
closing_connection: .byte "CLOSING CONNECTION",13,0
|
||||||
|
disconnected: .byte 13,"CONNECTION CLOSED",13,0
|
||||||
|
transmission_error: .byte "ERROR WHILE SENDING ",0
|
||||||
|
|
||||||
|
;variables
|
||||||
|
.segment "APP_SCRATCH"
|
||||||
|
telnet_ip: .res 4
|
||||||
|
telnet_port: .res 2
|
||||||
|
|
||||||
|
connection_closed: .res 1
|
||||||
|
telnet_use_native_charset: .res 1
|
||||||
|
buffer_offset: .res 1
|
||||||
|
telnet_local_echo: .res 1
|
||||||
|
telnet_line_mode: .res 1
|
||||||
|
telnet_state: .res 1
|
||||||
|
telnet_command: .res 1
|
||||||
|
telnet_option: .res 1
|
||||||
|
|
||||||
|
telnet_state_normal = 0
|
||||||
|
telnet_state_got_iac = 1
|
||||||
|
telnet_state_got_command = 2
|
||||||
|
|
||||||
|
buffer_length: .res 2
|
||||||
|
|
||||||
|
iac_response_buffer: .res 64
|
||||||
|
iac_response_buffer_length: .res 1
|
||||||
|
scratch_buffer : .res 40
|
@ -45,7 +45,6 @@
|
|||||||
.include "../inc/menu.i"
|
.include "../inc/menu.i"
|
||||||
|
|
||||||
.if (BANKSWITCH_SUPPORT=$03)
|
.if (BANKSWITCH_SUPPORT=$03)
|
||||||
.include "../inc/char_conv.i"
|
|
||||||
.include "../inc/gopher.i"
|
.include "../inc/gopher.i"
|
||||||
.include "../inc/telnet.i"
|
.include "../inc/telnet.i"
|
||||||
.endif
|
.endif
|
||||||
@ -74,6 +73,7 @@
|
|||||||
|
|
||||||
.import print_dotted_quad
|
.import print_dotted_quad
|
||||||
.import print_hex
|
.import print_hex
|
||||||
|
.import print_errorcode
|
||||||
.import print_ip_config
|
.import print_ip_config
|
||||||
.import ok_msg
|
.import ok_msg
|
||||||
.import failed_msg
|
.import failed_msg
|
||||||
@ -576,12 +576,6 @@ net_apps_menu:
|
|||||||
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
print_errorcode:
|
|
||||||
ldax #error_code
|
|
||||||
jsr print
|
|
||||||
nb65call #NB65_GET_LAST_ERROR
|
|
||||||
jsr print_hex
|
|
||||||
jmp print_cr
|
|
||||||
|
|
||||||
bad_boot:
|
bad_boot:
|
||||||
jsr wait_for_keypress
|
jsr wait_for_keypress
|
||||||
@ -691,9 +685,6 @@ tftp_download_fail_msg:
|
|||||||
tftp_download_ok_msg:
|
tftp_download_ok_msg:
|
||||||
.byte "DOWNLOAD OK", 13, 0
|
.byte "DOWNLOAD OK", 13, 0
|
||||||
|
|
||||||
error_code:
|
|
||||||
.asciiz "ERROR CODE: "
|
|
||||||
|
|
||||||
current:
|
current:
|
||||||
.byte "CURRENT ",0
|
.byte "CURRENT ",0
|
||||||
|
|
||||||
@ -707,7 +698,7 @@ tftp_file:
|
|||||||
.asciiz "BOOTC64.PRG"
|
.asciiz "BOOTC64.PRG"
|
||||||
|
|
||||||
no_files_on_server:
|
no_files_on_server:
|
||||||
.byte "TFTP SERVER HAS NO MATCHING FILES",13,0
|
.byte "NO MATCHING FILES",13,0
|
||||||
|
|
||||||
press_a_key_to_continue:
|
press_a_key_to_continue:
|
||||||
.byte "PRESS A KEY TO CONTINUE",13,0
|
.byte "PRESS A KEY TO CONTINUE",13,0
|
||||||
|
@ -30,7 +30,10 @@ all: \
|
|||||||
testdottedquad.pg2\
|
testdottedquad.pg2\
|
||||||
testdottedquad.prg\
|
testdottedquad.prg\
|
||||||
test_tcp.prg \
|
test_tcp.prg \
|
||||||
|
a2_gopher.pg2 \
|
||||||
|
a2_telnet.pg2 \
|
||||||
|
a2_netapps.dsk \
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(CC) -c $(CFLAGS) $<
|
$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
@ -46,12 +49,22 @@ test_tcp.prg: test_tcp.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64prg.c
|
|||||||
#gopher_browser.prg: gopher_browser.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64prg.cfg ../inc/gopher.i
|
#gopher_browser.prg: gopher_browser.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64prg.cfg ../inc/gopher.i
|
||||||
# $(LD) -m gopher_browser.map -vm -C ../cfg/c64prg.cfg -o gopher_browser.prg $(AFLAGS) $< $(IP65TCPLIB) $(C64PROGLIB)
|
# $(LD) -m gopher_browser.map -vm -C ../cfg/c64prg.cfg -o gopher_browser.prg $(AFLAGS) $< $(IP65TCPLIB) $(C64PROGLIB)
|
||||||
|
|
||||||
|
a2_gopher.pg2: a2_gopher.o $(IP65TCPLIB) $(APPLE2PROGLIB) $(INCFILES) ../cfg/a2bin.cfg ../inc/gopher.i
|
||||||
|
$(LD) -C ../cfg/a2bin.cfg -o a2_gopher.pg2 $(AFLAGS) $< $(IP65TCPLIB) $(APPLE2PROGLIB)
|
||||||
|
|
||||||
|
a2_telnet.pg2: a2_telnet.o $(IP65TCPLIB) $(APPLE2PROGLIB) $(INCFILES) ../cfg/a2bin.cfg
|
||||||
|
$(LD) -C ../cfg/a2bin.cfg -m a2_telnet.map -vm -o a2_telnet.pg2 $(AFLAGS) $< $(IP65TCPLIB) $(APPLE2PROGLIB)
|
||||||
|
|
||||||
%.pg2: %.o $(IP65LIB) $(APPLE2PROGLIB) $(INCFILES) ../cfg/a2bin.cfg
|
%.pg2: %.o $(IP65LIB) $(APPLE2PROGLIB) $(INCFILES) ../cfg/a2bin.cfg
|
||||||
$(LD) -C ../cfg/a2bin.cfg -o $*.pg2 $(AFLAGS) $< $(IP65LIB) $(APPLE2PROGLIB)
|
$(LD) -C ../cfg/a2bin.cfg -o $*.pg2 $(AFLAGS) $< $(IP65LIB) $(APPLE2PROGLIB)
|
||||||
|
|
||||||
ip65test.dsk: testdns.pg2 testdottedquad.pg2 testtftp.pg2
|
a2_netapps.dsk: a2_gopher.pg2 a2_telnet.pg2
|
||||||
|
ripxplore.rb --init BeautifulBoot a2_netapps.dsk -a a2_gopher.pg2 -t AppleBinary
|
||||||
|
ripxplore.rb a2_netapps.dsk -a a2_telnet.pg2 -t AppleBinary
|
||||||
|
|
||||||
|
ip65test.dsk: testdns.pg2 testdottedquad.pg2 testtftp.pg2
|
||||||
ripxplore.rb --init BeautifulBoot ip65test.dsk -a testdns.pg2 -t AppleBinary
|
ripxplore.rb --init BeautifulBoot ip65test.dsk -a testdns.pg2 -t AppleBinary
|
||||||
|
ripxplore.rb ip65test.dsk -a testdns.pg2 -t AppleBinary
|
||||||
ripxplore.rb ip65test.dsk -a testtftp.pg2 -t AppleBinary
|
ripxplore.rb ip65test.dsk -a testtftp.pg2 -t AppleBinary
|
||||||
ripxplore.rb ip65test.dsk -a testdottedquad.pg2 -t AppleBinary
|
ripxplore.rb ip65test.dsk -a testdottedquad.pg2 -t AppleBinary
|
||||||
ripxplore.rb ip65test.dsk -a testdns.pg2 -t AppleBinary
|
ripxplore.rb ip65test.dsk -a testdns.pg2 -t AppleBinary
|
||||||
@ -62,6 +75,7 @@ test_disk_io.d64: test_disk_io.prg
|
|||||||
clean:
|
clean:
|
||||||
rm -f *.o *.pg2 *.prg
|
rm -f *.o *.pg2 *.prg
|
||||||
rm -f ip65test.dsk
|
rm -f ip65test.dsk
|
||||||
|
rm -f a2_netapps.dsk
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f *~
|
rm -f *~
|
||||||
|
47
client/test/a2_gopher.s
Normal file
47
client/test/a2_gopher.s
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
;C64 gopher browser
|
||||||
|
;july 2009 - jonno @ jamtronix.com
|
||||||
|
|
||||||
|
.include "../inc/common.i"
|
||||||
|
.include "../inc/commonprint.i"
|
||||||
|
.include "../inc/net.i"
|
||||||
|
.include "../inc/c64keycodes.i"
|
||||||
|
.include "../inc/gopher.i"
|
||||||
|
|
||||||
|
.import __CODE_LOAD__
|
||||||
|
.import __CODE_SIZE__
|
||||||
|
.import __RODATA_SIZE__
|
||||||
|
.import __DATA_SIZE__
|
||||||
|
|
||||||
|
.import get_key
|
||||||
|
|
||||||
|
.segment "EXEHDR" ;this is what gets put an the start of the file on the Apple 2
|
||||||
|
.addr __CODE_LOAD__-3 ; Start address
|
||||||
|
.word __CODE_SIZE__+__RODATA_SIZE__+__DATA_SIZE__+4 ; Size
|
||||||
|
jmp init
|
||||||
|
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
init:
|
||||||
|
|
||||||
|
jsr cls
|
||||||
|
ldax #title
|
||||||
|
jsr print
|
||||||
|
jsr print_cr
|
||||||
|
init_ip_via_dhcp
|
||||||
|
jsr print_ip_config
|
||||||
|
|
||||||
|
@loop_forever:
|
||||||
|
jsr prompt_for_gopher_resource ;only returns if no server was entered.
|
||||||
|
jsr print_cr
|
||||||
|
jmp @loop_forever
|
||||||
|
|
||||||
|
exit_gopher:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.rodata
|
||||||
|
title:
|
||||||
|
.byte " GOPHER ][",13," jonno@jamtronix.com",13,0
|
||||||
|
|
||||||
|
resolving:
|
||||||
|
.byte "RESOLVING ",0
|
78
client/test/a2_telnet.s
Normal file
78
client/test/a2_telnet.s
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
;A2 telnet
|
||||||
|
;july 2009 (at Mt Keira Fest!) - jonno @ jamtronix.com
|
||||||
|
|
||||||
|
.include "../inc/common.i"
|
||||||
|
.include "../inc/commonprint.i"
|
||||||
|
.include "../inc/net.i"
|
||||||
|
.include "../inc/a2keycodes.i"
|
||||||
|
|
||||||
|
.import __CODE_LOAD__
|
||||||
|
.import __CODE_SIZE__
|
||||||
|
.import __RODATA_SIZE__
|
||||||
|
.import __DATA_SIZE__
|
||||||
|
|
||||||
|
.import get_key
|
||||||
|
.import cls
|
||||||
|
|
||||||
|
.import telnet_connect
|
||||||
|
.import telnet_local_echo
|
||||||
|
.import telnet_line_mode
|
||||||
|
.import telnet_use_native_charset
|
||||||
|
.import telnet_port
|
||||||
|
.import telnet_ip
|
||||||
|
.import cfg_init
|
||||||
|
|
||||||
|
.segment "EXEHDR" ;this is what gets put an the start of the file on the Apple 2
|
||||||
|
.addr __CODE_LOAD__-3 ; Start address
|
||||||
|
.word __CODE_SIZE__+__RODATA_SIZE__+__DATA_SIZE__+4 ; Size
|
||||||
|
jmp init
|
||||||
|
|
||||||
|
|
||||||
|
.code
|
||||||
|
|
||||||
|
init:
|
||||||
|
|
||||||
|
jsr cls
|
||||||
|
jsr $c300
|
||||||
|
ldax #title
|
||||||
|
jsr print
|
||||||
|
jsr print_cr
|
||||||
|
jsr cfg_init
|
||||||
|
; jsr print_ip_config
|
||||||
|
; jsr get_key
|
||||||
|
init_ip_via_dhcp
|
||||||
|
jsr print_ip_config
|
||||||
|
|
||||||
|
@loop_forever:
|
||||||
|
ldx #3
|
||||||
|
@copy_telnet_ip_loop:
|
||||||
|
lda remote_host,x
|
||||||
|
sta telnet_ip,x
|
||||||
|
dex
|
||||||
|
bpl @copy_telnet_ip_loop
|
||||||
|
|
||||||
|
ldax #23
|
||||||
|
stax telnet_port
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta telnet_use_native_charset
|
||||||
|
sta telnet_line_mode
|
||||||
|
lda #1
|
||||||
|
sta telnet_local_echo
|
||||||
|
|
||||||
|
jsr telnet_connect
|
||||||
|
jmp @loop_forever
|
||||||
|
|
||||||
|
|
||||||
|
exit_telnet:
|
||||||
|
rts
|
||||||
|
|
||||||
|
.rodata
|
||||||
|
title: .byte " TELNET ][",13," jonno@jamtronix.com",13,0
|
||||||
|
|
||||||
|
resolving:
|
||||||
|
.byte "RESOLVING ",0
|
||||||
|
|
||||||
|
remote_host:
|
||||||
|
.byte 10,5,2,1
|
||||||
|
padding: .byte 0,0,0,0,0
|
@ -247,8 +247,6 @@ fname_end:
|
|||||||
|
|
||||||
.rodata
|
.rodata
|
||||||
|
|
||||||
error_code:
|
|
||||||
.byte "ERROR CODE: $",0
|
|
||||||
press_a_key_to_continue:
|
press_a_key_to_continue:
|
||||||
.byte "PRESS A KEY TO CONTINUE",13,0
|
.byte "PRESS A KEY TO CONTINUE",13,0
|
||||||
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
.include "../inc/common.i"
|
.include "../inc/common.i"
|
||||||
.include "../inc/commonprint.i"
|
.include "../inc/commonprint.i"
|
||||||
.include "../inc/net.i"
|
.include "../inc/net.i"
|
||||||
.include "../inc/char_conv.i"
|
|
||||||
|
|
||||||
.import exit_to_basic
|
.import exit_to_basic
|
||||||
|
.import ascii_to_native
|
||||||
.import parse_dotted_quad
|
.import parse_dotted_quad
|
||||||
.import dotted_quad_value
|
.import dotted_quad_value
|
||||||
|
|
||||||
@ -332,8 +331,7 @@ tcp_callback_routine:
|
|||||||
|
|
||||||
@print_one_byte:
|
@print_one_byte:
|
||||||
jsr get_next_byte
|
jsr get_next_byte
|
||||||
tax
|
jsr ascii_to_native
|
||||||
lda ascii_to_petscii_table,x
|
|
||||||
|
|
||||||
jsr print_a
|
jsr print_a
|
||||||
inc get_next_byte+1
|
inc get_next_byte+1
|
||||||
@ -616,8 +614,6 @@ number17:
|
|||||||
tcp_dest_ip:
|
tcp_dest_ip:
|
||||||
; .byte 10,5,1,1
|
; .byte 10,5,1,1
|
||||||
.byte 74,207,242,229
|
.byte 74,207,242,229
|
||||||
error_code:
|
|
||||||
.asciiz "ERROR CODE: $"
|
|
||||||
looping:
|
looping:
|
||||||
.asciiz "LOOPING..."
|
.asciiz "LOOPING..."
|
||||||
|
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user