static void kbd_write_data(void *opaque, hwaddr addr, uint64_t val, unsigned size) { KBDState *s = opaque; DPRINTF("kbd: write data=0x%02" PRIx64 "\n", val); switch(s->write_cmd) { case 0: ps2_write_keyboard(s->kbd, val); break; case KBD_CCMD_WRITE_MODE: s->mode = val; ps2_keyboard_set_translation(s->kbd, (s->mode & KBD_MODE_KCC) != 0); /* ??? */ kbd_update_irq(s); break; case KBD_CCMD_WRITE_OBUF: kbd_queue(s, val, 0); break; case KBD_CCMD_WRITE_AUX_OBUF: kbd_queue(s, val, 1); break; case KBD_CCMD_WRITE_OUTPORT: outport_write(s, val); break; case KBD_CCMD_WRITE_MOUSE: ps2_write_mouse(s->mouse, val); break; default: break; } s->write_cmd = 0; }
static void kbd_write_command(struct kvm *kvm, u8 val) { switch (val) { case I8042_CMD_CTL_RCTR: kbd_queue(state.mode); break; case I8042_CMD_CTL_WCTR: case I8042_CMD_AUX_SEND: case I8042_CMD_AUX_LOOP: state.write_cmd = val; break; case I8042_CMD_AUX_TEST: /* 0 means we're a normal PS/2 mouse */ mouse_queue(0); break; case I8042_CMD_AUX_DISABLE: state.mode |= MODE_DISABLE_AUX; break; case I8042_CMD_AUX_ENABLE: state.mode &= ~MODE_DISABLE_AUX; break; case I8042_CMD_SYSTEM_RESET: kvm_cpu__reboot(kvm); break; default: break; } }
static void kbd_write_data(void *opaque, uint32_t addr, uint32_t val) { KBDState *s = opaque; #ifdef DEBUG_KBD printf("kbd: write data=0x%02x\n", val); #endif switch(s->write_cmd) { case 0: ps2_write_keyboard(s->kbd, val); break; case KBD_CCMD_WRITE_MODE: s->mode = val; ps2_keyboard_set_translation(s->kbd, (s->mode & KBD_MODE_KCC) != 0); /* ??? */ kbd_update_irq(s); break; case KBD_CCMD_WRITE_OBUF: kbd_queue(s, val, 0); break; case KBD_CCMD_WRITE_AUX_OBUF: kbd_queue(s, val, 1); break; case KBD_CCMD_WRITE_OUTPORT: #ifdef TARGET_I386 ioport_set_a20((val >> 1) & 1); #endif if (!(val & 1)) { qemu_system_reset_request(); } break; case KBD_CCMD_WRITE_MOUSE: ps2_write_mouse(s->mouse, val); break; default: break; } s->write_cmd = 0; }
// returns keypress from the keyboard using fast kbd reading short int getKey(short int wait) { unsigned short int key = 0, done = 0; void *kbq = kbd_queue(); // if we are told to wait, then wait until we have a key, else return anything we have while (!done) { if (!wait || !OSdequeue(&key,kbq)) { done = 1; } } // cast to signed for easier comparison return (signed short int)key; }
/* * Called when the OS writes to port 0x60 (data port) * Things written here are generally arguments to commands previously * written to port 0x64 and stored in state.write_cmd */ static void kbd_write_data(u32 val) { switch (state.write_cmd) { case I8042_CMD_CTL_WCTR: state.mode = val; kbd_update_irq(); break; case I8042_CMD_AUX_LOOP: mouse_queue(val); mouse_queue(RESPONSE_ACK); break; case I8042_CMD_AUX_SEND: /* The OS wants to send a command to the mouse */ mouse_queue(RESPONSE_ACK); switch (val) { case 0xe6: /* set scaling = 1:1 */ state.mstatus &= ~AUX_SCALING_FLAG; break; case 0xe8: /* set resolution */ state.mres = val; break; case 0xe9: /* Report mouse status/config */ mouse_queue(state.mstatus); mouse_queue(state.mres); mouse_queue(state.msample); break; case 0xf2: /* send ID */ mouse_queue(0); /* normal mouse */ break; case 0xf3: /* set sample rate */ state.msample = val; break; case 0xf4: /* enable reporting */ state.mstatus |= AUX_ENABLE_REPORTING; break; case 0xf5: state.mstatus &= ~AUX_ENABLE_REPORTING; break; case 0xf6: /* set defaults, just fall through to reset */ case 0xff: /* reset */ state.mstatus = 0x0; state.mres = AUX_DEFAULT_RESOLUTION; state.msample = AUX_DEFAULT_SAMPLE; break; default: break; } break; case 0: /* Just send the ID */ kbd_queue(RESPONSE_ACK); kbd_queue(0xab); kbd_queue(0x41); kbd_update_irq(); break; default: /* Yeah whatever */ break; } state.write_cmd = 0; }
static void kbd_write_command(void *opaque, uint32_t addr, uint32_t val) { KBDState *s = opaque; #ifdef DEBUG_KBD printf("kbd: write cmd=0x%02x\n", val); #endif switch(val) { case KBD_CCMD_READ_MODE: kbd_queue(s, s->mode, 0); break; case KBD_CCMD_WRITE_MODE: case KBD_CCMD_WRITE_OBUF: case KBD_CCMD_WRITE_AUX_OBUF: case KBD_CCMD_WRITE_MOUSE: case KBD_CCMD_WRITE_OUTPORT: s->write_cmd = val; break; case KBD_CCMD_MOUSE_DISABLE: s->mode |= KBD_MODE_DISABLE_MOUSE; break; case KBD_CCMD_MOUSE_ENABLE: s->mode &= ~KBD_MODE_DISABLE_MOUSE; break; case KBD_CCMD_TEST_MOUSE: kbd_queue(s, 0x00, 0); break; case KBD_CCMD_SELF_TEST: s->status |= KBD_STAT_SELFTEST; kbd_queue(s, 0x55, 0); break; case KBD_CCMD_KBD_TEST: kbd_queue(s, 0x00, 0); break; case KBD_CCMD_KBD_DISABLE: s->mode |= KBD_MODE_DISABLE_KBD; kbd_update_irq(s); break; case KBD_CCMD_KBD_ENABLE: s->mode &= ~KBD_MODE_DISABLE_KBD; kbd_update_irq(s); break; case KBD_CCMD_READ_INPORT: kbd_queue(s, 0x00, 0); break; case KBD_CCMD_READ_OUTPORT: /* XXX: check that */ #ifdef TARGET_I386 val = 0x01 | (ioport_get_a20() << 1); #else val = 0x01; #endif if (s->status & KBD_STAT_OBF) val |= 0x10; if (s->status & KBD_STAT_MOUSE_OBF) val |= 0x20; kbd_queue(s, val, 0); break; #ifdef TARGET_I386 case KBD_CCMD_ENABLE_A20: ioport_set_a20(1); break; case KBD_CCMD_DISABLE_A20: ioport_set_a20(0); break; #endif case KBD_CCMD_RESET: qemu_system_reset_request(); break; case 0xff: /* ignore that - I don't know what is its use */ break; default: fprintf(stderr, "qemu: unsupported keyboard cmd=0x%02x\n", val); break; } }
static void kbd_write_command(void *opaque, hwaddr addr, uint64_t val, unsigned size) { KBDState *s = opaque; DPRINTF("kbd: write cmd=0x%02" PRIx64 "\n", val); /* Bits 3-0 of the output port P2 of the keyboard controller may be pulsed * low for approximately 6 micro seconds. Bits 3-0 of the KBD_CCMD_PULSE * command specify the output port bits to be pulsed. * 0: Bit should be pulsed. 1: Bit should not be modified. * The only useful version of this command is pulsing bit 0, * which does a CPU reset. */ if((val & KBD_CCMD_PULSE_BITS_3_0) == KBD_CCMD_PULSE_BITS_3_0) { if(!(val & 1)) val = KBD_CCMD_RESET; else val = KBD_CCMD_NO_OP; } switch(val) { case KBD_CCMD_READ_MODE: kbd_queue(s, s->mode, 0); break; case KBD_CCMD_WRITE_MODE: case KBD_CCMD_WRITE_OBUF: case KBD_CCMD_WRITE_AUX_OBUF: case KBD_CCMD_WRITE_MOUSE: case KBD_CCMD_WRITE_OUTPORT: s->write_cmd = val; break; case KBD_CCMD_MOUSE_DISABLE: s->mode |= KBD_MODE_DISABLE_MOUSE; break; case KBD_CCMD_MOUSE_ENABLE: s->mode &= ~KBD_MODE_DISABLE_MOUSE; break; case KBD_CCMD_TEST_MOUSE: kbd_queue(s, 0x00, 0); break; case KBD_CCMD_SELF_TEST: s->status |= KBD_STAT_SELFTEST; kbd_queue(s, 0x55, 0); break; case KBD_CCMD_KBD_TEST: kbd_queue(s, 0x00, 0); break; case KBD_CCMD_KBD_DISABLE: s->mode |= KBD_MODE_DISABLE_KBD; kbd_update_irq(s); break; case KBD_CCMD_KBD_ENABLE: s->mode &= ~KBD_MODE_DISABLE_KBD; kbd_update_irq(s); break; case KBD_CCMD_READ_INPORT: kbd_queue(s, 0x80, 0); break; case KBD_CCMD_READ_OUTPORT: kbd_queue(s, s->outport, 0); break; case KBD_CCMD_ENABLE_A20: qemu_irq_raise(s->a20_out); s->outport |= KBD_OUT_A20; break; case KBD_CCMD_DISABLE_A20: qemu_irq_lower(s->a20_out); s->outport &= ~KBD_OUT_A20; break; case KBD_CCMD_RESET: qemu_system_reset_request(); break; case KBD_CCMD_NO_OP: /* ignore that */ break; default: fprintf(stderr, "qemu: unsupported keyboard cmd=0x%02x\n", (int)val); break; } }
// entry point void _main(void) { // some variables for the main loop unsigned int lasttick = 0; void *keyqueue = kbd_queue(); unsigned short key; // initiate all the stuff init(); // start at the menu switchgs(GS_MENU); // main loop while (gs != GS_NONE) { // run at 20 fps if (FiftyMsecTick != lasttick) { // Check for keypresses if (!OSdequeue(&key, keyqueue)) { if (key == KEY_ON) off(); else if (key == KEY_QUIT) switchgs(GS_NONE); else { switch (gs) { case GS_MENU: if (key == KEY_ENTER) switchgs(GS_GAME); else if (key == KEY_ESC) switchgs(GS_NONE); break; case GS_GAME: if (key == KEY_ENTER) game_flap(); else if (key == KEY_ESC) switchgs(GS_MENU); break; case GS_GAMEOVER: if (key == KEY_ENTER) switchgs(GS_GAME); else if (key == KEY_ESC) switchgs(GS_MENU); break; default: break; } } } // draw to the buffers GrayClearScreen2B(lightbuffer, darkbuffer); switch (gs) { case GS_MENU: menu_update(); menu_draw(); break; case GS_GAME: game_update(); game_draw(); break; case GS_GAMEOVER: gameover_update(); game_draw(); gameover_draw(); break; default: break; } // flip the buffers FastCopyScreen(darkbuffer, darkplane); FastCopyScreen(lightbuffer, lightplane); lasttick = FiftyMsecTick; framecounter++; } } // important! deinit(); }