init.asm

来自「Dos6.0」· 汇编 代码 · 共 2,531 行 · 第 1/5 页

ASM
2,531
字号
	MOV	DS, AX
	ASSUME	DS: LAST

	MOV	SI, DI
	LODSB				; Get a character
	MOVZX	BX, AL
	MOVZX	EBX, BYTE PTR case[BX]
	JMP	switch[EBX*4]

Get_H:
	cmp	dword ptr ds:[si-1], 'HGIH' ; Q: HIGHSCAN?
	jne	HMAonParm
	cmp	dword ptr ds:[si+3], 'NACS'
	jne	HMAonParm
	mov	cs:[Highscan], TRUE
	add	si, 7
	jmp	PT_exit

HMAonParm:
	cmp	dword ptr ds:[si],'NOAM';Q: Is it HMAon parameter?
	je	short HMAon		; Y: process it
	LODSB
	CMP	AL, '='			; Is it H=ddd?
	JNE	inv_parm
is_$H:
;
; DX:AX = Get_Decimal(DS:SI);
;
	CMP	[$Hset], 0
	JNE	inv_parm
	CALL	Get_Decimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
	CMP	AX, 2
	JB	inv_parm
	CMP	AX, 255
	JA	inv_parm
	MOV	FS:[total_handles], AX
	MOV	GS:[ttl_hndls], AX
	MOV	[$Hset], NOT 0
	JMP	PT_exit
HMAon:
	add	si,4
	lodsb
	cmp	al,'='			;Q:HMAon=n?
	jne	short HoCont		; N: continue
	call	Get_Decimal		; Y: get minimum HMA size for allocation
	jc	inv_parm
	or	dx,dx			;Q: Invalid number (0<=n<=63)
	jnz	inv_parm		; Y: invalid parameter
	cmp	ax,63                   ;Q: Valid range (0<=n<=63)?
	ja	inv_parm		; N: invalid parameter
	shl	ax,10			; Y: mult by 1024 (1K)
	mov	fs:[HMAmin],ax		; and save for HMA min alloc size
;
;  Make sure this machine needs a virtual HMA
;
HoCont:
	mov	cs:[HMAonSet],TRUE
	mov	ax,8800h
	int	15h
	or	ax,ax
	jnz	short HoMsg
	mov	al,31h
	call	r_cmos
	mov	ah,al
	mov	al,30h
	call	r_cmos
	or	ah,al
	jnz	short HoMsg
	jmp	PT_exit
HoMsg:
	or	gs:[msg_flag],HMAon_MSG
	mov	cs:[HMAonSet],FALSE
	jmp	PT_exit

Get_P_Handle_Page_Frame:		; /
	LODSB
	CMP 	AL,'H'   		; Is it /Hddd?
	je	is_$H
	cmp	al,'P'			; Is it /Phhhh?
	je	short check_$P
	movzx	bx,al			; skip the "/" and continue processing
	movzx	ebx,byte ptr case[bx]
	jmp	switch[ebx*4]

check_$P:
	CMP	AL, 'P'			; Is it /Phhhh?
	JNE	inv_parm
;
; DX:AX = Get_Hexadecimal(DS:SI);
;
	CMP	GS:[PF_Base], FREE	; Q: Has the page frame been set?
	JNE	inv_parm		; Y: bad!
is_$P:
	CALL	Get_Hexadecimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
;
; ZF = Frame_Check(AX, CX);
;
	cmp	cs:[NoPFCset],TRUE	;Q: Check for valid page frame?
	je	short is_$P1		; N: skip check
	mov	cx,numFram		; Total number of valid page frames
	CALL	Frame_Check
	JNZ	inv_parm
is_$P1:
	MOV	GS:[PF_Base], AX
	JMP	PT_exit

Get_Size:				; 0123456789
	cmp	cs:[max_pool_set], TRUE ; Q: Has the max pool size been set?
	je	inv_parm		; Y: error
	DEC	SI
	CALL	Get_Decimal
	JC	inv_parm
	OR	DX, DX
	JZ	SHORT checkAX
	MOV	AX, MAX_SIZE
	JMP	SHORT size_err
