mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-12-01 18:15:47 +00:00
1424 lines
37 KiB
NASM
1424 lines
37 KiB
NASM
|
TITLE BIOS SYSTEM INITIALIZATION
|
|||
|
|
|||
|
FALSE EQU 0
|
|||
|
TRUE EQU NOT FALSE
|
|||
|
|
|||
|
IBMVER EQU FALSE
|
|||
|
IBM EQU IBMVER
|
|||
|
IBMJAPVER EQU FALSE ; If TRUE set KANJI true also
|
|||
|
MSVER EQU TRUE
|
|||
|
ALTVECT EQU FALSE ; Switch to build ALTVECT version
|
|||
|
HIGHMEM EQU FALSE
|
|||
|
KANJI EQU FALSE
|
|||
|
|
|||
|
IF IBMVER OR IBMJAPVER
|
|||
|
NOEXEC EQU TRUE
|
|||
|
ELSE
|
|||
|
NOEXEC EQU FALSE
|
|||
|
ENDIF
|
|||
|
|
|||
|
; Set to agree with those in DOST:MSHEAD.ASM, ALTVECT version only
|
|||
|
MAJOR_VERSION EQU 2
|
|||
|
MINOR_VERSION EQU 0B ;2.11
|
|||
|
|
|||
|
DOSSIZE EQU 5000H
|
|||
|
|
|||
|
; Internal DOS data returned by DOSINIT
|
|||
|
|
|||
|
SYSINITVAR STRUC
|
|||
|
DPBHEAD DD ? ; Pointer to head of DPB-FAT list
|
|||
|
sft_addr DD ? ; Pointer to first FCB table
|
|||
|
; The following address points to the CLOCK device
|
|||
|
BCLOCK DD ?
|
|||
|
; The following address is used by DISKSTATCHK it is always
|
|||
|
; points to the console input device header
|
|||
|
BCON DD ? ; Console device entry points
|
|||
|
NUMIO DB 0 ; Number of disk tables
|
|||
|
MAXSEC DW 0 ; Maximum allowed sector size
|
|||
|
BUFFHEAD DD ? ; Head of buffer queue
|
|||
|
DEVHEAD DD ?
|
|||
|
SYSINITVAR ENDS
|
|||
|
|
|||
|
INCLUDE DOSSYM.ASM
|
|||
|
INCLUDE DEVSYM.ASM
|
|||
|
|
|||
|
IF NOT IBM
|
|||
|
IF NOT IBMJAPVER
|
|||
|
EXTRN RE_INIT:FAR
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
|
|||
|
|
|||
|
ASSUME CS:SYSINITSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|||
|
|
|||
|
EXTRN BADOPM:BYTE,CRLFM:BYTE,BADCOM:BYTE
|
|||
|
EXTRN BADSIZ_PRE:BYTE,BADLD_PRE:BYTE
|
|||
|
EXTRN BADSIZ_POST:BYTE,BADLD_POST:BYTE
|
|||
|
EXTRN SYSSIZE:BYTE,BADCOUNTRY:BYTE
|
|||
|
|
|||
|
PUBLIC CURRENT_DOS_LOCATION
|
|||
|
PUBLIC FINAL_DOS_LOCATION
|
|||
|
PUBLIC DEVICE_LIST
|
|||
|
PUBLIC MEMORY_SIZE
|
|||
|
PUBLIC DEFAULT_DRIVE
|
|||
|
PUBLIC BUFFERS
|
|||
|
PUBLIC FILES
|
|||
|
PUBLIC SYSINIT
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
PUBLIC DPBBUF_SIZ
|
|||
|
ENDIF
|
|||
|
|
|||
|
SYSINIT:
|
|||
|
JMP GOINIT
|
|||
|
|
|||
|
DOSINFO LABEL DWORD
|
|||
|
DW 0000
|
|||
|
CURRENT_DOS_LOCATION DW 0000
|
|||
|
|
|||
|
MSDOS LABEL DWORD
|
|||
|
ENTRY_POINT LABEL DWORD
|
|||
|
DW 0000
|
|||
|
FINAL_DOS_LOCATION DW 0000
|
|||
|
DEVICE_LIST DD 00000000
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
DPBBUF_SIZ DW (4472 + 15) / 16
|
|||
|
ENDIF
|
|||
|
|
|||
|
MEMORY_SIZE DW 0001
|
|||
|
DEFAULT_DRIVE DB 00
|
|||
|
BUFFERS DB 2
|
|||
|
FILES DB 8
|
|||
|
COMMAND_LINE DB 2,0,"P" ; Default Command.com Args
|
|||
|
DB 29 DUP (0)
|
|||
|
ZERO DB 0
|
|||
|
|
|||
|
IF NOT NOEXEC
|
|||
|
COMEXE EXEC0 <0,COMMAND_LINE,DEFAULT_DRIVE,ZERO>
|
|||
|
ENDIF
|
|||
|
|
|||
|
COUNT DW 0000
|
|||
|
CHRPTR DW 0000
|
|||
|
|
|||
|
BUFPTR LABEL DWORD ; LEAVE THIS STUFF IN ORDER!
|
|||
|
MEMLO DW 0
|
|||
|
PRMBLK LABEL WORD
|
|||
|
MEMHI DW 0
|
|||
|
LDOFF DW 0
|
|||
|
AREA DW 0
|
|||
|
|
|||
|
PACKET DB 22
|
|||
|
DB 0
|
|||
|
DB 0 ; INITIALIZE CODE
|
|||
|
DW 0
|
|||
|
DB 8 DUP (?)
|
|||
|
UNITCOUNT DB 0
|
|||
|
BREAK_ADDR DD 0
|
|||
|
BPB_ADDR DD 0
|
|||
|
|
|||
|
GOINIT:
|
|||
|
CLD
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
|
|||
|
IF MSVER
|
|||
|
MOV CX,[MEMORY_SIZE]
|
|||
|
CMP CX,1
|
|||
|
JNZ NOSCAN
|
|||
|
MOV CX,2048 ; START SCANNING AT 32K BOUNDARY
|
|||
|
XOR BX,BX
|
|||
|
|
|||
|
MEMSCAN:INC CX
|
|||
|
JZ SETEND
|
|||
|
MOV DS,CX
|
|||
|
MOV AL,[BX]
|
|||
|
NOT AL
|
|||
|
MOV [BX],AL
|
|||
|
CMP AL,[BX]
|
|||
|
NOT AL
|
|||
|
MOV [BX],AL
|
|||
|
JZ MEMSCAN
|
|||
|
SETEND:
|
|||
|
MOV [MEMORY_SIZE],CX
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF IBMVER OR IBMJAPVER
|
|||
|
MOV CX,[MEMORY_SIZE]
|
|||
|
ENDIF
|
|||
|
|
|||
|
NOSCAN:
|
|||
|
MOV AX,CS
|
|||
|
MOV DS,AX
|
|||
|
ASSUME DS:SYSINITSEG
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
SUB CX,(DOSSIZE / 16) ; Leave room for DOS
|
|||
|
SUB CX,CS:[DPBBUF_SIZ] ; Allow OEM to tune
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV AX,OFFSET SYSSIZE + 15
|
|||
|
SHR AX,1 ; Divide by 16 for paras
|
|||
|
SHR AX,1
|
|||
|
SHR AX,1
|
|||
|
SHR AX,1
|
|||
|
SUB CX,AX
|
|||
|
MOV ES,CX
|
|||
|
MOV CX,OFFSET SYSSIZE + 1
|
|||
|
SHR CX,1 ; Divide by 2 to get words
|
|||
|
REP MOVSW ; RELOCATE SYSINIT
|
|||
|
|
|||
|
ASSUME ES:SYSINITSEG
|
|||
|
|
|||
|
PUSH ES
|
|||
|
MOV AX,OFFSET SYSIN
|
|||
|
PUSH AX
|
|||
|
|
|||
|
AAA PROC FAR
|
|||
|
RET
|
|||
|
AAA ENDP
|
|||
|
;
|
|||
|
; MOVE THE DOS TO ITS PROPER LOCATION
|
|||
|
;
|
|||
|
SYSIN:
|
|||
|
|
|||
|
ASSUME DS:NOTHING,ES:SYSINITSEG,SS:NOTHING
|
|||
|
|
|||
|
MOV AX,[CURRENT_DOS_LOCATION]
|
|||
|
MOV DS,AX
|
|||
|
MOV AX,[FINAL_DOS_LOCATION]
|
|||
|
MOV ES,AX
|
|||
|
|
|||
|
ASSUME ES:NOTHING
|
|||
|
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
MOV CX,DOSSIZE/2
|
|||
|
REP MOVSW
|
|||
|
|
|||
|
LDS SI,[DEVICE_LIST]
|
|||
|
MOV DX,[MEMORY_SIZE]
|
|||
|
|
|||
|
CLI
|
|||
|
MOV AX,CS
|
|||
|
MOV SS,AX
|
|||
|
MOV SP,OFFSET LOCSTACK
|
|||
|
|
|||
|
ASSUME SS:SYSINITSEG
|
|||
|
|
|||
|
IF NOT ALTVECT
|
|||
|
STI ; Leave INTs disabled for ALTVECT
|
|||
|
ENDIF
|
|||
|
LOCSTACK LABEL BYTE
|
|||
|
|
|||
|
CALL MSDOS
|
|||
|
MOV WORD PTR [DOSINFO+2],ES ; SAVE POINTER TO DOS INFO
|
|||
|
MOV WORD PTR [DOSINFO],DI
|
|||
|
|
|||
|
IF NOT IBM
|
|||
|
IF NOT IBMJAPVER
|
|||
|
CALL RE_INIT ; Re-call the BIOS
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
STI
|
|||
|
CLD
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
PUSH DS
|
|||
|
MOV BX,DS
|
|||
|
ADD BX,10H
|
|||
|
MOV ES,BX
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
MOV CX,OFFSET SYSSIZE + 1
|
|||
|
SHR CX,1 ; Divide by 2 to get words
|
|||
|
REP MOVSW
|
|||
|
POP DS
|
|||
|
PUSH ES
|
|||
|
MOV AX,OFFSET SECONDRELOC
|
|||
|
PUSH AX
|
|||
|
BBB PROC FAR
|
|||
|
RET
|
|||
|
BBB ENDP
|
|||
|
|
|||
|
SECONDRELOC:
|
|||
|
MOV AX,CS
|
|||
|
CLI
|
|||
|
MOV SS,AX
|
|||
|
MOV SP,OFFSET LOCSTACK
|
|||
|
STI
|
|||
|
ELSE
|
|||
|
MOV BX,CS
|
|||
|
SUB BX,10H
|
|||
|
MOV ES,BX
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
MOV CX,80H
|
|||
|
REP MOVSW
|
|||
|
MOV AH,SET_CURRENT_PDB
|
|||
|
INT 21H
|
|||
|
ENDIF
|
|||
|
|
|||
|
PUSH DS
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX,OFFSET INT24 ; SET UP INT 24 HANDLER
|
|||
|
MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 24H
|
|||
|
INT 21H
|
|||
|
|
|||
|
IF ALTVECT
|
|||
|
MOV DX,OFFSET BOOTMES
|
|||
|
CALL PRINT ; Print message DOSINIT couldn't
|
|||
|
ENDIF
|
|||
|
|
|||
|
POP DS
|
|||
|
|
|||
|
MOV DL,[DEFAULT_DRIVE]
|
|||
|
OR DL,DL
|
|||
|
JZ NODRVSET
|
|||
|
DEC DL ; A = 0
|
|||
|
MOV AH,SET_DEFAULT_DRIVE
|
|||
|
INT 21H ; SELECT THE DISK
|
|||
|
NODRVSET:
|
|||
|
|
|||
|
CALL DOCONF ; DO THE CONFIG STUFF
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
PUSH DS
|
|||
|
MOV AX,OFFSET SYSSIZE + 15
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL ; Divide by 16 to get para
|
|||
|
MOV CX,ES
|
|||
|
SUB CX,AX
|
|||
|
MOV ES,CX
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
MOV CX,OFFSET SYSSIZE + 1
|
|||
|
SHR CX,1 ; Divide by 2 to get words
|
|||
|
REP MOVSW
|
|||
|
POP DS
|
|||
|
PUSH ES
|
|||
|
MOV AX,OFFSET THIRDRELOC
|
|||
|
PUSH AX
|
|||
|
CCC PROC FAR
|
|||
|
RET
|
|||
|
CCC ENDP
|
|||
|
|
|||
|
THIRDRELOC:
|
|||
|
MOV AX,CS
|
|||
|
CLI
|
|||
|
MOV SS,AX
|
|||
|
MOV SP,OFFSET LOCSTACK
|
|||
|
STI
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF NOEXEC
|
|||
|
MOV BP,DS ; SAVE COMMAND.COM SEGMENT
|
|||
|
|
|||
|
PUSH DS
|
|||
|
POP ES
|
|||
|
|
|||
|
MOV BX,CS
|
|||
|
SUB BX,10H
|
|||
|
MOV DS,BX
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
MOV CX,80H
|
|||
|
REP MOVSW
|
|||
|
MOV BX,ES
|
|||
|
MOV AH,SET_CURRENT_PDB
|
|||
|
INT 21H
|
|||
|
|
|||
|
MOV ES:[PDB_PARENT_PID],ES ; WE ARE THE ROOT
|
|||
|
ENDIF
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:SYSINITSEG
|
|||
|
MOV AL,[FILES]
|
|||
|
CBW
|
|||
|
MOV CX,AX
|
|||
|
XOR BX,BX ; Close standard input
|
|||
|
MOV AH,CLOSE
|
|||
|
INT 21H
|
|||
|
MOV BX,2
|
|||
|
RCCLLOOP: ; Close everybody but standard output
|
|||
|
MOV AH,CLOSE
|
|||
|
INT 21H
|
|||
|
INC BX
|
|||
|
LOOP RCCLLOOP
|
|||
|
|
|||
|
MOV DX,OFFSET CONDEV
|
|||
|
MOV AL,2
|
|||
|
MOV AH,OPEN ; OPEN CON FOR READ/WRITE
|
|||
|
STC
|
|||
|
INT 21H
|
|||
|
JNC GOAUX
|
|||
|
CALL BADFIL
|
|||
|
JMP SHORT GOAUX2
|
|||
|
|
|||
|
GOAUX: PUSH AX
|
|||
|
MOV BX,1 ; close standard output
|
|||
|
MOV AH,CLOSE
|
|||
|
INT 21H
|
|||
|
POP AX
|
|||
|
|
|||
|
MOV BX,AX ; New device handle
|
|||
|
MOV AH,XDUP
|
|||
|
INT 21H ; Dup to 1, STDOUT
|
|||
|
MOV AH,XDUP
|
|||
|
INT 21H ; Dup to 2, STDERR
|
|||
|
|
|||
|
GOAUX2: MOV DX,OFFSET AUXDEV
|
|||
|
MOV AL,2 ; READ/WRITE ACCESS
|
|||
|
CALL OPEN_DEV
|
|||
|
|
|||
|
MOV DX,OFFSET PRNDEV
|
|||
|
MOV AL,1 ; WRITE ONLY
|
|||
|
CALL OPEN_DEV
|
|||
|
;
|
|||
|
; SET UP THE PARAMETERS FOR COMMAND
|
|||
|
;
|
|||
|
GOSET:
|
|||
|
MOV SI,OFFSET COMMAND_LINE+1
|
|||
|
|
|||
|
IF NOEXEC
|
|||
|
MOV DI,81H
|
|||
|
ELSE
|
|||
|
PUSH DS
|
|||
|
POP ES
|
|||
|
MOV DI,SI
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV CL,-1
|
|||
|
COMTRANLP: ; FIND LENGTH OF COMMAND LINE
|
|||
|
INC CL
|
|||
|
LODSB
|
|||
|
STOSB ; COPY COMMAND LINE IN
|
|||
|
OR AL,AL
|
|||
|
JNZ COMTRANLP
|
|||
|
DEC DI
|
|||
|
MOV AL,0DH
|
|||
|
STOSB
|
|||
|
|
|||
|
IF NOEXEC
|
|||
|
MOV ES:[80H],CL
|
|||
|
MOV AL,[DEFAULT_DRIVE]
|
|||
|
MOV ES:[5CH],AL
|
|||
|
ELSE
|
|||
|
MOV [COMMAND_LINE],CL ; Count
|
|||
|
ENDIF
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
|
|||
|
ASSUME ES:SYSINITSEG
|
|||
|
|
|||
|
MOV DX,OFFSET COMMND ; NOW POINTING TO FILE DESCRIPTION
|
|||
|
|
|||
|
IF NOEXEC
|
|||
|
MOV ES,BP ; SET LOAD ADDRESS
|
|||
|
MOV BX,100H
|
|||
|
CALL LDFIL ; READ IN COMMAND
|
|||
|
JC COMERR
|
|||
|
MOV DS,BP
|
|||
|
CLI
|
|||
|
MOV DX,80H
|
|||
|
MOV SS,BP
|
|||
|
MOV SP,DX
|
|||
|
STI
|
|||
|
|
|||
|
XOR AX,AX ; PUSH A WORD OF ZEROS
|
|||
|
PUSH AX
|
|||
|
MOV AH,SET_DMA ; SET DISK TRANFER ADDRESS
|
|||
|
INT 21H
|
|||
|
PUSH BP ; SET HIGH PART OF JUMP ADDRESS
|
|||
|
MOV AX,100H
|
|||
|
PUSH AX ; SET LOW PART OF JUMP ADDRESS
|
|||
|
CCC PROC FAR
|
|||
|
RET ; CRANK UP COMMAND!
|
|||
|
CCC ENDP
|
|||
|
|
|||
|
ELSE
|
|||
|
MOV BX,OFFSET COMEXE
|
|||
|
MOV WORD PTR [BX.EXEC0_COM_LINE+2],CS
|
|||
|
MOV WORD PTR [BX.EXEC0_5C_FCB+2],CS
|
|||
|
MOV WORD PTR [BX.EXEC0_6C_FCB+2],CS
|
|||
|
|
|||
|
XOR AX,AX
|
|||
|
MOV AH,EXEC
|
|||
|
STC ; IN CASE OF INT 24
|
|||
|
INT 21H ; GO START UP COMMAND
|
|||
|
ENDIF
|
|||
|
|
|||
|
COMERR:
|
|||
|
MOV DX,OFFSET BADCOM ; WANT TO PRINT COMMAND ERROR
|
|||
|
CALL BADFIL
|
|||
|
STALL: JMP STALL
|
|||
|
|
|||
|
DOCONF:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
|
|||
|
ASSUME DS:SYSINITSEG
|
|||
|
|
|||
|
MOV BX,0FFFFH
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H ; FIRST TIME FAILS
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H ; SECOND TIME GETS IT
|
|||
|
MOV [AREA],AX
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
ADD AX,BX
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV [MEMHI],AX
|
|||
|
|
|||
|
MOV AX,(CHAR_OPER SHL 8) ; GET SWITCH CHARACTER
|
|||
|
INT 21H
|
|||
|
MOV [COMMAND_LINE+1],DL
|
|||
|
|
|||
|
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 ENDFILE
|
|||
|
JMP NOPROB ; PROBLEM WITH OPEN
|
|||
|
|
|||
|
ENDFILE:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
CALL ROUND
|
|||
|
MOV AL,[FILES]
|
|||
|
SUB AL,5
|
|||
|
JBE DOBUFF
|
|||
|
CBW
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
PUSH AX
|
|||
|
MOV BL,SIZE SF_ENTRY
|
|||
|
MUL BL
|
|||
|
ADD AX,15+6
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL
|
|||
|
SUB [MEMHI],AX
|
|||
|
POP AX
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV BX,[MEMLO]
|
|||
|
MOV DX,[MEMHI]
|
|||
|
LDS DI,[DOSINFO] ; GET POINTER TO DOS DATA
|
|||
|
LDS DI,[DI+SFT_ADDR] ; DS:BP POINTS TO SFT
|
|||
|
MOV WORD PTR [DI+SFT_LINK],BX
|
|||
|
MOV WORD PTR [DI+SFT_LINK+2],DX ; SET POINTER TO NEW SFT
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
LES DI,DWORD PTR [MEMLO] ; POINT TO NEW SFT
|
|||
|
MOV WORD PTR ES:[DI+SFT_LINK],-1
|
|||
|
MOV ES:[DI+SFT_COUNT],AX
|
|||
|
MOV BL,SIZE SF_ENTRY
|
|||
|
MUL BL ; AX = NUMBER OF BYTES TO CLEAR
|
|||
|
MOV CX,AX
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
MOV AX,6
|
|||
|
ELSE
|
|||
|
ADD [MEMLO],AX ; ALLOCATE MEMORY
|
|||
|
MOV AX,6
|
|||
|
ADD [MEMLO],AX ; REMEMBER THE HEADER TOO
|
|||
|
ENDIF
|
|||
|
|
|||
|
ADD DI,AX
|
|||
|
XOR AX,AX
|
|||
|
REP STOSB ; CLEAN OUT THE STUFF
|
|||
|
|
|||
|
DOBUFF: CALL ROUND
|
|||
|
|
|||
|
DEC [BUFFERS]
|
|||
|
JZ BUF1
|
|||
|
|
|||
|
PUSH DS
|
|||
|
LES DI,BUFPTR
|
|||
|
LDS BX,DOSINFO
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
MOV AX,[BX.MAXSEC]
|
|||
|
ADD AX,BUFINSIZ + 15
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL
|
|||
|
SUB CS:[MEMHI],AX
|
|||
|
MOV ES,CS:[MEMHI]
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV AX,WORD PTR [BX.BUFFHEAD]
|
|||
|
MOV WORD PTR ES:[DI.NEXTBUF],AX
|
|||
|
MOV AX,WORD PTR [BX.BUFFHEAD+2]
|
|||
|
MOV WORD PTR ES:[DI.NEXTBUF+2],AX
|
|||
|
|
|||
|
MOV WORD PTR [BX.BUFFHEAD],DI
|
|||
|
MOV WORD PTR [BX.BUFFHEAD+2],ES
|
|||
|
|
|||
|
MOV WORD PTR ES:[DI.BUFDRV],00FFH ; NEW BUFFER FREE
|
|||
|
MOV BX,[BX.MAXSEC]
|
|||
|
POP DS
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
ADD BX,BUFINSIZ
|
|||
|
ADD [MEMLO],BX
|
|||
|
ENDIF
|
|||
|
|
|||
|
JMP DOBUFF
|
|||
|
|
|||
|
BUF1: CALL ROUND
|
|||
|
MOV BX,[MEMHI]
|
|||
|
MOV AX,[AREA]
|
|||
|
MOV ES,AX ; CALC WHAT WE NEEDED
|
|||
|
SUB BX,AX
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
DEC BX ; Arena
|
|||
|
PUSH BX
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV AH,SETBLOCK
|
|||
|
INT 21H ; GIVE THE REST BACK
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
PUSH ES
|
|||
|
MOV AX,ES
|
|||
|
DEC AX
|
|||
|
MOV ES,AX
|
|||
|
MOV ES:[arena_owner],8 ; Set impossible owner
|
|||
|
POP ES
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
MOV BX,0FFFFH
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H
|
|||
|
|
|||
|
PUSH ES
|
|||
|
DEC AX
|
|||
|
MOV ES,AX
|
|||
|
MOV ES:[arena_owner],8 ; Set impossible owner
|
|||
|
POP ES
|
|||
|
|
|||
|
IF NOT NOEXEC
|
|||
|
MOV ES,[AREA]
|
|||
|
MOV AH,DEALLOC
|
|||
|
INT 21H
|
|||
|
ENDIF
|
|||
|
|
|||
|
POP BX
|
|||
|
MOV AX,[AREA]
|
|||
|
MOV DS,AX
|
|||
|
ADD AX,BX
|
|||
|
MOV ES,AX
|
|||
|
ELSE
|
|||
|
IF NOEXEC
|
|||
|
MOV BX,0FFFFH ; ALLOCATE THE REST OF MEM FOR COMMAND
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H
|
|||
|
MOV AH,ALLOC
|
|||
|
INT 21H
|
|||
|
MOV DS,AX
|
|||
|
ENDIF
|
|||
|
ENDIF
|
|||
|
|
|||
|
RET
|
|||
|
|
|||
|
BADOP: MOV DX,OFFSET BADOPM ; WANT TO PRINT COMMAND ERROR
|
|||
|
CALL 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
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
MOV AX,OFFSET SYSSIZE + 15
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL
|
|||
|
ADD DX,AX
|
|||
|
ELSE
|
|||
|
MOV AX,[COUNT]
|
|||
|
ADD AX,15
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL ; NUMBER OF SEGMENTS
|
|||
|
SUB DX,AX
|
|||
|
SUB DX,11H ; ROOM FOR HEADER
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV DS,DX
|
|||
|
MOV ES,DX
|
|||
|
ASSUME DS:NOTHING,ES:NOTHING
|
|||
|
XOR DX,DX
|
|||
|
MOV CX,[COUNT]
|
|||
|
MOV AH,READ
|
|||
|
STC ; IN CASE OF INT 24
|
|||
|
INT 21H ; Function request
|
|||
|
PUSHF
|
|||
|
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
|
|||
|
ENDFILV:JMP ENDFILE
|
|||
|
|
|||
|
GETCOM:
|
|||
|
CALL ORGANIZE ; ORGANIZE THE FILE
|
|||
|
CALL GETCHR
|
|||
|
|
|||
|
CONFLP: JC ENDFILV
|
|||
|
MOV AH,AL
|
|||
|
CALL GETCHR
|
|||
|
|
|||
|
CMP AH,'B' ; BUFFER COMMAND?
|
|||
|
JNZ TRYC
|
|||
|
CALL GETNUM
|
|||
|
JZ COFF
|
|||
|
CMP AX,100
|
|||
|
JAE badop
|
|||
|
MOV [BUFFERS],AL
|
|||
|
JMP SHORT COFF
|
|||
|
|
|||
|
TRYC: CMP AH,'C'
|
|||
|
JZ GOTC
|
|||
|
JMP TRYD
|
|||
|
GOTC:
|
|||
|
CMP AL,'O' ; FIRST LETTER OF "ON"
|
|||
|
JNZ COFF
|
|||
|
CALL GETCHR
|
|||
|
JC ENDFILV
|
|||
|
CMP AL,'N' ; SECOND LETTER OF "ON"
|
|||
|
JNZ COFF
|
|||
|
MOV AH,SET_CTRL_C_TRAPPING ; TURN ON CONTROL-C CHECK
|
|||
|
MOV AL,1
|
|||
|
MOV DL,AL
|
|||
|
INT 21H
|
|||
|
|
|||
|
COFF: PUSH CS
|
|||
|
POP DS
|
|||
|
CALL NEWLINE
|
|||
|
JMP CONFLP
|
|||
|
|
|||
|
TRYD: CMP AH,'D'
|
|||
|
JZ GOTD
|
|||
|
JMP TRYF
|
|||
|
GOTD: MOV BX,CS
|
|||
|
MOV DS,BX
|
|||
|
|
|||
|
MOV WORD PTR [BPB_ADDR],SI
|
|||
|
MOV WORD PTR [BPB_ADDR+2],ES
|
|||
|
|
|||
|
CALL ROUND
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
PUSH DS
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
MOV DX,SI
|
|||
|
MOV AX,OPEN SHL 8
|
|||
|
STC ; In case INT 24H
|
|||
|
INT 21H
|
|||
|
POP DS
|
|||
|
JC BADBRK
|
|||
|
MOV BX,AX
|
|||
|
XOR DX,DX
|
|||
|
MOV CX,DX
|
|||
|
MOV AX,(LSEEK SHL 8) OR 2
|
|||
|
INT 21H
|
|||
|
PUSH AX
|
|||
|
MOV AH,CLOSE
|
|||
|
INT 21H
|
|||
|
POP AX ; DX:AX is size of file
|
|||
|
ADD AX,15
|
|||
|
ADC DX,0
|
|||
|
MOV CL,4
|
|||
|
SHR AX,CL
|
|||
|
MOV CL,12
|
|||
|
SHL DX,CL
|
|||
|
OR AX,DX ; AX is size in PARA
|
|||
|
MOV CX,[MEMHI]
|
|||
|
SUB [MEMHI],AX
|
|||
|
JNC SIZEOK
|
|||
|
MOV [MEMHI],CX ; Not enough memory
|
|||
|
JMP SHORT BADBRK
|
|||
|
SIZEOK:
|
|||
|
MOV BX,CS
|
|||
|
ENDIF
|
|||
|
|
|||
|
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
|
|||
|
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
|
|||
|
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
|
|||
|
|
|||
|
PUSH DS
|
|||
|
POP ES ; ES:SI BACK TO CONFIG.SYS
|
|||
|
PUSH CS
|
|||
|
POP DS ; DS BACK TO SYSINIT
|
|||
|
JNC GOODLD
|
|||
|
BADBRK: CALL BADLOAD
|
|||
|
JMP COFF
|
|||
|
|
|||
|
GOODLD: PUSH ES ; INITIALIZE THE DEVICE
|
|||
|
PUSH SI
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
MOV BX,SDEVSTRAT
|
|||
|
CALL CALLDEV
|
|||
|
MOV BX,SDEVINT
|
|||
|
CALL CALLDEV
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
MOV AX,WORD PTR [BREAK_ADDR+2] ; REMOVE THE INIT CODE
|
|||
|
CMP AX,[MEMORY_SIZE]
|
|||
|
JB BREAKOK
|
|||
|
POP SI
|
|||
|
POP ES
|
|||
|
JMP BADBRK
|
|||
|
BREAKOK:
|
|||
|
|
|||
|
MOV [MEMHI],AX
|
|||
|
MOV AX,WORD PTR [BREAK_ADDR]; REMOVE THE INIT CODE
|
|||
|
MOV [MEMLO],AX
|
|||
|
ENDIF
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
TEST AX,ISCIN ; IS IT A CONSOLE IN?
|
|||
|
JZ TRYCLK
|
|||
|
MOV WORD PTR ES:[DI.BCON],DX
|
|||
|
MOV WORD PTR ES:[DI.BCON+2],DS
|
|||
|
|
|||
|
TRYCLK: TEST AX,ISCLOCK ; IS IT A CLOCK DEVICE?
|
|||
|
JZ GOLINK
|
|||
|
MOV WORD PTR ES:[DI+BCLOCK],DX
|
|||
|
MOV WORD PTR ES:[DI+BCLOCK+2],DS
|
|||
|
GOLINK: JMP LINKIT
|
|||
|
|
|||
|
ISBLOCK:
|
|||
|
MOV AL,CS:[UNITCOUNT] ; IF NO UNITS FOUND....
|
|||
|
OR AL,AL
|
|||
|
JNZ PERDRV
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
MOV CS:[MEMLO],0 ; ...ERASE THE DEVICE
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV AX,-1
|
|||
|
JMP ENDDEV
|
|||
|
|
|||
|
PERDRV:
|
|||
|
CBW
|
|||
|
MOV CX,AX
|
|||
|
MOV DH,AH
|
|||
|
MOV DL,ES:[DI.NUMIO] ; GET NUMBER OF DEVICES
|
|||
|
ADD ES:[DI.NUMIO],AL ; UPDATE THE AMOUNT
|
|||
|
|
|||
|
LDS BX,CS:[BPB_ADDR] ; POINT TO BPB ARRAY
|
|||
|
PERUNIT:
|
|||
|
LES BP,CS:[DOSINFO]
|
|||
|
LES BP,DWORD PTR ES:[BP.DPBHEAD]; 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
|
|||
|
|
|||
|
IF HIGHMEM
|
|||
|
MOV AX,(DPBSIZ + 15) / 16
|
|||
|
SUB CS:[MEMHI],AX
|
|||
|
ENDIF
|
|||
|
|
|||
|
MOV AX,CS:[MEMHI]
|
|||
|
MOV WORD PTR ES:[BP.DPB_NEXT_DPB+2],AX
|
|||
|
LES BP,DWORD PTR CS:[MEMLO]
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
ADD WORD PTR CS:[MEMLO],DPBSIZ
|
|||
|
ENDIF
|
|||
|
|
|||
|
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]
|
|||
|
PUSH ES
|
|||
|
LES DI,CS:[DOSINFO] ; ES:DI POINT TO DOS INFO
|
|||
|
CMP AX,ES:[DI.MAXSEC]
|
|||
|
POP ES
|
|||
|
JBE NOTMAX
|
|||
|
POP SI
|
|||
|
POP ES
|
|||
|
MOV DX,OFFSET BADSIZ_PRE
|
|||
|
MOV BX,OFFSET BADSIZ_POST
|
|||
|
CALL PRNERR
|
|||
|
JMP COFF
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
LINKIT:
|
|||
|
LES DI,CS:[DOSINFO] ; ES:DI = DOS TABLE
|
|||
|
MOV CX,WORD PTR ES:[DI.DEVHEAD] ; DX:CX = HEAD OF LIST
|
|||
|
MOV DX,WORD PTR ES:[DI.DEVHEAD+2]
|
|||
|
|
|||
|
LDS SI,CS:[ENTRY_POINT] ; DS:SI = DEVICE LOCATION
|
|||
|
MOV WORD PTR ES:[DI.DEVHEAD],SI ; SET HEAD OF LIST IN DOS
|
|||
|
MOV WORD PTR ES:[DI.DEVHEAD+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?
|
|||
|
JZ COFFV
|
|||
|
JMP GOODLD ; OTHERWISE PRETEND WE LOADED IT IN
|
|||
|
COFFV: JMP COFF
|
|||
|
|
|||
|
TRYQ:
|
|||
|
CMP AH,'Q'
|
|||
|
JNZ TRYW
|
|||
|
CALL GETNUM
|
|||
|
JZ COFFV
|
|||
|
OR AH,AH
|
|||
|
JNZ COFFV
|
|||
|
MOV AH,INTERNATIONAL ; AL is country code
|
|||
|
MOV DX,-1 ; Set country
|
|||
|
INT 21H
|
|||
|
JNC COFFV
|
|||
|
MOV DX,OFFSET BADCOUNTRY
|
|||
|
CALL PRINT
|
|||
|
JMP COFFV
|
|||
|
|
|||
|
TRYF:
|
|||
|
CMP AH,'F'
|
|||
|
JNZ TRYQ
|
|||
|
CALL GETNUM
|
|||
|
JZ COFFV
|
|||
|
CMP AX,100
|
|||
|
JAE TryX
|
|||
|
MOV [FILES],AL
|
|||
|
JMP COFFV
|
|||
|
TRYW:
|
|||
|
CMP AH,'W'
|
|||
|
JNZ TRYA
|
|||
|
MOV DL,AL
|
|||
|
MOV AX,(CHAR_OPER SHL 8) OR 1 ; SET SWITCH CHARACTER
|
|||
|
MOV [COMMAND_LINE+1],DL
|
|||
|
INT 21H
|
|||
|
JMP COFF
|
|||
|
|
|||
|
TRYA:
|
|||
|
CMP AH,'A'
|
|||
|
JNZ TRYS
|
|||
|
CMP AL,'F' ; FIRST LETTER OF "FALSE"
|
|||
|
JNZ COFFJ
|
|||
|
MOV AX,(CHAR_OPER SHL 8) OR 3 ; TURN ON "/DEV" PREFIX
|
|||
|
XOR DL,DL
|
|||
|
INT 21H
|
|||
|
COFFJ: JMP COFF
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
TRYX:
|
|||
|
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: MOV CX,COUNT
|
|||
|
JCXZ NOCHAR
|
|||
|
MOV SI,CHRPTR
|
|||
|
MOV AL,ES:[SI]
|
|||
|
DEC COUNT
|
|||
|
INC CHRPTR
|
|||
|
CLC
|
|||
|
RET
|
|||
|
NOCHAR: STC
|
|||
|
RET
|
|||
|
|
|||
|
ORGANIZE:
|
|||
|
MOV CX,[COUNT]
|
|||
|
JCXZ NOCHAR
|
|||
|
CALL MAPCASE
|
|||
|
XOR SI,SI
|
|||
|
MOV DI,SI
|
|||
|
|
|||
|
ORG1: CALL GET ; SKIP LEADING CONTROL CHARACTERS
|
|||
|
CMP AL,' '
|
|||
|
JB ORG1
|
|||
|
|
|||
|
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
|
|||
|
POP DI
|
|||
|
POP SI
|
|||
|
POP CX
|
|||
|
JMP SHORT GOTCOM
|
|||
|
|
|||
|
NOCOM:
|
|||
|
POP DI
|
|||
|
POP SI
|
|||
|
POP CX
|
|||
|
MOV AL,'Z'
|
|||
|
GOTCOM: STOSB ; SAVE INDICATOR CHAR IN BUFFER
|
|||
|
|
|||
|
ORG2: CALL GET2 ; SKIP NAME UNTIL DELIMETER
|
|||
|
CALL DELIM ;
|
|||
|
JNZ ORG2
|
|||
|
|
|||
|
CALL GET ; GET CHARS TO RIGHT OF EQUALS SIGN
|
|||
|
STOSB
|
|||
|
|
|||
|
ORG4: CALL GET2
|
|||
|
STOSB
|
|||
|
CMP AL,' '
|
|||
|
JA ORG4
|
|||
|
CMP AL,10
|
|||
|
JZ ORG1
|
|||
|
|
|||
|
MOV BYTE PTR ES:[DI-1],0
|
|||
|
ORG5: CALL GET2
|
|||
|
STOSB
|
|||
|
CMP AL,10
|
|||
|
JNZ ORG5
|
|||
|
JMP ORG1
|
|||
|
|
|||
|
GET2:
|
|||
|
JCXZ NOGET
|
|||
|
MOV AL,ES:[SI]
|
|||
|
INC SI
|
|||
|
DEC CX
|
|||
|
RET
|
|||
|
|
|||
|
GET: JCXZ NOGET
|
|||
|
MOV AL,ES:[SI]
|
|||
|
INC SI
|
|||
|
DEC CX
|
|||
|
CALL DELIM
|
|||
|
JZ GET
|
|||
|
GRET: RET
|
|||
|
|
|||
|
|
|||
|
DELIM: CMP AL,' '
|
|||
|
JZ GRET
|
|||
|
CMP AL,9
|
|||
|
JZ GRET
|
|||
|
CMP AL,'='
|
|||
|
JZ GRET
|
|||
|
CMP AL,','
|
|||
|
JZ GRET
|
|||
|
CMP AL,';'
|
|||
|
RET
|
|||
|
|
|||
|
|
|||
|
NOGET: POP CX
|
|||
|
MOV COUNT,DI
|
|||
|
XOR SI,SI
|
|||
|
MOV CHRPTR,SI
|
|||
|
RET
|
|||
|
;
|
|||
|
; NEWLINE RETURNS WITH FIRST CHARACTER OF NEXT LINE
|
|||
|
;
|
|||
|
NEWLINE:CALL GETCHR ; SKIP NON-CONTROL CHARACTERS
|
|||
|
JC NONEW
|
|||
|
CMP AL,10 ; LOOK FOR LINE FEED
|
|||
|
JNZ NEWLINE
|
|||
|
CALL GETCHR
|
|||
|
NONEW: RET
|
|||
|
|
|||
|
MAPCASE:
|
|||
|
PUSH CX
|
|||
|
PUSH SI
|
|||
|
PUSH DS
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
XOR SI,SI
|
|||
|
CONVLOOP:
|
|||
|
LODSB
|
|||
|
|
|||
|
IF KANJI
|
|||
|
CALL TESTKANJ
|
|||
|
JZ NORMCONV
|
|||
|
INC SI ; Skip next char
|
|||
|
DEC CX
|
|||
|
JCXZ CONVDONE ; Just ignore 1/2 kanji error
|
|||
|
; 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
|
|||
|
|
|||
|
IF KANJI
|
|||
|
TESTKANJ:
|
|||
|
CMP AL,81H
|
|||
|
JB NOTLEAD
|
|||
|
CMP AL,9FH
|
|||
|
JBE ISLEAD
|
|||
|
CMP AL,0E0H
|
|||
|
JB NOTLEAD
|
|||
|
CMP AL,0FCH
|
|||
|
JBE ISLEAD
|
|||
|
NOTLEAD:
|
|||
|
PUSH AX
|
|||
|
XOR AX,AX ; Set zero
|
|||
|
POP AX
|
|||
|
RET
|
|||
|
|
|||
|
ISLEAD:
|
|||
|
PUSH AX
|
|||
|
XOR AX,AX ; Set zero
|
|||
|
INC AX ; Reset zero
|
|||
|
POP AX
|
|||
|
RET
|
|||
|
ENDIF
|
|||
|
|
|||
|
ASSUME DS:NOTHING
|
|||
|
|
|||
|
ROUND: MOV AX,[MEMLO]
|
|||
|
|
|||
|
IF NOT HIGHMEM
|
|||
|
ADD AX,15
|
|||
|
ENDIF
|
|||
|
|
|||
|
SHR AX,1
|
|||
|
SHR AX,1
|
|||
|
SHR AX,1
|
|||
|
SHR AX,1
|
|||
|
ADD [MEMHI],AX
|
|||
|
XOR AX,AX
|
|||
|
MOV [MEMLO],AX
|
|||
|
RET
|
|||
|
|
|||
|
CALLDEV:MOV DS,WORD PTR CS:[ENTRY_POINT+2]
|
|||
|
ADD BX,WORD PTR CS:[ENTRY_POINT]; Do a little relocation
|
|||
|
MOV AX,DS:[BX]
|
|||
|
PUSH WORD PTR CS:[ENTRY_POINT]
|
|||
|
MOV WORD PTR CS:[ENTRY_POINT],AX
|
|||
|
MOV BX,OFFSET PACKET
|
|||
|
CALL [ENTRY_POINT]
|
|||
|
POP WORD PTR CS:[ENTRY_POINT]
|
|||
|
RET
|
|||
|
|
|||
|
BADNUM: POP AX ; POP RETURN ADDRESS
|
|||
|
JMP BADOP
|
|||
|
|
|||
|
ToDigit:
|
|||
|
SUB AL,'0'
|
|||
|
JB NotDig
|
|||
|
CMP AL,9
|
|||
|
JA NotDig
|
|||
|
CLC
|
|||
|
RET
|
|||
|
NotDig: STC
|
|||
|
RET
|
|||
|
|
|||
|
GETNUM: 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 digit
|
|||
|
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
|
|||
|
OR AL,AL ; end of line separator?
|
|||
|
JNZ B2 ; no, try as a valid character
|
|||
|
INC COUNT ; one more character to scan
|
|||
|
DEC CHRPTR ; back up over separator
|
|||
|
B1: MOV AX,BX ; get proper count
|
|||
|
OR AX,AX
|
|||
|
RET
|
|||
|
;
|
|||
|
; ES:SI POINTS TO FILE NAME (NUL TERMINATED)
|
|||
|
; DS:DX POINTS TO STRING TO OUTPUT IN FRONT OF NAME ($ TERM)
|
|||
|
;
|
|||
|
BADFIL:
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
MOV SI,DX
|
|||
|
BADLOAD:
|
|||
|
MOV DX,OFFSET BADLD_PRE ; WANT TO PRINT CONFIG ERROR
|
|||
|
MOV BX,OFFSET BADLD_POST
|
|||
|
PRNERR:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV AH,STD_CON_STRING_OUTPUT
|
|||
|
INT 21H
|
|||
|
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
|
|||
|
PRINT: MOV AH,STD_CON_STRING_OUTPUT
|
|||
|
INT 21H
|
|||
|
RET
|
|||
|
;
|
|||
|
; LOAD 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 ; Trans addr is DS:DX
|
|||
|
JC LDRET
|
|||
|
|
|||
|
PUSH ES ; READ THE FILE IN
|
|||
|
POP DS
|
|||
|
MOV BX,AX ; Handle in BX
|
|||
|
MOV CX,0FF00H
|
|||
|
MOV AH,READ
|
|||
|
STC ; IN CASE OF INT 24
|
|||
|
INT 21H
|
|||
|
JC LDRET
|
|||
|
MOV SI,DX ; CHECK FOR EXE FILE
|
|||
|
CMP WORD PTR [SI],"ZM"
|
|||
|
JNZ LDCLS
|
|||
|
LDERR: STC
|
|||
|
JMP SHORT LDRET
|
|||
|
|
|||
|
LDCLS: MOV AH,CLOSE ; CLOSE THE FILE
|
|||
|
STC
|
|||
|
INT 21H
|
|||
|
|
|||
|
LDRET: POP DS
|
|||
|
POP SI
|
|||
|
POP DX
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
RET
|
|||
|
;
|
|||
|
; 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
|
|||
|
OPEN_DEV2:
|
|||
|
RET
|
|||
|
OPEN_DEV3:
|
|||
|
XOR AX,AX ; GET DEVICE INFO
|
|||
|
MOV AH,IOCTL
|
|||
|
INT 21H
|
|||
|
TEST DL,10000000B
|
|||
|
JNZ OPEN_DEV2
|
|||
|
MOV AH,CLOSE
|
|||
|
INT 21H
|
|||
|
JMP OPEN_DEV1
|
|||
|
|
|||
|
OPEN_FILE:
|
|||
|
MOV AH,OPEN
|
|||
|
STC
|
|||
|
INT 21H
|
|||
|
RET
|
|||
|
|
|||
|
INT24: ADD SP,6 ; RESTORE MACHINE STATE
|
|||
|
POP AX
|
|||
|
POP BX
|
|||
|
POP CX
|
|||
|
POP DX
|
|||
|
POP SI
|
|||
|
POP DI
|
|||
|
POP BP
|
|||
|
POP DS
|
|||
|
POP ES
|
|||
|
PUSH AX
|
|||
|
MOV AH,GET_DEFAULT_DRIVE ; INITIALIZE DOS
|
|||
|
INT 21H
|
|||
|
POP AX
|
|||
|
IRET ; BACK TO USER
|
|||
|
|
|||
|
IF ALTVECT
|
|||
|
BOOTMES DB 13
|
|||
|
TEN: DB 10
|
|||
|
DB "MS-DOS version "
|
|||
|
DB MAJOR_VERSION + "0"
|
|||
|
DB "."
|
|||
|
DB (MINOR_VERSION / 10) + "0"
|
|||
|
DB (MINOR_VERSION MOD 10) + "0"
|
|||
|
DB 13,10
|
|||
|
DB "Copyright 1981,82 Microsoft Corp.",13,10,"$"
|
|||
|
ENDIF
|
|||
|
|
|||
|
NULDEV DB "\DEV\NUL",0
|
|||
|
CONDEV DB "\DEV\CON",0
|
|||
|
AUXDEV DB "\DEV\AUX",0
|
|||
|
PRNDEV DB "\DEV\PRN",0
|
|||
|
|
|||
|
CONFIG DB "\CONFIG.SYS",0
|
|||
|
|
|||
|
COMMND DB "\COMMAND.COM",0
|
|||
|
|
|||
|
COMTAB LABEL BYTE
|
|||
|
DB 7,"BUFFERS",'B'
|
|||
|
DB 5,"BREAK",'C'
|
|||
|
DB 5,"SHELL",'S'
|
|||
|
DB 6,"DEVICE",'D'
|
|||
|
DB 5,"FILES",'F'
|
|||
|
DB 8,"SWITCHAR",'W'
|
|||
|
DB 8,"AVAILDEV",'A'
|
|||
|
DB 7,"COUNTRY",'Q'
|
|||
|
DB 0
|
|||
|
|
|||
|
|
|||
|
SYSINITSEG ENDS
|
|||
|
END
|
|||
|
|