Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 1
boot.ASM



      1				     ; BOOTEASY, version 1.7.
      2				     ; Developed from BOOTANY, with many improvements.
      3				     ; The main	idea was to simplify the installation
      4				     ; procedure and to	remove unnecessary partition type switching.
      5				     ; Second hard disk	switching added.
      6				     ; Author: Serge Vakulenko,	<vak@kiae.su>
      7
      8	      =003B		     F1_scancode     equ     59		     ; scancode	of 'F1'	key
      9	      =001C		     Enter_scancode  equ     28		     ; scancode	of 'Enter' key
     10	      =0005		     Timeout	     equ     5		     ; wait up to 5 seconds for	reply
     11
     12	      =7C00		     StdBase	     equ     7c00h	     ; address where DOS loads us
     13	      =0600		     Base	     equ     600h	     ; address where we	rewrite	itself
     14	      =01BE		     Partab	     equ     1beh	     ; partition table offset
     15	      =0475		     NumDisks	     equ     475h	     ; number of disk drives (BIOS data	area)
     16
     17	      =0000		     BootIndicator   equ     0		     ; partition record: boot indicator
     18	      =0001		     BeginHead	     equ     1		     ; first partition sector: head number
     19	      =0002		     BeginSector     equ     2		     ; sector and cylinder
     20	      =0004		     SystemId	     equ     4		     ; system type
     21
     22				     ; -------------------------------
     23
     24	0000			     dummy	     segment at	0
     25						     assume  cs:dummy
     26						     org     Base	     ; address where we	rewrite	itself
     27	0600			     BaseEntry:
     28						     org     StdBase	     ; address where DOS loads us
     29	7C00			     StdBaseEntry:
     30	7C00			     dummy	     ends
     31
     32				     ; -------------------------------
     33
     34	0000			     code	     segment
     35						     assume  cs:code, ds:code, es:code,	ss:code
     36						     org     0
     37	0000			     Boot:
     38				     ;
     39				     ;		     Setup the stack and segment registers
     40				     ;
     41	0000  33 C0				     xor     AX,AX	     ; Zero register
     42	0002  8E C0				     mov     ES,AX	     ; ES := 0
     43	0004  8E D8				     mov     DS,AX	     ; DS := 0
     44	0006  8E D0				     mov     SS,AX	     ; disables	intrs up to the	next command
     45	0008  BC 7C00				     mov     SP,StdBase	     ; SP at 7c00
     46				     ;
     47				     ;		     DOS loads this pgm	at 0000:7C00. Any boot routine
     48				     ;		     we	call also expects to execute there so the first
     49				     ;		     exercise is to move this code somewhere else.
     50				     ;
     51	000B  FC				     cld		     ; Clear direction
     52	000C  8B F4				     mov     SI,SP	     ; Copy from 7c00h...
     53	000E  BF 0600				     mov     DI,Base	     ; ...to 600h...
     54	0011  B9 0100				     mov     CX,256	     ; ...512 bytes, or	256 words
     55	0014  F2> A5				     repne   movsw	     ; Move itself to new location
     56
     57	0016  EA 00000667sr			     jmp     FAR PTR BaseEntry+(Entry-Boot)
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 2
boot.ASM



     58
     59				     ; -------------------------------
     60				     ;
     61				     ;		     A valid function key was depressed	(or defaulted)
     62				     ;		     Attempt to	boot the corresponding partition.
     63				     ;
     64	001B			     Load:
     65	001B  8B D5				     mov     DX,BP	     ; restore drive number
     66	001D  58				     pop     AX		     ; key '1'..'5'
     67	001E  A2 074Fr				     mov     Base+default,AL ; save function key number
     68	0021  3C 35				     cmp     AL,'5'
     69	0023  74 23				     je	     SwitchDrive
     70	0025  B4 10				     mov     AH,16
     71	0027  F6 E4				     mul     AH		     ; AX = key	* 16
     72	0029  05 04AE				     add     AX,Base+Partab-'1'*16 ; subtract '1'
     73	002C  8B F0				     mov     SI,AX
     74				     ;
     75				     ;		     Check if the partition is empty.
     76				     ;
     77	002E  80 7C 04 00			     cmp     BYTE PTR SystemId[SI],0
     78	0032  74 44				     je	     Menu	     ; Empty - display menu again
     79	0034  80 7C 04 05			     cmp     BYTE PTR SystemId[SI],05h
     80	0038  74 3E				     je	     Menu	     ; DOS extended type - never load
     81
     82	003A  C6 04 80				     mov     BYTE PTR BootIndicator[SI],80h ; Mark partition as	bootable
     83	003D  E8 00DA				     call    SaveBoot
     84				     ;
     85				     ;		     Read in and validate the partition's boot sector.
     86				     ;
     87	0040  8A 74 01				     mov     DH,BeginHead[SI] ;	head from partition table
     88	0043  8B 4C 02				     mov     CX,BeginSector[SI]
     89	0046  EB 08				     jmp     loadboot
     90				     ;
     91				     ;		     Read in the boot sector from second disk.
     92				     ;
     93	0048			     SwitchDrive:
     94	0048  E8 00CF				     call    SaveBoot
     95	004B  B9 0001				     mov     CX,0001h	     ; cylinder	0, sector 1
     96	004E  32 D1				     xor     DL,CL	     ; (DL ^= 1) switch	drive
     97	0050			     loadboot:
     98	0050  BB 7C00				     mov     BX,StdBase	     ; ES already == 0
     99	0053  B8 0201				     mov     AX,0201h	     ; function, # of sectors
    100	0056  CD 13				     int     13h	     ; read system boot	record
    101	0058  72 1E				     jc	     Menu	     ; exit if error
    102	005A  81 BF 01FE AA55			     cmp     WORD PTR 510[BX],0aa55h ; test signature
    103	0060  75 16				     jne     Menu	     ; reprompt	if invalid
    104				     ;
    105				     ;		     Jump to secondary boot.
    106				     ;		     DL	now contains boot disk number (80h or 81h);
    107				     ;		     ES:SI contains the	address	of partition table
    108				     ;		     entry to boot.
    109				     ;
    110	0062  EA 00007C00sr			     jmp     FAR PTR StdBaseEntry
    111
    112				     ; -------------------------------
    113				     ;
    114				     ;		     The main entry to the boot
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 3
boot.ASM



    115				     ;
    116	0067			     Entry:
    117	0067  80 FA 81				     cmp     DL,81h	     ; DL contains current drive number
    118	006A  74 02				     je	     driveok	     ; is it valid?
    119	006C  B2 80				     mov     DL,80h	     ; no - use	the default value
    120	006E  8B EA		     driveok:	     mov     BP,DX	     ; save the	drive number
    121	0070  42				     inc     DX		     ; 80h -> 81h, 81h -> 82h
    122	0071  80 F2 B3				     xor     DL,80h+'3'	     ; 80h -> '2', 81h -> '1'
    123	0074  88 16 0741r			     mov     Base+diskNum,DL
    124				     ;
    125				     ;		     Display the menu
    126				     ;
    127	0078			     Menu:
    128	0078  BF 07BE				     mov     DI,Base+Partab  ; set index
    129	007B  B9 0004				     mov     CX,4	     ; set loop	count
    130	007E  C6 06 0734r 31			     mov     Base+key,'1'    ; set key number in message
    131	0083  32 F6				     xor     DH,DH	     ; count of	partitions
    132	0085			     menuloop:
    133	0085  88 2D				     mov     BYTE PTR BootIndicator[DI],CH ; Clear active flag
    134	0087  8A 45 04				     mov     AL,SystemId[DI]
    135	008A  3C 00				     cmp     AL,0	     ; unused partition?
    136	008C  74 23				     je	     next
    137	008E  3C 05				     cmp     AL,5	     ; extended	DOS partition?
    138	0090  74 1F				     je	     next
    139	0092  FE C6				     inc     DH		     ; increment partition count
    140
    141	0094  BE 0731r				     lea     SI,Base+FkeyMsg ; get msg addr
    142	0097  E8 0071				     call    Output
    143
    144	009A  BE 074Fr				     lea     SI,Base+nameTable-2
    145	009D			     nameloop:
    146	009D  46				     inc     SI
    147	009E  46				     inc     SI
    148	009F  8B 1C				     mov     BX,[SI]
    149	00A1  0A FF				     or	     BH,BH
    150	00A3  74 05				     je	     endnameloop
    151	00A5  32 7D 04				     xor     BH,SystemId[DI]
    152	00A8  75 F3				     jne     nameloop
    153	00AA			     endnameloop:
    154	00AA  8D B7 077Br			     lea     SI,Base+namtab[BX]
    155	00AE  E8 005A				     call    Output
    156	00B1			     next:
    157	00B1  83 C7 10				     add     DI,16	     ; next entry address
    158	00B4  FE 06 0734r			     inc     Base+key
    159	00B8  E2 CB				     loop    menuloop
    160
    161	00BA  80 3E 0475 02			     cmp     BYTE PTR DS:NumDisks,2 ; is the second disk present?
    162	00BF  74 0B				     je	     have2disks	     ; have disk 2
    163
    164	00C1  BE 0742r				     lea     SI,Base+defaultMsg	; prepare 'Default' message
    165	00C4  0A F6				     or	     DH,DH	     ; no disk 2; do we	have valid partitions?
    166	00C6  75 0A				     jne     prompt	     ; several partitions, wait	for reply
    167
    168	00C8  CD 18				     int     18h	     ; no partitions, load ROM basic
    169	00CA  EB AC				     jmp     Menu	     ; repeat, if no ROM basic
    170	00CC			     have2disks:
    171	00CC  BE 0731r				     lea     SI,Base+FkeyMsg ; print 'F5'
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 4
boot.ASM



    172	00CF  E8 0039				     call    Output	     ; now SI points to	"disk 2\nDefault..."
    173	00D2			     prompt:
    174	00D2  E8 0036				     call    Output	     ; print 'Default' message
    175	00D5			     reprompt:
    176	00D5  32 E4				     xor     AH,AH	     ; GetTickCount
    177	00D7  CD 1A				     int     1ah	     ; BiosTimerService
    178	00D9  8B DA				     mov     BX,DX	     ; lo-order	tick count
    179	00DB  83 C3 60				     add     BX,192*Timeout/10 ; timeout value in ticks
    180				     ;
    181				     ;		     Get the reply
    182				     ;
    183	00DE			     waitkey:
    184	00DE  B4 01				     mov     AH,1	     ; keyboard	status
    185	00E0  CD 16				     int     16h	     ; keybd bios service
    186	00E2  B4 00				     mov     AH,0	     ; GetTickCount
    187	00E4  75 0B				     jnz     reply	     ; jump if reply
    188	00E6  CD 1A				     int     1ah	     ; BiosTimerService
    189	00E8  3B D3				     cmp     DX,BX	     ; check for timeout
    190	00EA  72 F2				     jb	     waitkey	     ; wait for	scancode
    191	00EC			     loaddefault:
    192	00EC  A0 074Fr				     mov     AL,Base+default ; prior system id
    193	00EF  EB 0A				     jmp     testkey	     ; boot default system
    194	00F1			     reply:
    195	00F1  CD 16				     int     16h	     ; AH=0, keybd bios	service
    196	00F3  8A C4				     mov     AL,AH	     ; Copy to AL
    197	00F5  3C 1C				     cmp     AL,Enter_scancode
    198	00F7  74 F3				     je	     loaddefault
    199	00F9  04 F6				     add     AL,'1'-F1_scancode	; Turn into index
    200	00FB			     testkey:
    201	00FB  3C 31				     cmp     AL,'1'	     ; max Function key
    202	00FD  72 D6				     jb	     reprompt	     ; Invalid code check
    203	00FF  3C 35				     cmp     AL,'5'	     ; max Function key
    204	0101  77 D2				     jnbe    reprompt	     ; if not F1..F5, branch
    205	0103  50				     push    AX
    206
    207	0104  BE 072Fr				     lea     SI,Base+newLine ; new line
    208	0107  BB 061Br				     lea     BX,Base+Load
    209	010A  53				     push    BX		     ; call Output; jmp	Load
    210
    211				     ; -------------------------------
    212				     ;
    213				     ;		     Output line [SI] to screen, end of	line marked with 80h
    214				     ;
    215	010B			     Output:
    216	010B  FC				     cld		     ; reset direction flag
    217	010C  AC				     lodsb		     ; load argument from string
    218	010D  50				     push    AX		     ; save byte
    219	010E  24 7F				     and     AL,7fh	     ; insure valid character
    220	0110  B4 0E				     mov     AH,14	     ; write tty
    221	0112  CD 10				     int     10h	     ; bios video service
    222	0114  58				     pop     AX		     ; restore byte
    223	0115  A8 80				     test    AL,80h	     ; test for	end of string
    224	0117  74 F2				     jz	     Output	     ; do until	end of string
    225	0119  C3				     ret		     ; return to caller
    226
    227				     ; -------------------------------
    228				     ;
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 5
boot.ASM



    229				     ;		     Save boot block default partition settings
    230				     ;
    231	011A			     SaveBoot:
    232	011A  56				     push    SI
    233	011B  B8 0301				     mov     AX,0301h	     ; write sector
    234	011E  BB 0600				     mov     BX,Base	     ; ES already == 0
    235	0121  B9 0001				     mov     CX,0001h	     ; cylinder	0, sector 1
    236	0124  32 F6				     xor     DH,DH	     ; drive #,	head 0
    237	0126  CD 13				     int     13h	     ; replace boot record
    238	0128  5E				     pop     SI
    239	0129  C6 06 074Fr 3F			     mov     Base+default,'?' ;	reset default
    240	012E  C3				     ret
    241
    242				     ; -------------------------------
    243
    244	012F  0D 8A		     newLine	     db	     13,10+80h
    245	0131  0D 0A 46		     FkeyMsg	     db	     13,10,'F'
    246	0134  30 20 2E 20 2E 20	2E+  key	     db	     '0	. . .',' '+80h,'disk '
    247	      A0 64 69 73 6B 20
    248	0141  31		     diskNum	     db	     '1'
    249	0142  0D 0A 0A 44 65 66	61+  defaultMsg	     db	     13,10,10,'Default:	F'
    250	      75 6C 74 3A 20 46
    251	014F  3F A0		     default	     db	     '?',' '+80h
    252
    253	0151  00 01		     nameTable	     db	     dos     -namtab,	1
    254	0153  00 04				     db	     dos     -namtab,	4
    255	0155  00 06				     db	     dos     -namtab,	6
    256	0157  03 07				     db	     hpfs    -namtab,	7
    257	0159  07 0A				     db	     os2     -namtab,  0Ah
    258	015B  0A 63				     db	     unix    -namtab,  63h
    259	015D  0E 64				     db	     novell  -namtab,  64h
    260	015F  0E 65				     db	     novell  -namtab,  65h
    261	0161  14 80				     db	     minix   -namtab,  80h
    262	0163  19 81				     db	     linux   -namtab,  81h
    263	0165  19 82				     db	     linux   -namtab,  82h
    264	0167  19 83				     db	     linux   -namtab,  83h
    265	0169  1E 93				     db	     amoeba  -namtab,  93h
    266	016B  24 A5				     db	     freebsd -namtab, 0A5h
    267	016D  2B 9F				     db	     bsdi    -namtab,  9fh
    268	016F  2F 75				     db	     pcix    -namtab,  75h
    269	0171  33 52				     db	     cpm     -namtab,  52h
    270	0173  33 DB				     db	     cpm     -namtab, 0dbh
    271	0175  36 40				     db	     venix   -namtab,  40h
    272	0177  3B F2				     db	     dossec  -namtab, 0F2h
    273	0179  41 00				     db	     noname  -namtab,	0
    274
    275	017B			     namtab:
    276	017B  44 6F F3		     dos	     db	     'Do','s'+80h
    277	017E  48 70 66 F3	     hpfs	     db	     'Hpf','s'+80h
    278	0182  4F 73 B2		     os2	     db	     'Os','2'+80h
    279	0185  55 6E 69 F8	     unix	     db	     'Uni','x'+80h
    280	0189  4E 6F 76 65 6C EC	     novell	     db	     'Novel','l'+80h
    281	018F  4D 69 6E 69 F8	     minix	     db	     'Mini','x'+80h
    282	0194  4C 69 6E 75 F8	     linux	     db	     'Linu','x'+80h
    283	0199  41 6D 6F 65 62 E1	     amoeba	     db	     'Amoeb','a'+80h
    284	019F  46 72 65 65 42 53	C4   freebsd	     db	     'FreeBS','D'+80h
    285	01A6  42 53 44 E9	     bsdi	     db	     'BSD','i'+80h
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 6
boot.ASM



    286	01AA  50 63 69 F8	     pcix	     db	     'Pci','x'+80h
    287	01AE  43 70 ED		     cpm	     db	     'Cp','m'+80h
    288	01B1  56 65 6E 69 F8	     venix	     db	     'Veni','x'+80h
    289	01B6  44 6F 73 73 65 E3	     dossec	     db	     'Dosse','c'+80h
    290	01BC  3F BF		     noname	     db	     '?','?'+80h
    291
    292	      =01BE		     used	     equ     $ - Boot
    293	01BE  01*(00)				     db	     (1beh - used + 1) dup (0) ; error if code too big
    294	01BF  3F*(00)				     db	     63	dup (0)	     ; clear rest of record
    295	01FE  AA55				     dw	     0aa55h	     ; magic
    296
    297	0200			     code	     ends
    298						     end
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 7
Symbol Table




