Re: 6502 Klaus Test Program Question
Posted: Mon Apr 15, 2013 10:53 am
Cheers - fixed the link.
Code: Select all
;testing relative addressing with BEQ
0435 : a0fe ldy #$fe ;testing maximum range, not -1/-2 (invalid/self adr)
0437 : range_loop
0437 : 88 dey ;next relative address
0438 : 98 tya
0439 : aa tax ;precharge count to end of loop
043a : 1003 bpl range_fw ;calculate relative address
043c : 18 clc ;avoid branch self or to relative address of branch
043d : 6902 adc #2
043f : range_fw
043f : 497f eor #$7f ;complement except sign
0441 : 8dc804 sta range_adr ;load into test target
0444 : a900 lda #0 ;should set zero flag in status register
0446 : 4cc704 jmp range_op
0449 : ca dex ;-128 - max backward
044a : ca dex
044b : ca dex
044c : ca dex
044d : ca dex
044e : ca dex
044f : ca dex
0450 : ca dex
0451 : ca dex ;-120
0452 : ca dex
0453 : ca dex
0454 : ca dex
0455 : ca dex
0456 : ca dex
0457 : ca dex
0458 : ca dex
0459 : ca dex
045a : ca dex
045b : ca dex ;-110
045c : ca dex
045d : ca dex
045e : ca dex
045f : ca dex
0460 : ca dex
0461 : ca dex
0462 : ca dex
0463 : ca dex
0464 : ca dex
0465 : ca dex ;-100
0466 : ca dex
0467 : ca dex
0468 : ca dex
0469 : ca dex
046a : ca dex
046b : ca dex
046c : ca dex
046d : ca dex
046e : ca dex
046f : ca dex ;-90
0470 : ca dex
0471 : ca dex
0472 : ca dex
0473 : ca dex
0474 : ca dex
0475 : ca dex
0476 : ca dex
0477 : ca dex
0478 : ca dex
0479 : ca dex ;-80
047a : ca dex
047b : ca dex
047c : ca dex
047d : ca dex
047e : ca dex
047f : ca dex
0480 : ca dex
0481 : ca dex
0482 : ca dex
0483 : ca dex ;-70
0484 : ca dex
0485 : ca dex
0486 : ca dex
0487 : ca dex
0488 : ca dex
0489 : ca dex
048a : ca dex
048b : ca dex
048c : ca dex
048d : ca dex ;-60
048e : ca dex
048f : ca dex
0490 : ca dex
0491 : ca dex
0492 : ca dex
0493 : ca dex
0494 : ca dex
0495 : ca dex
0496 : ca dex
0497 : ca dex ;-50
0498 : ca dex
0499 : ca dex
049a : ca dex
049b : ca dex
049c : ca dex
049d : ca dex
049e : ca dex
049f : ca dex
04a0 : ca dex
04a1 : ca dex ;-40
04a2 : ca dex
04a3 : ca dex
04a4 : ca dex
04a5 : ca dex
04a6 : ca dex
04a7 : ca dex
04a8 : ca dex
04a9 : ca dex
04aa : ca dex
04ab : ca dex ;-30
04ac : ca dex
04ad : ca dex
04ae : ca dex
04af : ca dex
04b0 : ca dex
04b1 : ca dex
04b2 : ca dex
04b3 : ca dex
04b4 : ca dex
04b5 : ca dex ;-20
04b6 : ca dex
04b7 : ca dex
04b8 : ca dex
04b9 : ca dex
04ba : ca dex
04bb : ca dex
04bc : ca dex
04bd : ca dex
04be : ca dex
04bf : ca dex ;-10
04c0 : ca dex
04c1 : ca dex
04c2 : ca dex
04c3 : ca dex
04c4 : ca dex
04c5 : ca dex
04c6 : ca dex ;-3
04c7 : range_op ;test target with zero flag=0, z=1 if previous dex
04c8 = range_adr = *+1 ;modifiable relative address
04c7 : f03e beq *+64 ;if called without modification
04c9 : ca dex ;+0
04ca : ca dex
04cb : ca dex
04cc : ca dex
04cd : ca dex
04ce : ca dex
04cf : ca dex
04d0 : ca dex
04d1 : ca dex
04d2 : ca dex
04d3 : ca dex ;+10
04d4 : ca dex
04d5 : ca dex
04d6 : ca dex
04d7 : ca dex
04d8 : ca dex
04d9 : ca dex
04da : ca dex
04db : ca dex
04dc : ca dex
04dd : ca dex ;+20
04de : ca dex
04df : ca dex
04e0 : ca dex
04e1 : ca dex
04e2 : ca dex
04e3 : ca dex
04e4 : ca dex
04e5 : ca dex
04e6 : ca dex
04e7 : ca dex ;+30
04e8 : ca dex
04e9 : ca dex
04ea : ca dex
04eb : ca dex
04ec : ca dex
04ed : ca dex
04ee : ca dex
04ef : ca dex
04f0 : ca dex
04f1 : ca dex ;+40
04f2 : ca dex
04f3 : ca dex
04f4 : ca dex
04f5 : ca dex
04f6 : ca dex
04f7 : ca dex
04f8 : ca dex
04f9 : ca dex
04fa : ca dex
04fb : ca dex ;+50
04fc : ca dex
04fd : ca dex
04fe : ca dex
04ff : ca dex
0500 : ca dex
0501 : ca dex
0502 : ca dex
0503 : ca dex
0504 : ca dex
0505 : ca dex ;+60
0506 : ca dex
0507 : ca dex
0508 : ca dex
0509 : ca dex
050a : ca dex
050b : ca dex
050c : ca dex
050d : ca dex
050e : ca dex
050f : ca dex ;+70
0510 : ca dex
0511 : ca dex
0512 : ca dex
0513 : ca dex
0514 : ca dex
0515 : ca dex
0516 : ca dex
0517 : ca dex
0518 : ca dex
0519 : ca dex ;+80
051a : ca dex
051b : ca dex
051c : ca dex
051d : ca dex
051e : ca dex
051f : ca dex
0520 : ca dex
0521 : ca dex
0522 : ca dex
0523 : ca dex ;+90
0524 : ca dex
0525 : ca dex
0526 : ca dex
0527 : ca dex
0528 : ca dex
0529 : ca dex
052a : ca dex
052b : ca dex
052c : ca dex
052d : ca dex ;+100
052e : ca dex
052f : ca dex
0530 : ca dex
0531 : ca dex
0532 : ca dex
0533 : ca dex
0534 : ca dex
0535 : ca dex
0536 : ca dex
0537 : ca dex ;+110
0538 : ca dex
0539 : ca dex
053a : ca dex
053b : ca dex
053c : ca dex
053d : ca dex
053e : ca dex
053f : ca dex
0540 : ca dex
0541 : ca dex ;+120
0542 : ca dex
0543 : ca dex
0544 : ca dex
0545 : ca dex
0546 : ca dex
0547 : ca dex
0548 : f003 beq range_ok ;+127 - max forward
trap ; bad range
054a : 4c4a05 > jmp * ;failed anyway
054d : range_ok
054d : c000 cpy #0
054f : f003 beq range_end
0551 : 4c3704 jmp range_loop
0554 : range_end ;range test successful
Code: Select all
LDY #$00FE O: 160 L: FE H: 88 PC: 1035 A: 001 X: 255 Y: 000 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
DEY O: 136 L: H: PC: 1037 A: 001 X: 255 Y: 254 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
TYA O: 152 L: H: PC: 1038 A: 001 X: 255 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
TAX O: 170 L: H: PC: 1039 A: 253 X: 255 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
BPL $103A O: 16 L: 03 H: PC: 103A A: 253 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
CLC O: 24 L: H: PC: 103C A: 253 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 1
ADC #$0002 O: 105 L: 02 H: 49 PC: 103D A: 253 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
EOR #$007F O: 73 L: 7F H: 8D PC: 103F A: 255 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
STA $04C8 O: 141 L: C8 H: 04 PC: 1041 A: 128 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
LDA #$0000 O: 169 L: 00 H: 4C PC: 1044 A: 128 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
JMP $04C7 O: 76 L: C7 H: 04 PC: 1046 A: 000 X: 253 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
BRK O: 0 L: H: PC: 4C7 A: 000 X: 253 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
Code: Select all
0541 : ca dex ;+120
0542 : ca dex
0543 : ca dex
0544 : ca dex
0545 : ca dex
0546 : ca dex
0547 : ca dex
0548 : f003 beq range_ok ;+127 - max forward
trap ; bad range
054a : 4c4a05 > jmp * ;failed anyway
054d : range_ok
054d : c000 cpy #0
054f : f003 beq range_end
0551 : 4c3704 jmp range_loop
0554 : range_end ;range test successful
Code: Select all
BEQ $0548 O: 240 L: 03 H: PC: 548 A: 000 X: 000 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
0547 : CA DEX A: 000 X: 001 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
0548 : F003 BEQ $0548 A: 000 X: 000 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
054C : 05C0 ORA $C0 A: 000 X: 000 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
Code: Select all
...
0441 : 8DC804 STA $04C8 A: 128 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
^---- ^-- self modify BEQ under test / backward max (-128)
0444 : A900 LDA #$0000 A: 128 X: 253 Y: 253 SP 255 N: 1 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
^-- ^-- number of dex to be executed
^-- max 128 backward
0446 : 4CC704 JMP $04C7 A: 000 X: 253 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
previous lda #0 -
04C7 : F080 BEQ $04C7 A: 000 X: 253 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
^---- was replaced by self modifying code to $0449 (-128)
0449 : CA DEX A: 000 X: 253 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
... a lot of DEX until
04C7 : F080 BEQ $04C7 A: 000 X: 127 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
this time the branch is not taken because Z=0 ^
04C9 : CA DEX A: 000 X: 127 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
... more DEX to be executed
0547 : CA DEX A: 000 X: 001 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 0 C: 0
^-- last DEX, so the expected number of DEX was counted
0548 : F003 BEQ $0548 A: 000 X: 000 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
^-- last DEX set Z=1, branch will be taken ^
^---- should read $054D (+3)
054C : 05C0 ORA $C0 A: 000 X: 000 Y: 253 SP 255 N: 0 V: 0 B: 0 D: 0 I: 1 Z: 1 C: 0
^--- but ends at $054C (+2)
...Code: Select all
; Please note that in early tests some instructions will have to be used before
; they are actually tested!
Code: Select all
AS65.EXE -l -m -w -h0 6502_functional_test.a65Code: Select all
range_adr
tandi1
tandi2
teori1
teori2
torai1
torai2
chkdadi
chkdsbi
chkadi
chksbi