project struture and wip disasembler
This commit is contained in:
parent
da915feca5
commit
03bc577783
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -178,3 +178,5 @@ tags
|
||||||
# Persistent undo
|
# Persistent undo
|
||||||
[._]*.un~
|
[._]*.un~
|
||||||
|
|
||||||
|
*.html
|
||||||
|
/build
|
1
Makefile.am
Normal file
1
Makefile.am
Normal file
|
@ -0,0 +1 @@
|
||||||
|
SUBDIRS = lib disas vm
|
21
configure.ac
Normal file
21
configure.ac
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
AC_INIT([65oo2], [1.0])
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
||||||
|
|
||||||
|
AC_LANG(C)
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CPP
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
AM_PROG_AR
|
||||||
|
AM_PROG_CC_C_O
|
||||||
|
|
||||||
|
AC_CHECK_INCLUDES_DEFAULT
|
||||||
|
AC_C_CONST
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
Makefile
|
||||||
|
lib/Makefile
|
||||||
|
disas/Makefile
|
||||||
|
vm/Makefile])
|
||||||
|
AC_OUTPUT
|
5
disas/Makefile.am
Normal file
5
disas/Makefile.am
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
bin_PROGRAMS = disas
|
||||||
|
|
||||||
|
disas_SOURCES = main.c
|
||||||
|
disas_CFLAGS =-I$(top_srcdir)
|
||||||
|
disas_LDADD = ../lib/lib65oo2.a
|
196
disas/main.c
Normal file
196
disas/main.c
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "lib/op.h"
|
||||||
|
|
||||||
|
#define OP_ADDR_MODE (OP_ADDR_IMPL | OP_ADDR_REL | OP_ADDR_IND \
|
||||||
|
| OP_ADDR_IMM | OP_ADDR_ABS)
|
||||||
|
|
||||||
|
char *prg_name;
|
||||||
|
FILE *input;
|
||||||
|
FILE *output;
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
readu8(void)
|
||||||
|
{
|
||||||
|
uint8_t val;
|
||||||
|
|
||||||
|
if (fread(&val, 1, 1, input) != 1)
|
||||||
|
{
|
||||||
|
return (-1); /* XXX: TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
readu16(void)
|
||||||
|
{
|
||||||
|
uint16_t val;
|
||||||
|
|
||||||
|
if (fread(&val, 1, 2, input) != 2)
|
||||||
|
{
|
||||||
|
return (-1); /* XXX: TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
readu32(void)
|
||||||
|
{
|
||||||
|
uint32_t val;
|
||||||
|
|
||||||
|
if (fread(&val, 1, 4, input) != 4)
|
||||||
|
{
|
||||||
|
return (-1); /* XXX: TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t
|
||||||
|
read16(void)
|
||||||
|
{
|
||||||
|
int16_t val;
|
||||||
|
|
||||||
|
if (fread(&val, 1, 2, input) != 2)
|
||||||
|
{
|
||||||
|
return (-1); /* XXX: TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t
|
||||||
|
read32(void)
|
||||||
|
{
|
||||||
|
int32_t val;
|
||||||
|
|
||||||
|
if (fread(&val, 1, 4, input) != 4)
|
||||||
|
{
|
||||||
|
return (-1); /* XXX: TODO */
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fatal(const char *str, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
fprintf(stderr, "%s: ", prg_name);
|
||||||
|
va_start(ap, str);
|
||||||
|
vfprintf(stderr, str, ap);
|
||||||
|
va_end(ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
decode_imm(uint8_t opcode)
|
||||||
|
{
|
||||||
|
uint8_t attr;
|
||||||
|
|
||||||
|
attr = readu8();
|
||||||
|
if ((attr & 0x3) == 0x3)
|
||||||
|
{
|
||||||
|
fprintf(output, "???\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(output, "%s.", opcode_str[opcode]);
|
||||||
|
|
||||||
|
switch (attr & 0x3)
|
||||||
|
{
|
||||||
|
case 0x0:
|
||||||
|
fprintf(output, "B #%X\n", readu8());
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
fprintf(output, "W #%hX\n", readu16());
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
fprintf(output, "D #%X\n", readu32());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
decode_ind(uint8_t opcode)
|
||||||
|
{
|
||||||
|
uint8_t attr;
|
||||||
|
|
||||||
|
attr = readu8();
|
||||||
|
(void)attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
decode_abs(uint8_t opcode)
|
||||||
|
{
|
||||||
|
uint8_t attr;
|
||||||
|
|
||||||
|
attr = readu8();
|
||||||
|
(void)attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
decode(void)
|
||||||
|
{
|
||||||
|
uint8_t opcode;
|
||||||
|
int16_t relative;
|
||||||
|
|
||||||
|
do {
|
||||||
|
opcode = readu8();
|
||||||
|
switch (opcode_addr[opcode] & OP_ADDR_MODE)
|
||||||
|
{
|
||||||
|
case OP_ADDR_IMPL:
|
||||||
|
fprintf(output, "%s\n", opcode_str[opcode]);
|
||||||
|
break;
|
||||||
|
case OP_ADDR_REL:
|
||||||
|
relative = read16();
|
||||||
|
fprintf(output, "%s $%hX\n", opcode_str[opcode], relative);
|
||||||
|
break;
|
||||||
|
case OP_ADDR_IMM:
|
||||||
|
decode_imm(opcode);
|
||||||
|
break;
|
||||||
|
case OP_ADDR_IND:
|
||||||
|
decode_ind(opcode);
|
||||||
|
break;
|
||||||
|
case OP_ADDR_ABS:
|
||||||
|
decode_abs(opcode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(output, "???\n", opcode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (!feof(input));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
prg_name = argv[0];
|
||||||
|
input = stdin;
|
||||||
|
output = stdout;
|
||||||
|
|
||||||
|
if (argc > 2)
|
||||||
|
{
|
||||||
|
output = fopen(argv[2], "w");
|
||||||
|
if (output == NULL) fatal("can't open %s.", argv[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
input = fopen(argv[1], "rb");
|
||||||
|
if (input == NULL) fatal("can't open %s.", argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
decode();
|
||||||
|
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
99
doc/isa.org
Normal file
99
doc/isa.org
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
#+title: 65∞2 Instruction Set Architecture
|
||||||
|
#+author: d0p1
|
||||||
|
|
||||||
|
** Registers
|
||||||
|
|
||||||
|
- PC :: Program counter (32bit)
|
||||||
|
- AC :: Accumulator (32bit)
|
||||||
|
- X :: X register (32bit)
|
||||||
|
- Y :: Y register (32bit)
|
||||||
|
- SR :: status register (32bit)
|
||||||
|
- SP :: stack pointer (32bit)
|
||||||
|
|
||||||
|
Status register flags
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
31 0
|
||||||
|
+------ .... ----+-+-+-+-+-+-+-+-+
|
||||||
|
| |N|V| |B|D|I|Z|C|
|
||||||
|
+------ .... ----+-+-+-+-+-+-+-+-+
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
- N :: Negative
|
||||||
|
The negative flag (N) indicates the presence of a set sign bit in bit-position 31.
|
||||||
|
- V :: Overflow
|
||||||
|
The overflow flag (V) indicates overflow with signed binary arithmetics.
|
||||||
|
- B :: Break
|
||||||
|
- D :: Decimal
|
||||||
|
- I :: Interrupt
|
||||||
|
- Z :: Zero
|
||||||
|
The zero flag (Z) indicates a value of all zero bits.
|
||||||
|
- C :: Carry
|
||||||
|
|
||||||
|
** Addressing Modes
|
||||||
|
|
||||||
|
*** Implied Addressing
|
||||||
|
|
||||||
|
*** Immediate Addressing
|
||||||
|
|
||||||
|
A size and a literal operand is given immediately after the instruction.
|
||||||
|
|
||||||
|
#+begin_src asm
|
||||||
|
LDA.B #7
|
||||||
|
LDA.W #300
|
||||||
|
LDA.D #$DEADBEEF
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
*** Absolute Addressing
|
||||||
|
|
||||||
|
** Opcodes
|
||||||
|
|
||||||
|
#+begin_src
|
||||||
|
+----+----------+-----------+-------+----+-----------+-----------+-----------+----+----------+-----------+----------+----+-----------+-----------+-----------+----+
|
||||||
|
| | -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F |
|
||||||
|
+----+----------+-----------+-------+----+-----------+-----------+-----------+----+----------+-----------+----------+----+-----------+-----------+-----------+----+
|
||||||
|
| 0- | BRK impl | ORA X,ind | | | | ORA zpg | ASL zpg | | PHP impl | ORA # | ASL A | | | ORA abs | ASL abs | |
|
||||||
|
| 1- | BPL rel | ORA ind,Y | | | | ORA zpg,X | ASL zpg,X | | CLC impl | ORA abs,Y | | | | ORA abs,X | ASL abs,X | |
|
||||||
|
| 2- | JSR abs | AND X,ind | | | BIT zpg | AND zpg | ROL zpg | | PLP impl | AND # | ROL A | | BIT abs | AND abs | ROL abs | |
|
||||||
|
| 3- | BMI rel | AND ind,Y | | | | AND zpg,X | ROL zpg,X | | SEC impl | AND abs,Y | | | | AND abs,X | ROL abs,X | |
|
||||||
|
| 4- | RTI impl | EOR X,ind | | | | EOR zpg | LSR zpg | | PHA impl | EOR # | LSR A | | JMP abs | EOR abs | LSR abs | |
|
||||||
|
| 5- | BVC rel | EOR ind,Y | | | | EOR zpg,X | LSR zpg,X | | CLI impl | EOR abs,Y | | | | EOR abs,X | LSR abs,X | |
|
||||||
|
| 6- | RTS impl | ADC X,ind | | | | ADC zpg | ROR zpg | | PLA impl | ADC # | ROR A | | JMP ind | ADC abs | ROR abs | |
|
||||||
|
| 7- | BVS rel | ADC ind,Y | | | | ADC zpg,X | ROR zpg,X | | SEI impl | ADC abs,Y | | | | ADC abs,X | ROR abs,X | |
|
||||||
|
| 8- | | STA X,ind | | | STY zpg | STA zpg | STX zpg | | DEY impl | | TXA impl | | STY abs | STA abs | STX abs | |
|
||||||
|
| 9- | BCC rel | STA ind,Y | | | STY zpg,X | STA zpg,X | STX zpg,Y | | TYA impl | STA abs,Y | TXS impl | | | STA abs,X | | |
|
||||||
|
| A- | LDY # | LDA X,ind | LDX # | | LDY zpg | LDA zpg | LDX zpg | | TAY impl | LDA # | TAX impl | | LDY abs | LDA abs | LDX abs | |
|
||||||
|
| B- | BCS rel | LDA ind,Y | | | LDY zpg,X | LDA zpg,X | LDX zpg,Y | | CLV impl | LDA abs,Y | TSX impl | | LDY abs,X | LDA abs,X | LDX abs,Y | |
|
||||||
|
| C- | CPY # | CMP X,ind | | | CPY zpg | CMP zpg | DEC zpg | | INY impl | CMP # | DEX impl | | CPY abs | CMP abs | DEC abs | |
|
||||||
|
| D- | BNE rel | CMP ind,Y | | | | CMP zpg,X | DEC zpg,X | | CLD impl | CMP abs,Y | | | | CMP abs,X | DEC abs,X | |
|
||||||
|
| E- | CPX # | SBC X,ind | | | CPX zpg | SBC zpg | INC zpg | | INX impl | SBC # | NOP impl | | CPX abs | SBC abs | INC abs | |
|
||||||
|
| F- | BEQ rel | SBC ind,Y | | | | SBC zpg,X | INC zpg,X | | SED impl | SBC abs,Y | | | | SBC abs,X | INC abs,X | |
|
||||||
|
+----+----------+-----------+-------+----+-----------+-----------+-----------+----+----------+-----------+----------+----+-----------+-----------+-----------+----+
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Instruction encoding
|
||||||
|
|
||||||
|
| 0-7 |
|
||||||
|
|--------|
|
||||||
|
| opcode |
|
||||||
|
|
||||||
|
| 0-7 | 8-21 |
|
||||||
|
|--------|---------------|
|
||||||
|
| opcode | relative addr |
|
||||||
|
|
||||||
|
| 0-7 | 8-15 | 16-X |
|
||||||
|
|--------|------|-------|
|
||||||
|
| opcode | attr | value |
|
||||||
|
|
||||||
|
* Instruction Set
|
||||||
|
|
||||||
|
| OP | ATTR | IMM | Size | Note |
|
||||||
|
|----|------|----------|------|-------------------------------------|
|
||||||
|
| 00 | | | 1 | Break |
|
||||||
|
| 01 | | XXXX | 3 | Or with accumulator |
|
||||||
|
| 08 | | | 1 | Push processor status |
|
||||||
|
| 09 | 01 | XX | 3 | Or with accumulator |
|
||||||
|
| 09 | 02 | XXXX | 4 | Or with accumulator |
|
||||||
|
| 09 | 03 | XXXXXXXX | 6 | Or with accumulator |
|
||||||
|
| 0A | | | 1 | Shift Left One Bit with accumulator |
|
||||||
|
| 10 | | XXXX | 3 | Branch on plus |
|
3
lib/Makefile.am
Normal file
3
lib/Makefile.am
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
noinst_LIBRARIES = lib65oo2.a
|
||||||
|
|
||||||
|
lib65oo2_a_SOURCES = op.c
|
310
lib/op.c
Normal file
310
lib/op.c
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
#include "op.h"
|
||||||
|
|
||||||
|
const uint8_t opcode_addr[OP_MAX] = {
|
||||||
|
/* 0- */
|
||||||
|
/* BRK */ OP_ADDR_IMPL,
|
||||||
|
/* ORA */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ORA */ 0xFF,
|
||||||
|
/* ASL */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* PHP */ OP_ADDR_IMPL,
|
||||||
|
/* ORA */ OP_ADDR_IMM,
|
||||||
|
/* ASL */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ORA */ OP_ADDR_ABS,
|
||||||
|
/* ASL */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 1- */
|
||||||
|
/* BPL */ OP_ADDR_REL,
|
||||||
|
/* ORA */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ORA */ 0xFF,
|
||||||
|
/* ASL */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CLC */ OP_ADDR_IMPL,
|
||||||
|
/* ORA */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ORA */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* ASL */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 2- */
|
||||||
|
/* JSR */ OP_ADDR_ABS,
|
||||||
|
/* AND */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* BIT */ 0xFF,
|
||||||
|
/* AND */ 0xFF,
|
||||||
|
/* ROL */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* PLP */ OP_ADDR_IMPL,
|
||||||
|
/* AND */ OP_ADDR_IMM,
|
||||||
|
/* ROL */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* BIT */ OP_ADDR_ABS,
|
||||||
|
/* AND */ OP_ADDR_ABS,
|
||||||
|
/* ROL */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 3- */
|
||||||
|
/* BMI */ OP_ADDR_REL,
|
||||||
|
/* AND */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* AND */ 0xFF,
|
||||||
|
/* ROL */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* SEC */ OP_ADDR_IMPL,
|
||||||
|
/* AND */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* AND */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* ROL */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 4- */
|
||||||
|
/* RTI */ OP_ADDR_IMPL,
|
||||||
|
/* EOR */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* EOR */ 0xFF,
|
||||||
|
/* LSR */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* PHA */ OP_ADDR_IMPL,
|
||||||
|
/* EOR */ OP_ADDR_IMM,
|
||||||
|
/* LSR */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* JMP */ OP_ADDR_ABS,
|
||||||
|
/* EOR */ OP_ADDR_ABS,
|
||||||
|
/* LSR */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 5- */
|
||||||
|
/* BVC */ OP_ADDR_REL,
|
||||||
|
/* EOR */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* EOR */ 0xFF,
|
||||||
|
/* LSR */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CLI */ OP_ADDR_IMPL,
|
||||||
|
/* EOR */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* EOR */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* LSR */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 6- */
|
||||||
|
/* RTS */ OP_ADDR_IMPL,
|
||||||
|
/* ADC */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ADC */ 0xFF,
|
||||||
|
/* ROR */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* PLA */ OP_ADDR_IMPL,
|
||||||
|
/* ADC */ OP_ADDR_IMM,
|
||||||
|
/* ROR */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* JMP */ OP_ADDR_IND,
|
||||||
|
/* ADC */ OP_ADDR_ABS,
|
||||||
|
/* ROR */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 7- */
|
||||||
|
/* BVS */ OP_ADDR_REL,
|
||||||
|
/* ADC */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ADC */ 0xFF,
|
||||||
|
/* ROR */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* SEI */ OP_ADDR_IMPL,
|
||||||
|
/* ADC */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* ADC */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* ROR */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 8- */
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* STA */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* STY */ 0xFF,
|
||||||
|
/* STA */ 0xFF,
|
||||||
|
/* STX */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* DEY */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* TXA */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* STY */ OP_ADDR_ABS,
|
||||||
|
/* STA */ OP_ADDR_ABS,
|
||||||
|
/* STX */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* 9- */
|
||||||
|
/* BCC */ OP_ADDR_REL,
|
||||||
|
/* STA */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* STY */ 0xFF,
|
||||||
|
/* STA */ 0xFF,
|
||||||
|
/* STX */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* TYA */ OP_ADDR_IMPL,
|
||||||
|
/* STA */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* TXS */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* STA */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* A- */
|
||||||
|
/* LDY */ OP_ADDR_IMM,
|
||||||
|
/* LDA */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* LDX */ OP_ADDR_IMM,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* LDY */ 0xFF,
|
||||||
|
/* LDA */ 0xFF,
|
||||||
|
/* LDX */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* TAY */ OP_ADDR_IMPL,
|
||||||
|
/* LDA */ OP_ADDR_IMM,
|
||||||
|
/* TAX */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* LDY */ OP_ADDR_ABS,
|
||||||
|
/* LDA */ OP_ADDR_ABS,
|
||||||
|
/* LDX */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* B- */
|
||||||
|
/* BCS */ OP_ADDR_REL,
|
||||||
|
/* LDA */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* LDY */ 0xFF,
|
||||||
|
/* LDA */ 0xFF,
|
||||||
|
/* LDX */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CLV */ OP_ADDR_IMPL,
|
||||||
|
/* LDA */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* TSX */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* LDY */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* LDA */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* LDX */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* C- */
|
||||||
|
/* CPY */ OP_ADDR_IMM,
|
||||||
|
/* CMP */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CPY */ 0xFF,
|
||||||
|
/* CMP */ 0xFF,
|
||||||
|
/* DEC */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* INY */ OP_ADDR_IMPL,
|
||||||
|
/* CMP */ OP_ADDR_IMM,
|
||||||
|
/* DEX */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CPY */ OP_ADDR_ABS,
|
||||||
|
/* CMP */ OP_ADDR_ABS,
|
||||||
|
/* DEC */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* D- */
|
||||||
|
/* BNE */ OP_ADDR_REL,
|
||||||
|
/* CMP */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CMP */ 0xFF,
|
||||||
|
/* DEC */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CLD */ OP_ADDR_IMPL,
|
||||||
|
/* CMP */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CMP */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* DEC */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* E- */
|
||||||
|
/* CPX */ OP_ADDR_IMM,
|
||||||
|
/* SBC */ OP_ADDR_IND | OP_ADDR_X,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CPX */ 0xFF,
|
||||||
|
/* SBC */ 0xFF,
|
||||||
|
/* INC */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* INX */ OP_ADDR_IMPL,
|
||||||
|
/* SBC */ OP_ADDR_IMM,
|
||||||
|
/* NOP */ OP_ADDR_IMPL,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* CPX */ OP_ADDR_ABS,
|
||||||
|
/* SBC */ OP_ADDR_ABS,
|
||||||
|
/* INC */ OP_ADDR_ABS,
|
||||||
|
/* */ 0xFF,
|
||||||
|
|
||||||
|
/* F- */
|
||||||
|
/* BEQ */ OP_ADDR_REL,
|
||||||
|
/* SBC */ OP_ADDR_IND | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* SBC */ 0xFF,
|
||||||
|
/* INC */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* SED */ OP_ADDR_IMPL,
|
||||||
|
/* SBC */ OP_ADDR_ABS | OP_ADDR_Y,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* */ 0xFF,
|
||||||
|
/* SBC */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* INC */ OP_ADDR_ABS | OP_ADDR_X,
|
||||||
|
/* */ 0xFF
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *opcode_str[OP_MAX] = {
|
||||||
|
"BRK", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL, "PHP", "ORA", "ASLA", NULL, NULL, "ORA", "ASL", NULL,
|
||||||
|
"BPL", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL, "CLC", "ORA", NULL, NULL, NULL, "ORA", "ASL", NULL,
|
||||||
|
"JSR", "AND", NULL, NULL, "BIT", "AND", "ROL", NULL, "PLP", "AND", "ROLA", NULL, "BIT", "AND", "ROL", NULL,
|
||||||
|
"BMI", "AND", NULL, NULL, NULL, "AND", "ROL", NULL, "SEC", "AND", NULL, NULL, NULL, "AND", "ROL", NULL,
|
||||||
|
"RTI", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL, "PHA", "EOR", "LSRA", NULL, "JMP", "EOR", "LSR", NULL,
|
||||||
|
"BVC", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL, "CLI", "EOR", NULL, NULL, NULL, "EOR", "LSR", NULL,
|
||||||
|
"RTS", "ADC", NULL, NULL, NULL, "ADC", "ROR", NULL, "PLA", "ADC", "RORA", NULL, "JMP", "ADC", "ROR", NULL,
|
||||||
|
"BVS", "ADC", NULL, NULL, NULL, "ADC", "ROR", NULL, "SEI", "ADC", NULL, NULL, NULL, "ADC", "ROR", NULL,
|
||||||
|
NULL, "STA", NULL, NULL, "STY", "STA", "STX", NULL, "DEY", NULL, "TXA", NULL, "STY", "STA", "STX", NULL,
|
||||||
|
"BCC", "STA", NULL, NULL, "STY", "STA", "STX", NULL, "TYA", "STA", "TXS", NULL, NULL, "STA", NULL, NULL,
|
||||||
|
"LDY", "LDA", "LDX", NULL, "LDY", "LDA", "LDX", NULL, "TAY", "LDA", "TAX", NULL, "LDY", "LDA", "LDX", NULL,
|
||||||
|
"BCS", "LDA", NULL, NULL, "LDY", "LDA", "LDX", NULL, "CLV", "LDA", "TSX", NULL, "LDY", "LDA", "LDX", NULL,
|
||||||
|
"CPY", "CMP", NULL, NULL, "CPY", "CMP", "DEC", NULL, "INY", "CMP", "DEX", NULL, "CPY", "CMP", "DEC", NULL,
|
||||||
|
"BNE", "CMP", NULL, NULL, NULL, "CMP", "DEC", NULL, "CLD", "CMP", NULL, NULL, NULL, "CMP", "DEC", NULL,
|
||||||
|
"CPX", "SBC", NULL, NULL, "CPX", "SBC", "INC", NULL, "INX", "SBC", "NOP", NULL, "CPX", "SBC", "INC", NULL,
|
||||||
|
"BEQ", "SBC", NULL, NULL, NULL, "SBC", "INC", NULL, "SED", "SBC", NULL, NULL, NULL, "SBC", "INC", NULL
|
||||||
|
};
|
19
lib/op.h
Normal file
19
lib/op.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef OP_H
|
||||||
|
# define OP_H 1
|
||||||
|
|
||||||
|
# include <stdint.h>
|
||||||
|
|
||||||
|
# define OP_MAX 256
|
||||||
|
|
||||||
|
# define OP_ADDR_IMPL 0
|
||||||
|
# define OP_ADDR_REL 1 << 0
|
||||||
|
# define OP_ADDR_IMM 1 << 1
|
||||||
|
# define OP_ADDR_IND 1 << 2
|
||||||
|
# define OP_ADDR_ABS 1 << 3
|
||||||
|
# define OP_ADDR_X 1 << 4
|
||||||
|
# define OP_ADDR_Y 1 << 5
|
||||||
|
|
||||||
|
extern const uint8_t opcode_addr[];
|
||||||
|
extern const char *opcode_str[];
|
||||||
|
|
||||||
|
#endif /* !OP_H */
|
0
vm/Makefile.am
Normal file
0
vm/Makefile.am
Normal file
Loading…
Reference in a new issue