⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbgcode.inc

📁 MMURTL(tm) Computer Operating System Ver x0.8, source code.
💻 INC
📖 第 1 页 / 共 2 页
字号:
;   MMURTL Operating System Source Code
;   Copyright 1991,1992,1993, Richard A. Burgess
;   ALL RIGHTS RESERVED
;   Version x0.8
;=============================================================================

DbgTask:

		MOV EAX, OFFSET DbgVidSave	;Save number of vid we interrupted
		PUSH EAX
		CALL FAR PTR _GetVidOwner

		STI

		PUSH 2
		CALL FAR PTR _SetVidOwner		;Dbgr is Job 2

		CMP fDbgInit, 0
		JNE DbgInitDone
		CALL FAR PTR _ClrScr
		MOV fDbgInit, 1

DbgInitDone:

		MOV EAX, DbgpTSSSave

		;When a fault or debug exception occurs, the values of
		;the Instruction Pointer, Code Seg, and flags are not the
		;way they were when the exception fired off becuase of the
		;interrupt procedure they enterred to get to the debugger.
		;We make them the same by putting the values we got from
		;the stack (entering the debugger) into the caller's TSS.
		;
		MOV EBX,dbgOldEflgs			;Store correct flags
		MOV [EAX.TSS_EFlags],EBX	;EAX still has DbgpTSSSave
		MOV EBX,dbgOldCS			;Store correct CS
		MOV [EAX.TSS_CS],BX
		MOV EBX,dbgOldEIP			;Store correct EIP
		MOV [EAX.TSS_EIP],EBX
		;
		;NOTE: The "book" says the TF flag is reset by the processor
		; when the handler is entered. This only applies if
		; the handler is a procedure (NOT a task).  The debugger
		; is always entered as a procedure, (we chanage the tasks)
		; so we shouldn't have to reset it.  But we do...
		; I guess I'm not reading it right or ROD SERLING LIVES!
		;
		MOV EBX,[EAX.TSS_EFlags]	;Reset TF in case single steping
		AND EBX,0FFFFFEFFh
		MOV [EAX.TSS_EFlags],EBX

		;We set the FAULT variable based on which interrupt
		;procedure was entered.

		CMP dbgFAULT,0FFh			;Was the dbgr entered on a FAULT?
		JE dbg000					;NO
;
;NOTE: Must add SS/ESP for a change in CPL on faults!!!
;See page 3-4 System Software Writer's Guide

		PUSH 0						;Display fault message and
		PUSH 0						;  and number
		CALL FAR PTR _SetXY

		LEA EAX,dbgFltMsg
		PUSH EAX
		PUSH sdbgFltMsg
		PUSH 40h					;Color Black on RED
		CALL FAR PTR _TTYOut

		MOV EAX,dbgFAULT
		PUSH EAX
		PUSH OFFSET dbgBuf
		CALL DDtoHex

		LEA EAX,dbgBuf
		PUSH EAX
		PUSH 8
		PUSH 70h
		CALL FAR PTR _TTYOut
		MOV dbgFAULT, 0FFh				;reset fault indicator

		LEA EAX,dbgCRLF
		PUSH EAX
		PUSH 2
		PUSH 07h					;Color White on black
		CALL FAR PTR _TTYOut

dbg000:
 		CALL DbgRegVid				;Display BackLink's Register values
		CALL dbgDispMenu			;Display menu
		PUSH dbgX					;Back to where we were
		PUSH dbgY
		CALL FAR PTR _SetXY


		;Display Instruction at CS:EIP
		MOV EBX,DbgpTSSSave			;Get USER pUserTSS
		MOV EAX, [EBX.TSS_EIP]
		PUSH EAX
		CALL _disassemble			;This puts the instruction on the line
		MOV NextEIP, EAX
		CALL dbgCheckScroll

		;No we read the keybaord

