]> git.sur5r.net Git - cc65/commitdiff
Add blinking cursor on input
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 18 Sep 2001 12:23:28 +0000 (12:23 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 18 Sep 2001 12:23:28 +0000 (12:23 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@944 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/cbm510/Makefile
libsrc/cbm510/cgetc.s
libsrc/cbm510/kblncur.s [new file with mode: 0644]
libsrc/cbm510/kirq.s
libsrc/cbm510/zeropage.inc

index 8b152550d010ce4579ea460adb0b5803a40a1764..50fdf623ca189fe15d198c081f90ee81969b5a0e 100644 (file)
@@ -21,6 +21,7 @@ OBJS =        _scrsize.o      \
        cputc.o         \
                crt0.o          \
                kbhit.o         \
+       kblncur.o       \
                kirq.o          \
                kplot.o         \
        kscnkey.o       \
index 971d66db2a5dbaabdcc24f5278cf85eaf6d45626..4cb75ccb46a5e296fe83b4e8016d279b836966b4 100644 (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"
 
 .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
+
diff --git a/libsrc/cbm510/kblncur.s b/libsrc/cbm510/kblncur.s
new file mode 100644 (file)
index 0000000..11b12fa
--- /dev/null
@@ -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
+
+
index 62174a6783c482ddb30db9fb031bbe06b2be6668..a2a0d2eec63a403e940df08c7255f478aeca4154 100644 (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
 
index 922f490acd4459bc093d31bb3354efe613198d25..70e865bb43f4581c1718b420873388d3707511a5 100644 (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