/* Data */
/*****************************************************************************/
+
+
/* Color definitions */
-#ifdef __PLUS4__
+#if defined(__PLUS4__) || defined(__C16__)
# define COLOR_BORDER (BCOLOR_DARKBLUE | CATTR_LUMA6)
# define COLOR_BACKGROUND COLOR_WHITE
# define COLOR_TEXTHIGH COLOR_BLACK
# define COLOR_FRAMEHIGH COLOR_BLACK
# define COLOR_FRAMELOW COLOR_GRAY2
#else
-# ifdef COLOR_GRAY3
+# if defined(COLOR_GRAY3)
# define COLOR_BORDER COLOR_BLACK
# define COLOR_BACKGROUND COLOR_BLACK
# define COLOR_TEXTHIGH COLOR_WHITE
# define COLOR_FRAMEHIGH COLOR_WHITE
# define COLOR_FRAMELOW COLOR_GRAY3
# else
-# ifdef __APPLE2__
+# if defined(__APPLE2__) || defined(__APPLE2ENH__)
# define COLOR_BORDER COLOR_BLACK
# define COLOR_BACKGROUND COLOR_BLACK
# define COLOR_TEXTHIGH COLOR_BLACK
# endif
# endif
#endif
+#ifndef COLOR_BLACK
+# define COLOR_BLACK 0
+#endif
+#ifndef COLOR_WHITE
+# define COLOR_WHITE 1
+#endif
/* Screen definitions */
#if defined(__CBM610__)
# define MAX_X 80
# define MAX_Y 25
# define DUMP_BYTES 16
-#elif defined(__APPLE2__) || defined(__ATARI__)
+#elif defined(__APPLE2__) || defined(__APPLE2ENH__) || defined(__ATARI__)
# define MAX_X 40
# define MAX_Y 24
# define DUMP_BYTES 8
# define DUMP_BYTES 8
#endif
+/* Replacement key definitions */
+#if defined(__APPLE2__) || defined(__LYNX__) || defined(__SUPERVISION__)
+# define CH_DEL ('H' - 'A' + 1) /* Ctrl+H */
+#endif
+/* Replacement char definitions */
+#ifndef CH_ULCORNER
+# define CH_ULCORNER '+'
+#endif
+#ifndef CH_URCORNER
+# define CH_URCORNER '+'
+#endif
+#ifndef CH_LLCORNER
+# define CH_LLCORNER '+'
+#endif
+#ifndef CH_LRCORNER
+# define CH_LRCORNER '+'
+#endif
+#ifndef CH_TTEE
+# define CH_TTEE '+'
+#endif
+#ifndef CH_LTEE
+# define CH_LTEE '+'
+#endif
+#ifndef CH_RTEE
+# define CH_RTEE '+'
+#endif
+#ifndef CH_BTEE
+# define CH_BTEE '+'
+#endif
+#ifndef CH_CROSS
+# define CH_CROSS '+'
+#endif
/* Defines for opcodes */
#define OPC_BRK 0x00
{ 1, 7, "+ Page down" },
{ 1, 8, "- Page up" },
{ 1, 9, "Cursor Move up/down" },
- { 1, 10, "c Continue" },
- { 1, 11, "f Follow instruction" },
- { 1, 12, "o Goto origin" },
- { 1, 13, "p Use as new PC value" },
- { 1, 14, "q Quit" },
- { 1, 15, "r Redraw screen" },
- { 1, 16, "s Skip next instruction" },
+ { 1, 10, "a/z Move up/down" },
+ { 1, 11, "c Continue" },
+ { 1, 12, "f Follow instruction" },
+ { 1, 13, "o Goto origin" },
+ { 1, 14, "p Use as new PC value" },
+ { 1, 15, "q Quit" },
+ { 1, 16, "r Redraw screen" },
+ { 1, 17, "s Skip next instruction" },
};
-static void DrawFrame (FrameDesc* F, char Active)
+static void DrawFrame (register FrameDesc* F, char Active)
/* Draw one window frame */
{
TextDesc* T;
cvlinexy (F->fd_x2, y1, F->fd_height);
/* If the window has static text associated, print the text */
- textcolor (COLOR_TEXTLOW);
+ (void) textcolor (COLOR_TEXTLOW);
Count = F->fd_textcount;
T = F->fd_text;
while (Count--) {
}
/* Set the old color */
- textcolor (OldColor);
+ (void) textcolor (OldColor);
}
/* Activate a new frame, deactivate the old one */
{
unsigned char y;
- FrameDesc* F;
+ register FrameDesc* F;
if (ActiveFrame != Num) {
F = Frames [ActiveFrame];
/* Clear the frame if requested */
if (Clear) {
- for (y = F->fd_y1+1; y < F->fd_y2; ++y) {
- cclearxy (F->fd_x1+1, y, F->fd_width);
- }
+ for (y = F->fd_y1+1; y < F->fd_y2; ++y) {
+ cclearxy (F->fd_x1+1, y, F->fd_width);
+ }
}
DrawFrame (F, 1);
}
/*****************************************************************************/
-/* Prompt line */
+/* Prompt line */
/*****************************************************************************/
/* Clear the old prompt if there is one */
if (ActivePrompt) {
- textcolor (PromptColor);
+ (void) textcolor (PromptColor);
chlinexy ((MAX_X - PromptLength) / 2, MAX_Y-1, PromptLength);
}
PromptLength = strlen (ActivePrompt);
/* Display the new prompt */
- textcolor (COLOR_TEXTHIGH);
+ (void) textcolor (COLOR_TEXTHIGH);
cputsxy ((MAX_X - PromptLength) / 2, MAX_Y-1, ActivePrompt);
/* Restore the old color */
- textcolor (PromptColor);
+ (void) textcolor (PromptColor);
}
+static char IsAbortKey (char C)
+/* Return true if C is an abort key */
+{
+#if defined(CH_ESC)
+ if (C == CH_ESC) {
+ return 1;
+ }
+#endif
+#if defined(CH_STOP)
+ if (C == CH_STOP) {
+ return 1;
+ }
+#endif
+ return 0;
+}
+
+
+
static char Input (char* Prompt, char* Buf, unsigned char Count)
/* Read input from the user, return 1 on success, 0 if aborted */
{
/* Display the new prompt */
OldColor = textcolor (COLOR_TEXTHIGH);
cputsxy (0, MAX_Y-1, Prompt);
- textcolor (COLOR_TEXTLOW);
+ (void) textcolor (COLOR_TEXTLOW);
/* Remember where we are, enable the cursor */
x1 = wherex ();
Buf [i] = c;
cputcxy (x1 + i, MAX_Y-1, c);
++i;
- } else if (i > 0 && c == CH_DEL) {
+ } else if (i > 0 && c == CH_DEL) {
--i;
cputcxy (x1 + i, MAX_Y-1, ' ');
gotoxy (x1 + i, MAX_Y-1);
} else if (c == '\n') {
Buf [i] = '\0';
done = 1;
- } else if (c == CH_ESC) {
+ } else if (IsAbortKey (c)) {
/* Abort */
done = 2;
}
/* Reset settings, display old prompt line */
cursor (OldCursor);
- textcolor (OldColor);
+ (void) textcolor (OldColor);
DrawFrames ();
Frame = ActiveFrame;
ActiveFrame = -1;
static void DbgToggleUserBreak (unsigned Addr)
/* Set a breakpoint */
{
- BreakPoint* B = DbgIsBreak (Addr);
+ register BreakPoint* B = DbgIsBreak (Addr);
if (B) {
/* We have a breakpoint, remove it */
} else {
/* Test if we can set a breakpoint at that address */
if (!DbgIsRAM (Addr)) {
- BreakInRomError ();
+ BreakInRomError ();
} else {
- /* Set the breakpoint */
- B = DbgGetBreakSlot ();
- B->bk_addr = Addr;
- B->bk_use = BRK_USER;
- ++DbgBreakCount;
+ /* Set the breakpoint */
+ B = DbgGetBreakSlot ();
+ B->bk_addr = Addr;
+ B->bk_use = BRK_USER;
+ ++DbgBreakCount;
}
}
}
if (B->bk_use == BRK_TMP) {
B->bk_use = BRK_EMPTY;
}
- ++B;
+ ++B;
}
}
BreakPoint* B = DbgBreaks;
for (i = 0; i < MAX_USERBREAKS; ++i) {
if (B->bk_use == BRK_TMP && !DbgIsRAM (B->bk_addr)) {
- BreakInRomError ();
- DbgResetTmpBreaks ();
- return 0;
+ BreakInRomError ();
+ DbgResetTmpBreaks ();
+ return 0;
}
- ++B;
+ ++B;
}
return 1;
}
/*****************************************************************************/
-/* Assembler window stuff */
+/* Assembler window stuff */
/*****************************************************************************/
adr [in] = cur;
in = (in + 1) & 0x1F;
if (cur >= mem) {
- if (cur == mem || offs == 12) {
- /* Found */
- return adr [(in - lines - 1) & 0x1F];
- } else {
- /* The requested address is inside an instruction, go back
- * one more byte and try again.
- */
+ if (cur == mem || offs == 12) {
+ /* Found */
+ return adr [(in - lines - 1) & 0x1F];
+ } else {
+ /* The requested address is inside an instruction, go back
+ * one more byte and try again.
+ */
++offs;
- break;
- }
- }
+ break;
+ }
+ }
}
}
}
unsigned m = AsmBack (AsmAddr, 2);
for (y = AsmFrame.fd_y1+1; y < AsmFrame.fd_y2; ++y) {
- len = DbgDisAsm (m, buf, width);
+ len = DbgDisAsm (m, buf, width);
if (m == brk_pc) {
- buf [4] = '-';
- buf [5] = '>';
- }
- if (DbgIsBreak (m)) {
- buf [5] = '*';
- }
- if (m == AsmAddr) {
- revers (1);
- cputsxy (1, y, buf);
- revers (0);
- } else {
- cputsxy (1, y, buf);
- }
- m += len;
+ buf [4] = '-';
+ buf [5] = '>';
+ }
+ if (DbgIsBreak (m)) {
+ buf [5] = '*';
+ }
+ if (m == AsmAddr) {
+ revers (1);
+ cputsxy (1, y, buf);
+ revers (0);
+ } else {
+ cputsxy (1, y, buf);
+ }
+ m += len;
}
return m;
}
{
switch (*(unsigned char*) AsmAddr) {
- case OPC_JMP:
- case OPC_JSR:
+ case OPC_JMP:
+ case OPC_JSR:
AsmAddr = AsmArg16 ();
- break;
+ break;
case OPC_JMPIND:
- AsmAddr = *(unsigned*)AsmArg16 ();
- break;
-
- case OPC_BPL:
- case OPC_BMI:
- case OPC_BVC:
- case OPC_BVS:
- case OPC_BCC:
- case OPC_BCS:
- case OPC_BNE:
- case OPC_BEQ:
+ AsmAddr = *(unsigned*)AsmArg16 ();
+ break;
+
+ case OPC_BPL:
+ case OPC_BMI:
+ case OPC_BVC:
+ case OPC_BVS:
+ case OPC_BCC:
+ case OPC_BCS:
+ case OPC_BNE:
+ case OPC_BEQ:
AsmAddr = AsmAddr + 2 + *(signed char*)(AsmAddr+1);
- break;
+ break;
case OPC_RTS:
- AsmAddr = (*(unsigned*) (DbgSP + 0x101) + 1);
- break;
+ AsmAddr = (*(unsigned*) (DbgSP + 0x101) + 1);
+ break;
case OPC_RTI:
- AsmAddr = *(unsigned*) (DbgSP + 0x102);
- break;
+ AsmAddr = *(unsigned*) (DbgSP + 0x102);
+ break;
}
}
/* Update the window contents */
Last = UpdateAsm ();
- /* Read and handle input */
- switch (c = GetKeyUpdate ()) {
+ /* Read and handle input */
+ switch (c = GetKeyUpdate ()) {
- case '+':
- AsmAddr = Last;
- break;
+ case '+':
+ AsmAddr = Last;
+ break;
- case '-':
- AsmAddr = AsmBack (AsmAddr, AsmFrame.fd_height);
- break;
+ case '-':
+ AsmAddr = AsmBack (AsmAddr, AsmFrame.fd_height);
+ break;
- case 't':
+ case 't':
#ifdef CH_F2
case CH_F2:
#endif
- DbgToggleUserBreak (AsmAddr);
- break;
+ DbgToggleUserBreak (AsmAddr);
+ break;
case 'f':
AsmFollow ();
brk_pc = AsmAddr;
break;
+ case 'a':
+#ifdef CH_CURS_UP
case CH_CURS_UP:
+#endif
AsmAddr = AsmBack (AsmAddr, 1);
break;
+ case 'z':
+#ifdef CH_CURS_DOWN
case CH_CURS_DOWN:
+#endif
AsmAddr += DbgDisAsmLen (AsmAddr);
break;
/*****************************************************************************/
-/* Stack window stuff */
+/* Stack window stuff */
/*****************************************************************************/
unsigned char y;
for (y = StackFrame.fd_y2-1; y > StackFrame.fd_y1; --y) {
- gotoxy (x1, y);
- cputhex8 (mem);
- gotoxy (x2, y);
- cputhex8 (* (unsigned char*) (mem + 0x100));
+ gotoxy (x1, y);
+ cputhex8 (mem);
+ gotoxy (x2, y);
+ cputhex8 (* (unsigned char*) (mem + 0x100));
++mem;
}
return mem;
while (1) {
- /* Read and handle input */
- switch (c = GetKeyUpdate ()) {
+ /* Read and handle input */
+ switch (c = GetKeyUpdate ()) {
- case '+':
+ case '+':
StackAddr += BytesPerPage;
- break;
+ break;
- case '-':
- StackAddr -= BytesPerPage;
- break;
+ case '-':
+ StackAddr -= BytesPerPage;
+ break;
- case 'o':
- StackHome ();
- break;
+ case 'o':
+ StackHome ();
+ break;
- case CH_CURS_UP:
- --StackAddr;
- break;
+ case 'a':
+#ifdef CH_CURS_UP:
+ case CH_CURS_UP:
+#endif
+ --StackAddr;
+ break;
- case CH_CURS_DOWN:
- ++StackAddr;
- break;
+ case 'z':
+#ifdef CH_CURS_DOWN
+ case CH_CURS_DOWN:
+#endif
+ ++StackAddr;
+ break;
- default:
- return c;
+ default:
+ return c;
- }
+ }
- /* Update the window contents */
+ /* Update the window contents */
UpdateStack ();
}
}
unsigned char y;
for (y = CStackFrame.fd_y2-1; y > CStackFrame.fd_y1; --y) {
- gotoxy (x, y);
- cputhex16 (* (unsigned*)mem);
- mem += 2;
+ gotoxy (x, y);
+ cputhex16 (* (unsigned*)mem);
+ mem += 2;
}
cputsxy (CStackFrame.fd_x1+1, CStackFrame.fd_y2-1, "->");
return mem;
while (1) {
- /* Read and handle input */
- switch (c = GetKeyUpdate ()) {
+ /* Read and handle input */
+ switch (c = GetKeyUpdate ()) {
- case '+':
+ case '+':
CStackAddr += BytesPerPage;
- break;
+ break;
- case '-':
- CStackAddr -= BytesPerPage;
- break;
+ case '-':
+ CStackAddr -= BytesPerPage;
+ break;
- case 'o':
- CStackHome ();
- break;
+ case 'o':
+ CStackHome ();
+ break;
- case CH_CURS_UP:
- CStackAddr -= 2;
- break;
+ case 'a':
+#ifdef CH_CURS_UP
+ case CH_CURS_UP:
+#endif
+ CStackAddr -= 2;
+ break;
- case CH_CURS_DOWN:
- CStackAddr += 2;
- break;
+ case 'z':
+#ifdef CH_CURS_DOWN
+ case CH_CURS_DOWN:
+#endif
+ CStackAddr += 2;
+ break;
- default:
- return c;
+ default:
+ return c;
- }
+ }
- /* Update the window contents */
+ /* Update the window contents */
UpdateCStack ();
}
}
/*****************************************************************************/
-/* Dump window stuff */
+/* Dump window stuff */
/*****************************************************************************/
unsigned char* p = (unsigned char*) mem;
for (y = DumpFrame.fd_y1+1; y < DumpFrame.fd_y2; ++y) {
- cputsxy (x, y, DbgMemDump (mem, Buf, DUMP_BYTES));
- mem += DUMP_BYTES;
+ cputsxy (x, y, DbgMemDump (mem, Buf, DUMP_BYTES));
+ mem += DUMP_BYTES;
}
return mem;
}
while (1) {
- /* Read and handle input */
- switch (c = GetKeyUpdate ()) {
+ /* Read and handle input */
+ switch (c = GetKeyUpdate ()) {
- case '+':
- DumpAddr += BytesPerPage;
- break;
+ case '+':
+ DumpAddr += BytesPerPage;
+ break;
- case '-':
+ case '-':
DumpAddr -= BytesPerPage;
- break;
+ break;
- case 'g':
- InputGoto (&DumpAddr);
- break;
+ case 'g':
+ InputGoto (&DumpAddr);
+ break;
- case 'o':
- DumpHome ();
- break;
+ case 'o':
+ DumpHome ();
+ break;
- case CH_CURS_UP:
- DumpAddr -= 8;
- break;
+ case 'a':
+#ifdef CH_CURS_UP
+ case CH_CURS_UP:
+#endif
+ DumpAddr -= 8;
+ break;
- case CH_CURS_DOWN:
- DumpAddr += 8;
- break;
+ case 'z':
+#ifdef CH_CURS_DOWN
+ case CH_CURS_DOWN:
+#endif
+ DumpAddr += 8;
+ break;
- default:
- return c;
+ default:
+ return c;
- }
+ }
/* Update the window contents */
UpdateDump ();
/*****************************************************************************/
-/* Help window stuff */
+/* Help window stuff */
/*****************************************************************************/
/*****************************************************************************/
-/* Singlestep */
+/* Singlestep */
/*****************************************************************************/
switch (*(unsigned char*) brk_pc) {
case OPC_JMP:
- /* Set breakpoint at target */
- DbgSetTmpBreak (GetArg16 ());
- return;
+ /* Set breakpoint at target */
+ DbgSetTmpBreak (GetArg16 ());
+ return;
case OPC_JMPIND:
- /* Indirect jump, ignore CPU error when crossing page */
- DbgSetTmpBreak (*(unsigned*)GetArg16 ());
- return;
-
- case OPC_BPL:
- case OPC_BMI:
- case OPC_BVC:
- case OPC_BVS:
- case OPC_BCC:
- case OPC_BCS:
- case OPC_BNE:
- case OPC_BEQ:
- /* Be sure not to set the breakpoint twice if this is a jump to
- * the following instruction.
- */
- Offs = *(signed char*)(brk_pc+1);
- if (Offs) {
- DbgSetTmpBreak (brk_pc + Offs + 2);
- }
- break;
+ /* Indirect jump, ignore CPU error when crossing page */
+ DbgSetTmpBreak (*(unsigned*)GetArg16 ());
+ return;
+
+ case OPC_BPL:
+ case OPC_BMI:
+ case OPC_BVC:
+ case OPC_BVS:
+ case OPC_BCC:
+ case OPC_BCS:
+ case OPC_BNE:
+ case OPC_BEQ:
+ /* Be sure not to set the breakpoint twice if this is a jump to
+ * the following instruction.
+ */
+ Offs = ((signed char*)brk_pc)[1];
+ if (Offs) {
+ DbgSetTmpBreak (brk_pc + Offs + 2);
+ }
+ break;
case OPC_RTS:
- /* Set a breakpoint at the return target */
- SetRTSBreak ();
- return;
+ /* Set a breakpoint at the return target */
+ SetRTSBreak ();
+ return;
case OPC_RTI:
- /* Set a breakpoint at the return target */
- DbgSetTmpBreak (GetStack16 (1));
- return;
+ /* Set a breakpoint at the return target */
+ DbgSetTmpBreak (GetStack16 (1));
+ return;
case OPC_JSR:
- if (StepInto) {
- /* Set breakpoint at target */
- DbgSetTmpBreak (GetArg16 ());
- return;
- }
- break;
+ if (StepInto) {
+ /* Set breakpoint at target */
+ DbgSetTmpBreak (GetArg16 ());
+ return;
+ }
+ break;
}
/* Place a breakpoint behind the instruction */
/*****************************************************************************/
-/* High level window handling */
+/* High level window handling */
/*****************************************************************************/
ActiveFrame = -1;
/* Clear the screen hide the cursor */
- bordercolor (COLOR_BORDER);
- bgcolor (COLOR_BACKGROUND);
+ (void) bordercolor (COLOR_BORDER);
+ (void) bgcolor (COLOR_BACKGROUND);
clrscr ();
cursor (0);
/* Build the frame layout of the screen */
- textcolor (COLOR_FRAMELOW);
+ (void) textcolor (COLOR_FRAMELOW);
DrawFrames ();
/* Draw the prompt line */
/*****************************************************************************/
-/* Externally visible functions */
+/* Externally visible functions */
/*****************************************************************************/
/* If this is the first call, setup the display */
if (FirstTime) {
- FirstTime = 0;
-
- /* Draw the window, default active frame is ASM frame */
- RedrawStatic (WIN_ASM);
- InitAsm ();
- InitReg ();
- InitStack ();
- InitCStack ();
- UpdateDump ();
+ FirstTime = 0;
+
+ /* Draw the window, default active frame is ASM frame */
+ RedrawStatic (WIN_ASM);
+ InitAsm ();
+ InitReg ();
+ InitStack ();
+ InitCStack ();
+ UpdateDump ();
}
/* Only initialize variables here, don't do a display update. The actual
done = 0;
while (!done) {
c = Frames [ActiveFrame]->fd_func ();
- switch (c) {
-
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- ActivateFrame (c - '1', 0);
- break;
+ switch (c) {
- case '?':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ ActivateFrame (c - '1', 0);
+ break;
+
+ case '?':
#ifdef CH_F1
case CH_F1:
#endif
HelpHandler ();
break;
- case 'u':
+ case 'u':
#ifdef CH_F3
case CH_F3:
#endif
done = 1;
break;
- case 'h':
+ case 'h':
#ifdef CH_F4
case CH_F4:
#endif
}
break;
- case '\n':
+ case '\n':
#ifdef CH_F8
case CH_F8:
#endif
}
+