1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-18 15:05:14 +00:00

some more rework, second attempt on fixing the color issues. added ifdefs to disable the color voodoo alltogether for debugging purposes.

This commit is contained in:
mrdudz 2015-10-08 20:43:25 +02:00
parent 67dabb8489
commit e54ad81ce8
6 changed files with 256 additions and 234 deletions

View File

@ -21,3 +21,10 @@ CH_BTEE = 177
CH_TTEE = 178 CH_TTEE = 178
CH_RTEE = 179 CH_RTEE = 179
CH_LRCORNER = 189 CH_LRCORNER = 189
;-------------------------------------------------------------------------------
; set to 0 to disable the color-ram "voodoo" for debugging purposes
.define SOFT80COLORVOODOO 1
; set to 0 to disable special case optimization for the "space" character
.define SOFT80FASTSPACE 1

View File

@ -4,87 +4,66 @@
.export soft80_cgetc .export soft80_cgetc
.import cursor .import cursor
.import soft80_putcolor
.include "c64.inc" .include "c64.inc"
.include "soft80.inc" .include "soft80.inc"
.if SOFT80COLORVOODOO = 1
.import soft80_putcolor
.endif
soft80_cgetc: soft80_cgetc:
lda KEY_COUNT ; Get number of characters lda KEY_COUNT ; Get number of characters
bne L3 ; Jump if there are already chars waiting bne L3 ; Jump if there are already chars waiting
; Switch on the cursor if needed jsr invertcursor ; set cursor on or off accordingly
lda cursor
jsr setcursor ; set cursor on or off accordingly
L1: lda KEY_COUNT ; wait for key L1: lda KEY_COUNT ; wait for key
beq L1 beq L1
ldx #0 jsr invertcursor ; set cursor on or off accordingly
lda CURS_FLAG
bne L2
inx
L2: txa
jsr setcursor
L3: jsr KBDREAD ; Read char and return in A L3: jsr KBDREAD ; Read char and return in A
ldx #0 ldx #0
rts rts
; Switch the cursor on or off ; Switch the cursor on or off (invert)
; A= 0: cursor off invertcursor:
; 1: cursor on lda cursor
bne @invert
.proc setcursor
; On or off?
cmp CURS_STATE
bne @set
rts rts
@set: @invert:
sta CURS_STATE
sei sei
lda $01 lda $01
pha pha
lda #$34 lda #$34 ; enable RAM under I/O
sta $01 sta $01
jsr soft80_putcolor
ldy #$00 ldy #$00
.if SOFT80COLORVOODOO = 1
jsr soft80_putcolor
.else
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
.endif
lda CURS_X lda CURS_X
and #$01 and #$01
bne @l1 tax
@lp1:
.repeat 8,line
lda (SCREEN_PTR),y lda (SCREEN_PTR),y
eor #$f0 eor nibble,x
sta (SCREEN_PTR),y sta (SCREEN_PTR),y
.if (line < 7)
iny iny
.endif cpy #8
.endrepeat bne @lp1
@back:
pla pla
sta $01 sta $01
cli cli
rts rts
@l1: .rodata
.repeat 8,line nibble: .byte $f0, $0f
lda (SCREEN_PTR),y
eor #$0f
sta (SCREEN_PTR),y
.if line < 7
iny
.endif
.endrepeat
jmp @back
.endproc

View File

