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

linld/iso2exe: remove non slitaz dos boot
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Aug 10 18:47:30 2019 +0200 (2019-08-10)
parents ab8e834bbcfe
children ec56ab0f8e5b
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@21791 180 .org 0x7F40
pascal@13691 181 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 182
pascal@13729 183 exestart:
pascal@17810 184 movw 129, %ax
pascal@17473 185 cmpb $0x2F, %al
pascal@17473 186 je ishelp
pascal@17473 187 cmpw $0x2F20, %ax
pascal@17473 188 ishelp:
pascal@17473 189 movw $0x3000+EXESTR(help), %ax
pascal@13729 190 cwd // clear dx
pascal@17454 191 pushw %dx // dos exit()
pascal@17454 192 je abort
pascal@17454 193 int $0x21 // get DOS version
pascal@17562 194 addb $-3, %al
pascal@19849 195 movb $EXESTR(noDOS3), %al
pascal@19435 196 movw $0x100, %di
pascal@17810 197 jc tst386
pascal@13691 198 abort:
pascal@19849 199 goputs:
pascal@20867 200 mov $EXEADRS(puts), %si
pascal@20869 201 jmp *%si
pascal@13691 202
pascal@17160 203 tst386:
pascal@19849 204 pushw %sp
pascal@19849 205 popw %ax
pascal@19870 206 xorw %sp, %ax // clear C
pascal@19870 207 movb $EXESTR(vm86modemsg), %al
pascal@19849 208 jnz is86 // 86/186 not a 286+
pascal@19828 209 .arch i486
pascal@13691 210 is386:
pascal@19870 211 smsww %bx // not privileged
pascal@19870 212 andb $1, %bl // clear C
pascal@19863 213 jne isvm86
pascal@19870 214 movl %cr0, %ebx // privileged
pascal@19870 215 incl %ebx
pascal@19863 216 .arch i8086
pascal@13713 217 movb $EXESTR(rmPaging), %al
pascal@14150 218 js abort
pascal@19870 219 is86:
pascal@19870 220 incw %ax
pascal@17810 221 //movb $EXESTR(realmodemsg), %al
pascal@19863 222 isvm86:
pascal@19849 223 call goputs
pascal@21791 224 //----------
pascal@21791 225 pushw %di
pascal@21791 226 //------------- insert argv[0] in cmdline -----------------------
pascal@21791 227 xchgw %ax,%dx // %ax = 0
pascal@21791 228 movw %ax,%di
pascal@21791 229 movw 0x2C(%di),%es
pascal@21791 230 movw %sp,%cx // big enough
pascal@21791 231 scalp:
pascal@21791 232 repne
pascal@21791 233 scasb
pascal@21791 234 scasb
pascal@21791 235 jne scalp
pascal@21791 236 incw %di
pascal@21791 237 movw %di,%bx
pascal@21791 238 incw %di
pascal@21791 239 pushw %di // %es:%di = programme pathname
pascal@21791 240 repne
pascal@21791 241 scasb
pascal@21791 242 subw %di,%bx
pascal@21791 243 negw %bx
pascal@21791 244 movw $128,%si
pascal@21791 245 addw %bx,(%si)
pascal@21791 246 lodsb
pascal@21791 247 xchgw %ax,%cx
pascal@21791 248 incw %cx
pascal@21791 249 pushw %si
pascal@21791 250 p2lp:
pascal@21791 251 lodsb
pascal@21791 252 movb %al,-2(%bx,%si)
pascal@21791 253 loop p2lp
pascal@21791 254 popw %si
pascal@21791 255 popw %bx
pascal@21791 256 movb $0x20,%al
pascal@21791 257 p1lp:
pascal@21791 258 movb %al,(%si)
pascal@21791 259 incw %si
pascal@21791 260 movb %es:(%bx),%al
pascal@21791 261 incw %bx
pascal@21791 262 cmpw %bx,%di
pascal@21791 263 ja p1lp
pascal@21791 264 //----------
pascal@21791 265 popw %di
pascal@21791 266 pushw %cs
pascal@21791 267 popw %es
pascal@21791 268 //----------
pascal@14261 269 movw comstart-end_header(%di), %si // .com address
pascal@13691 270 pushw %di
pascal@17906 271 movb $0x7C/2, %ch // 31K-31.5K, > com length
pascal@20869 272 movb $0x80, %bh
pascal@20869 273 movw $0xA5F3, (%bx) // rep movsw
pascal@20869 274 movb $0xC3, 2(%bx) // ret
pascal@20869 275 jmp *%bx
pascal@13713 276
pascal@17496 277 vm86modemsg:
pascal@17473 278 // --------------- Must be in 7F40 7FFF range ------------------------
pascal@19871 279 .ascii "v" // v86 mode
pascal@17810 280 .ascii "86" // 86 mode
pascal@17562 281 .byte EXESTR(mode)
pascal@14261 282 rmPaging:
pascal@17810 283 .ascii "X" // Xreal mode
pascal@14261 284 realmodemsg:
pascal@17562 285 .ascii "real" // real mode
pascal@17473 286 // --------------- Must be in 7FC0 7FFF range ------------------------
pascal@17562 287 mode:
pascal@21791 288 .ascii " mode"
pascal@14261 289 .byte EXESTR(eol)
pascal@17562 290 noDOS3:
pascal@21791 291 .ascii "DOS3?" // DOS3?
pascal@17496 292 .byte EXESTR(eol)
pascal@17473 293 help:
pascal@21791 294 .ascii "SliTaz iso boot" // SliTaz iso boot
pascal@17473 295 eol:
pascal@17496 296 .ascii "\r\n"
pascal@17810 297 .byte 1 // puts will return
pascal@14261 298
pascal@17496 299 .space 16,0 // ISO md5
pascal@14261 300 .org 0x8000
pascal@14261 301 ////////////////////////// ISO9660 header /////////////////////////////////////