OpenCores
URL https://opencores.org/ocsvn/m65c02/m65c02/trunk

Subversion Repositories m65c02

[/] [m65c02/] [trunk/] [Src/] [M65C02-Test-Programs/] [Klaus2m5_Functional_Tests/] [65C02_FT.a65] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 MichaelA
;
2
; 6 5 0 2   F U N C T I O N A L   T E S T
3
;
4
; Copyright (C) 2012-2013  Klaus Dormann
5
;
6
; This program is free software: you can redistribute it and/or modify
7
; it under the terms of the GNU General Public License as published by
8
; the Free Software Foundation, either version 3 of the License, or
9
; (at your option) any later version.
10
;
11
; This program is distributed in the hope that it will be useful,
12
; but WITHOUT ANY WARRANTY; without even the implied warranty of
13
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
; GNU General Public License for more details.
15
;
16
; You should have received a copy of the GNU General Public License
17
; along with this program.  If not, see .
18 3 MichaelA
;
19
;
20 2 MichaelA
; This program is designed to test all opcodes of a 6502 emulator using all
21
; addressing modes with focus on propper setting of the processor status
22
; register bits.
23
;
24
; version 23-jul-2013
25
; contact info at http://2m5.de or email K@2m5.de
26
;
27
; assembled with AS65 from http://www.kingswood-consulting.co.uk/assemblers/
28
; command line switches: -l -m -s2 -w -h0
29
;                         |  |  |   |  no page headers in listing
30
;                         |  |  |   wide listing (133 char/col)
31
;                         |  |  write intel hex file instead of binary
32
;                         |  expand macros in listing
33
;                         generate pass2 listing
34
;
35
; No IO - should be run from a monitor with access to registers.
36
; To run load intel hex image with a load command, than alter PC to 400 hex
37
; (code_segment) and enter a go command.
38
; Loop on program counter determines error or successful completion of test.
39
; Check listing for relevant traps (jump/branch *).
40
; Please note that in early tests some instructions will have to be used before
41
; they are actually tested!
42
;
43
; RESET, NMI or IRQ should not occur and will be trapped if vectors are enabled.
44
; Tests documented behavior of the original NMOS 6502 only! No unofficial
45
; opcodes. Additional opcodes of newer versions of the CPU (65C02, 65816) will
46
; not be tested. Decimal ops will only be tested with valid BCD operands and
47
; N V Z flags will be ignored.
48
;
49
; Debugging hints:
50
;     Most of the code is written sequentially. if you hit a trap, check the
51
;   immediately preceeding code for the instruction to be tested. Results are
52
;   tested first, flags are checked second by pushing them onto the stack and
53
;   pulling them to the accumulator after the result was checked. The "real"
54
;   flags are no longer valid for the tested instruction at this time!
55
;     If the tested instruction was indexed, the relevant index (X or Y) must
56
;   also be checked. Opposed to the flags, X and Y registers are still valid.
57
;
58
; versions:
59
;   28-jul-2012  1st version distributed for testing
60
;   29-jul-2012  fixed references to location 0, now #0
61
;                added license - GPLv3
62
;   30-jul-2012  added configuration options
63
;   01-aug-2012  added trap macro to allow user to change error handling
64
;   01-dec-2012  fixed trap in branch field must be a branch
65
;   02-mar-2013  fixed PLA flags not tested
66
;   19-jul-2013  allowed ROM vectors to be loaded when load_data_direct = 0
67
;                added test sequence check to detect if tests jump their fence
68
;   23-jul-2013  added RAM integrity check
69
;
70
;   30-Aug-2013  Modified by Michael A. Morris to allow selection of tests
71 3 MichaelA
;   04-Jan-2014  Modified trap vectors to use sbc2oslite BRK handler for error
72
;                trapping. Enabled success macro, which returns to the monitor.
73
;                Disabled BRK trap test in order to trap out to the monitor.
74
;   30-Jan-2014  Modified success macro to issue brk instruction instead of rts.
75
;   27-Nov-2014  Modified success macro to use stp instruction instead of brk
76
;   07-Dec-2014  Modified success macro to use brk instruction instead of stp
77 2 MichaelA
;
78
; C O N F I G U R A T I O N
79
;
80
;ROM_vectors writable (0=no, 1=yes)
81 3 MichaelA
;
82
;   if ROM vectors can not be used interrupts will not be trapped
83
;   as a consequence BRK can not be tested but will be emulated to test RTI
84
;
85
ROM_vectors = 0
86
;
87 2 MichaelA
;load_data_direct (0=move from code segment, 1=load directly)
88
;loading directly is preferred but may not be supported by your platform
89
;0 produces only consecutive object code, 1 is not suitable for a binary image
90 3 MichaelA
;
91
load_data_direct = 0
92
;
93 2 MichaelA
;I_flag behavior (0=force enabled, 1=force disabled, 2=prohibit change, 3=allow
94
;change) 2 requires extra code and is not recommended. SEI & CLI can only be
95
;tested if you allow changing the interrupt status (I_flag = 3)
96 3 MichaelA
;
97 2 MichaelA
I_flag = 3
98 3 MichaelA
;
99 2 MichaelA
;configure memory - try to stay away from memory used by the system
100
;zero_page memory start address, $50 (80) consecutive Bytes required
101
;                                add 2 if I_flag = 2
102 3 MichaelA
;
103
zero_page = $B0
104
;
105 2 MichaelA
;data_segment memory start address, $5B (91) consecutive Bytes required
106 3 MichaelA
;
107 2 MichaelA
data_segment = $200
108
    if (data_segment & $ff) != 0
109
        ERROR ERROR ERROR low byte of data_segment MUST be $00 !!
110
    endif
111 3 MichaelA
;
112 2 MichaelA
;code_segment memory start address, 13kB of consecutive space required
113
;                                   add 2.5 kB if I_flag = 2
114
;parts of the code are self modifying and must reside in RAM
115 3 MichaelA
;
116 2 MichaelA
code_segment = $400
117 3 MichaelA
;
118 2 MichaelA
;RAM integrity test option. Checks for undesired RAM writes.
119
;set lowest non RAM or RAM mirror address page (-1=disable, 0=64k, $40=16k)
120
;leave disabled if a monitor, OS or background interrupt is allowed to alter RAM
121 3 MichaelA
;
122 2 MichaelA
ram_top = -1
123 3 MichaelA
;ram_top = $40
124 2 MichaelA
;
125 3 MichaelA
;   Define the top of stack location
126
;
127
stack_top = $1FF
128
;
129 2 MichaelA
;Skip to ADC/SBC tests
130
;
131
skip_part_1  = 0
132
;
133
;Skip Binary or Decimal mode ADC/SBC instruction tests
134
;
135 3 MichaelA
skip_bin_test = 0
136 2 MichaelA
skip_dec_test = 0
137 3 MichaelA
;
138 2 MichaelA
        noopt       ;do not take shortcuts
139 3 MichaelA
;
140 2 MichaelA
;macros for error & success traps to allow user modification
141
;example:
142 3 MichaelA
;
143 2 MichaelA
;trap    macro
144
;        jsr my_error_handler
145
;        endm
146 3 MichaelA
;
147 2 MichaelA
;trap_eq macro
148
;        bne skip\?
149
;        trap           ;failed equal (zero)
150
;skip\?
151
;        endm
152
;
153
; my_error_handler should pop the calling address from the stack and report it.
154
; putting larger portions of code (more than 3 bytes) inside the trap macro
155
; may lead to branch range problems for some tests.
156 3 MichaelA
 
157 2 MichaelA
trap    macro
158 3 MichaelA
;        db      $db         ; M65C02/M65C02A SToP instruction
159
        brk                 ; Use BRK to return to the monitor
160
        db      test_num
161 2 MichaelA
        endm
162 3 MichaelA
 
163 2 MichaelA
trap_eq macro
164 3 MichaelA
        bne skip\?
165
        trap           ;failed equal (zero)
166
skip\?
167 2 MichaelA
        endm
168 3 MichaelA
 
169 2 MichaelA
trap_ne macro
170 3 MichaelA
        beq skip\?
171
        trap           ;failed equal (zero)
172
skip\?
173 2 MichaelA
        endm
174 3 MichaelA
 
175 2 MichaelA
trap_cs macro
176 3 MichaelA
        bcc skip\?
177
        trap           ;failed equal (zero)
178
skip\?
179 2 MichaelA
        endm
180 3 MichaelA
 
181 2 MichaelA
trap_cc macro
182 3 MichaelA
        bcs skip\?
183
        trap           ;failed equal (zero)
184
skip\?
185 2 MichaelA
        endm
186 3 MichaelA
 
187 2 MichaelA
trap_mi macro
188 3 MichaelA
        bpl skip\?
189
        trap           ;failed equal (zero)
190
skip\?
191 2 MichaelA
        endm
192 3 MichaelA
 
193 2 MichaelA
trap_pl macro
194 3 MichaelA
        bmi skip\?
195
        trap           ;failed equal (zero)
196
skip\?
197 2 MichaelA
        endm
198 3 MichaelA
 
199 2 MichaelA
trap_vs macro
200 3 MichaelA
        bvc skip\?
201
        trap           ;failed equal (zero)
202
skip\?
203 2 MichaelA
        endm
204 3 MichaelA
 
205 2 MichaelA
trap_vc macro
206 3 MichaelA
        bvs skip\?
207
        trap           ;failed equal (zero)
208
skip\?
209 2 MichaelA
        endm
210 3 MichaelA
 
211 2 MichaelA
success macro
212 3 MichaelA
        brk
213
        db      test_num+1
214 2 MichaelA
        endm
215
 
216
carry   equ %00000001   ;flag bits in status
217
zero    equ %00000010
218
intdis  equ %00000100
219
decmode equ %00001000
220
break   equ %00010000
221
reserv  equ %00100000
222
overfl  equ %01000000
223
minus   equ %10000000
224
 
225
fc      equ carry
226
fz      equ zero
227
fzc     equ carry+zero
228
fv      equ overfl
229
fvz     equ overfl+zero
230
fn      equ minus
231
fnc     equ minus+carry
232
fnz     equ minus+zero
233
fnzc    equ minus+zero+carry
234
fnv     equ minus+overfl
235
 
236
fao     equ break+reserv    ;bits always on after PHP, BRK
237
fai     equ fao+intdis      ;+ forced interrupt disable
238
m8      equ $ff             ;8 bit mask
239
m8i     equ $ff&~intdis     ;8 bit mask - interrupt disable
240
 
241
;macros to allow masking of status bits.
242
;masking of interrupt enable/disable on load and compare
243
;masking of always on bits after PHP or BRK (unused & break) on compare
244 3 MichaelA
 
245 2 MichaelA
        if I_flag = 0
246 3 MichaelA
 
247 2 MichaelA
load_flag   macro
248
            lda #\1&m8i         ;force enable interrupts (mask I)
249
            endm
250 3 MichaelA
 
251 2 MichaelA
cmp_flag    macro
252
            cmp #(\1|fao)&m8i   ;I_flag is always enabled + always on bits
253
            endm
254 3 MichaelA
 
255 2 MichaelA
eor_flag    macro
256
            eor #(\1&m8i|fao)   ;mask I, invert expected flags + always on bits
257
            endm
258 3 MichaelA
 
259 2 MichaelA
        endif
260 3 MichaelA
 
261 2 MichaelA
        if I_flag = 1
262 3 MichaelA
 
263 2 MichaelA
load_flag   macro
264
            lda #\1|intdis      ;force disable interrupts
265
            endm
266 3 MichaelA
 
267 2 MichaelA
cmp_flag    macro
268
            cmp #(\1|fai)&m8    ;I_flag is always disabled + always on bits
269
            endm
270 3 MichaelA
 
271 2 MichaelA
eor_flag    macro
272
            eor #(\1|fai)       ;invert expected flags + always on bits + I
273
            endm
274 3 MichaelA
 
275 2 MichaelA
        endif
276 3 MichaelA
 
277 2 MichaelA
        if I_flag = 2
278 3 MichaelA
 
279 2 MichaelA
load_flag   macro
280
            lda #\1
281
            ora flag_I_on       ;restore I-flag
282
            and flag_I_off
283
            endm
284 3 MichaelA
 
285 2 MichaelA
cmp_flag    macro
286
            eor flag_I_on       ;I_flag is never changed
287
            cmp #(\1|fao)&m8i   ;expected flags + always on bits, mask I
288
            endm
289 3 MichaelA
 
290 2 MichaelA
eor_flag    macro
291
            eor flag_I_on       ;I_flag is never changed
292
            eor #(\1&m8i|fao)   ;mask I, invert expected flags + always on bits
293
            endm
294 3 MichaelA
 
295 2 MichaelA
        endif
296 3 MichaelA
 
297 2 MichaelA
        if I_flag = 3
298 3 MichaelA
 
299 2 MichaelA
load_flag   macro
300
            lda #\1             ;allow test to change I-flag (no mask)
301
            endm
302 3 MichaelA
 
303 2 MichaelA
cmp_flag    macro
304
            cmp #(\1|fao)&m8    ;expected flags + always on bits
305
            endm
306 3 MichaelA
 
307 2 MichaelA
eor_flag    macro
308
            eor #\1|fao         ;invert expected flags + always on bits
309
            endm
310 3 MichaelA
 
311 2 MichaelA
        endif
312
 
313
;macros to set (register|memory|zeropage) & status
314 3 MichaelA
 
315 2 MichaelA
set_stat    macro       ;setting flags in the processor status register
316
            load_flag \1
317
            pha         ;use stack to load status
318
            plp
319
            endm
320
 
321
set_a       macro       ;precharging accu & status
322
            load_flag \2
323
            pha         ;use stack to load status
324
            lda #\1     ;precharge accu
325
            plp
326
            endm
327
 
328
set_x       macro       ;precharging index & status
329
            load_flag \2
330
            pha         ;use stack to load status
331
            ldx #\1     ;precharge index x
332
            plp
333
            endm
334
 
335
set_y       macro       ;precharging index & status
336
            load_flag \2
337
            pha         ;use stack to load status
338
            ldy #\1     ;precharge index y
339
            plp
340
            endm
341
 
342
set_ax      macro       ;precharging indexed accu & immediate status
343
            load_flag \2
344
            pha         ;use stack to load status
345
            lda \1,x    ;precharge accu
346
            plp
347
            endm
348
 
349
set_ay      macro       ;precharging indexed accu & immediate status
350
            load_flag \2
351
            pha         ;use stack to load status
352
            lda \1,y    ;precharge accu
353
            plp
354
            endm
355
 
356
set_z       macro       ;precharging indexed zp & immediate status
357
            load_flag \2
358
            pha         ;use stack to load status
359
            lda \1,x    ;load to zeropage
360
            sta zpt
361
            plp
362
            endm
363
 
364
set_zx      macro       ;precharging zp,x & immediate status
365
            load_flag \2
366
            pha         ;use stack to load status
367
            lda \1,x    ;load to indexed zeropage
368
            sta zpt,x
369
            plp
370
            endm
371
 
372
set_abs     macro       ;precharging indexed memory & immediate status
373
            load_flag \2
374
            pha         ;use stack to load status
375
            lda \1,x    ;load to memory
376
            sta abst
377
            plp
378
            endm
379
 
380
set_absx    macro       ;precharging abs,x & immediate status
381
            load_flag \2
382
            pha         ;use stack to load status
383
            lda \1,x    ;load to indexed memory
384
            sta abst,x
385
            plp
386
            endm
387
 
388
;macros to test (register|memory|zeropage) & status & (mask)
389 3 MichaelA
 
390 2 MichaelA
tst_stat    macro       ;testing flags in the processor status register
391
            php         ;save status
392
            php         ;use stack to retrieve status
393
            pla
394
            cmp_flag \1
395
            trap_ne
396
            plp         ;restore status
397
            endm
398
 
399
tst_a       macro       ;testing result in accu & flags
400
            php         ;save flags
401
            php
402
            cmp #\1     ;test result
403
            trap_ne
404
            pla         ;load status
405
            cmp_flag \2
406
            trap_ne
407
            plp         ;restore status
408
            endm
409
 
410
tst_x       macro       ;testing result in x index & flags
411
            php         ;save flags
412
            php
413
            cpx #\1     ;test result
414
            trap_ne
415
            pla         ;load status
416
            cmp_flag \2
417
            trap_ne
418
            plp         ;restore status
419
            endm
420
 
421
tst_y       macro       ;testing result in y index & flags
422
            php         ;save flags
423
            php
424
            cpy #\1     ;test result
425
            trap_ne
426
            pla         ;load status
427
            cmp_flag \2
428
            trap_ne
429
            plp         ;restore status
430
            endm
431
 
432
tst_ax      macro       ;indexed testing result in accu & flags
433
            php         ;save flags
434
            cmp \1,x    ;test result
435
            trap_ne
436
            pla         ;load status
437
            eor_flag \3
438
            cmp \2,x    ;test flags
439
            trap_ne     ;
440
            endm
441
 
442
tst_ay      macro       ;indexed testing result in accu & flags
443
            php         ;save flags
444
            cmp \1,y    ;test result
445
            trap_ne     ;
446
            pla         ;load status
447
            eor_flag \3
448
            cmp \2,y    ;test flags
449
            trap_ne
450
            endm
451
 
452
tst_z       macro       ;indexed testing result in zp & flags
453
            php         ;save flags
454
            lda zpt
455
            cmp \1,x    ;test result
456
            trap_ne
457
            pla         ;load status
458
            eor_flag \3
459
            cmp \2,x    ;test flags
460
            trap_ne
461
            endm
462
 
463
tst_zx      macro       ;testing result in zp,x & flags
464
            php         ;save flags
465
            lda zpt,x
466
            cmp \1,x    ;test result
467
            trap_ne
468
            pla         ;load status
469
            eor_flag \3
470
            cmp \2,x    ;test flags
471
            trap_ne
472
            endm
473
 
474
tst_abs     macro       ;indexed testing result in memory & flags
475
            php         ;save flags
476
            lda abst
477
            cmp \1,x    ;test result
478
            trap_ne
479
            pla         ;load status
480
            eor_flag \3
481
            cmp \2,x    ;test flags
482
            trap_ne
483
            endm
484
 
485
tst_absx    macro       ;testing result in abs,x & flags
486
            php         ;save flags
487
            lda abst,x
488
            cmp \1,x    ;test result
489
            trap_ne
490
            pla         ;load status
491
            eor_flag \3
492
            cmp \2,x    ;test flags
493
            trap_ne
494
            endm
495
 
496
; RAM integrity test
497
;   verifies that none of the previous tests has altered RAM outside of the
498
;   designated write areas.
499
;   uses zpt word as indirect pointer, zpt+2 word as checksum
500 3 MichaelA
 
501 2 MichaelA
        if ram_top > -1
502 3 MichaelA
 
503 2 MichaelA
check_ram   macro
504
            cld
505
            lda #0
506
            sta zpt         ;set low byte of indirect pointer
507
            sta zpt+3       ;checksum high byte
508
            sta range_adr   ;reset self modifying code
509
            sta tandi1
510
            sta tandi2
511
            sta teori1
512
            sta teori2
513
            sta torai1
514
            sta torai2
515
            sta chkdadi
516
            sta chkdsbi
517
            sta chkadi
518
            sta chksbi
519
            clc
520
            ldx #zp_bss-zero_page ;zeropage - write test area
521
ccs3\?      adc zero_page,x
522
            bcc ccs2\?
523
            inc zpt+3       ;carry to high byte
524
            clc
525
ccs2\?      inx
526
            bne ccs3\?
527
            ldx #hi(data_segment) ;set high byte of indirect pointer
528
            stx zpt+1
529
            ldy #lo(data_bss) ;data after write test area
530
ccs5\?      adc (zpt),y
531
            bcc ccs4\?
532
            inc zpt+3       ;carry to high byte
533
            clc
534
ccs4\?      iny
535
            bne ccs5\?
536
            inx             ;advance RAM high address
537
            stx zpt+1
538
            cpx #ram_top
539
            bne ccs5\?
540
            sta zpt+2       ;checksum low is
541
            cmp ram_chksm   ;checksum low expected
542
            trap_ne         ;checksum mismatch
543
            lda zpt+3       ;checksum high is
544
            cmp ram_chksm+1 ;checksum high expected
545
            trap_ne         ;checksum mismatch
546
            endm
547 3 MichaelA
 
548 2 MichaelA
        else
549 3 MichaelA
 
550 2 MichaelA
check_ram   macro
551
            ;RAM check disabled - RAM size not set
552
            endm
553 3 MichaelA
 
554 2 MichaelA
        endif
555
 
556
next_test   macro           ;make sure, tests don't jump the fence
557
            lda test_case   ;previous test
558
            cmp #test_num
559
            trap_ne         ;test is out of sequence
560
test_num = test_num + 1
561
            lda #test_num   ;*** this tests' number
562
            sta test_case
563
            ;check_ram       ;uncomment to find altered RAM after each test
564
            endm
565
 
566
    if load_data_direct = 1
567 3 MichaelA
 
568 2 MichaelA
        data
569 3 MichaelA
 
570 2 MichaelA
    else
571 3 MichaelA
 
572
;        bss                 ;uninitialized segment, copy of data at end of code!
573
        code
574
        org 0
575
        ds  zero_page
576
 
577 2 MichaelA
    endif
578
;
579 3 MichaelA
        org zero_page
580
;
581
;        org 0
582
;        ds  zero_page
583
;
584 2 MichaelA
;break test interrupt save
585 3 MichaelA
;
586
 
587 2 MichaelA
irq_a   ds  1               ;a register
588
irq_x   ds  1               ;x register
589 3 MichaelA
 
590 2 MichaelA
    if I_flag = 2
591 3 MichaelA
 
592 2 MichaelA
;masking for I bit in status
593 3 MichaelA
 
594 2 MichaelA
flag_I_on   ds  1           ;or mask to load flags
595
flag_I_off  ds  1           ;and mask to load flags
596 3 MichaelA
 
597 2 MichaelA
    endif
598 3 MichaelA
 
599 2 MichaelA
zpt                         ;5 bytes store/modify test area
600 3 MichaelA
 
601 2 MichaelA
;add/subtract operand generation and result/flag prediction
602 3 MichaelA
 
603 2 MichaelA
adfc    ds  1               ;carry flag before op
604
ad1     ds  1               ;operand 1 - accumulator
605
ad2     ds  1               ;operand 2 - memory / immediate
606
adrl    ds  1               ;expected result bits 0-7
607
adrh    ds  1               ;expected result bit 8 (carry)
608
adrf    ds  1               ;expected flags NV0000ZC (-V in decimal mode)
609
sb2     ds  1               ;operand 2 complemented for subtract
610 3 MichaelA
 
611 2 MichaelA
zp_bss
612 3 MichaelA
 
613 2 MichaelA
zp1     db  $c3,$82,$41,0   ;test patterns for LDx BIT ROL ROR ASL LSR
614
zp7f    db  $7f             ;test pattern for compare
615 3 MichaelA
 
616 2 MichaelA
;logical zeropage operands
617 3 MichaelA
 
618 2 MichaelA
zpOR    db  0,$1f,$71,$80   ;test pattern for OR
619
zpAN    db  $0f,$ff,$7f,$80 ;test pattern for AND
620
zpEO    db  $ff,$0f,$8f,$8f ;test pattern for EOR
621 3 MichaelA
 
622 2 MichaelA
;indirect addressing pointers
623 3 MichaelA
 
624 2 MichaelA
ind1    dw  abs1            ;indirect pointer to pattern in absolute memory
625
        dw  abs1+1
626
        dw  abs1+2
627
        dw  abs1+3
628
        dw  abs7f
629
inw1    dw  abs1-$f8        ;indirect pointer for wrap-test pattern
630
indt    dw  abst            ;indirect pointer to store area in absolute memory
631
        dw  abst+1
632
        dw  abst+2
633
        dw  abst+3
