wok-current annotate plop/stuff/bootloader.S @ rev 24007

Up zstd (1.4.8)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 29 15:34:50 2021 +0000 (2021-01-29)
parents
children d1f31f5f6401
rev   line source
pascal@23919 1 // Image/zImage & tiny bzImage linux kernel boot sector, (C) SliTaz, GPL2.
pascal@23919 2
pascal@23919 3 SYSSEG = 0x1000
pascal@23919 4 setup_sects = 497
pascal@23919 5 syssize = 500
pascal@23919 6 cmd_line_ptr = 0x228
pascal@23919 7
pascal@23919 8 .text
pascal@23919 9 .code16
pascal@23919 10 .org 0
pascal@23919 11 .globl _start
pascal@23919 12 _start:
pascal@23919 13
pascal@23919 14 #define CODESZ 512 /* patched by installer */
pascal@23919 15
pascal@23919 16 // Default kernel format is 386 Image/zImage
pascal@23919 17 //#define BZIMAGE 0x207 /* setup version ; for bzImage < 512 Kb only */
pascal@23919 18 //#define ELKS /* 8086/286 linux port */
pascal@23919 19
pascal@23919 20 /* some extra features */
pascal@23919 21 #define EXE_SUPPORT real mode dos .exe file support +208/264
pascal@23919 22 #define CMDLINE dos kernel cmdline support +45
pascal@23919 23 #define VCPI VCPI 4.0 support (386+) +109
pascal@23919 24 #define SHUTDOWNDOS shutdown DOS services +29
pascal@23919 25
pascal@23919 26 /* some contraints to reduce the code size */
pascal@23919 27 //#define FLOPPY_1440K_ONLY 1.44M floppies support only -26
pascal@23919 28 #define FLOPPY_HAS_2_SIDES hardcoded heads count to 2 -15
pascal@23919 29 //#define NO_CMDLINE_SHRINK remove heading spaces ? -6-21
pascal@23919 30 //#define NO_CMDLINE_FILE remove @cmdline file support ? -21
pascal@23919 31 //#define NO_DOTS show progression dots ? -5
pascal@23919 32 #ifndef BZIMAGE
pascal@23919 33 #define TINY_ZIMAGE system < 64Kb ? -11
pascal@23919 34 #define NO_MINSETUP default setup (dos only) ? -4
pascal@23919 35 //#define NO_CURSOR_DEFINITION -8
pascal@23919 36 #endif
pascal@23919 37
pascal@23919 38 #ifdef ELKS
pascal@23919 39 .arch i8086
pascal@23919 40 INITSEG = 0x0100
pascal@23919 41 SETUPSEG = 0x0120
pascal@23919 42 #define ONLY8086
pascal@23919 43 #undef BZIMAGE
pascal@23919 44 #undef VCPI
pascal@23919 45 #else
pascal@23919 46 INITSEG = 0x9000
pascal@23919 47 SETUPSEG = 0x9020
pascal@23919 48 #endif
pascal@23919 49
pascal@23919 50 .macro shlclw cnt,obj
pascal@23919 51 #ifdef ONLY8086
pascal@23919 52 movb \cnt,%cl
pascal@23919 53 shlw %cl,\obj
pascal@23919 54 #else
pascal@23919 55 shlw \cnt,\obj
pascal@23919 56 #endif
pascal@23919 57 .endm
pascal@23919 58
pascal@23919 59 .macro shrclw cnt,obj
pascal@23919 60 #ifdef ONLY8086
pascal@23919 61 movb \cnt,%cl
pascal@23919 62 shrw %cl,\obj
pascal@23919 63 #else
pascal@23919 64 shrw \cnt,\obj
pascal@23919 65 #endif
pascal@23919 66 .endm
pascal@23919 67
pascal@23919 68 #ifdef EXE_SUPPORT
pascal@23919 69 #define EXEADRS(x) (x+0xE0)
pascal@23919 70 #define FLAT20(x) (x+16*INITSEG)
pascal@23919 71
pascal@23919 72 .macro trace_int19
pascal@23919 73 #ifdef ONLY8086
pascal@23919 74 xorw %si, %si
pascal@23919 75 movw %si, %ds
pascal@23919 76 pushw 4+2(%si)
pascal@23919 77 pushw 4(%si)
pascal@23919 78 movw $step19, 4(%si)
pascal@23919 79 movw $INITSEG, 4+2(%si)
pascal@23919 80 #else
pascal@23919 81 pushl $4
pascal@23919 82 popw %si
pascal@23919 83 popw %ds
pascal@23919 84 pushl (%si)
pascal@23919 85 movl $step19+(INITSEG<<16), (%si)
pascal@23919 86 #endif
pascal@23919 87 pushfw
pascal@23919 88 popw %ax
pascal@23919 89 incb %ah # set TF
pascal@23919 90 pushw %ax
pascal@23919 91 popfw
pascal@23919 92 ljmp *4*0x19-4(%si)
pascal@23919 93 .endm
pascal@23919 94
pascal@23919 95 stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@23919 96 decw %bp // Magic number: MZ
pascal@23919 97 popw %dx
pascal@23919 98 jmp start // Bytes on last page of file
pascal@23919 99 .word (CODESZ+511)/512 // Pages in file INSTALLER
pascal@23919 100 .word 0 // Relocations
pascal@23919 101 .word (end_header-_start)/16 // Size of header in paragraphs
pascal@23919 102 .word 4096 // Minimum extra paragraphs needed
pascal@23919 103 .word -1 // Maximum extra paragraphs needed
pascal@23919 104 .word (CODESZ+15)/16 // Initial (relative) SS value INSTALLER
pascal@23919 105 .word stacktop // Initial SP value
pascal@23919 106 .word 0 // Checksum INSTALLER?
pascal@23919 107 .word EXEADRS(comstart) // Initial IP value
pascal@23919 108 .word 0xFFF0 // Initial (relative) CS value
pascal@23919 109 // .word 0x001C // File address of relocation table
pascal@23919 110 // .word 0,0,0 // Overlay number
pascal@23919 111 #else
pascal@23919 112 #undef VCPI
pascal@23919 113 #endif
pascal@23919 114 start:
pascal@23919 115 xorw %ax, %ax # %ax = 0
pascal@23919 116 zeroed = 12 # zeroed registers
pascal@23919 117 movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
pascal@23919 118 stacktop = 0x9E00 # in 0x8000 .. 0xA000 (+zeroed+12)
pascal@23919 119 #ifdef ONLY8086
pascal@23919 120 movw $INITSEG, %bx
pascal@23919 121 #else
pascal@23919 122 pushw $INITSEG
pascal@23919 123 #endif
pascal@23919 124 end_header:
pascal@23919 125 cld # assume nothing
pascal@23919 126 #if defined(BZIMAGE) && BZIMAGE >= 0x202
pascal@23919 127 popw %es # %es contain INITSEG
pascal@23919 128 movw %es, %di
pascal@23919 129 #else
pascal@23919 130 # cmdline offset at 0x22
pascal@23919 131 movw $stacktop, %di # stacktop is an arbitrary value >=
pascal@23919 132 # length of bootsect + length of
pascal@23919 133 # setup + room for stack;
pascal@23919 134 # 12 is disk parm size.
pascal@23919 135 # ifdef ONLY8086
pascal@23919 136 pushw %bx
pascal@23919 137 # endif
pascal@23919 138 popw %es # %es contain INITSEG
pascal@23919 139 #endif
pascal@23919 140 pushw %es
pascal@23919 141 popw %ss # %es = %ss = INITSEG
pascal@23919 142 movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@23919 143 #ifdef EXE_SUPPORT
pascal@23919 144 cwd # force %dx = 0 (floppy only)
pascal@23919 145 #endif
pascal@23919 146
pascal@23919 147 # Many BIOS's default disk parameter tables will not recognize
pascal@23919 148 # multi-sector reads beyond the maximum sector number specified
pascal@23919 149 # in the default diskette parameter tables - this may mean 7
pascal@23919 150 # sectors in some cases.
pascal@23919 151 #
pascal@23919 152 # Since single sector reads are slow and out of the question,
pascal@23919 153 # we must take care of this by creating new parameter tables
pascal@23919 154 # (for the first disk) in RAM. We can set the maximum sector
pascal@23919 155 # count to 36 - the most we will encounter on an ED 2.88.
pascal@23919 156 #
pascal@23919 157 # High doesn't hurt. Low does. Let's use the max: 63
pascal@23919 158
pascal@23919 159 rep # don't worry about cld
pascal@23919 160 stosw # already done above
pascal@23919 161 popw %bx # offset = 0
pascal@23919 162 popw %ds # %ds = 0
pascal@23919 163
pascal@23919 164 movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0)
pascal@23919 165 incw %ax
pascal@23919 166
pascal@23919 167 ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
pascal@23919 168 pushw %es
pascal@23919 169 pushw %di
pascal@23919 170 movb $6, %cl # copy 12 bytes
pascal@23919 171 rep # don't worry about cld
pascal@23919 172 movsw # already done above
pascal@23919 173 movw %cx, %ds # %ds = 0
pascal@23919 174 #ifdef ONLY8086
pascal@23919 175 popw 0x78(%bx) # update parameter table address
pascal@23919 176 popw 0x78+2(%bx)
pascal@23919 177 #else
pascal@23919 178 popl 0x78(%bx) # update parameter table address
pascal@23919 179 #endif
pascal@23919 180 pushw %ss
pascal@23919 181 popw %ds # now %ds = %es = %ss = INITSEG
pascal@23919 182 movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
pascal@23919 183
pascal@23919 184 xchg %ax, %di # sector count
pascal@23919 185 popw %ax # limits = 0
pascal@23919 186 incw %cx # cylinder 0, sector 1, clear Z
pascal@23919 187 call read_first_sectors # read setup
pascal@23919 188
pascal@23919 189 # This routine loads the system at address LOADSEG, making sure
pascal@23919 190 # no 64kB boundaries are crossed. We try to load it as fast as
pascal@23919 191 # possible, loading whole tracks whenever we can.
pascal@23919 192
pascal@23919 193 movw syssize, %di
pascal@23919 194 decw %di
pascal@23919 195 shrclw $9-4, %di
pascal@23919 196 incw %di
pascal@23919 197 movw $SYSSEG, %cx
pascal@23919 198 #ifdef BZIMAGE
pascal@23919 199 push %cx
pascal@23919 200 #endif
pascal@23919 201 call read_sectorsCX
pascal@23919 202
pascal@23919 203 # This procedure turns off the floppy drive motor, so
pascal@23919 204 # that we enter the kernel in a known state, and
pascal@23919 205 # don't have to worry about it later.
pascal@23919 206
pascal@23919 207 kill_motor:
pascal@23919 208 xchgw %ax, %di # reset FDC (%di < 128)
pascal@23919 209 int $0x13
pascal@23919 210
pascal@23919 211 # After that (everything loaded), we jump to the setup-routine
pascal@23919 212 # loaded directly after the bootblock:
pascal@23919 213 # Segments are as follows: %ds = %ss = INITSEG
pascal@23919 214
pascal@23919 215 #ifdef BZIMAGE
pascal@23919 216 popw %bx
pascal@23919 217 popw %si // SYSSEG:0
pascal@23919 218 movesys: // %bx = DS, %si
pascal@23919 219 movw $16, %ax
pascal@23919 220 mulw %bx
pascal@23919 221 addw %si, %ax
pascal@23919 222 adcw $0x9300, %dx // %dx:%ax src flat address
pascal@23919 223 movw $9, %cx
pascal@23919 224 zero1:
pascal@23919 225 pushw $0 // 2E..1E
pascal@23919 226 loop zero1
pascal@23919 227 //pushl $0x93100000 // 1A: dest
pascal@23919 228 pushw $0x9310
pascal@23919 229 pushw %cx
pascal@23919 230 pushw $-1 // 18
pascal@23919 231 pushw %cx // 16
pascal@23919 232 pushw %dx // src
pascal@23919 233 pushw %ax
pascal@23919 234 pushw $-1 // 10
pascal@23919 235 movb $8, %cl
pascal@23919 236 movw %cx, %bx // will move 8*64 = 512Kb
pascal@23919 237 zero2:
pascal@23919 238 pushw $0 // 0E..00
pascal@23919 239 loop zero2
pascal@23919 240 movw %sp, %si
pascal@23919 241 pushw %ss
pascal@23919 242 popw %es
pascal@23919 243 pushw %es
pascal@23919 244 popw %ds
pascal@23919 245 syslp:
pascal@23919 246 movb $0x80, %ch
pascal@23919 247 movb $0x87, %ah
pascal@23919 248 int $0x15
pascal@23919 249 incb 0x14(%si)
pascal@23919 250 incb 0x1C(%si)
pascal@23919 251 decw %bx
pascal@23919 252 jne syslp
pascal@23919 253 #endif
pascal@23919 254 jmp_setup:
pascal@23919 255 cli
pascal@23919 256 ljmp $SETUPSEG, $0
pascal@23919 257
pascal@23919 258 #ifdef EXE_SUPPORT
pascal@23919 259 #ifdef SHUTDOWNDOS
pascal@23919 260 doiret:
pascal@23919 261 iret
pascal@23919 262 step19:
pascal@23919 263 pushw %si
pascal@23919 264 pushw %ds
pascal@23919 265 movw %sp, %si
pascal@23919 266 ldsw %ss:4(%si), %si
pascal@23919 267 cmpw $0x19CD, (%si)
pascal@23919 268 popw %ds
pascal@23919 269 popw %si
pascal@23919 270 jne doiret
pascal@23919 271 xorw %si, %si
pascal@23919 272 movw %si, %ds
pascal@23919 273 pushw %cs
pascal@23919 274 popw %ss
pascal@23919 275 movw $stacktop-4-16, %sp
pascal@23919 276 #ifdef ONLY8086
pascal@23919 277 popw 4(%si)
pascal@23919 278 popw 4+2(%si)
pascal@23919 279 popw %bp
pascal@23919 280 popw %di
pascal@23919 281 popw %si
pascal@23919 282 popw %dx
pascal@23919 283 popw %cx
pascal@23919 284 popw %bx
pascal@23919 285 popw %ax
pascal@23919 286 #else
pascal@23919 287 popl 4(%si)
pascal@23919 288 popaw
pascal@23919 289 #endif
pascal@23919 290 #ifdef BZIMAGE
pascal@23919 291 jmp movesys
pascal@23919 292 #endif
pascal@23919 293 #endif
pascal@23919 294 #ifndef BZIMAGE
pascal@23919 295 movesys: // %ax = SYSSEG, %bx = DS, %si
pascal@23919 296 shrclw $4, %si
pascal@23919 297 addw %si, %bx
pascal@23919 298 #ifdef TINY_ZIMAGE
pascal@23919 299 movw $0xFFFF, %cx
pascal@23919 300 xorw %si, %si
pascal@23919 301 xorw %di, %di
pascal@23919 302 cmpw %ax, %bx
pascal@23919 303 jnc forward
pascal@23919 304 decw %si
pascal@23919 305 decw %di
pascal@23919 306 std
pascal@23919 307 forward:
pascal@23919 308 movw %ax, %es
pascal@23919 309 movw %bx, %ds
pascal@23919 310 rep
pascal@23919 311 movsb
pascal@23919 312 cld
pascal@23919 313 #else
pascal@23919 314 subw %ax, %bx
pascal@23919 315 jnc forward
pascal@23919 316 movb $0x90, %ah
pascal@23919 317 ;decw %ax
pascal@23919 318 forward:
pascal@23919 319 movw %ax, %es
pascal@23919 320 movw %ax, %di
pascal@23919 321 addw %bx, %di
pascal@23919 322 movw %di, %ds
pascal@23919 323 sbbw %di, %di // %di = 0 : -1
pascal@23919 324 cmc // C = 1 : 0
pascal@23919 325 adcw %di, %ax
pascal@23919 326 xorw %si, %si
pascal@23919 327 xorw %di, %di
pascal@23919 328 movb $0x10, %cl
pascal@23919 329 cmpb %cl, %ah // move 512k
pascal@23919 330 rep
pascal@23919 331 movsb
pascal@23919 332 jns forward
pascal@23919 333 #endif
pascal@23919 334 #ifndef NO_CURSOR_DEFINITION
pascal@23919 335 movb $1, %ah
pascal@23919 336 movb $0, %bh
pascal@23919 337 movb $0x20, %ch // 0x2000
pascal@23919 338 int $0x10
pascal@23919 339 #endif
pascal@23919 340 pushw %ss
pascal@23919 341 popw %ds
pascal@23919 342 jmp jmp_setup
pascal@23919 343 #endif
pascal@23919 344 comstart:
pascal@23919 345 cld # assume nothing
pascal@23919 346 #ifdef ONLY8086
pascal@23919 347 movw $INITSEG, %ax
pascal@23919 348 pushw %ax
pascal@23919 349 #else
pascal@23919 350 pushw $INITSEG
pascal@23919 351 #endif
pascal@23919 352 popw %es
pascal@23919 353 #ifdef CMDLINE
pascal@23919 354 movw %sp, %di
pascal@23919 355 movw $0x80, %si
pascal@23919 356 lodsb
pascal@23919 357 cbw
pascal@23919 358 xchgw %ax, %cx
pascal@23919 359 jcxz nocmdline
pascal@23919 360 # if defined(BZIMAGE) && BZIMAGE >= 0x202
pascal@23919 361 movw $INITSEG/16+stacktop/256, EXEADRS(cmd_line_ptr+1)
pascal@23919 362 # else
pascal@23919 363 movw $0xA33F, 0x7F(%si)
pascal@23919 364 # endif
pascal@23919 365 # ifndef NO_CMDLINE_SHRINK
pascal@23919 366 skipspace:
pascal@23919 367 lodsb
pascal@23919 368 cmpb $0x20, %al
pascal@23919 369 je skipspace
pascal@23919 370 # ifndef NO_CMDLINE_FILE
pascal@23919 371 movw %si,%dx
pascal@23919 372 decw %si
pascal@23919 373 subb $'@',%al
pascal@23919 374 jne notafile
pascal@23919 375 movb $0x3D,%ah
pascal@23919 376 int $0x21
pascal@23919 377 jc notafile
pascal@23919 378 xchgw %ax,%bx
pascal@23919 379 //movw %si,%dx // ~320 bytes max
pascal@23919 380 movw $EXEADRS(notafile)-130,%cx
pascal@23919 381 movb $0x3F,%ah
pascal@23919 382 int $0x21
pascal@23919 383 xchgw %ax,%cx
pascal@23919 384 notafile:
pascal@23919 385 # else
pascal@23919 386 decw %si
pascal@23919 387 # endif
pascal@23919 388 # endif
pascal@23919 389 rep
pascal@23919 390 movsb
pascal@23919 391 nocmdline:
pascal@23919 392 orb EXEADRS(setup_sects), %ch
pascal@23919 393 # ifndef NO_MINSETUP
pascal@23919 394 # ifndef BZIMAGE
pascal@23919 395 jnz setupok
pascal@23919 396 mov $4, %ch
pascal@23919 397 setupok:
pascal@23919 398 # endif
pascal@23919 399 # endif
pascal@23919 400 #else
pascal@23919 401 movb EXEADRS(setup_sects), %ch
pascal@23919 402 #endif
pascal@23919 403 movb $(512-(end_header-_start))/2, %cl
pascal@23919 404 movw $0x100, %si
pascal@23919 405 movw $end_header, %di
pascal@23919 406 rep
pascal@23919 407 movsw
pascal@23919 408 movw $SYSSEG, %ax
pascal@23919 409 movw %ds, %bx
pascal@23919 410 pushw %es
pascal@23919 411 popw %ss
pascal@23919 412 #ifndef SHUTDOWNDOS
pascal@23919 413 pushw %es
pascal@23919 414 pushw $movesys
pascal@23919 415 #endif
pascal@23919 416 #ifdef VCPI
pascal@23919 417 pushaw
pascal@23919 418 smsww %ax
pascal@23919 419 andb $1, %al
pascal@23919 420 je isrm
pascal@23919 421 movw $EXEADRS(gdt_vcpi),%si
pascal@23919 422 movw $pagebuf-0x90000,%di // %es = 0x9000
pascal@23919 423 movl $pagebuf+3,%es:0x1000(%di)
pascal@23919 424 call_vcpi:
pascal@23919 425 movb $0xDE,%ah // DE01, EBX = getiface(DS:SI, ES:DI)
pascal@23919 426 int $0x67
pascal@23919 427 movl $FLAT20(sw2pm_params),%esi
pascal@23919 428 movb $0x0C,%al // DE0C switchpm(ESI)
pascal@23919 429 jmp call_vcpi
pascal@23919 430 pm_code:
pascal@23919 431 movl %cr0,%eax
pascal@23919 432 andl $0x7FFFFFFE,%eax
pascal@23919 433 movl %eax,%cr0
pascal@23919 434 movl %eax,%cr3
pascal@23919 435 isrm:
pascal@23919 436 # ifdef SHUTDOWNDOS
pascal@23919 437 trace_int19
pascal@23919 438 # else
pascal@23919 439 lssw %cs:EXEADRS(saved_ss_sp),%sp
pascal@23919 440 popaw
pascal@23919 441 retf
pascal@23919 442 # endif
pascal@23919 443 #else
pascal@23919 444 # ifdef SHUTDOWNDOS
pascal@23919 445 # ifdef ONLY8086
pascal@23919 446 pushw %ax
pascal@23919 447 pushw %bx
pascal@23919 448 pushw %cx
pascal@23919 449 pushw %dx
pascal@23919 450 pushw %si
pascal@23919 451 pushw %di
pascal@23919 452 pushw %bp
pascal@23919 453 # else
pascal@23919 454 pushaw
pascal@23919 455 # endif
pascal@23919 456 trace_int19
pascal@23919 457 # endif
pascal@23919 458 retf
pascal@23919 459 #endif
pascal@23919 460 #endif
pascal@23919 461
pascal@23919 462 # read_sectors reads %di sectors into %es:0 buffer.
pascal@23919 463 # %es:0 is updated to the next memory location.
pascal@23919 464 # First, sectors are read sector by sector until
pascal@23919 465 # sector per track count is known. Then they are
pascal@23919 466 # read track by track.
pascal@23919 467 # Assume no error on first track.
pascal@23919 468
pascal@23919 469 #ifdef FLOPPY_1440K_ONLY
pascal@23919 470 #ifndef FLOPPY_HAS_2_SIDES
pascal@23919 471 #define FLOPPY_HAS_2_SIDES hardcore heads count to 2
pascal@23919 472 #endif
pascal@23919 473 #define FLOPPY_SECTORS 18 /* 18 sectors */
pascal@23919 474 #else
pascal@23919 475 #define FLOPPY_HEADS 2 /* 2 heads minimum */
pascal@23919 476 #endif
pascal@23919 477
pascal@23919 478 return:
pascal@23919 479 #ifndef NO_DOTS
pascal@23919 480 movw $0xE2E,%ax
pascal@23919 481 int $0x10
pascal@23919 482 #endif
pascal@23919 483 ret
pascal@23919 484
pascal@23919 485 check_limits:
pascal@23919 486 #ifndef FLOPPY_1440K_ONLY
pascal@23919 487 popw %dx
pascal@23919 488 cmpb %al, %cl # max sector known ?
pascal@23919 489 ja next_head # no -> store it
pascal@23919 490 #ifndef FLOPPY_HAS_2_SIDES
pascal@23919 491 #ifdef FLOPPY_HEADS
pascal@23919 492 cmpb $FLOPPY_HEADS, %dh # 2 heads minimum
pascal@23919 493 jb check_cylinder
pascal@23919 494 #endif
pascal@23919 495 cmpb %ah, %dh # max head known ?
pascal@23919 496 ja next_cylinder # no -> store it
pascal@23919 497 check_cylinder:
pascal@23919 498 #endif
pascal@23919 499 pushw %ax
pascal@23919 500 cbw # %ah = 0
pascal@23919 501 #else
pascal@23919 502 pushw %dx
pascal@23919 503 #endif
pascal@23919 504 int $0x13 # reset controler
pascal@23919 505 #ifndef FLOPPY_1440K_ONLY
pascal@23919 506 popw %ax
pascal@23919 507 movb $1, %al # sector by sector...
pascal@23919 508 #else
pascal@23919 509 movw $1, %ax
pascal@23919 510 jmp more1trk
pascal@23919 511 #endif
pascal@23919 512 read_sectorslp:
pascal@23919 513 pushw %dx # some bios break dx...
pascal@23919 514 #ifndef FLOPPY_1440K_ONLY
pascal@23919 515 pushw %ax # limits
pascal@23919 516 subb %cl, %al # sectors remaining in track
pascal@23919 517 ja tolastsect
pascal@23919 518 movb $1, %al # first track sector by sector
pascal@23919 519 tolastsect:
pascal@23919 520 #else
pascal@23919 521 movb $FLOPPY_SECTORS+1, %al
pascal@23919 522 subb %cl, %al # sectors remaining in track
pascal@23919 523 #endif
pascal@23919 524 cbw
pascal@23919 525 cmpw %di, %ax
pascal@23919 526 jb more1trk
pascal@23919 527 movw %di, %ax # sectors to read
pascal@23919 528 more1trk:
pascal@23919 529 pushw %ax # save context
pascal@23919 530 movb $2, %ah # cmd: read chs
pascal@23919 531 int $0x13
pascal@23919 532 #ifndef FLOPPY_1440K_ONLY
pascal@23919 533 popw %dx # save %ax
pascal@23919 534 popw %ax # limits
pascal@23919 535 #else
pascal@23919 536 popw %ax # restore context
pascal@23919 537 popw %dx
pascal@23919 538 #endif
pascal@23919 539 jc check_limits
pascal@23919 540 #ifndef FLOPPY_1440K_ONLY
pascal@23919 541 xchgw %ax, %bp
pascal@23919 542 addw %dx,%cx # next sector
pascal@23919 543 movw %cx, %si
pascal@23919 544 pushw %dx
pascal@23919 545 shlclw $5, %dx
pascal@23919 546 movw %es, %cx
pascal@23919 547 addw %dx, %cx
pascal@23919 548 popw %dx
pascal@23919 549 subw %dx,%di # update sector counter
pascal@23919 550 popw %dx
pascal@23919 551 #else
pascal@23919 552 addw %ax,%cx # next sector
pascal@23919 553 movw %cx, %si
pascal@23919 554 pushw %ax
pascal@23919 555 shlclw $5, %ax
pascal@23919 556 movw %es, %cx
pascal@23919 557 addw %ax, %cx
pascal@23919 558 popw %ax
pascal@23919 559 subw %ax,%di # update sector counter
pascal@23919 560 #endif
pascal@23919 561 read_sectorsCX:
pascal@23919 562 movw %cx, %es # next location
pascal@23919 563 jz return
pascal@23919 564 read_sectors:
pascal@23919 565 movw %si, %cx
pascal@23919 566 #ifndef FLOPPY_1440K_ONLY
pascal@23919 567 # al is last sector+1
pascal@23919 568 # ah is last head+1
pascal@23919 569 xchgw %ax, %bp
pascal@23919 570 #endif
pascal@23919 571 #ifndef FLOPPY_1440K_ONLY
pascal@23919 572 cmpb %al,%cl # reach sector limit ?
pascal@23919 573 jne bdendlp
pascal@23919 574 next_head:
pascal@23919 575 movb %cl,%al
pascal@23919 576 #else
pascal@23919 577 cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ?
pascal@23919 578 jne bdendlp
pascal@23919 579 #endif
pascal@23919 580 movb $1,%cl # first sector
pascal@23919 581 #ifndef FLOPPY_HAS_2_SIDES
pascal@23919 582 incb %dh # next head
pascal@23919 583 cmpb %ah, %dh # reach head limit ?
pascal@23919 584 jne bdendlp
pascal@23919 585 next_cylinder:
pascal@23919 586 movb %dh,%ah
pascal@23919 587 movb $0,%dh # first head
pascal@23919 588 #else
pascal@23919 589 xorb %cl,%dh # next head
pascal@23919 590 jne bdendlp # reach head limit ?
pascal@23919 591 #endif
pascal@23919 592 # NOTE : support 256 cylinders max
pascal@23919 593 incb %ch # next cylinder
pascal@23919 594 read_first_sectors:
pascal@23919 595 bdendlp:
pascal@23919 596 jmp read_sectorslp
pascal@23919 597
pascal@23919 598 #ifdef VCPI
pascal@23919 599 pagebuf = 0x98000
pascal@23919 600 tss = gdt_abs-40
pascal@23919 601 gdt = gdt_abs-32
pascal@23919 602 gdt_null = gdt_abs-32
pascal@23919 603 gdt_vcpi = gdt_abs-24
pascal@23919 604 gdt_vcpi2 = gdt_abs-16
pascal@23919 605 gdt_vcpi3 = gdt_abs-8
pascal@23919 606 gdt_abs:
pascal@23919 607 .word 0xFFFF
pascal@23919 608 .long 0x92000000
pascal@23919 609 .byte 0xCF,0
pascal@23919 610 gdt_code:
pascal@23919 611 .word 0xFFFF
pascal@23919 612 gdt_code_base:
pascal@23919 613 .long 0x9A000000+FLAT20(0)
pascal@23919 614 .byte 0x8F,0
pascal@23919 615 gdt_tss:
pascal@23919 616 .word 0x00FF
pascal@23919 617 gdt_tss_base:
pascal@23919 618 .long 0x89000000+FLAT20(tss)
pascal@23919 619 .byte 0,0
pascal@23919 620 gdtr:
pascal@23919 621 gdt_lim:
pascal@23919 622 .word 0xFFFF
pascal@23919 623 gdt_base:
pascal@23919 624 .long FLAT20(gdt)
pascal@23919 625 sw2pm_params:
pascal@23919 626 sw2pm_cr3:
pascal@23919 627 .long pagebuf+0x1000
pascal@23919 628 sw2pm_gdtr_ptr:
pascal@23919 629 .long FLAT20(gdtr)
pascal@23919 630 sw2pm_idtr_ptr:
pascal@23919 631 .long FLAT20(idtr)
pascal@23919 632 sw2pm_ldtr:
pascal@23919 633 .word 0
pascal@23919 634 sw2pm_tr:
pascal@23919 635 SEL_TSS = gdt_tss-gdt_null
pascal@23919 636 .word SEL_TSS
pascal@23919 637 sw2pm_jumpaddr:
pascal@23919 638 .long pm_code
pascal@23919 639 SEL_CODE = gdt_code-gdt_null
pascal@23919 640 .word SEL_CODE
pascal@23919 641 idtr:
pascal@23919 642 idt_lim:
pascal@23919 643 .word 0x03FF
pascal@23919 644 idt_base:
pascal@23919 645 .long 0
pascal@23919 646 # ifndef SHUTDOWNDOS
pascal@23919 647 saved_ss_sp:
pascal@23919 648 .word stacktop-4-16-4,INITSEG
pascal@23919 649 # endif
pascal@23919 650 #endif
pascal@23919 651 #ifdef ELKS
pascal@23919 652 .org 0x1E3
pascal@23919 653 .byte 13,10,7
pascal@23919 654 .asciz "ELKS Boot"
pascal@23919 655 #endif