dvdrcode.inc

来自「MMURTL(tm) Computer Operating System Ver」· INC 代码 · 共 341 行

INC
341
字号
;   MMURTL Operating System Source Code
;   Copyright 1991,1992,1993, Richard A. Burgess
;   ALL RIGHTS RESERVED
;   Version x0.8
;
;InitDevDr is called ONCE by a device driver after loading. pDCBs points to
;an array of DCBs (one for each device the driver handles).  The devices
;will be numbered dDevNum, dDevNum+1, etc.
;For example, if the hard disk driver controls two disks it calls it once
;pointing to an array of two DCBs. The DCb must be contiguous in RAM!!
;
;  InitDevDr(dDevNum,  pDCBs,  nDevices, dfReplace):dError
;            EBP+24    EBP+20  EBP+16	 EBP+12     sParam 16
;
;Local vars
dDevX    EQU DWORD PTR [EBP-4]
prgDevs  EQU DWORD PTR [EBP-8]
nDevs    EQU DWORD PTR [EBP-12]
dExchTmp EQU DWORD PTR [EBP-16]

_InitDevDr 	PROC FAR
		PUSH EBP                	;
		MOV EBP,ESP             	;
		SUB ESP, 16
		MOV EAX, [EBP+24]			;Set up local vars
		MOV dDevX, EAX
		MOV EAX, [EBP+20]
		MOV prgDevs, EAX
		MOV EAX, [EBP+16]
		MOV nDevs, EAX

InitDev00:
		CMP dDevX, nDevices			;Valid DCB num?
		JB InitDev01
		MOV EAX, ErcBadDevNum		;Not valid DCB number
		JMP InitDevEnd

InitDev01:	;Now check to see if device is already installed
		;and whether it's to be replaced

		LEA EBX, rgpDCBs			;Point EBX to rgpDCB
		MOV EAX, dDevX				;dDevNum
		SHL EAX, 2
		ADD EBX, EAX
		CMP DWORD PTR [EBX], 0		;pDCBx = 0 if not used yet
		JZ InitDev02				;Empty, OK to use
		CMP DWORD PTR [EBP+12], 0	;OK to replace existing driver?
		JNZ InitDev02				;Yes
		MOV EAX, ErcDCBInUse		;No - error exit
		JMP InitDevEnd

InitDev02:	;If we got here, we can check DCB items then move ptr

		MOV EAX, prgDevs				;EAX points to DCB
		CMP BYTE PTR [EAX.sbDevName],12 ;Check Device name size
		JA InitDev03
		CMP BYTE PTR [EAX.sbDevName], 0 ;is Devname OK?
		JA InitDev04
InitDev03:
		MOV EAX, ErcBadDevName
		JMP InitDevEnd

InitDev04:
		;Now see if there are more devices for this driver

		DEC nDevs					;Decrement nDevices
		JZ InitDev05				;NONE left
		ADD prgDevs, 64				;Next caller DCB
		INC dDevX					;Next devnum
		JMP SHORT InitDev00			;

		;All error checking on DCB(s) should be done at this point

InitDev05:							;Alloc Exch if driver in NOT reentrant
		MOV EBX, [EBP+20]			;pDCBs
		CMP BYTE PTR [EBX.fDevReent], 0
		JNZ InitDev06				;device IS reentrant!
		LEA EAX, dExchTmp			;Allocate device Exchange
		PUSH EAX					;into temp storage
		CALL FAR PTR _AllocExch
		CMP EAX, 0
		JNZ SHORT InitDevEnd

InitDev06:
		;All went OK so far, now move the DCB pointer(s) into array
		; and assign exchange from temp storage to each DCB

		MOV EAX, [EBP+16]			;nDevices
		MOV nDevs, EAX				;Set nDev to number of devices again
		LEA EBX, rgpDCBs			;Point EBX to OS rgpDCBs
		MOV EAX, [EBP+24]			;dDevNum
		SHL EAX, 2
		ADD EBX, EAX				;EBX now points to correct pointer
		MOV EAX, [EBP+20]			;EAX points to first DCB
		MOV ECX, dExchTmp			;ECX has semaphore exchange
InitDev07:
		;Now that EBX, EAX and ECX are set up, loop through each
		;DCB (if more than 1) and set up OS pointer to it, and
		;also place Exchange into DCB.  This is the same exchange
		;for all devices that one driver controls.

		MOV [EAX.DevSemExch], ECX
		MOV	[EBX], EAX
		ADD EBX, 4					;next p in rgp of DCBs
		ADD EAX, 64					;next DCB
		DEC	nDevs
		JNZ InitDev07				;Any more DCBs??
		XOR EAX, EAX				;Set up for no error

		;If the device driver was NOT reentrant
		;we send a semaphore message to the exchange for
		;the first customer to use.

		MOV EBX, [EBP+20]			;pDCBs
		CMP BYTE PTR [EBX.fDevReent], 0
		JNZ InitDev06				;device IS reentrant!
		PUSH ECX					;ECX is still the exchange
		PUSH 0FFFFFFFEh				;Dummy message
		PUSH 0FFFFFFFEh
		CALL FAR PTR _SendMsg		;Let erc in EAX fall through (Was ISend)