634
inwt    dw  abst-$f8        ;indirect pointer for wrap-test store
635
indAN   dw  absAN           ;indirect pointer to AND pattern in absolute memory
636
        dw  absAN+1
637
        dw  absAN+2
638
        dw  absAN+3
639
indEO   dw  absEO           ;indirect pointer to EOR pattern in absolute memory
640
        dw  absEO+1
641
        dw  absEO+2
642
        dw  absEO+3
643
indOR   dw  absOR           ;indirect pointer to OR pattern in absolute memory
644
        dw  absOR+1
645
        dw  absOR+2
646
        dw  absOR+3
647 3 MichaelA
 
648 2 MichaelA
;add/subtract indirect pointers
649 3 MichaelA
 
650 2 MichaelA
adi2    dw  ada2            ;indirect pointer to operand 2 in absolute memory
651
sbi2    dw  sba2            ;indirect pointer to complemented operand 2 (SBC)
652
adiy2   dw  ada2-$ff        ;with offset for indirect indexed
653
sbiy2   dw  sba2-$ff
654 3 MichaelA
 
655 2 MichaelA
zp_bss_end
656
 
657
        org data_segment
658 3 MichaelA
 
659 2 MichaelA
test_case   ds  1           ;current test number
660
ram_chksm   ds  2           ;checksum for RAM integrity test
661 3 MichaelA
 
662 2 MichaelA
;add/subtract operand copy - abs tests write area
663 3 MichaelA
 
664 2 MichaelA
abst                        ;5 bytes store/modify test area
665
ada2    ds  1               ;operand 2
666
sba2    ds  1               ;operand 2 complemented for subtract
667
        ds  3               ;fill remaining bytes
668 3 MichaelA
 
669 2 MichaelA
data_bss
670 3 MichaelA
 
671 2 MichaelA
abs1    db  $c3,$82,$41,0   ;test patterns for LDx BIT ROL ROR ASL LSR
672
abs7f   db  $7f             ;test pattern for compare
673 3 MichaelA
 
674 2 MichaelA
;loads
675 3 MichaelA
 
676 2 MichaelA
fLDx    db  fn,fn,0,fz      ;expected flags for load
677 3 MichaelA
 
678 2 MichaelA
;shifts
679 3 MichaelA
 
680 2 MichaelA
rASL                        ;expected result ASL & ROL -carry
681
rROL    db  $86,$04,$82,0   ; "
682
rROLc   db  $87,$05,$83,1   ;expected result ROL +carry
683
rLSR                        ;expected result LSR & ROR -carry
684
rROR    db  $61,$41,$20,0   ; "
685
rRORc   db  $e1,$c1,$a0,$80 ;expected result ROR +carry
686
fASL                        ;expected flags for shifts
687
fROL    db  fnc,fc,fn,fz    ;no carry in
688
fROLc   db  fnc,fc,fn,0     ;carry in
689
fLSR
690
fROR    db  fc,0,fc,fz      ;no carry in
691
fRORc   db  fnc,fn,fnc,fn   ;carry in
692 3 MichaelA
 
693 2 MichaelA
;increments (decrements)
694 3 MichaelA
 
695 2 MichaelA
rINC    db  $7f,$80,$ff,0,1 ;expected result for INC/DEC
696
fINC    db  0,fn,fn,fz,0    ;expected flags for INC/DEC
697 3 MichaelA
 
698 2 MichaelA
;logical memory operand
699 3 MichaelA
 
700 2 MichaelA
absOR   db  0,$1f,$71,$80   ;test pattern for OR
701
absAN   db  $0f,$ff,$7f,$80 ;test pattern for AND
702
absEO   db  $ff,$0f,$8f,$8f ;test pattern for EOR
703 3 MichaelA
 
704 2 MichaelA
;logical accu operand
705 3 MichaelA
 
706 2 MichaelA
absORa  db  0,$f1,$1f,0     ;test pattern for OR
707
absANa  db  $f0,$ff,$ff,$ff ;test pattern for AND
708
absEOa  db  $ff,$f0,$f0,$0f ;test pattern for EOR
709 3 MichaelA
 
710 2 MichaelA
;logical results
711 3 MichaelA
 
712 2 MichaelA
absrlo  db  0,$ff,$7f,$80
713
absflo  db  fz,fn,0,fn
714 3 MichaelA
 
715 2 MichaelA
data_bss_end
716
 
717
        code
718
        org code_segment
719 3 MichaelA
 
720 2 MichaelA
start   cld
721
        lda #0          ;*** test 0 = initialize
722
        sta test_case
723
test_num = 0
724
 
725
;stop interrupts before initializing BSS
726 3 MichaelA
 
727 2 MichaelA
    if I_flag = 1
728
        sei
729
    endif
730
 
731
;initialize BSS segment
732 3 MichaelA
 
733 2 MichaelA
    if load_data_direct != 1
734 3 MichaelA
 
735 2 MichaelA
        ldx #zp_end-zp_init-1
736
ld_zp   lda zp_init,x
737
        sta zp_bss,x
738
        dex
739
        bpl ld_zp
740
        ldx #data_end-data_init-1
741
ld_data lda data_init,x
742
        sta data_bss,x
743
        dex
744
        bpl ld_data
745 3 MichaelA
 
746 2 MichaelA
      if ROM_vectors = 1
747 3 MichaelA
 
748 2 MichaelA
        ldx #5
749
ld_vect lda vec_init,x
750
        sta vec_bss,x
751
        dex
752
        bpl ld_vect
753 3 MichaelA
 
754 2 MichaelA
      endif
755 3 MichaelA
 
756 2 MichaelA
    endif
757
 
758
;retain status of interrupt flag
759 3 MichaelA
 
760 2 MichaelA
    if I_flag = 2
761 3 MichaelA
 
762 2 MichaelA
        php
763
        pla
764
        and #4          ;isolate flag
765
        sta flag_I_on   ;or mask
766
        eor #lo(~4)     ;reverse
767
        sta flag_I_off  ;and mask
768 3 MichaelA
 
769 2 MichaelA
    endif
770
 
771
;generate checksum for RAM integrity test
772 3 MichaelA
 
773 2 MichaelA
    if ram_top > -1
774 3 MichaelA
 
775 2 MichaelA
        lda #0
776
        sta zpt         ;set low byte of indirect pointer
777
        sta ram_chksm+1 ;checksum high byte
778
        sta range_adr   ;reset self modifying code
779
        sta tandi1
780
        sta tandi2
781
        sta teori1
782
        sta teori2
783
        sta torai1
784
        sta torai2
785
        sta chkdadi
786
        sta chkdsbi
787
        sta chkadi
788
        sta chksbi
789
        clc
790
        ldx #zp_bss-zero_page ;zeropage - write test area
791
gcs3    adc zero_page,x
792
        bcc gcs2
793
        inc ram_chksm+1 ;carry to high byte
794
        clc
795
gcs2    inx
796
        bne gcs3
797
        ldx #hi(data_segment) ;set high byte of indirect pointer
798
        stx zpt+1
799
        ldy #lo(data_bss) ;data after write test area
800
gcs5    adc (zpt),y
801
        bcc gcs4
802
        inc ram_chksm+1 ;carry to high byte
803
        clc
804
gcs4    iny
805
        bne gcs5
806
        inx             ;advance RAM high address
807
        stx zpt+1
808
        cpx #ram_top
809
        bne gcs5
810
        sta ram_chksm   ;checksum complete
811 3 MichaelA
 
812 2 MichaelA
    endif
813
 
814
    if skip_part_1 = 1
815 3 MichaelA
 
816 2 MichaelA
        jmp  bin_test
817 3 MichaelA
 
818 2 MichaelA
    endif
819
 
820
        next_test
821
 
822
;testing relative addressing with BEQ
823 3 MichaelA
 
824 2 MichaelA
        ldy #$fe        ;testing maximum range, not -1/-2 (invalid/self adr)
825
range_loop
826
        dey             ;next relative address
827
        tya
828
        tax             ;precharge count to end of loop
829
        bpl range_fw    ;calculate relative address
830
        clc             ;avoid branch self or to relative address of branch
831
        adc #2
832
range_fw
833
        eor #$7f        ;complement except sign
834
        sta range_adr   ;load into test target
835
        lda #0          ;should set zero flag in status register
836
        jmp range_op
837
 
838
        ;relative address target field with branch under test in the middle
839 3 MichaelA
 
840 2 MichaelA
        dex             ;-128 - max backward
841
        dex
842
        dex
843
        dex
844
        dex
845
        dex
846
        dex
847
        dex
848
        dex             ;-120
849
        dex
850
        dex
851
        dex
852
        dex
853
        dex
854
        dex
855
        dex
856
        dex
857
        dex
858
        dex             ;-110
859
        dex
860
        dex
861
        dex
862
        dex
863
        dex
864
        dex
865
        dex
866
        dex
867
        dex
868
        dex             ;-100
869
        dex
870
        dex
871
        dex
872
        dex
873
        dex
874
        dex
875
        dex
876
        dex
877
        dex
878
        dex             ;-90
879
        dex
880
        dex
881
        dex
882
        dex
883
        dex
884
        dex
885
        dex
886
        dex
887
        dex
888
        dex             ;-80
889
        dex
890
        dex
891
        dex
892
        dex
893
        dex
894
        dex
895
        dex
896
        dex
897
        dex
898
        dex             ;-70
899
        dex
900
        dex
901
        dex
902
        dex
903
        dex
904
        dex
905
        dex
906
        dex
907
        dex
908
        dex             ;-60
909
        dex
910
        dex
911
        dex
912
        dex
913
        dex
914
        dex
915
        dex
916
        dex
917
        dex
918
        dex             ;-50
919
        dex
920
        dex
921
        dex
922
        dex
923
        dex
924
        dex
925
        dex
926
        dex
927
        dex
928
        dex             ;-40
929
        dex
930
        dex
931
        dex
932
        dex
933
        dex
934
        dex
935
        dex
936
        dex
937
        dex
938
        dex             ;-30
939
        dex
940
        dex
941
        dex
942
        dex
943
        dex
944
        dex
945
        dex
946
        dex
947
        dex
948
        dex             ;-20
949
        dex
950
        dex
951
        dex
952
        dex
953
        dex
954
        dex
955
        dex
956
        dex
957
        dex
958
        dex             ;-10
959
        dex
960
        dex
961
        dex
962
        dex
963
        dex
964
        dex
965
        dex             ;-3
966 3 MichaelA
 
967 2 MichaelA
range_op                ;test target with zero flag=0, z=1 if previous dex
968
range_adr   = *+1       ;modifiable relative address
969 3 MichaelA
 
970 2 MichaelA
        beq *+64        ;if called without modification
971
        dex             ;+0
972
        dex
973
        dex
974
        dex
975
        dex
976
        dex
977
        dex
978
        dex
979
        dex
980
        dex
981
        dex             ;+10
982
        dex
983
        dex
984
        dex
985
        dex
986
        dex
987
        dex
988
        dex
989
        dex
990
        dex
991
        dex             ;+20
992
        dex
993
        dex
994
        dex
995
        dex
996
        dex
997
        dex
998
        dex
999
        dex
1000
        dex
1001
        dex             ;+30
1002
        dex
1003
        dex
1004
        dex
1005
        dex
1006
        dex
1007
        dex
1008
        dex
1009
        dex
1010
        dex
1011
        dex             ;+40
1012
        dex
1013
        dex
1014
        dex
1015
        dex
1016
        dex
1017
        dex
1018
        dex
1019
        dex
1020
        dex
1021
        dex             ;+50
1022
        dex
1023
        dex
1024
        dex
1025
        dex
1026
        dex
1027
        dex
1028
        dex
1029
        dex
1030
        dex
1031
        dex             ;+60
1032
        dex
1033
        dex
1034
        dex
1035
        dex
1036
        dex
1037
        dex
1038
        dex
1039
        dex
1040
        dex
1041
        dex             ;+70
1042
        dex
1043
        dex
1044
        dex
1045
        dex
1046
        dex
1047
        dex
1048
        dex
1049
        dex
1050
        dex
1051
        dex             ;+80
1052
        dex
1053
        dex
1054
        dex
1055
        dex
1056
        dex
1057
        dex
1058
        dex
1059
        dex
1060
        dex
1061
        dex             ;+90
1062
        dex
1063
        dex
1064
        dex
1065
        dex
1066
        dex
1067
        dex
1068
        dex
1069
        dex
1070
        dex
1071
        dex             ;+100
1072
        dex
1073
        dex
1074
        dex
1075
        dex
1076
        dex
1077
        dex
1078
        dex
1079
        dex
1080
        dex
1081
        dex             ;+110
1082
        dex
1083
        dex
1084
        dex
1085
        dex
1086
        dex
1087
        dex
1088
        dex
1089
        dex
1090
        dex
1091
        dex             ;+120
1092
        dex
1093
        dex
1094
        dex
1095
        dex
1096
        dex
1097
        dex
1098 3 MichaelA
 
1099 2 MichaelA
        beq range_ok    ;+127 - max forward
1100
        trap            ; bad range
1101 3 MichaelA
 
1102 2 MichaelA
range_ok
1103
        cpy #0
1104
        beq range_end
1105
        jmp range_loop
1106
range_end               ;range test successful
1107
        next_test
1108
 
1109
;partial test BNE & CMP, CPX, CPY immediate
1110 3 MichaelA
 
1111 2 MichaelA
        cpy #1          ;testing BNE true
1112
        bne test_bne
1113
        trap
1114
test_bne
1115
        lda #0
1116
        cmp #0          ;test compare immediate
1117
        trap_ne
1118
        trap_cc
1119
        trap_mi
1120
        cmp #1
1121
        trap_eq
1122
        trap_cs
1123
        trap_pl
1124
        tax
1125
        cpx #0          ;test compare x immediate
1126
        trap_ne
1127
        trap_cc
1128
        trap_mi
1129
        cpx #1
1130
        trap_eq
1131
        trap_cs
1132
        trap_pl
1133
        tay
1134
        cpy #0          ;test compare y immediate
1135
        trap_ne
1136
        trap_cc
1137
        trap_mi
1138
        cpy #1
1139
        trap_eq
1140
        trap_cs
1141
        trap_pl
1142
        next_test
1143 3 MichaelA
 
1144 2 MichaelA
;testing stack operations PHA PHP PLA PLP
1145
 
1146
        ldx #$ff        ;initialize stack
1147
        txs
1148
        lda #$55
1149
        pha
1150
        lda #$aa
1151
        pha
1152
        cmp $1fe        ;on stack ?
1153
        trap_ne
1154
        tsx
1155
        txa             ;overwrite accu
1156
        cmp #$fd        ;sp decremented?
1157
        trap_ne
1158
        pla
1159
        cmp #$aa        ;successful retreived from stack?
1160
        trap_ne
1161
        pla
1162
        cmp #$55
1163
        trap_ne
1164
        cmp $1ff        ;remains on stack?
1165
        trap_ne
1166
        tsx
1167
        cpx #$ff        ;sp incremented?
1168
        trap_ne
1169
        next_test
1170
 
1171
;testing branch decisions BPL BMI BVC BVS BCC BCS BNE BEQ
1172 3 MichaelA
 
1173 2 MichaelA
        set_stat $ff    ;all on
1174
        bpl nbr1        ;branches should not be taken
1175
        bvc nbr2
1176
        bcc nbr3
1177
        bne nbr4
1178
        bmi br1         ;branches should be taken
1179
        trap
1180
br1     bvs br2
1181
        trap
1182
br2     bcs br3
1183
        trap
1184
br3     beq br4
1185
        trap
1186
nbr1
1187
        trap            ;previous bpl taken
1188
nbr2
1189
        trap            ;previous bvc taken
1190
nbr3
1191
        trap            ;previous bcc taken
1192
nbr4
1193
        trap            ;previous bne taken
1194
br4     php
1195
        tsx
1196
        cpx #$fe        ;sp after php?
1197
        trap_ne
1198
        pla
1199
        cmp_flag $ff    ;returned all flags on?
1200
        trap_ne
1201
        tsx
1202
        cpx #$ff        ;sp after php?
1203
        trap_ne
1204
        set_stat 0      ;all off
1205
        bmi nbr11       ;branches should not be taken
1206
        bvs nbr12
1207
        bcs nbr13
1208
        beq nbr14
1209
        trap_mi
1210
        trap_vs
1211
        trap_cs
1212
        trap_eq
1213
        bpl br11        ;branches should be taken
1214
        trap
1215
br11    bvc br12
1216
        trap
1217
br12    bcc br13
1218
        trap
1219
br13    bne br14
1220
        trap
1221
nbr11
1222
        trap            ;previous bmi taken
1223
nbr12
1224
        trap            ;previous bvs taken
1225
nbr13
1226
        trap            ;previous bcs taken
1227
nbr14
1228
        trap            ;previous beq taken
1229
br14    php
1230
        pla
1231
        cmp_flag 0      ;flags off except break (pushed by sw) + reserved?
1232
        trap_ne
1233 3 MichaelA
 
1234 2 MichaelA
        ;crosscheck flags
1235 3 MichaelA
 
1236 2 MichaelA
        set_stat carry
1237
        trap_cc
1238
        set_stat zero
1239
        trap_ne
1240
        set_stat overfl
1241
        trap_vc
1242
        set_stat minus
1243
        trap_pl
1244
        set_stat $ff-carry
1245
        trap_cs
1246
        set_stat $ff-zero
1247
        trap_eq
1248
        set_stat $ff-overfl
1249
        trap_vs
1250
        set_stat $ff-minus
1251
        trap_mi
1252
        next_test
1253
 
1254
; test PHA does not alter flags or accumulator but PLA does
1255 3 MichaelA
 
1256 2 MichaelA
        ldx #$55        ;x & y protected
1257
        ldy #$aa
1258
        set_a 1,$ff     ;push
1259
        pha
1260
        tst_a 1,$ff
1261
        set_a 0,0
1262
        pha
1263
        tst_a 0,0
1264
        set_a $ff,$ff
1265
        pha
1266
        tst_a $ff,$ff
1267
        set_a 1,0
1268
        pha
1269
        tst_a 1,0
1270
        set_a 0,$ff
1271
        pha
1272
        tst_a 0,$ff
1273
        set_a $ff,0
1274
        pha
1275
        tst_a $ff,0
1276
        set_a 0,$ff     ;pull
1277
        pla
1278
        tst_a $ff,$ff-zero
1279
        set_a $ff,0
1280
        pla
1281
        tst_a 0,zero
1282
        set_a $fe,$ff
1283
        pla
1284
        tst_a 1,$ff-zero-minus
1285
        set_a 0,0
1286
        pla
1287
        tst_a $ff,minus
1288
        set_a $ff,$ff
1289
        pla
1290
        tst_a 0,$ff-minus
1291
        set_a $fe,0
1292
        pla
1293
        tst_a 1,0
1294
        cpx #$55        ;x & y unchanged?
1295
        trap_ne
1296
        cpy #$aa
1297
        trap_ne
1298
        next_test
1299
 
1300
; partial pretest EOR #
1301 3 MichaelA
 
1302 2 MichaelA
        set_a $3c,0
1303
        eor #$c3
1304
        tst_a $ff,fn
1305
        set_a $c3,0
1306
        eor #$c3
1307
        tst_a 0,fz
1308
        next_test
1309
 
1310
; PC modifying instructions except branches (NOP, JMP, JSR, RTS, BRK, RTI)
1311
; testing NOP
1312 3 MichaelA
 
1313 2 MichaelA
        ldx #$24
1314
        ldy #$42
1315
        set_a $18,0
1316
        nop
1317
        tst_a $18,0
1318
        cpx #$24
1319
        trap_ne
1320
        cpy #$42
1321
        trap_ne
1322
        ldx #$db
1323
        ldy #$bd
1324
        set_a $e7,$ff
1325
        nop
1326
        tst_a $e7,$ff
1327
        cpx #$db
1328
        trap_ne
1329
        cpy #$bd
1330
        trap_ne
1331
        next_test
1332
 
1333
; jump absolute
1334 3 MichaelA
 
1335 2 MichaelA
        set_stat $0
1336
        lda #'F'
1337
        ldx #'A'
1338
        ldy #'R'        ;N=0, V=0, Z=0, C=0
1339
        jmp test_far
1340
        nop
1341
        nop
1342
        trap_ne         ;runover protection
1343
        inx
1344
        inx
1345
far_ret
1346
        trap_eq         ;returned flags OK?
1347
        trap_pl
1348
        trap_cc
1349
        trap_vc
1350
        cmp #('F'^$aa)  ;returned registers OK?
1351
        trap_ne
1352
        cpx #('A'+1)
1353
        trap_ne
1354
        cpy #('R'-3)
1355
        trap_ne
1356
        dex
1357
        iny
1358
        iny
1359
        iny
1360
        eor #$aa        ;N=0, V=1, Z=0, C=1
1361
        jmp test_near
1362
        nop
1363
        nop
1364
        trap_ne         ;runover protection
1365
        inx
1366
        inx
1367
test_near
1368
        trap_eq         ;passed flags OK?
1369
        trap_mi
1370
        trap_cc
1371
        trap_vc
1372
        cmp #'F'        ;passed registers OK?
1373
        trap_ne
1374
        cpx #'A'
1375
        trap_ne
1376
        cpy #'R'
1377
        trap_ne
1378
        next_test
1379
 
1380
; jump indirect
1381 3 MichaelA
 
1382 2 MichaelA
        set_stat 0
1383
        lda #'I'
1384
        ldx #'N'
1385
        ldy #'D'        ;N=0, V=0, Z=0, C=0
1386
        jmp (ptr_tst_ind)
1387
        nop
1388
        trap_ne         ;runover protection
1389
        dey
1390
        dey
1391
ind_ret
1392
        php             ;either SP or Y count will fail, if we do not hit
1393
        dey
1394
        dey
1395
        dey
1396
        plp
1397
        trap_eq         ;returned flags OK?
1398
        trap_pl
1399
        trap_cc
1400
        trap_vc
1401
        cmp #('I'^$aa)  ;returned registers OK?
1402
        trap_ne
1403
        cpx #('N'+1)
1404
        trap_ne
1405
        cpy #('D'-6)
1406
        trap_ne
1407
        tsx             ;SP check
1408
        cpx #$ff
1409
        trap_ne
1410
        next_test
1411
 
1412
; jump subroutine & return from subroutine
1413 3 MichaelA
 
1414 2 MichaelA
        set_stat 0
1415
        lda #'J'
1416
        ldx #'S'
1417
        ldy #'R'        ;N=0, V=0, Z=0, C=0
1418
        jsr test_jsr
1419
jsr_ret = *-1           ;last address of jsr = return address
1420
        php             ;either SP or Y count will fail, if we do not hit
1421
        dey
1422
        dey
1423
        dey
1424
        plp
1425
        trap_eq         ;returned flags OK?
1426
        trap_pl
1427
        trap_cc
1428
        trap_vc
1429
        cmp #('J'^$aa)  ;returned registers OK?
1430
        trap_ne
1431
        cpx #('S'+1)
1432
        trap_ne
1433
        cpy #('R'-6)
1434
        trap_ne
1435
        tsx             ;sp?
1436
        cpx #$ff
1437
        trap_ne
1438
        next_test
1439
 
1440
; break & return from interrupt
1441 3 MichaelA
 
1442 2 MichaelA
    if ROM_vectors = 1
1443 3 MichaelA
 
1444 2 MichaelA
        set_stat 0
1445
        lda #'B'
1446
        ldx #'R'
1447
        ldy #'K'        ;N=0, V=0, Z=0, C=0
1448
        brk
1449 3 MichaelA
 
1450 2 MichaelA
    else
1451 3 MichaelA
 
1452
        lda #hi(brk_ret) ;emulated break
1453 2 MichaelA
        pha
1454 3 MichaelA
        lda #lo(brk_ret-1) ; M65C02 pushes BRK+1 not BRK+2
1455 2 MichaelA
        pha
1456
        lda #fao        ;set break & unused on stack
1457
        pha
1458
        set_stat intdis
