diff --git a/client/basic/kipperbas.d64 b/client/basic/kipperbas.d64 index 951fc3d..32b68b0 100644 Binary files a/client/basic/kipperbas.d64 and b/client/basic/kipperbas.d64 differ diff --git a/client/basic/kipperbas.s b/client/basic/kipperbas.s index b635bad..24ac5ec 100644 --- a/client/basic/kipperbas.s +++ b/client/basic/kipperbas.s @@ -36,6 +36,7 @@ FRMEVL = $AD9E ;evaluate expression FRESTR = $B6A3 ;free temporary string FRMNUM = $AD8A ;get a number GETADR = $B7F7 ;convert number to 16 bit integer +INLIN = $A560 ; read a line from keyboard VALTYP=$0D ;00=number, $FF=string @@ -84,7 +85,8 @@ crunched_line = $0200 ;Input buffer .import get_key_if_available .import tcp_send_keep_alive .import timer_read - +.import native_to_ascii +.import ascii_to_native .zeropage temp: .res 2 temp2: .res 2 @@ -1017,10 +1019,15 @@ netcat_keyword: ldax #netcat_callback stax tcp_callback jsr make_tcp_connection - bcc @main_polling_loop + bcc :+ rts - + : + ;is there an optional parameter? + ldx #0 + jsr get_optional_byte + stx netcat_mode @main_polling_loop: + jsr timer_read txa adc #$20 ;32 x 1/4 = ~ 8seconds @@ -1040,24 +1047,116 @@ netcat_keyword: rts @not_disconnected: - jsr get_key_if_available - beq @wait_for_keypress - - ldx #1 - stx tcp_send_data_len - dex - stx tcp_send_data_len+1 + lda netcat_mode + beq @not_line_mode - sta transfer_buffer - -@send_char: + lda #$00 + sta string_length +;process inbound ip packets while waiting for a keypress +@read_line: + lda $cb ;current key pressed + cmp #$3F ;RUN/STOP? + beq @runstop + jsr ip65_process + lda connection_closed + beq :+ + ldax #disconnected + jsr print + rts +: + jsr $f142 ;not officially documented - where F13E (GETIN) falls through to if device # is 0 (KEYBD) + + beq @read_line + + cmp #$14 ;Delete + beq @delete + + cmp #$0d ;Return + beq @input_done + + ;End reached? + ldy string_length + cpy #$FF + beq @read_line + + jsr $ffd2 ;Print it + jsr native_to_ascii + sta transfer_buffer,y ;Add it to string + + inc string_length + + ;Not yet. + jmp @read_line + + +@delete: + ;First, check if we're at the beginning. + lda string_length + bne @delete_ok + jmp @read_line + + ;At least one character entered. +@delete_ok: + ;Move pointer back. + dec string_length + + ;Print the delete char + lda #$14 + jsr $ffd2 + + ;Wait for next char + jmp @read_line + +@input_done: + lda #$0d + jsr $ffd2 ;print a newline + ldy string_length + lda #$0d + sta transfer_buffer,y + iny + lda #$0a + sta transfer_buffer,y + iny + sty tcp_send_data_len + jmp @send_buffer +@not_line_mode: + + ;is there anything in the input buffer? + lda $c6 ;NDX - chars in keyboard buffer + bne :+ + jmp @wait_for_keypress +: + lda #0 + sta tcp_send_data_len + sta tcp_send_data_len+1 +@get_next_char: + lda $cb ;current key pressed + cmp #$3F ;RUN/STOP? + bne @not_runstop +@runstop: + lda #0 + sta $cb ;overwrite "current key pressed" else it's seen by the tcp stack and the close aborts + jmp tcp_close +@not_runstop: + jsr $ffe4 ;getkey - 0 means no input + tax + beq @no_more_input + txa + + ldy tcp_send_data_len + sta transfer_buffer,y + inc tcp_send_data_len + jmp @get_next_char +@no_more_input: +@send_buffer: ldax #transfer_buffer jsr tcp_send bcs @error_on_send jmp @main_polling_loop @error_on_send: + ldax #transmission jmp print_error @@ -1079,8 +1178,16 @@ netcat_callback: sta buffer_length+1 @next_byte: + lda $cb ;current key pressed + cmp #$3F ;RUN/STOP? + beq @finished + ldy #0 lda (temp2),y + ldx netcat_mode + beq @no_transform + jsr ascii_to_native +@no_transform: jsr print_a inc temp2 bne :+ @@ -1232,7 +1339,7 @@ error: .byte " ERROR $",0 disconnected: -.byte "DIS" +.byte 13,"DIS" connected_msg: .byte "CONNECTED",13,0 @@ -1294,6 +1401,7 @@ current_output_ptr=emit_a+1 .bss +netcat_mode: .res 1 bytes_read: .res 2 string_length: .res 1 param_length: .res 1 @@ -1309,5 +1417,5 @@ transfer_buffer: .res 256 file_opened: .res 1 connection_closed: .res 1 netcat_timeout: .res 1 -buffer_length: .res 1 -data_arrived_flag: .res 1 \ No newline at end of file +buffer_length: .res 2 +data_arrived_flag: .res 1 diff --git a/client/drivers/c64charconv.s b/client/drivers/c64charconv.s index 7817eaa..2f5bc24 100644 --- a/client/drivers/c64charconv.s +++ b/client/drivers/c64charconv.s @@ -19,7 +19,7 @@ ascii_to_native: .rodata ascii_to_petscii_table: -.byte $00,$01,$02,$03,$04,$05,$06,$07,$14,$09,$0d,$11,$93,$0a,$0e,$0f +.byte $00,$01,$02,$03,$04,$05,$06,$07,$14,$20,$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