Symbol Name		Type   Value			   Cref	(defined at #)

??DATE			Text   "11/14/95"
??FILENAME		Text   "boot	"
??TIME			Text   "18:41:35"
??VERSION		Number 030A
@CPU			Text   0101H
@CURSEG			Text   CODE			   #24	#34
@FILENAME		Text   BOOT
@WORDSIZE		Text   2			   #24	#34
AMOEBA			Byte   CODE:0199		   265	#283
BASE			Number 0600			   #13	26  53	67  72	123  128  130  141  144	 154  158  164	171  192  +
							   207	208  234  239
BASEENTRY		Near   DUMMY:0600		   #27	57
BEGINHEAD		Number 0001			   #18	87
BEGINSECTOR		Number 0002			   #19	88
BOOT			Near   CODE:0000		   #37	57  292
BOOTINDICATOR		Number 0000			   #17	82  133
BSDI			Byte   CODE:01A6		   267	#285
CPM			Byte   CODE:01AE		   269	270  #287
DEFAULT			Byte   CODE:014F		   67  192  239	 #251
DEFAULTMSG		Byte   CODE:0142		   164	#249
DISKNUM			Byte   CODE:0141		   123	#248
DOS			Byte   CODE:017B		   253	254  255  #276
DOSSEC			Byte   CODE:01B6		   272	#289
DRIVEOK			Near   CODE:006E		   118	#120
ENDNAMELOOP		Near   CODE:00AA		   150	#153
ENTER_SCANCODE		Number 001C			   #9  197
ENTRY			Near   CODE:0067		   57  #116
F1_SCANCODE		Number 003B			   #8  199
FKEYMSG			Byte   CODE:0131		   141	171  #245
FREEBSD			Byte   CODE:019F		   266	#284
HAVE2DISKS		Near   CODE:00CC		   162	#170
HPFS			Byte   CODE:017E		   256	#277
KEY			Byte   CODE:0134		   130	158  #246
LINUX			Byte   CODE:0194		   262	263  264  #282
LOAD			Near   CODE:001B		   #64	208
LOADBOOT		Near   CODE:0050		   89  #97
LOADDEFAULT		Near   CODE:00EC		   #191	 198
MENU			Near   CODE:0078		   78  80  101	103  #127  169
MENULOOP		Near   CODE:0085		   #132	 159
MINIX			Byte   CODE:018F		   261	#281
NAMELOOP		Near   CODE:009D		   #145	 152
NAMETABLE		Byte   CODE:0151		   144	#253
NAMTAB			Near   CODE:017B		   154	253  254  255  256  257	 258  259  260	261  262  263  264  265	  +
							   266	267  268  269  270  271	 272  273  #275
NEWLINE			Byte   CODE:012F		   207	#244
NEXT			Near   CODE:00B1		   136	138  #156
NONAME			Byte   CODE:01BC		   273	#290
NOVELL			Byte   CODE:0189		   259	260  #280
NUMDISKS		Number 0475			   #15	161
OS2			Byte   CODE:0182		   257	#278
OUTPUT			Near   CODE:010B		   142	155  172  174  #215  224
PARTAB			Number 01BE			   #14	72  128
PCIX			Byte   CODE:01AA		   268	#286
PROMPT			Near   CODE:00D2		   166	#173
Turbo Assembler	 Version 3.1	    11/14/95 18:41:36	    Page 8
Symbol Table



REPLY			Near   CODE:00F1		   187	#194
REPROMPT		Near   CODE:00D5		   #175	 202  204
SAVEBOOT		Near   CODE:011A		   83  94  #231
STDBASE			Number 7C00			   #12	28  45	98
STDBASEENTRY		Near   DUMMY:7C00		   #29	110
SWITCHDRIVE		Near   CODE:0048		   69  #93
SYSTEMID		Number 0004			   #20	77  79	134  151
TESTKEY			Near   CODE:00FB		   193	#200
TIMEOUT			Number 0005			   #10	179
UNIX			Byte   CODE:0185		   258	#279
USED			Number 01BE			   #292	 293
VENIX			Byte   CODE:01B1		   271	#288
WAITKEY			Near   CODE:00DE		   #183	 190

Groups & Segments	Bit Size Align	Combine	Class	   Cref	(defined at #)

CODE			16  0200 Para	none		   #34	35  35	35  35
DUMMY			16  7C00  AT 0000		   #24	25