1459
        lda #'B'
1460
        ldx #'R'
1461
        ldy #'K'        ;N=0, V=0, Z=0, C=0
1462
        jmp irq_trap
1463 3 MichaelA
 
1464 2 MichaelA
    endif
1465 3 MichaelA
 
1466 2 MichaelA
        dey             ;should not be executed
1467
brk_ret                 ;address of break return
1468
        php             ;either SP or Y count will fail, if we do not hit
1469
        dey
1470
        dey
1471
        dey
1472
        cmp #('B'^$aa)  ;returned registers OK?
1473
        trap_ne
1474
        cpx #('R'+1)
1475
        trap_ne
1476
        cpy #('K'-6)
1477
        trap_ne
1478
        pla             ;returned flags OK (unchanged)?
1479
        cmp_flag 0
1480
        trap_ne
1481
        tsx             ;sp?
1482
        cpx #$ff
1483
        trap_ne
1484
        next_test
1485
 
1486
; test set and clear flags CLC CLI CLD CLV SEC SEI SED
1487 3 MichaelA
 
1488 2 MichaelA
        set_stat $ff
1489
        clc
1490
        tst_stat $ff-carry
1491
        sec
1492
        tst_stat $ff
1493 3 MichaelA
 
1494 2 MichaelA
    if I_flag = 3
1495 3 MichaelA
 
1496 2 MichaelA
        cli
1497
        tst_stat $ff-intdis
1498
        sei
1499
        tst_stat $ff
1500 3 MichaelA
 
1501 2 MichaelA
    endif
1502 3 MichaelA
 
1503 2 MichaelA
        cld
1504
        tst_stat $ff-decmode
1505
        sed
1506
        tst_stat $ff
1507
        clv
1508
        tst_stat $ff-overfl
1509
        set_stat 0
1510
        tst_stat 0
1511
        sec
1512
        tst_stat carry
1513
        clc
1514
        tst_stat 0
1515 3 MichaelA
 
1516 2 MichaelA
    if I_flag = 3
1517 3 MichaelA
 
1518 2 MichaelA
        sei
1519
        tst_stat intdis
1520
        cli
1521
        tst_stat 0
1522 3 MichaelA
 
1523 2 MichaelA
    endif
1524 3 MichaelA
 
1525 2 MichaelA
        sed
1526
        tst_stat decmode
1527
        cld
1528
        tst_stat 0
1529
        set_stat overfl
1530
        tst_stat overfl
1531
        clv
1532
        tst_stat 0
1533
        next_test
1534 3 MichaelA
 
1535 2 MichaelA
; testing index register increment/decrement and transfer
1536
; INX INY DEX DEY TAX TXA TAY TYA
1537 3 MichaelA
 
1538 2 MichaelA
        ldx #$fe
1539
        set_stat $ff
1540
        inx             ;ff
1541
        tst_x $ff,$ff-zero
1542
        inx             ;00
1543
        tst_x 0,$ff-minus
1544
        inx             ;01
1545
        tst_x 1,$ff-minus-zero
1546
        dex             ;00
1547
        tst_x 0,$ff-minus
1548
        dex             ;ff
1549
        tst_x $ff,$ff-zero
1550
        dex             ;fe
1551
        set_stat 0
1552
        inx             ;ff
1553
        tst_x $ff,minus
1554
        inx             ;00
1555
        tst_x 0,zero
1556
        inx             ;01
1557
        tst_x 1,0
1558
        dex             ;00
1559
        tst_x 0,zero
1560
        dex             ;ff
1561
        tst_x $ff,minus
1562
 
1563
        ldy #$fe
1564
        set_stat $ff
1565
        iny             ;ff
1566
        tst_y $ff,$ff-zero
1567
        iny             ;00
1568
        tst_y 0,$ff-minus
1569
        iny             ;01
1570
        tst_y 1,$ff-minus-zero
1571
        dey             ;00
1572
        tst_y 0,$ff-minus
1573
        dey             ;ff
1574
        tst_y $ff,$ff-zero
1575
        dey             ;fe
1576
        set_stat 0
1577
        iny             ;ff
1578
        tst_y $ff,0+minus
1579
        iny             ;00
1580
        tst_y 0,zero
1581
        iny             ;01
1582
        tst_y 1,0
1583
        dey             ;00
1584
        tst_y 0,zero
1585
        dey             ;ff
1586
        tst_y $ff,minus
1587
 
1588
        ldx #$ff
1589
        set_stat $ff
1590
        txa
1591
        tst_a $ff,$ff-zero
1592
        php
1593
        inx             ;00
1594
        plp
1595
        txa
1596
        tst_a 0,$ff-minus
1597
        php
1598
        inx             ;01
1599
        plp
1600
        txa
1601
        tst_a 1,$ff-minus-zero
1602
        set_stat 0
1603
        txa
1604
        tst_a 1,0
1605
        php
1606
        dex             ;00
1607
        plp
1608
        txa
1609
        tst_a 0,zero
1610
        php
1611
        dex             ;ff
1612
        plp
1613
        txa
1614
        tst_a $ff,minus
1615
 
1616
        ldy #$ff
1617
        set_stat $ff
1618
        tya
1619
        tst_a $ff,$ff-zero
1620
        php
1621
        iny             ;00
1622
        plp
1623
        tya
1624
        tst_a 0,$ff-minus
1625
        php
1626
        iny             ;01
1627
        plp
1628
        tya
1629
        tst_a 1,$ff-minus-zero
1630
        set_stat 0
1631
        tya
1632
        tst_a 1,0
1633
        php
1634
        dey             ;00
1635
        plp
1636
        tya
1637
        tst_a 0,zero
1638
        php
1639
        dey             ;ff
1640
        plp
1641
        tya
1642
        tst_a $ff,minus
1643
 
1644
        load_flag $ff
1645
        pha
1646
        ldx #$ff        ;ff
1647
        txa
1648
        plp
1649
        tay
1650
        tst_y $ff,$ff-zero
1651
        php
1652
        inx             ;00
1653
        txa
1654
        plp
1655
        tay
1656
        tst_y 0,$ff-minus
1657
        php
1658
        inx             ;01
1659
        txa
1660
        plp
1661
        tay
1662
        tst_y 1,$ff-minus-zero
1663
        load_flag 0
1664
        pha
1665
        lda #0
1666
        txa
1667
        plp
1668
        tay
1669
        tst_y 1,0
1670
        php
1671
        dex             ;00
1672
        txa
1673
        plp
1674
        tay
1675
        tst_y 0,zero
1676
        php
1677
        dex             ;ff
1678
        txa
1679
        plp
1680
        tay
1681
        tst_y $ff,minus
1682
 
1683
 
1684
        load_flag $ff
1685
        pha
1686
        ldy #$ff        ;ff
1687
        tya
1688
        plp
1689
        tax
1690
        tst_x $ff,$ff-zero
1691
        php
1692
        iny             ;00
1693
        tya
1694
        plp
1695
        tax
1696
        tst_x 0,$ff-minus
1697
        php
1698
        iny             ;01
1699
        tya
1700
        plp
1701
        tax
1702
        tst_x 1,$ff-minus-zero
1703
        load_flag 0
1704
        pha
1705
        lda #0          ;preset status
1706
        tya
1707
        plp
1708
        tax
1709
        tst_x 1,0
1710
        php
1711
        dey             ;00
1712
        tya
1713
        plp
1714
        tax
1715
        tst_x 0,zero
1716
        php
1717
        dey             ;ff
1718
        tya
1719
        plp
1720
        tax
1721
        tst_x $ff,minus
1722
        next_test
1723
 
1724
;TSX sets NZ - TXS does not
1725 3 MichaelA
 
1726 2 MichaelA
        ldx #1          ;01
1727
        set_stat $ff
1728
        txs
1729
        php
1730
        lda $101
1731
        cmp_flag $ff
1732
        trap_ne
1733
        set_stat 0
1734
        txs
1735
        php
1736
        lda $101
1737
        cmp_flag 0
1738
        trap_ne
1739
        dex             ;00
1740
        set_stat $ff
1741
        txs
1742
        php
1743
        lda $100
1744
        cmp_flag $ff
1745
        trap_ne
1746
        set_stat 0
1747
        txs
1748
        php
1749
        lda $100
1750
        cmp_flag 0
1751
        trap_ne
1752
        dex             ;ff
1753
        set_stat $ff
1754
        txs
1755
        php
1756
        lda $1ff
1757
        cmp_flag $ff
1758
        trap_ne
1759
        set_stat 0
1760
        txs
1761
        php
1762
        lda $1ff
1763
        cmp_flag 0
1764
 
1765
        ldx #1
1766
        txs             ;sp=01
1767
        set_stat $ff
1768
        tsx             ;clears Z, N
1769
        php             ;sp=00
1770
        cpx #1
1771
        trap_ne
1772
        lda $101
1773
        cmp_flag $ff-minus-zero
1774
        trap_ne
1775
        set_stat $ff
1776
        tsx             ;clears N, sets Z
1777
        php             ;sp=ff
1778
        cpx #0
1779
        trap_ne
1780
        lda $100
1781
        cmp_flag $ff-minus
1782
        trap_ne
1783
        set_stat $ff
1784
        tsx             ;clears N, sets Z
1785
        php             ;sp=fe
1786
        cpx #$ff
1787
        trap_ne
1788
        lda $1ff
1789
        cmp_flag $ff-zero
1790
        trap_ne
1791
 
1792
        ldx #1
1793
        txs             ;sp=01
1794
        set_stat 0
1795
        tsx             ;clears Z, N
1796
        php             ;sp=00
1797
        cpx #1
1798
        trap_ne
1799
        lda $101
1800
        cmp_flag 0
1801
        trap_ne
1802
        set_stat 0
1803
        tsx             ;clears N, sets Z
1804
        php             ;sp=ff
1805
        cpx #0
1806
        trap_ne
1807
        lda $100
1808
        cmp_flag zero
1809
        trap_ne
1810
        set_stat 0
1811
        tsx             ;clears N, sets Z
1812
        php             ;sp=fe
1813
        cpx #$ff
1814
        trap_ne
1815
        lda $1ff
1816
        cmp_flag minus
1817
        trap_ne
1818
        pla             ;sp=ff
1819
        next_test
1820
 
1821
; testing index register load & store LDY LDX STY STX all addressing modes
1822
; LDX / STX - zp,y / abs,y
1823 3 MichaelA
 
1824 2 MichaelA
        ldy #3
1825
tldx
1826
        set_stat 0
1827
        ldx zp1,y
1828
        php         ;test stores do not alter flags
1829
        txa
1830
        eor #$c3
1831
        plp
1832
        sta abst,y
1833
        php         ;flags after load/store sequence
1834
        eor #$c3
1835
        cmp abs1,y  ;test result
1836
        trap_ne
1837
        pla         ;load status
1838
        eor_flag 0
1839
        cmp fLDx,y  ;test flags
1840
        trap_ne
1841
        dey
1842
        bpl tldx
1843
 
1844
        ldy #3
1845
tldx1
1846
        set_stat $ff
1847
        ldx zp1,y
1848
        php         ;test stores do not alter flags
1849
        txa
1850
        eor #$c3
1851
        plp
1852
        sta abst,y
1853
        php         ;flags after load/store sequence
1854
        eor #$c3
1855
        cmp abs1,y  ;test result
1856
        trap_ne
1857
        pla         ;load status
1858
        eor_flag lo~fnz ;mask bits not altered
1859
        cmp fLDx,y  ;test flags
1860
        trap_ne
1861
        dey
1862
        bpl tldx1
1863
 
1864
        ldy #3
1865
tldx2
1866
        set_stat 0
1867
        ldx abs1,y
1868
        php         ;test stores do not alter flags
1869
        txa
1870
        eor #$c3
1871
        tax
1872
        plp
1873
        stx zpt,y
1874
        php         ;flags after load/store sequence
1875
        eor #$c3
1876
        cmp zp1,y   ;test result
1877
        trap_ne
1878
        pla         ;load status
1879
        eor_flag 0
1880
        cmp fLDx,y  ;test flags
1881
        trap_ne
1882
        dey
1883
        bpl tldx2
1884
 
1885
        ldy #3
1886
tldx3
1887
        set_stat $ff
1888
        ldx abs1,y
1889
        php         ;test stores do not alter flags
1890
        txa
1891
        eor #$c3
1892
        tax
1893
        plp
1894
        stx zpt,y
1895
        php         ;flags after load/store sequence
1896
        eor #$c3
1897
        cmp zp1,y   ;test result
1898
        trap_ne
1899
        pla         ;load status
1900
        eor_flag lo~fnz ;mask bits not altered
1901
        cmp fLDx,y  ;test flags
1902
        trap_ne
1903
        dey
1904
        bpl tldx3
1905
 
1906
        ldy #3      ;testing store result
1907
        ldx #0
1908
tstx    lda zpt,y
1909
        eor #$c3
1910
        cmp zp1,y
1911
        trap_ne     ;store to zp data
1912
        stx zpt,y   ;clear
1913
        lda abst,y
1914
        eor #$c3
1915
        cmp abs1,y
1916
        trap_ne     ;store to abs data
1917
        txa
1918
        sta abst,y  ;clear
1919
        dey
1920
        bpl tstx
1921
        next_test
1922
 
1923
; indexed wraparound test (only zp should wrap)
1924 3 MichaelA
 
1925 2 MichaelA
        ldy #3+$fa
1926
tldx4   ldx zp1-$fa&$ff,y   ;wrap on indexed zp
1927
        txa
1928
        sta abst-$fa,y      ;no STX abs,y!
1929
        dey
1930
        cpy #$fa
1931
        bcs tldx4
1932
        ldy #3+$fa
1933
tldx5   ldx abs1-$fa,y      ;no wrap on indexed abs
1934
        stx zpt-$fa&$ff,y
1935
        dey
1936
        cpy #$fa
1937
        bcs tldx5
1938
        ldy #3      ;testing wraparound result
1939
        ldx #0
1940
tstx1   lda zpt,y
1941
        cmp zp1,y
1942
        trap_ne     ;store to zp data
1943
        stx zpt,y   ;clear
1944
        lda abst,y
1945
        cmp abs1,y
1946
        trap_ne     ;store to abs data
1947
        txa
1948
        sta abst,y  ;clear
1949
        dey
1950
        bpl tstx1
1951
        next_test
1952
 
1953
; LDY / STY - zp,x / abs,x
1954 3 MichaelA
 
1955 2 MichaelA
        ldx #3
1956
tldy
1957
        set_stat 0
1958
        ldy zp1,x
1959
        php         ;test stores do not alter flags
1960
        tya
1961
        eor #$c3
1962
        plp
1963
        sta abst,x
1964
        php         ;flags after load/store sequence
1965
        eor #$c3
1966
        cmp abs1,x  ;test result
1967
        trap_ne
1968
        pla         ;load status
1969
        eor_flag 0
1970
        cmp fLDx,x  ;test flags
1971
        trap_ne
1972
        dex
1973
        bpl tldy
1974
 
1975
        ldx #3
1976
tldy1
1977
        set_stat $ff
1978
        ldy zp1,x
1979
        php         ;test stores do not alter flags
1980
        tya
1981
        eor #$c3
1982
        plp
1983
        sta abst,x
1984
        php         ;flags after load/store sequence
1985
        eor #$c3
1986
        cmp abs1,x  ;test result
1987
        trap_ne
1988
        pla         ;load status
1989
        eor_flag lo~fnz ;mask bits not altered
1990
        cmp fLDx,x  ;test flags
1991
        trap_ne
1992
        dex
1993
        bpl tldy1
1994
 
1995
        ldx #3
1996
tldy2
1997
        set_stat 0
1998
        ldy abs1,x
1999
        php         ;test stores do not alter flags
2000
        tya
2001
        eor #$c3
2002
        tay
2003
        plp
2004
        sty zpt,x
2005
        php         ;flags after load/store sequence
2006
        eor #$c3
2007
        cmp zp1,x   ;test result
2008
        trap_ne
2009
        pla         ;load status
2010
        eor_flag 0
2011
        cmp fLDx,x  ;test flags
2012
        trap_ne
2013
        dex
2014
        bpl tldy2
2015
 
2016
        ldx #3
2017
tldy3
2018
        set_stat $ff
2019
        ldy abs1,x
2020
        php         ;test stores do not alter flags
2021
        tya
2022
        eor #$c3
2023
        tay
2024
        plp
2025
        sty zpt,x
2026
        php         ;flags after load/store sequence
2027
        eor #$c3
2028
        cmp zp1,x   ;test result
2029
        trap_ne
2030
        pla         ;load status
2031
        eor_flag lo~fnz ;mask bits not altered
2032
        cmp fLDx,x  ;test flags
2033
        trap_ne
2034
        dex
2035
        bpl tldy3
2036
 
2037
        ldx #3      ;testing store result
2038
        ldy #0
2039
tsty    lda zpt,x
2040
        eor #$c3
2041
        cmp zp1,x
2042
        trap_ne     ;store to zp,x data
2043
        sty zpt,x   ;clear
2044
        lda abst,x
2045
        eor #$c3
2046
        cmp abs1,x
2047
        trap_ne     ;store to abs,x data
2048
        txa
2049
        sta abst,x  ;clear
2050
        dex
2051
        bpl tsty
2052
        next_test
2053
 
2054
; indexed wraparound test (only zp should wrap)
2055 3 MichaelA
 
2056 2 MichaelA
        ldx #3+$fa
2057
tldy4   ldy zp1-$fa&$ff,x   ;wrap on indexed zp
2058
        tya
2059
        sta abst-$fa,x      ;no STX abs,x!
2060
        dex
2061
        cpx #$fa
2062
        bcs tldy4
2063
        ldx #3+$fa
2064
tldy5   ldy abs1-$fa,x      ;no wrap on indexed abs
2065
        sty zpt-$fa&$ff,x
2066
        dex
2067
        cpx #$fa
2068
        bcs tldy5
2069
        ldx #3      ;testing wraparound result
2070
        ldy #0
2071
tsty1   lda zpt,x
2072
        cmp zp1,x
2073
        trap_ne     ;store to zp,x data
2074
        sty zpt,x   ;clear
2075
        lda abst,x
2076
        cmp abs1,x
2077
        trap_ne     ;store to abs,x data
2078
        txa
2079
        sta abst,x  ;clear
2080
        dex
2081
        bpl tsty1
2082
        next_test
2083
 
2084
; LDX / STX - zp / abs / #
2085 3 MichaelA
 
2086 2 MichaelA
        set_stat 0
2087
        ldx zp1
2088
        php         ;test stores do not alter flags
2089
        txa
2090
        eor #$c3
2091
        tax
2092
        plp
2093
        stx abst
2094
        php         ;flags after load/store sequence
2095
        eor #$c3
2096
        tax
2097
        cpx #$c3    ;test result
2098
        trap_ne
2099
        pla         ;load status
2100
        eor_flag 0
2101
        cmp fLDx    ;test flags
2102
        trap_ne
2103
        set_stat 0
2104
        ldx zp1+1
2105
        php         ;test stores do not alter flags
2106
        txa
2107
        eor #$c3
2108
        tax
2109
        plp
2110
        stx abst+1
2111
        php         ;flags after load/store sequence
2112
        eor #$c3
2113
        tax
2114
        cpx #$82    ;test result
2115
        trap_ne
2116
        pla         ;load status
2117
        eor_flag 0
2118
        cmp fLDx+1  ;test flags
2119
        trap_ne
2120
        set_stat 0
2121
        ldx zp1+2
2122
        php         ;test stores do not alter flags
2123
        txa
2124
        eor #$c3
2125
        tax
2126
        plp
2127
        stx abst+2
2128
        php         ;flags after load/store sequence
2129
        eor #$c3
2130
        tax
2131
        cpx #$41    ;test result
2132
        trap_ne
2133
        pla         ;load status
2134
        eor_flag 0
2135
        cmp fLDx+2  ;test flags
2136
        trap_ne
2137
        set_stat 0
2138
        ldx zp1+3
2139
        php         ;test stores do not alter flags
2140
        txa
2141
        eor #$c3
2142
        tax
2143
        plp
2144
        stx abst+3
2145
        php         ;flags after load/store sequence
2146
        eor #$c3
2147
        tax
2148
        cpx #0      ;test result
2149
        trap_ne
2150
        pla         ;load status
2151
        eor_flag 0
2152
        cmp fLDx+3  ;test flags
2153
        trap_ne
2154
 
2155
        set_stat $ff
2156
        ldx zp1
2157
        php         ;test stores do not alter flags
2158
        txa
2159
        eor #$c3
2160
        tax
2161
        plp
2162
        stx abst
2163
        php         ;flags after load/store sequence
2164
        eor #$c3
2165
        tax
2166
        cpx #$c3    ;test result
2167
        trap_ne     ;
2168
        pla         ;load status
2169
        eor_flag lo~fnz ;mask bits not altered
2170
        cmp fLDx    ;test flags
2171
        trap_ne
2172
        set_stat $ff
2173
        ldx zp1+1
2174
        php         ;test stores do not alter flags
2175
        txa
2176
        eor #$c3
2177
        tax
2178
        plp
2179
        stx abst+1
2180
        php         ;flags after load/store sequence
2181
        eor #$c3
2182
        tax
2183
        cpx #$82    ;test result
2184
        trap_ne
2185
        pla         ;load status
2186
        eor_flag lo~fnz ;mask bits not altered
2187
        cmp fLDx+1  ;test flags
2188
        trap_ne
2189
        set_stat $ff
2190
        ldx zp1+2
2191
        php         ;test stores do not alter flags
2192
        txa
2193
        eor #$c3
2194
        tax
2195
        plp
2196
        stx abst+2
2197
        php         ;flags after load/store sequence
2198
        eor #$c3
2199
        tax
2200
        cpx #$41    ;test result
2201
        trap_ne     ;
2202
        pla         ;load status
2203
        eor_flag lo~fnz ;mask bits not altered
2204
        cmp fLDx+2  ;test flags
2205
        trap_ne
2206
        set_stat $ff
2207
        ldx zp1+3
2208
        php         ;test stores do not alter flags
2209
        txa
2210
        eor #$c3
2211
        tax
2212
        plp
2213
        stx abst+3
2214
        php         ;flags after load/store sequence
2215
        eor #$c3
2216
        tax
2217
        cpx #0      ;test result
2218
        trap_ne
2219
        pla         ;load status
2220
        eor_flag lo~fnz ;mask bits not altered
2221
        cmp fLDx+3  ;test flags
2222
        trap_ne
2223
 
2224
        set_stat 0
2225
        ldx abs1
2226
        php         ;test stores do not alter flags
2227
        txa
2228
        eor #$c3
2229
        tax
2230
        plp
2231
        stx zpt
2232
        php         ;flags after load/store sequence
2233
        eor #$c3
2234
        cmp zp1     ;test result
2235
        trap_ne
2236
        pla         ;load status
2237
        eor_flag 0
2238
        cmp fLDx    ;test flags
2239
        trap_ne
2240
        set_stat 0
2241
        ldx abs1+1
2242
        php         ;test stores do not alter flags
2243
        txa
2244
        eor #$c3
2245
        tax
2246
        plp
2247
        stx zpt+1
2248
        php         ;flags after load/store sequence
2249
        eor #$c3
2250
        cmp zp1+1   ;test result
2251
        trap_ne
2252
        pla         ;load status
2253
        eor_flag 0
2254
        cmp fLDx+1  ;test flags
2255
        trap_ne
2256
        set_stat 0
2257
        ldx abs1+2
2258
        php         ;test stores do not alter flags
2259
        txa
2260
        eor #$c3
2261
        tax
2262
        plp
2263
        stx zpt+2
2264
        php         ;flags after load/store sequence
2265
        eor #$c3
2266
        cmp zp1+2   ;test result
2267
        trap_ne
2268
        pla         ;load status
2269
        eor_flag 0
2270
        cmp fLDx+2  ;test flags
2271
        trap_ne
2272
        set_stat 0
