Further implementation of I/O
This commit is contained in:
parent
b9f6acdd76
commit
b0536826aa
1 changed files with 95 additions and 11 deletions
106
emulator_shell.c
106
emulator_shell.c
|
@ -16,10 +16,27 @@ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer use
|
||||||
case GDK_KEY_Left:
|
case GDK_KEY_Left:
|
||||||
// Code to be executed when the left arrow key is pressed down
|
// Code to be executed when the left arrow key is pressed down
|
||||||
g_print("Left arrow key pressed down\n");
|
g_print("Left arrow key pressed down\n");
|
||||||
|
keyDown(1);
|
||||||
break;
|
break;
|
||||||
case GDK_KEY_Right:
|
case GDK_KEY_Right:
|
||||||
// Code to be executed when the right arrow key is pressed down
|
// Code to be executed when the right arrow key is pressed down
|
||||||
g_print("Right arrow key pressed down\n");
|
g_print("Right arrow key pressed down\n");
|
||||||
|
keyDown(2);
|
||||||
|
break;
|
||||||
|
case GDK_KEY_space:
|
||||||
|
// Code to be executed when the space bar is pressed down
|
||||||
|
g_print("Space bar pressed down\n");
|
||||||
|
keyDown(3);
|
||||||
|
break;
|
||||||
|
case GDK_KEY_c:
|
||||||
|
// Code to be executed when the 'c' key is pressed down
|
||||||
|
g_print("'c' key pressed down\n");
|
||||||
|
keyDown(0);
|
||||||
|
break;
|
||||||
|
case GDK_KEY_s:
|
||||||
|
// Code to be executed when the 's' key is pressed down
|
||||||
|
g_print("'s' key pressed down\n");
|
||||||
|
keyDown(4);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,11 +50,29 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u
|
||||||
case GDK_KEY_Left:
|
case GDK_KEY_Left:
|
||||||
// Code to be executed when the left arrow key is released
|
// Code to be executed when the left arrow key is released
|
||||||
g_print("Left arrow key released\n");
|
g_print("Left arrow key released\n");
|
||||||
|
keyUp(1);
|
||||||
break;
|
break;
|
||||||
case GDK_KEY_Right:
|
case GDK_KEY_Right:
|
||||||
// Code to be executed when the right arrow key is released
|
// Code to be executed when the right arrow key is released
|
||||||
g_print("Right arrow key released\n");
|
g_print("Right arrow key released\n");
|
||||||
|
keyUp(2);
|
||||||
break;
|
break;
|
||||||
|
case GDK_KEY_space:
|
||||||
|
// Code to be executed when the space bar is pressed down
|
||||||
|
g_print("Space bar released\n");
|
||||||
|
keyUp(3);
|
||||||
|
break;
|
||||||
|
case GDK_KEY_c:
|
||||||
|
// Code to be executed when the 'c' key is pressed down
|
||||||
|
g_print("'c' key released\n");
|
||||||
|
keyUp(0);
|
||||||
|
break;
|
||||||
|
case GDK_KEY_s:
|
||||||
|
// Code to be executed when the 's' key is pressed down
|
||||||
|
g_print("'s' key released\n");
|
||||||
|
keyUp(4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -45,6 +80,8 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u
|
||||||
|
|
||||||
//===== EMULATOR SETUP =====
|
//===== EMULATOR SETUP =====
|
||||||
|
|
||||||
|
uint8_t in_port; //GLOBALLY DECLARED
|
||||||
|
|
||||||
typedef struct ConditionCodes {
|
typedef struct ConditionCodes {
|
||||||
//bitfields for condition codes
|
//bitfields for condition codes
|
||||||
//the number following the variables sets the number of bits
|
//the number following the variables sets the number of bits
|
||||||
|
@ -430,14 +467,14 @@ uint8_t machineIn(State8080* state, uint8_t port) {
|
||||||
a = 1;
|
a = 1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
a = 0;
|
a = in_port;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
uint16_t v = (state->shift1<<8) | (state->shift0);
|
uint16_t v = (state->shift1<<8) | (state->shift0);
|
||||||
a = ((v >> (8-state->shift_offset)) & 0xff);
|
a = ((v >> (8-state->shift_offset)) & 0xff);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
@ -586,7 +623,8 @@ int emulate8080(State8080* state) {
|
||||||
uint32_t hl = (state->h << 8) | state->l;
|
uint32_t hl = (state->h << 8) | state->l;
|
||||||
uint32_t result = hl + hl;
|
uint32_t result = hl + hl;
|
||||||
state->h = (result & 0xff00) >> 8;
|
state->h = (result & 0xff00) >> 8;
|
||||||
state->l = result & 0xff;
|
state->l = result & 0xff;0[*opcode];
|
||||||
|
}
|
||||||
state->cc.cy = ((result & 0xffff0000) != 0);
|
state->cc.cy = ((result & 0xffff0000) != 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -857,6 +895,7 @@ int emulate8080(State8080* state) {
|
||||||
default: unknownInstruction(state); break;
|
default: unknownInstruction(state); break;
|
||||||
}
|
}
|
||||||
printState(state);
|
printState(state);
|
||||||
|
return cycles8080[*opcode];
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateInterrupt(State8080* state, int interrupt_num)
|
void generateInterrupt(State8080* state, int interrupt_num)
|
||||||
|
@ -891,16 +930,52 @@ void read_Space_Invaders_ROM(State8080* state, const char* filename, int offset)
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void keyDown(uint8_t key)
|
||||||
|
{
|
||||||
|
switch(key) {
|
||||||
|
case 0: // COIN
|
||||||
|
in_port |= 0x1;
|
||||||
|
break;
|
||||||
|
case 1: // LEFT
|
||||||
|
in_port |= 0x20;
|
||||||
|
break;
|
||||||
|
case 2: // RIGHT
|
||||||
|
in_port |= 0x40;
|
||||||
|
break;
|
||||||
|
case 3: // FIRE
|
||||||
|
in_port |= 0x10;
|
||||||
|
break;
|
||||||
|
case 4: // START
|
||||||
|
in_port |= 0x04;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyUp( uint8_t key)
|
||||||
|
{
|
||||||
|
switch(key) {
|
||||||
|
case 0: // COIN
|
||||||
|
in_port &= ~0x1;
|
||||||
|
break;
|
||||||
|
case 1: // LEFT
|
||||||
|
in_port &= ~0x20;
|
||||||
|
break;
|
||||||
|
case 2: // RIGHT
|
||||||
|
in_port &= ~0x40;
|
||||||
|
break;
|
||||||
|
case 3: // FIRE
|
||||||
|
in_port &= ~0x10;
|
||||||
|
break;
|
||||||
|
case 4: // START
|
||||||
|
in_port &= ~0x04;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main (int argc, char *argv[]) {
|
int main (int argc, char *argv[]) {
|
||||||
|
|
||||||
// GTK INIT
|
|
||||||
gtk_init(&argc, &argv);
|
|
||||||
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
||||||
g_print("Test\n");
|
|
||||||
g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
|
|
||||||
g_signal_connect(window, "key-release-event", G_CALLBACK(on_key_release), NULL);
|
|
||||||
gtk_widget_show(window);
|
|
||||||
|
|
||||||
|
|
||||||
// EMULATOR INIT
|
// EMULATOR INIT
|
||||||
|
@ -919,11 +994,20 @@ int main (int argc, char *argv[]) {
|
||||||
read_Space_Invaders_ROM(state, "ROM/invaders.f", 0x1000);
|
read_Space_Invaders_ROM(state, "ROM/invaders.f", 0x1000);
|
||||||
read_Space_Invaders_ROM(state, "ROM/invaders.e", 0x1800);
|
read_Space_Invaders_ROM(state, "ROM/invaders.e", 0x1800);
|
||||||
|
|
||||||
|
// GTK INIT
|
||||||
|
gtk_init(&argc, &argv);
|
||||||
|
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
|
g_print("Test\n");
|
||||||
|
g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
|
||||||
|
g_signal_connect(window, "key-release-event", G_CALLBACK(on_key_release), NULL);
|
||||||
|
gtk_widget_show(window);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
char done = 0;
|
char done = 0;
|
||||||
|
int counter;
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
emulate8080(state);
|
counter = emulate8080(state);
|
||||||
i++;
|
i++;
|
||||||
sleep(0.00001);
|
sleep(0.00001);
|
||||||
if ( time() - lastInterrupt > 1.0/60.0) //1/60 second has elapsed
|
if ( time() - lastInterrupt > 1.0/60.0) //1/60 second has elapsed
|
||||||
|
|
Loading…
Reference in a new issue