wok annotate memtest/stuff/bootloader.S @ rev 24942

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