wok-current diff 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 |
line diff
1.1 --- a/syslinux/stuff/iso2exe/bootiso.S Fri Dec 14 15:43:12 2012 +0100 1.2 +++ b/syslinux/stuff/iso2exe/bootiso.S Sat Dec 15 13:43:51 2012 +0100 1.3 @@ -44,19 +44,25 @@ 1.4 pushf 1.5 pushw %ds 1.6 pushw %es 1.7 - pushw $0 1.8 - popw %ds 1.9 call setreg 1.10 rep 1.11 movsw 1.12 ljmp $0, $0x0600+start2 1.13 1.14 +readsector2: 1.15 + incw %cx 1.16 +readsector1: 1.17 + movw %cx, (%bx) 1.18 + incw %cx 1.19 + movw $0x201, %ax 1.20 + int $0x13 1.21 setreg: 1.22 cld 1.23 - pushw %ds 1.24 - popw %es 1.25 - movw $0x7C00, %si 1.26 - movw %si, %bx 1.27 + xorw %bx, %bx // Clear C 1.28 + movw %bx, %ds 1.29 + movw %bx, %es 1.30 + movb $0x7C, %bh 1.31 + movw %bx, %si 1.32 movw $0x0600, %di 1.33 movw $0x0100, %cx 1.34 return: 1.35 @@ -64,29 +70,26 @@ 1.36 start2: 1.37 movw $0x80, %dx 1.38 dxloop: 1.39 - movw $1, %cx 1.40 - movw $0x201, %ax 1.41 - int $0x13 1.42 - jc next 1.43 - call setreg 1.44 + call readsector1 1.45 repe 1.46 cmpsw 1.47 je dxfound 1.48 next: 1.49 - addb $0x7D, %dl // try every hard disk 1.50 - andb $0x83, %dl // and floppy disk 1.51 - cmpb $0x80, %dl 1.52 + xorw %cx, %cx 1.53 + xchgw %ax, %dx 1.54 + addb $0x7D, %al // try every hard disk 1.55 + andb $0x83, %al // and floppy disk 1.56 + cmpb $0x80, %al 1.57 + xchgw %ax, %dx 1.58 jnz dxloop 1.59 fail: 1.60 int $0x19 1.61 dxfound: 1.62 movw %dx, 10(%bp) 1.63 - movb $2, %cl // %ch = 0 1.64 - movw $0x201, %ax 1.65 - int $0x13 1.66 - jc fail 1.67 - cmpw $0xAA55, 0x7DFE 1.68 - jne fail 1.69 + call readsector2 1.70 + lodsw 1.71 + decw %ax 1.72 + jz fail // read fail or not isohydrid 1.73 popw %es 1.74 popw %ds 1.75 popf 1.76 @@ -104,17 +107,18 @@ 1.77 rmPaging: 1.78 .ascii "Broken paging$" 1.79 ERRvcpi: 1.80 - .ascii "No VCPI 4.0+$" 1.81 + .ascii "No EMM386/VCPI 4.0+$" 1.82 chkerr: 1.83 - .ascii "Broken ISO$" 1.84 + .ascii "Broken ISO file$" 1.85 realmodemsg: 1.86 .ascii "Real mode$" 1.87 vm86modemsg: 1.88 .ascii "VM86 mode$" 1.89 help: 1.90 - .ascii "SliTaz GNU/Linux bootloader$" 1.91 + .ascii "SliTaz GNU/Linux boot loader$" 1.92 1.93 fixseg: 1.94 + cld 1.95 movb $EXESTR(help), %dl 1.96 movw $0x100, %si 1.97 cmpw $0x3F2F, -126(%si) # /? 1.98 @@ -133,21 +137,21 @@ 1.99 skip: 1.100 pushf 1.101 popw %ax 1.102 - movw $0xF0F0, %cx 1.103 - orb %ah, %ch 1.104 + movw $0xF0F0, %dx 1.105 + orb %ah, %dh 1.106 andb $0xF, %ah 1.107 pushw %ax 1.108 popf 1.109 pushf 1.110 popw %ax 1.111 - andb %cl, %ah 1.112 - cmp %cl, %ah 1.113 + andb %dl, %ah 1.114 + cmp %dl, %ah 1.115 je NotSupported // 8086 family 1.116 - pushw %cx 1.117 + pushw %dx 1.118 popf 1.119 pushf 1.120 popw %ax 1.121 - andb %cl, %ah 1.122 + andb %dl, %ah 1.123 jnz is386 // 80286 family 1.124 NotSupported: 1.125 movb $EXESTR(no386), %dl 1.126 @@ -162,24 +166,19 @@ 1.127 ret 1.128 1.129 is386: 1.130 - movb $0x30, %ah 1.131 - int $0x21 1.132 - cmpb $3, %al 1.133 - movb $EXESTR(noDOS3), %dl 1.134 - jb abort 1.135 movl %cr0, %eax 1.136 andb $1, %al 1.137 jne tstvcpi 1.138 movb $EXESTR(rmPaging), %dl 1.139 shll $1, %eax 1.140 +cabort: 1.141 jc abort 1.142 movb $EXESTR(realmodemsg), %dl 1.143 jmp realmode 1.144 1.145 tstvcpi: 1.146 pushw %ds 1.147 - pushw $0 1.148 - popw %ds 1.149 + movw %cx, %ds // %cx = 0 1.150 movw 0x67*4+2, %ds 1.151 std 1.152 movw $14, %si 1.153 @@ -190,7 +189,6 @@ 1.154 popw %ds 1.155 NoVCPI: 1.156 movb $EXESTR(ERRvcpi), %dl 1.157 -goabort: 1.158 jne abort 1.159 shll $8, %eax 1.160 cmpl $0x4D4D4500, %eax // [XQ]MME 1.161 @@ -215,8 +213,12 @@ 1.162 movb $EXESTR(vm86modemsg), %dl 1.163 realmode: 1.164 call puts 1.165 + movb $0x30, %ah 1.166 + int $0x21 1.167 + cmpb $3, %al 1.168 + movb $EXESTR(noDOS3), %dl 1.169 + jb cabort 1.170 movw EXEADRS(comstart), %ax // .com address 1.171 - cld 1.172 movw $moveend-move, %cx 1.173 movw $EXEADRS(move), %si 1.174 movw $0xC000, %di