2273
        ldx abs1+3
2274
        php         ;test stores do not alter flags
2275
        txa
2276
        eor #$c3
2277
        tax
2278
        plp
2279
        stx zpt+3
2280
        php         ;flags after load/store sequence
2281
        eor #$c3
2282
        cmp zp1+3   ;test result
2283
        trap_ne
2284
        pla         ;load status
2285
        eor_flag 0
2286
        cmp fLDx+3  ;test flags
2287
        trap_ne
2288
 
2289
        set_stat $ff
2290
        ldx abs1
2291
        php         ;test stores do not alter flags
2292
        txa
2293
        eor #$c3
2294
        tax
2295
        plp
2296
        stx zpt
2297
        php         ;flags after load/store sequence
2298
        eor #$c3
2299
        tax
2300
        cpx zp1     ;test result
2301
        trap_ne
2302
        pla         ;load status
2303
        eor_flag lo~fnz ;mask bits not altered
2304
        cmp fLDx    ;test flags
2305
        trap_ne
2306
        set_stat $ff
2307
        ldx abs1+1
2308
        php         ;test stores do not alter flags
2309
        txa
2310
        eor #$c3
2311
        tax
2312
        plp
2313
        stx zpt+1
2314
        php         ;flags after load/store sequence
2315
        eor #$c3
2316
        tax
2317
        cpx zp1+1   ;test result
2318
        trap_ne
2319
        pla         ;load status
2320
        eor_flag lo~fnz ;mask bits not altered
2321
        cmp fLDx+1  ;test flags
2322
        trap_ne
2323
        set_stat $ff
2324
        ldx abs1+2
2325
        php         ;test stores do not alter flags
2326
        txa
2327
        eor #$c3
2328
        tax
2329
        plp
2330
        stx zpt+2
2331
        php         ;flags after load/store sequence
2332
        eor #$c3
2333
        tax
2334
        cpx zp1+2   ;test result
2335
        trap_ne
2336
        pla         ;load status
2337
        eor_flag lo~fnz ;mask bits not altered
2338
        cmp fLDx+2  ;test flags
2339
        trap_ne
2340
        set_stat $ff
2341
        ldx abs1+3
2342
        php         ;test stores do not alter flags
2343
        txa
2344
        eor #$c3
2345
        tax
2346
        plp
2347
        stx zpt+3
2348
        php         ;flags after load/store sequence
2349
        eor #$c3
2350
        tax
2351
        cpx zp1+3   ;test result
2352
        trap_ne
2353
        pla         ;load status
2354
        eor_flag lo~fnz ;mask bits not altered
2355
        cmp fLDx+3  ;test flags
2356
        trap_ne
2357
 
2358
        set_stat 0
2359
        ldx #$c3
2360
        php
2361
        cpx abs1    ;test result
2362
        trap_ne
2363
        pla         ;load status
2364
        eor_flag 0
2365
        cmp fLDx    ;test flags
2366
        trap_ne
2367
        set_stat 0
2368
        ldx #$82
2369
        php
2370
        cpx abs1+1  ;test result
2371
        trap_ne
2372
        pla         ;load status
2373
        eor_flag 0
2374
        cmp fLDx+1  ;test flags
2375
        trap_ne
2376
        set_stat 0
2377
        ldx #$41
2378
        php
2379
        cpx abs1+2  ;test result
2380
        trap_ne
2381
        pla         ;load status
2382
        eor_flag 0
2383
        cmp fLDx+2  ;test flags
2384
        trap_ne
2385
        set_stat 0
2386
        ldx #0
2387
        php
2388
        cpx abs1+3  ;test result
2389
        trap_ne
2390
        pla         ;load status
2391
        eor_flag 0
2392
        cmp fLDx+3  ;test flags
2393
        trap_ne
2394
 
2395
        set_stat $ff
2396
        ldx #$c3
2397
        php
2398
        cpx abs1    ;test result
2399
        trap_ne
2400
        pla         ;load status
2401
        eor_flag lo~fnz ;mask bits not altered
2402
        cmp fLDx    ;test flags
2403
        trap_ne
2404
        set_stat $ff
2405
        ldx #$82
2406
        php
2407
        cpx abs1+1  ;test result
2408
        trap_ne
2409
        pla         ;load status
2410
        eor_flag lo~fnz ;mask bits not altered
2411
        cmp fLDx+1  ;test flags
2412
        trap_ne
2413
        set_stat $ff
2414
        ldx #$41
2415
        php
2416
        cpx abs1+2  ;test result
2417
        trap_ne
2418
        pla         ;load status
2419
        eor_flag lo~fnz ;mask bits not altered
2420
        cmp fLDx+2  ;test flags
2421
        trap_ne
2422
        set_stat $ff
2423
        ldx #0
2424
        php
2425
        cpx abs1+3  ;test result
2426
        trap_ne
2427
        pla         ;load status
2428
        eor_flag lo~fnz ;mask bits not altered
2429
        cmp fLDx+3  ;test flags
2430
        trap_ne
2431
 
2432
        ldx #0
2433
        lda zpt
2434
        eor #$c3
2435
        cmp zp1
2436
        trap_ne     ;store to zp data
2437
        stx zpt     ;clear
2438
        lda abst
2439
        eor #$c3
2440
        cmp abs1
2441
        trap_ne     ;store to abs data
2442
        stx abst    ;clear
2443
        lda zpt+1
2444
        eor #$c3
2445
        cmp zp1+1
2446
        trap_ne     ;store to zp data
2447
        stx zpt+1   ;clear
2448
        lda abst+1
2449
        eor #$c3
2450
        cmp abs1+1
2451
        trap_ne     ;store to abs data
2452
        stx abst+1  ;clear
2453
        lda zpt+2
2454
        eor #$c3
2455
        cmp zp1+2
2456
        trap_ne     ;store to zp data
2457
        stx zpt+2   ;clear
2458
        lda abst+2
2459
        eor #$c3
2460
        cmp abs1+2
2461
        trap_ne     ;store to abs data
2462
        stx abst+2  ;clear
2463
        lda zpt+3
2464
        eor #$c3
2465
        cmp zp1+3
2466
        trap_ne     ;store to zp data
2467
        stx zpt+3   ;clear
2468
        lda abst+3
2469
        eor #$c3
2470
        cmp abs1+3
2471
        trap_ne     ;store to abs data
2472
        stx abst+3  ;clear
2473
        next_test
2474
 
2475
; LDY / STY - zp / abs / #
2476 3 MichaelA
 
2477 2 MichaelA
        set_stat 0
2478
        ldy zp1
2479
        php         ;test stores do not alter flags
2480
        tya
2481
        eor #$c3
2482
        tay
2483
        plp
2484
        sty abst
2485
        php         ;flags after load/store sequence
2486
        eor #$c3
2487
        tay
2488
        cpy #$c3    ;test result
2489
        trap_ne
2490
        pla         ;load status
2491
        eor_flag 0
2492
        cmp fLDx    ;test flags
2493
        trap_ne
2494
        set_stat 0
2495
        ldy zp1+1
2496
        php         ;test stores do not alter flags
2497
        tya
2498
        eor #$c3
2499
        tay
2500
        plp
2501
        sty abst+1
2502
        php         ;flags after load/store sequence
2503
        eor #$c3
2504
        tay
2505
        cpy #$82    ;test result
2506
        trap_ne
2507
        pla         ;load status
2508
        eor_flag 0
2509
        cmp fLDx+1  ;test flags
2510
        trap_ne
2511
        set_stat 0
2512
        ldy zp1+2
2513
        php         ;test stores do not alter flags
2514
        tya
2515
        eor #$c3
2516
        tay
2517
        plp
2518
        sty abst+2
2519
        php         ;flags after load/store sequence
2520
        eor #$c3
2521
        tay
2522
        cpy #$41    ;test result
2523
        trap_ne
2524
        pla         ;load status
2525
        eor_flag 0
2526
        cmp fLDx+2  ;test flags
2527
        trap_ne
2528
        set_stat 0
2529
        ldy zp1+3
2530
        php         ;test stores do not alter flags
2531
        tya
2532
        eor #$c3
2533
        tay
2534
        plp
2535
        sty abst+3
2536
        php         ;flags after load/store sequence
2537
        eor #$c3
2538
        tay
2539
        cpy #0      ;test result
2540
        trap_ne
2541
        pla         ;load status
2542
        eor_flag 0
2543
        cmp fLDx+3  ;test flags
2544
        trap_ne
2545
 
2546
        set_stat $ff
2547
        ldy zp1
2548
        php         ;test stores do not alter flags
2549
        tya
2550
        eor #$c3
2551
        tay
2552
        plp
2553
        sty abst
2554
        php         ;flags after load/store sequence
2555
        eor #$c3
2556
        tay
2557
        cpy #$c3    ;test result
2558
        trap_ne
2559
        pla         ;load status
2560
        eor_flag lo~fnz ;mask bits not altered
2561
        cmp fLDx    ;test flags
2562
        trap_ne
2563
        set_stat $ff
2564
        ldy zp1+1
2565
        php         ;test stores do not alter flags
2566
        tya
2567
        eor #$c3
2568
        tay
2569
        plp
2570
        sty abst+1
2571
        php         ;flags after load/store sequence
2572
        eor #$c3
2573
        tay
2574
        cpy #$82   ;test result
2575
        trap_ne
2576
        pla         ;load status
2577
        eor_flag lo~fnz ;mask bits not altered
2578
        cmp fLDx+1  ;test flags
2579
        trap_ne
2580
        set_stat $ff
2581
        ldy zp1+2
2582
        php         ;test stores do not alter flags
2583
        tya
2584
        eor #$c3
2585
        tay
2586
        plp
2587
        sty abst+2
2588
        php         ;flags after load/store sequence
2589
        eor #$c3
2590
        tay
2591
        cpy #$41    ;test result
2592
        trap_ne
2593
        pla         ;load status
2594
        eor_flag lo~fnz ;mask bits not altered
2595
        cmp fLDx+2  ;test flags
2596
        trap_ne
2597
        set_stat $ff
2598
        ldy zp1+3
2599
        php         ;test stores do not alter flags
2600
        tya
2601
        eor #$c3
2602
        tay
2603
        plp
2604
        sty abst+3
2605
        php         ;flags after load/store sequence
2606
        eor #$c3
2607
        tay
2608
        cpy #0      ;test result
2609
        trap_ne
2610
        pla         ;load status
2611
        eor_flag lo~fnz ;mask bits not altered
2612
        cmp fLDx+3  ;test flags
2613
        trap_ne
2614
 
2615
        set_stat 0
2616
        ldy abs1
2617
        php         ;test stores do not alter flags
2618
        tya
2619
        eor #$c3
2620
        tay
2621
        plp
2622
        sty zpt
2623
        php         ;flags after load/store sequence
2624
        eor #$c3
2625
        tay
2626
        cpy zp1     ;test result
2627
        trap_ne
2628
        pla         ;load status
2629
        eor_flag 0
2630
        cmp fLDx    ;test flags
2631
        trap_ne
2632
        set_stat 0
2633
        ldy abs1+1
2634
        php         ;test stores do not alter flags
2635
        tya
2636
        eor #$c3
2637
        tay
2638
        plp
2639
        sty zpt+1
2640
        php         ;flags after load/store sequence
2641
        eor #$c3
2642
        tay
2643
        cpy zp1+1   ;test result
2644
        trap_ne
2645
        pla         ;load status
2646
        eor_flag 0
2647
        cmp fLDx+1  ;test flags
2648
        trap_ne
2649
        set_stat 0
2650
        ldy abs1+2
2651
        php         ;test stores do not alter flags
2652
        tya
2653
        eor #$c3
2654
        tay
2655
        plp
2656
        sty zpt+2
2657
        php         ;flags after load/store sequence
2658
        eor #$c3
2659
        tay
2660
        cpy zp1+2   ;test result
2661
        trap_ne
2662
        pla         ;load status
2663
        eor_flag 0
2664
        cmp fLDx+2  ;test flags
2665
        trap_ne
2666
        set_stat 0
2667
        ldy abs1+3
2668
        php         ;test stores do not alter flags
2669
        tya
2670
        eor #$c3
2671
        tay
2672
        plp
2673
        sty zpt+3
2674
        php         ;flags after load/store sequence
2675
        eor #$c3
2676
        tay
2677
        cpy zp1+3   ;test result
2678
        trap_ne
2679
        pla         ;load status
2680
        eor_flag 0
2681
        cmp fLDx+3  ;test flags
2682
        trap_ne
2683
 
2684
        set_stat $ff
2685
        ldy abs1
2686
        php         ;test stores do not alter flags
2687
        tya
2688
        eor #$c3
2689
        tay
2690
        plp
2691
        sty zpt
2692
        php         ;flags after load/store sequence
2693
        eor #$c3
2694
        tay
2695
        cmp zp1     ;test result
2696
        trap_ne
2697
        pla         ;load status
2698
        eor_flag lo~fnz ;mask bits not altered
2699
        cmp fLDx    ;test flags
2700
        trap_ne
2701
        set_stat $ff
2702
        ldy abs1+1
2703
        php         ;test stores do not alter flags
2704
        tya
2705
        eor #$c3
2706
        tay
2707
        plp
2708
        sty zpt+1
2709
        php         ;flags after load/store sequence
2710
        eor #$c3
2711
        tay
2712
        cmp zp1+1   ;test result
2713
        trap_ne
2714
        pla         ;load status
2715
        eor_flag lo~fnz ;mask bits not altered
2716
        cmp fLDx+1  ;test flags
2717
        trap_ne
2718
        set_stat $ff
2719
        ldy abs1+2
2720
        php         ;test stores do not alter flags
2721
        tya
2722
        eor #$c3
2723
        tay
2724
        plp
2725
        sty zpt+2
2726
        php         ;flags after load/store sequence
2727
        eor #$c3
2728
        tay
2729
        cmp zp1+2   ;test result
2730
        trap_ne
2731
        pla         ;load status
2732
        eor_flag lo~fnz ;mask bits not altered
2733
        cmp fLDx+2  ;test flags
2734
        trap_ne
2735
        set_stat $ff
2736
        ldy abs1+3
2737
        php         ;test stores do not alter flags
2738
        tya
2739
        eor #$c3
2740
        tay
2741
        plp
2742
        sty zpt+3
2743
        php         ;flags after load/store sequence
2744
        eor #$c3
2745
        tay
2746
        cmp zp1+3   ;test result
2747
        trap_ne
2748
        pla         ;load status
2749
        eor_flag lo~fnz ;mask bits not altered
2750
        cmp fLDx+3  ;test flags
2751
        trap_ne
2752
 
2753
 
2754
        set_stat 0
2755
        ldy #$c3
2756
        php
2757
        cpy abs1    ;test result
2758
        trap_ne
2759
        pla         ;load status
2760
        eor_flag 0
2761
        cmp fLDx    ;test flags
2762
        trap_ne
2763
        set_stat 0
2764
        ldy #$82
2765
        php
2766
        cpy abs1+1  ;test result
2767
        trap_ne
2768
        pla         ;load status
2769
        eor_flag 0
2770
        cmp fLDx+1  ;test flags
2771
        trap_ne
2772
        set_stat 0
2773
        ldy #$41
2774
        php
2775
        cpy abs1+2  ;test result
2776
        trap_ne
2777
        pla         ;load status
2778
        eor_flag 0
2779
        cmp fLDx+2  ;test flags
2780
        trap_ne
2781
        set_stat 0
2782
        ldy #0
2783
        php
2784
        cpy abs1+3  ;test result
2785
        trap_ne
2786
        pla         ;load status
2787
        eor_flag 0
2788
        cmp fLDx+3  ;test flags
2789
        trap_ne
2790
 
2791
        set_stat $ff
2792
        ldy #$c3
2793
        php
2794
        cpy abs1    ;test result
2795
        trap_ne
2796
        pla         ;load status
2797
        eor_flag lo~fnz ;mask bits not altered
2798
        cmp fLDx    ;test flags
2799
        trap_ne
2800
        set_stat $ff
2801
        ldy #$82
2802
        php
2803
        cpy abs1+1  ;test result
2804
        trap_ne
2805
        pla         ;load status
2806
        eor_flag lo~fnz ;mask bits not altered
2807
        cmp fLDx+1  ;test flags
2808
        trap_ne
2809
        set_stat $ff
2810
        ldy #$41
2811
        php
2812
        cpy abs1+2   ;test result
2813
        trap_ne
2814
        pla         ;load status
2815
        eor_flag lo~fnz ;mask bits not altered
2816
        cmp fLDx+2  ;test flags
2817
        trap_ne
2818
        set_stat $ff
2819
        ldy #0
2820
        php
2821
        cpy abs1+3  ;test result
2822
        trap_ne
2823
        pla         ;load status
2824
        eor_flag lo~fnz ;mask bits not altered
2825
        cmp fLDx+3  ;test flags
2826
        trap_ne
2827
 
2828
        ldy #0
2829
        lda zpt
2830
        eor #$c3
2831
        cmp zp1
2832
        trap_ne     ;store to zp   data
2833
        sty zpt     ;clear
2834
        lda abst
2835
        eor #$c3
2836
        cmp abs1
2837
        trap_ne     ;store to abs   data
2838
        sty abst    ;clear
2839
        lda zpt+1
2840
        eor #$c3
2841
        cmp zp1+1
2842
        trap_ne     ;store to zp+1 data
2843
        sty zpt+1   ;clear
2844
        lda abst+1
2845
        eor #$c3
2846
        cmp abs1+1
2847
        trap_ne     ;store to abs+1 data
2848
        sty abst+1  ;clear
2849
        lda zpt+2
2850
        eor #$c3
2851
        cmp zp1+2
2852
        trap_ne     ;store to zp+2 data
2853
        sty zpt+2   ;clear
2854
        lda abst+2
2855
        eor #$c3
2856
        cmp abs1+2
2857
        trap_ne     ;store to abs+2 data
2858
        sty abst+2  ;clear
2859
        lda zpt+3
2860
        eor #$c3
2861
        cmp zp1+3
2862
        trap_ne     ;store to zp+3 data
2863
        sty zpt+3   ;clear
2864
        lda abst+3
2865
        eor #$c3
2866
        cmp abs1+3
2867
        trap_ne     ;store to abs+3 data
2868
        sty abst+3  ;clear
2869
        next_test
2870
 
2871
; testing load / store accumulator LDA / STA all addressing modes
2872
; LDA / STA - zp,x / abs,x
2873 3 MichaelA
 
2874 2 MichaelA
        ldx #3
2875
tldax
2876
        set_stat 0
2877
        lda zp1,x
2878
        php         ;test stores do not alter flags
2879
        eor #$c3
2880
        plp
2881
        sta abst,x
2882
        php         ;flags after load/store sequence
2883
        eor #$c3
2884
        cmp abs1,x  ;test result
2885
        trap_ne
2886
        pla         ;load status
2887
        eor_flag 0
2888
        cmp fLDx,x  ;test flags
2889
        trap_ne
2890
        dex
2891
        bpl tldax
2892
 
2893
        ldx #3
2894
tldax1
2895
        set_stat $ff
2896
        lda zp1,x
2897
        php         ;test stores do not alter flags
2898
        eor #$c3
2899
        plp
2900
        sta abst,x
2901
        php         ;flags after load/store sequence
2902
        eor #$c3
2903
        cmp abs1,x   ;test result
2904
        trap_ne
2905
        pla         ;load status
2906
        eor_flag lo~fnz ;mask bits not altered
2907
        cmp fLDx,x  ;test flags
2908
        trap_ne
2909
        dex
2910
        bpl tldax1
2911
 
2912
        ldx #3
2913
tldax2
2914
        set_stat 0
2915
        lda abs1,x
2916
        php         ;test stores do not alter flags
2917
        eor #$c3
2918
        plp
2919
        sta zpt,x
2920
        php         ;flags after load/store sequence
2921
        eor #$c3
2922
        cmp zp1,x   ;test result
2923
        trap_ne
2924
        pla         ;load status
2925
        eor_flag 0
2926
        cmp fLDx,x  ;test flags
2927
        trap_ne
2928
        dex
2929
        bpl tldax2
2930
 
2931
        ldx #3
2932
tldax3
2933
        set_stat $ff
2934
        lda abs1,x
2935
        php         ;test stores do not alter flags
2936
        eor #$c3
2937
        plp
2938
        sta zpt,x
2939
        php         ;flags after load/store sequence
2940
        eor #$c3
2941
        cmp zp1,x   ;test result
2942
        trap_ne
2943
        pla         ;load status
2944
        eor_flag lo~fnz ;mask bits not altered
2945
        cmp fLDx,x  ;test flags
2946
        trap_ne
2947
        dex
2948
        bpl tldax3
2949
 
2950
        ldx #3      ;testing store result
2951
        ldy #0
2952
tstax   lda zpt,x
2953
        eor #$c3
2954
        cmp zp1,x
2955
        trap_ne     ;store to zp,x data
2956
        sty zpt,x   ;clear
2957
        lda abst,x
2958
        eor #$c3
2959
        cmp abs1,x
2960
        trap_ne     ;store to abs,x data
2961
        txa
2962
        sta abst,x  ;clear
2963
        dex
2964
        bpl tstax
2965
        next_test
2966
 
2967
; LDA / STA - (zp),y / abs,y / (zp,x)
2968 3 MichaelA
 
2969 2 MichaelA
        ldy #3
2970
tlday
2971
        set_stat 0
2972
        lda (ind1),y
2973
        php         ;test stores do not alter flags
2974
        eor #$c3
2975
        plp
2976
        sta abst,y
2977
        php         ;flags after load/store sequence
2978
        eor #$c3
2979
        cmp abs1,y  ;test result
2980
        trap_ne
2981
        pla         ;load status
2982
        eor_flag 0
2983
        cmp fLDx,y  ;test flags
2984
        trap_ne
2985
        dey
2986
        bpl tlday
2987
 
2988
        ldy #3
2989
tlday1
2990
        set_stat $ff
2991
        lda (ind1),y
2992
        php         ;test stores do not alter flags
2993
        eor #$c3
2994
        plp
2995
        sta abst,y
2996
        php         ;flags after load/store sequence
2997
        eor #$c3
2998
        cmp abs1,y  ;test result
2999
        trap_ne
3000
        pla         ;load status
3001
        eor_flag lo~fnz ;mask bits not altered
3002
        cmp fLDx,y  ;test flags
3003
        trap_ne
3004
        dey
3005
        bpl tlday1
3006
 
3007
        ldy #3      ;testing store result
3008
        ldx #0
3009
tstay   lda abst,y
3010
        eor #$c3
3011
        cmp abs1,y
3012
        trap_ne     ;store to abs data
3013
        txa
3014
        sta abst,y  ;clear
3015
        dey
3016
        bpl tstay
3017
 
3018
        ldy #3
3019
tlday2
3020
        set_stat 0
3021
        lda abs1,y
3022
        php         ;test stores do not alter flags
3023
        eor #$c3
3024
        plp
3025
        sta (indt),y
3026
        php         ;flags after load/store sequence
3027
        eor #$c3
3028
        cmp (ind1),y    ;test result
3029
        trap_ne
3030
        pla         ;load status
3031
        eor_flag 0
3032
        cmp fLDx,y  ;test flags
3033
        trap_ne
3034
        dey
3035
        bpl tlday2
3036
 
3037
        ldy #3
3038
tlday3
3039
        set_stat $ff
3040
        lda abs1,y
3041
        php         ;test stores do not alter flags
3042
        eor #$c3
3043
        plp
3044
        sta (indt),y
3045
        php         ;flags after load/store sequence
3046
        eor #$c3
3047
        cmp (ind1),y   ;test result
3048
        trap_ne
3049
        pla         ;load status
3050
        eor_flag lo~fnz ;mask bits not altered
3051
        cmp fLDx,y  ;test flags
3052
        trap_ne
3053
        dey
3054
        bpl tlday3
3055
 
3056
        ldy #3      ;testing store result
3057
        ldx #0
