From 03c6af3e15168eabaf9527814f561ba7670b0bf8 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Fri, 9 Oct 2015 23:39:37 +0200 Subject: [PATCH] rewrote color voodoo --- libsrc/c64/soft80_cgetc.s | 36 +++++++---- libsrc/c64/soft80_cputc.s | 130 +++++++++++++++++++++++++++----------- 2 files changed, 117 insertions(+), 49 deletions(-) diff --git a/libsrc/c64/soft80_cgetc.s b/libsrc/c64/soft80_cgetc.s index c68035dc5..130aca7c5 100644 --- a/libsrc/c64/soft80_cgetc.s +++ b/libsrc/c64/soft80_cgetc.s @@ -4,23 +4,22 @@ .export soft80_cgetc .import cursor + .importzp tmp1 .include "c64.inc" .include "soft80.inc" -.if SOFT80COLORVOODOO = 1 - .import soft80_putcolor -.endif - soft80_cgetc: lda KEY_COUNT ; Get number of characters bne L3 ; Jump if there are already chars waiting + ldx #1 jsr invertcursor ; set cursor on or off accordingly L1: lda KEY_COUNT ; wait for key beq L1 + ldx #0 jsr invertcursor ; set cursor on or off accordingly L3: jsr KBDREAD ; Read char and return in A @@ -36,18 +35,13 @@ invertcursor: @invert: sei - lda $01 + lda $01 ; enable RAM under I/O pha - lda #$34 ; enable RAM under I/O + lda #$34 sta $01 ldy #$00 -.if SOFT80COLORVOODOO = 1 - jsr soft80_putcolor -.else - lda CHARCOLOR - sta (CRAM_PTR),y ; vram -.endif + jsr setcolor lda CURS_X and #$01 @@ -65,6 +59,24 @@ invertcursor: cli rts + ; do not use soft80_putcolor here to make sure the cursor is always + ; shown using the current textcolor without disturbing the "color voodoo" + ; in soft80_cputc +setcolor: + ;ldy #0 ; is 0 + txa + bne @set + ; restore old value + lda tmp1 + sta (CRAM_PTR),y ; vram + rts +@set: + lda (CRAM_PTR),y ; vram + sta tmp1 + lda CHARCOLOR + sta (CRAM_PTR),y ; vram + rts + .rodata nibble: .byte $f0, $0f diff --git a/libsrc/c64/soft80_cputc.s b/libsrc/c64/soft80_cputc.s index 233132dca..3ef982aaa 100644 --- a/libsrc/c64/soft80_cputc.s +++ b/libsrc/c64/soft80_cputc.s @@ -10,7 +10,7 @@ .import popa, _gotoxy .import xsize .import soft80_kplot - .import __bgcolor + .import __bgcolor, __textcolor .importzp tmp4,tmp3 @@ -300,12 +300,36 @@ _invers: jmp _back ;------------------------------------------------------------------------------- +; optional "color voodoo". the problem is that each 8x8 cell can only contain +; two colors, one of which is used for the background color, so two characters +; have to share the same text color. +; +; - in a cell that contains two spaces, both the color ram and the text color +; in vram contain the background color +; +; - in a cell that contains one character, its text color goes into vram. the +; color ram contains the background color. +; +; - in a cell that contains two characters, the color of the left character goes +; to vram (and is shared by both for display). the "would be" color of the +; right character goes to color ram as a reminder and can be restored when one +; of the two characters is cleared by a space. .if SOFT80COLORVOODOO = 1 -;--- start color vodoo ; remove color from cell, called before putting a "space" character to the bitmap -; y unmodified +; +; __ -> __ - +; _A -> _A - +; B_ -> B_ - +; _A -> __ vram = bgcol +; B_ -> __ vram = bgcol +; BA -> _A vram = colram, colram = bgcol +; BA -> B_ colram = bgcol +; +; in: x must be $34 +; y must be $00 +; out: y = $00 remcolor: ;ldy #$00 ; is still $00 @@ -316,16 +340,16 @@ remcolor: lda (CRAM_PTR),y ; vram (textcolor) and #$0f cmp __bgcolor - jeq @l2b ; yes, vram==bgcolor + beq @sk1 ; yes, vram==bgcolor ; now check if the textcolor in color ram is equal the background color, ; if yes then there is only one (visible) character in the current cell - inc $01 + inc $01 ; $35 lda (CRAM_PTR),y ; colram (2nd textcolor) - stx $01 ;$34 + stx $01 ; $34 and #$0f cmp __bgcolor - beq @l2s ; yes, colram==bgcolor + beq @sk2 ; yes, colram==bgcolor ; two characters in the current cell, of which one will get removed @@ -334,41 +358,58 @@ remcolor: ;lda (CRAM_PTR),y ; colram ;stx $01 ;$34 ;and #$0f + sta tmp3 ; A contains colram - ; move 2nd text color to vram - sta tmp3 + lda CURS_X + and #$01 + bne @sk3 + + ; vram = colram lda (CRAM_PTR),y ; vram and #$f0 ora tmp3 sta (CRAM_PTR),y ; vram - +@sk3: ; colram = bgcolor lda __bgcolor - inc $01 + inc $01 ; $35 sta (CRAM_PTR),y ; colram - stx $01 ;$34 + stx $01 ; $34 - jmp @l2b + rts -@l2s: +@sk2: ; colram is bgcolor ; => only one char in cell used jsr soft80_checkchar - bcc @l2b ; space at current position + bcc @sk1 ; space at current position ; vram (textcolor) = bgcolor lda (CRAM_PTR),y ; vram and #$f0 ora __bgcolor sta (CRAM_PTR),y ; vram -@l2b: +@sk1: rts ; put color to cell -; in: $01 is $34 (RAM under I/O) when entering -; y must be $00 -; out: y = $00 +; +; __ -> _A vram = textcol +; __ -> B_ vram = textcol +; _A -> BA colram = vram, vram = textcol +; B_ -> BA colram = textcol +; +; _A -> _C vram = textcol +; B_ -> C_ vram = textcol +; BA -> BC colram = textcol +; BA -> CA vram = textcol +; +; in: $01 is $34 (RAM under I/O) when entering +; x must be $34 +; y must be $00 +; out: x = $34 +; y = $00 soft80_putcolor: ;ldy #$00 ; is still $00 @@ -376,38 +417,54 @@ soft80_putcolor: lda (CRAM_PTR),y ; vram and #$0f cmp __bgcolor - beq @l2s ; vram==bgcolor => first char in cell + beq @sk1 ; vram==bgcolor => first char in cell ; vram!=bgcolor => second char in cell - inc $01 ;$35 + inc $01 ; $35 lda (CRAM_PTR),y ; colram - stx $01 ;$34 + stx $01 ; $34 and #$0f cmp __bgcolor - bne @l2s ; colram!=bgcolor + beq @l2s ; colram==bgcolor -> second char in cell - ; colram==bgcolor => second char in cell or overwrite 1st char + ; botch characters in the cell are used + lda CURS_X + and #$01 + bne @sk2 ; jump if odd xpos + + ; vram = textcol + lda CHARCOLOR + sta (CRAM_PTR),y ; vram + rts + +@l2s: + ; one character in cell is already used jsr soft80_checkchar - bcs @l2a ; char at current position => overwrite 1st + bcs @sk1 ; char at current position => overwrite 1st + + lda CURS_X + and #$01 + beq @sk3 ; jump if even xpos +@sk2: + ; colram = textcol + lda __textcolor + inc $01 ; $35 + sta (CRAM_PTR),y ; colram + stx $01 ; $34 + rts +@sk3: ; colram=vram lda (CRAM_PTR),y ; vram - inc $01 + inc $01 ; $35 sta (CRAM_PTR),y ; colram - stx $01 ;$34 - - ;jmp @l2a - -@l2s: - ; colram!=bgcolor => alread 2 chars in cell -@l2a: - - ; Set color + stx $01 ; $34 +@sk1: + ; vram = textcol lda CHARCOLOR sta (CRAM_PTR),y ; vram - rts ; test if there is a space or a character at current position @@ -457,5 +514,4 @@ soft80_checkchar: sec rts -;--- end color vodoo .endif -- 2.39.5