diff --git a/asm/drawfont.bin b/asm/drawfont.bin new file mode 100644 index 0000000..ad6ffcb Binary files /dev/null and b/asm/drawfont.bin differ diff --git a/asm/drawfont.s b/asm/drawfont.s new file mode 100644 index 0000000..98ad651 --- /dev/null +++ b/asm/drawfont.s @@ -0,0 +1,130 @@ + __MAIN = $301 + .include "dos33.inc" + +; Listing 11 + + HgrLo = $E5 ; Low byte Pointer to screen destination + HgrHi = $E6 ; High byte Pointer to screen destination + String = $F0 + TmpLo = $F5 ; Low byte Working pointer to screen byte + TmpHi = $F6 ; High byte Working pointer to screen byte + TopHi = $FD + Font = $6000 + +; ORG $0301 ; Listing 8 +DrawHexByte: + PHA ; save low nibble + ROR ; shift high nibble + ROR ; to low nibble + ROR ; + ROR ; + JSR DrawHexNib ; print high nib in hex + PLA ; pritn low nib in hex +DrawHexNib: + AND #$F ; base 16 + TAX ; + LDA NIB2HEX,X ; nibble to ASCII +; ORG $0310 ; Listing 5 +DrawChar: + JMP DrawCharCol +; ORG $0313 ; Listing 9 +SetCursorRow: + LDA HgrLoY,X ; HgrLoY[ row ] + STA TmpLo + LDA HgrHiY,X ; HgrHiY[ row ] + CLC + ADC HgrHi + STA TmpHi + RTS +; ORG $0321 ; Listing 11 +SetCursorColRow: + STX TmpLo + LDA HgrLoY,Y ; HgrLoY[ row ] + CLC + ADC TmpLo ; add column + STA TmpLo + LDA HgrHiY,Y ; HgrHiY[ row ] + CLC ; \ could optimize this into + ADC HgrHi ; / single ORA HgrHi + STA TmpHi + RTS + NOP ; pad +; ORG $0335 ; Listing 6 +DrawCharColRow: + PHA + JSR SetCursorRow + PLA +; ORG $033A ; Listing 7 +DrawCharCol: ; A=%PQRstuvw + ROL ; C=P A=%QRstuvw? + ROL ; C=Q A=%Rstuvw?P + ROL ; C=R A=%stuvw?PQ + TAX ; X=%stuvw?PQ push glyph + AND #$F8 ; A=%stuvw000 + STA _LoadFont+1; AddressLo = (c*8) + TXA ; A=%stuvw?PQ pop glyph + AND #3 ; Optimization: s=0 implicit CLC ! + ROL ; C=s A=%00000PQR and 1 last ROL to get R + ADC #>Font ; += FontHi; Carry=0 since s=0 from above + STA _LoadFont+2; AddressHi = FontHi + (c/32) +; ORG $034C ; Listing 4a +_DrawChar1: + LDX TmpHi + STX TopHi +; ORG $0350 ; Listing 1 +_DrawChar: + LDX #0 +_LoadFont: ; A = font[ offset ] + LDA Font,X + STA (TmpLo),Y ; screen[col] = A + CLC + LDA TmpHi ; + ADC #4 ; screen += 0x400 + STA TmpHi + INX + CPX #8 + BNE _LoadFont +; ORG $0363 ; Listing 4a +IncCursorCol: + INY + LDX TopHi ; Move cursor back to top of scanline + STX TmpHi + RTS +; ORG $0369 ; Listing 10 +SetCursorColRowYX: + JSR SetCursorRow + CLC + TYA + ADC TmpLo + STA TmpLo + RTS +; ORG $037E ; Listing 12 +DrawString: + STY String+0 + STX String+1 + LDY #0 +_ds1: LDA (String),Y + BEQ _ds2 ; null byte? Done + JSR DrawChar ; or DrawCharCol for speed + CPY #40 ; col < 40? + BCC _ds1 +_ds2: RTS + + ; pad $0385 .. $38F + .res $390 - *, $00 + +; ORG $0390 ; Listing 8 +NIB2HEX: + .byte "0123456789ABCDEF" +; ORG $03A0 ; Listing 9a +HgrLoY: + .byte $00,$80,$00,$80,$00,$80,$00,$80 + .byte $28,$A8,$28,$A8,$28,$A8,$28,$A8 + .byte $50,$D0,$50,$D0,$50,$D0,$50,$D0 +HgrHiY: + .byte $00,$00,$01,$01,$02,$02,$03,$03 + .byte $00,$00,$01,$01,$02,$02,$03,$03 + .byte $00,$00,$01,$01,$02,$02,$03,$03 + +__END: +