690 lines
14 KiB
C
690 lines
14 KiB
C
#include <yemu/ocpu.h>
|
|
|
|
struct OCPU ocpu;
|
|
struct OCPU_MEMORY ocpu_mem;
|
|
|
|
void ocpu_memory_init () {
|
|
for (int i = 0; i < MAX_MEMORY; i++){
|
|
ocpu_mem.memory[i] = 0;
|
|
}
|
|
}
|
|
|
|
byte ocpu_fetch_byte() {
|
|
byte data = ocpu_mem.memory[ocpu.PC];
|
|
ocpu.PC++;
|
|
return data;
|
|
}
|
|
|
|
word ocpu_fetch_word() {
|
|
word data = ocpu_mem.memory[ocpu.PC];
|
|
ocpu.PC++;
|
|
|
|
data |= (ocpu_mem.memory[ocpu.PC] << 8);
|
|
ocpu.PC++;
|
|
|
|
return data;
|
|
}
|
|
|
|
void ocpu_reset () {
|
|
ocpu.PC = 0x0000; // FIXME
|
|
ocpu.SP = 0x0000; //FIXME
|
|
ocpu.A = ocpu.B = ocpu.C = ocpu.D = ocpu.E = ocpu.F = 0;
|
|
ocpu.ZF = ocpu.NF = ocpu.CF = ocpu.OF = 0;
|
|
ocpu_memory_init(ocpu_mem);
|
|
}
|
|
|
|
void ocpu_dump_ocpu(struct OCPU ocpu) { // FIXME
|
|
printf("PC: %04X\n", ocpu.PC);
|
|
printf("SP: %04X\n", ocpu.SP);
|
|
printf("\n");
|
|
printf("AL: %04X BL: %04X\n", ocpu.AL, ocpu.BL);
|
|
printf("AH: %04X BH: %04X\n", ocpu.AH, ocpu.BH);
|
|
printf("A: %04X B: %04X\n", ocpu.A, ocpu.B);
|
|
printf("\n");
|
|
printf("CL: %04X DL: %04X\n", ocpu.CL, ocpu.DL);
|
|
printf("CH: %04X DH: %04X\n", ocpu.CH, ocpu.DH);
|
|
printf("C: %04X D: %04X\n", ocpu.C, ocpu.D);
|
|
printf("\n");
|
|
printf("EL: %04X FL: %04X\n", ocpu.EL, ocpu.FL);
|
|
printf("EH: %04X FH: %04X\n", ocpu.EH, ocpu.FH);
|
|
printf("E: %04X F: %04X\n", ocpu.E, ocpu.F);
|
|
printf("\n");
|
|
printf("Flags: ZF: %X, NF: %X, CF: %X, OF: %X\n", ocpu.ZF, ocpu.NF, ocpu.CF, ocpu.OF);
|
|
}
|
|
|
|
int match_register(byte reg) { // Function that returns register's value by taking register opcode
|
|
switch(reg) {
|
|
case REG_AL:
|
|
return ocpu.AL;
|
|
case REG_AH:
|
|
return ocpu.AH;
|
|
case REG_A:
|
|
return ocpu.A;
|
|
|
|
case REG_BL:
|
|
return ocpu.BL;
|
|
case REG_BH:
|
|
return ocpu.BH;
|
|
case REG_B:
|
|
return ocpu.B;
|
|
|
|
case REG_CL:
|
|
return ocpu.CL;
|
|
case REG_CH:
|
|
return ocpu.CH;
|
|
case REG_C:
|
|
return ocpu.C;
|
|
|
|
case REG_DL:
|
|
return ocpu.DL;
|
|
case REG_DH:
|
|
return ocpu.DH;
|
|
case REG_D:
|
|
return ocpu.D;
|
|
|
|
case REG_EL:
|
|
return ocpu.EL;
|
|
case REG_EH:
|
|
return ocpu.EH;
|
|
case REG_E:
|
|
return ocpu.E;
|
|
|
|
case REG_FL:
|
|
return ocpu.FL;
|
|
case REG_FH:
|
|
return ocpu.FH;
|
|
case REG_F:
|
|
return ocpu.F;
|
|
}
|
|
return 0xFF; // FIXME: add some error handling
|
|
}
|
|
|
|
void ocpu_execute() {
|
|
byte reg;
|
|
byte value;
|
|
word word_value;
|
|
while (1) {
|
|
byte instruction = ocpu_fetch_byte();
|
|
switch(instruction) {
|
|
case INS_MOV_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_MOV_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_ADD_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_ADD_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) {
|
|
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;
|
|
}
|
|
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;
|
|
}
|
|
break;
|
|
case INS_OCPU_NOP:
|
|
break;
|
|
case 0x00:
|
|
return;
|
|
default:
|
|
printf("Unrecognized instruction: %04X\n", instruction);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void initOCPU(FILE *infile) {
|
|
ocpu_reset();
|
|
int ch;
|
|
int pos = 0;
|
|
while (1) { // FIXME
|
|
ch = fgetc(infile);
|
|
if (ch == EOF)
|
|
break;
|
|
ocpu_mem.memory[pos] = ch;
|
|
pos++;
|
|
}
|
|
|
|
ocpu_execute();
|
|
ocpu_dump_ocpu(ocpu);
|
|
return;
|
|
}
|