dbg00:
		MOV EAX, OFFSET dbgKeyCode
		PUSH EAX
		CALL ReadDbgKbd				;
		MOV EAX, dbgKeyCode
		AND EAX, 0FFh				;Lop off key status bytes

		CMP EAX, 1Bh				;ESCAPE (Exit)
		JE dbgExit

		CMP EAX, 0Fh				;Single Step (F1)
		JNE dbg04
		MOV EBX,DbgpTSSSave			;Get USER pUserTSS
		MOV ECX,[EBX.TSS_EFlags]	;
		OR ECX,00000100h			;Set TF in flags for single step
		MOV [EBX.TSS_EFlags],ECX
		JMP dbgExit

dbg04:
		CMP EAX, 12h				;Return to CS:EIP (F4)
		JNE dbg05
		MOV EBX,DbgpTSSSave			;Get USER pUserTSS
		MOV EAX, [EBX.TSS_EIP]
		PUSH EAX
		CALL _disassemble			;This puts the instruction on the line
		MOV NextEIP, EAX
		CALL dbgCheckScroll			;See if we need to scroll up
		JMP dbg00					;
dbg05:
		CMP EAX, 13h				;Display Exchanges
		JNE dbg06
		CALL dbgDispExchs
		JMP dbg000					;Full display

dbg06:
		CMP EAX, 14h				;Return to CS:EIP (F4)
		JNE dbg08
		JMP dbg00					;
dbg08:
		CMP AL, 16h				 	;Set Disassembly Address (F8)
		JNE dbg09
		CALL dbgSetAddr				;Sets NextEIP
		PUSH dbgX					;Back to where we were
		PUSH dbgY
		CALL FAR PTR _SetXY
		MOV EAX, NextEIP
		PUSH EAX
		CALL _disassemble			;This puts the instruction on the line
		MOV NextEIP, EAX
		CALL dbgCheckScroll			;See if we need to scroll up
		JMP dbg00					;
dbg09:
		CMP AL, 17h				 	;Memory Dump Bytes (F9)
		JNE dbg10
		MOV BL, 00
		MOV dbgfDumpD, BL
		CALL dbgDump				;
		JMP dbg000
dbg10:
		CMP AL, 18h					;Memory Dump DWORDS (F10)
		JNE dbg12
		MOV BL, 0FFh
		MOV dbgfDumpD, BL
		CALL dbgDump				;
		JMP dbg000
dbg12:
		CMP AL, 01Ah				;Info Address dump (F12)
		JNE dbg13
		CALL DbgInfo				;
		JMP dbg00

dbg13:	CMP AL, 02h					;Display next Instruction (Down Arrow)
		JNE dbg14
		MOV EAX, NextEIP
		PUSH EAX
		CALL _disassemble			;This puts the instruction on the line
		MOV NextEIP, EAX
		CALL dbgCheckScroll			;See if we need to scroll up
		JMP dbg00

dbg14:
		JMP dbg00				;GO back for another key

DbgExit:

		LEA EAX,dbgX			;Query XY
		PUSH EAX
		LEA EAX,dbgY
		PUSH EAX
		CALL FAR PTR _GetXY

;		PUSH 1						;KBD IRQ
;		CALL FAR PTR _UnMaskIRQ

		PUSH DbgVidSave
		CALL FAR PTR _SetVidOwner	;Change screens back

		MOV EAX, DbgpTSSSave		;Return saved pRunTSS
		MOV pRunTSS, EAX
		MOV BX, [EAX.Tid]
        MOV TSS_Sel, BX				;Set up caller's TSS selector

		JMP FWORD PTR [TSS]

		;Next time we enter the debugger task it will be here!
		JMP	DbgTask					;Back to begining

;=============================================================================

