1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-08-13 12:29:01 +00:00
6502bench/SourceGen/SGTestData/Source/10032-flags-and-branches.S
Andy McFadden 17dc908420 Refactor tests 1002x and 1003x
Tests 10022-embedded-instructions and 10032-flags-and-branches were
a mix of 6502 and 65816 code.  The 6502 code has been separated into
its own file, so that the tests can be run on 8-bit-only assemblers.
2020-10-18 20:30:42 -07:00

156 lines
3.3 KiB
ArmAsm

; Copyright 2018 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Assembler: Merlin 32
; 65816 version
org $1000
clc
xce
sep #$ff ;set all flags
mx %11
; clear individual flags with REP
sep #$ff
rep #$80
rep #$40
rep #$20
rep #$10
rep #$08
rep #$04
rep #$02
rep #$01
; exercise SEP/REP with #$00
sep #$00
sep #$ff
rep #$00
rep #$ff
; confirm emulation behavior
mx %00 ;long regs
lda #$feed ;check it
sec
xce ;emulation mode
lda #$ff ;check it
rep #$30 ;should have no effect...
mx %11 ;...but Merlin32 doesn't know that
lda #$ff
clc
xce ;back to native, should set M/X=1
lda #$ff ;check it
; try one long, one short
rep #$20 ;long a
sep #$10 ;short x/y
mx %01
lda #$0000
ldx #$01
ldy #$02
sep #$20 ;short a
rep #$10 ;long x/y
mx %10
lda #$01
ldx #$0000
ldy #$0000
; check branch instructions; NVMXDIZC
sep #$30
mx %11
lda #$00
pha
plp ;without a nearby PHP, flags will be scrambled
rep #$80
bpl ok_bpl
brk $00
ok_bpl sep #$80
bpl :bad ;branch never taken
bmi ok_bmi
:bad brk $00
ok_bmi rep #$40
bvc ok_bvc
brk $00
ok_bvc sep #$40
bvs ok_bvs
brk $00
ok_bvs rep #$01
bcc ok_bcc
brk $00
ok_bcc sep #$01
bcs ok_bcs
brk $00
ok_bcs rep #$02
bne ok_bne
brk $00
ok_bne sep #$02
beq ok_beq
brk $00
ok_beq
; Test M/X behavior across PHP/PLP. The flags should be left alone
; (non-smart mode), or set to whatever they were on the previous PHP
; (smart mode).
rep #$20
php
plp ;should restore cleared carry
lda #$1234
sep #$20
php
plp
lda #$12
; test tracking M/X across subroutine calls
rep #$20 ;long a
sep #$10 ;short x/y
mx %01
jsr long_subr ;confirm flag propagation
rep #$30
mx %00
jsr ambig_subr
sep #$30
mx %11
jsr ambig_subr
rep #$20 ;long a
sep #$10 ;short x/y
mx %01
jsr long_subr ;call it again
; leave the main routine with short flags set
sep #$30
mx %11
jmp done
; only called with longm/shortx
mx %01
long_subr
lda #$1234
ldx #$ff
rts
; this is called with different values for M/X, so it defaults to short
mx %11
ambig_subr
lda #$ff
ldx #$ee
ldy #$dd
rts
done
rts