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

syslinux/isoboot.s: accept user args
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jun 19 15:46:21 2020 +0000 (2020-06-19)
parents ec56ab0f8e5b
children a2e843f5d9e4
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@23863 80 call bootpartition // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
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@23863 105 .org 0x0080,0xEE
pascal@17810 106 ////////////////////////////// EXE/PE header //////////////////////////////////
pascal@23863 107 .org 0x0178,0xFF
pascal@23863 108 ////////////////////////// partition boot code ////////////////////////////////
pascal@23863 109 // assume DS=SS SI=BX=7C00 CX=0100 DL=<drive> DI=table+66
pascal@17810 110
pascal@23863 111 bootpartition:
pascal@23863 112 movw $4,%cx
pascal@23863 113 movw $16,%ax
pascal@23863 114 next:
pascal@23863 115 subw %ax,%di
pascal@23863 116 cmpb %ch,-2(%di) // boot flag ?
pascal@23863 117 loope next
pascal@23863 118 cmpw $63,2-2(%di) // empty or isolinux partition ?
pascal@23863 119 jbe default
pascal@23863 120 .arch i486
pascal@23863 121 pushl $0
pascal@23863 122 pushl 8-2(%di)
pascal@23863 123 pushw %cs
pascal@23863 124 pushw %bx
pascal@23863 125 pushw $1
pascal@23863 126 pushw %ax
pascal@23863 127 movw %sp,%si // assume %ds = %ss
pascal@23863 128 movb $0x42,%ah
pascal@23863 129 int $0x13
pascal@23863 130 add $16,%sp
pascal@23863 131 .arch i8086
pascal@23863 132 default:
pascal@23863 133 ret
pascal@23863 134
pascal@23863 135 .org 0x01A0,0xFF
pascal@17496 136 readsectorX: // read isolinux boot sector
pascal@17496 137 movb $0xA5, %cl // patched by installer
pascal@13699 138 readsector1:
pascal@17496 139 andb $0x83, %dl // disk and floppy disk
pascal@13699 140 movw %cx, (%bx)
pascal@13699 141 incw %cx
pascal@13699 142 movw $0x201, %ax
pascal@13699 143 int $0x13
pascal@13691 144 setreg:
pascal@13699 145 movw %bx, %si
pascal@17810 146 movw $moved, %di
pascal@13691 147 movw $0x0100, %cx
pascal@17810 148 movb $nobsmsg, %al
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 bootdir:
pascal@23863 157 .asciz "/boot"
pascal@23863 158 linld:
pascal@23863 159 .asciz "linld.com"
pascal@23863 160 cmdline:
pascal@23863 161 .ascii "-f "
pascal@23863 162 // .ascii "image=\boot\"
pascal@23863 163 // .ascii "bzImage "
pascal@23863 164 .ascii "initrd="
pascal@23863 165 rootfs:
pascal@23863 166 .ascii "rootfs"
pascal@23863 167 dotgz:
pascal@23863 168 .ascii ".gz,! "
pascal@23863 169 // .ascii ".gz,rootfs4.gz,! "
pascal@23863 170 args:
pascal@23863 171 // .ascii " rw "
pascal@23863 172 // .ascii " mode=menu"
pascal@23863 173 .ascii " autologin rdinit=/init.exe magic="
pascal@23863 174 magicstr:
pascal@23863 175 .ascii "0 bootfrom="
pascal@23863 176 // .ascii "65535 bootfrom="
pascal@23863 177 filename:
pascal@13729 178 exestart:
pascal@23863 179 movb $0x30,%ah // get DOS version
pascal@23863 180 int $0x21
pascal@23863 181 cmpb $3,%al
pascal@23863 182 jc goabort
pascal@13691 183
pascal@23863 184 cld
pascal@23863 185 movw EXEADRS(comstart),%si
pascal@23863 186 movw $0xF000,%di
pascal@23863 187 movb $4,%ch // 2k min
pascal@23863 188 rep
pascal@23863 189 movsw // helper
pascal@23863 190 movw $129,%si
pascal@23863 191 leaw args-cmdline(%si),%di
pascal@23863 192 movb -1(%si),%cl
pascal@23863 193 pushw %si
pascal@23863 194 rep
pascal@23863 195 movsb // user args
pascal@23863 196 xchgw %ax,%di
pascal@23863 197 popw %di
pascal@23863 198 movw $EXEADRS(cmdline),%si
pascal@23863 199 movb $args-cmdline,%cl
pascal@23863 200 rep
pascal@23863 201 movsb // files
pascal@23863 202 xchgw %ax,%di
pascal@23863 203 movb $filename-args,%cl
pascal@23863 204 rep
pascal@23863 205 movsb // end
pascal@23863 206 pushw %di // filename
pascal@23863 207
pascal@23863 208 #define ISOSTATE 0xF000
pascal@23863 209 #define ISO_OPEN iso_open
pascal@23863 210 #define ISO_READDIR *0xF004
pascal@23863 211 #define ISO_READMENU iso_readmenu
pascal@23863 212 #define RUN_LINLD run_linld
pascal@23863 213 movw ISOSTATE,%bp
pascal@23863 214 xorw %ax,%ax
pascal@23863 215 movw %bp,%di
pascal@23863 216 movb $64,%cl
pascal@23863 217 rep
pascal@23863 218 stosb // clear BSS
pascal@23863 219
pascal@21791 220 movw %ax,%di
pascal@21791 221 movw 0x2C(%di),%es
pascal@23863 222 decw %cx
pascal@21791 223 scalp:
pascal@21791 224 repne
pascal@21791 225 scasb
pascal@21791 226 scasb
pascal@21791 227 jne scalp
pascal@23863 228 scasw
pascal@23863 229 movw %di,%si // %es:%di = programme pathname
pascal@23863 230
pascal@23863 231 pushw %es
pascal@23863 232 pushw %ds
pascal@23863 233 popw %es
pascal@23863 234 popw %ds
pascal@23863 235 popw %di // filename
pascal@23863 236 pushw %di
pascal@23863 237 movb $0x60,%ah // canonicalize filename
pascal@23863 238 int $0x21
pascal@23863 239 pushw %es
pascal@23863 240 popw %ds
pascal@23863 241 #define LONG_FILENAME
pascal@23863 242 #ifdef LONG_FILENAME
pascal@23863 243 popw %si
pascal@23863 244 pushw %si
pascal@23863 245 movw $0x716C,%ax
pascal@23863 246 xorw %bx,%bx // R/O
pascal@23863 247 xorw %cx,%cx // attributes
pascal@23863 248 cwd // action = open
pascal@23863 249 stc
pascal@23863 250 int $0x21
pascal@23863 251 jnc opened
pascal@23863 252 #endif
pascal@23863 253 popw %dx
pascal@23863 254 pushw %dx
pascal@23863 255 movw $0x3D00,%ax
pascal@23863 256 // movb $0,%cl
pascal@23863 257 int $0x21
pascal@23863 258 goabort:
pascal@23863 259 jc abort
pascal@23863 260 opened:
pascal@23863 261 movw %ax,4(%bp) // fd
pascal@23863 262
pascal@23863 263 call ISO_READMENU
pascal@23863 264 movw 6(%bp),%ax // magic = filemod
pascal@23863 265 popw %bx
pascal@23863 266 leaw magicstr-filename(%bx),%di
pascal@23863 267 movb $10,%bl
pascal@23863 268 xorw %cx,%cx
pascal@23863 269 lp1:
pascal@23863 270 xorw %dx,%dx
pascal@23863 271 divw %bx
pascal@23863 272 pushw %dx
pascal@21791 273 incw %cx
pascal@23863 274 orw %ax,%ax
pascal@23863 275 jnz lp1
pascal@23863 276 lp2:
pascal@23863 277 popw %ax
pascal@23863 278 addb $'0',%al
pascal@23863 279 stosb // store magic
pascal@23863 280 loop lp2
pascal@23863 281
pascal@23863 282 movw $EXEADRS(bootdir),%ax
pascal@23863 283 call ISO_OPEN
pascal@23863 284 orw $-1,18(%bp) // curdirsize = -1
pascal@23863 285 xorw %ax,%ax
pascal@23863 286 found:
pascal@23863 287 incb %ah
pascal@23863 288 patchtest:
pascal@23863 289 pushw %ax
pascal@23863 290 call ISO_READDIR
pascal@23863 291 pushw %ds
pascal@23863 292 popw %es
pascal@23863 293 incw %ax
pascal@23863 294 popw %ax
pascal@23863 295 movw $EXEADRS(rootfs),%si
pascal@23863 296 je dopatch
pascal@23863 297 movw %si,%di
pascal@23863 298 movw 16(%bp),%si // filename
pascal@23863 299 movw $9,%cx
pascal@23863 300 rep
pascal@23863 301 cmpsb
pascal@23863 302 jcxz found
pascal@23863 303 cmpb $3,%cl
pascal@23863 304 ja patchtest
pascal@23863 305 decw %si
pascal@23863 306 cmpb (%si),%al
pascal@23863 307 ja patchtest
pascal@23863 308 lodsb
pascal@23863 309 jmp patchtest
pascal@23863 310 done:
pascal@23863 311 movw $128,%ax
pascal@23863 312 subw %ax,%si
pascal@23863 313 xchgw %ax,%si
pascal@23863 314 decw %ax
pascal@23863 315 movb %al,(%si) // cmdline length
pascal@23863 316
pascal@23863 317 movw $EXEADRS(linld),%ax
pascal@23863 318 call ISO_OPEN
pascal@23863 319 jc abort
pascal@23863 320 movw 12(%bp),%cx // filesize
pascal@23863 321 movw $0x100,%dx
pascal@23863 322 call RUN_LINLD
pascal@23863 323 abort:
pascal@23863 324 movw $EXEADRS(stopmsg),%dx
pascal@23863 325 movb $9,%ah
pascal@23863 326 int $0x21
pascal@23863 327 int $0x20
pascal@23863 328 dopatch:
pascal@21791 329 pushw %si
pascal@23863 330 cmpw $0x200,%ax
pascal@23863 331 je initrddone
pascal@23863 332 movw $EXEADRS(dotgz),%di
pascal@23863 333 decb %ah
pascal@23863 334 je modify
pascal@23863 335 scasw
pascal@23863 336 scasw // addw $4,%di
pascal@23863 337 movsw
pascal@23863 338 movsw
pascal@23863 339 movsw
pascal@23863 340 modify:
pascal@23863 341 stosb
pascal@23863 342 movw $129+dotgz-cmdline,%si
pascal@23863 343 movsb
pascal@23863 344 movsw
pascal@23863 345 movsw
pascal@23863 346 initrddone:
pascal@23863 347 movw $129+rootfs-cmdline,%di
pascal@23863 348 popw %si
pascal@23863 349 movw $args-rootfs,%cx
pascal@23863 350 rep
pascal@23863 351 movsb
pascal@23863 352
pascal@23863 353 shrink0:
pascal@23863 354 movw $129,%si
pascal@23863 355 shrink:
pascal@23863 356 movw %si,%di
pascal@21791 357 lodsb
pascal@23863 358 cmpb $0,%al
pascal@23863 359 je done
pascal@23863 360 cmpb $' ',%al
pascal@23863 361 jne shrink
pascal@23863 362 cmpb (%si),%al
pascal@23863 363 jne shrink
pascal@23863 364 pack:
pascal@23863 365 lodsb
pascal@23863 366 stosb
pascal@23863 367 cmpb $0,%al
pascal@23863 368 jne pack
pascal@23863 369 jmp shrink0
pascal@23863 370
pascal@23863 371 .org 0x0400,0xEE
pascal@23863 372 .org 0x0600,0xFF
pascal@23863 373 .org 0x0750,0xBB
pascal@23863 374 stopmsg:
pascal@23863 375 .ascii "This program cannot be run in DOS mode.$"
pascal@23863 376 .org 0x0778,0xEE
pascal@23863 377 .org 0xF002-0xC0
pascal@23863 378 iso_open:
pascal@23863 379 .word 0
pascal@23863 380 .word 0
pascal@23863 381 iso_readmenu:
pascal@23863 382 .word 0
pascal@23863 383 run_linld:
pascal@13713 384
pascal@23863 385 .end