rev |
line source |
pascal@13691
|
1 .text
|
pascal@13691
|
2 .code16
|
pascal@19828
|
3 .arch i8086
|
pascal@13691
|
4 .org 0
|
pascal@13691
|
5
|
pascal@13691
|
6 CODESZ = 0x8000 // 16 sectors = 32Kb
|
pascal@13972
|
7 #define EXEADRS(x) x+0xC0
|
pascal@14261
|
8 #define EXELOC(x) x-0x40
|
pascal@14261
|
9 #define EXESTR(x) x-0x7F40
|
pascal@13691
|
10
|
pascal@13691
|
11 .globl _start
|
pascal@13691
|
12 _start:
|
pascal@13691
|
13 decw %bp // Magic number: MZ
|
pascal@13691
|
14 popw %dx
|
pascal@13972
|
15 jmp start0 // Bytes on last page of file
|
pascal@13691
|
16 .word (CODESZ+511)/512 // Pages in file
|
pascal@13691
|
17 .word 0 // Relocations
|
pascal@13691
|
18 .word (end_header-_start)/16 // Size of header in paragraphs
|
pascal@13691
|
19 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
|
pascal@13691
|
20 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
|
pascal@13691
|
21 .word 0xFFF0 // Initial (relative) SS value
|
pascal@13691
|
22 .word 0xFFFE // Initial SP value
|
pascal@19872
|
23 magic:
|
pascal@13691
|
24 .word 0 // Checksum
|
pascal@13729
|
25 .word EXEADRS(exestart) // Initial IP value
|
pascal@13691
|
26 .word 0xFFF0 // Initial (relative) CS value
|
pascal@13972
|
27 initramfssize:
|
pascal@13972
|
28 .word 0 // File address of relocation table
|
pascal@17810
|
29 fdcnt: // Overlay number
|
pascal@14257
|
30 .byte 0 // Bootstrap floppy sector count
|
pascal@17810
|
31 .ascii "slitaz"
|
pascal@13691
|
32
|
pascal@13691
|
33 /////////////////////// Master Boot Record code //////////////////////////////
|
pascal@13691
|
34
|
pascal@17810
|
35 moved = 0x8000
|
pascal@17496
|
36 start0:
|
pascal@19827
|
37 //pushw %dx // restore %sp
|
pascal@19827
|
38 //incw %bp // restore %bp
|
pascal@17496
|
39 xorw %bx, %bx
|
pascal@17496
|
40 movw %bx, %ds
|
pascal@17496
|
41 movb $0x7C, %bh
|
pascal@19827
|
42 pushw %ds
|
pascal@19827
|
43 popw %ss
|
pascal@19827
|
44 movw %bx, %sp
|
pascal@17496
|
45 pushw %bx // return address
|
pascal@19827
|
46 pushw %di
|
pascal@17496
|
47 pushw %es // save %es:%di
|
pascal@13972
|
48 cld
|
pascal@17496
|
49 sti
|
pascal@13972
|
50 pushw %ds
|
pascal@13972
|
51 popw %es
|
pascal@13691
|
52 call setreg
|
pascal@13691
|
53 rep
|
pascal@19827
|
54 movsw
|
pascal@13972
|
55 movw $0x80, %dx
|
pascal@17810
|
56 ljmp $0, $moved+start2
|
pascal@17810
|
57 .byte 0
|
pascal@17810
|
58 // .org 60
|
pascal@17810
|
59 // .long 0x0080 // PE header offset
|
pascal@17810
|
60 .org 64
|
pascal@13972
|
61 end_header:
|
pascal@13972
|
62 comstart:
|
pascal@13972
|
63 .word 0
|
pascal@13691
|
64
|
pascal@17810
|
65 .org 66
|
pascal@17810
|
66 dxloop:
|
pascal@17810
|
67 start2:
|
pascal@17810
|
68 call readsector1 // look for the boot device
|
pascal@17810
|
69 repe
|
pascal@17810
|
70 cmpsw
|
pascal@17810
|
71 je dxfound
|
pascal@17810
|
72 movb $0, %cl // ch = 0
|
pascal@17810
|
73 addb $0x7D, %dl // try every hard disk
|
pascal@17810
|
74 jno dxloop
|
pascal@17810
|
75
|
pascal@17810
|
76 dxfound:
|
pascal@17810
|
77 call readsectorX // read isolinux boot sector
|
pascal@17810
|
78 cmpw (%bx), %cx
|
pascal@17810
|
79 jnc puts // read fail or no isohydrid boot sector
|
pascal@19827
|
80 movw $patch,%si
|
pascal@17810
|
81 popw %es
|
pascal@19827
|
82 popw %di // isolinux boot needs %es:%di and %dx
|
pascal@17810
|
83 putsret:
|
pascal@17810
|
84 ret
|
pascal@17810
|
85
|
pascal@17810
|
86 putstrlp:
|
pascal@17810
|
87 movw $7, %bx
|
pascal@17810
|
88 movb $0xE, %ah
|
pascal@17810
|
89 int $0x10
|
pascal@17810
|
90 error:
|
pascal@17810
|
91 lodsb
|
pascal@17810
|
92 cmp $1, %al
|
pascal@17810
|
93 jg putstrlp
|
pascal@17810
|
94 jz putsret
|
pascal@17810
|
95 puts:
|
pascal@17810
|
96 movb $0x80, %ah
|
pascal@17810
|
97 xchgw %ax, %si
|
pascal@17810
|
98 jnc error
|
pascal@17810
|
99 halt:
|
pascal@17810
|
100 hlt
|
pascal@17810
|
101 jmp halt
|
pascal@17810
|
102 nobsmsg:
|
pascal@17810
|
103 .asciz "No isolinux."
|
pascal@17810
|
104
|
pascal@17810
|
105 .org 0x0080
|
pascal@17810
|
106 ////////////////////////////// EXE/PE header //////////////////////////////////
|
pascal@17810
|
107
|
pascal@17810
|
108 .org 0x01A0
|
pascal@17496
|
109 readsectorX: // read isolinux boot sector
|
pascal@17496
|
110 movb $0xA5, %cl // patched by installer
|
pascal@13699
|
111 readsector1:
|
pascal@17496
|
112 andb $0x83, %dl // disk and floppy disk
|
pascal@13699
|
113 movw %cx, (%bx)
|
pascal@13699
|
114 incw %cx
|
pascal@13699
|
115 movw $0x201, %ax
|
pascal@13699
|
116 int $0x13
|
pascal@13691
|
117 setreg:
|
pascal@13699
|
118 movw %bx, %si
|
pascal@17810
|
119 movw $moved, %di
|
pascal@13691
|
120 movw $0x0100, %cx
|
pascal@17810
|
121 movb $nobsmsg, %al
|
pascal@13691
|
122 ret
|
pascal@17810
|
123 .org 0x01B8
|
pascal@14267
|
124
|
pascal@19827
|
125 ////////////////////////// partition boot code ////////////////////////////////
|
pascal@19842
|
126 // assume DS=SS BX=7C00 CH=01 DL=<drive> SI=7DBE
|
pascal@19827
|
127
|
pascal@19827
|
128 .org 0x7C00
|
pascal@19827
|
129 jmp bootpartition
|
pascal@19827
|
130 .org 0x7C03
|
pascal@19827
|
131 .org 0x7DBE
|
pascal@19827
|
132 table = moved+0x1BE
|
pascal@19827
|
133 patch:
|
pascal@19827
|
134 .byte 0,0,0 // head of original bs
|
pascal@19827
|
135 partcode:
|
pascal@19837
|
136 popw %si
|
pascal@19837
|
137 xchgw %si,%di
|
pascal@19827
|
138 call movepartition
|
pascal@19837
|
139 pushw %cx
|
pascal@19837
|
140 pushw %cx
|
pascal@19842
|
141 decw %di
|
pascal@19842
|
142 decw %di
|
pascal@19827
|
143 movb $4,%cl
|
pascal@19842
|
144 movw $16,%ax
|
pascal@19827
|
145 next:
|
pascal@19842
|
146 subw %ax,%di
|
pascal@19827
|
147 cmpb %ch,(%di) // boot flag ?
|
pascal@19827
|
148 loope next
|
pascal@19828
|
149 pushw 10(%di)
|
pascal@19828
|
150 pushw 8(%di)
|
pascal@19837
|
151 pushw %cs
|
pascal@19827
|
152 pushw %bx
|
pascal@19828
|
153 movb $1,%cl
|
pascal@19828
|
154 pushw %cx
|
pascal@19828
|
155 pushw %ax
|
pascal@19827
|
156 movw %sp,%si // assume %ds = %ss
|
pascal@19828
|
157 pushw %bx
|
pascal@19837
|
158 cmpw $63,2(%di) // empty or isolinux partition ?
|
pascal@19828
|
159 jbe default
|
pascal@19827
|
160 movb $0x42,%ah
|
pascal@19827
|
161 int $0x13
|
pascal@19827
|
162 default:
|
pascal@19827
|
163 ret
|
pascal@19828
|
164 .org 0x7DF0
|
pascal@19827
|
165 bootpartition:
|
pascal@19827
|
166 pushw %ds
|
pascal@19827
|
167 popw %es
|
pascal@19827
|
168 pushw %si
|
pascal@19827
|
169 movw %bx,%di
|
pascal@19827
|
170 movsw
|
pascal@19827
|
171 movsb
|
pascal@19837
|
172 movw $table-0x142,%di
|
pascal@19827
|
173 pushw %di
|
pascal@19827
|
174 movepartition:
|
pascal@19828
|
175 movb $66,%cl // 0142 and 0042
|
pascal@19827
|
176 rep
|
pascal@19828
|
177 movsb
|
pascal@19827
|
178 ret
|
pascal@19827
|
179 .org 0x7E00
|
pascal@19827
|
180
|
pascal@19870
|
181 .org 0x7F83
|
pascal@13691
|
182 ////////////////////////////// DOS EXE code ///////////////////////////////////
|
pascal@13691
|
183
|
pascal@13729
|
184 exestart:
|
pascal@13699
|
185 cld
|
pascal@17810
|
186 movw 129, %ax
|
pascal@17473
|
187 cmpb $0x2F, %al
|
pascal@17473
|
188 je ishelp
|
pascal@17473
|
189 cmpw $0x2F20, %ax
|
pascal@17473
|
190 ishelp:
|
pascal@17473
|
191 movw $0x3000+EXESTR(help), %ax
|
pascal@13729
|
192 cwd // clear dx
|
pascal@17454
|
193 pushw %dx // dos exit()
|
pascal@17454
|
194 je abort
|
pascal@17454
|
195 int $0x21 // get DOS version
|
pascal@17562
|
196 addb $-3, %al
|
pascal@19849
|
197 movb $EXESTR(noDOS3), %al
|
pascal@19435
|
198 movw $0x100, %di
|
pascal@17810
|
199 jc tst386
|
pascal@13691
|
200 abort:
|
pascal@19849
|
201 goputs:
|
pascal@19849
|
202 jmp puts
|
pascal@13691
|
203
|
pascal@17160
|
204 tst386:
|
pascal@19849
|
205 pushw %sp
|
pascal@19849
|
206 popw %ax
|
pascal@19870
|
207 xorw %sp, %ax // clear C
|
pascal@19870
|
208 movb $EXESTR(vm86modemsg), %al
|
pascal@19849
|
209 jnz is86 // 86/186 not a 286+
|
pascal@19828
|
210 .arch i486
|
pascal@13691
|
211 is386:
|
pascal@19870
|
212 smsww %bx // not privileged
|
pascal@19870
|
213 andb $1, %bl // clear C
|
pascal@19863
|
214 jne isvm86
|
pascal@19870
|
215 movl %cr0, %ebx // privileged
|
pascal@19870
|
216 incl %ebx
|
pascal@19863
|
217 .arch i8086
|
pascal@13713
|
218 movb $EXESTR(rmPaging), %al
|
pascal@14150
|
219 js abort
|
pascal@19870
|
220 is86:
|
pascal@19870
|
221 incw %ax
|
pascal@17810
|
222 //movb $EXESTR(realmodemsg), %al
|
pascal@19863
|
223 isvm86:
|
pascal@19849
|
224 call goputs
|
pascal@14261
|
225 movw comstart-end_header(%di), %si // .com address
|
pascal@13691
|
226 pushw %di
|
pascal@17906
|
227 movb $0x7C/2, %ch // 31K-31.5K, > com length
|
pascal@13691
|
228 rep
|
pascal@17473
|
229 movsw
|
pascal@13691
|
230 ret
|
pascal@13713
|
231
|
pascal@17496
|
232 vm86modemsg:
|
pascal@17473
|
233 // --------------- Must be in 7F40 7FFF range ------------------------
|
pascal@19871
|
234 .ascii "v" // v86 mode
|
pascal@17810
|
235 .ascii "86" // 86 mode
|
pascal@17562
|
236 .byte EXESTR(mode)
|
pascal@14261
|
237 rmPaging:
|
pascal@17810
|
238 .ascii "X" // Xreal mode
|
pascal@14261
|
239 realmodemsg:
|
pascal@17562
|
240 .ascii "real" // real mode
|
pascal@17473
|
241 // --------------- Must be in 7FC0 7FFF range ------------------------
|
pascal@17562
|
242 mode:
|
pascal@17562
|
243 .ascii " m"
|
pascal@17496
|
244 ode:
|
pascal@17562
|
245 .ascii "ode"
|
pascal@14261
|
246 .byte EXESTR(eol)
|
pascal@17562
|
247 noDOS3:
|
pascal@17810
|
248 .ascii "DOS3" // DOS3?
|
pascal@17562
|
249 need:
|
pascal@17810
|
250 .ascii "?"
|
pascal@17496
|
251 .byte EXESTR(eol)
|
pascal@17473
|
252 help:
|
pascal@19435
|
253 .ascii "SliTaz iso boot." // SliTaz iso boot.
|
pascal@17473
|
254 eol:
|
pascal@17496
|
255 .ascii "\r\n"
|
pascal@17810
|
256 .byte 1 // puts will return
|
pascal@14261
|
257
|
pascal@17496
|
258 .space 16,0 // ISO md5
|
pascal@14261
|
259 .org 0x8000
|
pascal@14261
|
260 ////////////////////////// ISO9660 header /////////////////////////////////////
|