wok annotate linux/stuff/linux-header.u @ rev 16547

linux: update ATA config
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Apr 29 16:08:33 2014 +0000 (2014-04-29)
parents ead8572c67e9
children e0cfbb41587f
rev   line source
pascal@12556 1 --- linux-3.2.14/arch/x86/boot/header.S
pascal@12556 2 +++ linux-3.2.14/arch/x86/boot/header.S
pascal@15203 3 @@ -7,12 +7,14 @@
slaxemulator@8085 4 * modified by more people than can be counted
slaxemulator@8085 5 *
pascal@12556 6 * Rewritten as a common file by H. Peter Anvin (Apr 2007)
pascal@16547 7 + * Rewritten by Pascal Bellard (Nov 2009)
slaxemulator@8085 8 *
slaxemulator@8085 9 * BIG FAT NOTE: We're in real mode using 64k segments. Therefore segment
slaxemulator@8085 10 * addresses must be multiplied by 16 to obtain their respective linear
pascal@15203 11 * addresses. To avoid confusion, linear addresses are written using leading
pascal@15203 12 * hex while segment addresses are written as segment:offset.
pascal@15203 13 *
pascal@15203 14 + * Assume protocol 2.00+ (kernel >= 1.3.73)
pascal@15203 15 */
pascal@15203 16
pascal@15203 17 #include <asm/segment.h>
pascal@15203 18 @@ -27,6 +29,8 @@
slaxemulator@8085 19
slaxemulator@8085 20 BOOTSEG = 0x07C0 /* original address of boot-sector */
slaxemulator@8085 21 SYSSEG = 0x1000 /* historical load address >> 4 */
slaxemulator@8085 22 +INITSEG = 0x9000 /* boot address >> 4 */
slaxemulator@8085 23 +SETUPSEG = 0x9020 /* setup address >> 4 */
slaxemulator@8085 24
slaxemulator@8085 25 #ifndef SVGA_MODE
slaxemulator@8085 26 #define SVGA_MODE ASK_VGA
pascal@16547 27 @@ -40,53 +44,505 @@
pascal@15203 28 #define ROOT_RDONLY 1
slaxemulator@8085 29 #endif
pascal@15203 30
pascal@15203 31 +setup_sects = 497
pascal@15203 32 +syssize = 500
pascal@15203 33 +cmd_line_ptr = 0x228
pascal@15203 34 +
pascal@15203 35 +/* some extra features */
pascal@16547 36 +#define EXE_SUPPORT real mode dos .exe file support
pascal@15203 37 +#define CMDLINE kernel >= 2.4
pascal@15203 38 +#define OLDCMDLINE kernel < 2.4
pascal@15203 39 +#define HELP display version for ? argument
pascal@15203 40 +#define MORETHAN16M up to 4Gb RAM, not 16Mb
pascal@15203 41 +#define KEYBOARDLESS_SUPPORT scan floppy swap each 5 seconds
pascal@15203 42 +
pascal@16547 43 +/* some limitations to reduce the code size */
pascal@16547 44 +#define FLOPPY_1440K_ONLY 1.44M floppies support only (no 1.72M, 1.96M...)
pascal@15203 45 +
pascal@15203 46 .code16
pascal@15203 47 .section ".bstext", "ax"
slaxemulator@8085 48
slaxemulator@8085 49 .global bootsect_start
slaxemulator@8085 50 bootsect_start:
pascal@15203 51
pascal@15203 52 - # Normalize the start address
pascal@15203 53 - ljmp $BOOTSEG, $start2
pascal@15203 54 +#ifdef EXE_SUPPORT
pascal@15203 55 +#define CODESZ 0x8000
pascal@15203 56 +#define EXEADRS(x) x+0xE0
pascal@15203 57 +stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@15203 58 + decw %bp // Magic number: MZ
pascal@15203 59 + popw %dx
pascal@15273 60 + jmp fdstart // Bytes on last page of file
pascal@15203 61 + .word (CODESZ+511)/512 // Pages in file
pascal@15203 62 + .word 0 // Relocations
pascal@15203 63 + .word 2 // Size of header in paragraphs
pascal@15203 64 + .word 4096 // Minimum extra paragraphs needed
pascal@15203 65 + .word -1 // Maximum extra paragraphs needed
pascal@15203 66 + .word (CODESZ+15)/16 // Initial (relative) SS value
pascal@15203 67 + .word stacktop // Initial SP value
pascal@15203 68 + .word 0 // Checksum
pascal@15203 69 + .word EXEADRS(comstart) // Initial IP value
pascal@15203 70 + .word 0xFFF0 // Initial (relative) CS value
pascal@15203 71 +// .word 0x001C // File address of relocation table
pascal@15203 72 +// .word 0,0,0 // Overlay number
pascal@15203 73 +swap_floppy:
pascal@15203 74 + .ascii "Next!"
pascal@15203 75 + .byte 7,13,0 # swap detection needs 13, 0
pascal@15203 76 +#ifdef OLDCMDLINE
pascal@15203 77 + .word 0xA33F
pascal@15203 78 + .word stacktop
pascal@15203 79 +#endif
pascal@15273 80 +fdstart:
pascal@15203 81 + pushw %dx
pascal@15203 82 +#endif
pascal@15203 83
pascal@15203 84 -start2:
pascal@15203 85 - movw %cs, %ax
pascal@15203 86 - movw %ax, %ds
pascal@15203 87 - movw %ax, %es
pascal@15203 88 - movw %ax, %ss
pascal@15203 89 - xorw %sp, %sp
pascal@15203 90 - sti
pascal@15203 91 - cld
pascal@16547 92 +LOADSEG = 0x8000 # 0x1000 multiple, up to 512K zImage
pascal@16547 93 +LOADSZ = 0x10000
pascal@16547 94 +#ifdef EXE_SUPPORT
pascal@16547 95 +#A20BUFFER = 0x60000 # a20 gate / himem.sys support
pascal@16547 96 +A20BUFFER = 0x68000 # a20 gate / himem.sys support
pascal@16547 97 +#define USEA20BUFFER
pascal@15203 98 +#endif
pascal@15203 99
pascal@15203 100 - movw $bugger_off_msg, %si
pascal@16547 101 +# bootsect_start:
slaxemulator@8085 102 + cld # assume nothing
slaxemulator@8085 103 +stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@12556 104 +zeroed = 48+12 # gdt + zeroed registers
slaxemulator@8085 105 + movw $stacktop-12-zeroed, %di # stacktop is an arbitrary value >=
slaxemulator@8085 106 + # length of bootsect + length of
slaxemulator@8085 107 + # setup + room for stack;
slaxemulator@8085 108 + # 12 is disk parm size.
slaxemulator@8085 109 + pushw $INITSEG
pascal@12556 110 + popw %ss # %ss contain INITSEG
slaxemulator@8085 111 + movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@16547 112
pascal@16547 113 -msg_loop:
pascal@16547 114 - lodsb
pascal@16547 115 - andb %al, %al
pascal@16547 116 - jz bs_die
pascal@16547 117 - movb $0xe, %ah
pascal@16547 118 - movw $7, %bx
pascal@16547 119 - int $0x10
pascal@16547 120 - jmp msg_loop
slaxemulator@8085 121 +# Many BIOS's default disk parameter tables will not recognize
slaxemulator@8085 122 +# multi-sector reads beyond the maximum sector number specified
slaxemulator@8085 123 +# in the default diskette parameter tables - this may mean 7
slaxemulator@8085 124 +# sectors in some cases.
slaxemulator@8085 125 +#
slaxemulator@8085 126 +# Since single sector reads are slow and out of the question,
slaxemulator@8085 127 +# we must take care of this by creating new parameter tables
slaxemulator@8085 128 +# (for the first disk) in RAM. We can set the maximum sector
slaxemulator@8085 129 +# count to 36 - the most we will encounter on an ED 2.88.
slaxemulator@8085 130 +#
slaxemulator@8085 131 +# High doesn't hurt. Low does. Let's use the max: 63
pascal@16547 132
pascal@16547 133 -bs_die:
pascal@16547 134 - # Allow the user to press a key, then reboot
pascal@16547 135 - xorw %ax, %ax
pascal@12556 136 + pushw %ss
pascal@12556 137 + popw %es # %es = %ss = INITSEG
slaxemulator@8085 138 + xorw %ax, %ax # %ax = 0
pascal@15203 139 +#ifdef EXE_SUPPORT
pascal@15203 140 + cwd # floppy = head = 0
pascal@15203 141 +#endif
slaxemulator@8085 142 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
slaxemulator@8085 143 + rep # don't worry about cld
slaxemulator@8085 144 + stosw # already done above
slaxemulator@8085 145 + popw %bx # offset = 0
slaxemulator@8085 146 + popw %ds # %ds = 0
pascal@12556 147 + popw %fs # %fs = 0
pascal@15203 148 +
slaxemulator@8085 149 + movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0)
slaxemulator@8085 150 + incw %ax
pascal@15203 151 +
pascal@12556 152 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
slaxemulator@8085 153 + pushw %es
pascal@12556 154 + pushw %di
slaxemulator@8085 155 + movb $6, %cl # copy 12 bytes
slaxemulator@8085 156 + rep # don't worry about cld
slaxemulator@8085 157 + movsw # already done above
pascal@12556 158 + pushw %ss
slaxemulator@8085 159 + popw %ds # now %ds = %es = %ss = INITSEG
pascal@12556 160 + popl %fs:0x78(%bx) # update parameter table address
slaxemulator@8085 161 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
slaxemulator@8085 162 + cli
slaxemulator@8085 163 +
slaxemulator@8085 164 + xchg %ax, %di # sector count
slaxemulator@8085 165 + popw %ax # limits = 0
pascal@12556 166 + incw %cx # cylinder 0, sector 1, clear Z
slaxemulator@8085 167 + call read_first_sectors # read setup
pascal@15203 168 +loadsys:
slaxemulator@8085 169 + movw $0x200,%si
pascal@12556 170 +type_of_loader = 0x10
pascal@12556 171 +loadflags = 0x11
pascal@12556 172 +heap_end_ptr = 0x24
pascal@12556 173 + orw $0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
pascal@12556 174 + movb $(stacktop-0x300)/256, heap_end_ptr+1(%si)
pascal@15203 175 + call puts_version # show which kernel we are loading
slaxemulator@8085 176 +
pascal@12556 177 +# This routine loads the system at address LOADSEG, making sure
slaxemulator@8085 178 +# no 64kB boundaries are crossed. We try to load it as fast as
slaxemulator@8085 179 +# possible, loading whole tracks whenever we can.
pascal@15203 180 +
slaxemulator@8085 181 +ramdisk_image = 0x0218
slaxemulator@8085 182 +ramdisk_size = 0x021C
pascal@12556 183 +bootsect_src_limit = 16
pascal@12556 184 +bootsect_dst_limit = 24
pascal@12556 185 +bootsect_src_base = 18
pascal@15203 186 +bootsect_dst_base = 26 # bits 0..23
pascal@15203 187 +bootsect_dst_base_hi = 31 # bits 24..31
pascal@12556 188 + popw %bx # clear %bx
slaxemulator@8085 189 + movw %sp, %si # for bootsect_gdt
pascal@12556 190 +init_gdt:
pascal@12556 191 + decw bootsect_src_limit(%bx,%si) # max 64Kb
pascal@15203 192 + movw $0x9300+(LOADSEG/0x1000), bootsect_src_base+2(%bx,%si)
pascal@12556 193 + xorb $bootsect_dst_limit-bootsect_src_limit, %bl
pascal@12556 194 + jne init_gdt
pascal@12556 195 +code32_start = 0x214
pascal@12556 196 + movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
pascal@15203 197 + movl syssize, %ebx
pascal@12556 198 + decl %ebx
pascal@15203 199 + shrl $5, %ebx
pascal@16547 200 +#ifdef MORETHAN16M
pascal@15203 201 + incl %ebx
pascal@16547 202 +#else
pascal@16547 203 + incw %bx
pascal@16547 204 +#endif
pascal@16547 205 +#ifdef USEA20BUFFER
pascal@16547 206 + movw $0x00100000>>8, %di
pascal@16547 207 +#endif
slaxemulator@8085 208 +syslp:
pascal@16547 209 +#ifdef USEA20BUFFER
pascal@16547 210 + cmpw %ax, %di
pascal@16547 211 + jne nota20
pascal@16547 212 + xorw $(0x00100000+A20BUFFER)>>8, %ax
pascal@16547 213 +nota20:
pascal@16547 214 +#endif
pascal@12556 215 + movw %ax, bootsect_dst_base+1(%si)
pascal@16547 216 +#ifdef MORETHAN16M
pascal@16547 217 + movl $LOADSZ/512, %edi # size in sectors
pascal@16547 218 + subl %edi, %ebx
pascal@16547 219 +#else
pascal@15203 220 + movw $LOADSZ/512, %di # size in sectors
pascal@16547 221 + subw %di, %bx
pascal@16547 222 +#endif
slaxemulator@8085 223 + pushf
slaxemulator@8085 224 + jnc not_last
pascal@12556 225 + addw %bx, %di
slaxemulator@8085 226 +not_last:
slaxemulator@8085 227 + pushw %ax
slaxemulator@8085 228 + pushw %si
pascal@12556 229 + pushw %bx
pascal@12556 230 + xorw %bx,%bx
pascal@15203 231 + pushw $LOADSEG
pascal@15203 232 + popw %es
pascal@15203 233 +patchcall:
pascal@12556 234 + call read_sectors # update %bp
pascal@12556 235 + popw %bx
slaxemulator@8085 236 + popw %si
pascal@15203 237 + movw $LOADSZ/2, %cx # word count
slaxemulator@8085 238 + movb $0x87, %ah
pascal@12556 239 + pushw %ss
pascal@12556 240 + popw %es # restore es
pascal@15203 241 + int $0x15 # max 16M, maybe more...
slaxemulator@8085 242 + popw %ax
pascal@16547 243 + incb %ah # next dest (ax+=LOADSZ/256)
pascal@15203 244 +#ifdef MORETHAN16M
pascal@15203 245 + adcb %cl, bootsect_dst_base_hi(%si) # breaks 16M limit ?
pascal@15203 246 +#endif
pascal@16547 247 +#ifdef USEA20BUFFER
pascal@16547 248 + movw $(LOADSZ+A20BUFFER)>>8, %di
pascal@16547 249 +#endif
slaxemulator@8085 250 + popf
slaxemulator@8085 251 + ja syslp
pascal@16547 252 +#ifdef USEA20BUFFER
pascal@16547 253 +#ifdef MORETHAN16M
pascal@16547 254 + movb %cl, bootsect_dst_base_hi(%si)
pascal@16547 255 +#endif
pascal@16547 256 + movb $0x10, bootsect_dst_base+2(%si)
pascal@16547 257 + movw $A20BUFFER/0x100, bootsect_src_base+1(%si)
pascal@16547 258 + movb $0x87, %ah
pascal@16547 259 + int $0x15
pascal@16547 260 +#endif
pascal@16547 261 +
slaxemulator@8085 262 +# This procedure turns off the floppy drive motor, so
slaxemulator@8085 263 +# that we enter the kernel in a known state, and
slaxemulator@8085 264 +# don't have to worry about it later.
pascal@15203 265 +
pascal@12556 266 +kill_motor:
pascal@12556 267 + xchgw %ax, %di # reset FDC (%di < 128)
pascal@12556 268 + int $0x13
slaxemulator@8085 269 +
slaxemulator@8085 270 +# After that (everything loaded), we jump to the setup-routine
slaxemulator@8085 271 +# loaded directly after the bootblock:
slaxemulator@8085 272 +# Segments are as follows: %ds = %ss = INITSEG
slaxemulator@8085 273 +
slaxemulator@8085 274 + ljmp $SETUPSEG, $0
slaxemulator@8085 275 +
slaxemulator@8085 276 +# read_sectors reads %di sectors into %es:0 buffer.
slaxemulator@8085 277 +# %es:0 is updated to the next memory location.
slaxemulator@8085 278 +# First, sectors are read sector by sector until
slaxemulator@8085 279 +# sector per track count is known. Then they are
slaxemulator@8085 280 +# read track by track.
slaxemulator@8085 281 +# Assume no error on first track.
slaxemulator@8085 282 +
slaxemulator@8085 283 +#define FLOPPY_CYLINDERS 80 /* 80 cylinders minimum */
slaxemulator@8085 284 +#define FLOPPY_HEADS 2 /* 2 heads minimum */
slaxemulator@8085 285 +#define FLOPPY_SECTORS 18 /* 18 sectors minimum */
slaxemulator@8085 286 +
slaxemulator@8085 287 +check_limits:
pascal@15203 288 +#ifndef FLOPPY_1440K_ONLY
pascal@15203 289 + popw %dx
slaxemulator@8085 290 + cmpb $FLOPPY_SECTORS+1, %cl # 18 sectors minimum
slaxemulator@8085 291 + jb check_head
slaxemulator@8085 292 + cmpb %al, %cl # max sector known ?
slaxemulator@8085 293 + ja next_head # no -> store it
slaxemulator@8085 294 +check_head:
slaxemulator@8085 295 + cmpb $FLOPPY_HEADS, %dh # 2 heads minimum
slaxemulator@8085 296 + jb check_cylinder
slaxemulator@8085 297 + cmpb %ah, %dh # max head known ?
slaxemulator@8085 298 + ja next_cylinder # no -> store it
slaxemulator@8085 299 +check_cylinder:
pascal@15203 300 +#endif
slaxemulator@8085 301 + pushaw
pascal@15203 302 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 303 + cbw # %ah = 0
pascal@15203 304 +#endif
slaxemulator@8085 305 + int $0x13 # reset controler
pascal@15203 306 + stc
pascal@15203 307 + call putcdot # print '-'
pascal@15203 308 +read_sectorslp:
slaxemulator@8085 309 + popaw
pascal@15203 310 +bdendlp:
slaxemulator@8085 311 + pushw %dx # some bios break dx...
pascal@15203 312 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 313 + pushw %ax # limits
slaxemulator@8085 314 + subb %cl, %al # sectors remaining in track
slaxemulator@8085 315 + ja tolastsect
slaxemulator@8085 316 + movb $1, %al # 1 sector mini
slaxemulator@8085 317 +tolastsect:
pascal@15203 318 +#else
pascal@15203 319 + mov $FLOPPY_SECTORS+1, %al
pascal@15203 320 + subb %cl, %al # sectors remaining in track
pascal@15203 321 +#endif
slaxemulator@8085 322 + cbw
slaxemulator@8085 323 + cmpw %di, %ax
slaxemulator@8085 324 + jb more1trk
slaxemulator@8085 325 + movw %di, %ax # sectors to read
slaxemulator@8085 326 +more1trk:
slaxemulator@8085 327 + pushw %ax # save context
slaxemulator@8085 328 + movb $2, %ah # cmd: read chs
slaxemulator@8085 329 + int $0x13
pascal@15203 330 +#ifndef FLOPPY_1440K_ONLY
pascal@15203 331 + popw %dx # save %ax
slaxemulator@8085 332 + popw %ax # limits
pascal@15203 333 +#else
pascal@15203 334 + popw %ax # restore context
slaxemulator@8085 335 + popw %dx
pascal@15203 336 +#endif
slaxemulator@8085 337 + jc check_limits
pascal@15203 338 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 339 + xchgw %ax, %bp
pascal@15203 340 + addw %dx,%cx # next sector
pascal@12556 341 + movw %cx, %gs
pascal@15203 342 + addb %dl,%bh
pascal@15203 343 + addb %dl,%bh # next location
pascal@15203 344 + subw %dx,%di # update sector counter
pascal@15203 345 + popw %dx
slaxemulator@8085 346 + jz putcdot
pascal@15203 347 +#else
pascal@15203 348 + addw %ax,%cx # next sector
pascal@15203 349 + movw %cx, %gs
pascal@15203 350 + addb %al,%bh
pascal@15203 351 + addb %al,%bh # next location
pascal@15203 352 + subw %ax,%di # update sector counter
pascal@15203 353 + jz putcdot
pascal@15203 354 +#endif
slaxemulator@8085 355 +read_sectors:
pascal@12556 356 + movw %gs, %cx
pascal@15203 357 +#ifndef FLOPPY_1440K_ONLY
pascal@12556 358 +# al is last sector+1
pascal@12556 359 +# ah is last cylinder+1
slaxemulator@8085 360 + xchgw %ax, %bp
pascal@15203 361 +#endif
pascal@15203 362 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 363 + cmpb %al,%cl # reach sector limit ?
slaxemulator@8085 364 + jne bdendlp
slaxemulator@8085 365 +next_head:
slaxemulator@8085 366 + movb %cl,%al
pascal@15203 367 +#else
pascal@15203 368 + cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ?
pascal@15203 369 + jne bdendlp
pascal@15203 370 +#endif
slaxemulator@8085 371 + incb %dh # next head
slaxemulator@8085 372 + movb $1,%cl # first sector
pascal@15203 373 +#ifndef FLOPPY_1440K_ONLY
slaxemulator@8085 374 + cmpb %ah, %dh # reach head limit ?
slaxemulator@8085 375 + jne bdendlp
slaxemulator@8085 376 +next_cylinder:
slaxemulator@8085 377 + movb %dh,%ah
pascal@15203 378 +#else
pascal@15203 379 + cmpb %cl,%dh # reach head limit ?
pascal@15203 380 + je bdendlp
pascal@15203 381 +#endif
slaxemulator@8085 382 +# NOTE : support 256 cylinders max
slaxemulator@8085 383 + incb %ch # next cylinder
slaxemulator@8085 384 +read_first_sectors:
pascal@15203 385 + cmpb $FLOPPY_CYLINDERS,%ch # reach cylinder limit ?
slaxemulator@8085 386 + movb $0,%dh # first head
pascal@12556 387 + jne bdendlp
slaxemulator@8085 388 +next_floppy:
slaxemulator@8085 389 + movb $0,%ch # first cylinder
slaxemulator@8085 390 + pushaw
slaxemulator@8085 391 + movw $swap_floppy,%si
pascal@15203 392 +#ifdef KEYBOARDLESS_SUPPORT
slaxemulator@8085 393 + pushw %bx
pascal@12556 394 + call puts
slaxemulator@8085 395 + popw %bx
slaxemulator@8085 396 +waitfloppy:
slaxemulator@8085 397 + call wait
slaxemulator@8085 398 + jne waitfloppydone
slaxemulator@8085 399 + pushw %dx # some bios break dx...
slaxemulator@8085 400 + cbw
slaxemulator@8085 401 + int $0x13 # reset FDC
slaxemulator@8085 402 + movw $0x201,%ax
slaxemulator@8085 403 + int $0x13 # read first sector
slaxemulator@8085 404 + popw %dx
slaxemulator@8085 405 + rclb $1,%ah # floppy changed 06=>0D no error 00
slaxemulator@8085 406 + cmpb -2(%si), %ah # 0D then 00
slaxemulator@8085 407 + jne waitfloppy # no => try again
slaxemulator@8085 408 + incw %si
pascal@15203 409 + decw %ax # was 0001 ?
slaxemulator@8085 410 + jne waitfloppy
slaxemulator@8085 411 +waitfloppydone:
pascal@15203 412 +#else
pascal@15203 413 + call puts
pascal@15203 414 + cbw # %ah = 0, get keyboard character
pascal@15203 415 int $0x16
pascal@15203 416 - int $0x19
pascal@15203 417 +#endif
slaxemulator@8085 418 + jmp read_sectorslp
pascal@16547 419
pascal@16547 420 - # int 0x19 should never return. In case it does anyway,
pascal@16547 421 - # invoke the BIOS reset code...
pascal@16547 422 - ljmp $0xf000,$0xfff0
pascal@15203 423 +#ifdef EXE_SUPPORT
pascal@15203 424 +read_sectors_dos:
pascal@16547 425 + xorw %dx, %dx // write to %ds:%dx, not %es:%bx
pascal@16547 426 + call read_sectors_dosz
pascal@16547 427 +read_sectors_dosz:
pascal@15203 428 + pushw %es
pascal@15203 429 + popw %ds
pascal@15203 430 + movb $0x3F, %ah // read
pascal@15203 431 + movw %di, %cx
pascal@16547 432 + shlw $8, %cx // byte count / 2
pascal@15203 433 + movw %bp, %bx
pascal@15203 434 + int $0x21
pascal@16547 435 + xchgw %ax, %dx
pascal@15203 436 + pushw %ss
pascal@15203 437 + popw %ds
pascal@15203 438 +#endif
pascal@15203 439
pascal@15203 440 - .section ".bsdata", "a"
pascal@15203 441 -bugger_off_msg:
pascal@15203 442 - .ascii "Direct booting from floppy is no longer supported.\r\n"
pascal@15203 443 - .ascii "Please use a boot loader program instead.\r\n"
pascal@15203 444 - .ascii "\n"
pascal@15203 445 - .ascii "Remove disk and press any key to reboot . . .\r\n"
pascal@15203 446 - .byte 0
slaxemulator@8085 447 +putcdot:
pascal@15203 448 + movb $'.'+3, %al // . = success, - = failure
slaxemulator@8085 449 +putclf:
pascal@15203 450 + sbbb $3, %al
slaxemulator@8085 451 +putc:
slaxemulator@8085 452 + movb $0xe, %ah
slaxemulator@8085 453 + movw $7, %bx # one dot each 64k
slaxemulator@8085 454 + int $0x10
slaxemulator@8085 455 + cmp $0xd, %al # CR ?
slaxemulator@8085 456 + je putclf
slaxemulator@8085 457 + ret
pascal@16547 458
pascal@15203 459 +#ifdef KEYBOARDLESS_SUPPORT
slaxemulator@8085 460 +clock = 0x46C
slaxemulator@8085 461 +wait:
slaxemulator@8085 462 +wait4key:
slaxemulator@8085 463 + movw $clock, %di
slaxemulator@8085 464 +#define DELAY 5
pascal@15203 465 + movb $257-(DELAY*182)/10, %fs:(%di)
slaxemulator@8085 466 +waitkbd:
slaxemulator@8085 467 + movw $0x10D, %ax # test keyboard, timeout => CR
pascal@15203 468 + cmpb %fs:(%di),%ah
slaxemulator@8085 469 + je waitdone
pascal@12556 470 + int $0x16
slaxemulator@8085 471 + jz waitkbd
slaxemulator@8085 472 + cbw
slaxemulator@8085 473 + int $0x16 # eat char
pascal@12556 474 + movw %di, %fs # disable timeout
slaxemulator@8085 475 + incw %di # clear Z
slaxemulator@8085 476 +waitdone:
slaxemulator@8085 477 + ret
pascal@15203 478 +#endif
pascal@16547 479 +
pascal@15203 480 +#ifdef EXE_SUPPORT
pascal@15203 481 +comstart:
pascal@15203 482 + cld # assume nothing
pascal@15203 483 + pushw $INITSEG
pascal@15203 484 + popw %es
pascal@15203 485 + pushw %es
pascal@15203 486 + popw %ss
pascal@15203 487 +#ifdef CMDLINE
pascal@15203 488 + movw %sp, %di
pascal@15203 489 + movw $0x80, %si
pascal@15203 490 + lodsb
pascal@15203 491 + cbw
pascal@15203 492 + xchgw %ax, %cx
pascal@15203 493 + rep
pascal@15203 494 + movsb
pascal@15203 495 + movb $(48+2)/2, %cl
pascal@15203 496 + xorw %bx, %bx
pascal@15203 497 +clearstacklp:
pascal@15203 498 + pushw %bx
pascal@15203 499 + loop clearstacklp
pascal@15203 500 +# ifdef HELP
pascal@15203 501 + cmpb $'?', -1(%si)
pascal@15203 502 + movw $EXEADRS(0x200), %si
pascal@15203 503 + movw setup_sects-0x200(%si), %di // bits 0..6
pascal@15203 504 + je puts_version
pascal@15203 505 + smsww %ax
pascal@15203 506 + andb $1, %al
pascal@15203 507 + jne puts_version // real mode only...
pascal@15203 508 +# endif
pascal@15203 509 +#else
pascal@15203 510 + movw $(48+2)/2, %cx
pascal@15203 511 + xorw %bx, %bx
pascal@15203 512 +clearstacklp:
pascal@15203 513 + pushw %bx
pascal@15203 514 + loop clearstacklp
pascal@15203 515 +#endif
pascal@15203 516 +#if !defined(CMDLINE) || !defined(HELP)
pascal@15203 517 + movw EXEADRS(setup_sects), %di // bits 0..6
pascal@15203 518 + movb $0, %al // access = RO
pascal@15203 519 +#endif
pascal@15203 520 + movw 0x2C(%bx), %ds // DOS 3.0+
pascal@15203 521 +loop1:
pascal@15203 522 + incw %bx
pascal@15203 523 + cmpw %cx, (%bx)
pascal@15203 524 + jne loop1
pascal@15203 525 + leaw 4(%bx), %dx // %ds:%dx filename
pascal@15203 526 + movb $0x3D, %ah // open, access = RO
pascal@15203 527 + int $0x21
pascal@15203 528 + jc dosexit
pascal@15203 529 + xchgw %ax, %bp // fd
pascal@15203 530 + incw %di
pascal@15203 531 + call read_sectors_dos // update %ds
pascal@15203 532 + addb $read_sectors_dos-read_sectors, patchcall+1
pascal@15203 533 +#ifdef CMDLINE
pascal@15203 534 +# ifdef OLDCMDLINE
pascal@15203 535 + movw $0x202, %bx
pascal@15203 536 + cmpw %bx, 0x206-0x202(%bx)
pascal@15203 537 + jb oldcmdline
pascal@15203 538 + movw $INITSEG/16+stacktop/256, cmd_line_ptr+1-0x202(%bx)
pascal@15203 539 +oldcmdline:
pascal@15203 540 +# else
pascal@15203 541 + movw $INITSEG/16+stacktop/256, cmd_line_ptr+1
pascal@15203 542 +# endif
pascal@15203 543 +#endif
pascal@15203 544 + ljmp $INITSEG, $loadsys
pascal@15206 545 +#else
pascal@15206 546 +swap_floppy:
pascal@15206 547 + .ascii "Next!"
pascal@15206 548 + .byte 7,13,0 # swap detection needs 13, 0
pascal@15203 549 +#endif
pascal@15203 550 +
pascal@16011 551 +#define kernel_version_offset 0xE
pascal@15203 552 +puts_version:
pascal@16011 553 + addw kernel_version_offset(%si),%si # starting protocol 2.00, Kernel 1.3.73
pascal@15203 554 +puts:
pascal@15203 555 + movb $0xd, %al # CR
pascal@15203 556 +putcs:
pascal@15203 557 + call putc
pascal@15203 558 + lodsb
pascal@15203 559 + cmpb $0, %al # end of string is any byte <= 0
pascal@15203 560 + jg putcs
pascal@15203 561 +dosexit:
pascal@15203 562 + ret
slaxemulator@8085 563
slaxemulator@8085 564 # Kernel attributes; used by setup. This is part 1 of the
slaxemulator@8085 565 # header, from the old boot sector.