diff --git a/include/telestrat.h b/include/telestrat.h index a4648a3dc..5ad1d3bef 100644 --- a/include/telestrat.h +++ b/include/telestrat.h @@ -85,6 +85,8 @@ #define CH_LTEE '+' #define CH_RTEE '+' #define CH_CROSS '+' +#define CH_HLINE '-' +#define CH_VLINE '|' #define CH_CURS_UP 11 #define CH_CURS_DOWN 10 #define CH_CURS_LEFT 8 diff --git a/libsrc/telestrat/cclear.s b/libsrc/telestrat/cclear.s index a32919962..b9fce4708 100644 --- a/libsrc/telestrat/cclear.s +++ b/libsrc/telestrat/cclear.s @@ -6,7 +6,7 @@ ; .export _cclearxy, _cclear - .import update_adscr + .import update_adscr, display_conio .importzp tmp1 .import popax @@ -27,7 +27,7 @@ _cclear: @L1: stx tmp1 ; Save X lda #' ' ; Erase current char - BRK_TELEMON XFWR + jsr display_conio ldx tmp1 dex bne @L1 diff --git a/libsrc/telestrat/chline.s b/libsrc/telestrat/chline.s index 6ead10eee..91f3bdc9f 100644 --- a/libsrc/telestrat/chline.s +++ b/libsrc/telestrat/chline.s @@ -1,22 +1,34 @@ ; -; jede jede@oric.org 2018-04-17 -; - +; void chlinexy (unsigned char x, unsigned char y, unsigned char length); ; void chline (unsigned char length); ; - .export _chline + .export _chlinexy, _chline + + .import rvs, display_conio, update_adscr + .import popax + .include "telestrat.inc" - .include "zeropage.inc" -.proc _chline - sta tmp1 -@loop: - lda #'-' ; horizontal line screen code - BRK_TELEMON XWR0 ; macro send char to screen (channel 0 in telemon terms) - dec tmp1 - bne @loop - rts -.endproc +_chlinexy: + pha ; Save the length + jsr popax ; Get X and Y + sta SCRY ; Store Y + stx SCRX ; Store X + jsr update_adscr + pla ; Restore the length and run into _chline + +_chline: + tax ; Is the length zero? + beq @L9 ; Jump if done +@L1: + lda #'-' ; Horizontal line screen code + ora rvs + + jsr display_conio + +@L2: dex + bne @L1 +@L9: rts diff --git a/libsrc/telestrat/clrscr.s b/libsrc/telestrat/clrscr.s index 39c2f7724..363aa2761 100644 --- a/libsrc/telestrat/clrscr.s +++ b/libsrc/telestrat/clrscr.s @@ -3,7 +3,7 @@ ; .export _clrscr - .import OLD_CHARCOLOR, OLD_BGCOLOR + .import OLD_CHARCOLOR, OLD_BGCOLOR, BGCOLOR, CHARCOLOR .include "telestrat.inc" @@ -23,22 +23,25 @@ ; reset prompt position - lda #<(SCREEN+40) - sta ADSCRL - lda #>(SCREEN+40) - sta ADSCRH + lda #<(SCREEN) + sta ADSCR + lda #>(SCREEN) + sta ADSCR+1 + + lda #$00 + sta SCRDY ; reset display position - ldx #$01 + ldx #$00 stx SCRY - dex stx SCRX - ; At this step X is equal to $00 - dex - ; At this step X is equal to $FF - stx OLD_BGCOLOR + stx OLD_BGCOLOR ; black + stx BGCOLOR + + ldx #$07 ; white stx OLD_CHARCOLOR - + stx CHARCOLOR + rts .endproc diff --git a/libsrc/telestrat/cputc.s b/libsrc/telestrat/cputc.s index 38f8af84b..a1ab145c2 100644 --- a/libsrc/telestrat/cputc.s +++ b/libsrc/telestrat/cputc.s @@ -4,24 +4,50 @@ ; void cputc (char c); ; - .export _cputc, CHARCOLOR, OLD_CHARCOLOR, BGCOLOR, OLD_BGCOLOR + .export _cputc, _cputcxy, display_conio, CHARCOLOR, OLD_CHARCOLOR, BGCOLOR, OLD_BGCOLOR + + + .import update_adscr + .import popax .include "telestrat.inc" +_cputcxy: + pha ; Save C + jsr popax ; Get X and Y + sta SCRY ; Store Y + stx SCRX ; Store X + jsr update_adscr + pla + .proc _cputc + cmp #$0D + bne @not_CR + ldy #$00 + sty SCRX + rts +@not_CR: + cmp #$0A + bne @not_LF + + inc SCRY + jmp update_adscr + + +@not_LF: + ldx CHARCOLOR cpx OLD_CHARCOLOR beq do_not_change_color_foreground stx OLD_CHARCOLOR ; Store CHARCOLOR into OLD_CHARCOLOR - dec SCRX - dec SCRX pha txa ; Swap X to A because, X contains CHARCOLOR - BRK_TELEMON XFWR ; Change color on the screen (foreground) - inc SCRX + + jsr display_conio + pla do_not_change_color_foreground: @@ -31,18 +57,38 @@ do_not_change_color_foreground: stx OLD_BGCOLOR - dec SCRX ; Dec SCRX in order to place attribute before the right position - pha txa ; Swap X to A because, X contains BGCOLOR - 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) + ora #%00010000 ; Add 16 because background color is an attribute between 16 and 23. 17 is red background for example + + jsr display_conio pla do_not_change_color: - BRK_TELEMON XFWR ; Macro send char to screen (channel 0) + ; it continues to display_conio + +.endproc + + + +.proc display_conio + ldy SCRX + sta (ADSCR),y + iny + cpy #SCREEN_XSIZE + bne @no_inc + ldy #$00 + sty SCRX + + jmp update_adscr + +@no_inc: + sty SCRX rts .endproc + + + .bss CHARCOLOR: .res 1 @@ -52,3 +98,4 @@ BGCOLOR: .res 1 OLD_BGCOLOR: .res 1 + diff --git a/libsrc/telestrat/gotox.s b/libsrc/telestrat/gotox.s index 7a172071c..72004bc0a 100644 --- a/libsrc/telestrat/gotox.s +++ b/libsrc/telestrat/gotox.s @@ -8,9 +8,5 @@ .proc _gotox sta SCRX - - lda #$FF - sta OLD_CHARCOLOR - sta OLD_BGCOLOR rts .endproc diff --git a/libsrc/telestrat/gotoxy.s b/libsrc/telestrat/gotoxy.s index 3387efe40..ea7ed5623 100644 --- a/libsrc/telestrat/gotoxy.s +++ b/libsrc/telestrat/gotoxy.s @@ -29,30 +29,23 @@ gotoxy: jsr popa ; Get Y .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 #SCREEN - sta ADSCRH + sta ADSCR+1 ldy SCRY beq out loop: - lda ADSCRL + lda ADSCR clc adc #SCREEN_XSIZE bcc skip - inc ADSCRH + inc ADSCR+1 skip: - sta ADSCRL + sta ADSCR dey bne loop out: diff --git a/libsrc/telestrat/textcolor.s b/libsrc/telestrat/textcolor.s index 7d16c9e19..d851aaaab 100644 --- a/libsrc/telestrat/textcolor.s +++ b/libsrc/telestrat/textcolor.s @@ -2,12 +2,13 @@ ; .export _textcolor - .import CHARCOLOR + .import CHARCOLOR, OLD_CHARCOLOR .include "telestrat.inc" .proc _textcolor ldx CHARCOLOR ; Get previous color sta CHARCOLOR + stx OLD_CHARCOLOR txa ; Return previous color rts .endproc