diff --git a/pom.xml b/pom.xml
index 04b8d6ef9..3fb6b446f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -79,7 +79,7 @@
cml.kickass
kickassembler
- 5.23-65ce02.a
+ 5.24-65ce02.a
dk.camelot64.kickass.xexplugin
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar
new file mode 100644
index 000000000..dbe846697
Binary files /dev/null and b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar differ
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.md5 b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.md5
new file mode 100644
index 000000000..94a01ba47
--- /dev/null
+++ b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.md5
@@ -0,0 +1 @@
+706b9bd33b7210650444f124565e67d8
\ No newline at end of file
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.sha1 b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.sha1
new file mode 100644
index 000000000..17b4a53d1
--- /dev/null
+++ b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.jar.sha1
@@ -0,0 +1 @@
+09ec10ac3bab9d74e26fd994c703beec3d6be316
\ No newline at end of file
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom
new file mode 100644
index 000000000..ef2e85a89
--- /dev/null
+++ b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ cml.kickass
+ kickassembler
+ 5.24-65ce02.a
+ POM was created from install:install-file
+
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.md5 b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.md5
new file mode 100644
index 000000000..f726bcf05
--- /dev/null
+++ b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.md5
@@ -0,0 +1 @@
+8612884a503a28444126f04a53ec80a3
\ No newline at end of file
diff --git a/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.sha1 b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.sha1
new file mode 100644
index 000000000..54ada9f56
--- /dev/null
+++ b/repo/cml/kickass/kickassembler/5.24-65ce02.a/kickassembler-5.24-65ce02.a.pom.sha1
@@ -0,0 +1 @@
+2f37d51ae13bb589e4b464faa0f43622a6e58d16
\ No newline at end of file
diff --git a/repo/cml/kickass/kickassembler/maven-metadata.xml b/repo/cml/kickass/kickassembler/maven-metadata.xml
index 82e7bef6e..2bdd8d0f7 100644
--- a/repo/cml/kickass/kickassembler/maven-metadata.xml
+++ b/repo/cml/kickass/kickassembler/maven-metadata.xml
@@ -3,7 +3,7 @@
cml.kickass
kickassembler
- 5.23-65ce02.a
+ 5.24-65ce02.a
4.19
5.7
@@ -27,7 +27,8 @@
5.21-65ce02.a
5.22-65ce02.a
5.23-65ce02.a
+ 5.24-65ce02.a
- 20211224003322
+ 20220123234604
diff --git a/repo/cml/kickass/kickassembler/maven-metadata.xml.md5 b/repo/cml/kickass/kickassembler/maven-metadata.xml.md5
index b82a75121..5dc89afe7 100644
--- a/repo/cml/kickass/kickassembler/maven-metadata.xml.md5
+++ b/repo/cml/kickass/kickassembler/maven-metadata.xml.md5
@@ -1 +1 @@
-cf1132a6f0c566ff7881a03ace81803f
\ No newline at end of file
+e21df397cfbdfffab5bdf0710903e415
\ No newline at end of file
diff --git a/repo/cml/kickass/kickassembler/maven-metadata.xml.sha1 b/repo/cml/kickass/kickassembler/maven-metadata.xml.sha1
index c28415320..47911a051 100644
--- a/repo/cml/kickass/kickassembler/maven-metadata.xml.sha1
+++ b/repo/cml/kickass/kickassembler/maven-metadata.xml.sha1
@@ -1 +1 @@
-a5bf0ed1d73ec9e53edd76fffe9b7b5d2fe3ab65
\ No newline at end of file
+e1786fe7f339b0358623f3109c1e3aa3306c9011
\ No newline at end of file
diff --git a/src/main/antlr4/dk/camelot64/kickc/parser/KickCLexer.g4 b/src/main/antlr4/dk/camelot64/kickc/parser/KickCLexer.g4
index 6defc092d..9f89c8e51 100644
--- a/src/main/antlr4/dk/camelot64/kickc/parser/KickCLexer.g4
+++ b/src/main/antlr4/dk/camelot64/kickc/parser/KickCLexer.g4
@@ -164,7 +164,8 @@ ASM_MNEMONIC:
'rmb0'| 'rmb1'| 'rmb2'| 'rmb3'| 'rmb4'| 'rmb5'| 'rmb6'| 'rmb7'| 'smb0'| 'smb1'| 'smb2'| 'smb3'| 'smb4'| 'smb5'| 'smb6'| 'smb7'| 'stp' | 'stz' | 'trb' |
'tsb' | 'wai' | 'cle' | 'see' | 'tsy' | 'lbpl'| 'inz' | 'tys' | 'lbmi'| 'dez' | 'neg' | 'asr' | 'taz' | 'lbvc'| 'tab' | 'map' | 'rtn' | 'lbsr'| 'tza' |
'lbvs'| 'tba' | 'lbra'| 'lbcc'| 'ldz' | 'lbcs'| 'cpz' | 'dew' | 'asw' | 'lbne'| 'phz' | 'inw' | 'row' | 'lbeq'| 'phw' | 'plz' | 'eom' | 'adcq'| 'andq'|
- 'aslq'| 'asrq'| 'bitq'| 'cpq' | 'deq' | 'eorq'| 'inq' | 'ldq' | 'lsrq'| 'orq' | 'rolq'| 'rorq'| 'sbcq'| 'stq'
+ 'aslq'| 'asrq'| 'bitq'| 'cpq' | 'deq' | 'eorq'| 'inq' | 'ldq' | 'lsrq'| 'orq' | 'rolq'| 'rorq'| 'sbcq'| 'stq' | 'sxy' | 'st0' | 'st1' | 'st2' | 'say' |
+ 'tma' | 'bsr' | 'tam' | 'csl' | 'cla' | 'clx' | 'cly' | 'csh' | 'set'
;
ASM_IMM : '#' ;
diff --git a/src/main/java/dk/camelot64/cpufamily6502/cpus/CpuHuc6280.java b/src/main/java/dk/camelot64/cpufamily6502/cpus/CpuHuc6280.java
new file mode 100644
index 000000000..aec737258
--- /dev/null
+++ b/src/main/java/dk/camelot64/cpufamily6502/cpus/CpuHuc6280.java
@@ -0,0 +1,50 @@
+package dk.camelot64.cpufamily6502.cpus;
+
+import dk.camelot64.cpufamily6502.Cpu65xx;
+import dk.camelot64.cpufamily6502.CpuAddressingMode;
+
+/**
+ * The HUC6280 instruction set.
+ * https://www.chrismcovell.com/PCEdev/HuC6280_opcodes.html
+ * http://shu.emuunlim.com/download/pcedocs/pce_cpu.html
+ */
+public class CpuHuc6280 extends Cpu65xx {
+
+ /** The HUC6280 CPU name. */
+ public final static String NAME = "huc6280";
+
+ /** The HUC6280 CPU. */
+ public final static CpuHuc6280 INSTANCE = new CpuHuc6280();
+
+ public CpuHuc6280() {
+ super(NAME, Cpu65C02.INSTANCE, true);
+
+ // The following instructions are not supported yet:
+ // TST #imm, zp
+ // TST #imm, zp,x
+ // TST #imm, abs
+ // TST #imm, abs,x
+ // TII SHSL,DHDL, LHLL
+ // TIN SHSL,DHDL, LHLL
+ // TDD SHSL,DHDL, LHLL
+ // TIA SHSL,DHDL, LHLL
+ // TAI SHSL,DHDL, LHLL
+
+ addOpcode(0x02,"sxy", CpuAddressingMode.NON,3,"XY");
+ addOpcode(0x03,"st0", CpuAddressingMode.IMM,4,"");
+ addOpcode(0x13,"st1", CpuAddressingMode.IMM,4,"");
+ addOpcode(0x22,"sax", CpuAddressingMode.NON,3,"AX");
+ addOpcode(0x23,"st2", CpuAddressingMode.IMM,4,"");
+ addOpcode(0x42,"say", CpuAddressingMode.NON,3,"AY");
+ addOpcode(0x43,"tma", CpuAddressingMode.IMM,4,"A");
+ addOpcode(0x44,"bsr", CpuAddressingMode.REL,8,"PS");
+ addOpcode(0x53,"tam", CpuAddressingMode.IMM,5,"");
+ addOpcode(0x54,"csl", CpuAddressingMode.NON,2,"");
+ addOpcode(0x62,"cla", CpuAddressingMode.NON,2,"A");
+ addOpcode(0x82,"clx", CpuAddressingMode.NON,2,"X");
+ addOpcode(0xc2,"cly", CpuAddressingMode.NON,2,"Y");
+ addOpcode(0xd4,"csh", CpuAddressingMode.NON,2,"");
+ addOpcode(0xf4,"set", CpuAddressingMode.NON,2,"");
+ }
+
+}
diff --git a/src/main/java/dk/camelot64/kickc/model/TargetCpu.java b/src/main/java/dk/camelot64/kickc/model/TargetCpu.java
index 97523f96e..f235c0119 100644
--- a/src/main/java/dk/camelot64/kickc/model/TargetCpu.java
+++ b/src/main/java/dk/camelot64/kickc/model/TargetCpu.java
@@ -25,6 +25,8 @@ public enum TargetCpu {
WDC65C02("wdc65c02", CPU_65C02.name, Cpu65C02.INSTANCE, Arrays.asList(Feature.MOS6502_COMMON, Feature.WDC65C02_COMMON, Feature.WDC65C02_SPECIFIC)),
/** CSG 65CE02 CPU - Even more addressing modes and instructions, no self-modifying code. http://www.zimmers.net/anonftp/pub/cbm/documents/chipdata/65ce02.txt */
CSG65CE02("csg65ce02", CPU_65CE02.name, Cpu65CE02.INSTANCE, Arrays.asList(Feature.MOS6502_COMMON, Feature.WDC65C02_COMMON, Feature.CSG65CE02_COMMON)),
+ /** Hudson HuC6280 CPU - PC Engine CPU with more addressing modes and instructions, no self-modifying code. http://shu.emuunlim.com/download/pcedocs/pce_cpu.html */
+ HUC6280("huc6280", CPU_HUC6280.name, CpuHuc6280.INSTANCE, Arrays.asList(Feature.MOS6502_COMMON, Feature.WDC65C02_COMMON, Feature.WDC65C02_COMMON, Feature.HUC6280_SPECIFIC)),
/** 45GS02 CPU - Even more addressing modes and instructions, no self-modifying code. https://github.com/MEGA65/mega65-user-guide/blob/master/MEGA65-Book_draft.pdf */
MEGA45GS02("mega45gs02", CPU_45GS02.name, Cpu45GS02.INSTANCE, Arrays.asList(Feature.MOS6502_COMMON, Feature.WDC65C02_COMMON, Feature.CSG65CE02_COMMON, Feature.MEGA45GS02_COMMON)),
///** 65C186 CPU - 16-bit instructions, 24-bit addressing modes and more instructions. http://www.westerndesigncenter.com/wdc/documentation/w65c816s.pdf */
@@ -48,6 +50,8 @@ public enum TargetCpu {
WDC65C02_SPECIFIC("wdc65c02-specific"),
/** Added instructions of the CSG 65CE02 CPU that are also present on the descendant 45GS02. http://archive.6502.org/datasheets/mos_65ce02_mpu.pdf */
CSG65CE02_COMMON("csg65ce02-common"),
+ /** Added instructions of the HUC 6280 CPU. https://www.chrismcovell.com/PCEdev/HuC6280_opcodes.html */
+ HUC6280_SPECIFIC("huc6280-specific"),
/** Added instructions of the MEGA 45GS02 CPU. https://github.com/MEGA65/mega65-user-guide/blob/master/MEGA65-Book_draft.pdf */
MEGA45GS02_COMMON("mega45gs02-common"),
;
diff --git a/src/main/repo/mvn-repo-install-kickass.sh b/src/main/repo/mvn-repo-install-kickass.sh
index 329e9dd95..88344821f 100755
--- a/src/main/repo/mvn-repo-install-kickass.sh
+++ b/src/main/repo/mvn-repo-install-kickass.sh
@@ -4,7 +4,7 @@
cp ./repo/cml/kickass/kickassembler/maven-metadata.xml ./repo/cml/kickass/kickassembler/maven-metadata-local.xml
# mvn install:install-file -Dmaven.repo.local=./repo/ -Dfile=/Applications/KickAssembler/KickAss.jar -DgroupId=cml.kickass -DartifactId=kickassembler -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true -Dversion=5.16
-mvn install:install-file -Dmaven.repo.local=./repo/ -Dfile=/Users/jespergravgaard/c64/kickassembler65ce02/out/KickAss65CE02.jar -DgroupId=cml.kickass -DartifactId=kickassembler -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true -Dversion=5.23-65ce02.a
+mvn install:install-file -Dmaven.repo.local=./repo/ -Dfile=/Users/jespergravgaard/c64/kickassembler65ce02/out/KickAss65CE02.jar -DgroupId=cml.kickass -DartifactId=kickassembler -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true -Dversion=5.24-65ce02.a
# Finalize by making the local metadata official
pushd ./repo/cml/kickass/kickassembler
diff --git a/src/test/java/dk/camelot64/cpufamily6502/TestCpuFamilyKickAssCompatibility.java b/src/test/java/dk/camelot64/cpufamily6502/TestCpuFamilyKickAssCompatibility.java
index 91c40695b..91cdca55a 100644
--- a/src/test/java/dk/camelot64/cpufamily6502/TestCpuFamilyKickAssCompatibility.java
+++ b/src/test/java/dk/camelot64/cpufamily6502/TestCpuFamilyKickAssCompatibility.java
@@ -31,6 +31,11 @@ public class TestCpuFamilyKickAssCompatibility {
assertOpcodesMatch(Cpu65CE02.INSTANCE, CPU_65CE02.instance);
}
+ @Test
+ public void testOpcodesHuc6280() {
+ assertOpcodesMatch(CpuHuc6280.INSTANCE, CPU_HUC6280.instance);
+ }
+
@Test
public void testOpcodes45GS02() {
assertOpcodesMatch(Cpu45GS02.INSTANCE, CPU_45GS02.instance);
diff --git a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java
index 9c418818f..ab5fb7e68 100644
--- a/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java
+++ b/src/test/java/dk/camelot64/kickc/test/TestProgramsFast.java
@@ -554,6 +554,11 @@ public class TestProgramsFast extends TestPrograms {
// compileAndCompare("library-constructor-0.c");
//}
+ @Test
+ public void testCpuHuc6280() throws IOException {
+ compileAndCompare("cpu-huc6280.c");
+ }
+
@Test
public void testCpu45GS02AddressingModes() throws IOException {
compileAndCompare("cpu-45gs02-addressing-modes.c");
diff --git a/src/test/kc/cpu-huc6280.c b/src/test/kc/cpu-huc6280.c
new file mode 100644
index 000000000..9c880f017
--- /dev/null
+++ b/src/test/kc/cpu-huc6280.c
@@ -0,0 +1,27 @@
+// Tests the HUC6280 instructions
+
+#pragma cpu(huc6280)
+
+void main() {
+
+ asm {
+ sxy
+ st0 #$55
+ st1 #$aa
+ sax
+ st2 #$be
+ say
+ tma #2
+ bsr !+
+ tam #4
+ csl
+ cla
+ clx
+ cly
+ csh
+ set
+!:
+ rts
+ }
+
+}
diff --git a/src/test/ref/cpu-huc6280.asm b/src/test/ref/cpu-huc6280.asm
new file mode 100644
index 000000000..d4be5f55e
--- /dev/null
+++ b/src/test/ref/cpu-huc6280.asm
@@ -0,0 +1,32 @@
+// Tests the HUC6280 instructions
+.cpu _huc6280
+ // Commodore 64 PRG executable file
+.file [name="cpu-huc6280.prg", type="prg", segments="Program"]
+.segmentdef Program [segments="Basic, Code, Data"]
+.segmentdef Basic [start=$0801]
+.segmentdef Code [start=$80d]
+.segmentdef Data [startAfter="Code"]
+.segment Basic
+:BasicUpstart(main)
+.segment Code
+main: {
+ // asm
+ sxy
+ st0 #$55
+ st1 #$aa
+ sax
+ st2 #$be
+ say
+ tma #2
+ bsr !+
+ tam #4
+ csl
+ cla
+ clx
+ cly
+ csh
+ set
+ !:
+ rts
+ // }
+}
diff --git a/src/test/ref/cpu-huc6280.cfg b/src/test/ref/cpu-huc6280.cfg
new file mode 100644
index 000000000..bb2b4af08
--- /dev/null
+++ b/src/test/ref/cpu-huc6280.cfg
@@ -0,0 +1,8 @@
+
+void main()
+main: scope:[main] from
+ asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts }
+ to:main::@return
+main::@return: scope:[main] from main
+ [1] return
+ to:@return
diff --git a/src/test/ref/cpu-huc6280.log b/src/test/ref/cpu-huc6280.log
new file mode 100644
index 000000000..c0d14db69
--- /dev/null
+++ b/src/test/ref/cpu-huc6280.log
@@ -0,0 +1,161 @@
+
+CONTROL FLOW GRAPH SSA
+
+void main()
+main: scope:[main] from __start
+ asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts }
+ to:main::@return
+main::@return: scope:[main] from main
+ return
+ to:@return
+
+void __start()
+__start: scope:[__start] from
+ call main
+ to:__start::@1
+__start::@1: scope:[__start] from __start
+ to:__start::@return
+__start::@return: scope:[__start] from __start::@1
+ return
+ to:@return
+
+SYMBOL TABLE SSA
+void __start()
+void main()
+
+Removing unused procedure __start
+Removing unused procedure block __start
+Removing unused procedure block __start::@1
+Removing unused procedure block __start::@return
+Successful SSA optimization PassNEliminateEmptyStart
+CALL GRAPH
+
+Created 0 initial phi equivalence classes
+Coalesced down to 0 phi equivalence classes
+
+FINAL CONTROL FLOW GRAPH
+
+void main()
+main: scope:[main] from
+ asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts }
+ to:main::@return
+main::@return: scope:[main] from main
+ [1] return
+ to:@return
+
+
+VARIABLE REGISTER WEIGHTS
+void main()
+
+Initial phi equivalence classes
+Complete equivalence classes
+REGISTER UPLIFT POTENTIAL REGISTERS
+Statement asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts } always clobbers reg byte a reg byte x reg byte y
+
+REGISTER UPLIFT SCOPES
+Uplift Scope [main]
+Uplift Scope []
+
+Uplifting [main] best 65 combination
+Uplifting [] best 65 combination
+
+ASSEMBLER BEFORE OPTIMIZATION
+ // File Comments
+// Tests the HUC6280 instructions
+ // Upstart
+.cpu _huc6280
+ // Commodore 64 PRG executable file
+.file [name="cpu-huc6280.prg", type="prg", segments="Program"]
+.segmentdef Program [segments="Basic, Code, Data"]
+.segmentdef Basic [start=$0801]
+.segmentdef Code [start=$80d]
+.segmentdef Data [startAfter="Code"]
+.segment Basic
+:BasicUpstart(main)
+ // Global Constants & labels
+.segment Code
+ // main
+main: {
+ // asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts }
+ sxy
+ st0 #$55
+ st1 #$aa
+ sax
+ st2 #$be
+ say
+ tma #2
+ bsr !+
+ tam #4
+ csl
+ cla
+ clx
+ cly
+ csh
+ set
+ !:
+ rts
+ jmp __breturn
+ // main::@return
+ __breturn:
+ // [1] return
+ rts
+}
+ // File Data
+
+ASSEMBLER OPTIMIZATIONS
+Removing instruction jmp __breturn
+Succesful ASM optimization Pass5NextJumpElimination
+Removing instruction __breturn:
+Succesful ASM optimization Pass5UnusedLabelElimination
+Removing unreachable instruction rts
+Succesful ASM optimization Pass5UnreachableCodeElimination
+
+FINAL SYMBOL TABLE
+void main()
+
+
+
+FINAL ASSEMBLER
+Score: 56
+
+ // File Comments
+// Tests the HUC6280 instructions
+ // Upstart
+.cpu _huc6280
+ // Commodore 64 PRG executable file
+.file [name="cpu-huc6280.prg", type="prg", segments="Program"]
+.segmentdef Program [segments="Basic, Code, Data"]
+.segmentdef Basic [start=$0801]
+.segmentdef Code [start=$80d]
+.segmentdef Data [startAfter="Code"]
+.segment Basic
+:BasicUpstart(main)
+ // Global Constants & labels
+.segment Code
+ // main
+main: {
+ // asm
+ // asm { sxy st0#$55 st1#$aa sax st2#$be say tma#2 bsr!+ tam#4 csl cla clx cly csh set !: rts }
+ sxy
+ st0 #$55
+ st1 #$aa
+ sax
+ st2 #$be
+ say
+ tma #2
+ bsr !+
+ tam #4
+ csl
+ cla
+ clx
+ cly
+ csh
+ set
+ !:
+ rts
+ // main::@return
+ // }
+ // [1] return
+}
+ // File Data
+
diff --git a/src/test/ref/cpu-huc6280.sym b/src/test/ref/cpu-huc6280.sym
new file mode 100644
index 000000000..f7dad82f1
--- /dev/null
+++ b/src/test/ref/cpu-huc6280.sym
@@ -0,0 +1,2 @@
+void main()
+