/[VRac]/Z80/src/ConDebug.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /Z80/src/ConDebug.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 111 - (show annotations)
Fri Aug 3 12:50:08 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 7756 byte(s)
import upstream Z80-010807
1 /** Z80: portable Z80 emulator *******************************/
2 /** **/
3 /** ConDebug.c **/
4 /** **/
5 /** This file contains a console version of the built-in **/
6 /** debugger, using EMULib's Console.c. When -DCONDEBUG is **/
7 /** ommitted, ConDebug.c just includes the default command **/
8 /** line based debugger (Debug.c). **/
9 /** **/
10 /** Copyright (C) Marat Fayzullin 2005-2007 **/
11 /** You are not allowed to distribute this software **/
12 /** commercially. Please, notify me, if you make any **/
13 /** changes to this file. **/
14 /*************************************************************/
15 #ifdef DEBUG
16
17 #ifndef CONDEBUG
18 /** Normal DebugZ80() ****************************************/
19 /** When CONDEBUG #undefined, we use plain command line. **/
20 /*************************************************************/
21 #include "Debug.c"
22
23 #else
24 /** Console DebugZ80() ***************************************/
25 /** When CONDEBUG #defined, we use EMULib console. **/
26 /*************************************************************/
27
28 #include "Z80.h"
29 #include "Console.h"
30 #include <stdlib.h>
31
32 #define DebugZ80 OriginalDebugZ80
33 #include "Debug.c"
34 #undef DebugZ80
35
36 #define CLR_BACK PIXEL(255,255,255)
37 #define CLR_TEXT PIXEL(0,0,0)
38 #define CLR_DIALOG PIXEL(0,100,0)
39 #define CLR_PC PIXEL(255,0,0)
40 #define CLR_SP PIXEL(0,0,100)
41
42 static byte ChrDump(byte C)
43 {
44 return((C>=32)&&(C<128)? C:'.');
45 }
46
47 /** DebugZ80() ***********************************************/
48 /** This function should exist if DEBUG is #defined. When **/
49 /** Trace!=0, it is called after each command executed by **/
50 /** the CPU, and given the Z80 registers. **/
51 /*************************************************************/
52 byte DebugZ80(Z80 *R)
53 {
54 char S[1024];
55 word A,Addr,ABuf[20];
56 int J,I,K,X,Y,MemoryDump,DrawWindow,ExitNow;
57
58 /* If we don't have enough screen estate... */
59 if((VideoW<32*8)||(VideoH<23*8))
60 {
61 /* Show warning message */
62 CONMsg(
63 -1,-1,-1,-1,PIXEL(255,255,255),PIXEL(255,0,0),
64 "Error","Screen is\0too small!\0\0"
65 );
66 /* Continue emulation */
67 return(1);
68 }
69
70 X = ((VideoW>>3)-32)>>1;
71 Y = ((VideoH>>3)-23)>>1;
72 Addr = R->PC.W;
73 A = ~Addr;
74 K = 0;
75
76 for(DrawWindow=1,MemoryDump=ExitNow=0;!ExitNow&&VideoImg;)
77 {
78 if(DrawWindow)
79 {
80 CONWindow(X,Y,32,23,CLR_TEXT,CLR_BACK,"Z80 Debugger");
81
82 sprintf(S,"PC %04X",R->PC.W);
83 CONSetColor(CLR_BACK,CLR_PC);
84 CONPrint(X+24,Y+13,S);
85 sprintf(S,"SP %04X",R->SP.W);
86 CONSetColor(CLR_BACK,CLR_SP);
87 CONPrint(X+24,Y+14,S);
88
89 CONSetColor(CLR_TEXT,CLR_BACK);
90 sprintf(S,
91 " %c%c%c%c%c%c\n\n"
92 "AF %04X\nBC %04X\nDE %04X\nHL %04X\nIX %04X\nIY %04X\n\n"
93 "IR %02X%02X",
94 R->AF.B.l&0x80? 'S':'.',R->AF.B.l&0x40? 'Z':'.',R->AF.B.l&0x10? 'H':'.',
95 R->AF.B.l&0x04? 'P':'.',R->AF.B.l&0x02? 'N':'.',R->AF.B.l&0x01? 'C':'.',
96 R->AF.W,R->BC.W,R->DE.W,R->HL.W,R->IX.W,R->IY.W,R->I,R->R
97 );
98 CONPrint(X+24,Y+2,S);
99 sprintf(S,
100 "%s %s",
101 R->IFF&0x04? "IM2":R->IFF&0x02? "IM1":"IM0",
102 R->IFF&0x01? "EI":"DI"
103 );
104 CONPrint(X+25,Y+21,S);
105 DrawWindow=0;
106 A=~Addr;
107 }
108
109 /* If top address has changed... */
110 if(A!=Addr)
111 {
112 /* Clear display */
113 CONBox((X+1)<<3,(Y+2)<<3,23*8,20*8,CLR_BACK);
114
115 if(MemoryDump)
116 {
117 /* Draw memory dump */
118 for(J=0,A=Addr;J<20;J++,A+=4)
119 {
120 if(A==R->PC.W) CONSetColor(CLR_BACK,CLR_PC);
121 else if(A==R->SP.W) CONSetColor(CLR_BACK,CLR_SP);
122 else CONSetColor(CLR_TEXT,CLR_BACK);
123 sprintf(S,"%04X%c",A,A==R->PC.W? CON_MORE:A==R->SP.W? CON_LESS:':');
124 CONPrint(X+1,Y+J+2,S);
125
126 CONSetColor(CLR_TEXT,CLR_BACK);
127 sprintf(S,
128 "%02X %02X %02X %02X %c%c%c%c",
129 RdZ80(A),RdZ80(A+1),RdZ80(A+2),RdZ80(A+3),
130 ChrDump(RdZ80(A)),ChrDump(RdZ80(A+1)),
131 ChrDump(RdZ80(A+2)),ChrDump(RdZ80(A+3))
132 );
133 CONPrint(X+7,Y+J+2,S);
134 }
135 }
136 else
137 {
138 /* Draw listing */
139 for(J=0,A=Addr;J<20;J++)
140 {
141 if(A==R->PC.W) CONSetColor(CLR_BACK,CLR_PC);
142 else if(A==R->SP.W) CONSetColor(CLR_BACK,CLR_SP);
143 else CONSetColor(CLR_TEXT,CLR_BACK);
144 sprintf(S,"%04X%c",A,A==R->PC.W? CON_MORE:A==R->SP.W? CON_LESS:':');
145 CONPrint(X+1,Y+J+2,S);
146
147 ABuf[J]=A;
148 A+=DAsm(S,A);
149
150 CONSetColor(CLR_TEXT,CLR_BACK);
151 CONPrintN(X+7,Y+J+2,S,23);
152 }
153 }
154
155 /* Display redrawn */
156 A=Addr;
157 }
158
159 /* Draw pointer */
160 CONChar(X+6,Y+K+2,CON_ARROW);
161
162 /* Show screen buffer */
163 ShowVideo();
164
165 /* Get key code */
166 I=WaitKey();
167
168 /* Clear pointer */
169 CONChar(X+6,Y+K+2,' ');
170
171 /* Get and process key code */
172 switch(I)
173 {
174 case 'H':
175 CONMsg(
176 -1,-1,-1,-1,
177 CLR_BACK,CLR_DIALOG,
178 "Debugger Help",
179 "ENTER - Execute next opcode\0"
180 " UP - Previous opcode\0"
181 " DOWN - Next opcode\0"
182 " LEFT - Page up\0"
183 "RIGHT - Page down\0"
184 " H - This help page\0"
185 " G - Go to address\0"
186 " D - Disassembler view\0"
187 " M - Memory dump view\0"
188 " S - Show stack\0"
189 " J - Jump to cursor\0"
190 " R - Run to cursor\0"
191 " C - Continue execution\0"
192 " Q - Quit emulator\0"
193 );
194 DrawWindow=1;
195 break;
196 case CON_UP:
197 if(K) --K;
198 else
199 if(MemoryDump) Addr-=4;
200 else for(--Addr;Addr+DAsm(S,Addr)>A;--Addr);
201 break;
202 case CON_DOWN:
203 if(K<19) ++K;
204 else
205 if(MemoryDump) Addr+=4;
206 else Addr+=DAsm(S,Addr);
207 break;
208 case CON_LEFT:
209 if(MemoryDump)
210 Addr-=4*20;
211 else
212 {
213 for(I=20,Addr=~A;(Addr>A)||((A^Addr)&~Addr&0x8000);++I)
214 for(J=0,Addr=A-I;J<20;++J) Addr+=DAsm(S,Addr);
215 Addr=A-I+1;
216 }
217 break;
218 case CON_RIGHT:
219 if(MemoryDump)
220 Addr+=4*20;
221 else
222 for(J=0;J<20;++J) Addr+=DAsm(S,Addr);
223 break;
224 case CON_OK:
225 ExitNow=1;
226 break;
227 case 'Q':
228 return(0);
229 case CON_EXIT:
230 case 'C':
231 R->Trap=0xFFFF;
232 R->Trace=0;
233 ExitNow=1;
234 break;
235 case 'R':
236 R->Trap=ABuf[K];
237 R->Trace=0;
238 ExitNow=1;
239 break;
240 case 'M':
241 MemoryDump=1;
242 A=~Addr;
243 break;
244 case 'S':
245 MemoryDump=1;
246 Addr=R->SP.W;
247 K=0;
248 A=~Addr;
249 break;
250 case 'D':
251 MemoryDump=0;
252 A=~Addr;
253 break;
254 case 'G':
255 if(CONInput(-1,-1,CLR_BACK,CLR_DIALOG,"Go to Address:",S,5|CON_HEX))
256 { Addr=strtol(S,0,16);K=0; }
257 DrawWindow=1;
258 break;
259 case 'J':
260 R->PC.W=ABuf[K];
261 A=~Addr;
262 break;
263 }
264 }
265
266 /* Continue emulation */
267 return(1);
268 }
269
270 #endif /* CONDEBUG */
271 #endif /* DEBUG */

  ViewVC Help
Powered by ViewVC 1.1.26