1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00

Add blinking cursor on input

git-svn-id: svn://svn.cc65.org/cc65/trunk@944 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2001-09-18 12:23:28 +00:00
parent e7c270e7ac
commit 5723cfed0c
5 changed files with 134 additions and 19 deletions

View File

@ -21,6 +21,7 @@ OBJS = _scrsize.o \
cputc.o \
crt0.o \
kbhit.o \
kblncur.o \
kirq.o \
kplot.o \
kscnkey.o \

View File

@ -1,11 +1,10 @@
;
; 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"
@ -16,23 +15,81 @@
.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
sei
L3: lda KeyBuf+1,x ; Move up the remaining chars
sta KeyBuf,x
; 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
cpx KeyIndex
bne L3
dec KeyIndex
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 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

56
libsrc/cbm510/kblncur.s Normal file
View File

@ -0,0 +1,56 @@
;
; 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

View File

@ -5,7 +5,7 @@
;
.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"
@ -72,6 +72,7 @@ k_irq:
cmp #%00000001 ; ticker irq?
bne irq1
jsr k_blncur ; Blink the cursor
jsr k_scnkey ; Poll the keyboard
jsr k_udtim ; Bump the time

View File

@ -93,13 +93,13 @@ ScreenRight = $DF
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