checkAX:
	CMP	AX, MIN_SIZE
	JAE	SHORT check_MAX
	MOV	AX, MIN_SIZE
	JMP	SHORT size_err
check_MAX:
	CMP	AX, MAX_SIZE
	JA	SHORT use_MAX
	TEST	AL, 0Fh 		; Q: Is it a multiple of 16K?
	JZ	SHORT size_ok		; Y: Set pool size
	AND	AL, NOT 0Fh		; N: Round it down
	JMP	SHORT size_err
use_MAX:
	MOV	AX, MAX_SIZE
size_err:
	OR	GS:[msg_flag], SIZE_ADJ_MSG
size_ok:
	MOV	cs:[max_pool_size], AX
	mov	cs:[max_pool_set], TRUE
	JMP	PT_exit

Get_Mode_Alt_Reg_Sets:			; A
	LODSB
	CMP	AL, '='
	JNE	SHORT AltBootParm
	CMP	[altRset], 0
	JNE	inv_parm
	CALL	Get_Decimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
	CMP	AX, MAX_ALT_REG_SETS
	JA	inv_parm
	INC	AX
	MOV	FS:[total_register_sets], AL
	MOV	[altRset], NOT 0
	JMP	PT_exit

AltBootParm:
	cmp	dword ptr ds:[si-1], 'OBTL' ; Q: ALTBOOT?
	jne	short check_AUTO
	cmp	word ptr ds:[si+3], 'TO'
	jne	short check_AUTO
	.erre	fTurnOffNOW AND 0FF00h
	or	byte ptr gs:[genflags+1], fTurnOffNOW SHR 8
	add	si, 6
	jmp	PT_exit

check_AUTO:
	CMP	GS:[Initial_Mode], FREE	; Q: Has the mode been set?
	JNE	inv_parm		; Y: bad!
	SUB	SI, 2
	MOV	DI, OFFSET op_auto
	MOV	CX, AUTOLEN
	REPE	CMPSB
	JNZ	inv_parm
	MOV	GS:[Initial_Mode], MODE_AUTO
	JMP	PT_exit
Get_Lowest_Frame:			; B
	CMP	[baseset], 0
	JNE	inv_parm
	LODSB
	CMP	AL, '='
	JNE	inv_parm
	int	12h			; Get conventional memory size QLEO
	shl	ax,6			; In paragraph                 QLEO
	mov	bx,ax			;			       QLEO
	CALL	Get_Hexadecimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
	CMP	AX, 1000h		; At least 1000h
	JB	inv_parm
	cmp	ax,bx			;Q: Check upper limit?         QLEO
	jbe	short GLFcont		; N: OK, continue              QLEO
	mov	ax,bx                   ; Y: Use INT 12h size	       QLEO
;QLEO	CMP	AX, 04000h		; At most 4000h                QLEO
;QLEO	JA	inv_parm                                               QLEO
GLFcont:				;                              QLEO

	ADD	AX, 3FFh		; In case it's between 16K frames
	AND	AX, NOT 3FFh		; Must be 16K increment
	XOR	EBX, EBX
	MOV	BX, R_CODE
	SHL	EBX, 4
	ADD	BX, OFFSET end_of_R_CODE
	SHR	EBX, 4
	ADD	EBX, 3FFh
	AND	EBX, NOT 3FFh
	CMP	BX, AX			; Q: Is the B= below R_CODE?
	JB	SHORT use_original	; N: Use B=
	MOV	AX, BX			; Y: Use window above R_CODE
use_original:
	dec	ax
	mov	cs:[Bparm],ax
	inc	ax
	SHR	AX, 8
	MOV	FS:[strtng_bs_wndw_PTE], AX
	MOV	[baseset], NOT 0
	JMP	PT_exit
