| @@ -152,7 +152,6 @@ static ASMErrorDesc parse_arg( | |||||
| } | } | ||||
| ASMArgParseInfo info = {.arg = str, .size = size, .deftable = deftable}; | ASMArgParseInfo info = {.arg = str, .size = size, .deftable = deftable}; | ||||
| DEBUG("parse_arg(): -->%.*s<-- %zu", (int) size, str, size) | |||||
| TRY_PARSER(register, AT_REGISTER, reg) | TRY_PARSER(register, AT_REGISTER, reg) | ||||
| TRY_PARSER(immediate, AT_IMMEDIATE, imm) | TRY_PARSER(immediate, AT_IMMEDIATE, imm) | ||||
| TRY_PARSER(indirect, AT_INDIRECT, indirect) | TRY_PARSER(indirect, AT_INDIRECT, indirect) | ||||
| @@ -214,42 +213,48 @@ static ASMErrorDesc parse_args( | |||||
| /* Instruction parser functions */ | /* Instruction parser functions */ | ||||
| INST_FUNC(nop) | |||||
| { | |||||
| INST_TAKES_NO_ARGS | |||||
| INST_RETURN(1, 0x00) | |||||
| } | |||||
| INST_FUNC(inc) | |||||
| INST_FUNC(adc) | |||||
| { | { | ||||
| INST_TAKES_ARGS(1, 1) | |||||
| switch (INST_TYPE(0)) { | |||||
| case AT_REGISTER: | |||||
| switch (INST_REG(0)) { | |||||
| case REG_A: INST_RETURN(1, 0x3C) | |||||
| case REG_B: INST_RETURN(1, 0x04) | |||||
| case REG_C: INST_RETURN(1, 0x0C) | |||||
| case REG_D: INST_RETURN(1, 0x14) | |||||
| case REG_E: INST_RETURN(1, 0x1C) | |||||
| case REG_H: INST_RETURN(1, 0x24) | |||||
| case REG_L: INST_RETURN(1, 0x2C) | |||||
| case REG_BC: INST_RETURN(1, 0x03) | |||||
| case REG_DE: INST_RETURN(1, 0x13) | |||||
| case REG_HL: INST_RETURN(1, 0x23) | |||||
| case REG_SP: INST_RETURN(1, 0x33) | |||||
| case REG_IX: INST_RETURN(2, 0xDD, 0x23) | |||||
| case REG_IY: INST_RETURN(2, 0xFD, 0x23) | |||||
| case REG_IXH: INST_RETURN(2, 0xDD, 0x2C) | |||||
| case REG_IXL: INST_RETURN(2, 0xFD, 0x2C) | |||||
| case REG_IYH: INST_RETURN(2, 0xDD, 0x2C) | |||||
| case REG_IYL: INST_RETURN(2, 0xFD, 0x2C) | |||||
| default: INST_ERROR(ARG0_BAD_REG) | |||||
| INST_TAKES_ARGS(2, 2) | |||||
| INST_FORCE_TYPE(0, AT_REGISTER) | |||||
| switch (INST_REG(0)) { | |||||
| case REG_A: | |||||
| switch (INST_TYPE(1)) { | |||||
| case AT_REGISTER: | |||||
| switch (INST_REG(1)) { | |||||
| case REG_A: INST_RETURN(1, 0x8F) | |||||
| case REG_B: INST_RETURN(1, 0x88) | |||||
| case REG_C: INST_RETURN(1, 0x89) | |||||
| case REG_D: INST_RETURN(1, 0x8A) | |||||
| case REG_E: INST_RETURN(1, 0x8B) | |||||
| case REG_H: INST_RETURN(1, 0x8C) | |||||
| case REG_L: INST_RETURN(1, 0x8D) | |||||
| case REG_IXH: INST_RETURN(2, 0xDD, 0x8C) | |||||
| case REG_IXL: INST_RETURN(2, 0xDD, 0x8D) | |||||
| case REG_IYH: INST_RETURN(2, 0xFD, 0x8C) | |||||
| case REG_IYL: INST_RETURN(2, 0xFD, 0x8D) | |||||
| default: INST_ERROR(ARG1_BAD_REG) | |||||
| } | |||||
| case AT_IMMEDIATE: | |||||
| INST_CHECK_IMM(1, IMM_U8) | |||||
| INST_RETURN(2, 0xCE, INST_IMM(1).uval) | |||||
| case AT_INDIRECT: | |||||
| INST_INDIRECT_HL_ONLY(1) | |||||
| INST_RETURN(1, 0x8E) | |||||
| case AT_INDEXED: | |||||
| INST_RETURN(3, INST_INDEX_BYTES(1, 0x8E)) | |||||
| default: | |||||
| INST_ERROR(ARG1_TYPE) | |||||
| } | |||||
| case REG_HL: | |||||
| INST_FORCE_TYPE(1, AT_REGISTER) | |||||
| switch (INST_REG(1)) { | |||||
| case REG_BC: INST_RETURN(2, 0xED, 0x4A) | |||||
| case REG_DE: INST_RETURN(2, 0xED, 0x5A) | |||||
| case REG_HL: INST_RETURN(2, 0xED, 0x6A) | |||||
| case REG_SP: INST_RETURN(2, 0xED, 0x7A) | |||||
| default: INST_ERROR(ARG1_BAD_REG) | |||||
| } | } | ||||
| case AT_INDIRECT: | |||||
| INST_INDIRECT_HL_ONLY(0) | |||||
| INST_RETURN(1, 0x34) | |||||
| case AT_INDEXED: | |||||
| INST_RETURN(3, INST_INDEX_BYTES(0, 0x34)) | |||||
| default: | default: | ||||
| INST_ERROR(ARG0_TYPE) | INST_ERROR(ARG0_TYPE) | ||||
| } | } | ||||
| @@ -316,13 +321,46 @@ INST_FUNC(add) | |||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| INST_FUNC(adc) | |||||
| INST_FUNC(inc) | |||||
| { | |||||
| INST_TAKES_ARGS(1, 1) | |||||
| switch (INST_TYPE(0)) { | |||||
| case AT_REGISTER: | |||||
| switch (INST_REG(0)) { | |||||
| case REG_A: INST_RETURN(1, 0x3C) | |||||
| case REG_B: INST_RETURN(1, 0x04) | |||||
| case REG_C: INST_RETURN(1, 0x0C) | |||||
| case REG_D: INST_RETURN(1, 0x14) | |||||
| case REG_E: INST_RETURN(1, 0x1C) | |||||
| case REG_H: INST_RETURN(1, 0x24) | |||||
| case REG_L: INST_RETURN(1, 0x2C) | |||||
| case REG_BC: INST_RETURN(1, 0x03) | |||||
| case REG_DE: INST_RETURN(1, 0x13) | |||||
| case REG_HL: INST_RETURN(1, 0x23) | |||||
| case REG_SP: INST_RETURN(1, 0x33) | |||||
| case REG_IX: INST_RETURN(2, 0xDD, 0x23) | |||||
| case REG_IY: INST_RETURN(2, 0xFD, 0x23) | |||||
| case REG_IXH: INST_RETURN(2, 0xDD, 0x2C) | |||||
| case REG_IXL: INST_RETURN(2, 0xFD, 0x2C) | |||||
| case REG_IYH: INST_RETURN(2, 0xDD, 0x2C) | |||||
| case REG_IYL: INST_RETURN(2, 0xFD, 0x2C) | |||||
| default: INST_ERROR(ARG0_BAD_REG) | |||||
| } | |||||
| case AT_INDIRECT: | |||||
| INST_INDIRECT_HL_ONLY(0) | |||||
| INST_RETURN(1, 0x34) | |||||
| case AT_INDEXED: | |||||
| INST_RETURN(3, INST_INDEX_BYTES(0, 0x34)) | |||||
| default: | |||||
| INST_ERROR(ARG0_TYPE) | |||||
| } | |||||
| } | |||||
| INST_FUNC(nop) | |||||
| { | { | ||||
| DEBUG("dispatched to -> ADC") | |||||
| return ED_PS_TOO_FEW_ARGS; | |||||
| INST_TAKES_NO_ARGS | |||||
| INST_RETURN(1, 0x00) | |||||
| } | } | ||||
| */ | |||||
| INST_FUNC(reti) | INST_FUNC(reti) | ||||
| { | { | ||||
| @@ -347,10 +385,10 @@ ASMInstParser get_inst_parser(char mstr[MAX_MNEMONIC_SIZE]) | |||||
| // single 32-bit value to do fast lookups: | // single 32-bit value to do fast lookups: | ||||
| uint32_t key = (mstr[0] << 24) + (mstr[1] << 16) + (mstr[2] << 8) + mstr[3]; | uint32_t key = (mstr[0] << 24) + (mstr[1] << 16) + (mstr[2] << 8) + mstr[3]; | ||||
| HANDLE(nop) | |||||
| HANDLE(inc) | |||||
| HANDLE(adc) | |||||
| HANDLE(add) | HANDLE(add) | ||||
| // HANDLE(adc) | |||||
| HANDLE(inc) | |||||
| HANDLE(nop) | |||||
| HANDLE(reti) | HANDLE(reti) | ||||
| HANDLE(retn) | HANDLE(retn) | ||||