mirror of
https://github.com/bobbimanners/emailler.git
synced 2024-11-12 14:04:34 +00:00
git-svn-id: http://svn.code.sf.net/p/netboot65/code@160 93682198-c243-4bdb-bd91-e943c89aac3b
This commit is contained in:
parent
7980547871
commit
06d2e50a7e
256
client/inc/telnet.i
Normal file
256
client/inc/telnet.i
Normal file
@ -0,0 +1,256 @@
|
||||
;telnet routines
|
||||
; to use:
|
||||
; 1) include this file
|
||||
; 2) include these other files:
|
||||
; .include "../inc/common.i"
|
||||
; .include "../inc/commonprint.i"
|
||||
; .include "../inc/net.i"
|
||||
; .include "../inc/char_conv.i"
|
||||
; .include "../inc/c64keycodes.i"
|
||||
; 3) define a routine called 'exit_telnet'
|
||||
; 4) define a buffer called 'scratch_buffer'
|
||||
; 5) define a zero page var called temp_ptr
|
||||
.code
|
||||
telnet_main_entry:
|
||||
;prompt for a hostname, then resolve to an IP address
|
||||
|
||||
ldax #remote_host
|
||||
jsr print
|
||||
nb65call #NB65_INPUT_HOSTNAME
|
||||
bcc @host_entered
|
||||
;if no host entered, then bail.
|
||||
jmp exit_telnet
|
||||
@host_entered:
|
||||
stax nb65_param_buffer
|
||||
jsr print_cr
|
||||
ldax #resolving
|
||||
jsr print
|
||||
ldax nb65_param_buffer
|
||||
nb65call #NB65_PRINT_ASCIIZ
|
||||
jsr print_cr
|
||||
ldax #nb65_param_buffer
|
||||
nb65call #NB65_DNS_RESOLVE
|
||||
bcc @resolved_ok
|
||||
print_failed
|
||||
jsr print_cr
|
||||
jsr print_errorcode
|
||||
jmp telnet_main_entry
|
||||
@resolved_ok:
|
||||
ldx #3
|
||||
@copy_telnet_ip_loop:
|
||||
lda nb65_param_buffer,x
|
||||
sta telnet_ip,x
|
||||
dex
|
||||
bpl @copy_telnet_ip_loop
|
||||
@get_port:
|
||||
ldax #remote_port
|
||||
jsr print
|
||||
nb65call #NB65_INPUT_PORT_NUMBER
|
||||
bcc @port_entered
|
||||
;if no port entered, then assume port 23
|
||||
ldax #23
|
||||
@port_entered:
|
||||
stax telnet_port
|
||||
jsr print_cr
|
||||
|
||||
ldax #char_mode_prompt
|
||||
jsr print
|
||||
@char_mode_input:
|
||||
jsr get_key
|
||||
cmp #'A'
|
||||
beq @ascii_mode
|
||||
cmp #'a'
|
||||
beq @ascii_mode
|
||||
|
||||
cmp #'P'
|
||||
beq @petscii_mode
|
||||
cmp #'p'
|
||||
beq @petscii_mode
|
||||
jmp @char_mode_input
|
||||
@ascii_mode:
|
||||
; lda #14
|
||||
; jsr print_a ;switch to lower case
|
||||
lda #0
|
||||
jmp @character_mode_set
|
||||
@petscii_mode:
|
||||
; lda #142
|
||||
; jsr print_a ;switch to upper case
|
||||
lda #1
|
||||
@character_mode_set:
|
||||
sta character_mode
|
||||
lda #147 ; 'CLR/HOME'
|
||||
jsr print_a
|
||||
|
||||
ldax #connecting_in
|
||||
jsr print
|
||||
lda character_mode
|
||||
beq @a_mode
|
||||
ldax #petscii
|
||||
jsr print
|
||||
jmp @c_mode
|
||||
@a_mode:
|
||||
ldax #ascii
|
||||
jsr print
|
||||
@c_mode:
|
||||
ldax #mode
|
||||
jsr print
|
||||
|
||||
; tcp_connect_ip: destination ip address (4 bytes)
|
||||
; AX: destination port (2 bytes)
|
||||
; tcp_callback: vector to call when data arrives on this connection
|
||||
|
||||
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
|
||||
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:
|
||||
;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
|
||||
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_mode
|
||||
bne @no_conversion_required
|
||||
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
|
||||
dec buffer_length
|
||||
bpl :+
|
||||
dec buffer_length+1
|
||||
:
|
||||
ldy #0
|
||||
@next_byte:
|
||||
lda (buffer_ptr),y
|
||||
tax
|
||||
lda character_mode
|
||||
bne @no_conversion_req
|
||||
lda ascii_to_petscii_table,x
|
||||
tax
|
||||
@no_conversion_req:
|
||||
tya
|
||||
pha
|
||||
txa
|
||||
jsr print_a
|
||||
pla
|
||||
tay
|
||||
iny
|
||||
dec buffer_length
|
||||
lda #$ff
|
||||
cmp buffer_length
|
||||
bne @next_byte
|
||||
inc buffer_ptr+1
|
||||
dec buffer_length+1
|
||||
bmi @finished
|
||||
ldy #0
|
||||
jmp @next_byte
|
||||
@finished:
|
||||
rts
|
||||
|
||||
;constants
|
||||
closing_connection: .byte "CLOSING CONNECTION",13,0
|
||||
connecting_in: .byte "CONNECTING IN ",0
|
||||
|
||||
ascii: .byte "ASCII",0
|
||||
petscii: .byte "PETSCII",0
|
||||
mode: .byte " MODE",13,0
|
||||
disconnected: .byte 13,"CONNECTION CLOSED",13,0
|
||||
remote_host: .byte "HOSTNAME (LEAVE BLANK TO QUIT)",13,": ",0
|
||||
remote_port: .byte "PORT # (LEAVE BLANK FOR DEFAULT)",13,": ",0
|
||||
char_mode_prompt: .byte "CHARACTER MODE - A=ASCII, P=PETSCII",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_mode: .res 1
|
||||
buffer_offset: .res 1
|
||||
;nb65_param_buffer DS.B $20
|
||||
buffer_length: .res 2
|
||||
|
Loading…
Reference in New Issue
Block a user