3058
tstay1  lda abst,y
3059
        eor #$c3
3060
        cmp abs1,y
3061
        trap_ne     ;store to abs data
3062
        txa
3063
        sta abst,y  ;clear
3064
        dey
3065
        bpl tstay1
3066
 
3067
        ldx #6
3068
        ldy #3
3069
tldax4
3070
        set_stat 0
3071
        lda (ind1,x)
3072
        php         ;test stores do not alter flags
3073
        eor #$c3
3074
        plp
3075
        sta (indt,x)
3076
        php         ;flags after load/store sequence
3077
        eor #$c3
3078
        cmp abs1,y  ;test result
3079
        trap_ne
3080
        pla         ;load status
3081
        eor_flag 0
3082
        cmp fLDx,y  ;test flags
3083
        trap_ne
3084
        dex
3085
        dex
3086
        dey
3087
        bpl tldax4
3088
 
3089
        ldx #6
3090
        ldy #3
3091
tldax5
3092
        set_stat $ff
3093
        lda (ind1,x)
3094
        php         ;test stores do not alter flags
3095
        eor #$c3
3096
        plp
3097
        sta (indt,x)
3098
        php         ;flags after load/store sequence
3099
        eor #$c3
3100
        cmp abs1,y  ;test result
3101
        trap_ne
3102
        pla         ;load status
3103
        eor_flag lo~fnz ;mask bits not altered
3104
        cmp fLDx,y  ;test flags
3105
        trap_ne
3106
        dex
3107
        dex
3108
        dey
3109
        bpl tldax5
3110
 
3111
        ldy #3      ;testing store result
3112
        ldx #0
3113
tstay2  lda abst,y
3114
        eor #$c3
3115
        cmp abs1,y
3116
        trap_ne     ;store to abs data
3117
        txa
3118
        sta abst,y  ;clear
3119
        dey
3120
        bpl tstay2
3121
        next_test
3122
 
3123
; indexed wraparound test (only zp should wrap)
3124 3 MichaelA
 
3125 2 MichaelA
        ldx #3+$fa
3126
tldax6  lda zp1-$fa&$ff,x   ;wrap on indexed zp
3127
        sta abst-$fa,x      ;no STX abs,x!
3128
        dex
3129
        cpx #$fa
3130
        bcs tldax6
3131
        ldx #3+$fa
3132
tldax7  lda abs1-$fa,x      ;no wrap on indexed abs
3133
        sta zpt-$fa&$ff,x
3134
        dex
3135
        cpx #$fa
3136
        bcs tldax7
3137
 
3138
        ldx #3      ;testing wraparound result
3139
        ldy #0
3140
tstax1  lda zpt,x
3141
        cmp zp1,x
3142
        trap_ne     ;store to zp,x data
3143
        sty zpt,x   ;clear
3144
        lda abst,x
3145
        cmp abs1,x
3146
        trap_ne     ;store to abs,x data
3147
        txa
3148
        sta abst,x  ;clear
3149
        dex
3150
        bpl tstax1
3151
 
3152
        ldy #3+$f8
3153
        ldx #6+$f8
3154
tlday4  lda (ind1-$f8&$ff,x) ;wrap on indexed zp indirect
3155
        sta abst-$f8,y
3156
        dex
3157
        dex
3158
        dey
3159
        cpy #$f8
3160
        bcs tlday4
3161
        ldy #3      ;testing wraparound result
3162
        ldx #0
3163
tstay4  lda abst,y
3164
        cmp abs1,y
3165
        trap_ne     ;store to abs data
3166
        txa
3167
        sta abst,y  ;clear
3168
        dey
3169
        bpl tstay4
3170
 
3171
        ldy #3+$f8
3172
tlday5  lda abs1-$f8,y  ;no wrap on indexed abs
3173
        sta (inwt),y
3174
        dey
3175
        cpy #$f8
3176
        bcs tlday5
3177
        ldy #3      ;testing wraparound result
3178
        ldx #0
3179
tstay5  lda abst,y
3180
        cmp abs1,y
3181
        trap_ne     ;store to abs data
3182
        txa
3183
        sta abst,y  ;clear
3184
        dey
3185
        bpl tstay5
3186
 
3187
        ldy #3+$f8
3188
        ldx #6+$f8
3189
tlday6  lda (inw1),y    ;no wrap on zp indirect indexed
3190
        sta (indt-$f8&$ff,x)
3191
        dex
3192
        dex
3193
        dey
3194
        cpy #$f8
3195
        bcs tlday6
3196
        ldy #3      ;testing wraparound result
3197
        ldx #0
3198
tstay6  lda abst,y
3199
        cmp abs1,y
3200
        trap_ne     ;store to abs data
3201
        txa
3202
        sta abst,y  ;clear
3203
        dey
3204
        bpl tstay6
3205
        next_test
3206
 
3207
; LDA / STA - zp / abs / #
3208 3 MichaelA
 
3209 2 MichaelA
        set_stat 0
3210
        lda zp1
3211
        php         ;test stores do not alter flags
3212
        eor #$c3
3213
        plp
3214
        sta abst
3215
        php         ;flags after load/store sequence
3216
        eor #$c3
3217
        cmp #$c3    ;test result
3218
        trap_ne
3219
        pla         ;load status
3220
        eor_flag 0
3221
        cmp fLDx    ;test flags
3222
        trap_ne
3223
        set_stat 0
3224
        lda zp1+1
3225
        php         ;test stores do not alter flags
3226
        eor #$c3
3227
        plp
3228
        sta abst+1
3229
        php         ;flags after load/store sequence
3230
        eor #$c3
3231
        cmp #$82    ;test result
3232
        trap_ne
3233
        pla         ;load status
3234
        eor_flag 0
3235
        cmp fLDx+1  ;test flags
3236
        trap_ne
3237
        set_stat 0
3238
        lda zp1+2
3239
        php         ;test stores do not alter flags
3240
        eor #$c3
3241
        plp
3242
        sta abst+2
3243
        php         ;flags after load/store sequence
3244
        eor #$c3
3245
        cmp #$41    ;test result
3246
        trap_ne
3247
        pla         ;load status
3248
        eor_flag 0
3249
        cmp fLDx+2  ;test flags
3250
        trap_ne
3251
        set_stat 0
3252
        lda zp1+3
3253
        php         ;test stores do not alter flags
3254
        eor #$c3
3255
        plp
3256
        sta abst+3
3257
        php         ;flags after load/store sequence
3258
        eor #$c3
3259
        cmp #0      ;test result
3260
        trap_ne
3261
        pla         ;load status
3262
        eor_flag 0
3263
        cmp fLDx+3  ;test flags
3264
        trap_ne
3265
        set_stat $ff
3266
        lda zp1
3267
        php         ;test stores do not alter flags
3268
        eor #$c3
3269
        plp
3270
        sta abst
3271
        php         ;flags after load/store sequence
3272
        eor #$c3
3273
        cmp #$c3    ;test result
3274
        trap_ne
3275
        pla         ;load status
3276
        eor_flag lo~fnz ;mask bits not altered
3277
        cmp fLDx    ;test flags
3278
        trap_ne
3279
        set_stat $ff
3280
        lda zp1+1
3281
        php         ;test stores do not alter flags
3282
        eor #$c3
3283
        plp
3284
        sta abst+1
3285
        php         ;flags after load/store sequence
3286
        eor #$c3
3287
        cmp #$82    ;test result
3288
        trap_ne
3289
        pla         ;load status
3290
        eor_flag lo~fnz ;mask bits not altered
3291
        cmp fLDx+1  ;test flags
3292
        trap_ne
3293
        set_stat $ff
3294
        lda zp1+2
3295
        php         ;test stores do not alter flags
3296
        eor #$c3
3297
        plp
3298
        sta abst+2
3299
        php         ;flags after load/store sequence
3300
        eor #$c3
3301
        cmp #$41    ;test result
3302
        trap_ne
3303
        pla         ;load status
3304
        eor_flag lo~fnz ;mask bits not altered
3305
        cmp fLDx+2  ;test flags
3306
        trap_ne
3307
        set_stat $ff
3308
        lda zp1+3
3309
        php         ;test stores do not alter flags
3310
        eor #$c3
3311
        plp
3312
        sta abst+3
3313
        php         ;flags after load/store sequence
3314
        eor #$c3
3315
        cmp #0      ;test result
3316
        trap_ne
3317
        pla         ;load status
3318
        eor_flag lo~fnz ;mask bits not altered
3319
        cmp fLDx+3  ;test flags
3320
        trap_ne
3321
        set_stat 0
3322
        lda abs1
3323
        php         ;test stores do not alter flags
3324
        eor #$c3
3325
        plp
3326
        sta zpt
3327
        php         ;flags after load/store sequence
3328
        eor #$c3
3329
        cmp zp1     ;test result
3330
        trap_ne
3331
        pla         ;load status
3332
        eor_flag 0
3333
        cmp fLDx    ;test flags
3334
        trap_ne
3335
        set_stat 0
3336
        lda abs1+1
3337
        php         ;test stores do not alter flags
3338
        eor #$c3
3339
        plp
3340
        sta zpt+1
3341
        php         ;flags after load/store sequence
3342
        eor #$c3
3343
        cmp zp1+1   ;test result
3344
        trap_ne
3345
        pla         ;load status
3346
        eor_flag 0
3347
        cmp fLDx+1  ;test flags
3348
        trap_ne
3349
        set_stat 0
3350
        lda abs1+2
3351
        php         ;test stores do not alter flags
3352
        eor #$c3
3353
        plp
3354
        sta zpt+2
3355
        php         ;flags after load/store sequence
3356
        eor #$c3
3357
        cmp zp1+2   ;test result
3358
        trap_ne
3359
        pla         ;load status
3360
        eor_flag 0
3361
        cmp fLDx+2  ;test flags
3362
        trap_ne
3363
        set_stat 0
3364
        lda abs1+3
3365
        php         ;test stores do not alter flags
3366
        eor #$c3
3367
        plp
3368
        sta zpt+3
3369
        php         ;flags after load/store sequence
3370
        eor #$c3
3371
        cmp zp1+3   ;test result
3372
        trap_ne
3373
        pla         ;load status
3374
        eor_flag 0
3375
        cmp fLDx+3  ;test flags
3376
        trap_ne
3377
        set_stat $ff
3378
        lda abs1
3379
        php         ;test stores do not alter flags
3380
        eor #$c3
3381
        plp
3382
        sta zpt
3383
        php         ;flags after load/store sequence
3384
        eor #$c3
3385
        cmp zp1     ;test result
3386
        trap_ne
3387
        pla         ;load status
3388
        eor_flag lo~fnz ;mask bits not altered
3389
        cmp fLDx    ;test flags
3390
        trap_ne
3391
        set_stat $ff
3392
        lda abs1+1
3393
        php         ;test stores do not alter flags
3394
        eor #$c3
3395
        plp
3396
        sta zpt+1
3397
        php         ;flags after load/store sequence
3398
        eor #$c3
3399
        cmp zp1+1   ;test result
3400
        trap_ne
3401
        pla         ;load status
3402
        eor_flag lo~fnz ;mask bits not altered
3403
        cmp fLDx+1  ;test flags
3404
        trap_ne
3405
        set_stat $ff
3406
        lda abs1+2
3407
        php         ;test stores do not alter flags
3408
        eor #$c3
3409
        plp
3410
        sta zpt+2
3411
        php         ;flags after load/store sequence
3412
        eor #$c3
3413
        cmp zp1+2   ;test result
3414
        trap_ne
3415
        pla         ;load status
3416
        eor_flag lo~fnz ;mask bits not altered
3417
        cmp fLDx+2  ;test flags
3418
        trap_ne
3419
        set_stat $ff
3420
        lda abs1+3
3421
        php         ;test stores do not alter flags
3422
        eor #$c3
3423
        plp
3424
        sta zpt+3
3425
        php         ;flags after load/store sequence
3426
        eor #$c3
3427
        cmp zp1+3   ;test result
3428
        trap_ne
3429
        pla         ;load status
3430
        eor_flag lo~fnz ;mask bits not altered
3431
        cmp fLDx+3  ;test flags
3432
        trap_ne
3433
        set_stat 0
3434
        lda #$c3
3435
        php
3436
        cmp abs1    ;test result
3437
        trap_ne
3438
        pla         ;load status
3439
        eor_flag 0
3440
        cmp fLDx    ;test flags
3441
        trap_ne
3442
        set_stat 0
3443
        lda #$82
3444
        php
3445
        cmp abs1+1  ;test result
3446
        trap_ne
3447
        pla         ;load status
3448
        eor_flag 0
3449
        cmp fLDx+1  ;test flags
3450
        trap_ne
3451
        set_stat 0
3452
        lda #$41
3453
        php
3454
        cmp abs1+2  ;test result
3455
        trap_ne
3456
        pla         ;load status
3457
        eor_flag 0
3458
        cmp fLDx+2  ;test flags
3459
        trap_ne
3460
        set_stat 0
3461
        lda #0
3462
        php
3463
        cmp abs1+3  ;test result
3464
        trap_ne
3465
        pla         ;load status
3466
        eor_flag 0
3467
        cmp fLDx+3  ;test flags
3468
        trap_ne
3469
 
3470
        set_stat $ff
3471
        lda #$c3
3472
        php
3473
        cmp abs1    ;test result
3474
        trap_ne
3475
        pla         ;load status
3476
        eor_flag lo~fnz ;mask bits not altered
3477
        cmp fLDx    ;test flags
3478
        trap_ne
3479
        set_stat $ff
3480
        lda #$82
3481
        php
3482
        cmp abs1+1  ;test result
3483
        trap_ne
3484
        pla         ;load status
3485
        eor_flag lo~fnz ;mask bits not altered
3486
        cmp fLDx+1  ;test flags
3487
        trap_ne
3488
        set_stat $ff
3489
        lda #$41
3490
        php
3491
        cmp abs1+2  ;test result
3492
        trap_ne
3493
        pla         ;load status
3494
        eor_flag lo~fnz ;mask bits not altered
3495
        cmp fLDx+2  ;test flags
3496
        trap_ne
3497
        set_stat $ff
3498
        lda #0
3499
        php
3500
        cmp abs1+3  ;test result
3501
        trap_ne
3502
        pla         ;load status
3503
        eor_flag lo~fnz ;mask bits not altered
3504
        cmp fLDx+3  ;test flags
3505
        trap_ne
3506
 
3507
        ldx #0
3508
        lda zpt
3509
        eor #$c3
3510
        cmp zp1
3511
        trap_ne     ;store to zp data
3512
        stx zpt     ;clear
3513
        lda abst
3514
        eor #$c3
3515
        cmp abs1
3516
        trap_ne     ;store to abs data
3517
        stx abst    ;clear
3518
        lda zpt+1
3519
        eor #$c3
3520
        cmp zp1+1
3521
        trap_ne     ;store to zp data
3522
        stx zpt+1   ;clear
3523
        lda abst+1
3524
        eor #$c3
3525
        cmp abs1+1
3526
        trap_ne     ;store to abs data
3527
        stx abst+1  ;clear
3528
        lda zpt+2
3529
        eor #$c3
3530
        cmp zp1+2
3531
        trap_ne     ;store to zp data
3532
        stx zpt+2   ;clear
3533
        lda abst+2
3534
        eor #$c3
3535
        cmp abs1+2
3536
        trap_ne     ;store to abs data
3537
        stx abst+2  ;clear
3538
        lda zpt+3
3539
        eor #$c3
3540
        cmp zp1+3
3541
        trap_ne     ;store to zp data
3542
        stx zpt+3   ;clear
3543
        lda abst+3
3544
        eor #$c3
3545
        cmp abs1+3
3546
        trap_ne     ;store to abs data
3547
        stx abst+3  ;clear
3548
        next_test
3549
 
3550
; testing bit test & compares BIT CPX CPY CMP all addressing modes
3551
; BIT - zp / abs
3552 3 MichaelA
 
3553 2 MichaelA
        set_a $ff,0
3554
        bit zp1+3   ;00 - should set Z / clear  NV
3555
        tst_a $ff,fz
3556
        set_a 1,0
3557
        bit zp1+2   ;41 - should set V (M6) / clear NZ
3558
        tst_a 1,fv
3559
        set_a 1,0
3560
        bit zp1+1   ;82 - should set N (M7) & Z / clear V
3561
        tst_a 1,fnz
3562
        set_a 1,0
3563
        bit zp1     ;c3 - should set N (M7) & V (M6) / clear Z
3564
        tst_a 1,fnv
3565
 
3566
        set_a $ff,$ff
3567
        bit zp1+3   ;00 - should set Z / clear  NV
3568
        tst_a $ff,~fnv
3569
        set_a 1,$ff
3570
        bit zp1+2   ;41 - should set V (M6) / clear NZ
3571
        tst_a 1,~fnz
3572
        set_a 1,$ff
3573
        bit zp1+1   ;82 - should set N (M7) & Z / clear V
3574
        tst_a 1,~fv
3575
        set_a 1,$ff
3576
        bit zp1     ;c3 - should set N (M7) & V (M6) / clear Z
3577
        tst_a 1,~fz
3578
 
3579
        set_a $ff,0
3580
        bit abs1+3  ;00 - should set Z / clear  NV
3581
        tst_a $ff,fz
3582
        set_a 1,0
3583
        bit abs1+2  ;41 - should set V (M6) / clear NZ
3584
        tst_a 1,fv
3585
        set_a 1,0
3586
        bit abs1+1  ;82 - should set N (M7) & Z / clear V
3587
        tst_a 1,fnz
3588
        set_a 1,0
3589
        bit abs1    ;c3 - should set N (M7) & V (M6) / clear Z
3590
        tst_a 1,fnv
3591
 
3592
        set_a $ff,$ff
3593
        bit abs1+3  ;00 - should set Z / clear  NV
3594
        tst_a $ff,~fnv
3595
        set_a 1,$ff
3596
        bit abs1+2  ;41 - should set V (M6) / clear NZ
3597
        tst_a 1,~fnz
3598
        set_a 1,$ff
3599
        bit abs1+1  ;82 - should set N (M7) & Z / clear V
3600
        tst_a 1,~fv
3601
        set_a 1,$ff
3602
        bit abs1    ;c3 - should set N (M7) & V (M6) / clear Z
3603
        tst_a 1,~fz
3604
        next_test
3605
 
3606
; CPX - zp / abs / #
3607 3 MichaelA
 
3608 2 MichaelA
        set_x $80,0
3609
        cpx zp7f
3610
        tst_stat fc
3611
        dex
3612
        cpx zp7f
3613
        tst_stat fzc
3614
        dex
3615
        cpx zp7f
3616
        tst_x $7e,fn
3617
        set_x $80,$ff
3618
        cpx zp7f
3619
        tst_stat ~fnz
3620
        dex
3621
        cpx zp7f
3622
        tst_stat ~fn
3623
        dex
3624
        cpx zp7f
3625
        tst_x $7e,~fzc
3626
 
3627
        set_x $80,0
3628
        cpx abs7f
3629
        tst_stat fc
3630
        dex
3631
        cpx abs7f
3632
        tst_stat fzc
3633
        dex
3634
        cpx abs7f
3635
        tst_x $7e,fn
3636
        set_x $80,$ff
3637
        cpx abs7f
3638
        tst_stat ~fnz
3639
        dex
3640
        cpx abs7f
3641
        tst_stat ~fn
3642
        dex
3643
        cpx abs7f
3644
        tst_x $7e,~fzc
3645
 
3646
        set_x $80,0
3647
        cpx #$7f
3648
        tst_stat fc
3649
        dex
3650
        cpx #$7f
3651
        tst_stat fzc
3652
        dex
3653
        cpx #$7f
3654
        tst_x $7e,fn
3655
        set_x $80,$ff
3656
        cpx #$7f
3657
        tst_stat ~fnz
3658
        dex
3659
        cpx #$7f
3660
        tst_stat ~fn
3661
        dex
3662
        cpx #$7f
3663
        tst_x $7e,~fzc
3664
        next_test
3665
 
3666
; CPY - zp / abs / #
3667 3 MichaelA
 
3668 2 MichaelA
        set_y $80,0
3669
        cpy zp7f
3670
        tst_stat fc
3671
        dey
3672
        cpy zp7f
3673
        tst_stat fzc
3674
        dey
3675
        cpy zp7f
3676
        tst_y $7e,fn
3677
        set_y $80,$ff
3678
        cpy zp7f
3679
        tst_stat ~fnz
3680
        dey
3681
        cpy zp7f
3682
        tst_stat ~fn
3683
        dey
3684
        cpy zp7f
3685
        tst_y $7e,~fzc
3686
 
3687
        set_y $80,0
3688
        cpy abs7f
3689
        tst_stat fc
3690
        dey
3691
        cpy abs7f
3692
        tst_stat fzc
3693
        dey
3694
        cpy abs7f
3695
        tst_y $7e,fn
3696
        set_y $80,$ff
3697
        cpy abs7f
3698
        tst_stat ~fnz
3699
        dey
3700
        cpy abs7f
3701
        tst_stat ~fn
3702
        dey
3703
        cpy abs7f
3704
        tst_y $7e,~fzc
3705
 
3706
        set_y $80,0
3707
        cpy #$7f
3708
        tst_stat fc
3709
        dey
3710
        cpy #$7f
3711
        tst_stat fzc
3712
        dey
3713
        cpy #$7f
3714
        tst_y $7e,fn
3715
        set_y $80,$ff
3716
        cpy #$7f
3717
        tst_stat ~fnz
3718
        dey
3719
        cpy #$7f
3720
        tst_stat ~fn
3721
        dey
3722
        cpy #$7f
3723
        tst_y $7e,~fzc
3724
        next_test
3725
 
3726
; CMP - zp / abs / #
3727 3 MichaelA
 
3728 2 MichaelA
        set_a $80,0
3729
        cmp zp7f
3730
        tst_a $80,fc
3731
        set_a $7f,0
3732
        cmp zp7f
3733
        tst_a $7f,fzc
3734
        set_a $7e,0
3735
        cmp zp7f
3736
        tst_a $7e,fn
3737
        set_a $80,$ff
3738
        cmp zp7f
3739
        tst_a $80,~fnz
3740
        set_a $7f,$ff
3741
        cmp zp7f
3742
        tst_a $7f,~fn
3743
        set_a $7e,$ff
3744
        cmp zp7f
3745
        tst_a $7e,~fzc
3746
 
3747
        set_a $80,0
3748
        cmp abs7f
3749
        tst_a $80,fc
3750
        set_a $7f,0
3751
        cmp abs7f
3752
        tst_a $7f,fzc
3753
        set_a $7e,0
3754
        cmp abs7f
3755
        tst_a $7e,fn
3756
        set_a $80,$ff
3757
        cmp abs7f
3758
        tst_a $80,~fnz
3759
        set_a $7f,$ff
3760
        cmp abs7f
3761
        tst_a $7f,~fn
3762
        set_a $7e,$ff
3763
        cmp abs7f
3764
        tst_a $7e,~fzc
3765
 
3766
        set_a $80,0
3767
        cmp #$7f
3768
        tst_a $80,fc
3769
        set_a $7f,0
3770
        cmp #$7f
3771
        tst_a $7f,fzc
3772
        set_a $7e,0
3773
        cmp #$7f
3774
        tst_a $7e,fn
3775
        set_a $80,$ff
3776
        cmp #$7f
3777
        tst_a $80,~fnz
3778
        set_a $7f,$ff
3779
        cmp #$7f
3780
        tst_a $7f,~fn
3781
        set_a $7e,$ff
3782
        cmp #$7f
3783
        tst_a $7e,~fzc
3784
 
3785
        ldx #4          ;with indexing by X
3786
        set_a $80,0
3787
        cmp zp1,x
3788
        tst_a $80,fc
3789
        set_a $7f,0
3790
        cmp zp1,x
3791
        tst_a $7f,fzc
3792
        set_a $7e,0
3793
        cmp zp1,x
3794
        tst_a $7e,fn
