1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-12-05 19:50:33 +00:00
6502bench/SourceGen/SGTestData/Source/10032-flags-and-branches.S

156 lines
3.3 KiB
ArmAsm
Raw Normal View History

2018-09-28 17:05:11 +00:00
; Copyright 2018 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Assembler: Merlin 32
; 65816 version
2018-09-28 17:05:11 +00:00
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
2018-09-28 17:05:11 +00:00
php
plp ;should restore cleared carry
lda #$1234
sep #$20
php
plp
lda #$12
; test tracking M/X across subroutine calls
2018-09-28 17:05:11 +00:00
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
2018-09-28 17:05:11 +00:00
; 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