mirror of
https://github.com/fadden/6502bench.git
synced 2025-02-21 12:29:00 +00:00
Fix 65816 code generation issues
Code generated for 64tass was incorrect for JSR/JMP to a location outside the file bounds. A test added to 20052-branches-and-banks revealed an issue with cc65 generation as well.
This commit is contained in:
parent
d035e29de5
commit
6d7fdff6b5
@ -164,6 +164,7 @@ namespace SourceGen.AsmGen {
|
|||||||
Quirks = new AssemblerQuirks();
|
Quirks = new AssemblerQuirks();
|
||||||
Quirks.StackIntOperandIsImmediate = true;
|
Quirks.StackIntOperandIsImmediate = true;
|
||||||
Quirks.LeadingUnderscoreSpecial = true;
|
Quirks.LeadingUnderscoreSpecial = true;
|
||||||
|
Quirks.Need24BitsForAbsPBR = true;
|
||||||
|
|
||||||
mWorkDirectory = workDirectory;
|
mWorkDirectory = workDirectory;
|
||||||
mFileNameBase = fileNameBase;
|
mFileNameBase = fileNameBase;
|
||||||
|
@ -292,10 +292,10 @@ namespace SourceGen.AsmGen {
|
|||||||
formattedOperand = hash + formatter.FormatHexValue(arg1, 2) + "," +
|
formattedOperand = hash + formatter.FormatHexValue(arg1, 2) + "," +
|
||||||
hash + formatter.FormatHexValue(arg2, 2);
|
hash + formatter.FormatHexValue(arg2, 2);
|
||||||
} else {
|
} else {
|
||||||
if (operandLen == 2) {
|
if (operandLen == 2 && !(op.IsAbsolutePBR && gen.Quirks.Need24BitsForAbsPBR)) {
|
||||||
// This is necessary for 16-bit operands, like "LDA abs" and "PEA val",
|
// This is necessary for 16-bit operands, like "LDA abs" and "PEA val",
|
||||||
// when outside bank zero. The bank is included in the operand address,
|
// when outside bank zero. The bank is included in the operand address,
|
||||||
// but we don't want to show it here.
|
// but we don't want to show it here. We may need it for JSR/JMP though.
|
||||||
operandForSymbol &= 0xffff;
|
operandForSymbol &= 0xffff;
|
||||||
}
|
}
|
||||||
formattedOperand = formatter.FormatHexValue(operandForSymbol, operandLen * 2);
|
formattedOperand = formatter.FormatHexValue(operandForSymbol, operandLen * 2);
|
||||||
@ -303,7 +303,8 @@ namespace SourceGen.AsmGen {
|
|||||||
}
|
}
|
||||||
string operandStr = formatter.FormatOperand(op, formattedOperand, wdis);
|
string operandStr = formatter.FormatOperand(op, formattedOperand, wdis);
|
||||||
|
|
||||||
if (gen.Quirks.StackIntOperandIsImmediate && op.AddrMode == OpDef.AddressMode.StackInt) {
|
if (gen.Quirks.StackIntOperandIsImmediate &&
|
||||||
|
op.AddrMode == OpDef.AddressMode.StackInt) {
|
||||||
// COP $02 is standard, but some require COP #$02
|
// COP $02 is standard, but some require COP #$02
|
||||||
operandStr = '#' + operandStr;
|
operandStr = '#' + operandStr;
|
||||||
}
|
}
|
||||||
|
@ -216,6 +216,12 @@ namespace SourceGen.AsmGen {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool BlockMoveArgsReversed { get; set; }
|
public bool BlockMoveArgsReversed { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Do we need to specify a 24-bit value for 16-bit absolute arguments that are
|
||||||
|
/// formed with the Program Bank Register (JMP/JSR)?
|
||||||
|
/// </summary>
|
||||||
|
public bool Need24BitsForAbsPBR { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Does the assembler support a type of label whose value can be redefined to
|
/// Does the assembler support a type of label whose value can be redefined to
|
||||||
/// act as a local variable?
|
/// act as a local variable?
|
||||||
|
@ -633,6 +633,14 @@ namespace SourceGen {
|
|||||||
case FormatDescriptor.SubType.None:
|
case FormatDescriptor.SubType.None:
|
||||||
case FormatDescriptor.SubType.Hex:
|
case FormatDescriptor.SubType.Hex:
|
||||||
case FormatDescriptor.SubType.Address:
|
case FormatDescriptor.SubType.Address:
|
||||||
|
if ((formatter.ExpressionMode == Formatter.FormatConfig.ExpressionMode.Cc65 ||
|
||||||
|
formatter.ExpressionMode == Formatter.FormatConfig.ExpressionMode.Merlin) &&
|
||||||
|
(flags & FormatNumericOpFlags.IsAbsolutePBR) != 0) {
|
||||||
|
// cc65 really doesn't like 24-bit values for JMP/JSR. If it sees a
|
||||||
|
// 24-bit hex constant it emits JML/JSL. Merlin works either way, and
|
||||||
|
// I think it looks better as a 16-bit value.
|
||||||
|
operandValue &= 0xffff;
|
||||||
|
}
|
||||||
return formatter.FormatHexValue(operandValue, hexMinLen);
|
return formatter.FormatHexValue(operandValue, hexMinLen);
|
||||||
case FormatDescriptor.SubType.Decimal:
|
case FormatDescriptor.SubType.Decimal:
|
||||||
return formatter.FormatDecimalValue(operandValue);
|
return formatter.FormatDecimalValue(operandValue);
|
||||||
|
@ -172,6 +172,11 @@ code, but also needs to know how to handle the corner cases.</p>
|
|||||||
<li>For 65816, selecting the bank byte is done with the grave accent
|
<li>For 65816, selecting the bank byte is done with the grave accent
|
||||||
character ('`') rather than the caret ('^'). (There's a note in the
|
character ('`') rather than the caret ('^'). (There's a note in the
|
||||||
docs to the effect that they plan to move to carets.)</li>
|
docs to the effect that they plan to move to carets.)</li>
|
||||||
|
<li>Instructions whose argument is formed by combining with the
|
||||||
|
65816 Program Bank Register (16-bit JMP/JSR) must be specified
|
||||||
|
as 24-bit values for code that lives outside bank 0. This is
|
||||||
|
true for both symbols and raw hex (e.g. <code>JSR $1234</code>
|
||||||
|
is invalid outside bank 0).</li>
|
||||||
<li>The arguments to COP and BRK require immediate-mode syntax
|
<li>The arguments to COP and BRK require immediate-mode syntax
|
||||||
(<code>COP #$03</code> rather than <code>COP $03</code>).
|
(<code>COP #$03</code> rather than <code>COP $03</code>).
|
||||||
<li>For historical reasons, the default behavior of the assembler is to
|
<li>For historical reasons, the default behavior of the assembler is to
|
||||||
|
Binary file not shown.
@ -1,8 +1,8 @@
|
|||||||
### 6502bench SourceGen dis65 v1.0 ###
|
### 6502bench SourceGen dis65 v1.0 ###
|
||||||
{
|
{
|
||||||
"_ContentVersion":3,
|
"_ContentVersion":4,
|
||||||
"FileDataLength":202,
|
"FileDataLength":224,
|
||||||
"FileDataCrc32":530517490,
|
"FileDataCrc32":2055368095,
|
||||||
"ProjectProps":{
|
"ProjectProps":{
|
||||||
"CpuName":"65816",
|
"CpuName":"65816",
|
||||||
"IncludeUndocumentedInstr":false,
|
"IncludeUndocumentedInstr":false,
|
||||||
@ -222,6 +222,12 @@
|
|||||||
"Label":"backchk",
|
"Label":"backchk",
|
||||||
"Part":"Low"}},
|
"Part":"Low"}},
|
||||||
|
|
||||||
|
"133":{
|
||||||
|
"Length":3,
|
||||||
|
"Format":"NumericLE",
|
||||||
|
"SubFormat":"Hex",
|
||||||
|
"SymbolRef":null},
|
||||||
|
|
||||||
"139":{
|
"139":{
|
||||||
"Length":3,
|
"Length":3,
|
||||||
"Format":"NumericLE",
|
"Format":"NumericLE",
|
||||||
@ -230,6 +236,12 @@
|
|||||||
"Label":"fwdchk",
|
"Label":"fwdchk",
|
||||||
"Part":"Low"}},
|
"Part":"Low"}},
|
||||||
|
|
||||||
|
"142":{
|
||||||
|
"Length":3,
|
||||||
|
"Format":"NumericLE",
|
||||||
|
"SubFormat":"Hex",
|
||||||
|
"SymbolRef":null},
|
||||||
|
|
||||||
"148":{
|
"148":{
|
||||||
"Length":3,
|
"Length":3,
|
||||||
"Format":"NumericLE",
|
"Format":"NumericLE",
|
||||||
@ -258,4 +270,6 @@
|
|||||||
"Visualizations":[],
|
"Visualizations":[],
|
||||||
"VisualizationAnimations":[],
|
"VisualizationAnimations":[],
|
||||||
"VisualizationSets":{
|
"VisualizationSets":{
|
||||||
}}
|
},
|
||||||
|
|
||||||
|
"RelocList":null}
|
||||||
|
@ -58,7 +58,7 @@ bank54 cmp bank54
|
|||||||
|
|
||||||
backchk nop
|
backchk nop
|
||||||
nop
|
nop
|
||||||
L543218 rts
|
rts
|
||||||
|
|
||||||
backval .long backchk
|
backval .long backchk
|
||||||
|
|
||||||
@ -73,10 +73,10 @@ L54321C lda backchk
|
|||||||
nop
|
nop
|
||||||
jsr backchk
|
jsr backchk
|
||||||
jsr backchk+1
|
jsr backchk+1
|
||||||
jsr L543218
|
jsr $543218
|
||||||
jsr fwdchk
|
jsr fwdchk
|
||||||
jsr fwdchk+1
|
jsr fwdchk+1
|
||||||
jsr L54327F
|
jsr $54327f
|
||||||
nop
|
nop
|
||||||
ldx #$00
|
ldx #$00
|
||||||
jsr (backval,x)
|
jsr (backval,x)
|
||||||
@ -105,9 +105,19 @@ fwdval .long fwdchk
|
|||||||
|
|
||||||
fwdchk nop
|
fwdchk nop
|
||||||
nop
|
nop
|
||||||
L54327F rts
|
rts
|
||||||
|
|
||||||
L543280 jsr skip+$540000
|
L543280 jsr skip+$540000
|
||||||
|
nop
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
lda $544280
|
||||||
|
jsl $544280
|
||||||
|
nop
|
||||||
|
lda $4280
|
||||||
|
jsr $544280
|
||||||
|
jsr ($544280,x)
|
||||||
|
nop
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
.here
|
.here
|
||||||
|
@ -52,7 +52,7 @@ bank54 cmpl bank54
|
|||||||
|
|
||||||
backchk nop
|
backchk nop
|
||||||
nop
|
nop
|
||||||
L543218 rts
|
rts
|
||||||
|
|
||||||
backval adr backchk
|
backval adr backchk
|
||||||
|
|
||||||
@ -67,10 +67,10 @@ L54321C ldal backchk
|
|||||||
nop
|
nop
|
||||||
jsr backchk
|
jsr backchk
|
||||||
jsr backchk+1
|
jsr backchk+1
|
||||||
jsr L543218
|
jsr $3218
|
||||||
jsr fwdchk
|
jsr fwdchk
|
||||||
jsr fwdchk+1
|
jsr fwdchk+1
|
||||||
jsr L54327F
|
jsr $327f
|
||||||
nop
|
nop
|
||||||
ldx #$00
|
ldx #$00
|
||||||
jsr (backval,x)
|
jsr (backval,x)
|
||||||
@ -99,8 +99,18 @@ fwdval adr $54327d
|
|||||||
|
|
||||||
fwdchk nop
|
fwdchk nop
|
||||||
nop
|
nop
|
||||||
L54327F rts
|
rts
|
||||||
|
|
||||||
L543280 jsr skip
|
L543280 jsr skip
|
||||||
|
nop
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
ldal $544280
|
||||||
|
jsl $544280
|
||||||
|
nop
|
||||||
|
lda $4280
|
||||||
|
jsr $4280
|
||||||
|
jsr ($4280,x)
|
||||||
|
nop
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
|
@ -7,5 +7,5 @@
|
|||||||
!hex 3254af163254af7d3254af163254af7d3254ad1732ad1532ad7e32ad7c32ea20
|
!hex 3254af163254af7d3254af163254af7d3254ad1732ad1532ad7e32ad7c32ea20
|
||||||
!hex 1632201732201832207d32207e32207f32eaa200fc1932fc7a32206e32207132
|
!hex 1632201732201832207d32207e32207f32eaa200fc1932fc7a32206e32207132
|
||||||
!hex 206832206b3220743220773280187c19327c7a326c08106c0810dc0810dc0810
|
!hex 206832206b3220743220773280187c19327c7a326c08106c0810dc0810dc0810
|
||||||
!hex 7d3254eaea60200e206b
|
!hex 7d3254eaea60200e20ea4babaf80425422804254eaad8042208042fc8042ea6b
|
||||||
} ;!pseudopc
|
} ;!pseudopc
|
||||||
|
@ -60,7 +60,7 @@ bank54: cmp bank54
|
|||||||
|
|
||||||
backchk: nop
|
backchk: nop
|
||||||
nop
|
nop
|
||||||
L543218: rts
|
rts
|
||||||
|
|
||||||
backval: .faraddr backchk
|
backval: .faraddr backchk
|
||||||
|
|
||||||
@ -75,10 +75,10 @@ L54321C: lda backchk
|
|||||||
nop
|
nop
|
||||||
jsr backchk & $ffff
|
jsr backchk & $ffff
|
||||||
jsr backchk & $ffff +1
|
jsr backchk & $ffff +1
|
||||||
jsr L543218 & $ffff
|
jsr $3218
|
||||||
jsr fwdchk & $ffff
|
jsr fwdchk & $ffff
|
||||||
jsr fwdchk & $ffff +1
|
jsr fwdchk & $ffff +1
|
||||||
jsr L54327F & $ffff
|
jsr $327f
|
||||||
nop
|
nop
|
||||||
ldx #$00
|
ldx #$00
|
||||||
jsr (backval & $ffff,x)
|
jsr (backval & $ffff,x)
|
||||||
@ -107,8 +107,18 @@ fwdval: .faraddr fwdchk
|
|||||||
|
|
||||||
fwdchk: nop
|
fwdchk: nop
|
||||||
nop
|
nop
|
||||||
L54327F: rts
|
rts
|
||||||
|
|
||||||
L543280: jsr skip
|
L543280: jsr skip
|
||||||
|
nop
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
lda $544280
|
||||||
|
jsl $544280
|
||||||
|
nop
|
||||||
|
lda $4280
|
||||||
|
jsr $4280
|
||||||
|
jsr ($4280,x)
|
||||||
|
nop
|
||||||
rtl
|
rtl
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ MEMORY {
|
|||||||
# MEM001: file=%O, start=$440000, size=28;
|
# MEM001: file=%O, start=$440000, size=28;
|
||||||
# MEM002: file=%O, start=$44ffc0, size=15;
|
# MEM002: file=%O, start=$44ffc0, size=15;
|
||||||
# MEM003: file=%O, start=$2000, size=32;
|
# MEM003: file=%O, start=$2000, size=32;
|
||||||
# MEM004: file=%O, start=$543210, size=116;
|
# MEM004: file=%O, start=$543210, size=138;
|
||||||
}
|
}
|
||||||
SEGMENTS {
|
SEGMENTS {
|
||||||
CODE: load=MAIN, type=rw;
|
CODE: load=MAIN, type=rw;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user