wok-tiny annotate linux/stuff/bundle.S @ rev 183

linux: fix bundle.S
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Sep 26 17:09:38 2023 +0000 (8 months ago)
parents bbb34fe4904d
children 5d44015ce878
rev   line source
pascal@104 1 #define TIMEOUT autostart after 5 seconds
pascal@104 2 #define CHECK_FILES add 'Check media' entry
pascal@104 3
pascal@104 4 .arch i8086
pascal@104 5 .code16
pascal@104 6 .org 0
pascal@104 7 start:
pascal@104 8 // stack segment setup
pascal@104 9 cld
pascal@104 10 movw $0x9000, %di
pascal@104 11 pushw %di
pascal@104 12 popw %ss
pascal@104 13 movw %di, %sp
pascal@104 14
pascal@104 15 // patch disk parameter table
pascal@118 16 xorw %cx, %cx
pascal@130 17 pushw %cx // bootloader may want to pull 0
pascal@104 18 movw $0x78, %bx
pascal@118 19 movw %cx, %ds
pascal@182 20 ldsw (%bx), %si // %ds:0x78 is parameter table address
pascal@104 21 pushw %ss
pascal@104 22 popw %es
pascal@182 23 movb $6, %cl // copy 12 bytes
pascal@104 24 pushw %di
pascal@104 25 rep
pascal@104 26 movsw
pascal@182 27 movb $63, %es:4-12(%di) // patch max sector count
pascal@104 28 movw %cx, %ds
pascal@104 29 popw (%bx)
pascal@182 30 movw %es, 2(%bx) // update parameter table address
pascal@104 31
pascal@104 32 // data segments setup
pascal@104 33 movw $0x7C0, %ax
pascal@104 34 pushw %ax
pascal@104 35 popw %ds
pascal@104 36 pushw %ds
pascal@104 37 popw %es
pascal@104 38
pascal@104 39 // main loop
pascal@104 40 menustart:
pascal@104 41 xorw %bp, %bp
pascal@104 42 menudown:
pascal@104 43 incw %bp
pascal@104 44 menustartlp:
pascal@104 45 movw $3, %ax
pascal@182 46 int $0x10 // clear screen
pascal@104 47 movb $1, %ah
pascal@104 48 movw $0x1000, %cx
pascal@182 49 int $0x10 // clear cursor
pascal@104 50 movw $menu, %si
pascal@104 51 call puts
pascal@104 52 call putcr
pascal@104 53 movw %bp, %cx
pascal@104 54 menulp:
pascal@182 55
pascal@151 56 .macro entry
pascal@182 57 movb $' ', %bl // not selected by default
pascal@104 58 lodsw
pascal@104 59 loop notcur
pascal@104 60 xchgw %ax, %di
pascal@182 61 movb $'>', %bl // selected when cx = 0
pascal@104 62 notcur:
pascal@151 63 xchgw %ax, %bx
pascal@151 64 .endm
pascal@182 65
pascal@104 66 #ifdef CHECK_FILES
pascal@151 67 call putentry
pascal@182 68 lodsw // CRC16
pascal@182 69 lodsw // sector count
pascal@151 70 #else
pascal@151 71 entry
pascal@151 72 call putcs
pascal@104 73 #endif
pascal@182 74 cmpw $0, (%si) // end of list ?
pascal@118 75 jne menulp
pascal@104 76 #ifdef CHECK_FILES
pascal@151 77 movw $msgcrc-2, %si
pascal@151 78 call putentry
pascal@104 79 #endif
pascal@104 80 menustartz:
pascal@182 81
pascal@151 82 .macro waitkbdcode
pascal@104 83 #ifdef TIMEOUT
pascal@104 84 clock = 0x46C
pascal@104 85 wait:
pascal@104 86 wait4key:
pascal@104 87 pushw %ds
pascal@130 88 xorw %ax, %ax
pascal@104 89 movw %ax, %ds
pascal@104 90 movw $clock, %si
pascal@104 91 #define DELAY 5
pascal@104 92 movb $257-(DELAY*182)/10, (%si)
pascal@104 93 waitkbd:
pascal@104 94 movw $0x10D, %ax // test keyboard, timeout => CR
pascal@104 95 cmpb (%si), %ah
pascal@151 96 clock_patch:
pascal@104 97 je waitdone
pascal@104 98 int $0x16
pascal@104 99 jz waitkbd
pascal@104 100 cbw
pascal@104 101 int $0x16 // eat char
pascal@151 102 movb $0xA8, clock_patch+0x7C00 // disable timeout
pascal@104 103 waitdone:
pascal@104 104 popw %ds
pascal@104 105 #else
pascal@104 106 xorb %ax, %ax
pascal@104 107 int $0x16
pascal@104 108 #endif
pascal@151 109 .endm
pascal@182 110
pascal@151 111 #ifdef CHECK_FILES
pascal@151 112 call wait4kbd
pascal@151 113 #else
pascal@151 114 waitkbdcode
pascal@151 115 #endif
pascal@104 116 cmpb $0x0D, %al // CR ?
pascal@104 117 je doit
pascal@104 118 cmpb $0x48, %ah // UP ?
pascal@104 119 jne isitdn
pascal@104 120 decw %bp
pascal@104 121 jz menudown
pascal@104 122 isitdn:
pascal@104 123 incw %cx
pascal@104 124 cmpb $0x50, %ah // DN ?
pascal@104 125 loope menudown
pascal@104 126 jmp menustartlp
pascal@104 127
pascal@151 128 #ifdef CHECK_FILES
pascal@151 129 toeos:
pascal@151 130 lodsb
pascal@151 131 orb %al, %al
pascal@151 132 jnz toeos
pascal@151 133 lodsw // crc, count
pascal@151 134 lodsw
pascal@151 135 cmpw $0, (%si)
pascal@151 136 jne nextchk
pascal@151 137 call wait4kbd
pascal@151 138 jmp start
pascal@151 139 #endif
pascal@151 140
pascal@104 141 .macro tochs // %di -> %cx, %dx & %bp=sector max
pascal@104 142 movw $64, %cx
pascal@104 143 sectlp:
pascal@104 144 movb %ch, %dh
pascal@104 145 decw %cx
pascal@151 146 #define BUFFER 0x200
pascal@151 147 #ifdef CHECK_FILES
pascal@151 148 call readsector
pascal@151 149 #else
pascal@151 150 movw $BUFFER, %bx
pascal@151 151 movw $0x201, %ax
pascal@104 152 int $0x13
pascal@151 153 #endif
pascal@104 154 jc sectlp
pascal@104 155 movw %cx, %bp
pascal@104 156 movw %di, %ax
pascal@104 157 div %cl // 32 Mb & 255 tracks max
pascal@104 158 movb %ah, %cl // sector
pascal@104 159 incb %cl
pascal@104 160 shrb $1, %al // C = head, AL = cylinder
pascal@104 161 adcb %dh, %dh
pascal@104 162 movb %al, %ch
pascal@104 163 .endm
pascal@104 164
pascal@104 165 doit:
pascal@104 166 #ifdef CHECK_FILES
pascal@104 167 jcxz docrc
pascal@104 168 call getsectors
pascal@151 169 call readsector2
pascal@104 170 #else
pascal@104 171 tochs // %di -> %cx, %dx & %bp=sector max
pascal@104 172 movw $0x201, %ax
pascal@104 173 int $0x13
pascal@151 174 #endif
pascal@104 175 jc menustart
pascal@104 176
pascal@104 177 // scan boot code
pascal@104 178 scanboot:
pascal@151 179 incw %bx
pascal@151 180 cmpw $0x5897, -3(%bx) // xchgw %ax, %di; popw %ax
pascal@182 181 jne nofound
pascal@151 182 cmpw $0xE841, -1(%bx) // incw %cx ; call ...
pascal@182 183 je found
pascal@182 184 nofound:
pascal@182 185 orb %bl, %bl
pascal@182 186 jnz scanboot
pascal@182 187 decb %bh
pascal@183 188 jmp boot
pascal@118 189 found:
pascal@183 190 cli
pascal@183 191 movb 0x1F1+BUFFER, %al // setup size
pascal@183 192 boot:
pascal@104 193 pushw %ds
pascal@151 194 pushw %bx
pascal@104 195 pushw %ss
pascal@104 196 popw %ds
pascal@104 197 pushw %ss
pascal@104 198 popw %es
pascal@104 199 xorw %di, %di
pascal@104 200 xchgw %ax, %di // ax = limits = 0
pascal@104 201 xorw %bx, %bx // to %es:%bx = 9000:0000
pascal@104 202 incw %di // Add bootsector, Clear Z
pascal@104 203 lret // Read from %dx, %cx
pascal@104 204
pascal@104 205 #ifdef CHECK_FILES
pascal@104 206 docrc:
pascal@104 207 movw $menu, %si
pascal@104 208 skiptitle:
pascal@104 209 lodsb
pascal@104 210 orb %al, %al
pascal@104 211 jnz skiptitle
pascal@151 212 nextchklp:
pascal@151 213 pushw %si // start of menu
pascal@104 214 nextchk:
pascal@104 215 lodsw // sector offset
pascal@151 216 cmpw %ax, %di // next sector offset
pascal@151 217 jne toeos
pascal@104 218 call puts // menu entry
pascal@151 219 call getsectors // %di -> %cx, %dx & %bp=sector max
pascal@104 220 lodsw
pascal@151 221 addw (%si), %di
pascal@151 222 pushw %di // next sector offset
pascal@104 223 xchgw %ax, %di // crc
pascal@104 224 lodsw // sector count
pascal@104 225 xchgw %ax, %si
pascal@104 226 chksector:
pascal@151 227 call readsector
pascal@151 228 jc chkfail
pascal@151 229 chksectorz:
pascal@104 230 subw (%bx), %di
pascal@104 231 incw %bx
pascal@104 232 incw %bx
pascal@104 233 cmpb $4, %bh
pascal@151 234 jne chksectorz
pascal@104 235 decw %si
pascal@104 236 je chkend
pascal@104 237 movw %bp, %ax
pascal@104 238 incw %cx
pascal@104 239 cmpb %al, %cl
pascal@104 240 jle rdit
pascal@104 241 movb $1, %cl
pascal@104 242 xorb %cl, %dh
pascal@104 243 jne rdit
pascal@104 244 incb %ch
pascal@151 245 cmp $80, %ch
pascal@151 246 jb rdit
pascal@151 247 push %si
pascal@151 248 mov $msgnext, %si
pascal@151 249 call puts
pascal@151 250 call wait4kbd
pascal@151 251 pop %si
pascal@151 252 mov $0, %ch
pascal@104 253 rdit:
pascal@151 254 jmp chksector
pascal@104 255 chkend:
pascal@104 256 movw $msgok, %si
pascal@104 257 orw %di, %di
pascal@104 258 je chkok
pascal@104 259 chkfail:
pascal@104 260 movw $msgko, %si
pascal@104 261 chkok:
pascal@104 262 call puts
pascal@151 263 popw %di // next sector offset
pascal@151 264 popw %si // start of menu
pascal@151 265 jmp nextchklp
pascal@151 266
pascal@151 267 readsector:
pascal@151 268 movw $BUFFER, %bx
pascal@151 269 readsector2:
pascal@151 270 movw $0x201, %ax
pascal@151 271 int $0x13
pascal@151 272 ret
pascal@104 273
pascal@104 274 getsectors:
pascal@104 275 tochs // %di -> %cx, %dx & %bp=sector max
pascal@104 276 ret
pascal@151 277
pascal@151 278 wait4kbd:
pascal@151 279 waitkbdcode
pascal@151 280 ret
pascal@151 281
pascal@151 282 putentry:
pascal@151 283 entry
pascal@151 284 jmp putcs
pascal@104 285 #endif
pascal@104 286
pascal@130 287 puts:
pascal@130 288 lodsb
pascal@151 289 cmpb $2, %al
pascal@151 290 jnc putcs
pascal@104 291 putcr:
pascal@104 292 movb $10, %al
pascal@104 293 putlf:
pascal@104 294 xorb $10^13, %al
pascal@104 295 putcs:
pascal@104 296 movw $7, %bx
pascal@104 297 movb $0xE, %ah
pascal@104 298 int $0x10
pascal@104 299 cmpb $13, %al
pascal@104 300 jz putlf
pascal@130 301 jnc puts
pascal@104 302 ret
pascal@104 303
pascal@104 304 #ifdef CHECK_FILES
pascal@104 305 msgok:
pascal@104 306 .asciz " OK"
pascal@104 307 msgko:
pascal@151 308 .ascii " Broken"
pascal@151 309 .word 1 // next sector offset
pascal@104 310 msgcrc:
pascal@104 311 .asciz "Check media" // used to detect CHECK_FILES
pascal@104 312 #endif
pascal@104 313 menu:
pascal@104 314
pascal@104 315 .org 0x1F1
pascal@104 316 setupsz:
pascal@104 317 .byte 0
pascal@104 318 rootflags:
pascal@104 319 .word menu
pascal@104 320 syssz:
pascal@104 321 .long 0 // updated by bundle
pascal@104 322 ramsize:
pascal@151 323 #ifdef CHECK_FILES
pascal@151 324 msgnext:
pascal@151 325 .asciz "Next!"
pascal@151 326 #else
pascal@104 327 .ascii "SliTaz"
pascal@151 328 #endif
pascal@104 329 // .word 0
pascal@104 330 //vidmode:
pascal@104 331 // .word 0
pascal@104 332 //rootdev:
pascal@104 333 // .word 0
pascal@104 334 bootflag:
pascal@104 335 .word 0xAA55