]> pd.if.org Git - mmurtl/blob - ossource/debugger.asm
autocommit for file dated 1995-01-03 18:20:52
[mmurtl] / ossource / debugger.asm
1 ;   MMURTL Operating System Source Code\r
2 ;   Copyright 1991,1992,1993,1994 Richard A. Burgess\r
3 ;   ALL RIGHTS RESERVED   Version 1.0\r
4 ;=============================================================================\r
5 .DATA\r
6 .INCLUDE MOSEDF.INC\r
7 .INCLUDE TSS.INC\r
8 .INCLUDE RQB.INC\r
9 .INCLUDE JOB.INC\r
10 \r
11 .ALIGN DWORD\r
12 \r
13 ;External near Variables\r
14 \r
15 EXTRN rgTmrBlks DD\r
16 EXTRN pJCBs     DD\r
17 EXTRN RdyQ      DD\r
18 EXTRN rgPAM     DB\r
19 \r
20 ;debugger variables and buffers\r
21 \r
22 PUBLIC DbgpTSSSave      DD 0            ;TO save the TSS we interrupted\r
23 PUBLIC dbgFAULT     DD 0FFh             ;0FFh is NO FAULT\r
24 PUBLIC dbgFltErc        DD 0\r
25 PUBLIC dbgOldEIP        DD 0\r
26 PUBLIC dbgOldCS         DD 0\r
27 PUBLIC dbgOldEflgs      DD 0\r
28 \r
29 DbgVidSave      DD 0                    ;To save interrupted video user\r
30 dbgBuf          DB '00000000'   ;General use buffers\r
31 dbgBuf2         DB '0000000000'\r
32 \r
33 .ALIGN DWORD\r
34 cbBufLen2       DD 0                    ;Active bytes in buf2\r
35 dbgKeyCode      DD 0                    ;For ReadDbgKbd\r
36 NextEIP         DD 0                    ;For Disassem display (next ins to be executed)\r
37 dbgGPdd1        DD 0                ;General purpose DDs (used all over)\r
38 dbgGPdd2        DD 0                ;\r
39 dbgGPdd3        DD 0                ;\r
40 dbgGPdd4        DD 0                ;\r
41 dbgGPdd5        DD 0                ;\r
42 dbgGPdd6        DD 0                ;flag 1 = Msg, 0 = Exch\r
43 \r
44 dbgNextAdd      DD 0                ;Address we are setting as next\r
45 dbgCrntAdd      DD 0                ;Address of instructions we are displaying\r
46 dbgDumpAdd      DD 0                ;Address we are dumping\r
47 \r
48 dbgX            DD 0                    ;For line and column display coordination\r
49 dbgY            DD 0\r
50 \r
51 dbgBPAdd        DD 0                    ;Crnt Breakpoint Linear addresses\r
52 \r
53 dbgfDumpD       DB 0                ;Boolean- are we dumping DWORDS?\r
54 fDbgInit        DB 0                    ;Has Dbg Video been initialized?\r
55 \r
56 dbgCRLF         DB 0Dh, 0Ah         ;CR LF for Dump etc...\r
57 dbgChar         DB 0\r
58 \r
59 dbgMenu         DB 'SStep',0B3h,'SetBP',0B3h,'ClrBP',0B3h,'CS:EIP  '\r
60                         DB 'Exchs',0B3h,'Tasks',0B3h,'     ',0B3h,'CrntAddr'\r
61                         DB 'DumpB',0B3h,'DumpD',0B3h,'     ',0B3h,'AddInfo '\r
62 dbgSpace        DB '      '\r
63 dbgCont         DB 'ENTER to continue, ESC to quit.'\r
64 dbgClear        DB '                                        '  ;40 bytes\r
65 dbgAsterisk     DB 42\r
66 \r
67 ;               0123456789012345678901234567890123456789012345678901234\r
68 dbgExchMsg      DB 'Exch      Owner     dMsgLo    dMsgHi              Task'\r
69 \r
70 ;               0123456789012345678901234567890123456789012345678901234\r
71 dbgTaskMsg      DB 'Task#     Job       pJCB      pTSS      Priority      '\r
72 \r
73 ;For Debugger entry conditions\r
74 dbgFltMsg       DB 'FATAL Processor Exception/Fault: '\r
75 sdbgFltMsg      DD $-dbgFltMsg\r
76 \r
77         ;Register display text\r
78 \r
79 dbgTxt00        DB 0B3h,'TSS: '\r
80 dbgTxt01        DB 0B3h,'EAX: '\r
81 dbgTxt02        DB 0B3h,'EBX: '\r
82 dbgTxt03        DB 0B3h,'ECX: '\r
83 dbgTxt04        DB 0B3h,'EDX: '\r
84 dbgTxt05        DB 0B3h,'ESI: '\r
85 dbgTxt06        DB 0B3h,'EDI: '\r
86 dbgTxt07        DB 0B3h,'EBP: '\r
87 dbgTxt08        DB 0B3h,' SS: '\r
88 dbgTxt09        DB 0B3h,'ESP: '\r
89 dbgTxt10        DB 0B3h,' CS: '\r
90 dbgTxt11        DB 0B3h,'EIP: '\r
91 dbgTxt12        DB 0B3h,' DS: '\r
92 dbgTxt13        DB 0B3h,' ES: '\r
93 dbgTxt14        DB 0B3h,' FS: '\r
94 dbgTxt15        DB 0B3h,' GS: '\r
95 dbgTxt16        DB 0B3h,'EFL: '\r
96 dbgTxt17        DB 0B3h,'CR0: '\r
97 dbgTxt18        DB 0B3h,'CR2: '\r
98 dbgTxt19        DB 0B3h,'CR3: '\r
99 dbgTxt20        DB 0B3h,'Erc: '\r
100 \r
101 dbgTxtAddr      DB 'Linear address: '\r
102 \r
103         ;For Important Address Info Display\r
104 \r
105 dbgM0        DB 'IDT:  '\r
106 dbgM1        DB 'GDT:  '\r
107 dbgM2        DB 'RQBs: '\r
108 dbgM3        DB 'TSS1: '\r
109 dbgM4        DB 'TSS3: '\r
110 dbgM5        DB 'LBs:  '\r
111 dbgM6        DB 'RdyQ: '\r
112 dbgM7        DB 'JCBs: '\r
113 dbgM8        DB 'SVCs: '\r
114 dbgM9        DB 'Exch: '\r
115 dbgPA        DB 'PAM:  '\r
116 dbgMB        DB 'aTmr: '\r
117 \r
118 ;==================== End Data, Begin Code ==========================\r
119 \r
120 .CODE\r
121 \r
122 EXTRN DDtoHex NEAR\r
123 EXTRN HexToDD NEAR\r
124 EXTRN _disassemble NEAR\r
125 EXTRN ReadDbgKbd NEAR\r
126 \r
127 PUBLIC DbgTask:\r
128 \r
129                 MOV EAX, OFFSET DbgVidSave      ;Save number of vid we interrupted\r
130                 PUSH EAX\r
131                 CALL FWORD PTR _GetVidOwner\r
132 \r
133                 STI\r
134 \r
135                 PUSH 2\r
136                 CALL FWORD PTR _SetVidOwner             ;Dbgr is Job 2\r
137 \r
138                 CMP fDbgInit, 0\r
139                 JNE DbgInitDone\r
140                 CALL FWORD PTR _ClrScr\r
141                 MOV fDbgInit, 1\r
142 \r
143 DbgInitDone:\r
144 \r
145                 MOV EAX, DbgpTSSSave\r
146 \r
147                 ;When a fault or debug exception occurs, the values of\r
148                 ;the Instruction Pointer, Code Seg, and flags are not the\r
149                 ;way they were when the exception fired off becuase of the\r
150                 ;interrupt procedure they enterred to get to the debugger.\r
151                 ;We make them the same by putting the values we got from\r
152                 ;the stack (entering the debugger) into the caller's TSS.\r
153                 ;\r
154                 MOV EBX,dbgOldEflgs                     ;Store correct flags\r
155                 MOV [EAX+TSS_EFlags],EBX        ;EAX still has DbgpTSSSave\r
156                 MOV EBX,dbgOldCS                        ;Store correct CS\r
157                 MOV [EAX+TSS_CS],BX\r
158                 MOV EBX,dbgOldEIP                       ;Store correct EIP\r
159                 MOV [EAX+TSS_EIP],EBX\r
160                 ;\r
161                 ;NOTE: The "book" says the TF flag is reset by the processor\r
162                 ; when the handler is entered. This only applies if\r
163                 ; the handler is a procedure (NOT a task).  The debugger\r
164                 ; is always entered as a procedure, (we chanage the tasks)\r
165                 ; so we shouldn't have to reset it.  But we do...\r
166                 ; I guess I'm not reading it right or ROD SERLING LIVES!\r
167                 ;\r
168                 MOV EBX,[EAX+TSS_EFlags]        ;Reset TF in case single steping\r
169                 AND EBX,0FFFFFEFFh\r
170                 MOV [EAX+TSS_EFlags],EBX\r
171 \r
172                 ;We set the FAULT variable based on which interrupt\r
173                 ;procedure was entered.\r
174 \r
175                 CMP DWORD PTR dbgFAULT,0FFh     ;Was the dbgr entered on a FAULT?\r
176                 JE dbg000                                       ;NO\r
177                 ;\r
178                 ;NOTE: Must eventually add SS/ESP for a change in CPL on faults!!!\r
179                 ;REF - See page 3-4 System Software Writer's Guide\r
180 \r
181                 XOR EAX, EAX\r
182                 PUSH EAX                                        ;Display fault message and\r
183                 PUSH EAX                                        ;  and number at 0 ,0\r
184                 CALL FWORD PTR _SetXY\r
185 \r
186                 LEA EAX,dbgFltMsg\r
187                 PUSH EAX\r
188                 PUSH sdbgFltMsg\r
189                 PUSH 40h                                        ;Color Black on RED\r
190                 CALL FWORD PTR _TTYOut\r
191 \r
192                 MOV EAX,dbgFAULT\r
193                 PUSH EAX\r
194                 PUSH OFFSET dbgBuf\r
195                 CALL DDtoHex\r
196 \r
197                 LEA EAX,dbgBuf\r
198                 PUSH EAX\r
199                 PUSH 8\r
200                 PUSH 70h\r
201                 CALL FWORD PTR _TTYOut\r
202                 MOV DWORD PTR dbgFAULT, 0FFh                            ;reset fault indicator\r
203 \r
204                 LEA EAX,dbgCRLF\r
205                 PUSH EAX\r
206                 PUSH 2\r
207                 PUSH 07h                                        ;Color White on black\r
208                 CALL FWORD PTR _TTYOut\r
209                 XOR EAX, EAX\r
210                 MOV dbgX, EAX                           ;Reset X & Y to 0,1\r
211                 INC EAX\r
212                 MOV dbgY, EAX\r
213 \r
214 ;===================================================================\r
215 dbg000:\r
216                 CALL DbgRegVid                          ;Display BackLink's Register values\r
217                 CALL dbgDispMenu                        ;Display menu\r
218                 PUSH dbgX                                       ;Back to where we were\r
219                 PUSH dbgY\r
220                 CALL FWORD PTR _SetXY\r
221 \r
222 \r
223                 ;Display Instruction at CS:EIP\r
224                 MOV EBX,DbgpTSSSave                     ;Get USER pUserTSS\r
225                 MOV EAX, [EBX+TSS_EIP]\r
226                 MOV dbgCrntAdd, EAX\r
227                 CALL dbgShowBP\r
228                 PUSH EAX\r
229                 CALL _disassemble                       ;This puts the instruction on the line\r
230                 MOV NextEIP, EAX\r
231                 CALL dbgCheckScroll                     ;Fall through to keyboard loop\r
232 \r
233 ;===========================================================\r
234                 ;Now we read the keyboard\r
235 dbg00:\r
236                 MOV EAX, OFFSET dbgKeyCode\r
237                 PUSH EAX\r
238                 CALL ReadDbgKbd                         ;\r
239                 MOV EAX, dbgKeyCode\r
240                 AND EAX, 0FFh                           ;Lop off key status bytes\r
241 \r
242                 CMP EAX, 1Bh                            ;ESCAPE (Exit)\r
243                 JE dbgExit\r
244 \r
245                 CMP EAX, 0Fh                            ;Single Step (F1)\r
246                 JNE dbg02\r
247                 MOV EBX,DbgpTSSSave                     ;Get USER pUserTSS\r
248                 MOV ECX,[EBX+TSS_EFlags]        ;\r
249                 OR ECX,00000100h                        ;Set TF in flags for single step\r
250                 MOV [EBX+TSS_EFlags],ECX\r
251                 JMP dbgExit\r
252 dbg02:\r
253                 CMP EAX, 10h                            ;Set BP (Current Address - F2)\r
254                 JNE dbg03\r
255                 MOV EBX, dbgCrntAdd                     ;Address displayed\r
256                 MOV dbgBPAdd, EBX                       ;Save it so we know where BP is\r
257                 MOV DR0, EBX                            ;Move into BreakPoint Reg 0\r
258                 XOR EAX, EAX\r
259                 MOV DR6, EAX\r
260                 MOV EAX, 00000002h                      ;BP0 Set global\r
261                 MOV DR7, EAX\r
262                 JMP dbg00                                       ;\r
263 dbg03:\r
264                 CMP EAX, 11h                            ;Clear BP (Current Address - F3)\r
265                 JNE dbg04\r
266                 XOR EAX, EAX\r
267                 MOV dbgBPAdd, EAX                       ;Clear BP saved address\r
268                 MOV DR7, EAX\r
269                 JMP dbg00                                       ;\r
270 dbg04:\r
271                 CMP EAX, 12h                            ;Return to CS:EIP (F4)\r
272                 JNE dbg05\r
273                 MOV EBX,DbgpTSSSave                     ;Get USER pUserTSS\r
274                 MOV EAX, [EBX+TSS_EIP]\r
275                 MOV dbgCrntAdd, EAX\r
276                 CALL dbgShowBP\r
277                 PUSH EAX\r
278                 CALL _disassemble                       ;This puts the instruction on the line\r
279                 MOV NextEIP, EAX\r
280                 CALL dbgCheckScroll                     ;See if we need to scroll up\r
281                 JMP dbg00                                       ;\r
282 dbg05:\r
283                 CMP EAX, 13h                            ;Display Exchanges (F5)\r
284                 JNE dbg06\r
285                 CALL dbgDispExchs\r
286                 JMP dbg000                                      ;Full display\r
287 dbg06:\r
288                 CMP EAX, 14h                            ;Task array display (F6)\r
289                 JNE dbg07\r
290                 CALL dbgDispTasks\r
291                 JMP dbg000                                      ;\r
292 dbg07:\r
293                 CMP EAX, 15h                            ;Not used yet\r
294                 JNE dbg08\r
295                 JMP dbg00                                       ;\r
296 dbg08:\r
297                 CMP AL, 16h                                     ;Set Disassembly Address (F8)\r
298                 JNE dbg09\r
299                 CALL dbgSetAddr                         ;Sets NextEIP\r
300                 PUSH dbgX                                       ;Back to where we were\r
301                 PUSH dbgY\r
302                 CALL FWORD PTR _SetXY\r
303                 MOV EAX, NextEIP\r
304                 MOV dbgCrntAdd, EAX\r
305                 CALL dbgShowBP\r
306                 PUSH EAX\r
307                 CALL _disassemble                       ;This puts the instruction on the line\r
308                 MOV NextEIP, EAX\r
309                 CALL dbgCheckScroll                     ;See if we need to scroll up\r
310                 JMP dbg00                                       ;\r
311 dbg09:\r
312                 CMP AL, 17h                                     ;Memory Dump Bytes (F9)\r
313                 JNE dbg10\r
314                 MOV BL, 00\r
315                 MOV dbgfDumpD, BL\r
316                 CALL dbgDump                            ;\r
317                 JMP dbg000\r
318 dbg10:\r
319                 CMP AL, 18h                                     ;Memory Dump DWORDS (F10)\r
320                 JNE dbg12\r
321                 MOV BL, 0FFh\r
322                 MOV dbgfDumpD, BL\r
323                 CALL dbgDump                            ;\r
324                 JMP dbg000\r
325 dbg12:\r
326                 CMP AL, 01Ah                            ;Info Address dump (F12)\r
327                 JNE dbg13\r
328                 CALL DbgInfo                            ;\r
329                 JMP dbg00\r
330 \r
331 dbg13:  CMP AL, 02h                                     ;Display next Instruction (Down Arrow)\r
332                 JNE dbg14\r
333                 MOV EAX, NextEIP\r
334                 MOV dbgCrntAdd, EAX\r
335                 CALL dbgShowBP\r
336                 PUSH EAX\r
337                 CALL _disassemble                       ;This puts the instruction on the line\r
338                 MOV NextEIP, EAX\r
339                 CALL dbgCheckScroll                     ;See if we need to scroll up\r
340                 JMP dbg00\r
341 \r
342 dbg14:\r
343                 JMP dbg00                               ;GO back for another key\r
344 \r
345 DbgExit:\r
346 \r
347                 LEA EAX,dbgX                    ;Query XY\r
348                 PUSH EAX\r
349                 LEA EAX,dbgY\r
350                 PUSH EAX\r
351                 CALL FWORD PTR _GetXY\r
352 \r
353                 PUSH DbgVidSave\r
354                 CALL FWORD PTR _SetVidOwner     ;Change screens back\r
355 \r
356                 MOV EAX, DbgpTSSSave            ;Return saved pRunTSS\r
357                 MOV pRunTSS, EAX\r
358                 MOV BX, [EAX+Tid]\r
359         MOV TSS_Sel, BX                         ;Set up caller's TSS selector\r
360 \r
361                 JMP FWORD PTR [TSS]\r
362 \r
363                 ;Next time we enter the debugger task it will be here!\r
364                 JMP     DbgTask                                 ;Back to begining\r
365 \r
366 ;==============================================================\r
367 \r
368 dbgShowBP:\r
369                 ;This compares the current breakpoint the address\r
370                 ;we are about to display. If they are the same,\r
371                 ;we put up an asterisk to indicate it's the breakpoint\r
372                 ;EAX must be preserved\r
373 \r
374                 MOV EBX, dbgCrntAdd                     ;Address displayed\r
375                 MOV ECX, dbgBPAdd                       ;BP Address\r
376                 CMP EBX, ECX\r
377                 JZ dbgShowBP1\r
378                 RETN\r
379 dbgShowBP1:\r
380                 PUSH EAX                                        ;Save EAX across call\r
381                 PUSH OFFSET dbgAsterisk         ;3 params to TTYOut\r
382                 PUSH 01h\r
383                 PUSH 47h                                        ;Reverse Vid WHITE on RED\r
384                 CALL FWORD PTR _TTYOut\r
385                 POP EAX\r
386                 RETN\r
387 \r
388 ;==============================================================\r
389 ;This sets up and calls to display all of the regsiter\r
390 ;information on the right side of the debugger video display\r
391 \r
392 DbgRegVid:\r
393                 MOV EBX,DbgpTSSSave                     ;EBX MUST be DbgpTSSSave\r
394                 MOV ECX,00                                      ;TSS Display\r
395                 MOV ESI,OFFSET DbgTxt00\r
396                 XOR EAX,EAX\r
397                 MOV AX,[EBX+TSSNum]                     ;Number of this TSS\r
398                 CALL DispRegs\r
399 \r
400                 MOV ECX,01                                      ;EAX Display\r
401                 MOV ESI,OFFSET DbgTxt01\r
402                 MOV EAX,[EBX+TSS_EAX]\r
403                 CALL DispRegs\r
404 \r
405                 MOV ECX,02                                      ;EBX Display\r
406                 MOV ESI,OFFSET DbgTxt02\r
407                 MOV EAX,[EBX+TSS_EBX]\r
408                 CALL DispRegs\r
409 \r
410                 MOV ECX,03                                      ;ECX Display\r
411                 MOV ESI,OFFSET DbgTxt03\r
412                 MOV EAX,[EBX+TSS_ECX]\r
413                 CALL DispRegs\r
414 \r
415                 MOV ECX,04                                      ;EDX Display\r
416                 MOV ESI,OFFSET DbgTxt04\r
417                 MOV EAX,[EBX+TSS_EDX]\r
418                 CALL DispRegs\r
419 \r
420                 MOV ECX,05                                      ;ESI Display\r
421                 MOV ESI,OFFSET DbgTxt05\r
422                 MOV EAX,[EBX+TSS_ESI]\r
423                 CALL DispRegs\r
424 \r
425                 MOV ECX,06                                      ;EDI Display\r
426                 MOV ESI,OFFSET DbgTxt06\r
427                 MOV EAX,[EBX+TSS_EDI]\r
428                 CALL DispRegs\r
429 \r
430                 MOV ECX,07                                      ;EBP Display\r
431                 MOV ESI,OFFSET DbgTxt07\r
432                 MOV EAX,[EBX+TSS_EBP]\r
433                 CALL DispRegs\r
434 \r
435                 MOV ECX,08                                      ;SS Display\r
436                 MOV ESI,OFFSET DbgTxt08\r
437                 XOR EAX,EAX\r
438                 MOV AX,[EBX+TSS_SS]\r
439                 CALL DispRegs\r
440 \r
441                 MOV ECX,09                                      ;ESP Display\r
442                 MOV ESI,OFFSET DbgTxt09\r
443                 MOV EAX,[EBX+TSS_ESP]\r
444                 CALL DispRegs\r
445 \r
446                 MOV ECX,10                                      ;CS Display\r
447                 MOV ESI,OFFSET DbgTxt10\r
448                 XOR EAX,EAX\r
449                 MOV AX,[EBX+TSS_CS]\r
450                 CALL DispRegs\r
451 \r
452                 MOV ECX,11                                      ;EIP Display\r
453                 MOV ESI,OFFSET DbgTxt11\r
454                 MOV EAX,[EBX+TSS_EIP]\r
455                 CALL DispRegs\r
456                 MOV ECX,12                                      ;DS Display\r
457                 MOV ESI,OFFSET DbgTxt12\r
458                 XOR EAX,EAX\r
459                 MOV AX,[EBX+TSS_DS]\r
460                 CALL DispRegs\r
461                 MOV ECX,13                                      ;ES Display\r
462                 MOV ESI,OFFSET DbgTxt13\r
463                 XOR EAX,EAX\r
464                 MOV AX,[EBX+TSS_ES]\r
465                 CALL DispRegs\r
466                 MOV ECX,14                                      ;FS Display\r
467                 MOV ESI,OFFSET DbgTxt14\r
468                 XOR EAX,EAX\r
469                 MOV AX,[EBX+TSS_FS]\r
470                 CALL DispRegs\r
471                 MOV ECX,15                                      ;GS Display\r
472                 MOV ESI,OFFSET DbgTxt15\r
473                 XOR EAX,EAX\r
474                 MOV AX,[EBX+TSS_GS]\r
475                 CALL DispRegs\r
476                 MOV ECX,16                                      ;EFlags Display\r
477                 MOV ESI,OFFSET DbgTxt16\r
478                 MOV EAX,[EBX+TSS_EFlags]\r
479                 CALL DispRegs\r
480                 MOV ECX,17                                      ;CR0 Display\r
481                 MOV ESI,OFFSET DbgTxt17\r
482                 MOV EAX,CR0\r
483                 CALL DispRegs\r
484                 MOV ECX,18                                      ;CR2 Display\r
485                 MOV ESI,OFFSET DbgTxt18\r
486                 MOV EAX,CR2\r
487                 CALL DispRegs\r
488                 MOV ECX,19                                      ;CR3 Display\r
489                 MOV ESI,OFFSET DbgTxt19\r
490                 MOV EAX,CR3\r
491                 CALL DispRegs\r
492                 MOV ECX,20                                      ;Fault Error Code Display\r
493                 MOV ESI,OFFSET DbgTxt20\r
494                 MOV EAX,dbgFltErc\r
495                 CALL DispRegs\r
496                 RETN\r
497 ;=============================================================================\r
498 ;\r
499 ; This is for Debugger Register display\r
500 ; Call with: EAX loaded with value to display (from TSS reg)\r
501 ;                ECX loaded with number of text line to display on\r
502 ;                ESI loaded with EA of text line to display\r
503 ;   We save all registers cause the vid calls don't\r
504 \r
505 DispRegs:\r
506                 PUSHAD\r
507 \r
508                 PUSH EAX                   ;Save number to display\r
509 \r
510                 PUSH 66\r
511                 PUSH ECX\r
512                 CALL FWORD PTR _SetXY\r
513 \r
514                 PUSH ESI\r
515                 PUSH 05h\r
516                 PUSH 07h\r
517                 CALL FWORD PTR _TTYOut\r
518 \r
519                 POP EAX                    ;Get number back for display\r
520 \r
521                 PUSH EAX\r
522                 PUSH OFFSET dbgBuf\r
523                 CALL DDtoHex\r
524 \r
525                 PUSH OFFSET dbgBuf\r
526                 PUSH 8\r
527                 PUSH 07h\r
528                 CALL FWORD PTR _TTYOut\r
529                 POPAD\r
530                 RETN\r
531 ;==============================================\r
532 ; This displays the debugger function key menu\r
533 \r
534 dbgDispMenu:\r
535                 PUSH 0                          ;Display Debugger FKey Menu\r
536                 PUSH 24\r
537                 CALL FWORD PTR _SetXY\r
538 \r
539                 LEA EAX,dbgMenu\r
540                 PUSH EAX\r
541                 PUSH 78\r
542                 PUSH 70h\r
543                 CALL FWORD PTR _TTYOut\r
544 \r
545                 PUSH 25\r
546                 PUSH 24\r
547                 CALL FWORD PTR _SetXY\r
548 \r
549                 LEA EAX,dbgSpace\r
550                 PUSH EAX\r
551                 PUSH 1\r
552                 PUSH 07h\r
553                 CALL FWORD PTR _TTYOut\r
554 \r
555                 PUSH 51\r
556                 PUSH 24\r
557                 CALL FWORD PTR _SetXY\r
558 \r
559                 LEA EAX,dbgSpace\r
560                 PUSH EAX\r
561                 PUSH 1\r
562                 PUSH 07h\r
563                 CALL FWORD PTR _TTYOut\r
564 \r
565                 RETN\r
566 ;===========================\r
567 ;Allows the user to pick the currently displayed address\r
568 \r
569 dbgSetAddr:\r
570                 PUSH 0                                          ;Goto Query Line\r
571                 PUSH 23                                         ;\r
572                 CALL FWORD PTR _SetXY\r
573 \r
574                 LEA EAX, dbgTxtAddr\r
575                 PUSH EAX\r
576                 PUSH 16\r
577                 PUSH 07h\r
578                 CALL FWORD PTR _TTYOut\r
579                 CMP EAX, 0\r
580                 JNE DumpDone\r
581 \r
582                 LEA EAX, DbgBuf2                ;\r
583                 PUSH EAX                                ;pEdString\r
584                 PUSH cbBufLen2                  ;Crnt size\r
585                 PUSH 8                                  ;Max size\r
586                 LEA EAX, cbBufLen2              ;\r
587                 PUSH EAX                                ;ptr to size returned\r
588                 LEA EAX, dbgChar                ;\r
589                 PUSH EAX                                ;ptr to char returned\r
590                 PUSH 70h                                ;Black On White\r
591                 CALL FWORD PTR _EditLine        ;Ignore error if any\r
592 \r
593                 MOV AL, dbgChar                 ;did they exit with CR?\r
594                 CMP AL, 0Dh\r
595                 JNE dbgSetAddrDone\r
596 \r
597                 LEA EAX, dbgBuf2                ;Convert String to DD\r
598                 PUSH EAX                                ;ptr to string\r
599                 LEA EAX, dbgNextAdd\r
600                 PUSH EAX                                ;ptr to destination DD\r
601                 PUSH cbBufLen2                  ;length of string\r
602                 CALL HexToDD                    ;dbgDumpAdd has address to dump!\r
603                 CMP EAX, 0\r
604                 JNE dbgSetAddrDone\r
605 \r
606                 MOV EAX, dbgNextAdd\r
607                 MOV NextEIP, EAX\r
608 dbgSetAddrDone:\r
609                 CALL dbgClearQuery\r
610                 RETN                                    ;Go home...\r
611 ;===========================\r
612 ;Queries user for address then dumps data to screen\r
613 \r
614 dbgDump:\r
615                 PUSH 0                                          ;Goto Query Line\r
616                 PUSH 23                                         ;\r
617                 CALL FWORD PTR _SetXY\r
618 \r
619                 LEA EAX, dbgTxtAddr\r
620                 PUSH EAX\r
621                 PUSH 16\r
622                 PUSH 07h\r
623                 CALL FWORD PTR _TTYOut\r
624                 CMP EAX, 0\r
625                 JNE DumpDone\r
626 \r
627                 LEA EAX, DbgBuf2                ;\r
628                 PUSH EAX                                ;pEdString\r
629                 PUSH cbBufLen2                  ;Crnt size\r
630                 PUSH 8                                  ;Max size\r
631                 LEA EAX, cbBufLen2              ;\r
632                 PUSH EAX                                ;ptr to size returned\r
633                 LEA EAX, dbgChar                ;\r
634                 PUSH EAX                                ;ptr to char returned\r
635                 PUSH 70h                                ;Black On White\r
636                 CALL FWORD PTR _EditLine        ;Ignore error if any\r
637 \r
638                 MOV AL, dbgChar                 ;did they exit with CR?\r
639                 CMP AL, 0Dh\r
640                 JE dbgDoDump\r
641                 CALL dbgClearQuery\r
642                 RETN                                    ;Go home...\r
643 \r
644 dbgDoDump:\r
645                 LEA EAX, dbgBuf2                ;Convert String to DD\r
646                 PUSH EAX                                ;ptr to string\r
647                 LEA EAX, dbgDumpAdd\r
648                 PUSH EAX                                ;ptr to destination DD\r
649                 PUSH cbBufLen2                  ;length of string\r
650                 CALL HexToDD                    ;dbgDumpAdd has address to dump!\r
651                 CMP EAX, 0\r
652                 JNE DumpDone\r
653 \r
654                 CALL FWORD PTR _ClrScr\r
655 \r
656 dbgDump00:\r
657                 MOV DWORD PTR dbgGPdd1, 24      ;line counter begins at 24\r
658 dbgDump01:\r
659                 MOV DWORD PTR dbgGPdd3, 4       ;number of quads per line\r
660                 PUSH dbgDumpAdd         ;convert address to text\r
661                 LEA EAX, dbgBuf\r
662                 PUSH EAX\r
663                 CALL DDtoHex\r
664 \r
665                 LEA EAX, dbgBuf\r
666                 PUSH EAX\r
667                 PUSH 8\r
668                 PUSH 07h\r
669                 CALL FWORD PTR _TTYOut\r
670                 CMP EAX, 0\r
671                 JNE DumpDone\r
672 dbgDump02:\r
673                 MOV DWORD PTR dbgGPdd2, 6       ;byte offset begins at 6\r
674                 LEA EAX, dbgSpace\r
675                 PUSH EAX\r
676                 PUSH 2\r
677                 PUSH 07h\r
678                 CALL FWORD PTR _TTYOut\r
679                 CMP EAX, 0\r
680                 JNE DumpDone\r
681                 MOV EBX, dbgDumpAdd ;get dump address\r
682                 MOV EAX, [EBX]      ;Get what it's pointing to\r
683                 PUSH EAX                        ;make it a DD Text\r
684                 LEA EAX, dbgBuf\r
685                 PUSH EAX\r
686                 CALL DDtoHex\r
687                 MOV AL, dbgfDumpD       ;Dumping DWORDS\r
688                 CMP AL, 0\r
689                 JE DumpB                        ;NO - go to display bytes\r
690 \r
691                 LEA EAX, dbgBuf         ;Yes display Quad\r
692                 PUSH EAX\r
693                 PUSH 8\r
694                 PUSH 07\r
695                 CALL FWORD PTR _TTYOut\r
696                 JMP DumpDin\r
697 \r
698  dumpB:\r
699                 LEA EAX, dbgBuf                 ;Display First byte\r
700                 ADD EAX, dbgGPdd2\r
701                 PUSH EAX\r
702                 PUSH 2\r
703                 PUSH 07h\r
704                 CALL FWORD PTR _TTYOut  ;ignore error\r
705 \r
706                 LEA EAX, dbgSpace       ;Display 1 spaces\r
707                 PUSH EAX\r
708                 PUSH 1\r
709                 PUSH 07h\r
710                 CALL FWORD PTR _TTYOut\r
711                 DEC dbgGPdd2                    ;point to second 2 bytes\r
712                 DEC dbgGPdd2\r
713 \r
714                 LEA EAX, dbgBuf             ;display 2st byte\r
715                 ADD EAX, dbgGPdd2\r
716                 PUSH EAX\r
717                 PUSH 2\r
718                 PUSH 07h\r
719                 CALL FWORD PTR _TTYOut  ;ignore error\r
720 \r
721                 LEA EAX, dbgSpace               ; display 1 space\r
722                 PUSH EAX\r
723                 PUSH 1\r
724                 PUSH 07h\r
725                 CALL FWORD PTR _TTYOut\r
726 \r
727                 DEC dbgGPdd2\r
728                 DEC dbgGPdd2\r
729 \r
730                 LEA EAX, dbgBuf                  ;display 3rd byte\r
731                 ADD EAX, dbgGPdd2\r
732                 PUSH EAX\r
733                 PUSH 2\r
734                 PUSH 07h\r
735                 CALL FWORD PTR _TTYOut  ;ignore error\r
736 \r
737                 LEA EAX, dbgSpace               ;a space\r
738                 PUSH EAX\r
739                 PUSH 1\r
740                 PUSH 07h\r
741                 CALL FWORD PTR _TTYOut\r
742                 DEC dbgGPdd2\r
743                 DEC dbgGPdd2\r
744 \r
745                 LEA EAX, dbgBuf         ;display 4th byte\r
746                 ADD EAX, dbgGPdd2\r
747                 PUSH EAX\r
748                 PUSH 2\r
749                 PUSH 07h\r
750                 CALL FWORD PTR _TTYOut  ;ignore error\r
751 DumpDin:\r
752                 INC dbgDumpAdd\r
753                 INC dbgDumpAdd\r
754                 INC dbgDumpAdd\r
755                 INC dbgDumpAdd\r
756                 DEC dbgGPdd3                    ;done with 4 quads??\r
757                 JNZ dbgDump02                   ;NO - go back for next 4 bytes\r
758 \r
759                 LEA EAX, dbgSpace               ;Yes - Display 2 spaces\r
760                 PUSH EAX\r
761                 PUSH 2\r
762                 PUSH 07h\r
763                 CALL FWORD PTR _TTYOut\r
764 \r
765                 LEA EAX,dbgX                    ;Query XY\r
766                 PUSH EAX\r
767                 LEA EAX,dbgY\r
768                 PUSH EAX\r
769                 CALL FWORD PTR _GetXY\r
770 \r
771                 PUSH dbgX                               ;Put 16 TEXT chars on right\r
772                 PUSH dbgY\r
773                 MOV EAX, dbgDumpAdd\r
774                 SUB EAX, 16\r
775                 PUSH EAX\r
776                 PUSH 16\r
777                 PUSH 07h\r
778                 CALL FWORD PTR _PutVidChars     ;ignore error\r
779 \r
780                 LEA EAX, dbgCRLF        ;Do CR/LF\r
781                 PUSH EAX\r
782                 PUSH 2\r
783                 PUSH 07h\r
784                 CALL FWORD PTR _TTYOut\r
785                 ;\r
786                 DEC dbgGPdd1            ;23lines yet??\r
787                 JNZ dbgDump01           ;NO\r
788                 ;\r
789                 LEA EAX, dbgCont    ;"Continue" Text\r
790                 PUSH EAX\r
791                 PUSH 31                     ;size of "cont text"\r
792                 PUSH 07h\r
793                 CALL FWORD PTR _TTYOut\r
794 dbgDump03:\r
795                 MOV EAX, OFFSET dbgKeyCode\r
796                 PUSH EAX\r
797                 CALL ReadDbgKbd\r
798                 MOV EAX, dbgKeyCode\r
799                 AND EAX, 0FFh                           ;Lop off key status bytes\r
800                 CMP EAX, 0\r
801                 JE dbgDump03\r
802                 CMP EAX, 1Bh                ;Escape (Quit??)\r
803                 JE DumpDone\r
804 \r
805                 LEA EAX, dbgCRLF            ;Do CR/LF\r
806                 PUSH EAX\r
807                 PUSH 2\r
808                 PUSH 07h\r
809                 CALL FWORD PTR _TTYOut\r
810                 JMP dbgDump00\r
811 \r
812                 ;\r
813  DumpDone:\r
814                 CALL FWORD PTR _ClrScr\r
815                 MOV DWORD PTR dbgX, 0\r
816                 MOV DWORD PTR dbgY, 0\r
817                 RETN\r
818 ;===========================\r
819 \r
820 ;Displays exchanges that are allocated along with\r
821 ;messages or tasks that may be wiating at them\r
822 \r
823 dbgDispExchs:\r
824 \r
825                 MOV DWORD PTR dbgGPdd2, 0               ;Exch# we are on\r
826 dbgDE00:\r
827                 CALL FWORD PTR _ClrScr\r
828                 PUSH 0                                  ;Col\r
829                 PUSH 0                                  ;Line for labels\r
830                 PUSH OFFSET dbgExchMsg  ;\r
831                 PUSH 54                                 ;Length of message\r
832                 PUSH 07h\r
833                 CALL FWORD PTR _PutVidChars     ;\r
834                 MOV DWORD PTR dbgGPdd1, 1                       ;line we are one\r
835 \r
836                 ;First we do the exchange on the current line\r
837 dbgDE01:\r
838                 PUSH dbgGPdd2                   ;Convert Exch number for display\r
839                 PUSH OFFSET dbgBuf\r
840                 CALL DDtoHex\r
841 \r
842                 PUSH 0                                  ;Col\r
843                 PUSH dbgGPdd1                   ;Line we are one\r
844                 PUSH OFFSET dbgBuf              ;ExchNum\r
845                 PUSH 8\r
846                 PUSH 07h\r
847                 CALL FWORD PTR _PutVidChars     ;\r
848 \r
849                 ;Then we do the Exch Owner (Job Number) next to it\r
850 \r
851                 MOV EAX, dbgGPdd2               ; Exch number\r
852                 MOV EDX, sEXCH          ; Compute offset of Exch in rgExch\r
853                 MUL EDX                 ;\r
854                 MOV EDX,prgExch         ; Add offset of rgExch => EAX\r
855                 ADD EAX,EDX             ; EAX now pts to Exch\r
856                 MOV dbgGPdd3, EAX               ; pExch into save variable\r
857                 MOV EBX, [EAX+Owner]    ; pJCB of Owner into EBX\r
858                 XOR EAX, EAX                    ; Clear for use as JobNum\r
859                 OR EBX, EBX                             ; pNIL? (No owner if so)\r
860                 JZ dbgDE03\r
861                 MOV EAX, [EBX+JobNum]   ;\r
862 dbgDE03:\r
863                 PUSH EAX                                ;Convert Job Number\r
864                 PUSH OFFSET dbgBuf\r
865                 CALL DDtoHex\r
866 \r
867                 PUSH 10                                 ;Col\r
868                 PUSH dbgGPdd1                   ;Line\r
869                 PUSH OFFSET dbgBuf              ;\r
870                 PUSH 8\r
871                 PUSH 07h\r
872                 CALL FWORD PTR _PutVidChars     ;\r
873 \r
874                 MOV dbgGPdd5, 0                 ;Set pNextMsg to 0\r
875 \r
876                 ;See if there is a first message\r
877 \r
878                 MOV EAX, dbgGPdd3               ;pExch -> EAX\r
879                 MOV EBX, [EAX+EHead]    ;pMsg -> EBX\r
880                 OR EBX, EBX                             ;Is is NIL (no msg or task)?\r
881                 JZ dbgDE13                              ;Yes. Go to next Exch\r
882 \r
883                 MOV EBX, [EAX+fEMsg]    ;MsgFlag -> EBX\r
884                 OR EBX, EBX                             ;Is is 1 (a message)?\r
885                 JZ dbgDE05                              ;No, Go check for tasks\r
886                 MOV EBX, [EAX+EHead]    ;pMsg -> EBX\r
887 \r
888                 ;Display Messages\r
889 dbgDE04:\r
890                 MOV DWORD PTR dbgGPdd6, 0       ;Flag to indicate we are doing messages\r
891                 MOV EAX, [EBX+NextLB]   ;For next msg in chain (if it exists)\r
892                 MOV dbgGPdd5, EAX               ;Save for loop\r
893                 MOV EAX, [EBX+DataHi]   ;Get dMsg1\r
894                 MOV EDX, [EBX+DataLo]   ;Get dMsg2\r
895                 PUSH EDX                                ;Save dMsg2\r
896 \r
897                 PUSH EAX                                ;Convert dMsg1\r
898                 PUSH OFFSET dbgBuf\r
899                 CALL DDtoHex\r
900 \r
901                 PUSH 20                                 ;Col\r
902                 PUSH dbgGPdd1                   ;Line\r
903                 PUSH OFFSET dbgBuf              ;\r
904                 PUSH 8\r
905                 PUSH 07h\r
906                 CALL FWORD PTR _PutVidChars     ;\r
907 \r
908                 POP EDX                                 ;Get dMsg2 back\r
909 \r
910                 ;Could have left it on stack, but would be confusing later...\r
911                 ;"simplicity of maintenance is as important as simplicity of design"\r
912 \r
913                 PUSH EDX                                ;Convert dMsg2\r
914                 PUSH OFFSET dbgBuf\r
915                 CALL DDtoHex\r
916 \r
917                 PUSH 30                                         ;Col\r
918                 PUSH dbgGPdd1                           ;Line\r
919                 PUSH OFFSET dbgBuf                      ;\r
920                 PUSH 8\r
921                 PUSH 07h\r
922                 CALL FWORD PTR _PutVidChars     ;\r
923                 JMP  dbgDE07                            ;Next line please\r
924 \r
925                 ;See if there are tasks waiting\r
926 dbgDE05:\r
927                 MOV DWORD PTR dbgGPdd6, 1       ;Flag to indicate we are doing tasks\r
928                 MOV DWORD PTR dbgGPdd5, 0       ;Clear pNextTask\r
929                 MOV EAX, dbgGPdd3               ;pExch -> EAX\r
930                 MOV EBX, [EAX+EHead]    ;pTSS -> EBX\r
931                 OR EBX, EBX                             ;Is is 0 (no TSS)?\r
932                 JZ dbgDE07                              ;\r
933 dbgDE06:\r
934                 MOV EAX, [EBX+NextTSS]\r
935                 MOV dbgGPdd5, EAX               ;Save ptr to next task if it exists\r
936                 XOR EAX, EAX\r
937                 MOV AX, [EBX+TSSNum]    ;Get Number of Task at exch\r
938 \r
939                 PUSH EAX                                ;Convert Task Number\r
940                 PUSH OFFSET dbgBuf\r
941                 CALL DDtoHex\r
942 \r
943                 PUSH 50                                 ;Col\r
944                 PUSH dbgGPdd1                   ;Line\r
945                 PUSH OFFSET dbgBuf              ;\r
946                 PUSH 8\r
947                 PUSH 07h\r
948                 CALL FWORD PTR _PutVidChars     ;\r
949 \r
950 dbgDE07:\r
951                 INC dbgGPdd1                    ;Next line\r
952                 CMP DWORD PTR dbgGPdd1, 23              ;23 lines yet?\r
953                 JB dbgDE09                              ;No\r
954                 ;\r
955 dbgDE08:\r
956                 PUSH 0                                  ;Col\r
957                 PUSH 24                                 ;Line\r
958                 PUSH OFFSET dbgCont             ;\r
959                 PUSH 31                                 ;length of Cont string\r
960                 PUSH 07h\r
961                 CALL FWORD PTR _PutVidChars     ;\r
962 \r
963                 MOV EAX, OFFSET dbgKeyCode\r
964                 PUSH EAX\r
965                 CALL ReadDbgKbd\r
966                 MOV EAX, dbgKeyCode\r
967                 AND EAX, 0FFh                           ;Lop off key status bytes\r
968                 CMP EAX, 1Bh                        ;Escape (Quit??)\r
969                 JE dbgDEDone\r
970 \r
971                 CMP DWORD PTR dbgGPdd2, nDynEXCH        ; Number of dynamic exchanges\r
972                 JAE dbgDEDone                           ; All Exchs displayed\r
973 \r
974                 CALL FWORD PTR _ClrScr          ;\r
975                 PUSH 0                                          ;Col\r
976                 PUSH 0                                          ;Line for labels\r
977                 PUSH OFFSET dbgExchMsg          ;\r
978                 PUSH 54                                         ;Length of message\r
979                 PUSH 07h\r
980                 CALL FWORD PTR _PutVidChars     ;\r
981                 MOV DWORD PTR dbgGPdd1, 1       ;line. We are on line 1 again\r
982 \r
983 dbgDE09:\r
984                 MOV EBX, dbgGPdd5                       ;Set up to loop for next msg/task\r
985                 XOR EBX, EBX                            ;Another pointer in the link?\r
986                 JZ dbgDE13                                      ;No\r
987                 MOV EAX, dbgGPdd6                       ;\r
988                 OR EAX, EAX                                     ;NonZero if we are doing tasks\r
989                 JNZ dbgDE06                                     ;Tasks\r
990                 JMP dbgDE04                                     ;Messages\r
991 dbgDE13:\r
992                 INC dbgGPdd2                            ; Exch number\r
993                 CMP DWORD PTR dbgGPdd2, nDynEXCH        ; Number of dynamic exchanges\r
994                 JAE dbgDE08                                     ; Go back for prompt (to pause)\r
995                 JMP dbgDE01                                     ; Back to display new exch num\r
996 dbgDEDone:\r
997                 CALL FWORD PTR _ClrScr\r
998                 MOV DWORD PTR dbgX, 0\r
999                 MOV DWORD PTR dbgY, 0\r
1000                 RETN\r
1001 \r
1002 ;===========================\r
1003 ;Displays Tasks that are active along with \r
1004 ;pertinent address info about them\r
1005 \r
1006 dbgDispTasks:\r
1007                 MOV DWORD PTR dbgGPdd2, 1               ;Task# we are on\r
1008 dbgDT00:\r
1009                 CALL FWORD PTR _ClrScr\r
1010                 PUSH 0                                  ;Col\r
1011                 PUSH 0                                  ;Line for labels\r
1012                 PUSH OFFSET dbgTaskMsg  ;\r
1013                 PUSH 54                                 ;Length of message\r
1014                 PUSH 07h\r
1015                 CALL FWORD PTR _PutVidChars     ;\r
1016                 MOV DWORD PTR dbgGPdd1, 1                       ;line we are one\r
1017 \r
1018                 ;First we get pTSS and see if it is valid\r
1019                 ;If so, we get all the data BEFORE we display it\r
1020                 ;If not, we increment TSS number and go back\r
1021                 ;for the next one\r
1022 dbgDT01:\r
1023                 ;We get pJCB out of TSS and get JobNum from JCB\r
1024 \r
1025                 MOV EAX, dbgGPdd2               ; Task number\r
1026                 CMP EAX, 1                              ; Is this TSS 1 (Static memory)\r
1027                 JNE dbgDT02\r
1028                 MOV EBX, OFFSET MonTSS  ;\r
1029                 JMP SHORT dbgDT04\r
1030 dbgDT02:\r
1031                 CMP EAX, 2                              ; Is this TSS 2 (Static memory)\r
1032                 JNE dbgDT03\r
1033                 MOV EBX, OFFSET DbgTSS  ;\r
1034                 JMP SHORT dbgDT04\r
1035 dbgDT03:\r
1036                 MOV EBX, pDynTSSs\r
1037                 DEC EAX                                 ;Make TSS Num offset in dynamic array\r
1038                 DEC EAX                                 ;of TSSs\r
1039                 DEC EAX\r
1040                 MOV ECX, 512\r
1041                 MUL ECX\r
1042                 ADD EBX, EAX                    ;EBX points to TSS!\r
1043 dbgDT04:\r
1044                 ;EBX has pTSS of interest\r
1045                 MOV dbgGPdd5, EBX               ;Save pTSS for display\r
1046                 XOR ECX, ECX                    ;\r
1047                 MOV CL, [EBX+Priority]  ;Priotity of this task\r
1048                 MOV     dbgGPdd6, ECX\r
1049                 MOV EAX, [EBX+TSS_pJCB] ;EAX has pJCB\r
1050                 OR EAX, EAX                             ;NON zero means it's valid\r
1051                 JNZ dbgDT05\r
1052                 MOV EAX, dbgGPdd2               ;Not used, go for next Task number\r
1053                 INC EAX\r
1054                 CMP EAX, nTSS                   ;\r
1055                 JE dbgDT06\r
1056                 MOV dbgGPdd2, EAX\r
1057                 JMP SHORT dbgDT01               ;back for next one\r
1058 dbgDT05:\r
1059                 ;EAX now pJCB\r
1060                 MOV dbgGPdd4, EAX               ;Save pJCB for display\r
1061                 MOV EBX, [EAX]                  ;Job number is first DD in JCB\r
1062                 MOV     dbgGPdd3, EBX\r
1063 \r
1064                 PUSH dbgGPdd2                   ;Convert TSS number for display\r
1065                 PUSH OFFSET dbgBuf\r
1066                 CALL DDtoHex\r
1067                 PUSH 0                                  ;Col\r
1068                 PUSH dbgGPdd1                   ;Line we are one\r
1069                 PUSH OFFSET dbgBuf              ;TaskNum\r
1070                 PUSH 8\r
1071                 PUSH 07h\r
1072                 CALL FWORD PTR _PutVidChars     ;\r
1073 \r
1074                 PUSH dbgGPdd3                   ;Convert and display Job number\r
1075                 PUSH OFFSET dbgBuf              ;\r
1076                 CALL DDtoHex\r
1077                 PUSH 10                                 ;Col\r
1078                 PUSH dbgGPdd1                   ;Line we are one\r
1079                 PUSH OFFSET dbgBuf              ;\r
1080                 PUSH 8                                  ;Size\r
1081                 PUSH 07h\r
1082                 CALL FWORD PTR _PutVidChars     ;\r
1083 \r
1084                 PUSH dbgGPdd4                   ;Convert and display pJCB\r
1085                 PUSH OFFSET dbgBuf              ;\r
1086                 CALL DDtoHex\r
1087                 PUSH 20                                 ;Col\r
1088                 PUSH dbgGPdd1                   ;Line we are one\r
1089                 PUSH OFFSET dbgBuf              ;\r
1090                 PUSH 8                                  ;Size\r
1091                 PUSH 07h\r
1092                 CALL FWORD PTR _PutVidChars     ;\r
1093 \r
1094                 PUSH dbgGPdd5                   ;Convert and display pTSS\r
1095                 PUSH OFFSET dbgBuf              ;\r
1096                 CALL DDtoHex\r
1097                 PUSH 30                                 ;Col\r
1098                 PUSH dbgGPdd1                   ;Line we are one\r
1099                 PUSH OFFSET dbgBuf              ;\r
1100                 PUSH 8                                  ;Size\r
1101                 PUSH 07h\r
1102                 CALL FWORD PTR _PutVidChars     ;\r
1103 \r
1104                 PUSH dbgGPdd6                   ;Convert and display Priority\r
1105                 PUSH OFFSET dbgBuf              ;\r
1106                 CALL DDtoHex\r
1107                 PUSH 40                                 ;Col\r
1108                 PUSH dbgGPdd1                   ;Line we are one\r
1109                 PUSH OFFSET dbgBuf              ;\r
1110                 PUSH 8                                  ;Size\r
1111                 PUSH 07h\r
1112                 CALL FWORD PTR _PutVidChars     ;\r
1113 \r
1114                 MOV EAX, dbgGPdd2               ;go for next Task number\r
1115                 INC EAX\r
1116                 CMP EAX, nTSS                   ;\r
1117                 JE dbgDT06\r
1118                 MOV dbgGPdd2, EAX               ;Save it for the top\r
1119 \r
1120                 INC dbgGPdd1                    ;Next line\r
1121                 CMP DWORD PTR dbgGPdd1, 23              ;23 lines yet?\r
1122                 JAE dbgDT06                             ;Yes, continue prompt\r
1123                 JMP dbgDT01                             ;No, go back for next\r
1124 dbgDT06:\r
1125                 PUSH 0                                  ;Col\r
1126                 PUSH 24                                 ;Line\r
1127                 PUSH OFFSET dbgCont             ;\r
1128                 PUSH 31                                 ;length of Cont string\r
1129                 PUSH 07h\r
1130                 CALL FWORD PTR _PutVidChars     ;\r
1131 \r
1132                 MOV EAX, OFFSET dbgKeyCode\r
1133                 PUSH EAX\r
1134                 CALL ReadDbgKbd\r
1135                 MOV EAX, dbgKeyCode\r
1136                 AND EAX, 0FFh                           ;Lop off key status bytes\r
1137                 CMP EAX, 1Bh                        ;Escape (Quit??)\r
1138                 JE dbgDTDone\r
1139                 JMP dbgDT00                                     ;Back for next screen\r
1140 dbgDTDone:\r
1141                 CALL FWORD PTR _ClrScr\r
1142                 MOV DWORD PTR dbgX, 0\r
1143                 MOV DWORD PTR dbgY, 0\r
1144                 RETN\r
1145 \r
1146 ;=============================================================================\r
1147 ; This is for Debugger Address Info display\r
1148 ; Call with:\r
1149 ;               EAX loaded with address to display (Linear Address)\r
1150 ;               ESI loaded with EA of text line to display\r
1151 ;   We save all registers cause the vid calls don't\r
1152 ;=============================================================================\r
1153 DispAddr:\r
1154                 PUSHAD\r
1155                 PUSH EAX                   ;Save number to display\r
1156 \r
1157                 PUSH ESI                                ;ptr to line\r
1158                 PUSH 06h                                ;Length of line\r
1159                 PUSH 07h                                ;Vid Attribute\r
1160                 CALL FWORD PTR _TTYOut  ;Do it\r
1161 \r
1162                 POP EAX                            ;Get number back for display\r
1163 \r
1164                 PUSH EAX\r
1165                 PUSH OFFSET dbgBuf\r
1166                 CALL DDtoHex\r
1167 \r
1168                 PUSH OFFSET dbgBuf\r
1169                 PUSH 8\r
1170                 PUSH 07h\r
1171                 CALL FWORD PTR _TTYOut\r
1172 \r
1173                 PUSH OFFSET dbgCRLF\r
1174                 PUSH 2\r
1175                 PUSH 07h\r
1176                 CALL FWORD PTR _TTYOut\r
1177 \r
1178                 CALL dbgCheckScroll\r
1179 \r
1180                 POPAD\r
1181                 RETN\r
1182 ;===============================================\r
1183 ;DbgInfo - Displays important linear address for the OS\r
1184 \r
1185 DbgInfo:\r
1186                 MOV ESI,OFFSET DbgM0    ;IDT\r
1187                 LEA EAX, IDT\r
1188                 CALL DispAddr\r
1189                 MOV ESI,OFFSET DbgM1    ;GDT\r
1190                 LEA EAX, GDT\r
1191                 CALL DispAddr\r
1192                 MOV ESI,OFFSET DbgM2    ;RQBs\r
1193                 MOV EAX, pRQBs\r
1194                 CALL DispAddr\r
1195                 MOV ESI,OFFSET DbgM3    ;MonTSS\r
1196                 MOV EAX, OFFSET MonTSS\r
1197                 CALL DispAddr\r
1198                 MOV ESI,OFFSET DbgM4    ;pTSS3\r
1199                 MOV EAX, pDynTSSs\r
1200                 CALL DispAddr\r
1201                 MOV ESI,OFFSET DbgM5    ;LBs\r
1202                 LEA EAX, rgLBs\r
1203                 CALL DispAddr\r
1204                 MOV ESI,OFFSET DbgM6    ;RdyQ\r
1205                 LEA EAX, RdyQ\r
1206                 CALL DispAddr\r
1207                 MOV ESI,OFFSET DbgM7    ;JCBs\r
1208                 MOV EAX, pJCBs\r
1209                 CALL DispAddr\r
1210                 MOV ESI,OFFSET DbgM8    ;SVCs\r
1211                 LEA EAX, rgSVC\r
1212                 CALL DispAddr\r
1213                 MOV ESI,OFFSET DbgM9    ;Exchs\r
1214                 MOV EAX, prgExch\r
1215                 CALL DispAddr\r
1216                 MOV ESI,OFFSET DbgPA    ;PAM (Page Allocation map)\r
1217                 LEA EAX, rgPAM\r
1218                 CALL DispAddr\r
1219                 MOV ESI,OFFSET DbgMB    ;Timer Blocks\r
1220                 LEA EAX, rgTmrBlks\r
1221                 CALL DispAddr\r
1222                 RETN\r
1223 \r
1224 ;=======================================================\r
1225 ;All of the debugger text is displayed in a window\r
1226 ;between colums 0 and 66, and line 0 to 24. The other\r
1227 ;areas are resrved for the menu, query line,\r
1228 ;and the register display.\r
1229 ;This checks to see if the cursor is on line 23.\r
1230 ;If so, we scroll up the text area by one line.\r
1231 \r
1232 dbgCheckScroll:\r
1233                 LEA EAX,dbgX                    ;Query XY (See what line and Col)\r
1234                 PUSH EAX\r
1235                 LEA EAX,dbgY\r
1236                 PUSH EAX\r
1237                 CALL FWORD PTR _GetXY\r
1238                 CMP     DWORD PTR dbgY, 23      ;Are we at bottom (just above menu)??\r
1239                 JB      dbgNoScroll                     ;No, go back for next key\r
1240 \r
1241                 PUSH 0                                  ;Yes, Scroll test area (Col 0-64, Line 0-24)\r
1242                 PUSH 0\r
1243                 PUSH 66                                 ;Columns 0-65\r
1244                 PUSH 24                                 ;Lines 0-23\r
1245                 PUSH 1                                  ;fUp (1)\r
1246                 CALL FWORD PTR _ScrollVid\r
1247 \r
1248                 PUSH 0                                  ;Got to Column 0, Line 22\r
1249                 PUSH 22\r
1250                 CALL FWORD PTR _SetXY\r
1251 dbgNoScroll:\r
1252                 RETN\r
1253 ;\r
1254 ;=======================================================\r
1255 ;Clear the query line (Line 23, 40 chars)\r
1256 \r
1257 dbgClearQuery:\r
1258                 PUSH 0                                  ;Col 0, Line 23\r
1259                 PUSH 23\r
1260                 PUSH OFFSET dbgClear\r
1261                 PUSH 40\r
1262                 PUSH 07h\r
1263                 CALL FWORD PTR _PutVidChars     ;ignore error\r
1264                 RETN\r
1265 \r
1266 ;===================== module end ======================\r