DbgRegVid:
		MOV EBX,DbgpTSSSave			;EBX MUST be DbgpTSSSave
		MOV ECX,00					;TSS Display
		MOV ESI,OFFSET DbgTxt00
		XOR EAX,EAX
		MOV AX,[EBX.TSSNum]			;Number of this TSS
		CALL DispRegs

		MOV ECX,01					;EAX Display
		MOV ESI,OFFSET DbgTxt01
		MOV EAX,[EBX.TSS_EAX]
		CALL DispRegs

		MOV ECX,02					;EBX Display
		MOV ESI,OFFSET DbgTxt02
		MOV EAX,[EBX.TSS_EBX]
		CALL DispRegs

		MOV ECX,03					;ECX Display
		MOV ESI,OFFSET DbgTxt03
		MOV EAX,[EBX.TSS_ECX]
		CALL DispRegs

		MOV ECX,04					;EDX Display
		MOV ESI,OFFSET DbgTxt04
		MOV EAX,[EBX.TSS_EDX]
		CALL DispRegs

		MOV ECX,05					;ESI Display
		MOV ESI,OFFSET DbgTxt05
		MOV EAX,[EBX.TSS_ESI]
		CALL DispRegs

		MOV ECX,06					;EDI Display
		MOV ESI,OFFSET DbgTxt06
		MOV EAX,[EBX.TSS_EDI]
		CALL DispRegs

		MOV ECX,07					;EBP Display
		MOV ESI,OFFSET DbgTxt07
		MOV EAX,[EBX.TSS_EBP]
		CALL DispRegs

		MOV ECX,08					;SS Display
		MOV ESI,OFFSET DbgTxt08
		XOR EAX,EAX
		MOV AX,[EBX.TSS_SS]
		CALL DispRegs

		MOV ECX,09					;ESP Display
		MOV ESI,OFFSET DbgTxt09
		MOV EAX,[EBX.TSS_ESP]
		CALL DispRegs

		MOV ECX,10					;CS Display
		MOV ESI,OFFSET DbgTxt10
		XOR EAX,EAX
		MOV AX,[EBX.TSS_CS]
		CALL DispRegs

		MOV ECX,11					;EIP Display
		MOV ESI,OFFSET DbgTxt11
		MOV EAX,[EBX.TSS_EIP]
		CALL DispRegs
		MOV ECX,12					;DS Display
		MOV ESI,OFFSET DbgTxt12
		XOR EAX,EAX
		MOV AX,[EBX.TSS_DS]
		CALL DispRegs
		MOV ECX,13					;ES Display
		MOV ESI,OFFSET DbgTxt13
		XOR EAX,EAX
		MOV AX,[EBX.TSS_ES]
		CALL DispRegs
		MOV ECX,14					;FS Display
		MOV ESI,OFFSET DbgTxt14
		XOR EAX,EAX
		MOV AX,[EBX.TSS_FS]
		CALL DispRegs
		MOV ECX,15					;GS Display
		MOV ESI,OFFSET DbgTxt15
		XOR EAX,EAX
		MOV AX,[EBX.TSS_GS]
		CALL DispRegs
		MOV ECX,16					;EFlags Display
		MOV ESI,OFFSET DbgTxt16
		MOV EAX,[EBX.TSS_EFlags]
		CALL DispRegs
		MOV ECX,17					;CR0 Display
		MOV ESI,OFFSET DbgTxt17
		MOV EAX,CR0
		CALL DispRegs
		MOV ECX,18					;CR2 Display
		MOV ESI,OFFSET DbgTxt18
		MOV EAX,CR2
		CALL DispRegs
		MOV ECX,19					;CR3 Display
		MOV ESI,OFFSET DbgTxt19
		MOV EAX,CR3
		CALL DispRegs
		MOV ECX,20					;Fault Error Code Display
		MOV ESI,OFFSET DbgTxt20
		MOV EAX,dbgFltErc
		CALL DispRegs
		RETN
