From 17b57d1ed2a397f2ebdceeab24d9d4832683a7ef Mon Sep 17 00:00:00 2001 From: Pecusx Date: Wed, 25 May 2022 12:05:24 +0200 Subject: [PATCH] Better (and faster!) 4x4 char handling. New PutChar4x4FULL proc. --- grafproc.asm | 176 +++++++++++++++++++++++++++++++++++---------------- scorch.xex | Bin 37810 -> 37940 bytes 2 files changed, 123 insertions(+), 53 deletions(-) diff --git a/grafproc.asm b/grafproc.asm index ed75e20..f65bbb8 100755 --- a/grafproc.asm +++ b/grafproc.asm @@ -1198,7 +1198,7 @@ IntoDraw adw xbyte #screenBytes .endp ; ; ------------------------------------------ -TypeChar .proc +.proc TypeChar ; puts char on the graphics screen ; in: CharCode ; in: left LOWER corner of the char coordinates (xdraw, ydraw) @@ -1336,7 +1336,8 @@ CharLoopi rts .endp ; ------------------------------------------ -PutChar4x4 .proc ;puts 4x4 pixels char on the graphics screen +.proc PutChar4x4 +; puts 4x4 pixels char on the graphics screen ; in: xdraw, ydraw (upper left corner of the char) ; in: CharCode4x4 (.sbyte) ;-------------------------------------------------- @@ -1399,66 +1400,135 @@ Loop4x4Continued rts .endp -; ------------------------------------------ -PutChar4x4FULL .proc; -;this routine works just like PutChar4x4, -;but this time all pixels are being drawn -;(empty and not empty) ;-------------------------------------------------- - -; calculating address of the first byte - mva #4 LoopCounter4x4 +.proc PutChar4x4FULL +; puts 4x4 pixels char on the graphics screen +; in: xdraw, ydraw (upper left corner of the char) +; in: CharCode4x4 (.sbyte) +; this routine works just like PutChar4x4, +; but this time all pixels are being drawn +; (empty and not empty) +;-------------------------------------------------- + cpw ydraw #(screenheight-4) + jcs EndPut4x4 + cpw xdraw #(screenwidth-4) + jcs EndPut4x4 ;nearest RTS + ; char to the table lda CharCode4x4 and #1 + beq Upper4bits + lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) +Upper4bits sta nibbler4x4 lda CharCode4x4 - ror - ; in carry there is which nibble of the byte is to be taken clc - clc - adc #(3*32) - sta y4x4 -nextline4x4FULL - mva #4 Xcounter4x4 - ldy y4x4 - lda font4x4,y + lsr + sta fontind + lda #$00 + sta fontind+1 + + adw fontind #font4x4 - ldx nibbler4x4 - beq uppernibbleFULL + ; and 4 bytes to the table + ldy #0 + ldx #3 +CopyChar + lda (fontind),y ; Y must be 0 !!!! + bit nibbler4x4 + bmi GetLower4bits + ror + ror + ror + ror +GetLower4bits + ora #$f0 + sta char1,x + lda #$ff + sta char2,x + ; and 4 bytes as a mask + lda #$0f + sta mask1,x + lda #$00 + sta mask2,x + adw fontind #32 ; next byte of 4x4 font + dex + bpl CopyChar - asl - asl - asl - asl -uppernibbleFULL - rol - sta StoreA4x4 - bcs EmptyPixelFULL - lda plot4x4color ;these lines are not necessary - sta color ;if a plots are one color only - jsr plot - jmp Loop4x4ContinuedFULL -EmptyPixelFULL - lda #1 ;reverse color (color==1-color) + ; calculating coordinates from xdraw and ydraw + mwa xdraw xbyte + + lda xbyte + and #$7 + sta ybit + + lsrw xbyte ; div 8 + rorw xbyte + rorw xbyte + +;--- + ldy xbyte + lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? sec - sbc plot4x4color - sta color - jsr plot - ;this is turned on now - ;of course it is slower - -Loop4x4ContinuedFULL - inw xdraw - lda StoreA4x4 - dec Xcounter4x4 - ldx Xcounter4x4 - bne uppernibbleFULL - ; here we have on screen one line of the char - inw ydraw - sbw xdraw #4 - sbw y4x4 #32 ; why? possibly because of width of the 4x4 font - dec:lda LoopCounter4x4 - bne nextline4x4FULL + sbc #7 + tax + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + ; mask preparation and character shifting + ldx ybit + beq MaskOK01 +MakeMask01 + lsr mask1 + ror mask2 + lsr mask1+1 + ror mask2+1 + lsr mask1+2 + ror mask2+2 + lsr mask1+3 + ror mask2+3 + sec + ror char1 + ror char2 + sec + ror char1+1 + ror char2+1 + sec + ror char1+2 + ror char2+2 + sec + ror char1+3 + ror char2+3 + dex + bne MakeMask01 +MaskOK01 + ; here x=0 +; lda Erase +; beq CharLoopi ; it works, because x=0 +; lda #$ff +; ldx #3 +;EmptyChar +; sta char1,x +; sta char2,x +; dex +; bpl EmptyChar + ldx #0 +CharLoopi4x4 + lda (xbyte),y + ora mask1,x + and char1,x + sta (xbyte),y + iny + lda (xbyte),y + ora mask2,x + and char2,x + sta (xbyte),y + dey + adw xbyte #screenBytes + inx + cpx #4 + bne CharLoopi4x4 +EndPut4x4 rts .endp diff --git a/scorch.xex b/scorch.xex index 7335a42dfb09efd5d76e0d6fcaaaee47007454cf..8fc802ddfd248ef60b7af0efa4676316f85a2769 100644 GIT binary patch delta 11709 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 th|puxReziN{wl36^J2`a$14^N_;1ggXt)3X