qasm/testdata/1002-embedded-instructions.S

115 lines
4.0 KiB
ArmAsm

; Copyright 2018 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Assembler: Merlin 32
xc off
xc
xc
mx %11
org $1000
; 65816 mode with short regs
clc
xce
sep #$30
mx %11
jsr test1
jsr test2
jsr test3
jsr test4
jsr test5
rts
; TEST #1: simple example
test1 lda #$00
dfb $2c ;BIT abs
:inner lda #$01
beq :inner
rts
; TEST #2: embedded with break path
;
; Example inspired by incorrect analysis...
;
; The code analyzer sees:
; beq {+03} ;jumps to the $8f
; lda #$00
; brk $8f
; and stops, then pursues the branch. If we try to walk from top
; to bottom, skipping forward by the full length of an instruction,
; we'll appear to find ourselves in the middle of an embedded
; instruction.
;
; This is different from the typical embedded instruction,
; where the inner is contained entirely within the outer.
test2 sep #$30 ;short regs
mx %00 ;pretend they're long
lda $00 ;load something to scramble flags
beq :store
lda #$0000
:store stal $012345
rts
; TEST #3: embedded with non-instruction byte
;
; The code analyzer sees two paths, involving the three bytes.
; The first is the three-byte JSR, the second is the one-byte
; RTS. The third NOP byte is never "executed" by the analyzer,
; but because of the way we display embedded instructions it
; gets put on its own line. Since it's not an instruction start
; or a data item, things get confused. (This is referred to as
; an "embedded orphan" in the code.)
test3 dfb $20 ;JSR
:mid dfb $60 ;RTS
dfb $ea ;NOP
bra :mid
; TEST #4: overlapping chain
;
; Each BIT instruction is three bytes, and each byte is a branch target,
; so we get a string of embedded instructions.
test4
:bits hex 2c2c2c2c2c2c2c2c2ceaea
asl
bcc :bits
asl
bcc :bits+1
asl
bcc :bits+2
asl
bcc :bits+3
asl
bcc :bits+4
asl
bcc :bits+5
asl
bcc :bits+6
asl
bcc :bits+7
asl
bcc :bits+8
asl
bcc :bits+9
rts
; TEST #5: another overlap
;
; Trying to be a little different.
test5 dfb $2c
:mid1 nop
hex ad
:mid2 lda $00
asl
bcc :mid1
asl
bcc :mid2
; TEST #6: "embedded" off the end of the file
dfb $af ;ldal