1610 lines
32 KiB
NASM
1610 lines
32 KiB
NASM
page ,160
|
||
title bios system initialization
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; Modification history
|
||
;
|
||
; 26-Feb-1991 sudeepb Ported for NT DOSEm
|
||
;----------------------------------------------------------------------------
|
||
|
||
|
||
include version.inc ; set version build flags
|
||
include biosseg.inc ; establish bios segment structure
|
||
|
||
lf equ 10
|
||
cr equ 13
|
||
tab equ 9
|
||
|
||
; the following depends on the positions of the various letters in switchlist
|
||
|
||
switchnum equ 11111000b ; which switches require number
|
||
|
||
include syscall.inc
|
||
include doscntry.inc
|
||
include devsym.inc
|
||
include ioctl.inc
|
||
include devmark.inc ; needed
|
||
|
||
|
||
stacksw equ true ;include switchable hardware stacks
|
||
|
||
if ibmjapver
|
||
noexec equ true
|
||
else
|
||
noexec equ false
|
||
endif
|
||
|
||
|
||
sysinitseg segment public
|
||
|
||
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 dosinfo:dword
|
||
extrn memory_size:word,fcbs:byte,keep:byte
|
||
extrn default_drive:byte,confbot:word,alloclim:word
|
||
extrn buffers:word,zero:byte,sepchr:byte
|
||
extrn files:byte
|
||
extrn count:word,chrptr:word
|
||
extrn bufptr:byte,memlo:word,prmblk:byte,memhi:word
|
||
extrn ldoff:word,area:word,packet:byte,unitcount:byte,
|
||
extrn break_addr:dword,bpb_addr:dword,drivenumber:byte
|
||
extrn com_level:byte, cmmt:byte, cmmt1:byte, cmmt2:byte
|
||
extrn cmd_indicator:byte
|
||
extrn donotshownum:byte
|
||
extrn multdeviceflag:byte
|
||
extrn devmark_addr:word
|
||
extrn setdevmarkflag:byte
|
||
extrn org_count:word
|
||
|
||
extrn pararound:near
|
||
extrn getchr:near
|
||
extrn stall:near
|
||
extrn error_line:near
|
||
|
||
extrn DevEntry:dword
|
||
|
||
insert_blank db 0 ; M051: indicates that blank has been
|
||
; M051: inserted
|
||
|
||
public int24,open_dev,organize,mem_err,newline,calldev,badload
|
||
public prndev,auxdev,config,commnd,condev,getnum,badfil,prnerr
|
||
public round,delim,print
|
||
public parseline,
|
||
public setdoscountryinfo,set_country_path,move_asciiz
|
||
public cntry_drv,cntry_root,cntry_path
|
||
public delim
|
||
public pathstring
|
||
|
||
public MseDev ; NTVDM internal mouse driver
|
||
|
||
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : parseline
|
||
;
|
||
; entry point is parseline. al contains the first character in command line.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
parseline proc near
|
||
; don't get character first time
|
||
push ds
|
||
|
||
push cs
|
||
pop ds
|
||
assume ds:sysinitseg
|
||
|
||
nextswtch:
|
||
cmp al,cr ; carriage return?
|
||
jz done_line
|
||
cmp al,lf ; linefeed?
|
||
jz put_back ; put it back and done
|
||
|
||
; anything less or equal to a space is ignored.
|
||
|
||
cmp al,' ' ; space?
|
||
jbe get_next ; skip over space
|
||
cmp al,'/'
|
||
jz getparm
|
||
stc ; mark error invalid-character-in-input
|
||
jmp short exitpl
|
||
|
||
getparm:
|
||
call check_switch
|
||
mov word ptr switches,bx ; save switches read so far
|
||
jc swterr
|
||
|
||
get_next:
|
||
call getchr
|
||
jc done_line
|
||
jmp nextswtch
|
||
|
||
swterr:
|
||
jmp short exitpl ; exit if error
|
||
|
||
done_line:
|
||
test word ptr switches,flagdrive ; see if drive specified
|
||
jnz okay
|
||
stc ; mark error no-drive-specified
|
||
jmp short exitpl
|
||
|
||
okay:
|
||
; mov ax,word ptr switches
|
||
; and ax,0003h ; get flag bits for changeline and non-rem
|
||
; mov word ptr deviceparameters.dp_deviceattributes,ax
|
||
; mov word ptr deviceparameters.dp_tracktableentries, 0
|
||
; clc ; everything is fine
|
||
; call setdeviceparameters
|
||
exitpl:
|
||
pop ds
|
||
ret
|
||
|
||
put_back:
|
||
inc count ; one more char to scan
|
||
dec chrptr ; back up over linefeed
|
||
jmp short done_line
|
||
|
||
parseline endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : check_switch
|
||
;
|
||
; processes a switch in the input. it ensures that the switch is valid, and
|
||
; gets the number, if any required, following the switch. the switch and the
|
||
; number *must* be separated by a colon. carry is set if there is any kind of
|
||
; error.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
check_switch proc near
|
||
|
||
call getchr
|
||
jc err_check
|
||
and al,0dfh ; convert it to upper case
|
||
cmp al,'A'
|
||
jb err_check
|
||
cmp al,'Z'
|
||
ja err_check
|
||
|
||
push es
|
||
|
||
push cs
|
||
pop es
|
||
|
||
mov cl,byte ptr switchlist ; get number of valid switches
|
||
mov ch,0
|
||
mov di,1+offset switchlist ; point to string of valid switches
|
||
repne scasb
|
||
|
||
pop es
|
||
jnz err_check
|
||
|
||
mov ax,1
|
||
shl ax,cl ; set bit to indicate switch
|
||
mov bx,word ptr switches ; get switches so far
|
||
or bx,ax ; save this with other switches
|
||
mov cx,ax
|
||
test ax, switchnum ; test against switches that require number to follow
|
||
jz done_swtch
|
||
|
||
call getchr
|
||
jc err_swtch
|
||
|
||
cmp al,':'
|
||
jnz err_swtch
|
||
|
||
call getchr
|
||
push bx ; preserve switches
|
||
mov byte ptr cs:sepchr,' ' ; allow space separators
|
||
call getnum
|
||
mov byte ptr cs:sepchr,0
|
||
pop bx ; restore switches
|
||
|
||
; because getnum does not consider carriage-return or line-feed as ok, we do
|
||
; not check for carry set here. if there is an error, it will be detected
|
||
; further on (hopefully).
|
||
|
||
call process_num
|
||
|
||
done_swtch:
|
||
clc
|
||
ret
|
||
|
||
err_swtch:
|
||
xor bx,cx ; remove this switch from the records
|
||
err_check:
|
||
stc
|
||
ret
|
||
|
||
check_switch endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : process_num
|
||
;
|
||
; this routine takes the switch just input, and the number following (if any),
|
||
; and sets the value in the appropriate variable. if the number input is zero
|
||
; then it does nothing - it assumes the default value that is present in the
|
||
; variable at the beginning. zero is ok for form factor and drive, however.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
process_num proc near
|
||
test word ptr switches,cx ; if this switch has been done before,
|
||
jnz done_ret ; ignore this one.
|
||
test cx,flagdrive
|
||
jz try_f
|
||
mov byte ptr drive,al
|
||
jmp short done_ret
|
||
|
||
try_f:
|
||
test cx,flagff
|
||
jz try_t
|
||
|
||
; ensure that we do not get bogus form factors that are not supported
|
||
|
||
; mov byte ptr deviceparameters.dp_devicetype,al
|
||
jmp short done_ret
|
||
|
||
try_t:
|
||
or ax,ax
|
||
jz done_ret ; if number entered was 0, assume default value
|
||
test cx,flagcyln
|
||
jz try_s
|
||
|
||
; mov word ptr deviceparameters.dp_cylinders,ax
|
||
jmp short done_ret
|
||
|
||
try_s:
|
||
test cx,flagseclim
|
||
jz try_h
|
||
mov word ptr slim,ax
|
||
jmp short done_ret
|
||
|
||
; must be for number of heads
|
||
|
||
try_h:
|
||
mov word ptr hlim,ax
|
||
|
||
done_ret:
|
||
clc
|
||
ret
|
||
|
||
process_num endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : organize
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
assume ds:nothing, es:nothing
|
||
organize proc near
|
||
|
||
mov cx,[count]
|
||
jcxz nochar1
|
||
call mapcase
|
||
xor si,si
|
||
mov di,si
|
||
xor ax,ax
|
||
mov com_level, 0
|
||
|
||
;org1: call get ;skip leading control characters
|
||
; cmp al,' '
|
||
; jb org1
|
||
org1:
|
||
call skip_comment
|
||
jz end_commd_line ; found a comment string and skipped.
|
||
call get2 ; not a comment string. then get a char.
|
||
cmp al, lf
|
||
je end_commd_line ; starts with a blank line.
|
||
cmp al, ' '
|
||
jbe org1 ; skip leading control characters
|
||
jmp short findit
|
||
|
||
end_commd_line:
|
||
stosb ; store line feed char in buffer for the linecount.
|
||
mov com_level, 0 ; reset the command level.
|
||
jmp org1
|
||
|
||
nochar1:
|
||
stc
|
||
ret
|
||
|
||
findit:
|
||
push cx
|
||
push si
|
||
push di
|
||
mov bp,si
|
||
dec bp
|
||
mov si,offset comtab ;prepare to search command table
|
||
mov ch,0
|
||
findcom:
|
||
mov di,bp
|
||
mov cl,[si]
|
||
inc si
|
||
jcxz nocom
|
||
repe cmpsb
|
||
lahf
|
||
add si,cx ;bump to next position without affecting flags
|
||
sahf
|
||
lodsb ;get indicator letter
|
||
jnz findcom
|
||
cmp byte ptr es:[di], cr ;the next char might be cr,lf
|
||
je gotcom0 ; such as in "rem",cr,lf case.
|
||
cmp byte ptr es:[di], lf
|
||
je gotcom0
|
||
push ax
|
||
mov al, byte ptr es:[di] ;now the next char. should be a delim.
|
||
call delim
|
||
pop ax
|
||
jnz findcom
|
||
gotcom0:
|
||
pop di
|
||
pop si
|
||
pop cx
|
||
jmp short gotcom
|
||
|
||
nocom:
|
||
pop di
|
||
pop si
|
||
pop cx
|
||
mov al,'Z'
|
||
stosb ; save indicator char.
|
||
skip_line:
|
||
call get2
|
||
cmp al, lf ; skip this bad command line
|
||
jne skip_line
|
||
jmp end_commd_line ; handle next command line
|
||
|
||
gotcom: stosb ;save indicator char in buffer
|
||
mov cmd_indicator, al ; save it for the future use.
|
||
|
||
org2: call get2 ;skip the commad name until delimiter
|
||
cmp al, lf
|
||
je org21
|
||
cmp al, cr
|
||
je org21
|
||
|
||
call delim
|
||
jnz org2
|
||
jmp short org3
|
||
|
||
org21: ;if cr or lf then
|
||
dec si ; undo si, cx register
|
||
inc cx ; and continue
|
||
|
||
org3:
|
||
cmp cmd_indicator, 'Y' ; comment= command?
|
||
je get_cmt_token
|
||
cmp cmd_indicator, 'I' ; install= command?
|
||
je org_file
|
||
cmp cmd_indicator, 'D' ; device= command?
|
||
je org_file
|
||
cmp cmd_indicator, 'S' ; shell= is a special one!!!
|
||
je org_file
|
||
cmp cmd_indicator, '1' ; switches= command?
|
||
je org_switch
|
||
|
||
jmp org4
|
||
|
||
org_switch:
|
||
call skip_comment
|
||
jz end_commd_line_brdg
|
||
|
||
call get2
|
||
call org_delim
|
||
jz org_switch
|
||
|
||
stosb
|
||
jmp org5
|
||
|
||
org_file: ; get the filename and put 0 at end,
|
||
call skip_comment
|
||
jz org_put_zero
|
||
|
||
call get2 ; not a comment
|
||
call delim
|
||
jz org_file ; skip the possible delimeters
|
||
|
||
stosb ; copy the first non delim char found in buffer
|
||
|
||
org_copy_file:
|
||
call skip_comment ; comment char in the filename?
|
||
jz org_put_zero ; then stop copying filename at that point
|
||
|
||
call get2
|
||
cmp al, '/' ; a switch char? (device=filename/xxx)
|
||
je end_file_slash ; this will be the special case.
|
||
|
||
stosb ; save the char. in buffer
|
||
call delim
|
||
jz end_copy_file
|
||
|
||
cmp al, ' '
|
||
ja org_copy_file ; keep copying
|
||
jmp short end_copy_file ; otherwise, assume end of the filename.
|
||
|
||
get_cmt_token: ; get the token. just max. 2 char.
|
||
call get2
|
||
cmp al, ' ' ; skip white spaces or "=" char.
|
||
je get_cmt_token ; (we are allowing the other special
|
||
cmp al, tab ; charaters can used for comment id.
|
||
je get_cmt_token ; character.)
|
||
cmp al, '=' ; = is special in this case.
|
||
je get_cmt_token
|
||
cmp al, cr
|
||
je get_cmt_end ; cannot accept the carridge return
|
||
cmp al, lf
|
||
je get_cmt_end
|
||
|
||
mov cmmt1, al ; store it
|
||
mov cmmt, 1 ; 1 char. so far.
|
||
call get2
|
||
cmp al, ' '
|
||
je get_cmt_end
|
||
cmp al, tab
|
||
je get_cmt_end
|
||
cmp al, cr
|
||
je get_cmt_end
|
||
cmp al, lf
|
||
je end_commd_line_brdg
|
||
|
||
mov cmmt2, al
|
||
inc cmmt
|
||
|
||
get_cmt_end:
|
||
call get2
|
||
cmp al, lf
|
||
jne get_cmt_end ; skip it.
|
||
|
||
end_commd_line_brdg: jmp end_commd_line ; else jmp to end_commd_line
|
||
|
||
org_put_zero: ; make the filename in front of
|
||
mov byte ptr es:[di], 0 ; the comment string to be an asciiz.
|
||
inc di
|
||
jmp end_commd_line ; (maybe null if device=/*)
|
||
|
||
end_file_slash: ; al = "/" option char.
|
||
mov byte ptr es:[di],0 ; make a filename an asciiz
|
||
inc di ; and
|
||
stosb ; store "/" after that.
|
||
jmp short org5 ; continue with the rest of the line
|
||
|
||
end_copy_file:
|
||
mov byte ptr es:[di-1], 0 ; make it an asciiz and handle the next char.
|
||
cmp al, lf
|
||
je end_commd_line_brdg
|
||
jmp short org5
|
||
|
||
org4: ; org4 skips all delimiters after the command name except for '/'
|
||
call skip_comment
|
||
jz end_commd_line_brdg
|
||
|
||
call get2
|
||
call org_delim ; skip delimiters except '/' (mrw 4/88)
|
||
jz org4
|
||
jmp short org51
|
||
|
||
org5: ; rest of the line
|
||
call skip_comment ; comment?
|
||
jz end_commd_line_brdg
|
||
call get2 ; not a comment.
|
||
|
||
org51:
|
||
stosb ; copy the character
|
||
cmp al, '"' ; a quote ?
|
||
je at_quote
|
||
cmp al, ' '
|
||
ja org5
|
||
; M051 - Start
|
||
|
||
cmp cmd_indicator, 'U' ; Q: is this devicehigh
|
||
jne not_dh ; N:
|
||
cmp al, lf ; Q: is this line feed
|
||
je org_dhlf ; Y: stuff a blank before the lf
|
||
cmp al, cr ; Q: is this a cr
|
||
jne org5 ; N:
|
||
mov byte ptr es:[di-1], ' ' ; overwrite cr with blank
|
||
stosb ; put cr after blank
|
||
inc [insert_blank] ; indicate that blank has been
|
||
; inserted
|
||
jmp org5
|
||
not_dh: ; M051 - End
|
||
|
||
cmp al, lf ; line feed?
|
||
je org1_brdg ; handles the next command line.
|
||
jmp org5 ; handles next char in this line.
|
||
|
||
org_dhlf: ; M051 - Start
|
||
cmp [insert_blank], 1 ; Q:has a blank already been inserted
|
||
je org1_brdg ; Y:
|
||
mov byte ptr es:[di-1], ' ' ; overwrite lf with blank
|
||
stosb ; put lf after blank
|
||
; M051 - End
|
||
|
||
org1_brdg:
|
||
mov [insert_blank], 0 ; M051: clear blank indicator for
|
||
; M051: devicehigh
|
||
jmp org1
|
||
|
||
at_quote:
|
||
cmp com_level, 0
|
||
je up_level
|
||
mov com_level, 0 ; reset it.
|
||
jmp org5
|
||
|
||
up_level:
|
||
inc com_level ; set it.
|
||
jmp org5
|
||
|
||
organize endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : get2
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
get2 proc near
|
||
jcxz noget
|
||
mov al,es:[si]
|
||
inc si
|
||
dec cx
|
||
od_ret:
|
||
ret
|
||
noget:
|
||
pop cx
|
||
mov count,di
|
||
mov org_count, di
|
||
xor si,si
|
||
mov chrptr,si
|
||
ng_ret:
|
||
ret
|
||
get2 endp
|
||
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : skip_comment
|
||
;
|
||
;skip the commented string until lf, if current es:si-> a comment string.
|
||
;in) es:si-> sting
|
||
; cx -> length.
|
||
;out) zero flag not set if not found a comment string.
|
||
; zero flag set if found a comment string and skipped it. al will contain
|
||
; the line feed charater at this moment when return.
|
||
; ax register destroyed.
|
||
; if found, si, cx register adjusted accordingly.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
skip_comment proc near
|
||
|
||
jcxz noget ; get out of the organize routine.
|
||
cmp com_level, 0 ; only check it if parameter level is 0.
|
||
jne no_commt ; (not inside quotations)
|
||
|
||
cmp cmmt, 1
|
||
jb no_commt
|
||
|
||
mov al, es:[si]
|
||
cmp cmmt1, al
|
||
jne no_commt
|
||
|
||
cmp cmmt, 2
|
||
jne skip_cmmt
|
||
|
||
mov al, es:[si+1]
|
||
cmp cmmt2, al
|
||
jne no_commt
|
||
|
||
skip_cmmt:
|
||
jcxz noget ; get out of organize routine.
|
||
mov al, es:[si]
|
||
inc si
|
||
dec cx
|
||
cmp al, lf ; line feed?
|
||
jne skip_cmmt
|
||
|
||
no_commt:
|
||
ret
|
||
|
||
skip_comment endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : delim
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
delim proc near
|
||
cmp al,'/' ; ibm will assume "/" as an delimeter.
|
||
jz delim_ret
|
||
|
||
cmp al, 0 ; special case for sysinit!!!
|
||
jz delim_ret
|
||
|
||
org_delim: ; used by organize routine except for getting
|
||
cmp al,' ' ;the filename.
|
||
jz delim_ret
|
||
cmp al,9
|
||
jz delim_ret
|
||
cmp al,'='
|
||
jz delim_ret
|
||
cmp al,','
|
||
jz delim_ret
|
||
cmp al,';'
|
||
delim_ret:
|
||
ret
|
||
delim endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : newline
|
||
;
|
||
; newline returns with first character of next line
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
newline proc near
|
||
|
||
call getchr ;skip non-control characters
|
||
jc nl_ret
|
||
cmp al,lf ;look for line feed
|
||
jnz newline
|
||
call getchr
|
||
nl_ret:
|
||
ret
|
||
|
||
newline endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : mapcase
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
mapcase proc near
|
||
push cx
|
||
push si
|
||
push ds
|
||
|
||
push es
|
||
pop ds
|
||
|
||
xor si,si
|
||
|
||
convloop:
|
||
lodsb
|
||
|
||
ifdef DBCS
|
||
call testkanj
|
||
jz normconv ; if this is not lead byte
|
||
|
||
mov ah,al
|
||
lodsb ; get tail byte
|
||
cmp ax,DB_SPACE
|
||
jnz @f ; if this is not dbcs space
|
||
mov word ptr [si-2],' ' ; set 2 single space
|
||
@@:
|
||
|
||
dec cx
|
||
jcxz convdone ;just ignore 1/2 kanji error
|
||
jmp short noconv
|
||
|
||
;fall through, know al is not in 'a'-'z' range
|
||
|
||
normconv:
|
||
endif
|
||
|
||
cmp al,'a'
|
||
jb noconv
|
||
cmp al,'z'
|
||
ja noconv
|
||
sub al,20h
|
||
mov [si-1],al
|
||
noconv:
|
||
loop convloop
|
||
|
||
convdone:
|
||
pop ds
|
||
pop si
|
||
pop cx
|
||
ret
|
||
|
||
ifdef DBCS
|
||
|
||
public testkanj
|
||
testkanj:
|
||
push si
|
||
push ds
|
||
|
||
push ax
|
||
mov ax,6300h ; get dos dbcs vector
|
||
int 21h
|
||
pop ax
|
||
|
||
bdbcs_do:
|
||
|
||
cmp ds:word ptr [si],0 ; end of lead byte info?
|
||
jz bdbcs_notfound ; jump if so
|
||
cmp al,ds:[si] ; less than first byte character?
|
||
jb bdbcs_next ; jump if not
|
||
cmp al,ds:[si+1] ; grater than first byte character?
|
||
ja bdbcs_next
|
||
|
||
bdbcs_found:
|
||
|
||
push ax
|
||
xor ax,ax
|
||
inc ax ; reset zero flag
|
||
pop ax
|
||
|
||
bdbcs_exit:
|
||
|
||
pop ds
|
||
pop si
|
||
ret
|
||
|
||
bdbcs_notfound:
|
||
|
||
push ax
|
||
xor ax,ax ; set zero flag
|
||
pop ax
|
||
jmp short bdbcs_exit
|
||
|
||
bdbcs_next:
|
||
|
||
add si,2 ; points next lead byte table
|
||
jmp short bdbcs_do
|
||
|
||
endif ; DBCS
|
||
|
||
mapcase endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : round
|
||
;
|
||
; round the values in memlo and memhi to paragraph boundary.
|
||
; perform bounds check.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
round proc near
|
||
|
||
push ax
|
||
mov ax,[memlo]
|
||
|
||
call pararound ; para round up
|
||
|
||
add [memhi],ax
|
||
mov [memlo],0
|
||
mov ax,memhi ; ax = new memhi
|
||
cmp ax,[alloclim] ; if new memhi >= alloclim, error
|
||
jae mem_err
|
||
test cs:[setdevmarkflag], for_devmark
|
||
jz skip_set_devmarksize
|
||
push es
|
||
push si
|
||
mov si, cs:[devmark_addr]
|
||
mov es, si
|
||
sub ax, si
|
||
dec ax
|
||
mov es:[devmark_size], ax ; paragraph
|
||
and cs:[setdevmarkflag], not_for_devmark
|
||
pop si
|
||
pop es
|
||
skip_set_devmarksize:
|
||
pop ax
|
||
clc ;clear carry
|
||
ret
|
||
|
||
mem_err:
|
||
mov dx,offset badmem
|
||
push cs
|
||
pop ds
|
||
call print
|
||
jmp stall
|
||
|
||
round endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : calldev
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
calldev proc near
|
||
|
||
mov ds,word ptr cs:[DevEntry+2]
|
||
add bx,word ptr cs:[DevEntry] ;do a little relocation
|
||
mov ax,ds:[bx]
|
||
|
||
push word ptr cs:[DevEntry]
|
||
mov word ptr cs:[DevEntry],ax
|
||
mov bx,offset packet
|
||
call [DevEntry]
|
||
pop word ptr cs:[DevEntry]
|
||
ret
|
||
|
||
calldev endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : todigit
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
todigit proc near
|
||
sub al,'0'
|
||
jb notdig
|
||
cmp al,9
|
||
ja notdig
|
||
clc
|
||
ret
|
||
notdig:
|
||
stc
|
||
ret
|
||
todigit endp
|
||
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
; procedure : getnum
|
||
;
|
||
; getnum parses a decimal number.
|
||
; returns it in ax, sets zero flag if ax = 0 (may be considered an
|
||
; error), if number is bad carry is set, zero is set, ax=0.
|
||
;
|
||
;----------------------------------------------------------------------------
|
||
;
|
||
|
||
getnum proc near
|
||
|
||
push bx
|
||
xor bx,bx ; running count is zero
|
||
|
||
b2:
|
||
call todigit ; do we have a digit
|
||
jc badnum ; no, bomb
|
||
|
||
xchg ax,bx ; put total in ax
|
||
push bx ; save digit
|
||
mov bx,10 ; base of arithmetic
|
||
mul bx ; shift by one decimal di...
|
||
pop bx ; get back digit
|
||
add al,bl ; get total
|
||
adc ah,0 ; make that 16 bits
|
||
jc badnum ; too big a number
|
||
|
||
xchg ax,bx ; stash total
|
||
|
||
call getchr ;get next digit
|
||
jc b1 ; no more characters
|
||
cmp al, ' ' ; space?
|
||
jz b15 ; then end of digits
|
||
cmp al, ',' ; ',' is a seperator!!!
|
||
jz b15 ; then end of digits.
|
||
cmp al, tab ; tab
|
||
jz b15
|
||
cmp al,sepchr ; allow 0 or special separators
|
||
jz b15
|
||
cmp al,'/' ; see if another switch follows
|
||
nop ; cas - remnant of old bad code
|
||
nop
|
||
jz b15
|
||
cmp al,lf ; line-feed?
|
||
jz b15
|
||
cmp al,cr ; carriage return?
|
||
jz b15
|
||
or al,al ; end of line separator?
|
||
jnz b2 ; no, try as a valid char...
|
||
|
||
b15:
|
||
inc count ; one more character to s...
|
||
dec chrptr ; back up over separator
|
||
b1:
|
||
mov ax,bx ; get proper count
|
||
or ax,ax ; clears carry, sets zero accordingly
|
||
pop bx
|
||
ret
|
||
badnum:
|
||
mov sepchr,0
|
||
xor ax,ax ; set zero flag, and ax = 0
|
||
pop bx
|
||
stc ; and carry set
|
||
ret
|
||
|
||
getnum endp
|
||
|
||
;*****************************************************************
|
||
|
||
setdoscountryinfo proc near
|
||
|
||
;input: es:di -> pointer to dos_country_cdpg_info
|
||
; ds:0 -> buffer.
|
||
; si = 0
|
||
; ax = country id
|
||
; dx = code page id. (if 0, then use ccsyscodepage as a default.)
|
||
; bx = file handle
|
||
; this routine can handle maxium 438 country_data entries.
|
||
;
|
||
;output: dos_country_cdpg_info set.
|
||
; carry set if any file read failure or wrong information in the file.
|
||
; carry set and cx = -1 if cannot find the matching country_id, codepage
|
||
; _id in the file.
|
||
|
||
push di
|
||
push ax
|
||
push dx
|
||
|
||
xor cx,cx
|
||
xor dx,dx
|
||
mov ax,512 ;read 512 bytes
|
||
call readincontrolbuffer ;read the file header
|
||
jc setdosdata_fail
|
||
|
||
push es
|
||
push si
|
||
|
||
push cs
|
||
pop es
|
||
|
||
mov di,offset country_file_signature
|
||
mov cx,8 ;length of the signature
|
||
repz cmpsb
|
||
|
||
pop si
|
||
pop es
|
||
jnz setdosdata_fail ;signature mismatch
|
||
|
||
add si,18 ;si -> county info type
|
||
cmp byte ptr ds:[si],1 ;only accept type 1 (currently only 1 header type)
|
||
jne setdosdata_fail ;cannot proceed. error return
|
||
|
||
inc si ;si -> file offset
|
||
mov dx,word ptr ds:[si] ;get the info file offset.
|
||
mov cx,word ptr ds:[si+2]
|
||
mov ax,6144 ;read 6144 bytes.
|
||
call readincontrolbuffer ;read info
|
||
jc setdosdata_fail
|
||
|
||
mov cx, word ptr ds:[si] ;get the # of country, codepage combination entries
|
||
cmp cx, 438 ;cannot handle more than 438 entries.
|
||
;
|
||
ja setdosdata_fail
|
||
|
||
inc si
|
||
inc si ;si -> entry information packet
|
||
pop dx ;restore code page id
|
||
pop ax ;restore country id
|
||
pop di
|
||
|
||
setdoscntry_find: ;search for desired country_id,codepage_id.
|
||
cmp ax, word ptr ds:[si+2] ;compare country_id
|
||
jne setdoscntry_next
|
||
|
||
cmp dx, 0 ;no user specified code page ?
|
||
je setdoscntry_any_codepage;then no need to match code page id.
|
||
cmp dx, word ptr ds:[si+4] ;compare code page id
|
||
je setdoscntry_got_it
|
||
|
||
setdoscntry_next:
|
||
add si, word ptr ds:[si] ;next entry
|
||
inc si
|
||
inc si ;take a word for size of entry itself
|
||
loop setdoscntry_find
|
||
|
||
mov cx, -1 ;signals that bad country id entered.
|
||
setdoscntry_fail:
|
||
stc
|
||
ret
|
||
|
||
setdosdata_fail:
|
||
pop si
|
||
pop cx
|
||
pop di
|
||
jmp short setdoscntry_fail
|
||
|
||
setdoscntry_any_codepage: ;use the code_page_id of the country_id found.
|
||
mov dx, word ptr ds:[si+4]
|
||
|
||
setdoscntry_got_it: ;found the matching entry
|
||
mov cs:cntrycodepage_id, dx ;save code page id for this country.
|
||
mov dx, word ptr ds:[si+10] ;get the file offset of country data
|
||
mov cx, word ptr ds:[si+12]
|
||
mov ax, 512 ;read 512 bytes
|
||
call readincontrolbuffer
|
||
jc setdoscntry_fail
|
||
|
||
mov cx, word ptr ds:[si] ;get the number of entries to handle.
|
||
inc si
|
||
inc si ;si -> first entry
|
||
|
||
setdoscntry_data:
|
||
push di ;es:di -> dos_country_cdpg_info
|
||
push cx ;save # of entry left
|
||
push si ;si -> current entry in control buffer
|
||
|
||
mov al, byte ptr ds:[si+2] ;get data entry id
|
||
call getcountrydestination ;get the address of destination in es:di
|
||
jc setdoscntry_data_next ;no matching data entry id in dos
|
||
|
||
mov dx, word ptr ds:[si+4] ;get offset of data
|
||
mov cx, word ptr ds:[si+6]
|
||
mov ax,4200h
|
||
stc
|
||
int 21h ;move pointer
|
||
jc setdosdata_fail
|
||
|
||
mov dx,512 ;start of data buffer
|
||
mov cx,20 ;read 20 bytes only. we only need to
|
||
mov ah,3fh ;look at the length of the data in the file.
|
||
stc
|
||
int 21h ;read the country.sys data
|
||
jc setdosdata_fail ;read failure
|
||
|
||
cmp ax,cx
|
||
jne setdosdata_fail
|
||
|
||
mov dx,word ptr ds:[si+4] ;get offset of data again.
|
||
mov cx,word ptr ds:[si+6]
|
||
mov ax,4200h
|
||
stc
|
||
int 21h ;move pointer back again
|
||
jc setdosdata_fail
|
||
|
||
push si
|
||
mov si,(512+8) ;get length of the data from the file
|
||
mov cx,word ptr ds:[si]
|
||
pop si
|
||
mov dx,512 ;start of data buffer
|
||
add cx,10 ;signature + a word for the length itself
|
||
mov ah,3fh ;read the data from the file.
|
||
stc
|
||
int 21h
|
||
jc setdosdata_fail
|
||
|
||
cmp ax, cx
|
||
jne setdosdata_fail
|
||
|
||
mov al,byte ptr ds:[si+2] ;save data id for future use.
|
||
mov si,(512+8) ;si-> data buffer + id tag field
|
||
mov cx,word ptr ds:[si] ;get the length of the file
|
||
inc cx ;take care of a word for lenght of tab
|
||
inc cx ;itself.
|
||
cmp cx,(2048 - 512 - 8) ;fit into the buffer?
|
||
ja setdosdata_fail
|
||
|
||
if bugfix
|
||
call setdbcs_before_copy
|
||
endif
|
||
|
||
cmp al, setcountryinfo ;is the data for setcountryinfo table?
|
||
jne setdoscntry_mov ;no, don't worry
|
||
|
||
push word ptr es:[di+ccmono_ptr-cccountryinfolen] ;cannot destroy ccmono_ptr address. save them.
|
||
push word ptr es:[di+ccmono_ptr-cccountryinfolen+2] ;at this time di -> cccountryinfolen
|
||
push di ;save di
|
||
|
||
push ax
|
||
mov ax,cs:cntrycodepage_id ;do not use the code page info in country_info
|
||
mov ds:[si+4], ax ;use the saved one for this !!!!
|
||
pop ax
|
||
|
||
setdoscntry_mov:
|
||
rep movsb ;copy the table into dos
|
||
cmp al, setcountryinfo ;was the ccmono_ptr saved?
|
||
jne setdoscntry_data_next
|
||
|
||
pop di ;restore di
|
||
pop word ptr es:[di+ccmono_ptr-cccountryinfolen+2] ;restore
|
||
pop word ptr es:[di+ccmono_ptr-cccountryinfolen]
|
||
|
||
setdoscntry_data_next:
|
||
pop si ;restore control buffer pointer
|
||
pop cx ;restore # of entries left
|
||
pop di ;restore pointer to dso_country_cdpg
|
||
add si, word ptr ds:[si] ;try to get the next entry
|
||
inc si
|
||
inc si ;take a word of entry length itself
|
||
dec cx
|
||
cmp cx,0
|
||
je setdoscntry_ok
|
||
jmp setdoscntry_data
|
||
|
||
setdoscntry_ok:
|
||
ret
|
||
setdoscountryinfo endp
|
||
|
||
if bugfix
|
||
setdbcs_before_copy proc near
|
||
|
||
cmp al,setdbcs ; dbcs vector set?
|
||
jnz @f ; jump if not
|
||
cmp word ptr es:[di], 0 ; zero byte data block?
|
||
jz @f ; jump if so
|
||
|
||
push di
|
||
push ax
|
||
push cx
|
||
mov cx,es:[di] ; load block length
|
||
add di,2 ; points actual data
|
||
xor al,al ; fill bytes
|
||
rep stosb ; clear data block
|
||
pop cx
|
||
pop ax
|
||
pop di
|
||
@@:
|
||
ret
|
||
setdbcs_before_copy endp
|
||
endif
|
||
|
||
getcountrydestination proc near
|
||
|
||
;get the destination address in the dos country info table.
|
||
;input: al - data id
|
||
; es:di -> dos_country_cdpg_info
|
||
;on return:
|
||
; es:di -> destination address of the matching data id
|
||
; carry set if no matching data id found in dos.
|
||
|
||
push cx
|
||
add di,ccnumber_of_entries ;skip the reserved area, syscodepage etc.
|
||
mov cx,word ptr es:[di] ;get the number of entries
|
||
inc di
|
||
inc di ;si -> the first start entry id
|
||
|
||
getcntrydest:
|
||
cmp byte ptr es:[di],al
|
||
je getcntrydest_ok
|
||
cmp byte ptr es:[di],setcountryinfo ;was it setcountryinfo entry?
|
||
je getcntrydest_1
|
||
|
||
add di,5 ;next data id
|
||
jmp short getcntrydest_loop
|
||
|
||
getcntrydest_1:
|
||
add di,new_country_size + 3 ;next data id
|
||
getcntrydest_loop:
|
||
loop getcntrydest
|
||
stc
|
||
jmp short getcntrydest_exit
|
||
|
||
getcntrydest_ok:
|
||
cmp al,setcountryinfo ;select country info?
|
||
jne getcntrydest_ok1
|
||
|
||
inc di ;now di -> cccountryinfolen
|
||
jmp short getcntrydest_exit
|
||
|
||
getcntrydest_ok1:
|
||
les di,dword ptr es:[di+1] ;get the destination in es:di
|
||
|
||
getcntrydest_exit:
|
||
pop cx
|
||
ret
|
||
getcountrydestination endp
|
||
|
||
|
||
readincontrolbuffer proc near
|
||
|
||
;move file pointer to cx:dx
|
||
;read ax bytes into the control buffer. (should be less than 2 kb)
|
||
;si will be set to 0 hence ds:si points to the control buffer.
|
||
;entry: cx,dx offset from the start of the file where the read/write pointer
|
||
; be moved.
|
||
; ax - # of bytes to read
|
||
; bx - file handle
|
||
; ds - buffer seg.
|
||
;return: the control data information is read into ds:0 - ds:0200.
|
||
; cx,dx value destroyed.
|
||
; carry set if error in reading file.
|
||
|
||
push ax ;# of bytes to read
|
||
mov ax, 4200h
|
||
stc
|
||
int 21h ;move pointer
|
||
pop cx ;# of bytes to read
|
||
jc ricb_exit
|
||
|
||
xor dx,dx ;ds:dx -> control buffer
|
||
xor si,si
|
||
mov ah,3fh ;read into the buffer
|
||
stc
|
||
int 21h ;should be less than 1024 bytes.
|
||
|
||
ricb_exit:
|
||
ret
|
||
readincontrolbuffer endp
|
||
|
||
|
||
set_country_path proc near
|
||
|
||
;in: ds - sysinitseg, es - confbot, si -> start of the asciiz path string
|
||
; dosinfo_ext, cntry_drv, cntry_root, cntry_path
|
||
; assumes current directory is the root directory.
|
||
;out: ds:di -> full path (cntry_drv).
|
||
; set the cntry_drv string from the country=,,path command.
|
||
; ds, es, si value saved.
|
||
|
||
push si
|
||
|
||
push ds ;switch ds, es
|
||
push es
|
||
pop ds
|
||
pop es ;now ds -> confbot, es -> sysinitseg
|
||
|
||
call chk_drive_letter ;current ds:[si] is a drive letter?
|
||
jc scp_default_drv ;no, use current default drive.
|
||
|
||
mov al, byte ptr ds:[si]
|
||
inc si
|
||
inc si ;si -> next char after ":"
|
||
jmp short scp_setdrv
|
||
|
||
scp_default_drv:
|
||
mov ah, 19h
|
||
int 21h
|
||
add al, "A" ;convert it to a character.
|
||
|
||
scp_setdrv:
|
||
mov cs:cntry_drv, al ;set the drive letter.
|
||
mov di, offset cntry_path
|
||
mov al, byte ptr ds:[si]
|
||
cmp al, "\"
|
||
je scp_root_dir
|
||
|
||
cmp al,"/" ;let's accept "/" as an directory delim
|
||
je scp_root_dir
|
||
|
||
jmp short scp_path
|
||
|
||
scp_root_dir:
|
||
dec di ;di -> cntry_root
|
||
scp_path:
|
||
call move_asciiz ;copy it
|
||
|
||
mov di, offset cntry_drv
|
||
scpath_exit:
|
||
|
||
push ds ;switch ds, es
|
||
push es
|
||
pop ds
|
||
pop es ;ds, es value restored
|
||
|
||
pop si
|
||
ret
|
||
set_country_path endp
|
||
|
||
|
||
chk_drive_letter proc near
|
||
;check if ds:[si] is a drive letter followed by ":".
|
||
;assume that every alpha charater is already converted to upper case.
|
||
;carry set if not.
|
||
|
||
push ax
|
||
cmp byte ptr ds:[si], "A"
|
||
jb cdletter_no
|
||
cmp byte ptr ds:[si], "Z"
|
||
ja cdletter_no
|
||
cmp byte ptr ds:[si+1], ":"
|
||
jne cdletter_no
|
||
|
||
jmp short cdletter_exit
|
||
|
||
cdletter_no:
|
||
stc
|
||
|
||
cdletter_exit:
|
||
pop ax
|
||
ret
|
||
chk_drive_letter endp
|
||
|
||
|
||
move_asciiz proc near
|
||
;in: ds:si -> source es:di -> target
|
||
;out: copy the string until 0.
|
||
;assumes there exists a 0.
|
||
|
||
masciiz_loop:
|
||
movsb
|
||
cmp byte ptr ds:[si-1],0 ;was it 0?
|
||
jne masciiz_loop
|
||
ret
|
||
move_asciiz endp
|
||
|
||
;
|
||
; ds:dx points to string to output (asciz)
|
||
;
|
||
; prints <badld_pre> <string> <badld_post>
|
||
|
||
badfil:
|
||
push cs
|
||
pop es
|
||
|
||
mov si,dx
|
||
badload:
|
||
mov dx,offset badld_pre ;want to print config error
|
||
mov bx, offset crlfm
|
||
|
||
prnerr:
|
||
push cs
|
||
pop ds
|
||
call print
|
||
|
||
prn1:
|
||
mov dl,es:[si]
|
||
or dl,dl
|
||
jz prn2
|
||
mov ah,std_con_output
|
||
int 21h
|
||
inc si
|
||
jmp prn1
|
||
|
||
prn2:
|
||
mov dx,bx
|
||
call print
|
||
cmp donotshownum,1 ; suppress line number when handling command.com
|
||
je prnexit
|
||
call error_line
|
||
prnexit:
|
||
ret
|
||
|
||
print:
|
||
cmp cs:bEchoConfig, 0 ; NTVDM skip print call, Jonle
|
||
je prnexit
|
||
|
||
mov ah,std_con_string_output
|
||
int 21h
|
||
|
||
ret
|
||
|
||
if noexec
|
||
|
||
; load non exe file called [ds:dx] at memory location es:bx
|
||
|
||
ldfil:
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push si
|
||
push ds
|
||
push bx
|
||
|
||
xor ax,ax ;open the file
|
||
mov ah,open
|
||
stc ;in case of int 24
|
||
int 21h
|
||
pop dx ;clean stack in case jump
|
||
jc ldret
|
||
|
||
push dx
|
||
mov bx,ax ;handle in bx
|
||
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
|
||
jc ldclsp
|
||
|
||
or dx,dx
|
||
jnz lderrp ; file >64k
|
||
pop dx
|
||
|
||
push dx
|
||
mov cx,es ; cx:dx is xaddr
|
||
add dx,ax ; add file size to xaddr
|
||
jnc dosize
|
||
add cx,1000h ; ripple carry
|
||
dosize:
|
||
mov ax,dx
|
||
call pararound
|
||
mov dx,ax
|
||
|
||
add cx,dx
|
||
cmp cx,[alloclim]
|
||
jb okld
|
||
jmp mem_err
|
||
|
||
okld:
|
||
xor cx,cx
|
||
xor dx,dx
|
||
mov ax,lseek shl 8 ;reset pointer to beginning of file
|
||
stc ;in case of int 24
|
||
int 21h
|
||
jc ldclsp
|
||
|
||
pop dx
|
||
|
||
push es ;read the file in
|
||
pop ds ;trans addr is ds:dx
|
||
|
||
mov cx,0ff00h ; .com files arn't any bigger than
|
||
; 64k-100h
|
||
mov ah,read
|
||
stc ;in case of int 24
|
||
int 21h
|
||
jc ldcls
|
||
|
||
mov si,dx ;check for exe file
|
||
cmp word ptr [si],"ZM"
|
||
clc ; assume ok
|
||
jnz ldcls ; only know how to do .com files
|
||
|
||
stc
|
||
jmp short ldcls
|
||
|
||
lderrp:
|
||
stc
|
||
ldclsp:
|
||
pop dx ;clean stack
|
||
ldcls:
|
||
pushf
|
||
mov ah,close ;close the file
|
||
stc
|
||
int 21h
|
||
popf
|
||
|
||
ldret: pop ds
|
||
pop si
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
ret
|
||
endif
|
||
|
||
;
|
||
; open device pointed to by dx, al has access code
|
||
; if unable to open do a device open null device instead
|
||
;
|
||
open_dev:
|
||
call open_file
|
||
jnc open_dev3
|
||
|
||
open_dev1:
|
||
mov dx,offset nuldev
|
||
call open_file
|
||
of_ret:
|
||
ret
|
||
|
||
open_dev3:
|
||
mov bx,ax ; handle from open to bx
|
||
xor ax,ax ; get device info
|
||
mov ah,ioctl
|
||
int 21h
|
||
test dl,10000000b
|
||
jnz of_ret
|
||
|
||
mov ah,close
|
||
int 21h
|
||
jmp open_dev1
|
||
|
||
open_file:
|
||
mov ah,open
|
||
stc
|
||
int 21h
|
||
ret
|
||
|
||
; test int24. return back to dos with the fake user response of "fail"
|
||
|
||
int24:
|
||
mov al, 3 ; fail the system call
|
||
iret ; return back to dos.
|
||
|
||
include copyrigh.inc ; copyright statement
|
||
|
||
nuldev db "NUL",0
|
||
condev db "CON",0
|
||
auxdev db "AUX",0
|
||
prndev db "PRN",0
|
||
MseDev db "MOUSE",0 ; NTVDM for internal spc mouse
|
||
|
||
|
||
|
||
|
||
; NTVDM we use a temp file for config.sys 23-Nov-1992 Jonle
|
||
; config db "C:\CONFIG.SYS",0
|
||
config db 64 dup (0)
|
||
|
||
cntry_drv db "A:"
|
||
cntry_root db "\"
|
||
cntry_path db "COUNTRY.SYS",0
|
||
db 52 dup (0)
|
||
|
||
country_file_signature db 0ffh,'COUNTRY'
|
||
|
||
cntrycodepage_id dw ?
|
||
|
||
commnd db "\COMMAND.COM",0
|
||
db 51 dup (0)
|
||
|
||
pathstring db 64 dup (0)
|
||
|
||
comtab label byte
|
||
|
||
; cmd len command cmd code
|
||
; ------- ------- --------
|
||
;
|
||
db 7, "BUFFERS", 'B'
|
||
db 5, "BREAK", 'C'
|
||
db 6, "DEVICE", 'D'
|
||
db 10, "DEVICEHIGH", 'U'
|
||
db 5, "FILES", 'F'
|
||
db 4, "FCBS", 'X'
|
||
db 9, "LASTDRIVE", 'L'
|
||
db 10, "MULTITRACK", 'M'
|
||
db 8, "DRIVPARM", 'P'
|
||
if stacksw
|
||
db 6, "STACKS", 'K'
|
||
endif
|
||
db 7, "COUNTRY", 'Q'
|
||
db 5, "SHELL", 'S'
|
||
db 7, "INSTALL", 'I'
|
||
db 7, "COMMENT", 'Y'
|
||
db 3, "REM", '0'
|
||
db 8, "SWITCHES", '1'
|
||
db 3, "DOS", 'H'
|
||
db 10, "ECHOCONFIG", 'E' ; NTVDM 14-Aug-1992 Jonle
|
||
db 11, "NTCMDPROMPT", 'T' ; NTVDM 06-May-1993 sudeepb
|
||
db 7, "DOSONLY", 'O' ; NTVDM 06-May-1993 sudeepb
|
||
db 0
|
||
|
||
hlim dw 2
|
||
slim dw 9
|
||
|
||
public bEchoConfig ; NTVDM - 14-Aug-1992 Jonle
|
||
bEchoConfig db 0
|
||
|
||
public drive
|
||
drive db ?
|
||
|
||
public switches
|
||
switches dw 0
|
||
|
||
|
||
switchlist db 8,"FHSTDICN" ; preserve the positions of n and c.
|
||
|
||
; the following depend on the positions of the various letters in switchlist
|
||
|
||
;switchnum equ 11111000b ; which switches require number
|
||
|
||
flagec35 equ 00000100b ; electrically compatible 3.5 inch disk drive
|
||
flagdrive equ 00001000b
|
||
flagcyln equ 00010000b
|
||
flagseclim equ 00100000b
|
||
flagheads equ 01000000b
|
||
flagff equ 10000000b
|
||
|
||
sysinitseg ends
|
||
end
|
||
|