ocpu: Add handling for ZF and NF flags
This commit is contained in:
parent
1d4eb7f26d
commit
cad208e9c8
|
@ -100,73 +100,96 @@ int match_register(byte reg) { // Function that returns register's value by taki
|
|||
return 0xFF; // FIXME: add some error handling
|
||||
}
|
||||
|
||||
void set_flags(byte reg_value) {
|
||||
ocpu.ZF = (reg_value == 0);
|
||||
ocpu.NF = (reg_value & 0x40) > 0;
|
||||
}
|
||||
|
||||
void write_register(byte reg, byte value, word word_value) {
|
||||
switch(reg) {
|
||||
case REG_AL:
|
||||
ocpu.A = (ocpu.A & 0xFF00) | (value & 0xFF);
|
||||
ocpu.AL = ocpu.A & 0xFF;
|
||||
set_flags(ocpu.AL);
|
||||
break;
|
||||
case REG_AH:
|
||||
ocpu.A = ((value & 0xFF) << 8) | (ocpu.A & 0xFF);
|
||||
ocpu.AH = ocpu.A >> 8;
|
||||
set_flags(ocpu.AH);
|
||||
break;
|
||||
case REG_A:
|
||||
ocpu.A = word_value;
|
||||
set_flags(ocpu.A);
|
||||
break;
|
||||
case REG_BL:
|
||||
ocpu.B = (ocpu.B & 0xFF00) | (value & 0xFF);
|
||||
ocpu.BL = ocpu.B & 0xFF;
|
||||
set_flags(ocpu.BL);
|
||||
break;
|
||||
case REG_BH:
|
||||
ocpu.B = ((value & 0xFF) << 8) | (ocpu.B & 0xFF);
|
||||
ocpu.BH = ocpu.B >> 8;
|
||||
set_flags(ocpu.BH);
|
||||
break;
|
||||
case REG_B:
|
||||
ocpu.B = word_value;
|
||||
set_flags(ocpu.B);
|
||||
break;
|
||||
case REG_CL:
|
||||
ocpu.C = (ocpu.C & 0xFF00) | (value & 0xFF);
|
||||
ocpu.CL = ocpu.C & 0xFF;
|
||||
set_flags(ocpu.CL);
|
||||
break;
|
||||
case REG_CH:
|
||||
ocpu.C = ((value & 0xFF) << 8) | (ocpu.C & 0xFF);
|
||||
ocpu.CH = ocpu.C >> 8;
|
||||
set_flags(ocpu.CH);
|
||||
break;
|
||||
case REG_C:
|
||||
ocpu.C = word_value;
|
||||
set_flags(ocpu.C);
|
||||
break;
|
||||
case REG_DL:
|
||||
ocpu.D = (ocpu.D & 0xFF00) | (value & 0xFF);
|
||||
ocpu.DL = ocpu.D & 0xFF;
|
||||
set_flags(ocpu.DL);
|
||||
break;
|
||||
case REG_DH:
|
||||
ocpu.D = ((value & 0xFF) << 8) | (ocpu.D & 0xFF);
|
||||
ocpu.DH = ocpu.D >> 8;
|
||||
set_flags(ocpu.DH);
|
||||
break;
|
||||
case REG_D:
|
||||
ocpu.D = word_value;
|
||||
set_flags(ocpu.D);
|
||||
break;
|
||||
case REG_EL:
|
||||
ocpu.E = (ocpu.E & 0xFF00) | (value & 0xFF);
|
||||
ocpu.EL = ocpu.E & 0xFF;
|
||||
set_flags(ocpu.EL);
|
||||
break;
|
||||
case REG_EH:
|
||||
ocpu.E = ((value & 0xFF) << 8) | (ocpu.E & 0xFF);
|
||||
ocpu.EH = ocpu.E >> 8;
|
||||
set_flags(ocpu.EH);
|
||||
break;
|
||||
case REG_E:
|
||||
ocpu.E = word_value;
|
||||
set_flags(ocpu.E);
|
||||
break;
|
||||
case REG_FL:
|
||||
ocpu.F = (ocpu.F & 0xFF00) | (value & 0xFF);
|
||||
ocpu.FL = ocpu.F & 0xFF;
|
||||
set_flags(ocpu.FL);
|
||||
break;
|
||||
case REG_FH:
|
||||
ocpu.F = ((value & 0xFF) << 8) | (ocpu.F & 0xFF);
|
||||
ocpu.FH = ocpu.F >> 8;
|
||||
set_flags(ocpu.FH);
|
||||
break;
|
||||
case REG_F:
|
||||
ocpu.F = word_value;
|
||||
set_flags(ocpu.F);
|
||||
break;
|
||||
default:
|
||||
printf("Wrong register: %02X\n", reg);
|
||||
|
|
Loading…
Reference in New Issue