1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-19 06:31:31 +00:00

Added 6502 illegal instructions

git-svn-id: svn://svn.cc65.org/cc65/trunk@3022 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2004-05-11 20:32:36 +00:00
parent 86960297c3
commit 19b9305f02
2 changed files with 51 additions and 16 deletions

View File

@ -309,6 +309,8 @@ The assembler accepts
<itemize> <itemize>
<item>all valid 6502 mnemonics when in 6502 mode (the default or after the <item>all valid 6502 mnemonics when in 6502 mode (the default or after the
<tt><ref id=".P02" name=".P02"></tt> command was given). <tt><ref id=".P02" name=".P02"></tt> command was given).
<item>all valid 6502 mnemonics plus a set of illegal instructions when in
<ref id="6502X-mode" name="6502X mode">.
<item>all valid 65SC02 mnemonics when in 65SC02 mode (after the <item>all valid 65SC02 mnemonics when in 65SC02 mode (after the
<tt><ref id=".PSC02" name=".PSC02"></tt> command was given). <tt><ref id=".PSC02" name=".PSC02"></tt> command was given).
<item>all valid 65C02 mnemonics when in 65C02 mode (after the <item>all valid 65C02 mnemonics when in 65C02 mode (after the
@ -338,17 +340,36 @@ mnemonics:
TSA is an alias for TSC TSA is an alias for TSC
</verb></tscreen> </verb></tscreen>
Evaluation of banked expressions in 65816 mode differs slightly from the
official syntax:
Instead of accepting a 24 bit address (something that is difficult for
the assembler to determine and would have required one more special
.import command), the bank and the absolute address in that bank are
separated by a dot:
<tscreen><verb> <sect1>6502X mode<label id="6502X-mode"><p>
jsl 3.$1234 ; Call subroutine at $1234 in bank 3
</verb></tscreen> 6502X mode is an extension to the normal 6502 mode. In this mode, several
mnemomics for illegal instructions of the NMOS 6502 CPUs are accepted. Since
these instructions are illegal, there are no official mnemonics for them. The
unofficial ones are taken from <htmlurl
url="http://oxyron.net/graham/opcodes02.html"
name="http://oxyron.net/graham/opcodes02.html">. Please note that only the
ones marked as "stable" are supported. The following table uses information
from the mentioned web page, for more information, see there.
<itemize>
<item><tt>ALR: A:=(A and #{imm})*2;</tt>
<item><tt>ANC: A:=A and #{imm};</tt> Generates opcode &dollar;0B.
<item><tt>ARR: A:=(A and #{imm})/2;</tt>
<item><tt>AXS: X:=A and X-#{imm};</tt>
<item><tt>DCP: {adr}:={adr}-1; A-{adr};</tt>
<item><tt>ISC: {adr}:={adr}+1; A:=A-{adr};</tt>
<item><tt>LAS: A,X,S:={adr} and S;</tt>
<item><tt>LAX: A,X:={adr};</tt>
<item><tt>RLA: {adr}:={adr}rol; A:=A and {adr};</tt>
<item><tt>RRA: {adr}:={adr}ror; A:=A adc {adr};</tt>
<item><tt>SAX: {adr}:=A and X;</tt>
<item><tt>SLO: {adr}:={adr}*2; A:=A or {adr};</tt>
<item><tt>SRE: {adr}:={adr}/2; A:=A xor {adr};</tt>
</itemize>
<sect1>Number format<p> <sect1>Number format<p>
@ -2955,9 +2976,10 @@ Here's a list of all control commands and a description, what they do:
Switch the CPU instruction set. The command is followed by a string that Switch the CPU instruction set. The command is followed by a string that
specifies the CPU. Possible values are those that can also be supplied to specifies the CPU. Possible values are those that can also be supplied to
the <tt><ref id="option--cpu" name="--cpu"></tt> command line option, the <tt><ref id="option--cpu" name="--cpu"></tt> command line option,
namely: 6502, 65SC02, 65C02, 65816 and sunplus. Please note that support namely: 6502, 6502X, 65SC02, 65C02, 65816 and sunplus. Please note that
for the sunplus CPU is not available in the freeware version, because the support for the sunplus CPU is not available in the freeware version,
instruction set of the sunplus CPU is "proprietary and confidential". because the instruction set of the sunplus CPU is "proprietary and
confidential".
See: <tt><ref id=".CPU" name=".CPU"></tt>, See: <tt><ref id=".CPU" name=".CPU"></tt>,
<tt><ref id=".IFP02" name=".IFP02"></tt>, <tt><ref id=".IFP02" name=".IFP02"></tt>,

View File

@ -147,7 +147,7 @@ static const struct {
}; };
/* Instruction table for the 6502 with illegal instructions */ /* Instruction table for the 6502 with illegal instructions */
#define INS_COUNT_6502X 57 #define INS_COUNT_6502X 70
static const struct { static const struct {
unsigned Count; unsigned Count;
InsDesc Ins[INS_COUNT_6502X]; InsDesc Ins[INS_COUNT_6502X];
@ -155,8 +155,12 @@ static const struct {
INS_COUNT_6502X, INS_COUNT_6502X,
{ {
{ "ADC", 0x080A26C, 0x60, 0, PutAll }, { "ADC", 0x080A26C, 0x60, 0, PutAll },
{ "ALR", 0x0800000, 0x4B, 0, PutAll }, /* X */
{ "ANC", 0x0800000, 0x0B, 0, PutAll }, /* X */
{ "AND", 0x080A26C, 0x20, 0, PutAll }, { "AND", 0x080A26C, 0x20, 0, PutAll },
{ "ARR", 0x0800000, 0x6B, 0, PutAll }, /* X */
{ "ASL", 0x000006e, 0x02, 1, PutAll }, { "ASL", 0x000006e, 0x02, 1, PutAll },
{ "AXS", 0x0800000, 0xCB, 0, PutAll }, /* X */
{ "BCC", 0x0020000, 0x90, 0, PutPCRel8 }, { "BCC", 0x0020000, 0x90, 0, PutPCRel8 },
{ "BCS", 0x0020000, 0xb0, 0, PutPCRel8 }, { "BCS", 0x0020000, 0xb0, 0, PutPCRel8 },
{ "BEQ", 0x0020000, 0xf0, 0, PutPCRel8 }, { "BEQ", 0x0020000, 0xf0, 0, PutPCRel8 },
@ -174,6 +178,7 @@ static const struct {
{ "CMP", 0x080A26C, 0xc0, 0, PutAll }, { "CMP", 0x080A26C, 0xc0, 0, PutAll },
{ "CPX", 0x080000C, 0xe0, 1, PutAll }, { "CPX", 0x080000C, 0xe0, 1, PutAll },
{ "CPY", 0x080000C, 0xc0, 1, PutAll }, { "CPY", 0x080000C, 0xc0, 1, PutAll },
{ "DCP", 0x000A26C, 0xC3, 0, PutAll }, /* X */
{ "DEC", 0x000006C, 0x00, 3, PutAll }, { "DEC", 0x000006C, 0x00, 3, PutAll },
{ "DEX", 0x0000001, 0xca, 0, PutAll }, { "DEX", 0x0000001, 0xca, 0, PutAll },
{ "DEY", 0x0000001, 0x88, 0, PutAll }, { "DEY", 0x0000001, 0x88, 0, PutAll },
@ -181,9 +186,12 @@ static const struct {
{ "INC", 0x000006c, 0x00, 4, PutAll }, { "INC", 0x000006c, 0x00, 4, PutAll },
{ "INX", 0x0000001, 0xe8, 0, PutAll }, { "INX", 0x0000001, 0xe8, 0, PutAll },
{ "INY", 0x0000001, 0xc8, 0, PutAll }, { "INY", 0x0000001, 0xc8, 0, PutAll },
{ "ISC", 0x000A26C, 0xE3, 0, PutAll }, /* X */
{ "JAM", 0x0000001, 0x02, 0, PutAll }, /* X */ { "JAM", 0x0000001, 0x02, 0, PutAll }, /* X */
{ "JMP", 0x0000808, 0x4c, 6, PutJMP }, { "JMP", 0x0000808, 0x4c, 6, PutJMP },
{ "JSR", 0x0000008, 0x20, 7, PutAll }, { "JSR", 0x0000008, 0x20, 7, PutAll },
{ "LAS", 0x0000200, 0xBB, 0, PutAll }, /* X */
{ "LAX", 0x000A30C, 0xA3, 1, PutAll }, /* X */
{ "LDA", 0x080A26C, 0xa0, 0, PutAll }, { "LDA", 0x080A26C, 0xa0, 0, PutAll },
{ "LDX", 0x080030C, 0xa2, 1, PutAll }, { "LDX", 0x080030C, 0xa2, 1, PutAll },
{ "LDY", 0x080006C, 0xa0, 1, PutAll }, { "LDY", 0x080006C, 0xa0, 1, PutAll },
@ -194,14 +202,19 @@ static const struct {
{ "PHP", 0x0000001, 0x08, 0, PutAll }, { "PHP", 0x0000001, 0x08, 0, PutAll },
{ "PLA", 0x0000001, 0x68, 0, PutAll }, { "PLA", 0x0000001, 0x68, 0, PutAll },
{ "PLP", 0x0000001, 0x28, 0, PutAll }, { "PLP", 0x0000001, 0x28, 0, PutAll },
{ "RLA", 0x000A26C, 0x23, 0, PutAll }, /* X */
{ "ROL", 0x000006F, 0x22, 1, PutAll }, { "ROL", 0x000006F, 0x22, 1, PutAll },
{ "ROR", 0x000006F, 0x62, 1, PutAll }, { "ROR", 0x000006F, 0x62, 1, PutAll },
{ "RRA", 0x000A26C, 0x63, 0, PutAll }, /* X */
{ "RTI", 0x0000001, 0x40, 0, PutAll }, { "RTI", 0x0000001, 0x40, 0, PutAll },
{ "RTS", 0x0000001, 0x60, 0, PutAll }, { "RTS", 0x0000001, 0x60, 0, PutAll },
{ "SAX", 0x000810C, 0x83, 1, PutAll }, /* X */
{ "SBC", 0x080A26C, 0xe0, 0, PutAll }, { "SBC", 0x080A26C, 0xe0, 0, PutAll },
{ "SEC", 0x0000001, 0x38, 0, PutAll }, { "SEC", 0x0000001, 0x38, 0, PutAll },
{ "SED", 0x0000001, 0xf8, 0, PutAll }, { "SED", 0x0000001, 0xf8, 0, PutAll },
{ "SEI", 0x0000001, 0x78, 0, PutAll }, { "SEI", 0x0000001, 0x78, 0, PutAll },
{ "SLO", 0x000A26C, 0x03, 0, PutAll }, /* X */
{ "SRE", 0x000A26C, 0x43, 0, PutAll }, /* X */
{ "STA", 0x000A26C, 0x80, 0, PutAll }, { "STA", 0x000A26C, 0x80, 0, PutAll },
{ "STX", 0x000010c, 0x82, 1, PutAll }, { "STX", 0x000010c, 0x82, 1, PutAll },
{ "STY", 0x000002c, 0x80, 1, PutAll }, { "STY", 0x000002c, 0x80, 1, PutAll },
@ -406,7 +419,7 @@ static const struct {
unsigned Count; unsigned Count;
InsDesc Ins[INS_COUNT_65816]; InsDesc Ins[INS_COUNT_65816];
} InsTab65816 = { } InsTab65816 = {
INS_COUNT_65816, INS_COUNT_65816,
{ {
{ "ADC", 0x0b8f6fc, 0x60, 0, PutAll }, { "ADC", 0x0b8f6fc, 0x60, 0, PutAll },
{ "AND", 0x0b8f6fc, 0x20, 0, PutAll }, { "AND", 0x0b8f6fc, 0x20, 0, PutAll },
@ -544,7 +557,7 @@ unsigned char EATab [9][AMI_COUNT] = {
}, },
{ /* Table 1 */ { /* Table 1 */
0x08, 0x08, 0x04, 0x0C, 0x00, 0x14, 0x1C, 0x00, 0x08, 0x08, 0x04, 0x0C, 0x00, 0x14, 0x1C, 0x00,
0x14, 0x1C, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x14, 0x1C, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00 0x00
}, },
@ -552,7 +565,7 @@ unsigned char EATab [9][AMI_COUNT] = {
0x00, 0x00, 0x24, 0x2C, 0x0F, 0x34, 0x3C, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0F, 0x34, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00,
0x00 0x00
}, },
{ /* Table 3 */ { /* Table 3 */
0x3A, 0x3A, 0xC6, 0xCE, 0x00, 0xD6, 0xDE, 0x00, 0x3A, 0x3A, 0xC6, 0xCE, 0x00, 0xD6, 0xDE, 0x00,