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() +