]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/FDISK/FDBOOT.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / FDISK / FDBOOT.ASM
1 ; BOOT - IBM hard disk boot record 6/8/82
2 ;
3 ;
4 ; This is the standard boot record that will be shipped on all hard disks. It contains:
5 ;
6 ; 1. Code to load (and give control to) the boot record for 1 of 4 possible
7 ; operating systems.
8 ;
9 ; 2. A partition table at the end of the boot record, followed by the required signature.
10 ;
11 ;
12 _data segment public
13 assume cs:_data,ds:_data
14
15 org 600h
16
17 cli ;no interrupts for now
18 xor ax,ax
19 mov ss,ax
20 mov sp,7c00h ;new stack at 0:7c00
21 mov si,sp ;where this boot record starts - 0:7c00
22 push ax
23 pop es ;seg regs the same
24 push ax
25 pop ds
26 sti ;interrupts ok now
27 cld
28 mov di,0600h ;where to relocate this boot record to
29 mov cx,100h
30 repnz movsw ;relocate to 0:0600
31 ; jmp entry2
32 db 0eah
33 dw $+4,0
34 entry2:
35 mov si,offset tab ;partition table
36 mov bl,4 ;number of table entries
37 next:
38 cmp byte ptr[si],80h ;is this a bootable entry?
39 je boot ;yes
40 cmp byte ptr[si],0 ;no, is boot indicator zero?
41 jne bad ;no, it must be x"00" or x"80" to be valid
42 add si,16 ;yes, go to next entry
43 dec bl
44 jnz next
45 int 18h ;no bootable entries - go to rom basic
46 boot:
47 mov dx,[si] ;head and drive to boot from
48 mov cx,[si+2] ;cyl, sector to boot from
49 mov bp,si ;save table entry address to pass to partition boot record
50 next1:
51 add si,16 ;next table entry
52 dec bl ;# entries left
53 jz tabok ;all entries look ok
54 cmp byte ptr[si],0 ;all remaining entries should begin with zero
55 je next1 ;this one is ok
56 bad:
57 mov si,offset m1 ;oops - found a non-zero entry - the table is bad
58 msg:
59 lodsb ;get a message character
60 cmp al,0
61 je hold
62 push si
63 mov bx,7
64 mov ah,14
65 int 10h ;and display it
66 pop si
67 jmp msg ;do the entire message
68 ;
69 hold: jmp hold ;spin here - nothing more to do
70 tabok:
71 mov di,5 ;retry count
72 rdboot:
73 mov bx,7c00h ;where to read system boot record
74 mov ax,0201h ;read 1 sector
75 push di
76 int 13h ;get the boot record
77 pop di
78 jnc goboot ;successful - now give it control
79 xor ax,ax ;had an error, so
80 int 13h ;recalibrate
81 dec di ;reduce retry count
82 jnz rdboot ;if retry count above zero, go retry
83 mov si,offset m2 ;all retries done - permanent error - point to message,
84 jmp msg ;go display message and loop
85 goboot:
86 mov si,offset m3 ;prepare for invalid boot record
87 mov di,07dfeh
88 cmp word ptr [di],0aa55h ;does the boot record have the
89 ; required signature?
90 jne msg ;no, display invalid system boot record message
91 mov si,bp ;yes, pass partition table entry address
92 db 0eah
93 dw 7c00h,0
94
95 include fdisk5.cl1
96
97 org 7beh
98 tab: ;partition table
99 dw 0,0 ;partition 1 begin
100 dw 0,0 ;partition 1 end
101 dw 0,0 ;partition 1 relative sector (low, high parts)
102 dw 0,0 ;partition 1 # of sectors (low, high parts)
103 dw 0,0 ;partition 2 begin
104 dw 0,0 ;partition 2 end
105 dw 0,0 ;partition 2 relative sector
106 dw 0,0 ;partition 2 # of sectors
107 dw 0,0 ;partition 3 begin
108 dw 0,0 ;partition 3 end
109 dw 0,0 ;partition 3 relative sector
110 dw 0,0 ;partition 3 # of sectors
111 dw 0,0 ;partition 4 begin
112 dw 0,0 ;partition 4 end
113 dw 0,0 ;partition 4 relative sector
114 dw 0,0 ;partition 4 # of sectors
115 signa db 55h,0aah ;signature
116
117 _data ends
118 end
119 \1a