;=============================================================================
;
; This is for Debugger Register display
; Call with: EAX loaded with value to display (from TSS reg)
;		 ECX loaded with number of text line to display on
;		 ESI loaded with EA of text line to display
;   We save all registers cause the vid calls don't
;=============================================================================
DispRegs:
		PUSHAD

		PUSH EAX		   ;Save number to display

		PUSH 66
		PUSH ECX
		CALL FAR PTR _SetXY

		PUSH ESI
		PUSH 05h
		PUSH 07h
		CALL FAR PTR _TTYOut

		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
		POPAD
		RETN
;===========================

dbgDispMenu:
		PUSH 0				;Display Debugger FKey Menu
		PUSH 24
		CALL FAR PTR _SetXY

		LEA EAX,dbgMenu
		PUSH EAX
		PUSH 78
		PUSH 70h
		CALL FAR PTR _TTYOut

		PUSH 25
		PUSH 24
		CALL FAR PTR _SetXY

		LEA EAX,dbgSpace
		PUSH EAX
		PUSH 1
		PUSH 07h
		CALL FAR PTR _TTYOut

		PUSH 51
		PUSH 24
		CALL FAR PTR _SetXY

		LEA EAX,dbgSpace
		PUSH EAX
		PUSH 1
		PUSH 07h
		CALL FAR PTR _TTYOut

		RETN
;===========================

dbgSetAddr:
		PUSH 0						;Goto Query Line
		PUSH 23						;
		CALL FAR PTR _SetXY

		LEA EAX, dbgTxtAddr
		PUSH EAX
		PUSH 16
		PUSH 07h
		CALL FAR PTR _TTYOut
		CMP EAX, 0
		JNE DumpDone

		LEA EAX, DbgBuf2		;
		PUSH EAX				;pEdString
		PUSH cbBufLen2			;Crnt size
		PUSH 8					;Max size
		LEA EAX, cbBufLen2		;
		PUSH EAX				;ptr to size returned
		LEA EAX, dbgChar		;
		PUSH EAX				;ptr to char returned
		PUSH 70h				;Black On White
		CALL FAR PTR _EditLine	;Ignore error if any

		MOV AL, dbgChar			;did they exit with CR?
		CMP AL, 0Dh
		JNE dbgSetAddrDone

		LEA EAX, dbgBuf2		;Convert String to DD
		PUSH EAX				;ptr to string
		LEA EAX, dbgNextAdd
		PUSH EAX				;ptr to destination DD
		PUSH cbBufLen2			;length of string
		CALL HexToDD			;dbgDumpAdd has address to dump!
		CMP EAX, 0
		JNE dbgSetAddrDone

		MOV EAX, dbgNextAdd
		MOV NextEIP, EAX
dbgSetAddrDone:
		CALL dbgClearQuery
		RETN					;Go home...
;===========================

dbgDump:
		PUSH 0						;Goto Query Line
		PUSH 23						;
		CALL FAR PTR _SetXY

		LEA EAX, dbgTxtAddr
		PUSH EAX
		PUSH 16
		PUSH 07h
		CALL FAR PTR _TTYOut
		CMP EAX, 0
		JNE DumpDone

		LEA EAX, DbgBuf2		;
		PUSH EAX				;pEdString
		PUSH cbBufLen2			;Crnt size
		PUSH 8					;Max size
		LEA EAX, cbBufLen2		;
		PUSH EAX				;ptr to size returned
		LEA EAX, dbgChar		;
		PUSH EAX				;ptr to char returned
		PUSH 70h				;Black On White
		CALL FAR PTR _EditLine	;Ignore error if any

		MOV AL, dbgChar			;did they exit with CR?
		CMP AL, 0Dh
		JE dbgDoDump
		CALL dbgClearQuery
		RETN					;Go home...

dbgDoDump:
		LEA EAX, dbgBuf2		;Convert String to DD
		PUSH EAX				;ptr to string
		LEA EAX, dbgDumpAdd
		PUSH EAX				;ptr to destination DD
		PUSH cbBufLen2			;length of string

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -