diff --git a/src/ocpu/ocpu.c b/src/ocpu/ocpu.c index 064c997..9d05e93 100644 --- a/src/ocpu/ocpu.c +++ b/src/ocpu/ocpu.c @@ -572,6 +572,86 @@ void ocpu_execute() { ocpu.F++; break; + default: + 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; + case REG_AH: + ocpu.A--; + ocpu.AH = ocpu.A >> 8; + break; + case REG_A: + ocpu.A--; + break; + + case REG_BL: + ocpu.B--; + ocpu.BL = ocpu.B & 0xFF; + break; + case REG_BH: + ocpu.B--; + ocpu.BH = ocpu.B >> 8; + break; + case REG_B: + ocpu.B--; + break; + + case REG_CL: + ocpu.C--; + ocpu.CL = ocpu.C & 0xFF; + break; + case REG_CH: + ocpu.C--; + ocpu.CH = ocpu.C >> 8; + break; + case REG_C: + ocpu.C--; + break; + + case REG_DL: + ocpu.D--; + ocpu.DL = ocpu.D & 0xFF; + break; + case REG_DH: + ocpu.D--; + ocpu.DH = ocpu.D >> 8; + break; + case REG_D: + ocpu.D--; + break; + + case REG_EL: + ocpu.E--; + ocpu.EL = ocpu.E & 0xFF; + break; + case REG_EH: + ocpu.E--; + ocpu.EH = ocpu.E >> 8; + break; + case REG_E: + ocpu.E--; + break; + + case REG_FL: + ocpu.F--; + ocpu.FL = ocpu.F & 0xFF; + break; + case REG_FH: + ocpu.F--; + ocpu.FH = ocpu.F >> 8; + break; + case REG_F: + ocpu.F--; + break; + default: printf("Wrong register: %02X\n", reg); return; diff --git a/src/ocpu/ocpu.h b/src/ocpu/ocpu.h index 9aad35a..05909a6 100644 --- a/src/ocpu/ocpu.h +++ b/src/ocpu/ocpu.h @@ -36,6 +36,7 @@ #define INS_ADD_IM 0x10 #define INS_ADD_REG 0xB0 #define INS_INC 0x15 +#define INS_DEC 0x16 struct OCPU_MEMORY { byte memory[MAX_MEMORY];