gbemu/lib/instructions.c

179 lines
5.0 KiB
C
Raw Normal View History

2025-01-30 16:27:27 -07:00
#include <instructions.h>
#include <cpu.h>
instruction instructions[0x100] = {
2025-01-30 21:59:05 -07:00
//0x0X
2025-01-30 16:27:27 -07:00
[0x00] = {IN_NOP, AM_IMP},
2025-01-30 21:59:05 -07:00
[0x01] = {IN_LD, AM_R_D16, RT_BC},
[0x02] = {IN_LD, AM_MR_R, RT_BC, RT_A},
2025-01-30 16:27:27 -07:00
[0x05] = {IN_DEC, AM_R, RT_B},
2025-01-30 21:59:05 -07:00
[0x06] = {IN_LD, AM_R_D8, RT_B},
[0x08] = {IN_LD, AM_A16_R, RT_NONE, RT_SP},
[0x0A] = {IN_LD, AM_R_MR, RT_A, RT_BC},
2025-01-30 16:27:27 -07:00
[0x0E] = {IN_LD, AM_R_D8, RT_C},
2025-01-30 21:59:05 -07:00
//0x1X
[0x11] = {IN_LD, AM_R_D16, RT_DE},
[0x12] = {IN_LD, AM_MR_R, RT_DE, RT_A},
[0x15] = {IN_DEC, AM_R, RT_D},
[0x16] = {IN_LD, AM_R_D8, RT_D},
[0x1A] = {IN_LD, AM_R_MR, RT_A, RT_DE},
[0x1E] = {IN_LD, AM_R_D8, RT_E},
//0x2X
[0x21] = {IN_LD, AM_R_D16, RT_HL},
[0x22] = {IN_LD, AM_HLI_R, RT_HL, RT_A},
[0x25] = {IN_DEC, AM_R, RT_H},
[0x26] = {IN_LD, AM_R_D8, RT_H},
[0x2A] = {IN_LD, AM_R_HLI, RT_A, RT_HL},
[0x2E] = {IN_LD, AM_R_D8, RT_L},
//0x3X
[0x31] = {IN_LD, AM_R_D16, RT_SP},
[0x32] = {IN_LD, AM_HLD_R, RT_HL, RT_A},
[0x35] = {IN_DEC, AM_MR, RT_HL},
[0x36] = {IN_LD, AM_MR_D8, RT_HL},
[0x3A] = {IN_LD, AM_R_HLD, RT_A, RT_HL},
[0x3E] = {IN_LD, AM_R_D8, RT_A},
//0x4X
[0x40] = {IN_LD, AM_R_R, RT_B, RT_B},
[0x41] = {IN_LD, AM_R_R, RT_B, RT_C},
[0x42] = {IN_LD, AM_R_R, RT_B, RT_D},
[0x43] = {IN_LD, AM_R_R, RT_B, RT_E},
[0x44] = {IN_LD, AM_R_R, RT_B, RT_H},
[0x45] = {IN_LD, AM_R_R, RT_B, RT_L},
[0x46] = {IN_LD, AM_R_MR, RT_B, RT_HL},
[0x47] = {IN_LD, AM_R_R, RT_B, RT_A},
[0x48] = {IN_LD, AM_R_R, RT_C, RT_B},
[0x49] = {IN_LD, AM_R_R, RT_C, RT_C},
[0x4A] = {IN_LD, AM_R_R, RT_C, RT_D},
[0x4B] = {IN_LD, AM_R_R, RT_C, RT_E},
[0x4C] = {IN_LD, AM_R_R, RT_C, RT_H},
[0x4D] = {IN_LD, AM_R_R, RT_C, RT_L},
[0x4E] = {IN_LD, AM_R_MR, RT_C, RT_HL},
[0x4F] = {IN_LD, AM_R_R, RT_C, RT_A},
//0x5X
[0x50] = {IN_LD, AM_R_R, RT_D, RT_B},
[0x51] = {IN_LD, AM_R_R, RT_D, RT_C},
[0x52] = {IN_LD, AM_R_R, RT_D, RT_D},
[0x53] = {IN_LD, AM_R_R, RT_D, RT_E},
[0x54] = {IN_LD, AM_R_R, RT_D, RT_H},
[0x55] = {IN_LD, AM_R_R, RT_D, RT_L},
[0x56] = {IN_LD, AM_R_MR, RT_D, RT_HL},
[0x57] = {IN_LD, AM_R_R, RT_D, RT_A},
[0x58] = {IN_LD, AM_R_R, RT_E, RT_B},
[0x59] = {IN_LD, AM_R_R, RT_E, RT_C},
[0x5A] = {IN_LD, AM_R_R, RT_E, RT_D},
[0x5B] = {IN_LD, AM_R_R, RT_E, RT_E},
[0x5C] = {IN_LD, AM_R_R, RT_E, RT_H},
[0x5D] = {IN_LD, AM_R_R, RT_E, RT_L},
[0x5E] = {IN_LD, AM_R_MR, RT_E, RT_HL},
[0x5F] = {IN_LD, AM_R_R, RT_E, RT_A},
//0x6X
[0x60] = {IN_LD, AM_R_R, RT_H, RT_B},
[0x61] = {IN_LD, AM_R_R, RT_H, RT_C},
[0x62] = {IN_LD, AM_R_R, RT_H, RT_D},
[0x63] = {IN_LD, AM_R_R, RT_H, RT_E},
[0x64] = {IN_LD, AM_R_R, RT_H, RT_H},
[0x65] = {IN_LD, AM_R_R, RT_H, RT_L},
[0x66] = {IN_LD, AM_R_MR, RT_H, RT_HL},
[0x67] = {IN_LD, AM_R_R, RT_H, RT_A},
[0x68] = {IN_LD, AM_R_R, RT_L, RT_B},
[0x69] = {IN_LD, AM_R_R, RT_L, RT_C},
[0x6A] = {IN_LD, AM_R_R, RT_L, RT_D},
[0x6B] = {IN_LD, AM_R_R, RT_L, RT_E},
[0x6C] = {IN_LD, AM_R_R, RT_L, RT_H},
[0x6D] = {IN_LD, AM_R_R, RT_L, RT_L},
[0x6E] = {IN_LD, AM_R_MR, RT_L, RT_HL},
[0x6F] = {IN_LD, AM_R_R, RT_L, RT_A},
//0x7X
[0x70] = {IN_LD, AM_MR_R, RT_HL, RT_B},
[0x71] = {IN_LD, AM_MR_R, RT_HL, RT_C},
[0x72] = {IN_LD, AM_MR_R, RT_HL, RT_D},
[0x73] = {IN_LD, AM_MR_R, RT_HL, RT_E},
[0x74] = {IN_LD, AM_MR_R, RT_HL, RT_H},
[0x75] = {IN_LD, AM_MR_R, RT_HL, RT_L},
[0x76] = {IN_HALT},
[0x77] = {IN_LD, AM_MR_R, RT_HL, RT_A},
[0x78] = {IN_LD, AM_R_R, RT_A, RT_B},
[0x79] = {IN_LD, AM_R_R, RT_A, RT_C},
[0x7A] = {IN_LD, AM_R_R, RT_A, RT_D},
[0x7B] = {IN_LD, AM_R_R, RT_A, RT_E},
[0x7C] = {IN_LD, AM_R_R, RT_A, RT_H},
[0x7D] = {IN_LD, AM_R_R, RT_A, RT_L},
[0x7E] = {IN_LD, AM_R_MR, RT_A, RT_HL},
[0x7F] = {IN_LD, AM_R_R, RT_A, RT_A},
//0x8X
//0x9X
//0xAX
2025-01-30 16:27:27 -07:00
[0xAF] = {IN_XOR, AM_R, RT_A},
2025-01-30 21:59:05 -07:00
//0xBX
//0xCX
2025-01-30 16:27:27 -07:00
[0xC3] = {IN_JP, AM_D16},
2025-01-30 21:59:05 -07:00
//0xDX
//0xEX
[0xE0] = {IN_LDH, AM_A8_R, RT_NONE, RT_A},
[0xE2] = {IN_LD, AM_MR_R, RT_C, RT_A},
[0xEA] = {IN_LD, AM_A16_R, RT_NONE, RT_A},
//0xFX
[0xF0] = {IN_LDH, AM_R_A8, RT_A},
[0xF2] = {IN_LD, AM_R_MR, RT_A, RT_C},
2025-01-30 18:38:29 -07:00
[0xF3] = {IN_DI},
2025-01-30 21:59:05 -07:00
[0xFA] = {IN_LD, AM_R_A16, RT_A},
2025-01-30 16:27:27 -07:00
};
instruction *instruction_by_opcode(u8 opcode) {
return &instructions[opcode];
2025-01-30 17:03:56 -07:00
}
char *inst_lookup[] = {
"<NONE>",
"NOP",
"LD",
"INC",
"DEC",
"RLCA",
"ADD",
"RRCA",
"STOP",
"RLA",
"JR",
"RRA",
"DAA",
"CPL",
"SCF",
"CCF",
"HALT",
"ADC",
"SUB",
"SBC",
"AND",
"XOR",
"OR",
"CP",
"POP",
"JP",
"PUSH",
"RET",
"CB",
"CALL",
"RETI",
"LDH",
"JPHL",
"DI",
"EI",
"RST",
"IN_ERR",
"IN_RLC",
"IN_RRC",
"IN_RL",
"IN_RR",
"IN_SLA",
"IN_SRA",
"IN_SWAP",
"IN_SRL",
"IN_BIT",
"IN_RES",
"IN_SET"
};
char *inst_name(in_type t) {
return inst_lookup[t];
2025-01-30 16:27:27 -07:00
}