File: cgetc.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (152 lines) | stat: -rw-r--r-- 4,015 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
;
; Ullrich von Bassewitz, 16.09.2001
;
; char cgetc (void);
;

        .export         _cgetc
        .condes         k_blncur, 2
        .import         cursor

        .include        "cbm510.inc"
        .include        "extzp.inc"


; ------------------------------------------------------------------------

.proc   _cgetc

        lda     keyidx                  ; Characters waiting?
        bne     L3                      ; Jump if so

; Switch on the cursor if needed

        lda     CURS_FLAG
        pha
        lda     cursor
        jsr     setcursor
L1:     lda     keyidx
        beq     L1
        ldx     #0
        pla
        bne     L2
        inx
L2:     txa
        jsr     setcursor

; Read the character from the keyboard buffer

L3:     ldx     #$00            ; Get index
        ldy     keybuf          ; Get first character in the buffer
        sei
L4:     lda     keybuf+1,x      ; Move up the remaining chars
        sta     keybuf,x
        inx
        cpx     keyidx
        bne     L4
        dec     keyidx
        cli

        ldx     #$00            ; High byte
        tya                     ; First char from buffer
        rts

.endproc

; ------------------------------------------------------------------------
;

.proc   setcursor

        ldy     #$00                    ;
        tax                             ; On or off?
        bne     @L9                     ; Go set it on
        lda     CURS_FLAG               ; Is the cursor currently off?
        bne     @L8                     ; Jump if yes
        lda     #1
        sta     CURS_FLAG               ; Mark it as off
        lda     CURS_STATE              ; Cursor currently displayed?
        sty     CURS_STATE              ; Cursor will be cleared later
        beq     @L8                     ; Jump if no

; Switch to the system bank, load Y with the cursor X coordinate

        lda     #$0F
        sta     IndReg                  ; Access system bank
        ldy     CURS_X

; Reset the current cursor

        lda     CURS_COLOR
        sta     (CRAM_PTR),y            ; Store cursor color
        lda     ExecReg
        sta     IndReg                  ; Switch to our segment
        lda     (SCREEN_PTR),y
        eor     #$80                    ; Toggle reverse flag
        sta     (SCREEN_PTR),y

; Done

@L8:    rts

@L9:    sty     CURS_FLAG               ; Cursor on (Y = 0)
        rts

.endproc


; ------------------------------------------------------------------------
; Blink the cursor in the interrupt. A blinking cursor is only available if
; we use the cgetc() function, so we will export this IRQ handler only in
; case the module is included into a program.


.proc   k_blncur

        lda     CURS_FLAG               ; Is the cursor on?
        bne     curend                  ; Jump if not
        dec     CURS_BLINK
        bne     curend

; Re-initialize the blink counter

        lda     #20                     ; Initial value
        sta     CURS_BLINK

; Load Y with the cursor X coordinate

        ldy     CURS_X

; Check if the cursor state was on or off before

        lda     CURS_COLOR              ; Load color behind cursor
        lsr     CURS_STATE              ; Cursor currently displayed?
        bcs     curset                  ; Jump if yes

; Cursor was off before, switch it on

        inc     CURS_STATE              ; Mark as displayed
        lda     (CRAM_PTR),y            ; Get color behind cursor...
        sta     CURS_COLOR              ; ...and remember it
        lda     CHARCOLOR               ; Use character color

; Set the cursor with color in A

curset: sta     (CRAM_PTR),y            ; Store cursor color
        lda     ExecReg
        sta     IndReg                  ; Switch to our segment
        lda     (SCREEN_PTR),y
        eor     #$80                    ; Toggle reverse flag
        sta     (SCREEN_PTR),y

; Switch back to the system bank

        lda     #$0F
        sta     IndReg

curend: rts

.endproc