MiniMemoryTester/src/misc.s

659 lines
24 KiB
ArmAsm

MenuCheckKeyColor jsr ColorizeMenu
lda _ticker
bne :skipDraw ; we want to avoid updating when nothing is happening... "Save the Cycles!!" ;)
jsr Menu_HighlightSelected
:skipDraw cmp #12
bne :skipUndraw
jsr Menu_UndrawSelectedAll
:skipUndraw cmp #16
bne :noReset
stz _ticker
jmp CheckKey ; Will RTS from CheckKey
:noReset inc _ticker
jmp CheckKey ; Will RTS from CheckKey
_ticker dw 0
CheckKey lda KEY
bpl :noKey
sta STROBE
sec
rts
:noKey clc
rts
ToLower cmp #"Z"
bcs :notUpper
cmp #"A"
bcc :notUpper
clc
adc #$20 ;add 32 to get lower char
:notUpper rts
mx %11
ColorizeMenu sei
XSCANLINE #$6;#$A0 ;lt grey
XSCANLINE #$7;#$C0 ;grn
XSCANLINE #$8;#$D0 ;yello
XSCANLINE #$A;#$90 ;orange
XSCANLINE #$B;#$10 ;red
XSCANLINE #$C;#$30 ;purple
XSCANLINE #$E;#$70 ;blue
XSCANLINE #$F;#$50 ;grey
XSCANLINE #$10;#$F0 ;white
cli
rts
* I think this still has latent issues with a desync'ed bit 0 (race condition)
XSCANLINE MAC
ldx #]2
:waitloop lda $c02f
asl
lda $c02e
rol
:val cmp #]1
bne :waitloop
stx $c022
<<<
VBlankForce
:vbl ldal $00c019
bmi :vbl
jmp VBlank
rts
VBlank
:vbl ldal $00c019
bpl :vbl
rts
WaitSCB sta :val+1
ldx #2 ; to check twice
:waitloop lda $c02f
asl
lda $c02e
rol
:val cmp #$00
bne :waitloop
dex
bne :waitloop
; the problem is we can get the LAST
; horizcnt even/odd right as it changes
; and start early or something?
rts
WaitSome ldy #$07
:loop lda #55
jsr WaitSCB
lda #198
jsr WaitSCB
dey
bne :loop
rts
Full16 MAC
clc
xce
rep #$30
<<<
ShortMX MAC
sep #$30
<<<
PushAll MAC
pha
phx
phy
<<<
PopAll MAC
ply
plx
pla
<<<
ColorAll MAC
lda #]1
sta $C022
and #$0F
sta $C034
<<<
Intro lda #$f5 ;gray
sta $c022
lda #$05
sta $c034
jsr WaitSome
lda #$0A
sta $c034
lda #$FA
sta $c022 ;lt gray
jsr WaitSome
ColorAll #$FF ;lt gray
jsr PrepDLR80Col
lda #$01
bit $c025 ; check shift key
beq :no_egg
:egg jsr DrawUMLogo
bra :skip
:no_egg jsr DrawMMTLogo
:skip jsr WaitSome ;just for VSYNC
jsr DL_SetDLRMode
sta MIXSET
jsr MakeUMSound ;play sounds
jsr Intro_WhiteMixText
sta $C00f
sta TXTPAGE1
jsr Clicky
PRINTXY #32;#20;Mesg_Ultimate0
jsr Clicky
PRINTXY #20;#21;Mesg_Ultimate1
jsr CheckKey ;
bcs :pauseover ;SKIP THE REST!
lda #$05
:longerwait pha
jsr WaitSome
pla
dec
bne :longerwait
lda #$AF
sta $c022 ;lt gray
jsr WaitSome
jsr WaitSome
lda #$5F
sta $c022 ;lt gray
jsr WaitSome
jsr WaitSome
lda #$0F
sta $c022 ;lt gray
jsr WaitSome
jsr WaitSome
jsr CheckKey ;
bcs :pauseover ;SKIP THE REST!
sta TXTPAGE2
GOXY #26;#23
ldx #$0
:prloop
lda Mesg_Programmed,x
beq :done
phx
jsr COUT
cmp #" "
bcc :invisible
jsr Clicky
:invisible
jsr VBlankForce
plx
jsr CheckKey ;
bcs :pauseover ;SKIP THE REST!
inx
bra :prloop
:done
ldx #$e0
:keyloop
jsr CheckKey ;
bcs :pauseover ;SKIP THE REST!
dex
beq :pauseover
phx
jsr VBlankForce
plx
jsr CheckKey
bcc :keyloop
:pauseover
sta TXTSET
lda #$00
sta $c034 ; black border
lda #$f0
sta $c022
rts
MAXGAP = #800
MAXLEN = #300
ErrorNoise
clc
xce
rep #$10
ldx #0
stx _shiftingGap2
ldx #MAXGAP
stx _shiftingGap
:loop
sta SPEAKER
ldx _shiftingGap
:pause1 dex
bne :pause1
sta SPEAKER
ldx _shiftingGap2
:pause2 dex
bne :pause2
ldx _shiftingGap
dex
beq :done
stx _shiftingGap
ldx _shiftingGap2
inx
cpx #MAXLEN
beq :done
stx _shiftingGap2
bra :loop
:done sec
xce
sep #$30
rts
_shiftingGap dw 0
_shiftingGap2 dw 0
Clicky ldx #$FE
:nox txy
nop
nop
nop
nop
sta SPEAKER
:noy dey
dey
dey
dey
dey
lda #2
:long nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
dec
bne :long
cpy #5
bcs :noy
dex
dex
cpx #$f0
bne :nox
ldx #$00
:wait inx
bne :wait
rts
MakeUMSound
:loops
ldy #$66
sty :fo+1
lda #$ff
:first ldx #$f9
:fo ldy #$86
sta $C030
:quick dex
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bne :quick
sta $C030
:l2 dey
nop
nop
nop
nop
nop
nop
bne :l2
dec
inc :fo+1
inc :fo+1
bne :first
rts
*Mesg_Testchars asc $1b,'Uu ',"Uu ",$18,'Uu ',"Uu ",00
Mesg_Ultimate0 asc $18, "an Apple IIgs",00
Mesg_Ultimate1 asc $18, "Memory Expansion (RAM) Card Test Utility",00
Mesg_Programmed asc $18, " Programmed by Dagen Brock",00
Intro_WhiteMixText lda #" "
sta TXTPAGE1
ldy #2 ;loop checker
:pageloop ldx #0
:loop sta Lo21,x
sta Lo22,x
sta Lo23,x
sta Lo24,x
inx
cpx #40
bne :loop
sta TXTPAGE2
dey
bne :pageloop
rts
* To allow us to uncompress to 80col text before turning on DLR (I hope)
PrepDLR80Col
lda CLRAN3 ;enables DLR
sta SET80VID
sta C80STOREON ; enable aux/page1,2 mapping
LDA #$A0 ;USE A BLANK SPACE TO
JSR $C300 ;TURN ON THE VIDEO FIRMWARE
rts
DL_SetDLRMode
lda LORES ;set lores
sta TXTCLR
lda CLRAN3 ;enables DLR
sta SET80VID
sta C80STOREON ; enable aux/page1,2 mapping
sta MIXCLR ;make sure graphics-only mode
rts
DrawUMLogo
lda #<UMLOGOLOW_MAINRLE
sta $2
lda #>UMLOGOLOW_MAINRLE
sta $3
sta TXTPAGE1
jsr DKUnpackRLEToLoRes
lda #<UMLOGOLOW_AUXRLE
sta $2
lda #>UMLOGOLOW_AUXRLE
sta $3
sta TXTPAGE2
jsr DKUnpackRLEToLoRes
rts
DrawMMTLogo
lda #<MMT_MAINRLE
sta $2
lda #>MMT_MAINRLE
sta $3
sta TXTPAGE1
jsr DKUnpackRLEToLoRes
lda #<MMT_AUXRLE
sta $2
lda #>MMT_AUXRLE
sta $3
sta TXTPAGE2
jsr DKUnpackRLEToLoRes
rts
* MAIN ... Size RAW 800 -> Compressed RLE 306 (38.25%)
UMLOGOLOW_MAINRLE
hex 2EFF05CA04FF0FCA02AF0EFF05CC04FF
hex 11CC81AF0DFF05CC04FF12CC815F0CFF
hex 05DD04FF12DD81550CFF05DD04FF05DD
hex 02AD05DD81AD05DD81550CFF05DD04FF
hex 05DD82FFAA05DD82FFAA04DD81550CFF
hex 059904FF059982FFAA059982FFAA0499
hex 81550CFF059904FF059982FFAA059982
hex FFAA049981550CFF059904FF059982FF
hex AA059982FFAA049981550CFF051104FF
hex 051182FFAA051182FFAA041181550CFF
hex 051104FF051182FFAA051182FFAA0411
hex 81550CFF051104FF051182FFAA051182
hex FFAA041181550CFF053304AF053382FF
hex AA053382FFAA043381550CFF0E3382FF
hex AA053382FFAA043381550CFF0E3382FF
hex AA053382FFAA043381550CFF81FA0D77
hex 82FFAA057782FFAA047781550DFF81FA
hex 0C7782FFAA057782FFAA047781550EFF
hex 81FA0B5782FFAA055782FFAA04578155
hex 2EFF
* AUX ... Size RAW 800 -> Compressed RLE 358 (44.75%)
UMLOGOLOW_AUXRLE
hex 2EFF8155046581A503FF81550F65815F
hex 0EFF8155046681AA03FF815510668165
hex 0DFF8155046681AA03FF815511668165
hex 0CFF815504EE81AA03FF815512EE0CFF
hex 815504EE81AA03FF815505EE815E05EE
hex 025E05EE0CFF815504EE81AA03FF8155
hex 04EE82AAFF05EE82AAFF05EE0CFF8155
hex 04CC81AA03FF815504CC82AAFF05CC82
hex AAFF05CC0CFF815504CC81AA03FF8155
hex 04CC82AAFF05CC82AAFF05CC0CFF8155
hex 04CC81AA03FF815504CC82AAFF05CC82
hex AAFF05CC0CFF8155048881AA03FF8155
hex 048882AAFF058882AAFF05880CFF8155
hex 048881AA03FF8155048882AAFF058882
hex AAFF05880CFF8155048881AA03FF8155
hex 048882AAFF058882AAFF05880CFF8155
hex 0499819A035F8195049982AAFF059982
hex AAFF05990CFF81550D9982AAFF059982
hex AAFF05990CFF81550D9982AAFF059982
hex AAFF05990DFF815B0CBB82AAFF05BB82
hex AAFF05BB0EFF815B0BBB82AAFF05BB82
hex AAFF05BB0FFF81FA0AAB82AAFF05AB82
hex AAFF05AB2EFF
* MAIN ... Size RAW 800 -> Compressed RLE 508 (63.50%)
MMT_MAINRLE
hex 06FF85AAAFFFAFAA02FF85AAAFFFAFAA
hex 02FF85AAAFFFAFAA02FF85AAAFFFAFAA
hex 0EFF02AA81FF02AA02FF02AA81FF02AA
hex 02FF02AA81FF02AA02FF02AA81FF02AA
hex 0EFF02AA81FF02AA02FF02AA81FF02AA
hex 02FF02AA81FF02AA02FF02AA81FF02AA
hex 0BFF81AF020F0205810F0205020F0205
hex 810F0205020F0205810F0205020F0205
hex 810F0205040F07FF210007FF210007FF
hex 070084EECE44E002CE8500EECE44E002
hex CE8200EE05CE060007FF8150060081EE
hex 02CC81EE02CC8200EE02CC81EE02CC87
hex 00EECC4CCC4CCC060007FF8155060094
hex EECCECCCC4CC00EECCECCCE4CC000C04
hex EECC0004060007FF025505008DEECC4E
hex 4CEECC00EECC4E4CEECC030082EECC08
hex 0007FF825505050082EECC020085EECC
hex 00EECC020082EECC030082EECC080007
hex FF8155060082EECC020085EECC00EECC
hex 020082EECC030082EECC080007FF0700
hex 82EECC020085EECC00EECC020082EECC
hex 030082EECC080007FF070082CE4C0200
hex 85CE4C00CE4C020082CE4C030082CE4C
hex 080007FF210007FF21500AFF02A581FF
hex 02A502FF02A581FF02A502FF02A581FF
hex 02A502FF02A581FF02A50EFF02AA81FF
hex 02AA02FF02AA81FF02AA02FF02AA81FF
hex 02AA02FF02AA81FF02AA0EFF02AA81FF
hex 02AA02FF02AA81FF02AA02FF02AA81FF
hex 02AA02FF02AA81FF02AA0EFF81FA03FF
hex 81FA02FF81FA03FF81FA02FF81FA03FF
hex 81FA02FF81FA03FF81FA08FF
* AUX ... Size RAW 800 -> Compressed RLE 510 (63.75%)
MMT_AUXRLE
hex 06FF825F5502FF85555FFF5F5502FF85
hex 555FFF5F5502FF85555FFF5F5502FF82
hex 555F0DFF025502FF025581FF025502FF
hex 025581FF025502FF025581FF025502FF
hex 02550DFF025502FF025581FF025502FF
hex 025581FF025502FF025581FF025502FF
hex 02550AFF030F020A020F020A810F020A
hex 020F020A810F020A020F020A810F020A
hex 020F020A040F06FF220006FF220006FF
hex 08000267850077672600026785007767
hex 260005678126060006FF81A007000266
hex 81220266822200026681220266882200
hex 662666266622060006FF02AA06008E66
hex 22662666220066226626662200020282
hex 66220202060006FF02AA06008D662226
hex 22662200662226226622030082662208
hex 0006FF02AA0600826622020085662200
hex 662202008266220300826622080006FF
hex 82AA0A06008266220200856622006622
hex 02008266220300826622080006FF0800
hex 82662202008566220066220200826622
hex 0300826622080006FF08008226220200
hex 85262200262202008226220300822622
hex 080006FF220006FF21A0810009FF025A
hex 02FF025A81FF025A02FF025A81FF025A
hex 02FF025A81FF025A02FF025A0DFF0255
hex 02FF025581FF025502FF025581FF0255
hex 02FF025581FF025502FF02550DFF0255
hex 02FF025581FF025502FF025581FF0255
hex 02FF025581FF025502FF02550EFF81F5
hex 02FF81F503FF81F502FF81F503FF81F5
hex 02FF81F503FF81F502FF81F508FF
*** DK! DLR Kit *********
* DKUnpackRLEToLoRes
* Word ($2) = Address of pack data
* Expects you to have already set main or aux
DKUnpackRLEToLoRes
lda #0
sta _line
tay
lda LoLineTable,y
sta $0
lda LoLineTable+1,y
sta $1
_getUnpackCommand ldx #$0
lda ($2,x)
bmi :uncoded
:repeat sta _repeat
inc $2 ;\
bne :noroll ; >-- increment pack data ptr
inc $3 ;/
:noroll lda ($2,x) ; get color value
ldx _repeat ; x=repeat count
:repeatLoop sta ($0),y ; write to screen
iny
cpy #40
bne :notEOL
pha
inc _line
lda _line
cmp #24
bne :notDoneLines
pla
rts ; DONE? this might be impossible
:notDoneLines asl
tay
lda LoLineTable,y
sta $0
lda LoLineTable+1,y
sta $1
ldy #0
pla ;restore a
:notEOL dex
bne :repeatLoop
inc $2
beq :roll
jmp _getUnpackCommand
:roll inc $3
jmp _getUnpackCommand
:uncoded and #$7f ;strip high bit
sta _repeat ; re-use repeat for uncoded count
:repeatLoop2
inc $2
bne :noroll2
inc $3
:noroll2 lda ($2,x) ; get color value
sta ($0),y ; write to screen
iny
cpy #40
bne :notEOL2
pha
inc _line
lda _line
cmp #24
bne :notDoneLines2
pla
rts ; DONE? this might be impossible
:notDoneLines2 asl
tay
lda LoLineTable,y
sta $0
lda LoLineTable+1,y
sta $1
ldy #0
pla ;restore a
:notEOL2 dec _repeat
bne :repeatLoop2
inc $2
beq :roll2
jmp _getUnpackCommand
:roll2 inc $3
jmp _getUnpackCommand
_repeat db 0
_line db 0
LoLineTable da Lo01,Lo02,Lo03,Lo04,Lo05,Lo06
da Lo07,Lo08,Lo09,Lo10,Lo11,Lo12
da Lo13,Lo14,Lo15,Lo16,Lo17,Lo18
da Lo19,Lo20,Lo21,Lo22,Lo23,Lo24
** Here we split the table for an optimization
** We can directly get our line numbers now
** Without using ASL
LoLineTableH db >Lo01,>Lo02,>Lo03,>Lo04,>Lo05,>Lo06
db >Lo07,>Lo08,>Lo09,>Lo10,>Lo11,>Lo12
db >Lo13,>Lo14,>Lo15,>Lo16,>Lo17,>Lo18
db >Lo19,>Lo20,>Lo21,>Lo22,>Lo23,>Lo24
LoLineTableL db <Lo01,<Lo02,<Lo03,<Lo04,<Lo05,<Lo06
db <Lo07,<Lo08,<Lo09,<Lo10,<Lo11,<Lo12
db <Lo13,<Lo14,<Lo15,<Lo16,<Lo17,<Lo18
db <Lo19,<Lo20,<Lo21,<Lo22,<Lo23,<Lo24