eighty-eighty-js
Version:
A nice little Intel 8080 emulator for Node.js and Browser!
320 lines (298 loc) • 6.73 kB
text/typescript
import { u8 } from 'typed-numbers';
/**
* Handles opcode operations.
*/
export class Opcode {
/**
* Get amount of CPU cycles for an operation.
* @param opcode - The operation's code.
*/
public static getCycles(opcode: u8): number {
return Opcode.OP_CYCLES_TABLE[opcode];
}
/**
* Get string representation of an opcode.
* @param opcode - The operation's code.
*/
public static toString(opcode: u8): string {
return Opcode.ASM_TABLE[opcode];
}
/** Contains amount of CPU cycles for each opcode. */
protected static readonly OP_CYCLES_TABLE = [
4, 10, 7, 5, 5, 5, 7, 4, 4, 10, 7, 5, 5, 5, 7, 4, // 0
4, 10, 7, 5, 5, 5, 7, 4, 4, 10, 7, 5, 5, 5, 7, 4, // 1
4, 10, 16, 5, 5, 5, 7, 4, 4, 10, 16, 5, 5, 5, 7, 4, // 2
4, 10, 13, 5, 10, 10, 10, 4, 4, 10, 13, 5, 5, 5, 7, 4, // 3
5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, // 4
5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, // 5
5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, // 6
7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 7, 5, // 7
4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 8
4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 9
4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // a
4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // b
5, 10, 10, 10, 11, 11, 7, 11, 5, 10, 10, 10, 11, 17, 7, 11, // c
5, 10, 10, 10, 11, 11, 7, 11, 5, 10, 10, 10, 11, 17, 7, 11, // d
5, 10, 10, 18, 11, 11, 7, 11, 5, 5, 10, 5, 11, 17, 7, 11, // e
5, 10, 10, 4, 11, 11, 7, 11, 5, 5, 10, 4, 11, 17, 7, 11, // f
];
/** Contains string representation of each opcode. */
protected static readonly ASM_TABLE: Record<number, string> = {
0x00: 'NOP',
0x01: 'LXI BC',
0x02: 'STAX BC',
0x03: 'INX BC',
0x04: 'INR B',
0x05: 'DCR B',
0x06: 'MVI B',
0x07: 'RLC',
0x08: 'NOP',
0x09: 'DAD BC',
0x0A: 'LDAX BC',
0x0B: 'DCX BC',
0x0C: 'INR C',
0x0D: 'DCR C',
0x0E: 'MVI C',
0x0F: 'RRC',
0x10: 'NOP',
0x11: 'LXI DE',
0x12: 'STAX DE',
0x13: 'INX DE',
0x14: 'INR D',
0x15: 'DCR D',
0x16: 'MVI D',
0x17: 'RAL',
0x18: 'NOP',
0x19: 'DAD DE',
0x1A: 'LDAX DE',
0x1B: 'DCX DE',
0x1C: 'INR E',
0x1D: 'DCR E',
0x1E: 'MVI E',
0x1F: 'RAR',
0x20: 'NOP',
0x21: 'LXI HL',
0x22: 'SHLD',
0x23: 'INX HL',
0x24: 'INR H',
0x25: 'DCR H',
0x26: 'MVI H',
0x27: 'DAA',
0x28: 'NOP',
0x29: 'DAD HL',
0x2A: 'LHLD',
0x2B: 'DCX HL',
0x2C: 'INR L',
0x2D: 'DCR L',
0x2E: 'MVI L',
0x2F: 'CMA',
0x30: 'NOP',
0x31: 'LXI SP',
0x32: 'STA',
0x33: 'INX SP',
0x34: 'INR M',
0x35: 'DCR M',
0x36: 'MVI M',
0x37: 'STC',
0x38: 'NOP',
0x39: 'DAD SP',
0x3A: 'LDA',
0x3B: 'DCX SP',
0x3C: 'INR A',
0x3D: 'DCR A',
0x3E: 'MVI A',
0x3F: 'CMC',
0x40: 'MOV (B, B)',
0x41: 'MOV (B, C)',
0x42: 'MOV (B, D)',
0x43: 'MOV (B, E)',
0x44: 'MOV (B, H)',
0x45: 'MOV (B, L)',
0x46: 'MOV (B, M)',
0x47: 'MOV (B, A)',
0x48: 'MOV (C, B)',
0x49: 'MOV (C, C)',
0x4A: 'MOV (C, D)',
0x4B: 'MOV (C, E)',
0x4C: 'MOV (C, H)',
0x4D: 'MOV (C, L)',
0x4E: 'MOV (C, M)',
0x4F: 'MOV (C, A)',
0x50: 'MOV (D, B)',
0x51: 'MOV (D, C)',
0x52: 'MOV (D, D)',
0x53: 'MOV (D, E)',
0x54: 'MOV (D, H)',
0x55: 'MOV (D, L)',
0x56: 'MOV (D, M)',
0x57: 'MOV (D, A)',
0x58: 'MOV (E, B)',
0x59: 'MOV (E, C)',
0x5A: 'MOV (E, D)',
0x5B: 'MOV (E, E)',
0x5C: 'MOV (E, H)',
0x5D: 'MOV (E, L)',
0x5E: 'MOV (E, M)',
0x5F: 'MOV (E, A)',
0x60: 'MOV (H, B)',
0x61: 'MOV (H, C)',
0x62: 'MOV (H, D)',
0x63: 'MOV (H, E)',
0x64: 'MOV (H, H)',
0x65: 'MOV (H, L)',
0x66: 'MOV (H, M)',
0x67: 'MOV (H, A)',
0x68: 'MOV (L, B)',
0x69: 'MOV (L, C)',
0x6A: 'MOV (L, D)',
0x6B: 'MOV (L, E)',
0x6C: 'MOV (L, H)',
0x6D: 'MOV (L, L)',
0x6E: 'MOV (L, M)',
0x6F: 'MOV (L, A)',
0x70: 'MOV (M, B)',
0x71: 'MOV (M, C)',
0x72: 'MOV (M, D)',
0x73: 'MOV (M, E)',
0x74: 'MOV (M, H)',
0x75: 'MOV (M, L)',
0x76: 'HLT',
0x77: 'MOV (M, A)',
0x78: 'MOV (A, B)',
0x79: 'MOV (A, C)',
0x7A: 'MOV (A, D)',
0x7B: 'MOV (A, E)',
0x7C: 'MOV (A, H)',
0x7D: 'MOV (A, L)',
0x7E: 'MOV (A, M)',
0x7F: 'MOV (A, A)',
0x80: 'ADD B',
0x81: 'ADD C',
0x82: 'ADD D',
0x83: 'ADD E',
0x84: 'ADD H',
0x85: 'ADD L',
0x86: 'ADD M',
0x87: 'ADD A',
0x88: 'ADC B',
0x89: 'ADC C',
0x8A: 'ADC D',
0x8B: 'ADC E',
0x8C: 'ADC H',
0x8D: 'ADC L',
0x8E: 'ADC M',
0x8F: 'ADC A',
0x90: 'SUB B',
0x91: 'SUB C',
0x92: 'SUB D',
0x93: 'SUB E',
0x94: 'SUB H',
0x95: 'SUB L',
0x96: 'SUB M',
0x97: 'SUB A',
0x98: 'SBB B',
0x99: 'SBB C',
0x9A: 'SBB D',
0x9B: 'SBB E',
0x9C: 'SBB H',
0x9D: 'SBB L',
0x9E: 'SBB M',
0x9F: 'SBB A',
0xA0: 'ANA B',
0xA1: 'ANA C',
0xA2: 'ANA D',
0xA3: 'ANA E',
0xA4: 'ANA H',
0xA5: 'ANA L',
0xA6: 'ANA M',
0xA7: 'ANA A',
0xA8: 'XRA B',
0xA9: 'XRA C',
0xAA: 'XRA D',
0xAB: 'XRA E',
0xAC: 'XRA H',
0xAD: 'XRA L',
0xAE: 'XRA M',
0xAF: 'XRA A',
0xB0: 'ORA B',
0xB1: 'ORA C',
0xB2: 'ORA D',
0xB3: 'ORA E',
0xB4: 'ORA H',
0xB5: 'ORA L',
0xB6: 'ORA M',
0xB7: 'ORA A',
0xB8: 'CMP B',
0xB9: 'CMP C',
0xBA: 'CMP D',
0xBB: 'CMP E',
0xBC: 'CMP H',
0xBD: 'CMP L',
0xBE: 'CMP M',
0xBF: 'CMP A',
0xC0: 'RNZ',
0xC1: 'POP BC',
0xC2: 'JNZ',
0xC3: 'JMP',
0xC4: 'CNZ',
0xC5: 'PUSH B',
0xC6: 'ADI',
0xC7: 'RST 0',
0xC8: 'RZ',
0xC9: 'RET',
0xCA: 'JZ',
0xCB: 'JMP',
0xCC: 'CZ',
0xCD: 'CALL',
0xCE: 'ACI',
0xCF: 'RST 1',
0xD0: 'RNC',
0xD1: 'POP DE',
0xD2: 'JNC',
0xD3: 'OUT',
0xD4: 'CNC',
0xD5: 'PUSH D',
0xD6: 'SUI',
0xD7: 'RST 2',
0xD8: 'RC',
0xD9: 'RET',
0xDA: 'JC',
0xDB: 'IN',
0xDC: 'CC',
0xDD: 'CALL',
0xDE: 'SBI',
0xDF: 'RST 3',
0xE0: 'RPO',
0xE1: 'POP HL',
0xE2: 'JPO',
0xE3: 'XTHL',
0xE4: 'CPO',
0xE5: 'PUSH H',
0xE6: 'ANI',
0xE7: 'RST 4',
0xE8: 'RPE',
0xE9: 'PCHL',
0xEA: 'JPE',
0xEB: 'XCHG',
0xEC: 'CPE',
0xED: 'CALL',
0xEE: 'XRI',
0xEF: 'RST 5',
0xF0: 'RP',
0xF1: 'POP PSW',
0xF2: 'JP',
0xF3: 'DI',
0xF4: 'CP',
0xF5: 'PUSH PSW',
0xF6: 'ORI',
0xF7: 'RST 6',
0xF8: 'RM',
0xF9: 'SPHL',
0xFA: 'JM',
0xFB: 'EI',
0xFC: 'CM',
0xFD: 'CALL',
0xFE: 'CPI',
0xFF: 'RST 7',
};
}