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

📄 dmacode.inc

📁 MMURTL(tm) Computer Operating System Ver x0.8, source code.
💻 INC
字号:
;   MMURTL Operating System Source Code
;   Copyright 1991,1992,1993, Richard A. Burgess
;   ALL RIGHTS RESERVED
;   Version x0.8
;========== DMA Equates for DMA amd PAGE registers =========
;NOTES:  Withm 8 bit DMA, the lower WORD (bits 15-0) are placed into
; the address registers of the DMA, and the Page register is the next
; most significant byte (bits 23-16). With WORD DMA moves (channels 5-7),
; address bits 16-1 are placed in the address registers, while 23-17 are
; put in the page register.  Bit 16 is ignored by the page register.
;
;
; DMA 1 Port addresses and page registers

DMA10Add	EQU  00h	;Ch 0 Address
DMA10Cnt	EQU  01h	;Ch 0 Word Count
DMA11Add	EQU  02h	;Ch 1 Address
DMA11Cnt	EQU  03h	;Ch 1 Word Count
DMA12Add	EQU  04h	;Ch 2 Address
DMA12Cnt	EQU  05h	;Ch 2 Word Count
DMA13Add	EQU  06h	;Ch 3 Address
DMA13Cnt	EQU  07h	;Ch 3 Word Count
DMA1StatCmd	EQU  08h	;Read Status/Write Command
DMA1RqReg	EQU  09h	;Read/Write DMA Rq Register
DMA1RCmdWbm	EQU  0Ah	;Read Command/Write Single bit mask
DMA1Mode	EQU  0Bh	;Read/Write Mode register
DMA1FF		EQU  0Ch	;Writing this address clears byte ptr flip flop
DMA1Clear	EQU  0Dh	;Write causes MASTER Clear (Read from Temp Reg)
DMA1ClrMode	EQU  0Eh	;Rd clears mode reg count/Wr Clr ALL mask bits
DMA1MskBts	EQU  0Fh	;Read/Write DMA Rq Mask Register

; DMA 2 Port addresses

DMA20Add	EQU  0C0h    	;Ch 0 Address
DMA20Cnt	EQU  0C2h    	;Ch 0 Word Count
DMA21Add	EQU  0C4h    	;Ch 1 Address
DMA21Cnt	EQU  0C6h    	;Ch 1 Word Count
DMA22Add	EQU  0C8h    	;Ch 2 Address
DMA22Cnt	EQU  0CAh    	;Ch 2 Word Count
DMA23Add	EQU  0CCh    	;Ch 3 Address
DMA23Cnt	EQU  0CEh    	;Ch 3 Word Count
DMA2StatCmd	EQU  0D0h    	;Read Status/Write Command
DMA2RqReg	EQU  0D2h    	;Read/Write DMA Rq Register
DMA2RCmdWbm	EQU  0D4h    	;Read Command/Write Single bit mask
DMA2Mode	EQU  0D6h    	;Read/Write Mode register
DMA2FF		EQU  0D8h    	;Writing this address clears byte ptr flip flop
DMA2Clear	EQU  0DAh    	;Write causes MASTER Clear (Read from Temp Reg)
DMA2ClrMode	EQU  0DCh    	;Rd clears mode reg count/Wr Clr ALL mask bits
DMA2MskBts	EQU  0DEh    	;Read/Write DMA Rq Mask Register

;DMA Page register by DRQ/DACK number

DMAPage0	EQU 87h		;DMA DACK0 Page register
DMAPage1	EQU 83h		;    DACK1 (etc. etc. etc.)
DMAPage2	EQU 81h
DMAPage3	EQU 82h
DMAPage5	EQU 8Bh
DMAPage6	EQU 89h
DMAPage7	EQU 8Ah
;
; The following code sets up the initial DMA channel values for
; both chips to most probable use. Includes cascade mode for CH4
; which is DMA channel 0 on chip 2
;
InitDMA PROC NEAR
	MOV AL, 04				;Master disable
	OUT	DMA1StatCmd, AL
	OUT	DMA2StatCmd, AL

	XOR AL, AL				;MASTER CLEAR (same as hardware reset)
	OUT DMA1Clear, AL
	OUT DMA2Clear, AL

	XOR AL, AL				;All commands set to default (0)
	OUT	DMA1StatCmd, AL
	OUT	DMA2StatCmd, AL

	MOV AL, 40h				;CH 0 DMA 1
	OUT	DMA1Mode, AL		;
	MOV AL, 0C0h			;CH 0 DMA 2  (Cascade Mode)
	OUT	DMA2Mode, AL		;

	MOV AL, 41h				;CH 1 DMA 1 & 2
	OUT	DMA1Mode, AL		;
	OUT	DMA2Mode, AL		;

	MOV AL, 42h				;CH 2 DMA 1 & 2
	OUT	DMA1Mode, AL		;
	OUT	DMA2Mode, AL		;

	MOV AL, 43h				;CH 3 DMA 1 & 2
	OUT	DMA1Mode, AL		;
	OUT	DMA2Mode, AL		;

	XOR AL,AL
	OUT DMA1ClrMode, AL  	;Enable ALL DMA 1 Channels
	OUT DMA2ClrMode, AL  	;Enable ALL DMA 2 Channels
	RETN

