cputc.o \
crt0.o \
kbhit.o \
+ kblncur.o \
kirq.o \
kplot.o \
kscnkey.o \
;
-; Ullrich von Bassewitz, 06.08.1998
+; Ullrich von Bassewitz, 16.09.2001
;
; char cgetc (void);
;
.export _cgetc
- .import plot, write_crtc
.import cursor
.include "zeropage.inc"
.proc _cgetc
-L1: lda KeyIndex
- beq L1
+ lda KeyIndex ; Characters waiting?
+ bne L3 ; Jump if so
-L2: ldx #$00 ; Get index
- ldy KeyBuf ; Get first character in the buffer
+; Switch on the cursor if needed
+
+ lda CURS_FLAG
+ pha
+ lda cursor
+ jsr setcursor
+L1: lda KeyIndex
+ 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
-L3: lda KeyBuf+1,x ; Move up the remaining chars
- sta KeyBuf,x
+L4: lda KeyBuf+1,x ; Move up the remaining chars
+ sta KeyBuf,x
inx
- cpx KeyIndex
- bne L3
- dec KeyIndex
+ cpx KeyIndex
+ bne L4
+ dec KeyIndex
cli
- ldx #$00 ; High byte
- tya ; First char from buffer
+ 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
+
--- /dev/null
+;
+; Ullrich von Bassewitz, 16.09.2001
+;
+
+ .export k_blncur
+
+ .include "zeropage.inc"
+
+
+; ------------------------------------------------------------------------
+; Blink the cursor in the interrupt
+
+.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
+
+; Switch to the system bank, load Y with the cursor X coordinate
+
+ lda #$0F
+ sta IndReg ; Access system bank
+ 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
+curend: rts
+
+.endproc
+
+
;
.export irq, nmi, k_irq, k_nmi
- .import k_scnkey, k_udtim, k_rs232
+ .import k_blncur, k_scnkey, k_udtim, k_rs232
.importzp tpi1
.include "zeropage.inc"
cmp #%00000001 ; ticker irq?
bne irq1
+ jsr k_blncur ; Blink the cursor
jsr k_scnkey ; Poll the keyboard
jsr k_udtim ; Bump the time
ModKey = $E0
NorKey = $E1
BitTable = $E2
-BlinkOn = $E6
-BlinkCounter = $E7
+CURS_FLAG = $E6 ; 1 = no cursor
+CURS_BLINK = $E7 ; cursor blink counter
CRAM_PTR = $E8
TempColor = $EA
-BlinkSwitch = $EB
+CURS_STATE = $EB ; Cursor blink state
CHARCOLOR = $EC
-CursBackColor = $ED ; Color behind cursor
+CURS_COLOR = $ED ; Color behind cursor
OutCharTmp = $EE
ScreenSeq = $EF ; Segment of video RAM