From ede64f68a9e2a9bf38d70e0887748409ba157384 Mon Sep 17 00:00:00 2001 From: jede Date: Wed, 17 Jul 2019 21:48:53 +0200 Subject: [PATCH] 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 | 58 +++++++++++++++++++----------------- libsrc/telestrat/gotoy.s | 9 ++---- libsrc/telestrat/textcolor.s | 16 ---------- 7 files changed, 59 insertions(+), 89 deletions(-) diff --git a/libsrc/telestrat/bgcolor.s b/libsrc/telestrat/bgcolor.s index 14ecf4bd7..2f602922f 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 22a880126..f44000d1a 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 d313d7780..4b8e4fef8 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 f16c05b71..cd8828d69 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 7a53a77ab..04a680e61 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 + sta SCRY + jsr update_adscr ; Update adress video ram position when SCRY is modified + + jsr popa + sta SCRX + + rts .endproc - .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 #$01 - sta CHARCOLOR_CHANGE - sta BGCOLOR_CHANGE + lda #SCREEN + sta ADSCRH - lda #>SCREEN - sta ADSCRH - - ldy SCRY - beq out + 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 13be8e42b..182e3f74e 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 ee6ba729a..77bf6c719 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