From 43192be0d02174c8fd173ad57c3f7c7d00faf4b6 Mon Sep 17 00:00:00 2001 From: ghidorahrex Date: Fri, 16 Aug 2019 10:23:52 -0400 Subject: [PATCH] Moved HC05/HC08/HCS08 for release. --- Ghidra/Processors/HCS08/Module.manifest | 0 Ghidra/Processors/HCS08/build.gradle | 5 + .../Processors/HCS08/certification.manifest | 23 + .../HCS08/data/languages/HC05.ldefs | 16 + .../HCS08/data/languages/HC05.pspec | 60 + .../HCS08/data/languages/HC05.slaspec | 5 + .../HCS08/data/languages/HC08.ldefs | 16 + .../HCS08/data/languages/HC08.pspec | 127 + .../HCS08/data/languages/HC08.slaspec | 5 + .../HCS08/data/languages/HCS08.cspec | 50 + .../HCS08/data/languages/HCS08.ldefs | 16 + .../HCS08/data/languages/HCS08.opinion | 6 + .../HCS08/data/languages/HCS08.pspec | 244 ++ .../HCS08/data/languages/HCS08.slaspec | 5 + .../HCS08/data/languages/HCS_HC.sinc | 2043 +++++++++++++++++ Ghidra/Processors/HCS08/data/manuals/HC05.idx | 90 + Ghidra/Processors/HCS08/data/manuals/HC08.idx | 120 + .../Processors/HCS08/data/manuals/HCS08.idx | 121 + .../HCS08/data/test-vectors/HC05_tv.s | 1269 ++++++++++ .../HCS08/data/test-vectors/HC08_tv.s | 1269 ++++++++++ .../HCS08/data/test-vectors/HCS08_tv.s | 1269 ++++++++++ 21 files changed, 6759 insertions(+) create mode 100644 Ghidra/Processors/HCS08/Module.manifest create mode 100644 Ghidra/Processors/HCS08/build.gradle create mode 100644 Ghidra/Processors/HCS08/certification.manifest create mode 100644 Ghidra/Processors/HCS08/data/languages/HC05.ldefs create mode 100644 Ghidra/Processors/HCS08/data/languages/HC05.pspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HC05.slaspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HC08.ldefs create mode 100644 Ghidra/Processors/HCS08/data/languages/HC08.pspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HC08.slaspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS08.cspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS08.ldefs create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS08.opinion create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS08.pspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS08.slaspec create mode 100644 Ghidra/Processors/HCS08/data/languages/HCS_HC.sinc create mode 100644 Ghidra/Processors/HCS08/data/manuals/HC05.idx create mode 100644 Ghidra/Processors/HCS08/data/manuals/HC08.idx create mode 100644 Ghidra/Processors/HCS08/data/manuals/HCS08.idx create mode 100644 Ghidra/Processors/HCS08/data/test-vectors/HC05_tv.s create mode 100644 Ghidra/Processors/HCS08/data/test-vectors/HC08_tv.s create mode 100644 Ghidra/Processors/HCS08/data/test-vectors/HCS08_tv.s diff --git a/Ghidra/Processors/HCS08/Module.manifest b/Ghidra/Processors/HCS08/Module.manifest new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Ghidra/Processors/HCS08/build.gradle b/Ghidra/Processors/HCS08/build.gradle new file mode 100644 index 0000000000..9e5fa753c0 --- /dev/null +++ b/Ghidra/Processors/HCS08/build.gradle @@ -0,0 +1,5 @@ +apply from: "$rootProject.projectDir/gradle/distributableGhidraModule.gradle" +apply from: "$rootProject.projectDir/gradle/processorProject.gradle" +apply plugin: 'eclipse' +eclipse.project.name = 'Processors HCS08' + diff --git a/Ghidra/Processors/HCS08/certification.manifest b/Ghidra/Processors/HCS08/certification.manifest new file mode 100644 index 0000000000..b3f96b57bd --- /dev/null +++ b/Ghidra/Processors/HCS08/certification.manifest @@ -0,0 +1,23 @@ +##VERSION: 2.0 +.project||GHIDRA||||END| +Module.manifest||GHIDRA||||END| +build.gradle||GHIDRA||||END| +data/build.xml||GHIDRA||||END| +data/languages/HC05.ldefs||GHIDRA||||END| +data/languages/HC05.pspec||GHIDRA||||END| +data/languages/HC05.slaspec||GHIDRA||||END| +data/languages/HC08.ldefs||GHIDRA||||END| +data/languages/HC08.pspec||GHIDRA||||END| +data/languages/HC08.slaspec||GHIDRA||||END| +data/languages/HCS08.cspec||GHIDRA||||END| +data/languages/HCS08.ldefs||GHIDRA||||END| +data/languages/HCS08.opinion||GHIDRA||||END| +data/languages/HCS08.pspec||GHIDRA||||END| +data/languages/HCS08.slaspec||GHIDRA||||END| +data/languages/HCS_HC.sinc||GHIDRA||||END| +data/manuals/HC05.idx||GHIDRA||||END| +data/manuals/HC08.idx||GHIDRA||||END| +data/manuals/HCS08.idx||GHIDRA||||END| +data/test-vectors/HC05_tv.s||GHIDRA|exclude|||END| +data/test-vectors/HC08_tv.s||GHIDRA|exclude|||END| +data/test-vectors/HCS08_tv.s||GHIDRA|exclude|||END| diff --git a/Ghidra/Processors/HCS08/data/languages/HC05.ldefs b/Ghidra/Processors/HCS08/data/languages/HC05.ldefs new file mode 100644 index 0000000000..0f8e08d4d3 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC05.ldefs @@ -0,0 +1,16 @@ + + + + + HC05 (6805) Microcontroller Family + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HC05.pspec b/Ghidra/Processors/HCS08/data/languages/HC05.pspec new file mode 100644 index 0000000000..ffb0f57527 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC05.pspec @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HC05.slaspec b/Ghidra/Processors/HCS08/data/languages/HC05.slaspec new file mode 100644 index 0000000000..4e8a0d264b --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC05.slaspec @@ -0,0 +1,5 @@ +# sleigh specification file for Freescale HC05 (6805, 68HC05) + +@define HC05 "1" + +@include "HCS_HC.sinc" diff --git a/Ghidra/Processors/HCS08/data/languages/HC08.ldefs b/Ghidra/Processors/HCS08/data/languages/HC08.ldefs new file mode 100644 index 0000000000..42aaadb002 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC08.ldefs @@ -0,0 +1,16 @@ + + + + + HC08 Microcontroller Family + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HC08.pspec b/Ghidra/Processors/HCS08/data/languages/HC08.pspec new file mode 100644 index 0000000000..2b7d149f1c --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC08.pspec @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HC08.slaspec b/Ghidra/Processors/HCS08/data/languages/HC08.slaspec new file mode 100644 index 0000000000..81bac033d3 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HC08.slaspec @@ -0,0 +1,5 @@ +# sleigh specification file for Freescale HC08 (68HC08) + +@define HC08 "1" + +@include "HCS_HC.sinc" diff --git a/Ghidra/Processors/HCS08/data/languages/HCS08.cspec b/Ghidra/Processors/HCS08/data/languages/HCS08.cspec new file mode 100644 index 0000000000..f0c0752202 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS08.cspec @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HCS08.ldefs b/Ghidra/Processors/HCS08/data/languages/HCS08.ldefs new file mode 100644 index 0000000000..8a5f9c18c2 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS08.ldefs @@ -0,0 +1,16 @@ + + + + + HCS08 Microcontroller Family + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HCS08.opinion b/Ghidra/Processors/HCS08/data/languages/HCS08.opinion new file mode 100644 index 0000000000..8922b1277d --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS08.opinion @@ -0,0 +1,6 @@ + + + + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HCS08.pspec b/Ghidra/Processors/HCS08/data/languages/HCS08.pspec new file mode 100644 index 0000000000..75236d8005 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS08.pspec @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec b/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec new file mode 100644 index 0000000000..15030c066d --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS08.slaspec @@ -0,0 +1,5 @@ +# sleigh specification file for Freescale HCS08 (68HCS08) + +@define HCS08 "1" + +@include "HCS_HC.sinc" diff --git a/Ghidra/Processors/HCS08/data/languages/HCS_HC.sinc b/Ghidra/Processors/HCS08/data/languages/HCS_HC.sinc new file mode 100644 index 0000000000..42d5d333bd --- /dev/null +++ b/Ghidra/Processors/HCS08/data/languages/HCS_HC.sinc @@ -0,0 +1,2043 @@ +# common include file for HCS08, HC08 and HC05(6805) constructors + +define endian=big; +define alignment=1; + +define space RAM type=ram_space size=2 default; +define space register type=register_space size=1; + +@define VECTOR_SWI "0xFFFC" + +################################################################ +# Registers +################################################################ + +define register offset=0x00 size=1 [ A ]; + +@if defined(HC05) +define register offset=0x10 size=1 [ X ]; +@elif defined(HCS08) || defined(HC08) +define register offset=0x10 size=2 [ HIX ]; # H:X in the manual +define register offset=0x10 size=1 [ HI X ]; +@endif + +define register offset=0x20 size=2 [ PC SP ]; +define register offset=0x20 size=1 [ PCH PCL SPH SPL ]; + +define register offset=0x30 size=1 [ CCR ]; + +@if defined(HCS08) || defined(HC08) +@define V "CCR[7,1]" # Two's complement overflow Flag +@endif + +# "CCR[6,1]" # unused +# "CCR[5,1]" # unused +@define H "CCR[4,1]" # Half Carry Flag +@define I "CCR[3,1]" # Maskable interrupt control bit +@define N "CCR[2,1]" # Negative Flag +@define Z "CCR[1,1]" # Zero Flag +@define C "CCR[0,1]" # Carry/Borrow Flag + + + +################################################################ +# Tokens +################################################################ + +define token opbyte8 (8) + op = (0,7) + op4_7 = (4,7) + op4_6 = (4,6) + nIndex = (1,3) + op0_0 = (0,0) +; + +define token opbyte16 (16) + op16 = (0,15) +; + +define token data8 (8) + imm8 = (0,7) + simm8 = (0,7) signed + rel = (0,7) signed +; + +define token data16 (16) + imm16 = (0,15) +; + + +################################################################ +# Pseudo Instructions +################################################################ + +@if defined(HCS08) || defined(HC08) || defined(HC05) +define pcodeop readIRQ; +define pcodeop stop; +define pcodeop wait; +@endif + +@if defined(HCS08) || defined(HC08) +define pcodeop decimalAdjustAccumulator; +define pcodeop decimalAdjustCarry; +@endif + +@if defined(HCS08) +define pcodeop backgroundDebugMode; +@endif + + +################################################################ +# Addressing tables +################################################################ + +@if defined(HCS08) || defined(HC08) || defined(HC05) +opr8a_8: imm8 is imm8 { export *:1 imm8; } +opr16a_8: imm16 is imm16 { export *:1 imm16; } +iopr8i: "#"imm8 is imm8 { export *[const]:1 imm8; } +@endif + +@if defined(HCS08) || defined(HC08) +opr8a_16: imm8 is imm8 { export *:2 imm8; } +iopr8is: "#"simm8 is simm8 { export *[const]:1 simm8; } +iopr16i: "#"imm16 is imm16 { export *[const]:2 imm16; } +oprx8: imm8 is imm8 { export *[const]:1 imm8; } +oprx8_8_SP: imm8,SP is imm8 & SP { address:2 = SP + zext(imm8:1); export *:1 address; } +oprx16_8_SP: imm16,SP is imm16 & SP { address:2 = SP + imm16:2; export *:1 address; } +@endif + +@if defined(HCS08) +opr16a_16: imm16 is imm16 { export *:2 imm16; } +oprx8_16_SP: imm8,SP is imm8 & SP { address:2 = SP + zext(imm8:1); export *:2 address; } +@endif + +# X or HIX addressing + +@if defined(HC05) +oprx8_8_X: imm8,X is imm8 & X { address:1 = X + imm8:1; export *:1 address; } +comma_X: ","X is X { address:1 = X; export *:1 address; } +@endif + +@if defined(HCS08) || defined(HC08) +oprx8_8_X: imm8,X is imm8 & X { address:2 = HIX + zext(imm8:1); export *:1 address; } +oprx16_8_X: imm16,X is imm16 & X { address:2 = HIX + imm16:2; export *:1 address; } +comma_X: ","X is X { address:2 = HIX; export *:1 address; } +@endif + +@if defined(HCS08) +oprx8_16_X: imm8,X is imm8 & X { address:2 = HIX + zext(imm8:1); export *:2 address; } +oprx16_16_X: imm16,X is imm16 & X { address:2 = HIX + imm16:2; export *:2 address; } +@endif + + +# address decoding + +OP1: iopr8i is op4_6=2; iopr8i { export iopr8i; } +OP1: opr8a_8 is op4_6=3; opr8a_8 { export opr8a_8; } +OP1: opr16a_8 is op4_6=4; opr16a_8 { export opr16a_8; } + +@if defined(HCS08) || defined(HC08) +OP1: oprx16_8_X is op4_6=5; oprx16_8_X { export oprx16_8_X; } +@endif + +OP1: oprx8_8_X is op4_6=6; oprx8_8_X { export oprx8_8_X; } +OP1: comma_X is op4_6=7 & comma_X { export comma_X; } + +@if defined(HCS08) || defined(HC08) +op2_opr8a: opr8a_8 is opr8a_8 { export opr8a_8; } +@endif + + +ADDR: opr8a_8 is op4_6=3; opr8a_8 { export opr8a_8; } +ADDR: opr16a_8 is op4_6=4; opr16a_8 { export opr16a_8; } + +@if defined(HCS08) || defined(HC08) +ADDRI: oprx16_8_X is op4_6=5; oprx16_8_X { export oprx16_8_X; } +@endif + +ADDRI: oprx8_8_X is op4_6=6; oprx8_8_X { export oprx8_8_X; } +ADDRI: comma_X is op4_6=7 & comma_X { export comma_X; } + +REL: reloc is rel [ reloc = inst_next + rel; ] { export *:1 reloc; } + +NthBit: nthbit is nIndex [ nthbit = (1 << nIndex); ] { export *[const]:1 nthbit; } + + +################################################################ +# Macros +################################################################ + +@if defined(HCS08) || defined(HC08) +macro addition_flags(operand, result) { + complement_result:1 = ~result; + + $(V) = ( ((A & operand & complement_result) | (~A & ~operand & result)) & 0b10000000 ) != 0; + carries:1 = (A & operand) | (operand & complement_result) | (complement_result & A); + $(H) = ( carries & 0b00001000 ) != 0; + $(N) = (result s< 0); + $(Z) = (result == 0); + $(C) = ( carries & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro addition_flags(operand, result) { + complement_result:1 = ~result; + + # V is not implemented in HC05 + carries:1 = (A & operand) | (operand & complement_result) | (complement_result & A); + $(H) = ( carries & 0b00001000 ) != 0; + $(N) = (result s< 0); + $(Z) = (result == 0); + $(C) = ( carries & 0b10000000 ) != 0; +} +@endif + +@if defined(HCS08) || defined(HC08) +macro subtraction_flags(operand, result) { + complement_A:1 = ~A; + + $(V) = ( ((A & ~operand & ~result) | (complement_A & operand & result)) & 0b10000000 ) != 0; + $(N) = (result s< 0); + $(Z) = (result == 0); + $(C) = ( ((complement_A & operand) | (operand & result) | (result & complement_A)) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro subtraction_flags(operand, result) { + complement_A:1 = ~A; + + # V is not implemented in HC05 + $(N) = (result s< 0); + $(Z) = (result == 0); + $(C) = ( ((complement_A & operand) | (operand & result) | (result & complement_A)) & 0b10000000 ) != 0; +} +@endif + +@if defined(HCS08) || defined(HC08) +macro V_equals_0() { + $(V) = 0; +} +@elif defined(HC05) +macro V_equals_0() {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_equals_C() { + $(V) = $(C); +} +@elif defined(HC05) +macro V_equals_C() {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_equals_N_xor_C() { + $(V) = $(N) ^ $(C); +} +@elif defined(HC05) +macro V_equals_N_xor_C() {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_CMP_flag(operand, result) { + $(V) = ( ((A & ~operand & ~result) | (~A & operand & result)) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro V_CMP_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_CPHX_flag(operand, result) { + $(V) = ( ((HIX & ~operand & ~result) | (~HIX & operand & result)) & 0x8000 ) != 0; +} +@elif defined(HC05) +macro V_CPHX_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_CPX_flag(operand, result) { + $(V) = ( ((X & ~operand & ~result) | (~X & operand & result)) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro V_CPX_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_DEC_flag(operand, result) { + $(V) = ( (~result & operand) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro V_DEC_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_INC_flag(operand, result) { + $(V) = ( (~operand & result) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro V_INC_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) +macro V_NEG_flag(operand, result) { + $(V) = ( (operand & result) & 0b10000000 ) != 0; +} +@elif defined(HC05) +macro V_NEG_flag(operand, result) {} # empty macro because V is not implemented in HC05 +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +macro Pull1(operand) { + SP = SP + 1; + operand = *:1 SP; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +macro Pull2(operand) { + SP = SP + 1; + operand = *:2 SP; + SP = SP + 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +macro Push1(operand) { + *:1 SP = operand; + SP = SP - 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +macro Push2(operand) { + SP = SP - 1; + *:2 SP = operand; + SP = SP - 1; +} +@endif + +################################################################ +# Constructors +################################################################ + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ADC OP1 is (op=0xA9 | op=0xB9 | op=0xC9 | op=0xD9 | op=0xE9 | op=0xF9) ... & OP1 +{ + op1:1 = OP1; + + result:1 = A + op1 + $(C); + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:ADC oprx16_8_SP is (op16=0x9ED9); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + + result:1 = A + op1 + $(C); + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:ADC oprx8_8_SP is (op16=0x9EE9); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + + result:1 = A + op1 + $(C); + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ADD OP1 is (op=0xAB | op=0xBB | op=0xCB | op=0xDB | op=0xEB | op=0xFB) ... & OP1 +{ + op1:1 = OP1; + + result:1 = A + op1; + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:ADD oprx16_8_SP is (op16=0x9EDB); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + + result:1 = A + op1; + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:ADD oprx8_8_SP is (op16=0x9EEB); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + + result:1 = A + op1; + addition_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:AIS iopr8is is op=0xA7; iopr8is +{ + SP = SP + sext(iopr8is); +} +@endif + +@if defined(HCS08) || defined(HC08) +:AIX iopr8is is op=0xAF; iopr8is +{ + HIX = HIX + sext(iopr8is); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:AND OP1 is (op=0xA4 | op=0xB4 | op=0xC4 | op=0xD4 | op=0xE4 | op=0xF4) ... & OP1 +{ + A = A & OP1; + V_equals_0(); + $(Z) = (A == 0); + $(N) = (A s< 0); +} +@endif + +@if defined(HCS08) || defined(HC08) +:AND oprx16_8_SP is (op16=0x9ED4); oprx16_8_SP +{ + A = A & oprx16_8_SP; + V_equals_0(); + $(Z) = (A == 0); + $(N) = (A s< 0); +} +@endif + +@if defined(HCS08) || defined(HC08) +:AND oprx8_8_SP is (op16=0x9EE4); oprx8_8_SP +{ + A = A & oprx8_8_SP; + V_equals_0(); + $(Z) = (A == 0); + $(N) = (A s< 0); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASLA is op=0x48 +{ + $(C) = A >> 7; + A = A << 1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASLX is op=0x58 +{ + $(C) = X >> 7; + X = X << 1; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 +{ + tmp:1 = OP1; + $(C) = tmp >> 7; + tmp = tmp << 1; + OP1 = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ASL oprx8_8_SP is (op16=0x9E68); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + $(C) = tmp >> 7; + tmp = tmp << 1; + oprx8_8_SP = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASRA is op=0x47 +{ + $(C) = A & 1; + A = A s>> 1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASRX is op=0x57 +{ + $(C) = X & 1; + X = X s>> 1; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ASR OP1 is (op=0x37 | op=0x67 | op=0x77) ... & OP1 +{ + tmp:1 = OP1; + $(C) = tmp & 1; + tmp = tmp s>> 1; + OP1 = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ASR oprx8_8_SP is (op16=0x9E67); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + $(C) = tmp & 1; + tmp = tmp s>> 1; + oprx8_8_SP = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BCC REL is op=0x24; REL +{ + if ($(C) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BCLR nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=1; opr8a_8 +{ + opr8a_8 = opr8a_8 & ~NthBit; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BCS REL is op=0x25; REL +{ + if ($(C) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BEQ REL is op=0x27; REL +{ + if ($(Z) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:BGE REL is op=0x90; REL +{ + if (($(N) ^ $(V)) == 1) goto REL; +} +@endif + +@if defined(HCS08) +:BGND is op=0x82 +{ + backgroundDebugMode(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:BGT REL is op=0x92; REL +{ + if (($(Z) | ($(N) ^ $(V))) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BHCC REL is op=0x28; REL +{ + if ($(H) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BHCS REL is op=0x29; REL +{ + if ($(H) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BHI REL is op=0x22; REL +{ + if (($(C) | $(Z)) == 0) goto REL; +} +@endif + +#:BHS REL is op=0x24; REL See BCC + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BIH REL is op=0x2F; REL +{ + tmp:1 = readIRQ(); + if (tmp == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BIL REL is op=0x2E; REL +{ + tmp:1 = readIRQ(); + if (tmp == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BIT OP1 is (op=0xA5 | op=0xB5 | op=0xC5 | op=0xD5 | op=0xE5 | op=0xF5) ... & OP1 +{ + result:1 = A & OP1; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:BIT oprx16_8_SP is (op16=0x9ED5); oprx16_8_SP +{ + result:1 = A & oprx16_8_SP; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:BIT oprx8_8_SP is (op16=0x9EE5); oprx8_8_SP +{ + result:1 = A & oprx8_8_SP; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:BLE REL is op=0x93; REL +{ + if ($(Z) | ($(N) ^ $(V))) goto REL; +} +@endif + +#:BLO REL is op=0x25; REL see BCS + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BLS REL is op=0x23; REL +{ + if (($(C) | $(Z)) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:BLT REL is op=0x91; REL +{ + if (($(N) ^ $(V)) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BMC REL is op=0x2C; REL +{ + if ($(I) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BMI REL is op=0x2B; REL +{ + if ($(N) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BMS REL is op=0x2D; REL +{ + if ($(I) == 1) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BNE REL is op=0x26; REL +{ + if ($(Z) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BPL REL is op=0x2A; REL +{ + if ($(N) == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BRA REL is op=0x20; REL +{ + goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BRCLR nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=1; opr8a_8; REL +{ + result:1 = opr8a_8 & NthBit; + $(C) = (result != 0); + if (result == 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +# branch never is a two-byte nop +:BRN REL is op=0x21; REL +{ +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BRSET nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=0; opr8a_8; REL +{ + result:1 = opr8a_8 & NthBit; + $(C) = (result != 0); + if (result != 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BSET nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=0; opr8a_8 +{ + opr8a_8 = opr8a_8 | NthBit; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:BSR REL is op=0xAD; REL +{ + tmp:2 = inst_next; + Push2( tmp ); + + call REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQ opr8a_8, REL is (op=0x31); opr8a_8; REL +{ + if (A == opr8a_8) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQA iopr8i, REL is op=0x41; iopr8i; REL +{ + if (A == iopr8i) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQX iopr8i, REL is op=0x51; iopr8i; REL +{ + if (X == iopr8i) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQ oprx8, X"+,", REL is (op=0x61) & X; oprx8; REL +{ + tmp:1 = *:1 (HIX + zext(oprx8)); + HIX = HIX + 1; + + if (A == tmp) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQ ","X"+,", REL is (op=0x71) & X; REL +{ + tmp:1 = *:1 (HIX); + HIX = HIX + 1; + + if (A == tmp) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:CBEQ oprx8_8_SP, REL is (op16=0x9E61); oprx8_8_SP; REL +{ + if (A == oprx8_8_SP) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CLC is op=0x98 +{ + $(C) = 0; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CLI is op=0x9A +{ + $(I) = 0; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CLRA is op=0x4F +{ + A = 0; + $(Z) = 1; + $(N) = 0; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CLRX is op=0x5F +{ + X = 0; + $(Z) = 1; + $(N) = 0; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CLRH is op=0x8C +{ + HI = 0; + $(Z) = 1; + $(N) = 0; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CLR OP1 is (op=0x3F | op=0x6F | op=0x7F) ... & OP1 +{ + OP1 = 0; + $(Z) = 1; + $(N) = 0; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CLR oprx8_8_SP is (op16=0x9E6F); oprx8_8_SP +{ + oprx8_8_SP = 0; + $(Z) = 1; + $(N) = 0; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CMP OP1 is (op=0xA1 | op=0xB1 | op=0xC1 | op=0xD1 | op=0xE1 | op=0xF1) ... & OP1 +{ + op1:1 = OP1; + tmp:1 = A - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > A); + V_CMP_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CMP oprx16_8_SP is (op16=0x9ED1); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + tmp:1 = A - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > A); + V_CMP_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CMP oprx8_8_SP is (op16=0x9EE1); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + tmp:1 = A - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > A); + V_CMP_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:COMA is op=0x43 +{ + A = ~A; + $(Z) = (A == 0); + $(N) = (A s< 0); + $(C) = 1; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:COMX is op=0x53 +{ + X = ~X; + $(Z) = (X == 0); + $(N) = (X s< 0); + $(C) = 1; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:COM OP1 is (op=0x33 | op=0x63 | op=0x73) ... & OP1 +{ + tmp:1 = ~OP1; + OP1 = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = 1; + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:COM oprx8_8_SP is (op16=0x9E63); oprx8_8_SP +{ + tmp:1 = ~oprx8_8_SP; + oprx8_8_SP = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = 1; + V_equals_0(); +} +@endif + +@if defined(HCS08) +:CPHX opr16a_16 is (op=0x3E); opr16a_16 +{ + op1:2 = opr16a_16; + tmp:2 = HIX - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > HIX); + V_CPHX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CPHX iopr16i is (op=0x65); iopr16i +{ + op1:2 = iopr16i; + tmp:2 = HIX - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > HIX); + V_CPHX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CPHX opr8a_16 is (op=0x75); opr8a_16 +{ + op1:2 = *:2 opr8a_16; + tmp:2 = HIX - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > HIX); + V_CPHX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) +:CPHX oprx8_16_SP is (op16=0x9EF3); oprx8_16_SP +{ + op1:2 = oprx8_16_SP; + tmp:2 = HIX - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > HIX); + V_CPHX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:CPX OP1 is (op=0xA3 | op=0xB3 | op=0xC3 | op=0xD3 | op=0xE3 | op=0xF3) ... & OP1 +{ + op1:1 = OP1; + tmp:1 = X - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > X); + V_CPX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CPX oprx16_8_SP is (op16=0x9ED3); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + tmp:1 = X - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > X); + V_CPX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:CPX oprx8_8_SP is (op16=0x9EE3); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + tmp:1 = X - op1; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + $(C) = (op1 > X); + V_CPX_flag(op1, tmp); +} +@endif + +@if defined(HCS08) || defined(HC08) +:DAA is op=0x72 +{ + A = decimalAdjustAccumulator(A, $(C), $(H)); + $(C) = decimalAdjustCarry(A, $(C), $(H)); + $(Z) = (A == 0); + $(N) = (A s< 0); + # V is undefined +} +@endif + +@if defined(HCS08) || defined(HC08) +:DBNZA REL is op=0x4B; REL +{ + A = A - 1; + if (A != 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:DBNZX REL is op=0x5B; REL +{ + X = X - 1; + if (X != 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:DBNZ OP1, REL is (op=0x3B | op=0x6B | op=0x7B) ... & OP1; REL +{ + OP1 = OP1 - 1; + if (OP1 != 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) +:DBNZ oprx8_8_SP, REL is (op16=0x9E6B); oprx8_8_SP; REL +{ + tmp:1 = oprx8_8_SP - 1; + oprx8_8_SP = tmp; + if (tmp != 0) goto REL; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:DECA is op=0x4A +{ + tmp:1 = A; + A = tmp - 1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_DEC_flag(tmp, A); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:DECX is op=0x5A +{ + tmp:1 = X; + X = tmp - 1; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_DEC_flag(tmp, X); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:DEC OP1 is (op=0x3A | op=0x6A | op=0x7A) ... & OP1 +{ + tmp:1 = OP1; + result:1 = tmp - 1; + OP1 = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_DEC_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) +:DEC oprx8_8_SP is (op16=0x9E6A); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + result:1 = tmp - 1; + oprx8_8_SP = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_DEC_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) +:DIV is op=0x52 +{ + tmp:2 = (zext(HI) << 8) | (zext(A)); + resultQ:2 = tmp / zext(X); + A = resultQ:1; + resultR:2 = tmp % zext(X); + HI = resultR:1; + $(Z) = (A == 0); + $(C) = (X == 0) | (resultQ > 0x00FF); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:EOR OP1 is (op=0xA8 | op=0xB8 | op=0xC8 | op=0xD8 | op=0xE8 | op=0xF8) ... & OP1 +{ + op1:1 = OP1; + A = A ^ op1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:EOR oprx16_8_SP is (op16=0x9ED8); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + A = A ^ op1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:EOR oprx8_8_SP is (op16=0x9EE8); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + A = A ^ op1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:INCA is op=0x4C +{ + tmp:1 = A; + A = tmp + 1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_INC_flag(tmp, A); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:INCX is op=0x5C +{ + tmp:1 = X; + X = tmp + 1; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_INC_flag(tmp, X); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:INC OP1 is (op=0x3C | op=0x6C | op=0x7C) ... & OP1 +{ + tmp:1 = OP1; + result:1 = tmp + 1; + OP1 = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_INC_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) +:INC oprx8_8_SP is (op16=0x9E6C); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + result:1 = tmp + 1; + oprx8_8_SP = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_INC_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:JMP ADDR is (op=0xBC | op=0xCC) ... & ADDR +{ + goto ADDR; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:JMP ADDRI is (op=0xDC | op=0xEC | op=0xFC) ... & ADDRI +{ + goto [ADDRI]; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:JSR ADDR is (op=0xBD | op=0xCD) ... & ADDR +{ + tmp:2 = inst_next; + Push2( tmp ); + + call ADDR; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:JSR ADDRI is (op=0xDD | op=0xED | op=0xFD) ... & ADDRI +{ + tmp:2 = inst_next; + Push2( tmp ); + + call [ADDRI]; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:LDA OP1 is (op=0xA6 | op=0xB6 | op=0xC6 | op=0xD6 | op=0xE6 | op=0xF6) ... & OP1 +{ + A = OP1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDA oprx16_8_SP is (op16=0x9ED6); oprx16_8_SP +{ + A = oprx16_8_SP; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDA oprx8_8_SP is (op16=0x9EE6); oprx8_8_SP +{ + A = oprx8_8_SP; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDHX iopr16i is (op=0x45); iopr16i +{ + HIX = iopr16i; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDHX opr8a_16 is (op=0x55); opr8a_16 +{ + HIX = opr8a_16; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:LDHX opr16a_16 is (op=0x32); opr16a_16 +{ + HIX = opr16a_16; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:LDHX ","X is (op16=0x9EAE) & X +{ + HIX = *:2 (HIX); + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:LDHX oprx16_16_X is (op16=0x9EBE); oprx16_16_X +{ + HIX = oprx16_16_X; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:LDHX oprx8_16_X is (op16=0x9ECE); oprx8_16_X +{ + HIX = oprx8_16_X; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:LDHX oprx8_16_SP is (op16=0x9EFE); oprx8_16_SP +{ + HIX = oprx8_16_SP; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:LDX OP1 is (op=0xAE | op=0xBE | op=0xCE | op=0xDE | op=0xEE | op=0xFE) ... & OP1 +{ + X = OP1; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDX oprx16_8_SP is (op16=0x9EDE); oprx16_8_SP +{ + X = oprx16_8_SP; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LDX oprx8_8_SP is (op16=0x9EEE); oprx8_8_SP +{ + X = oprx8_8_SP; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +## Logical Shift left is same as arithmetic shift left +#:LSLA is op=0x48 +#:LSLX is op=0x58 +#:LSL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:LSRA is op=0x44 +{ + $(C) = (A & 1); + A = (A >> 1); + $(Z) = (A == 0); + $(N) = 0; + V_equals_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:LSRX is op=0x54 +{ + $(C) = (X & 1); + X = (X >> 1); + $(Z) = (X == 0); + $(N) = 0; + V_equals_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:LSR OP1 is (op=0x34 | op=0x64 | op=0x74) ... & OP1 +{ + tmp:1 = OP1; + $(C) = tmp & 1; + tmp = tmp >> 1; + OP1 = tmp; + $(Z) = (tmp == 0); + $(N) = 0; + V_equals_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:LSR oprx8_8_SP is (op16=0x9E64); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + $(C) = tmp & 1; + tmp = tmp >> 1; + oprx8_8_SP = tmp; + $(Z) = (tmp == 0); + $(N) = 0; + V_equals_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:MOV opr8a_8, op2_opr8a is (op=0x4E); opr8a_8; op2_opr8a +{ + result:1 = opr8a_8; + op2_opr8a = result; + V_equals_0(); + $(N) = (result s< 0); + $(Z) = (result == 0); +} +@endif + +@if defined(HCS08) || defined(HC08) +:MOV opr8a_8, X"+" is (op=0x5E); opr8a_8 & X +{ + result:1 = opr8a_8; + *:1 HIX = result; + HIX = HIX + 1; + V_equals_0(); + $(N) = (result s< 0); + $(Z) = (result == 0); +} +@endif + +@if defined(HCS08) || defined(HC08) +:MOV iopr8i, op2_opr8a is (op=0x6E); iopr8i; op2_opr8a +{ + result:1 = iopr8i; + op2_opr8a = result; + V_equals_0(); + $(N) = (result s< 0); + $(Z) = (result == 0); +} +@endif + +@if defined(HCS08) || defined(HC08) +:MOV ","X"+," op2_opr8a is (op=0x7E) & X; op2_opr8a +{ + result:1 = *:1 HIX; + op2_opr8a = result; + HIX = HIX + 1; + V_equals_0(); + $(N) = (result s< 0); + $(Z) = (result == 0); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:MUL is op=0x42 +{ + op1:2 = zext(A); + op2:2 = zext(X); + result:2 = op1 * op2; + A = result:1; + X = result(1); + $(H) = 0; + $(C) = 0; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:NEGA is op=0x40 +{ + tmp:1 = A; + A = -tmp; + $(C) = (A != 0); + $(Z) = (A == 0); + $(N) = (A s< 0); + V_NEG_flag(tmp, A); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:NEGX is op=0x50 +{ + tmp:1 = X; + X = -tmp; + $(C) = (X != 0); + $(Z) = (X == 0); + $(N) = (X s< 0); + V_NEG_flag(tmp, X); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:NEG OP1 is (op=0x30 | op=0x60 | op=0x70) ... & OP1 +{ + tmp:1 = OP1; + result:1 = -tmp; + OP1 = result; + $(C) = (result != 0); + $(Z) = (result == 0); + $(N) = (result s< 0); + V_NEG_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) +:NEG oprx8_8_SP is (op16=0x9E60); oprx8_8_SP +{ + tmp:1 = oprx8_8_SP; + result:1 = -tmp; + oprx8_8_SP = result; + $(C) = (result != 0); + $(Z) = (result == 0); + $(N) = (result s< 0); + V_NEG_flag(tmp, result); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:NOP is op = 0x9D +{ +} +@endif + +@if defined(HCS08) || defined(HC08) +:NSA is op = 0x62 +{ + A = (A >> 4) | (A << 4); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ORA OP1 is (op=0xAA | op=0xBA | op=0xCA | op=0xDA | op=0xEA | op=0xFA) ... & OP1 +{ + A = A | OP1; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ORA oprx16_8_SP is (op16=0x9EDA); oprx16_8_SP +{ + A = A | oprx16_8_SP; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ORA oprx8_8_SP is (op16=0x9EEA); oprx8_8_SP +{ + A = A | oprx8_8_SP; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PSHA is op = 0x87 +{ + Push1( A ); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PSHH is op = 0x8B +{ + Push1( HI ); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PSHX is op = 0x89 +{ + Push1( X ); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PULA is op = 0x86 +{ + Pull1( A ); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PULH is op = 0x8A +{ + Pull1( HI ); +} +@endif + +@if defined(HCS08) || defined(HC08) +:PULX is op = 0x88 +{ + Pull1( X ); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ROLA is op=0x49 +{ + tmpC:1 = $(C) ; + $(C) = A >> 7; + A = (A << 1) | tmpC; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ROLX is op=0x59 +{ + tmpC:1 = $(C); + $(C) = X >> 7; + X = (X << 1) | tmpC; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ROL OP1 is (op=0x39 | op=0x69 | op=0x79) ... & OP1 +{ + tmpC:1 = $(C); + op1:1 = OP1; + $(C) = op1 >> 7; + result:1 = (op1 << 1) | tmpC; + OP1 = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ROL oprx8_8_SP is (op16=0x9E69); oprx8_8_SP +{ + tmpC:1 = $(C); + op1:1 = oprx8_8_SP; + $(C) = op1 >> 7; + result:1 = (op1 << 1) | tmpC; + oprx8_8_SP = result; + $(Z) = (result == 0); + $(N) = (result s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:RORA is op=0x46 +{ + tmpC:1 = $(C) << 7; + $(C) = A & 1; + A = (A >> 1) | tmpC; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:RORX is op=0x56 +{ + tmpC:1 = $(C) << 7; + $(C) = X & 1; + X = (X >> 1) | tmpC; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:ROR OP1 is (op=0x36 | op=0x66 | op=0x76) ... & OP1 +{ + tmpC:1 = $(C) << 7; + tmp:1 = OP1; + $(C) = tmp & 1; + tmp = (tmp >> 1) | tmpC; + OP1 = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:ROR oprx8_8_SP is (op16=0x9E66); oprx8_8_SP +{ + tmpC:1 = $(C) << 7; + tmp:1 = oprx8_8_SP; + $(C) = tmp & 1; + tmp = (tmp >> 1) | tmpC; + oprx8_8_SP = tmp; + $(Z) = (tmp == 0); + $(N) = (tmp s< 0); + V_equals_N_xor_C(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:RSP is op = 0x9C +{ + SPL = 0xff; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:RTI is op = 0x80 +{ + Pull1( CCR ); + + Pull1( A ); + + Pull1( X ); + + tmp:2 = 0; + Pull2( tmp ); + + return [tmp]; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:RTS is op = 0x81 +{ + tmp:2 = 0; + Pull2( tmp ); + + return [tmp]; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:SBC OP1 is (op=0xA2 | op=0xB2 | op=0xC2 | op=0xD2 | op=0xE2 | op=0xF2) ... & OP1 +{ + op1:1 = OP1; + + result:1 = A - op1 - $(C); + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:SBC oprx16_8_SP is (op16=0x9ED2); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + + result:1 = A - op1 - $(C); + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:SBC oprx8_8_SP is (op16=0x9EE2); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + + result:1 = A - op1 - $(C); + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:SEC is op = 0x99 +{ + $(C) = 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:SEI is op = 0x9B +{ + $(I) = 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:STA OP1 is (op=0xB7 | op=0xC7 | op=0xD7 | op=0xE7 | op=0xF7) ... & OP1 +{ + OP1 = A; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:STA oprx16_8_SP is (op16=0x9ED7); oprx16_8_SP +{ + oprx16_8_SP = A; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:STA oprx8_8_SP is (op16=0x9EE7); oprx8_8_SP +{ + oprx8_8_SP = A; + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:STHX opr8a_16 is (op=0x35); opr8a_16 +{ + opr8a_16 = HIX; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:STHX opr16a_16 is (op=0x96); opr16a_16 +{ + opr16a_16 = HIX; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) +:STHX oprx8_16_SP is (op16=0x9EFF); oprx8_16_SP +{ + oprx8_16_SP = HIX; + $(Z) = (HIX == 0); + $(N) = (HI s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:STOP is op=0x8E +{ + $(I) = 0; + stop(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:STX OP1 is (op=0xBF | op=0xCF | op=0xDF | op=0xEF | op=0xFF) ... & OP1 +{ + OP1 = X; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:STX oprx16_8_SP is (op16=0x9EDF); oprx16_8_SP +{ + oprx16_8_SP = X; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:STX oprx8_8_SP is (op16=0x9EEF); oprx8_8_SP +{ + oprx8_8_SP = X; + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:SUB OP1 is (op=0xA0 | op=0xB0 | op=0xC0 | op=0xD0 | op=0xE0 | op=0xF0) ... & OP1 +{ + op1:1 = OP1; + + result:1 = A - op1; + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:SUB oprx16_8_SP is (op16=0x9ED0); oprx16_8_SP +{ + op1:1 = oprx16_8_SP; + + result:1 = A - op1; + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) +:SUB oprx8_8_SP is (op16=0x9EE0); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + + result:1 = A - op1; + subtraction_flags(op1, result); + A = result; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:SWI is op=0x83 +{ + tmp:2 = inst_next; + Push2( tmp ); + + Push1( X ); + + Push1( A ); + + Push1( CCR ); + + $(I) = 1; + + addr:2 = $(VECTOR_SWI); + call [addr]; +} +@endif + +@if defined(HCS08) || defined(HC08) +:TAP is op=0x84 +{ + CCR = A; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:TAX is op=0x97 +{ + X = A; +} +@endif + +@if defined(HCS08) || defined(HC08) +:TPA is op=0x85 +{ + A = CCR; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:TSTA is op=0x4D +{ + $(Z) = (A == 0); + $(N) = (A s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:TSTX is op=0x5D +{ + $(Z) = (X == 0); + $(N) = (X s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:TST OP1 is (op=0x3D | op=0x6D | op=0x7D) ... & OP1 +{ + op1:1 = OP1; + $(Z) = (op1 == 0); + $(N) = (op1 s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:TST oprx8_8_SP is (op16=0x9E6D); oprx8_8_SP +{ + op1:1 = oprx8_8_SP; + $(Z) = (op1 == 0); + $(N) = (op1 s< 0); + V_equals_0(); +} +@endif + +@if defined(HCS08) || defined(HC08) +:TSX is op=0x95 +{ + HIX = SP + 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:TXA is op=0x9F +{ + A = X; +} +@endif + +@if defined(HCS08) || defined(HC08) +:TXS is op=0x94 +{ + SP = HIX - 1; +} +@endif + +@if defined(HCS08) || defined(HC08) || defined(HC05) +:WAIT is op=0x8f +{ + $(I) = 0; + wait(); +} +@endif + diff --git a/Ghidra/Processors/HCS08/data/manuals/HC05.idx b/Ghidra/Processors/HCS08/data/manuals/HC05.idx new file mode 100644 index 0000000000..df2fe2f91e --- /dev/null +++ b/Ghidra/Processors/HCS08/data/manuals/HC05.idx @@ -0,0 +1,90 @@ +@M68HC05TB.pdf[ Rev. 2.0 1998 M68HC05 Family, Understanding Small Microcontrollers, NXP.com ] +ADC, 222 +ADD, 223 +AND, 224 +ASL, 225 +ASLA, 225 +ASLX, 225 +ASR, 226 +ASRA, 226 +ASRX, 226 +BCC, 227 +BCLR, 228 +BCS, 229 +BEQ, 230 +BHCC, 231 +BHCS, 232 +BHI, 233 +BHS, 234 +BIH, 235 +BIL, 236 +BIT, 237 +BLO, 238 +BLS, 239 +BMC, 240 +BMI, 241 +BMS, 242 +BNE, 243 +BPL, 244 +BRA, 245 +BRCLR, 246 +BRN, 247 +BRSET, 248 +BSET, 249 +BSR, 250 +CLC, 251 +CLI, 252 +CLR, 253 +CLRA, 253 +CLRX, 253 +CMP, 254 +COM, 255 +COMA, 255 +COMX, 255 +CPX, 256 +DEC, 257 +DECA, 257 +DECX, 257 +EOR, 258 +INC, 259 +INCA, 259 +INCX, 259 +JMP, 260 +JSR, 261 +LDA, 262 +LDX, 263 +LSL, 264 +LSLA, 264 +LSLX, 264 +LSR, 265 +LSRA, 265 +LSRX, 265 +MUL, 266 +NEG, 267 +NEGA, 267 +NEGX, 267 +NOP, 268 +ORA, 269 +ROL, 270 +ROLA, 270 +ROLX, 270 +ROR, 271 +RORA, 271 +RORX, 271 +RSP, 272 +RTI, 273 +RTS, 274 +SBC, 275 +SEC, 276 +SEI, 277 +STA, 278 +STOP, 279 +STX, 280 +SUB, 281 +SWI, 282 +TAX, 283 +TST, 284 +TSTA, 284 +TSTX, 284 +TXA, 285 +WAIT, 286 diff --git a/Ghidra/Processors/HCS08/data/manuals/HC08.idx b/Ghidra/Processors/HCS08/data/manuals/HC08.idx new file mode 100644 index 0000000000..afd2bc10a1 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/manuals/HC08.idx @@ -0,0 +1,120 @@ +@CPU08RM.pdf[ Rev. 4 02/2006 M68HC08 Microcontrollers, NXP.com ] +ADC, 63 +ADD, 64 +AIS, 65 +AIX, 66 +AND, 67 +ASL, 68 +ASLA, 68 +ASLX, 68 +ASR, 69 +ASRA, 69 +ASRX, 69 +BCC, 70 +BCLR, 71 +BCS, 72 +BEQ, 73 +BGE, 74 +BGT, 75 +BHCC, 76 +BHCS, 77 +BHI, 78 +BHS, 79 +BIH, 80 +BIL, 81 +BIT, 82 +BLE, 83 +BLO, 84 +BLS, 85 +BLT, 86 +BMC, 87 +BMI, 88 +BMS, 89 +BNE, 90 +BPL, 91 +BRA, 92 +BRCLR, 94 +BRN, 95 +BRSET, 96 +BSET, 97 +BSR, 98 +CBEQ, 99 +CBEQA, 99 +CBEQX, 99 +CLC, 100 +CLI, 101 +CLR, 102 +CLRA, 102 +CLRX, 102 +CLRH, 102 +CMP, 103 +COM, 104 +COMA, 104 +COMX, 104 +CPHX, 105 +CPX, 106 +DAA, 107 +DBNZ, 109 +DBNZA, 109 +DBNZX, 109 +DEC, 110 +DECA, 110 +DECX, 110 +DIV, 111 +EOR, 112 +INC, 113 +INCA, 113 +INCX, 113 +JMP, 114 +JSR, 115 +LDA, 116 +LDHX, 117 +LDX, 118 +LSL, 119 +LSLA, 119 +LSLX, 119 +LSR, 120 +LSRA, 120 +LSRX, 120 +MOV, 121 +MUL, 122 +NEG, 123 +NEGA, 123 +NEGX, 123 +NOP, 124 +NSA, 125 +ORA, 126 +PSHA, 127 +PSHH, 128 +PSHX, 129 +PULA, 130 +PULH, 131 +PULX, 132 +ROL, 133 +ROLA, 133 +ROLX, 133 +ROR, 134 +RORA, 134 +RORX, 134 +RSP, 135 +RTI, 136 +RTS, 137 +SBC, 138 +SEC, 139 +SEI, 140 +STA, 141 +STHX, 142 +STOP, 143 +STX, 144 +SUB, 145 +SWI, 146 +TAP, 147 +TAX, 148 +TPA, 149 +TST, 150 +TSTA, 150 +TSTX, 150 +TSX, 151 +TXA, 152 +TXS, 153 +WAIT, 154 diff --git a/Ghidra/Processors/HCS08/data/manuals/HCS08.idx b/Ghidra/Processors/HCS08/data/manuals/HCS08.idx new file mode 100644 index 0000000000..4ede5e6648 --- /dev/null +++ b/Ghidra/Processors/HCS08/data/manuals/HCS08.idx @@ -0,0 +1,121 @@ +@HCS08RMV1.pdf[ Rev. 2 05/2007 M68HCS08 Microcontrollers, NXP.com ] +ADC, 201 +ADD, 202 +AIS, 203 +AIX, 204 +AND, 205 +ASL, 206 +ASLA, 206 +ASLX, 206 +ASR, 207 +ASRA, 207 +ASRX, 207 +BCC, 208 +BCLR, 209 +BCS, 210 +BEQ, 211 +BGE, 212 +BGND, 213 +BGT, 214 +BHCC, 215 +BHCS, 216 +BHI, 217 +BHS, 218 +BIH, 219 +BIL, 220 +BIT, 221 +BLE, 222 +BLO, 223 +BLS, 224 +BLT, 225 +BMC, 226 +BMI, 227 +BMS, 228 +BNE, 229 +BPL, 230 +BRA, 231 +BRCLR, 233 +BRN, 234 +BRSET, 235 +BSET, 236 +BSR, 237 +CBEQ, 238 +CBEQA, 238 +CBEQX, 238 +CLC, 239 +CLI, 240 +CLR, 241 +CLRA, 241 +CLRX, 241 +CLRH, 241 +CMP, 242 +COM, 243 +COMA, 243 +COMX, 243 +CPHX, 244 +CPX, 245 +DAA, 246 +DBNZ, 248 +DBNZA, 248 +DBNZX, 248 +DEC, 249 +DECA, 249 +DECX, 249 +DIV, 250 +EOR, 251 +INC, 252 +INCA, 252 +INCX, 252 +JMP, 253 +JSR, 254 +LDA, 255 +LDHX, 256 +LDX, 257 +LSL, 258 +LSLA, 258 +LSLX, 258 +LSR, 259 +LSRA, 259 +LSRX, 259 +MOV, 260 +MUL, 261 +NEG, 262 +NEGA, 262 +NEGX, 262 +NOP, 263 +NSA, 264 +ORA, 265 +PSHA, 266 +PSHH, 267 +PSHX, 268 +PULA, 269 +PULH, 270 +PULX, 271 +ROL, 272 +ROLA, 272 +ROLX, 272 +ROR, 273 +RORA, 273 +RORX, 273 +RSP, 274 +RTI, 275 +RTS, 276 +SBC, 277 +SEC, 278 +SEI, 279 +STA, 280 +STHX, 281 +STOP, 282 +STX, 283 +SUB, 284 +SWI, 285 +TAP, 286 +TAX, 287 +TPA, 288 +TST, 289 +TSTA, 289 +TSTX, 289 +TSX, 290 +TXA, 291 +TXS, 292 +WAIT, 293 diff --git a/Ghidra/Processors/HCS08/data/test-vectors/HC05_tv.s b/Ghidra/Processors/HCS08/data/test-vectors/HC05_tv.s new file mode 100644 index 0000000000..6fb563e1ad --- /dev/null +++ b/Ghidra/Processors/HCS08/data/test-vectors/HC05_tv.s @@ -0,0 +1,1269 @@ +.hc05 + +.area DIRECT (PAG) +;.setdp 0, DIRECT + +;low_data1: +;.ds 1 + +.area PROGRAM (ABS) +.org 0x80 + +LOW_SUB_TEST: + RTS + + +.org 0x2000 + +HIGH_SUB_TEST: + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADC OP1 is (op=0xA9 | op=0xB9 | op=0xC9 | op=0xD9 | op=0xE9 | op=0xF9) ... & OP1 + + ADC #0xFE + ADC *0xFE + ADC 0xFEDC + ADC 0xFEDC,X + ADC 0xFE,X + ADC ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx16_8_SP is (op16=0x9ED9); oprx16_8_SP + +; ADC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx8_8_SP is (op16=0x9EE9); oprx8_8_SP + +; ADC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADD OP1 is (op=0xAB | op=0xBB | op=0xCB | op=0xDB | op=0xEB | op=0xFB) ... & OP1 + + ADD #0xFE + ADD *0xFE + ADD 0xFEDC + ADD 0xFEDC,X + ADD 0xFE,X + ADD ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx16_8_SP is (op16=0x9EDB); oprx16_8_SP + +; ADD 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx8_8_SP is (op16=0x9EEB); oprx8_8_SP + +; ADD 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : AIS iopr8is is op=0xA7; iopr8is + +; AIS #0x7F +; AIS #-0x7F + +; @if defined(HCS08) || defined(HC08) +; : AIX iopr8is is op=0xAF; iopr8is + +; AIX #0x7F +; AIX #-0x7F + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : AND OP1 is (op=0xA4 | op=0xB4 | op=0xC4 | op=0xD4 | op=0xE4 | op=0xF4) ... & OP1 + + AND #0xFE + AND *0xFE + AND 0xFEDC + AND 0xFEDC,X + AND 0xFE,X + AND ,X + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx16_8_SP is (op16=0x9ED4); oprx16_8_SP + +; AND 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx8_8_SP is (op16=0x9EE4); oprx8_8_SP + +; AND 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLA is op=0x48 + + ASLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLX is op=0x58 + + ASLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + + ASL *0xFE + ASL 0xFE,X + ASL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASL oprx8_8_SP is (op16=0x9E68); oprx8_8_SP + +; ASL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRA is op=0x47 + + ASRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRX is op=0x57 + + ASRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASR OP1 is (op=0x37 | op=0x67 | op=0x77) ... & OP1 + + ASR *0xFE + ASR 0xFE,X + ASR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASR oprx8_8_SP is (op16=0x9E67); oprx8_8_SP + +; ASR 0xFE,S + + +BACKWARDS1: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCC REL is op=0x24; REL + + BCC BACKWARDS1 + BCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCLR nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=1; opr8a_8 + + BCLR #0, *0xFE + BCLR #1, *0xED + BCLR #2, *0xDC + BCLR #3, *0xCB + BCLR #4, *0xBA + BCLR #5, *0xA9 + BCLR #6, *0x98 + BCLR #7, *0x87 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCS REL is op=0x25; REL + + BCS BACKWARDS1 + BCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BEQ REL is op=0x27; REL + + BEQ BACKWARDS1 + BEQ FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) +; : BGE REL is op=0x90; REL + +; BGE BACKWARDS1 +; BGE FORWARDS1 + + +; @if defined(HCS08) +; : BGND is op=0x82 + +; BGND + + +; @if defined(HCS08) || defined(HC08) +; : BGT REL is op=0x92; REL + +; BGT BACKWARDS1 +; BGT FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCC REL is op=0x28; REL + + BHCC BACKWARDS1 + BHCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCS REL is op=0x29; REL + + BHCS BACKWARDS1 + BHCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHI REL is op=0x22; REL + + BHI BACKWARDS1 + BHI FORWARDS1 + + +; :BHS REL is op=0x24; REL See BCC + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIH REL is op=0x2F; REL + + BIH BACKWARDS1 + BIH FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIL REL is op=0x2E; REL + + BIL BACKWARDS1 + BIL FORWARDS1 + + +FORWARDS1: +BACKWARDS2: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIT OP1 is (op=0xA5 | op=0xB5 | op=0xC5 | op=0xD5 | op=0xE5 | op=0xF5) ... & OP1 + + BIT #0xFE + BIT *0xFE + BIT 0xFEDC + BIT 0xFEDC,X + BIT 0xFE,X + BIT ,X + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx16_8_SP is (op16=0x9ED5); oprx16_8_SP + +; BIT 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx8_8_SP is (op16=0x9EE5); oprx8_8_SP + +; BIT 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : BLE REL is op=0x93; REL + +; BLE BACKWARDS2 +; BLE FORWARDS2 + + +; :BLO REL is op=0x25; REL see BCS + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BLS REL is op=0x23; REL + + BLS BACKWARDS2 + BLS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) +; : BLT REL is op=0x91; REL + +; BLT BACKWARDS2 +; BLT FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMC REL is op=0x2C; REL + + BMC BACKWARDS2 + BMC FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMI REL is op=0x2B; REL + + BMI BACKWARDS2 + BMI FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMS REL is op=0x2D; REL + + BMS BACKWARDS2 + BMS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BNE REL is op=0x26; REL + + BNE BACKWARDS2 + BNE FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BPL REL is op=0x2A; REL + + BPL BACKWARDS2 + BPL FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRA REL is op=0x20; REL + + BRA BACKWARDS2 + BRA FORWARDS2 + + +FORWARDS2: +BACKWARDS3: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRCLR nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=1; opr8a_8; REL + + BRCLR #0, *0xFE,BACKWARDS3 + BRCLR #1, *0xED,BACKWARDS3 + BRCLR #2, *0xDC,BACKWARDS3 + BRCLR #3, *0xCB,BACKWARDS3 + BRCLR #4, *0xBA,BACKWARDS3 + BRCLR #5, *0xA9,BACKWARDS3 + BRCLR #6, *0x98,BACKWARDS3 + BRCLR #7, *0x87,BACKWARDS3 + + BRCLR #0, *0xFE,FORWARDS3 + BRCLR #1, *0xED,FORWARDS3 + BRCLR #2, *0xDC,FORWARDS3 + BRCLR #3, *0xCB,FORWARDS3 + BRCLR #4, *0xBA,FORWARDS3 + BRCLR #5, *0xA9,FORWARDS3 + BRCLR #6, *0x98,FORWARDS3 + BRCLR #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; branch never is a two-byte nop +; : BRN REL is op=0x21; REL + + BRN BACKWARDS3 + BRN FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRSET nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=0; opr8a_8; REL + + BRSET #0, *0xFE,BACKWARDS3 + BRSET #1, *0xED,BACKWARDS3 + BRSET #2, *0xDC,BACKWARDS3 + BRSET #3, *0xCB,BACKWARDS3 + BRSET #4, *0xBA,BACKWARDS3 + BRSET #5, *0xA9,BACKWARDS3 + BRSET #6, *0x98,BACKWARDS3 + BRSET #7, *0x87,BACKWARDS3 + + BRSET #0, *0xFE,FORWARDS3 + BRSET #1, *0xED,FORWARDS3 + BRSET #2, *0xDC,FORWARDS3 + BRSET #3, *0xCB,FORWARDS3 + BRSET #4, *0xBA,FORWARDS3 + BRSET #5, *0xA9,FORWARDS3 + BRSET #6, *0x98,FORWARDS3 + BRSET #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSET nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=0; opr8a_8 + + BSET #0, *0xFE + BSET #1, *0xED + BSET #2, *0xDC + BSET #3, *0xCB + BSET #4, *0xBA + BSET #5, *0xA9 + BSET #6, *0x98 + BSET #7, *0x87 + +FORWARDS3: +BACKWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSR REL is op=0xAD; REL + + BSR BACKWARDS4 + BSR FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ opr8a_8, REL is (op=0x31); opr8a_8; REL + +; CBEQ *0xFE, BACKWARDS4 +; CBEQ *0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQA iopr8i, REL is op=0x41; iopr8i; REL + +; CBEQA #0xFE, BACKWARDS4 +; CBEQA #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQX iopr8i, REL is op=0x51; iopr8i; REL + +; CBEQX #0xFE, BACKWARDS4 +; CBEQX #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8, X"+", REL is (op=0x61) & X; oprx8; REL + +; CBEQ *0xFE, X+, BACKWARDS4 +; CBEQ *0xFE, X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ ","X"+", REL is (op=0x71) & X; REL + +; CBEQ ,X+, BACKWARDS4 +; CBEQ ,X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8_8_SP, REL is (op16=0x9E61); oprx8_8_SP; REL + +; CBEQ 0xFE,S, BACKWARDS4 +; CBEQ 0xFE,S, FORWARDS4 + + +FORWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLC is op=0x98 + + CLC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLI is op=0x9A + + CLI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRA is op=0x4F + + CLRA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRX is op=0x5F + + CLRX + + +; @if defined(HCS08) || defined(HC08) +; : CLRH is op=0x8C + +; CLRH + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLR OP1 is (op=0x3F | op=0x6F | op=0x7F) ... & OP1 + + CLR *0xFE + CLR 0xFE,X + CLR ,X + + +; @if defined(HCS08) || defined(HC08) +; : CLR oprx8_8_SP is (op16=0x9E6F); oprx8_8_SP + +; CLR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CMP OP1 is (op=0xA1 | op=0xB1 | op=0xC1 | op=0xD1 | op=0xE1 | op=0xF1) ... & OP1 + + CMP #0xFE + CMP *0xFE + CMP 0xFEDC + CMP 0xFEDC,X + CMP 0xFE,X + CMP ,X + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx16_8_SP is (op16=0x9ED1); oprx16_8_SP + +; CMP 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx8_8_SP is (op16=0x9EE1); oprx8_8_SP + +; CMP 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMA is op=0x43 + + COMA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMX is op=0x53 + + COMX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COM OP1 is (op=0x33 | op=0x63 | op=0x73) ... & OP1 + + COM *0xFE + COM 0xFE,X + COM ,X + + +; @if defined(HCS08) || defined(HC08) +; : COM oprx8_8_SP is (op16=0x9E63); oprx8_8_SP + +; COM 0xFE,S + + +; @if defined(HCS08) +; : CPHX opr16a_16 is (op=0x3E); opr16a_16 + +; CPHX 0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX iopr16i is (op=0x65); iopr16i + +; CPHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX opr8a_16 is (op=0x75); opr8a_16 + +; CPHX *0xFE + + +; @if defined(HCS08) +; : CPHX oprx8_16_SP is (op16=0x9EF3); oprx8_16_SP + +; CPHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CPX OP1 is (op=0xA3 | op=0xB3 | op=0xC3 | op=0xD3 | op=0xE3 | op=0xF3) ... & OP1 + + CPX #0xFE + CPX *0xFE + CPX 0xFEDC + CPX 0xFEDC,X + CPX 0xFE,X + CPX ,X + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx16_8_SP is (op16=0x9ED3); oprx16_8_SP + +; CPX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx8_8_SP is (op16=0x9EE3); oprx8_8_SP + +; CPX 0xFE,S + +BACKWARDS5: + +; @if defined(HCS08) || defined(HC08) +; : DAA is op=0x72 + +; DAA + + +; @if defined(HCS08) || defined(HC08) +; : DBNZA REL is op=0x4B; REL + +; DBNZA BACKWARDS5 +; DBNZA FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZX REL is op=0x5B; REL + +; DBNZX BACKWARDS5 +; DBNZX FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ OP1, REL is (op=0x3B | op=0x6B | op=0x7B) ... & OP1; REL + +; DBNZ *0xFE, BACKWARDS5 +; DBNZ 0xFE,X, BACKWARDS5 +; DBNZ ,X, BACKWARDS5 + +; DBNZ *0xFE, FORWARDS5 +; DBNZ 0xFE,X, FORWARDS5 +; DBNZ ,X, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ oprx8_8_SP, REL is (op16=0x9E6B); oprx8_8_SP; REL + +; DBNZ 0xFE,S, BACKWARDS5 +; DBNZ 0xFE,S, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECA is op=0x4A + + DECA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECX is op=0x5A + + DECX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DEC OP1 is (op=0x3A | op=0x6A | op=0x7A) ... & OP1 + + DEC *0xFE + DEC 0xFE,X + DEC ,X + + +; @if defined(HCS08) || defined(HC08) +; : DEC oprx8_8_SP is (op16=0x9E6A); oprx8_8_SP + +; DEC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : DIV is op=0x52 + +; DIV + + +FORWARDS5: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : EOR OP1 is (op=0xA8 | op=0xB8 | op=0xC8 | op=0xD8 | op=0xE8 | op=0xF8) ... & OP1 + + EOR #0xFE + EOR *0xFE + EOR 0xFEDC + EOR 0xFEDC,X + EOR 0xFE,X + EOR ,X + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx16_8_SP is (op16=0x9ED8); oprx16_8_SP + +; EOR 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx8_8_SP is (op16=0x9EE8); oprx8_8_SP + +; EOR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCA is op=0x4C + + INCA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCX is op=0x5C + + INCX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INC OP1 is (op=0x3C | op=0x6C | op=0x7C) ... & OP1 + + INC *0xFE + INC 0xFE,X + INC ,X + + +; @if defined(HCS08) || defined(HC08) +; : INC oprx8_8_SP is (op16=0x9E6C); oprx8_8_SP + +; INC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDR is (op=0xBC | op=0xCC) ... & ADDR + + JMP *LOW_SUB_TEST + JMP HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDRI is (op=0xDC | op=0xEC | op=0xFC) ... & ADDRI + + JMP 0xFEDC,X + JMP 0xFE,X + JMP ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDR is (op=0xBD | op=0xCD) ... & ADDR + + JSR *LOW_SUB_TEST + JSR HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDRI is (op=0xDD | op=0xED | op=0xFD) ... & ADDRI + + JSR 0xFEDC,X + JSR 0xFE,X + JSR ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDA OP1 is (op=0xA6 | op=0xB6 | op=0xC6 | op=0xD6 | op=0xE6 | op=0xF6) ... & OP1 + + LDA #0xFE + LDA *0xFE + LDA 0xFEDC + LDA 0xFEDC,X + LDA 0xFE,X + LDA ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx16_8_SP is (op16=0x9ED6); oprx16_8_SP + +; LDA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx8_8_SP is (op16=0x9EE6); oprx8_8_SP + +; LDA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : LDHX iopr16i is (op=0x45); iopr16i + +; LDHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : LDHX opr8a_16 is (op=0x55); opr8a_16 + +; LDHX *0xFE + + +; @if defined(HCS08) +; : LDHX opr16a_16 is (op=0x32); opr16a_16 + +; LDHX 0xFEDC + + +; @if defined(HCS08) +; : LDHX ","X is (op16=0x9EAE) & X + +; LDHX ,X + + +; @if defined(HCS08) +; : LDHX oprx16_16_X is (op16=0x9EBE); oprx16_16_X + +; LDHX 0xFEDC,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_X is (op16=0x9ECE); oprx8_16_X + +; LDHX 0xFE,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_SP is (op16=0x9EFE); oprx8_16_SP + +; LDHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDX OP1 is (op=0xAE | op=0xBE | op=0xCE | op=0xDE | op=0xEE | op=0xFE) ... & OP1 + + LDX #0xFE + LDX *0xFE + LDX 0xFEDC + LDX 0xFEDC,X + LDX 0xFE,X + LDX ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx16_8_SP is (op16=0x9EDE); oprx16_8_SP + +; LDX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx8_8_SP is (op16=0x9EEE); oprx8_8_SP + +; LDX 0xFE,S + + +; ## Logical Shift left is same as arithmetic shift left +; :LSLA is op=0x48 +; :LSLX is op=0x58 +; :LSL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRA is op=0x44 + + LSRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRX is op=0x54 + + LSRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSR OP1 is (op=0x34 | op=0x64 | op=0x74) ... & OP1 + + LSR *0xFE + LSR 0xFE,X + LSR ,X + + +; @if defined(HCS08) || defined(HC08) +; : LSR oprx8_8_SP is (op16=0x9E64); oprx8_8_SP + +; LSR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, op2_opr8a is (op=0x4E); opr8a_8; op2_opr8a + +; MOV *0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, X"+" is (op=0x5E); opr8a_8 & X + +; MOV 0xFE, X+ + + +; @if defined(HCS08) || defined(HC08) +; : MOV iopr8i, op2_opr8a is (op=0x6E); iopr8i; op2_opr8a + +; MOV #0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV ","X"+," op2_opr8a is (op=0x7E) & X; op2_opr8a + +; MOV ,X+, *0xFE + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : MUL is op=0x42 + + MUL + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGA is op=0x40 + + NEGA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGX is op=0x50 + + NEGX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEG OP1 is (op=0x30 | op=0x60 | op=0x70) ... & OP1 + + NEG *0xFE + NEG 0xFE,X + NEG ,X + + +; @if defined(HCS08) || defined(HC08) +; : NEG oprx8_8_SP is (op16=0x9E60); oprx8_8_SP + +; NEG 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NOP is op = 0x9D + + NOP + + +; @if defined(HCS08) || defined(HC08) +; : NSA is op = 0x62 + +; NSA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ORA OP1 is (op=0xAA | op=0xBA | op=0xCA | op=0xDA | op=0xEA | op=0xFA) ... & OP1 + + ORA #0xFE + ORA *0xFE + ORA 0xFEDC + ORA 0xFEDC,X + ORA 0xFE,X + ORA ,X + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx16_8_SP is (op16=0x9EDA); oprx16_8_SP + +; ORA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx8_8_SP is (op16=0x9EEA); oprx8_8_SP + +; ORA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : PSHA is op = 0x87 + +; PSHA + + +; @if defined(HCS08) || defined(HC08) +; : PSHH is op = 0x8B + +; PSHH + + +; @if defined(HCS08) || defined(HC08) +; : PSHX is op = 0x89 + +; PSHX + + +; @if defined(HCS08) || defined(HC08) +; : PULA is op = 0x86 + +; PULA + + +; @if defined(HCS08) || defined(HC08) +; : PULH is op = 0x8A + +; PULH + + +; @if defined(HCS08) || defined(HC08) +; : PULX is op = 0x88 + +; PULX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLA is op=0x49 + + ROLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLX is op=0x59 + + ROLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROL OP1 is (op=0x39 | op=0x69 | op=0x79) ... & OP1 + + ROL *0xFE + ROL 0xFE,X + ROL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROL oprx8_8_SP is (op16=0x9E69); oprx8_8_SP + +; ROL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORA is op=0x46 + + RORA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORX is op=0x56 + + RORX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROR OP1 is (op=0x36 | op=0x66 | op=0x76) ... & OP1 + + ROR *0xFE + ROR 0xFE,X + ROR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROR oprx8_8_SP is (op16=0x9E66); oprx8_8_SP + +; ROR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RSP is op = 0x9C + + RSP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTI is op = 0x80 + + RTI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTS is op = 0x81 + + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SBC OP1 is (op=0xA2 | op=0xB2 | op=0xC2 | op=0xD2 | op=0xE2 | op=0xF2) ... & OP1 + + SBC #0xFE + SBC *0xFE + SBC 0xFEDC + SBC 0xFEDC,X + SBC 0xFE,X + SBC ,X + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx16_8_SP is (op16=0x9ED2); oprx16_8_SP + +; SBC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx8_8_SP is (op16=0x9EE2); oprx8_8_SP + +; SBC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEC is op = 0x99 + + SEC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEI is op = 0x9B + + SEI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STA OP1 is (op=0xB7 | op=0xC7 | op=0xD7 | op=0xE7 | op=0xF7) ... & OP1 + + STA *0xFE + STA 0xFEDC + STA 0xFEDC,X + STA 0xFE,X + STA ,X + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx16_8_SP is (op16=0x9ED7); oprx16_8_SP + +; STA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx8_8_SP is (op16=0x9EE7); oprx8_8_SP + +; STA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : STHX opr8a_16 is (op=0x35); opr8a_16 + +; STHX *0xFE + + +; @if defined(HCS08) +; : STHX opr16a_16 is (op=0x96); opr16a_16 + +; STHX 0xFEDC + + +; @if defined(HCS08) +; : STHX oprx8_16_SP is (op16=0x9EFF); oprx8_16_SP + +; STHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STOP is op=0x8E + + STOP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STX OP1 is (op=0xBF | op=0xCF | op=0xDF | op=0xEF | op=0xFF) ... & OP1 + + STX *0xFE + STX 0xFEDC + STX 0xFEDC,X + STX 0xFE,X + STX ,X + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx16_8_SP is (op16=0x9EDF); oprx16_8_SP + +; STX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx8_8_SP is (op16=0x9EEF); oprx8_8_SP + +; STX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SUB OP1 is (op=0xA0 | op=0xB0 | op=0xC0 | op=0xD0 | op=0xE0 | op=0xF0) ... & OP1 + + SUB #0xFE + SUB *0xFE + SUB 0xFEDC + SUB 0xFEDC,X + SUB 0xFE,X + SUB ,X + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx16_8_SP is (op16=0x9ED0); oprx16_8_SP + +; SUB 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx8_8_SP is (op16=0x9EE0); oprx8_8_SP + +; SUB 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SWI is op=0x83 + + SWI + + +; @if defined(HCS08) || defined(HC08) +; : TAP is op=0x84 + +; TAP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TAX is op=0x97 + + TAX + + +; @if defined(HCS08) || defined(HC08) +; : TPA is op=0x85 + +; TPA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTA is op=0x4D + + TSTA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTX is op=0x5D + + TSTX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TST OP1 is (op=0x3D | op=0x6D | op=0x7D) ... & OP1 + + TST *0xFE + TST 0xFE,X + TST ,X + + +; @if defined(HCS08) || defined(HC08) +; : TST oprx8_8_SP is (op16=0x9E6D); oprx8_8_SP + +; TST 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : TSX is op=0x95 + +; TSX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TXA is op=0x9F + + TXA + + +; @if defined(HCS08) || defined(HC08) +; : TXS is op=0x94 + +; TXS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : WAIT is op=0x8f + + WAIT + + +HERE: + BRA HERE diff --git a/Ghidra/Processors/HCS08/data/test-vectors/HC08_tv.s b/Ghidra/Processors/HCS08/data/test-vectors/HC08_tv.s new file mode 100644 index 0000000000..4b82108c5b --- /dev/null +++ b/Ghidra/Processors/HCS08/data/test-vectors/HC08_tv.s @@ -0,0 +1,1269 @@ +.hc08 + +.area DIRECT (PAG) +;.setdp 0, DIRECT + +;low_data1: +;.ds 1 + +.area PROGRAM (ABS) +.org 0x80 + +LOW_SUB_TEST: + RTS + + +.org 0x2000 + +HIGH_SUB_TEST: + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADC OP1 is (op=0xA9 | op=0xB9 | op=0xC9 | op=0xD9 | op=0xE9 | op=0xF9) ... & OP1 + + ADC #0xFE + ADC *0xFE + ADC 0xFEDC + ADC 0xFEDC,X + ADC 0xFE,X + ADC ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx16_8_SP is (op16=0x9ED9); oprx16_8_SP + + ADC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx8_8_SP is (op16=0x9EE9); oprx8_8_SP + + ADC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADD OP1 is (op=0xAB | op=0xBB | op=0xCB | op=0xDB | op=0xEB | op=0xFB) ... & OP1 + + ADD #0xFE + ADD *0xFE + ADD 0xFEDC + ADD 0xFEDC,X + ADD 0xFE,X + ADD ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx16_8_SP is (op16=0x9EDB); oprx16_8_SP + + ADD 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx8_8_SP is (op16=0x9EEB); oprx8_8_SP + + ADD 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : AIS iopr8is is op=0xA7; iopr8is + + AIS #0x7F + AIS #-0x7F + +; @if defined(HCS08) || defined(HC08) +; : AIX iopr8is is op=0xAF; iopr8is + + AIX #0x7F + AIX #-0x7F + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : AND OP1 is (op=0xA4 | op=0xB4 | op=0xC4 | op=0xD4 | op=0xE4 | op=0xF4) ... & OP1 + + AND #0xFE + AND *0xFE + AND 0xFEDC + AND 0xFEDC,X + AND 0xFE,X + AND ,X + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx16_8_SP is (op16=0x9ED4); oprx16_8_SP + + AND 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx8_8_SP is (op16=0x9EE4); oprx8_8_SP + + AND 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLA is op=0x48 + + ASLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLX is op=0x58 + + ASLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + + ASL *0xFE + ASL 0xFE,X + ASL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASL oprx8_8_SP is (op16=0x9E68); oprx8_8_SP + + ASL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRA is op=0x47 + + ASRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRX is op=0x57 + + ASRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASR OP1 is (op=0x37 | op=0x67 | op=0x77) ... & OP1 + + ASR *0xFE + ASR 0xFE,X + ASR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASR oprx8_8_SP is (op16=0x9E67); oprx8_8_SP + + ASR 0xFE,S + + +BACKWARDS1: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCC REL is op=0x24; REL + + BCC BACKWARDS1 + BCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCLR nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=1; opr8a_8 + + BCLR #0, *0xFE + BCLR #1, *0xED + BCLR #2, *0xDC + BCLR #3, *0xCB + BCLR #4, *0xBA + BCLR #5, *0xA9 + BCLR #6, *0x98 + BCLR #7, *0x87 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCS REL is op=0x25; REL + + BCS BACKWARDS1 + BCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BEQ REL is op=0x27; REL + + BEQ BACKWARDS1 + BEQ FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) +; : BGE REL is op=0x90; REL + + BGE BACKWARDS1 + BGE FORWARDS1 + + +; @if defined(HCS08) +; : BGND is op=0x82 + +; BGND + + +; @if defined(HCS08) || defined(HC08) +; : BGT REL is op=0x92; REL + + BGT BACKWARDS1 + BGT FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCC REL is op=0x28; REL + + BHCC BACKWARDS1 + BHCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCS REL is op=0x29; REL + + BHCS BACKWARDS1 + BHCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHI REL is op=0x22; REL + + BHI BACKWARDS1 + BHI FORWARDS1 + + +; :BHS REL is op=0x24; REL See BCC + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIH REL is op=0x2F; REL + + BIH BACKWARDS1 + BIH FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIL REL is op=0x2E; REL + + BIL BACKWARDS1 + BIL FORWARDS1 + + +FORWARDS1: +BACKWARDS2: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIT OP1 is (op=0xA5 | op=0xB5 | op=0xC5 | op=0xD5 | op=0xE5 | op=0xF5) ... & OP1 + + BIT #0xFE + BIT *0xFE + BIT 0xFEDC + BIT 0xFEDC,X + BIT 0xFE,X + BIT ,X + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx16_8_SP is (op16=0x9ED5); oprx16_8_SP + + BIT 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx8_8_SP is (op16=0x9EE5); oprx8_8_SP + + BIT 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : BLE REL is op=0x93; REL + + BLE BACKWARDS2 + BLE FORWARDS2 + + +; :BLO REL is op=0x25; REL see BCS + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BLS REL is op=0x23; REL + + BLS BACKWARDS2 + BLS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) +; : BLT REL is op=0x91; REL + + BLT BACKWARDS2 + BLT FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMC REL is op=0x2C; REL + + BMC BACKWARDS2 + BMC FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMI REL is op=0x2B; REL + + BMI BACKWARDS2 + BMI FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMS REL is op=0x2D; REL + + BMS BACKWARDS2 + BMS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BNE REL is op=0x26; REL + + BNE BACKWARDS2 + BNE FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BPL REL is op=0x2A; REL + + BPL BACKWARDS2 + BPL FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRA REL is op=0x20; REL + + BRA BACKWARDS2 + BRA FORWARDS2 + + +FORWARDS2: +BACKWARDS3: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRCLR nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=1; opr8a_8; REL + + BRCLR #0, *0xFE,BACKWARDS3 + BRCLR #1, *0xED,BACKWARDS3 + BRCLR #2, *0xDC,BACKWARDS3 + BRCLR #3, *0xCB,BACKWARDS3 + BRCLR #4, *0xBA,BACKWARDS3 + BRCLR #5, *0xA9,BACKWARDS3 + BRCLR #6, *0x98,BACKWARDS3 + BRCLR #7, *0x87,BACKWARDS3 + + BRCLR #0, *0xFE,FORWARDS3 + BRCLR #1, *0xED,FORWARDS3 + BRCLR #2, *0xDC,FORWARDS3 + BRCLR #3, *0xCB,FORWARDS3 + BRCLR #4, *0xBA,FORWARDS3 + BRCLR #5, *0xA9,FORWARDS3 + BRCLR #6, *0x98,FORWARDS3 + BRCLR #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; branch never is a two-byte nop +; : BRN REL is op=0x21; REL + + BRN BACKWARDS3 + BRN FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRSET nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=0; opr8a_8; REL + + BRSET #0, *0xFE,BACKWARDS3 + BRSET #1, *0xED,BACKWARDS3 + BRSET #2, *0xDC,BACKWARDS3 + BRSET #3, *0xCB,BACKWARDS3 + BRSET #4, *0xBA,BACKWARDS3 + BRSET #5, *0xA9,BACKWARDS3 + BRSET #6, *0x98,BACKWARDS3 + BRSET #7, *0x87,BACKWARDS3 + + BRSET #0, *0xFE,FORWARDS3 + BRSET #1, *0xED,FORWARDS3 + BRSET #2, *0xDC,FORWARDS3 + BRSET #3, *0xCB,FORWARDS3 + BRSET #4, *0xBA,FORWARDS3 + BRSET #5, *0xA9,FORWARDS3 + BRSET #6, *0x98,FORWARDS3 + BRSET #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSET nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=0; opr8a_8 + + BSET #0, *0xFE + BSET #1, *0xED + BSET #2, *0xDC + BSET #3, *0xCB + BSET #4, *0xBA + BSET #5, *0xA9 + BSET #6, *0x98 + BSET #7, *0x87 + +FORWARDS3: +BACKWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSR REL is op=0xAD; REL + + BSR BACKWARDS4 + BSR FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ opr8a_8, REL is (op=0x31); opr8a_8; REL + + CBEQ *0xFE, BACKWARDS4 + CBEQ *0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQA iopr8i, REL is op=0x41; iopr8i; REL + + CBEQA #0xFE, BACKWARDS4 + CBEQA #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQX iopr8i, REL is op=0x51; iopr8i; REL + + CBEQX #0xFE, BACKWARDS4 + CBEQX #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8, X"+", REL is (op=0x61) & X; oprx8; REL + + CBEQ *0xFE, X+, BACKWARDS4 + CBEQ *0xFE, X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ ","X"+", REL is (op=0x71) & X; REL + + CBEQ ,X+, BACKWARDS4 + CBEQ ,X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8_8_SP, REL is (op16=0x9E61); oprx8_8_SP; REL + + CBEQ 0xFE,S, BACKWARDS4 + CBEQ 0xFE,S, FORWARDS4 + + +FORWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLC is op=0x98 + + CLC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLI is op=0x9A + + CLI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRA is op=0x4F + + CLRA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRX is op=0x5F + + CLRX + + +; @if defined(HCS08) || defined(HC08) +; : CLRH is op=0x8C + + CLRH + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLR OP1 is (op=0x3F | op=0x6F | op=0x7F) ... & OP1 + + CLR *0xFE + CLR 0xFE,X + CLR ,X + + +; @if defined(HCS08) || defined(HC08) +; : CLR oprx8_8_SP is (op16=0x9E6F); oprx8_8_SP + + CLR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CMP OP1 is (op=0xA1 | op=0xB1 | op=0xC1 | op=0xD1 | op=0xE1 | op=0xF1) ... & OP1 + + CMP #0xFE + CMP *0xFE + CMP 0xFEDC + CMP 0xFEDC,X + CMP 0xFE,X + CMP ,X + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx16_8_SP is (op16=0x9ED1); oprx16_8_SP + + CMP 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx8_8_SP is (op16=0x9EE1); oprx8_8_SP + + CMP 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMA is op=0x43 + + COMA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMX is op=0x53 + + COMX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COM OP1 is (op=0x33 | op=0x63 | op=0x73) ... & OP1 + + COM *0xFE + COM 0xFE,X + COM ,X + + +; @if defined(HCS08) || defined(HC08) +; : COM oprx8_8_SP is (op16=0x9E63); oprx8_8_SP + + COM 0xFE,S + + +; @if defined(HCS08) +; : CPHX opr16a_16 is (op=0x3E); opr16a_16 + +; CPHX 0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX iopr16i is (op=0x65); iopr16i + + CPHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX opr8a_16 is (op=0x75); opr8a_16 + + CPHX *0xFE + + +; @if defined(HCS08) +; : CPHX oprx8_16_SP is (op16=0x9EF3); oprx8_16_SP + +; CPHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CPX OP1 is (op=0xA3 | op=0xB3 | op=0xC3 | op=0xD3 | op=0xE3 | op=0xF3) ... & OP1 + + CPX #0xFE + CPX *0xFE + CPX 0xFEDC + CPX 0xFEDC,X + CPX 0xFE,X + CPX ,X + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx16_8_SP is (op16=0x9ED3); oprx16_8_SP + + CPX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx8_8_SP is (op16=0x9EE3); oprx8_8_SP + + CPX 0xFE,S + +BACKWARDS5: + +; @if defined(HCS08) || defined(HC08) +; : DAA is op=0x72 + + DAA + + +; @if defined(HCS08) || defined(HC08) +; : DBNZA REL is op=0x4B; REL + + DBNZA BACKWARDS5 + DBNZA FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZX REL is op=0x5B; REL + + DBNZX BACKWARDS5 + DBNZX FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ OP1, REL is (op=0x3B | op=0x6B | op=0x7B) ... & OP1; REL + + DBNZ *0xFE, BACKWARDS5 + DBNZ 0xFE,X, BACKWARDS5 + DBNZ ,X, BACKWARDS5 + + DBNZ *0xFE, FORWARDS5 + DBNZ 0xFE,X, FORWARDS5 + DBNZ ,X, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ oprx8_8_SP, REL is (op16=0x9E6B); oprx8_8_SP; REL + + DBNZ 0xFE,S, BACKWARDS5 + DBNZ 0xFE,S, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECA is op=0x4A + + DECA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECX is op=0x5A + + DECX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DEC OP1 is (op=0x3A | op=0x6A | op=0x7A) ... & OP1 + + DEC *0xFE + DEC 0xFE,X + DEC ,X + + +; @if defined(HCS08) || defined(HC08) +; : DEC oprx8_8_SP is (op16=0x9E6A); oprx8_8_SP + + DEC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : DIV is op=0x52 + + DIV + + +FORWARDS5: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : EOR OP1 is (op=0xA8 | op=0xB8 | op=0xC8 | op=0xD8 | op=0xE8 | op=0xF8) ... & OP1 + + EOR #0xFE + EOR *0xFE + EOR 0xFEDC + EOR 0xFEDC,X + EOR 0xFE,X + EOR ,X + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx16_8_SP is (op16=0x9ED8); oprx16_8_SP + + EOR 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx8_8_SP is (op16=0x9EE8); oprx8_8_SP + + EOR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCA is op=0x4C + + INCA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCX is op=0x5C + + INCX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INC OP1 is (op=0x3C | op=0x6C | op=0x7C) ... & OP1 + + INC *0xFE + INC 0xFE,X + INC ,X + + +; @if defined(HCS08) || defined(HC08) +; : INC oprx8_8_SP is (op16=0x9E6C); oprx8_8_SP + + INC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDR is (op=0xBC | op=0xCC) ... & ADDR + + JMP *LOW_SUB_TEST + JMP HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDRI is (op=0xDC | op=0xEC | op=0xFC) ... & ADDRI + + JMP 0xFEDC,X + JMP 0xFE,X + JMP ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDR is (op=0xBD | op=0xCD) ... & ADDR + + JSR *LOW_SUB_TEST + JSR HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDRI is (op=0xDD | op=0xED | op=0xFD) ... & ADDRI + + JSR 0xFEDC,X + JSR 0xFE,X + JSR ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDA OP1 is (op=0xA6 | op=0xB6 | op=0xC6 | op=0xD6 | op=0xE6 | op=0xF6) ... & OP1 + + LDA #0xFE + LDA *0xFE + LDA 0xFEDC + LDA 0xFEDC,X + LDA 0xFE,X + LDA ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx16_8_SP is (op16=0x9ED6); oprx16_8_SP + + LDA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx8_8_SP is (op16=0x9EE6); oprx8_8_SP + + LDA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : LDHX iopr16i is (op=0x45); iopr16i + + LDHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : LDHX opr8a_16 is (op=0x55); opr8a_16 + + LDHX *0xFE + + +; @if defined(HCS08) +; : LDHX opr16a_16 is (op=0x32); opr16a_16 + +; LDHX 0xFEDC + + +; @if defined(HCS08) +; : LDHX ","X is (op16=0x9EAE) & X + +; LDHX ,X + + +; @if defined(HCS08) +; : LDHX oprx16_16_X is (op16=0x9EBE); oprx16_16_X + +; LDHX 0xFEDC,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_X is (op16=0x9ECE); oprx8_16_X + +; LDHX 0xFE,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_SP is (op16=0x9EFE); oprx8_16_SP + +; LDHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDX OP1 is (op=0xAE | op=0xBE | op=0xCE | op=0xDE | op=0xEE | op=0xFE) ... & OP1 + + LDX #0xFE + LDX *0xFE + LDX 0xFEDC + LDX 0xFEDC,X + LDX 0xFE,X + LDX ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx16_8_SP is (op16=0x9EDE); oprx16_8_SP + + LDX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx8_8_SP is (op16=0x9EEE); oprx8_8_SP + + LDX 0xFE,S + + +; ## Logical Shift left is same as arithmetic shift left +; :LSLA is op=0x48 +; :LSLX is op=0x58 +; :LSL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRA is op=0x44 + + LSRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRX is op=0x54 + + LSRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSR OP1 is (op=0x34 | op=0x64 | op=0x74) ... & OP1 + + LSR *0xFE + LSR 0xFE,X + LSR ,X + + +; @if defined(HCS08) || defined(HC08) +; : LSR oprx8_8_SP is (op16=0x9E64); oprx8_8_SP + + LSR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, op2_opr8a is (op=0x4E); opr8a_8; op2_opr8a + + MOV *0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, X"+" is (op=0x5E); opr8a_8 & X + + MOV 0xFE, X+ + + +; @if defined(HCS08) || defined(HC08) +; : MOV iopr8i, op2_opr8a is (op=0x6E); iopr8i; op2_opr8a + + MOV #0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV ","X"+," op2_opr8a is (op=0x7E) & X; op2_opr8a + + MOV ,X+, *0xFE + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : MUL is op=0x42 + + MUL + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGA is op=0x40 + + NEGA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGX is op=0x50 + + NEGX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEG OP1 is (op=0x30 | op=0x60 | op=0x70) ... & OP1 + + NEG *0xFE + NEG 0xFE,X + NEG ,X + + +; @if defined(HCS08) || defined(HC08) +; : NEG oprx8_8_SP is (op16=0x9E60); oprx8_8_SP + + NEG 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NOP is op = 0x9D + + NOP + + +; @if defined(HCS08) || defined(HC08) +; : NSA is op = 0x62 + + NSA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ORA OP1 is (op=0xAA | op=0xBA | op=0xCA | op=0xDA | op=0xEA | op=0xFA) ... & OP1 + + ORA #0xFE + ORA *0xFE + ORA 0xFEDC + ORA 0xFEDC,X + ORA 0xFE,X + ORA ,X + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx16_8_SP is (op16=0x9EDA); oprx16_8_SP + + ORA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx8_8_SP is (op16=0x9EEA); oprx8_8_SP + + ORA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : PSHA is op = 0x87 + + PSHA + + +; @if defined(HCS08) || defined(HC08) +; : PSHH is op = 0x8B + + PSHH + + +; @if defined(HCS08) || defined(HC08) +; : PSHX is op = 0x89 + + PSHX + + +; @if defined(HCS08) || defined(HC08) +; : PULA is op = 0x86 + + PULA + + +; @if defined(HCS08) || defined(HC08) +; : PULH is op = 0x8A + + PULH + + +; @if defined(HCS08) || defined(HC08) +; : PULX is op = 0x88 + + PULX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLA is op=0x49 + + ROLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLX is op=0x59 + + ROLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROL OP1 is (op=0x39 | op=0x69 | op=0x79) ... & OP1 + + ROL *0xFE + ROL 0xFE,X + ROL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROL oprx8_8_SP is (op16=0x9E69); oprx8_8_SP + + ROL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORA is op=0x46 + + RORA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORX is op=0x56 + + RORX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROR OP1 is (op=0x36 | op=0x66 | op=0x76) ... & OP1 + + ROR *0xFE + ROR 0xFE,X + ROR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROR oprx8_8_SP is (op16=0x9E66); oprx8_8_SP + + ROR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RSP is op = 0x9C + + RSP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTI is op = 0x80 + + RTI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTS is op = 0x81 + + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SBC OP1 is (op=0xA2 | op=0xB2 | op=0xC2 | op=0xD2 | op=0xE2 | op=0xF2) ... & OP1 + + SBC #0xFE + SBC *0xFE + SBC 0xFEDC + SBC 0xFEDC,X + SBC 0xFE,X + SBC ,X + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx16_8_SP is (op16=0x9ED2); oprx16_8_SP + + SBC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx8_8_SP is (op16=0x9EE2); oprx8_8_SP + + SBC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEC is op = 0x99 + + SEC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEI is op = 0x9B + + SEI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STA OP1 is (op=0xB7 | op=0xC7 | op=0xD7 | op=0xE7 | op=0xF7) ... & OP1 + + STA *0xFE + STA 0xFEDC + STA 0xFEDC,X + STA 0xFE,X + STA ,X + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx16_8_SP is (op16=0x9ED7); oprx16_8_SP + + STA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx8_8_SP is (op16=0x9EE7); oprx8_8_SP + + STA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : STHX opr8a_16 is (op=0x35); opr8a_16 + + STHX *0xFE + + +; @if defined(HCS08) +; : STHX opr16a_16 is (op=0x96); opr16a_16 + +; STHX 0xFEDC + + +; @if defined(HCS08) +; : STHX oprx8_16_SP is (op16=0x9EFF); oprx8_16_SP + +; STHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STOP is op=0x8E + + STOP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STX OP1 is (op=0xBF | op=0xCF | op=0xDF | op=0xEF | op=0xFF) ... & OP1 + + STX *0xFE + STX 0xFEDC + STX 0xFEDC,X + STX 0xFE,X + STX ,X + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx16_8_SP is (op16=0x9EDF); oprx16_8_SP + + STX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx8_8_SP is (op16=0x9EEF); oprx8_8_SP + + STX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SUB OP1 is (op=0xA0 | op=0xB0 | op=0xC0 | op=0xD0 | op=0xE0 | op=0xF0) ... & OP1 + + SUB #0xFE + SUB *0xFE + SUB 0xFEDC + SUB 0xFEDC,X + SUB 0xFE,X + SUB ,X + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx16_8_SP is (op16=0x9ED0); oprx16_8_SP + + SUB 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx8_8_SP is (op16=0x9EE0); oprx8_8_SP + + SUB 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SWI is op=0x83 + + SWI + + +; @if defined(HCS08) || defined(HC08) +; : TAP is op=0x84 + + TAP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TAX is op=0x97 + + TAX + + +; @if defined(HCS08) || defined(HC08) +; : TPA is op=0x85 + + TPA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTA is op=0x4D + + TSTA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTX is op=0x5D + + TSTX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TST OP1 is (op=0x3D | op=0x6D | op=0x7D) ... & OP1 + + TST *0xFE + TST 0xFE,X + TST ,X + + +; @if defined(HCS08) || defined(HC08) +; : TST oprx8_8_SP is (op16=0x9E6D); oprx8_8_SP + + TST 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : TSX is op=0x95 + + TSX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TXA is op=0x9F + + TXA + + +; @if defined(HCS08) || defined(HC08) +; : TXS is op=0x94 + + TXS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : WAIT is op=0x8f + + WAIT + + +HERE: + BRA HERE diff --git a/Ghidra/Processors/HCS08/data/test-vectors/HCS08_tv.s b/Ghidra/Processors/HCS08/data/test-vectors/HCS08_tv.s new file mode 100644 index 0000000000..3d0f054b5b --- /dev/null +++ b/Ghidra/Processors/HCS08/data/test-vectors/HCS08_tv.s @@ -0,0 +1,1269 @@ +.hcs08 + +.area DIRECT (PAG) +;.setdp 0, DIRECT + +;low_data1: +;.ds 1 + +.area PROGRAM (ABS) +.org 0x80 + +LOW_SUB_TEST: + RTS + + +.org 0x2000 + +HIGH_SUB_TEST: + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADC OP1 is (op=0xA9 | op=0xB9 | op=0xC9 | op=0xD9 | op=0xE9 | op=0xF9) ... & OP1 + + ADC #0xFE + ADC *0xFE + ADC 0xFEDC + ADC 0xFEDC,X + ADC 0xFE,X + ADC ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx16_8_SP is (op16=0x9ED9); oprx16_8_SP + + ADC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADC oprx8_8_SP is (op16=0x9EE9); oprx8_8_SP + + ADC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ADD OP1 is (op=0xAB | op=0xBB | op=0xCB | op=0xDB | op=0xEB | op=0xFB) ... & OP1 + + ADD #0xFE + ADD *0xFE + ADD 0xFEDC + ADD 0xFEDC,X + ADD 0xFE,X + ADD ,X + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx16_8_SP is (op16=0x9EDB); oprx16_8_SP + + ADD 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ADD oprx8_8_SP is (op16=0x9EEB); oprx8_8_SP + + ADD 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : AIS iopr8is is op=0xA7; iopr8is + + AIS #0x7F + AIS #-0x7F + +; @if defined(HCS08) || defined(HC08) +; : AIX iopr8is is op=0xAF; iopr8is + + AIX #0x7F + AIX #-0x7F + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : AND OP1 is (op=0xA4 | op=0xB4 | op=0xC4 | op=0xD4 | op=0xE4 | op=0xF4) ... & OP1 + + AND #0xFE + AND *0xFE + AND 0xFEDC + AND 0xFEDC,X + AND 0xFE,X + AND ,X + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx16_8_SP is (op16=0x9ED4); oprx16_8_SP + + AND 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : AND oprx8_8_SP is (op16=0x9EE4); oprx8_8_SP + + AND 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLA is op=0x48 + + ASLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASLX is op=0x58 + + ASLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + + ASL *0xFE + ASL 0xFE,X + ASL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASL oprx8_8_SP is (op16=0x9E68); oprx8_8_SP + + ASL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRA is op=0x47 + + ASRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASRX is op=0x57 + + ASRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ASR OP1 is (op=0x37 | op=0x67 | op=0x77) ... & OP1 + + ASR *0xFE + ASR 0xFE,X + ASR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ASR oprx8_8_SP is (op16=0x9E67); oprx8_8_SP + + ASR 0xFE,S + + +BACKWARDS1: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCC REL is op=0x24; REL + + BCC BACKWARDS1 + BCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCLR nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=1; opr8a_8 + + BCLR #0, *0xFE + BCLR #1, *0xED + BCLR #2, *0xDC + BCLR #3, *0xCB + BCLR #4, *0xBA + BCLR #5, *0xA9 + BCLR #6, *0x98 + BCLR #7, *0x87 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BCS REL is op=0x25; REL + + BCS BACKWARDS1 + BCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BEQ REL is op=0x27; REL + + BEQ BACKWARDS1 + BEQ FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) +; : BGE REL is op=0x90; REL + + BGE BACKWARDS1 + BGE FORWARDS1 + + +; @if defined(HCS08) +; : BGND is op=0x82 + + BGND + + +; @if defined(HCS08) || defined(HC08) +; : BGT REL is op=0x92; REL + + BGT BACKWARDS1 + BGT FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCC REL is op=0x28; REL + + BHCC BACKWARDS1 + BHCC FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHCS REL is op=0x29; REL + + BHCS BACKWARDS1 + BHCS FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BHI REL is op=0x22; REL + + BHI BACKWARDS1 + BHI FORWARDS1 + + +; :BHS REL is op=0x24; REL See BCC + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIH REL is op=0x2F; REL + + BIH BACKWARDS1 + BIH FORWARDS1 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIL REL is op=0x2E; REL + + BIL BACKWARDS1 + BIL FORWARDS1 + + +FORWARDS1: +BACKWARDS2: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BIT OP1 is (op=0xA5 | op=0xB5 | op=0xC5 | op=0xD5 | op=0xE5 | op=0xF5) ... & OP1 + + BIT #0xFE + BIT *0xFE + BIT 0xFEDC + BIT 0xFEDC,X + BIT 0xFE,X + BIT ,X + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx16_8_SP is (op16=0x9ED5); oprx16_8_SP + + BIT 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : BIT oprx8_8_SP is (op16=0x9EE5); oprx8_8_SP + + BIT 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : BLE REL is op=0x93; REL + + BLE BACKWARDS2 + BLE FORWARDS2 + + +; :BLO REL is op=0x25; REL see BCS + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BLS REL is op=0x23; REL + + BLS BACKWARDS2 + BLS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) +; : BLT REL is op=0x91; REL + + BLT BACKWARDS2 + BLT FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMC REL is op=0x2C; REL + + BMC BACKWARDS2 + BMC FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMI REL is op=0x2B; REL + + BMI BACKWARDS2 + BMI FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BMS REL is op=0x2D; REL + + BMS BACKWARDS2 + BMS FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BNE REL is op=0x26; REL + + BNE BACKWARDS2 + BNE FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BPL REL is op=0x2A; REL + + BPL BACKWARDS2 + BPL FORWARDS2 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRA REL is op=0x20; REL + + BRA BACKWARDS2 + BRA FORWARDS2 + + +FORWARDS2: +BACKWARDS3: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRCLR nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=1; opr8a_8; REL + + BRCLR #0, *0xFE,BACKWARDS3 + BRCLR #1, *0xED,BACKWARDS3 + BRCLR #2, *0xDC,BACKWARDS3 + BRCLR #3, *0xCB,BACKWARDS3 + BRCLR #4, *0xBA,BACKWARDS3 + BRCLR #5, *0xA9,BACKWARDS3 + BRCLR #6, *0x98,BACKWARDS3 + BRCLR #7, *0x87,BACKWARDS3 + + BRCLR #0, *0xFE,FORWARDS3 + BRCLR #1, *0xED,FORWARDS3 + BRCLR #2, *0xDC,FORWARDS3 + BRCLR #3, *0xCB,FORWARDS3 + BRCLR #4, *0xBA,FORWARDS3 + BRCLR #5, *0xA9,FORWARDS3 + BRCLR #6, *0x98,FORWARDS3 + BRCLR #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; branch never is a two-byte nop +; : BRN REL is op=0x21; REL + + BRN BACKWARDS3 + BRN FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BRSET nIndex, opr8a_8, REL is op4_7=0 & nIndex & NthBit & op0_0=0; opr8a_8; REL + + BRSET #0, *0xFE,BACKWARDS3 + BRSET #1, *0xED,BACKWARDS3 + BRSET #2, *0xDC,BACKWARDS3 + BRSET #3, *0xCB,BACKWARDS3 + BRSET #4, *0xBA,BACKWARDS3 + BRSET #5, *0xA9,BACKWARDS3 + BRSET #6, *0x98,BACKWARDS3 + BRSET #7, *0x87,BACKWARDS3 + + BRSET #0, *0xFE,FORWARDS3 + BRSET #1, *0xED,FORWARDS3 + BRSET #2, *0xDC,FORWARDS3 + BRSET #3, *0xCB,FORWARDS3 + BRSET #4, *0xBA,FORWARDS3 + BRSET #5, *0xA9,FORWARDS3 + BRSET #6, *0x98,FORWARDS3 + BRSET #7, *0x87,FORWARDS3 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSET nIndex, opr8a_8 is op4_7=1 & nIndex & NthBit & op0_0=0; opr8a_8 + + BSET #0, *0xFE + BSET #1, *0xED + BSET #2, *0xDC + BSET #3, *0xCB + BSET #4, *0xBA + BSET #5, *0xA9 + BSET #6, *0x98 + BSET #7, *0x87 + +FORWARDS3: +BACKWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : BSR REL is op=0xAD; REL + + BSR BACKWARDS4 + BSR FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ opr8a_8, REL is (op=0x31); opr8a_8; REL + + CBEQ *0xFE, BACKWARDS4 + CBEQ *0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQA iopr8i, REL is op=0x41; iopr8i; REL + + CBEQA #0xFE, BACKWARDS4 + CBEQA #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQX iopr8i, REL is op=0x51; iopr8i; REL + + CBEQX #0xFE, BACKWARDS4 + CBEQX #0xFE, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8, X"+", REL is (op=0x61) & X; oprx8; REL + + CBEQ *0xFE, X+, BACKWARDS4 + CBEQ *0xFE, X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ ","X"+", REL is (op=0x71) & X; REL + + CBEQ ,X+, BACKWARDS4 + CBEQ ,X+, FORWARDS4 + + +; @if defined(HCS08) || defined(HC08) +; : CBEQ oprx8_8_SP, REL is (op16=0x9E61); oprx8_8_SP; REL + + CBEQ 0xFE,S, BACKWARDS4 + CBEQ 0xFE,S, FORWARDS4 + + +FORWARDS4: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLC is op=0x98 + + CLC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLI is op=0x9A + + CLI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRA is op=0x4F + + CLRA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLRX is op=0x5F + + CLRX + + +; @if defined(HCS08) || defined(HC08) +; : CLRH is op=0x8C + + CLRH + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CLR OP1 is (op=0x3F | op=0x6F | op=0x7F) ... & OP1 + + CLR *0xFE + CLR 0xFE,X + CLR ,X + + +; @if defined(HCS08) || defined(HC08) +; : CLR oprx8_8_SP is (op16=0x9E6F); oprx8_8_SP + + CLR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CMP OP1 is (op=0xA1 | op=0xB1 | op=0xC1 | op=0xD1 | op=0xE1 | op=0xF1) ... & OP1 + + CMP #0xFE + CMP *0xFE + CMP 0xFEDC + CMP 0xFEDC,X + CMP 0xFE,X + CMP ,X + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx16_8_SP is (op16=0x9ED1); oprx16_8_SP + + CMP 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CMP oprx8_8_SP is (op16=0x9EE1); oprx8_8_SP + + CMP 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMA is op=0x43 + + COMA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COMX is op=0x53 + + COMX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : COM OP1 is (op=0x33 | op=0x63 | op=0x73) ... & OP1 + + COM *0xFE + COM 0xFE,X + COM ,X + + +; @if defined(HCS08) || defined(HC08) +; : COM oprx8_8_SP is (op16=0x9E63); oprx8_8_SP + + COM 0xFE,S + + +; @if defined(HCS08) +; : CPHX opr16a_16 is (op=0x3E); opr16a_16 + + CPHX 0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX iopr16i is (op=0x65); iopr16i + + CPHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : CPHX opr8a_16 is (op=0x75); opr8a_16 + + CPHX *0xFE + + +; @if defined(HCS08) +; : CPHX oprx8_16_SP is (op16=0x9EF3); oprx8_16_SP + + CPHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : CPX OP1 is (op=0xA3 | op=0xB3 | op=0xC3 | op=0xD3 | op=0xE3 | op=0xF3) ... & OP1 + + CPX #0xFE + CPX *0xFE + CPX 0xFEDC + CPX 0xFEDC,X + CPX 0xFE,X + CPX ,X + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx16_8_SP is (op16=0x9ED3); oprx16_8_SP + + CPX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : CPX oprx8_8_SP is (op16=0x9EE3); oprx8_8_SP + + CPX 0xFE,S + +BACKWARDS5: + +; @if defined(HCS08) || defined(HC08) +; : DAA is op=0x72 + + DAA + + +; @if defined(HCS08) || defined(HC08) +; : DBNZA REL is op=0x4B; REL + + DBNZA BACKWARDS5 + DBNZA FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZX REL is op=0x5B; REL + + DBNZX BACKWARDS5 + DBNZX FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ OP1, REL is (op=0x3B | op=0x6B | op=0x7B) ... & OP1; REL + + DBNZ *0xFE, BACKWARDS5 + DBNZ 0xFE,X, BACKWARDS5 + DBNZ ,X, BACKWARDS5 + + DBNZ *0xFE, FORWARDS5 + DBNZ 0xFE,X, FORWARDS5 + DBNZ ,X, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) +; : DBNZ oprx8_8_SP, REL is (op16=0x9E6B); oprx8_8_SP; REL + + DBNZ 0xFE,S, BACKWARDS5 + DBNZ 0xFE,S, FORWARDS5 + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECA is op=0x4A + + DECA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DECX is op=0x5A + + DECX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : DEC OP1 is (op=0x3A | op=0x6A | op=0x7A) ... & OP1 + + DEC *0xFE + DEC 0xFE,X + DEC ,X + + +; @if defined(HCS08) || defined(HC08) +; : DEC oprx8_8_SP is (op16=0x9E6A); oprx8_8_SP + + DEC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : DIV is op=0x52 + + DIV + + +FORWARDS5: + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : EOR OP1 is (op=0xA8 | op=0xB8 | op=0xC8 | op=0xD8 | op=0xE8 | op=0xF8) ... & OP1 + + EOR #0xFE + EOR *0xFE + EOR 0xFEDC + EOR 0xFEDC,X + EOR 0xFE,X + EOR ,X + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx16_8_SP is (op16=0x9ED8); oprx16_8_SP + + EOR 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : EOR oprx8_8_SP is (op16=0x9EE8); oprx8_8_SP + + EOR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCA is op=0x4C + + INCA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INCX is op=0x5C + + INCX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : INC OP1 is (op=0x3C | op=0x6C | op=0x7C) ... & OP1 + + INC *0xFE + INC 0xFE,X + INC ,X + + +; @if defined(HCS08) || defined(HC08) +; : INC oprx8_8_SP is (op16=0x9E6C); oprx8_8_SP + + INC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDR is (op=0xBC | op=0xCC) ... & ADDR + + JMP *LOW_SUB_TEST + JMP HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JMP ADDRI is (op=0xDC | op=0xEC | op=0xFC) ... & ADDRI + + JMP 0xFEDC,X + JMP 0xFE,X + JMP ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDR is (op=0xBD | op=0xCD) ... & ADDR + + JSR *LOW_SUB_TEST + JSR HIGH_SUB_TEST + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : JSR ADDRI is (op=0xDD | op=0xED | op=0xFD) ... & ADDRI + + JSR 0xFEDC,X + JSR 0xFE,X + JSR ,X + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDA OP1 is (op=0xA6 | op=0xB6 | op=0xC6 | op=0xD6 | op=0xE6 | op=0xF6) ... & OP1 + + LDA #0xFE + LDA *0xFE + LDA 0xFEDC + LDA 0xFEDC,X + LDA 0xFE,X + LDA ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx16_8_SP is (op16=0x9ED6); oprx16_8_SP + + LDA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDA oprx8_8_SP is (op16=0x9EE6); oprx8_8_SP + + LDA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : LDHX iopr16i is (op=0x45); iopr16i + + LDHX #0xFEDC + + +; @if defined(HCS08) || defined(HC08) +; : LDHX opr8a_16 is (op=0x55); opr8a_16 + + LDHX *0xFE + + +; @if defined(HCS08) +; : LDHX opr16a_16 is (op=0x32); opr16a_16 + + LDHX 0xFEDC + + +; @if defined(HCS08) +; : LDHX ","X is (op16=0x9EAE) & X + + LDHX ,X + + +; @if defined(HCS08) +; : LDHX oprx16_16_X is (op16=0x9EBE); oprx16_16_X + + LDHX 0xFEDC,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_X is (op16=0x9ECE); oprx8_16_X + + LDHX 0xFE,X + + +; @if defined(HCS08) +; : LDHX oprx8_16_SP is (op16=0x9EFE); oprx8_16_SP + + LDHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LDX OP1 is (op=0xAE | op=0xBE | op=0xCE | op=0xDE | op=0xEE | op=0xFE) ... & OP1 + + LDX #0xFE + LDX *0xFE + LDX 0xFEDC + LDX 0xFEDC,X + LDX 0xFE,X + LDX ,X + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx16_8_SP is (op16=0x9EDE); oprx16_8_SP + + LDX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : LDX oprx8_8_SP is (op16=0x9EEE); oprx8_8_SP + + LDX 0xFE,S + + +; ## Logical Shift left is same as arithmetic shift left +; :LSLA is op=0x48 +; :LSLX is op=0x58 +; :LSL OP1 is (op=0x38 | op=0x68 | op=0x78) ... & OP1 + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRA is op=0x44 + + LSRA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSRX is op=0x54 + + LSRX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : LSR OP1 is (op=0x34 | op=0x64 | op=0x74) ... & OP1 + + LSR *0xFE + LSR 0xFE,X + LSR ,X + + +; @if defined(HCS08) || defined(HC08) +; : LSR oprx8_8_SP is (op16=0x9E64); oprx8_8_SP + + LSR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, op2_opr8a is (op=0x4E); opr8a_8; op2_opr8a + + MOV *0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV opr8a_8, X"+" is (op=0x5E); opr8a_8 & X + + MOV 0xFE, X+ + + +; @if defined(HCS08) || defined(HC08) +; : MOV iopr8i, op2_opr8a is (op=0x6E); iopr8i; op2_opr8a + + MOV #0xFE, *0x97 + + +; @if defined(HCS08) || defined(HC08) +; : MOV ","X"+," op2_opr8a is (op=0x7E) & X; op2_opr8a + + MOV ,X+, *0xFE + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : MUL is op=0x42 + + MUL + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGA is op=0x40 + + NEGA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEGX is op=0x50 + + NEGX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NEG OP1 is (op=0x30 | op=0x60 | op=0x70) ... & OP1 + + NEG *0xFE + NEG 0xFE,X + NEG ,X + + +; @if defined(HCS08) || defined(HC08) +; : NEG oprx8_8_SP is (op16=0x9E60); oprx8_8_SP + + NEG 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : NOP is op = 0x9D + + NOP + + +; @if defined(HCS08) || defined(HC08) +; : NSA is op = 0x62 + + NSA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ORA OP1 is (op=0xAA | op=0xBA | op=0xCA | op=0xDA | op=0xEA | op=0xFA) ... & OP1 + + ORA #0xFE + ORA *0xFE + ORA 0xFEDC + ORA 0xFEDC,X + ORA 0xFE,X + ORA ,X + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx16_8_SP is (op16=0x9EDA); oprx16_8_SP + + ORA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : ORA oprx8_8_SP is (op16=0x9EEA); oprx8_8_SP + + ORA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : PSHA is op = 0x87 + + PSHA + + +; @if defined(HCS08) || defined(HC08) +; : PSHH is op = 0x8B + + PSHH + + +; @if defined(HCS08) || defined(HC08) +; : PSHX is op = 0x89 + + PSHX + + +; @if defined(HCS08) || defined(HC08) +; : PULA is op = 0x86 + + PULA + + +; @if defined(HCS08) || defined(HC08) +; : PULH is op = 0x8A + + PULH + + +; @if defined(HCS08) || defined(HC08) +; : PULX is op = 0x88 + + PULX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLA is op=0x49 + + ROLA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROLX is op=0x59 + + ROLX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROL OP1 is (op=0x39 | op=0x69 | op=0x79) ... & OP1 + + ROL *0xFE + ROL 0xFE,X + ROL ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROL oprx8_8_SP is (op16=0x9E69); oprx8_8_SP + + ROL 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORA is op=0x46 + + RORA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RORX is op=0x56 + + RORX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : ROR OP1 is (op=0x36 | op=0x66 | op=0x76) ... & OP1 + + ROR *0xFE + ROR 0xFE,X + ROR ,X + + +; @if defined(HCS08) || defined(HC08) +; : ROR oprx8_8_SP is (op16=0x9E66); oprx8_8_SP + + ROR 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RSP is op = 0x9C + + RSP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTI is op = 0x80 + + RTI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : RTS is op = 0x81 + + RTS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SBC OP1 is (op=0xA2 | op=0xB2 | op=0xC2 | op=0xD2 | op=0xE2 | op=0xF2) ... & OP1 + + SBC #0xFE + SBC *0xFE + SBC 0xFEDC + SBC 0xFEDC,X + SBC 0xFE,X + SBC ,X + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx16_8_SP is (op16=0x9ED2); oprx16_8_SP + + SBC 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SBC oprx8_8_SP is (op16=0x9EE2); oprx8_8_SP + + SBC 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEC is op = 0x99 + + SEC + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SEI is op = 0x9B + + SEI + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STA OP1 is (op=0xB7 | op=0xC7 | op=0xD7 | op=0xE7 | op=0xF7) ... & OP1 + + STA *0xFE + STA 0xFEDC + STA 0xFEDC,X + STA 0xFE,X + STA ,X + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx16_8_SP is (op16=0x9ED7); oprx16_8_SP + + STA 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STA oprx8_8_SP is (op16=0x9EE7); oprx8_8_SP + + STA 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : STHX opr8a_16 is (op=0x35); opr8a_16 + + STHX *0xFE + + +; @if defined(HCS08) +; : STHX opr16a_16 is (op=0x96); opr16a_16 + + STHX 0xFEDC + + +; @if defined(HCS08) +; : STHX oprx8_16_SP is (op16=0x9EFF); oprx8_16_SP + + STHX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STOP is op=0x8E + + STOP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : STX OP1 is (op=0xBF | op=0xCF | op=0xDF | op=0xEF | op=0xFF) ... & OP1 + + STX *0xFE + STX 0xFEDC + STX 0xFEDC,X + STX 0xFE,X + STX ,X + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx16_8_SP is (op16=0x9EDF); oprx16_8_SP + + STX 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : STX oprx8_8_SP is (op16=0x9EEF); oprx8_8_SP + + STX 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SUB OP1 is (op=0xA0 | op=0xB0 | op=0xC0 | op=0xD0 | op=0xE0 | op=0xF0) ... & OP1 + + SUB #0xFE + SUB *0xFE + SUB 0xFEDC + SUB 0xFEDC,X + SUB 0xFE,X + SUB ,X + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx16_8_SP is (op16=0x9ED0); oprx16_8_SP + + SUB 0xFEDC,S + + +; @if defined(HCS08) || defined(HC08) +; : SUB oprx8_8_SP is (op16=0x9EE0); oprx8_8_SP + + SUB 0xFE,S + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : SWI is op=0x83 + + SWI + + +; @if defined(HCS08) || defined(HC08) +; : TAP is op=0x84 + + TAP + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TAX is op=0x97 + + TAX + + +; @if defined(HCS08) || defined(HC08) +; : TPA is op=0x85 + + TPA + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTA is op=0x4D + + TSTA + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TSTX is op=0x5D + + TSTX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TST OP1 is (op=0x3D | op=0x6D | op=0x7D) ... & OP1 + + TST *0xFE + TST 0xFE,X + TST ,X + + +; @if defined(HCS08) || defined(HC08) +; : TST oprx8_8_SP is (op16=0x9E6D); oprx8_8_SP + + TST 0xFE,S + + +; @if defined(HCS08) || defined(HC08) +; : TSX is op=0x95 + + TSX + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : TXA is op=0x9F + + TXA + + +; @if defined(HCS08) || defined(HC08) +; : TXS is op=0x94 + + TXS + + +; @if defined(HCS08) || defined(HC08) || defined(HC05) +; : WAIT is op=0x8f + + WAIT + + +HERE: + BRA HERE