wok annotate syslinux/stuff/iso2exe/bootiso.S @ rev 23999

syslinux/iso2exe: read isolinux.cfg
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jan 12 07:47:12 2021 +0000 (2021-01-12)
parents a946c1651082
children 27c664d6b7a3
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@23867 39 movw %ds, %ax
pascal@17496 40 xorw %bx, %bx
pascal@17496 41 movw %bx, %ds
pascal@17496 42 movb $0x7C, %bh
pascal@19827 43 pushw %ds
pascal@19827 44 popw %ss
pascal@19827 45 movw %bx, %sp
pascal@17496 46 pushw %bx // return address
pascal@19827 47 pushw %di
pascal@17496 48 pushw %es // save %es:%di
pascal@23867 49 pushw %si
pascal@13972 50 cld
pascal@13691 51 call setreg
pascal@13691 52 rep
pascal@19827 53 movsw
pascal@13972 54 movw $0x80, %dx
pascal@17810 55 ljmp $0, $moved+start2
pascal@17810 56 .byte 0
pascal@17810 57 // .org 60
pascal@17810 58 // .long 0x0080 // PE header offset
pascal@17810 59 .org 64
pascal@13972 60 end_header:
pascal@13972 61 comstart:
pascal@13972 62 .word 0
pascal@13691 63
pascal@17810 64 .org 66
pascal@23867 65 start2:
pascal@23867 66 pushw %ax // original %ds
pascal@23867 67 sti
pascal@17810 68 dxloop:
pascal@17810 69 call readsector1 // look for the boot device
pascal@17810 70 repe
pascal@17810 71 cmpsw
pascal@17810 72 je dxfound
pascal@17810 73 movb $0, %cl // ch = 0
pascal@17810 74 addb $0x7D, %dl // try every hard disk
pascal@17810 75 jno dxloop
pascal@17810 76
pascal@17810 77 dxfound:
pascal@17810 78 call readsectorX // read isolinux boot sector
pascal@17810 79 cmpw (%bx), %cx
pascal@23867 80 movw $moved+nobsmsg, %si
pascal@17810 81 jnc puts // read fail or no isohydrid boot sector
pascal@23863 82 call bootpartition // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
pascal@23867 83 popw %ds
pascal@23867 84 popw %si
pascal@17810 85 popw %es
pascal@19827 86 popw %di // isolinux boot needs %es:%di and %dx
pascal@17810 87 putsret:
pascal@17810 88 ret
pascal@17810 89
pascal@17810 90 putstrlp:
pascal@17810 91 movw $7, %bx
pascal@17810 92 movb $0xE, %ah
pascal@17810 93 int $0x10
pascal@23867 94 puts:
pascal@17810 95 lodsb
pascal@23867 96 cmp $0, %al
pascal@23867 97 jnz putstrlp
pascal@17810 98 halt:
pascal@17810 99 hlt
pascal@17810 100 jmp halt
pascal@17810 101 nobsmsg:
pascal@17810 102 .asciz "No isolinux."
pascal@17810 103
pascal@23863 104 .org 0x0080,0xEE
pascal@17810 105 ////////////////////////////// EXE/PE header //////////////////////////////////
pascal@23863 106 .org 0x0178,0xFF
pascal@23863 107 ////////////////////////// partition boot code ////////////////////////////////
pascal@23863 108 // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
pascal@17810 109
pascal@23863 110 bootpartition:
pascal@23863 111 movw $4,%cx
pascal@23863 112 movw $16,%ax
pascal@23863 113 next:
pascal@23863 114 subw %ax,%di
pascal@23863 115 cmpb %ch,-2(%di) // boot flag ?
pascal@23863 116 loope next
pascal@23863 117 cmpw $63,2-2(%di) // empty or isolinux partition ?
pascal@23863 118 jbe default
pascal@23863 119 .arch i486
pascal@23863 120 pushl $0
pascal@23863 121 pushl 8-2(%di)
pascal@23863 122 pushw %cs
pascal@23863 123 pushw %bx
pascal@23863 124 pushw $1
pascal@23863 125 pushw %ax
pascal@23863 126 movw %sp,%si // assume %ds = %ss
pascal@23863 127 movb $0x42,%ah
pascal@23863 128 int $0x13
pascal@23863 129 add $16,%sp
pascal@23863 130 .arch i8086
pascal@23863 131 default:
pascal@23863 132 ret
pascal@23863 133
pascal@23863 134 .org 0x01A0,0xFF
pascal@17496 135 readsectorX: // read isolinux boot sector
pascal@23867 136 movb $3, %cl // isolinux/512
pascal@13699 137 readsector1:
pascal@17496 138 andb $0x83, %dl // disk and floppy disk
pascal@13699 139 movw %cx, (%bx)
pascal@13699 140 incw %cx
pascal@13699 141 movw $0x201, %ax
pascal@13699 142 int $0x13
pascal@13691 143 setreg:
pascal@23867 144 pushw %ds
pascal@23867 145 popw %es
pascal@13699 146 movw %bx, %si
pascal@17810 147 movw $moved, %di
pascal@13691 148 movw $0x0100, %cx
pascal@13691 149 ret
pascal@23863 150 .org 0x01B8,0xEE // partition table
pascal@14267 151
pascal@23863 152 .org 0x0270,0xFF
pascal@19827 153
pascal@13691 154 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 155
pascal@23863 156 cmdline:
pascal@23996 157 .ds.b 128,0
pascal@23996 158 linldofs: // offset of linld.com in iso
pascal@23996 159 .long 0 // Updated by iso2exe
pascal@23996 160 linldsz: // size-1
pascal@23996 161 .word 0 // Updated by iso2exe
pascal@13729 162 exestart:
pascal@23863 163 movb $0x30,%ah // get DOS version
pascal@23863 164 int $0x21
pascal@23863 165 cmpb $3,%al
pascal@23996 166 jc abort
pascal@23996 167
pascal@23996 168 // load linld.com
pascal@13691 169
pascal@23863 170 cld
pascal@23996 171 linldbuf = 0x8000
pascal@23996 172 isopath = 0x7000
pascal@23996 173 movw $0x8000,%cx // clear 8000-FFFF
pascal@23996 174 movw %cx,%di
pascal@23996 175 movb %cl,%al
pascal@23863 176 rep
pascal@23996 177 stosb
pascal@23863 178
pascal@23996 179 movw %di,%ax
pascal@21791 180 movw 0x2C(%di),%es
pascal@23863 181 decw %cx
pascal@21791 182 scalp:
pascal@21791 183 repne
pascal@21791 184 scasb
pascal@21791 185 scasb
pascal@21791 186 jne scalp
pascal@23996 187 scasw // %es:%di = programme pathname
pascal@23863 188 pushw %es
pascal@23996 189 pushw %cs
pascal@23863 190 popw %es
pascal@23863 191 popw %ds
pascal@23996 192 #define CONONICALIZE_FILENAME insert obsolute path
pascal@23996 193 #ifdef CONONICALIZE_FILENAME
pascal@23996 194 movw %di,%si // %ds:%si = programme pathname
pascal@23996 195 movw $EXEADRS(isopath),%di // to filename %es:%di
pascal@23863 196 movb $0x60,%ah // canonicalize filename
pascal@23863 197 int $0x21
pascal@23863 198 pushw %es
pascal@23863 199 popw %ds
pascal@23996 200 #endif
pascal@23996 201 movw %di,%si // %ds:%si = programme pathname
pascal@23863 202 #define LONG_FILENAME
pascal@23863 203 #ifdef LONG_FILENAME
pascal@23863 204 pushw %si
pascal@23863 205 movw $0x716C,%ax
pascal@23863 206 xorw %bx,%bx // R/O
pascal@23863 207 xorw %cx,%cx // attributes
pascal@23863 208 cwd // action = open
pascal@23863 209 stc
pascal@23863 210 int $0x21
pascal@23863 211 jnc opened
pascal@23996 212 popw %dx
pascal@23996 213 #else
pascal@23996 214 movw %si,%dx
pascal@23863 215 #endif
pascal@23996 216 pushw %si
pascal@23863 217 movw $0x3D00,%ax
pascal@23863 218 // movb $0,%cl
pascal@23863 219 int $0x21
pascal@23996 220 jc popNabort
pascal@23863 221 opened:
pascal@23996 222 xchgw %ax,%bx // fd = %bx
pascal@23996 223 movw $32,%cx
pascal@23996 224 movw $EXEADRS(headbuf),%dx
pascal@23996 225 movb $0x3F,%ah
pascal@23996 226 int $0x21 // read(%bx,%dx,%cx)
pascal@23996 227 jc popNabort
pascal@23996 228 les EXEADRS(linldofs),%dx
pascal@23996 229 movw %es,%cx
pascal@23996 230 movw $0x4200,%ax // lseek(%bx,%cx:%dx,SEEK_SET)
pascal@23996 231 int $0x21
pascal@23996 232 jc popNabort
pascal@23996 233 movw EXEADRS(linldsz),%cx
pascal@23996 234 jcxz popNabort
pascal@23996 235 movw $EXEADRS(linldbuf),%dx
pascal@23996 236 movw %cx,%di
pascal@23996 237 addw %dx,%di
pascal@23996 238 movb $0x3F,%ah
pascal@23996 239 int $0x21 // read(%bx,%dx,%cx)
pascal@23996 240 jnc copycmdline
pascal@23996 241 popNabort:
pascal@23996 242 popw %si
pascal@23863 243 abort:
pascal@23863 244 movw $EXEADRS(stopmsg),%dx
pascal@23863 245 movb $9,%ah
pascal@23863 246 int $0x21
pascal@23863 247 int $0x20
pascal@23996 248
pascal@23996 249 // installed args (ex: image=/boot/bzImage initrd=rootfs4.gz,! autologin rdinit=/init.exe)
pascal@23996 250
pascal@23996 251 copycmdline:
pascal@23996 252 pushw %ds
pascal@23996 253 popw %es
pascal@23996 254 movw $EXEADRS(cmdline),%si
pascal@23996 255 movw %di,%bx
pascal@23996 256
pascal@23996 257 copylp:
pascal@23996 258 lodsb
pascal@23863 259 stosb
pascal@23996 260 orb %al,%al
pascal@23996 261 jnz copylp
pascal@23996 262
pascal@23996 263 // magic=<magic> arg
pascal@23996 264
pascal@23996 265 decw %di
pascal@23996 266 movw $7,%cx
pascal@23996 267 movw $EXEADRS(magicstr),%si
pascal@23863 268 rep
pascal@23863 269 movsb
pascal@23996 270 movw EXEADRS(headbuf+18),%ax // magic
pascal@23999 271 movw $10,%bp
pascal@23996 272 magiclp1:
pascal@23996 273 xorw %dx,%dx
pascal@23999 274 divw %bp
pascal@23996 275 pushw %dx
pascal@23996 276 incw %cx
pascal@23996 277 orw %ax,%ax
pascal@23996 278 jnz magiclp1
pascal@23996 279 magiclp2:
pascal@23996 280 popw %ax
pascal@23996 281 addb $'0',%al
pascal@23996 282 stosb // store magic
pascal@23996 283 loop magiclp2
pascal@23863 284
pascal@23996 285 // iso=<file> arg
pascal@23996 286
pascal@23996 287 movb $5,%cl
pascal@23999 288 //movw $EXEADRS(isostr),%si
pascal@23996 289 rep
pascal@23996 290 movsb
pascal@23996 291 popw %si
pascal@23996 292 isolp:
pascal@23863 293 lodsb
pascal@23863 294 stosb
pascal@23996 295 orb %al,%al
pascal@23996 296 jne isolp
pascal@23996 297 decw %di
pascal@23996 298
pascal@23996 299 // append user args
pascal@23996 300
pascal@23996 301 movw $0x80,%si
pascal@23996 302 lodsb
pascal@23996 303 movb $0xFF,-1(%si) // long cmdline flag
pascal@23996 304 cbw
pascal@23996 305 xchgw %ax,%cx
pascal@23996 306 rep
pascal@23996 307 movsb
pascal@23996 308 movb $0,(%di)
pascal@23996 309
pascal@23996 310 // set cmdline size
pascal@23996 311
pascal@23996 312 movw %di,%ax
pascal@23996 313 subw %bx,%ax
pascal@23996 314 incw %ax
pascal@23996 315 movb %al,-1(%bx)
pascal@23996 316
pascal@23996 317 // run linld.com
pascal@23996 318
pascal@23996 319 movw $EXEADRS(mvNjump),%si
pascal@23996 320 incw %di
pascal@23996 321 movb $endmvNjump-mvNjump,%cl
pascal@23996 322 mvNjump:
pascal@23996 323 pushw %di
pascal@23996 324 rep
pascal@23996 325 movsb
pascal@23996 326 movw $EXEADRS(linldbuf),%si
pascal@23996 327 movw $0x0100,%di
pascal@23996 328 popw %cx
pascal@23996 329 pushw %cx
pascal@23996 330 subw %si,%cx
pascal@23996 331 ret
pascal@23996 332 endmvNjump:
pascal@23996 333
pascal@23996 334 magicstr: .ascii " magic="
pascal@23996 335 isostr: .ascii " iso="
pascal@23996 336
pascal@23863 337 .org 0x0400,0xEE
pascal@23996 338 headbuf:
pascal@23863 339 .org 0x0600,0xFF
pascal@23867 340 isolinux:
pascal@23875 341
pascal@23867 342 .arch i486
pascal@23875 343 #define PARTITION_SUPPORT
pascal@23867 344 /* -----------------------------------------------------------------------
pascal@23867 345 *
pascal@23867 346 * Copyright 2007-2009 H. Peter Anvin - All Rights Reserved
pascal@23867 347 * Copyright 2009 Intel Corporation; author: H. Peter Anvin
pascal@23867 348 *
pascal@23867 349 * Permission is hereby granted, free of charge, to any person
pascal@23867 350 * obtaining a copy of this software and associated documentation
pascal@23867 351 * files (the "Software"), to deal in the Software without
pascal@23867 352 * restriction, including without limitation the rights to use,
pascal@23867 353 * copy, modify, merge, publish, distribute, sublicense, and/or
pascal@23867 354 * sell copies of the Software, and to permit persons to whom
pascal@23867 355 * the Software is furnished to do so, subject to the following
pascal@23867 356 * conditions:
pascal@23867 357 *
pascal@23867 358 * The above copyright notice and this permission notice shall
pascal@23867 359 * be included in all copies or substantial portions of the Software.
pascal@23867 360 *
pascal@23867 361 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
pascal@23867 362 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
pascal@23867 363 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
pascal@23867 364 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
pascal@23867 365 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
pascal@23867 366 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
pascal@23867 367 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
pascal@23867 368 * OTHER DEALINGS IN THE SOFTWARE.
pascal@23867 369 *
pascal@23867 370 * ----------------------------------------------------------------------- */
pascal@23867 371
pascal@23867 372 HYBRID_MAGIC = 0x7078c0fb
pascal@23867 373 isolinux_start_hybrid = 0x7c00+64+4
pascal@23867 374
pascal@23875 375 isolinux_hybrid_signature = 64
pascal@23875 376
pascal@23867 377 stack = 0x7c00
pascal@23867 378 ebios_flag = (stack-20)
pascal@23867 379
pascal@23867 380 BIOS_page = 0x462
pascal@23867 381
pascal@23867 382 _start2:
pascal@23867 383 .byte 0x33, 0xed /* xorw %bp, %bp */
pascal@23867 384
pascal@23867 385 /* Check to see if we have a partition table entry */
pascal@23875 386 #ifdef PARTITION_SUPPORT
pascal@23867 387 xorl %ebx, %ebx
pascal@23867 388 xorl %ecx, %ecx
pascal@23867 389 andw %si, %si /* %si == 0 -> no partition data */
pascal@23867 390 jz 1f
pascal@23867 391 testb $0x7f, (%si) /* Invalid active flag field? */
pascal@23867 392 jnz 1f
pascal@23875 393 orb 4(%si), %cl /* Partition type zero == invalid? */
pascal@23867 394 je 1f
pascal@23875 395
pascal@23875 396 cmpb $0xed, %cl /* EFI partition type? */
pascal@23875 397
pascal@23875 398 /* Get non-GPT partition information */
pascal@23875 399 movl 8(%si), %ecx
pascal@23875 400
pascal@23875 401 jne 1f
pascal@23867 402 cmpl $0x58504721, %eax /* !GPT signature in EAX? */
pascal@23875 403 jne 1f
pascal@23867 404
pascal@23867 405 /* We have GPT partition information */
pascal@23867 406 movl (32+20)(%si), %ecx
pascal@23867 407 movl (36+20)(%si), %ebx
pascal@23867 408 #endif
pascal@23867 409 1:
pascal@23875 410 movw %bp, %ds
pascal@23875 411 movw $stack, %sp
pascal@23867 412
pascal@23867 413 /* We have no partition information */
pascal@23875 414 #ifdef PARTITION_SUPPORT
pascal@23867 415 pushl %ebx /* -4: partoffset_hi */
pascal@23867 416 pushl %ecx /* -8: partoffset_lo */
pascal@23875 417 #else
pascal@23875 418 pushl $0 /* -4: partoffset_hi */
pascal@23875 419 pushl $0 /* -8: partoffset_lo */
pascal@23875 420 #endif
pascal@23875 421 partoffset = -8
pascal@23867 422 pushw %es /* -10: es:di -> $PnP header */
pascal@23867 423 pushw %di /* -12: es:di -> $PnP header */
pascal@23867 424
pascal@23867 425
pascal@23867 426 //ADJUST_DRIVE
pascal@23867 427 pushw %dx /* -14: dl -> drive number */
pascal@23875 428 driveno = -14
pascal@23875 429
pascal@23875 430 pushw %ds
pascal@23875 431 popw %es
pascal@23867 432
pascal@23867 433 /* Copy down to 0:0x600 */
pascal@23875 434 movw $2f-0x600+0x7C00, %si
pascal@23875 435 movw $2f, %di
pascal@23875 436 movb $(512 >> 8), %ch
pascal@23875 437 pushw %es
pascal@23875 438 pushw %di
pascal@23875 439 rep; movsb
pascal@23867 440
pascal@23875 441 retf
pascal@23867 442 2:
pascal@23867 443
pascal@23867 444 /* Check to see if we have EBIOS */
pascal@23867 445 pushw %dx /* drive number */
pascal@23867 446 movb $0x41, %ah /* %al == 0 already */
pascal@23867 447 movw $0x55aa, %bx
pascal@23875 448 //xorw %cx, %cx
pascal@23867 449 xorb %dh, %dh
pascal@23867 450 int $0x13
pascal@23875 451 andw $1,%cx /* Bit 0 = fixed disk subset */
pascal@23875 452 jz 1f
pascal@23875 453 decw %cx /* Clear EBIOS flag. */
pascal@23867 454 cmpw $0xaa55, %bx
pascal@23867 455 jne 1f
pascal@23875 456 incw %cx /* Set EBIOS flag. */
pascal@23867 457
pascal@23867 458 /* We have EBIOS; patch in the following code at
pascal@23867 459 read_sector_cbios: movb $0x42, %ah ; jmp read_common */
pascal@23867 460 movl $0xeb42b4+((read_common-read_sector_cbios-4) << 24), \
pascal@23867 461 (read_sector_cbios)
pascal@23867 462 1:
pascal@23867 463 popw %dx
pascal@23867 464 pushw %cx /* EBIOS flag */
pascal@23867 465
pascal@23867 466 /* Get (C)HS geometry */
pascal@23867 467 movb $0x08, %ah
pascal@23867 468 int $0x13
pascal@23867 469 popw %bx /* EBIOS flag */
pascal@23867 470 movzbw %dh, %ax /* dh = max head */
pascal@23867 471 incw %ax /* From 0-based max to count */
pascal@23867 472 pushw %ax /* -16: Save heads on the stack */
pascal@23875 473 heads = -16
pascal@23867 474 andw $0x3f, %cx /* Sector count */
pascal@23867 475 pushw %cx /* -18: Save sectors on the stack */
pascal@23875 476 sectors = -18
pascal@23867 477 mulw %cx /* Heads*sectors -> sectors per cylinder */
pascal@23867 478
pascal@23867 479 pushw %bx /* -20: EBIOS flag */
pascal@23875 480
pascal@23875 481 /* Save sectors/cylinder in %esi */
pascal@23875 482 pushw %dx
pascal@23875 483 pushw %ax
pascal@23875 484 popl %edi
pascal@23867 485
pascal@23867 486 /*
pascal@23867 487 * Load sectors. We do this one at a time mostly to avoid
pascal@23867 488 * pitfalls and to share code with the stock MBR code.
pascal@23867 489 */
pascal@23867 490 movw $0x7c00, %bx
pascal@23875 491 movw %bx, %bp
pascal@23867 492 xorl %eax, %eax
pascal@23875 493 cdq
pascal@23867 494 movb $17*4, %al /* EL TORITO spec */
pascal@23867 495 call read_sector
pascal@23867 496 movl 71(%bx), %eax /* catalog */
pascal@23867 497 shll $2, %eax
pascal@23867 498 call read_sector
pascal@23867 499 movl 40(%bx), %eax /* boot code */
pascal@23867 500 shll $2, %eax
pascal@23875 501 movb $4, %cl /* Sector count */
pascal@23867 502
pascal@23867 503 2:
pascal@23867 504 call read_sector
pascal@23867 505 incl %eax
pascal@23867 506 addb $(512 >> 8), %bh
pascal@23867 507 loopw 2b
pascal@23867 508
pascal@23867 509 /*
pascal@23867 510 * Okay, that actually worked... update the stack pointer
pascal@23867 511 * and jump into isolinux.bin...
pascal@23867 512 */
pascal@23875 513 cmpl $HYBRID_MAGIC,isolinux_hybrid_signature(%bp)
pascal@23875 514 jne error_os
pascal@23867 515
pascal@23867 516 cli
pascal@23875 517 //movw $ebios_flag, %sp
pascal@23867 518
pascal@23867 519 /*
pascal@23867 520 * Use a ljmpw here to work around a bug in some unknown version
pascal@23867 521 * of gas or ld when it comes to jumping to an absolute symbol...
pascal@23867 522 *
pascal@23867 523 * Look more closely into it if we ever are short on space.
pascal@23867 524 */
pascal@23875 525 //ljmpw $0, $isolinux_start_hybrid
pascal@23875 526 pushw $isolinux_start_hybrid
pascal@23875 527 ret
pascal@23867 528
pascal@23867 529 /*
pascal@23867 530 * read_sector: read a single sector pointed to by %eax to %es:%bx.
pascal@23875 531 * All registers saved.
pascal@23867 532 */
pascal@23867 533 read_sector:
pascal@23867 534 pushal
pascal@23867 535 #ifdef PARTITION_SUPPORT
pascal@23875 536 addl partoffset(%bp), %eax
pascal@23875 537 adcl partoffset+4(%bp), %edx
pascal@23867 538 #endif
pascal@23867 539 pushl %edx /* MSW of LBA */
pascal@23867 540 pushl %eax /* LSW of LBA */
pascal@23867 541 pushw %es /* Buffer segment */
pascal@23867 542 pushw %bx /* Buffer offset */
pascal@23867 543 pushw $1 /* Sector count */
pascal@23867 544 pushw $16 /* Size of packet */
pascal@23867 545 movw %sp, %si
pascal@23867 546
pascal@23867 547 /* This chunk is skipped if we have ebios */
pascal@23867 548 /* Do not clobber %eax before this chunk! */
pascal@23867 549 /* This also relies on %bx and %edx as set up above. */
pascal@23867 550 read_sector_cbios:
pascal@23875 551 divl %edi
pascal@23867 552 shlb $6, %ah
pascal@23875 553 xchgb %al, %ah
pascal@23875 554 xchgw %ax, %cx
pascal@23867 555 xchgw %dx, %ax
pascal@23875 556 divb sectors(%bp)
pascal@23867 557 movb %al, %dh
pascal@23867 558 orb %ah, %cl
pascal@23867 559 incw %cx /* Sectors are 1-based */
pascal@23867 560 movw $0x0201, %ax
pascal@23867 561
pascal@23867 562 read_common:
pascal@23875 563 movb driveno(%bp), %dl
pascal@23867 564 int $0x13
pascal@23875 565 movw $disk_error, %si
pascal@23875 566 jc error
pascal@23875 567 addw $16, %sp /* Drop DAPA */
pascal@23867 568 popal
pascal@23867 569 ret
pascal@23867 570
pascal@23867 571 /*
pascal@23867 572 * Print error messages. This is invoked with "call", with the
pascal@23867 573 * error message at the return address.
pascal@23867 574 */
pascal@23875 575 error_os:
pascal@23875 576 movw $bad_signature, %si
pascal@23867 577 error:
pascal@23867 578 lodsb
pascal@23867 579 movb $0x0e, %ah
pascal@23867 580 movb (BIOS_page), %bh
pascal@23867 581 movb $0x07, %bl
pascal@23867 582 int $0x10 /* May destroy %bp */
pascal@23867 583 cmpb $10, %al /* Newline? */
pascal@23875 584 jne error
pascal@23867 585
pascal@23867 586 int $0x18 /* Boot failure */
pascal@23867 587 die:
pascal@23867 588 hlt
pascal@23867 589 jmp die
pascal@23875 590
pascal@23875 591 bad_signature:
pascal@23875 592 .ascii "isolinux.bin "
pascal@23875 593 .ascii "missing or corrupt.\r\n"
pascal@23875 594 disk_error:
pascal@23875 595 .ascii "Operating system "
pascal@23875 596 .ascii "load error.\r\n"
pascal@23875 597
pascal@23863 598 .org 0x0750,0xBB
pascal@23863 599 stopmsg:
pascal@23863 600 .ascii "This program cannot be run in DOS mode.$"
pascal@23863 601 .org 0x0778,0xEE
pascal@13713 602
pascal@23863 603 .end