@ -30,57 +30,54 @@ soft80_bgcolor:
jsr mkcharcolor jsr mkcharcolor
.if SOFT80COLORVOODOO = 1
; if the old bg color is equal to color ram of that cell, then also ; if the old bg color is equal to color ram of that cell, then also
; update the color ram to the new value. ; update the color ram to the new value.
; FIXME: perhaps we must also check if the non visible character is not ; FIXME: perhaps we must also check if the non visible character is not
; a space, and NOT update the color ram in that case. ; a space, and NOT update the color ram in that case.
ldx #$00 ldx #$00
lp1: lp1:
.repeat $3,page .repeat $4,page
.scope .scope
lda soft80_colram+(page*$100),x lda soft80_colram+(page*250),x
and #$0f and #$0f
cmp tmp2 ; old bg color cmp tmp2 ; old bg color
bne @sk1 bne @sk1
lda __bgcolor lda __bgcolor ; new bg color
sta soft80_colram+(page*$100),x sta soft80_colram+(page*250),x
@sk1: @sk1:
.endscope .endscope
.endrepeat .endrepeat
.scope
lda soft80_colram+$2e8,x
and #$0f
cmp tmp2 ; old bg color
bne @sk1
lda __bgcolor
sta soft80_colram+$2e8,x
@sk1:
.endscope
inx inx
bne lp1 bne lp1
.endif
sei sei
ldy $01 ldy $01
lda #$34 ; disable I/O lda #$34 ; disable I/O
sta $01 sta $01
; if the old bg color is equal to text color in this cell, then also
; update the text color to the new value.
; FIXME: perhaps we need to check for space, see note above
ldx #$00 ldx #$00
@lp2: lp2:
.repeat $3,page .repeat $4,page
lda soft80_vram+(page*$100),x .scope
lda soft80_vram+(page*250),x
and #$0f and #$0f
cmp tmp2 ; old bg color
bne @sk2
lda __bgcolor ; new bg color
@sk2:
ora tmp1 ; new bg color (high nibble) ora tmp1 ; new bg color (high nibble)
sta soft80_vram+(page*$100),x sta soft80_vram+(page*250),x
.endscope
.endrepeat .endrepeat
lda soft80_vram+$2e8,x
and #$0f
ora tmp1 ; new bg color (high nibble)
sta soft80_vram+$2e8,x
inx inx
bne @lp2 bne lp2
sty $01 ; enable I/O sty $01 ; enable I/O
cli cli

View File

@ -6,7 +6,7 @@
.destructor soft80_shutdown .destructor soft80_shutdown
.import soft80_kclrscr .import soft80_kclrscr
.import soft80_textcolor, soft80_bgcolor .import __textcolor, __bgcolor
.importzp ptr1, ptr2, ptr3 .importzp ptr1, ptr2, ptr3
@ -67,11 +67,18 @@ soft80_init:
cli cli
lda 646 ; use current textcolor lda 646 ; use current textcolor
jsr soft80_textcolor and #$0f
sta __textcolor
lda VIC_BG_COLOR0 ; use current bgcolor lda VIC_BG_COLOR0 ; use current bgcolor
and #$0f and #$0f
jsr soft80_bgcolor sta __bgcolor
asl a
asl a
asl a
asl a
ora __textcolor
sta CHARCOLOR
jmp soft80_kclrscr jmp soft80_kclrscr

View File

