wok annotate syslinux/stuff/iso2exe/bootloader.S @ rev 18789

Add opencv (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jan 05 11:03:10 2016 +0100 (2016-01-05)
parents e4d238a76a77
children 78a46345f6bb
rev   line source
pascal@18140 1 BOOTSEG = 0x07C0 /* original address of boot-sector */
pascal@18140 2 SYSSEG = 0x1000 /* historical load address >> 4 */
pascal@18140 3 INITSEG = 0x9000 /* boot address >> 4 */
pascal@18140 4 SETUPSEG = 0x9020 /* setup address >> 4 */
pascal@18140 5 ASK_VGA = -3
pascal@18140 6
pascal@18140 7 #ifndef SVGA_MODE
pascal@18140 8 #define SVGA_MODE ASK_VGA
pascal@18140 9 #endif
pascal@18140 10
pascal@18140 11 #ifndef RAMDISK
pascal@18140 12 #define RAMDISK 0
pascal@18140 13 #endif
pascal@18140 14
pascal@18140 15 #ifndef ROOT_RDONLY
pascal@18140 16 #define ROOT_RDONLY 1
pascal@18140 17 #endif
pascal@18140 18
pascal@18140 19 /* some extra features */
pascal@18140 20 #define CMDLINE kernel >= 2.4
pascal@18140 21 #define OLDCMDLINE kernel < 2.4
pascal@18140 22 #define MORETHAN16M up to 4Gb RAM, not 16Mb
pascal@18140 23 #define KEYBOARDLESS_SUPPORT scan floppy swap each 5 seconds
pascal@18140 24
pascal@18140 25 #define EDIT_CMDLINE
pascal@18140 26 #define CMDLINE_SUPPORT
pascal@18140 27 #define MOVE_CMDLINE
pascal@18140 28 #define INITRD_SUPPORT
pascal@18140 29 #define INITRD_AUTOADDR
pascal@18151 30 #ifndef MULTI_INITRD
pascal@18151 31 #define README_SUPPORT
pascal@18151 32 #define COUNTER
pascal@18151 33 #endif
pascal@18140 34
pascal@18140 35 .code16
pascal@18140 36 .org 0
pascal@18140 37
pascal@18140 38 bootsect_start:
pascal@18140 39
pascal@18140 40 cur_initrd_size_ofs = 494
pascal@18140 41 ramdisk_image_ofs = 0x218
pascal@18140 42 ramdisk_image = bootsect_start+ramdisk_image_ofs
pascal@18140 43 ramdisk_size_ofs = 0x21C
pascal@18140 44 ramdisk_size = bootsect_start+ramdisk_size_ofs
pascal@18140 45 cmd_line_ptr_ofs = 0x228
pascal@18140 46 cmd_line_ptr = bootsect_start+cmd_line_ptr_ofs
pascal@18140 47 setup_sects = bootsect_start+497
pascal@18140 48 syssize = bootsect_start+500
pascal@18140 49 boot_flag_ofs = 510
pascal@18140 50 boot_flag = bootsect_start+boot_flag_ofs
pascal@18140 51
pascal@18140 52
pascal@18140 53 stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@18140 54 zeroed = 48+10 # gdt + zeroed registers
pascal@18140 55 .macro INIT_REGS
pascal@18140 56 movw $stacktop-zeroed, %di # stacktop is an arbitrary value >=
pascal@18140 57 # length of bootsect + length of
pascal@18140 58 # setup + room for stack;
pascal@18140 59 # 12 is disk parm size.
pascal@18140 60 pushw $INITSEG
pascal@18140 61 popw %ss # %ss contain INITSEG
pascal@18140 62 movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@18140 63 pushw %ss
pascal@18140 64 popw %es # %es = %ss = INITSEG
pascal@18140 65 xorw %ax, %ax # %ax = 0
pascal@18140 66 #if defined(CMDLINE)
pascal@18140 67 movw $zeroed+1, %cx # clear gdt + offset, %ds, limits, cmdline=""
pascal@18140 68 rep # don't worry about cld
pascal@18140 69 stosb # already done above
pascal@18145 70 //decw %di
pascal@18140 71 #else
pascal@18140 72 movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
pascal@18140 73 rep # don't worry about cld
pascal@18140 74 stosw # already done above
pascal@18140 75 #endif
pascal@18140 76 popw %bx # offset = 0
pascal@18140 77 .endm
pascal@18140 78
pascal@18140 79 LOADSEG = 0x8000 # 0x1000 multiple, up to 512K zImage
pascal@18140 80 LOADSZ = 0x10000
pascal@18140 81
pascal@18140 82 # bootsect_start:
pascal@18140 83 INIT_REGS
pascal@18140 84 popw %ds # %ds = 0
pascal@18140 85 movb setup_sects+0x7C00, %al # read bootsector + setup
pascal@18140 86 incw %ax # %ax = setup_sects+bootsect
pascal@18140 87 popw %fs # %fs = 0
pascal@18140 88
pascal@18140 89 # Many BIOS's default disk parameter tables will not recognize
pascal@18140 90 # multi-sector reads beyond the maximum sector number specified
pascal@18140 91 # in the default diskette parameter tables - this may mean 7
pascal@18140 92 # sectors in some cases.
pascal@18140 93 #
pascal@18140 94 # Since single sector reads are slow and out of the question,
pascal@18140 95 # we must take care of this by creating new parameter tables
pascal@18140 96 # (for the first disk) in RAM. We can set the maximum sector
pascal@18140 97 # count to 36 - the most we will encounter on an ED 2.88.
pascal@18140 98 #
pascal@18140 99 # High doesn't hurt. Low does. Let's use the max: 63
pascal@18140 100
pascal@18145 101 cli
pascal@18140 102 ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
pascal@18140 103 popw %di
pascal@18140 104 pushw %es
pascal@18140 105 pushw %di
pascal@18140 106 #ifdef CMDLINE_SUPPORT
pascal@18140 107 movw $0, %bp # patched by installer (7C22)
pascal@18140 108 skipcmdline:
pascal@18140 109 #define cmd_line_ptr 0x22
pascal@18140 110 #endif
pascal@18140 111 movb $6, %cl # copy 12 bytes
pascal@18140 112 rep # don't worry about cld
pascal@18140 113 movsw # already done above
pascal@18140 114 pushw %ss
pascal@18140 115 popw %ds # now %ds = %es = %ss = INITSEG
pascal@18140 116 popl %fs:0x78(%bx) # update parameter table address
pascal@18140 117 movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
pascal@18140 118
pascal@18140 119 xchg %ax, %di # sector count
pascal@18140 120 popw %ax # limits = 0
pascal@18140 121 incw %cx # cylinder 0, sector 1, clear Z
pascal@18140 122 call read_first_sectors # read setup
pascal@18151 123 #ifdef README_SUPPORT
pascal@18151 124 xorw %si, %si
pascal@18151 125 orw readme, %si
pascal@18151 126 jz readmeend
pascal@18151 127 readmeloop:
pascal@18151 128 call puts
pascal@18151 129 jz readmeend
pascal@18151 130 call wait4key
pascal@18151 131 cmpb $27, %al
pascal@18151 132 jne readmeloop
pascal@18151 133 readmeend:
pascal@18151 134 #endif
pascal@18140 135 loadsys:
pascal@18140 136 movw $0x200,%si
pascal@18140 137 type_of_loader = 0x10
pascal@18140 138 loadflags = 0x11
pascal@18140 139 heap_end_ptr = 0x24
pascal@18140 140 orw $0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
pascal@18140 141 movb $(stacktop-0x300)/256, heap_end_ptr+1(%si)
pascal@18140 142 call puts_version # show which kernel we are loading
pascal@18140 143
pascal@18140 144 #ifdef CMDLINE_SUPPORT
pascal@18140 145 # The cmdline can be entered and modifed at boot time.
pascal@18140 146 # Only characters before the cursor are passed to the kernel.
pascal@18140 147
pascal@18140 148 xorw %si, %si
pascal@18140 149 orw cmd_line_ptr-7(%bx), %si
pascal@18140 150 jz nocmdline
pascal@18140 151 #ifdef OLDCMDLINE
pascal@18140 152 movw $0xA33F, cmd_line_ptr-2-7(%bx)
pascal@18140 153 #endif
pascal@18140 154 call puts
pascal@18140 155 #ifdef EDIT_CMDLINE
pascal@18140 156 cmdlp:
pascal@18140 157 movb $0x20, %al # clear end of line
pascal@18140 158 cmdlpz:
pascal@18140 159 call putc # with Space
pascal@18140 160 subb $0x18, %al # and BackSpace
pascal@18140 161 jnc cmdlpz
pascal@18140 162 decw %si
pascal@18140 163 cmdget:
pascal@18140 164 #ifdef KEYBOARDLESS_SUPPORT
pascal@18140 165 call wait4key
pascal@18140 166 #else
pascal@18140 167 int $0x16
pascal@18140 168 #endif
pascal@18140 169 cbw # %ah = 0, get keyboard character
pascal@18140 170 cmpb $8, %al # BackSpace ?
pascal@18140 171 je cmdbs
pascal@18140 172 movb %al, (%si) # store char
pascal@18140 173 lodsw # %si += 2
pascal@18140 174 cmdbs:
pascal@18140 175 cmpw %si, cmd_line_ptr-7(%bx)
pascal@18140 176 je cmdget
pascal@18140 177 call putc
pascal@18140 178 cmpb $10, %al # Enter/linefeed ?
pascal@18140 179 jne cmdlp
pascal@18140 180 movb %bh,-2(%si) # set end of string and remove CR
pascal@18140 181 endcmdline:
pascal@18140 182 #endif
pascal@18140 183 #ifdef MOVE_CMDLINE
pascal@18140 184 pushw %ss
pascal@18140 185 popw %es
pascal@18140 186 movw $0x8000, %di
pascal@18140 187 movw %di, %si
pascal@18140 188 xchgw %si, cmd_line_ptr-7(%bx)
pascal@18140 189 movb $0x2, %ch
pascal@18140 190 rep
pascal@18140 191 movsb
pascal@18140 192 #endif
pascal@18140 193 nocmdline:
pascal@18140 194 #endif
pascal@18140 195
pascal@18140 196 # This routine loads the system at address LOADSEG, making sure
pascal@18140 197 # no 64kB boundaries are crossed. We try to load it as fast as
pascal@18140 198 # possible, loading whole tracks whenever we can.
pascal@18140 199
pascal@18140 200 .macro autoaddr base
pascal@18140 201 #ifdef INITRD_AUTOADDR
pascal@18140 202 movb $0x88, %ah
pascal@18140 203 int $0x15
pascal@18140 204 //jc NeedMoreRAM # error code 80 or 86
pascal@18145 205 cmpw $0xB000, %ax # more than 45M ?
pascal@18140 206 jb NeedMoreRAM
pascal@18140 207 movb %ch, bootsect_dst_base_hi(%si) # initramfs @ 32M
pascal@18140 208 movb %ch, ramdisk_image_ofs+3-\base
pascal@18140 209 NeedMoreRAM:
pascal@18140 210 #endif
pascal@18140 211 .endm
pascal@18140 212
pascal@18140 213 bootsect_src_limit = 16
pascal@18140 214 bootsect_dst_limit = 24
pascal@18140 215 bootsect_src_base = 18
pascal@18140 216 bootsect_dst_base = 26 # bits 0..23
pascal@18140 217 bootsect_dst_base_hi = 31 # bits 24..31
pascal@18140 218 popw %bx # clear %bx
pascal@18140 219 movw %sp, %si # for bootsect_gdt
pascal@18140 220 init_gdt:
pascal@18140 221 decw bootsect_src_limit(%bx,%si) # max 64Kb
pascal@18140 222 movw $0x9300+(LOADSEG/0x1000), bootsect_src_base+2(%bx,%si)
pascal@18140 223 xorb $bootsect_dst_limit-bootsect_src_limit, %bl
pascal@18140 224 jne init_gdt
pascal@18140 225 #ifdef INITRD_SUPPORT
pascal@18140 226 movw $syssize, %bx
pascal@18140 227 movb $5, %cl
pascal@18140 228 code32_start = 0x214
pascal@18140 229 movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
pascal@18140 230 initrdlp:
pascal@18140 231 movl (%bx), %ebx
pascal@18140 232 decl %ebx
pascal@18140 233 shrl %cl, %ebx
pascal@18140 234 #else
pascal@18140 235 code32_start = 0x214
pascal@18140 236 movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
pascal@18140 237 movl syssize, %ebx
pascal@18140 238 decl %ebx
pascal@18140 239 shrl $5, %ebx
pascal@18140 240 #endif
pascal@18140 241 #ifdef MORETHAN16M
pascal@18140 242 incl %ebx
pascal@18140 243 #else
pascal@18140 244 incw %bx
pascal@18140 245 #endif
pascal@18140 246 syslp:
pascal@18140 247 movw %ax, bootsect_dst_base+1(%si)
pascal@18140 248 #ifdef MORETHAN16M
pascal@18140 249 movl $LOADSZ/512, %edi # size in sectors
pascal@18140 250 subl %edi, %ebx
pascal@18140 251 #else
pascal@18140 252 movw $LOADSZ/512, %di # size in sectors
pascal@18140 253 subw %di, %bx
pascal@18140 254 #endif
pascal@18140 255 pushf
pascal@18140 256 jnc not_last
pascal@18140 257 addw %bx, %di
pascal@18140 258 not_last:
pascal@18140 259 #ifdef MULTI_INITRD
pascal@18140 260 pushw %di
pascal@18140 261 #endif
pascal@18140 262 pushw %ax
pascal@18140 263 pushw %bx
pascal@18140 264 pushw %si
pascal@18140 265 xorw %bx,%bx
pascal@18140 266 pushw $LOADSEG
pascal@18140 267 popw %es
pascal@18140 268 patchcall:
pascal@18140 269 call read_sectors # update %bp
pascal@18140 270 popw %si
pascal@18140 271 popw %bx
pascal@18140 272 movw %es, %cx # word count = LOADSZ/2 (= LOADSEG)
pascal@18140 273 movb $0x87, %ah
pascal@18140 274 pushw %ss
pascal@18140 275 popw %es # restore es
pascal@18140 276 int $0x15 # max 16M, maybe more...
pascal@18140 277 popw %ax
pascal@18140 278 #ifdef MULTI_INITRD
pascal@18140 279 popw %di
pascal@18140 280 shlw $1,%di # sectors to pages
pascal@18140 281 addw %di, %ax
pascal@18140 282 #ifdef MORETHAN16M
pascal@18140 283 adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
pascal@18140 284 #endif
pascal@18140 285 #else
pascal@18140 286 #ifdef MORETHAN16M
pascal@18140 287 addw $0x100, %ax # next dest (ax+=LOADSZ/256)
pascal@18140 288 adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
pascal@18140 289 #else
pascal@18140 290 incb %ah # next dest (ax+=LOADSZ/256)
pascal@18140 291 #endif
pascal@18140 292 #endif
pascal@18140 293 popf
pascal@18140 294 ja syslp
pascal@18140 295 #ifdef INITRD_SUPPORT
pascal@18140 296 initrdlp2:
pascal@18140 297 #ifdef INITRD_AUTOADDR
pascal@18140 298 movw $0x209, %cx
pascal@18140 299 #else
pascal@18140 300 movb $9, %cl
pascal@18140 301 #endif
pascal@18140 302 #ifdef MULTI_INITRD
pascal@18140 303 movw $cur_initrd_size_ofs, %di
pascal@18140 304 movw (%di), %bx
pascal@18140 305 addw $4, (%di)
pascal@18140 306 shrw %cl, boot_flag_ofs-cur_initrd_size_ofs(%di)
pascal@18140 307 je nextInitrd
pascal@18140 308 orw %bx, %bx
pascal@18140 309 je bootit # no initrd
pascal@18140 310 autoaddr cur_initrd_size_ofs(%di)
pascal@18140 311 movw ramdisk_image+1,%ax
pascal@18140 312 jmp initrdlp
pascal@18140 313 nextInitrd:
pascal@18140 314 pushw %bx
pascal@18140 315 movl -4(%bx), %ebx
pascal@18140 316 addl %ebx, ramdisk_size_ofs-cur_initrd_size_ofs(%di)
pascal@18145 317 movb $swap_floppy2-0x100, %cs:dpy_swap_floppy-2+0x7C00
pascal@18140 318 popw %bx
pascal@18140 319 cmpb 2(%di), %bl
pascal@18140 320 jb initrdlp
pascal@18140 321 #else
pascal@18140 322 movw $ramdisk_size, %bx
pascal@18140 323 #ifdef MORETHAN16M
pascal@18140 324 cmpb %cl, ramdisk_image+2-ramdisk_size(%bx)
pascal@18140 325 jb bootit
pascal@18163 326 autoaddr ramdisk_size_ofs(%bx)
pascal@18163 327 movw ramdisk_image+1,%ax
pascal@18140 328 shrw %cl, boot_flag-ramdisk_size(%bx)
pascal@18140 329 jne initrdlp
pascal@18140 330 #else
pascal@18163 331 movw ramdisk_image+1,%ax
pascal@18140 332 cmpw %ax, bootsect_dst_base+1(%si)
pascal@18140 333 jb initrdlp
pascal@18140 334 #endif
pascal@18140 335 #endif
pascal@18140 336 #endif
pascal@18155 337 bootit:
pascal@18140 338 #ifdef MULTI_INITRD
pascal@18140 339 jcxz read_sectorslp
pascal@18140 340 #endif
pascal@18140 341
pascal@18140 342 # This procedure turns off the floppy drive motor, so
pascal@18140 343 # that we enter the kernel in a known state, and
pascal@18140 344 # don't have to worry about it later.
pascal@18140 345
pascal@18140 346 kill_motor:
pascal@18140 347 xchgw %ax, %di # reset FDC (%di < 128)
pascal@18140 348 int $0x13
pascal@18140 349
pascal@18140 350 # After that (everything loaded), we jump to the setup-routine
pascal@18140 351 # loaded directly after the bootblock:
pascal@18140 352 # Segments are as follows: %ds = %ss = INITSEG
pascal@18140 353
pascal@18140 354 ljmp $SETUPSEG, $0
pascal@18140 355
pascal@18140 356 # read_sectors reads %di sectors into %es:0 buffer.
pascal@18140 357 # %es:0 is updated to the next memory location.
pascal@18140 358 # First, sectors are read sector by sector until
pascal@18140 359 # sector per track count is known. Then they are
pascal@18140 360 # read track by track.
pascal@18140 361 # Assume no error on first track.
pascal@18140 362
pascal@18140 363 #define FLOPPY_CYLINDERS 80
pascal@18140 364 #define FLOPPY_HEADS 2
pascal@18140 365
pascal@18151 366 .macro putsmsg
pascal@18151 367 #ifdef COUNTER
pascal@18151 368 movw $msgdigit+1-msg, %bx
pascal@18151 369 nextdigit:
pascal@18160 370 andb $0xF0, (%bx,%si)
pascal@18151 371 decw %bx
pascal@18151 372 incb (%bx,%si)
pascal@18151 373 cmpb $'9', (%bx,%si)
pascal@18151 374 ja nextdigit
pascal@18151 375 #endif
pascal@18151 376 call puts
pascal@18151 377 .endm
pascal@18151 378
pascal@18140 379 check_limits:
pascal@18140 380 popw %dx
pascal@18140 381 cmpb %al, %cl # max sector known ?
pascal@18140 382 ja next_head # no -> store it
pascal@18140 383 pushaw
pascal@18140 384 int $0x13 # reset controler
pascal@18140 385 stc
pascal@18140 386 call putcdot # print '-'
pascal@18140 387 read_sectorslp:
pascal@18140 388 popaw
pascal@18140 389 bdendlp:
pascal@18140 390 pushw %dx # some bios break dx...
pascal@18140 391 pushw %ax # limits
pascal@18140 392 subb %cl, %al # sectors remaining in track
pascal@18140 393 ja tolastsect
pascal@18140 394 movb $1, %al # 1 sector mini
pascal@18140 395 tolastsect:
pascal@18140 396 cmpw %di, %ax
pascal@18140 397 jb more1trk
pascal@18140 398 movw %di, %ax # sectors to read
pascal@18140 399 more1trk:
pascal@18140 400 pushw %ax # save context
pascal@18140 401 movb $2, %ah # cmd: read chs
pascal@18140 402 int $0x13
pascal@18140 403 popw %dx # save %ax
pascal@18140 404 popw %ax # limits
pascal@18140 405 jc check_limits
pascal@18140 406 xchgw %ax, %bp
pascal@18140 407 addw %dx,%cx # next sector
pascal@18140 408 movw %cx, %gs
pascal@18140 409 addb %dl,%bh
pascal@18140 410 addb %dl,%bh # next location
pascal@18140 411 subw %dx,%di # update sector counter
pascal@18140 412 popw %dx
pascal@18140 413 jz putcdot
pascal@18140 414 read_sectors:
pascal@18140 415 movw %gs, %cx
pascal@18140 416 # al is last sector+1
pascal@18140 417 # ah is 0
pascal@18140 418 xchgw %ax, %bp
pascal@18140 419 cmpb %al,%cl # reach sector limit ?
pascal@18140 420 jne bdendlp
pascal@18140 421 next_head:
pascal@18140 422 movb %cl,%al
pascal@18140 423 movb $1, %cl # first sector
pascal@18140 424 inc_head:
pascal@18140 425 xorb %cl, %dh # next head
pascal@18140 426 jne bdendlp # reach head limit ?
pascal@18140 427 incb %ch # next cylinder
pascal@18140 428 read_first_sectors:
pascal@18140 429 cmpb $FLOPPY_CYLINDERS,%ch # reach cylinder limit ?
pascal@18140 430 jne bdendlp
pascal@18140 431 next_floppy:
pascal@18140 432 movb $0,%ch # first cylinder
pascal@18140 433 pushaw
pascal@18140 434 movw $swap_floppy,%si
pascal@18145 435 dpy_swap_floppy:
pascal@18140 436 #ifdef KEYBOARDLESS_SUPPORT
pascal@18140 437 pushw %bx
pascal@18151 438 putsmsg
pascal@18140 439 popw %bx
pascal@18140 440 movw %si, %bp
pascal@18140 441 waitfloppy:
pascal@18140 442 call wait
pascal@18140 443 jne waitfloppydone
pascal@18140 444 #ifdef MULTI_INITRD
pascal@18140 445 decb (%si) # max_timeouts
pascal@18145 446 gobootit:
pascal@18145 447 //movw ramdisk_size+2-max_timeouts(%si), %cx
pascal@18145 448 .byte 0x8B, 0x4C, ramdisk_size+2-max_timeouts
pascal@18145 449 jz bootit
pascal@18140 450 #endif
pascal@18140 451 pushw %dx # some bios break dx...
pascal@18140 452 cbw
pascal@18140 453 int $0x13 # reset FDC
pascal@18140 454 movw $0x201,%ax
pascal@18140 455 int $0x13 # read first sector
pascal@18140 456 popw %dx
pascal@18140 457 rclb $1,%ah # floppy changed 06=>0D no error 00
pascal@18140 458 cmpb -2(%bp), %ah # 0D then 00
pascal@18140 459 jne waitfloppy # no => try again
pascal@18140 460 incw %bp
pascal@18140 461 decw %ax # was 0001 ?
pascal@18140 462 jne waitfloppy
pascal@18140 463 waitfloppydone:
pascal@18140 464 #else
pascal@18151 465 putsmsg
pascal@18140 466 cbw # %ah = 0, get keyboard character
pascal@18140 467 int $0x16
pascal@18140 468 #endif
pascal@18140 469 #ifdef MULTI_INITRD
pascal@18140 470 orb $0x20, %al
pascal@18140 471 cmp $'b', %al
pascal@18145 472 jz gobootit
pascal@18145 473 #endif
pascal@18140 474 jmp read_sectorslp
pascal@18140 475
pascal@18140 476 putcdot:
pascal@18140 477 movb $'.'+3, %al // . = success, - = failure
pascal@18140 478 putclf:
pascal@18140 479 sbbb $3, %al
pascal@18140 480 putc:
pascal@18140 481 movb $0xe, %ah
pascal@18140 482 movw $7, %bx # one dot each 64k
pascal@18140 483 int $0x10
pascal@18140 484 cmp $0xd, %al # CR ?
pascal@18140 485 je putclf
pascal@18140 486 ret
pascal@18140 487
pascal@18140 488 #ifdef KEYBOARDLESS_SUPPORT
pascal@18140 489 clock = 0x46C
pascal@18140 490 wait:
pascal@18140 491 wait4key:
pascal@18140 492 movw $clock, %di
pascal@18140 493 #define DELAY 5
pascal@18140 494 movb $257-(DELAY*182)/10, %fs:(%di)
pascal@18140 495 waitkbd:
pascal@18140 496 movw $0x10D, %ax # test keyboard, timeout => CR
pascal@18140 497 cmpb %fs:(%di),%ah
pascal@18140 498 je waitdone
pascal@18140 499 int $0x16
pascal@18140 500 jz waitkbd
pascal@18140 501 cbw
pascal@18140 502 int $0x16 # eat char
pascal@18140 503 movw %di, %fs # disable timeout
pascal@18140 504 incw %di # clear Z
pascal@18140 505 waitdone:
pascal@18140 506 ret
pascal@18140 507 #endif
pascal@18140 508
pascal@18140 509 #define kernel_version_offset 0xE
pascal@18140 510 puts_version:
pascal@18140 511 addw kernel_version_offset(%si),%si # starting protocol 2.00, Kernel 1.3.73
pascal@18140 512 puts:
pascal@18140 513 movb $0xd, %al # CR
pascal@18140 514 putcs:
pascal@18140 515 call putc
pascal@18140 516 lodsb
pascal@18140 517 cmpb $0, %al # end of string is any byte <= 0
pascal@18140 518 jg putcs
pascal@18140 519 ret
pascal@18140 520
pascal@18140 521 #ifdef MULTI_INITRD
pascal@18145 522 swap_floppy2:
pascal@18140 523 .ascii "B or "
pascal@18140 524 #endif
pascal@18145 525 swap_floppy:
pascal@18151 526 #ifdef COUNTER
pascal@18151 527 msg:
pascal@18155 528 .ascii "Insert disk 00"
pascal@18151 529 msgdigit:
pascal@18160 530 .ascii "1 and Enter."
pascal@18151 531 #else
pascal@18140 532 .ascii "Next!"
pascal@18151 533 #endif
pascal@18140 534 .byte 7,13,0 # swap detection needs 13, 0
pascal@18140 535 #ifdef MULTI_INITRD
pascal@18140 536 max_timeouts:
pascal@18140 537 .byte 20
pascal@18140 538 table:
pascal@18140 539 .org cur_initrd_size_ofs
pascal@18140 540 cur_initrd_size:
pascal@18140 541 .word table
pascal@18140 542 .byte table+4-256
pascal@18140 543 #endif
pascal@18151 544 #ifdef README_SUPPORT
pascal@18151 545 .org 0x1EF
pascal@18151 546 readme:
pascal@18151 547 .word 0
pascal@18151 548 #endif
pascal@18140 549 .org 0x1F1