.export get_key .export get_filtered_input .export filter_text .export filter_ip .export filter_dns .export filter_number .export check_for_abort_key .export get_key_if_available .export get_key_ip65 .importzp copy_src .import ip65_process .include "../inc/common.i" .code allowed_ptr=copy_src ;reuse zero page ;use C64 Kernel ROM function to read a key ;inputs: none ;outputs: A contains ASCII value of key just pressed get_key: jsr $ffe4 beq get_key rts ;use C64 Kernel ROM function to read a key ;inputs: none ;outputs: A contains ASCII value of key just pressed (0 if no key pressed) get_key_if_available=$ffe4 ;process inbound ip packets while waiting for a keypress get_key_ip65: jsr ip65_process jsr $ffe4 beq get_key_ip65 rts ;check whether the RUN/STOP key is being pressed ;inputs: none ;outputs: sec if RUN/STOP pressed, clear otherwise check_for_abort_key: lda $cb ;current key pressed cmp #$3F bne @not_abort @flush_loop: jsr $ffe4 bne @flush_loop lda $cb ;current key pressed cmp #$3F beq @flush_loop sec rts @not_abort: clc rts ;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 sta LASTCHAR cmp #$14 ;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 jsr $ffd2 ;Print it inc INPUT_Y ;Next character ;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 delete char lda #$14 jsr $ffd2 ;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