mirror of
https://github.com/Michaelangel007/apple2_hgr_font_tutorial.git
synced 2024-11-17 18:04:51 +00:00
131 lines
3.5 KiB
ArmAsm
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:
|
|
|