apple2_hgr_font_tutorial/asm/drawfont.s
2016-01-27 16:05:00 -08:00

131 lines
3.5 KiB
ArmAsm

__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: