Add immediate ADC ocpu instruction
This commit is contained in:
parent
4d0f8d0b6a
commit
bbd0aae6be
|
@ -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
|
||||
|
|
130
src/ocpu/ocpu.c
130
src/ocpu/ocpu.c
|
@ -108,7 +108,6 @@ void ocpu_execute() {
|
|||
switch(instruction) {
|
||||
case INS_MOV_IM:
|
||||
reg = ocpu_fetch_byte();
|
||||
|
||||
switch(reg) {
|
||||
case REG_AL:
|
||||
value = ocpu_fetch_byte();
|
||||
|
@ -124,7 +123,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.A = word_value;
|
||||
break;
|
||||
|
||||
case REG_BL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF);
|
||||
|
@ -139,7 +137,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.B = word_value;
|
||||
break;
|
||||
|
||||
case REG_CL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.C = (ocpu.C & 0xFF00) | (value & 0xFF);
|
||||
|
@ -154,7 +151,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.C = word_value;
|
||||
break;
|
||||
|
||||
case REG_DL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF);
|
||||
|
@ -169,7 +165,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.D = word_value;
|
||||
break;
|
||||
|
||||
case REG_EL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.E = (ocpu.E & 0xFF00) | (value & 0xFF);
|
||||
|
@ -184,7 +179,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.E = word_value;
|
||||
break;
|
||||
|
||||
case REG_FL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.F = (ocpu.F & 0xFF00) | (value & 0xFF);
|
||||
|
@ -199,7 +193,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.F = word_value;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Wrong register: %02X\n", reg);
|
||||
return;
|
||||
|
@ -222,7 +215,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -237,7 +229,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -252,7 +243,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -267,7 +257,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -282,7 +271,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -321,7 +309,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.A += word_value;
|
||||
break;
|
||||
|
||||
case REG_BL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.B += (ocpu.B & 0xFF00) | (value & 0xFF);
|
||||
|
@ -336,7 +323,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.B += word_value;
|
||||
break;
|
||||
|
||||
case REG_CL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.C += (ocpu.C & 0xFF00) | (value & 0xFF);
|
||||
|
@ -351,7 +337,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.C += word_value;
|
||||
break;
|
||||
|
||||
case REG_DL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.D += (ocpu.D & 0xFF00) | (value & 0xFF);
|
||||
|
@ -366,7 +351,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.D += word_value;
|
||||
break;
|
||||
|
||||
case REG_EL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.E += (ocpu.E & 0xFF00) | (value & 0xFF);
|
||||
|
@ -381,7 +365,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.E += word_value;
|
||||
break;
|
||||
|
||||
case REG_FL:
|
||||
value = ocpu_fetch_byte();
|
||||
ocpu.F += (ocpu.F & 0xFF00) | (value & 0xFF);
|
||||
|
@ -396,7 +379,6 @@ void ocpu_execute() {
|
|||
word_value = ocpu_fetch_word();
|
||||
ocpu.F += word_value;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Wrong register: %02X\n", reg);
|
||||
return;
|
||||
|
@ -419,7 +401,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -434,7 +415,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -449,7 +429,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -464,7 +443,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -479,7 +457,6 @@ void ocpu_execute() {
|
|||
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);
|
||||
|
@ -494,12 +471,105 @@ void ocpu_execute() {
|
|||
word_value = match_register(ocpu_fetch_byte());
|
||||
ocpu.F += word_value;
|
||||
break;
|
||||
|
||||
default:
|
||||
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) {
|
||||
|
@ -514,7 +584,6 @@ void ocpu_execute() {
|
|||
case REG_A:
|
||||
ocpu.A++;
|
||||
break;
|
||||
|
||||
case REG_BL:
|
||||
ocpu.B++;
|
||||
ocpu.BL = ocpu.B & 0xFF;
|
||||
|
@ -526,7 +595,6 @@ void ocpu_execute() {
|
|||
case REG_B:
|
||||
ocpu.B++;
|
||||
break;
|
||||
|
||||
case REG_CL:
|
||||
ocpu.C++;
|
||||
ocpu.CL = ocpu.C & 0xFF;
|
||||
|
@ -538,7 +606,6 @@ void ocpu_execute() {
|
|||
case REG_C:
|
||||
ocpu.C++;
|
||||
break;
|
||||
|
||||
case REG_DL:
|
||||
ocpu.D++;
|
||||
ocpu.DL = ocpu.D & 0xFF;
|
||||
|
@ -550,7 +617,6 @@ void ocpu_execute() {
|
|||
case REG_D:
|
||||
ocpu.D++;
|
||||
break;
|
||||
|
||||
case REG_EL:
|
||||
ocpu.E++;
|
||||
ocpu.EL = ocpu.E & 0xFF;
|
||||
|
@ -562,7 +628,6 @@ void ocpu_execute() {
|
|||
case REG_E:
|
||||
ocpu.E++;
|
||||
break;
|
||||
|
||||
case REG_FL:
|
||||
ocpu.F++;
|
||||
ocpu.FL = ocpu.F & 0xFF;
|
||||
|
@ -574,7 +639,6 @@ void ocpu_execute() {
|
|||
case REG_F:
|
||||
ocpu.F++;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Wrong register: %02X\n", reg);
|
||||
return;
|
||||
|
@ -594,7 +658,6 @@ void ocpu_execute() {
|
|||
case REG_A:
|
||||
ocpu.A--;
|
||||
break;
|
||||
|
||||
case REG_BL:
|
||||
ocpu.B--;
|
||||
ocpu.BL = ocpu.B & 0xFF;
|
||||
|
@ -606,7 +669,6 @@ void ocpu_execute() {
|
|||
case REG_B:
|
||||
ocpu.B--;
|
||||
break;
|
||||
|
||||
case REG_CL:
|
||||
ocpu.C--;
|
||||
ocpu.CL = ocpu.C & 0xFF;
|
||||
|
@ -618,7 +680,6 @@ void ocpu_execute() {
|
|||
case REG_C:
|
||||
ocpu.C--;
|
||||
break;
|
||||
|
||||
case REG_DL:
|
||||
ocpu.D--;
|
||||
ocpu.DL = ocpu.D & 0xFF;
|
||||
|
@ -630,7 +691,6 @@ void ocpu_execute() {
|
|||
case REG_D:
|
||||
ocpu.D--;
|
||||
break;
|
||||
|
||||
case REG_EL:
|
||||
ocpu.E--;
|
||||
ocpu.EL = ocpu.E & 0xFF;
|
||||
|
@ -642,7 +702,6 @@ void ocpu_execute() {
|
|||
case REG_E:
|
||||
ocpu.E--;
|
||||
break;
|
||||
|
||||
case REG_FL:
|
||||
ocpu.F--;
|
||||
ocpu.FL = ocpu.F & 0xFF;
|
||||
|
@ -654,7 +713,6 @@ void ocpu_execute() {
|
|||
case REG_F:
|
||||
ocpu.F--;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("Wrong register: %02X\n", reg);
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue