123 lines
8.9 KiB
C++
123 lines
8.9 KiB
C++
|
|
#include "m7700.hpp"
|
|
|
|
const instruc_t Instructions[] =
|
|
{
|
|
// 7700 :
|
|
|
|
{ "", 0 }, // null instruction
|
|
{ "adc", CF_USE1 }, // addition with carry
|
|
{ "and", CF_USE1 }, // logical AND
|
|
{ "asl", CF_USE1|CF_CHG1 }, // arithmetic shift left
|
|
{ "bbc", CF_USE1|CF_USE2|CF_USE3 }, // branch on bit clear
|
|
{ "bbs", CF_USE1|CF_USE2|CF_USE3 }, // branch on bit set
|
|
{ "bcc", CF_USE1 }, // branch on carry clear
|
|
{ "bcs", CF_USE1 }, // branch on carry set
|
|
{ "beq", CF_USE1 }, // branch on equal
|
|
{ "bmi", CF_USE1 }, // branch on result minus
|
|
{ "bne", CF_USE1 }, // branch on not equal
|
|
{ "bpl", CF_USE1 }, // branch on result plus
|
|
{ "bra", CF_USE1 }, // branch always
|
|
{ "brk", 0 }, // force break
|
|
{ "bvc", CF_USE1 }, // branch on overflow clear
|
|
{ "bvs", CF_USE1 }, // branch on overflow set
|
|
{ "clb", CF_USE1|CF_USE2|CF_CHG2 }, // clear bit
|
|
{ "clc", 0 }, // clear carry flag
|
|
{ "cli", 0 }, // clear interrupt disable status
|
|
{ "clm", 0 }, // clear m flag
|
|
{ "clp", CF_USE1 }, // clear processor status
|
|
{ "clv", 0 }, // clear overflow flag
|
|
{ "cmp", CF_USE1|CF_USE2 }, // compare
|
|
{ "cpx", CF_USE1 }, // compare memory and index register X
|
|
{ "cpy", CF_USE1 }, // compare memory and index register Y
|
|
{ "dec", CF_USE1|CF_CHG1 }, // decrement by one
|
|
{ "dex", 0 }, // decrement index register X by one
|
|
{ "dey", 0 }, // decrement index register Y by one
|
|
{ "div", CF_USE1 }, // divide
|
|
{ "eor", CF_USE1|CF_CHG1|CF_USE2 }, // exclusive OR memory with accumulator
|
|
{ "inc", CF_USE1|CF_CHG1 }, // increment by one
|
|
{ "inx", 0 }, // increment index register X by one
|
|
{ "iny", 0 }, // increment index register Y by one
|
|
{ "jmp", CF_USE1 }, // jump
|
|
{ "jsr", CF_USE1|CF_CALL }, // jump to subroutine
|
|
{ "lda", CF_USE1|CF_CHG1|CF_USE2 }, // load accumulator from memory
|
|
{ "ldm", CF_USE1|CF_CHG2 }, // load immediate to memory
|
|
{ "ldt", CF_USE1 }, // load immediate to data bank register
|
|
{ "ldx", CF_USE1 }, // load index register X from memory
|
|
{ "ldy", CF_USE1 }, // load index register Y from memory
|
|
{ "lsr", CF_USE1|CF_CHG1 }, // logical shift right
|
|
{ "mpy", CF_USE1 }, // multiply
|
|
{ "mvn", CF_USE2|CF_CHG1 }, // move negative
|
|
{ "mvp", CF_USE2|CF_CHG1 }, // move positive
|
|
{ "nop", 0 }, // no operation
|
|
{ "ora", CF_USE1|CF_CHG1|CF_USE2 }, // OR memory with accumulator
|
|
{ "pea", CF_USE1 }, // push effective address
|
|
{ "pei", CF_USE1 }, // push effective indirect address
|
|
{ "per", CF_USE1 }, // push effective program counter relative address
|
|
{ "pha", 0 }, // push accumulator A on stack
|
|
{ "phb", 0 }, // push accumulator B on stack
|
|
{ "phd", 0 }, // push direct page register on stack
|
|
{ "phg", 0 }, // push program bank register on stack
|
|
{ "php", 0 }, // push processor status on stack
|
|
{ "pht", 0 }, // push data bank register on stack
|
|
{ "phx", 0 }, // push index register X on stack
|
|
{ "phy", 0 }, // push index register Y on stack
|
|
{ "pla", 0 }, // pull accumulator A from stack
|
|
{ "plb", 0 }, // pull accumulator B from stack
|
|
{ "pld", 0 }, // pull direct page register from stack
|
|
{ "plp", 0 }, // pull processor status from stack
|
|
{ "plt", 0 }, // pull data bank register from stack
|
|
{ "plx", 0 }, // pull index register X from stack
|
|
{ "ply", 0 }, // pull index register Y from stack
|
|
{ "psh", CF_USE1 }, // push
|
|
{ "pul", CF_USE1 }, // pull
|
|
{ "rla", CF_USE1 }, // rotate left accumulator A
|
|
{ "rol", CF_USE2|CF_CHG1 }, // rotate one bit left
|
|
{ "ror", CF_USE2|CF_CHG1 }, // rotate one bit right
|
|
{ "rti", CF_STOP }, // return from interrupt
|
|
{ "rtl", CF_STOP }, // return from subroutine long
|
|
{ "rts", CF_STOP }, // return from subroutine
|
|
{ "sbc", CF_USE1|CF_CHG1|CF_USE2 }, // subtract with carry
|
|
{ "seb", CF_USE1|CF_USE2|CF_CHG2 }, // set bit
|
|
{ "sec", 0 }, // set carry flag
|
|
{ "sei", 0 }, // set interrupt disable status
|
|
{ "sem", 0 }, // set m flag
|
|
{ "sep", CF_USE1 }, // set processor status
|
|
{ "sta", CF_USE1|CF_CHG2 }, // store accumulator in memory
|
|
{ "stp", 0 }, // stop
|
|
{ "stx", CF_CHG1 }, // store index register X in memory
|
|
{ "sty", CF_CHG1 }, // store index register Y in memory
|
|
{ "tad", 0 }, // transfer accumulator A to direct page register
|
|
{ "tas", 0 }, // transfer accumulator A to stack pointer
|
|
{ "tax", 0 }, // transfer accumulator A to index register X
|
|
{ "tay", 0 }, // transfer accumulator A to index register Y
|
|
{ "tbd", 0 }, // transfer accumulator B to direct page register
|
|
{ "tbs", 0 }, // transfer accumulator B to stack pointer
|
|
{ "tbx", 0 }, // transfer accumulator B to index register X
|
|
{ "tby", 0 }, // transfer accumulator B to index register Y
|
|
{ "tda", 0 }, // transfer direct page register to accumulator A
|
|
{ "tdb", 0 }, // transfer direct page register to accumulator B
|
|
{ "tsa", 0 }, // transfer stack pointer to accumulator A
|
|
{ "tsb", 0 }, // transfer stack pointer to accumulator B
|
|
{ "tsx", 0 }, // transfer stack pointer to index register X
|
|
{ "txa", 0 }, // transfer index register X to accumulator A
|
|
{ "txb", 0 }, // transfer index register X to accumulator B
|
|
{ "txs", 0 }, // transfer index register X to stack pointer
|
|
{ "txy", 0 }, // transfer index register X to Y
|
|
{ "tya", 0 }, // transfer index register Y to accumulator A
|
|
{ "tyb", 0 }, // transfer index register Y to accumulator B
|
|
{ "tyx", 0 }, // transfer index register Y to X
|
|
{ "wit", 0 }, // wait
|
|
{ "xab", 0 }, // exchange accumulator A and B
|
|
|
|
// 7750 :
|
|
|
|
{ "asr", CF_USE1|CF_CHG1 }, // arithmetic shift right
|
|
{ "divs", CF_USE1 }, // divide with sign
|
|
{ "exts", CF_USE1|CF_CHG1 }, // extention with sign
|
|
{ "extz", CF_USE1|CF_CHG1 }, // extention zero
|
|
{ "mpys", CF_USE1 } // multiply with sign
|
|
};
|
|
|
|
CASSERT(qnumber(Instructions) == m7700_last);
|