diff --git a/lib/opcode80.asm b/lib/opcode80.asm new file mode 100644 index 0000000..28412a9 --- /dev/null +++ b/lib/opcode80.asm @@ -0,0 +1,122 @@ +; BYTE name length +; n BYTES name +; BYTE opcode template (variable parts zero) +; +; BYTE operand 1 +; BYTE operand 2 + +; operand types: +; 0x00 none +; 0x1n reg8, opcode |= (reg8 << n) +; 0x2n reg16, opcode |= (reg8 << n) +; 0x3n 3-bit number, opcode |= (num << n) +; 0x80 imm8, encoded as extra byte +; 0x81 imm16, encoded as extra word + +reg8: + db "B",0,"C",0,"D",0,"E",0,"H",0,"L",0,"M",0 + +reg16: + db "BC", "DE", "HL", "SP" + +opcodes: +; Data movement + db 3, "MOV", 0b01000000, 0x13, 0x10 + db 3, "MVI", 0b00000110, 0x13, 0x80 + db 3, "LXI", 0b00000001, 0x24, 0x81 + db 3, "LDA", 0b00111010, 0x81, 0x00 + db 3, "STA", 0b00110010, 0x81, 0x00 + db 4, "LHLD", 0b00101010, 0x81, 0x00 + db 4, "SHLD", 0b00100010, 0x81, 0x00 + db 4, "LDAX", 0b00001010, 0x24, 0x00 + db 4, "STAX", 0b00000010, 0x24, 0x00 + db 4, "XCHG", 0b11101011, 0x00, 0x00 + +; Addition / Subtraction + db 3, "ADD", 0b10000000, 0x10, 0x00 + db 3, "ADI", 0b11000110, 0x80, 0x00 + db 3, "ADC", 0b10001000, 0x10, 0x00 + db 3, "ACI", 0b11001110, 0x80, 0x00 + db 3, "SUB", 0b10010000, 0x10, 0x00 + db 3, "SUI", 0b11010110, 0x80, 0x00 + db 3, "SBB", 0b10011000, 0x10, 0x00 + db 3, "SBI", 0b11011110, 0x80, 0x00 + db 3, "INR", 0b00000100, 0x13, 0x00 + db 3, "DCR", 0b00000101, 0x13, 0x00 + db 3, "INX", 0b00000011, 0x24, 0x00 + db 3, "DCX", 0b00001011, 0x24, 0x00 + db 3, "DAD", 0b00001001, 0x24, 0x00 + +; BCD + db 3, "DAA", 0b00100111, 0x00, 0x00 + +; Bitwise operations + db 3, "ANA", 0b10100000, 0x10, 0x00 + db 3, "ANI", 0b11100110, 0x80, 0x00 + db 3, "ORA", 0b10110000, 0x10, 0x00 + db 3, "ORI", 0b11110110, 0x80, 0x00 + db 3, "XRA", 0b10101000, 0x10, 0x00 + db 3, "XRI", 0b11101110, 0x80, 0x00 + db 3, "CMP", 0b10111000, 0x10, 0x00 + db 3, "CPI", 0b11111110, 0x80, 0x00 + +; Rotate + db 3, "RLC", 0b00000111, 0x00, 0x00 + db 3, "RRC", 0b00001111, 0x00, 0x00 + db 3, "RAL", 0b00010111, 0x00, 0x00 + db 3, "RAR", 0b00011111, 0x00, 0x00 + +; Complement + db 3, "CMA", 0b00101111, 0x00, 0x00 + db 3, "CMC", 0b00111111, 0x00, 0x00 + db 3, "STC", 0b00110111, 0x00, 0x00 + +; Jump + db 3, "JMP", 0b11000011, 0x81, 0x00 + db 3, "JNZ", 0b11000010, 0x81, 0x00 + db 2, "JZ", 0b11001010, 0x81, 0x00 + db 3, "JNC", 0b11010010, 0x81, 0x00 + db 2, "JC", 0b11011010, 0x81, 0x00 + db 3, "JPO", 0b11100010, 0x81, 0x00 + db 3, "JPE", 0b11101010, 0x81, 0x00 + db 2, "JP", 0b11110010, 0x81, 0x00 + db 2, "JM", 0b11111010, 0x81, 0x00 + +; Call + db 4, "CALL", 0b11001101, 0x81, 0x00 + db 3, "CNZ", 0b11000100, 0x81, 0x00 + db 2, "CZ", 0b11001100, 0x81, 0x00 + db 3, "CNC", 0b11010100, 0x81, 0x00 + db 2, "CC", 0b11011100, 0x81, 0x00 + db 3, "CPO", 0b11100100, 0x81, 0x00 + db 3, "CPE", 0b11101100, 0x81, 0x00 + db 2, "CP", 0b11110100, 0x81, 0x00 + db 2, "CM", 0b11111100, 0x81, 0x00 + +; Return + db 3, "RET", 0b11001001, 0x00, 0x00 + db 3, "RNZ", 0b11000000, 0x00, 0x00 + db 2, "RZ", 0b11001000, 0x00, 0x00 + db 3, "RNC", 0b11010000, 0x00, 0x00 + db 2, "RC", 0b11011000, 0x00, 0x00 + db 3, "RPO", 0b11100000, 0x00, 0x00 + db 3, "RPE", 0b11101000, 0x00, 0x00 + db 2, "RP", 0b11110000, 0x00, 0x00 + db 2, "RM", 0b11111000, 0x00, 0x00 + + db 3, "RST", 0b11000111, 0x33, 0x00 + db 4, "PCHL", 0b11101001, 0x00, 0x00 + db 4, "PUSH", 0b11000101, 0x24, 0x00 + db 3, "POP", 0b11000001, 0x24, 0x00 + db 4, "XTHL", 0b11100011, 0x00, 0x00 + db 4, "SPHL", 0b11111001, 0x00, 0x00 + + db 2, "IN", 0b11011011, 0x80, 0x00 + db 3, "OUT", 0b11010011, 0x80, 0x00 + + db 2, "EI", 0b11111011, 0x00, 0x00 + db 2, "DI", 0b11110011, 0x00, 0x00 + db 3, "HLT", 0b01110110, 0x00, 0x00 + db 3, "NOP", 0b00000000, 0x00, 0x00 + + db 0