3795
        set_a $80,$ff
3796
        cmp zp1,x
3797
        tst_a $80,~fnz
3798
        set_a $7f,$ff
3799
        cmp zp1,x
3800
        tst_a $7f,~fn
3801
        set_a $7e,$ff
3802
        cmp zp1,x
3803
        tst_a $7e,~fzc
3804
 
3805
        set_a $80,0
3806
        cmp abs1,x
3807
        tst_a $80,fc
3808
        set_a $7f,0
3809
        cmp abs1,x
3810
        tst_a $7f,fzc
3811
        set_a $7e,0
3812
        cmp abs1,x
3813
        tst_a $7e,fn
3814
        set_a $80,$ff
3815
        cmp abs1,x
3816
        tst_a $80,~fnz
3817
        set_a $7f,$ff
3818
        cmp abs1,x
3819
        tst_a $7f,~fn
3820
        set_a $7e,$ff
3821
        cmp abs1,x
3822
        tst_a $7e,~fzc
3823
 
3824
        ldy #4          ;with indexing by Y
3825
        ldx #8          ;with indexed indirect
3826
        set_a $80,0
3827
        cmp abs1,y
3828
        tst_a $80,fc
3829
        set_a $7f,0
3830
        cmp abs1,y
3831
        tst_a $7f,fzc
3832
        set_a $7e,0
3833
        cmp abs1,y
3834
        tst_a $7e,fn
3835
        set_a $80,$ff
3836
        cmp abs1,y
3837
        tst_a $80,~fnz
3838
        set_a $7f,$ff
3839
        cmp abs1,y
3840
        tst_a $7f,~fn
3841
        set_a $7e,$ff
3842
        cmp abs1,y
3843
        tst_a $7e,~fzc
3844
 
3845
        set_a $80,0
3846
        cmp (ind1,x)
3847
        tst_a $80,fc
3848
        set_a $7f,0
3849
        cmp (ind1,x)
3850
        tst_a $7f,fzc
3851
        set_a $7e,0
3852
        cmp (ind1,x)
3853
        tst_a $7e,fn
3854
        set_a $80,$ff
3855
        cmp (ind1,x)
3856
        tst_a $80,~fnz
3857
        set_a $7f,$ff
3858
        cmp (ind1,x)
3859
        tst_a $7f,~fn
3860
        set_a $7e,$ff
3861
        cmp (ind1,x)
3862
        tst_a $7e,~fzc
3863
 
3864
        set_a $80,0
3865
        cmp (ind1),y
3866
        tst_a $80,fc
3867
        set_a $7f,0
3868
        cmp (ind1),y
3869
        tst_a $7f,fzc
3870
        set_a $7e,0
3871
        cmp (ind1),y
3872
        tst_a $7e,fn
3873
        set_a $80,$ff
3874
        cmp (ind1),y
3875
        tst_a $80,~fnz
3876
        set_a $7f,$ff
3877
        cmp (ind1),y
3878
        tst_a $7f,~fn
3879
        set_a $7e,$ff
3880
        cmp (ind1),y
3881
        tst_a $7e,~fzc
3882
        next_test
3883
 
3884
; testing shifts - ASL LSR ROL ROR all addressing modes
3885
; shifts - accumulator
3886 3 MichaelA
 
3887 2 MichaelA
        ldx #3
3888
tasl
3889
        set_ax zp1,0
3890
        asl a
3891
        tst_ax rASL,fASL,0
3892
        dex
3893
        bpl tasl
3894
        ldx #3
3895
tasl1
3896
        set_ax zp1,$ff
3897
        asl a
3898
        tst_ax rASL,fASL,$ff-fnzc
3899
        dex
3900
        bpl tasl1
3901
 
3902
        ldx #3
3903
tlsr
3904
        set_ax zp1,0
3905
        lsr a
3906
        tst_ax rLSR,fLSR,0
3907
        dex
3908
        bpl tlsr
3909
        ldx #3
3910
tlsr1
3911
        set_ax zp1,$ff
3912
        lsr a
3913
        tst_ax rLSR,fLSR,$ff-fnzc
3914
        dex
3915
        bpl tlsr1
3916
 
3917
        ldx #3
3918
trol
3919
        set_ax zp1,0
3920
        rol a
3921
        tst_ax rROL,fROL,0
3922
        dex
3923
        bpl trol
3924
        ldx #3
3925
trol1
3926
        set_ax zp1,$ff-fc
3927
        rol a
3928
        tst_ax rROL,fROL,$ff-fnzc
3929
        dex
3930
        bpl trol1
3931
 
3932
        ldx #3
3933
trolc
3934
        set_ax zp1,fc
3935
        rol a
3936
        tst_ax rROLc,fROLc,0
3937
        dex
3938
        bpl trolc
3939
        ldx #3
3940
trolc1
3941
        set_ax zp1,$ff
3942
        rol a
3943
        tst_ax rROLc,fROLc,$ff-fnzc
3944
        dex
3945
        bpl trolc1
3946
 
3947
        ldx #3
3948
tror
3949
        set_ax zp1,0
3950
        ror a
3951
        tst_ax rROR,fROR,0
3952
        dex
3953
        bpl tror
3954
        ldx #3
3955
tror1
3956
        set_ax zp1,$ff-fc
3957
        ror a
3958
        tst_ax rROR,fROR,$ff-fnzc
3959
        dex
3960
        bpl tror1
3961
 
3962
        ldx #3
3963
trorc
3964
        set_ax zp1,fc
3965
        ror a
3966
        tst_ax rRORc,fRORc,0
3967
        dex
3968
        bpl trorc
3969
        ldx #3
3970
trorc1
3971
        set_ax zp1,$ff
3972
        ror a
3973
        tst_ax rRORc,fRORc,$ff-fnzc
3974
        dex
3975
        bpl trorc1
3976
        next_test
3977
 
3978
; shifts - zeropage
3979 3 MichaelA
 
3980 2 MichaelA
        ldx #3
3981
tasl2
3982
        set_z zp1,0
3983
        asl zpt
3984
        tst_z rASL,fASL,0
3985
        dex
3986
        bpl tasl2
3987
        ldx #3
3988
tasl3
3989
        set_z zp1,$ff
3990
        asl zpt
3991
        tst_z rASL,fASL,$ff-fnzc
3992
        dex
3993
        bpl tasl3
3994
 
3995
        ldx #3
3996
tlsr2
3997
        set_z zp1,0
3998
        lsr zpt
3999
        tst_z rLSR,fLSR,0
4000
        dex
4001
        bpl tlsr2
4002
        ldx #3
4003
tlsr3
4004
        set_z zp1,$ff
4005
        lsr zpt
4006
        tst_z rLSR,fLSR,$ff-fnzc
4007
        dex
4008
        bpl tlsr3
4009
 
4010
        ldx #3
4011
trol2
4012
        set_z zp1,0
4013
        rol zpt
4014
        tst_z rROL,fROL,0
4015
        dex
4016
        bpl trol2
4017
        ldx #3
4018
trol3
4019
        set_z zp1,$ff-fc
4020
        rol zpt
4021
        tst_z rROL,fROL,$ff-fnzc
4022
        dex
4023
        bpl trol3
4024
 
4025
        ldx #3
4026
trolc2
4027
        set_z zp1,fc
4028
        rol zpt
4029
        tst_z rROLc,fROLc,0
4030
        dex
4031
        bpl trolc2
4032
        ldx #3
4033
trolc3
4034
        set_z zp1,$ff
4035
        rol zpt
4036
        tst_z rROLc,fROLc,$ff-fnzc
4037
        dex
4038
        bpl trolc3
4039
 
4040
        ldx #3
4041
tror2
4042
        set_z zp1,0
4043
        ror zpt
4044
        tst_z rROR,fROR,0
4045
        dex
4046
        bpl tror2
4047
        ldx #3
4048
tror3
4049
        set_z zp1,$ff-fc
4050
        ror zpt
4051
        tst_z rROR,fROR,$ff-fnzc
4052
        dex
4053
        bpl tror3
4054
 
4055
        ldx #3
4056
trorc2
4057
        set_z zp1,fc
4058
        ror zpt
4059
        tst_z rRORc,fRORc,0
4060
        dex
4061
        bpl trorc2
4062
        ldx #3
4063
trorc3
4064
        set_z zp1,$ff
4065
        ror zpt
4066
        tst_z rRORc,fRORc,$ff-fnzc
4067
        dex
4068
        bpl trorc3
4069
        next_test
4070
 
4071
; shifts - absolute
4072 3 MichaelA
 
4073 2 MichaelA
        ldx #3
4074
tasl4
4075
        set_abs zp1,0
4076
        asl abst
4077
        tst_abs rASL,fASL,0
4078
        dex
4079
        bpl tasl4
4080
        ldx #3
4081
tasl5
4082
        set_abs zp1,$ff
4083
        asl abst
4084
        tst_abs rASL,fASL,$ff-fnzc
4085
        dex
4086
        bpl tasl5
4087
 
4088
        ldx #3
4089
tlsr4
4090
        set_abs zp1,0
4091
        lsr abst
4092
        tst_abs rLSR,fLSR,0
4093
        dex
4094
        bpl tlsr4
4095
        ldx #3
4096
tlsr5
4097
        set_abs zp1,$ff
4098
        lsr abst
4099
        tst_abs rLSR,fLSR,$ff-fnzc
4100
        dex
4101
        bpl tlsr5
4102
 
4103
        ldx #3
4104
trol4
4105
        set_abs zp1,0
4106
        rol abst
4107
        tst_abs rROL,fROL,0
4108
        dex
4109
        bpl trol4
4110
        ldx #3
4111
trol5
4112
        set_abs zp1,$ff-fc
4113
        rol abst
4114
        tst_abs rROL,fROL,$ff-fnzc
4115
        dex
4116
        bpl trol5
4117
 
4118
        ldx #3
4119
trolc4
4120
        set_abs zp1,fc
4121
        rol abst
4122
        tst_abs rROLc,fROLc,0
4123
        dex
4124
        bpl trolc4
4125
        ldx #3
4126
trolc5
4127
        set_abs zp1,$ff
4128
        rol abst
4129
        tst_abs rROLc,fROLc,$ff-fnzc
4130
        dex
4131
        bpl trolc5
4132
 
4133
        ldx #3
4134
tror4
4135
        set_abs zp1,0
4136
        ror abst
4137
        tst_abs rROR,fROR,0
4138
        dex
4139
        bpl tror4
4140
        ldx #3
4141
tror5
4142
        set_abs zp1,$ff-fc
4143
        ror abst
4144
        tst_abs rROR,fROR,$ff-fnzc
4145
        dex
4146
        bpl tror5
4147
 
4148
        ldx #3
4149
trorc4
4150
        set_abs zp1,fc
4151
        ror abst
4152
        tst_abs rRORc,fRORc,0
4153
        dex
4154
        bpl trorc4
4155
        ldx #3
4156
trorc5
4157
        set_abs zp1,$ff
4158
        ror abst
4159
        tst_abs rRORc,fRORc,$ff-fnzc
4160
        dex
4161
        bpl trorc5
4162
        next_test
4163
 
4164
; shifts - zp indexed
4165 3 MichaelA
 
4166 2 MichaelA
        ldx #3
4167
tasl6
4168
        set_zx zp1,0
4169
        asl zpt,x
4170
        tst_zx rASL,fASL,0
4171
        dex
4172
        bpl tasl6
4173
        ldx #3
4174
tasl7
4175
        set_zx zp1,$ff
4176
        asl zpt,x
4177
        tst_zx rASL,fASL,$ff-fnzc
4178
        dex
4179
        bpl tasl7
4180
 
4181
        ldx #3
4182
tlsr6
4183
        set_zx zp1,0
4184
        lsr zpt,x
4185
        tst_zx rLSR,fLSR,0
4186
        dex
4187
        bpl tlsr6
4188
        ldx #3
4189
tlsr7
4190
        set_zx zp1,$ff
4191
        lsr zpt,x
4192
        tst_zx rLSR,fLSR,$ff-fnzc
4193
        dex
4194
        bpl tlsr7
4195
 
4196
        ldx #3
4197
trol6
4198
        set_zx zp1,0
4199
        rol zpt,x
4200
        tst_zx rROL,fROL,0
4201
        dex
4202
        bpl trol6
4203
        ldx #3
4204
trol7
4205
        set_zx zp1,$ff-fc
4206
        rol zpt,x
4207
        tst_zx rROL,fROL,$ff-fnzc
4208
        dex
4209
        bpl trol7
4210
 
4211
        ldx #3
4212
trolc6
4213
        set_zx zp1,fc
4214
        rol zpt,x
4215
        tst_zx rROLc,fROLc,0
4216
        dex
4217
        bpl trolc6
4218
        ldx #3
4219
trolc7
4220
        set_zx zp1,$ff
4221
        rol zpt,x
4222
        tst_zx rROLc,fROLc,$ff-fnzc
4223
        dex
4224
        bpl trolc7
4225
 
4226
        ldx #3
4227
tror6
4228
        set_zx zp1,0
4229
        ror zpt,x
4230
        tst_zx rROR,fROR,0
4231
        dex
4232
        bpl tror6
4233
        ldx #3
4234
tror7
4235
        set_zx zp1,$ff-fc
4236
        ror zpt,x
4237
        tst_zx rROR,fROR,$ff-fnzc
4238
        dex
4239
        bpl tror7
4240
 
4241
        ldx #3
4242
trorc6
4243
        set_zx zp1,fc
4244
        ror zpt,x
4245
        tst_zx rRORc,fRORc,0
4246
        dex
4247
        bpl trorc6
4248
        ldx #3
4249
trorc7
4250
        set_zx zp1,$ff
4251
        ror zpt,x
4252
        tst_zx rRORc,fRORc,$ff-fnzc
4253
        dex
4254
        bpl trorc7
4255
        next_test
4256
 
4257
; shifts - abs indexed
4258 3 MichaelA
 
4259 2 MichaelA
        ldx #3
4260
tasl8
4261
        set_absx zp1,0
4262
        asl abst,x
4263
        tst_absx rASL,fASL,0
4264
        dex
4265
        bpl tasl8
4266
        ldx #3
4267
tasl9
4268
        set_absx zp1,$ff
4269
        asl abst,x
4270
        tst_absx rASL,fASL,$ff-fnzc
4271
        dex
4272
        bpl tasl9
4273
 
4274
        ldx #3
4275
tlsr8
4276
        set_absx zp1,0
4277
        lsr abst,x
4278
        tst_absx rLSR,fLSR,0
4279
        dex
4280
        bpl tlsr8
4281
        ldx #3
4282
tlsr9
4283
        set_absx zp1,$ff
4284
        lsr abst,x
4285
        tst_absx rLSR,fLSR,$ff-fnzc
4286
        dex
4287
        bpl tlsr9
4288
 
4289
        ldx #3
4290
trol8
4291
        set_absx zp1,0
4292
        rol abst,x
4293
        tst_absx rROL,fROL,0
4294
        dex
4295
        bpl trol8
4296
        ldx #3
4297
trol9
4298
        set_absx zp1,$ff-fc
4299
        rol abst,x
4300
        tst_absx rROL,fROL,$ff-fnzc
4301
        dex
4302
        bpl trol9
4303
 
4304
        ldx #3
4305
trolc8
4306
        set_absx zp1,fc
4307
        rol abst,x
4308
        tst_absx rROLc,fROLc,0
4309
        dex
4310
        bpl trolc8
4311
        ldx #3
4312
trolc9
4313
        set_absx zp1,$ff
4314
        rol abst,x
4315
        tst_absx rROLc,fROLc,$ff-fnzc
4316
        dex
4317
        bpl trolc9
4318
 
4319
        ldx #3
4320
tror8
4321
        set_absx zp1,0
4322
        ror abst,x
4323
        tst_absx rROR,fROR,0
4324
        dex
4325
        bpl tror8
4326
        ldx #3
4327
tror9
4328
        set_absx zp1,$ff-fc
4329
        ror abst,x
4330
        tst_absx rROR,fROR,$ff-fnzc
4331
        dex
4332
        bpl tror9
4333
 
4334
        ldx #3
4335
trorc8
4336
        set_absx zp1,fc
4337
        ror abst,x
4338
        tst_absx rRORc,fRORc,0
4339
        dex
4340
        bpl trorc8
4341
        ldx #3
4342
trorc9
4343
        set_absx zp1,$ff
4344
        ror abst,x
4345
        tst_absx rRORc,fRORc,$ff-fnzc
4346
        dex
4347
        bpl trorc9
4348
        next_test
4349
 
4350
; testing memory increment/decrement - INC DEC all addressing modes
4351
; zeropage
4352 3 MichaelA
 
4353 2 MichaelA
        ldx #0
4354
        lda #$7e
4355
        sta zpt
4356
tinc
4357
        set_stat 0
4358
        inc zpt
4359
        tst_z rINC,fINC,0
4360
        inx
4361
        cpx #2
4362
        bne tinc1
4363
        lda #$fe
4364
        sta zpt
4365
tinc1   cpx #5
4366
        bne tinc
4367
        dex
4368
        inc zpt
4369
tdec
4370
        set_stat 0
4371
        dec zpt
4372
        tst_z rINC,fINC,0
4373
        dex
4374
        bmi tdec1
4375
        cpx #1
4376
        bne tdec
4377
        lda #$81
4378
        sta zpt
4379
        bne tdec
4380
tdec1
4381
        ldx #0
4382
        lda #$7e
4383
        sta zpt
4384
tinc10
4385
        set_stat $ff
4386
        inc zpt
4387
        tst_z rINC,fINC,$ff-fnz
4388
        inx
4389
        cpx #2
4390
        bne tinc11
4391
        lda #$fe
4392
        sta zpt
4393
tinc11  cpx #5
4394
        bne tinc10
4395
        dex
4396
        inc zpt
4397
tdec10
4398
        set_stat $ff
4399
        dec zpt
4400
        tst_z rINC,fINC,$ff-fnz
4401
        dex
4402
        bmi tdec11
4403
        cpx #1
4404
        bne tdec10
4405
        lda #$81
4406
        sta zpt
4407
        bne tdec10
4408
tdec11
4409
        next_test
4410
 
4411
; absolute memory
4412 3 MichaelA
 
4413 2 MichaelA
        ldx #0
4414
        lda #$7e
4415
        sta abst
4416
tinc2
4417
        set_stat 0
4418
        inc abst
4419
        tst_abs rINC,fINC,0
4420
        inx
4421
        cpx #2
4422
        bne tinc3
4423
        lda #$fe
4424
        sta abst
4425
tinc3   cpx #5
4426
        bne tinc2
4427
        dex
4428
        inc abst
4429
tdec2
4430
        set_stat 0
4431
        dec abst
4432
        tst_abs rINC,fINC,0
4433
        dex
4434
        bmi tdec3
4435
        cpx #1
4436
        bne tdec2
4437
        lda #$81
4438
        sta abst
4439
        bne tdec2
4440
tdec3
4441
        ldx #0
4442
        lda #$7e
4443
        sta abst
4444
tinc12
4445
        set_stat $ff
4446
        inc abst
4447
        tst_abs rINC,fINC,$ff-fnz
4448
        inx
4449
        cpx #2
4450
        bne tinc13
4451
        lda #$fe
4452
        sta abst
4453
tinc13   cpx #5
4454
        bne tinc12
4455
        dex
4456
        inc abst
4457
tdec12
4458
        set_stat $ff
4459
        dec abst
4460
        tst_abs rINC,fINC,$ff-fnz
4461
        dex
4462
        bmi tdec13
4463
        cpx #1
4464
        bne tdec12
4465
        lda #$81
4466
        sta abst
4467
        bne tdec12
4468
tdec13
4469
        next_test
4470
 
4471
; zeropage indexed
4472 3 MichaelA
 
4473 2 MichaelA
        ldx #0
4474
        lda #$7e
4475
tinc4   sta zpt,x
4476
        set_stat 0
4477
        inc zpt,x
4478
        tst_zx rINC,fINC,0
4479
        lda zpt,x
4480
        inx
4481
        cpx #2
4482
        bne tinc5
4483
        lda #$fe
4484
tinc5   cpx #5
4485
        bne tinc4
4486
        dex
4487
        lda #2
4488
tdec4   sta zpt,x
4489
        set_stat 0
4490
        dec zpt,x
4491
        tst_zx rINC,fINC,0
4492
        lda zpt,x
4493
        dex
4494
        bmi tdec5
4495
        cpx #1
4496
        bne tdec4
4497
        lda #$81
4498
        bne tdec4
4499
tdec5
4500
        ldx #0
4501
        lda #$7e
4502
tinc14  sta zpt,x
4503
        set_stat $ff
4504
        inc zpt,x
4505
        tst_zx rINC,fINC,$ff-fnz
4506
        lda zpt,x
4507
        inx
4508
        cpx #2
4509
        bne tinc15
4510
        lda #$fe
4511
tinc15  cpx #5
4512
        bne tinc14
4513
        dex
4514
        lda #2
4515
tdec14  sta zpt,x
4516
        set_stat $ff
4517
        dec zpt,x
4518
        tst_zx rINC,fINC,$ff-fnz
4519
        lda zpt,x
4520
        dex
4521
        bmi tdec15
4522
        cpx #1
4523
        bne tdec14
4524
        lda #$81
4525
        bne tdec14
4526
tdec15
4527
        next_test
4528
 
4529
; memory indexed
4530 3 MichaelA
 
4531 2 MichaelA
        ldx #0
4532
        lda #$7e
4533
tinc6   sta abst,x
4534
        set_stat 0
4535
        inc abst,x
4536
        tst_absx rINC,fINC,0
4537
        lda abst,x
4538
        inx
4539
        cpx #2
4540
        bne tinc7
4541
        lda #$fe
4542
tinc7   cpx #5
4543
        bne tinc6
4544
        dex
4545
        lda #2
4546
tdec6   sta abst,x
4547
        set_stat 0
4548
        dec abst,x
4549
        tst_absx rINC,fINC,0
4550
        lda abst,x
4551
        dex
4552
        bmi tdec7
4553
        cpx #1
4554
        bne tdec6
4555
        lda #$81
4556
        bne tdec6
4557
tdec7
4558
        ldx #0
4559
        lda #$7e
4560
tinc16  sta abst,x
4561
        set_stat $ff
4562
        inc abst,x
4563
        tst_absx rINC,fINC,$ff-fnz
4564
        lda abst,x
4565
        inx
4566
        cpx #2
4567
        bne tinc17
4568
        lda #$fe
4569
tinc17  cpx #5
4570
        bne tinc16
4571
        dex
4572
        lda #2
4573
tdec16  sta abst,x
4574
        set_stat $ff
4575
        dec abst,x
4576
        tst_absx rINC,fINC,$ff-fnz
4577
        lda abst,x
4578
        dex
4579
        bmi tdec17
4580
        cpx #1
4581
        bne tdec16
4582
        lda #$81
4583
        bne tdec16
4584
tdec17
4585
        next_test
4586
 
4587
; testing logical instructions - AND EOR ORA all addressing modes
4588
; AND
4589 3 MichaelA
 
4590 2 MichaelA
        ldx #3      ;immediate - self modifying code
4591
tand    lda zpAN,x
4592
        sta tandi1
4593
        set_ax  absANa,0
4594
tandi1  equ *+1     ;target for immediate operand
4595
        and #99
4596
        tst_ax  absrlo,absflo,0
4597
        dex
4598
        bpl tand
4599
        ldx #3
4600
tand1   lda zpAN,x
4601
        sta tandi2
4602
        set_ax  absANa,$ff
4603
tandi2  equ *+1     ;target for immediate operand
4604
        and #99
4605
        tst_ax  absrlo,absflo,$ff-fnz
4606
        dex
4607
        bpl tand1
4608
 
4609
        ldx #3      ;zp
4610
tand2    lda zpAN,x
4611
        sta zpt
4612
        set_ax  absANa,0
4613
        and zpt
4614
        tst_ax  absrlo,absflo,0
