diff --git a/src/include/yemu/ocpu.h b/src/include/yemu/ocpu.h index dbd0680..01a4d38 100644 --- a/src/include/yemu/ocpu.h +++ b/src/include/yemu/ocpu.h @@ -38,6 +38,14 @@ #define INS_MOV_REG 0xA1 #define INS_ADD_IM 0x10 #define INS_ADD_REG 0xB0 +#define INS_ADC_IM 0x11 +#define INS_ADC_REG 0xB1 +#define INS_SUB_IM 0x12 +#define INS_SUB_REG 0xB2 +#define INS_MUL_IM 0x13 +#define INS_MUL_REG 0xB3 +#define INS_DIV_IM 0x14 +#define INS_DIV_REG 0xB4 #define INS_INC 0x15 #define INS_DEC 0x16 #define INS_OCPU_NOP 0x90 diff --git a/src/ocpu/ocpu.c b/src/ocpu/ocpu.c index a6940e0..ed89ff3 100644 --- a/src/ocpu/ocpu.c +++ b/src/ocpu/ocpu.c @@ -108,199 +108,187 @@ void ocpu_execute() { switch(instruction) { case INS_MOV_IM: reg = ocpu_fetch_byte(); - switch(reg) { case REG_AL: - value = ocpu_fetch_byte(); - ocpu.A = (ocpu.A & 0xFF00) | (value & 0xFF); - ocpu.AL = ocpu.A & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.A = (ocpu.A & 0xFF00) | (value & 0xFF); + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - value = ocpu_fetch_byte(); - ocpu.A = ((value & 0xFF) << 8) | (ocpu.A & 0xFF); - ocpu.AH = ocpu.A >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.A = ((value & 0xFF) << 8) | (ocpu.A & 0xFF); + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - word_value = ocpu_fetch_word(); - ocpu.A = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.A = word_value; + break; case REG_BL: - value = ocpu_fetch_byte(); - ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF); - ocpu.BL = ocpu.B & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF); + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - value = ocpu_fetch_byte(); - ocpu.B = ((value & 0xFF) << 8) | (ocpu.B & 0xFF); - ocpu.BH = ocpu.B >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.B = ((value & 0xFF) << 8) | (ocpu.B & 0xFF); + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - word_value = ocpu_fetch_word(); - ocpu.B = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.B = word_value; + break; case REG_CL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.C = (ocpu.C & 0xFF00) | (value & 0xFF); - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - value = ocpu_fetch_byte(); - ocpu.C = ((value & 0xFF) << 8) | (ocpu.C & 0xFF); - ocpu.CH = ocpu.C >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.C = ((value & 0xFF) << 8) | (ocpu.C & 0xFF); + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - word_value = ocpu_fetch_word(); - ocpu.C = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.C = word_value; + break; case REG_DL: - value = ocpu_fetch_byte(); - ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF); - ocpu.DL = ocpu.D & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF); + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - value = ocpu_fetch_byte(); - ocpu.D = ((value & 0xFF) << 8) | (ocpu.D & 0xFF); - ocpu.DH = ocpu.D >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.D = ((value & 0xFF) << 8) | (ocpu.D & 0xFF); + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - word_value = ocpu_fetch_word(); - ocpu.D = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.D = word_value; + break; case REG_EL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.E = (ocpu.E & 0xFF00) | (value & 0xFF); - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - value = ocpu_fetch_byte(); - ocpu.E = ((value & 0xFF) << 8) | (ocpu.E & 0xFF); - ocpu.EH = ocpu.E >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.E = ((value & 0xFF) << 8) | (ocpu.E & 0xFF); + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - word_value = ocpu_fetch_word(); - ocpu.E = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.E = word_value; + break; case REG_FL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.F = (ocpu.F & 0xFF00) | (value & 0xFF); - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - value = ocpu_fetch_byte(); - ocpu.F = ((value & 0xFF) << 8) | (ocpu.F & 0xFF); - ocpu.FH = ocpu.F >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.F = ((value & 0xFF) << 8) | (ocpu.F & 0xFF); + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - word_value = ocpu_fetch_word(); - ocpu.F = word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.F = word_value; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; case INS_MOV_REG: reg = ocpu_fetch_byte(); switch(reg) { case REG_AL: - value = match_register(ocpu_fetch_byte()); - ocpu.A = (ocpu.A & 0xFF00) | (value & 0xFF); - ocpu.AL = ocpu.A & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.A = (ocpu.A & 0xFF00) | (value & 0xFF); + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - value = match_register(ocpu_fetch_byte()); - ocpu.A = ((value & 0xFF) << 8) | (ocpu.A & 0xFF); - ocpu.AH = ocpu.A >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.A = ((value & 0xFF) << 8) | (ocpu.A & 0xFF); + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - word_value = match_register(ocpu_fetch_byte()); - ocpu.A = word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.A = word_value; + break; case REG_BL: - value = match_register(ocpu_fetch_byte()); - ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF); - ocpu.BL = ocpu.B & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF); + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - value = match_register(ocpu_fetch_byte()); - ocpu.B = ((value & 0xFF) << 8) | (ocpu.B & 0xFF); - ocpu.BH = ocpu.B >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.B = ((value & 0xFF) << 8) | (ocpu.B & 0xFF); + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - word_value = match_register(ocpu_fetch_byte()); - ocpu.B = word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.B = word_value; + break; case REG_CL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.C = (ocpu.C & 0xFF00) | (value & 0xFF); - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - value = match_register(ocpu_fetch_byte()); - ocpu.C = ((value & 0xFF) << 8) | (ocpu.C & 0xFF); - ocpu.CH = ocpu.C >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.C = ((value & 0xFF) << 8) | (ocpu.C & 0xFF); + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - word_value = match_register(ocpu_fetch_byte()); - ocpu.C = word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.C = word_value; + break; case REG_DL: - value = match_register(ocpu_fetch_byte()); - ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF); - ocpu.DL = ocpu.D & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF); + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - value = match_register(ocpu_fetch_byte()); - ocpu.D = ((value & 0xFF) << 8) | (ocpu.D & 0xFF); - ocpu.DH = ocpu.D >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.D = ((value & 0xFF) << 8) | (ocpu.D & 0xFF); + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - word_value = match_register(ocpu_fetch_byte()); - ocpu.D = word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.D = word_value; + break; case REG_EL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.E = (ocpu.E & 0xFF00) | (value & 0xFF); - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - value = match_register(ocpu_fetch_byte()); - ocpu.E = ((value & 0xFF) << 8) | (ocpu.E & 0xFF); - ocpu.EH = ocpu.E >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.E = ((value & 0xFF) << 8) | (ocpu.E & 0xFF); + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - word_value = match_register(ocpu_fetch_byte()); - ocpu.E = word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.E = word_value; + break; case REG_FL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.F = (ocpu.F & 0xFF00) | (value & 0xFF); - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - value = match_register(ocpu_fetch_byte()); - ocpu.F = ((value & 0xFF) << 8) | (ocpu.F & 0xFF); - ocpu.FH = ocpu.F >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.F = ((value & 0xFF) << 8) | (ocpu.F & 0xFF); + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - word_value = match_register(ocpu_fetch_byte()); - ocpu.F = word_value; - break; + word_value = match_register(ocpu_fetch_byte()); + ocpu.F = word_value; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; case INS_ADD_IM: @@ -308,356 +296,426 @@ void ocpu_execute() { switch(reg) { case REG_AL: - value = ocpu_fetch_byte(); - ocpu.A += (ocpu.A & 0xFF00) | (value & 0xFF); - ocpu.AL = ocpu.A & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.A += (ocpu.A & 0xFF00) | (value & 0xFF); + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - value = ocpu_fetch_byte(); - ocpu.A += ((value & 0xFF) << 8) | (ocpu.A & 0xFF); - ocpu.AH = ocpu.A >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.A += ((value & 0xFF) << 8) | (ocpu.A & 0xFF); + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - word_value = ocpu_fetch_word(); - ocpu.A += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.A += word_value; + break; case REG_BL: - value = ocpu_fetch_byte(); - ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF); - ocpu.BL = ocpu.B & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF); + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - value = ocpu_fetch_byte(); - ocpu.B += ((value & 0xFF) << 8) | (ocpu.B & 0xFF); - ocpu.BH = ocpu.B >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.B += ((value & 0xFF) << 8) | (ocpu.B & 0xFF); + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - word_value = ocpu_fetch_word(); - ocpu.B += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.B += word_value; + break; case REG_CL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.C += (ocpu.C & 0xFF00) | (value & 0xFF); - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - value = ocpu_fetch_byte(); - ocpu.C += ((value & 0xFF) << 8) | (ocpu.C & 0xFF); - ocpu.CH = ocpu.C >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.C += ((value & 0xFF) << 8) | (ocpu.C & 0xFF); + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - word_value = ocpu_fetch_word(); - ocpu.C += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.C += word_value; + break; case REG_DL: - value = ocpu_fetch_byte(); - ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF); - ocpu.DL = ocpu.D & 0xFF; - break; + value = ocpu_fetch_byte(); + ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF); + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - value = ocpu_fetch_byte(); - ocpu.D += ((value & 0xFF) << 8) | (ocpu.D & 0xFF); - ocpu.DH = ocpu.D >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.D += ((value & 0xFF) << 8) | (ocpu.D & 0xFF); + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - word_value = ocpu_fetch_word(); - ocpu.D += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.D += word_value; + break; case REG_EL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.E += (ocpu.E & 0xFF00) | (value & 0xFF); - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - value = ocpu_fetch_byte(); - ocpu.E += ((value & 0xFF) << 8) | (ocpu.E & 0xFF); - ocpu.EH = ocpu.E >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.E += ((value & 0xFF) << 8) | (ocpu.E & 0xFF); + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - word_value = ocpu_fetch_word(); - ocpu.E += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.E += word_value; + break; case REG_FL: - value = ocpu_fetch_byte(); + value = ocpu_fetch_byte(); ocpu.F += (ocpu.F & 0xFF00) | (value & 0xFF); - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - value = ocpu_fetch_byte(); - ocpu.F += ((value & 0xFF) << 8) | (ocpu.F & 0xFF); - ocpu.FH = ocpu.F >> 8; - break; + value = ocpu_fetch_byte(); + ocpu.F += ((value & 0xFF) << 8) | (ocpu.F & 0xFF); + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - word_value = ocpu_fetch_word(); - ocpu.F += word_value; - break; - + word_value = ocpu_fetch_word(); + ocpu.F += word_value; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; case INS_ADD_REG: reg = ocpu_fetch_byte(); switch(reg) { case REG_AL: - value = match_register(ocpu_fetch_byte()); - ocpu.A += (ocpu.A & 0xFF00) | (value & 0xFF); - ocpu.AL = ocpu.A & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.A += (ocpu.A & 0xFF00) | (value & 0xFF); + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - value = match_register(ocpu_fetch_byte()); - ocpu.A += ((value & 0xFF) << 8) | (ocpu.A & 0xFF); - ocpu.AH = ocpu.A >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.A += ((value & 0xFF) << 8) | (ocpu.A & 0xFF); + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - word_value = match_register(ocpu_fetch_byte()); - ocpu.A += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.A += word_value; + break; case REG_BL: - value = match_register(ocpu_fetch_byte()); - ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF); - ocpu.BL = ocpu.B & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF); + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - value = match_register(ocpu_fetch_byte()); - ocpu.B += ((value & 0xFF) << 8) | (ocpu.B & 0xFF); - ocpu.BH = ocpu.B >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.B += ((value & 0xFF) << 8) | (ocpu.B & 0xFF); + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - word_value = match_register(ocpu_fetch_byte()); - ocpu.B += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.B += word_value; + break; case REG_CL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.C += (ocpu.C & 0xFF00) | (value & 0xFF); - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - value = match_register(ocpu_fetch_byte()); - ocpu.C += ((value & 0xFF) << 8) | (ocpu.C & 0xFF); - ocpu.CH = ocpu.C >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.C += ((value & 0xFF) << 8) | (ocpu.C & 0xFF); + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - word_value = match_register(ocpu_fetch_byte()); - ocpu.C += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.C += word_value; + break; case REG_DL: - value = match_register(ocpu_fetch_byte()); - ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF); - ocpu.DL = ocpu.D & 0xFF; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF); + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - value = match_register(ocpu_fetch_byte()); - ocpu.D += ((value & 0xFF) << 8) | (ocpu.D & 0xFF); - ocpu.DH = ocpu.D >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.D += ((value & 0xFF) << 8) | (ocpu.D & 0xFF); + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - word_value = match_register(ocpu_fetch_byte()); - ocpu.D += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.D += word_value; + break; case REG_EL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.E += (ocpu.E & 0xFF00) | (value & 0xFF); - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - value = match_register(ocpu_fetch_byte()); - ocpu.E += ((value & 0xFF) << 8) | (ocpu.E & 0xFF); - ocpu.EH = ocpu.E >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.E += ((value & 0xFF) << 8) | (ocpu.E & 0xFF); + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - word_value = match_register(ocpu_fetch_byte()); - ocpu.E += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.E += word_value; + break; case REG_FL: - value = match_register(ocpu_fetch_byte()); + value = match_register(ocpu_fetch_byte()); ocpu.F += (ocpu.F & 0xFF00) | (value & 0xFF); - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - value = match_register(ocpu_fetch_byte()); - ocpu.F += ((value & 0xFF) << 8) | (ocpu.F & 0xFF); - ocpu.FH = ocpu.F >> 8; - break; + value = match_register(ocpu_fetch_byte()); + ocpu.F += ((value & 0xFF) << 8) | (ocpu.F & 0xFF); + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - word_value = match_register(ocpu_fetch_byte()); - ocpu.F += word_value; - break; - + word_value = match_register(ocpu_fetch_byte()); + ocpu.F += word_value; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; + case INS_ADC_IM: + reg = ocpu_fetch_byte(); + switch(reg) { + case REG_AL: + value = ocpu_fetch_byte(); + ocpu.A += (((ocpu.A & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.AL = ocpu.A & 0xFF; + break; + case REG_AH: + value = ocpu_fetch_byte(); + ocpu.A += ((((value & 0xFF) << 8) | (ocpu.A & 0xFF)) + ocpu.CF); + ocpu.AH = ocpu.A >> 8; + break; + case REG_A: + word_value = match_register(ocpu_fetch_byte()); + ocpu.A += word_value; + break; + case REG_BL: + value = ocpu_fetch_byte(); + ocpu.B += (((ocpu.B & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.BL = ocpu.B & 0xFF; + break; + case REG_BH: + value = ocpu_fetch_byte(); + ocpu.B += ((((value & 0xFF) << 8) | (ocpu.B & 0xFF)) + ocpu.CF); + ocpu.BH = ocpu.B >> 8; + break; + case REG_B: + word_value = match_register(ocpu_fetch_byte()); + ocpu.B += word_value; + break; + case REG_CL: + value = ocpu_fetch_byte(); + ocpu.C += (((ocpu.C & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.CL = ocpu.C & 0xFF; + break; + case REG_CH: + value = ocpu_fetch_byte(); + ocpu.C += ((((value & 0xFF) << 8) | (ocpu.C & 0xFF)) + ocpu.CF); + ocpu.CH = ocpu.C >> 8; + break; + case REG_C: + word_value = match_register(ocpu_fetch_byte()); + ocpu.C += word_value; + break; + case REG_DL: + value = ocpu_fetch_byte(); + ocpu.D += (((ocpu.D & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.DL = ocpu.D & 0xFF; + break; + case REG_DH: + value = ocpu_fetch_byte(); + ocpu.D += ((((value & 0xFF) << 8) | (ocpu.D & 0xFF)) + ocpu.CF); + ocpu.DH = ocpu.D >> 8; + break; + case REG_D: + word_value = match_register(ocpu_fetch_byte()); + ocpu.D += word_value; + break; + case REG_EL: + value = ocpu_fetch_byte(); + ocpu.E += (((ocpu.E & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.EL = ocpu.E & 0xFF; + break; + case REG_EH: + value = ocpu_fetch_byte(); + ocpu.E += ((((value & 0xFF) << 8) | (ocpu.E & 0xFF)) + ocpu.CF); + ocpu.EH = ocpu.E >> 8; + break; + case REG_E: + word_value = match_register(ocpu_fetch_byte()); + ocpu.E += word_value; + break; + case REG_FL: + value = ocpu_fetch_byte(); + ocpu.F += (((ocpu.F & 0xFF00) | (value & 0xFF)) + ocpu.CF); + ocpu.FL = ocpu.F & 0xFF; + break; + case REG_FH: + value = ocpu_fetch_byte(); + ocpu.F += ((((value & 0xFF) << 8) | (ocpu.F & 0xFF)) + ocpu.CF); + ocpu.FH = ocpu.F >> 8; + break; + case REG_F: + word_value = match_register(ocpu_fetch_byte()); + ocpu.F += word_value; + break; + default: + printf("Wrong register: %02X\n", reg); + return; + } + break; + case INS_ADC_REG: + break; case INS_INC: reg = ocpu_fetch_byte(); switch(reg) { case REG_AL: - ocpu.A++; - ocpu.AL = ocpu.A & 0xFF; - break; + ocpu.A++; + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - ocpu.A++; - ocpu.AH = ocpu.A >> 8; - break; + ocpu.A++; + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - ocpu.A++; - break; - + ocpu.A++; + break; case REG_BL: - ocpu.B++; - ocpu.BL = ocpu.B & 0xFF; - break; + ocpu.B++; + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - ocpu.B++; - ocpu.BH = ocpu.B >> 8; - break; + ocpu.B++; + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - ocpu.B++; - break; - + ocpu.B++; + break; case REG_CL: ocpu.C++; - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - ocpu.C++; - ocpu.CH = ocpu.C >> 8; - break; + ocpu.C++; + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - ocpu.C++; - break; - + ocpu.C++; + break; case REG_DL: - ocpu.D++; - ocpu.DL = ocpu.D & 0xFF; - break; + ocpu.D++; + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - ocpu.D++; - ocpu.DH = ocpu.D >> 8; - break; + ocpu.D++; + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - ocpu.D++; - break; - + ocpu.D++; + break; case REG_EL: ocpu.E++; - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - ocpu.E++; - ocpu.EH = ocpu.E >> 8; - break; + ocpu.E++; + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - ocpu.E++; - break; - + ocpu.E++; + break; case REG_FL: ocpu.F++; - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - ocpu.F++; - ocpu.FH = ocpu.F >> 8; - break; + ocpu.F++; + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - ocpu.F++; - break; - + ocpu.F++; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; case INS_DEC: reg = ocpu_fetch_byte(); switch(reg) { case REG_AL: - ocpu.A--; - ocpu.AL = ocpu.A & 0xFF; - break; + ocpu.A--; + ocpu.AL = ocpu.A & 0xFF; + break; case REG_AH: - ocpu.A--; - ocpu.AH = ocpu.A >> 8; - break; + ocpu.A--; + ocpu.AH = ocpu.A >> 8; + break; case REG_A: - ocpu.A--; - break; - + ocpu.A--; + break; case REG_BL: - ocpu.B--; - ocpu.BL = ocpu.B & 0xFF; - break; + ocpu.B--; + ocpu.BL = ocpu.B & 0xFF; + break; case REG_BH: - ocpu.B--; - ocpu.BH = ocpu.B >> 8; - break; + ocpu.B--; + ocpu.BH = ocpu.B >> 8; + break; case REG_B: - ocpu.B--; - break; - + ocpu.B--; + break; case REG_CL: ocpu.C--; - ocpu.CL = ocpu.C & 0xFF; - break; + ocpu.CL = ocpu.C & 0xFF; + break; case REG_CH: - ocpu.C--; - ocpu.CH = ocpu.C >> 8; - break; + ocpu.C--; + ocpu.CH = ocpu.C >> 8; + break; case REG_C: - ocpu.C--; - break; - + ocpu.C--; + break; case REG_DL: - ocpu.D--; - ocpu.DL = ocpu.D & 0xFF; - break; + ocpu.D--; + ocpu.DL = ocpu.D & 0xFF; + break; case REG_DH: - ocpu.D--; - ocpu.DH = ocpu.D >> 8; - break; + ocpu.D--; + ocpu.DH = ocpu.D >> 8; + break; case REG_D: - ocpu.D--; - break; - + ocpu.D--; + break; case REG_EL: ocpu.E--; - ocpu.EL = ocpu.E & 0xFF; - break; + ocpu.EL = ocpu.E & 0xFF; + break; case REG_EH: - ocpu.E--; - ocpu.EH = ocpu.E >> 8; - break; + ocpu.E--; + ocpu.EH = ocpu.E >> 8; + break; case REG_E: - ocpu.E--; - break; - + ocpu.E--; + break; case REG_FL: ocpu.F--; - ocpu.FL = ocpu.F & 0xFF; - break; + ocpu.FL = ocpu.F & 0xFF; + break; case REG_FH: - ocpu.F--; - ocpu.FH = ocpu.F >> 8; - break; + ocpu.F--; + ocpu.FH = ocpu.F >> 8; + break; case REG_F: - ocpu.F--; - break; - + ocpu.F--; + break; default: - printf("Wrong register: %02X\n", reg); - return; + printf("Wrong register: %02X\n", reg); + return; } break; case INS_OCPU_NOP: