📄 dbgcode.inc
字号:
CALL HexToDD ;dbgDumpAdd has address to dump!
CMP EAX, 0
JNE DumpDone
CALL FAR PTR _ClrScr
dbgDump00:
MOV dbgGPdd1, 24 ;line counter begins at 24
dbgDump01:
MOV dbgGPdd3, 4 ;number of quads per line
PUSH dbgDumpAdd ;convert address to text
LEA EAX, dbgBuf
PUSH EAX
CALL DDtoHex
LEA EAX, dbgBuf
PUSH EAX
PUSH 8
PUSH 07h
CALL FAR PTR _TTYOut
CMP EAX, 0
JNE DumpDone
dbgDump02:
MOV dbgGPdd2, 6 ;byte offset begins at 6
LEA EAX, dbgSpace
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut
CMP EAX, 0
JNE DumpDone
MOV EBX, dbgDumpAdd ;get dump address
MOV EAX, [EBX] ;Get what it's pointing to
PUSH EAX ;make it a DD Text
LEA EAX, dbgBuf
PUSH EAX
CALL DDtoHex
MOV AL, dbgfDumpD ;Dumping DWORDS
CMP AL, 0
JE DumpB ;NO - go to display bytes
LEA EAX, dbgBuf ;Yes display Quad
PUSH EAX
PUSH 8
PUSH 07
CALL FAR PTR _TTYOut
JMP DumpDin
dumpB:
LEA EAX, dbgBuf ;Display First byte
ADD EAX, dbgGPdd2
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut ;ignore error
LEA EAX, dbgSpace ;Display 1 spaces
PUSH EAX
PUSH 1
PUSH 07h
CALL FAR PTR _TTYOut
DEC dbgGPdd2 ;point to second 2 bytes
DEC dbgGPdd2
LEA EAX, dbgBuf ;display 2st byte
ADD EAX, dbgGPdd2
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut ;ignore error
LEA EAX, dbgSpace ; display 1 space
PUSH EAX
PUSH 1
PUSH 07h
CALL FAR PTR _TTYOut
DEC dbgGPdd2
DEC dbgGPdd2
LEA EAX, dbgBuf ;display 3rd byte
ADD EAX, dbgGPdd2
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut ;ignore error
LEA EAX, dbgSpace ;a space
PUSH EAX
PUSH 1
PUSH 07h
CALL FAR PTR _TTYOut
DEC dbgGPdd2
DEC dbgGPdd2
LEA EAX, dbgBuf ;display 4th byte
ADD EAX, dbgGPdd2
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut ;ignore error
DumpDin:
INC dbgDumpAdd
INC dbgDumpAdd
INC dbgDumpAdd
INC dbgDumpAdd
DEC dbgGPdd3 ;done with 4 quads??
JNZ dbgDump02 ;NO - go back for next 4 bytes
LEA EAX, dbgSpace ;Yes - Display 2 spaces
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut
LEA EAX,dbgX ;Query XY
PUSH EAX
LEA EAX,dbgY
PUSH EAX
CALL FAR PTR _GetXY
PUSH dbgX ;Put 16 TEXT chars on right
PUSH dbgY
MOV EAX, dbgDumpAdd
SUB EAX, 16
PUSH EAX
PUSH 16
PUSH 07h
CALL FAR PTR _PutVidChars ;ignore error
LEA EAX, dbgCRLF ;Do CR/LF
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut
;
DEC dbgGPdd1 ;23lines yet??
JNZ dbgDump01 ;NO
;
LEA EAX, dbgCont ;"Continue" Text
PUSH EAX
PUSH 31 ;hard coded (FIX ME)
PUSH 07h
CALL FAR PTR _TTYOut
dbgDump03:
MOV EAX, OFFSET dbgKeyCode
PUSH EAX
CALL ReadDbgKbd
MOV EAX, dbgKeyCode
AND EAX, 0FFh ;Lop off key status bytes
CMP EAX, 0
JE dbgDump03
CMP EAX, 1Bh ;Escape (Quit??)
JE DumpDone
LEA EAX, dbgCRLF ;Do CR/LF
PUSH EAX
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut
JMP dbgDump00
;
DumpDone:
CALL FAR PTR _ClrScr
MOV dbgX, 0
MOV dbgY, 0
RETN
;===========================
dbgDispExchs:
MOV dbgGPdd2, 0 ;Exch# we are on
dbgDE00:
CALL FAR PTR _ClrScr
PUSH 0 ;Col
PUSH 0 ;Line for labels
PUSH OFFSET dbgExchMsg ;
PUSH 54 ;Length of message
PUSH 07h
CALL FAR PTR _PutVidChars ;
MOV dbgGPdd1, 1 ;line we are one
;First we do the exchange on the current line
dbgDE01:
PUSH dbgGPdd2 ;Convert Exch number for display
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH 0 ;Col
PUSH dbgGPdd1 ;Line we are one
PUSH OFFSET dbgBuf ;ExchNum
PUSH 8
PUSH 07h
CALL FAR PTR _PutVidChars ;
;Then we do the Exch Owner (Job Number) next to it
MOV EAX, dbgGPdd2 ; Exch number
MOV EDX, sEXCH ; Compute offset of Exch in rgExch
MUL EDX ;
MOV EDX,prgExch ; Add offset of rgExch => EAX
ADD EAX,EDX ; EAX now pts to Exch
MOV dbgGPdd3, EAX ; pExch into save variable
MOV EBX, [EAX.Owner] ; pJCB of Owner into EBX
XOR EAX, EAX ; Clear for use as JobNum
OR EBX, EBX ; pNIL? (No owner if so)
JZ dbgDE03
MOV EAX, [EBX.JobNum] ;
dbgDE03:
PUSH EAX ;Convert Job Number
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH 10 ;Col
PUSH dbgGPdd1 ;Line
PUSH OFFSET dbgBuf ;
PUSH 8
PUSH 07h
CALL FAR PTR _PutVidChars ;
MOV dbgGPdd5, 0 ;Set pNextMsg to 0
;See if there is a first message
MOV EAX, dbgGPdd3 ;pExch -> EAX
MOV EBX, [EAX.fEMsg] ;MsgFlag -> EBX
OR EBX, EBX ;Is is 1 (a message)?
JZ dbgDE05 ;No, Go check for tasks
MOV EBX, [EAX.EHead] ;pMsg -> EBX
OR EBX, EBX ;Is is NIL (no msg)?
JZ dbgDE13 ;Yes. Go to next Exch
;Display Messages
dbgDE04:
MOV dbgGPdd6, 0 ;Flag to indicate we are doing messages
MOV EAX, [EBX.NextLB] ;For next msg in chain (if it exists)
MOV dbgGPdd5, EAX ;Save for loop
MOV EAX, [EBX.DataHi] ;Get dMsg1
MOV EDX, [EBX.DataLo] ;Get dMsg2
PUSH EDX ;Save dMsg2
PUSH EAX ;Convert dMsg1
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH 20 ;Col
PUSH dbgGPdd1 ;Line
PUSH OFFSET dbgBuf ;
PUSH 8
PUSH 07h
CALL FAR PTR _PutVidChars ;
POP EDX ;Get dMsg2 back
;Could have left it on stack, but would be confusing later...
;"simplicity of maintenance is as important as simplicity of design"
PUSH EDX ;Convert dMsg2
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH 30 ;Col
PUSH dbgGPdd1 ;Line
PUSH OFFSET dbgBuf ;
PUSH 8
PUSH 07h
CALL FAR PTR _PutVidChars ;
JMP dbgDE07 ;Next line please
;See if there are tasks waiting
dbgDE05:
MOV dbgGPdd6, 1 ;Flag to indicate we are doing tasks
MOV dbgGPdd5, 0 ;Clear pNextTask
MOV EAX, dbgGPdd3 ;pExch -> EAX
MOV EBX, [EAX.EHead] ;pTSS -> EBX
OR EBX, EBX ;Is is 0 (no TSS)?
JZ dbgDE07 ;
dbgDE06:
MOV EAX, [EBX.NextTSS]
MOV dbgGPdd5, EAX ;Save ptr to next task if it exists
XOR EAX, EAX
MOV AX, [EBX.TSSNum] ;Get Number of Task at exch
PUSH EAX ;Convert Task Number
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH 50 ;Col
PUSH dbgGPdd1 ;Line
PUSH OFFSET dbgBuf ;
PUSH 8
PUSH 07h
CALL FAR PTR _PutVidChars ;
dbgDE07:
INC dbgGPdd1 ;Next line
CMP dbgGPdd1, 23 ;23 lines yet?
JB dbgDE09 ;No
;
dbgDE08:
PUSH 0 ;Col
PUSH 24 ;Line
PUSH OFFSET dbgCont ;
PUSH 31 ;length of Cont string
PUSH 07h
CALL FAR PTR _PutVidChars ;
MOV EAX, OFFSET dbgKeyCode
PUSH EAX
CALL ReadDbgKbd
MOV EAX, dbgKeyCode
AND EAX, 0FFh ;Lop off key status bytes
CMP EAX, 1Bh ;Escape (Quit??)
JE dbgDEDone
CMP dbgGPdd2, nDynEXCH ; Number of dynamic exchanges
JAE dbgDEDone ; All Exchs displayed
CALL FAR PTR _ClrScr ;
PUSH 0 ;Col
PUSH 0 ;Line for labels
PUSH OFFSET dbgExchMsg ;
PUSH 54 ;Length of message
PUSH 07h
CALL FAR PTR _PutVidChars ;
MOV dbgGPdd1, 1 ;line we are on line 1 again
dbgDE09:
MOV EBX, dbgGPdd5 ;Set up to loop for next msg/task
XOR EBX, EBX ;Another pointer in the link?
JZ dbgDE13 ;No
MOV EAX, dbgGPdd6 ;
OR EAX, EAX ;NonZero if we are doing tasks
JNZ dbgDE06 ;Tasks
JMP dbgDE04 ;Messages
dbgDE13:
INC dbgGPdd2 ; Exch number
CMP dbgGPdd2, nDynEXCH ; Number of dynamic exchanges
JAE dbgDE08 ; Go back for prompt (to pause)
JMP dbgDE01 ; Back to display new exch num
dbgDEDone:
CALL FAR PTR _ClrScr
MOV dbgX, 0
MOV dbgY, 0
RETN
;=============================================================================
; This is for Debugger Address Info display
; Call with:
; EAX loaded with address to display (Linear Address)
; ESI loaded with EA of text line to display
; We save all registers cause the vid calls don't
;=============================================================================
DispAddr:
PUSHAD
PUSH EAX ;Save number to display
PUSH ESI ;ptr to line
PUSH 06h ;Length of line
PUSH 07h ;Vid Attribute
CALL FAR PTR _TTYOut ;Do it
POP EAX ;Get number back for display
PUSH EAX
PUSH OFFSET dbgBuf
CALL DDtoHex
PUSH OFFSET dbgBuf
PUSH 8
PUSH 07h
CALL FAR PTR _TTYOut
PUSH OFFSET dbgCRLF
PUSH 2
PUSH 07h
CALL FAR PTR _TTYOut
CALL dbgCheckScroll
POPAD
RETN
;===============================================
;DbgInfo - Displays important linear address for the OS
DbgInfo:
MOV ESI,OFFSET DbgM0 ;IDT
LEA EAX, IDT
CALL DispAddr
MOV ESI,OFFSET DbgM1 ;GDT
LEA EAX, GDT
CALL DispAddr
MOV ESI,OFFSET DbgM2 ;RQBs
MOV EAX, pRQBs
CALL DispAddr
MOV ESI,OFFSET DbgM3 ;MonTSS
MOV EAX, OFFSET MonTSS
CALL DispAddr
MOV ESI,OFFSET DbgM4 ;pTSS3
MOV EAX, pDynTSSs
CALL DispAddr
MOV ESI,OFFSET DbgM5 ;LBs
LEA EAX, rgLBs
CALL DispAddr
MOV ESI,OFFSET DbgM6 ;RdyQ
LEA EAX, RdyQ
CALL DispAddr
MOV ESI,OFFSET DbgM7 ;JCBs
MOV EAX, pJCBs
CALL DispAddr
MOV ESI,OFFSET DbgM8 ;SVCs
LEA EAX, rgSVC
CALL DispAddr
MOV ESI,OFFSET DbgM9 ;Exchs
MOV EAX, prgExch
CALL DispAddr
MOV ESI,OFFSET DbgPA ;PAM (Page Allocation map)
LEA EAX, rgPAM
CALL DispAddr
MOV ESI,OFFSET DbgMB ;Timer Blocks
LEA EAX, rgTmrBlks
CALL DispAddr
RETN
;=======================================================
;All of the debugger text is displayed in a window
;between colums 0 and 66, and line 0 to 24. The other
;areas are resrved for the menu, query line,
;and the register display.
;This checks to see if the cursor is on line 23.
;If so, we scroll up the text area by one line.
dbgCheckScroll:
LEA EAX,dbgX ;Query XY (See what line and Col)
PUSH EAX
LEA EAX,dbgY
PUSH EAX
CALL FAR PTR _GetXY
CMP dbgY, 23 ;Are we at bottom (just above menu)??
JB dbgNoScroll ;No, go back for next key
PUSH 0 ;Yes, Scroll test area (Col 0-64, Line 0-24)
PUSH 0
PUSH 66 ;Columns 0-65
PUSH 24 ;Lines 0-23
PUSH 1 ;fUp (1)
CALL FAR PTR _ScrollVid
PUSH 0 ;Got to Column 0, Line 22
PUSH 22
CALL FAR PTR _SetXY
dbgNoScroll:
RETN
;
;------------------------------------------------
;Clear the query line (Line 23, 40 chars)
dbgClearQuery:
PUSH 0 ;Col 0, Line 23
PUSH 23
PUSH OFFSET dbgClear
PUSH 40
PUSH 07h
CALL FAR PTR _PutVidChars ;ignore error
RETN
;========= module end ============
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -