/* * This is our keyup/keydown event handler. The arguments are documented in * the EVENTS section of the AG_Window(3) manual page. See AG_KeySym(3) for * a list of available key symbols. */ static void MyKeyboardHandler(AG_Event *event) { AG_Console *cons = AG_PTR(1); int sym = AG_INT(2); int mod = AG_INT(3); Uint32 unicode = (Uint32)AG_ULONG(4); AG_ConsoleMsg(cons, "%s: sym=%d, modifier=0x%x, unicode=0x%lx", event->name, sym, (unsigned)mod, unicode); }
void XM7_DbgKeyPressFn(AG_Event *event) { // キーハンドラー XM7_SDLView *disp = (XM7_SDLView *)AG_SELF(); struct XM7_MemDumpDesc *p = (struct XM7_MemDumpDesc *)AG_PTR(1); int sym = AG_INT(2); int mod = AG_INT(3); Uint32 unicode = (Uint32)AG_ULONG(4); DumpObject *cons; // printf("Key Press %04x %04x %08x\n", sym, mod, p); if(p == NULL) return; if(p->dump == NULL) return; if(p->dump->dump == NULL) return; cons = p->dump->dump; if(p->dump->paused == TRUE) { p->dump->paused = FALSE; cons->ClearScreen(); return; } if(p->dump->editAddr == TRUE) { XM7_DbgDumpSetAddress(event); return; } if(p->dump->editHex == TRUE) { XM7_DbgDumpEditMem(event); return; } switch(sym) { case AG_KEY_H: // Help cons->ClearScreen(); cons->MoveDrawPos(0, 0); cons->PutString("Dump Memory Help:"); cons->MoveDrawPos(0, 1); cons->PutString("J/j : Set Address"); cons->MoveDrawPos(40, 1); cons->PutString("ESC : Toggle Write"); cons->MoveDrawPos(0, 3); cons->PutString("Shift+UP : Roll UP"); cons->MoveDrawPos(0, 4); cons->PutString("Shift+DOWN: Roll Down"); cons->MoveDrawPos(40, 3); cons->PutString("Page Up : Page UP"); cons->MoveDrawPos(40, 4); cons->PutString("Page Up : Page UP"); cons->MoveDrawPos(0, 10); cons->PutString("Edit Mode"); cons->MoveDrawPos(0, 11); cons->PutString("0-9,A-F : Write Memory"); cons->MoveDrawPos(40, 21); cons->PutString("Press Any Key"); p->dump->paused = TRUE; break; case AG_KEY_J: case AG_KEY_SLASH: // Set Address cons->MoveDrawPos(0, 0); cons->PutString("Set Address >> "); p->dump->editAddr = TRUE; break; case AG_KEY_ESCAPE: if(p->dump->writeEnable) { p->dump->writeEnable = FALSE; } else { p->dump->writeEnable = TRUE; } p->dump->editHex = TRUE; break; case AG_KEY_UP: if(((AG_KEYMOD_LSHIFT | AG_KEYMOD_RSHIFT) & mod) != 0){ p->dump->addr -= 16; p->dump->addr &= 0x0000ffff; } else { p->dump->edaddr -= 16; p->dump->edaddr &= 0x0000ffff; } break; case AG_KEY_DOWN: if(((AG_KEYMOD_LSHIFT | AG_KEYMOD_RSHIFT) & mod) != 0){ p->dump->addr += 16; p->dump->addr &= 0x0000ffff; } else { p->dump->edaddr += 16; p->dump->edaddr &= 0x0000ffff; } break; case AG_KEY_LEFT: if(((AG_KEYMOD_LSHIFT | AG_KEYMOD_RSHIFT) & mod) != 0){ p->dump->addr -= 1; p->dump->addr &= 0x0000ffff; } else { p->dump->edaddr -= 1; p->dump->edaddr &= 0x0000ffff; } break; case AG_KEY_RIGHT: if(((AG_KEYMOD_LSHIFT | AG_KEYMOD_RSHIFT) & mod) != 0){ p->dump->addr += 1; p->dump->addr &= 0x0000ffff; } else { p->dump->edaddr += 1; p->dump->edaddr &= 0x0000ffff; } break; case AG_KEY_PAGEUP: p->dump->addr -= 256; p->dump->addr &= 0x0000ffff; p->dump->edaddr -= 256; p->dump->edaddr &= 0x0000ffff; break; case AG_KEY_PAGEDOWN: p->dump->addr += 256; p->dump->addr &= 0x0000ffff; p->dump->edaddr += 256; p->dump->edaddr &= 0x0000ffff; break; default: break; } if(((p->dump->addr + 256) & 0x0000ffff) <= p->dump->edaddr){ p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; }else if(p->dump->addr > p->dump->edaddr) { p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; } }
static void XM7_DbgDumpEditMem(AG_Event *event) { XM7_SDLView *disp = (XM7_SDLView *)AG_SELF(); struct XM7_MemDumpDesc *p = (struct XM7_MemDumpDesc *)AG_PTR(1); int sym = AG_INT(2); int mod = AG_INT(3); Uint32 unicode = (Uint32)AG_ULONG(4); DumpObject *cons; Uint8 hb = 0; if(p == NULL) return; if(p->dump == NULL) return; if(p->dump->baddr >= 2) { p->dump->baddr = 0; p->dump->bdata = 0; } switch(sym) { case AG_KEY_ESCAPE: if(p->dump->writeEnable) { p->dump->writeEnable = FALSE; } else { p->dump->writeEnable = TRUE; } p->dump->baddr = 0x0000; p->dump->bdata = 0x0000; p->dump->editHex = FALSE; return; break; case AG_KEY_0: case AG_KEY_KP0: hb = 0; p->dump->baddr++; break; case AG_KEY_1: case AG_KEY_KP1: hb = 1; p->dump->baddr++; break; case AG_KEY_2: case AG_KEY_KP2: hb = 2; p->dump->baddr++; break; case AG_KEY_3: case AG_KEY_KP3: hb = 3; p->dump->baddr++; break; case AG_KEY_4: case AG_KEY_KP4: hb = 4; p->dump->baddr++; break; case AG_KEY_5: case AG_KEY_KP5: hb = 5; p->dump->baddr++; break; case AG_KEY_6: case AG_KEY_KP6: hb = 6; p->dump->baddr++; break; case AG_KEY_7: case AG_KEY_KP7: hb = 7; p->dump->baddr++; break; case AG_KEY_8: case AG_KEY_KP8: hb = 8; p->dump->baddr++; break; case AG_KEY_9: case AG_KEY_KP9: hb = 9; p->dump->baddr++; break; case AG_KEY_A: hb = 0x0a; p->dump->baddr++; break; case AG_KEY_B: hb = 0x0b; p->dump->baddr++; break; case AG_KEY_C: hb = 0x0c; p->dump->baddr++; break; case AG_KEY_D: hb = 0x0d; p->dump->baddr++; break; case AG_KEY_E: hb = 0x0e; p->dump->baddr++; break; case AG_KEY_F: hb = 0x0f; p->dump->baddr++; break; case AG_KEY_J: hb = 0x00; p->dump->baddr = 0; p->dump->bdata = 0; p->dump->editAddr = TRUE; return; break; case AG_KEY_UP: p->dump->baddr = 0; p->dump->bdata = 0; p->dump->edaddr -= 16; p->dump->edaddr &= 0x0000ffff; break; case AG_KEY_DOWN: p->dump->baddr = 0; p->dump->bdata = 0; p->dump->edaddr += 16; p->dump->edaddr &= 0x0000ffff; break; case AG_KEY_LEFT: p->dump->baddr = 0; p->dump->bdata = 0; p->dump->edaddr -= 1; p->dump->edaddr &= 0x0000ffff; break; case AG_KEY_RIGHT: p->dump->baddr = 0; p->dump->bdata = 0; p->dump->edaddr += 1; p->dump->edaddr &= 0x0000ffff; break; default: return; break; } p->dump->bdata |= hb << ((2 - p->dump->baddr) * 4); if(p->dump->baddr >= 2) { if(p->dump->writeEnable) { if(p->dump->wb != NULL) { p->dump->wb((WORD)p->dump->edaddr & 0x0ffff, (BYTE)(p->dump->bdata & 0x0ff)); } } p->dump->baddr = 0; p->dump->bdata = 0; p->dump->edaddr = (p->dump->edaddr + 1) & 0x0000ffff; } if(((p->dump->addr + 256) & 0x0000ffff) <= p->dump->edaddr){ p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; }else if(p->dump->addr > p->dump->edaddr) { p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; } }
static void XM7_DbgDumpSetAddress(AG_Event *event) { XM7_SDLView *disp = (XM7_SDLView *)AG_SELF(); struct XM7_MemDumpDesc *p = (struct XM7_MemDumpDesc *)AG_PTR(1); int sym = AG_INT(2); int mod = AG_INT(3); Uint32 unicode = (Uint32)AG_ULONG(4); DumpObject *cons; char strbuf[16]; Uint16 hb = 0; if(p == NULL) return; if(p->dump == NULL) return; if(p->dump->dump == NULL) return; cons = p->dump->dump; strbuf[0] = '\0'; if(p->dump->paused == TRUE) { p->dump->paused = FALSE; cons->ClearScreen(); return; } p->dump->editAddr = TRUE; switch(sym) { case AG_KEY_ESCAPE: p->dump->baddr = 0x0000; p->dump->bdata = 0x0000; p->dump->editAddr = FALSE; return; break; case AG_KEY_0: case AG_KEY_KP0: hb = 0; p->dump->baddr++; break; case AG_KEY_1: case AG_KEY_KP1: hb = 1; p->dump->baddr++; break; case AG_KEY_2: case AG_KEY_KP2: hb = 2; p->dump->baddr++; break; case AG_KEY_3: case AG_KEY_KP3: hb = 3; p->dump->baddr++; break; case AG_KEY_4: case AG_KEY_KP4: hb = 4; p->dump->baddr++; break; case AG_KEY_5: case AG_KEY_KP5: hb = 5; p->dump->baddr++; break; case AG_KEY_6: case AG_KEY_KP6: hb = 6; p->dump->baddr++; break; case AG_KEY_7: case AG_KEY_KP7: hb = 7; p->dump->baddr++; break; case AG_KEY_8: case AG_KEY_KP8: hb = 8; p->dump->baddr++; break; case AG_KEY_9: case AG_KEY_KP9: hb = 9; p->dump->baddr++; break; case AG_KEY_A: hb = 0x0a; p->dump->baddr++; break; case AG_KEY_B: hb = 0x0b; p->dump->baddr++; break; case AG_KEY_C: hb = 0x0c; p->dump->baddr++; break; case AG_KEY_D: hb = 0x0d; p->dump->baddr++; break; case AG_KEY_E: hb = 0x0e; p->dump->baddr++; break; case AG_KEY_F: hb = 0x0f; p->dump->baddr++; break; default: return; break; } cons->MoveDrawPos(0, 0); p->dump->bdata |= hb << ((4 - p->dump->baddr) * 4); sprintf(strbuf, "Set Address>>%04x", p->dump->bdata); cons->PutString(strbuf); if(p->dump->baddr >= 4) { p->dump->edaddr = p->dump->bdata & 0x0000ffff; p->dump->bdata = 0; p->dump->baddr = 0; p->dump->editAddr = FALSE; } if(((p->dump->addr + 256) & 0x0000ffff) <= p->dump->edaddr){ p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; }else if(p->dump->addr > p->dump->edaddr) { p->dump->addr = ((p->dump->addr & 0xff) + (p->dump->edaddr & 0xff00)) & 0x0000ffff; } }