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

Subversion Repositories cpu65c02_true_cycle

[/] [cpu65c02_true_cycle/] [trunk/] [released/] [asm/] [6502_functional_test.a65] - Blame information for rev 23

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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