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

syslinux/iso2exe: only DOS 3, 4 and 6 supported :-/
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Dec 15 13:43:51 2012 +0100 (2012-12-15)
parents d47403fdd900
children 9d2380009b81
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 call setreg
pascal@13691 48 rep
pascal@13691 49 movsw
pascal@13691 50 ljmp $0, $0x0600+start2
pascal@13691 51
pascal@13699 52 readsector2:
pascal@13699 53 incw %cx
pascal@13699 54 readsector1:
pascal@13699 55 movw %cx, (%bx)
pascal@13699 56 incw %cx
pascal@13699 57 movw $0x201, %ax
pascal@13699 58 int $0x13
pascal@13691 59 setreg:
pascal@13691 60 cld
pascal@13699 61 xorw %bx, %bx // Clear C
pascal@13699 62 movw %bx, %ds
pascal@13699 63 movw %bx, %es
pascal@13699 64 movb $0x7C, %bh
pascal@13699 65 movw %bx, %si
pascal@13691 66 movw $0x0600, %di
pascal@13691 67 movw $0x0100, %cx
pascal@13691 68 return:
pascal@13691 69 ret
pascal@13691 70 start2:
pascal@13691 71 movw $0x80, %dx
pascal@13691 72 dxloop:
pascal@13699 73 call readsector1
pascal@13691 74 repe
pascal@13691 75 cmpsw
pascal@13691 76 je dxfound
pascal@13691 77 next:
pascal@13699 78 xorw %cx, %cx
pascal@13699 79 xchgw %ax, %dx
pascal@13699 80 addb $0x7D, %al // try every hard disk
pascal@13699 81 andb $0x83, %al // and floppy disk
pascal@13699 82 cmpb $0x80, %al
pascal@13699 83 xchgw %ax, %dx
pascal@13691 84 jnz dxloop
pascal@13691 85 fail:
pascal@13691 86 int $0x19
pascal@13691 87 dxfound:
pascal@13691 88 movw %dx, 10(%bp)
pascal@13699 89 call readsector2
pascal@13699 90 lodsw
pascal@13699 91 decw %ax
pascal@13699 92 jz fail // read fail or not isohydrid
pascal@13691 93 popw %es
pascal@13691 94 popw %ds
pascal@13691 95 popf
pascal@13691 96 popa
pascal@13691 97 ljmp $0, $0x7C00
pascal@13691 98
pascal@13691 99 ////////////////////////////// DOS EXE code ///////////////////////////////////
pascal@13691 100
pascal@13697 101 eol:
pascal@13697 102 .ascii ".\r\n$"
pascal@13691 103 no386:
pascal@13691 104 .ascii "No 386+$"
pascal@13691 105 noDOS3:
pascal@13691 106 .ascii "No DOS 3.0+$"
pascal@13691 107 rmPaging:
pascal@13697 108 .ascii "Broken paging$"
pascal@13691 109 ERRvcpi:
pascal@13699 110 .ascii "No EMM386/VCPI 4.0+$"
pascal@13691 111 chkerr:
pascal@13699 112 .ascii "Broken ISO file$"
pascal@13691 113 realmodemsg:
pascal@13697 114 .ascii "Real mode$"
pascal@13691 115 vm86modemsg:
pascal@13697 116 .ascii "VM86 mode$"
pascal@13691 117 help:
pascal@13699 118 .ascii "SliTaz GNU/Linux boot loader$"
pascal@13697 119
pascal@13691 120 fixseg:
pascal@13699 121 cld
pascal@13691 122 movb $EXESTR(help), %dl
pascal@13697 123 movw $0x100, %si
pascal@13697 124 cmpw $0x3F2F, -126(%si) # /?
pascal@13691 125 je abort
pascal@13697 126 movw (%si), %cx
pascal@13697 127 jcxz skip
pascal@13697 128 xorw %dx, %dx
pascal@13697 129 movw $0x7FE0/2, %cx
pascal@13697 130 chklp:
pascal@13697 131 lodsw
pascal@13697 132 addw %ax, %dx
pascal@13697 133 loop chklp
pascal@13697 134 orw %dx, %dx
pascal@13697 135 movb $EXESTR(chkerr), %dl
pascal@13697 136 jne abort
pascal@13697 137 skip:
pascal@13691 138 pushf
pascal@13691 139 popw %ax
pascal@13699 140 movw $0xF0F0, %dx
pascal@13699 141 orb %ah, %dh
pascal@13691 142 andb $0xF, %ah
pascal@13691 143 pushw %ax
pascal@13691 144 popf
pascal@13691 145 pushf
pascal@13691 146 popw %ax
pascal@13699 147 andb %dl, %ah
pascal@13699 148 cmp %dl, %ah
pascal@13691 149 je NotSupported // 8086 family
pascal@13699 150 pushw %dx
pascal@13691 151 popf
pascal@13691 152 pushf
pascal@13691 153 popw %ax
pascal@13699 154 andb %dl, %ah
pascal@13691 155 jnz is386 // 80286 family
pascal@13691 156 NotSupported:
pascal@13691 157 movb $EXESTR(no386), %dl
pascal@13691 158 abort:
pascal@13691 159 puts:
pascal@13691 160 movb $1, %dh
pascal@13697 161 call puts2
pascal@13697 162 movw $EXEADRS(eol), %dx
pascal@13697 163 puts2:
pascal@13691 164 movb $9, %ah
pascal@13691 165 int $0x21
pascal@13691 166 ret
pascal@13691 167
pascal@13691 168 is386:
pascal@13697 169 movl %cr0, %eax
pascal@13691 170 andb $1, %al
pascal@13691 171 jne tstvcpi
pascal@13691 172 movb $EXESTR(rmPaging), %dl
pascal@13691 173 shll $1, %eax
pascal@13699 174 cabort:
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@13699 181 movw %cx, %ds // %cx = 0
pascal@13691 182 movw 0x67*4+2, %ds
pascal@13691 183 std
pascal@13691 184 movw $14, %si
pascal@13691 185 lodsl
pascal@13691 186 cmpl $0x30585858, %eax // 0XXX
pascal@13691 187 lodsl
pascal@13691 188 cld
pascal@13691 189 popw %ds
pascal@13691 190 NoVCPI:
pascal@13691 191 movb $EXESTR(ERRvcpi), %dl
pascal@13691 192 jne abort
pascal@13691 193 shll $8, %eax
pascal@13691 194 cmpl $0x4D4D4500, %eax // [XQ]MME
pascal@13691 195 movw $EXEADRS(CmdVCPI), %si
pascal@13691 196 ChkVCPI:
pascal@13691 197 jne NoVCPI
pascal@13691 198 lodsb
pascal@13691 199 shlw $8, %ax
pascal@13691 200 je VersionVCPI
pascal@13691 201 int $0x67
pascal@13691 202 jmp ChkVCPI
pascal@13697 203
pascal@13691 204 CmdVCPI:
pascal@13691 205 .byte 0x40 // status
pascal@13691 206 .byte 0xDE // vcpi present ?
pascal@13691 207 .byte 0x46 // version
pascal@13691 208 .byte 0
pascal@13697 209
pascal@13691 210 VersionVCPI:
pascal@13691 211 cmpb $0x40, %al // >= 4.0 ?
pascal@13691 212 jb NoVCPI
pascal@13697 213 movb $EXESTR(vm86modemsg), %dl
pascal@13691 214 realmode:
pascal@13691 215 call puts
pascal@13699 216 movb $0x30, %ah
pascal@13699 217 int $0x21
pascal@13699 218 cmpb $3, %al
pascal@13699 219 movb $EXESTR(noDOS3), %dl
pascal@13699 220 jb cabort
pascal@13691 221 movw EXEADRS(comstart), %ax // .com address
pascal@13691 222 movw $moveend-move, %cx
pascal@13691 223 movw $EXEADRS(move), %si
pascal@13691 224 movw $0xC000, %di
pascal@13691 225 jmp move2
pascal@13691 226
pascal@13691 227 move:
pascal@13691 228 movb $0x80, %ch
pascal@13691 229 xchgw %ax, %si
pascal@13691 230 movw $0x0100, %di
pascal@13691 231 move2:
pascal@13691 232 pushw %di
pascal@13691 233 rep
pascal@13691 234 movsb
pascal@13691 235 ret
pascal@13691 236 moveend:
pascal@13691 237
pascal@13691 238 .org 440
pascal@13691 239 //////////////////////////// partition table //////////////////////////////////
pascal@13691 240