4615
        dex
4616
        bpl tand2
4617
        ldx #3
4618
tand3   lda zpAN,x
4619
        sta zpt
4620
        set_ax  absANa,$ff
4621
        and zpt
4622
        tst_ax  absrlo,absflo,$ff-fnz
4623
        dex
4624
        bpl tand3
4625
 
4626
        ldx #3      ;abs
4627
tand4   lda zpAN,x
4628
        sta abst
4629
        set_ax  absANa,0
4630
        and abst
4631
        tst_ax  absrlo,absflo,0
4632
        dex
4633
        bpl tand4
4634
        ldx #3
4635
tand5   lda zpAN,x
4636
        sta abst
4637
        set_ax  absANa,$ff
4638
        and abst
4639
        tst_ax  absrlo,absflo,$ff-fnz
4640
        dex
4641
        bpl tand6
4642
 
4643
        ldx #3      ;zp,x
4644
tand6
4645
        set_ax  absANa,0
4646
        and zpAN,x
4647
        tst_ax  absrlo,absflo,0
4648
        dex
4649
        bpl tand6
4650
        ldx #3
4651
tand7
4652
        set_ax  absANa,$ff
4653
        and zpAN,x
4654
        tst_ax  absrlo,absflo,$ff-fnz
4655
        dex
4656
        bpl tand7
4657
 
4658
        ldx #3      ;abs,x
4659
tand8
4660
        set_ax  absANa,0
4661
        and absAN,x
4662
        tst_ax  absrlo,absflo,0
4663
        dex
4664
        bpl tand8
4665
        ldx #3
4666
tand9
4667
        set_ax  absANa,$ff
4668
        and absAN,x
4669
        tst_ax  absrlo,absflo,$ff-fnz
4670
        dex
4671
        bpl tand9
4672
 
4673
        ldy #3      ;abs,y
4674
tand10
4675
        set_ay  absANa,0
4676
        and absAN,y
4677
        tst_ay  absrlo,absflo,0
4678
        dey
4679
        bpl tand10
4680
        ldy #3
4681
tand11
4682
        set_ay  absANa,$ff
4683
        and absAN,y
4684
        tst_ay  absrlo,absflo,$ff-fnz
4685
        dey
4686
        bpl tand11
4687
 
4688
        ldx #6      ;(zp,x)
4689
        ldy #3
4690
tand12
4691
        set_ay  absANa,0
4692
        and (indAN,x)
4693
        tst_ay  absrlo,absflo,0
4694
        dex
4695
        dex
4696
        dey
4697
        bpl tand12
4698
        ldx #6
4699
        ldy #3
4700
tand13
4701
        set_ay  absANa,$ff
4702
        and (indAN,x)
4703
        tst_ay  absrlo,absflo,$ff-fnz
4704
        dex
4705
        dex
4706
        dey
4707
        bpl tand13
4708
 
4709
        ldy #3      ;(zp),y
4710
tand14
4711
        set_ay  absANa,0
4712
        and (indAN),y
4713
        tst_ay  absrlo,absflo,0
4714
        dey
4715
        bpl tand14
4716
        ldy #3
4717
tand15
4718
        set_ay  absANa,$ff
4719
        and (indAN),y
4720
        tst_ay  absrlo,absflo,$ff-fnz
4721
        dey
4722
        bpl tand15
4723
        next_test
4724
 
4725
; EOR
4726 3 MichaelA
 
4727 2 MichaelA
        ldx #3      ;immediate - self modifying code
4728
teor    lda zpEO,x
4729
        sta teori1
4730
        set_ax  absEOa,0
4731
teori1  equ *+1     ;target for immediate operand
4732
        eor #99
4733
        tst_ax  absrlo,absflo,0
4734
        dex
4735
        bpl teor
4736
        ldx #3
4737
teor1   lda zpEO,x
4738
        sta teori2
4739
        set_ax  absEOa,$ff
4740
teori2  equ *+1     ;target for immediate operand
4741
        eor #99
4742
        tst_ax  absrlo,absflo,$ff-fnz
4743
        dex
4744
        bpl teor1
4745
 
4746
        ldx #3      ;zp
4747
teor2    lda zpEO,x
4748
        sta zpt
4749
        set_ax  absEOa,0
4750
        eor zpt
4751
        tst_ax  absrlo,absflo,0
4752
        dex
4753
        bpl teor2
4754
        ldx #3
4755
teor3   lda zpEO,x
4756
        sta zpt
4757
        set_ax  absEOa,$ff
4758
        eor zpt
4759
        tst_ax  absrlo,absflo,$ff-fnz
4760
        dex
4761
        bpl teor3
4762
 
4763
        ldx #3      ;abs
4764
teor4   lda zpEO,x
4765
        sta abst
4766
        set_ax  absEOa,0
4767
        eor abst
4768
        tst_ax  absrlo,absflo,0
4769
        dex
4770
        bpl teor4
4771
        ldx #3
4772
teor5   lda zpEO,x
4773
        sta abst
4774
        set_ax  absEOa,$ff
4775
        eor abst
4776
        tst_ax  absrlo,absflo,$ff-fnz
4777
        dex
4778
        bpl teor6
4779
 
4780
        ldx #3      ;zp,x
4781
teor6
4782
        set_ax  absEOa,0
4783
        eor zpEO,x
4784
        tst_ax  absrlo,absflo,0
4785
        dex
4786
        bpl teor6
4787
        ldx #3
4788
teor7
4789
        set_ax  absEOa,$ff
4790
        eor zpEO,x
4791
        tst_ax  absrlo,absflo,$ff-fnz
4792
        dex
4793
        bpl teor7
4794
 
4795
        ldx #3      ;abs,x
4796
teor8
4797
        set_ax  absEOa,0
4798
        eor absEO,x
4799
        tst_ax  absrlo,absflo,0
4800
        dex
4801
        bpl teor8
4802
        ldx #3
4803
teor9
4804
        set_ax  absEOa,$ff
4805
        eor absEO,x
4806
        tst_ax  absrlo,absflo,$ff-fnz
4807
        dex
4808
        bpl teor9
4809
 
4810
        ldy #3      ;abs,y
4811
teor10
4812
        set_ay  absEOa,0
4813
        eor absEO,y
4814
        tst_ay  absrlo,absflo,0
4815
        dey
4816
        bpl teor10
4817
        ldy #3
4818
teor11
4819
        set_ay  absEOa,$ff
4820
        eor absEO,y
4821
        tst_ay  absrlo,absflo,$ff-fnz
4822
        dey
4823
        bpl teor11
4824
 
4825
        ldx #6      ;(zp,x)
4826
        ldy #3
4827
teor12
4828
        set_ay  absEOa,0
4829
        eor (indEO,x)
4830
        tst_ay  absrlo,absflo,0
4831
        dex
4832
        dex
4833
        dey
4834
        bpl teor12
4835
        ldx #6
4836
        ldy #3
4837
teor13
4838
        set_ay  absEOa,$ff
4839
        eor (indEO,x)
4840
        tst_ay  absrlo,absflo,$ff-fnz
4841
        dex
4842
        dex
4843
        dey
4844
        bpl teor13
4845
 
4846
        ldy #3      ;(zp),y
4847
teor14
4848
        set_ay  absEOa,0
4849
        eor (indEO),y
4850
        tst_ay  absrlo,absflo,0
4851
        dey
4852
        bpl teor14
4853
        ldy #3
4854
teor15
4855
        set_ay  absEOa,$ff
4856
        eor (indEO),y
4857
        tst_ay  absrlo,absflo,$ff-fnz
4858
        dey
4859
        bpl teor15
4860
        next_test
4861
 
4862
; OR
4863 3 MichaelA
 
4864 2 MichaelA
        ldx #3      ;immediate - self modifying code
4865
tora    lda zpOR,x
4866
        sta torai1
4867
        set_ax  absORa,0
4868
torai1  equ *+1     ;target for immediate operand
4869
        ora #99
4870
        tst_ax  absrlo,absflo,0
4871
        dex
4872
        bpl tora
4873
        ldx #3
4874
tora1   lda zpOR,x
4875
        sta torai2
4876
        set_ax  absORa,$ff
4877
torai2  equ *+1     ;target for immediate operand
4878
        ora #99
4879
        tst_ax  absrlo,absflo,$ff-fnz
4880
        dex
4881
        bpl tora1
4882
 
4883
        ldx #3      ;zp
4884
tora2    lda zpOR,x
4885
        sta zpt
4886
        set_ax  absORa,0
4887
        ora zpt
4888
        tst_ax  absrlo,absflo,0
4889
        dex
4890
        bpl tora2
4891
        ldx #3
4892
tora3   lda zpOR,x
4893
        sta zpt
4894
        set_ax  absORa,$ff
4895
        ora zpt
4896
        tst_ax  absrlo,absflo,$ff-fnz
4897
        dex
4898
        bpl tora3
4899
 
4900
        ldx #3      ;abs
4901
tora4   lda zpOR,x
4902
        sta abst
4903
        set_ax  absORa,0
4904
        ora abst
4905
        tst_ax  absrlo,absflo,0
4906
        dex
4907
        bpl tora4
4908
        ldx #3
4909
tora5   lda zpOR,x
4910
        sta abst
4911
        set_ax  absORa,$ff
4912
        ora abst
4913
        tst_ax  absrlo,absflo,$ff-fnz
4914
        dex
4915
        bpl tora6
4916
 
4917
        ldx #3      ;zp,x
4918
tora6
4919
        set_ax  absORa,0
4920
        ora zpOR,x
4921
        tst_ax  absrlo,absflo,0
4922
        dex
4923
        bpl tora6
4924
        ldx #3
4925
tora7
4926
        set_ax  absORa,$ff
4927
        ora zpOR,x
4928
        tst_ax  absrlo,absflo,$ff-fnz
4929
        dex
4930
        bpl tora7
4931
 
4932
        ldx #3      ;abs,x
4933
tora8
4934
        set_ax  absORa,0
4935
        ora absOR,x
4936
        tst_ax  absrlo,absflo,0
4937
        dex
4938
        bpl tora8
4939
        ldx #3
4940
tora9
4941
        set_ax  absORa,$ff
4942
        ora absOR,x
4943
        tst_ax  absrlo,absflo,$ff-fnz
4944
        dex
4945
        bpl tora9
4946
 
4947
        ldy #3      ;abs,y
4948
tora10
4949
        set_ay  absORa,0
4950
        ora absOR,y
4951
        tst_ay  absrlo,absflo,0
4952
        dey
4953
        bpl tora10
4954
        ldy #3
4955
tora11
4956
        set_ay  absORa,$ff
4957
        ora absOR,y
4958
        tst_ay  absrlo,absflo,$ff-fnz
4959
        dey
4960
        bpl tora11
4961
 
4962
        ldx #6      ;(zp,x)
4963
        ldy #3
4964
tora12
4965
        set_ay  absORa,0
4966
        ora (indOR,x)
4967
        tst_ay  absrlo,absflo,0
4968
        dex
4969
        dex
4970
        dey
4971
        bpl tora12
4972
        ldx #6
4973
        ldy #3
4974
tora13
4975
        set_ay  absORa,$ff
4976
        ora (indOR,x)
4977
        tst_ay  absrlo,absflo,$ff-fnz
4978
        dex
4979
        dex
4980
        dey
4981
        bpl tora13
4982
 
4983
        ldy #3      ;(zp),y
4984
tora14
4985
        set_ay  absORa,0
4986
        ora (indOR),y
4987
        tst_ay  absrlo,absflo,0
4988
        dey
4989
        bpl tora14
4990
        ldy #3
4991
tora15
4992
        set_ay  absORa,$ff
4993
        ora (indOR),y
4994
        tst_ay  absrlo,absflo,$ff-fnz
4995
        dey
4996
        bpl tora15
4997 3 MichaelA
 
4998 2 MichaelA
    if I_flag = 3
4999 3 MichaelA
 
5000 2 MichaelA
        cli
5001 3 MichaelA
 
5002 2 MichaelA
    endif
5003
 
5004
bin_test
5005
    if skip_bin_test = 1
5006 3 MichaelA
 
5007 2 MichaelA
        jmp dec_test
5008 3 MichaelA
 
5009 2 MichaelA
    else
5010 3 MichaelA
 
5011 2 MichaelA
        lda #test_num
5012
        sta test_case
5013 3 MichaelA
 
5014 2 MichaelA
    endif
5015
 
5016
        next_test
5017
 
5018
; full binary add/subtract test
5019
; iterates through all combinations of operands and carry input
5020
; uses increments/decrements to predict result & result flags
5021 3 MichaelA
 
5022 2 MichaelA
        cld
5023
        ldx #ad2        ;for indexed test
5024
        ldy #$ff        ;max range
5025
        lda #0          ;start with adding zeroes & no carry
5026
        sta adfc        ;carry in - for diag
5027
        sta ad1         ;operand 1 - accumulator
5028
        sta ad2         ;operand 2 - memory or immediate
5029
        sta ada2        ;non zp
5030
        sta adrl        ;expected result bits 0-7
5031
        sta adrh        ;expected result bit 8 (carry out)
5032
        lda #$ff        ;complemented operand 2 for subtract
5033
        sta sb2
5034
        sta sba2        ;non zp
5035
        lda #2          ;expected Z-flag
5036
        sta adrf
5037
tadd    clc             ;test with carry clear
5038
        jsr chkadd
5039
        inc adfc        ;now with carry
5040
        inc adrl        ;result +1
5041
        php             ;save N & Z from low result
5042
        php
5043
        pla             ;accu holds expected flags
5044
        and #$82        ;mask N & Z
5045
        plp
5046
        bne tadd1
5047
        inc adrh        ;result bit 8 - carry
5048
tadd1   ora adrh        ;merge C to expected flags
5049
        sta adrf        ;save expected flags except overflow
5050
        sec             ;test with carry set
5051
        jsr chkadd
5052
        dec adfc        ;same for operand +1 but no carry
5053
        inc ad1
5054
        bne tadd        ;iterate op1
5055
        lda #0          ;preset result to op2 when op1 = 0
5056
        sta adrh
5057
        inc ada2
5058
        inc ad2
5059
        php             ;save NZ as operand 2 becomes the new result
5060
        pla
5061
        and #$82        ;mask N00000Z0
5062
        sta adrf        ;no need to check carry as we are adding to 0
5063
        dec sb2         ;complement subtract operand 2
5064
        dec sba2
5065
        lda ad2
5066
        sta adrl
5067
        bne tadd        ;iterate op2
5068
 
5069
dec_test
5070 3 MichaelA
 
5071 2 MichaelA
    if skip_dec_test = 1
5072 3 MichaelA
 
5073
        success
5074
 
5075 2 MichaelA
    else
5076 3 MichaelA
 
5077 2 MichaelA
        lda #test_num
5078
        sta test_case
5079 3 MichaelA
 
5080 2 MichaelA
    endif
5081
 
5082
        next_test
5083
 
5084
; decimal add/subtract test
5085
; *** WARNING - tests documented behavior only! ***
5086
;   only valid BCD operands are tested, N V Z flags are ignored
5087
; iterates through all valid combinations of operands and carry input
5088
; uses increments/decrements to predict result & carry flag
5089 3 MichaelA
 
5090 2 MichaelA
        sed
5091
        ldx #ad2        ;for indexed test
5092
        ldy #$ff        ;max range
5093
        lda #$99        ;start with adding 99 to 99 with carry
5094
        sta ad1         ;operand 1 - accumulator
5095
        sta ad2         ;operand 2 - memory or immediate
5096
        sta ada2        ;non zp
5097
        sta adrl        ;expected result bits 0-7
5098
        lda #1          ;set carry in & out
5099
        sta adfc        ;carry in - for diag
5100
        sta adrh        ;expected result bit 8 (carry out)
5101
        lda #0          ;complemented operand 2 for subtract
5102
        sta sb2
5103
        sta sba2        ;non zp
5104
tdad    sec             ;test with carry set
5105
        jsr chkdad
5106
        dec adfc        ;now with carry clear
5107
        lda adrl        ;decimal adjust result
5108
        bne tdad1       ;skip clear carry & preset result 99 (9A-1)
5109
        dec adrh
5110
        lda #$99
5111
        sta adrl
5112
        bne tdad3
5113
tdad1   and #$f         ;lower nibble mask
5114
        bne tdad2       ;no decimal adjust needed
5115
        dec adrl        ;decimal adjust (?0-6)
5116
        dec adrl
5117
        dec adrl
5118
        dec adrl
5119
        dec adrl
5120
        dec adrl
5121
tdad2   dec adrl        ;result -1
5122
tdad3   clc             ;test with carry clear
5123
        jsr chkdad
5124
        inc adfc        ;same for operand -1 but with carry
5125
        lda ad1         ;decimal adjust operand 1
5126
        beq tdad5       ;iterate operand 2
5127
        and #$f         ;lower nibble mask
5128
        bne tdad4       ;skip decimal adjust
5129
        dec ad1         ;decimal adjust (?0-6)
5130
        dec ad1
5131
        dec ad1
5132
        dec ad1
5133
        dec ad1
5134
        dec ad1
5135
tdad4   dec ad1         ;operand 1 -1
5136
        jmp tdad        ;iterate op1
5137
 
5138
tdad5   lda #$99        ;precharge op1 max
5139
        sta ad1
5140
        lda ad2         ;decimal adjust operand 2
5141
        beq tdad7       ;end of iteration
5142
        and #$f         ;lower nibble mask
5143
        bne tdad6       ;skip decimal adjust
5144
        dec ad2         ;decimal adjust (?0-6)
5145
        dec ad2
5146
        dec ad2
5147
        dec ad2
5148
        dec ad2
5149
        dec ad2
5150
        inc sb2         ;complemented decimal adjust for subtract (?9+6)
5151
        inc sb2
5152
        inc sb2
5153
        inc sb2
5154
        inc sb2
5155
        inc sb2
5156
tdad6   dec ad2         ;operand 2 -1
5157
        inc sb2         ;complemented operand for subtract
5158
        lda sb2
5159
        sta sba2        ;copy as non zp operand
5160
        lda ad2
5161
        sta ada2        ;copy as non zp operand
5162
        sta adrl        ;new result since op1+carry=00+carry +op2=op2
5163
        inc adrh        ;result carry
5164
        bne tdad        ;iterate op2
5165
tdad7   cld
5166
 
5167
        lda test_case
5168
        cmp #test_num
5169
        trap_ne         ;test is out of sequence
5170
 
5171
; final RAM integrity test
5172
;   verifies that none of the previous tests has altered RAM outside of the
5173
;   designated write areas.
5174 3 MichaelA
 
5175 2 MichaelA
        check_ram
5176 3 MichaelA
 
5177 2 MichaelA
; *** DEBUG INFO ***
5178 3 MichaelA
;
5179 2 MichaelA
; to debug checksum errors uncomment check_ram in the next_test macro to
5180
; narrow down the responsible opcode.
5181
; may give false errors when monitor, OS or other background activity is
5182
; allowed during previous tests.
5183
 
5184
; S U C C E S S ************************************************
5185
; -------------
5186 3 MichaelA
 
5187
;success    jmp start       ;if you get here everything went well
5188
            success
5189 2 MichaelA
; -------------
5190
; S U C C E S S ************************************************
5191
 
5192
; core subroutine of the decimal add/subtract test
5193 3 MichaelA
;
5194 2 MichaelA
; *** WARNING - tests documented behavior only! ***
5195
;   only valid BCD operands are tested, N V Z flags are ignored
5196
; iterates through all valid combinations of operands and carry input
5197
; uses increments/decrements to predict result & carry flag
5198 3 MichaelA
 
5199 2 MichaelA
chkdad
5200 3 MichaelA
 
5201 2 MichaelA
; decimal ADC / SBC zp
5202 3 MichaelA
 
5203 2 MichaelA
        php             ;save carry for subtract
5204
        lda ad1
5205
        adc ad2         ;perform add
5206
        php
5207
        cmp adrl        ;check result
5208
        trap_ne         ;bad result
5209
        pla             ;check flags
5210
        and #1          ;mask carry
5211
        cmp adrh
5212
        trap_ne         ;bad carry
5213
        plp
5214
        php             ;save carry for next add
5215
        lda ad1
5216
        sbc sb2         ;perform subtract
5217
        php
5218
        cmp adrl        ;check result
5219
        trap_ne         ;bad result
5220
        pla             ;check flags
5221
        and #1          ;mask carry
5222
        cmp adrh
5223
        trap_ne         ;bad flags
5224
        plp
5225 3 MichaelA
 
5226 2 MichaelA
; decimal ADC / SBC abs
5227 3 MichaelA
 
5228 2 MichaelA
        php             ;save carry for subtract
5229
        lda ad1
5230
        adc ada2        ;perform add
5231
        php
5232
        cmp adrl        ;check result
5233
        trap_ne         ;bad result
5234
        pla             ;check flags
5235
        and #1          ;mask carry
5236
        cmp adrh
5237
        trap_ne         ;bad carry
5238
        plp
5239
        php             ;save carry for next add
5240
        lda ad1
5241
        sbc sba2        ;perform subtract
5242
        php
5243
        cmp adrl        ;check result
5244
        trap_ne         ;bad result
5245
        pla             ;check flags
5246
        and #1          ;mask carry
5247
        cmp adrh
5248
        trap_ne         ;bad carry
5249
        plp
5250 3 MichaelA
 
5251 2 MichaelA
; decimal ADC / SBC #
5252 3 MichaelA
 
5253 2 MichaelA
        php             ;save carry for subtract
5254
        lda ad2
5255
        sta chkdadi     ;self modify immediate
5256
        lda ad1
5257 3 MichaelA
 
5258 2 MichaelA
chkdadi = * + 1         ;operand of the immediate ADC
5259 3 MichaelA
 
5260 2 MichaelA
        adc #0          ;perform add
5261
        php
5262
        cmp adrl        ;check result
5263
        trap_ne         ;bad result
5264
        pla             ;check flags
5265
        and #1          ;mask carry
5266
        cmp adrh
5267
        trap_ne         ;bad carry
5268
        plp
5269
        php             ;save carry for next add
5270
        lda sb2
5271
        sta chkdsbi     ;self modify immediate
5272
        lda ad1
5273 3 MichaelA
 
5274 2 MichaelA
chkdsbi = * + 1         ;operand of the immediate SBC
5275 3 MichaelA
 
5276 2 MichaelA
        sbc #0          ;perform subtract
5277
        php
5278
        cmp adrl        ;check result
5279
        trap_ne         ;bad result
5280
        pla             ;check flags
5281
        and #1          ;mask carry
5282
        cmp adrh
5283
        trap_ne         ;bad carry
5284
        plp
5285 3 MichaelA
 
5286 2 MichaelA
; decimal ADC / SBC zp,x
5287 3 MichaelA
 
5288 2 MichaelA
        php             ;save carry for subtract
5289
        lda ad1
5290
        adc 0,x         ;perform add
5291
        php
5292
        cmp adrl        ;check result
5293
        trap_ne         ;bad result
5294
        pla             ;check flags
5295
        and #1          ;mask carry
5296
        cmp adrh
5297
        trap_ne         ;bad carry
5298
        plp
5299
        php             ;save carry for next add
5300
        lda ad1
5301
        sbc sb2-ad2,x   ;perform subtract
5302
        php
5303
        cmp adrl        ;check result
5304
        trap_ne         ;bad result
5305
        pla             ;check flags
5306
        and #1          ;mask carry
5307
        cmp adrh
5308
        trap_ne         ;bad carry
5309
        plp
5310 3 MichaelA
 
5311 2 MichaelA
; decimal ADC / SBC abs,x
5312 3 MichaelA
 
5313 2 MichaelA
        php             ;save carry for subtract
5314
        lda ad1
5315
        adc ada2-ad2,x  ;perform add
5316
        php
5317
        cmp adrl        ;check result
5318
        trap_ne         ;bad result
5319
        pla             ;check flags
5320
        and #1          ;mask carry
