Still having I/O problems
This commit is contained in:
parent
c304d49b24
commit
85bc469a9c
1 changed files with 44 additions and 43 deletions
|
@ -397,6 +397,35 @@ void printState(State8080* state) {
|
||||||
state->e, state->h, state->l, state->sp);
|
state->e, state->h, state->l, state->sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t machineIn(State8080* state, uint8_t port) {
|
||||||
|
uint8_t a;
|
||||||
|
switch(port) {
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
uint16_t v = (state->shift1<<8) | (state->shift0);
|
||||||
|
a = ((v >> (8-state->shift_offset)) & 0xff);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t machineOut(State8080* state, uint8_t port, uint8_t value) {
|
||||||
|
switch(port) {
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
state->shift_offset = value & 0x7;
|
||||||
|
} break;
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
state->shift0 = state->shift1;
|
||||||
|
state->shift1 = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int emulate8080(State8080* state) {
|
int emulate8080(State8080* state) {
|
||||||
unsigned char *opcode = &(state->memory[state->pc]);
|
unsigned char *opcode = &(state->memory[state->pc]);
|
||||||
|
|
||||||
|
@ -696,7 +725,8 @@ int emulate8080(State8080* state) {
|
||||||
state->sp += 2;
|
state->sp += 2;
|
||||||
break;
|
break;
|
||||||
case 0xd3: // OUT byte
|
case 0xd3: // OUT byte
|
||||||
//printf("%c", opcode[1]);
|
uint8_t port = opcode[1];
|
||||||
|
machineOut(state, port, 0x00); // PROBLEM: We need to pass a value to machineOUT
|
||||||
state->pc++;
|
state->pc++;
|
||||||
break;
|
break;
|
||||||
case 0xd5: // PUSH D
|
case 0xd5: // PUSH D
|
||||||
|
@ -705,7 +735,8 @@ int emulate8080(State8080* state) {
|
||||||
state->sp -= 2;
|
state->sp -= 2;
|
||||||
break;
|
break;
|
||||||
case 0xdb: // IN byte
|
case 0xdb: // IN byte
|
||||||
//printf("%c", opcode[1]);
|
uint8_t port = opcode[1];
|
||||||
|
state->a = machineIn(state, port);
|
||||||
state->pc++;
|
state->pc++;
|
||||||
break;
|
break;
|
||||||
case 0xe1: // POP H
|
case 0xe1: // POP H
|
||||||
|
@ -781,9 +812,19 @@ int emulate8080(State8080* state) {
|
||||||
default: unknownInstruction(state); break;
|
default: unknownInstruction(state); break;
|
||||||
}
|
}
|
||||||
printState(state);
|
printState(state);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GenerateInterrupt(State8080* state, int interrupt_num)
|
||||||
|
{
|
||||||
|
//perform "PUSH PC"
|
||||||
|
Push(state, (state->pc & 0xFF00) >> 8, (state->pc & 0xff));
|
||||||
|
|
||||||
|
//Set the PC to the low memory vector.
|
||||||
|
//This is identical to an "RST interrupt_num" instruction.
|
||||||
|
state->pc = 8 * interrupt_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void read_Space_Invaders_ROM(State8080* state, const char* filename, int offset) {
|
void read_Space_Invaders_ROM(State8080* state, const char* filename, int offset) {
|
||||||
//Works exclusively with the memory system of Space Invaders
|
//Works exclusively with the memory system of Space Invaders
|
||||||
FILE* file = fopen(filename, "rb");
|
FILE* file = fopen(filename, "rb");
|
||||||
|
@ -802,34 +843,6 @@ void read_Space_Invaders_ROM(State8080* state, const char* filename, int offset)
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t machineIn(State8080* state, uint8_t port) {
|
|
||||||
uint8_t a;
|
|
||||||
switch(port) {
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
uint16_t v = (state->shift1<<8) | (state->shift0);
|
|
||||||
a = ((v >> (8-state->shift_offset)) & 0xff);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t machineOut(State8080* state, uint8_t port, uint8_t value) {
|
|
||||||
uint8_t a;
|
|
||||||
switch(port) {
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
state->shift_offset = value & 0x7;
|
|
||||||
} break;
|
|
||||||
case 4:
|
|
||||||
{
|
|
||||||
state->shift0 = state->shift1;
|
|
||||||
state->shift1 = value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int argc, char *argv[]) {
|
int main (int argc, char *argv[]) {
|
||||||
gtk_init(&argc, &argv);
|
gtk_init(&argc, &argv);
|
||||||
|
@ -861,18 +874,6 @@ int main (int argc, char *argv[]) {
|
||||||
char done = 0;
|
char done = 0;
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
uint8_t* opcode = &state->memory[state->pc];
|
|
||||||
printf("%d\t\t:", i);
|
|
||||||
|
|
||||||
if (*opcode == 0xdb) {
|
|
||||||
uint8_t port = opcode[1];
|
|
||||||
state->a = machineIn(state, port);
|
|
||||||
state->pc++;
|
|
||||||
} else if (*opcode == 0xd3) {
|
|
||||||
uint8_t port = opcode[1];
|
|
||||||
machineOut(state, port, 0x00);
|
|
||||||
state->pc++;
|
|
||||||
}
|
|
||||||
emulate8080(state);
|
emulate8080(state);
|
||||||
i++;
|
i++;
|
||||||
sleep(0.00001);
|
sleep(0.00001);
|
||||||
|
|
Loading…
Reference in a new issue