InitDMA ENDP
;
;
; The following code sets up a single DMA channel for the caller.
; DMA is crippled because it can't move across 64K physical
; boundries. It's the caller's responsibility to know if he is
; crossing a boundry! If he does, this will wrap around over the segment!!!
; This code is completely reentrant.
; There is only one call for DMA set up.

; The caller sets the type of DMA operation (In, Out, Verify).
; For channels 5,6 & 7, the address & count must be divided by
; two for the DMA hardware. This routine does this for you!
; Algorythm - Put mode byte bits (except channel bits) in BL, then jump to
; correct routine for that channel. The call will allow set up of
; all the differnet types of DMA modes for read and write with this
; single call.	The call:
;
;	DmaSetUp(dPhyMem, sdMem, dChannel, dType, dMode)
; 	   EBP+  28       24     20        16     12
;
;	dPhyMem is physical memory address
;	sdMem is nBytes to move (STILL bytes for word xfers, we do math)
;	dChannel (0,1,2,3,5,6,7)
;	dType - 0 = Verify, 1 = In (Write Mem), 2 = Out (Read memory)
;	dMode - 0 Demand Mode, 1 Single Cycle,     (Disk I/O uses 1)
;			2 Block, 3 Cascade
;
;
_DMASetUp	PROC FAR
		PUSH EBP                ;
		MOV EBP,ESP             ;
		MOV EAX, [EBP+12]		; dMode
		CMP EAX, 04				; Mode must be < 4
		JB DMAModeOK
		MOV EAX, ErcDMAMode
		JMP DMAEnd
DMAModeOK:
		SHL EAX, 6				; Move Mode bits to 6 and 7
		MOV BL, AL				; Put it in BL
		MOV EAX, [EBP+16]		; get dType
		AND BL, 0C0h			; Set to Verify by default (low bits 0)
		CMP EAX, 0				; Check fType (Verify?)
		JE DMASelect			; Yes
		CMP EAX, 1				; In? (Write)
		JE DMAWrite				; Yes (if no then fall thru to Read)
DMARead:
		OR BL,	00001000b		; OR read command to BL (OUT)
		JMP DMASelect
DMAWrite:
		OR BL, 00000100b		; OR write command to BL (IN)

DMASelect:
		MOV EAX, [EBP+20]
		CMP EAX, 0				;
		JE DMA0
		CMP EAX, 1
		JE DMA1
		CMP EAX, 2
		JE DMA2
		CMP EAX, 3
		JE DMA3
		CMP EAX, 5
		JE DMA5
		CMP EAX, 6
		JE DMA6
		CMP EAX, 7
		JE DMA7
		MOV EAX, ErcDMAChannel
		JMP DMAEnd

DMA0:
		CLI
		MOV AL,	00000100b		; channel 0 Set Mask for DRQ
		OUT DMA1RCmdWbm, AL		;
		MOV AL,	00000000b		; CH0 (CH is last 2 bits)
		OR  AL, BL				; OR with MODE
		OUT DMA1Mode, AL
		OUT DMA1FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		OUT DMA10Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA10Add, AL		; Hi Byte
		SHR EAX, 8
		OUT DMAPage0, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]
		DEC EAX
		OUT DMA10Cnt, AL
		SHR EAX, 8
		OUT DMA10Cnt, AL
		MOV AL,	00000000b		; channel 0 Clear Mask for DRQ
		OUT DMA1RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd

DMA1:
		CLI
		MOV AL,	00000101b		; channel 1 Set Mask for DRQ
		OUT DMA1RCmdWbm, AL
		MOV AL, 00000001b		; CH1
		OR  AL, BL				; OR with MODE/TYPE
		OUT DMA1Mode, AL
		OUT DMA1FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		OUT DMA11Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA11Add, AL		; Hi Byte
		SHR EAX, 8
		OUT DMAPage1, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		DEC EAX
		OUT DMA11Cnt, AL
		SHR EAX, 8
		OUT DMA11Cnt, AL
		MOV AL,	00000001b		; channel 1 Clear Mask for DRQ
		OUT DMA1RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd

