wok-current annotate syslinux/stuff/iso2exe/bootiso.S @ rev 13691

syslinux: add iso2exe
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 13 14:33:27 2012 +0100 (2012-12-13)
parents
children d47403fdd900
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@13691 33 .long 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@13691 98 no386:
pascal@13691 99 .ascii "No 386+$"
pascal@13691 100 noDOS3:
pascal@13691 101 .ascii "No DOS 3.0+$"
pascal@13691 102 rmPaging:
pascal@13691 103 .ascii "Broken paging.$"
pascal@13691 104 ERRvcpi:
pascal@13691 105 .ascii "No VCPI 4.0+$"
pascal@13691 106 chkerr:
pascal@13691 107 .ascii "Broken ISO.$"
pascal@13691 108 realmodemsg:
pascal@13691 109 .ascii "Real mode\r$"
pascal@13691 110 vm86modemsg:
pascal@13691 111 .ascii "Vm86\r$"
pascal@13691 112 help:
pascal@13691 113 .ascii "Linux kickstarter.\r\n$"
pascal@13691 114 fixseg:
pascal@13691 115 #if 1
pascal@13691 116 movb $EXESTR(help), %dl
pascal@13691 117 movw 0x82, %ax
pascal@13691 118 cmpw $0x3F2F, %ax # /?
pascal@13691 119 je abort
pascal@13691 120 #endif
pascal@13691 121 pushf
pascal@13691 122 popw %ax
pascal@13691 123 movw $0xF0F0, %cx
pascal@13691 124 orb %ah, %ch
pascal@13691 125 andb $0xF, %ah
pascal@13691 126
pascal@13691 127 pushw %ax
pascal@13691 128 popf
pascal@13691 129 pushf
pascal@13691 130 popw %ax
pascal@13691 131 andb %cl, %ah
pascal@13691 132
pascal@13691 133 cmp %cl, %ah
pascal@13691 134 je NotSupported // 8086 family
pascal@13691 135
pascal@13691 136 pushw %cx
pascal@13691 137 popf
pascal@13691 138 pushf
pascal@13691 139 popw %ax
pascal@13691 140 andb %cl, %ah
pascal@13691 141
pascal@13691 142 jnz is386 // 80286 family
pascal@13691 143 NotSupported:
pascal@13691 144 movb $EXESTR(no386), %dl
pascal@13691 145 abort:
pascal@13691 146 puts:
pascal@13691 147 movb $1, %dh
pascal@13691 148 movb $9, %ah
pascal@13691 149 int $0x21
pascal@13691 150 ret
pascal@13691 151
pascal@13691 152 is386:
pascal@13691 153 movb $0x30, %ah
pascal@13691 154 int $0x21
pascal@13691 155 cmpb $3, %al
pascal@13691 156 movb $EXESTR(noDOS3), %dl
pascal@13691 157 jb abort
pascal@13691 158 smsw %ax
pascal@13691 159 andb $1, %al
pascal@13691 160 jne tstvcpi
pascal@13691 161 movl %cr0, %eax
pascal@13691 162 movb $EXESTR(rmPaging), %dl
pascal@13691 163 shll $1, %eax
pascal@13691 164 jc abort
pascal@13691 165 jmp realmode
pascal@13691 166
pascal@13691 167 tstvcpi:
pascal@13691 168 pushw %ds
pascal@13691 169 pushw $0
pascal@13691 170 popw %ds
pascal@13691 171 movw 0x67*4+2, %ds
pascal@13691 172 std
pascal@13691 173 movw $14, %si
pascal@13691 174 lodsl
pascal@13691 175 cmpl $0x30585858, %eax // 0XXX
pascal@13691 176 lodsl
pascal@13691 177 cld
pascal@13691 178 popw %ds
pascal@13691 179 NoVCPI:
pascal@13691 180 movb $EXESTR(ERRvcpi), %dl
pascal@13691 181 goabort:
pascal@13691 182 jne abort
pascal@13691 183 shll $8, %eax
pascal@13691 184 cmpl $0x4D4D4500, %eax // [XQ]MME
pascal@13691 185 #if 1
pascal@13691 186 movw $EXEADRS(CmdVCPI), %si
pascal@13691 187 ChkVCPI:
pascal@13691 188 jne NoVCPI
pascal@13691 189 lodsb
pascal@13691 190 shlw $8, %ax
pascal@13691 191 je VersionVCPI
pascal@13691 192 int $0x67
pascal@13691 193 jmp ChkVCPI
pascal@13691 194 CmdVCPI:
pascal@13691 195 .byte 0x40 // status
pascal@13691 196 .byte 0xDE // vcpi present ?
pascal@13691 197 .byte 0x46 // version
pascal@13691 198 .byte 0
pascal@13691 199 VersionVCPI:
pascal@13691 200 cmpb $0x40, %al // >= 4.0 ?
pascal@13691 201 jb NoVCPI
pascal@13691 202 #else
pascal@13691 203 jne NoVCPI
pascal@13691 204 movb $0x40, %ah // status
pascal@13691 205 int $0x67
pascal@13691 206 testb %ah, %ah
pascal@13691 207 jne NoVCPI
pascal@13691 208 movb $0x46, %ah // version
pascal@13691 209 int $0x67
pascal@13691 210 testb %ah, %ah
pascal@13691 211 jne NoVCPI
pascal@13691 212 cmpb $0x40, %al // >= 4.0 ?
pascal@13691 213 jb NoVCPI
pascal@13691 214 movw $0xDE00, %ax // vcpi present ?
pascal@13691 215 int $0x67
pascal@13691 216 testb %ah, %ah
pascal@13691 217 jne NoVCPI
pascal@13691 218 #endif
pascal@13691 219 realmode:
pascal@13691 220 movw $0x100, %si
pascal@13691 221 lodsl
pascal@13691 222 xchgl %eax, %edx
pascal@13691 223 orl %edx, %edx
pascal@13691 224 jz skip
pascal@13691 225 movw $0x7FDC/4, %cx
pascal@13691 226 chklp:
pascal@13691 227 lodsl
pascal@13691 228 addl %eax, %edx
pascal@13691 229 loop chklp
pascal@13691 230 orl %edx, %edx
pascal@13691 231 movb $EXESTR(chkerr), %dl
pascal@13691 232 jne goabort
pascal@13691 233 skip:
pascal@13691 234 movb $EXESTR(realmodemsg), %dl
pascal@13691 235 smsww %ax
pascal@13691 236 andb $1, %al
pascal@13691 237 jz isrealmode
pascal@13691 238 movb $EXESTR(vm86modemsg), %dl
pascal@13691 239 isrealmode:
pascal@13691 240 call puts
pascal@13691 241 movw EXEADRS(comstart), %ax // .com address
pascal@13691 242
pascal@13691 243 cld
pascal@13691 244 movw $moveend-move, %cx
pascal@13691 245 movw $EXEADRS(move), %si
pascal@13691 246 movw $0xC000, %di
pascal@13691 247 jmp move2
pascal@13691 248
pascal@13691 249 move:
pascal@13691 250 movb $0x80, %ch
pascal@13691 251 xchgw %ax, %si
pascal@13691 252 movw $0x0100, %di
pascal@13691 253 move2:
pascal@13691 254 pushw %di
pascal@13691 255 rep
pascal@13691 256 movsb
pascal@13691 257 ret
pascal@13691 258 moveend:
pascal@13691 259
pascal@13691 260 .org 440
pascal@13691 261 //////////////////////////// partition table //////////////////////////////////
pascal@13691 262