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

Update bootpillman & bootsokoban
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Sep 24 17:53:05 2023 +0000 (8 months ago)
parents f93fa966f210
children 1e55ea7da8de
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@118 188 found:
pascal@104 189 pushw %ds
pascal@151 190 pushw %bx
pascal@182 191 // cli
pascal@182 192 // movb 0x1F1+BUFFER, %al // setup size
pascal@104 193 pushw %ss
pascal@104 194 popw %ds
pascal@104 195 pushw %ss
pascal@104 196 popw %es
pascal@104 197 xorw %di, %di
pascal@104 198 xchgw %ax, %di // ax = limits = 0
pascal@104 199 xorw %bx, %bx // to %es:%bx = 9000:0000
pascal@104 200 incw %di // Add bootsector, Clear Z
pascal@104 201 lret // Read from %dx, %cx
pascal@104 202
pascal@104 203 #ifdef CHECK_FILES
pascal@104 204 docrc:
pascal@104 205 movw $menu, %si
pascal@104 206 skiptitle:
pascal@104 207 lodsb
pascal@104 208 orb %al, %al
pascal@104 209 jnz skiptitle
pascal@151 210 nextchklp:
pascal@151 211 pushw %si // start of menu
pascal@104 212 nextchk:
pascal@104 213 lodsw // sector offset
pascal@151 214 cmpw %ax, %di // next sector offset
pascal@151 215 jne toeos
pascal@104 216 call puts // menu entry
pascal@151 217 call getsectors // %di -> %cx, %dx & %bp=sector max
pascal@104 218 lodsw
pascal@151 219 addw (%si), %di
pascal@151 220 pushw %di // next sector offset
pascal@104 221 xchgw %ax, %di // crc
pascal@104 222 lodsw // sector count
pascal@104 223 xchgw %ax, %si
pascal@104 224 chksector:
pascal@151 225 call readsector
pascal@151 226 jc chkfail
pascal@151 227 chksectorz:
pascal@104 228 subw (%bx), %di
pascal@104 229 incw %bx
pascal@104 230 incw %bx
pascal@104 231 cmpb $4, %bh
pascal@151 232 jne chksectorz
pascal@104 233 decw %si
pascal@104 234 je chkend
pascal@104 235 movw %bp, %ax
pascal@104 236 incw %cx
pascal@104 237 cmpb %al, %cl
pascal@104 238 jle rdit
pascal@104 239 movb $1, %cl
pascal@104 240 xorb %cl, %dh
pascal@104 241 jne rdit
pascal@104 242 incb %ch
pascal@151 243 cmp $80, %ch
pascal@151 244 jb rdit
pascal@151 245 push %si
pascal@151 246 mov $msgnext, %si
pascal@151 247 call puts
pascal@151 248 call wait4kbd
pascal@151 249 pop %si
pascal@151 250 mov $0, %ch
pascal@104 251 rdit:
pascal@151 252 jmp chksector
pascal@104 253 chkend:
pascal@104 254 movw $msgok, %si
pascal@104 255 orw %di, %di
pascal@104 256 je chkok
pascal@104 257 chkfail:
pascal@104 258 movw $msgko, %si
pascal@104 259 chkok:
pascal@104 260 call puts
pascal@151 261 popw %di // next sector offset
pascal@151 262 popw %si // start of menu
pascal@151 263 jmp nextchklp
pascal@151 264
pascal@151 265 readsector:
pascal@151 266 movw $BUFFER, %bx
pascal@151 267 readsector2:
pascal@151 268 movw $0x201, %ax
pascal@151 269 int $0x13
pascal@151 270 ret
pascal@104 271
pascal@104 272 getsectors:
pascal@104 273 tochs // %di -> %cx, %dx & %bp=sector max
pascal@104 274 ret
pascal@151 275
pascal@151 276 wait4kbd:
pascal@151 277 waitkbdcode
pascal@151 278 ret
pascal@151 279
pascal@151 280 putentry:
pascal@151 281 entry
pascal@151 282 jmp putcs
pascal@104 283 #endif
pascal@104 284
pascal@130 285 puts:
pascal@130 286 lodsb
pascal@151 287 cmpb $2, %al
pascal@151 288 jnc putcs
pascal@104 289 putcr:
pascal@104 290 movb $10, %al
pascal@104 291 putlf:
pascal@104 292 xorb $10^13, %al
pascal@104 293 putcs:
pascal@104 294 movw $7, %bx
pascal@104 295 movb $0xE, %ah
pascal@104 296 int $0x10
pascal@104 297 cmpb $13, %al
pascal@104 298 jz putlf
pascal@130 299 jnc puts
pascal@104 300 ret
pascal@104 301
pascal@104 302 #ifdef CHECK_FILES
pascal@104 303 msgok:
pascal@104 304 .asciz " OK"
pascal@104 305 msgko:
pascal@151 306 .ascii " Broken"
pascal@151 307 .word 1 // next sector offset
pascal@104 308 msgcrc:
pascal@104 309 .asciz "Check media" // used to detect CHECK_FILES
pascal@104 310 #endif
pascal@104 311 menu:
pascal@104 312
pascal@104 313 .org 0x1F1
pascal@104 314 setupsz:
pascal@104 315 .byte 0
pascal@104 316 rootflags:
pascal@104 317 .word menu
pascal@104 318 syssz:
pascal@104 319 .long 0 // updated by bundle
pascal@104 320 ramsize:
pascal@151 321 #ifdef CHECK_FILES
pascal@151 322 msgnext:
pascal@151 323 .asciz "Next!"
pascal@151 324 #else
pascal@104 325 .ascii "SliTaz"
pascal@151 326 #endif
pascal@104 327 // .word 0
pascal@104 328 //vidmode:
pascal@104 329 // .word 0
pascal@104 330 //rootdev:
pascal@104 331 // .word 0
pascal@104 332 bootflag:
pascal@104 333 .word 0xAA55