diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/monitor.c | 91 | 
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;  	}      } | 
