mirror of https://github.com/AR1972/DOS3.3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
868 lines
23 KiB
868 lines
23 KiB
TITLE BIOS SYSTEM INITIALIZATION
|
|
TRUE EQU 0FFFFh
|
|
FALSE EQU 0
|
|
|
|
;IBMVER EQU TRUE
|
|
;IBM EQU IBMVER
|
|
STACKSW EQU TRUE ;Include Switchable Hardware Stacks
|
|
;IBMJAPVER EQU FALSE ;If TRUE set KANJI true also
|
|
;MSVER EQU FALSE
|
|
;ALTVECT EQU FALSE ;Switch to build ALTVECT version
|
|
;KANJI EQU FALSE
|
|
|
|
INCLUDE version.inc
|
|
|
|
IF IBMJAPVER
|
|
NOEXEC EQU TRUE
|
|
ELSE
|
|
NOEXEC EQU FALSE
|
|
ENDIF
|
|
|
|
DOSSIZE EQU 0A000H
|
|
|
|
.xlist
|
|
include smdossym.inc ; Reduced version of DOSSYM.INC ;3.30
|
|
INCLUDE devsym.inc
|
|
include ioctl.inc
|
|
include BIOSTRUC.INC ;3.30
|
|
.list
|
|
|
|
IF NOT IBMJAPVER
|
|
EXTRN RE_INIT:FAR
|
|
ENDIF
|
|
|
|
SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
|
|
|
|
ASSUME CS:SYSINITSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|
|
|
EXTRN BADOPM:BYTE,CRLFM:BYTE,BADCOM:BYTE,BADMEM:BYTE,BADBLOCK:BYTE
|
|
EXTRN BADSIZ_PRE:BYTE,BADLD_PRE:BYTE
|
|
EXTRN BADSIZ_POST:BYTE,BADLD_POST:BYTE
|
|
EXTRN BADSTACK:BYTE,BADCOUNTRYCOM:BYTE ;3.30
|
|
EXTRN SYSSIZE:BYTE,BADCOUNTRY:BYTE,INSUFMEMORY:BYTE ;3.30
|
|
EXTRN CONDEV:BYTE,AUXDEV:BYTE,PRNDEV:BYTE,COMMND:BYTE,CONFIG:BYTE
|
|
EXTRN Cntry_Drv:BYTE,Cntry_Root:BYTE,Cntry_Path:BYTE ;3.30
|
|
EXTRN DeviceParameters:byte ;3.30
|
|
EXTRN MEMORY_SIZE:word ;3.30
|
|
EXTRN BUFFERS:word ;3.30
|
|
EXTRN FILES:byte,NUM_CDS:byte ;3.30
|
|
EXTRN DOSINFO:dword,ENTRY_POINT:dword ;3.30
|
|
EXTRN FCBS:byte,KEEP:byte ;3.30
|
|
EXTRN CONFBOT:word,ALLOCLIM:word,COMMAND_LINE:byte ;3.30
|
|
EXTRN ZERO:byte,SEPCHR:byte ;3.30
|
|
EXTRN COUNT:word,CHRPTR:word,CNTRYFILEHANDLE:word ;3.30
|
|
EXTRN MEMLO:word,MEMHI:word,PRMBLK:word,LDOFF:word ;3.30
|
|
EXTRN PACKET:byte,UNITCOUNT:byte,BREAK_ADDR:dword ;3.30
|
|
EXTRN BPB_ADDR:dword,DRIVENUMBER:byte,SYSI_COUNTRY:dword ;3.30
|
|
;3.30
|
|
EXTRN MEM_ERR:NEAR,SetDOSCountryInfo:NEAR ;3.30
|
|
EXTRN PARAROUND:NEAR,TEMPCDS:NEAR ;3.30
|
|
EXTRN Set_Country_Path:NEAR,Move_ASCIIZ:NEAR,DELIM:NEAR ;3.30
|
|
EXTRN BADFIL:NEAR,ROUND:NEAR ;3.30
|
|
|
|
IF STACKSW
|
|
;
|
|
; Internal Stack Parameters
|
|
EntrySize equ 8
|
|
|
|
MinCount equ 8
|
|
DefaultCount equ 9
|
|
MaxCount equ 64
|
|
|
|
MinSize equ 32
|
|
DefaultSize equ 128
|
|
MaxSize equ 512
|
|
|
|
extrn stack_count:word ;3.30
|
|
extrn stack_size:word ;3.30
|
|
extrn stack_addr:dword ;3.30
|
|
|
|
ENDIF
|
|
|
|
PUBLIC DOCONF ;3.30
|
|
PUBLIC GETCHR ;3.30
|
|
|
|
;*************************************************************************;3.30
|
|
;Take care of Config.sys file. ;3.30
|
|
|
|
DOCONF:
|
|
PUSH CS
|
|
POP DS
|
|
|
|
ASSUME DS:SYSINITSEG
|
|
|
|
MOV AX,(CHAR_OPER SHL 8) ;GET SWITCH CHARACTER
|
|
INT 21H
|
|
MOV [COMMAND_LINE+1],DL ; Set in default command line
|
|
|
|
MOV DX,OFFSET CONFIG ;NOW POINTING TO FILE DESCRIPTION
|
|
MOV AX,OPEN SHL 8 ;OPEN FILE "CONFIG.SYS"
|
|
STC ;IN CASE OF INT 24
|
|
INT 21H ;FUNCTION REQUEST
|
|
JC ENDCONF ;Wasn't there, or couldn't open ;3.30
|
|
JMP NOPROB ;PROBLEM WITH OPEN
|
|
|
|
ENDCONF: ;3.30
|
|
return ;3.30
|
|
|
|
|
|
BADOP: MOV DX,OFFSET BADOPM ;WANT TO PRINT COMMAND ERROR
|
|
invoke PRINT
|
|
JMP COFF
|
|
|
|
NOPROB: ;GET FILE SIZE (NOTE < 64K!!)
|
|
MOV BX,AX
|
|
XOR CX,CX
|
|
XOR DX,DX
|
|
MOV AX,(LSEEK SHL 8) OR 2
|
|
INT 21H
|
|
MOV [COUNT],AX
|
|
XOR DX,DX
|
|
MOV AX,LSEEK SHL 8 ;Reset pointer to beginning of file
|
|
INT 21H
|
|
MOV DX,CS
|
|
MOV AX,[COUNT]
|
|
call ParaRound
|
|
SUB DX,AX
|
|
SUB DX,11H ;ROOM FOR HEADER
|
|
MOV [CONFBOT],DX ; Config starts here
|
|
CALL TEMPCDS ; Finally get CDS to "safe" location
|
|
ASSUME DS:NOTHING,ES:NOTHING
|
|
|
|
MOV DX,[CONFBOT]
|
|
MOV DS,DX
|
|
MOV ES,DX
|
|
XOR DX,DX
|
|
MOV CX,[COUNT]
|
|
MOV AH,READ
|
|
STC ;IN CASE OF INT 24
|
|
INT 21H ;Function request
|
|
PUSHF
|
|
;
|
|
; Find the EOF mark in the file. If present, then trim length.
|
|
;
|
|
SaveReg <AX,DI,CX>
|
|
MOV AL,1Ah ; eof mark
|
|
MOV DI,DX ; point ro buffer
|
|
JCXZ PutEOL ; no chars
|
|
REPNZ SCASB ; find end
|
|
JNZ PutEOL ; none found and count exahusted
|
|
;
|
|
; We found a 1A. Back up
|
|
;
|
|
DEC DI ; backup past 1A
|
|
;
|
|
; Just for the halibut, stick in an extra EOL
|
|
;
|
|
PutEOL:
|
|
MOV AL,13
|
|
STOSB ; CR
|
|
MOV AL,10
|
|
STOSB ; LF
|
|
SUB DI,DX ; difference moved
|
|
MOV Count,DI ; new count
|
|
;
|
|
; Restore registers
|
|
;
|
|
RestoreReg <CX,DI,AX>
|
|
|
|
PUSH CS
|
|
POP DS
|
|
ASSUME DS:SYSINITSEG
|
|
PUSH AX
|
|
MOV AH,CLOSE
|
|
INT 21H
|
|
POP AX
|
|
POPF
|
|
JC CONFERR ;IF NOT WE'VE GOT A PROBLEM
|
|
CMP CX,AX
|
|
JZ GETCOM ;COULDN'T READ THE FILE
|
|
CONFERR:
|
|
MOV DX,OFFSET CONFIG ;WANT TO PRINT CONFIG ERROR
|
|
CALL BADFIL
|
|
ENDCONV:JMP ENDCONF ;3.30
|
|
|
|
GETCOM:
|
|
invoke ORGANIZE ;ORGANIZE THE FILE
|
|
CALL GETCHR
|
|
|
|
CONFLP: JC ENDCONV ;3.30
|
|
MOV AH,AL
|
|
CALL GETCHR
|
|
JNC TryB
|
|
JMP BADOP
|
|
|
|
COFF: PUSH CS
|
|
POP DS
|
|
invoke NEWLINE
|
|
JMP CONFLP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Buffer command
|
|
;------------------------------------------------------------------------------
|
|
TryB: CMP AH,'B' ;BUFFER COMMAND?
|
|
JNZ TRYC
|
|
invoke GETNUM
|
|
JZ TryBBad ; Gotta have at least one
|
|
CMP AX,100 ; check for max number
|
|
JB SaveBuf
|
|
TryBBad:JMP BadOp
|
|
SaveBuf:
|
|
MOV [BUFFERS],AX
|
|
CoffJ1: JMP COFF
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Break command
|
|
;------------------------------------------------------------------------------
|
|
TryC: CMP AH,'C'
|
|
JZ GOTC
|
|
JMP TRYD
|
|
GOTC:
|
|
CMP AL,'O' ;FIRST LETTER OF "ON" or "OFF"
|
|
JNZ TryCBad
|
|
CALL GETCHR
|
|
JC TryCBad
|
|
CMP AL,'N' ;SECOND LETTER OF "ON"
|
|
JNZ TryCoff
|
|
MOV AH,SET_CTRL_C_TRAPPING ;TURN ON CONTROL-C CHECK
|
|
MOV AL,1
|
|
MOV DL,AL
|
|
INT 21H
|
|
CoffJ2: JMP Coff
|
|
TryCOff:CMP AL,'F'
|
|
JNZ TryCBad ; Check for "OFF"
|
|
CALL GetChr
|
|
JC TryCBad
|
|
CMP AL,'F'
|
|
JZ COffJ2
|
|
TryCBad:JMP BadOp
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Device command
|
|
;------------------------------------------------------------------------------
|
|
TRYD: CMP AH,'D'
|
|
JZ GOTD
|
|
JMP TRYQ
|
|
GOTD: MOV BX,CS
|
|
MOV DS,BX
|
|
|
|
MOV WORD PTR [BPB_ADDR],SI
|
|
MOV WORD PTR [BPB_ADDR+2],ES
|
|
|
|
CALL ROUND
|
|
XOR AX,AX
|
|
MOV WORD PTR [ENTRY_POINT],AX
|
|
MOV AX,[MEMHI]
|
|
MOV WORD PTR [ENTRY_POINT+2],AX ;SET ENTRY POINT
|
|
|
|
IF NOT NOEXEC
|
|
MOV [LDOFF],AX ;SET LOAD OFFSET
|
|
ENDIF
|
|
|
|
PUSH ES
|
|
POP DS
|
|
ASSUME DS:NOTHING
|
|
MOV DX,SI ;DS:DX POINTS TO FILE NAME
|
|
|
|
IF NOEXEC
|
|
LES BX,DWORD PTR CS:[MEMLO]
|
|
CALL LDFIL ;LOAD IN THE DEVICE DRIVER
|
|
ELSE
|
|
; We are going to open the cdevice driver and size it as is done
|
|
; in LDFIL. The reason we must do this is that EXEC does NO checking
|
|
; for us. We must make sure there is room to load the device without
|
|
; trashing SYSINIT. This code is not
|
|
; perfect (for instance .EXE device drivers are possible) because
|
|
; it does its sizing based on the assumption that the file being loaded
|
|
; is a .COM file. It is close enough to correctness to be usable.
|
|
MOV ES,AX ;ES:0 is LOAD addr
|
|
MOV AX,OPEN SHL 8 ;OPEN THE FILE
|
|
STC ;IN CASE OF INT 24
|
|
INT 21H
|
|
JC BADLDRESET
|
|
MOV BX,AX ;Handle in BX
|
|
PUSH DX ; Save pointer to name
|
|
XOR CX,CX
|
|
XOR DX,DX
|
|
MOV AX,(LSEEK SHL 8) OR 2
|
|
STC ;IN CASE OF INT 24
|
|
INT 21H ; Get file size in DX:AX
|
|
JNC GO_AHEAD_LOAD
|
|
MOV AH,CLOSE ; Close file
|
|
INT 21H
|
|
POP DX ; Clean stack
|
|
STC ; Close may clear carry
|
|
JMP SHORT BADLDRESET
|
|
|
|
GO_AHEAD_LOAD:
|
|
; Convert size in DX:AX to para in AX
|
|
ADD AX,15 ; Round up size for conversion to para
|
|
ADC DX,0
|
|
MOV CL,4
|
|
SHR AX,CL
|
|
MOV CL,12
|
|
SHL DX,CL ; Low nibble of DX to high nibble
|
|
OR AX,DX ; AX is now # of para for file
|
|
|
|
MOV CX,ES ; CX:0 is xaddr
|
|
ADD CX,AX ; New device will take up to here
|
|
JC MEM_ERRJY ; WOW!!!!
|
|
CMP CX,CS:[ALLOCLIM]
|
|
JB OKLDX
|
|
MEM_ERRJY:
|
|
JMP MEM_ERR
|
|
|
|
OKLDX:
|
|
POP DX ; Recover name pointer
|
|
MOV AH,CLOSE ; Close file
|
|
INT 21H
|
|
MOV BX,CS
|
|
MOV ES,BX
|
|
MOV BX,OFFSET PRMBLK ;ES:BX POINTS TO PARAMETERS
|
|
MOV AL,3
|
|
MOV AH,EXEC
|
|
STC ;IN CASE OF INT 24
|
|
INT 21H ;LOAD IN THE DEVICE DRIVER
|
|
ENDIF
|
|
|
|
BADLDRESET:
|
|
PUSH DS
|
|
POP ES ;ES:SI BACK TO CONFIG.SYS
|
|
PUSH CS
|
|
POP DS ;DS BACK TO SYSINIT
|
|
ASSUME DS:SYSINITSEG
|
|
JNC GOODLD
|
|
BADBRK:
|
|
cmp byte ptr es:[si], 13 ;file name is CR? ;3.30
|
|
jne BADBRK_1 ;(entered "device=" without filename);3.30 ;3.30
|
|
jmp BADOP ;"Unrecognized command in CONFIG.SYS";3.30
|
|
BADBRK_1: ;3.30
|
|
invoke BADLOAD
|
|
JMP COFF
|
|
|
|
GOODLD: SaveReg <ES,SI> ;INITIALIZE THE DEVICE
|
|
Restore:MOV BL,ES:[SI] ; while ((c=*p) != 0)
|
|
OR BL,BL
|
|
JZ Got
|
|
INC SI ; p++;
|
|
JMP Restore
|
|
Got: MOV BYTE PTR ES:[SI],' ' ; *p = ' ';
|
|
SaveReg <ES,SI>
|
|
PUSH CS
|
|
POP ES
|
|
MOV BX,SDEVSTRAT
|
|
invoke CALLDEV ; CallDev (SDevStrat);
|
|
MOV BX,SDEVINT
|
|
invoke CALLDEV ; CallDev (SDevInt);
|
|
RestoreReg <SI,DS>
|
|
MOV BYTE PTR [SI],0 ; *p = 0;
|
|
|
|
PUSH CS
|
|
POP DS
|
|
MOV AX,WORD PTR [BREAK_ADDR+2]
|
|
CMP AX,[MEMORY_SIZE]
|
|
JB BREAKOK
|
|
POP SI
|
|
POP ES
|
|
JMP BADBRK
|
|
|
|
BREAKOK:
|
|
LDS DX,[ENTRY_POINT] ;SET DS:DX TO HEADER
|
|
MOV SI,DX
|
|
ADD SI,SDEVATT ;DS:SI POINTS TO ATTRIBUTES
|
|
LES DI,CS:[DOSINFO] ;ES:DI POINT TO DOS INFO
|
|
MOV AX,DS:[SI] ;GET ATTRIBUTES
|
|
TEST AX,DEVTYP ;TEST IF BLOCK DEV
|
|
JZ ISBLOCK
|
|
invoke SET_BREAK ; Go ahead and alloc mem for device
|
|
jc Erase_Dev ;dev driver's Init routine failed ;3.30
|
|
TEST AX,ISCIN ;IS IT A CONSOLE IN?
|
|
JZ TRYCLK
|
|
MOV WORD PTR ES:[DI.SYSI_CON],DX
|
|
MOV WORD PTR ES:[DI.SYSI_CON+2],DS
|
|
|
|
TRYCLK: TEST AX,ISCLOCK ;IS IT A CLOCK DEVICE?
|
|
JZ GOLINK
|
|
MOV WORD PTR ES:[DI+SYSI_CLOCK],DX
|
|
MOV WORD PTR ES:[DI+SYSI_CLOCK+2],DS
|
|
GOLINK: JMP LINKIT
|
|
|
|
ISBLOCK:
|
|
MOV AL,CS:[UNITCOUNT] ;IF NO UNITS FOUND, erase the device
|
|
OR AL,AL
|
|
JNZ PERDRV
|
|
ERASE_DEV:
|
|
MOV AX,-1 ; No call to SET_BREAK yet, so no alloc
|
|
JMP ENDDEV
|
|
|
|
PERDRV:
|
|
CBW ; WARNING NO DEVICE > 127 UNITS
|
|
MOV CX,AX
|
|
MOV DH,AH
|
|
MOV DL,ES:[DI.SYSI_NUMIO] ;GET NUMBER OF DEVICES
|
|
MOV AH,DL
|
|
ADD AH,AL ; Check for too many devices
|
|
CMP AH,26 ; 'A' - 'Z' is 26 devices
|
|
JBE OK_BLOCK
|
|
PUSH CS
|
|
POP DS
|
|
MOV DX,OFFSET BADBLOCK
|
|
invoke PRINT
|
|
JMP ERASE_DEV
|
|
|
|
OK_BLOCK:
|
|
invoke SET_BREAK ; Alloc the device
|
|
ADD ES:[DI.SYSI_NUMIO],AL ;UPDATE THE AMOUNT
|
|
ADD CS:DriveNumber,AL ; remember amount for next device
|
|
LDS BX,CS:[BPB_ADDR] ;POINT TO BPB ARRAY
|
|
PERUNIT:
|
|
LES BP,CS:[DOSINFO]
|
|
LES BP,DWORD PTR ES:[BP.SYSI_DPB] ;GET FIRST DPB
|
|
|
|
SCANDPB:CMP WORD PTR ES:[BP.DPB_NEXT_DPB],-1
|
|
JZ FOUNDPB
|
|
LES BP,ES:[BP.DPB_NEXT_DPB]
|
|
JMP SCANDPB
|
|
FOUNDPB:
|
|
MOV AX,CS:[MEMLO]
|
|
MOV WORD PTR ES:[BP.DPB_NEXT_DPB],AX
|
|
MOV AX,CS:[MEMHI]
|
|
MOV WORD PTR ES:[BP.DPB_NEXT_DPB+2],AX
|
|
LES BP,DWORD PTR CS:[MEMLO]
|
|
ADD WORD PTR CS:[MEMLO],DPBSIZ
|
|
CALL ROUND ;Check for alloc error
|
|
MOV WORD PTR ES:[BP.DPB_NEXT_DPB],-1
|
|
MOV ES:[BP.DPB_FIRST_ACCESS],-1
|
|
|
|
MOV SI,[BX] ;DS:SI POINTS TO BPB
|
|
INC BX
|
|
INC BX ;POINT TO NEXT GUY
|
|
MOV WORD PTR ES:[BP.DPB_DRIVE],DX
|
|
MOV AH,SETDPB ;HIDDEN SYSTEM CALL
|
|
INT 21H
|
|
MOV AX,ES:[BP.DPB_SECTOR_SIZE] ;3.30
|
|
PUSH ES ;3.30
|
|
LES DI,CS:[DOSINFO] ;ES:DI POINT TO DOS INFO ;3.30
|
|
CMP AX,ES:[DI.SYSI_MAXSEC] ;3.30
|
|
POP ES ;3.30
|
|
JBE NOTMAX ;3.30
|
|
POP SI ;3.30
|
|
POP ES ;3.30
|
|
MOV DX,OFFSET BADSIZ_PRE ;3.30
|
|
MOV BX,OFFSET BADSIZ_POST ;3.30
|
|
invoke PRNERR ;3.30
|
|
JMP COFF ;3.30
|
|
|
|
NOTMAX: PUSH DS
|
|
PUSH DX
|
|
LDS DX,CS:[ENTRY_POINT]
|
|
MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR],DX
|
|
MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR+2],DS
|
|
POP DX
|
|
POP DS
|
|
INC DX
|
|
INC DH
|
|
LOOP PERUNIT
|
|
PUSH CS
|
|
POP DS
|
|
CALL TEMPCDS ; Set CDS for new drives
|
|
|
|
LINKIT:
|
|
LES DI,CS:[DOSINFO] ;ES:DI = DOS TABLE
|
|
MOV CX,WORD PTR ES:[DI.SYSI_DEV] ;DX:CX = HEAD OF LIST
|
|
MOV DX,WORD PTR ES:[DI.SYSI_DEV+2]
|
|
|
|
LDS SI,CS:[ENTRY_POINT] ;DS:SI = DEVICE LOCATION
|
|
MOV WORD PTR ES:[DI.SYSI_DEV],SI ;SET HEAD OF LIST IN DOS
|
|
MOV WORD PTR ES:[DI.SYSI_DEV+2],DS
|
|
MOV AX,DS:[SI] ;GET POINTER TO NEXT DEVICE
|
|
MOV WORD PTR CS:[ENTRY_POINT],AX ;AND SAVE IT
|
|
|
|
MOV WORD PTR DS:[SI],CX ;LINK IN THE DRIVER
|
|
MOV WORD PTR DS:[SI+2],DX
|
|
ENDDEV:
|
|
POP SI
|
|
POP ES
|
|
INC AX ;AX = FFFF (no more devs if YES)?
|
|
JZ COFFJ3
|
|
JMP GOODLD ;OTHERWISE PRETEND WE LOADED IT IN
|
|
COFFJ3: JMP COFF
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Country command
|
|
; The syntax is: ;3.30
|
|
; COUNTRY=country id {,codepage {,path}} ;3.30
|
|
; COUNTRY=country id {,,path} :Default CODEPAGE ID in DOS ;3.30
|
|
;------------------------------------------------------------------------------
|
|
TRYQ:
|
|
CMP AH,'Q' ;3.30
|
|
JZ TRYQ_CONT ;3.30
|
|
JMP TRYF ;3.30
|
|
TRYQ_CONT: ;3.30
|
|
invoke GETNUM ;3.30
|
|
JZ TryQBad ; 0 is never a valid code, or number is;3.30
|
|
; bad ;3.30
|
|
MOV BX,AX ; Country code in BX ;3.30
|
|
;3.30
|
|
; 5/26/86 ;3.30
|
|
MOV DX,0 ; assume no code page id ;3.30
|
|
;3.30
|
|
invoke skip_delim ;skip the delimeters after the first nu;3.30m
|
|
jc TryQ_Def_File ;no more characters left? then use defa;3.30ult file
|
|
cmp al, 13 ; ;3.30
|
|
je TryQ_Def_File ;3.30
|
|
cmp al, 10 ;3.30
|
|
jne TRYQ_YES_EXTENDED ;3.30
|
|
inc [COUNT] ;This is for NEWLINE routine in COFF. ;3.30
|
|
dec [CHRPTR] ;3.30
|
|
COFFJ41: ;3.30
|
|
JMP TryQ_Def_File ;O.K. no code page, no path specified. ;3.30Use default path.
|
|
;3.30
|
|
TRYQ_YES_EXTENDED: ;3.30
|
|
cmp al, ',' ;was the second comma? ;3.30
|
|
jne TryQ_GETNUM ;3.30
|
|
invoke skip_delim ;Yes, skip ',' and other possible delim;3.30
|
|
jmp short TRYQ_PATH ;and No code page id entered. ;3.30
|
|
TRYQ_GETNUM: ;3.30
|
|
invoke GETNUM ;3.30
|
|
jc TryQBadCOM ;"Country=xxx,path" will not be accepte;3.30d.
|
|
; jc TRYQ_PATH ;Codepage is not specified. No code pag;3.30e.
|
|
; ;At this point, AL already contain the ;3.30
|
|
; ;first char of the PATH. ;3.30
|
|
jz TryQBad ;codepage=0 entered. Error ;3.30
|
|
mov DX, AX ;save code page in DX ;3.30
|
|
invoke skip_delim ;move CHRPTR to the path string ;3.30
|
|
jc TryQ_Def_File ;no more char? then use default filenam;3.30e
|
|
cmp al, 13 ;3.30
|
|
je TryQ_Def_File ;3.30
|
|
cmp al, 10 ;3.30
|
|
jne TryQ_PATH ;path entered. ;3.30
|
|
inc [COUNT] ;3.30
|
|
dec [CHRPTR] ;3.30
|
|
TryQ_Def_File: ;3.30
|
|
push dx ;save code page ;3.30
|
|
mov cs:CNTRY_DRV, 0 ;flag that the default path has been us;3.30ed!!!
|
|
mov dx, offset CNTRY_ROOT ;the default path ;3.30
|
|
jmp TRYQ_OPEN ;3.30
|
|
;3.30
|
|
TryQBad: ;"Invalid country code or code page" ;3.30
|
|
STC ;3.30
|
|
MOV DX,OFFSET BADCOUNTRY ;3.30
|
|
jmp TryQChkErr ;3.30
|
|
;3.30
|
|
TryQBadCOM: ;Error in COUNTRY command ;3.30
|
|
STC ;3.30
|
|
MOV DX,OFFSET BADCOUNTRYCOM ;3.30
|
|
jmp TryQChkErr ;3.30
|
|
;3.30
|
|
TRYQ_PATH: ;DS - sysinitseg, ES - CONFBOT, ;3.30
|
|
mov CX, [COUNT] ;AL - the first char of path ;3.30
|
|
inc CX ;BX - country id, DX - codepage id, 0 =;3.30 No code page
|
|
mov DI, SI ;3.30
|
|
TRYQ_PATH_LOOP: ;find the end of path to put 0 after th;3.30at.
|
|
mov AL, byte ptr ES:[DI] ;3.30
|
|
call delim ;3.30
|
|
jz TRYQ_PATH_END ;3.30
|
|
cmp al, 13 ;3.30
|
|
jz TRYQ_PATH_END ;3.30
|
|
inc DI ;3.30
|
|
jmp short TRYQ_PATH_LOOP ;3.30
|
|
TryQBad_Brg:jmp short TryQBad ;3.30
|
|
TRYQ_PATH_END: ;3.30
|
|
mov es:byte ptr [di], 0 ;make it a ASCIIZ string. (Organize did;3.30 not handle this string)
|
|
push ds ;switch ds,es ;3.30
|
|
push es ;3.30
|
|
pop ds ;3.30
|
|
pop es ;3.30
|
|
;3.30
|
|
mov di, offset CNTRY_DRV ;move the user specified path to CNTRY_;3.30DRV
|
|
call Move_ASCIIZ ;3.30
|
|
;3.30
|
|
push ds ;restore ds,es ;3.30
|
|
push es ;3.30
|
|
pop ds ;3.30
|
|
pop es ;3.30
|
|
;3.30
|
|
; call Set_Country_Path ;set CNTRY_DRV ;3.30
|
|
;3.30
|
|
push dx ;save DX ;3.30
|
|
mov dx, offset CNTRY_DRV ;Now DS:DX -> CNTRY_DRV ;3.30
|
|
TRYQ_OPEN: ;3.30
|
|
mov ax, 3d00h ;open a file ;3.30
|
|
stc ;3.30
|
|
int 21h ;3.30
|
|
pop dx ;restore codepage id ;3.30
|
|
jc TryQFileBad ;open failure ;3.30
|
|
;3.30
|
|
mov cs:CntryFileHandle, ax ;save file handle ;3.30
|
|
xchg ax, bx ;now, AX = country id, BX = file handle;3.30
|
|
mov cx, cs:[MEMHI] ;3.30
|
|
add cx, 128 ;I need 2K buffer to handle COUNTRY.SYS;3.30
|
|
cmp cx, cs:[ALLOCLIM] ;3.30
|
|
ja TryQMemory ;cannot allocate the buffer for country;3.30.sys
|
|
;3.30
|
|
mov si, offset CNTRY_DRV ;DS:SI -> CNTRY_DRV ;3.30
|
|
cmp byte ptr [si],0 ;default path? ;3.30
|
|
jne TRYQ_Set_for_DOS ;3.30
|
|
inc si ;3.30
|
|
inc si ;DS:SI -> CNTRY_ROOT ;3.30
|
|
TRYQ_Set_for_DOS: ;3.30
|
|
les di, cs:SYSI_Country ;ES:DI -> country info tab in DOS ;3.30
|
|
push di ;save di ;3.30
|
|
add di, ccPath_CountrySys ;3.30
|
|
call MOVE_ASCIIZ ;Set the path to COUNTRY.SYS in DOS. ;3.30
|
|
pop di ;ES:DI -> country info tab again. ;3.30
|
|
mov cx, cs:[MEMHI] ;3.30
|
|
mov ds, cx ;3.30
|
|
xor si, si ;DS:SI -> 2K buffer to be used. ;3.30
|
|
call SetDOSCountryInfo ;now do the job!!! ;3.30
|
|
jnc TryQchkERR ;read error or could not find country,c;3.30ode page combination
|
|
cmp cx, -1 ;Could not find matching country_id,cod;3.30e page?
|
|
je TryQBad_Brg ;then "Invalid country code or code pag;3.30e"
|
|
TryQFileBad: ;3.30
|
|
cmp cs:CNTRY_DRV,0 ;Is the default file used? ;3.30
|
|
je TryQDefBad ;3.30
|
|
mov si, cs:[CONFBOT] ;3.30
|
|
mov es, si ;3.30
|
|
mov si, cs:[CHRPTR] ;3.30
|
|
dec si ;ES:SI -> path in CONFBOT ;3.30
|
|
jmp short TryQBADLOAD ;3.30
|
|
TryQDefBad: ;Default file has been used. ;3.30
|
|
push cs ;3.30
|
|
pop es ;3.30
|
|
mov si, offset CNTRY_ROOT ;ES:SI -> \COUNTRY.SYS in SYSINIT_SEG ;3.30
|
|
TryQBADLOAD: ;3.30
|
|
call BADLOAD ;DS will be restored to SYSINIT_SEG ;3.30
|
|
mov cx, cs:[CONFBOT] ;3.30
|
|
mov es, cx ;Restore ES -> CONFBOT. ;3.30
|
|
jmp short CoffJ4 ;3.30
|
|
TryQMemory: ;3.30
|
|
MOV DX,OFFSET INSUFMEMORY ;3.30
|
|
TryQChkErr: ;3.30
|
|
mov cx, cs:[CONFBOT] ;3.30
|
|
mov es, cx ;restore ES -> CONFBOT seg ;3.30
|
|
push cs ;3.30
|
|
pop ds ;retore DS to SYSINIT_SEG ;3.30
|
|
jnc CoffJ4 ;if no error, then exit ;3.30
|
|
invoke PRINT ;else show error message ;3.30
|
|
CoffJ4: ;3.30
|
|
mov bx, CntryFileHandle ;3.30
|
|
mov ah, 3eh ;3.30
|
|
int 21h ;close a file. Don't care even if it fa;3.30ils.
|
|
JMP COFF ;3.30
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Files command
|
|
;------------------------------------------------------------------------------
|
|
TRYF:
|
|
CMP AH,'F'
|
|
JNZ TRYL
|
|
invoke GETNUM
|
|
CMP AX,5
|
|
JB TryFBad ; Gotta have at least 5
|
|
CMP AX,256
|
|
JAE TryFBad ; Has to be a byte
|
|
MOV [FILES],AL
|
|
CoffJ5: JMP COFF
|
|
TryFBad:JMP BadOp
|
|
;------------------------------------------------------------------------------
|
|
; LastDrive command
|
|
;------------------------------------------------------------------------------
|
|
TRYL:
|
|
CMP AH,'L'
|
|
JNZ TRYP
|
|
OR AL,020h
|
|
SUB AL,'a'
|
|
JB TryLBad
|
|
INC AL
|
|
CMP AL,26 ; a-z are allowed
|
|
JA TryLBad
|
|
MOV [NUM_CDS],AL
|
|
CoffJ6: JMP COFF
|
|
TryLBad:JMP BadOp
|
|
;-------------------------------------------------------------------------------
|
|
; Setting Drive Parameters
|
|
;-------------------------------------------------------------------------------
|
|
TRYP:
|
|
CMP AH,'P'
|
|
JNZ TRYK
|
|
invoke PARSELINE
|
|
JC TryLBad
|
|
invoke SETPARMS
|
|
INVOKE DIDDLEBACK
|
|
jc TryLBad
|
|
JMP COFF
|
|
;-------------------------------------------------------------------------------
|
|
; Setting Internal Stack Parameters
|
|
; STACK=M,N where
|
|
; M is the number of stacks (range 8 to 64, default 9)
|
|
; N is the stack size (range 32 to 512 bytes, default 128)
|
|
; 5/5/86: STACKS=0,0 implies no stack installation. ;3.30
|
|
; Any combinations that are not within the specified limits will ;3.30
|
|
; result in "Unrecognized command" error. ;3.30
|
|
;-------------------------------------------------------------------------------
|
|
TRYK:
|
|
CMP AH,'K'
|
|
JNZ TRYW
|
|
|
|
IF STACKSW ;3.30
|
|
|
|
MOV SepChr,','
|
|
INVOKE GetNum ; Get number of stacks
|
|
MOV SepChr,0
|
|
cmp ax, 0 ; 5/5/86 ;3.30
|
|
je TRYK_0 ; Let's accept 0. ;3.30
|
|
CMP AX, MinCount ; 8 <= Number of Stacks <= 64
|
|
JB TryKBad
|
|
CMP AX, MaxCount
|
|
JA TryKBad
|
|
TRYK_0: ;3.30
|
|
MOV [STACK_COUNT], AX
|
|
;
|
|
; Skip delimiters after the ,
|
|
;
|
|
invoke Skip_delim ; ;3.30
|
|
JC TryKBad
|
|
|
|
INVOKE GetNum ; Get size of individual stack
|
|
JC TryKBad ; Number bad
|
|
|
|
cmp ax, 0 ; 5/5/86 ;3.30
|
|
je TRYK_SIZE0 ; 5/5/86. Accept 0 ;3.30
|
|
|
|
CMP AX, MinSize ; 32 <= Stack Size <= 512
|
|
JB TryKBad
|
|
CMP AX, MaxSize
|
|
JA TryKBad
|
|
TRYK_SIZE0: ;3.30
|
|
MOV [STACK_SIZE], AX
|
|
cmp ax,0 ;3.30
|
|
je TRYK_BOTH0 ;3.30
|
|
TRYK_OK: ;3.30
|
|
mov word ptr [stack_addr], -1 ;set flag. user entered stacks= ;3.30
|
|
JMP COFF
|
|
TRYK_BOTH0: ;3.30
|
|
cmp [STACK_COUNT],0 ;stack_size=0. Stack_Count=0 too? ;3.30
|
|
je TRYK_OK ;yes. accepted. ;3.30
|
|
TryKBad:
|
|
MOV DX, OFFSET BADSTACK ; 5/26/86 "Invalid stack parameter";3.30
|
|
invoke PRINT ;3.30
|
|
JMP COFF ;3.30
|
|
|
|
ENDIF ;3.30
|
|
;------------------------------------------------------------------------------
|
|
; Switch command
|
|
;------------------------------------------------------------------------------
|
|
TRYW:
|
|
CMP AH,'W'
|
|
JNZ TRYA
|
|
JMP BadOp ; no longer implemented
|
|
; MOV DL,AL
|
|
; MOV AX,(CHAR_OPER SHL 8) OR 1 ;SET SWITCH CHARACTER
|
|
; MOV [COMMAND_LINE+1],DL
|
|
; INT 21H
|
|
; JMP COFF
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Availdev command
|
|
;------------------------------------------------------------------------------
|
|
TRYA:
|
|
CMP AH,'A'
|
|
JNZ TRYS
|
|
JMP BadOp ; NO LONGER IMPLEMENTED
|
|
; CMP AL,'F' ;FIRST LETTER OF "FALSE"
|
|
; JNZ COFFJ7
|
|
; MOV AX,(CHAR_OPER SHL 8) OR 3 ;TURN ON "/DEV" PREFIX
|
|
; XOR DL,DL
|
|
; INT 21H
|
|
;COFFJ7: JMP COFF
|
|
|
|
;------------------------------------------------------------------------------
|
|
; shell command
|
|
;------------------------------------------------------------------------------
|
|
TRYS:
|
|
CMP AH,'S'
|
|
JNZ TRYX
|
|
MOV [COMMAND_LINE+1],0
|
|
MOV DI,OFFSET COMMND + 1
|
|
MOV [DI-1],AL
|
|
STORESHELL:
|
|
CALL GETCHR
|
|
OR AL,AL
|
|
JZ GETSHPARMS
|
|
CMP AL," "
|
|
JB ENDSH
|
|
MOV [DI],AL
|
|
INC DI
|
|
JMP STORESHELL
|
|
|
|
ENDSH:
|
|
MOV BYTE PTR [DI],0
|
|
CALL GETCHR
|
|
CMP AL,10
|
|
JNZ CONV
|
|
CALL GETCHR
|
|
CONV: JMP CONFLP
|
|
|
|
;------------------------------------------------------------------------------
|
|
; FCBS Command
|
|
;------------------------------------------------------------------------------
|
|
TRYX:
|
|
CMP AH,'X'
|
|
JNZ TRYZ
|
|
invoke GETNUM
|
|
JZ TryXBad ; gotta have at least one
|
|
CMP AX,256
|
|
JAE TryXBad ; Can't be more than 8 bits worth
|
|
MOV [FCBS],AL
|
|
;
|
|
; Skip delimiters after the ,
|
|
;
|
|
invoke Skip_delim ; ;3.30
|
|
jc tryxbad
|
|
invoke GetNum
|
|
JC TryXBad ; Number bad (Zero is OK here)
|
|
CMP AX,256
|
|
JAE TryXBad
|
|
CMP AL,FCBS
|
|
JA TryXBad
|
|
MOV Keep,AL
|
|
JMP COFF
|
|
TryXBad:JMP BadOp
|
|
|
|
;------------------------------------------------------------------------------
|
|
; Bogus command
|
|
;------------------------------------------------------------------------------
|
|
TRYZ:
|
|
JMP BADOP
|
|
|
|
GETSHPARMS:
|
|
MOV BYTE PTR [DI],0
|
|
MOV DI,OFFSET COMMAND_LINE+1
|
|
PARMLOOP:
|
|
CALL GETCHR
|
|
CMP AL," "
|
|
JB ENDSH
|
|
MOV [DI],AL
|
|
INC DI
|
|
JMP PARMLOOP
|
|
|
|
GETCHR:
|
|
PUSH CX
|
|
MOV CX,COUNT
|
|
JCXZ NOCHAR
|
|
MOV SI,CHRPTR
|
|
MOV AL,ES:[SI]
|
|
DEC COUNT
|
|
INC CHRPTR
|
|
CLC
|
|
GET_RET:
|
|
POP CX
|
|
return
|
|
NOCHAR: STC
|
|
JMP SHORT GET_RET
|
|
|
|
|
|
SYSINITSEG ENDS
|
|
END
|
|
|