Add ADD for 2 registers

This commit is contained in:
g1n 2021-11-03 15:25:42 +02:00
parent 0d2657eab1
commit 0f2fc73160
2 changed files with 112 additions and 12 deletions

View File

@ -307,12 +307,12 @@ void ocpu_execute() {
case REG_AL:
byte value = ocpu_fetch_byte();
ocpu.A += (ocpu.A & 0xFF00) | (value & 0xFF);
ocpu.AL += ocpu.A & 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;
ocpu.AH = ocpu.A >> 8;
break;
case REG_A:
word word_value = ocpu_fetch_word();
@ -322,12 +322,12 @@ void ocpu_execute() {
case REG_BL:
value = ocpu_fetch_byte();
ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF);
ocpu.BL += ocpu.B & 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;
ocpu.BH = ocpu.B >> 8;
break;
case REG_B:
word_value = ocpu_fetch_word();
@ -337,12 +337,12 @@ void ocpu_execute() {
case REG_CL:
value = ocpu_fetch_byte();
ocpu.C += (ocpu.C & 0xFF00) | (value & 0xFF);
ocpu.CL += ocpu.C & 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;
ocpu.CH = ocpu.C >> 8;
break;
case REG_C:
word_value = ocpu_fetch_word();
@ -352,12 +352,12 @@ void ocpu_execute() {
case REG_DL:
value = ocpu_fetch_byte();
ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF);
ocpu.DL += ocpu.D & 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;
ocpu.DH = ocpu.D >> 8;
break;
case REG_D:
word_value = ocpu_fetch_word();
@ -367,12 +367,12 @@ void ocpu_execute() {
case REG_EL:
value = ocpu_fetch_byte();
ocpu.E += (ocpu.E & 0xFF00) | (value & 0xFF);
ocpu.EL += ocpu.E & 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;
ocpu.EH = ocpu.E >> 8;
break;
case REG_E:
word_value = ocpu_fetch_word();
@ -382,12 +382,12 @@ void ocpu_execute() {
case REG_FL:
value = ocpu_fetch_byte();
ocpu.F += (ocpu.F & 0xFF00) | (value & 0xFF);
ocpu.FL += ocpu.F & 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;
ocpu.FH = ocpu.F >> 8;
break;
case REG_F:
word_value = ocpu_fetch_word();
@ -399,6 +399,105 @@ void ocpu_execute() {
return;
}
break;
case INS_ADD_REG:
reg = ocpu_fetch_byte();
switch(reg) {
case REG_AL:
byte 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 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 0x00:
return;
default:

View File

@ -34,6 +34,7 @@
#define INS_MOV_IM 0x01
#define INS_MOV_REG 0xA1
#define INS_ADD_IM 0x10
#define INS_ADD_REG 0xB0
struct OCPU_MEMORY {
byte memory[MAX_MEMORY];