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 + -
显示快捷键?