Get_DMA_Buffer_Size:			; D
	cmp	dword ptr ds:[si],'TXAM'; DMAXT?
	jne	short GDBScont
	or	fs:[DMAFlags],fDMABuffXT; put DMA buffer in first meg
	add	si,4
	jmp	PT_exit

GDBScont:
	CMP	[bDMAset], 0
	JNE	inv_parm
	LODSB
	CMP	AL, '='
	JNE	inv_parm
	XOR	EAX, EAX
	CALL	Get_Decimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
	CMP	AX, 16
	JB	inv_parm
	CMP	AX, 256
	JA	inv_parm
	SHL	EAX, 10			; In bytes
	MOV	FS:[DMABufferSize], EAX
	MOV	[bDMAset], NOT 0
	JMP	PT_exit
Get_Page_Frame:				; F
	CMP	GS:[PF_Base], FREE	; Q: Has the page frame been set?
	JNE	inv_parm		; Y: Bad!
	DEC	SI			; Compare the whole "FRAME=" string
	MOV	DI, OFFSET frame$
	MOV	CX, framLen
	REPE	CMPSB
	JNZ	inv_parm
	cmp	dword ptr [si],'ENON'	;Q: "FRAME=NONE"
	jne	is_$P			; N: try hexadecimal number
	mov	gs:[NoPFset],TRUE	; Y: mark no page frame
	add	si,4
	jmp	PT_exit
Get_Left_Alone_Size:			; L
	CMP	[ext_mem], FREE
	JNE	inv_parm
	LODSB
	CMP	AL, '='
	JNE	inv_parm
	CALL	Get_Decimal
	JC	inv_parm
	test	dx,not 3Fh		;Q: Greater than 4GB (in KB increments)?
	JNZ	inv_parm		; Y: invalid!
	or	dx,dx			;Q: Greater than 64MB?
	jnz	short GLASok		; Y: OK
	OR	AX, AX			; At least 1 KB
	JZ	inv_parm
GLASok:
	MOV	word ptr [ext_mem], AX
	MOV	word ptr [ext_mem][2],dx
	JMP	PT_exit
NoMoveXBDA:				  ; N undocumented NOMOVEXTBIOS
	cmp	dword ptr ds:[si-1],'OMON';Q: correct switch?
	jne	short NoEMS		  ; N: check for "NOEMS"
	cmp	dword ptr ds:[si+3],'BXEV';Q: correct switch?
	jne	inv_parm		  ; N: Bad!
	cmp	word ptr ds:[si+7],'AD'	  ;Q: correct switch?
	jne	inv_parm		  ; N: Bad!
	or	gs:[GenFlags],fXBDAnotRel ; Y: don't move Extended BIOS data area
	add	si,9
	JMP	PT_exit
NoEMS:
	cmp	dword ptr ds:[si],'SMEO';Q: "NOEMS"?
	jne	short NoINTparm		; N: Check if "NoINT parameter is indicated
	mov	gs:[NoEMSset],TRUE	; Y: set flag
	add	si,4
	jmp	PT_Exit
NoINTparm:
	cmp	dword ptr ds:[si],'TNIO';Q: correct switch?
	jne	short NoLocUMBparm	; N: Check for "NoLocUMBs" parameter.
	or	gs:[GenFlags],fNoINT	; Y: set flag for no interrupts
	add	si,4
	jmp	PT_exit
NoLocUMBparm:
ifndef MSFLAG
	cmp	dword ptr ds:[si],'COLO'  ;Q: correct switch?
	jne	short NoPFCparm		  ; N: Check for "NoPFC" parameter.
	cmp	dword ptr ds:[si+4],'SBMU';Q: correct switch?
	jne	short NoPFCparm		  ; N: Check for "NoPFC" parameter.
	or	gs:[GenFlags],fNoLocUMB   ; Y: set flag for no interrupts
	add	si,8
	jmp	PT_exit
endif
NoPFCparm:
	cmp	dword ptr ds:[si],'CFPO';Q: correct switch?
	jne	NoA20TrapParm		; N: Bad!
	mov	cs:[NoPFCset],TRUE	; Y: Don't check page frame addresses
	add	si,4
	jmp	PT_exit

