2015-02-24 04:38:37 +00:00
|
|
|
****************************************
|
2015-02-24 21:05:03 +00:00
|
|
|
* MemoryTester *
|
2015-02-24 04:38:37 +00:00
|
|
|
* *
|
|
|
|
* Dagen Brock <dagenbrock@gmail.com> *
|
2015-02-24 21:05:03 +00:00
|
|
|
* 2015-02-23 *
|
2015-02-24 04:38:37 +00:00
|
|
|
****************************************
|
|
|
|
|
|
|
|
org $2000 ; start at $2000 (all ProDOS8 system files)
|
|
|
|
typ $ff ; set P8 type ($ff = "SYS") for output file
|
2015-02-24 21:05:03 +00:00
|
|
|
dsk mtsystem ; tell compiler what name for output file
|
|
|
|
put applerom
|
|
|
|
|
2015-02-24 04:38:37 +00:00
|
|
|
MLI equ $bf00
|
2015-03-04 20:21:36 +00:00
|
|
|
Init
|
|
|
|
LDA #$A0 ;USE A BLANK SPACE TO
|
|
|
|
JSR $C300 ;TURN ON THE VIDEO FIRMWARE
|
2015-02-24 04:38:37 +00:00
|
|
|
|
2015-03-04 20:21:36 +00:00
|
|
|
lda $C034 ; save border color
|
|
|
|
sta BorderColor
|
|
|
|
|
|
|
|
Main
|
|
|
|
:menuLoop jsr Menu_Draw
|
|
|
|
:menuNoDrawLoop jsr Menu_UndrawSelected
|
2015-03-02 15:01:02 +00:00
|
|
|
jsr Menu_DrawSelected
|
2015-02-24 21:05:03 +00:00
|
|
|
jsr WaitKey
|
2015-03-02 15:01:02 +00:00
|
|
|
cmp #$8D ; ENTER
|
|
|
|
bne :check1
|
|
|
|
:enter jsr Menu_HandleSelection
|
|
|
|
bra :menuLoop
|
|
|
|
|
|
|
|
:check1 cmp #$8B ; UP
|
|
|
|
bne :check2
|
|
|
|
jsr Menu_PrevItem
|
2015-03-04 20:21:36 +00:00
|
|
|
bra :menuNoDrawLoop
|
2015-03-02 15:01:02 +00:00
|
|
|
|
|
|
|
:check2 cmp #$8A ; DOWN
|
|
|
|
bne :noKey
|
|
|
|
jsr Menu_NextItem
|
2015-03-04 20:21:36 +00:00
|
|
|
bra :menuNoDrawLoop
|
2015-03-02 15:01:02 +00:00
|
|
|
|
|
|
|
:noKey bra :menuLoop
|
|
|
|
* LOOOOOOOOOP ^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-02-24 04:38:37 +00:00
|
|
|
|
|
|
|
|
2015-03-02 05:09:20 +00:00
|
|
|
|
|
|
|
|
2015-02-24 04:38:37 +00:00
|
|
|
Quit jsr MLI ; first actual command, call ProDOS vector
|
|
|
|
dfb $65 ; with "quit" request ($65)
|
|
|
|
da QuitParm
|
|
|
|
bcs Error
|
|
|
|
brk $00 ; shouldn't ever here!
|
|
|
|
|
|
|
|
QuitParm dfb 4 ; number of parameters
|
|
|
|
dfb 0 ; standard quit type
|
|
|
|
da $0000 ; not needed when using standard quit
|
|
|
|
dfb 0 ; not used
|
|
|
|
da $0000 ; not used
|
|
|
|
|
|
|
|
|
|
|
|
Error brk $00 ; shouldn't be here either
|
2015-02-26 16:04:10 +00:00
|
|
|
|
|
|
|
* Pass desired length in A
|
|
|
|
GetHex sta _gethex_maxlen
|
2015-03-01 19:44:56 +00:00
|
|
|
stx _gethex_resultptr
|
|
|
|
sty _gethex_resultptr+1
|
|
|
|
stz _gethex_current
|
|
|
|
|
2015-02-26 16:04:10 +00:00
|
|
|
:input jsr RDKEY
|
2015-03-04 20:21:36 +00:00
|
|
|
cmp #$9B ;esc = abort
|
|
|
|
bne :notesc
|
|
|
|
rts
|
|
|
|
:notesc cmp #"9"+1
|
2015-02-26 16:04:10 +00:00
|
|
|
bcs :notNum ;bge > 9
|
|
|
|
cmp #"0"
|
|
|
|
bcc :badChar ;
|
|
|
|
sec
|
|
|
|
sbc #"0"
|
2015-03-01 19:44:56 +00:00
|
|
|
bra :storeInput
|
2015-02-26 16:04:10 +00:00
|
|
|
:notNum cmp #"a"
|
|
|
|
bcc :notLower
|
|
|
|
sec
|
|
|
|
sbc #$20 ; ToUpper
|
|
|
|
:notLower cmp #"A"
|
|
|
|
bcc :badChar
|
|
|
|
cmp #"F"+1
|
|
|
|
bcs :badChar
|
2015-03-01 19:44:56 +00:00
|
|
|
:gotHex
|
|
|
|
sec
|
|
|
|
sbc #"A"-10
|
2015-03-03 00:27:37 +00:00
|
|
|
:storeInput
|
|
|
|
pha
|
2015-03-01 19:44:56 +00:00
|
|
|
jsr PRHEX
|
2015-03-03 00:27:37 +00:00
|
|
|
pla
|
2015-03-01 19:44:56 +00:00
|
|
|
ldy _gethex_current
|
|
|
|
sta _gethex_buffer,y
|
|
|
|
iny
|
|
|
|
cpy #_gethex_internalmax
|
|
|
|
bge :internalmax
|
|
|
|
cpy _gethex_maxlen
|
|
|
|
bge :passedmax
|
|
|
|
sty _gethex_current
|
|
|
|
bra :input
|
|
|
|
:internalmax
|
2015-03-03 00:27:37 +00:00
|
|
|
:passedmax
|
2015-03-01 19:44:56 +00:00
|
|
|
lda _gethex_resultptr
|
|
|
|
sta $0
|
|
|
|
lda _gethex_resultptr+1
|
|
|
|
sta $1
|
|
|
|
ldx #0
|
|
|
|
ldy #0
|
|
|
|
:copyBuffer lda _gethex_buffer,x
|
|
|
|
asl ; move to upper nibble
|
|
|
|
asl
|
|
|
|
asl
|
|
|
|
asl
|
|
|
|
sta ($0),y ; store
|
|
|
|
inx
|
|
|
|
lda _gethex_buffer,x
|
|
|
|
ora ($0),y
|
|
|
|
sta ($0),y
|
|
|
|
iny
|
|
|
|
inx
|
|
|
|
cpx _gethex_maxlen
|
|
|
|
bcc :copyBuffer
|
2015-02-26 16:04:10 +00:00
|
|
|
rts
|
|
|
|
|
|
|
|
:badChar bra :input
|
|
|
|
|
2015-03-01 19:44:56 +00:00
|
|
|
_gethex_internalmax equ 8
|
|
|
|
_gethex_resultptr da 0000
|
2015-02-26 16:04:10 +00:00
|
|
|
_gethex_maxlen db 1
|
2015-03-01 19:44:56 +00:00
|
|
|
_gethex_current db 0
|
|
|
|
_gethex_buffer ds _gethex_internalmax
|
|
|
|
PrHexChar jsr HexCharForByte
|
|
|
|
|
|
|
|
HexCharForByte
|
|
|
|
cmp #9
|
|
|
|
bcs :alpha
|
|
|
|
:number clc
|
|
|
|
adc #"0"
|
|
|
|
rts
|
|
|
|
:alpha clc
|
|
|
|
adc #"A"
|
|
|
|
rts
|
2015-02-26 16:04:10 +00:00
|
|
|
|
2015-02-24 21:05:03 +00:00
|
|
|
|
2015-03-02 15:01:02 +00:00
|
|
|
Menu_Draw jsr HOME
|
2015-03-01 19:44:56 +00:00
|
|
|
lda #MainMenuStrs
|
|
|
|
ldy #>MainMenuStrs
|
2015-03-04 20:21:36 +00:00
|
|
|
ldx #00 ; horiz pos
|
2015-02-24 21:05:03 +00:00
|
|
|
jsr PrintStringsX
|
2015-03-01 19:44:56 +00:00
|
|
|
lda #MainMenuDefs
|
|
|
|
ldy #>MainMenuDefs
|
2015-03-02 15:01:02 +00:00
|
|
|
jsr Menu_DrawOptions
|
2015-02-24 21:05:03 +00:00
|
|
|
rts
|
|
|
|
|
2015-03-03 00:27:37 +00:00
|
|
|
BeginTest stz _testIteration
|
|
|
|
stz _testIteration+1
|
2015-03-04 20:21:36 +00:00
|
|
|
ldx #40
|
|
|
|
ldy #07
|
|
|
|
lda #5
|
|
|
|
jsr PrintBox30
|
|
|
|
BeginTestPass PRINTXY #44;#08;Mesg_TestPass
|
|
|
|
inc _testIteration
|
|
|
|
bne :noroll
|
|
|
|
inc _testIteration+1
|
|
|
|
:noroll lda _testIteration+1
|
|
|
|
jsr PRBYTE
|
|
|
|
lda _testIteration
|
|
|
|
jsr PRBYTE
|
|
|
|
PRINTXY #44;#10;Mesg_Writing
|
2015-03-03 00:27:37 +00:00
|
|
|
|
|
|
|
clc ; WRITE START
|
|
|
|
xce
|
|
|
|
rep $10 ; long x, short a
|
|
|
|
lda StartBank
|
|
|
|
sta CurBank
|
|
|
|
ldy #0 ; update interval counter
|
|
|
|
:bankloop lda CurBank
|
|
|
|
sta :bankstore+3
|
|
|
|
ldx StartAddr
|
|
|
|
lda TestValue
|
|
|
|
:bankstore stal $000000,x
|
|
|
|
cpx EndAddr
|
|
|
|
beq :donebank
|
|
|
|
inx
|
|
|
|
iny
|
|
|
|
cpy #UpdateScanInterval
|
|
|
|
bcc :bankstore
|
|
|
|
jsr PrintTestCurrent
|
|
|
|
ldy #0
|
|
|
|
bra :bankstore
|
|
|
|
:donebank
|
|
|
|
ldy #0 ; because i'm anal.. this makes counter align
|
|
|
|
inc CurBank
|
|
|
|
lda EndBank
|
|
|
|
cmp CurBank
|
|
|
|
bcs :bankloop
|
2015-03-04 20:21:36 +00:00
|
|
|
dec CurBank ; so many bad hacks
|
2015-03-03 00:27:37 +00:00
|
|
|
jsr PrintTestCurrent ; print final score ;)
|
|
|
|
sep $10
|
|
|
|
sec
|
|
|
|
xce ; WRITE END
|
2015-03-04 20:21:36 +00:00
|
|
|
|
|
|
|
jsr Pauser ; PAUSE
|
|
|
|
|
|
|
|
PRINTXY #44;#10;Mesg_Reading ; READ PREP
|
|
|
|
|
|
|
|
clc ; READ START
|
|
|
|
xce
|
|
|
|
rep $10 ; long x, short a
|
|
|
|
lda StartBank
|
|
|
|
sta CurBank
|
|
|
|
ldy #0 ; update interval counter
|
|
|
|
:bankrloop lda CurBank
|
|
|
|
sta :bankread+3
|
|
|
|
ldx StartAddr
|
|
|
|
:bankread ldal $000000,x
|
|
|
|
cmp TestValue
|
|
|
|
beq :testpass
|
|
|
|
phx
|
|
|
|
sta _stash ; = read value
|
|
|
|
lda TestValue
|
|
|
|
sta _stash+1 ; = expected value
|
|
|
|
stx _stash+2
|
|
|
|
jsr PrintTestError ; addr in X
|
|
|
|
plx
|
|
|
|
:testpass cpx EndAddr
|
|
|
|
beq :donerbank
|
|
|
|
inx
|
|
|
|
iny
|
|
|
|
cpy #UpdateScanInterval
|
|
|
|
bcc :bankread
|
|
|
|
jsr PrintTestCurrent
|
|
|
|
ldy #0
|
|
|
|
bra :bankread
|
|
|
|
:donerbank
|
|
|
|
ldy #0 ; because i'm anal.. this makes counter align
|
|
|
|
inc CurBank
|
|
|
|
lda EndBank
|
|
|
|
cmp CurBank
|
|
|
|
bcs :bankrloop
|
|
|
|
dec CurBank ; so many bad hacks
|
|
|
|
jsr PrintTestCurrent ; print final score ;)
|
|
|
|
sep $10
|
|
|
|
sec
|
|
|
|
xce ; WRITE END
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:kloop lda KEY
|
|
|
|
bmi :gotOne
|
|
|
|
jsr Pauser ; PAUSE
|
|
|
|
jmp BeginTestPass
|
|
|
|
:gotOne sta STROBE
|
|
|
|
cmp #"b" ; REMOVE DEBUG
|
|
|
|
bne :nobreak
|
|
|
|
brk $75
|
|
|
|
:nobreak
|
|
|
|
lda BorderColor
|
|
|
|
sta $C034
|
2015-03-03 00:27:37 +00:00
|
|
|
rts
|
2015-03-04 20:21:36 +00:00
|
|
|
|
2015-03-03 00:27:37 +00:00
|
|
|
_testIteration ds 8
|
2015-03-04 20:21:36 +00:00
|
|
|
UpdateScanInterval equ #$3000
|
|
|
|
Mesg_Waiting asc "Waiting: ",00
|
2015-03-03 00:27:37 +00:00
|
|
|
Mesg_Writing asc "Writing: ",00
|
2015-03-04 20:21:36 +00:00
|
|
|
Mesg_Reading asc "Reading: ",00
|
|
|
|
Mesg_Error1 asc " Error at: $",00
|
|
|
|
Mesg_Error2 asc " Expected: $ %",$00
|
|
|
|
Mesg_Error3 asc " Read: $ %",$00
|
|
|
|
Mesg_TestPass asc " Pass: ",00
|
|
|
|
Mesg_Blank asc " ",00
|
|
|
|
Mesg_BoxTop30 asc $1B,'ZLLLLLLLLLLLLLLLLLLLLLLLLLLLL_',$18,$8D,00
|
|
|
|
Mesg_BoxMid30 asc $1B,'Z'," ",'_',$18,$8D,$00
|
|
|
|
Mesg_BoxBot30 asc $1B,'Z',"____________________________",'_',$18,$8D,$00
|
|
|
|
|
|
|
|
* x, y, a=height
|
|
|
|
PrintBox30 stx _prbox_x
|
|
|
|
sta _prbox_height
|
|
|
|
jsr GoXY
|
|
|
|
lda #Mesg_BoxTop30
|
|
|
|
ldy #>Mesg_BoxTop30
|
|
|
|
jsr PrintString
|
|
|
|
:midloop ldx _prbox_x
|
|
|
|
stx $24
|
|
|
|
lda #Mesg_BoxMid30
|
|
|
|
ldy #>Mesg_BoxMid30
|
|
|
|
jsr PrintString
|
|
|
|
dec _prbox_height
|
|
|
|
bne :midloop
|
|
|
|
|
|
|
|
ldx _prbox_x
|
|
|
|
stx $24
|
|
|
|
lda #Mesg_BoxBot30
|
|
|
|
ldy #>Mesg_BoxBot30
|
|
|
|
jsr PrintString
|
|
|
|
rts
|
|
|
|
_prbox_x db 0
|
|
|
|
_prbox_height db 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PrintTestError
|
|
|
|
sec
|
|
|
|
xce
|
|
|
|
ldx #42
|
|
|
|
ldy #13
|
|
|
|
lda #4
|
|
|
|
jsr PrintBox30
|
|
|
|
PRINTXY #45;#14;#Mesg_Error1
|
|
|
|
PRINTXY #45;#16;#Mesg_Error2
|
|
|
|
PRINTXY #45;#17;#Mesg_Error3
|
|
|
|
GOXY #57;#14
|
|
|
|
lda CurBank
|
|
|
|
jsr PRBYTE
|
|
|
|
lda #"/"
|
|
|
|
jsr COUT
|
|
|
|
lda _stash+3
|
|
|
|
jsr PRBYTE
|
|
|
|
lda _stash+2
|
|
|
|
jsr PRBYTE
|
|
|
|
GOXY #57;#16
|
|
|
|
lda _stash+1
|
|
|
|
jsr PRBYTE
|
|
|
|
GOXY #61;#16
|
|
|
|
lda _stash+1
|
|
|
|
jsr PRBIN
|
|
|
|
GOXY #57;#17
|
|
|
|
lda _stash
|
|
|
|
jsr PRBYTE
|
|
|
|
GOXY #61;#17
|
|
|
|
lda _stash
|
|
|
|
jsr PRBIN
|
|
|
|
GOXY #66;#14
|
|
|
|
jsr RDKEY
|
|
|
|
|
|
|
|
clc
|
|
|
|
xce
|
|
|
|
rep $10
|
|
|
|
rts
|
2015-03-03 00:27:37 +00:00
|
|
|
mx %01
|
|
|
|
PrintTestCurrent pha
|
|
|
|
phy
|
|
|
|
stx _stash ; save real X
|
|
|
|
sec
|
|
|
|
xce
|
2015-03-04 20:21:36 +00:00
|
|
|
GOXY #54;#10
|
2015-03-03 00:27:37 +00:00
|
|
|
lda CurBank
|
2015-03-04 20:21:36 +00:00
|
|
|
sta :corruptme+3
|
2015-03-03 00:27:37 +00:00
|
|
|
jsr PRBYTE
|
|
|
|
lda #"/"
|
|
|
|
jsr COUT
|
|
|
|
lda _stash+1
|
2015-03-04 20:21:36 +00:00
|
|
|
sta :corruptme+2
|
2015-03-03 00:27:37 +00:00
|
|
|
jsr PRBYTE
|
|
|
|
lda _stash
|
2015-03-04 20:21:36 +00:00
|
|
|
sta :corruptme+1
|
2015-03-03 00:27:37 +00:00
|
|
|
jsr PRBYTE
|
2015-03-04 20:21:36 +00:00
|
|
|
* CORRUPTOR!
|
|
|
|
:kloop lda KEY
|
|
|
|
cmp #"c" ; REMOVE DEBUG
|
|
|
|
bne :nocorrupt
|
|
|
|
jsr GetRandTrash
|
|
|
|
:corruptme stal $060000
|
|
|
|
inc $c034
|
|
|
|
sta STROBE ; we only clear if 'c' is hit
|
|
|
|
inc _stash ; \
|
|
|
|
beq :noroll ; |- INX
|
|
|
|
inc _stash+1 ; /
|
|
|
|
:noroll
|
|
|
|
:nocorrupt
|
2015-03-03 00:27:37 +00:00
|
|
|
|
|
|
|
clc
|
|
|
|
xce
|
|
|
|
rep $10
|
|
|
|
ldx _stash
|
|
|
|
ply
|
|
|
|
pla
|
|
|
|
rts
|
|
|
|
mx %11
|
2015-03-04 20:21:36 +00:00
|
|
|
PRBIN pha
|
|
|
|
phx
|
|
|
|
ldx #8
|
|
|
|
:loop asl
|
|
|
|
pha
|
|
|
|
bcc :zero
|
|
|
|
:one lda #"1"
|
|
|
|
jsr COUT
|
|
|
|
bra :ok
|
|
|
|
:zero lda #"0"
|
|
|
|
jsr COUT
|
|
|
|
:ok pla
|
|
|
|
dex
|
|
|
|
bne :loop
|
|
|
|
plx
|
|
|
|
pla
|
|
|
|
rts
|
2015-03-03 00:27:37 +00:00
|
|
|
|
2015-03-04 20:21:36 +00:00
|
|
|
Pauser
|
|
|
|
PRINTXY #44;#11;Mesg_Waiting
|
|
|
|
ldy #60
|
|
|
|
ldx TestDelay
|
|
|
|
jsr PrintTimerVal ; inaugural print before waiting 1 sec
|
|
|
|
:secondloop
|
|
|
|
:wait ldal $e1c019
|
|
|
|
bpl :wait
|
|
|
|
:wait2 ldal $e1c019
|
|
|
|
bmi :wait2
|
|
|
|
dey
|
|
|
|
bne :secondloop
|
|
|
|
dex
|
|
|
|
beq :donepause
|
|
|
|
jsr PrintTimerVal
|
|
|
|
ldy #60
|
|
|
|
bra :secondloop
|
|
|
|
:donepause
|
|
|
|
PRINTXY #44;#11;Mesg_Blank
|
|
|
|
rts
|
|
|
|
PrintTimerVal
|
|
|
|
phx
|
|
|
|
phy
|
|
|
|
txa
|
|
|
|
GOXY #54;#11
|
|
|
|
ply
|
|
|
|
plx
|
|
|
|
txa
|
|
|
|
jsr PRBYTE
|
|
|
|
rts
|
2015-02-24 21:05:03 +00:00
|
|
|
|
2015-03-04 20:21:36 +00:00
|
|
|
**************************************************
|
|
|
|
* Awesome PRNG thx to White Flame (aka David Holz)
|
|
|
|
**************************************************
|
|
|
|
GetRandTrash ; USE ONLY WITH CORRUPTOR
|
|
|
|
lda _randomTrashByte
|
|
|
|
beq :doEor
|
|
|
|
asl
|
|
|
|
bcc :noEor
|
|
|
|
:doEor eor #$1d
|
|
|
|
:noEor sta _randomTrashByte
|
|
|
|
rts
|
|
|
|
_randomTrashByte db 0
|
2015-02-24 21:05:03 +00:00
|
|
|
|
2015-03-01 19:44:56 +00:00
|
|
|
* DEFAULTS
|
2015-03-03 00:27:37 +00:00
|
|
|
StartBank db #$06
|
2015-03-04 20:21:36 +00:00
|
|
|
EndBank db #$1F
|
2015-03-03 00:27:37 +00:00
|
|
|
CurBank db #0
|
2015-03-01 19:44:56 +00:00
|
|
|
StartAddr dw #$0000
|
|
|
|
EndAddr dw #$FFFF
|
|
|
|
TestValue dw #$00
|
2015-03-04 20:21:36 +00:00
|
|
|
TestDelay dw #$03
|
2015-03-01 19:44:56 +00:00
|
|
|
|
2015-03-02 15:01:02 +00:00
|
|
|
Menu_DrawOptions sta $0
|
2015-02-24 21:05:03 +00:00
|
|
|
sty $1
|
2015-03-01 19:44:56 +00:00
|
|
|
stz _menuOptionPtr
|
|
|
|
:drawOption
|
|
|
|
ldy _menuOptionPtr
|
|
|
|
lda ($0),y
|
2015-03-01 21:52:40 +00:00
|
|
|
beq :menuDone
|
2015-03-01 19:44:56 +00:00
|
|
|
tax
|
2015-03-01 21:52:40 +00:00
|
|
|
iny
|
2015-03-01 19:44:56 +00:00
|
|
|
lda ($0),y
|
|
|
|
tay
|
|
|
|
jsr GoXY
|
|
|
|
ldy _menuOptionPtr
|
|
|
|
iny
|
|
|
|
iny
|
2015-02-24 21:05:03 +00:00
|
|
|
lda ($0),y
|
2015-03-01 19:44:56 +00:00
|
|
|
beq :charItem
|
|
|
|
cmp #1
|
|
|
|
beq :hexItem
|
|
|
|
cmp #2
|
|
|
|
beq :jsrItem
|
2015-03-02 05:09:20 +00:00
|
|
|
:charItem
|
2015-03-01 21:52:40 +00:00
|
|
|
:hexItem iny
|
|
|
|
lda ($0),y ; get len
|
|
|
|
sta _menuHexIdx
|
|
|
|
iny
|
|
|
|
lda ($0),y ; get da
|
|
|
|
sta $2 ; storez
|
|
|
|
iny
|
|
|
|
lda ($0),y ; get da
|
|
|
|
sta $3 ; storez
|
|
|
|
ldy #0
|
|
|
|
:prloop lda ($2),y
|
|
|
|
jsr PRBYTE
|
|
|
|
iny
|
|
|
|
cpy _menuHexIdx
|
|
|
|
bne :prloop
|
2015-03-02 05:09:20 +00:00
|
|
|
bra :nextMenuItem
|
|
|
|
:jsrItem
|
|
|
|
iny
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
tax
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
tay
|
|
|
|
|
|
|
|
lda $0 ; whoops.. save zp ptrs that printstring uses :(
|
|
|
|
pha
|
|
|
|
lda $1
|
|
|
|
pha
|
|
|
|
|
|
|
|
txa
|
|
|
|
jsr PrintString
|
|
|
|
pla
|
|
|
|
sta $1
|
|
|
|
pla
|
|
|
|
sta $0
|
|
|
|
|
|
|
|
:nextMenuItem
|
2015-03-01 21:52:40 +00:00
|
|
|
lda _menuOptionPtr
|
|
|
|
clc
|
|
|
|
adc #6 ; len of "struct"
|
|
|
|
sta _menuOptionPtr
|
|
|
|
bra :drawOption
|
|
|
|
:menuDone
|
2015-03-01 19:44:56 +00:00
|
|
|
rts
|
2015-03-02 05:09:20 +00:00
|
|
|
_menuHexIdx dw 0
|
2015-03-01 19:44:56 +00:00
|
|
|
_menuOptionPtr dw 00
|
2015-03-02 15:01:02 +00:00
|
|
|
Menu_UndrawSelected
|
|
|
|
lda #MainMenuDefs
|
|
|
|
ldy #>MainMenuDefs
|
|
|
|
sta $0
|
|
|
|
sty $1
|
|
|
|
stz _stash
|
|
|
|
|
|
|
|
:undrawLoop ldy _stash ; struct ptr
|
|
|
|
lda ($0),y
|
|
|
|
beq :stop
|
|
|
|
dec ; x-- (left bracket)
|
|
|
|
sta _menuSelectedX1
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
sta _menuSelectedY
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
bne :notChar
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
inc ;doit
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
:notChar cmp #1
|
|
|
|
bne :notHex
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
asl
|
|
|
|
inc ;doit
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
:notHex cmp #2
|
|
|
|
bne :wtf
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
|
|
|
|
inc
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
|
|
|
|
:wtf
|
|
|
|
|
|
|
|
:rightBracket
|
|
|
|
ldy _menuSelectedY
|
|
|
|
jsr GoXY
|
|
|
|
lda #" "
|
|
|
|
jsr COUT
|
|
|
|
:leftBracket ldx _menuSelectedX1
|
|
|
|
ldy _menuSelectedY
|
|
|
|
jsr GoXY
|
|
|
|
lda #" "
|
|
|
|
jsr COUT
|
|
|
|
lda _stash
|
|
|
|
clc
|
|
|
|
adc #6
|
|
|
|
sta _stash
|
|
|
|
bra :undrawLoop
|
|
|
|
:stop
|
|
|
|
rts
|
|
|
|
Menu_DrawSelected
|
|
|
|
lda #MainMenuDefs
|
|
|
|
ldy #>MainMenuDefs
|
|
|
|
sta $0
|
|
|
|
sty $1
|
|
|
|
lda #0
|
|
|
|
ldx Menu_ItemSelected
|
|
|
|
:check beq :foundIdx
|
|
|
|
clc
|
|
|
|
adc #6 ; "struct" size
|
|
|
|
dex
|
|
|
|
bra :check
|
|
|
|
|
|
|
|
:foundIdx tay
|
|
|
|
lda ($0),y
|
|
|
|
dec ; x-- (left bracket)
|
|
|
|
sta _menuSelectedX1
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
sta _menuSelectedY
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
bne :notChar
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
inc ;doit
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
:notChar cmp #1
|
|
|
|
bne :notHex
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
asl
|
|
|
|
inc ;doit
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
:notHex cmp #2
|
|
|
|
bne :wtf
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
|
|
|
|
inc
|
|
|
|
clc
|
|
|
|
adc _menuSelectedX1
|
|
|
|
tax
|
|
|
|
bra :rightBracket
|
|
|
|
|
|
|
|
|
|
|
|
:wtf
|
|
|
|
|
|
|
|
:rightBracket
|
|
|
|
ldy _menuSelectedY
|
|
|
|
jsr GoXY
|
|
|
|
lda #"]"
|
|
|
|
jsr COUT
|
|
|
|
:leftBracket ldx _menuSelectedX1
|
|
|
|
ldy _menuSelectedY
|
|
|
|
jsr GoXY
|
|
|
|
lda #"["
|
|
|
|
jsr COUT
|
|
|
|
|
|
|
|
rts
|
|
|
|
_menuSelectedX1 db 0 ; no x2 cuz we be addin'
|
|
|
|
_menuSelectedY db 0
|
|
|
|
|
|
|
|
Menu_HandleSelection
|
2015-03-02 16:42:07 +00:00
|
|
|
lda #MainMenuDefs
|
|
|
|
ldy #>MainMenuDefs
|
|
|
|
sta $0
|
|
|
|
sty $1
|
|
|
|
lda #0
|
|
|
|
ldx Menu_ItemSelected
|
|
|
|
:check beq :foundIdx
|
|
|
|
clc
|
|
|
|
adc #6 ; "struct" size
|
|
|
|
dex
|
|
|
|
bra :check
|
|
|
|
:foundIdx sta _stash
|
|
|
|
tay
|
|
|
|
lda ($0),y
|
|
|
|
tax
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
tay
|
|
|
|
jsr GoXY
|
|
|
|
*** HERE
|
|
|
|
ldy _stash
|
|
|
|
iny
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
bne :notChar
|
|
|
|
|
|
|
|
*TODO
|
|
|
|
:notChar cmp #1
|
|
|
|
bne :notHex
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
asl ;*2
|
|
|
|
pha
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
pha
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
tay
|
|
|
|
plx
|
|
|
|
pla
|
|
|
|
jsr GetHex
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
:notHex cmp #2
|
|
|
|
bne :wtf
|
2015-03-02 17:04:20 +00:00
|
|
|
iny ; skip len byte
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
sta :ACTION+1
|
|
|
|
iny
|
|
|
|
lda ($0),y
|
|
|
|
sta :ACTION+2
|
|
|
|
lda :ACTION+1
|
|
|
|
sec
|
|
|
|
sbc #2
|
|
|
|
sta :ACTION+1
|
|
|
|
bcs :copy
|
|
|
|
dec :ACTION+2
|
|
|
|
:copy ldx #0 ; this is all so bad
|
|
|
|
:ACTION lda $ffff,x
|
|
|
|
sta :JSR+1,x
|
|
|
|
inx
|
|
|
|
cpx #2
|
|
|
|
bcc :ACTION
|
|
|
|
:JSR jsr $ffff
|
|
|
|
rts
|
2015-03-02 16:42:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-03-02 17:04:20 +00:00
|
|
|
:wtf
|
|
|
|
rts
|
2015-03-02 16:42:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-03-02 15:01:02 +00:00
|
|
|
Menu_PrevItem dec Menu_ItemSelected
|
|
|
|
bpl :noflip
|
|
|
|
lda #MainMenuItems
|
|
|
|
dec
|
|
|
|
sta Menu_ItemSelected
|
|
|
|
:noflip rts
|
|
|
|
|
2015-03-03 00:27:37 +00:00
|
|
|
|
2015-03-02 15:01:02 +00:00
|
|
|
Menu_NextItem
|
|
|
|
inc Menu_ItemSelected
|
|
|
|
lda Menu_ItemSelected
|
|
|
|
cmp #MainMenuItems
|
|
|
|
bcc :noflip
|
|
|
|
lda #0
|
|
|
|
sta Menu_ItemSelected
|
|
|
|
:noflip rts
|
|
|
|
|
2015-03-02 05:09:20 +00:00
|
|
|
|
2015-03-01 19:44:56 +00:00
|
|
|
MainMenuDefs
|
2015-03-04 20:21:36 +00:00
|
|
|
:StartBank hex 13,07 ; x,y
|
2015-03-01 21:52:40 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 01 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da StartBank ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:EndBank hex 13,08 ; x,y
|
2015-03-01 21:52:40 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 01 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da EndBank ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:StartAddr hex 13,0A ; x,y
|
2015-03-01 21:52:40 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 02 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da StartAddr ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:EndAddr hex 13,0B ; x,y
|
2015-03-01 21:52:40 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 02 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da EndAddr ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:TestByte hex 13,0D ; x,y
|
2015-03-03 00:27:37 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 01 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da TestValue ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:TestDelay hex 13,0E ; x,y
|
2015-03-03 00:27:37 +00:00
|
|
|
db 01 ; 0=char/1=hex input 2=Menu JSR
|
|
|
|
db 01 ; memory size (bytes), 0=char/1=hex input
|
|
|
|
da TestDelay ; variable storage
|
2015-03-04 20:21:36 +00:00
|
|
|
:BeginTest hex 13,11 ; x,y
|
2015-03-01 21:52:40 +00:00
|
|
|
db 02 ; 0=char/1=hex input 2=Menu JSR
|
2015-03-01 19:44:56 +00:00
|
|
|
db MenuStr_BeginTestL ; menu string length
|
|
|
|
da MenuStr_BeginTest ; string storage
|
2015-03-03 00:27:37 +00:00
|
|
|
MainMenuLen equ *-MainMenuDefs
|
2015-03-02 15:01:02 +00:00
|
|
|
MainMenuItems equ MainMenuLen/6
|
2015-03-01 21:52:40 +00:00
|
|
|
MainMenuEnd dw 0000
|
2015-03-03 00:27:37 +00:00
|
|
|
Menu_ItemSelected db 0
|
2015-02-24 21:05:03 +00:00
|
|
|
|
|
|
|
|
2015-03-02 05:09:20 +00:00
|
|
|
|
2015-03-01 19:44:56 +00:00
|
|
|
MenuStr_JSR da BeginTest ; MUST PRECEDE MENU STRING! Yes, it's magicly inferred. (-2)
|
2015-03-02 15:01:02 +00:00
|
|
|
MenuStr_BeginTest asc "BEGIN TEST"
|
2015-03-01 19:44:56 +00:00
|
|
|
MenuStr_BeginTestL equ #*-MenuStr_BeginTest
|
2015-03-02 15:01:02 +00:00
|
|
|
MenuStr_BeginTestE db 00
|
2015-03-04 20:21:36 +00:00
|
|
|
MainMenuStrs
|
|
|
|
asc " ____________________________________________________________________________",$8D,$00
|
|
|
|
asc " ",$1B,'ZGGGGGGGGGGGGGGGGGGGGGGGGGGG\'," Mini Memory Tester ",'\GGGGGGGGGGGGG\'," ALPHA ",'\GGGGG_',$18,$8D,$00
|
|
|
|
asc " ",$1B,'ZWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVW'," ReactiveMicro ",'VW_',$18,$8D,00
|
|
|
|
asc " ",$1B,'ZLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",' \G_',"Test Settings",'ZG\ '," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," Start BANK: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," End BANK: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," Start ADDR: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," End ADDR: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," Test Byte: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," Test Delay: ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z'," USE ARROW KEYS TO MOVE - USE ENTER TO SELECT/EDIT ",'_',$18,$8D,00
|
|
|
|
asc " ",$1B,'Z',"____________________________________________________________________________",'_',$18,$8D,00
|
|
|
|
|
|
|
|
* asc " ABCDEFGHIZKLMNOPQRSTUVWXYZ ",$8D,$00
|
|
|
|
* asc $1B,' ABCDEFGHIZKLMNOPQRSTUVWXYZ ',$1B,$8D,$00
|
2015-03-01 19:44:56 +00:00
|
|
|
|
2015-02-24 21:05:03 +00:00
|
|
|
hex 00,00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WaitKey
|
|
|
|
:kloop lda KEY
|
|
|
|
bpl :kloop
|
|
|
|
sta STROBE
|
2015-03-02 05:09:20 +00:00
|
|
|
cmp #"b" ; REMOVE DEBUG
|
|
|
|
bne :nobreak
|
|
|
|
brk $75
|
|
|
|
:nobreak
|
2015-02-24 21:05:03 +00:00
|
|
|
rts
|
|
|
|
|
2015-03-01 19:44:56 +00:00
|
|
|
put strings.s
|
2015-03-04 20:21:36 +00:00
|
|
|
BorderColor db 0
|
2015-03-02 15:01:02 +00:00
|
|
|
ds \
|
|
|
|
_stash ds 255
|
|
|
|
ds \
|
2015-02-24 21:05:03 +00:00
|
|
|
|