InitDevEnd:
		MOV ESP,EBP             	;
		POP EBP                 	;
		RETF 16						;
_InitDevDr	ENDP
;
;=======================================================================
; Device Driver call for DeviceInit.  Some up-front checking is done and
; then this call is forwarded to the destination driver
;
;  DeviceInit(dDevNum, pInitData,  sdInitData);
;             EBP+20   EBP+16      EBP+12         Count = 12
;
_DeviceInit  PROC FAR					;
		PUSH EBP            	    ;
		MOV EBP,ESP         	    ;
		CMP DWORD PTR [EBP+20], nDevices		;Valid Device number?
		JB DevInit01
		MOV EAX, ErcBadDevNum		;Sorry no valid DCB
		JMP DevInitEnd
DevInit01:
		LEA EAX, rgpDCBs
		MOV EBX, [EBP+20]			;
		SHL EBX, 2					;
		ADD EAX, EBX				;
		MOV EBX, [EAX]				;now EBX points to DCB (maybe)
		CMP EBX, 0					;Is there a pointer to a DCB?
		JNZ DevInit1A				;Yes
		MOV EAX, ErcNoDriver		;NO driver!
		JMP DevInitEnd
DevInit1A:
		CMP [EBX.DevType], 0		;Is there a physical device?
		JNZ DevInit02
		MOV EAX, ErcNoDevice
		JMP DevInitEnd

DevInit02:	;All looks good with device number
		;so we check to see if driver is reentrant. If not we
		;call WAIT to get semaphore ticket...

		CMP [EBX.fDevReent], 0
		JNZ DevInit03				;Device IS reentrant
		PUSH EBX					;save ptr to DCB
		PUSH [EBX.DevSemExch]		;Push exchange number
		LEA EAX, [EBX.DevSemMsg]	;Ptr to message area
		PUSH EAX
		CALL FAR PTR _WaitMsg		;Get semaphore ticket
		POP EBX						;Get DCB ptr back
		CMP EAX, 0
		JNE DevInitEnd				;Serious kernel error!

DevInit03:
		PUSH EBX					;Save ptr to DCB
		PUSH DWORD PTR [EBP+20]		;Push all params for call to DD
		PUSH DWORD PTR [EBP+16]
		PUSH DWORD PTR [EBP+12]
		CALL DWORD PTR [EBX.pDevInit]
		POP EBX						;Get ptr to DCB back into EBX
		PUSH EAX					;save error (if any)

		CMP [EBX.fDevReent], 0		;Reentrant?
		JNZ DevInit04				;YES

		PUSH [EBX.DevSemExch]		;No, Send semaphore message to Exch
		PUSH 0FFFFFFFEh				;Bogus Message
		PUSH 0FFFFFFFEh				;
		CALL FAR PTR _SendMsg		;Ignore kernel error (unlikely)
DevInit04:
		POP EAX						;Get device error back

DevInitEnd:
		MOV ESP,EBP             	;
		POP EBP                 	;
		RETF 12                 	;dump params
_DeviceInit	ENDP


;=======================================================================
; Device Driver call for DeviceOp.  Some up-front checking is done and
; then this call is forwarded to the destination driver
;
;  DeviceOp(dDevice, dOpNum, dLBA,   dnBlocks, pData);
;           EBP+28   EBP+24  EBP+20  EBP+16    EBP+12         Count = 20
;
_DeviceOp PROC FAR
		PUSH EBP            	    ;
		MOV EBP,ESP         	    ;
		CMP DWORD PTR [EBP+28], nDevices		;Valid Device number?
		JB DevOp01
		MOV EAX, ErcBadDevNum		;Sorry no valid DCB
		JMP DevOpEnd
DevOp01:
		LEA EAX, rgpDCBs
		MOV EBX, [EBP+28]			;
		SHL EBX, 2					;
		ADD EAX, EBX				;
		MOV EBX, [EAX]				;EBX points to DCB (maybe)
		CMP EBX, 0					;Is there a pointer to a DCB?
		JNZ DevOp1A					;Yes
		MOV EAX, ErcNoDriver		;NO driver!
		JMP DevOpEnd
DevOp1A:
		CMP [EBX.DevType], 0		;Is it valid Device
		JNZ DevOp02
		MOV EAX, ErcNoDevice
		JMP DevOpEnd

