Adjust memory layout for 2.6.22+ kernels with 32KB setup code
[mknbi.git] / altboot.S
1 ! bootsect.S  -  boot sector for DOS ramdisk
2 !
3 ! Copyright (C) 1996-1998 Gero Kuhlmann   <gero@gkminix.han.de>
4 !
5 !  This program is free software; you can redistribute it and/or modify
6 !  it under the terms of the GNU General Public License as published by
7 !  the Free Software Foundation; either version 2 of the License, or
8 !  any later version.
9 !
10 !  This program is distributed in the hope that it will be useful,
11 !  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 !  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 !  GNU General Public License for more details.
14 !
15 !  You should have received a copy of the GNU General Public License
16 !  along with this program; if not, write to the Free Software
17 !  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19
20 #ifndef ASM_DEBUG
21 #undef ASM_DEBUG
22 #endif
23 #include "boot.inc"
24
25
26         .text
27
28         .org    BOOT_OFFSET
29
30
31 _main:  jmp     start
32         nop
33
34 ! Define boot record (defaults are for 1.44MB floppy disk)
35
36         .ascii  "MSDOS5.0"              ! OEM name
37 bpsect: .word   SECT_SIZE               ! bytes per sector
38 spc:    .byte   BOOT_SPC                ! number of sectors per cluster
39 resvd:  .word   1                       ! number of reserved sectors
40 fatnum: .byte   2                       ! number of FATs
41 dirnum: .word   BOOT_DIRNUM             ! number of entries in root directory
42 secnum: .word   BOOT_SECNUM             ! total number of sectors on disk
43 fmtid:  .byte   BOOT_FORMAT             ! media ID
44 spfat:  .word   BOOT_SPFAT              ! sectors per fat
45 sptrk:  .word   BOOT_SPTRK              ! sectors per track
46         .word   2                       ! number of heads
47 hidden: .long   0                       ! number of hidden sectors
48         .long   0                       ! total number of sectors on disk
49 bootid: .byte   BOOT_ID                 ! BIOS number of boot device
50         .byte   0                       ! head number of boot sector
51         .byte   0x29                    ! disk attributes
52         .long   0                       ! volume number
53         .ascii  "NO NAME    "           ! volume name
54         .ascii  "FAT12   "              ! filesystem name
55 iosys:  .word   3                       ! no of sectors in IO.SYS
56
57
58 ! Start of main routine
59
60 start:  cli
61         xor     ax,ax
62         mov     ss,ax
63         mov     sp,#_main               ! set stack to beginning of code
64         mov     ds,ax                   ! set segment registers
65         mov     es,ax
66         sti
67         xor     dx,dx
68         int     0x13                    ! initialize disk system
69
70 ! Compute the logical number of the first sector of the data area. We
71 ! assume that IO.SYS is always located at the beginning. This might
72 ! not be true for a real DOS disk, but is always correct for a disk
73 ! image produced by mknbi.
74
75         mov     al,fatnum
76         mul     word ptr (spfat)        ! compute size of FAT
77         add     ax,word ptr (hidden+0)
78         adc     dx,word ptr (hidden+2)  ! add number of hidden sectors
79         add     ax,resvd
80         adc     dx,#0                   ! add number of reserved sectors
81         mov     bx,#DIR_SEG * 16
82         call    rdsect                  ! read first directory sector
83         jc      doerr1
84
85         push    dx
86         mov     cx,ax
87         mov     ax,#32
88         mul     word ptr (dirnum)       ! compute size of root directory
89         mov     bx,bpsect               ! area
90         add     ax,bx                   ! round up to sector size
91         dec     ax
92         div     bx
93         add     ax,cx                   ! add number of sectors used by
94         pop     dx                      ! root directory
95         adc     dx,#0
96
97 ! Now load the first 3 sectors of IO.SYS at 0x0070.
98
99         push    dx
100         push    ax
101         mov     bx,#IOSYS_SEG * 16      ! get offset to IO.SYS segment from
102         mov     cx,iosys                ! start of current data segment (0)
103 start1: call    rdsect
104         jc      doerr
105         add     ax,#1
106         adc     dx,#0                   ! continue with next sector
107         add     bx,bpsect
108         loop    start1
109         pop     bx
110         pop     ax
111
112         mov     si,#endata
113         mov     ch,fmtid                ! prepare registers for IO.SYS
114         mov     dl,bootid
115         jmpi    0,IOSYS_SEG             ! call IO.SYS
116
117  
118 ! Print error message and terminate
119
120 doerr:  pop     ax
121         pop     ax
122 doerr1: mov     si,#errmsg
123 doerr2: lodsb
124         or      al,al
125         jz      doerr3
126         mov     ah,#0x0e
127         mov     bx,#7                   ! print using BIOS
128         int     0x10
129         jmp     doerr2
130 doerr3: xor     ax,ax
131         int     0x16                    ! wait for key press
132         int     0x19                    ! reboot the system
133
134
135 ! Read one logical sector into ES:BX
136
137 rdsect: push    ax
138         push    dx
139         push    cx
140         div     word ptr (sptrk)
141         inc     dl
142         mov     cl,dl                   ! convert logical sector number into
143         mov     dh,al                   ! cylinder/head/sector format
144         and     dh,#0x01
145         shr     al,#1
146         mov     ch,al
147         mov     ax,#0x0201
148         mov     dl,bootid               ! read one sector from ramdisk
149         int     0x13
150         pop     cx
151         pop     dx
152         pop     ax
153         ret
154
155
156 ! Data area
157
158 errmsg: .byte   0x0d, 0x0a
159         .ascii  "Ramdisk error - press any key to continue"
160         .byte   0x0d, 0x0a
161         .byte   0
162
163 endata:
164
165
166 ! The end of the boot sectors has to contain the boot signature.
167
168         .org    BOOT_SIG_OFS
169         .word   BOOT_SIG                ! boot sector signature
170