summaryrefslogtreecommitdiff
path: root/source/monitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/monitor.c')
-rw-r--r--source/monitor.c91
1 files changed, 51 insertions, 40 deletions
diff --git a/source/monitor.c b/source/monitor.c
index 6f0fa05..773f7c2 100644
--- a/source/monitor.c
+++ b/source/monitor.c
@@ -41,9 +41,18 @@ typedef enum
DISPLAY_IY,
DISPLAY_BC,
DISPLAY_DE,
+ DISPLAY_PC,
DISPLAY_TYPE_COUNT
} MemDisplayType;
+typedef enum
+{
+ MODE_CPU_STATE,
+ MODE_HEX,
+ MODE_ASSEM,
+ MODE_TYPE_COUNT
+} DisplayModeType;
+
/* ---------------------------------------- STATIC INTERFACES
*/
@@ -107,41 +116,24 @@ static void DisplayRunningState(int running)
}
-static void DisplayCPU(Z80 *cpu, int stepped)
+static void DisplayCPU(Z80 *cpu)
{
static const char *flag_char = "SZ5H3PNC";
- static Z80Word prev_pc[8];
Z80Word tmp;
int f;
char flags[]="--------";
+ tmp = cpu->PC;
+
/* Display disassembly
*/
- for(f=0;f<8;f++)
+ for(f=0;f<17;f++)
{
- tmp = prev_pc[f];
-
/* These may seem a bit convuluted, but there's no point being at home
to Mr Undefined Behaviour
*/
- TM_printf(1,f,"%4.4x:",tmp);
+ TM_printf(0,f,"%c%4.4x:",f==0 ? '>':' ',tmp);
TM_Put(7,f,Z80Disassemble(cpu,&tmp));
-
- if (stepped && f)
- {
- prev_pc[f-1] = prev_pc[f];
- }
- }
-
- prev_pc[7] = tmp = cpu->PC;
-
- TM_printf(0,8,">%4.4x:",tmp);
- TM_Put(7,8,Z80Disassemble(cpu,&tmp));
-
- for(f=0;f<8;f++)
- {
- TM_printf(1,9+f,"%4.4x:",tmp);
- TM_Put(7,9+f,Z80Disassemble(cpu,&tmp));
}
/* Display process state
@@ -170,7 +162,7 @@ static void DisplayCPU(Z80 *cpu, int stepped)
}
-static void DisplayMem(Z80 *cpu, MemDisplayType disp, Z80Word addr)
+static void DisplayMem(Z80 *cpu, MemDisplayType disp, Z80Word addr, int as_hex)
{
static const char *label[]=
{
@@ -180,7 +172,8 @@ static void DisplayMem(Z80 *cpu, MemDisplayType disp, Z80Word addr)
"SP",
"IY",
"BC",
- "DE"
+ "DE",
+ "PC"
};
int x,y;
@@ -211,19 +204,34 @@ static void DisplayMem(Z80 *cpu, MemDisplayType disp, Z80Word addr)
addr = cpu->DE.w;
break;
+ case DISPLAY_PC:
+ addr = cpu->PC;
+ break;
+
default:
break;
}
TM_printf(0,0,"%s: %4.4x",label[disp],addr);
- for(y=0;y<18;y++)
+ if (as_hex)
{
- TM_printf(0,y+2,"%4.4x:",addr);
+ for(y=0;y<20;y++)
+ {
+ TM_printf(0,y+2,"%4.4x:",addr);
- for(x=0;x<8;x++)
+ for(x=0;x<8;x++)
+ {
+ TM_printf(6+x*3,y+2,"%2.2x",ZX81ReadDisassem(cpu,addr++));
+ }
+ }
+ }
+ else
+ {
+ for(y=0;y<20;y++)
{
- TM_printf(6+x*3,y+2,"%2.2x",ZX81ReadDisassem(cpu,addr++));
+ TM_printf(0,y+2,"%4.4x:",addr);
+ TM_Put(7,y+2,Z80Disassemble(cpu,&addr));
}
}
}
@@ -237,8 +245,7 @@ void MachineCodeMonitor(Z80 *cpu)
static MemDisplayType mem_display = DISPLAY_ADDR;
int done = FALSE;
int running = FALSE;
- int cpu_display = TRUE;
- int stepped = FALSE;
+ DisplayModeType display_mode = MODE_CPU_STATE;
int key;
SoftKey soft_key;
@@ -255,16 +262,21 @@ void MachineCodeMonitor(Z80 *cpu)
TM_Cls();
DisplayRunningState(running);
- if (cpu_display)
+ switch(display_mode)
{
- DisplayCPU(cpu,stepped);
+ case MODE_CPU_STATE:
+ DisplayCPU(cpu);
+ break;
+ case MODE_HEX:
+ DisplayMem(cpu,mem_display,display_address,TRUE);
+ break;
+ case MODE_ASSEM:
+ DisplayMem(cpu,mem_display,display_address,FALSE);
+ break;
+ default:
+ TM_Put(0,0,"Oops!");
+ break;
}
- else
- {
- DisplayMem(cpu,mem_display,display_address);
- }
-
- stepped = FALSE;
do
{
@@ -298,7 +310,7 @@ void MachineCodeMonitor(Z80 *cpu)
if (key & KEY_SELECT)
{
- cpu_display = !cpu_display;
+ display_mode = (display_mode+1) % MODE_TYPE_COUNT;
}
if (key & KEY_L)
@@ -333,7 +345,6 @@ void MachineCodeMonitor(Z80 *cpu)
if (running || (key & KEY_A))
{
Z80SingleStep(cpu);
- stepped = TRUE;
}
}