DevOp02:	;All looks good with device number
			;so we check to see if driver is reentrant. If not we
			;call WAIT to get semaphore ticket...

		CMP [EBX.fDevReent], 0
		JNZ DevOp03					;Device IS reentrant
		PUSH EBX					;save ptr to DCB
		PUSH [EBX.DevSemExch]		;Push exchange number
		LEA EAX, [EBX.DevSemMsg]	;Ptr to message area
		PUSH EAX
		CALL FAR PTR _WaitMsg		;Get semaphore ticket
		POP EBX						;Get DCB ptr back
		CMP EAX, 0
		JNE DevOpEnd				;Serious kernel error!

DevOp03:
		PUSH EBX					;Save ptr to DCB
		PUSH DWORD PTR [EBP+28]		;Push all params for call to DD
		PUSH DWORD PTR [EBP+24]		;
		PUSH DWORD PTR [EBP+20]
		PUSH DWORD PTR [EBP+16]
		PUSH DWORD PTR [EBP+12]
		CALL DWORD PTR [EBX.pDevOp]
		POP EBX						;Get ptr to DCB back into EBX
		PUSH EAX					;save error (if any)

		CMP [EBX.fDevReent], 0		;Reentrant?
		JNZ DevOp04					;YES
		PUSH [EBX.DevSemExch]		;Send semaphore message to Exch
		PUSH 0FFFFFFFEh				;Bogus Message
		PUSH 0FFFFFFFEh				;
		CALL FAR PTR _SendMsg		;Ignore kernel error
DevOp04:
		POP EAX						;Get device error back

DevOpEnd:
		MOV ESP,EBP             	;
		POP EBP                 	;
		RETF 20                 	;dump params
_DeviceOp	ENDP

;=======================================================================
; Device Driver call for DeviceStat.  Some up-front checking is done and
; then this call is forwarded to the destination driver
;
;  DeviceStat(dDevNum, pStatRet,  dStatMax, pdStatRet);
;             EBP+24   EBP+20     EBP+16    EBP+12      Count = 16
;
_DeviceStat  PROC FAR					;
		PUSH EBP            	    ;
		MOV EBP,ESP         	    ;
		CMP DWORD PTR [EBP+24], nDevices		;Valid Device number?
		JB DevStat01
		MOV EAX, ErcBadDevNum		;Sorry no valid DCB
		JMP DevStatEnd
DevStat01:
		LEA EAX, rgpDCBs			;Ptr to array of ptrs to DCBs
		MOV EBX, [EBP+24]			;Device number
		SHL EBX, 2					;Times 4 (index into 4 byte ptrs)
		ADD EAX, EBX				;Add em up so EAX points to a pointer!
		MOV EBX, [EAX]				;now EBX points to DCB (maybe)
		CMP EBX, 0					;Is there a pointer to a DCB?
		JNZ DevStat1A				;Yes
		MOV EAX, ErcNoDriver		;NO driver!
		JMP DevStatEnd
DevStat1A:
		CMP [EBX.DevType], 0		;Is it valid Device
		JNZ DevStat02
		MOV EAX, ErcNoDevice
		JMP DevStatEnd

DevStat02:	;All looks good with device driver DCB
		;so we check to see if driver is reentrant. If not we
		;call WAIT to get semaphore ticket...

		CMP [EBX.fDevReent], 0
		JNZ DevStat03				;Device IS reentrant
		PUSH EBX					;save ptr to DCB
		PUSH [EBX.DevSemExch]		;Push exchange number
		LEA EAX, [EBX.DevSemMsg]	;Ptr to message area
		PUSH EAX
		CALL FAR PTR _WaitMsg		;Get semaphore ticket
		POP EBX						;Get DCB ptr back
		CMP EAX, 0
		JNE DevStatEnd				;Serious kernel error!

DevStat03:
		PUSH EBX					;Save ptr to DCB
		PUSH DWORD PTR [EBP+24]		;Push all params for call to DD
		PUSH DWORD PTR [EBP+20]
		PUSH DWORD PTR [EBP+16]
		PUSH DWORD PTR [EBP+12]
		CALL DWORD PTR [EBX.pDevSt]
		POP EBX						;Get ptr to DCB back into EBX
		PUSH EAX					;save error (if any)
		CMP [EBX.fDevReent], 0		;Reentrant?
		JNZ DevStat04					;YES
		PUSH [EBX.DevSemExch]		;Send semaphore message to Exch
		PUSH 0FFFFFFFEh				;Bogus Message
		PUSH 0FFFFFFFEh				;Bogus Message
		CALL FAR PTR _SendMsg		;Ignore kernel error (unlikely)
DevStat04:
		POP EAX						;Get device error back

DevStatEnd:
		MOV ESP,EBP             	;
		POP EBP                 	;
		RETF 16                 	;dump params
_DeviceStat	ENDP


;========= END of MODULE ================

⌨️ 快捷键说明

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