Example #1
0
/*
 * 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;
   }
}