]> git.sur5r.net Git - cc65/commitdiff
Added CONIO cursor support.
authorOliver Schmidt <ol.sc@web.de>
Sun, 19 Jun 2016 13:03:20 +0000 (15:03 +0200)
committerOliver Schmidt <ol.sc@web.de>
Sun, 19 Jun 2016 13:03:20 +0000 (15:03 +0200)
For quite some time I deliberately didn't add cursor support to the Apple II CONIO imöplementation. I consider it inappropriate to increase the size of cgetc() unduly for a rather seldom used feature.

There's no hardware cursor on the Apple II so displaying a cursor during keyboard input means reading the character stored at the cursor location, writing the cursor character, reading the keyboard and finally writing back the character read initially.

The naive approach is to reuse the part of cputc() that determines the memory location of the character at the cursor position in order to read the character stored there. However that means to add at least one additional JSR / RTS pair to cputc() adding 4 bytes and 12 cycles :-( Apart from that this approach means still a "too" large cgetc().

The approach implemented instead is to include all functionality required by cgetc() into cputc() - which is to read the current character before writing a new one. This may seem surprising at first glance but an LDA(),Y / TAX sequence adds only 3 bytes and 7 cycles so it cheaper than the JSR / RTS pair and allows to brings down the code increase in cgetc() down to a reasonable value.

However so far the internal cputc() code in question saved the X register. Now it uses the X register to return the old character present before writing the new character for cgetc(). This requires some rather small adjustments in other functions using that internal cputc() code.

doc/apple2.sgml
doc/apple2enh.sgml
libsrc/apple2/cgetc.s
libsrc/apple2/chline.s
libsrc/apple2/cputc.s
libsrc/apple2/cvline.s
libsrc/apple2/textframe.s

index 00cd565b47a6ee06e880d902edd61fffde683f7b..d0405b6de6c3f3715a1256e37062e1941e1a8f8d 100644 (file)
@@ -449,10 +449,6 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
   The Apple&nbsp;&rsqb;&lsqb; has no color text mode. Therefore the functions textcolor(),
   bgcolor() and bordercolor() have no effect.
 
-  <tag/Cursor/
-  The Apple&nbsp;&rsqb;&lsqb; has no hardware cursor. Therefore the function cursor() has
-  no effect.
-
 </descrip><p>
 
 
index 7c17c24f22bcf31a46d8e51b5f7cffd1c0917c3c..b5231b4cd2e803d1ceff40f1dab47fa5225e520b 100644 (file)
@@ -450,10 +450,6 @@ BASIC.SYSTEM) there are some limitations for DOS 3.3:
   The enhanced&nbsp;Apple&nbsp;//e has no color text mode. Therefore the functions
   textcolor(), bgcolor() and bordercolor() have no effect.
 
-  <tag/Cursor/
-  The enhanced&nbsp;Apple&nbsp;//e has no hardware cursor. Therefore the function
-  cursor() has no effect.
-
 </descrip><p>
 
 
index 511e434df089735e43d6e70d53d086be70318087..b1bda8b9170e354ce518ff2e9bd4fafde6e70686 100644 (file)
@@ -6,20 +6,44 @@
 ; If open_apple key is pressed then the high-bit of the key is set.
 ;
 
-        .export _cgetc
+        .export         _cgetc
+        .import         cursor, putchardirect
 
-        .include "apple2.inc"
+        .include        "apple2.inc"
 
 _cgetc:
-        lda     KBD
-        bpl     _cgetc          ; If < 128, no key pressed
+        ; Cursor on ?
+        lda     cursor
+        beq     :+
 
-        ; At this time, the high bit of the key pressed is set
-        bit     KBDSTRB         ; Clear keyboard strobe
+        ; Show caret.
+        .ifdef  __APPLE2ENH__
+        lda     #$7F | $80      ; Checkerboard, screen code
+        .else
+        lda     #' ' | $40      ; Blank, flashing
+        .endif
+        jsr     putchardirect   ; Returns old character in X
+
+        ; Wait for keyboard strobe.
+:       lda     KBD
+        bpl     :-              ; If < 128, no key pressed
+
+        ; Cursor on ?
+        ldy     cursor
+        beq     :+
+
+        ; Restore old character.
+        pha
+        txa
+        jsr     putchardirect
+        pla
+
+        ; At this time, the high bit of the key pressed is set.
+:       bit     KBDSTRB         ; Clear keyboard strobe
         .ifdef __APPLE2ENH__
         bit     BUTN0           ; Check if OpenApple is down
         bmi     done
         .endif
         and     #$7F            ; If not down, then clear high bit
