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