DOS 3.30 source code leak
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

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