mirror of
https://github.com/fadden/6502bench.git
synced 2024-08-19 20:29:36 +00:00
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.
156 lines
3.3 KiB
ArmAsm
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
|