1
0
mirror of https://github.com/fadden/6502bench.git synced 2026-04-21 10:16:42 +00:00

Split 2018x-extension-scripts

Created the 20180-extension-scripts test by cutting out the handful
of 65816-specific items from 20182.  Removed some issue-specific stuff
from 20182 that didn't need to be duplicated.  Renamed some stale
references to test 2022.
This commit is contained in:
Andy McFadden
2025-11-30 14:08:57 -08:00
parent da7548a24a
commit 5a3d288707
18 changed files with 859 additions and 264 deletions
Binary file not shown.
@@ -6,8 +6,9 @@ using System.Collections.Generic;
using PluginCommon;
namespace RuntimeData.Test2022 {
public class Test2022A : MarshalByRefObject, IPlugin, IPlugin_SymbolList,
// JSR/JSL handler
namespace RuntimeData.Test20180 {
public class Test20180A : MarshalByRefObject, IPlugin, IPlugin_SymbolList,
IPlugin_InlineJsr, IPlugin_InlineJsl {
private IApplication mAppRef;
private byte[] mFileData;
@@ -23,7 +24,7 @@ namespace RuntimeData.Test2022 {
public string Identifier {
get {
return "Test 2022-extension-scripts A";
return "Test 20180-extension-scripts A";
}
}
@@ -31,7 +32,7 @@ namespace RuntimeData.Test2022 {
mAppRef = appRef;
mFileData = fileData;
mAppRef.DebugLog("Test2022-A(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
mAppRef.DebugLog("Test20180-A(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
}
public void Unprepare() {
@@ -6,15 +6,16 @@ using System.Collections.Generic;
using PluginCommon;
namespace RuntimeData.Test2022 {
public class Test2022B : MarshalByRefObject, IPlugin, IPlugin_InlineBrk {
// BRK handler
namespace RuntimeData.Test20180 {
public class Test20180B : MarshalByRefObject, IPlugin, IPlugin_InlineBrk {
private IApplication mAppRef;
private byte[] mFileData;
private AddressTranslate mAddrTrans;
public string Identifier {
get {
return "Test 2022-extension-scripts B";
return "Test 20180-extension-scripts B";
}
}
@@ -23,7 +24,7 @@ namespace RuntimeData.Test2022 {
mFileData = fileData;
mAddrTrans = addrTrans;
mAppRef.DebugLog("Test2022-B(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
mAppRef.DebugLog("Test20180-B(id=" + AppDomain.CurrentDomain.Id + "): prepare()");
}
public void Unprepare() {
@@ -0,0 +1,149 @@
### 6502bench SourceGen dis65 v1.0 ###
{
"_ContentVersion":7,
"FileDataLength":543,
"FileDataCrc32":321667593,
"ProjectProps":{
"CpuName":"6502",
"IncludeUndocumentedInstr":true,
"TwoByteBrk":true,
"EntryFlags":32702671,
"AutoLabelStyle":"Simple",
"AnalysisParams":{
"AnalyzeUncategorizedData":true,
"DefaultTextScanMode":"LowHighAscii",
"MinCharsForString":4,
"SeekNearbyTargets":false,
"UseRelocData":false,
"SmartPlpHandling":false,
"SmartPlbHandling":true},
"PlatformSymbolFileIdentifiers":[],
"ExtensionScriptFileIdentifiers":["PROJ:20180-extension-scripts-a.cs",
"PROJ:20180-extension-scripts-b.cs"],
"ProjectSyms":{
}},
"AddressMap":[{
"Offset":0,
"Addr":4096,
"Length":512,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false},
{
"Offset":512,
"Addr":6144,
"Length":11,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false},
{
"Offset":523,
"Addr":6208,
"Length":20,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false}],
"TypeHints":[{
"Low":0,
"High":0,
"Hint":"Code"}],
"StatusFlagOverrides":{
},
"MiscFlags":{
},
"Comments":{
},
"LongComments":{
},
"Notes":{
},
"UserLabels":{
"72":{
"Label":"PrintInline8String",
"Value":4168,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"73":{
"Label":"PrintInlineRev8String",
"Value":4169,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"74":{
"Label":"PrintInlineNullString",
"Value":4170,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"75":{
"Label":"data01",
"Value":4171,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"127":{
"Label":"Next1",
"Value":4223,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"103":{
"Label":"data02",
"Value":4199,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"106":{
"Label":"data03",
"Value":4202,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"114":{
"Label":"NoCont",
"Value":4210,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"}},
"OperandFormats":{
"100":{
"Length":2,
"Format":"NumericLE",
"SubFormat":"Address",
"SymbolRef":null,
"Extra":null}},
"LvTables":{
},
"Visualizations":[],
"VisualizationAnimations":[],
"VisualizationSets":{
},
"RelocList":{
},
"DbrValues":{
}}
Binary file not shown.
@@ -1,8 +1,8 @@
### 6502bench SourceGen dis65 v1.0 ###
{
"_ContentVersion":3,
"_ContentVersion":7,
"FileDataLength":544,
"FileDataCrc32":787264196,
"FileDataCrc32":1948144462,
"ProjectProps":{
"CpuName":"65816",
"IncludeUndocumentedInstr":false,
@@ -13,10 +13,12 @@
"AnalyzeUncategorizedData":true,
"DefaultTextScanMode":"LowHighAscii",
"MinCharsForString":4,
"SeekNearbyTargets":true,
"SmartPlpHandling":true},
"SeekNearbyTargets":false,
"UseRelocData":false,
"SmartPlpHandling":false,
"SmartPlbHandling":true},
"PlatformSymbolFileIdentifiers":["PROJ:20180-extension-scripts.sym65"],
"PlatformSymbolFileIdentifiers":["PROJ:20182-extension-scripts.sym65"],
"ExtensionScriptFileIdentifiers":["PROJ:20180-extension-scripts-a.cs",
"PROJ:20180-extension-scripts-b.cs"],
"ProjectSyms":{
@@ -25,7 +27,8 @@
"Length":1,
"Format":"NumericLE",
"SubFormat":"Hex",
"SymbolRef":null},
"SymbolRef":null,
"Extra":null},
"Comment":"",
"HasWidth":false,
@@ -39,15 +42,30 @@
"AddressMap":[{
"Offset":0,
"Addr":4096},
"Addr":4096,
"Length":512,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false},
{
"Offset":512,
"Addr":6144},
"Addr":6144,
"Length":11,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false},
{
"Offset":523,
"Addr":6208}],
"Addr":6208,
"Length":21,
"PreLabel":"",
"DisallowInward":false,
"DisallowOutward":false,
"IsRelative":false}],
"TypeHints":[{
"Low":0,
"High":0,
@@ -55,8 +73,11 @@
"StatusFlagOverrides":{
},
"MiscFlags":{
},
"Comments":{
"183":"split across address change"},
},
"LongComments":{
},
@@ -65,58 +86,51 @@
},
"UserLabels":{
"141":{
"131":{
"Label":"PrintInline8String",
"Value":4237,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"142":{
"Label":"PrintInlineRev8String",
"Value":4238,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"143":{
"Label":"PrintInlineNullString",
"Value":4239,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"172":{
"Label":"data02",
"Value":4268,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"175":{
"Label":"data03",
"Value":4271,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"144":{
"Label":"data01",
"Value":4240,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"196":{
"Label":"Next1",
"Value":4292,
"Value":4227,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"183":{
"Label":"NoCont",
"Value":4279,
"132":{
"Label":"PrintInlineRev8String",
"Value":4228,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"133":{
"Label":"PrintInlineNullString",
"Value":4229,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"},
"134":{
"Label":"data01",
"Value":4230,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"162":{
"Label":"data02",
"Value":4258,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"165":{
"Label":"data03",
"Value":4261,
"Source":"User",
"Type":"LocalOrGlobalAddr",
"LabelAnno":"None"},
"173":{
"Label":"Next",
"Value":4269,
"Source":"User",
"Type":"GlobalAddr",
"LabelAnno":"None"}},
@@ -130,4 +144,10 @@
"Visualizations":[],
"VisualizationAnimations":[],
"VisualizationSets":{
},
"RelocList":{
},
"DbrValues":{
}}
@@ -1,7 +1,7 @@
; Copyright 2019 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
*SYNOPSIS Symbols test 2022-extension-scripts
*SYNOPSIS Symbols test 20182-extension-scripts
PrintInlineL1String @ $011000
PrintInlineL2String @ $012000
@@ -0,0 +1,115 @@
.cpu "6502i"
.enc "sg_hiascii"
.cdef $20,$7e,$a0
.enc "sg_ascii"
.cdef $20,$7e,$20
bword .macro
.byte (\1)>>8,(\1)&$ff
.endmacro
* = $1000
jsr PrintInline8String
.text "01234567"
jsr PrintInlineRev8String
.text "76543210"
jsr PrintInlineNullString
.null "null-term string"
jsr L1800
jsr L184E
jsr L1848
brk #$01
.word data01
brk #$02
.word data02
nop
jsr L1040
.byte $24
L1040 .byte $a9
.byte $00
sta $ff
.byte $ea
jmp Next1
PrintInline8String rts
PrintInlineRev8String rts
PrintInlineNullString rts
data01 .word 4386
bword $3344
.dword $88776655
.byte $99,$88,$77,$66
.byte 'f'
.byte 'F' | $80
.byte $40
.byte $c1
.byte $42
.byte $c3
.byte $44
.byte $c5
.byte $46
.byte $c7
.long $012000
.word data02
.byte $80
data02 .word _data03
.byte $80
.enc "sg_hiascii"
_data03 .text "AllEight"
NoCont pla
pla
rts
L1075 jsr NoCont
.byte $00
.byte $80
L107A jsr NoCont
.byte $00
.byte $80
Next1 jsr L1075
jsr _L108A
clc
jsr L107A
rts
_L108A sec
jsr L107A
clc
brk #$02
.word data02
bcc _L1099
bcs _L1099
.byte $00
.byte $80
_L1099 rts
.fill 358,$00
.logical $1800
L1800 jsr PrintInlineNullString
.byte $62
.enc "sg_ascii"
.text "roken "
.byte $01
.here
.logical $1840
.text "string"
.byte $00
.byte $60
L1848 jsr PrintInlineNullString
.null $0a
rts
L184E jsr PrintInlineNullString
adc $6e
.byte $64
.here
@@ -0,0 +1,108 @@
!cpu 6510
* = $1000
jsr PrintInline8String
!text "01234567"
jsr PrintInlineRev8String
!text "76543210"
jsr PrintInlineNullString
!text "null-term string",$00
jsr L1800
jsr L184E
jsr L1848
!byte $00,$01
!word data01
!byte $00,$02
!word data02
nop
jsr L1040
!byte $24
L1040 !byte $a9
!byte $00
sta $ff
!byte $ea
jmp Next1
PrintInline8String rts
PrintInlineRev8String rts
PrintInlineNullString rts
data01 !word 4386
!byte $33,$44
!32 $88776655
!byte $99,$88,$77,$66
!byte 'f'
!byte 'F' | $80
!byte $40
!byte $c1
!byte $42
!byte $c3
!byte $44
!byte $c5
!byte $46
!byte $c7
!24 $012000
!word data02
!byte $80
data02 !word @data03
!byte $80
!xor $80 {
@data03 !text "AllEight"
}
NoCont pla
pla
rts
L1075 jsr NoCont
!byte $00
!byte $80
L107A jsr NoCont
!byte $00
!byte $80
Next1 jsr L1075
jsr @L108A
clc
jsr L107A
rts
@L108A sec
jsr L107A
clc
!byte $00,$02
!word data02
bcc @L1099
bcs @L1099
!byte $00
!byte $80
@L1099 rts
!fill 358,$00
!pseudopc $1800 {
L1800 jsr PrintInlineNullString
!byte $62
!text "roken "
!byte $01
}
!pseudopc $1840 {
!text "string"
!byte $00
!byte $60
L1848 jsr PrintInlineNullString
!text $0a,$00
rts
L184E jsr PrintInlineNullString
adc $6e
!byte $64
}
@@ -0,0 +1,109 @@
.setcpu "6502X"
.org $1000
jsr PrintInline8String
.byte "01234567"
jsr PrintInlineRev8String
.byte "76543210"
jsr PrintInlineNullString
.asciiz "null-term string"
jsr L1800
jsr L184E
jsr L1848
.byte $00,$01
.word data01
.byte $00,$02
.word data02
nop
jsr L1040
.byte $24
L1040: .byte $a9
.byte $00
sta $ff
.byte $ea
jmp Next1
PrintInline8String: rts
PrintInlineRev8String: rts
PrintInlineNullString: rts
data01: .word 4386
.dbyt $3344
.dword $88776655
.byte $99,$88,$77,$66
.byte 'f'
.byte 'F' | $80
.byte $40
.byte $c1
.byte $42
.byte $c3
.byte $44
.byte $c5
.byte $46
.byte $c7
.faraddr $012000
.word data02
.byte $80
data02: .word @data03
.byte $80
.macro HiAscii Arg
.repeat .strlen(Arg), I
.byte .strat(Arg, I) | $80
.endrep
.endmacro
@data03: HiAscii "AllEight"
NoCont: pla
pla
rts
L1075: jsr NoCont
.byte $00
.byte $80
L107A: jsr NoCont
.byte $00
.byte $80
Next1: jsr L1075
jsr @L108A
clc
jsr L107A
rts
@L108A: sec
jsr L107A
clc
.byte $00,$02
.word data02
bcc @L1099
bcs @L1099
.byte $00
.byte $80
@L1099: rts
.res 358,$00
.org $1800
L1800: jsr PrintInlineNullString
.byte $62
.byte "roken "
.byte $01
.org $1840
.byte "string"
.byte $00
.byte $60
L1848: jsr PrintInlineNullString
.byte $0a,$00
rts
L184E: jsr PrintInlineNullString
adc $6e
.byte $64
@@ -0,0 +1,9 @@
# 6502bench SourceGen generated linker script for 20180-extension-scripts
MEMORY {
MAIN: file=%O, start=%S, size=65536;
}
SEGMENTS {
CODE: load=MAIN, type=rw;
}
FEATURES {}
SYMBOLS {}
@@ -0,0 +1,103 @@
org $1000
jsr PrintInline8String
asc '01234567'
jsr PrintInlineRev8String
rev '01234567'
jsr PrintInlineNullString
asc 'null-term string',00
jsr L1800
jsr L184E
jsr L1848
brk $01
dw data01
brk $02
dw data02
nop
jsr L1040
dfb $24
L1040 dfb $a9
dfb $00
sta $ff
dfb $ea
jmp Next1
PrintInline8String rts
PrintInlineRev8String rts
PrintInlineNullString rts
data01 dw 4386
ddb $3344
adrl $88776655
dfb $99,$88,$77,$66
dfb 'f'
dfb "F"
dfb $40
dfb $c1
dfb $42
dfb $c3
dfb $44
dfb $c5
dfb $46
dfb $c7
adr $012000
dw data02
dfb $80
data02 dw :data03
dfb $80
:data03 asc "AllEight"
NoCont pla
pla
rts
L1075 jsr NoCont
dfb $00
dfb $80
L107A jsr NoCont
dfb $00
dfb $80
Next1 jsr L1075
jsr :L108A
clc
jsr L107A
rts
:L108A sec
jsr L107A
clc
brk $02
dw data02
bcc :L1099
bcs :L1099
dfb $00
dfb $80
:L1099 rts
ds 358
org $1800
L1800 jsr PrintInlineNullString
dfb $62
asc 'roken '
dfb $01
org $1840
asc 'string'
dfb $00
dfb $60
L1848 jsr PrintInlineNullString
asc 0a00
rts
L184E jsr PrintInlineNullString
adc $6e
dfb $64
@@ -35,14 +35,7 @@ PrintInlineDciString = $013000
.word data01
brk #$02
.word data02
nop
jsr L1085
.byte $24
L1085 .byte $a9
.byte $00
sta $ff
.byte $ea
jmp Next1
jmp Next
PrintInline8String rts
@@ -72,40 +65,18 @@ data02 .word _data03
.enc "sg_hiascii"
_data03 .text "AllEight"
NoCont pla ;split across address change
pla
rts
L10BA jsr NoCont
.byte $00
.byte $80
L10BF jsr NoCont
.byte $00
.byte $80
Next1 jsr L10BA
jsr _L10CF
clc
jsr L10BF
rts
_L10CF sec
jsr L10BF
clc
Next clc
brk #$02
.word data02
bcc _L10DE
bcs _L10DE
bcc _L10B8
bcs _L10B8
.byte $00
.byte $80
_L10DE rts
_L10B8 rts
.fill 289,$00
.fill 327,$00
.logical $1800
L1800 jsr PrintInlineNullString
@@ -28,14 +28,7 @@ PrintInlineDciString = $013000
!word data01
!byte $00,$02
!word data02
nop
jsr L1085
!byte $24
L1085 !byte $a9
!byte $00
sta $ff
!byte $ea
jmp Next1
jmp Next
PrintInline8String rts
@@ -66,40 +59,18 @@ data02 !word @data03
@data03 !text "AllEight"
}
NoCont pla ;split across address change
pla
rts
L10BA jsr NoCont
!byte $00
!byte $80
L10BF jsr NoCont
!byte $00
!byte $80
Next1 jsr L10BA
jsr @L10CF
clc
jsr L10BF
rts
@L10CF sec
jsr L10BF
clc
Next clc
!byte $00,$02
!word data02
bcc @L10DE
bcs @L10DE
bcc @L10B8
bcs @L10B8
!byte $00
!byte $80
@L10DE rts
@L10B8 rts
!fill 289,$00
!fill 327,$00
!pseudopc $1800 {
L1800 jsr PrintInlineNullString
@@ -28,14 +28,7 @@ PrintInlineDciString = $013000
.word data01
brk $02
.word data02
nop
jsr L1085
.byte $24
L1085: .byte $a9
.byte $00
sta $ff
.byte $ea
jmp Next1
jmp Next
PrintInline8String: rts
@@ -69,40 +62,18 @@ data02: .word @data03
.endmacro
@data03: HiAscii "AllEight"
NoCont: pla ;split across address change
pla
rts
L10BA: jsr NoCont
.byte $00
.byte $80
L10BF: jsr NoCont
.byte $00
.byte $80
Next1: jsr L10BA
jsr @L10CF
clc
jsr L10BF
rts
@L10CF: sec
jsr L10BF
clc
Next: clc
brk $02
.word data02
bcc @L10DE
bcs @L10DE
bcc @L10B8
bcs @L10B8
.byte $00
.byte $80
@L10DE: rts
@L10B8: rts
.res 289,$00
.res 327,$00
.org $1800
L1800: jsr PrintInlineNullString
@@ -25,14 +25,7 @@ PrintInlineDciString equ $013000
dw data01
brk $02
dw data02
nop
jsr L1085
dfb $24
L1085 dfb $a9
dfb $00
sta $ff
dfb $ea
jmp Next1
jmp Next
PrintInline8String rts
@@ -61,40 +54,18 @@ data02 dw :data03
dfb $80
:data03 asc "AllEight"
NoCont pla ;split across address change
pla
rts
L10BA jsr NoCont
dfb $00
dfb $80
L10BF jsr NoCont
dfb $00
dfb $80
Next1 jsr L10BA
jsr :L10CF
clc
jsr L10BF
rts
:L10CF sec
jsr L10BF
clc
Next clc
brk $02
dw data02
bcc :L10DE
bcs :L10DE
bcc :L10B8
bcs :L10B8
dfb $00
dfb $80
:L10DE rts
:L10B8 rts
ds 289
ds 327
org $1800
L1800 jsr PrintInlineNullString
@@ -0,0 +1,148 @@
; Copyright 2019 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Assembler: Merlin 32
; EDIT: the project must include the extension scripts
; EDIT: set "treat BRK as two-byte instruction"
org $1000
; check basics
jsr PrintInline8String
asc '01234567'
jsr PrintInlineRev8String
asc '76543210'
jsr PrintInlineNullString
asc 'null-term string',00
; check errors
jsr broken
jsr off_end
jsr too_long
; check block formatting
brk $01
dw data01
brk $02
dw data02
; Handle an edge case where the inline formatting gets thrown out.
; Two paths: BIT $A9 / BRK $85 / inline $FF/EA goes first, then
; LDA $00 / STA $FF / NOP goes. When we get to the STA we notice
; that it's marked as inline data, so we remove it from $85 $ff
; but not from $ea.
;
; If we try to walk through the file, advancing offset by the anattrib
; length, we will traverse the first path, which (with 2-byte BRKs)
; runs into the $FF, which is marked as an instruction but not an
; instruction start.
;
; Switching to 1-byte BRKs makes the $85 an inline data item rather
; than an instruction. When we come back through, we LDA $00 and
; then skip over the next 3 bytes. No conflict.
nop
jsr edge1 ;alt path, evaluated later
dfb $24 ;1: BIT dp
edge1 dfb $a9 ;2: LDA imm
brk ;1: BRK <op>
dfb $85 ;2: STA imm
dfb $ff ;1: address $eaff
nop ;2:
jmp Next1
PrintInline8String rts ;EDIT: set label
PrintInlineRev8String rts ;EDIT: set label
PrintInlineNullString rts ;EDIT: set label
data01 ;EDIT: set label (unique local)
dw $1122 ;should be little-endian
dw $4433 ;should be big-endian
hex 55667788 ;32-bit
hex 99887766 ;32-bit big-endian
dfb 'f' ;ASCII
dfb "F" ;high ASCII
hex 40C142C344C546C7 ;bad DCI string
hex 002001 ;24-bit addr
dw data02 ;by symbol
dfb $80
data02 ;EDIT: set label, must be "data02" (unique local)
dw data03
dfb $80
data03 ;EDIT: set label (unique local)
asc "AllEight"
;
; The analyzer is trying to avoid calling the inline JSR check on code it
; has previously visited. There was a bug that caused us to lose the
; no-continue value if code was revisited.
;
; To ensure we revisit the function, we need to call it, then call
; something else that calls it, changing up the flags.
;
NoCont pla
pla
rts
TestNC1 jsr NoCont
dfb $00,$80
TestNC2 jsr NoCont
dfb $00,$80
Next1 jsr TestNC1
jsr PushThing
clc
jsr TestNC2
rts
PushThing
sec
jsr TestNC2
; Make sure flags get marked as indeterminate across inline BRK.
; Also exercises formatting the same block twice.
clc
brk $02
dw data02
bcc :BrkNext
bcs :BrkNext
brk $80
:BrkNext
rts
; Failed call tests. Some of these need to be at the end of the file.
; We use an align directive to ensure their offsets don't change as we
; update stuff earlier in the file.
ds \
ds 256
org $1800
; check address split across string
broken jsr PrintInlineNullString
asc 'broken ',01
org $1840 ;EDIT: split address
asc 'string',00
rts
too_long jsr PrintInlineNullString
dw END-*+1 ;should be 1 byte over; want it to be rejected by
rts ; function in .cs (otherwise code overlap race)
; MUST be last
off_end jsr PrintInlineNullString
nonterm asc 'end'
END equ *
@@ -3,7 +3,7 @@
;
; Assembler: Merlin 32
; EDIT: the project must include the platform symbol file and extension script
; EDIT: the project must include the platform symbol file and extension scripts
PrintInlineL1String equ $011000
PrintInlineL2String equ $012000
@@ -43,36 +43,13 @@ PrintInlineDciString equ $013000 ;EDIT: add to project symbols
brk $02
dw data02
; Handle an edge case where the inline formatting gets thrown out.
; Two paths: BIT $A9 / BRK $85 / inline $FF/EA goes first, then
; LDA $00 / STA $FF / NOP goes. When we get to the STA we notice
; that it's marked as inline data, so we remove it from $85 $ff
; but not from $ea.
;
; If we try to walk through the file, advancing offset by the anattrib
; length, we will traverse the first path, which (with 2-byte BRKs)
; runs into the $FF, which is marked as an instruction but not an
; instruction start.
;
; Switching to 1-byte BRKs makes the $85 an inline data item rather
; than an instruction. When we come back through, we LDA $00 and
; then skip over the next 3 bytes. No conflict.
nop
jsr edge1 ;alt path, evaluated later
dfb $24 ;1: BIT dp
edge1 dfb $a9 ;2: LDA imm
brk ;1: BRK <op>
dfb $85 ;2: STA imm
dfb $ff ;1: address $eaff
nop ;2:
jmp Next1
jmp Next
PrintInline8String rts ;EDIT: set label
PrintInlineRev8String rts ;EDIT: set label
PrintInlineNullString rts ;EDIT: set label
data01 ;EDIT: set label
data01 ;EDIT: set label (unique local)
dw $1122 ;should be little-endian
dw $4433 ;should be big-endian
hex 55667788 ;32-bit
@@ -85,43 +62,14 @@ data01 ;EDIT: set label
dfb $80
data02 ;EDIT: set label, must be "data02"
data02 ;EDIT: set label, must be "data02" (unique local)
dw data03
dfb $80
data03 ;EDIT: set label
data03 ;EDIT: set label (unique local)
asc "AllEight"
;
; The analyzer is trying to avoid calling the inline JSR check on code it
; has previously visited. There was a bug that caused us to lose the
; no-continue value if code was revisited.
;
; To ensure we revisit the function, we need to call it, then call
; something else that calls it, changing up the flags.
;
NoCont pla
pla
rts
TestNC1 jsr NoCont
dfb $00,$80
TestNC2 jsr NoCont
dfb $00,$80
Next1 jsr TestNC1
jsr PushThing
clc
jsr TestNC2
rts
PushThing
sec
jsr TestNC2
Next
; Make sure flags get marked as indeterminate across inline BRK.
; Also exercises formatting the same block twice.