Este es otro ejemplo de programación, en ensamblador en este caso, que contiene unas rutinas para la impresión de caracteres extra-grandes en pantalla:
Código: Seleccionar todo
rmb 1
; ----------------------------------------------------------
INITIALIZE:
leax CMD_COPY-*-3,pc
leau BASE_ADDR+1-*-3,pc
leay SUBCPU_CODE-*-3,pc
ldd #$C000 ; SubSystem RAM address to copy to
std 2,u
ldd #$37B ; Number of bytes to copy
copy_subcode_loop:
pshs a,b
lda ,y+ ; Get byte to copy
sta ,u ; Prepare to store it
bsr SET_COMMAND ; Invoke a SubSystem one-byte copy routine
bsr ENDS_SUBSYSTEM
ldd 2,u
addd #1
std 2,u ; Increments destination address
puls b,a
subd #1
bne copy_subcode_loop
rts
; ----------------------------------------------------------
PUT_BIGCHR:
leax CMD_PUTBIGCHR-*-3,pc
bsr SET_COMMAND
bra ENDS_SUBSYSTEM
SET_COMMAND:
pshs a,b,x,y,u
bsr SET_SUBSYSTEM
ldu #$FC8B ; Command area + $0B
ldb #$3F ; ? ; Maintenance command ($3F)
stb -9,u ; Sets command in $FC82
ldb ,x+
cmdbyte_loop:
lda ,x+
sta ,u+
decb
bne cmdbyte_loop
puls pc,u,y,x,b,a
SET_SUBSYSTEM:
pshs a
busy_wait:
lda SUBSIN ; Loads Subsystem Interface Register
bmi busy_wait ; Wait while Busy (bit 7 = 1)
orcc #$50 ; P ; Disable Interrupts
lda #$80 ; ?
sta SUBSIN ; Halts subsystem (bit 7 = 1)
ready_wait:
lda SUBSIN
bpl ready_wait ; Waits until Ready (bit 7 = 0)
puls pc,a
ENDS_SUBSYSTEM:
clr SUBSIN ; Set subsystem Ready
andcc #$AF ; ? ; Enable interrupts
rts
; ----------------------------------------------------------
CMD_PUTBIGCHR: fcb 9
fcb $93 ; ? ; Command $93 - JSR $C000
fcb $C0 ; ?
fcb 0
fcb $90 ; ? ; Command $90 - END
fcb $13 ; +0 $FC8F - $D38F
fcb $A ; +1 $FC90 - $D390
fcb 4 ; +2 $FC91 - $D391
fcb 0 ; +3
fcb 0 ; +4
CMD_COPY: fcb $A
fcb $93 ; ? ; Command $93 - JSR $D38F ($6071:BASE_ADDR)
fcb $D3 ; ?
fcb $8F ; ?
fcb $90 ; ? ; Command $90 - END
; ----------------------------------------------------------
BASE_ADDR:
lda #2 ; Template of byte to copy
sta word_C37B ; Template of destination address (initially $C000)
rts
; ----------------------------------------------------------
SUBCPU_CODE:
ldu #$D38F
ldb 2,u ; Loads char pattern
aslb ; pattern * 2
leay PATTERN_TABLE-*-4,pc
ldd b,y
leay d,y
ldx #0
lda #8
ldb 1,u
mul
lda #80
mul
leax d,x
ldb ,u ; Loads X coord
aslb
abx
ldd ,y++ ; Loads Width &Height of pattern
next_row:
pshs a,b,x
next_column:
clr 4,u
ldb ,y+
cmpb #8
bcs less_than_8
subb #8
inc 4,u
less_than_8:
stb 3,u
bsr PRINT_BIGCHR
leax 2,x
deca
bne next_column
puls x,b,a
leax 640,x
decb
bne next_row
rts
; ----------------------------------------------------------
PRINT_BIGCHR:
pshs a,b,x
bsr PRINT_BPLANE
leax $4000,x
bsr PRINT_BPLANE
leax $4000,x
bsr PRINT_BPLANE
puls pc,x,b,a
; End of function PRINT_BIGCHR
; ----------------------------------------------------------
PRINT_BPLANE:
lsr 3,u
bcs chk_solid_fill
clra
clrb
dmp_dat:
tst byte_D409 ; VRAM access flag
nop
std ,x ; +0
std 80,x ; +80
std 160,x ; +160
std 240,x
std 320,x
std 400,x
std 480,x
std 560,x
clr byte_D409
rts
; ----------------------------------------------------------
chk_solid_fill:
tst 4,u
bne shaded_fill
ldd #$FFFF
bra dmp_dat
; ----------------------------------------------------------
shaded_fill:
ldd #$AAAA ; shaded_fill
bra dmp_dat
; End of function PRINT_BPLANE
; ----------------------------------------------------------
PATTERN_TABLE: fdb $C
fdb $9E
fdb $19C
fdb $29A
fdb $2B5
fdb $2E8