Interrupt handlers rather likely access text screen holes. Especially MSLOT is obligatory for every interrupt handler that requires access to an extension ROM ($C800-$CFFE) in order to be able to re-enable the extension ROM that was enabled when the interrupt occured. Those text screen holes only hold valid values in main memory so interrupts must be disabled while the aux memory text screen is mapped.
54 lines
1.3 KiB
ArmAsm
54 lines
1.3 KiB
ArmAsm
;
|
|
; Kevin Ruland
|
|
;
|
|
; char cgetc (void);
|
|
;
|
|
; If open_apple key is pressed then the high-bit of the key is set.
|
|
;
|
|
|
|
.export _cgetc
|
|
.import cursor, putchardirect
|
|
|
|
.include "zeropage.inc"
|
|
.include "apple2.inc"
|
|
|
|
_cgetc:
|
|
; Cursor on ?
|
|
lda cursor
|
|
beq :+
|
|
|
|
; Show caret.
|
|
.ifdef __APPLE2ENH__
|
|
lda #$7F | $80 ; Checkerboard, screen code
|
|
.else
|
|
lda #' ' | $40 ; Blank, flashing
|
|
.endif
|
|
jsr putchardirect ; Saves old character in tmp3
|
|
|
|
; Wait for keyboard strobe.
|
|
: inc RNDL ; Increment random counter low
|
|
bne :+
|
|
inc RNDH ; Increment random counter high
|
|
: lda KBD
|
|
bpl :-- ; If < 128, no key pressed
|
|
|
|
; Cursor on ?
|
|
ldy cursor
|
|
beq :+
|
|
|
|
; Restore old character.
|
|
pha
|
|
lda tmp3
|
|
jsr putchardirect
|
|
pla
|
|
|
|
; At this time, the high bit of the key pressed is set.
|
|
: bit KBDSTRB ; Clear keyboard strobe
|
|
.ifdef __APPLE2ENH__
|
|
bit BUTN0 ; Check if OpenApple is down
|
|
bmi done
|
|
.endif
|
|
and #$7F ; If not down, then clear high bit
|
|
done: ldx #>$0000
|
|
rts
|