From 5723cfed0c334c27ffb1d413eec9d8e7b206292a Mon Sep 17 00:00:00 2001 From: cuz Date: Tue, 18 Sep 2001 12:23:28 +0000 Subject: [PATCH] Add blinking cursor on input git-svn-id: svn://svn.cc65.org/cc65/trunk@944 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/cbm510/Makefile | 1 + libsrc/cbm510/cgetc.s | 85 +++++++++++++++++++++++++++++++------- libsrc/cbm510/kblncur.s | 56 +++++++++++++++++++++++++ libsrc/cbm510/kirq.s | 3 +- libsrc/cbm510/zeropage.inc | 8 ++-- 5 files changed, 134 insertions(+), 19 deletions(-) create mode 100644 libsrc/cbm510/kblncur.s diff --git a/libsrc/cbm510/Makefile b/libsrc/cbm510/Makefile index 8b152550d..50fdf623c 100644 --- a/libsrc/cbm510/Makefile +++ b/libsrc/cbm510/Makefile @@ -21,6 +21,7 @@ OBJS = _scrsize.o \ cputc.o \ crt0.o \ kbhit.o \ + kblncur.o \ kirq.o \ kplot.o \ kscnkey.o \ diff --git a/libsrc/cbm510/cgetc.s b/libsrc/cbm510/cgetc.s index 971d66db2..4cb75ccb4 100644 --- a/libsrc/cbm510/cgetc.s +++ b/libsrc/cbm510/cgetc.s @@ -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 + diff --git a/libsrc/cbm510/kblncur.s b/libsrc/cbm510/kblncur.s new file mode 100644 index 000000000..11b12fa48 --- /dev/null +++ b/libsrc/cbm510/kblncur.s @@ -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 + + diff --git a/libsrc/cbm510/kirq.s b/libsrc/cbm510/kirq.s index 62174a678..a2a0d2eec 100644 --- a/libsrc/cbm510/kirq.s +++ b/libsrc/cbm510/kirq.s @@ -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 diff --git a/libsrc/cbm510/zeropage.inc b/libsrc/cbm510/zeropage.inc index 922f490ac..70e865bb4 100644 --- a/libsrc/cbm510/zeropage.inc +++ b/libsrc/cbm510/zeropage.inc @@ -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