5321
        cmp adrh
5322
        trap_ne         ;bad carry
5323
        plp
5324
        php             ;save carry for next add
5325
        lda ad1
5326
        sbc sba2-ad2,x  ;perform subtract
5327
        php
5328
        cmp adrl        ;check result
5329
        trap_ne         ;bad result
5330
        pla             ;check flags
5331
        and #1          ;mask carry
5332
        cmp adrh
5333
        trap_ne         ;bad carry
5334
        plp
5335 3 MichaelA
 
5336 2 MichaelA
; decimal ADC / SBC abs,y
5337 3 MichaelA
 
5338 2 MichaelA
        php             ;save carry for subtract
5339
        lda ad1
5340
        adc ada2-$ff,y  ;perform add
5341
        php
5342
        cmp adrl        ;check result
5343
        trap_ne         ;bad result
5344
        pla             ;check flags
5345
        and #1          ;mask carry
5346
        cmp adrh
5347
        trap_ne         ;bad carry
5348
        plp
5349
        php             ;save carry for next add
5350
        lda ad1
5351
        sbc sba2-$ff,y  ;perform subtract
5352
        php
5353
        cmp adrl        ;check result
5354
        trap_ne         ;bad result
5355
        pla             ;check flags
5356
        and #1          ;mask carry
5357
        cmp adrh
5358
        trap_ne         ;bad carry
5359
        plp
5360 3 MichaelA
 
5361 2 MichaelA
; decimal ADC / SBC (zp,x)
5362 3 MichaelA
 
5363 2 MichaelA
        php             ;save carry for subtract
5364
        lda ad1
5365
        adc (lo adi2-ad2,x) ;perform add
5366
        php
5367
        cmp adrl        ;check result
5368
        trap_ne         ;bad result
5369
        pla             ;check flags
5370
        and #1          ;mask carry
5371
        cmp adrh
5372
        trap_ne         ;bad carry
5373
        plp
5374
        php             ;save carry for next add
5375
        lda ad1
5376
        sbc (lo sbi2-ad2,x) ;perform subtract
5377
        php
5378
        cmp adrl        ;check result
5379
        trap_ne         ;bad result
5380
        pla             ;check flags
5381
        and #1          ;mask carry
5382
        cmp adrh
5383
        trap_ne         ;bad carry
5384
        plp
5385 3 MichaelA
 
5386 2 MichaelA
; decimal ADC / SBC (abs),y
5387 3 MichaelA
 
5388 2 MichaelA
        php             ;save carry for subtract
5389
        lda ad1
5390
        adc (adiy2),y   ;perform add
5391
        php
5392
        cmp adrl        ;check result
5393
        trap_ne         ;bad result
5394
        pla             ;check flags
5395
        and #1          ;mask carry
5396
        cmp adrh
5397
        trap_ne         ;bad carry
5398
        plp
5399
        php             ;save carry for next add
5400
        lda ad1
5401
        sbc (sbiy2),y   ;perform subtract
5402
        php
5403
        cmp adrl        ;check result
5404
        trap_ne         ;bad result
5405
        pla             ;check flags
5406
        and #1          ;mask carry
5407
        cmp adrh
5408
        trap_ne         ;bad carry
5409
        plp
5410
        rts
5411
 
5412
; core subroutine of the full binary add/subtract test
5413
; iterates through all combinations of operands and carry input
5414
; uses increments/decrements to predict result & result flags
5415 3 MichaelA
 
5416 2 MichaelA
chkadd  lda adrf        ;add V-flag if overflow
5417
        and #$83        ;keep N-----ZC / clear V
5418
        pha
5419
        lda ad1         ;test sign unequal between operands
5420
        eor ad2
5421
        bmi ckad1       ;no overflow possible - operands have different sign
5422
        lda ad1         ;test sign equal between operands and result
5423
        eor adrl
5424
        bpl ckad1       ;no overflow occured - operand and result have same sign
5425
        pla
5426
        ora #$40        ;set V
5427
        pha
5428
ckad1   pla
5429
        sta adrf        ;save expected flags
5430 3 MichaelA
 
5431 2 MichaelA
; binary ADC / SBC zp
5432 3 MichaelA
 
5433 2 MichaelA
        php             ;save carry for subtract
5434
        lda ad1
5435
        adc ad2         ;perform add
5436
        php
5437
        cmp adrl        ;check result
5438
        trap_ne         ;bad result
5439
        pla             ;check flags
5440
        and #$c3        ;mask NV----ZC
5441
        cmp adrf
5442
        trap_ne         ;bad flags
5443
        plp
5444
        php             ;save carry for next add
5445
        lda ad1
5446
        sbc sb2         ;perform subtract
5447
        php
5448
        cmp adrl        ;check result
5449
        trap_ne         ;bad result
5450
        pla             ;check flags
5451
        and #$c3        ;mask NV----ZC
5452
        cmp adrf
5453
        trap_ne         ;bad flags
5454
        plp
5455 3 MichaelA
 
5456 2 MichaelA
; binary ADC / SBC abs
5457 3 MichaelA
 
5458 2 MichaelA
        php             ;save carry for subtract
5459
        lda ad1
5460
        adc ada2        ;perform add
5461
        php
5462
        cmp adrl        ;check result
5463
        trap_ne         ;bad result
5464
        pla             ;check flags
5465
        and #$c3        ;mask NV----ZC
5466
        cmp adrf
5467
        trap_ne         ;bad flags
5468
        plp
5469
        php             ;save carry for next add
5470
        lda ad1
5471
        sbc sba2        ;perform subtract
5472
        php
5473
        cmp adrl        ;check result
5474
        trap_ne         ;bad result
5475
        pla             ;check flags
5476
        and #$c3        ;mask NV----ZC
5477
        cmp adrf
5478
        trap_ne         ;bad flags
5479
        plp
5480 3 MichaelA
 
5481 2 MichaelA
; binary ADC / SBC #
5482 3 MichaelA
 
5483 2 MichaelA
        php             ;save carry for subtract
5484
        lda ad2
5485
        sta chkadi      ;self modify immediate
5486
        lda ad1
5487 3 MichaelA
 
5488 2 MichaelA
chkadi  = * + 1         ;operand of the immediate ADC
5489 3 MichaelA
 
5490 2 MichaelA
        adc #0          ;perform add
5491
        php
5492
        cmp adrl        ;check result
5493
        trap_ne         ;bad result
5494
        pla             ;check flags
5495
        and #$c3        ;mask NV----ZC
5496
        cmp adrf
5497
        trap_ne         ;bad flags
5498
        plp
5499
        php             ;save carry for next add
5500
        lda sb2
5501
        sta chksbi      ;self modify immediate
5502
        lda ad1
5503 3 MichaelA
 
5504 2 MichaelA
chksbi  = * + 1         ;operand of the immediate SBC
5505 3 MichaelA
 
5506 2 MichaelA
        sbc #0          ;perform subtract
5507
        php
5508
        cmp adrl        ;check result
5509
        trap_ne         ;bad result
5510
        pla             ;check flags
5511
        and #$c3        ;mask NV----ZC
5512
        cmp adrf
5513
        trap_ne         ;bad flags
5514
        plp
5515 3 MichaelA
 
5516 2 MichaelA
; binary ADC / SBC zp,x
5517 3 MichaelA
 
5518 2 MichaelA
        php             ;save carry for subtract
5519
        lda ad1
5520
        adc 0,x         ;perform add
5521
        php
5522
        cmp adrl        ;check result
5523
        trap_ne         ;bad result
5524
        pla             ;check flags
5525
        and #$c3        ;mask NV----ZC
5526
        cmp adrf
5527
        trap_ne         ;bad flags
5528
        plp
5529
        php             ;save carry for next add
5530
        lda ad1
5531
        sbc sb2-ad2,x   ;perform subtract
5532
        php
5533
        cmp adrl        ;check result
5534
        trap_ne         ;bad result
5535
        pla             ;check flags
5536
        and #$c3        ;mask NV----ZC
5537
        cmp adrf
5538
        trap_ne         ;bad flags
5539
        plp
5540 3 MichaelA
 
5541 2 MichaelA
; binary ADC / SBC abs,x
5542 3 MichaelA
 
5543 2 MichaelA
        php             ;save carry for subtract
5544
        lda ad1
5545
        adc ada2-ad2,x  ;perform add
5546
        php
5547
        cmp adrl        ;check result
5548
        trap_ne         ;bad result
5549
        pla             ;check flags
5550
        and #$c3        ;mask NV----ZC
5551
        cmp adrf
5552
        trap_ne         ;bad flags
5553
        plp
5554
        php             ;save carry for next add
5555
        lda ad1
5556
        sbc sba2-ad2,x  ;perform subtract
5557
        php
5558
        cmp adrl        ;check result
5559
        trap_ne         ;bad result
5560
        pla             ;check flags
5561
        and #$c3        ;mask NV----ZC
5562
        cmp adrf
5563
        trap_ne         ;bad flags
5564
        plp
5565 3 MichaelA
 
5566 2 MichaelA
; binary ADC / SBC abs,y
5567 3 MichaelA
 
5568 2 MichaelA
        php             ;save carry for subtract
5569
        lda ad1
5570
        adc ada2-$ff,y  ;perform add
5571
        php
5572
        cmp adrl        ;check result
5573
        trap_ne         ;bad result
5574
        pla             ;check flags
5575
        and #$c3        ;mask NV----ZC
5576
        cmp adrf
5577
        trap_ne         ;bad flags
5578
        plp
5579
        php             ;save carry for next add
5580
        lda ad1
5581
        sbc sba2-$ff,y  ;perform subtract
5582
        php
5583
        cmp adrl        ;check result
5584
        trap_ne         ;bad result
5585
        pla             ;check flags
5586
        and #$c3        ;mask NV----ZC
5587
        cmp adrf
5588
        trap_ne         ;bad flags
5589
        plp
5590 3 MichaelA
 
5591 2 MichaelA
; binary ADC / SBC (zp,x)
5592 3 MichaelA
 
5593 2 MichaelA
        php             ;save carry for subtract
5594
        lda ad1
5595
        adc (lo adi2-ad2,x) ;perform add
5596
        php
5597
        cmp adrl        ;check result
5598
        trap_ne         ;bad result
5599
        pla             ;check flags
5600
        and #$c3        ;mask NV----ZC
5601
        cmp adrf
5602
        trap_ne         ;bad flags
5603
        plp
5604
        php             ;save carry for next add
5605
        lda ad1
5606
        sbc (lo sbi2-ad2,x) ;perform subtract
5607
        php
5608
        cmp adrl        ;check result
5609
        trap_ne         ;bad result
5610
        pla             ;check flags
5611
        and #$c3        ;mask NV----ZC
5612
        cmp adrf
5613
        trap_ne         ;bad flags
5614
        plp
5615 3 MichaelA
 
5616 2 MichaelA
; binary ADC / SBC (abs),y
5617 3 MichaelA
 
5618 2 MichaelA
        php             ;save carry for subtract
5619
        lda ad1
5620
        adc (adiy2),y   ;perform add
5621
        php
5622
        cmp adrl        ;check result
5623
        trap_ne         ;bad result
5624
        pla             ;check flags
5625
        and #$c3        ;mask NV----ZC
5626
        cmp adrf
5627
        trap_ne         ;bad flags
5628
        plp
5629
        php             ;save carry for next add
5630
        lda ad1
5631
        sbc (sbiy2),y   ;perform subtract
5632
        php
5633
        cmp adrl        ;check result
5634
        trap_ne         ;bad result
5635
        pla             ;check flags
5636
        and #$c3        ;mask NV----ZC
5637
        cmp adrf
5638
        trap_ne         ;bad flags
5639
        plp
5640
        rts
5641
 
5642
; target for the jump absolute test
5643 3 MichaelA
 
5644 2 MichaelA
        dey
5645
        dey
5646
test_far
5647
        php             ;either SP or Y count will fail, if we do not hit
5648
        dey
5649
        dey
5650
        dey
5651
        plp
5652
        trap_cs         ;flags loaded?
5653
        trap_vs
5654
        trap_mi
5655
        trap_eq
5656
        cmp #'F'        ;registers loaded?
5657
        trap_ne
5658
        cpx #'A'
5659
        trap_ne
5660
        cpy #('R'-3)
5661
        trap_ne
5662
        pha             ;save a,x
5663
        txa
5664
        pha
5665
        tsx
5666
        cpx #$fd        ;check SP
5667
        trap_ne
5668
        pla             ;restore x
5669
        tax
5670
        set_stat $ff
5671
        pla             ;restore a
5672
        inx             ;return registers with modifications
5673
        eor #$aa        ;N=1, V=1, Z=0, C=1
5674
        jmp far_ret
5675
 
5676
; target for the jump indirect test
5677 3 MichaelA
 
5678 2 MichaelA
        align
5679 3 MichaelA
 
5680 2 MichaelA
ptr_tst_ind dw test_ind
5681
ptr_ind_ret dw ind_ret
5682 3 MichaelA
 
5683 2 MichaelA
        trap            ;runover protection
5684
        dey
5685
        dey
5686
test_ind
5687
        php             ;either SP or Y count will fail, if we do not hit
5688
        dey
5689
        dey
5690
        dey
5691
        plp
5692
        trap_cs         ;flags loaded?
5693
        trap_vs
5694
        trap_mi
5695
        trap_eq
5696
        cmp #'I'        ;registers loaded?
5697
        trap_ne
5698
        cpx #'N'
5699
        trap_ne
5700
        cpy #('D'-3)
5701
        trap_ne
5702
        pha             ;save a,x
5703
        txa
5704
        pha
5705
        tsx
5706
        cpx #$fd        ;check SP
5707
        trap_ne
5708
        pla             ;restore x
5709
        tax
5710
        set_stat $ff
5711
        pla             ;restore a
5712
        inx             ;return registers with modifications
5713
        eor #$aa        ;N=1, V=1, Z=0, C=1
5714
        jmp (ptr_ind_ret)
5715
        trap            ;runover protection
5716
 
5717
; target for the jump subroutine test
5718 3 MichaelA
 
5719 2 MichaelA
        dey
5720
        dey
5721
test_jsr
5722
        php             ;either SP or Y count will fail, if we do not hit
5723
        dey
5724
        dey
5725
        dey
5726
        plp
5727
        trap_cs         ;flags loaded?
5728
        trap_vs
5729
        trap_mi
5730
        trap_eq
5731
        cmp #'J'        ;registers loaded?
5732
        trap_ne
5733
        cpx #'S'
5734
        trap_ne
5735
        cpy #('R'-3)
5736
        trap_ne
5737
        pha             ;save a,x
5738
        txa
5739
        pha
5740
        tsx             ;sp -4? (return addr,a,x)
5741
        cpx #$fb
5742
        trap_ne
5743
        lda $1ff        ;propper return on stack
5744
        cmp #hi(jsr_ret)
5745
        trap_ne
5746
        lda $1fe
5747
        cmp #lo(jsr_ret)
5748
        trap_ne
5749
        set_stat $ff
5750
        pla             ;pull x,a
5751
        tax
5752
        pla
5753
        inx             ;return registers with modifications
5754
        eor #$aa        ;N=1, V=1, Z=0, C=1
5755
        rts
5756
        trap            ;runover protection
5757
 
5758
;trap in case of unexpected IRQ, NMI, BRK, RESET - BRK test target
5759 3 MichaelA
 
5760 2 MichaelA
nmi_trap
5761
        trap            ;check stack for conditions at NMI
5762
res_trap
5763
        trap            ;unexpected RESET
5764
 
5765
        dey
5766
        dey
5767
irq_trap                ;BRK test or unextpected BRK or IRQ
5768
        php             ;either SP or Y count will fail, if we do not hit
5769
        dey
5770
        dey
5771
        dey
5772 3 MichaelA
 
5773 2 MichaelA
        ;next 4 traps could be caused by unexpected BRK or IRQ
5774
        ;check stack for BREAK and originating location
5775
        ;possible jump/branch into weeds (uninitialized space)
5776 3 MichaelA
 
5777 2 MichaelA
        cmp #'B'        ;registers loaded?
5778
        trap_ne
5779
        cpx #'R'
5780
        trap_ne
5781
        cpy #('K'-3)
5782
        trap_ne
5783
        sta irq_a       ;save registers during break test
5784
        stx irq_x
5785
        tsx             ;test break on stack
5786
        lda $102,x
5787
        cmp_flag 0      ;break test should have B=1
5788
        trap_ne         ; - no break flag on stack
5789
        pla
5790
        cmp #$34        ;should have added interrupt disable
5791
        trap_ne
5792
        tsx
5793
        cpx #$fc        ;sp -3? (return addr, flags)
5794
        trap_ne
5795
        lda $1ff        ;propper return on stack
5796
        cmp #hi(brk_ret)
5797
        trap_ne
5798
        lda $1fe
5799
;        cmp #lo(brk_ret)
5800
        cmp #lo(brk_ret - 1)    ; M65C02 treats JSR and traps (NMI, BRK/IRQ, RST) the same; add one to return address on RTI/RTS
5801
        trap_ne
5802
        set_stat $ff
5803
        ldx irq_x
5804
        inx             ;return registers with modifications
5805
        lda irq_a
5806
        eor #$aa        ;N=1, V=1, Z=0, C=1 but original flags should be restored
5807
        rti
5808
        trap            ;runover protection
5809
 
5810
;copy of data to initialize BSS segment
5811 3 MichaelA
 
5812 2 MichaelA
    if load_data_direct != 1
5813 3 MichaelA
 
5814 2 MichaelA
zp_init
5815
zp1_    db  $c3,$82,$41,0   ;test patterns for LDx BIT ROL ROR ASL LSR
5816
zp7f_   db  $7f             ;test pattern for compare
5817 3 MichaelA
 
5818 2 MichaelA
;logical zeropage operands
5819 3 MichaelA
 
5820 2 MichaelA
zpOR_   db  0,$1f,$71,$80   ;test pattern for OR
5821
zpAN_   db  $0f,$ff,$7f,$80 ;test pattern for AND
5822
zpEO_   db  $ff,$0f,$8f,$8f ;test pattern for EOR
5823 3 MichaelA
 
5824 2 MichaelA
;indirect addressing pointers
5825 3 MichaelA
 
5826 2 MichaelA
ind1_   dw  abs1            ;indirect pointer to pattern in absolute memory
5827
        dw  abs1+1
5828
        dw  abs1+2
5829
        dw  abs1+3
5830
        dw  abs7f
5831
inw1_   dw  abs1-$f8        ;indirect pointer for wrap-test pattern
5832
indt_   dw  abst            ;indirect pointer to store area in absolute memory
5833
        dw  abst+1
5834
        dw  abst+2
5835
        dw  abst+3
5836
inwt_   dw  abst-$f8        ;indirect pointer for wrap-test store
5837
indAN_  dw  absAN           ;indirect pointer to AND pattern in absolute memory
5838
        dw  absAN+1
5839
        dw  absAN+2
5840
        dw  absAN+3
5841
indEO_  dw  absEO           ;indirect pointer to EOR pattern in absolute memory
5842
        dw  absEO+1
5843
        dw  absEO+2
5844
        dw  absEO+3
5845
indOR_  dw  absOR           ;indirect pointer to OR pattern in absolute memory
5846
        dw  absOR+1
5847
        dw  absOR+2
5848
        dw  absOR+3
5849 3 MichaelA
 
5850 2 MichaelA
;add/subtract indirect pointers
5851 3 MichaelA
 
5852 2 MichaelA
adi2_   dw  ada2            ;indirect pointer to operand 2 in absolute memory
5853
sbi2_   dw  sba2            ;indirect pointer to complemented operand 2 (SBC)
5854
adiy2_  dw  ada2-$ff        ;with offset for indirect indexed
5855
sbiy2_  dw  sba2-$ff
5856
zp_end
5857 3 MichaelA
 
5858 2 MichaelA
    if (zp_end - zp_init) != (zp_bss_end - zp_bss)
5859 3 MichaelA
 
5860 2 MichaelA
        ;force assembler error if size is different
5861
        ERROR ERROR ERROR   ;mismatch between bss and zeropage data
5862 3 MichaelA
 
5863 2 MichaelA
    endif
5864 3 MichaelA
 
5865 2 MichaelA
data_init
5866
abs1_   db  $c3,$82,$41,0   ;test patterns for LDx BIT ROL ROR ASL LSR
5867
abs7f_  db  $7f             ;test pattern for compare
5868 3 MichaelA
 
5869 2 MichaelA
;loads
5870 3 MichaelA
 
5871 2 MichaelA
fLDx_   db  fn,fn,0,fz      ;expected flags for load
5872 3 MichaelA
 
5873 2 MichaelA
;shifts
5874 3 MichaelA
 
5875 2 MichaelA
rASL_                       ;expected result ASL & ROL -carry
5876
rROL_   db  $86,$04,$82,0   ; "
5877
rROLc_  db  $87,$05,$83,1   ;expected result ROL +carry
5878
rLSR_                       ;expected result LSR & ROR -carry
5879
rROR_   db  $61,$41,$20,0   ; "
5880
rRORc_  db  $e1,$c1,$a0,$80 ;expected result ROR +carry
5881
fASL_                       ;expected flags for shifts
5882
fROL_   db  fnc,fc,fn,fz    ;no carry in
5883
fROLc_  db  fnc,fc,fn,0     ;carry in
5884
fLSR_
5885
fROR_   db  fc,0,fc,fz      ;no carry in
5886
fRORc_  db  fnc,fn,fnc,fn   ;carry in
5887 3 MichaelA
 
5888 2 MichaelA
;increments (decrements)
5889 3 MichaelA
 
5890 2 MichaelA
rINC_   db  $7f,$80,$ff,0,1 ;expected result for INC/DEC
5891
fINC_   db  0,fn,fn,fz,0    ;expected flags for INC/DEC
5892 3 MichaelA
 
5893 2 MichaelA
;logical memory operand
5894 3 MichaelA
 
5895 2 MichaelA
absOR_  db  0,$1f,$71,$80   ;test pattern for OR
5896
absAN_  db  $0f,$ff,$7f,$80 ;test pattern for AND
5897
absEO_  db  $ff,$0f,$8f,$8f ;test pattern for EOR
5898 3 MichaelA
 
5899 2 MichaelA
;logical accu operand
5900 3 MichaelA
 
5901 2 MichaelA
absORa_ db  0,$f1,$1f,0     ;test pattern for OR
5902
absANa_ db  $f0,$ff,$ff,$ff ;test pattern for AND
5903
absEOa_ db  $ff,$f0,$f0,$0f ;test pattern for EOR
5904 3 MichaelA
 
5905 2 MichaelA
;logical results
5906 3 MichaelA
 
5907 2 MichaelA
absrlo_ db  0,$ff,$7f,$80
5908
absflo_ db  fz,fn,0,fn
5909 3 MichaelA
 
5910 2 MichaelA
data_end
5911 3 MichaelA
 
5912 2 MichaelA
    if (data_end - data_init) != (data_bss_end - data_bss)
5913 3 MichaelA
 
5914 2 MichaelA
        ;force assembler error if size is different
5915
        ERROR ERROR ERROR   ;mismatch between bss and data
5916 3 MichaelA
 
5917 2 MichaelA
    endif
5918 3 MichaelA
        code
5919
        org $3FFA
5920 2 MichaelA
vec_init
5921
        dw  nmi_trap
5922
        dw  res_trap
5923
        dw  irq_trap
5924
vec_bss equ $fffa
5925 3 MichaelA
 
5926 2 MichaelA
    endif                   ;end of RAM init data
5927
 
5928
    if (load_data_direct = 1) & (ROM_vectors = 1)
5929 3 MichaelA
 
5930 2 MichaelA
        org $fffa       ;vectors
5931 3 MichaelA
 
5932 2 MichaelA
        dw  nmi_trap
5933
        dw  res_trap
5934
        dw  irq_trap
5935 3 MichaelA
 
5936 2 MichaelA
    endif
5937
        end start
5938
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.