1 ; TITLE MSINIT.ASM -- MS-DOS INITIALIZATION CODE
3 ORG 0 ; reset to beginning of data segment
4 ; Init code below overlaps with data area
6 INITBLOCK
DB 110H
DUP(0) ; Allow for segment round up
12 ASSUME
CS:DOSGROUP
,DS:DOSGROUP
,ES:DOSGROUP
,SS:NOTHING
14 EXTRN QUIT
:NEAR,IRET:NEAR,ABSDRD
:FAR,ABSDWRT
:FAR
15 EXTRN COMMAND
:NEAR,CALL_ENTRY
:NEAR
21 ; This section of code is safe from being overwritten by block move
24 REP MOVS BYTE PTR [DI],[SI]
26 MOV WORD PTR ES:[DMAADD
+2],DX
27 MOV SI,WORD PTR [DPBHEAD
] ; Address of first DPB
28 MOV WORD PTR ES:[DPBHEAD
+2],ES
29 MOV WORD PTR ES:[sft_addr
+2],ES
30 MOV CL,[NUMIO
] ; Number of DPBs
33 MOV WORD PTR ES:[SI.dpb_next_dpb
+2],ES
34 MOV ES:[SI.dpb_first_access
],-1 ; Never accessed before
35 ADD SI,DPBSIZ
; Point to next DPB
38 MOV WORD PTR ES:[SI.dpb_next_dpb
+2],-1
39 MOV DI,[BUFFSTRT
] ; Set up one default buffer
40 MOV WORD PTR ES:[BUFFHEAD
+2],ES
41 MOV WORD PTR ES:[BUFFHEAD
],DI
42 MOV WORD PTR ES:[DI.BUFDRV
],00FFH
43 MOV ES:[DI.BUFPRI
],FREEPRI
44 MOV WORD PTR ES:[DI.NEXTBUF
],-1
45 MOV WORD PTR ES:[DI.NEXTBUF
+2],-1
47 INC DX ; Leave enough room for the ARENA
48 MOV BYTE PTR [CreatePDB
],0FFh ; create jfns and set CurrentPDB
49 invoke $CREATE_PROCESS_DATA_BLOCK
; Set up segment
50 ASSUME
DS:NOTHING
,ES:NOTHING
56 ;SPECIAL NOTE FOR HIGHMEM VERSION
57 ; At this point a process header has been built where the start of the
58 ; CONSTANTS segment as refed by CS is. From this point until the return
59 ; below be careful about references off of CS.
63 MOV ES:[CurrentPDB
],AX ; Put it in the REAL location
64 MOV BYTE PTR ES:[CreatePDB
],0h
; reset flag in REAL location
66 MOV ES:[arena_head
],AX
69 MOV DS:[arena_signature
],arena_signature_end
70 MOV DS:[arena_owner
],arena_owner_system
74 MOV DS:[arena_size
],AX
78 MOV DI,OFFSET DOSGROUP
:sftabl
+ sft_table
; Point to sft 0
80 STOSB ; Adjust Refcount
81 MOV DI,OFFSET DOSGROUP
:SYSINITVAR
88 ; the next segment defines a new class that MUST appear last in the link map.
89 ; This defines several important locations for the initialization process that
90 ; must be the first available locations of free memory.
92 LAST
SEGMENT BYTE PUBLIC 'LAST'
97 ASSUME
CS:DOSGROUP
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
105 MOV SP,OFFSET DOSGROUP
:INITSTACK
109 MOV WORD PTR [DEVHEAD
+2],DS
110 MOV WORD PTR [DEVHEAD
],SI ; DS:SI Points to CONSOLE Device
113 ADD SI,SDEVNAME
; Point to name
117 MOV DI,OFFSET DOSGROUP
:sftabl
+ sft_table
; Point to sft 0
129 REP STOSB ; Extension
131 MOV AL,0C0H OR ISCIN
OR ISCOUT
135 STOSW ; Device pointer in FIRCLUS
138 OR BYTE PTR [SI.SDEVATT
],ISCIN
OR ISCOUT
139 MOV WORD PTR [BCON
],SI
140 MOV WORD PTR [BCON
+2],DS
142 LDS SI,DWORD PTR [SI] ; AUX device
144 TEST BYTE PTR [SI.SDEVATT
],ISCLOCK
146 MOV WORD PTR [BCLOCK
],SI
147 MOV WORD PTR [BCLOCK
+2],DS
148 MOV BP,OFFSET DOSGROUP
:MEMSTRT
; ES:BP points to DPB
150 LDS SI,DWORD PTR [SI] ; Next device
154 TEST [SI.SDEVATT
],DEVTYP
155 JNZ PERDRV
; Skip any other character devs
158 MOV [SI.SDEVNAME
],CL ; Number of units in name field
166 MOV SI,[BX] ; DS:SI Points to BPB
168 INC BX ; On to next BPB
169 MOV ES:[BP.dpb_drive
],DL
170 MOV ES:[BP.dpb_UNIT
],DH
175 MOV AX,ES:[BP.dpb_sector_size
]
186 MOV WORD PTR ES:[BP.dpb_driver_addr
],SI
187 MOV WORD PTR ES:[BP.dpb_driver_addr
+2],DS
203 ; Calculate true address of buffers, FATs, free space
204 MOV DI,BP ; First byte after current DPBs
206 MOV AX,OFFSET DOSGROUP
:SYSBUF
208 ADD AX,BP ; One I/O buffer
210 MOV WORD PTR [DPBHEAD
],AX ; True start of DPBs
212 SUB DX,OFFSET DOSGROUP
:SYSBUF
214 ADD BP,DI ; Allocate buffer space
215 SUB BP,ADJFAC
; True address of free memory
217 MOV DI,OFFSET DOSGROUP
:MEMSTRT
; Current start of DPBs
218 ADD DI,dpb_next_dpb
; Point at dpb_next_dpb field
222 ADD AX,DPBSIZ
; Compute address of next DPB
223 STOSW ; Set the link to next DPB
224 ADD DI,DPBSIZ
-2 ; Point at next address
226 SUB DI,DPBSIZ
; Point at last dpb_next_dpb field
229 ADD BP,15 ;True start of free space (round up to segment)
231 SHR BP,CL ; Number of segments for DOS resources
233 ADD DX,BP ; First free segment
239 MOV BP,CX ; Segment of DOS
240 MOV DX,CS ; Program segment
247 ; BP has segment of DOS (whether to load high or run in place)
248 ; DX has program segment (whether after DOS or overlaying DOS)
249 ; CX has size of memory in paragraphs (reduced by DOS size if HIGHMEM)
257 MOV CX,OFFSET DOSGROUP
:SYSBUF
;# bytes to move
258 SHR CX,1 ;# words to move (carry set if odd)
259 REP MOVSW ; Move DOS to high memory
265 MOV WORD PTR ES:[DSKCHRET
+3],ES
269 ASSUME
DS:NOTHING
,ES:NOTHING
272 MOV BYTE PTR DS:[ENTRYPOINT
],mi_Long_JMP
273 MOV WORD PTR DS:[ENTRYPOINT
+1],OFFSET DOSGROUP
:CALL_ENTRY
274 MOV WORD PTR DS:[ENTRYPOINT
+3],AX
276 MOV WORD PTR DS:[0],OFFSET DOSGROUP
:DIVOV
; Set default divide
280 REP STOSW ; Set 9 segments (skip 2 between each)
285 REP STOSW ; Set 8 segments (skip 2 between each)
288 MOV WORD PTR DS:[addr_int_abort
],OFFSET DOSGROUP
:QUIT
289 MOV WORD PTR DS:[addr_int_command
],OFFSET DOSGROUP
:COMMAND
290 MOV WORD PTR DS:[addr_int_terminate
],100H
291 MOV WORD PTR DS:[addr_int_terminate
+2],DX
292 MOV WORD PTR DS:[addr_int_ctrl_c
],OFFSET DOSGROUP
:IRET
294 MOV WORD PTR DS:[addr_int_fatal_abort
],OFFSET DOSGROUP
:IRET
296 MOV WORD PTR DS:[addr_int_disk_read
],OFFSET DOSGROUP
:ABSDRD
298 MOV WORD PTR DS:[addr_int_disk_write
],OFFSET DOSGROUP
:ABSDWRT
300 EXTRN Stay_resident
:NEAR
301 MOV WORD PTR DS:[addr_int_keep_process
],OFFSET DOSGROUP
:Stay_resident
302 MOV WORD PTR DS:[addr_int_spooler
],OFFSET DOSGROUP
:IRET ; Spooler
308 REP STOSW ;Zero interrupt locs for ints 2AH-2FH
315 ASSUME
DS:DOSGROUP
,ES:DOSGROUP
316 MOV AX,OFFSET DOSGROUP
:INITBLOCK
317 ADD AX,0Fh ; round to a paragraph
325 PUSH DX ; Save COMMAND address
329 invoke SETMEM
; Basic Header
330 ASSUME
DS:NOTHING
,ES:NOTHING
337 STOSB ; 0,1 and 2 are CON device
339 MOV CX,FilPerProc
- 3
340 REP STOSB ; Rest are unused
344 MOV WORD PTR [sft_addr
+2],DS ; Must be set to print messages
346 ; After this points the char device functions for CON will work for
351 MOV SI,OFFSET DOSGROUP
:HEADER
353 PUSH CS ; Outmes stomps on segments
360 ; Move the FATs into position
361 POP DX ; Restore COMMAND address
363 POP CX ; True address of free memory
364 MOV SI,OFFSET DOSGROUP
:MEMSTRT
; Place to move DPBs from
365 MOV DI,WORD PTR [DPBHEAD
] ; Place to move DPBs to
366 SUB CX,DI ; Total length of DPBs
368 JBE MOVJMP
; Are we moving to higher or
370 DEC CX ; Move backwards to higher memory
381 ASSUME
DS:NOTHING
,ES:NOTHING
382 ; DS:SI Points to device header
383 MOV [DEVCALL
.REQLEN
],DINITHL
384 MOV [DEVCALL
.REQUNIT
],0
385 MOV [DEVCALL
.REQFUNC
],DEVINIT
386 MOV [DEVCALL
.REQSTAT
],0
390 MOV BX,OFFSET DOSGROUP
:DEVCALL
404 ADJFAC EQU MEMSTRT
-SYSBUF
408 \1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a\1a