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

syslinux/iso2exe: follow boot flag
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Mar 08 15:32:40 2017 +0100 (2017-03-08)
parents 7a16da2c93b9
children fd4b65b5c1de
rev   line source
pascal@13691 1 .text
pascal@13691 2 .code16
pascal@13691 3 .org 0
pascal@13691 4
pascal@13691 5 CODESZ = 0x8000 // 16 sectors = 32Kb
pascal@13972 6 #define EXEADRS(x) x+0xC0
pascal@14261 7 #define EXELOC(x) x-0x40
pascal@14261 8 #define EXESTR(x) x-0x7F40
pascal@13691 9
pascal@13691 10 .globl _start
pascal@13691 11 _start:
pascal@13691 12 decw %bp // Magic number: MZ
pascal@13691 13 popw %dx
pascal@13972 14 jmp start0 // Bytes on last page of file
pascal@13691 15 .word (CODESZ+511)/512 // Pages in file
pascal@13691 16 .word 0 // Relocations
pascal@13691 17 .word (end_header-_start)/16 // Size of header in paragraphs
pascal@13691 18 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
pascal@13691 19 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
pascal@13691 20 .word 0xFFF0 // Initial (relative) SS value
pascal@13691 21 .word 0xFFFE // Initial SP value
pascal@13691 22 .word 0 // Checksum
pascal@13729 23 .word EXEADRS(exestart) // Initial IP value
pascal@13691 24 .word 0xFFF0 // Initial (relative) CS value
pascal@13972 25 initramfssize:
pascal@13972 26 .word 0 // File address of relocation table
pascal@17810 27 fdcnt: // Overlay number
pascal@14257 28 .byte 0 // Bootstrap floppy sector count
pascal@17810 29 .ascii "slitaz"
pascal@13691 30
pascal@13691 31 /////////////////////// Master Boot Record code //////////////////////////////
pascal@13691 32
pascal@17810 33 moved = 0x8000
pascal@17496 34 start0:
pascal@19827 35 //pushw %dx // restore %sp
pascal@19827 36 //incw %bp // restore %bp
pascal@17496 37 xorw %bx, %bx
pascal@17496 38 movw %bx, %ds
pascal@17496 39 movb $0x7C, %bh
pascal@19827 40 pushw %ds
pascal@19827 41 popw %ss
pascal@19827 42 movw %bx, %sp
pascal@17496 43 pushw %bx // return address
pascal@19827 44 pushw %di
pascal@17496 45 pushw %es // save %es:%di
pascal@13972 46 cld
pascal@17496 47 sti
pascal@13972 48 pushw %ds
pascal@13972 49 popw %es
pascal@13691 50 call setreg
pascal@13691 51 rep
pascal@19827 52 movsw
pascal@13972 53 movw $0x80, %dx
pascal@17810 54 ljmp $0, $moved+start2
pascal@17810 55 .byte 0
pascal@17810 56 // .org 60
pascal@17810 57 // .long 0x0080 // PE header offset
pascal@17810 58 .org 64
pascal@13972 59 end_header:
pascal@13972 60 comstart:
pascal@13972 61 .word 0
pascal@13691 62
pascal@17810 63 .org 66
pascal@17810 64 dxloop:
pascal@17810 65 start2:
pascal@17810 66 call readsector1 // look for the boot device
pascal@17810 67 repe
pascal@17810 68 cmpsw
pascal@17810 69 je dxfound
pascal@17810 70 movb $0, %cl // ch = 0
pascal@17810 71 addb $0x7D, %dl // try every hard disk
pascal@17810 72 jno dxloop
pascal@17810 73
pascal@17810 74 dxfound:
pascal@17810 75 call readsectorX // read isolinux boot sector
pascal@17810 76 cmpw (%bx), %cx
pascal@17810 77 jnc puts // read fail or no isohydrid boot sector
pascal@19827 78 movw $patch,%si
pascal@17810 79 popw %es
pascal@19827 80 popw %di // isolinux boot needs %es:%di and %dx
pascal@17810 81 putsret:
pascal@17810 82 ret
pascal@17810 83
pascal@17810 84 putstrlp:
pascal@17810 85 movw $7, %bx
pascal@17810 86 movb $0xE, %ah
pascal@17810 87 int $0x10
pascal@17810 88 error:
pascal@17810 89 lodsb
pascal@17810 90 cmp $1, %al
pascal@17810 91 jg putstrlp
pascal@17810 92 jz putsret
pascal@17810 93 puts:
pascal@17810 94 movb $0x80, %ah
pascal@17810 95 xchgw %ax, %si
pascal@17810 96 jnc error
pascal@17810 97 halt:
pascal@17810 98 hlt
pascal@17810 99 jmp halt
pascal@17810 100 nobsmsg:
pascal@17810 101 .asciz "No isolinux."
pascal@17810 102
pascal@17810 103 .org 0x0080
pascal@17810 104 ////////////////////////////// EXE/PE header //////////////////////////////////
pascal@17810 105
pascal@17810 106 .org 0x01A0
pascal@17496 107 readsectorX: // read isolinux boot sector
pascal@17496 108 movb $0xA5, %cl // patched by installer
pascal@13699 109 readsector1:
pascal@17496 110 andb $0x83, %dl // disk and floppy disk
pascal@13699 111 movw %cx, (%bx)
pascal@13699 112 incw %cx
pascal@13699 113 movw $0x201, %ax
pascal@13699 114 int $0x13
pascal@13691 115 setreg:
pascal@13699 116 movw %bx, %si
pascal@17810 117 movw $moved, %di
pascal@13691 118 movw $0x0100, %cx
pascal@17810 119 movb $nobsmsg, %al
pascal@13691 120 ret
pascal@17810 121 .org 0x01B8
pascal@14267 122
pascal@19827 123 ////////////////////////// partition boot code ////////////////////////////////
pascal@19827 124 // assume CS=DS=SS=0 BX=7C00 DL=<drive> SI=7DBE
pascal@19827 125
pascal@19827 126 .org 0x7C00
pascal@19827 127 jmp bootpartition
pascal@19827 128 .org 0x7C03
pascal@19827 129 .org 0x7DBE
pascal@19827 130 table = moved+0x1BE
pascal@19827 131 patch:
pascal@19827 132 .byte 0,0,0 // head of original bs
pascal@19827 133 partcode:
pascal@19827 134 popw %di
pascal@19827 135 movw $table,%si
pascal@19827 136 call movepartition
pascal@19827 137 movb $4,%cl
pascal@19827 138 movw $table-16,%di
pascal@19827 139 next:
pascal@19827 140 addw $16,%di
pascal@19827 141 cmpb %ch,(%di) // boot flag ?
pascal@19827 142 loope next
pascal@19827 143 pushw %ds
pascal@19827 144 pushw %ds
pascal@19827 145 pushl 8(%di)
pascal@19827 146 pushw %ds
pascal@19827 147 pushw %bx
pascal@19827 148 pushw $1
pascal@19827 149 pushw $0x10
pascal@19827 150 movw %sp,%si // assume %ds = %ss
pascal@19827 151 movb $0x42,%ah
pascal@19827 152 pushw %bx
pascal@19827 153 cmpw $63,2(%di) // empty or isolinux partition ?
pascal@19827 154 jbe default
pascal@19827 155 int $0x13
pascal@19827 156 default:
pascal@19827 157 ret
pascal@19827 158 .org 0x7DEF
pascal@19827 159 bootpartition:
pascal@19827 160 pushw %ds
pascal@19827 161 popw %es
pascal@19827 162 pushw %si
pascal@19827 163 movw %bx,%di
pascal@19827 164 movsw
pascal@19827 165 movsb
pascal@19827 166 movw $partcode+0x100,%di
pascal@19827 167 pushw %di
pascal@19827 168 movepartition:
pascal@19827 169 movw $66/2,%cx
pascal@19827 170 rep
pascal@19827 171 movsw
pascal@19827 172 ret
pascal@19827 173 .org 0x7E00
pascal@19827 174
pascal@17810 175 .org 0x7F48
pascal@13691 176 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 177
pascal@13729 178 exestart:
pascal@13699 179 cld
pascal@19428 180 movw $EXEADRS(puts), %bp
pascal@17810 181 movw 129, %ax
pascal@17473 182 cmpb $0x2F, %al
pascal@17473 183 je ishelp
pascal@17473 184 cmpw $0x2F20, %ax
pascal@17473 185 ishelp:
pascal@17473 186 movw $0x3000+EXESTR(help), %ax
pascal@13729 187 cwd // clear dx
pascal@17454 188 pushw %dx // dos exit()
pascal@17454 189 je abort
pascal@17454 190 int $0x21 // get DOS version
pascal@17562 191 addb $-3, %al
pascal@19435 192 movw $0xF000+EXESTR(noDOS3), %ax
pascal@19435 193 movw $0x100, %di
pascal@17810 194 jc tst386
pascal@13691 195 abort:
pascal@19429 196 jmp *%bp
pascal@13691 197
pascal@17160 198 tst386:
pascal@17906 199 pushfw // save flags
pascal@17160 200 // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
pascal@17160 201 // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
pascal@19435 202 // movb $0xF0, %ah
pascal@17160 203 pushw %ax
pascal@17906 204 popfw // < 286 : flags[12..15] are forced 1
pascal@17906 205 pushfw // = 286 : flags[12..15] are forced 0
pascal@17906 206 popw %bx // > 286 : only flags[15] is forced 0
pascal@17906 207 popfw // restore flags (IOPL)
pascal@17906 208 addb %ah, %bh // test F0 and 00 cases
pascal@19435 209 js is86 // NS=386+, NC=286
pascal@13691 210 is386:
pascal@17906 211 smsww %ax // not privileged
pascal@13691 212 andb $1, %al
pascal@17562 213 movw $10, %si
pascal@13691 214 jne tstvcpi
pascal@17906 215 movl %cr0, %eax // privileged
pascal@14150 216 incl %eax
pascal@13713 217 movb $EXESTR(rmPaging), %al
pascal@14150 218 js abort
pascal@17810 219 inc %ax
pascal@17810 220 //movb $EXESTR(realmodemsg), %al
pascal@13691 221 realmode:
pascal@19429 222 call *%bp
pascal@17160 223 is86:
pascal@14261 224 movw comstart-end_header(%di), %si // .com address
pascal@13691 225 pushw %di
pascal@17906 226 movb $0x7C/2, %ch // 31K-31.5K, > com length
pascal@13691 227 rep
pascal@17473 228 movsw
pascal@13691 229 ret
pascal@13713 230
pascal@19429 231 CallVCPI:
pascal@19428 232 int $0x67
pascal@19428 233 testb %ah, %ah
pascal@19428 234 xchgw %ax, %cx
pascal@19429 235 pushw %si
pascal@19428 236 ScanVCPI:
pascal@19428 237 popw %si
pascal@19428 238 ChkVCPI:
pascal@19428 239 NoVCPI:
pascal@19428 240 movb $EXESTR(ERRvcpi), %al
pascal@19428 241 jne abort
pascal@19428 242 lodsb
pascal@19428 243 shlw $8, %ax
pascal@19428 244 jne CallVCPI
pascal@13713 245 VersionVCPI:
pascal@17496 246 xchgw %ax, %si // movb $EXESTR(vm86modemsg), %al
pascal@17562 247 cmpb $0x40, %cl // EMM386 / VCPI 4.0 mini
pascal@17562 248 jnc realmode // %si = 0
pascal@13713 249 tstvcpi:
pascal@13713 250 pushw %ds
pascal@17810 251 movw %si, %ds // %si = 10
pascal@17810 252 movw (0x67*4)+2-(16*10)-0x100(%di), %ds
pascal@17473 253 lodsw
pascal@13713 254 xorw $0x4D45, %ax // EM(MX) or EM(MQ)
pascal@17473 255 lodsw
pascal@17473 256 lodsw
pascal@13713 257 popw %ds
pascal@14150 258 jne NoVCPI
pascal@19435 259 xorw $0x5858, %ax // XX(X0)
pascal@19428 260 call ScanVCPI
pascal@13713 261 CmdVCPI:
pascal@13713 262 .byte 0x40 // status
pascal@13713 263 .byte 0xDE // vcpi present ?
pascal@13713 264 .byte 0x46 // version
pascal@13713 265 .byte 0
pascal@13713 266
pascal@17496 267 vm86modemsg:
pascal@17473 268 // --------------- Must be in 7F40 7FFF range ------------------------
pascal@17810 269 .ascii "86" // 86 mode
pascal@17562 270 .byte EXESTR(mode)
pascal@14261 271 ERRvcpi:
pascal@17810 272 .ascii "VCPI4" // VCPI4?
pascal@17562 273 .byte EXESTR(need)
pascal@14261 274 rmPaging:
pascal@17810 275 .ascii "X" // Xreal mode
pascal@14261 276 realmodemsg:
pascal@17562 277 .ascii "real" // real mode
pascal@17473 278 // --------------- Must be in 7FC0 7FFF range ------------------------
pascal@17562 279 mode:
pascal@17562 280 .ascii " m"
pascal@17496 281 ode:
pascal@17562 282 .ascii "ode"
pascal@14261 283 .byte EXESTR(eol)
pascal@17562 284 noDOS3:
pascal@17810 285 .ascii "DOS3" // DOS3?
pascal@17562 286 need:
pascal@17810 287 .ascii "?"
pascal@17496 288 .byte EXESTR(eol)
pascal@17473 289 help:
pascal@19435 290 .ascii "SliTaz iso boot." // SliTaz iso boot.
pascal@17473 291 eol:
pascal@17496 292 .ascii "\r\n"
pascal@17810 293 .byte 1 // puts will return
pascal@14261 294
pascal@17496 295 .space 16,0 // ISO md5
pascal@14261 296 .org 0x8000
pascal@14261 297 ////////////////////////// ISO9660 header /////////////////////////////////////