ip65 technical reference

File : drivers/vic20input.s

functions

functiondescription
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

constantsdescriptionvalue
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 --