DMA2:
		CLI
		MOV AL,	00000110b		; channel 2 Set Mask for DRQ
		OUT DMA1RCmdWbm, AL
		MOV AL, 00000010b		; CH2
		OR  AL, BL				; OR with MODE
		OUT DMA1Mode, AL
		OUT DMA1FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		OUT DMA12Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA12Add, AL		; Hi Byte
		SHR EAX, 8
		OUT DMAPage2, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		DEC EAX
		OUT DMA12Cnt, AL
		SHR EAX, 8
		OUT DMA12Cnt, AL
		MOV AL,	00000010b		; channel 2 Clear Mask for DRQ
		OUT DMA1RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd

DMA3:
		CLI
		MOV AL,	00000111b		; channel 3 Set Mask for DRQ
		OUT DMA1RCmdWbm, AL
		MOV AL, 00000011b		; CH3
		OR  AL, BL				; OR with MODE
		OUT DMA1Mode, AL
		OUT DMA1FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		OUT DMA13Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA13Add, AL		; Hi Byte
		SHR EAX, 8
		OUT DMAPage3, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		DEC EAX
		OUT DMA13Cnt, AL
		SHR EAX, 8
		OUT DMA13Cnt, AL
		MOV AL,	00000011b		; channel 3 Clear Mask for DRQ
		OUT DMA1RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd

;NOTE: DMA channels 5-7 are on DMA2 and numbered 1-3 for chip select purposes

DMA5:
		CLI
		MOV AL,	00000101b		; channel 1 DMA2 Set Mask for DRQ
		OUT DMA2RCmdWbm, AL
		MOV AL, 00000001b		; CH1 on DMA 2
		OR  AL, BL				; OR with MODE
		OUT DMA2Mode, AL
		OUT DMA2FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		MOV EBX, EAX			; Save EBX for page
		AND EAX, 0FFFFh			; Rid of all but lower 16
		SHR EAX, 1				; DIV by 2 for WORD Xfer (bits 16-1)
		OUT DMA21Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA21Add, AL		; Hi Byte
		MOV EAX, EBX
		SHR EAX, 15				; We only need 23-17 for the page
		OUT DMAPage5, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		SHR EAX, 1				; DIV by 2 for WORD Xfer
		DEC EAX					; One less word
		OUT DMA21Cnt, AL
		SHR EAX, 8
		OUT DMA21Cnt, AL
		MOV AL, 00000001b		; channel 1 Clear Mask for DRQ
		OUT DMA2RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd
;
DMA6:
		CLI
		MOV AL, 00000110b		; channel 2 Set Mask for DRQ
		OUT DMA2RCmdWbm, AL
		MOV AL, 00000010b		; CH2 on DMA 2
		OR  AL, BL				; OR with MODE
		OUT DMA2Mode, AL
		OUT DMA2FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		MOV EBX, EAX
		AND EAX, 0FFFFh			; Rid of all but lower 16
		SHR EAX, 1				; DIV by 2 for WORD Xfer
		OUT DMA22Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA22Add, AL		; Hi Byte
		MOV EAX, EBX
		SHR EAX, 15
		OUT DMAPage6, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		SHR EAX, 1				; DIV by 2 for WORD Xfer
		DEC EAX
		OUT DMA22Cnt, AL
		SHR EAX, 8
		OUT DMA22Cnt, AL
		MOV AL,	00000010b		; channel 2 Clear Mask for DRQ
		OUT DMA2RcmdWbm, AL
		STI
		XOR EAX, EAX
		JMP DMAEnd
;
DMA7:
        CLI
		MOV AL,	00000111b		; channel 3 Set Mask for DRQ
		OUT DMA2RCmdWbm, AL
		MOV AL, 00000011b		; CH3 on DMA 2
		OR  AL, BL				; OR with MODE
		OUT DMA2Mode, AL
        OUT DMA2FF, AL			; Clear FlipFLop (Val in AL irrelevent)
		MOV EAX, [EBP+28]		; dPhyMem
		MOV EBX, EAX
		AND EAX, 0FFFFh			; Rid of all but lower 16
		SHR EAX, 1				; DIV by 2 for WORD Xfer
		OUT DMA23Add, AL		; Lo byte address
		SHR EAX, 8
		OUT DMA23Add, AL		; Hi Byte
		MOV EAX, EBX
		SHR EAX, 15
		OUT DMAPage6, AL		; Highest byte (to page register)
		MOV EAX, [EBP+24]		; sdMem
		SHR EAX, 1				; DIV by 2 for WORD Xfer
		DEC EAX
		OUT DMA23Cnt, AL
		SHR EAX, 8
		OUT DMA23Cnt, AL
		MOV AL,	00000011b		; channel 3 Clear Mask for DRQ
		OUT DMA2RcmdWbm, AL
		STI
		XOR EAX, EAX
DMAEnd:
		MOV ESP,EBP             ;
		POP EBP                 ;
		RETF 20                 ; 20 bytes of crap to dump
_DMASetUp	ENDP

;=========== module end ==============

⌨️ 快捷键说明

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