summaryrefslogtreecommitdiff
path: root/v2.0/source/SYSINIT.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/SYSINIT.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/SYSINIT.ASM')
-rw-r--r--v2.0/source/SYSINIT.ASM1424
1 files changed, 1424 insertions, 0 deletions
diff --git a/v2.0/source/SYSINIT.ASM b/v2.0/source/SYSINIT.ASM
new file mode 100644
index 0000000..0c198b1
--- /dev/null
+++ b/v2.0/source/SYSINIT.ASM
@@ -0,0 +1,1424 @@
1TITLE BIOS SYSTEM INITIALIZATION
2
3FALSE EQU 0
4TRUE EQU NOT FALSE
5
6IBMVER EQU FALSE
7IBM EQU IBMVER
8IBMJAPVER EQU FALSE ; If TRUE set KANJI true also
9MSVER EQU TRUE
10ALTVECT EQU FALSE ; Switch to build ALTVECT version
11HIGHMEM EQU FALSE
12KANJI EQU FALSE
13
14 IF IBMVER OR IBMJAPVER
15NOEXEC EQU TRUE
16 ELSE
17NOEXEC EQU FALSE
18 ENDIF
19
20; Set to agree with those in DOST:MSHEAD.ASM, ALTVECT version only
21MAJOR_VERSION EQU 2
22MINOR_VERSION EQU 0B ;2.11
23
24DOSSIZE EQU 5000H
25
26; Internal DOS data returned by DOSINIT
27
28SYSINITVAR STRUC
29DPBHEAD DD ? ; Pointer to head of DPB-FAT list
30sft_addr DD ? ; Pointer to first FCB table
31; The following address points to the CLOCK device
32BCLOCK DD ?
33; The following address is used by DISKSTATCHK it is always
34; points to the console input device header
35BCON DD ? ; Console device entry points
36NUMIO DB 0 ; Number of disk tables
37MAXSEC DW 0 ; Maximum allowed sector size
38BUFFHEAD DD ? ; Head of buffer queue
39DEVHEAD DD ?
40SYSINITVAR ENDS
41
42 INCLUDE DOSSYM.ASM
43 INCLUDE DEVSYM.ASM
44
45 IF NOT IBM
46 IF NOT IBMJAPVER
47 EXTRN RE_INIT:FAR
48 ENDIF
49 ENDIF
50
51SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
52
53ASSUME CS:SYSINITSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING
54
55 EXTRN BADOPM:BYTE,CRLFM:BYTE,BADCOM:BYTE
56 EXTRN BADSIZ_PRE:BYTE,BADLD_PRE:BYTE
57 EXTRN BADSIZ_POST:BYTE,BADLD_POST:BYTE
58 EXTRN SYSSIZE:BYTE,BADCOUNTRY:BYTE
59
60 PUBLIC CURRENT_DOS_LOCATION
61 PUBLIC FINAL_DOS_LOCATION
62 PUBLIC DEVICE_LIST
63 PUBLIC MEMORY_SIZE
64 PUBLIC DEFAULT_DRIVE
65 PUBLIC BUFFERS
66 PUBLIC FILES
67 PUBLIC SYSINIT
68
69 IF HIGHMEM
70 PUBLIC DPBBUF_SIZ
71 ENDIF
72
73SYSINIT:
74 JMP GOINIT
75
76DOSINFO LABEL DWORD
77 DW 0000
78CURRENT_DOS_LOCATION DW 0000
79
80MSDOS LABEL DWORD
81ENTRY_POINT LABEL DWORD
82 DW 0000
83FINAL_DOS_LOCATION DW 0000
84DEVICE_LIST DD 00000000
85
86 IF HIGHMEM
87DPBBUF_SIZ DW (4472 + 15) / 16
88 ENDIF
89
90MEMORY_SIZE DW 0001
91DEFAULT_DRIVE DB 00
92BUFFERS DB 2
93FILES DB 8
94COMMAND_LINE DB 2,0,"P" ; Default Command.com Args
95 DB 29 DUP (0)
96ZERO DB 0
97
98 IF NOT NOEXEC
99COMEXE EXEC0 <0,COMMAND_LINE,DEFAULT_DRIVE,ZERO>
100 ENDIF
101
102COUNT DW 0000
103CHRPTR DW 0000
104
105BUFPTR LABEL DWORD ; LEAVE THIS STUFF IN ORDER!
106MEMLO DW 0
107PRMBLK LABEL WORD
108MEMHI DW 0
109LDOFF DW 0
110AREA DW 0
111
112PACKET DB 22
113 DB 0
114 DB 0 ; INITIALIZE CODE
115 DW 0
116 DB 8 DUP (?)
117UNITCOUNT DB 0
118BREAK_ADDR DD 0
119BPB_ADDR DD 0
120
121GOINIT:
122 CLD
123 XOR SI,SI
124 MOV DI,SI
125
126 IF MSVER
127 MOV CX,[MEMORY_SIZE]
128 CMP CX,1
129 JNZ NOSCAN
130 MOV CX,2048 ; START SCANNING AT 32K BOUNDARY
131 XOR BX,BX
132
133MEMSCAN:INC CX
134 JZ SETEND
135 MOV DS,CX
136 MOV AL,[BX]
137 NOT AL
138 MOV [BX],AL
139 CMP AL,[BX]
140 NOT AL
141 MOV [BX],AL
142 JZ MEMSCAN
143SETEND:
144 MOV [MEMORY_SIZE],CX
145 ENDIF
146
147 IF IBMVER OR IBMJAPVER
148 MOV CX,[MEMORY_SIZE]
149 ENDIF
150
151NOSCAN:
152 MOV AX,CS
153 MOV DS,AX
154ASSUME DS:SYSINITSEG
155
156 IF HIGHMEM
157 SUB CX,(DOSSIZE / 16) ; Leave room for DOS
158 SUB CX,CS:[DPBBUF_SIZ] ; Allow OEM to tune
159 ENDIF
160
161 MOV AX,OFFSET SYSSIZE + 15
162 SHR AX,1 ; Divide by 16 for paras
163 SHR AX,1
164 SHR AX,1
165 SHR AX,1
166 SUB CX,AX
167 MOV ES,CX
168 MOV CX,OFFSET SYSSIZE + 1
169 SHR CX,1 ; Divide by 2 to get words
170 REP MOVSW ; RELOCATE SYSINIT
171
172 ASSUME ES:SYSINITSEG
173
174 PUSH ES
175 MOV AX,OFFSET SYSIN
176 PUSH AX
177
178AAA PROC FAR
179 RET
180AAA ENDP
181;
182; MOVE THE DOS TO ITS PROPER LOCATION
183;
184SYSIN:
185
186 ASSUME DS:NOTHING,ES:SYSINITSEG,SS:NOTHING
187
188 MOV AX,[CURRENT_DOS_LOCATION]
189 MOV DS,AX
190 MOV AX,[FINAL_DOS_LOCATION]
191 MOV ES,AX
192
193 ASSUME ES:NOTHING
194
195 XOR SI,SI
196 MOV DI,SI
197 MOV CX,DOSSIZE/2
198 REP MOVSW
199
200 LDS SI,[DEVICE_LIST]
201 MOV DX,[MEMORY_SIZE]
202
203 CLI
204 MOV AX,CS
205 MOV SS,AX
206 MOV SP,OFFSET LOCSTACK
207
208 ASSUME SS:SYSINITSEG
209
210 IF NOT ALTVECT
211 STI ; Leave INTs disabled for ALTVECT
212 ENDIF
213LOCSTACK LABEL BYTE
214
215 CALL MSDOS
216 MOV WORD PTR [DOSINFO+2],ES ; SAVE POINTER TO DOS INFO
217 MOV WORD PTR [DOSINFO],DI
218
219 IF NOT IBM
220 IF NOT IBMJAPVER
221 CALL RE_INIT ; Re-call the BIOS
222 ENDIF
223 ENDIF
224
225 STI
226 CLD
227
228 IF HIGHMEM
229 PUSH DS
230 MOV BX,DS
231 ADD BX,10H
232 MOV ES,BX
233 PUSH CS
234 POP DS
235 XOR SI,SI
236 MOV DI,SI
237 MOV CX,OFFSET SYSSIZE + 1
238 SHR CX,1 ; Divide by 2 to get words
239 REP MOVSW
240 POP DS
241 PUSH ES
242 MOV AX,OFFSET SECONDRELOC
243 PUSH AX
244BBB PROC FAR
245 RET
246BBB ENDP
247
248SECONDRELOC:
249 MOV AX,CS
250 CLI
251 MOV SS,AX
252 MOV SP,OFFSET LOCSTACK
253 STI
254 ELSE
255 MOV BX,CS
256 SUB BX,10H
257 MOV ES,BX
258 XOR SI,SI
259 MOV DI,SI
260 MOV CX,80H
261 REP MOVSW
262 MOV AH,SET_CURRENT_PDB
263 INT 21H
264 ENDIF
265
266 PUSH DS
267 PUSH CS
268 POP DS
269 MOV DX,OFFSET INT24 ; SET UP INT 24 HANDLER
270 MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 24H
271 INT 21H
272
273 IF ALTVECT
274 MOV DX,OFFSET BOOTMES
275 CALL PRINT ; Print message DOSINIT couldn't
276 ENDIF
277
278 POP DS
279
280 MOV DL,[DEFAULT_DRIVE]
281 OR DL,DL
282 JZ NODRVSET
283 DEC DL ; A = 0
284 MOV AH,SET_DEFAULT_DRIVE
285 INT 21H ; SELECT THE DISK
286NODRVSET:
287
288 CALL DOCONF ; DO THE CONFIG STUFF
289
290 IF HIGHMEM
291 PUSH DS
292 MOV AX,OFFSET SYSSIZE + 15
293 MOV CL,4
294 SHR AX,CL ; Divide by 16 to get para
295 MOV CX,ES
296 SUB CX,AX
297 MOV ES,CX
298 PUSH CS
299 POP DS
300 XOR SI,SI
301 MOV DI,SI
302 MOV CX,OFFSET SYSSIZE + 1
303 SHR CX,1 ; Divide by 2 to get words
304 REP MOVSW
305 POP DS
306 PUSH ES
307 MOV AX,OFFSET THIRDRELOC
308 PUSH AX
309CCC PROC FAR
310 RET
311CCC ENDP
312
313THIRDRELOC:
314 MOV AX,CS
315 CLI
316 MOV SS,AX
317 MOV SP,OFFSET LOCSTACK
318 STI
319 ENDIF
320
321 IF NOEXEC
322 MOV BP,DS ; SAVE COMMAND.COM SEGMENT
323
324 PUSH DS
325 POP ES
326
327 MOV BX,CS
328 SUB BX,10H
329 MOV DS,BX
330 XOR SI,SI
331 MOV DI,SI
332 MOV CX,80H
333 REP MOVSW
334 MOV BX,ES
335 MOV AH,SET_CURRENT_PDB
336 INT 21H
337
338 MOV ES:[PDB_PARENT_PID],ES ; WE ARE THE ROOT
339 ENDIF
340
341 PUSH CS
342 POP DS
343ASSUME DS:SYSINITSEG
344 MOV AL,[FILES]
345 CBW
346 MOV CX,AX
347 XOR BX,BX ; Close standard input
348 MOV AH,CLOSE
349 INT 21H
350 MOV BX,2
351RCCLLOOP: ; Close everybody but standard output
352 MOV AH,CLOSE
353 INT 21H
354 INC BX
355 LOOP RCCLLOOP
356
357 MOV DX,OFFSET CONDEV
358 MOV AL,2
359 MOV AH,OPEN ; OPEN CON FOR READ/WRITE
360 STC
361 INT 21H
362 JNC GOAUX
363 CALL BADFIL
364 JMP SHORT GOAUX2
365
366GOAUX: PUSH AX
367 MOV BX,1 ; close standard output
368 MOV AH,CLOSE
369 INT 21H
370 POP AX
371
372 MOV BX,AX ; New device handle
373 MOV AH,XDUP
374 INT 21H ; Dup to 1, STDOUT
375 MOV AH,XDUP
376 INT 21H ; Dup to 2, STDERR
377
378GOAUX2: MOV DX,OFFSET AUXDEV
379 MOV AL,2 ; READ/WRITE ACCESS
380 CALL OPEN_DEV
381
382 MOV DX,OFFSET PRNDEV
383 MOV AL,1 ; WRITE ONLY
384 CALL OPEN_DEV
385;
386; SET UP THE PARAMETERS FOR COMMAND
387;
388GOSET:
389 MOV SI,OFFSET COMMAND_LINE+1
390
391 IF NOEXEC
392 MOV DI,81H
393 ELSE
394 PUSH DS
395 POP ES
396 MOV DI,SI
397 ENDIF
398
399 MOV CL,-1
400COMTRANLP: ; FIND LENGTH OF COMMAND LINE
401 INC CL
402 LODSB
403 STOSB ; COPY COMMAND LINE IN
404 OR AL,AL
405 JNZ COMTRANLP
406 DEC DI
407 MOV AL,0DH
408 STOSB
409
410 IF NOEXEC
411 MOV ES:[80H],CL
412 MOV AL,[DEFAULT_DRIVE]
413 MOV ES:[5CH],AL
414 ELSE
415 MOV [COMMAND_LINE],CL ; Count
416 ENDIF
417
418 PUSH CS
419 POP ES
420
421 ASSUME ES:SYSINITSEG
422
423 MOV DX,OFFSET COMMND ; NOW POINTING TO FILE DESCRIPTION
424
425 IF NOEXEC
426 MOV ES,BP ; SET LOAD ADDRESS
427 MOV BX,100H
428 CALL LDFIL ; READ IN COMMAND
429 JC COMERR
430 MOV DS,BP
431 CLI
432 MOV DX,80H
433 MOV SS,BP
434 MOV SP,DX
435 STI
436
437 XOR AX,AX ; PUSH A WORD OF ZEROS
438 PUSH AX
439 MOV AH,SET_DMA ; SET DISK TRANFER ADDRESS
440 INT 21H
441 PUSH BP ; SET HIGH PART OF JUMP ADDRESS
442 MOV AX,100H
443 PUSH AX ; SET LOW PART OF JUMP ADDRESS
444CCC PROC FAR
445 RET ; CRANK UP COMMAND!
446CCC ENDP
447
448 ELSE
449 MOV BX,OFFSET COMEXE
450 MOV WORD PTR [BX.EXEC0_COM_LINE+2],CS
451 MOV WORD PTR [BX.EXEC0_5C_FCB+2],CS
452 MOV WORD PTR [BX.EXEC0_6C_FCB+2],CS
453
454 XOR AX,AX
455 MOV AH,EXEC
456 STC ; IN CASE OF INT 24
457 INT 21H ; GO START UP COMMAND
458 ENDIF
459
460COMERR:
461 MOV DX,OFFSET BADCOM ; WANT TO PRINT COMMAND ERROR
462 CALL BADFIL
463STALL: JMP STALL
464
465DOCONF:
466 PUSH CS
467 POP DS
468
469 ASSUME DS:SYSINITSEG
470
471 MOV BX,0FFFFH
472 MOV AH,ALLOC
473 INT 21H ; FIRST TIME FAILS
474 MOV AH,ALLOC
475 INT 21H ; SECOND TIME GETS IT
476 MOV [AREA],AX
477
478 IF HIGHMEM
479 ADD AX,BX
480 ENDIF
481
482 MOV [MEMHI],AX
483
484 MOV AX,(CHAR_OPER SHL 8) ; GET SWITCH CHARACTER
485 INT 21H
486 MOV [COMMAND_LINE+1],DL
487
488 MOV DX,OFFSET CONFIG ; NOW POINTING TO FILE DESCRIPTION
489 MOV AX,OPEN SHL 8 ; OPEN FILE "CONFIG.SYS"
490 STC ; IN CASE OF INT 24
491 INT 21H ; FUNCTION REQUEST
492 JC ENDFILE
493 JMP NOPROB ; PROBLEM WITH OPEN
494
495ENDFILE:
496 PUSH CS
497 POP DS
498 CALL ROUND
499 MOV AL,[FILES]
500 SUB AL,5
501 JBE DOBUFF
502 CBW
503
504 IF HIGHMEM
505 PUSH AX
506 MOV BL,SIZE SF_ENTRY
507 MUL BL
508 ADD AX,15+6
509 MOV CL,4
510 SHR AX,CL
511 SUB [MEMHI],AX
512 POP AX
513 ENDIF
514
515 MOV BX,[MEMLO]
516 MOV DX,[MEMHI]
517 LDS DI,[DOSINFO] ; GET POINTER TO DOS DATA
518 LDS DI,[DI+SFT_ADDR] ; DS:BP POINTS TO SFT
519 MOV WORD PTR [DI+SFT_LINK],BX
520 MOV WORD PTR [DI+SFT_LINK+2],DX ; SET POINTER TO NEW SFT
521 PUSH CS
522 POP DS
523 LES DI,DWORD PTR [MEMLO] ; POINT TO NEW SFT
524 MOV WORD PTR ES:[DI+SFT_LINK],-1
525 MOV ES:[DI+SFT_COUNT],AX
526 MOV BL,SIZE SF_ENTRY
527 MUL BL ; AX = NUMBER OF BYTES TO CLEAR
528 MOV CX,AX
529
530 IF HIGHMEM
531 MOV AX,6
532 ELSE
533 ADD [MEMLO],AX ; ALLOCATE MEMORY
534 MOV AX,6
535 ADD [MEMLO],AX ; REMEMBER THE HEADER TOO
536 ENDIF
537
538 ADD DI,AX
539 XOR AX,AX
540 REP STOSB ; CLEAN OUT THE STUFF
541
542DOBUFF: CALL ROUND
543
544 DEC [BUFFERS]
545 JZ BUF1
546
547 PUSH DS
548 LES DI,BUFPTR
549 LDS BX,DOSINFO
550
551 IF HIGHMEM
552 MOV AX,[BX.MAXSEC]
553 ADD AX,BUFINSIZ + 15
554 MOV CL,4
555 SHR AX,CL
556 SUB CS:[MEMHI],AX
557 MOV ES,CS:[MEMHI]
558 ENDIF
559
560 MOV AX,WORD PTR [BX.BUFFHEAD]
561 MOV WORD PTR ES:[DI.NEXTBUF],AX
562 MOV AX,WORD PTR [BX.BUFFHEAD+2]
563 MOV WORD PTR ES:[DI.NEXTBUF+2],AX
564
565 MOV WORD PTR [BX.BUFFHEAD],DI
566 MOV WORD PTR [BX.BUFFHEAD+2],ES
567
568 MOV WORD PTR ES:[DI.BUFDRV],00FFH ; NEW BUFFER FREE
569 MOV BX,[BX.MAXSEC]
570 POP DS
571
572 IF NOT HIGHMEM
573 ADD BX,BUFINSIZ
574 ADD [MEMLO],BX
575 ENDIF
576
577 JMP DOBUFF
578
579BUF1: CALL ROUND
580 MOV BX,[MEMHI]
581 MOV AX,[AREA]
582 MOV ES,AX ; CALC WHAT WE NEEDED
583 SUB BX,AX
584
585 IF HIGHMEM
586 DEC BX ; Arena
587 PUSH BX
588 ENDIF
589
590 MOV AH,SETBLOCK
591 INT 21H ; GIVE THE REST BACK
592
593 IF NOT HIGHMEM
594 PUSH ES
595 MOV AX,ES
596 DEC AX
597 MOV ES,AX
598 MOV ES:[arena_owner],8 ; Set impossible owner
599 POP ES
600 ENDIF
601
602 IF HIGHMEM
603 MOV BX,0FFFFH
604 MOV AH,ALLOC
605 INT 21H
606 MOV AH,ALLOC
607 INT 21H
608
609 PUSH ES
610 DEC AX
611 MOV ES,AX
612 MOV ES:[arena_owner],8 ; Set impossible owner
613 POP ES
614
615 IF NOT NOEXEC
616 MOV ES,[AREA]
617 MOV AH,DEALLOC
618 INT 21H
619 ENDIF
620
621 POP BX
622 MOV AX,[AREA]
623 MOV DS,AX
624 ADD AX,BX
625 MOV ES,AX
626 ELSE
627 IF NOEXEC
628 MOV BX,0FFFFH ; ALLOCATE THE REST OF MEM FOR COMMAND
629 MOV AH,ALLOC
630 INT 21H
631 MOV AH,ALLOC
632 INT 21H
633 MOV DS,AX
634 ENDIF
635 ENDIF
636
637 RET
638
639BADOP: MOV DX,OFFSET BADOPM ; WANT TO PRINT COMMAND ERROR
640 CALL PRINT
641 JMP COFF
642
643NOPROB: ; GET FILE SIZE (NOTE < 64K!!)
644 MOV BX,AX
645 XOR CX,CX
646 XOR DX,DX
647 MOV AX,(LSEEK SHL 8) OR 2
648 INT 21H
649 MOV [COUNT],AX
650 XOR DX,DX
651 MOV AX,LSEEK SHL 8 ; Reset pointer to beginning of file
652 INT 21H
653 MOV DX,CS
654
655 IF HIGHMEM
656 MOV AX,OFFSET SYSSIZE + 15
657 MOV CL,4
658 SHR AX,CL
659 ADD DX,AX
660 ELSE
661 MOV AX,[COUNT]
662 ADD AX,15
663 MOV CL,4
664 SHR AX,CL ; NUMBER OF SEGMENTS
665 SUB DX,AX
666 SUB DX,11H ; ROOM FOR HEADER
667 ENDIF
668
669 MOV DS,DX
670 MOV ES,DX
671ASSUME DS:NOTHING,ES:NOTHING
672 XOR DX,DX
673 MOV CX,[COUNT]
674 MOV AH,READ
675 STC ; IN CASE OF INT 24
676 INT 21H ; Function request
677 PUSHF
678 PUSH CS
679 POP DS
680ASSUME DS:SYSINITSEG
681 PUSH AX
682 MOV AH,CLOSE
683 INT 21H
684 POP AX
685 POPF
686 JC CONFERR ; IF NOT WE'VE GOT A PROBLEM
687 CMP CX,AX
688 JZ GETCOM ; COULDN'T READ THE FILE
689CONFERR:
690 MOV DX,OFFSET CONFIG ; WANT TO PRINT CONFIG ERROR
691 CALL BADFIL
692ENDFILV:JMP ENDFILE
693
694GETCOM:
695 CALL ORGANIZE ; ORGANIZE THE FILE
696 CALL GETCHR
697
698CONFLP: JC ENDFILV
699 MOV AH,AL
700 CALL GETCHR
701
702 CMP AH,'B' ; BUFFER COMMAND?
703 JNZ TRYC
704 CALL GETNUM
705 JZ COFF
706 CMP AX,100
707 JAE badop
708 MOV [BUFFERS],AL
709 JMP SHORT COFF
710
711TRYC: CMP AH,'C'
712 JZ GOTC
713 JMP TRYD
714GOTC:
715 CMP AL,'O' ; FIRST LETTER OF "ON"
716 JNZ COFF
717 CALL GETCHR
718 JC ENDFILV
719 CMP AL,'N' ; SECOND LETTER OF "ON"
720 JNZ COFF
721 MOV AH,SET_CTRL_C_TRAPPING ; TURN ON CONTROL-C CHECK
722 MOV AL,1
723 MOV DL,AL
724 INT 21H
725
726COFF: PUSH CS
727 POP DS
728 CALL NEWLINE
729 JMP CONFLP
730
731TRYD: CMP AH,'D'
732 JZ GOTD
733 JMP TRYF
734GOTD: MOV BX,CS
735 MOV DS,BX
736
737 MOV WORD PTR [BPB_ADDR],SI
738 MOV WORD PTR [BPB_ADDR+2],ES
739
740 CALL ROUND
741
742 IF HIGHMEM
743 PUSH DS
744 PUSH ES
745 POP DS
746 MOV DX,SI
747 MOV AX,OPEN SHL 8
748 STC ; In case INT 24H
749 INT 21H
750 POP DS
751 JC BADBRK
752 MOV BX,AX
753 XOR DX,DX
754 MOV CX,DX
755 MOV AX,(LSEEK SHL 8) OR 2
756 INT 21H
757 PUSH AX
758 MOV AH,CLOSE
759 INT 21H
760 POP AX ; DX:AX is size of file
761 ADD AX,15
762 ADC DX,0
763 MOV CL,4
764 SHR AX,CL
765 MOV CL,12
766 SHL DX,CL
767 OR AX,DX ; AX is size in PARA
768 MOV CX,[MEMHI]
769 SUB [MEMHI],AX
770 JNC SIZEOK
771 MOV [MEMHI],CX ; Not enough memory
772 JMP SHORT BADBRK
773SIZEOK:
774 MOV BX,CS
775 ENDIF
776
777 XOR AX,AX
778 MOV WORD PTR [ENTRY_POINT],AX
779 MOV AX,[MEMHI]
780 MOV WORD PTR [ENTRY_POINT+2],AX ; SET ENTRY POINT
781
782
783 IF NOT NOEXEC
784 MOV [LDOFF],AX ; SET LOAD OFFSET
785 ENDIF
786
787 PUSH ES
788 POP DS
789 MOV DX,SI ; DS:DX POINTS TO FILE NAME
790
791 IF NOEXEC
792 LES BX,DWORD PTR CS:[MEMLO]
793 CALL LDFIL ; LOAD IN THE DEVICE DRIVER
794 ELSE
795 MOV ES,BX
796 MOV BX,OFFSET PRMBLK ; ES:BX POINTS TO PARAMETERS
797 MOV AL,3
798 MOV AH,EXEC
799 STC ; IN CASE OF INT 24
800 INT 21H ; LOAD IN THE DEVICE DRIVER
801 ENDIF
802
803 PUSH DS
804 POP ES ; ES:SI BACK TO CONFIG.SYS
805 PUSH CS
806 POP DS ; DS BACK TO SYSINIT
807 JNC GOODLD
808BADBRK: CALL BADLOAD
809 JMP COFF
810
811GOODLD: PUSH ES ; INITIALIZE THE DEVICE
812 PUSH SI
813
814 PUSH CS
815 POP ES
816 MOV BX,SDEVSTRAT
817 CALL CALLDEV
818 MOV BX,SDEVINT
819 CALL CALLDEV
820
821 PUSH CS
822 POP DS
823
824 IF NOT HIGHMEM
825 MOV AX,WORD PTR [BREAK_ADDR+2] ; REMOVE THE INIT CODE
826 CMP AX,[MEMORY_SIZE]
827 JB BREAKOK
828 POP SI
829 POP ES
830 JMP BADBRK
831BREAKOK:
832
833 MOV [MEMHI],AX
834 MOV AX,WORD PTR [BREAK_ADDR]; REMOVE THE INIT CODE
835 MOV [MEMLO],AX
836 ENDIF
837
838 LDS DX,[ENTRY_POINT] ; SET DS:DX TO HEADER
839 MOV SI,DX
840 ADD SI,SDEVATT ; DS:SI POINTS TO ATTRIBUTES
841 LES DI,CS:[DOSINFO] ; ES:DI POINT TO DOS INFO
842 MOV AX,DS:[SI] ; GET ATTRIBUTES
843 TEST AX,DEVTYP ; TEST IF BLOCK DEV
844 JZ ISBLOCK
845
846 TEST AX,ISCIN ; IS IT A CONSOLE IN?
847 JZ TRYCLK
848 MOV WORD PTR ES:[DI.BCON],DX
849 MOV WORD PTR ES:[DI.BCON+2],DS
850
851TRYCLK: TEST AX,ISCLOCK ; IS IT A CLOCK DEVICE?
852 JZ GOLINK
853 MOV WORD PTR ES:[DI+BCLOCK],DX
854 MOV WORD PTR ES:[DI+BCLOCK+2],DS
855GOLINK: JMP LINKIT
856
857ISBLOCK:
858 MOV AL,CS:[UNITCOUNT] ; IF NO UNITS FOUND....
859 OR AL,AL
860 JNZ PERDRV
861
862 IF NOT HIGHMEM
863 MOV CS:[MEMLO],0 ; ...ERASE THE DEVICE
864 ENDIF
865
866 MOV AX,-1
867 JMP ENDDEV
868
869PERDRV:
870 CBW
871 MOV CX,AX
872 MOV DH,AH
873 MOV DL,ES:[DI.NUMIO] ; GET NUMBER OF DEVICES
874 ADD ES:[DI.NUMIO],AL ; UPDATE THE AMOUNT
875
876 LDS BX,CS:[BPB_ADDR] ; POINT TO BPB ARRAY
877PERUNIT:
878 LES BP,CS:[DOSINFO]
879 LES BP,DWORD PTR ES:[BP.DPBHEAD]; GET FIRST DPB
880
881SCANDPB:CMP WORD PTR ES:[BP.DPB_NEXT_DPB],-1
882 JZ FOUNDPB
883 LES BP,ES:[BP.DPB_NEXT_DPB]
884 JMP SCANDPB
885FOUNDPB:
886 MOV AX,CS:[MEMLO]
887 MOV WORD PTR ES:[BP.DPB_NEXT_DPB],AX
888
889 IF HIGHMEM
890 MOV AX,(DPBSIZ + 15) / 16
891 SUB CS:[MEMHI],AX
892 ENDIF
893
894 MOV AX,CS:[MEMHI]
895 MOV WORD PTR ES:[BP.DPB_NEXT_DPB+2],AX
896 LES BP,DWORD PTR CS:[MEMLO]
897
898 IF NOT HIGHMEM
899 ADD WORD PTR CS:[MEMLO],DPBSIZ
900 ENDIF
901
902 MOV WORD PTR ES:[BP.DPB_NEXT_DPB],-1
903 MOV ES:[BP.DPB_FIRST_ACCESS],-1
904
905 MOV SI,[BX] ; DS:SI POINTS TO BPB
906 INC BX
907 INC BX ; POINT TO NEXT GUY
908 MOV WORD PTR ES:[BP.DPB_DRIVE],DX
909 MOV AH,SETDPB ; HIDDEN SYSTEM CALL
910 INT 21H
911 MOV AX,ES:[BP.DPB_SECTOR_SIZE]
912 PUSH ES
913 LES DI,CS:[DOSINFO] ; ES:DI POINT TO DOS INFO
914 CMP AX,ES:[DI.MAXSEC]
915 POP ES
916 JBE NOTMAX
917 POP SI
918 POP ES
919 MOV DX,OFFSET BADSIZ_PRE
920 MOV BX,OFFSET BADSIZ_POST
921 CALL PRNERR
922 JMP COFF
923
924NOTMAX: PUSH DS
925 PUSH DX
926 LDS DX,CS:[ENTRY_POINT]
927 MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR],DX
928 MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR+2],DS
929 POP DX
930 POP DS
931 INC DX
932 INC DH
933 LOOP PERUNIT
934
935LINKIT:
936 LES DI,CS:[DOSINFO] ; ES:DI = DOS TABLE
937 MOV CX,WORD PTR ES:[DI.DEVHEAD] ; DX:CX = HEAD OF LIST
938 MOV DX,WORD PTR ES:[DI.DEVHEAD+2]
939
940 LDS SI,CS:[ENTRY_POINT] ; DS:SI = DEVICE LOCATION
941 MOV WORD PTR ES:[DI.DEVHEAD],SI ; SET HEAD OF LIST IN DOS
942 MOV WORD PTR ES:[DI.DEVHEAD+2],DS
943 MOV AX,DS:[SI] ; GET POINTER TO NEXT DEVICE
944 MOV WORD PTR CS:[ENTRY_POINT],AX; AND SAVE IT
945
946 MOV WORD PTR DS:[SI],CX ; LINK IN THE DRIVER
947 MOV WORD PTR DS:[SI+2],DX
948ENDDEV:
949 POP SI
950 POP ES
951 INC AX ; AX = FFFF?
952 JZ COFFV
953 JMP GOODLD ; OTHERWISE PRETEND WE LOADED IT IN
954COFFV: JMP COFF
955
956TRYQ:
957 CMP AH,'Q'
958 JNZ TRYW
959 CALL GETNUM
960 JZ COFFV
961 OR AH,AH
962 JNZ COFFV
963 MOV AH,INTERNATIONAL ; AL is country code
964 MOV DX,-1 ; Set country
965 INT 21H
966 JNC COFFV
967 MOV DX,OFFSET BADCOUNTRY
968 CALL PRINT
969 JMP COFFV
970
971TRYF:
972 CMP AH,'F'
973 JNZ TRYQ
974 CALL GETNUM
975 JZ COFFV
976 CMP AX,100
977 JAE TryX
978 MOV [FILES],AL
979 JMP COFFV
980TRYW:
981 CMP AH,'W'
982 JNZ TRYA
983 MOV DL,AL
984 MOV AX,(CHAR_OPER SHL 8) OR 1 ; SET SWITCH CHARACTER
985 MOV [COMMAND_LINE+1],DL
986 INT 21H
987 JMP COFF
988
989TRYA:
990 CMP AH,'A'
991 JNZ TRYS
992 CMP AL,'F' ; FIRST LETTER OF "FALSE"
993 JNZ COFFJ
994 MOV AX,(CHAR_OPER SHL 8) OR 3 ; TURN ON "/DEV" PREFIX
995 XOR DL,DL
996 INT 21H
997COFFJ: JMP COFF
998
999TRYS:
1000 CMP AH,'S'
1001 JNZ TRYX
1002 MOV [COMMAND_LINE+1],0
1003 MOV DI,OFFSET COMMND + 1
1004 MOV [DI-1],AL
1005STORESHELL:
1006 CALL GETCHR
1007 OR AL,AL
1008 JZ GETSHPARMS
1009 CMP AL," "
1010 JB ENDSH
1011 MOV [DI],AL
1012 INC DI
1013 JMP STORESHELL
1014
1015ENDSH:
1016 MOV BYTE PTR [DI],0
1017 CALL GETCHR
1018 CMP AL,10
1019 JNZ CONV
1020 CALL GETCHR
1021CONV: JMP CONFLP
1022
1023TRYX:
1024 JMP BADOP
1025
1026GETSHPARMS:
1027 MOV BYTE PTR [DI],0
1028 MOV DI,OFFSET COMMAND_LINE+1
1029PARMLOOP:
1030 CALL GETCHR
1031 CMP AL," "
1032 JB ENDSH
1033 MOV [DI],AL
1034 INC DI
1035 JMP PARMLOOP
1036
1037GETCHR: MOV CX,COUNT
1038 JCXZ NOCHAR
1039 MOV SI,CHRPTR
1040 MOV AL,ES:[SI]
1041 DEC COUNT
1042 INC CHRPTR
1043 CLC
1044 RET
1045NOCHAR: STC
1046 RET
1047
1048ORGANIZE:
1049 MOV CX,[COUNT]
1050 JCXZ NOCHAR
1051 CALL MAPCASE
1052 XOR SI,SI
1053 MOV DI,SI
1054
1055ORG1: CALL GET ; SKIP LEADING CONTROL CHARACTERS
1056 CMP AL,' '
1057 JB ORG1
1058
1059 PUSH CX
1060 PUSH SI
1061 PUSH DI
1062 MOV BP,SI
1063 DEC BP
1064 MOV SI,OFFSET COMTAB ; Prepare to search command table
1065 MOV CH,0
1066FINDCOM:
1067 MOV DI,BP
1068 MOV CL,[SI]
1069 INC SI
1070 JCXZ NOCOM
1071 REPE CMPSB
1072 LAHF
1073 ADD SI,CX ; Bump to next position without affecting flags
1074 SAHF
1075 LODSB ; Get indicator letter
1076 JNZ FINDCOM
1077 POP DI
1078 POP SI
1079 POP CX
1080 JMP SHORT GOTCOM
1081
1082NOCOM:
1083 POP DI
1084 POP SI
1085 POP CX
1086 MOV AL,'Z'
1087GOTCOM: STOSB ; SAVE INDICATOR CHAR IN BUFFER
1088
1089ORG2: CALL GET2 ; SKIP NAME UNTIL DELIMETER
1090 CALL DELIM ;
1091 JNZ ORG2
1092
1093 CALL GET ; GET CHARS TO RIGHT OF EQUALS SIGN
1094 STOSB
1095
1096ORG4: CALL GET2
1097 STOSB
1098 CMP AL,' '
1099 JA ORG4
1100 CMP AL,10
1101 JZ ORG1
1102
1103 MOV BYTE PTR ES:[DI-1],0
1104ORG5: CALL GET2
1105 STOSB
1106 CMP AL,10
1107 JNZ ORG5
1108 JMP ORG1
1109
1110GET2:
1111 JCXZ NOGET
1112 MOV AL,ES:[SI]
1113 INC SI
1114 DEC CX
1115 RET
1116
1117GET: JCXZ NOGET
1118 MOV AL,ES:[SI]
1119 INC SI
1120 DEC CX
1121 CALL DELIM
1122 JZ GET
1123GRET: RET
1124
1125
1126DELIM: CMP AL,' '
1127 JZ GRET
1128 CMP AL,9
1129 JZ GRET
1130 CMP AL,'='
1131 JZ GRET
1132 CMP AL,','
1133 JZ GRET
1134 CMP AL,';'
1135 RET
1136
1137
1138NOGET: POP CX
1139 MOV COUNT,DI
1140 XOR SI,SI
1141 MOV CHRPTR,SI
1142 RET
1143;
1144; NEWLINE RETURNS WITH FIRST CHARACTER OF NEXT LINE
1145;
1146NEWLINE:CALL GETCHR ; SKIP NON-CONTROL CHARACTERS
1147 JC NONEW
1148 CMP AL,10 ; LOOK FOR LINE FEED
1149 JNZ NEWLINE
1150 CALL GETCHR
1151NONEW: RET
1152
1153MAPCASE:
1154 PUSH CX
1155 PUSH SI
1156 PUSH DS
1157 PUSH ES
1158 POP DS
1159 XOR SI,SI
1160CONVLOOP:
1161 LODSB
1162
1163 IF KANJI
1164 CALL TESTKANJ
1165 JZ NORMCONV
1166 INC SI ; Skip next char
1167 DEC CX
1168 JCXZ CONVDONE ; Just ignore 1/2 kanji error
1169; Fall through, know AL is not in 'a'-'z' range
1170NORMCONV:
1171 ENDIF
1172
1173 CMP AL,'a'
1174 JB NOCONV
1175 CMP AL,'z'
1176 JA NOCONV
1177 SUB AL,20H
1178 MOV [SI-1],AL
1179NOCONV:
1180 LOOP CONVLOOP
1181CONVDONE:
1182 POP DS
1183 POP SI
1184 POP CX
1185 RET
1186
1187 IF KANJI
1188TESTKANJ:
1189 CMP AL,81H
1190 JB NOTLEAD
1191 CMP AL,9FH
1192 JBE ISLEAD
1193 CMP AL,0E0H
1194 JB NOTLEAD
1195 CMP AL,0FCH
1196 JBE ISLEAD
1197NOTLEAD:
1198 PUSH AX
1199 XOR AX,AX ; Set zero
1200 POP AX
1201 RET
1202
1203ISLEAD:
1204 PUSH AX
1205 XOR AX,AX ; Set zero
1206 INC AX ; Reset zero
1207 POP AX
1208 RET
1209 ENDIF
1210
1211ASSUME DS:NOTHING
1212
1213ROUND: MOV AX,[MEMLO]
1214
1215 IF NOT HIGHMEM
1216 ADD AX,15
1217 ENDIF
1218
1219 SHR AX,1
1220 SHR AX,1
1221 SHR AX,1
1222 SHR AX,1
1223 ADD [MEMHI],AX
1224 XOR AX,AX
1225 MOV [MEMLO],AX
1226 RET
1227
1228CALLDEV:MOV DS,WORD PTR CS:[ENTRY_POINT+2]
1229 ADD BX,WORD PTR CS:[ENTRY_POINT]; Do a little relocation
1230 MOV AX,DS:[BX]
1231 PUSH WORD PTR CS:[ENTRY_POINT]
1232 MOV WORD PTR CS:[ENTRY_POINT],AX
1233 MOV BX,OFFSET PACKET
1234 CALL [ENTRY_POINT]
1235 POP WORD PTR CS:[ENTRY_POINT]
1236 RET
1237
1238BADNUM: POP AX ; POP RETURN ADDRESS
1239 JMP BADOP
1240
1241ToDigit:
1242 SUB AL,'0'
1243 JB NotDig
1244 CMP AL,9
1245 JA NotDig
1246 CLC
1247 RET
1248NotDig: STC
1249 RET
1250
1251GETNUM: XOR BX,BX ; running count is zero
1252B2: CALL ToDigit ; do we have a digit
1253 JC BadNum ; no, bomb
1254 XCHG AX,BX ; put total in AX
1255 PUSH BX ; save digit
1256 MOV BX,10 ; base of arithmetic
1257 MUL BX ; shift by one decimal digit
1258 POP BX ; get back digit
1259 ADD AL,BL ; get total
1260 ADC AH,0 ; make that 16 bits
1261 JC BADNUM ; too big a number
1262 XCHG AX,BX ; stash total
1263 CALL GETCHR ; GET NEXT DIGIT
1264 JC B1 ; no more characters
1265 OR AL,AL ; end of line separator?
1266 JNZ B2 ; no, try as a valid character
1267 INC COUNT ; one more character to scan
1268 DEC CHRPTR ; back up over separator
1269B1: MOV AX,BX ; get proper count
1270 OR AX,AX
1271 RET
1272;
1273; ES:SI POINTS TO FILE NAME (NUL TERMINATED)
1274; DS:DX POINTS TO STRING TO OUTPUT IN FRONT OF NAME ($ TERM)
1275;
1276BADFIL:
1277 PUSH CS
1278 POP ES
1279 MOV SI,DX
1280BADLOAD:
1281 MOV DX,OFFSET BADLD_PRE ; WANT TO PRINT CONFIG ERROR
1282 MOV BX,OFFSET BADLD_POST
1283PRNERR:
1284 PUSH CS
1285 POP DS
1286 MOV AH,STD_CON_STRING_OUTPUT
1287 INT 21H
1288PRN1: MOV DL,ES:[SI]
1289 OR DL,DL
1290 JZ PRN2
1291 MOV AH,STD_CON_OUTPUT
1292 INT 21H
1293 INC SI
1294 JMP PRN1
1295PRN2: MOV DX,BX
1296PRINT: MOV AH,STD_CON_STRING_OUTPUT
1297 INT 21H
1298 RET
1299;
1300; LOAD FILE CALLED [DS:DX] AT MEMORY LOCATION ES:BX
1301;
1302LDFIL:
1303 PUSH AX
1304 PUSH BX
1305 PUSH CX
1306 PUSH DX
1307 PUSH SI
1308 PUSH DS
1309 PUSH BX
1310
1311 XOR AX,AX ; OPEN THE FILE
1312 MOV AH,OPEN
1313 STC ; IN CASE OF INT 24
1314 INT 21H
1315 POP DX ; Trans addr is DS:DX
1316 JC LDRET
1317
1318 PUSH ES ; READ THE FILE IN
1319 POP DS
1320 MOV BX,AX ; Handle in BX
1321 MOV CX,0FF00H
1322 MOV AH,READ
1323 STC ; IN CASE OF INT 24
1324 INT 21H
1325 JC LDRET
1326 MOV SI,DX ; CHECK FOR EXE FILE
1327 CMP WORD PTR [SI],"ZM"
1328 JNZ LDCLS
1329LDERR: STC
1330 JMP SHORT LDRET
1331
1332LDCLS: MOV AH,CLOSE ; CLOSE THE FILE
1333 STC
1334 INT 21H
1335
1336LDRET: POP DS
1337 POP SI
1338 POP DX
1339 POP CX
1340 POP BX
1341 POP AX
1342 RET
1343;
1344; OPEN DEVICE POINTED TO BY DX, AL HAS ACCESS CODE
1345; IF UNABLE TO OPEN DO A DEVICE OPEN NULL DEVICE INSTEAD
1346;
1347OPEN_DEV:
1348 CALL OPEN_FILE
1349 JNC OPEN_DEV3
1350OPEN_DEV1:
1351 MOV DX,OFFSET NULDEV
1352 CALL OPEN_FILE
1353OPEN_DEV2:
1354 RET
1355OPEN_DEV3:
1356 XOR AX,AX ; GET DEVICE INFO
1357 MOV AH,IOCTL
1358 INT 21H
1359 TEST DL,10000000B
1360 JNZ OPEN_DEV2
1361 MOV AH,CLOSE
1362 INT 21H
1363 JMP OPEN_DEV1
1364
1365OPEN_FILE:
1366 MOV AH,OPEN
1367 STC
1368 INT 21H
1369 RET
1370
1371INT24: ADD SP,6 ; RESTORE MACHINE STATE
1372 POP AX
1373 POP BX
1374 POP CX
1375 POP DX
1376 POP SI
1377 POP DI
1378 POP BP
1379 POP DS
1380 POP ES
1381 PUSH AX
1382 MOV AH,GET_DEFAULT_DRIVE ; INITIALIZE DOS
1383 INT 21H
1384 POP AX
1385 IRET ; BACK TO USER
1386
1387 IF ALTVECT
1388BOOTMES DB 13
1389TEN: DB 10
1390 DB "MS-DOS version "
1391 DB MAJOR_VERSION + "0"
1392 DB "."
1393 DB (MINOR_VERSION / 10) + "0"
1394 DB (MINOR_VERSION MOD 10) + "0"
1395 DB 13,10
1396 DB "Copyright 1981,82 Microsoft Corp.",13,10,"$"
1397 ENDIF
1398
1399NULDEV DB "\DEV\NUL",0
1400CONDEV DB "\DEV\CON",0
1401AUXDEV DB "\DEV\AUX",0
1402PRNDEV DB "\DEV\PRN",0
1403
1404CONFIG DB "\CONFIG.SYS",0
1405
1406COMMND DB "\COMMAND.COM",0
1407
1408COMTAB LABEL BYTE
1409 DB 7,"BUFFERS",'B'
1410 DB 5,"BREAK",'C'
1411 DB 5,"SHELL",'S'
1412 DB 6,"DEVICE",'D'
1413 DB 5,"FILES",'F'
1414 DB 8,"SWITCHAR",'W'
1415 DB 8,"AVAILDEV",'A'
1416 DB 7,"COUNTRY",'Q'
1417 DB 0
1418
1419
1420SYSINITSEG ENDS
1421 END
1422
1423
1424 \ No newline at end of file