From a4552b0e346e798356864e49889d406144e85b60 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Wed, 30 Aug 2017 20:04:57 +0200
Subject: [PATCH] Improved cursor handling consistency.
So far most of the time the cursor drawing was handled with a 'jsr COff - jsr COn' bracket around the drawing code. However in the area of screen erasing a different approach was used - which caused subtile issues.
https://github.com/oliverschmidt/ip65/commit/4d729ec8390e6c67b7c240ad45562f1f82a2b025 already fixed (most ?) of those issues for the Apple II and the ATARI. However it broke the approach 'jsr COff - jsr COn' brackets.
This is now adjusted - for all machines.
---
drivers/a2vt100.s | 13 +++++--------
drivers/atrvt100.s | 43 ++++++++++++++++++++++++-------------------
drivers/c64vt100.s | 16 ++++++++--------
3 files changed, 37 insertions(+), 35 deletions(-)
diff --git a/drivers/a2vt100.s b/drivers/a2vt100.s
index cce324e..5e70a16 100644
--- a/drivers/a2vt100.s
+++ b/drivers/a2vt100.s
@@ -554,9 +554,8 @@ LE6b cmp #$01
LE6d cmp #$02
bne LE6e ; par undefined
ldx CV ; line in X
+ jsr COff
jsr ErLn ; erase line
- sta sCrsrChar ; del char ..
- ; ..under crsr
jsr COn
LE6e jmp LEend
@@ -635,6 +634,7 @@ LE9c dex ; previous line
; -- 2 -- del screen
LE9e cmp #$02 ; unknown?
bne LE9f ; then ingnore
+ jsr COff
ldx #Rows-1 ; start at ln 23
LE9d txa
pha ; save X
@@ -643,6 +643,7 @@ LE9d txa
tax ; restore X
dex ; previous line
bpl LE9d
+ jsr COn
LE9f jmp LEend
; --- r --- set scroll region
@@ -1474,7 +1475,7 @@ EL2 sta (xVector),y ; clear char
; erase screen line from crsr to end of line
; -------------------------------------
-ErEnLn
+ErEnLn jsr COff
; -- erase even col chars --
bit $c055
lda CH ; get crsr col
@@ -1496,8 +1497,6 @@ EEL3 sta (BASL),y ; clear char
cpy #Cols/2 ; odd pos 40?
bne EEL3 ; next char
- sta sCrsrChar ; del char ..
- ; ..under crsr
jsr COn
rts
@@ -1509,7 +1508,7 @@ EEL3 sta (BASL),y ; clear char
; erase screen line up to crsr
; -------------------------------------
-ErBeLn
+ErBeLn jsr COff
; -- erase even col chars --
bit $c055
lda CH ; get crsr col
@@ -1529,8 +1528,6 @@ EBL2 sta (BASL),y ; clear char
EBL3 dey
bpl EBL2 ; pos>=0 -> next
- sta sCrsrChar ; del char ..
- ; ..under crsr
jsr COn
rts
diff --git a/drivers/atrvt100.s b/drivers/atrvt100.s
index ec6f9bd..7fa2210 100644
--- a/drivers/atrvt100.s
+++ b/drivers/atrvt100.s
@@ -564,9 +564,8 @@ LE6b cmp #$01
LE6d cmp #$02
bne LE6e ; par undefined
ldx ROWCRS ; line in X
+ jsr COff
jsr ErLn ; erase line
- sta sCrsrChar ; del char ..
- ; ..under crsr
jsr COn
LE6e jmp LEend
@@ -645,6 +644,7 @@ LE9c dex ; previous line
; -- 2 -- del screen
LE9e cmp #$02 ; unknown?
bne LE9f ; then ingnore
+ jsr COff
ldx #Rows-1 ; start at ln 23
LE9d txa
pha ; save X
@@ -653,6 +653,7 @@ LE9d txa
tax ; restore X
dex ; previous line
bpl LE9d
+ jsr COn
LE9f jmp LEend
; --- r --- set scroll region
@@ -1424,8 +1425,10 @@ L2 jsr COn
; -------------------------------------
ErLn jsr SLV ; line start in xVector
-ErLn_ ldy #Cols-1
- lda #$00
+
+ ; -- erase chars --
+ErLn_ ldy #Cols-1 ; col 39
+ lda #$00 ; load space
EL1 sta (xVector),y ; clear char
dey
bpl EL1
@@ -1440,16 +1443,17 @@ EL1 sta (xVector),y ; clear char
; erase screen line from crsr to end of line
; -------------------------------------
-ErEnLn ldx ROWCRS
+ErEnLn jsr COff
+ ; -- erase chars --
+ ldx ROWCRS
jsr SLV
- ldy COLCRS
- lda #$00
-EEL1 sta (xVector),y
+ ldy COLCRS ; get crsr col
+ lda #$00 ; load space
+EEL1 sta (xVector),y ; clear char
iny
- cpy #Cols
- bne EEL1
- sta sCrsrChar ; del char ..
- ; ..under crsr
+ cpy #Cols ; pos 40?
+ bne EEL1 ; next char
+
jsr COn
rts
@@ -1461,15 +1465,16 @@ EEL1 sta (xVector),y
; erase screen line up to crsr
; -------------------------------------
-ErBeLn ldx ROWCRS
+ErBeLn jsr COff
+ ; -- erase chars --
+ ldx ROWCRS
jsr SLV
- ldy COLCRS
- lda #$00
-EBL1 sta (xVector),y
+ ldy COLCRS ; get crsr col
+ lda #$00 ; load space
+EBL1 sta (xVector),y ; clear char
dey
- bpl EBL1
- sta sCrsrChar ; del char ..
- ; ..under crsr
+ bpl EBL1 ; pos>=0 -> next
+
jsr COn
rts
diff --git a/drivers/c64vt100.s b/drivers/c64vt100.s
index d0e5744..d311702 100644
--- a/drivers/c64vt100.s
+++ b/drivers/c64vt100.s
@@ -728,9 +728,9 @@ LE6b cmp #$01
LE6d cmp #$02
bne LE6e ; par undefined
ldx sRow ; line in X
+ jsr COff
jsr ErLn ; erase line
- sta sCrsrChar ; del char ..
- ; ..under crsr
+ jsr COn
LE6e jmp LEend
@@ -808,6 +808,7 @@ LE9c dex ; previous line
; -- 2 -- del screen
LE9e cmp #$02 ; unknown?
bne LE9f ; then ingnore
+ jsr COff
ldx #$18 ; start at ln 24
LE9d txa
pha ; save X
@@ -816,6 +817,7 @@ LE9d txa
tax ; restore X
dex ; previous line
bpl LE9d
+ jsr COn
LE9f jmp LEend
; --- r --- set scroll region
@@ -1783,7 +1785,7 @@ EL2 sta (yVector),y ; clear char
; erase screen line from crsr to end of line
; -------------------------------------
-ErEnLn
+ErEnLn jsr COff
; -- erase chars --
ldy sCol ; get crsr col
lda #$20 ; load space
@@ -1791,8 +1793,6 @@ EEL1 sta (sLinePtr),y ; clear char
iny
cpy #$28 ; pos 40?
bne EEL1 ; next char
- sta sCrsrChar ; del char ..
- ; ..under crsr
; -- set colour --
ldy sCol ; get crsr col
lda #fVa ; load vanilla
@@ -1801,6 +1801,7 @@ EEL2 sta (sLineColPtr),y ; set colour
cpy #$28 ; pos 40?
bne EEL2 ; next char
+ jsr COn
rts
; -------------------------------------
@@ -1811,15 +1812,13 @@ EEL2 sta (sLineColPtr),y ; set colour
; erase screen line up to crsr
; -------------------------------------
-ErBeLn
+ErBeLn jsr COff
; -- erase chars --
ldy sCol ; get crsr col
lda #$20 ; load space
EBL1 sta (sLinePtr),y ; clear char
dey
bpl EBL1 ; pos>=0 -> next
- sta sCrsrChar ; del char ..
- ; ..under crsr
; -- set colour --
ldy sCol ; get crsr col
lda #fVa ; load vanilla
@@ -1827,6 +1826,7 @@ EBL2 sta (sLineColPtr),y ; clear char
dey
bpl EBL2 ; pos>=0 -> next
+ jsr COn
rts
; -------------------------------------