Rev 9353 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9353 | leency | 1 | use32 |
2 | db 'MENUET01' |
||
3 | dd 1 |
||
4 | dd Start |
||
5 | dd I_END |
||
6 | MemSize dd Mem |
||
7 | dd StackTop |
||
8 | dd 0,AppPath |
||
9 | |||
10 | VERSION equ '0.01+' |
||
11 | |||
12 | ;----------------------------------------------------------------------------- |
||
13 | Bitness equ 32 |
||
14 | ;----------------------------------------------------------------------------- |
||
15 | bit equ 1 shl |
||
16 | by equ shl 8 + |
||
17 | |||
18 | %B = 32 |
||
19 | |||
20 | macro even Value { rb (Value-1)-($+Value-1) mod Value } |
||
21 | |||
22 | macro ifc Opc& |
||
23 | { |
||
24 | local ..L |
||
25 | jnc ..L |
||
26 | Opc |
||
27 | ..L: |
||
28 | } |
||
29 | |||
30 | macro ifa Opc& |
||
31 | { |
||
32 | local ..L |
||
33 | jna ..L |
||
34 | Opc |
||
35 | ..L: |
||
36 | } |
||
37 | |||
38 | macro ifae Opc& |
||
39 | { |
||
40 | local ..L |
||
41 | jnae ..L |
||
42 | Opc |
||
43 | ..L: |
||
44 | } |
||
45 | |||
46 | macro ifb Opc& |
||
47 | { |
||
48 | local ..L |
||
49 | jnb ..L |
||
50 | Opc |
||
51 | ..L: |
||
52 | } |
||
53 | |||
54 | macro ifbe Opc& |
||
55 | { |
||
56 | local ..L |
||
57 | jnbe ..L |
||
58 | Opc |
||
59 | ..L: |
||
60 | } |
||
61 | |||
62 | macro ifg Opc& |
||
63 | { |
||
64 | local ..L |
||
65 | jng ..L |
||
66 | Opc |
||
67 | ..L: |
||
68 | } |
||
69 | |||
70 | macro ifge Opc& |
||
71 | { |
||
72 | local ..L |
||
73 | jnge ..L |
||
74 | Opc |
||
75 | ..L: |
||
76 | } |
||
77 | |||
78 | macro ifl Opc& |
||
79 | { |
||
80 | local ..L |
||
81 | jnl ..L |
||
82 | Opc |
||
83 | ..L: |
||
84 | } |
||
85 | |||
86 | macro ifle Opc& |
||
87 | { |
||
88 | local ..L |
||
89 | jnle ..L |
||
90 | Opc |
||
91 | ..L: |
||
92 | } |
||
93 | |||
94 | macro ifno Opc& |
||
95 | { |
||
96 | local ..L |
||
97 | jo ..L |
||
98 | Opc |
||
99 | ..L: |
||
100 | } |
||
101 | |||
102 | macro ifnp Opc& |
||
103 | { |
||
104 | local ..L |
||
105 | jp ..L |
||
106 | Opc |
||
107 | ..L: |
||
108 | } |
||
109 | |||
110 | macro ifns Opc& |
||
111 | { |
||
112 | local ..L |
||
113 | js ..L |
||
114 | Opc |
||
115 | ..L: |
||
116 | } |
||
117 | |||
118 | macro ifnz Opc& |
||
119 | { |
||
120 | local ..L |
||
121 | jz ..L |
||
122 | Opc |
||
123 | ..L: |
||
124 | } |
||
125 | |||
126 | macro ifo Opc& |
||
127 | { |
||
128 | local ..L |
||
129 | jno ..L |
||
130 | Opc |
||
131 | ..L: |
||
132 | } |
||
133 | |||
134 | macro ifp Opc& |
||
135 | { |
||
136 | local ..L |
||
137 | jnp ..L |
||
138 | Opc |
||
139 | ..L: |
||
140 | } |
||
141 | |||
142 | macro ifs Opc& |
||
143 | { |
||
144 | local ..L |
||
145 | jns ..L |
||
146 | Opc |
||
147 | ..L: |
||
148 | } |
||
149 | |||
150 | macro ifz Opc& |
||
151 | { |
||
152 | local ..L |
||
153 | jnz ..L |
||
154 | Opc |
||
155 | ..L: |
||
156 | } |
||
157 | |||
158 | macro lea Dst,Src |
||
159 | { |
||
160 | local ..L,..H |
||
161 | virtual at 0 |
||
162 | mov al,byte Src |
||
163 | load ..L byte from 0x0 |
||
164 | if ..L = 0xA0 |
||
165 | load ..H dword from 0x1 |
||
166 | end if |
||
167 | end virtual |
||
168 | if ..L = 0xA0 |
||
169 | mov Dst,..H |
||
170 | else |
||
171 | lea Dst,Src |
||
172 | end if |
||
173 | } |
||
174 | |||
175 | include 'kosfuncs.inc' |
||
176 | include '../../macros.inc' |
||
177 | |||
178 | include 'font.inc' |
||
179 | include 'tools.inc' |
||
180 | include 'kernel.inc' |
||
181 | |||
182 | virtual at rsp |
||
183 | All: |
||
184 | .edi dd ? |
||
185 | .esi dd ? |
||
186 | .ebp dd ? |
||
187 | .res dd ? |
||
188 | .ebx dd ? |
||
189 | .edx dd ? |
||
190 | .ecx dd ? |
||
191 | .eax dd ? |
||
192 | end virtual |
||
193 | |||
194 | macro jecxnz Target |
||
195 | { |
||
196 | inc ecx |
||
197 | loop Target |
||
198 | } |
||
199 | |||
9587 | vitalkrilo | 200 | TestFile db '/sys/develop/scancode',0 |
9353 | leency | 201 | |
202 | MinWidth = 90 |
||
203 | MaxWidth = 255 |
||
204 | MinHeight = 75 |
||
205 | MaxHeight = 255 |
||
206 | |||
207 | DATA_WIDTH = 88 ; in characters, multiple of 4 |
||
208 | |||
209 | CMD_WIDTH = DATA_WIDTH |
||
210 | |||
211 | CursorNormSize = 2 |
||
212 | CursorBigsSize = FontHeight |
||
213 | |||
214 | ;----------------------------------------------------------------------------- |
||
215 | ; Fast load test file event |
||
216 | DoLoad: mov esi,TestFile |
||
217 | mov edi,LoadName |
||
218 | jmp OnLoadInit |
||
219 | ;----------------------------------------------------------------------------- |
||
220 | ; Load executable event |
||
221 | OnLoad: mov esi,[CurArg] |
||
222 | OnLoadInit: |
||
223 | mov edi,LoadName |
||
224 | or [PrgNameLen],-1 |
||
225 | mov [PrgNamePtr],edi |
||
226 | .CopyName: |
||
227 | lodsb |
||
228 | stosb |
||
229 | inc [PrgNameLen] |
||
230 | cmp al,'/' |
||
231 | jnz @F |
||
232 | or [PrgNameLen],-1 |
||
233 | mov [PrgNamePtr],edi |
||
234 | @@: |
||
235 | cmp al,' ' |
||
236 | ja .CopyName |
||
237 | mov byte [edi-1],0 |
||
238 | and [LoadParams],0 |
||
239 | dec esi |
||
240 | call GetArg.SkipSpaces |
||
241 | cmp al,0 |
||
242 | jz @F |
||
243 | mov [LoadParams],esi |
||
244 | @@: |
||
245 | ;and [DumpPos],0 |
||
246 | mov ecx,[Symbols] |
||
247 | jecxz DoReLoad |
||
248 | mcall 68,13 |
||
249 | and [Symbols],0 |
||
250 | and [NumSymbols],0 |
||
251 | DoReLoad: |
||
252 | mcall 18,7 |
||
253 | mov [DbgWnd],eax |
||
254 | xchg ecx,eax |
||
255 | mcall 70,FN70LoadBlock |
||
256 | test eax,eax |
||
257 | jns .Loaded |
||
258 | |||
259 | .LoadErr: |
||
260 | push eax |
||
261 | mov esi,LoadErrMsg |
||
262 | call PutMessage |
||
263 | pop eax |
||
264 | not eax |
||
265 | cmp eax,0x20 |
||
266 | jae .UnkErr |
||
267 | mov esi,[LoadErrMsgs+eax*4] |
||
268 | test esi,esi |
||
269 | jnz PutMessage |
||
270 | |||
271 | .UnkErr: |
||
272 | mov esi,UnkErrMsg |
||
273 | inc eax |
||
274 | push eax |
||
275 | call PutMessageNoDraw |
||
276 | jmp DrawMessages |
||
277 | |||
278 | .Loaded: |
||
279 | mov [DebuggeePID],eax |
||
280 | mov [bSuspended],1 |
||
281 | mcall 5,20 |
||
282 | push ecx |
||
283 | call GetContext |
||
284 | mov edi,OldContext |
||
285 | mov ecx,(CtxEnd-Context)/4 |
||
286 | rep movsd |
||
287 | ; activate debugger window |
||
288 | pop ecx |
||
289 | mcall 18,3 |
||
290 | call GetDump |
||
291 | if 1 |
||
292 | push dword [ShowNames] |
||
293 | mov [ShowNames],-1 |
||
294 | end if |
||
295 | mov [AfterKey],0 |
||
296 | call ShowImage |
||
297 | mov esi,LoadSuccMsg |
||
298 | push [DebuggeePID] |
||
299 | call PutMessageNoDraw |
||
300 | call DrawMessages |
||
301 | ; try to load symbols |
||
302 | mov esi,LoadName |
||
303 | mov edi,SymbolsFile |
||
304 | push edi |
||
305 | @@: |
||
306 | lodsb |
||
307 | stosb |
||
308 | test al,al |
||
309 | jnz @B |
||
310 | lea ecx,[edi-1] |
||
311 | @@: |
||
312 | dec edi |
||
313 | cmp edi,SymbolsFile |
||
314 | jb @F |
||
315 | cmp byte [edi],'/' |
||
316 | jz @F |
||
317 | cmp byte [edi],'.' |
||
318 | jnz @B |
||
319 | mov ecx,edi |
||
320 | @@: |
||
321 | mov dword [ecx],'.dbg' |
||
322 | mov byte [ecx+4],0 |
||
323 | pop esi |
||
324 | mov ebp,esi |
||
325 | push ecx esi |
||
326 | call OnLoadSymbols.Silent ; Try to load .dbg file |
||
327 | pop esi ecx |
||
328 | xor eax,eax |
||
329 | cmp [NumSymbols],eax |
||
330 | jne @F |
||
331 | mov dword [ecx],'.map' ; If failed, try .map file too |
||
332 | call OnLoadSymbols.Silent |
||
333 | @@: |
||
334 | if 1 |
||
335 | pop eax |
||
336 | mov [ShowNames],al |
||
337 | call DrawMessages |
||
338 | end if |
||
339 | ret |
||
340 | |||
341 | ;----------------------------------------------------------------------------- |
||
342 | ; Working with debug context |
||
343 | GetNewContext: |
||
344 | mov esi,Context |
||
345 | mov edi,OldContext |
||
346 | mov ecx,(CtxEnd-Context)/4 |
||
347 | rep movsd |
||
348 | |||
349 | GetContext: |
||
350 | mcall 69,1,[DebuggeePID],CtxEnd-Context,Context |
||
351 | ret |
||
352 | |||
353 | SetContext: |
||
354 | mcall 69,2,[DebuggeePID],28h,Context |
||
355 | ret |
||
356 | |||
357 | ;----------------------------------------------------------------------------- |
||
358 | ; Resume process event |
||
359 | DoResume: |
||
360 | mcall 69,5,[DebuggeePID] |
||
361 | mov [bSuspended],0 |
||
362 | ret |
||
363 | |||
364 | ;----------------------------------------------------------------------------- |
||
365 | ; Breakpoints manipulation |
||
366 | OnBp: mov esi,[CurArg] |
||
367 | call CalcExpression |
||
368 | jc .Ret |
||
369 | xchg eax,ebp |
||
370 | push eax |
||
371 | call FindBreakPoint |
||
372 | inc eax |
||
373 | pop eax |
||
374 | jz .NotFound |
||
375 | mov esi,aDuplicateBreakpoint |
||
376 | jmp .SayErr |
||
377 | .NotFound: |
||
378 | mov bl,1 |
||
379 | call AddBreakPoint |
||
380 | jnc .Ret |
||
381 | mov esi,aBreakpointLimitExceeded |
||
382 | .SayErr: |
||
383 | call PutMessage |
||
384 | .Ret: |
||
385 | jmp DrawMessages;DrawDisAsm |
||
386 | |||
387 | ;----------------------------------------------------------------------------- |
||
388 | ; Dump memory event |
||
389 | OnDump: mov esi,[CurArg] |
||
390 | cmp byte [esi],0 |
||
391 | jnz .Param |
||
392 | ;add [DumpPos],DUMP_HEIGHT*10h |
||
393 | add [DataAddr],8*8 |
||
394 | jmp .DoIt |
||
395 | |||
396 | .Param: |
||
397 | call CalcExpression |
||
398 | jc .Ret |
||
399 | ;mov [DumpPos],ebp |
||
400 | mov [DataAddr],ebp |
||
401 | .DoIt: |
||
402 | ;call GetDump |
||
403 | ;call DrawDump.Redraw |
||
404 | call DrawMessages |
||
405 | .Ret: |
||
406 | ret |
||
407 | |||
408 | OnBpmb: mov dh,0011b |
||
409 | jmp DoBpm |
||
410 | |||
411 | OnBpmw: mov dh,0111b |
||
412 | jmp DoBpm |
||
413 | |||
414 | OnBpmd: mov dh,1111b |
||
415 | |||
416 | DoBpm: mov esi,[CurArg] |
||
417 | cmp byte [esi],'w' |
||
418 | jnz @F |
||
419 | and dh,not 2 |
||
420 | inc esi |
||
421 | @@: |
||
422 | push edx |
||
423 | call CalcExpression |
||
424 | pop edx |
||
425 | jnc @F |
||
426 | ret |
||
427 | ; ebp = expression, dh = flags |
||
428 | @@: |
||
429 | movzx eax,dh |
||
430 | shr eax,2 |
||
431 | test ebp,eax |
||
432 | jz @F |
||
433 | mov esi,aUnaligned |
||
434 | jmp PutMessage |
||
435 | @@: |
||
436 | mov eax,ebp |
||
437 | mov bl,0Bh |
||
438 | call AddBreakPoint |
||
439 | jnc @F |
||
440 | mov esi,aBreakpointLimitExceeded |
||
441 | jmp PutMessage |
||
442 | ; now find index |
||
443 | @@: |
||
444 | push eax |
||
445 | xor ecx,ecx |
||
446 | .L1: |
||
447 | cmp [DrXBreak+ecx*4],0 |
||
448 | jnz .L2 |
||
449 | push ecx |
||
450 | mov dl,cl |
||
451 | mov esi,ebp |
||
452 | mcall 69,9,[DebuggeePID] |
||
453 | test eax,eax |
||
454 | jz .OK |
||
455 | pop ecx |
||
456 | .L2: |
||
457 | inc ecx |
||
458 | cmp ecx,4 |
||
459 | jb .L1 |
||
460 | pop eax |
||
461 | call ClearBreakPoint |
||
462 | mov esi,aBreakpointLimitExceeded |
||
463 | jmp PutMessage |
||
464 | .OK: |
||
465 | pop ecx |
||
466 | pop eax |
||
467 | and byte [edi],not 2 ; breakpoint is enabled |
||
468 | shl dl,6 |
||
469 | or dl,dh |
||
470 | mov byte [edi+1],dl |
||
471 | inc eax |
||
472 | mov [DrXBreak+ecx*4],eax |
||
473 | ret |
||
474 | |||
475 | OnBc: mov esi,[CurArg] |
||
476 | @@: |
||
477 | call GetHexNumber |
||
478 | jc OnBp.Ret |
||
479 | call ClearBreakPoint |
||
480 | jmp @B |
||
481 | OnBd: |
||
482 | mov esi,[CurArg] |
||
483 | @@: |
||
484 | call GetHexNumber |
||
485 | jc OnBp.Ret |
||
486 | call DisableBreakPoint |
||
487 | jmp @B |
||
488 | OnBe: |
||
489 | mov esi,[CurArg] |
||
490 | @@: |
||
491 | call GetHexNumber |
||
492 | jc OnBp.Ret |
||
493 | push eax |
||
494 | call FindEnabledBreakPoint |
||
495 | pop eax |
||
496 | jz .Err |
||
497 | call EnableBreakPoint |
||
498 | jmp @B |
||
499 | .Err: |
||
500 | mov esi,OnBeErrMsg |
||
501 | jmp PutMessage |
||
502 | |||
503 | GetHexNumber: |
||
504 | call GetArg.SkipSpaces |
||
505 | xor ecx,ecx |
||
506 | xor edx,edx |
||
507 | @@: |
||
508 | lodsb |
||
509 | call IsHexDigit |
||
510 | jc .Ret |
||
511 | shl edx,4 |
||
512 | or dl,al |
||
513 | inc ecx |
||
514 | jmp @B |
||
515 | .Ret: |
||
516 | dec esi |
||
517 | cmp ecx,1 |
||
518 | xchg eax,edx |
||
519 | ret |
||
520 | |||
521 | ;----------------------------------------------------------------------------- |
||
522 | ; Breakpoints list event |
||
523 | OnBl: mov esi,[CurArg] |
||
524 | cmp byte [esi],0 |
||
525 | jz .ListAll |
||
526 | call GetHexNumber |
||
527 | jc .Ret |
||
528 | cmp eax,BreakPointsN |
||
529 | jae .Err |
||
530 | push eax |
||
531 | add eax,eax |
||
532 | lea edi,[BreakPoints+eax+eax*2] |
||
533 | pop eax |
||
534 | test byte [edi+4],1 |
||
535 | jz .Err |
||
536 | call ShowBreakInfo |
||
537 | .Ret: |
||
538 | ret |
||
539 | .Err: |
||
540 | mov esi,aInvalidBreak |
||
541 | jmp PutMessage |
||
542 | |||
543 | .ListAll: |
||
544 | mov edi,BreakPoints |
||
545 | xor eax,eax |
||
546 | @@: |
||
547 | test byte [edi+4],1 |
||
548 | jz .Cont |
||
549 | push edi eax |
||
550 | call ShowBreakInfo |
||
551 | pop eax edi |
||
552 | .Cont: |
||
553 | add edi,6 |
||
554 | inc eax |
||
555 | cmp eax,BreakPointsN |
||
556 | jb @B |
||
557 | ret |
||
558 | |||
559 | ShowBreakInfo: |
||
560 | push edi |
||
561 | test byte [edi+4],8 |
||
562 | jnz .DR |
||
563 | push dword [edi] |
||
564 | push eax |
||
565 | mov esi,aBreakNum |
||
566 | call PutMessageNoDraw |
||
567 | jmp .CMN |
||
568 | .DR: |
||
569 | push eax |
||
570 | mov esi,aMemBreak1 |
||
571 | call PutMessageNoDraw |
||
572 | pop edi |
||
573 | push edi |
||
574 | mov esi,aMemBreak2 |
||
575 | test byte [edi+5],2 |
||
576 | jz @F |
||
577 | mov esi,aMemBreak3 |
||
578 | @@: |
||
579 | call PutMessageNoDraw |
||
580 | pop edi |
||
581 | push edi |
||
582 | mov esi,aMemBreak6 |
||
583 | test byte [edi+5],8 |
||
584 | jnz @F |
||
585 | mov esi,aMemBreak5 |
||
586 | test byte [edi+5],4 |
||
587 | jnz @F |
||
588 | mov esi,aMemBreak4 |
||
589 | @@: |
||
590 | call PutMessageNoDraw |
||
591 | pop edi |
||
592 | push edi |
||
593 | push dword [edi] |
||
594 | mov esi,aMemBreak7 |
||
595 | call PutMessageNoDraw |
||
596 | .CMN: |
||
597 | pop edi |
||
598 | test byte [edi+4],2 |
||
599 | jz @F |
||
600 | push edi |
||
601 | mov esi,aDisabled |
||
602 | call PutMessageNoDraw |
||
603 | pop edi |
||
604 | @@: |
||
605 | test byte [edi+4],4 |
||
606 | jz @F |
||
607 | mov esi,aOneShot |
||
608 | call PutMessageNoDraw |
||
609 | @@: |
||
610 | mov esi,NewLine |
||
611 | jmp PutMessage |
||
612 | |||
613 | ;----------------------------------------------------------------------------- |
||
614 | ; Unpack executable event |
||
615 | OnUnpack: |
||
616 | ; program must be loaded - checked when command was parsed |
||
617 | ; program must be stopped |
||
618 | mov esi,aRunningErr |
||
619 | cmp [bSuspended],0 |
||
620 | jz PutMessage |
||
621 | ; all breakpoints must be disabled |
||
622 | mov edi,BreakPoints |
||
623 | @@: |
||
624 | test byte [edi+4],1 |
||
625 | jz .Cont |
||
626 | test byte [edi+4],2 |
||
627 | jnz .Cont |
||
628 | mov esi,aEnabledBreakErr |
||
629 | jmp PutMessage |
||
630 | .Cont: |
||
631 | add edi,6 |
||
632 | cmp edi,BreakPoints+BreakPointsN*6 |
||
633 | jb @B |
||
634 | ; ok, now do it |
||
635 | ; set breakpoint on 0xC dword access |
||
636 | push 9 |
||
637 | pop ebx |
||
638 | mov ecx,[DebuggeePID] |
||
639 | mov dx,1111b*256 |
||
640 | push 0xC |
||
641 | pop esi |
||
642 | @@: |
||
643 | mcall 69 |
||
644 | test eax,eax |
||
645 | jz .BreakOK |
||
646 | inc edx |
||
647 | cmp dl,4 |
||
648 | jb @B |
||
649 | .BreakOK: |
||
650 | call GoOn |
||
651 | ; now wait for event |
||
652 | .Wait: |
||
653 | mcall 10 |
||
654 | dec eax |
||
655 | jz .Redraw |
||
656 | dec eax |
||
657 | jz .Key |
||
658 | dec eax |
||
659 | jnz .Debug |
||
660 | ; button; we have only one button, close |
||
661 | or eax,-1 |
||
662 | mcall |
||
663 | |||
664 | .Redraw: |
||
665 | mov [DoDraw],1 |
||
666 | call DrawWindow |
||
667 | jmp .Wait |
||
668 | |||
669 | .Key: |
||
670 | mov al,2 |
||
671 | mcall |
||
672 | cmp ah,3 ; Ctrl+C |
||
673 | jnz .Wait |
||
674 | |||
675 | .UserBreak: |
||
676 | mov esi,aInterrupted |
||
677 | .X1: |
||
678 | push edx esi |
||
679 | call PutMessage |
||
680 | pop esi edx |
||
681 | or dh,80h |
||
682 | mcall 69,9,[DebuggeePID] |
||
683 | cmp esi,aUnpacked |
||
684 | jnz OnSuspend |
||
685 | jmp AfterSuspend |
||
686 | |||
687 | .Debug: |
||
688 | cmp [DbgBufLen],4*3 |
||
689 | jnz .NotOur |
||
690 | cmp dword [DbgBuf],3 |
||
691 | jnz .NotOur |
||
692 | test byte [DbgBuf+8],1 |
||
693 | jnz .Our |
||
694 | |||
695 | .NotOur: |
||
696 | mov esi,aInterrupted |
||
697 | push edx |
||
698 | call PutMessage |
||
699 | pop edx |
||
700 | or dh,80h |
||
701 | mcall 69,9,[DebuggeePID] |
||
702 | jmp DebugMsg |
||
703 | |||
704 | .Our: |
||
705 | and [DbgBufLen],0 |
||
706 | push edx |
||
707 | call GetContext |
||
708 | push eax |
||
709 | mcall 69,6,[DebuggeePID],4,0xC,esp |
||
710 | pop eax |
||
711 | pop edx |
||
712 | cmp eax,[_EIP] |
||
713 | jz .Done |
||
714 | call DoResume |
||
715 | jmp .Wait |
||
716 | |||
717 | .Done: |
||
718 | mov esi,aUnpacked |
||
719 | jmp .X1 |
||
720 | |||
721 | ;----------------------------------------------------------------------------- |
||
722 | ; Calculate expression event |
||
723 | OnCalc: mov esi,[CurArg] |
||
724 | call CalcExpression |
||
725 | jc .Ret |
||
726 | push ebp |
||
727 | mov esi,CalcString |
||
728 | call PutMessageNoDraw |
||
729 | jmp DrawMessages |
||
730 | .Ret: |
||
731 | ret |
||
732 | |||
733 | ;----------------------------------------------------------------------------- |
||
734 | ; Access to register value event |
||
735 | OnReg: mov esi,[CurArg] |
||
736 | call GetArg.SkipSpaces |
||
737 | call FindReg |
||
738 | jnc @F |
||
739 | .Err: |
||
740 | mov esi,RSyntax |
||
741 | jmp PutMessage |
||
742 | @@: |
||
743 | call GetArg.SkipSpaces |
||
744 | test al,al |
||
745 | jz .Err |
||
746 | cmp al,'=' |
||
747 | jnz @F |
||
748 | inc esi |
||
749 | call GetArg.SkipSpaces |
||
750 | test al,al |
||
751 | jz .Err |
||
752 | @@: |
||
753 | push edi |
||
754 | call CalcExpression |
||
755 | pop edi |
||
756 | jc .Ret |
||
757 | ; now edi=register id, ebp=value |
||
758 | cmp [bSuspended],0 |
||
759 | mov esi,aRunningErr |
||
760 | jz PutMessage |
||
761 | xchg eax,ebp |
||
762 | cmp edi,24 |
||
763 | jz .EIP |
||
764 | sub edi,4 |
||
765 | jb .8LO |
||
766 | sub edi,4 |
||
767 | jb .8HI |
||
768 | sub edi,8 |
||
769 | jb .16 |
||
770 | mov [_EAX+edi*4],eax |
||
771 | jmp .Ret |
||
772 | .16: |
||
773 | mov word [_EAX+(edi+8)*4],ax |
||
774 | jmp .Ret |
||
775 | .8LO: |
||
776 | mov byte [_EAX+(edi+4)*4],al |
||
777 | jmp .Ret |
||
778 | .8HI: |
||
779 | mov byte [_EAX+(edi+4)*4+1],al |
||
780 | jmp .Ret |
||
781 | .EIP: |
||
782 | mov [_EIP],eax |
||
783 | ;call UpdateDisAsmEIP |
||
784 | .Ret: |
||
785 | call SetContext |
||
786 | jmp DrawMessages;DrawRegisters.ReDraw |
||
787 | |||
788 | ;----------------------------------------------------------------------------- |
||
789 | ; Step execution event |
||
790 | ;Here we get [ |
||
791 | OnStepMultiple: |
||
792 | cmp [bSuspended],0 |
||
793 | jz OnStep.Running |
||
794 | mov [StepNum],1 |
||
795 | mov esi,[CurArg] |
||
796 | test esi,esi |
||
797 | jz .Do |
||
798 | cmp byte [esi],0 |
||
799 | jz .Do |
||
800 | call GetHexNumber |
||
801 | jc .Ret |
||
802 | or eax,eax ; check if lesser or equal than 0 |
||
803 | jle .Ret |
||
804 | mov [StepNum],eax |
||
805 | .Do: call OnStep |
||
806 | dec [StepNum] |
||
807 | jnz .Do |
||
808 | .Ret: ret |
||
809 | |||
810 | OnStep: |
||
811 | cmp [bSuspended],0 |
||
812 | jz .Running |
||
813 | call GetContext |
||
814 | or byte [_EFL+1],1 ; set TF |
||
815 | call SetContext |
||
816 | and byte [_EFL+1],not 1 |
||
817 | ; if instruction at eip is "int xx", set one-shot breakpoint immediately after |
||
818 | mov eax,[_EIP] |
||
819 | call FindEnabledBreakPoint |
||
820 | jnz @F |
||
821 | cmp byte [edi+5],0xCD |
||
822 | jz .Int |
||
823 | @@: |
||
824 | push 0 |
||
825 | mcall 69,6,[DebuggeePID],3,[_EIP],esp |
||
826 | cmp eax,edx |
||
827 | pop eax |
||
828 | jnz .DoIt |
||
829 | cmp al,0xCD |
||
830 | jz .Int |
||
831 | cmp ax,0x050F |
||
832 | jz .SysCall |
||
833 | cmp ax,0x340F |
||
834 | jz .SysEnter |
||
835 | ; resume process |
||
836 | .DoIt: |
||
837 | call GoOn |
||
838 | cmp [bAfterGo],0 |
||
839 | jz @F |
||
840 | mov [bAfterGo],2 |
||
841 | @@: |
||
842 | ret |
||
843 | |||
844 | ; return address is [ebp-4] |
||
845 | .SysEnter: |
||
846 | push 0 |
||
847 | inc edx ; read 4 bytes |
||
848 | mov esi,[_EBP] |
||
849 | sub esi,4 |
||
850 | mcall 69 |
||
851 | cmp eax,edx |
||
852 | pop eax |
||
853 | jnz .SysCall |
||
854 | push eax |
||
855 | and byte [_EFL+1],not 1 |
||
856 | call SetContext |
||
857 | pop eax |
||
858 | jmp @F |
||
859 | |||
860 | .SysCall: |
||
861 | and byte [_EFL+1],not 1 ; clear TF - avoid system halt (!) |
||
862 | call SetContext |
||
863 | .Int: |
||
864 | mov eax,[_EIP] |
||
865 | inc eax |
||
866 | inc eax |
||
867 | @@: |
||
868 | push eax |
||
869 | call FindEnabledBreakPoint |
||
870 | pop eax |
||
871 | jz .DoIt |
||
872 | ; there is no enabled breakpoint yet; set temporary breakpoint |
||
873 | mov bl,5 |
||
874 | call AddBreakPoint |
||
875 | jmp .DoIt |
||
876 | |||
877 | .Running: |
||
878 | mov esi,aRunningErr |
||
879 | jmp PutMessage |
||
880 | |||
881 | ;----------------------------------------------------------------------------- |
||
882 | ; Proceed process event |
||
883 | ;Here we get [ |
||
884 | OnProceedMultiple: |
||
885 | cmp [bSuspended],0 |
||
886 | jz OnStep.Running |
||
887 | mov [ProcNum],1 |
||
888 | mov esi,[CurArg] |
||
889 | test esi,esi |
||
890 | jz .Do |
||
891 | cmp byte [esi],0 |
||
892 | jz .Do |
||
893 | call GetHexNumber |
||
894 | jc .Ret |
||
895 | or eax,eax ; check if lesser or equal than 0 |
||
896 | jle .Ret |
||
897 | mov [ProcNum],eax |
||
898 | and [CurArg],0 |
||
899 | .Do: |
||
900 | call OnProceed |
||
901 | dec [ProcNum] |
||
902 | jnz .Do |
||
903 | .Ret: |
||
904 | ret |
||
905 | |||
906 | OnProceed: |
||
907 | cmp [bSuspended],0 |
||
908 | jz OnStep.Running |
||
909 | mov esi,[_EIP] |
||
910 | |||
911 | @@: |
||
912 | call GetByteNoBreak |
||
913 | jc OnStep |
||
914 | inc esi |
||
915 | ; skip prefixes |
||
916 | call IsPrefix |
||
917 | jz @B |
||
918 | cmp al,0xE8 ; call |
||
919 | jnz @f |
||
920 | add esi,4 |
||
921 | jmp .DoIt |
||
922 | |||
923 | ; A4,A5 = movs; A6,A7 = cmps |
||
924 | @@: |
||
925 | cmp al,0xA4 |
||
926 | jb @F |
||
927 | cmp al,0xA8 |
||
928 | jb .DoIt |
||
929 | |||
930 | ; AA,AB = stos; AC,AD = lods; AE,AF = scas |
||
931 | @@: |
||
932 | cmp al,0xAA |
||
933 | jb @F |
||
934 | cmp al,0xB0 |
||
935 | jb .DoIt |
||
936 | |||
937 | ; E0 = loopnz; E1 = loopz; E2 = loop |
||
938 | @@: |
||
939 | cmp al,0xE0 |
||
940 | jb .NoLoop |
||
941 | cmp al,0xE2 |
||
942 | ja .NoLoop |
||
943 | inc esi |
||
944 | jmp .DoIt |
||
945 | |||
946 | ; FF /2 = call |
||
947 | .NoLoop: |
||
948 | cmp al,0xFF |
||
949 | jnz OnStep |
||
950 | call GetByteNoBreak |
||
951 | jc OnStep |
||
952 | inc esi |
||
953 | mov cl,al |
||
954 | and al,00111000b |
||
955 | cmp al,00010000b |
||
956 | jnz OnStep |
||
957 | ; skip instruction |
||
958 | mov al,cl |
||
959 | and eax,7 |
||
960 | shr cl,6 |
||
961 | jz .Mod0 |
||
962 | jp .DoIt |
||
963 | cmp al,4 |
||
964 | jnz @F |
||
965 | inc esi |
||
966 | @@: |
||
967 | inc esi |
||
968 | dec cl |
||
969 | jz @F |
||
970 | add esi,3 |
||
971 | @@: |
||
972 | jmp .DoIt |
||
973 | .Mod0: |
||
974 | cmp al,4 |
||
975 | jnz @F |
||
976 | call GetByteNoBreak |
||
977 | jc OnStep |
||
978 | inc esi |
||
979 | and al,7 |
||
980 | @@: |
||
981 | cmp al,5 |
||
982 | jnz .DoIt |
||
983 | add esi,4 |
||
984 | .DoIt: |
||
985 | ; insert one-shot breakpoint at esi and resume |
||
986 | call GetByteNoBreak |
||
987 | jc OnStep |
||
988 | mov eax,esi |
||
989 | call FindEnabledBreakPoint |
||
990 | jz @F |
||
991 | mov eax,esi |
||
992 | mov bl,5 |
||
993 | call AddBreakPoint |
||
994 | jmp OnStep.DoIt |
||
995 | @@: |
||
996 | ret |
||
997 | |||
998 | ;----------------------------------------------------------------------------- |
||
999 | ; Read next byte of machine code |
||
1000 | GetByteNoBreak: |
||
1001 | mov eax,esi |
||
1002 | call FindEnabledBreakPoint |
||
1003 | jnz .NoBreak |
||
1004 | mov al,[edi+5] |
||
1005 | clc |
||
1006 | ret |
||
1007 | |||
1008 | .NoBreak: |
||
1009 | xor edx,edx |
||
1010 | push edx |
||
1011 | inc edx |
||
1012 | mov edi,esp |
||
1013 | mcall 69,6,[DebuggeePID] |
||
1014 | dec eax |
||
1015 | clc |
||
1016 | jz @F |
||
1017 | stc |
||
1018 | @@: |
||
1019 | pop eax |
||
1020 | ret |
||
1021 | |||
1022 | IsPrefix: |
||
1023 | cmp al,0x64 ; fs: |
||
1024 | jz .Ret |
||
1025 | cmp al,0x65 ; gs: |
||
1026 | jz .Ret |
||
1027 | cmp al,0x66 ; use16/32 |
||
1028 | jz .Ret |
||
1029 | cmp al,0x67 ; addr16/32 |
||
1030 | jz .Ret |
||
1031 | cmp al,0xF0 ; lock |
||
1032 | jz .Ret |
||
1033 | cmp al,0xF2 ; repnz |
||
1034 | jz .Ret |
||
1035 | cmp al,0xF3 ; rep(z) |
||
1036 | jz .Ret |
||
1037 | cmp al,0x2E ; cs: |
||
1038 | jz .Ret |
||
1039 | cmp al,0x36 ; ss: |
||
1040 | jz .Ret |
||
1041 | cmp al,0x3E ; ds: |
||
1042 | jz .Ret |
||
1043 | cmp al,0x26 ; es: |
||
1044 | .Ret: |
||
1045 | ret |
||
1046 | |||
1047 | OnResume: |
||
1048 | mov esi,[CurArg] |
||
1049 | cmp byte [esi],0 |
||
1050 | jz GoOn |
||
1051 | call CalcExpression |
||
1052 | jc .Ret |
||
1053 | .Jmp: |
||
1054 | mov eax,ebp |
||
1055 | push eax |
||
1056 | call FindEnabledBreakPoint |
||
1057 | pop eax |
||
1058 | jz GoOn |
||
1059 | mov bl,5 ; valid enabled one-shot |
||
1060 | call AddBreakPoint |
||
1061 | jnc GoOn |
||
1062 | mov esi,aBreakpointLimitExceeded |
||
1063 | call PutMessage |
||
1064 | .Ret: |
||
1065 | ret |
||
1066 | |||
1067 | ;----------------------------------------------------------------------------- |
||
1068 | ; Jump event |
||
1069 | OnJump: mov esi,[CurArg] |
||
1070 | cmp byte [rsi],0 |
||
1071 | jz .Ret |
||
1072 | call CalcExpression |
||
1073 | jc .Ret |
||
1074 | mov ecx,[CurrentWindow] |
||
1075 | mov [CodeAddr+rcx*4],ebp |
||
1076 | jecxnz .Next |
||
1077 | mov [CPUYPos],1 |
||
1078 | .Next: |
||
1079 | cmp ecx,1 ;Reg Window? |
||
1080 | jnz .NReg |
||
1081 | mov eax,[RegXPtr] |
||
1082 | cmp eax,9 |
||
1083 | jae .NReg |
||
1084 | mov eax,[RegRTab+rax*4] |
||
1085 | mov [rax],ebp |
||
1086 | call SetContext |
||
1087 | .NReg: |
||
1088 | mov [AfterKey],1 |
||
1089 | call ShowImage |
||
1090 | .Ret: ret |
||
1091 | |||
1092 | ;----------------------------------------------------------------------------- |
||
1093 | ; Help event |
||
1094 | OnHelp: mov esi,HelpMsg |
||
1095 | mov edi,[CurArg] |
||
1096 | cmp byte [edi],0 |
||
1097 | jz .X |
||
1098 | mov esi,HelpGroups |
||
1099 | call FindCmd |
||
1100 | jc .NoCmd |
||
1101 | mov esi,[esi+12] |
||
1102 | .X: |
||
1103 | jmp PutMessage |
||
1104 | |||
1105 | .NoCmd: |
||
1106 | mov esi,aUnknownCommand |
||
1107 | jmp .X |
||
1108 | |||
1109 | ;----------------------------------------------------------------------------- |
||
1110 | ; Detach process event |
||
1111 | OnDetach: |
||
1112 | mcall 69,3,[DebuggeePID] |
||
1113 | and [DebuggeePID],0 |
||
1114 | call FreeSymbols |
||
1115 | mov esi,aContinued |
||
1116 | jmp PutMessage |
||
1117 | |||
1118 | ;----------------------------------------------------------------------------- |
||
1119 | ; Reload executable event |
||
1120 | OnReLoad: |
||
1121 | cmp [DebuggeePID],0 |
||
1122 | jnz TerminateReLoad |
||
1123 | mov esi,NeedDebuggee |
||
1124 | cmp byte [LoadName],0 |
||
1125 | jnz DoReLoad |
||
1126 | jz PutMessage |
||
1127 | |||
1128 | TerminateReLoad: |
||
1129 | mov [bReload],1 |
||
1130 | ;----------------------------------------------------------------------------- |
||
1131 | ; Terminate process event |
||
1132 | OnTerminate: |
||
1133 | mcall 69,8,[DebuggeePID] |
||
1134 | ret |
||
1135 | |||
1136 | ;----------------------------------------------------------------------------- |
||
1137 | ; Suspend process event |
||
1138 | AfterSuspend: |
||
1139 | mov [bSuspended],1 |
||
1140 | call GetNewContext |
||
1141 | call GetDump |
||
1142 | call ShowImage |
||
1143 | ret |
||
1144 | |||
1145 | OnSuspend: |
||
1146 | mcall 69,4,[DebuggeePID] |
||
1147 | call AfterSuspend |
||
1148 | mov esi,aSuspended |
||
1149 | jmp PutMessage |
||
1150 | GoOn: |
||
1151 | ; test for enabled breakpoint at eip |
||
1152 | mov eax,[_EIP] |
||
1153 | call FindEnabledBreakPoint |
||
1154 | jnz .NoBreak |
||
1155 | ; temporarily disable breakpoint, make step, enable breakpoint, continue |
||
1156 | inc eax |
||
1157 | mov [TempBreak],eax |
||
1158 | mov [bAfterGo],1 |
||
1159 | dec eax |
||
1160 | call DisableBreakPoint |
||
1161 | call GetContext |
||
1162 | or byte [_EFL+1],1 ; set TF |
||
1163 | call SetContext |
||
1164 | and byte [_EFL+1],not 1 |
||
1165 | call DoResume |
||
1166 | ret |
||
1167 | .NoBreak: |
||
1168 | call DoResume |
||
1169 | ShowImage: |
||
1170 | pushad |
||
1171 | call InitConsole |
||
1172 | call DrawWindow |
||
1173 | popad |
||
1174 | ret |
||
1175 | |||
1176 | even 4 |
||
1177 | InitConsole: |
||
1178 | mov eax,[CurWidth] |
||
1179 | mul [CurHeight] |
||
1180 | mov ecx,eax |
||
1181 | mov edi,ConsoleDataPtr |
||
1182 | mov eax,3F203F20h |
||
1183 | shr ecx,1 |
||
1184 | rep stosd |
||
1185 | adc cl,cl |
||
1186 | rep stosw |
||
1187 | ; |
||
1188 | mov ebx,MSG_HEIGHT ;dY |
||
1189 | mov ecx,[CurWidth] ;\dX |
||
1190 | sub ecx,2 ;/ |
||
1191 | mov esi,1 ;X |
||
1192 | mov edi,MinHeight-MSG_HEIGHT-1 ;Y |
||
1193 | mov edx,87208720h |
||
1194 | call ClearWindow |
||
1195 | ; |
||
1196 | call DrawFrame |
||
1197 | ret |
||
1198 | |||
1199 | InitCoords: |
||
1200 | mov [CPUXPos],1 |
||
1201 | mov [CPUYPos],1 |
||
1202 | mov [CPUXPtr],0 |
||
1203 | mov [MemXPos],11 |
||
1204 | mov [MemYPos],41 |
||
1205 | mov eax,[CurWidth] |
||
1206 | SUB eax,21 |
||
1207 | mov [StkXPos],eax |
||
1208 | mov [StkYPos],28 |
||
1209 | mov [RegXPos],1 |
||
1210 | mov [RegYPos],30 |
||
1211 | mov [RegLDat],12 |
||
1212 | and [RegXPtr],0 |
||
1213 | ret |
||
1214 | |||
1215 | GetDataByte: |
||
1216 | ;I: esi - address |
||
1217 | ;O: al - byte |
||
1218 | pushad |
||
1219 | mov al,0 |
||
1220 | push eax |
||
1221 | mcall 69,6,[DebuggeePID],1,[All.esi+4],esp |
||
1222 | if 1 |
||
1223 | mov esi,[All.esi+4] |
||
1224 | mov edi,esp |
||
1225 | call RestoreFromBreaksOne |
||
1226 | end if |
||
1227 | cmp eax,-1 ;invalid PID? |
||
1228 | jz @F ;Yes,CF=0 |
||
1229 | cmp eax,1 ;CF=1,eax=1 if OK |
||
1230 | cmc |
||
1231 | @@: pop dword [esp+1Ch] |
||
1232 | popad |
||
1233 | ret |
||
1234 | |||
1235 | SafeStoreDD: |
||
1236 | pushad |
||
1237 | mov eax,69 |
||
1238 | mov ebx,7 |
||
1239 | mov ecx,[DebuggeePID] |
||
1240 | mov edx,4 |
||
1241 | mov esi,edi |
||
1242 | lea edi,[All.eax] |
||
1243 | int 40h |
||
1244 | popad |
||
1245 | ret |
||
1246 | |||
1247 | SafeStore: |
||
1248 | pushad |
||
1249 | mov eax,69 |
||
1250 | mov ebx,7 |
||
1251 | mov ecx,[DebuggeePID] |
||
1252 | mov edx,1 |
||
1253 | mov esi,edi |
||
1254 | lea edi,[All.eax] |
||
1255 | int 40h |
||
1256 | popad |
||
1257 | ret |
||
1258 | |||
1259 | DrawWindow: |
||
1260 | btr dword [DoDraw],0 |
||
1261 | jc .CopyDraw |
||
1262 | mov esi,ConsoleDataPtr |
||
1263 | mov edi,ConsoleDataOld |
||
1264 | mov ecx,[CurWidth] |
||
1265 | imul ecx,[CurHeight] |
||
1266 | shr ecx,1 |
||
1267 | repz cmpsd |
||
1268 | jnz .CopyDraw |
||
1269 | adc cl,cl |
||
1270 | repz cmpsw |
||
1271 | jz .SkipDraw |
||
1272 | .CopyDraw: |
||
1273 | mov esi,ConsoleDataPtr |
||
1274 | mov edi,ConsoleDataOld |
||
1275 | mov ecx,[CurWidth] |
||
1276 | imul ecx,[CurHeight] |
||
1277 | shr ecx,1 |
||
1278 | rep movsd |
||
1279 | adc cl,cl |
||
1280 | rep movsw |
||
1281 | |||
1282 | push SF_REDRAW |
||
1283 | pop eax |
||
1284 | push SSF_BEGIN_DRAW |
||
1285 | pop ebx |
||
1286 | int 40h |
||
1287 | mov al,SF_STYLE_SETTINGS |
||
1288 | mov bl,SSF_GET_SKIN_HEIGHT |
||
1289 | int 40h |
||
1290 | mov [SkinH],eax |
||
1291 | mov ebx,[CurWidth] |
||
1292 | imul ebx,FontWidth |
||
1293 | add ebx,100*65536+5*2-1 |
||
1294 | mov ecx,[CurHeight] |
||
1295 | imul ecx,FontHeight |
||
1296 | lea ecx,[eax+ecx+5-1+100*65536] |
||
1297 | xor eax,eax |
||
1298 | mov edx,0x53000000 |
||
1299 | |||
1300 | mov edi,HeaderN |
||
1301 | cmp [DebuggeePID],0 |
||
1302 | jz @F |
||
1303 | mov edi,HeaderY |
||
1304 | @@: int 40h |
||
1305 | |||
1306 | mov al,SF_DRAW_RECT |
||
1307 | xor edx,edx |
||
1308 | cmp [FillWidth],0 |
||
1309 | jz @F |
||
1310 | mov ebx,[WndWidth] |
||
1311 | sub ebx,[FillWidth] |
||
1312 | sub ebx,5-1 |
||
1313 | shl ebx,16 |
||
1314 | mov bx,word [FillWidth] |
||
1315 | mov ecx,[SkinH-2] |
||
1316 | mov cx,word [WndHeight] |
||
1317 | sub cx,word [SkinH] |
||
1318 | sub cx,5-1 |
||
1319 | int 40h |
||
1320 | @@: |
||
1321 | cmp [FillHeight],0 |
||
1322 | jz @F |
||
1323 | xor edx,edx |
||
1324 | mov ebx,50000h |
||
1325 | mov bx,word [WndWidth] |
||
1326 | sub ebx,9 |
||
1327 | mov ecx,[WndHeight] |
||
1328 | sub ecx,[FillHeight] |
||
1329 | sub ecx,5-1 |
||
1330 | shl ecx,16 |
||
1331 | mov cx,word [FillHeight] |
||
1332 | int 40h |
||
1333 | @@: |
||
1334 | call DrawImage |
||
1335 | mov al,SF_PUT_IMAGE_EXT |
||
1336 | mov ebx,[MemForImage] |
||
1337 | test ebx,ebx |
||
1338 | jz @F |
||
1339 | mov ecx,[CurWidth] |
||
1340 | imul ecx,FontWidth*10000h |
||
1341 | mov cx,word [CurHeight] |
||
1342 | imul cx,FontHeight |
||
1343 | mov edx,[SkinH] |
||
1344 | add edx,5*10000h |
||
1345 | mov esi,8 |
||
1346 | mov edi,ConsoleColors |
||
1347 | xor ebp,ebp |
||
1348 | int 40h |
||
1349 | @@: |
||
1350 | mov al,SF_REDRAW |
||
1351 | push SSF_END_DRAW |
||
1352 | pop ebx |
||
1353 | int 40h |
||
1354 | .SkipDraw: |
||
1355 | ret |
||
1356 | |||
1357 | align 16 |
||
1358 | DrawImage: |
||
1359 | mov [bMemForImageValidData],byte 1 |
||
1360 | cmp [MemForImage],0 |
||
1361 | jnz .Allocated |
||
1362 | ; allocate memory for image |
||
1363 | mov ecx,[CurWidth] |
||
1364 | imul ecx,[CurHeight] |
||
1365 | imul ecx,FontWidth*FontHeight |
||
1366 | call PGAlloc |
||
1367 | test eax,eax |
||
1368 | ifz ret |
||
1369 | mov [MemForImage],eax |
||
1370 | mov [bMemForImageValidData],byte 0 |
||
1371 | .Allocated: |
||
1372 | push ebp |
||
1373 | and [MaxX],0 |
||
1374 | or [MinX],-1 |
||
1375 | and [MaxY],0 |
||
1376 | or [MinY],-1 |
||
1377 | mov eax,[CursorY] |
||
1378 | mul [CurWidth] |
||
1379 | add eax,[CursorX] |
||
1380 | add eax,eax |
||
1381 | add eax,ConsoleDataPtr |
||
1382 | xchg [CurCursorPos],eax |
||
1383 | mov [OldCursorPos],eax |
||
1384 | mov edi,[MemForImage] |
||
1385 | mov esi,ConsoleDataPtr |
||
1386 | mov ecx,[CurHeight] |
||
1387 | .LH: |
||
1388 | push ecx |
||
1389 | mov ecx,[CurWidth] |
||
1390 | .LW: |
||
1391 | push ecx |
||
1392 | mov eax,[CurWidth] |
||
1393 | imul eax,[CurHeight] |
||
1394 | mov ebx,[esi] |
||
1395 | cmp [bMemForImageValidData],0 |
||
1396 | jz @F |
||
1397 | cmp esi,[CurCursorPos] |
||
1398 | jz @F |
||
1399 | cmp esi,[OldCursorPos] |
||
1400 | jz @F |
||
1401 | cmp bx,[eax*2+esi] |
||
1402 | jnz @F |
||
1403 | inc esi |
||
1404 | inc esi |
||
1405 | jmp .SkipSymbol |
||
1406 | @@: |
||
1407 | mov [eax*2+esi],bx |
||
1408 | cmp ecx,[MinX] |
||
1409 | ja @F |
||
1410 | mov [MinX],ecx |
||
1411 | @@: |
||
1412 | cmp ecx,[MaxX] |
||
1413 | jb @F |
||
1414 | mov [MaxX],ecx |
||
1415 | @@: |
||
1416 | mov eax,[esp+4] |
||
1417 | mov [MinY],eax |
||
1418 | cmp eax,[MaxY] |
||
1419 | jb @F |
||
1420 | mov [MaxY],eax |
||
1421 | @@: |
||
1422 | push edi |
||
1423 | xor eax,eax |
||
1424 | mov al,[esi+1] |
||
1425 | and al,0xF |
||
1426 | mov ebx,eax |
||
1427 | mov al,[esi+1] |
||
1428 | shr al,4 |
||
1429 | mov ebp,eax |
||
1430 | sub ebx,ebp |
||
1431 | lodsb |
||
1432 | inc esi |
||
1433 | if FontWidth > 8 |
||
1434 | lea edx,[eax+eax+Font] |
||
1435 | else |
||
1436 | lea edx,[eax+Font] |
||
1437 | end if |
||
1438 | .SH: |
||
1439 | mov ecx,[edx] |
||
1440 | repeat FontWidth |
||
1441 | shr ecx,1 |
||
1442 | sbb eax,eax |
||
1443 | and eax,ebx |
||
1444 | add eax,ebp |
||
1445 | mov [edi+%-1],al |
||
1446 | end repeat |
||
1447 | mov eax,[CurWidth] |
||
1448 | if FontWidth = 6 |
||
1449 | lea eax,[eax*2+eax] |
||
1450 | lea edi,[edi+eax*2] |
||
1451 | else if FontWidth = 7 |
||
1452 | lea edi,[edi+eax*8] |
||
1453 | sub edi,eax |
||
1454 | else if FontWidth = 8 |
||
1455 | lea edi,[edi+eax*8] |
||
1456 | else if FontWidth = 9 |
||
1457 | lea edi,[edi+eax*8] |
||
1458 | add edi,eax |
||
1459 | else if FontWidth = 10 |
||
1460 | lea eax,[eax*4+eax] |
||
1461 | lea edi,[edi+eax*2] |
||
1462 | else |
||
1463 | Unknown FontWidth Value! |
||
1464 | end if |
||
1465 | if FontWidth > 8 |
||
1466 | add edx,256*2 |
||
1467 | cmp edx,Font+256*2*FontHeight |
||
1468 | else |
||
1469 | add edx,256 |
||
1470 | cmp edx,Font+256*FontHeight |
||
1471 | end if |
||
1472 | jb .SH |
||
1473 | pop edi |
||
1474 | .SkipSymbol: |
||
1475 | pop ecx |
||
1476 | add edi,FontWidth |
||
1477 | dec ecx |
||
1478 | jnz .LW |
||
1479 | mov eax,[CurWidth] |
||
1480 | imul eax,(FontHeight-1)*FontWidth |
||
1481 | add edi,eax |
||
1482 | pop ecx |
||
1483 | dec ecx |
||
1484 | jnz .LH |
||
1485 | ; cursor |
||
1486 | mov eax,[CursorY] |
||
1487 | inc eax |
||
1488 | jz .NoCursor |
||
1489 | mul [CurWidth] |
||
1490 | imul eax,FontHeight*FontWidth |
||
1491 | mov edx,[CursorX] |
||
1492 | inc edx |
||
1493 | imul edx,FontWidth |
||
1494 | add eax,edx |
||
1495 | add eax,[MemForImage] |
||
1496 | mov edx,[CurWidth] |
||
1497 | imul edx,FontWidth |
||
1498 | neg edx |
||
1499 | mov ecx,[CursorSize] |
||
1500 | .CursorLoop: |
||
1501 | push ecx |
||
1502 | mov ecx,FontWidth |
||
1503 | add eax,edx |
||
1504 | push eax |
||
1505 | @@: |
||
1506 | xor byte [eax-1],7 |
||
1507 | sub eax,1 |
||
1508 | loop @B |
||
1509 | pop eax |
||
1510 | pop ecx |
||
1511 | loop .CursorLoop |
||
1512 | .NoCursor: |
||
1513 | cmp [MinY],-1 |
||
1514 | jz .NoDraw |
||
1515 | mov ecx,[CurWidth] |
||
1516 | mov ebx,[CurHeight] |
||
1517 | mov eax,ebx |
||
1518 | sub ebx,[MaxY] |
||
1519 | sub eax,[MinY] |
||
1520 | sub eax,ebx |
||
1521 | inc eax |
||
1522 | imul ebp,eax,FontHeight |
||
1523 | mov edx,ecx |
||
1524 | sub edx,[MaxX] |
||
1525 | imul edx,FontWidth |
||
1526 | mov eax,edx |
||
1527 | shl edx,16 |
||
1528 | imul dx,bx,FontHeight |
||
1529 | imul ebx,[CurWidth] |
||
1530 | mov ecx,[MaxX] |
||
1531 | sub ecx,[MinX] |
||
1532 | inc ecx |
||
1533 | imul ecx,FontWidth*10000h |
||
1534 | add ecx,ebp |
||
1535 | imul ebx,FontWidth*FontHeight |
||
1536 | add ebx,[MemForImage] |
||
1537 | add ebx,eax |
||
1538 | add edx,[SkinH] |
||
1539 | add edx,5*10000h |
||
1540 | imul esi,[CurWidth],FontWidth |
||
1541 | mov ebp,ecx |
||
1542 | shr ebp,16 |
||
1543 | sub esi,ebp |
||
1544 | mov ebp,esi |
||
1545 | push SF_PUT_IMAGE_EXT |
||
1546 | pop eax |
||
1547 | mov edi,ConsoleColors |
||
1548 | push 8 |
||
1549 | pop esi |
||
1550 | int 40h |
||
1551 | .NoDraw: |
||
1552 | pop ebp |
||
1553 | ret |
||
1554 | even 4 |
||
1555 | Redraw: |
||
1556 | mov al,SF_THREAD_INFO |
||
1557 | mov ebx,ProcInfo |
||
1558 | or ecx,-1 |
||
1559 | int 40h |
||
1560 | ; test if rolled up |
||
1561 | ; height of rolled up window is [skinh]+3 |
||
1562 | mov eax,[ebx+46] |
||
1563 | sub eax,[SkinH] |
||
1564 | cmp eax,5 |
||
1565 | ja @F |
||
1566 | mov al,SF_REDRAW |
||
1567 | push SSF_BEGIN_DRAW |
||
1568 | pop ebx |
||
1569 | int 0x40 |
||
1570 | xor eax,eax |
||
1571 | ; ebx, ecx, edi are ignored by function 0 after first redraw |
||
1572 | mov edx,0x53000000 |
||
1573 | int 0x40 |
||
1574 | mov al,SF_REDRAW |
||
1575 | inc ebx |
||
1576 | int 0x40 |
||
1577 | jmp WaitEvent |
||
1578 | @@: |
||
1579 | xor ecx,ecx |
||
1580 | mov eax,[ebx+42] |
||
1581 | mov [WndWidth],eax |
||
1582 | sub eax,5*2-1 |
||
1583 | jae @F |
||
1584 | xor eax,eax |
||
1585 | @@: |
||
1586 | cdq |
||
1587 | mov esi,FontWidth |
||
1588 | div esi |
||
1589 | cmp eax,MinWidth |
||
1590 | jae @F |
||
1591 | mov al,MinWidth |
||
1592 | mov ch,1 |
||
1593 | @@: |
||
1594 | cmp eax,MaxWidth |
||
1595 | jbe @F |
||
1596 | mov eax,MaxWidth |
||
1597 | mov ch,1 |
||
1598 | @@: |
||
1599 | cmp eax,[CurWidth] |
||
1600 | mov [CurWidth],eax |
||
1601 | setnz cl |
||
1602 | or cl,ch |
||
1603 | test edx,edx |
||
1604 | mov [FillWidth],edx |
||
1605 | setnz ch |
||
1606 | mov eax,[ebx+46] |
||
1607 | mov [WndHeight],eax |
||
1608 | sub eax,[SkinH] |
||
1609 | sub eax,5-1 |
||
1610 | jns @F |
||
1611 | xor eax,eax |
||
1612 | @@: |
||
1613 | cdq |
||
1614 | mov esi,FontHeight |
||
1615 | div esi |
||
1616 | cmp eax,MinHeight |
||
1617 | jae @F |
||
1618 | mov al,MinHeight |
||
1619 | mov cl,1 |
||
1620 | @@: |
||
1621 | cmp eax,MaxHeight |
||
1622 | jbe @F |
||
1623 | mov eax,MaxHeight |
||
1624 | mov cl,1 |
||
1625 | @@: |
||
1626 | mov [FillHeight],edx |
||
1627 | cmp eax,[CurHeight] |
||
1628 | mov [CurHeight],eax |
||
1629 | jnz .ReSize |
||
1630 | test cl,cl |
||
1631 | jnz .ReSize |
||
1632 | test edx,edx |
||
1633 | setnz cl |
||
1634 | or cl,ch |
||
1635 | jz @F |
||
1636 | test byte [ebx+70],1 |
||
1637 | jnz @F |
||
1638 | .ReSize: |
||
1639 | push SF_CHANGE_WINDOW |
||
1640 | pop eax |
||
1641 | or ebx,-1 |
||
1642 | or ecx,-1 |
||
1643 | mov edx,[CurWidth] |
||
1644 | imul edx,FontWidth |
||
1645 | add edx,5*2-1 |
||
1646 | mov esi,[CurHeight] |
||
1647 | imul esi,FontHeight |
||
1648 | add esi,[SkinH] |
||
1649 | add esi,5-1 |
||
1650 | int 40h |
||
1651 | .ReSizeDraw: |
||
1652 | mov ecx,[MemForImage] |
||
1653 | call PGFree |
||
1654 | and [MemForImage],0 |
||
1655 | call InitConsole |
||
1656 | call InitCoords |
||
1657 | jmp WaitEvent |
||
1658 | @@: mov [DoDraw],1 |
||
1659 | call DrawWindow |
||
1660 | jmp WaitEvent |
||
1661 | |||
1662 | even 4 |
||
1663 | Start: |
||
1664 | xor eax,eax |
||
1665 | mov edi,NeedZeroStart |
||
1666 | mov ecx,(NeedZeroEnd-NeedZeroStart+3)/4 |
||
1667 | rep stosd |
||
1668 | |||
1669 | call DetectCPU |
||
1670 | mov [CPUType],dl |
||
1671 | call DetectFPU |
||
1672 | mov [FPUType],al |
||
1673 | |||
1674 | cmp [CPUType],5 |
||
1675 | jb @F |
||
1676 | xor eax,eax |
||
1677 | cpuid |
||
1678 | mov edi,MsgXMMX+4 |
||
1679 | mov [edi+0],ebx |
||
1680 | mov [edi+4],edx |
||
1681 | mov [edi+8],ecx |
||
1682 | cmp eax,1 |
||
1683 | jl .L1 |
||
1684 | xor eax,eax |
||
1685 | inc eax |
||
1686 | cpuid |
||
1687 | xchg eax,edx |
||
1688 | jmp .L2 |
||
1689 | .L1: xor eax,eax |
||
1690 | .L2: test eax,00800000h ; CPU have MMX? |
||
1691 | setnz [MMXType] |
||
1692 | test eax,02000000h ; CPU have SSE? |
||
1693 | setnz [XMMType] |
||
1694 | @@: |
||
1695 | |||
1696 | push SF_SYS_MISC |
||
1697 | pop eax |
||
1698 | push SSF_HEAP_INIT |
||
1699 | pop ebx |
||
1700 | int 40h |
||
1701 | |||
1702 | call InitCmdHistBuffer |
||
1703 | call InitDefault |
||
1704 | |||
1705 | call InitCoords |
||
1706 | call ShowImage |
||
1707 | |||
1708 | ; set event mask - default events and debugging events |
||
1709 | mcall 40,EVM_REDRAW or EVM_KEY or EVM_BUTTON or EVM_DEBUG |
||
1710 | ; set debug messages buffer |
||
1711 | mov ecx,DbgBufSize |
||
1712 | mov dword [ecx],256 |
||
1713 | xor ebx,ebx |
||
1714 | mov [ecx+4],ebx |
||
1715 | mov al,69 |
||
1716 | mcall |
||
1717 | |||
1718 | call ShowImage |
||
1719 | |||
1720 | WaitEvent: |
||
1721 | push SF_WAIT_EVENT |
||
1722 | pop eax |
||
1723 | int 40h |
||
1724 | |||
1725 | cmp al,9 |
||
1726 | jz DebugMsg |
||
1727 | dec eax |
||
1728 | jz Redraw |
||
1729 | dec eax |
||
1730 | jz Key |
||
1731 | sub eax,4 |
||
1732 | jz Mouse |
||
1733 | ; button - we have only one button, close |
||
1734 | ;----------------------------------------------------------------------------- |
||
1735 | ; Quit event |
||
1736 | OnQuit: |
||
1737 | or eax,-1 |
||
1738 | int 40h |
||
1739 | Key: |
||
1740 | mov al,SF_KEYBOARD |
||
1741 | push SSF_GET_CONTROL_KEYS |
||
1742 | pop ebx |
||
1743 | int 0x40 |
||
1744 | and eax,0x3F |
||
1745 | mov [CtrlState],al |
||
1746 | |||
1747 | mov al,SF_GET_KEY |
||
1748 | int 40h |
||
1749 | test al,al |
||
1750 | jnz WaitEvent |
||
1751 | |||
1752 | shr eax,8 |
||
1753 | |||
1754 | cmp ah,5Dh |
||
1755 | ifz call DumpScreen |
||
1756 | |||
1757 | cmp [DebuggeePID],0 |
||
1758 | jz DoCommandLine |
||
1759 | cmp [CmdLineActive],0 |
||
1760 | jnz GetCommandLine |
||
1761 | |||
1762 | jmp WinSwitch |
||
1763 | |||
1764 | F7: cmp [DebuggeePID],0 |
||
1765 | jz .No |
||
1766 | call OnStep |
||
1767 | .No:jmp WaitEvent |
||
1768 | |||
1769 | F8: cmp [DebuggeePID],0 |
||
1770 | jz F7.No |
||
1771 | call OnProceed |
||
1772 | jmp F7.No |
||
1773 | |||
1774 | even 16 |
||
1775 | Mouse: |
||
1776 | if 0 |
||
1777 | mov eax,SF_MOUSE_GET |
||
1778 | mov ebx,SSF_BUTTON_EXT |
||
1779 | int 0x40 |
||
1780 | mov byte [MouseState],1 |
||
1781 | bt eax,24 ;left but. double click |
||
1782 | jc @F |
||
1783 | mov byte [MouseState],0 |
||
1784 | bt eax,8 ;left but. down |
||
1785 | jc @F |
||
1786 | jmp WaitEvent |
||
1787 | @@: |
||
1788 | mov eax,SF_MOUSE_GET |
||
1789 | mov ebx,SSF_WINDOW_POSITION |
||
1790 | int 0x40 |
||
1791 | end if |
||
1792 | jmp WaitEvent |
||
1793 | |||
1794 | DumpScreen: |
||
1795 | pushad |
||
1796 | mov dword [DumpName+4],'0000' |
||
1797 | .1: |
||
1798 | mov [DumpBlock.Func],SSF_GET_INFO |
||
1799 | mcall 70,DumpBlock |
||
1800 | or eax,eax |
||
1801 | jnz .2 |
||
1802 | inc byte [DumpName+7] |
||
1803 | cmp byte [DumpName+7],'9' |
||
1804 | jbe .1 |
||
1805 | mov byte [DumpName+7],'0' |
||
1806 | inc byte [DumpName+6] |
||
1807 | cmp byte [DumpName+6],'9' |
||
1808 | jbe .1 |
||
1809 | mov byte [DumpName+6],'0' |
||
1810 | popad |
||
1811 | ret |
||
1812 | .2: mov [DumpBlock.Func],SSF_CREATE_FILE |
||
1813 | mcall 70,DumpBlock |
||
1814 | or eax,eax |
||
1815 | jnz .Err |
||
1816 | mov ebx,[CurHeight] |
||
1817 | mov esi,ConsoleDataPtr |
||
1818 | mov edi,ConsoleDataOld |
||
1819 | .3: mov ecx,[CurWidth] |
||
1820 | .4: mov al,[rsi] |
||
1821 | test al,al |
||
1822 | jz .5 |
||
1823 | cmp al,0Ah |
||
1824 | jz .5 |
||
1825 | cmp al,0Dh |
||
1826 | jz .5 |
||
1827 | cmp al,10h |
||
1828 | jb .X |
||
1829 | jmp .6 |
||
1830 | .5: mov al,20h |
||
1831 | jmp .6 |
||
1832 | .X: mov al,'.' |
||
1833 | .6: mov [rdi],al |
||
1834 | add esi,2 |
||
1835 | inc edi |
||
1836 | loop .4 |
||
1837 | mov byte [rdi],13 |
||
1838 | inc edi |
||
1839 | dec ebx |
||
1840 | jnz .3 |
||
1841 | mov ecx,[CurWidth] |
||
1842 | inc ecx |
||
1843 | imul ecx,[CurHeight] |
||
1844 | mov [DumpBlock.Size],ecx |
||
1845 | mov [DumpBlock.Func],SSF_WRITE_FILE |
||
1846 | mcall 70,DumpBlock |
||
1847 | .Err: popad |
||
1848 | ret |
||
1849 | |||
1850 | AfterGoException: |
||
1851 | push eax |
||
1852 | mov eax,[TempBreak] |
||
1853 | dec eax |
||
1854 | push esi |
||
1855 | call EnableBreakPoint |
||
1856 | ; in any case, clear TF and RF |
||
1857 | call GetNewContext |
||
1858 | and [_EFL],not 10100h ; clear TF,RF |
||
1859 | call SetContext |
||
1860 | xor edx,edx |
||
1861 | mov [TempBreak],edx |
||
1862 | xchg dl,[bAfterGo] |
||
1863 | pop esi |
||
1864 | pop eax |
||
1865 | cmp dl,2 |
||
1866 | jnz @F |
||
1867 | lodsd |
||
1868 | push esi |
||
1869 | call GetDump |
||
1870 | jmp Exception.Done |
||
1871 | @@: |
||
1872 | test eax,eax |
||
1873 | jz .NotInt1 |
||
1874 | ; if exception is result of single step, simply ignore it and continue |
||
1875 | test dword [esi],0xF |
||
1876 | jnz DbgMsgStart.5 |
||
1877 | lodsd |
||
1878 | push esi |
||
1879 | mov esi,OldContext |
||
1880 | mov edi,Context |
||
1881 | mov ecx,28h/4 |
||
1882 | rep movsd |
||
1883 | call DoResume |
||
1884 | jmp DbgMsgEnd |
||
1885 | .NotInt1: |
||
1886 | ; in other case, work as without temp_break |
||
1887 | lodsd |
||
1888 | push esi |
||
1889 | push eax |
||
1890 | jmp Exception.4 |
||
1891 | |||
1892 | .NoTour: |
||
1893 | |||
1894 | DebugMsg: |
||
1895 | neg [DbgBufSize] |
||
1896 | mov esi,DbgBuf |
||
1897 | DbgMsgStart: |
||
1898 | lodsd |
||
1899 | add esi,4 |
||
1900 | dec eax |
||
1901 | jz Exception |
||
1902 | dec eax |
||
1903 | jz Terminated |
||
1904 | dec eax |
||
1905 | jnz DbgNotify |
||
1906 | |||
1907 | mov [bSuspended],1 |
||
1908 | cmp [bAfterGo],0 |
||
1909 | jnz AfterGoException |
||
1910 | push esi |
||
1911 | call GetNewContext |
||
1912 | and [_EFL],not 10100h ; clear TF,RF |
||
1913 | call SetContext |
||
1914 | pop esi |
||
1915 | .5: |
||
1916 | push esi |
||
1917 | call GetDump |
||
1918 | pop esi |
||
1919 | lodsd |
||
1920 | xor ecx,ecx |
||
1921 | .6: |
||
1922 | bt eax,ecx |
||
1923 | jnc .7 |
||
1924 | mov ebx,[DrXBreak+ecx*4] |
||
1925 | test ebx,ebx |
||
1926 | jz .7 |
||
1927 | pushad |
||
1928 | dec ebx |
||
1929 | push ebx |
||
1930 | mov esi,aBreakStop |
||
1931 | call PutMessageNoDraw |
||
1932 | popad |
||
1933 | .7: |
||
1934 | inc ecx |
||
1935 | cmp cl,4 |
||
1936 | jb .6 |
||
1937 | push esi |
||
1938 | jmp Exception.DoneDraw |
||
1939 | |||
1940 | DbgNotify: |
||
1941 | int3 |
||
1942 | add esi,32 |
||
1943 | push esi |
||
1944 | jmp DbgMsgEnd |
||
1945 | |||
1946 | Terminated: |
||
1947 | push esi |
||
1948 | mov esi,TerminatedMsg |
||
1949 | call PutMessage |
||
1950 | and [DebuggeePID],0 |
||
1951 | and [TempBreak],0 |
||
1952 | mov [bAfterGo],0 |
||
1953 | xor eax,eax |
||
1954 | mov ecx,BreakPointsN*6/4+4 |
||
1955 | mov edi,BreakPoints |
||
1956 | rep stosd |
||
1957 | cmp [bReload],1 |
||
1958 | sbb [bReload],-1 |
||
1959 | jnz Exception.Done |
||
1960 | call FreeSymbols |
||
1961 | jmp Exception.Done |
||
1962 | |||
1963 | Exception: |
||
1964 | mov [bSuspended],1 |
||
1965 | cmp [bAfterGo],0 |
||
1966 | jnz AfterGoException |
||
1967 | lodsd |
||
1968 | push esi |
||
1969 | push eax |
||
1970 | call GetNewContext |
||
1971 | and [_EFL],not 10100h ; clear TF,RF |
||
1972 | call SetContext |
||
1973 | .4: |
||
1974 | call GetDump |
||
1975 | pop eax |
||
1976 | ; int3 command generates exception 0x0D, #GP |
||
1977 | push eax |
||
1978 | cmp al,0x0D |
||
1979 | jnz .NotDbg |
||
1980 | ; check for 0xCC byte at eip |
||
1981 | push 0 |
||
1982 | mcall 69,6,[DebuggeePID],1,[_EIP],esp |
||
1983 | pop eax |
||
1984 | cmp al,0xCC |
||
1985 | je .Int3 |
||
1986 | ; check for 0xCD03 word at eip |
||
1987 | push 0 |
||
1988 | inc edx |
||
1989 | mcall 69;,6,[DebuggeePID],2,[_EIP],esp |
||
1990 | pop eax |
||
1991 | cmp ax,0x03CD |
||
1992 | jne .NotDbg |
||
1993 | mov eax,[_EIP] |
||
1994 | inc [_EIP] |
||
1995 | inc [_EIP] |
||
1996 | jmp .UserINT3 |
||
1997 | .Int3: |
||
1998 | ; this is either dbg breakpoint or int3 cmd in debuggee |
||
1999 | mov eax,[_EIP] |
||
2000 | call FindEnabledBreakPoint |
||
2001 | jnz .UserINT3 |
||
2002 | ; dbg breakpoint; clear if one-shot |
||
2003 | pop ecx |
||
2004 | push eax |
||
2005 | mov esi,aBreakStop |
||
2006 | test byte [edi+4],4 |
||
2007 | jz .PutMsgEAX |
||
2008 | pop ecx |
||
2009 | call ClearBreakPoint |
||
2010 | jmp .Done |
||
2011 | |||
2012 | .UserINT3: |
||
2013 | mov eax,[_EIP] |
||
2014 | inc [_EIP] |
||
2015 | .UserINT3_: |
||
2016 | pop ecx |
||
2017 | push eax |
||
2018 | call SetContext |
||
2019 | mov esi,aUserBreak |
||
2020 | jmp .PutMsgEAX |
||
2021 | |||
2022 | .NotDbg: |
||
2023 | pop eax |
||
2024 | push eax |
||
2025 | push eax |
||
2026 | mov esi,aException |
||
2027 | call PutMessageNoDraw |
||
2028 | pop eax |
||
2029 | |||
2030 | cmp al,16 |
||
2031 | ja .Suspended |
||
2032 | mov esi,[MsgFaultSel+eax*4] |
||
2033 | .ShowMess: |
||
2034 | call PutMessageNoDraw |
||
2035 | .Suspended: |
||
2036 | mov esi,aSuspended |
||
2037 | .PutMsgEAX: |
||
2038 | call PutMessageNoDraw |
||
2039 | .DoneDraw: |
||
2040 | call DrawMessages |
||
2041 | .Done: |
||
2042 | mcall 18,3,[DbgWnd] ; activate dbg window |
||
2043 | call ShowImage |
||
2044 | |||
2045 | DbgMsgEnd: |
||
2046 | pop esi |
||
2047 | mov ecx,[DbgBufLen] |
||
2048 | add ecx,DbgBuf |
||
2049 | cmp esi,ecx |
||
2050 | jnz DbgMsgStart |
||
2051 | and [DbgBufLen],0 |
||
2052 | neg [DbgBufSize] |
||
2053 | cmp [bReload],2 |
||
2054 | jnz @F |
||
2055 | mov [bReload],0 |
||
2056 | call DoReLoad |
||
2057 | @@: |
||
2058 | jmp WaitEvent |
||
2059 | |||
2060 | ;----------------------------------------------------------------------------- |
||
2061 | ; Add breakpoint |
||
2062 | ; in: EAX = address; BL = flags |
||
2063 | ; out: CF = 1 => error |
||
2064 | ; CF = 0 and EAX = breakpoint number |
||
2065 | AddBreakPoint: |
||
2066 | xor ecx,ecx |
||
2067 | mov edi,BreakPoints |
||
2068 | @@: |
||
2069 | test byte [edi+4],1 |
||
2070 | jz .Found |
||
2071 | add edi,6 |
||
2072 | inc ecx |
||
2073 | cmp ecx,BreakPointsN |
||
2074 | jb @B |
||
2075 | stc |
||
2076 | ret |
||
2077 | .Found: |
||
2078 | stosd |
||
2079 | xchg eax,ecx |
||
2080 | mov [edi],bl |
||
2081 | test bl,2 |
||
2082 | jnz @F |
||
2083 | or byte [edi],2 |
||
2084 | push eax |
||
2085 | call EnableBreakPoint |
||
2086 | pop eax |
||
2087 | @@: |
||
2088 | clc |
||
2089 | ret |
||
2090 | ;----------------------------------------------------------------------------- |
||
2091 | ; Remove breakpoint |
||
2092 | ClearBreakPoint: |
||
2093 | cmp eax,BreakPointsN |
||
2094 | jae .Ret |
||
2095 | mov ecx,4 |
||
2096 | inc eax |
||
2097 | .1: |
||
2098 | cmp [DrXBreak-4+ecx*4],eax |
||
2099 | jnz @F |
||
2100 | and [DrXBreak-4+ecx*4],0 |
||
2101 | @@: |
||
2102 | loop .1 |
||
2103 | dec eax |
||
2104 | push eax |
||
2105 | add eax,eax |
||
2106 | lea edi,[BreakPoints+eax+eax*2+4] |
||
2107 | test byte [edi],1 |
||
2108 | pop eax |
||
2109 | jz .Ret |
||
2110 | push edi |
||
2111 | call DisableBreakPoint |
||
2112 | pop edi |
||
2113 | mov byte [edi],0 |
||
2114 | .Ret: |
||
2115 | ret |
||
2116 | ;----------------------------------------------------------------------------- |
||
2117 | ; Disable breakpoint |
||
2118 | DisableBreakPoint: |
||
2119 | cmp eax,BreakPointsN |
||
2120 | jae .Ret |
||
2121 | add eax,eax |
||
2122 | lea edi,[BreakPoints+eax+eax*2+5] |
||
2123 | test byte [edi-1],1 |
||
2124 | jz .Ret |
||
2125 | test byte [edi-1],2 |
||
2126 | jnz .Ret |
||
2127 | or byte [edi-1],2 |
||
2128 | test byte [edi-1],8 |
||
2129 | jnz .DR |
||
2130 | push esi |
||
2131 | mcall 69,7,[DebuggeePID],1,[edi-5] |
||
2132 | pop esi |
||
2133 | .Ret: |
||
2134 | ret |
||
2135 | .DR: |
||
2136 | mov dl,[edi] |
||
2137 | shr dl,6 |
||
2138 | mov dh,80h |
||
2139 | mcall 69,9,[DebuggeePID] |
||
2140 | ret |
||
2141 | ;----------------------------------------------------------------------------- |
||
2142 | ; Enable breakpoint |
||
2143 | EnableBreakPoint: |
||
2144 | push esi |
||
2145 | cmp eax,BreakPointsN |
||
2146 | jae .Ret |
||
2147 | add eax,eax |
||
2148 | lea edi,[BreakPoints+eax+eax*2+5] |
||
2149 | test byte [edi-1],1 |
||
2150 | jz .Ret |
||
2151 | test byte [edi-1],2 |
||
2152 | jz .Ret |
||
2153 | and byte [edi-1],not 2 |
||
2154 | test byte [edi-1],8 |
||
2155 | jnz .DR |
||
2156 | mcall 69,6,[DebuggeePID],1,[edi-5] |
||
2157 | dec eax |
||
2158 | jnz .Err |
||
2159 | push 0xCC |
||
2160 | mov edi,esp |
||
2161 | inc ebx |
||
2162 | mcall 69 |
||
2163 | pop eax |
||
2164 | .Ret: |
||
2165 | pop esi |
||
2166 | ret |
||
2167 | .Err: |
||
2168 | or byte [edi-1],2 |
||
2169 | mov esi,aBreakErr |
||
2170 | call PutMessage |
||
2171 | pop esi |
||
2172 | ret |
||
2173 | .DR: |
||
2174 | mov esi,[edi-5] |
||
2175 | mov dl,[edi] |
||
2176 | shr dl,6 |
||
2177 | mov dh,[edi] |
||
2178 | and dh,0xF |
||
2179 | mcall 69,9,[DebuggeePID] |
||
2180 | test eax,eax |
||
2181 | jnz .Err |
||
2182 | pop esi |
||
2183 | ret |
||
2184 | ;----------------------------------------------------------------------------- |
||
2185 | ; Find breakpoint |
||
2186 | FindBreakPoint: |
||
2187 | xor ecx,ecx |
||
2188 | xchg eax,ecx |
||
2189 | mov edi,BreakPoints |
||
2190 | @@: |
||
2191 | test byte [edi+4],1 |
||
2192 | jz .Cont |
||
2193 | test byte [edi+4],8 |
||
2194 | jnz .Cont |
||
2195 | cmp [edi],ecx |
||
2196 | jz .Found |
||
2197 | .Cont: |
||
2198 | add edi,6 |
||
2199 | inc eax |
||
2200 | cmp eax,BreakPointsN |
||
2201 | jb @B |
||
2202 | or eax,-1 |
||
2203 | .Found: |
||
2204 | ret |
||
2205 | ;----------------------------------------------------------------------------- |
||
2206 | ; |
||
2207 | FindEnabledBreakPoint: |
||
2208 | xor ecx,ecx |
||
2209 | xchg eax,ecx |
||
2210 | mov edi,BreakPoints |
||
2211 | @@: |
||
2212 | test byte [edi+4],1 |
||
2213 | jz .Cont |
||
2214 | test byte [edi+4],2 or 8 |
||
2215 | jnz .Cont |
||
2216 | cmp [edi],ecx |
||
2217 | jz .Found |
||
2218 | .Cont: |
||
2219 | add edi,6 |
||
2220 | inc eax |
||
2221 | cmp eax,BreakPointsN |
||
2222 | jb @B |
||
2223 | or eax,-1 |
||
2224 | .Found: |
||
2225 | ret |
||
2226 | |||
2227 | GetDump: |
||
2228 | if 0 |
||
2229 | mov edi,DumpData |
||
2230 | mov esi,[edi-4] |
||
2231 | mov edx,DUMP_HEIGHT*10h |
||
2232 | mov ecx,edx |
||
2233 | xor eax,eax |
||
2234 | push edi |
||
2235 | rep stosb |
||
2236 | pop edi |
||
2237 | mcall 69,6,[DebuggeePID] |
||
2238 | cmp eax,-1 |
||
2239 | jnz @F |
||
2240 | mov esi,ReadMemErr |
||
2241 | call PutMessage |
||
2242 | xor eax,eax |
||
2243 | @@: |
||
2244 | mov [edi-8],eax |
||
2245 | ; in: edi=buffer,eax=size,esi=address |
||
2246 | RestoreFromBreaks: |
||
2247 | mov ebx,BreakPoints |
||
2248 | @@: |
||
2249 | test byte [ebx+4],1 |
||
2250 | jz .Cont ; ignore invalid |
||
2251 | test byte [ebx+4],2 or 8 |
||
2252 | jnz .Cont ; ignore disabled and memory breaks |
||
2253 | mov ecx,[ebx] |
||
2254 | sub ecx,esi |
||
2255 | cmp ecx,eax |
||
2256 | jae .Cont |
||
2257 | mov dl,[ebx+5] |
||
2258 | mov [edi+ecx],dl |
||
2259 | .Cont: |
||
2260 | add ebx,6 |
||
2261 | cmp ebx,BreakPoints+BreakPointsN*6 |
||
2262 | jb @B |
||
2263 | end if |
||
2264 | ret |
||
2265 | |||
2266 | ; in: edi=buffer,esi=address |
||
2267 | RestoreFromBreaksOne: |
||
2268 | mov ebx,BreakPoints |
||
2269 | @@: |
||
2270 | test byte [ebx+4],1 |
||
2271 | jz .Cont ; ignore invalid |
||
2272 | test byte [ebx+4],2 or 8 |
||
2273 | jnz .Cont ; ignore disabled and memory breaks |
||
2274 | mov ecx,[ebx] |
||
2275 | sub ecx,esi |
||
2276 | cmp ecx,1 |
||
2277 | jae .Cont |
||
2278 | mov dl,[ebx+5] |
||
2279 | mov [edi+ecx],dl |
||
2280 | jmp .Exit |
||
2281 | .Cont: |
||
2282 | add ebx,6 |
||
2283 | cmp ebx,BreakPoints+BreakPointsN*6 |
||
2284 | jb @B |
||
2285 | .Exit: |
||
2286 | ret |
||
2287 | |||
2288 | GetCommandLine: |
||
2289 | cmp ah,0x01 |
||
2290 | jz .Esc |
||
2291 | cmp al,8 |
||
2292 | jz .Backspace |
||
2293 | cmp al,0xB0 |
||
2294 | jz .Left |
||
2295 | cmp al,0xB3 |
||
2296 | jz .Right |
||
2297 | cmp al,0x0D |
||
2298 | jz .Enter |
||
2299 | cmp al,0xB6 |
||
2300 | jz .Del |
||
2301 | cmp al,0xB4 |
||
2302 | jz .Home |
||
2303 | cmp al,0xB5 |
||
2304 | jz .End |
||
2305 | cmp al,0xB1 |
||
2306 | jz .Dn |
||
2307 | cmp al,0xB2 |
||
2308 | jz .Up |
||
2309 | mov [CmdHistBuffer.TmpLineFlag],0 |
||
2310 | cmp [CmdLineLen],CMD_WIDTH |
||
2311 | jae WaitEvent |
||
2312 | push eax |
||
2313 | call ClearCmdLineEnd |
||
2314 | pop eax |
||
2315 | mov edi,CmdLine |
||
2316 | mov ecx,[CmdLineLen] |
||
2317 | add edi,ecx |
||
2318 | lea esi,[edi-1] |
||
2319 | sub ecx,[CmdLinePos] |
||
2320 | std |
||
2321 | rep movsb |
||
2322 | cld |
||
2323 | stosb |
||
2324 | inc [CmdLineLen] |
||
2325 | call DrawCmdLineEnd |
||
2326 | inc [CmdLinePos] |
||
2327 | call DrawCursor |
||
2328 | jmp WaitEvent |
||
2329 | |||
2330 | |||
2331 | .Esc: |
||
2332 | xor eax,eax |
||
2333 | mov [CmdLinePos],eax |
||
2334 | mov [CmdLineLen],eax |
||
2335 | mov [CmdLineActive],al |
||
2336 | call DrawCursor |
||
2337 | jmp WaitEvent |
||
2338 | |||
2339 | .Backspace: |
||
2340 | mov [CmdHistBuffer.TmpLineFlag],0 |
||
2341 | cmp [CmdLinePos],0 |
||
2342 | jz WaitEvent |
||
2343 | dec [CmdLinePos] |
||
2344 | |||
2345 | .DelChar: |
||
2346 | mov [CmdHistBuffer.TmpLineFlag],0 |
||
2347 | call ClearCmdLineEnd |
||
2348 | mov edi,[CmdLinePos] |
||
2349 | dec [CmdLineLen] |
||
2350 | mov ecx,[CmdLineLen] |
||
2351 | sub ecx,edi |
||
2352 | add edi,CmdLine |
||
2353 | lea esi,[edi+1] |
||
2354 | rep movsb |
||
2355 | call DrawCmdLineEnd |
||
2356 | call DrawCursor |
||
2357 | jmp WaitEvent |
||
2358 | |||
2359 | .Del: |
||
2360 | mov eax,[CmdLinePos] |
||
2361 | cmp eax,[CmdLineLen] |
||
2362 | jae WaitEvent |
||
2363 | jmp .DelChar |
||
2364 | |||
2365 | .Left: |
||
2366 | cmp [CmdLinePos],0 |
||
2367 | jz WaitEvent |
||
2368 | call HideCursor |
||
2369 | dec [CmdLinePos] |
||
2370 | call DrawCursor |
||
2371 | jmp WaitEvent |
||
2372 | |||
2373 | .Right: |
||
2374 | mov eax,[CmdLinePos] |
||
2375 | cmp eax,[CmdLineLen] |
||
2376 | jae WaitEvent |
||
2377 | call HideCursor |
||
2378 | inc [CmdLinePos] |
||
2379 | call DrawCursor |
||
2380 | jmp WaitEvent |
||
2381 | |||
2382 | .Home: |
||
2383 | call HideCursor |
||
2384 | and [CmdLinePos],0 |
||
2385 | call DrawCursor |
||
2386 | jmp WaitEvent |
||
2387 | |||
2388 | .End: |
||
2389 | call HideCursor |
||
2390 | mov eax,[CmdLineLen] |
||
2391 | mov [CmdLinePos],eax |
||
2392 | call DrawCursor |
||
2393 | jmp WaitEvent |
||
2394 | |||
2395 | .Up: |
||
2396 | xor edx,edx |
||
2397 | jmp .Hist |
||
2398 | .Dn: |
||
2399 | xor edx,edx |
||
2400 | inc edx |
||
2401 | .Hist: |
||
2402 | cmp [CmdHistBuffer.TmpLineFlag],1 |
||
2403 | je @F |
||
2404 | mov eax,CmdLine |
||
2405 | mov ecx,[CmdLineLen] |
||
2406 | mov byte [eax+ecx],0 |
||
2407 | call AddCmdHistTmpLine |
||
2408 | @@: |
||
2409 | test edx,edx |
||
2410 | jnz .Hist.Next |
||
2411 | cmp [CmdHistBuffer.NFlag],0 |
||
2412 | jne @F |
||
2413 | call GetCmdHistLine |
||
2414 | inc [CmdHistBuffer.NFlag] |
||
2415 | jmp .Hist.CPLine |
||
2416 | |||
2417 | @@: |
||
2418 | call PrevCmdHistLine |
||
2419 | jc WaitEvent |
||
2420 | call GetCmdHistLine |
||
2421 | inc [CmdHistBuffer.NFlag] |
||
2422 | jmp .Hist.CPLine |
||
2423 | |||
2424 | .Hist.Next: |
||
2425 | cmp [CmdHistBuffer.NFlag],0 |
||
2426 | je WaitEvent |
||
2427 | |||
2428 | call NextCmdHistLine |
||
2429 | call GetCmdHistLine |
||
2430 | jnc .Hist.CPLine |
||
2431 | call GetCmdHistTmpLine |
||
2432 | mov [CmdHistBuffer.TmpLineFlag],0 |
||
2433 | mov [CmdHistBuffer.NFlag],0 |
||
2434 | |||
2435 | .Hist.CPLine: |
||
2436 | |||
2437 | mov esi,eax |
||
2438 | mov edi,CmdLine |
||
2439 | xor ecx,ecx |
||
2440 | @@: |
||
2441 | inc ecx |
||
2442 | lodsb |
||
2443 | stosb |
||
2444 | test al,al |
||
2445 | jnz @B |
||
2446 | |||
2447 | dec ecx |
||
2448 | mov [CmdLinePos],0 |
||
2449 | call ClearCmdLineEnd |
||
2450 | mov [CmdLineLen],ecx |
||
2451 | mov [CmdLinePos],ecx |
||
2452 | call DrawCmdLine |
||
2453 | call DrawCursor |
||
2454 | |||
2455 | jmp WaitEvent |
||
2456 | |||
2457 | ; We also trying to execute previous command, if empty command_line |
||
2458 | .Enter: |
||
2459 | mov [CmdLineActive],0 |
||
2460 | |||
2461 | mov ecx,[CmdLineLen] |
||
2462 | test ecx,ecx |
||
2463 | jnz .ExecCur |
||
2464 | mov cl,byte [CmdLinePrev] |
||
2465 | cmp cl,0 |
||
2466 | jz WaitEvent |
||
2467 | |||
2468 | .ExecPrev: |
||
2469 | mov esi,CmdLinePrev |
||
2470 | jmp .Exec |
||
2471 | |||
2472 | .ExecCur: |
||
2473 | mov esi,CmdLine |
||
2474 | |||
2475 | .Exec: |
||
2476 | mov byte [esi+ecx],0 |
||
2477 | |||
2478 | mov eax,esi |
||
2479 | call AddCmdHistLine |
||
2480 | mov [CmdHistBuffer.NFlag],0 |
||
2481 | |||
2482 | and [CmdLinePos],0 |
||
2483 | push esi |
||
2484 | call ClearCmdLineEnd |
||
2485 | call DrawCursor |
||
2486 | pop esi |
||
2487 | and [CmdLineLen],0 |
||
2488 | ; skip leading spaces |
||
2489 | call GetArg.SkipSpaces |
||
2490 | cmp al,0 |
||
2491 | jz WaitEvent |
||
2492 | ; now esi points to command |
||
2493 | push esi |
||
2494 | mov esi,Prompt |
||
2495 | call PutMessageNoDraw |
||
2496 | pop esi |
||
2497 | push esi |
||
2498 | call PutMessageNoDraw |
||
2499 | Z1: |
||
2500 | mov esi,NewLine |
||
2501 | call PutMessage |
||
2502 | pop esi |
||
2503 | push esi |
||
2504 | call GetArg |
||
2505 | mov [CurArg],esi |
||
2506 | pop edi |
||
2507 | mov esi,Commands |
||
2508 | call FindCmd |
||
2509 | mov eax,aUnknownCommand |
||
2510 | jc .X11 |
||
2511 | |||
2512 | ; check command requirements |
||
2513 | ; flags field: |
||
2514 | ; &1: command may be called without parameters |
||
2515 | ; &2: command may be called with parameters |
||
2516 | ; &4: command may be called without loaded program |
||
2517 | ; &8: command may be called with loaded program |
||
2518 | mov eax,[esi+8] |
||
2519 | mov ecx,[CurArg] |
||
2520 | cmp byte [ecx],0 |
||
2521 | jz .NoArgs |
||
2522 | test byte [esi+16],2 |
||
2523 | jz .X11 |
||
2524 | jmp @F |
||
2525 | |||
2526 | .NoArgs: |
||
2527 | test byte [esi+16],1 |
||
2528 | jz .X11 |
||
2529 | @@: |
||
2530 | cmp [DebuggeePID],0 |
||
2531 | jz .NoDebuggee |
||
2532 | mov eax,aAlreadyLoaded |
||
2533 | test byte [esi+16],8 |
||
2534 | jz .X11 |
||
2535 | jmp .X9 |
||
2536 | |||
2537 | .NoDebuggee: |
||
2538 | mov eax,NeedDebuggee |
||
2539 | test byte [esi+16],4 |
||
2540 | jnz .X9 |
||
2541 | .X11: |
||
2542 | xchg esi,eax |
||
2543 | call PutMessage |
||
2544 | ; store cmdline for repeating |
||
2545 | .X10: |
||
2546 | mov esi,CmdLine |
||
2547 | mov ecx,[CmdLineLen] |
||
2548 | @@: |
||
2549 | or ecx,ecx |
||
2550 | jle .We |
||
2551 | mov al,[esi+ecx] |
||
2552 | mov [CmdLinePrev+ecx],al |
||
2553 | dec ecx |
||
2554 | jmp @B |
||
2555 | |||
2556 | .We: |
||
2557 | mov [CmdLineLen],0 |
||
2558 | jmp WaitEvent |
||
2559 | |||
2560 | .X9: |
||
2561 | call dword [esi+4] |
||
2562 | jmp .X10 |
||
2563 | |||
2564 | PutMessage: |
||
2565 | call PutMessageNoDraw |
||
2566 | DrawMessages: |
||
2567 | mov [AfterKey],1 |
||
2568 | call ShowImage |
||
2569 | ret |
||
2570 | |||
2571 | include "cmdhist.inc" |
||
2572 | include "parser.inc" |
||
2573 | include "message.inc" |
||
2574 | |||
2575 | HeaderN db 'SunSys Debugger ver ',VERSION,' - No program loaded',0 |
||
2576 | HeaderY db 'SunSys Debugger ver ',VERSION,' - ',60 dup 32,0 |
||
2577 | HeaderE: |
||
2578 | ; |
||
2579 | LoadErrMsg db 'Cannot load program. ',0 |
||
2580 | UnkErrMsg db 'Unknown error code -%4X',10,0 |
||
2581 | aCannotLoadFile db 'Cannot load file. ',0 |
||
2582 | UnkErrMsg2 db 'Unknown error code %4X.',10,0 |
||
2583 | LoadErrMsgs: |
||
2584 | dd .1,0,.3,0,.5,.6,0,0,.9,.A,0,0,0,0,0,0 |
||
2585 | dd 0,0,0,0,0,0,0,0,0,0,0,0,0,.1E,.1F,.20 |
||
2586 | .1 db 'HD undefined.',10,0 |
||
2587 | .3 db 'Unknown FS.',10,0 |
||
2588 | .5 db 'File not found.',10,0 |
||
2589 | .6 db 'Unexpected EOF.',10,0 |
||
2590 | .9 db 'FAT table corrupted.',10,0 |
||
2591 | .A db 'Access denied.',10,0 |
||
2592 | .1E db 'No memory.',10,0 |
||
2593 | .1F db 'Not Menuet/Kolibri executable.',10,0 |
||
2594 | .20 db 'Too many processes.',10,0 |
||
2595 | LoadSuccMsg db 'Program loaded successfully! PID=%4X. Use "g" to run.',10,0 |
||
2596 | TerminatedMsg db 'Program terminated.',10,0 |
||
2597 | MsgFaultSel dd aDivide,aDebug,aNonMask,aUndefined,aOverflow |
||
2598 | dd aBounds,aInvalid,aCoProcessorNA,aDoubleFault |
||
2599 | dd aUndefined,aInvalidTSS,aSegment,aStack |
||
2600 | dd aProtection,aPageFault,aUndefined,aCoProcessor |
||
2601 | aDivide db '(Divide error)',10,0 |
||
2602 | aDebug db '(Single-step/debug exception)',10,0 |
||
2603 | aNonMask db '(Nonmaskable interrupt)',10,0 |
||
2604 | aOverflow db '(Overflow)',10,0 |
||
2605 | aBounds db '(Bounds check)',10,0 |
||
2606 | aInvalid db '(Invalid opcode)',10,0 |
||
2607 | aCoProcessorNA db '(Coprocessor not available)',10,0 |
||
2608 | aDoubleFault db '(Double fault)',10,0 |
||
2609 | aUndefined db '(Undefined fault)',10,0 |
||
2610 | aInvalidTSS db '(Invalid TSS)',10,0 |
||
2611 | aSegment db '(Segment not present)',10,0 |
||
2612 | aStack db '(Stack fault)',10,0 |
||
2613 | aProtection db '(General protection fault)',10,0 |
||
2614 | aPageFault db '(Page fault)',10,0 |
||
2615 | aCoProcessor db '(Coprocessor error)',10,0 |
||
2616 | aSuspended db 'Suspended',10,0 |
||
2617 | aContinued db 'Continuing',10,0 |
||
2618 | aRunningErr db 'Program is running',10,0 |
||
2619 | aException db 'Debugged program caused an exception %2X. ',0 |
||
2620 | aBreakErr db 'Cannot activate breakpoint, it will be disabled',10,0 |
||
2621 | aDuplicateBreakpoint db 'Duplicate breakpoint',10,0 |
||
2622 | aInvalidBreak db 'Invalid breakpoint number',10,0 |
||
2623 | aBreakNum db '%2X: at %8X',0 |
||
2624 | aMemBreak1 db '%2X: on ',0 |
||
2625 | aMemBreak2 db 'read from ',0 |
||
2626 | aMemBreak3 db 'access of ',0 |
||
2627 | aMemBreak4 db 'byte',0 |
||
2628 | aMemBreak5 db 'word',0 |
||
2629 | aMemBreak6 db 'dword',0 |
||
2630 | aMemBreak7 db ' at %8X',0 |
||
2631 | aOneShot db ', one-shot',0 |
||
2632 | aDisabled db ', disabled',0 |
||
2633 | aBreakStop db 'Breakpoint #%2X',10,0 |
||
2634 | aUserBreak db 'int3 command at %8X',10,0 |
||
2635 | ReadMemErr db 'ERROR: cannot read process memory!!!',10,0 |
||
2636 | aBreakpointLimitExceeded db 'Breakpoint limit exceeded',10,0 |
||
2637 | aUnknownCommand db 'Unknown command',10,0 |
||
2638 | NeedDebuggee db 'No program loaded. Use "load" command.',10,0 |
||
2639 | aAlreadyLoaded db 'Program is already loaded. Use "terminate" or "detach" commands',10,0 |
||
2640 | aParseError db 'Parse error',10,0 |
||
2641 | aDivByZero db 'Division by 0',10,0 |
||
2642 | CalcString db '%8X',10,0 |
||
2643 | aNoMemory db 'No memory',10,0 |
||
2644 | aSymbolsLoaded db 'Symbols loaded',10,0 |
||
2645 | aUnaligned db 'Unaligned address',10,0 |
||
2646 | aEnabledBreakErr db 'Enabled breakpoints are not allowed',10,0 |
||
2647 | aInterrupted db 'Interrupted',10,0 |
||
2648 | aUnpacked db 'Unpacked successful!',10,0 |
||
2649 | OnBeErrMsg db 'There is already enabled breakpoint on this address',10,0 |
||
2650 | |||
2651 | DumpPath db '/TMP0/1/' |
||
2652 | DumpName db 'DUMP0000.TXT',0 |
||
2653 | |||
2654 | even 4 |
||
2655 | ConsoleColors dd 0x000000,0x000080,0x008000,0x008080 |
||
2656 | dd 0x800000,0x800080,0x808000,0xC0C0C0 |
||
2657 | dd 0x1D272F,0x0000FF,0x00FF00,0x00FFFF;0x808080,0x0000FF,0x00FF00,0x00FFFF |
||
2658 | dd 0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF |
||
2659 | |||
2660 | CurWidth dd MinWidth |
||
2661 | CurHeight dd MinHeight |
||
2662 | FillWidth dd 0 |
||
2663 | FillHeight dd 0 |
||
2664 | |||
2665 | MemForImage dd 0 |
||
2666 | |||
2667 | bWasE0 db 0 |
||
2668 | CtrlState db 0 |
||
2669 | MouseState db 0 |
||
2670 | bMemForImageValidData db 0 |
||
2671 | |||
2672 | bReload db 0 |
||
2673 | bAfterGo db 0 |
||
2674 | bSuspended db 0 |
||
2675 | CodeType db 32 |
||
2676 | |||
2677 | DoDraw db 0 |
||
2678 | SymbolSection db 0 |
||
2679 | CmdLineActive db 0,? |
||
2680 | |||
2681 | CursorX dd -1 |
||
2682 | CursorY dd -1 |
||
2683 | CursorSize dd CursorNormSize |
||
2684 | CurCursorPos dd -1 |
||
2685 | OldCursorPos dd -1 |
||
2686 | |||
2687 | DebuggeePID dd 0 |
||
2688 | |||
2689 | DumpBlock: |
||
2690 | .Func dd 0 |
||
2691 | dd 0 |
||
2692 | dd 0 |
||
2693 | .Size dd 0 |
||
2694 | dd ConsoleDataOld |
||
2695 | db 0 |
||
2696 | dd DumpPath |
||
2697 | |||
2698 | FN70LoadBlock: dd 7 |
||
2699 | dd 1 |
||
2700 | LoadParams dd 0 |
||
2701 | dd 0 |
||
2702 | dd 0 |
||
2703 | LoadName: db 0 |
||
2704 | rb 255 |
||
2705 | |||
2706 | FN70ReadBlock: dd 0 |
||
2707 | rq 1 |
||
2708 | dd ? |
||
2709 | dd ? |
||
2710 | db 0 |
||
2711 | dd ? |
||
2712 | |||
2713 | FN70AttrBlock: dd 5 |
||
2714 | dd 0,0,0 |
||
2715 | dd FileAttr |
||
2716 | db 0 |
||
2717 | dd ? |
||
2718 | |||
2719 | IncludeAllGlobals |
||
2720 | |||
2721 | DbgWnd dd ? |
||
2722 | TempBreak dd ? |
||
2723 | |||
2724 | WndWidth dd ? |
||
2725 | WndHeight dd ? |
||
2726 | |||
2727 | MinY dd ? |
||
2728 | MaxY dd ? |
||
2729 | MinX dd ? |
||
2730 | MaxX dd ? |
||
2731 | |||
2732 | Tmp dd ? |
||
2733 | SkinH dd ? |
||
2734 | StdColors rd 10 |
||
2735 | |||
2736 | AppPath rb 4096 |
||
2737 | ProcInfo rb 1024 |
||
2738 | |||
2739 | even 16 |
||
2740 | ConsoleDataPtr rw (MaxWidth+0)*MaxHeight |
||
2741 | even 16 |
||
2742 | ConsoleDataOld rw (MaxWidth+1)*MaxHeight |
||
2743 | |||
2744 | even 16 |
||
2745 | NeedZeroStart: |
||
2746 | |||
2747 | DbgBufSize dd ? |
||
2748 | DbgBufLen dd ? |
||
2749 | DbgBuf rb 256 |
||
2750 | |||
2751 | FileAttr rb 40 |
||
2752 | |||
2753 | even 4 |
||
2754 | Context: |
||
2755 | _EIP dd ? |
||
2756 | _EFL dd ? |
||
2757 | _EAX dd ? |
||
2758 | _ECX dd ? |
||
2759 | _EDX dd ? |
||
2760 | _EBX dd ? |
||
2761 | _ESP dd ? |
||
2762 | _EBP dd ? |
||
2763 | _ESI dd ? |
||
2764 | _EDI dd ? |
||
2765 | |||
2766 | _CTX_FLAGS: |
||
2767 | dd ? |
||
2768 | dd ? |
||
2769 | |||
2770 | _SSE_FLAGS: |
||
2771 | |||
2772 | _FCW dw ? |
||
2773 | _FSW dw ? |
||
2774 | _FTW db ? |
||
2775 | db ? |
||
2776 | _FOP dw ? |
||
2777 | _FPU_IP dd ? |
||
2778 | dw ? |
||
2779 | dw ? |
||
2780 | |||
2781 | _FPU_DP dd ? |
||
2782 | dw ? |
||
2783 | dw ? |
||
2784 | |||
2785 | _MXCSR dd ? |
||
2786 | _MXCSRM dd ? |
||
2787 | |||
2788 | FPU_CONTEXT: |
||
2789 | MMX_CONTEXT: |
||
2790 | _ST0: |
||
2791 | _MM0: rq 2 |
||
2792 | _ST1: |
||
2793 | _MM1: rq 2 |
||
2794 | _ST2: |
||
2795 | _MM2: rq 2 |
||
2796 | _ST3: |
||
2797 | _MM3: rq 2 |
||
2798 | _ST4: |
||
2799 | _MM4: rq 2 |
||
2800 | _ST5: |
||
2801 | _MM5: rq 2 |
||
2802 | _ST6: |
||
2803 | _MM6: rq 2 |
||
2804 | _ST7: |
||
2805 | _MM7: rq 2 |
||
2806 | |||
2807 | SSE_CONTEXT: |
||
2808 | _XMM0 rq 2 |
||
2809 | _XMM1 rq 2 |
||
2810 | _XMM2 rq 2 |
||
2811 | _XMM3 rq 2 |
||
2812 | _XMM4 rq 2 |
||
2813 | _XMM5 rq 2 |
||
2814 | _XMM6 rq 2 |
||
2815 | _XMM7 rq 2 |
||
2816 | CtxEnd: |
||
2817 | |||
2818 | OldContext rb (CtxEnd-Context) |
||
2819 | |||
2820 | Plus = (OldContext-Context) |
||
2821 | |||
2822 | StepNum dd ? |
||
2823 | ProcNum dd ? |
||
2824 | if 0 |
||
2825 | DUMP_HEIGHT = 6 ; in text lines |
||
2826 | ; |
||
2827 | DumpRead dd ? |
||
2828 | DumpPos dd ? |
||
2829 | DumpData rb DUMP_HEIGHT*10h |
||
2830 | end if |
||
2831 | |||
2832 | CmdLine rb CMD_WIDTH+1 |
||
2833 | CmdLineLen dd ? |
||
2834 | CmdLinePos dd ? |
||
2835 | CurArg dd ? |
||
2836 | |||
2837 | CmdLinePrev rb CMD_WIDTH+1 |
||
2838 | |||
2839 | SymbolsFile rb 260 |
||
2840 | |||
2841 | PrgNamePtr dd ? |
||
2842 | PrgNameLen dd ? |
||
2843 | |||
2844 | Symbols dd ? |
||
2845 | NumSymbols dd ? |
||
2846 | |||
2847 | CmdHistBuffer: |
||
2848 | .Ptr dd ? |
||
2849 | .Size dd ? |
||
2850 | .LastNodeOffset dd ? |
||
2851 | .NewNodeOffset dd ? |
||
2852 | .CurNodeOffset dd ? |
||
2853 | .TmpLineFlag db ? |
||
2854 | .NFlag db ? |
||
2855 | |||
2856 | ; breakpoint structure: |
||
2857 | ; dword +0: address |
||
2858 | ; byte +4: flags |
||
2859 | ; bit 0: 1 <=> breakpoint valid |
||
2860 | ; bit 1: 1 <=> breakpoint disabled |
||
2861 | ; bit 2: 1 <=> one-shot breakpoint |
||
2862 | ; bit 3: 1 <=> DRx breakpoint |
||
2863 | ; byte +5: overwritten byte |
||
2864 | ; for DRx breaks: flags + (index shl 6) |
||
2865 | BreakPointsN = 256 |
||
2866 | BreakPoints rb BreakPointsN*6 |
||
2867 | DrXBreak rd 4 |
||
2868 | ;----------------------------------------------------------------------------- |
||
2869 | CurrentWindow dd ? |
||
2870 | CPUXPos dd ? ; coordinates of cursor in windows |
||
2871 | CPUYPos dd ? |
||
2872 | CPUXPtr dd ? |
||
2873 | MemXPos dd ? |
||
2874 | MemYPos dd ? |
||
2875 | StkXPos dd ? |
||
2876 | StkYPos dd ? |
||
2877 | RegXPos dd ? |
||
2878 | RegYPos dd ? |
||
2879 | RegLDat dd ? |
||
2880 | RegXPtr dd ? |
||
2881 | CPUType db ? |
||
2882 | FPUType db ? |
||
2883 | MMXType db ? |
||
2884 | XMMType db ? |
||
2885 | JumpTaken db ? |
||
2886 | AfterKey db ? |
||
2887 | ;----------------------------------------------------------------------------- |
||
2888 | TmpB rb 0 |
||
2889 | Temp dd ? |
||
2890 | ;----------------------------------------------------------------------------- |
||
2891 | CodeAddr dd ? ;0 order |
||
2892 | RegsAddr dd ? ;1 |
||
2893 | DataAddr dd ? ;2 |
||
2894 | StckAddr dd ? ;3 |
||
2895 | OriginPtr: rd 2 |
||
2896 | AddrBuffer: rd 30 |
||
2897 | ;----------------------------------------------------------------------------- |
||
2898 | NeedZeroEnd: |
||
2899 | ;----------------------------------------------------------------------------- |
||
2900 | BufferI: rb 1024 |
||
2901 | BufferO: rb 1024 |
||
2902 | ;----------------------------------------------------------------------------- |
||
2903 | ; stack |
||
2904 | even 4 |
||
2905 | rb 32768 |
||
2906 | StackTop: |
||
2907 | ;----------------------------------------------------------------------------- |
||
2908 | Mem: |
||
2909 | ;----------------------------------------------------------------------------- |
||
2910 | I_END = UDataStr ;%v |
||
2911 | ;-----------------------------------------------------------------------------=>=>=>=> |