From ede64f68a9e2a9bf38d70e0887748409ba157384 Mon Sep 17 00:00:00 2001
From: jede <jede@oric.org>
Date: Wed, 17 Jul 2019 21:48:53 +0200
Subject: [PATCH 023/125] Fix bug with bgcolor and textcolor
---
libsrc/telestrat/bgcolor.s | 15 +--------
libsrc/telestrat/clrscr.s | 14 ++++----
libsrc/telestrat/cputc.s | 31 +++++++++--------
libsrc/telestrat/gotox.s | 5 ---
libsrc/telestrat/gotoxy.s | 64 +++++++++++++++++++-----------------
libsrc/telestrat/gotoy.s | 9 ++---
libsrc/telestrat/textcolor.s | 16 ---------
7 files changed, 62 insertions(+), 92 deletions(-)
diff --git a/libsrc/telestrat/bgcolor.s b/libsrc/telestrat/bgcolor.s
index 14ecf4bd..2f602922 100644
--- a/libsrc/telestrat/bgcolor.s
+++ b/libsrc/telestrat/bgcolor.s
@@ -3,23 +3,10 @@
.export _bgcolor
.import BGCOLOR
- .import BGCOLOR_CHANGE
+
.include "telestrat.inc"
.proc _bgcolor
- cmp BGCOLOR ; Do we set the same color? If we don't detect it, we loose one char on the screen for each bgcolor call with the same color
- bne out ; Yes
-
- ldy #$00
- sty BGCOLOR_CHANGE
-
- rts
-out:
- ldx BGCOLOR ; Get last color in order to return it
sta BGCOLOR
-
- lda #$01 ; Notify the change color
- sta BGCOLOR_CHANGE
- txa ; Return previous color
rts
.endproc
diff --git a/libsrc/telestrat/clrscr.s b/libsrc/telestrat/clrscr.s
index 22a88012..f44000d1 100644
--- a/libsrc/telestrat/clrscr.s
+++ b/libsrc/telestrat/clrscr.s
@@ -3,9 +3,8 @@
;
.export _clrscr
-
-
- .import CHARCOLOR_CHANGE, CHARCOLOR, BGCOLOR, BGCOLOR_CHANGE
+ .import OLD_CHARCOLOR, OLD_BGCOLOR, CHARCOLOR, BGCOLOR
+
.include "telestrat.inc"
.proc _clrscr
@@ -34,13 +33,14 @@
stx SCRY
dex
stx SCRX
-
- stx CHARCOLOR_CHANGE
- stx BGCOLOR_CHANGE
+
+ ; X is equal to 0
+ stx BGCOLOR
+ stx OLD_BGCOLOR
lda #$07
sta CHARCOLOR
- sta BGCOLOR
+ sta OLD_CHARCOLOR
rts
.endproc
diff --git a/libsrc/telestrat/cputc.s b/libsrc/telestrat/cputc.s
index d313d778..4b8e4fef 100644
--- a/libsrc/telestrat/cputc.s
+++ b/libsrc/telestrat/cputc.s
@@ -4,34 +4,39 @@
; void cputc (char c);
;
- .export _cputc, CHARCOLOR, CHARCOLOR_CHANGE, BGCOLOR, BGCOLOR_CHANGE
+ .export _cputc, CHARCOLOR, OLD_CHARCOLOR, BGCOLOR, OLD_BGCOLOR
.include "telestrat.inc"
.proc _cputc
- ldx CHARCOLOR_CHANGE
+ ldx CHARCOLOR
+ cpx OLD_CHARCOLOR
beq do_not_change_color_foreground
+
+ stx OLD_CHARCOLOR ; Store CHARCOLOR into OLD_CHARCOLOR
+
dec SCRX
dec SCRX
+
pha
- lda CHARCOLOR
+ txa ; Swap X to A because, X contains CHARCOLOR
BRK_TELEMON XFWR ; Change color on the screen (foreground)
- lda #$00
- sta CHARCOLOR_CHANGE
inc SCRX
pla
do_not_change_color_foreground:
- ldx BGCOLOR_CHANGE
+ ldx BGCOLOR
+ cpx OLD_BGCOLOR
beq do_not_change_color
+
+ stx OLD_BGCOLOR
+
dec SCRX ; Dec SCRX in order to place attribute before the right position
+
pha
- lda BGCOLOR
+ txa ; Swap X to A because, X contains CHARCOLOR
ORA #%00010000 ; Add 16 because background color is an attribute between 16 and 23. 17 is red background for example
BRK_TELEMON XFWR ; Change color on the screen (background)
- lda #$00
- sta BGCOLOR_CHANGE
-
pla
do_not_change_color:
@@ -41,9 +46,9 @@ do_not_change_color:
.bss
CHARCOLOR:
.res 1
-CHARCOLOR_CHANGE:
+OLD_CHARCOLOR:
.res 1
BGCOLOR:
- .res 1
-BGCOLOR_CHANGE:
.res 1
+OLD_BGCOLOR:
+ .res 1
diff --git a/libsrc/telestrat/gotox.s b/libsrc/telestrat/gotox.s
index f16c05b7..cd8828d6 100644
--- a/libsrc/telestrat/gotox.s
+++ b/libsrc/telestrat/gotox.s
@@ -3,13 +3,8 @@
;
.export _gotox
- .import popa
-
- .importzp sp
-
.include "telestrat.inc"
-
.proc _gotox
sta SCRX
rts
diff --git a/libsrc/telestrat/gotoxy.s b/libsrc/telestrat/gotoxy.s
index 7a53a77a..04a680e6 100644
--- a/libsrc/telestrat/gotoxy.s
+++ b/libsrc/telestrat/gotoxy.s
@@ -7,7 +7,7 @@
.export gotoxy, _gotoxy, update_adscr
- .import popa, CHARCOLOR_CHANGE, BGCOLOR_CHANGE
+ .import popa, OLD_CHARCOLOR, OLD_BGCOLOR
.include "telestrat.inc"
@@ -17,41 +17,43 @@ gotoxy: jsr popa ; Get Y
; This function moves only the display cursor; it does not move the prompt position.
; In telemon, there is a position for the prompt, and another for the cursor.
- sta SCRY
- jsr popa
- sta SCRX
-
- jsr update_adscr ; Update adress video ram position when SCRY et SCRX are modified
- ; Force to put again attribute when it moves on the screen
-
- rts
-.endproc
-
-
-.proc update_adscr
- lda #$01
- sta CHARCOLOR_CHANGE
- sta BGCOLOR_CHANGE
+ sta SCRY
+ jsr update_adscr ; Update adress video ram position when SCRY is modified
- lda #<SCREEN
- sta ADSCRL
+ jsr popa
+ sta SCRX
- lda #>SCREEN
- sta ADSCRH
+ rts
+.endproc
- ldy SCRY
- beq out
+.proc update_adscr
+; Force to set again color if cursor moves
+; $FF is used because we know that it's impossible to have this value with a color
+; It prevents a bug : If bgcolor or textcolor is set to black for example with no char displays,
+; next cputsxy will not set the attribute if y coordinate changes
+ lda #$FF
+ sta OLD_CHARCOLOR
+ sta OLD_BGCOLOR
+
+ lda #<SCREEN
+ sta ADSCRL
+
+ lda #>SCREEN
+ sta ADSCRH
+
+ ldy SCRY
+ beq out
loop:
- lda ADSCRL
- clc
- adc #$28
- bcc skip
- inc ADSCRH
+ lda ADSCRL
+ clc
+ adc #$28
+ bcc skip
+ inc ADSCRH
skip:
- sta ADSCRL
- dey
- bne loop
+ sta ADSCRL
+ dey
+ bne loop
out:
- rts
+ rts
.endproc
diff --git a/libsrc/telestrat/gotoy.s b/libsrc/telestrat/gotoy.s
index 13be8e42..182e3f74 100644
--- a/libsrc/telestrat/gotoy.s
+++ b/libsrc/telestrat/gotoy.s
@@ -8,10 +8,7 @@
.include "telestrat.inc"
.proc _gotoy
- sta SCRY
- jsr update_adscr
-
- ; We change the current line, it means that we need to put color attributes again.
- ; That is not the case with _gotox because, it's on the same line attribute are already set
- rts
+ sta SCRY
+ jsr update_adscr
+ rts
.endproc
diff --git a/libsrc/telestrat/textcolor.s b/libsrc/telestrat/textcolor.s
index ee6ba729..77bf6c71 100644
--- a/libsrc/telestrat/textcolor.s
+++ b/libsrc/telestrat/textcolor.s
@@ -3,25 +3,9 @@
.export _textcolor
.import CHARCOLOR
- .import CHARCOLOR_CHANGE
.include "telestrat.inc"
.proc _textcolor
- cmp CHARCOLOR ; Do we set the same color? If we don't detect it, we loose one char on the screen for each textcolor call with the same color
- bne out ; yes
-
- ldy #$00
- sty CHARCOLOR_CHANGE
-
- ; Return last color
-
- rts
-out:
- ldx CHARCOLOR ; Get last color in order to return it
sta CHARCOLOR
-
- lda #$01
- sta CHARCOLOR_CHANGE
- txa ; Return previous color
rts
.endproc
--
2.23.0