# ip65 technical reference

# File : drivers/vic20input.s

## functions

function | description
--- | ---
check_for_abort_key |
    check whether the RUN/STOP key is being pressed
    inputs: none
    outputs: sec if RUN/STOP pressed, clear otherwise
get_filtered_input |
    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_key |
    use Vic 20 Kernel ROM function to read a key
    inputs: none
    outputs: A contains ASCII value of key just pressed
get_key_if_available |
    not officially documented - where F1f5 (GETIN) falls through to if device # is 0 (KEYBD)
get_key_ip65 |
    process inbound ip packets while waiting for a keypress

## constants

constants | description | value
--- | --- | ---
filter_dns |  | "-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
filter_ip |  | "."
filter_number |  | "1234567890",0
filter_text | ================================================= Some example filters ================================================= | ",!#'()* "
filter_url |  | ":/%&?+$"

## implementation

    .export get_key
    .export get_filtered_input
    .export filter_text
    .export filter_ip
    .export filter_dns
    .export filter_url
    .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 Vic 20 Kernel ROM function to read a key
    ;inputs: none
    ;outputs: A contains ASCII value of key just pressed
    get_key:
      jsr get_key_if_available
      beq get_key
      rts

    ;use VIC 20 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=$f1f9 ;not officially documented - where F1f5 (GETIN) falls through to if device # is 0 (KEYBD)

    ;process inbound ip packets while waiting for a keypress
    get_key_ip65:
      jsr ip65_process
      jsr get_key_if_available
      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 #$18
      bne @not_abort
    @flush_loop:
      jsr get_key_if_available
      bne @flush_loop
      lda $cb ;current key pressed
      cmp #$18
      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
      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_url:
    .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

    ; The contents of this file are subject to the Mozilla Public License
    ; Version 1.1 (the "License"); you may not use this file except in
    ; compliance with the License. You may obtain a copy of the License at
    ; http://www.mozilla.org/MPL/
    ;
    ; Software distributed under the License is distributed on an "AS IS"
    ; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
    ; License for the specific language governing rights and limitations
    ; under the License.
    ;
    ; The Original Code is ip65.
    ;
    ; The Initial Developer of the Original Code is Jonno Downes,
    ; jonno@jamtronix.com.
    ; Portions created by the Initial Developer are Copyright (C) 2009
    ; Jonno Downes. All Rights Reserved.
    ; -- LICENSE END --