-done:   ldx     #$00
+done:   ldx     #>$0000
         rts
index 6cf77de1bbe7f5ed5564610141b59f1e225c3fcf..ca1ee707c4da8ab99ddea47420961c12798bb500 100644 (file)
@@ -26,11 +26,12 @@ _chline:
         ldx     #'-' | $80      ; Horizontal line, screen code
 
 chlinedirect:
+        stx     tmp1
         cmp     #$00            ; Is the length zero?
         beq     done            ; Jump if done
-        sta     tmp1
-:       txa                     ; Screen code
+        sta     tmp2
+:       lda     tmp1            ; Screen code
         jsr     cputdirect      ; Direct output
-        dec     tmp1
+        dec     tmp2
         bne     :-
 done:   rts
index 6607c6178acd987ec1b57548dc40c502fe5b004c..6f610fe9202b84b6812b6e22951974fbe7d25286 100644 (file)
@@ -9,7 +9,7 @@
         .constructor    initconio
         .endif
         .export         _cputcxy, _cputc
-        .export         cputdirect, newline, putchar
+        .export         cputdirect, newline, putchar, putchardirect
         .import         gotoxy, VTABZ
 
         .include        "apple2.inc"
@@ -62,32 +62,36 @@ newline:
         lda     WNDTOP          ; Goto top of screen
         sta     CV
 :       jmp     VTABZ
-                
+
 putchar:
         .ifdef  __APPLE2ENH__
         ldy     INVFLG
         cpy     #$FF            ; Normal character display mode?
-        beq     put
+        beq     putchardirect
         cmp     #$E0            ; Lowercase?
         bcc     mask
         and     #$7F            ; Inverse lowercase
-        bra     put
+        bra     putchardirect
         .endif
 mask:   and     INVFLG          ; Apply normal, inverse, flash
-put:    ldy     CH
+
+putchardirect:
+        pha
+        ldy     CH
         .ifdef  __APPLE2ENH__
         bit     RD80VID         ; In 80 column mode?
-        bpl     col40           ; No, in 40 cols
-        pha
+        bpl     put             ; No, just go ahead
         tya
         lsr                     ; Div by 2
         tay
-        pla
-        bcs     col40           ; Odd cols go in 40 col memory
+        bcs     put             ; Odd cols go in main memory
         bit     HISCR           ; Assume SET80COL
+        .endif
+put:    lda     (BASL),Y        ; Get current character
+        tax                     ; Return old character for _cgetc
+        pla
         sta     (BASL),Y
-        bit     LOWSCR          ; Assume SET80COL
-        rts
+        .ifdef  __APPLE2ENH__
+        bit     LOWSCR          ; Doesn't hurt in 40 column mode
         .endif
-col40:  sta     (BASL),Y
         rts
index a26cc706389499ef812708c8648764cbdf13617a..c8ae1e269b8e585498638486fb20299ca51f9b0f 100644 (file)
@@ -23,12 +23,13 @@ _cvline:
         .endif
 
 cvlinedirect:
+        stx     tmp1
         cmp     #$00            ; Is the length zero?
         beq     done            ; Jump if done
-        sta     tmp1
-:       txa                     ; Screen code
+        sta     tmp2
+:       lda     tmp1            ; Screen code
         jsr     putchar         ; Write, no cursor advance
         jsr     newline         ; Advance cursor to next line
-        dec     tmp1
+        dec     tmp2
         bne     :-
 done:   rts
index d5e9b80d75e9da7ed409505ea729f04ed65f3fbc..55ac235b896b169518630f74b2d478ecff91dfab 100644 (file)
         .include        "zeropage.inc"
         .include        "apple2.inc"
 
-WIDTH   = tmp2
-HEIGHT  = tmp3
-XORIGIN = tmp4
-YORIGIN = ptr1
+WIDTH   = ptr1
+HEIGHT  = ptr1+1
+XORIGIN = ptr2
+YORIGIN = ptr2+1
 
 _textframexy:
         sec