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

syslinux/iso2exe: menu can create usbkey/floppy
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Dec 14 15:43:12 2012 +0100 (2012-12-14)
parents 7d300004a3b8
children 58b695f73790
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@13691 6 #define EXEADRS(x) x+0xE0
pascal@13691 7 #define EXESTR(x) x-0x20
pascal@13691 8
pascal@13691 9 .globl _start
pascal@13691 10 _start:
pascal@13691 11 decw %bp // Magic number: MZ
pascal@13691 12 popw %dx
pascal@13691 13 jmp start // Bytes on last page of file
pascal@13691 14 .word (CODESZ+511)/512 // Pages in file
pascal@13691 15 .word 0 // Relocations
pascal@13691 16 .word (end_header-_start)/16 // Size of header in paragraphs
pascal@13691 17 .word 4064-(CODESZ/16) // Minimum extra paragraphs needed
pascal@13691 18 .word 4064-(CODESZ/16) // Maximum extra paragraphs needed
pascal@13691 19 .word 0xFFF0 // Initial (relative) SS value
pascal@13691 20 .word 0xFFFE // Initial SP value
pascal@13691 21 .word 0 // Checksum
pascal@13691 22 .word EXEADRS(fixseg) // Initial IP value
pascal@13691 23 .word 0xFFF0 // Initial (relative) CS value
pascal@13691 24 .word 0x001C // File address of relocation table
pascal@13691 25 .word 0 // Overlay number
pascal@13691 26 initramfssize:
pascal@13691 27 .word 0
pascal@13691 28 id:
pascal@13691 29 .word 0
pascal@13691 30 end_header:
pascal@13691 31
pascal@13691 32 chksum:
pascal@13697 33 .word 0
pascal@13691 34 comstart:
pascal@13691 35 .word 0
pascal@13691 36
pascal@13691 37 /////////////////////// Master Boot Record code //////////////////////////////
pascal@13691 38
pascal@13691 39 start:
pascal@13691 40 incw %bp
pascal@13691 41 pushw %dx // restore SP
pascal@13691 42 pushaw
pascal@13691 43 movw %sp, %bp
pascal@13691 44 pushf
pascal@13691 45 pushw %ds
pascal@13691 46 pushw %es
pascal@13691 47 pushw $0
pascal@13691 48 popw %ds
pascal@13691 49 call setreg
pascal@13691 50 rep
pascal@13691 51 movsw
pascal@13691 52 ljmp $0, $0x0600+start2
pascal@13691 53
pascal@13691 54 setreg:
pascal@13691 55 cld
pascal@13691 56 pushw %ds
pascal@13691 57 popw %es
pascal@13691 58 movw $0x7C00, %si
pascal@13691 59 movw %si, %bx
pascal@13691 60 movw $0x0600, %di
pascal@13691 61 movw $0x0100, %cx
pascal@13691 62 return:
pascal@13691 63 ret
pascal@13691 64 start2:
pascal@13691 65 movw $0x80, %dx
pascal@13691 66 dxloop:
pascal@13691 67 movw $1, %cx
pascal@13691 68 movw $0x201, %ax
pascal@13691 69 int $0x13
pascal@13691 70 jc next
pascal@13691 71 call setreg
pascal@13691 72 repe
pascal@13691 73 cmpsw
pascal@13691 74 je dxfound
pascal@13691 75 next:
pascal@13691 76 addb $0x7D, %dl // try every hard disk
pascal@13691 77 andb $0x83, %dl // and floppy disk
pascal@13691 78 cmpb $0x80, %dl
pascal@13691 79 jnz dxloop
pascal@13691 80 fail:
pascal@13691 81 int $0x19
pascal@13691 82 dxfound:
pascal@13691 83 movw %dx, 10(%bp)
pascal@13691 84 movb $2, %cl // %ch = 0
pascal@13691 85 movw $0x201, %ax
pascal@13691 86 int $0x13
pascal@13691 87 jc fail
pascal@13691 88 cmpw $0xAA55, 0x7DFE
pascal@13691 89 jne fail
pascal@13691 90 popw %es
pascal@13691 91 popw %ds
pascal@13691 92 popf
pascal@13691 93 popa
pascal@13691 94 ljmp $0, $0x7C00
pascal@13691 95
pascal@13691 96 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 97
pascal@13697 98 eol:
pascal@13697 99 .ascii ".\r\n$"
pascal@13691 100 no386:
pascal@13691 101 .ascii "No 386+$"
pascal@13691 102 noDOS3:
pascal@13691 103 .ascii "No DOS 3.0+$"
pascal@13691 104 rmPaging:
pascal@13697 105 .ascii "Broken paging$"
pascal@13691 106 ERRvcpi:
pascal@13691 107 .ascii "No VCPI 4.0+$"
pascal@13691 108 chkerr:
pascal@13697 109 .ascii "Broken ISO$"
pascal@13691 110 realmodemsg:
pascal@13697 111 .ascii "Real mode$"
pascal@13691 112 vm86modemsg:
pascal@13697 113 .ascii "VM86 mode$"
pascal@13691 114 help:
pascal@13697 115 .ascii "SliTaz GNU/Linux bootloader$"
pascal@13697 116
pascal@13691 117 fixseg:
pascal@13691 118 movb $EXESTR(help), %dl
pascal@13697 119 movw $0x100, %si
pascal@13697 120 cmpw $0x3F2F, -126(%si) # /?
pascal@13691 121 je abort
pascal@13697 122 movw (%si), %cx
pascal@13697 123 jcxz skip
pascal@13697 124 xorw %dx, %dx
pascal@13697 125 movw $0x7FE0/2, %cx
pascal@13697 126 chklp:
pascal@13697 127 lodsw
pascal@13697 128 addw %ax, %dx
pascal@13697 129 loop chklp
pascal@13697 130 orw %dx, %dx
pascal@13697 131 movb $EXESTR(chkerr), %dl
pascal@13697 132 jne abort
pascal@13697 133 skip:
pascal@13691 134 pushf
pascal@13691 135 popw %ax
pascal@13691 136 movw $0xF0F0, %cx
pascal@13691 137 orb %ah, %ch
pascal@13691 138 andb $0xF, %ah
pascal@13691 139 pushw %ax
pascal@13691 140 popf
pascal@13691 141 pushf
pascal@13691 142 popw %ax
pascal@13691 143 andb %cl, %ah
pascal@13691 144 cmp %cl, %ah
pascal@13691 145 je NotSupported // 8086 family
pascal@13691 146 pushw %cx
pascal@13691 147 popf
pascal@13691 148 pushf
pascal@13691 149 popw %ax
pascal@13691 150 andb %cl, %ah
pascal@13691 151 jnz is386 // 80286 family
pascal@13691 152 NotSupported:
pascal@13691 153 movb $EXESTR(no386), %dl
pascal@13691 154 abort:
pascal@13691 155 puts:
pascal@13691 156 movb $1, %dh
pascal@13697 157 call puts2
pascal@13697 158 movw $EXEADRS(eol), %dx
pascal@13697 159 puts2:
pascal@13691 160 movb $9, %ah
pascal@13691 161 int $0x21
pascal@13691 162 ret
pascal@13691 163
pascal@13691 164 is386:
pascal@13691 165 movb $0x30, %ah
pascal@13691 166 int $0x21
pascal@13691 167 cmpb $3, %al
pascal@13691 168 movb $EXESTR(noDOS3), %dl
pascal@13691 169 jb abort
pascal@13697 170 movl %cr0, %eax
pascal@13691 171 andb $1, %al
pascal@13691 172 jne tstvcpi
pascal@13691 173 movb $EXESTR(rmPaging), %dl
pascal@13691 174 shll $1, %eax
pascal@13691 175 jc abort
pascal@13697 176 movb $EXESTR(realmodemsg), %dl
pascal@13691 177 jmp realmode
pascal@13691 178
pascal@13691 179 tstvcpi:
pascal@13691 180 pushw %ds
pascal@13691 181 pushw $0
pascal@13691 182 popw %ds
pascal@13691 183 movw 0x67*4+2, %ds
pascal@13691 184 std
pascal@13691 185 movw $14, %si
pascal@13691 186 lodsl
pascal@13691 187 cmpl $0x30585858, %eax // 0XXX
pascal@13691 188 lodsl
pascal@13691 189 cld
pascal@13691 190 popw %ds
pascal@13691 191 NoVCPI:
pascal@13691 192 movb $EXESTR(ERRvcpi), %dl
pascal@13691 193 goabort:
pascal@13691 194 jne abort
pascal@13691 195 shll $8, %eax
pascal@13691 196 cmpl $0x4D4D4500, %eax // [XQ]MME
pascal@13691 197 movw $EXEADRS(CmdVCPI), %si
pascal@13691 198 ChkVCPI:
pascal@13691 199 jne NoVCPI
pascal@13691 200 lodsb
pascal@13691 201 shlw $8, %ax
pascal@13691 202 je VersionVCPI
pascal@13691 203 int $0x67
pascal@13691 204 jmp ChkVCPI
pascal@13697 205
pascal@13691 206 CmdVCPI:
pascal@13691 207 .byte 0x40 // status
pascal@13691 208 .byte 0xDE // vcpi present ?
pascal@13691 209 .byte 0x46 // version
pascal@13691 210 .byte 0
pascal@13697 211
pascal@13691 212 VersionVCPI:
pascal@13691 213 cmpb $0x40, %al // >= 4.0 ?
pascal@13691 214 jb NoVCPI
pascal@13697 215 movb $EXESTR(vm86modemsg), %dl
pascal@13691 216 realmode:
pascal@13691 217 call puts
pascal@13691 218 movw EXEADRS(comstart), %ax // .com address
pascal@13691 219 cld
pascal@13691 220 movw $moveend-move, %cx
pascal@13691 221 movw $EXEADRS(move), %si
pascal@13691 222 movw $0xC000, %di
pascal@13691 223 jmp move2
pascal@13691 224
pascal@13691 225 move:
pascal@13691 226 movb $0x80, %ch
pascal@13691 227 xchgw %ax, %si
pascal@13691 228 movw $0x0100, %di
pascal@13691 229 move2:
pascal@13691 230 pushw %di
pascal@13691 231 rep
pascal@13691 232 movsb
pascal@13691 233 ret
pascal@13691 234 moveend:
pascal@13691 235
pascal@13691 236 .org 440
pascal@13691 237 //////////////////////////// partition table //////////////////////////////////
pascal@13691 238