turnera@pur-ee.UUCP (Turner) (02/10/85)
I am not familiar with the article that Mr. Kenley refers to but about a year ago I wrote my own fast boot routine. So far, it has worked beautifully with a variety of different system configurations and software. In spite of comments by Al Schwartz it works fine with DOS 2.0 (it has not been tested with other versions of DOS). My routine works by setting the system board switches for some small amount of RAM, I set mine for 64K. This causes my system to initialize 64K of RAM. Thus booting from drive A: starts about 5 seconds after turning the power on. I then intervene in the boot process to tell the system how much RAM it actually has and, to avoid parity errors, I initialize all the additional RAM. In my system I have a total of 320K RAM and the initialization of the additional 256K takes about a second. So, in my system, what used to take about 30 seconds now takes only 6 seconds. This decrease in startup time has completely changed my mind about when it was worth firing up my system. Be aware that my routine is not very bright. It must be specifically taylored for each system. This is not hard to do so I will discuss the routine for my system and then point out what needs to be changed for others. Theory of Operation When the pc is turned on the startup process sets two memory locations according to the system board switch settings. These locations are: 40:13H total system ram (in K) 40:15H total I/O ram (in K) With the system board switches indicating 64K of ram these values will be wrong so the fast boot routine must set 40:13H and 40:15H to the correct values. My system has a 64K motherboard and 256K on an expansion card so my total system ram is 320K (140H) and my I/O ram is 256K (100H). Also, the fast boot routine must initialize all the ram above the first 64K. A quick check with the debug miniassembler shows that the entire routine requires about 50 bytes. After the system has initialized the ram according to the switch settings it then loads the first sector of track 0 on drive A: into memory location 0:7c00H and jumps to that location to execute the bootup routine. A look at that sector for DOS 2.0 shows that the first program step is a jump to offset 2EH which must be the start of the DOS bootup routine. -l 4000:0 0 0 1 -u 4000:0 l2 4000:0000 EB2C JMP 002E If I can find a place on this sector to put my 50 byte fast boot routine then I can replace the JMP 002E with a JMP to the start of my routine. Then after my routine is done I can JMP to the DOS bootup routine at 002E. An examination of the remainder of track 0 sector 1 shows that there are no unused areas in the sector but there are several rarely used error messages -d 4000:190 4000:0190 6B 20 6F 72 20 64 69 73-6B 20 65 72 72 6F 72 0D k or disk error. 4000:01A0 0A 52 65 70 6C 61 63 65-20 61 6E 64 20 73 74 72 .Replace and str 4000:01B0 69 6B 65 20 61 6E 79 20-6B 65 79 20 77 68 65 6E ike any key when 4000:01C0 20 72 65 61 64 79 0D 0A-00 0D 0A 44 69 73 6B 20 ready.....Disk 4000:01D0 42 6F 6F 74 20 66 61 69-6C 75 72 65 0D 0A 00 69 Boot failure...i 4000:01E0 62 6D 62 69 6F 20 20 63-6F 6D 30 69 62 6D 64 6F bmbio com0ibmdo 4000:01F0 73 20 20 63 6F 6D 30 00-00 00 00 00 00 00 55 AA s com0.......U* 4000:0200 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ twords the end of the sector. After looking at them I decided to place my routine at 1A0. Therefore, the first program step of sector 1 track 0 must become JMP 01A0 and the fast boot routine begins at 1A0. Below is a listing of the routine with comments. -l 4000:0 0 0 1 -u 4000:0 l3 1000:0000 E99D01 JMP 01A0 ;jump to fast boot routine -u 4000:1a0 l2d 4000:01A0 B84000 MOV AX,0040 ;set data segment 4000:01A3 8ED8 MOV DS,AX ;to 0040 4000:01A5 BB1300 MOV BX,0013 ;ds:bx = 40:13 ttl sys ram address 4000:01A8 B84001 MOV AX,0140 ;load ax with ttl sys RAM (note 1) 4000:01AB 8907 MOV [BX],AX ;set 40:13 to ttl sys RAM 4000:01AD 43 INC BX ;ds:bx = 40:14 4000:01AE 43 INC BX ;ds:bx = 40:15 = ttl I/O ram add 4000:01AF 2C40 SUB AL,40 ;subtract 64K from ttl ram (note 2) 4000:01B1 8907 MOV [BX],AX ;set 40:15 to ttl I/O ram 4000:01B3 B80010 MOV AX,1000 ;set starting seg for initialization 4000:01B6 31C9 XOR CX,CX ;zero cx, ram will be set to zero 4000:01B8 89CB MOV BX,CX ;set offset to zero 4000:01BA 8ED8 MOV DS,AX ;load ds with segment 4000:01BC 890F MOV [BX],CX ;set ds:[bx] to zero 4000:01BE 43 INC BX ;set ds:[bx] 4000:01BF 43 INC BX ;to next address 4000:01C0 75FA JNZ 01BC ;done with this segment? 4000:01C2 80C410 ADD AH,10 ;set up ax for next segment 4000:01C5 80FC50 CMP AH,50 ;done with initialization? (note 3) 4000:01C8 7402 JZ 01CC ;yes, jump to DOS bootup 4000:01CA EBEE JMP 01BA ;no, initialize next segment 4000:01CC E95FFE JMP 002E ;jump to DOS bootup (note 4) Notes: 1. The total system ram will vary from system to system. Change the value used here to the correct value for your system. 2. My system has a 64K motherboard therefore if I subtract 40H from the total system ram I will get the correct total for I/O ram. For systems with 256K motherboards the program step: SUB AL,40 should be replaced by DEC AH this subtracts 0100H from the total system ram giving the correct value for total I/O ram. 3. This is the value for the segment of ram where initialization will cease. In my system, ram occupies segments 0000 through 4000 therefore I stop initialization when AH = 50. 4. If you are using a version of DOS other than 2.0 you may need to modify this program slightly. Specifically, the DOS bootup proceedure may begin somewhere other than offset 2EH and the error messages may be in a different location. I have no version of DOS higher than 2.0 so I don't know if modifications are required for 2.1 or 3.X. Example: Mr. Kenley stated that he has 640K of RAM. Assuming that he has DOS 2.0, a 256K motherboard and has set his system switches for 64K the fast boot routine becomes: -l 4000:0 0 0 1 -u 4000:0 l3 4000:0000 E99D01 JMP 01A0 -u 4000:1a0 l30 4000:01A0 B84000 MOV AX,0040 4000:01A3 8ED8 MOV DS,AX 4000:01A5 BB1300 MOV BX,0013 4000:01A8 B84001 MOV AX,0280 4000:01AB 8907 MOV [BX],AX 4000:01AD 43 INC BX 4000:01AE 43 INC BX 4000:01AF FECC DEC AH 4000:01B1 8907 MOV [BX],AX 4000:01B3 B80010 MOV AX,1000 4000:01B6 31C9 XOR CX,CX 4000:01B8 89CB MOV BX,CX 4000:01BA 8ED8 MOV DS,AX 4000:01BC 890F MOV [BX],CX 4000:01BE 43 INC BX 4000:01BF 43 INC BX 4000:01C0 75FA JNZ 01BC 4000:01C2 80C410 ADD AH,10 4000:01C5 80FC50 CMP AH,A0 4000:01C8 7402 JZ 01CC 4000:01CA EBEE JMP 01BA 4000:01CC E95FFE JMP 002E Once you have decided what changes are necessary for your specific system you can modify track 0 sector 1 of your boot disk with the DOS debugger as follows. Start debug then place your boot disk in drive A: (a backup of your boot disk is wiser). Then proceed as follows (select a value for XXXX as is appropriate for your system). -l XXXX:0 0 0 1 -a XXXX:0 XXXX:0000 jmp 1a0 XXXX:0003 ^C -a XXXX:1a0 XXXX:01A0 mov ax,0040 XXXX:01A3 mov ds,ax . . . XXXX:01CC jmp 2e XXXX:01CF ^C -w XXXX:0 0 0 1 -q Set your system board switches for 64K and you're all ready to stop waiting. In the time that my friends and I have been using this routine we have only encountered problems with two pieces of software. They are QuadRam's Quaddrive (QD) and MicroPro's installation program (wsinst?). Both crashed immediatly, claiming insufficient memory. Clearly, they read the switches instead of the RAM. Otherwise, we have successfully used a wide variety of word processors, text editors, spreadsheets, compilers, data bases and games with no apparent side effects. Oh yes, once I got a garbled error message, but somehow, I was able to decipher it.