ifndef LC910611
NoA20TrapParm:
	cmp	dword ptr ds:[si],'02AO'  ;Q: correct switch?
	jne	short NoVCPIparm	  ; N:
	cmp	dword ptr ds:[si+4],'PART';Q: correct switch?
	jne	short NoVCPIparm	  ; N:
	or	gs:[GenFlags],fNoA20Trap  ; Y: don't trap A20 line
	add	si,8
	jmp	PT_exit
endif

NoVCPIparm:
	cmp	dword ptr ds:[si], 'PCVO'   ; Q: NOVCPI?
	jne	short NoHighparm
	cmp	byte ptr ds:[si+4],'I'
	jne	short NoHighparm
	mov	cs:[NoVCPI], TRUE
	add	si, 5
	jmp	PT_exit

NoHighparm:
	cmp	dword ptr ds:[si],'IHO';Q: "NOHI"?
	jne	NoTRparm
	mov	cs:[NoHigh],TRUE	; Y: set flag
	add	si,3
	jmp	PT_Exit

NoTRparm:
	cmp	dword ptr ds:[si],'RTO' ; Q: NOTR?
	jne	inv_parm		; N: Bad!
	mov	cs:[NoTR], TRUE
	add	si, 3
	jmp	PT_exit

Get_M:					; M
	cmp	word ptr ds:[si],'NI'	; Q: MIN=?
	jne	Get_Window_Frame
	add	si, 2
	lodsb
	cmp	al, '='
	jne	inv_parm
	cmp	cs:[min_pool_set], TRUE ; Q: already set min pool size?
	je	inv_parm		; Y: error
	call	Get_Decimal
	jc	inv_parm
	or	dx, dx
	jz	checkMinAX
	mov	ax, MAX_SIZE
	jmp	short min_size_err
checkMinAX:
	cmp	ax, MAX_SIZE
	ja	useMaxPool
	test	al, 0Fh
	jz	short min_size_ok
	and	al, NOT 0Fh
	jmp	short min_size_err
useMaxPool:
	mov	ax, MAX_SIZE
min_size_err:
	or	gs:[msg_flag], SIZE_ADJ_MSG
min_size_ok:
	mov	cs:[min_pool_size], ax
	mov	cs:[min_pool_set], TRUE
	jmp	PT_exit

Get_Window_Frame:			; Mx
	CMP	GS:[PF_Base], FREE	; Q: Has the page frame been set?
	JNE	inv_parm		; Y: Bad!
	CALL	Get_Decimal
	JC	inv_parm
	OR	DX, DX
	JNZ	inv_parm
	OR	AX, AX			; At least 1
	JZ	inv_parm
	CMP	AX, 14			; At most 14
	JA	inv_parm
	MOV	BX, LAST
	MOV	DS, BX
	ASSUME	DS: LAST

	DEC	AX
	ADD	AX, AX
	MOV	BX, AX
	ADD	BX, OFFSET frames
	MOV	AX, [BX]
	MOV	GS:[PF_Base], AX
	JMP	PT_exit
Get_On_Off_Mode:			; O
	CMP	GS:[Initial_Mode], FREE	; Q: Has the mode been set?
	JNE	inv_parm		; Y: Bad!
	DEC	SI			; Retrieve last character
	MOV	BX, SI			; Save SI in case it's not ON
	MOV	DI, OFFSET op_on
	MOV	CX, ONLEN
	REPE	CMPSB
	JNZ	SHORT check_off
	MOV	GS:[Initial_Mode], MODE_ON
	JMP	PT_exit
check_off:
	MOV	SI, BX			; Retrieve SI
	MOV	DI, OFFSET op_off
	MOV	CX, OFFLEN
	REPE	CMPSB
	JNZ	inv_parm
	MOV	GS:[Initial_Mode], MODE_OFF
	JMP	PT_exit
