Further implementation of I/O
This commit is contained in:
parent
b9f6acdd76
commit
b0536826aa
1 changed files with 95 additions and 11 deletions
104
emulator_shell.c
104
emulator_shell.c
|
@ -16,10 +16,27 @@ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer use
|
|||
case GDK_KEY_Left:
|
||||
// Code to be executed when the left arrow key is pressed down
|
||||
g_print("Left arrow key pressed down\n");
|
||||
keyDown(1);
|
||||
break;
|
||||
case GDK_KEY_Right:
|
||||
// Code to be executed when the right arrow key is pressed down
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -33,11 +50,29 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u
|
|||
case GDK_KEY_Left:
|
||||
// Code to be executed when the left arrow key is released
|
||||
g_print("Left arrow key released\n");
|
||||
keyUp(1);
|
||||
break;
|
||||
case GDK_KEY_Right:
|
||||
// Code to be executed when the right arrow key is released
|
||||
g_print("Right arrow key released\n");
|
||||
keyUp(2);
|
||||
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;
|
||||
|
@ -45,6 +80,8 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u
|
|||
|
||||
//===== EMULATOR SETUP =====
|
||||
|
||||
uint8_t in_port; //GLOBALLY DECLARED
|
||||
|
||||
typedef struct ConditionCodes {
|
||||
//bitfields for condition codes
|
||||
//the number following the variables sets the number of bits
|
||||
|
@ -430,7 +467,7 @@ uint8_t machineIn(State8080* state, uint8_t port) {
|
|||
a = 1;
|
||||
break;
|
||||
case 2:
|
||||
a = 0;
|
||||
a = in_port;
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
|
@ -586,7 +623,8 @@ int emulate8080(State8080* state) {
|
|||
uint32_t hl = (state->h << 8) | state->l;
|
||||
uint32_t result = hl + hl;
|
||||
state->h = (result & 0xff00) >> 8;
|
||||
state->l = result & 0xff;
|
||||
state->l = result & 0xff;0[*opcode];
|
||||
}
|
||||
state->cc.cy = ((result & 0xffff0000) != 0);
|
||||
}
|
||||
break;
|
||||
|
@ -857,6 +895,7 @@ int emulate8080(State8080* state) {
|
|||
default: unknownInstruction(state); break;
|
||||
}
|
||||
printState(state);
|
||||
return cycles8080[*opcode];
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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[]) {
|
||||
|
||||
// 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
|
||||
|
@ -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.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;
|
||||
char done = 0;
|
||||
int counter;
|
||||
|
||||
while (!done) {
|
||||
emulate8080(state);
|
||||
counter = emulate8080(state);
|
||||
i++;
|
||||
sleep(0.00001);
|
||||
if ( time() - lastInterrupt > 1.0/60.0) //1/60 second has elapsed
|
||||
|
|
Loading…
Reference in a new issue