From dc8e49e4d8826207b9b4b657e3bbf2ecab3dec6f Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Mon, 7 Oct 2019 14:21:26 -0700 Subject: [PATCH] Exercise address-to-offset function in plugin Also exercise various formatting options. Also, fix a bug where the code that applies project/platform symbols to numeric references was ignoring inline data items. --- PluginCommon/Util.cs | 14 ++- SourceGen/DisasmProject.cs | 4 +- SourceGen/SGTestData/2022-extension-scripts | Bin 156 -> 203 bytes ...scripts.cs => 2022-extension-scripts-a.cs} | 6 +- .../SGTestData/2022-extension-scripts-b.cs | 99 ++++++++++++++++++ .../SGTestData/2022-extension-scripts.dis65 | 24 +++-- .../Expected/2022-extension-scripts_64tass.S | 37 ++++++- .../2022-extension-scripts_Merlin32.S | 33 +++++- .../Expected/2022-extension-scripts_acme.S | 35 ++++++- .../Expected/2022-extension-scripts_cc65.S | 38 ++++++- .../Expected/2022-extension-scripts_cc65.cfg | 2 +- .../Source/2022-extension-scripts.S | 31 +++++- 12 files changed, 293 insertions(+), 30 deletions(-) rename SourceGen/SGTestData/{2022-extension-scripts.cs => 2022-extension-scripts-a.cs} (96%) create mode 100644 SourceGen/SGTestData/2022-extension-scripts-b.cs diff --git a/PluginCommon/Util.cs b/PluginCommon/Util.cs index d1fefca..42ada4e 100644 --- a/PluginCommon/Util.cs +++ b/PluginCommon/Util.cs @@ -39,7 +39,19 @@ namespace PluginCommon { } /// - /// Compute a standard CRC-32 (polynomial 0xedb88320) on a buffer of data. + /// Determines whether the provided offset and length are valid for the array. + /// + /// Data array that to check against. + /// Start offset. + /// Number of bytes. + /// True if the specified range falls within the array bounds. + public static bool IsInBounds(byte[] data, int startOff, int len) { + return !(startOff < 0 || len < 0 || startOff >= data.Length || len > data.Length || + startOff + len > data.Length); + } + + /// + /// Computes a standard CRC-32 (polynomial 0xedb88320) on a buffer of data. /// /// Buffer to process. /// CRC value. diff --git a/SourceGen/DisasmProject.cs b/SourceGen/DisasmProject.cs index f2ee49b..7bb655b 100644 --- a/SourceGen/DisasmProject.cs +++ b/SourceGen/DisasmProject.cs @@ -1188,8 +1188,8 @@ namespace SourceGen { // the correct thing to do. address = attr.OperandAddress; sym = SymbolTable.FindNonVariableByAddress(address); - } else if (attr.IsDataStart && attr.DataDescriptor != null && - attr.DataDescriptor.IsNumeric && + } else if ((attr.IsDataStart || attr.IsInlineDataStart) && + attr.DataDescriptor != null && attr.DataDescriptor.IsNumeric && attr.DataDescriptor.FormatSubType == FormatDescriptor.SubType.Address) { // Found a Numeric/Address item that matches. Data items don't have // OperandAddress or OperandOffset set, so we need to check manually to diff --git a/SourceGen/SGTestData/2022-extension-scripts b/SourceGen/SGTestData/2022-extension-scripts index 0cc2dd192783899d882117a52e9b2d028d0824c2..3fe281c4f0957c478963177734ad612157446f3d 100644 GIT binary patch delta 107 zcmbQkc$!g0;`bv1g+>7bLnC7oQ!{ggCINFZQxjt&Lj#58i83L!s|6JJ1r<0185mmx z7?>6aBmjYups`D6T6xFJj`Fm$V-5$M4!az6JI plSyms) { + mAppRef = appRef; + mFileData = fileData; + mAddrTrans = addrTrans; + + mAppRef.DebugLog("Test2022-B(id=" + AppDomain.CurrentDomain.Id + "): prepare()"); + } + + public void CheckBrk(int offset, out bool noContinue) { + noContinue = true; + + // need BRK, function byte, and two-byte address + if (!Util.IsInBounds(mFileData, offset, 4)) { + return; + } + byte func = mFileData[offset + 1]; + if (func < 0x01 || func > 0x02) { + return; + } + + mAppRef.SetInlineDataFormat(offset + 1, 1, DataType.NumericLE, + DataSubType.Hex, null); + mAppRef.SetInlineDataFormat(offset + 2, 2, DataType.NumericLE, + DataSubType.Address, null); + noContinue = false; + + int structAddr = Util.GetWord(mFileData, offset + 2, 2, false); + int structOff = mAddrTrans.AddressToOffset(offset, structAddr); + if (structOff < 0) { + mAppRef.DebugLog("Unable to get offset for address $" + structAddr.ToString("x6")); + return; + } + + switch (func) { + case 0x01: + if (!Util.IsInBounds(mFileData, structOff, 27)) { + mAppRef.DebugLog("Struct doesn't fit in file"); + return; + } + mAppRef.SetInlineDataFormat(structOff + 0, 2, DataType.NumericLE, + DataSubType.Decimal, null); + mAppRef.SetInlineDataFormat(structOff + 2, 2, DataType.NumericBE, + DataSubType.Hex, null); + mAppRef.SetInlineDataFormat(structOff + 4, 4, DataType.NumericLE, + DataSubType.Hex, null); + mAppRef.SetInlineDataFormat(structOff + 8, 4, DataType.NumericBE, + DataSubType.Hex, null); + mAppRef.SetInlineDataFormat(structOff + 12, 1, DataType.NumericLE, + DataSubType.Ascii, null); + mAppRef.SetInlineDataFormat(structOff + 13, 1, DataType.NumericLE, + DataSubType.HighAscii, null); + mAppRef.SetInlineDataFormat(structOff + 14, 8, DataType.StringDci, + DataSubType.Ascii, null); + mAppRef.SetInlineDataFormat(structOff + 22, 3, DataType.NumericLE, + DataSubType.Address, null); + mAppRef.SetInlineDataFormat(structOff + 25, 2, DataType.NumericLE, + DataSubType.Symbol, "data02"); + break; + case 0x02: + if (!Util.IsInBounds(mFileData, structOff, 2)) { + mAppRef.DebugLog("Struct doesn't fit in file"); + return; + } + mAppRef.SetInlineDataFormat(structOff, 2, DataType.NumericLE, + DataSubType.Address, null); + int nextAddr = Util.GetWord(mFileData, structOff + 2, 2, false); + int nextOff = mAddrTrans.AddressToOffset(structOff, nextAddr); + if (!Util.IsInBounds(mFileData, nextOff, 1)) { + mAppRef.DebugLog("Struct doesn't fit in file"); + return; + } + mAppRef.SetInlineDataFormat(nextOff, 8, DataType.StringGeneric, + DataSubType.HighAscii, null); + break; + } + } + } +} diff --git a/SourceGen/SGTestData/2022-extension-scripts.dis65 b/SourceGen/SGTestData/2022-extension-scripts.dis65 index 0e41eb6..687d55d 100644 --- a/SourceGen/SGTestData/2022-extension-scripts.dis65 +++ b/SourceGen/SGTestData/2022-extension-scripts.dis65 @@ -1,9 +1,9 @@ ### 6502bench SourceGen dis65 v1.0 ### { -"_ContentVersion":2,"FileDataLength":156,"FileDataCrc32":-741040917,"ProjectProps":{ +"_ContentVersion":2,"FileDataLength":203,"FileDataCrc32":-1621468157,"ProjectProps":{ "CpuName":"65816","IncludeUndocumentedInstr":false,"EntryFlags":32702671,"AutoLabelStyle":"Simple","AnalysisParams":{ "AnalyzeUncategorizedData":true,"DefaultTextScanMode":"LowHighAscii","MinCharsForString":4,"SeekNearbyTargets":true,"SmartPlpHandling":true}, -"PlatformSymbolFileIdentifiers":["PROJ:2022-extension-scripts.sym65"],"ExtensionScriptFileIdentifiers":["PROJ:2022-extension-scripts.cs"],"ProjectSyms":{ +"PlatformSymbolFileIdentifiers":["PROJ:2022-extension-scripts.sym65"],"ExtensionScriptFileIdentifiers":["PROJ:2022-extension-scripts-a.cs","PROJ:2022-extension-scripts-b.cs"],"ProjectSyms":{ "PrintInlineDciString":{ "DataDescriptor":{ "Length":1,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, @@ -11,7 +11,7 @@ "AddressMap":[{ "Offset":0,"Addr":4096}, { -"Offset":135,"Addr":4352}],"TypeHints":[{ +"Offset":182,"Addr":4352}],"TypeHints":[{ "Low":0,"High":0,"Hint":"Code"}],"StatusFlagOverrides":{ }, "Comments":{ @@ -21,12 +21,18 @@ "Notes":{ }, "UserLabels":{ -"121":{ -"Label":"PrintInline8String","Value":4217,"Source":"User","Type":"LocalOrGlobalAddr"}, -"122":{ -"Label":"PrintInlineRev8String","Value":4218,"Source":"User","Type":"LocalOrGlobalAddr"}, -"123":{ -"Label":"PrintInlineNullString","Value":4219,"Source":"User","Type":"LocalOrGlobalAddr"}}, +"129":{ +"Label":"PrintInline8String","Value":4225,"Source":"User","Type":"LocalOrGlobalAddr"}, +"130":{ +"Label":"PrintInlineRev8String","Value":4226,"Source":"User","Type":"LocalOrGlobalAddr"}, +"131":{ +"Label":"PrintInlineNullString","Value":4227,"Source":"User","Type":"LocalOrGlobalAddr"}, +"160":{ +"Label":"data02","Value":4256,"Source":"User","Type":"LocalOrGlobalAddr"}, +"163":{ +"Label":"data03","Value":4259,"Source":"User","Type":"LocalOrGlobalAddr"}, +"132":{ +"Label":"data01","Value":4228,"Source":"User","Type":"LocalOrGlobalAddr"}}, "OperandFormats":{ }, "LvTables":{ diff --git a/SourceGen/SGTestData/Expected/2022-extension-scripts_64tass.S b/SourceGen/SGTestData/Expected/2022-extension-scripts_64tass.S index 772d4c9..7d43bab 100644 --- a/SourceGen/SGTestData/Expected/2022-extension-scripts_64tass.S +++ b/SourceGen/SGTestData/Expected/2022-extension-scripts_64tass.S @@ -1,4 +1,6 @@ .cpu "65816" + .enc sg_hiascii + .cdef $20,$7e,$a0 .enc sg_ascii .cdef $20,$7e,$20 PrintInlineL1String = $011000 @@ -23,9 +25,15 @@ PrintInlineDciString = $013000 .text $14,$00,"string with length/2" jsl PrintInlineDciString .shift "DCI string" - jsr L107C + jsr L10AB jsr L110F jsr L1108 + brk + .byte $01 + .word data01 + brk + .byte $02 + .word data02 rts PrintInline8String rts @@ -34,8 +42,30 @@ PrintInlineRev8String rts PrintInlineNullString rts -L107C jsr PrintInlineNullString - per $7ff4 +data01 .word 4386 + .byte $33,$44 + .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 PrintInlineL2String + .word data02 + .byte $80 +data02 .word data03 + .byte $80 + .enc sg_hiascii +data03 .text "AllEight" + +L10AB jsr PrintInlineNullString + per $8023 rtl .byte $65 @@ -43,6 +73,7 @@ L107C jsr PrintInlineNullString .byte $20 .byte $01 .logical $1100 + .enc sg_ascii .text "string" .byte $00 .byte $60 diff --git a/SourceGen/SGTestData/Expected/2022-extension-scripts_Merlin32.S b/SourceGen/SGTestData/Expected/2022-extension-scripts_Merlin32.S index bc4f79d..19163c1 100644 --- a/SourceGen/SGTestData/Expected/2022-extension-scripts_Merlin32.S +++ b/SourceGen/SGTestData/Expected/2022-extension-scripts_Merlin32.S @@ -18,9 +18,15 @@ PrintInlineDciString equ $013000 strl 'string with length/2' jsl PrintInlineDciString dci 'DCI string' - jsr L107C + jsr L10AB jsr L110F jsr L1108 + brk + dfb $01 + dw data01 + brk + dfb $02 + dw data02 rts PrintInline8String rts @@ -29,8 +35,29 @@ PrintInlineRev8String rts PrintInlineNullString rts -L107C jsr PrintInlineNullString - per $7ff4 +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 PrintInlineL2String + dw data02 + dfb $80 +data02 dw data03 + dfb $80 +data03 asc "AllEight" + +L10AB jsr PrintInlineNullString + per $8023 rtl dfb $65 diff --git a/SourceGen/SGTestData/Expected/2022-extension-scripts_acme.S b/SourceGen/SGTestData/Expected/2022-extension-scripts_acme.S index f1f8c40..9c99c8d 100644 --- a/SourceGen/SGTestData/Expected/2022-extension-scripts_acme.S +++ b/SourceGen/SGTestData/Expected/2022-extension-scripts_acme.S @@ -21,9 +21,15 @@ PrintInlineDciString = $013000 !text $14,$00,"string with length/2" jsl PrintInlineDciString !text "DCI strin",$e7 - jsr L107C + jsr L10AB jsr L110F jsr L1108 + brk + !byte $01 + !word data01 + brk + !byte $02 + !word data02 rts PrintInline8String rts @@ -32,8 +38,31 @@ PrintInlineRev8String rts PrintInlineNullString rts -L107C jsr PrintInlineNullString - per $7ff4 +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 PrintInlineL2String + !word data02 + !byte $80 +data02 !word data03 + !byte $80 + !xor $80 { +data03 !text "AllEight" + } + +L10AB jsr PrintInlineNullString + per $8023 rtl !byte $65 diff --git a/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.S b/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.S index 1866855..358fb99 100644 --- a/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.S +++ b/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.S @@ -22,9 +22,15 @@ PrintInlineDciString = $013000 .byte $14,$00,"string with length/2" jsl PrintInlineDciString .byte "DCI strin",$e7 - jsr L107C + jsr L10AB jsr L110F jsr L1108 + brk + .byte $01 + .word data01 + brk + .byte $02 + .word data02 rts PrintInline8String: rts @@ -33,8 +39,34 @@ PrintInlineRev8String: rts PrintInlineNullString: rts -L107C: jsr PrintInlineNullString - per $7ff4 +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 PrintInlineL2String + .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" + +L10AB: jsr PrintInlineNullString + per $8023 rtl .byte $65 diff --git a/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.cfg b/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.cfg index e1fe3c3..d5e1359 100644 --- a/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.cfg +++ b/SourceGen/SGTestData/Expected/2022-extension-scripts_cc65.cfg @@ -1,7 +1,7 @@ # 6502bench SourceGen generated linker script for 2022-extension-scripts MEMORY { MAIN: file=%O, start=%S, size=65536; -# MEM000: file=%O, start=$1000, size=135; +# MEM000: file=%O, start=$1000, size=182; # MEM001: file=%O, start=$1100, size=21; } SEGMENTS { diff --git a/SourceGen/SGTestData/Source/2022-extension-scripts.S b/SourceGen/SGTestData/Source/2022-extension-scripts.S index 88d76cb..f403028 100644 --- a/SourceGen/SGTestData/Source/2022-extension-scripts.S +++ b/SourceGen/SGTestData/Source/2022-extension-scripts.S @@ -17,9 +17,9 @@ PrintInlineDciString equ $013000 ;EDIT: add to project symbols mx %11 ; check basics - jsr Print8String + jsr PrintInline8String asc '01234567' - jsr PrintRev8String + jsr PrintInlineRev8String asc '76543210' jsr PrintInlineNullString asc 'null-term string',00 @@ -36,12 +36,39 @@ PrintInlineDciString equ $013000 ;EDIT: add to project symbols jsr off_end jsr too_long +; check block formatting + brk $01 + dw data01 + + brk $02 + dw data02 + rts PrintInline8String rts ;EDIT: set label PrintInlineRev8String rts ;EDIT: set label PrintInlineNullString rts ;EDIT: set label +data01 ;EDIT: set label + 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" + dw data03 + dfb $80 + +data03 ;EDIT: set label + asc "AllEight" + ; check address split across string broken jsr PrintInlineNullString