char* getsNoWait() { static char inBuffer[122]; static int inBufferIndex = 0; while(1) { // terminated with returns char c= getcharNoWait(); if(c < 0) return 0; if(c == '\n') { // end of string -> return inBuffer[inBufferIndex] = 0; inBufferIndex = 0; return inBuffer; } inBuffer[inBufferIndex] = c; if(inBufferIndex < 120) inBufferIndex++; } }
int dbg_parse_line() { char ch; unsigned int ad; unsigned int ln; unsigned int regno; unsigned int ui; int nn; int n2; while (linendx < 84) { ch = dbg_getchar(); switch (ch) { case -1: return; case ' ': break; case '?': dbg_DisplayHelp(); break; case 'q': return 1; case 'a': dbg_arm(dbg_dbctrl); break; case 'i': ch = dbg_getchar(); switch(ch) { case '?': // query instruction breakpoints if (((dbg_dbctrl & 0x030000)==0) && (dbg_dbctrl & 1) == 1) printf("i0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0) && (dbg_dbctrl & 2) == 2) printf("i1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0) && (dbg_dbctrl & 4) == 4) printf("i2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0) && (dbg_dbctrl & 8) == 8) printf("i2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetIB(0); break; case '1': dbg_ReadSetIB(1); break; case '2': dbg_ReadSetIB(2); break; case '3': dbg_ReadSetIB(3); break; } break; case 'd': ch = dbg_getchar(); switch(ch) { case 'i': dbg_nextSpace(); nn = dbg_getHexNumber(&ad); if (nn > 0) { n2 = dbg_getDecNumber(&ln); if (n2 > 0) { for (; n2 > 0; n2--) disassem(&ad,0); } else disassem20(ad,0); } break; case '?': // query instruction breakpoints printf("\r\n"); if (((dbg_dbctrl & 0x030000)==0x30000) && (dbg_dbctrl & 1) == 1) printf("d0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0x300000) && (dbg_dbctrl & 2) == 2) printf("d1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0x3000000) && (dbg_dbctrl & 4) == 4) printf("d2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0x30000000) && (dbg_dbctrl & 8) == 8) printf("d2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetDB(0); break; case '1': dbg_ReadSetDB(1); break; case '2': dbg_ReadSetDB(2); break; case '3': dbg_ReadSetDB(3); break; case 's': ch = dbg_getchar(); switch(ch) { case '?': if (((dbg_dbctrl & 0x030000)==0x10000) && (dbg_dbctrl & 1) == 1) printf("ds0=%08X\r\n", dbg_GetDBAD(0)); if (((dbg_dbctrl & 0x300000)==0x100000) && (dbg_dbctrl & 2) == 2) printf("ds1=%08X\r\n", dbg_GetDBAD(1)); if (((dbg_dbctrl & 0x3000000)==0x1000000) && (dbg_dbctrl & 4) == 4) printf("ds2=%08X\r\n", dbg_GetDBAD(2)); if (((dbg_dbctrl & 0x30000000)==0x10000000) && (dbg_dbctrl & 8) == 8) printf("ds2=%08X\r\n", dbg_GetDBAD(3)); break; case '0': dbg_ReadSetDSB(0); break; case '1': dbg_ReadSetDSB(1); break; case '2': dbg_ReadSetDSB(2); break; case '3': dbg_ReadSetDSB(3); break; } break; default: dbg_nextSpace(); dbg_SetDBAD(0,0); dbg_SetDBAD(1,0); dbg_SetDBAD(2,0); dbg_SetDBAD(3,0); dbg_arm(0); break; } break; case 'r': dbg_processReg(); break; case 's': ch = dbg_getchar(); if (ch=='s') { ch = dbg_getchar(); if (ch=='-') { dbg_dbctrl &= 0x3FFFFFFFFFFFFFFFL; dbg_arm(dbg_dbctrl); ssm = 0; } else if (ch=='+' || ch=='m') { dbg_dbctrl |= 0x4000000000000000L; dbg_arm(dbg_dbctrl); ssm = 1; return 1; } } break; case 'f': ch = dbg_getchar(); if (ch=='/') dbg_getDumpFormat(); ch = dbg_getchar(); if (ch==',') { if (curfmt=='x') nn = dbg_getHexNumber(&ui); else nn = dbg_getDecNumber(&ui); if (nn > 0) curfill = ui; } switch(curfmt) { case 'x': switch(cursz) { case 'b': for (nn = 0; nn < currep; nn++) bmem[ad+nn] = curfill; break; case 'c': for (nn = 0; nn < currep; nn++) cmem[ad/2+nn] = curfill; break; case 'h': for (nn = 0; nn < currep; nn++) hmem[ad/4+nn] = curfill; break; case 'w': for (nn = 0; nn < currep; nn++) wmem[ad/8+nn] = curfill; break; } } break; case 'x': ch = dbg_getchar(); if (ch=='/') { dbg_getDumpFormat(); } switch(curfmt) { case 'i': printf("\r\n"); for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; disassem(&curaddr,0); } break; case 's': for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; curaddr += putstr(&cmem[curaddr/2],84) * 2; printf("\r\n"); } break; case 'x': for (nn = 0; nn < currep; nn++) { if (getcharNoWait()==3) break; if ((nn % muol)==0) { switch(cursz) { case 'b': printf("\r\n%06X ", curaddr+nn); break; case 'c': printf("\r\n%06X ", curaddr+nn*2); break; case 'h': printf("\r\n%06X ", curaddr+nn*4); break; case 'w': printf("\r\n%06X ", curaddr+nn*8); break; } } asm {; right here ; }; switch(cursz) { case 'b': printf("%02X ", bmem[curaddr+nn]); break; case 'c': printf("%04X ", cmem[curaddr/2+nn]); break; case 'h': printf("%08X ", hmem[curaddr/4+nn]); break; case 'w': printf("%016X ", wmem[curaddr/8+nn]); break; } } switch(cursz) { case 'b': curaddr += nn; break; case 'c': curaddr += nn * 2; break; case 'h': curaddr += nn * 4; break; case 'w': curaddr += nn * 8; break; } printf("\r\n"); break; } } } return 0; }