Add SUB ocpu instruction

This commit is contained in:
g1n 2022-04-17 13:16:51 +03:00
parent 77bf6696ab
commit df4359a148
Signed by: g1n
GPG Key ID: 8D352193D65D4E2C
1 changed files with 185 additions and 0 deletions

View File

@ -660,6 +660,191 @@ void ocpu_execute() {
return;
}
break;
case INS_SUB_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;
case REG_AH:
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;
case REG_BL:
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;
case REG_B:
word_value = ocpu_fetch_word();
ocpu.B -= word_value;
break;
case REG_CL:
value = ocpu_fetch_byte();
ocpu.C -= (ocpu.C & 0xFF00) | (value & 0xFF);
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;
case REG_C:
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;
case REG_DH:
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;
case REG_EL:
value = ocpu_fetch_byte();
ocpu.E -= (ocpu.E & 0xFF00) | (value & 0xFF);
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;
case REG_E:
word_value = ocpu_fetch_word();
ocpu.E -= word_value;
break;
case REG_FL:
value = ocpu_fetch_byte();
ocpu.F -= (ocpu.F & 0xFF00) | (value & 0xFF);
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;
case REG_F:
word_value = ocpu_fetch_word();
ocpu.F -= word_value;
break;
default:
printf("Wrong register: %02X\n", reg);
return;
}
break;
case INS_SUB_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;
case REG_AH:
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;
case REG_BL:
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;
case REG_B:
word_value = match_register(ocpu_fetch_byte());
ocpu.B -= word_value;
break;
case REG_CL:
value = match_register(ocpu_fetch_byte());
ocpu.C -= (ocpu.C & 0xFF00) | (value & 0xFF);
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;
case REG_C:
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;
case REG_DH:
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;
case REG_EL:
value = match_register(ocpu_fetch_byte());
ocpu.E -= (ocpu.E & 0xFF00) | (value & 0xFF);
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;
case REG_E:
word_value = match_register(ocpu_fetch_byte());
ocpu.E -= word_value;
break;
case REG_FL:
value = match_register(ocpu_fetch_byte());
ocpu.F -= (ocpu.F & 0xFF00) | (value & 0xFF);
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;
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_INC:
reg = ocpu_fetch_byte();
switch(reg) {