applesoft-lite/io.s
2017-05-11 16:42:22 -04:00

93 lines
2.7 KiB
ArmAsm

; Apple-1 I/O routines for Applesoft Lite
; Last modified 10-May-2008
.setcpu "6502"
.segment "BASIC"
.export KEYBOARD, GETLN, RDKEY, CLS, OUTDO, CRDO, OUTQUES, OUTSP
.import INPUTBUFFER
.include "zeropage.s"
; ----------------------------------------------------------------------------
; I/O Locations
; ----------------------------------------------------------------------------
KEYBOARD := $D010
KEYBOARDCR := $D011
; ----------------------------------------------------------------------------
; Monitor Subroutines
; ----------------------------------------------------------------------------
MONECHO := $FFEF
; ----------------------------------------------------------------------------
; Get keystroke from keyboard (RDKEY)
; ----------------------------------------------------------------------------
RDKEY:
lda KEYBOARDCR ; Key ready?
bpl RDKEY ; Loop until ready
lda KEYBOARD ; Load character
and #$7F ; Clear hi bit
rts
; ----------------------------------------------------------------------------
; Get line of input (GETLN)
; adapted from Apple II monitor
; ----------------------------------------------------------------------------
NOTCR:
cmp #$18 ; CTRL-X?
beq CANCEL ; Cancel line if so
jsr MONECHO ; Output using monitor ECHO routine
cmp #'_' ; backspace?
beq BCKSPC ; Yes, do backspace...
NOTCR1: inx
bne NXTCHAR ; Wasn't backspace or CTRL+X, get next key
CANCEL: jsr OUTSLASH ; Output a "\" to indicate cancelled line
GETLNZ: jsr CRDO ; new line
GETLN: jsr OUTPROMPT ; Display the prompt
ldx #$01 ; Set cursor at 1, it gets decremented later
BCKSPC: txa
beq GETLNZ ; Backspace with nothing on the line? start new line
dex ; Move "cursor" back one space
NXTCHAR:
jsr RDKEY ; Read key from keyboard
ADDINP: sta INPUTBUFFER,x ; Put it in the input buffer
cmp #$0D ; CR?
bne NOTCR ; No, keep looping
jsr CRDO ; Output CR
rts
; ----------------------------------------------------------------------------
; These moved here from the main Applesoft code to save a few bytes
; ----------------------------------------------------------------------------
OUTSLASH:
lda #'\'
.byte $2C ; Fake BIT instruction to skip next 2 bytes
OUTPROMPT:
lda PROMPT
.byte $2C
OUTSP: lda #' '
.byte $2C
OUTQUES:
lda #'?'
.byte $2C
CRDO: lda #$0D
OUTDO: ora #$80 ; Set hi bit
jsr MONECHO ; Send character to monitor ECHO
and #$7F ; clear hi bit
rts
; ----------------------------------------------------------------------------
; Corny method of clearing the screen by sending a bunch of CR's.
; ----------------------------------------------------------------------------
CLS:
ldy #24 ; loop 24 times
@1: jsr CRDO ; ouput CR
dey
bpl @1 ; ... do it again
rts