cc65/libsrc/lynx/cgetc.s

70 lines
2.0 KiB
ArmAsm

;
; Karri Kaksonen, Harry Dodgson 2006-01-07
;
; char cgetc (void);
;
.export _cgetc
.import _kbhit
.import KBEDG
.import KBSTL
; --------------------------------------------------------------------------
; The Atari Lynx has a very small keyboard - only 3 keys
; Opt1, Opt2 and Pause.
; But the designers have decided that pressing Pause and Opt1 at the
; same time means Restart and pressing Pause and Opt2 means Flip screen.
; For "easter egg" use I have also included all three keys pressed '?'
; and Opt1 + Opt2 pressed '3'.
; So the keyboard returns '1', '2', '3', 'P', 'R', 'F' or '?'.
_cgetc:
jsr _kbhit ; Check for char available
beq _cgetc
ora KBSTL
ldx #0
and #1
beq @L5
lda KBEDG ; Pause button is pressed
and #$0c
beq @L2
ora KBSTL
@L1:
bit #$04
beq @L3 ; Pause + Opt 1 = Reset
bit #$08
beq @L4 ; Pause + Opt 2 = Flip
lda #'?' ; All buttons pressed
bra reset_and_exit
@L2:
lda KBSTL ; Pause alone was the last placed button
and #$0c
bne @L1
lda #'P' ; Pause pressed
bra reset_and_exit
@L3:
lda #'R' ; Reset pressed
bra reset_and_exit
@L4:
lda #'F' ; Flip pressed
bra reset_and_exit
@L5:
lda KBEDG ; No Pause pressed
ora KBSTL
bit #$08
beq @L7
bit #$04
beq @L6
lda #'3' ; opt 1 + opt 2 pressed
bra reset_and_exit
@L6:
lda #'1' ; opt 1 pressed
bra reset_and_exit
@L7:
lda #'2' ; opt 2 pressed
reset_and_exit:
stz KBEDG
rts