@ -5,7 +5,6 @@
.export soft80_cputcxy, soft80_cputc .export soft80_cputcxy, soft80_cputc
.export soft80_cputdirect, soft80_putchar .export soft80_cputdirect, soft80_putchar
.export soft80_putcolor
.export soft80_newline, soft80_plot .export soft80_newline, soft80_plot
.import popa, _gotoxy .import popa, _gotoxy
@ -20,6 +19,10 @@
.include "c64.inc" .include "c64.inc"
.include "soft80.inc" .include "soft80.inc"
.if SOFT80COLORVOODOO = 1
.export soft80_putcolor
.endif
soft80_cputcxy: soft80_cputcxy:
pha ; Save C pha ; Save C
jsr popa ; Get Y jsr popa ; Get Y
@ -125,163 +128,17 @@ L5:
; returns: Y: cursor X position ; returns: Y: cursor X position
; this function is going to be used a lot so we unroll it a bit for speed ; this function is going to be used a lot so we unroll it a bit for speed
;--- start color vodoo .if SOFT80FASTSPACE = 1
; remove color from cell
; y unmodified
remcolor:
;ldy #$00 ; is still $00
lda (CRAM_PTR),y ; vram
and #$0f
cmp __bgcolor
jeq @l2b ; vram==bgcolor
inc $01
lda (CRAM_PTR),y ; colram
stx $01 ;$34
and #$0f
cmp __bgcolor
beq @l2s ; colram==bgcolor
; vram = colram
;inc $01
;lda (CRAM_PTR),y ; colram
;stx $01 ;$34
;and #$0f
sta tmp3
lda (CRAM_PTR),y ; vram
and #$f0
ora tmp3
sta (CRAM_PTR),y ; vram
; colram = bgcolor
lda __bgcolor
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
jmp @l2b
@l2s:
; colram is bgcolor
; => only one char in cell used
jsr soft80_checkchar
bcc @l2b ; space at current position
; vram = bgcolor
lda (CRAM_PTR),y ; vram
and #$f0
ora __bgcolor
sta (CRAM_PTR),y ; vram
@l2b:
rts
; put color to cell
; y unmodified
soft80_putcolor:
;ldy #$00 ; is still $00
lda (CRAM_PTR),y ; vram
and #$0f
cmp __bgcolor
beq @l2s ; vram==bgcolor => first char in cell
; vram!=bgcolor => second char in cell
inc $01 ;$35
lda (CRAM_PTR),y ; colram
stx $01 ;$34
and #$0f
cmp __bgcolor
bne @l2s ; colram!=bgcolor
; colram==bgcolor => second char in cell or overwrite 1st char
jsr soft80_checkchar
bcs @l2a ; char at current position => overwrite 1st
; colram=vram
lda (CRAM_PTR),y ; vram
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
;jmp @l2a
@l2s:
; colram!=bgcolor => alread 2 chars in cell
@l2a:
; Set color
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
rts
;--- end color vodoo
.export soft80_checkchar
; test if there is a space or a character at current position
; CLC: space SEC: character
soft80_checkchar:
;ldy #$00 ; is still $00
lda CURS_X
and #$01
jne @l1a
.repeat 8,line
lda (SCREEN_PTR),y
and #$f0
cmp #$f0
bne @l2b
.if (line < 7)
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2b:
ldy #$00
sec
rts
@l1a:
.repeat 8,line
lda (SCREEN_PTR),y
and #$0f
cmp #$0f
bne @l2bb
.if line < 7
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2bb:
ldy #$00
sec
rts
; output space ; output space
; in: y must be $00
_space: _space:
lda RVS lda RVS
jne _spaceinvers jne _spaceinvers
.if SOFT80COLORVOODOO = 1
jsr remcolor jsr remcolor
.endif
;ldy #$00 ; is still $00 ;ldy #$00 ; is still $00
lda CURS_X lda CURS_X
@ -310,10 +167,15 @@ _space:
jmp _back jmp _back
; output inverted space ; output inverted space
; in: y must be $00
_spaceinvers: _spaceinvers:
.if SOFT80COLORVOODOO = 1
jsr soft80_putcolor jsr soft80_putcolor
.else
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
.endif
lda CURS_X lda CURS_X
and #$01 and #$01
@ -339,11 +201,12 @@ _spaceinvers:
.endrepeat .endrepeat
jmp _back jmp _back
.endif
; output a character ; output a character
soft80_putchar: soft80_putchar:
sta tmp3 sta tmp3 ; remember charcode
sei sei
ldx $01 ldx $01
@ -353,14 +216,20 @@ soft80_putchar:
stx $01 ; will stay $34 for space stx $01 ; will stay $34 for space
ldy #$00 ; will be $00 from now on ldy #$00 ; will be $00 from now on
.if SOFT80FASTSPACE = 1
cmp #' ' ; space is a special (optimized) case cmp #' ' ; space is a special (optimized) case
jeq _space jeq _space
.endif
.if SOFT80COLORVOODOO = 1
jsr soft80_putcolor jsr soft80_putcolor
.else
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
.endif
; output character
; output character ldx tmp3 ; get charcode
char:
ldx tmp3
lda RVS lda RVS
jne _invers jne _invers
@ -429,3 +298,166 @@ _invers:
.endif .endif
.endrepeat .endrepeat
jmp _back jmp _back
;-------------------------------------------------------------------------------
.if SOFT80COLORVOODOO = 1
;--- start color vodoo
; remove color from cell, called before putting a "space" character to the bitmap
; y unmodified
remcolor:
;ldy #$00 ; is still $00
; if the textcolor in vram is equal to the background color, then
; no (visible) character is in the current cell and we can exit
; immediately.
lda (CRAM_PTR),y ; vram (textcolor)
and #$0f
cmp __bgcolor
jeq @l2b ; 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
lda (CRAM_PTR),y ; colram (2nd textcolor)
stx $01 ;$34
and #$0f
cmp __bgcolor
beq @l2s ; yes, colram==bgcolor
; two characters in the current cell, of which one will get removed
; vram = colram
;inc $01
;lda (CRAM_PTR),y ; colram
;stx $01 ;$34
;and #$0f
; move 2nd text color to vram
sta tmp3
lda (CRAM_PTR),y ; vram
and #$f0
ora tmp3
sta (CRAM_PTR),y ; vram
; colram = bgcolor
lda __bgcolor
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
jmp @l2b
@l2s:
; colram is bgcolor
; => only one char in cell used
jsr soft80_checkchar
bcc @l2b ; space at current position
; vram (textcolor) = bgcolor
lda (CRAM_PTR),y ; vram
and #$f0
ora __bgcolor
sta (CRAM_PTR),y ; vram
@l2b:
rts
; put color to cell
; in: $01 is $34 (RAM under I/O) when entering
; y must be $00
; out: y = $00
soft80_putcolor:
;ldy #$00 ; is still $00
lda (CRAM_PTR),y ; vram
and #$0f
cmp __bgcolor
beq @l2s ; vram==bgcolor => first char in cell
; vram!=bgcolor => second char in cell
inc $01 ;$35
lda (CRAM_PTR),y ; colram
stx $01 ;$34
and #$0f
cmp __bgcolor
bne @l2s ; colram!=bgcolor
; colram==bgcolor => second char in cell or overwrite 1st char
jsr soft80_checkchar
bcs @l2a ; char at current position => overwrite 1st
; colram=vram
lda (CRAM_PTR),y ; vram
inc $01
sta (CRAM_PTR),y ; colram
stx $01 ;$34
;jmp @l2a
@l2s:
; colram!=bgcolor => alread 2 chars in cell
@l2a:
; Set color
lda CHARCOLOR
sta (CRAM_PTR),y ; vram
rts
;.export soft80_checkchar
; test if there is a space or a character at current position
; in: y must be $00
; out: CLC: space SEC: character
; y = $00
soft80_checkchar:
;ldy #$00 ; is still $00
lda CURS_X
and #$01
jne @l1a
.repeat 8,line
lda (SCREEN_PTR),y
and #$f0
cmp #$f0
bne @l2b
.if (line < 7)
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2b:
ldy #$00
sec
rts
@l1a:
.repeat 8,line
lda (SCREEN_PTR),y
and #$0f
cmp #$0f
bne @l2bb
.if line < 7
iny
.endif
.endrepeat
ldy #$00
clc
rts
@l2bb:
ldy #$00
sec
rts
;--- end color vodoo
.endif

View File

@ -33,9 +33,14 @@ soft80_kclrscr:
inx inx
bne @lp3 bne @lp3
.if SOFT80COLORVOODOO = 1
lda __bgcolor
jsr clear ; clear color ram
.endif
sei sei
ldy $01 ldy $01
lda #$34 lda #$34 ; enable RAM under I/O
sta $01 sta $01
lda CHARCOLOR lda CHARCOLOR
@ -43,11 +48,6 @@ soft80_kclrscr:
ora __bgcolor ora __bgcolor
jsr clear ; clear vram jsr clear ; clear vram
inc $01 ; -> $35
lda __bgcolor
jsr clear ; clear color ram
sty $01 sty $01
cli cli