Get_I_Page_Frame:			; P
	CALL	Get_Decimal
	JNC	inv_parm
	CMP	AX, 3			; Q: Is this P0..P3?
	JNA	SHORT check_equal	; Y:
check_254:
	CMP	AX, 254			; Q: Is this in P254..P255?
	JB	inv_parm		; N:
	OR	AH, AH			; Q: Is this in P254..P255?
	JNZ	inv_parm		; N:
	SUB	AX, 250			; Get the proper index
check_equal:
ifdef PICtrap
	cmp	word ptr ds:[si-1],'CI'	;Q: Undocumented "PIC" switch?
	je	short PICVec		; Y: get values
endif
	MOV	BX, AX
	CMP	pn[BX], FREE		; Q: Is this P already set?
	JNE	inv_parm		; Y: error
	CMP	BYTE PTR DS:[SI-1], '='	; Q: Is '=' present?
	JNE	inv_parm		; N: error
	CALL	Get_Hexadecimal		; Retrieve the number following '='
	JC	inv_parm		; If number is invalid, error
	OR	DX, DX			; Q: Is number too big?
	JNZ	inv_parm		; Y: error
	cmp	cs:[NoPFCset],TRUE	;Q: Check for valid page frame?
	je	short PFok		; N: skip check
	MOV	CX, numPFrm		; Total number of valid windows
	CALL	Frame_Check		; Q: Is this P valid?
	JNZ	inv_parm		; N: error
PFok:
	XCHG	AH, AL
	MOV	CX, 6			; Compare this P with others
	MOV	DI, OFFSET pn
	REPNE	SCASB			; Q: Is this P a duplicate?
	JE	inv_parm		; Y: error
pn_okay:
	MOV	Pn[BX], AL		; N: store this P
	BTS	[PnSet], BX		; Set flag for this Pn
	JMP	PT_exit			; Done for this parameter
ifdef PICtrap
PICVec:
	cmp	word ptr ds:[si+1],':S'	;Q: Undocumented "PICS:" switch?
	je	short PICSVec		; Y: get values
	cmp	word ptr ds:[si+1],':M'	;Q: Undocumented "PICM:" switch?
	jne	inv_parm		; N: error
	add	si,3
	call	Get_Hexadecimal
	jc	inv_parm
	mov	gs:[MasterPICVec],ax
	jmp	PT_exit
PICSVec:
	add	si,3
	call	Get_Hexadecimal
	jc	inv_parm
	mov	gs:[SlavePICVec],ax
	jmp	PT_exit
endif

EMSInts:				  ; EMS=FROM-TO
	cmp	dword ptr ds:[si],'NISM'  ;Q: "EMSINTS" switch?
	jne	short EMSrange		  ; N: "EMS=" parameter?
	cmp	word ptr ds:[si+4],'ST'	  ;Q: "EMSINTS" switch?
	jne	short EMSrange		  ; N: "EMS=" parameter?
	add	si,6			  ; Y: get to "=" sign
	and	gs:[GenFlags],not fNoEMSInt ; clear flag for no EMS interrupts
	jmp	PT_exit
EMSrange:				  ; EMS=FROM-TO
	cmp	dword ptr ds:[si-1],'=SME';Q: "EMS=" switch?
	jne	inv_parm		  ; N: invalid parameter
	add	si,2			  ; Y: get to "=" sign
	lea	bx,[EMSSet]
	jmp	GetRange

GetRAM:
	cmp	dword ptr ds:[si-1],'=MOR';Q: "ROM=" switch?
	je	short ROMrange		  ; Y: get range
	cmp	dword ptr ds:[si-1],'=MAR';Q: "RAM=" switch?
	je	short RAMrange		  ; Y: get range
	cmp	word ptr ds:[si],'MO'	;Q: "ROM" switch?
	je	short ROMparam		  ; Y: get range
	cmp	word ptr ds:[si],'MA'	;Q: "RAM" switch?
	jne	inv_parm		; N: invalid parameter

⌨️ 快捷键说明

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