]> git.sur5r.net Git - cc65/commitdiff
Implemented a one-character buffer for kbhit() and cgetc().
authorStephan Mühlstrasser <stephan.muehlstrasser@web.de>
Sat, 21 Feb 2015 19:24:58 +0000 (20:24 +0100)
committerStephan Mühlstrasser <stephan.muehlstrasser@web.de>
Sat, 21 Feb 2015 19:24:58 +0000 (20:24 +0100)
If kbhit() detects that a key is pressed, it fetches and
buffers the character. If cgetc() detects a buffered character,
this one is returned instead of fetching one with the PROM
routine.

cfg/osic1p.cfg
libsrc/osic1p/cgetc.s
libsrc/osic1p/extzp.inc
libsrc/osic1p/extzp.s
libsrc/osic1p/kbhit.s

index 10ce827fdb1bbebc164e9174ace4811d61cc0cc5..4771639a63e00ce29862c2c1575629d8d68b684c 100644 (file)
@@ -7,7 +7,7 @@ SYMBOLS {
 }
 MEMORY {
     # for size of ZP see runtime/zeropage.s and c1p/extzp.s
-    ZP:       file = "", define = yes, start = $0002, size = $001A + $0004;
+    ZP:       file = "", define = yes, start = $0002, size = $001A + $0005;
     RAM:      file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;
 }
 SEGMENTS {
index 3c9dd43815fd33a97f6cd184503074beb6ea220d..82857f4c6e111f2f718d5e821330030a64519e53 100644 (file)
@@ -1,6 +1,8 @@
 ;\r
 ; char cgetc (void);\r
 ;\r
+\r
+        .constructor    initcgetc\r
         .export         _cgetc\r
         .import         cursor\r
 \r
@@ -8,8 +10,21 @@
         .include        "extzp.inc"\r
         .include        "zeropage.inc"\r
 \r
+; Initialize one-character buffer that is filled by kbhit()\r
+initcgetc:\r
+        lda     #$00\r
+        sta     CHARBUF         ; No character in buffer initially\r
+        rts\r
+\r
 ; Input routine from 65V PROM MONITOR, show cursor if enabled\r
 _cgetc:\r
+        lda     CHARBUF         ; character in buffer available?\r
+        beq     nobuffer\r
+        tax                     ; save character in X\r
+        lda     #$00\r
+        sta     CHARBUF         ; empty buffer\r
+        jmp     restorex        ; restore X and return\r
+nobuffer:\r
         lda     cursor          ; show cursor?\r
         beq     nocursor\r
         ldy     CURS_X\r
@@ -25,7 +40,9 @@ nocursor:
         lda     tmp1            ; fetch saved character\r
         ldy     CURS_X\r
         sta     (SCREEN_PTR),y  ; store at cursor position\r
+\r
+restorex:\r
         txa                     ; restore saved character from X\r
-        ldx     #$00            ; high byte of int return value\r
 done:\r
+        ldx     #$00            ; high byte of int return value\r
         rts\r
index 06498d1a68140e8711335e86305fd8d89439c38a..5e85e0b74a502a6e3de25a2379815ca199f1d5a2 100644 (file)
@@ -4,4 +4,4 @@
 
 ; ------------------------------------------------------------------------
 
-        .globalzp       CURS_X, CURS_Y, SCREEN_PTR
+        .globalzp       CURS_X, CURS_Y, SCREEN_PTR, CHARBUF
index 7dc8e3a538723ca2154f859d0db6ada34f603b4a..b3bdaa0b77997bc19f2c556406ecb943554434db 100644 (file)
@@ -14,6 +14,7 @@
 CURS_X:         .res    1
 CURS_Y:         .res    1
 SCREEN_PTR:     .res    2
+CHARBUF:        .res    1
 
-; size 4
-; Adjust size of this segment in osic1p.cfg if the size changes
+; size 5
+; Adjust size of the ZP segment in osic1p.cfg if the size changes
index c064fec476c6f73eb79d3baf3cf88b4621aa8a32..67f3c86ed2b3360dfd4a01667407cbdd9c660f6b 100644 (file)
@@ -19,10 +19,13 @@ scan:
         rol     a               ; Rotate row select to next bit position
         cmp     #$FF            ; Done?
         bne     scan            ; If not, continue
-        ldx     #$00            ; High byte of return is always zero
         lda     #$00            ; Return false
+        tax                     ; High byte of return is also zero
+        sta     CHARBUF         ; No character in buffer
         rts
 keypressed:
+        jsr     INPUTC          ; Get input character in A
+        sta     CHARBUF         ; Save in buffer
         ldx     #$00            ; High byte of return is always zero
         lda     #$01            ; Return true
         rts