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

linux/embedded loader: needs 256 bytes alignements, not 64k
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Apr 28 13:23:21 2012 +0200 (2012-04-28)
parents 6f536abe4f0b
children 48a3c0a87ff7
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@12556 3 @@ -7,6 +7,7 @@
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)
slaxemulator@8085 7 + * Rewritten 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@12556 11 @@ -27,7 +28,12 @@
slaxemulator@8085 12
slaxemulator@8085 13 BOOTSEG = 0x07C0 /* original address of boot-sector */
slaxemulator@8085 14 SYSSEG = 0x1000 /* historical load address >> 4 */
slaxemulator@8085 15 +INITSEG = 0x9000 /* boot address >> 4 */
slaxemulator@8085 16 +SETUPSEG = 0x9020 /* setup address >> 4 */
slaxemulator@8085 17
pascal@12556 18 +#define LOADSEG 0x0800
pascal@12556 19 +#define LOADSZ (LOADSEG*0x10)
pascal@12556 20 +
slaxemulator@8085 21 #ifndef SVGA_MODE
slaxemulator@8085 22 #define SVGA_MODE ASK_VGA
slaxemulator@8085 23 #endif
pascal@12556 24 @@ -45,48 +51,366 @@
slaxemulator@8085 25
slaxemulator@8085 26 .global bootsect_start
slaxemulator@8085 27 bootsect_start:
slaxemulator@8085 28 + cld # assume nothing
slaxemulator@8085 29 +stacktop = 0x9E00 # in 0x8000 .. 0xA000
pascal@12556 30 +zeroed = 48+12 # gdt + zeroed registers
slaxemulator@8085 31 + movw $stacktop-12-zeroed, %di # stacktop is an arbitrary value >=
slaxemulator@8085 32 + # length of bootsect + length of
slaxemulator@8085 33 + # setup + room for stack;
slaxemulator@8085 34 + # 12 is disk parm size.
slaxemulator@8085 35 + pushw $INITSEG
pascal@12556 36 + popw %ss # %ss contain INITSEG
slaxemulator@8085 37 + movw %di, %sp # put stack at INITSEG:stacktop-...
pascal@12556 38
pascal@12556 39 - # Normalize the start address
pascal@12556 40 - ljmp $BOOTSEG, $start2
slaxemulator@8085 41 +# Many BIOS's default disk parameter tables will not recognize
slaxemulator@8085 42 +# multi-sector reads beyond the maximum sector number specified
slaxemulator@8085 43 +# in the default diskette parameter tables - this may mean 7
slaxemulator@8085 44 +# sectors in some cases.
slaxemulator@8085 45 +#
slaxemulator@8085 46 +# Since single sector reads are slow and out of the question,
slaxemulator@8085 47 +# we must take care of this by creating new parameter tables
slaxemulator@8085 48 +# (for the first disk) in RAM. We can set the maximum sector
slaxemulator@8085 49 +# count to 36 - the most we will encounter on an ED 2.88.
slaxemulator@8085 50 +#
slaxemulator@8085 51 +# High doesn't hurt. Low does. Let's use the max: 63
pascal@12556 52
pascal@12556 53 -start2:
pascal@12556 54 - movw %cs, %ax
pascal@12556 55 - movw %ax, %ds
pascal@12556 56 - movw %ax, %es
pascal@12556 57 - movw %ax, %ss
pascal@12556 58 - xorw %sp, %sp
pascal@12556 59 - sti
pascal@12556 60 - cld
pascal@12556 61 + pushw %ss
pascal@12556 62 + popw %es # %es = %ss = INITSEG
slaxemulator@8085 63 + xorw %ax, %ax # %ax = 0
slaxemulator@8085 64 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits
slaxemulator@8085 65 + rep # don't worry about cld
slaxemulator@8085 66 + stosw # already done above
slaxemulator@8085 67 + popw %bx # offset = 0
slaxemulator@8085 68 + popw %ds # %ds = 0
pascal@12556 69 + popw %fs # %fs = 0
pascal@12556 70
pascal@12556 71 - movw $bugger_off_msg, %si
slaxemulator@8085 72 + movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0)
slaxemulator@8085 73 + incw %ax
pascal@12556 74
pascal@12556 75 -msg_loop:
pascal@12556 76 - lodsb
pascal@12556 77 - andb %al, %al
pascal@12556 78 - jz bs_die
pascal@12556 79 - movb $0xe, %ah
pascal@12556 80 - movw $7, %bx
pascal@12556 81 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address
slaxemulator@8085 82 + pushw %es
pascal@12556 83 + pushw %di
slaxemulator@8085 84 + movb $6, %cl # copy 12 bytes
slaxemulator@8085 85 + rep # don't worry about cld
slaxemulator@8085 86 + movsw # already done above
pascal@12556 87 + pushw %ss
slaxemulator@8085 88 + popw %ds # now %ds = %es = %ss = INITSEG
pascal@12556 89 + popl %fs:0x78(%bx) # update parameter table address
slaxemulator@8085 90 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop
slaxemulator@8085 91 + cli
slaxemulator@8085 92 +
slaxemulator@8085 93 + xchg %ax, %di # sector count
slaxemulator@8085 94 + popw %ax # limits = 0
pascal@12556 95 + incw %cx # cylinder 0, sector 1, clear Z
slaxemulator@8085 96 + call read_first_sectors # read setup
slaxemulator@8085 97 +
slaxemulator@8085 98 + movw $0x200,%si
pascal@12556 99 +#define kernel_version 0xE
pascal@12556 100 +type_of_loader = 0x10
pascal@12556 101 +loadflags = 0x11
pascal@12556 102 +heap_end_ptr = 0x24
pascal@12556 103 + orw $0x8020, type_of_loader(%si) # loader type = 0x20 = bootsect-loader
pascal@12556 104 + movb $(stacktop-0x300)/256, heap_end_ptr+1(%si)
pascal@12556 105 + addw kernel_version(%si),%si # starting protocol 2.00, Kernel 1.3.73
pascal@12556 106 + call puts # show which kernel we are loading
slaxemulator@8085 107 +
slaxemulator@8085 108 +# The cmdline can be entered and modifed at boot time.
slaxemulator@8085 109 +# Only characters before the cursor are passed to the kernel.
slaxemulator@8085 110 + popw %bx # clear %bx
slaxemulator@8085 111 + orw cmd_line_ptr, %bx
slaxemulator@8085 112 + jz nocmdline
slaxemulator@8085 113 + pushw %bx
slaxemulator@8085 114 + incw %di
slaxemulator@8085 115 + call read_sectors
slaxemulator@8085 116 + popw %si
pascal@12556 117 + call puts
slaxemulator@8085 118 +cmdlp:
slaxemulator@8085 119 + movb $0x20, %al # clear end of line
slaxemulator@8085 120 + int $0x10 # with Space
slaxemulator@8085 121 + movb $8, %al # and BackSpace
pascal@12556 122 int $0x10
pascal@12556 123 - jmp msg_loop
slaxemulator@8085 124 + decw %si
slaxemulator@8085 125 +cmdget:
slaxemulator@8085 126 + call wait4key
slaxemulator@8085 127 + cmpb $8, %al # BackSpace ?
slaxemulator@8085 128 + je cmdbs
slaxemulator@8085 129 + movb %al, (%si) # store char
slaxemulator@8085 130 + lodsw # %si += 2
slaxemulator@8085 131 +cmdbs:
slaxemulator@8085 132 + cmpw %si,cmd_line_ptr
slaxemulator@8085 133 + je cmdget
slaxemulator@8085 134 + call putc # set %ah and %bx
slaxemulator@8085 135 + cmpb $10, %al # Enter ?
slaxemulator@8085 136 + jne cmdlp
slaxemulator@8085 137 + movb %bh,-2(%si) # set end of string and remove CR
slaxemulator@8085 138 +endcmdline:
slaxemulator@8085 139 +nocmdline:
slaxemulator@8085 140
pascal@12556 141 -bs_die:
pascal@12556 142 - # Allow the user to press a key, then reboot
pascal@12556 143 - xorw %ax, %ax
pascal@12556 144 - int $0x16
pascal@12556 145 - int $0x19
pascal@12556 146 +# This routine loads the system at address LOADSEG, making sure
slaxemulator@8085 147 +# no 64kB boundaries are crossed. We try to load it as fast as
slaxemulator@8085 148 +# possible, loading whole tracks whenever we can.
pascal@12556 149
pascal@12556 150 - # int 0x19 should never return. In case it does anyway,
pascal@12556 151 - # invoke the BIOS reset code...
pascal@12556 152 - ljmp $0xf000,$0xfff0
slaxemulator@8085 153 +ramdisk_image = 0x0218
slaxemulator@8085 154 +ramdisk_size = 0x021C
pascal@12556 155 +bootsect_src_limit = 16
pascal@12556 156 +bootsect_dst_limit = 24
pascal@12556 157 +bootsect_src_base = 18
pascal@12556 158 +bootsect_dst_base = 26
pascal@12556 159 + popw %bx # clear %bx
slaxemulator@8085 160 + movw %sp, %si # for bootsect_gdt
pascal@12556 161 +init_gdt:
pascal@12556 162 + decw bootsect_src_limit(%bx,%si) # max 64Kb
pascal@12556 163 + movb $0x93, bootsect_src_base+3(%bx,%si)
pascal@12556 164 + xorb $bootsect_dst_limit-bootsect_src_limit, %bl
pascal@12556 165 + jne init_gdt
pascal@12556 166 + movw $syssize, %bx
pascal@12556 167 +code32_start = 0x214
pascal@12556 168 + movw code32_start+1, %ax # destination = 0x00100000 or 0x00010000
slaxemulator@8085 169 + movb $5, %cl
slaxemulator@8085 170 +initrdlp:
pascal@12556 171 + movl (%bx),%ebx
pascal@12556 172 + decl %ebx
pascal@12556 173 + shrl %cl, %ebx
pascal@12556 174 + incw %bx
slaxemulator@8085 175 +syslp:
pascal@12556 176 + pushw $LOADSEG
slaxemulator@8085 177 + popw %es
pascal@12556 178 + movw $LOADSZ/256,%di # size in pages
pascal@12556 179 + movw %di, bootsect_src_base+1(%si) # assume LOADSZ == LOADSEG*16
pascal@12556 180 + movw %ax, bootsect_dst_base+1(%si)
pascal@12556 181 + addw %di, %ax # next dest
pascal@12556 182 + shrw $1, %di # pages to sectors
pascal@12556 183 + subw %di, %bx # max 32M > int 15 limit
slaxemulator@8085 184 + pushf
slaxemulator@8085 185 + jnc not_last
pascal@12556 186 + addw %bx, %di
slaxemulator@8085 187 +not_last:
slaxemulator@8085 188 + pushw %ax
pascal@12556 189 + pushw %di
slaxemulator@8085 190 + pushw %si
pascal@12556 191 + pushw %bx
pascal@12556 192 + xorw %bx,%bx
pascal@12556 193 + call read_sectors # update %bp
pascal@12556 194 + popw %bx
slaxemulator@8085 195 + popw %si
pascal@12556 196 + popw %cx # sectors to word count:
pascal@12556 197 + xchgb %cl, %ch # %cx <<= 8
slaxemulator@8085 198 + movb $0x87, %ah
pascal@12556 199 + pushw %ss
pascal@12556 200 + popw %es # restore es
slaxemulator@8085 201 + int $0x15 # max 16M
slaxemulator@8085 202 + popw %ax
slaxemulator@8085 203 + popf
slaxemulator@8085 204 + ja syslp
pascal@12556 205 + movw ramdisk_image+1,%ax
pascal@12556 206 + movw $ramdisk_size,%bx
slaxemulator@8085 207 + movb $9, %cl
pascal@12556 208 + cmpw %ax, bootsect_dst_base+1(%si)
slaxemulator@8085 209 + jb initrdlp
pascal@12556 210
pascal@12556 211 - .section ".bsdata", "a"
pascal@12556 212 -bugger_off_msg:
pascal@12556 213 - .ascii "Direct booting from floppy is no longer supported.\r\n"
pascal@12556 214 - .ascii "Please use a boot loader program instead.\r\n"
pascal@12556 215 - .ascii "\n"
pascal@12556 216 - .ascii "Remove disk and press any key to reboot . . .\r\n"
pascal@12556 217 - .byte 0
slaxemulator@8085 218 +# This procedure turns off the floppy drive motor, so
slaxemulator@8085 219 +# that we enter the kernel in a known state, and
slaxemulator@8085 220 +# don't have to worry about it later.
pascal@12556 221
pascal@12556 222 +kill_motor:
pascal@12556 223 + xchgw %ax, %di # reset FDC (%di < 128)
pascal@12556 224 + int $0x13
slaxemulator@8085 225 +
slaxemulator@8085 226 +# After that (everything loaded), we jump to the setup-routine
slaxemulator@8085 227 +# loaded directly after the bootblock:
slaxemulator@8085 228 +# Segments are as follows: %ds = %ss = INITSEG
slaxemulator@8085 229 +
slaxemulator@8085 230 + ljmp $SETUPSEG, $0
slaxemulator@8085 231 +
slaxemulator@8085 232 +# read_sectors reads %di sectors into %es:0 buffer.
slaxemulator@8085 233 +# %es:0 is updated to the next memory location.
slaxemulator@8085 234 +# First, sectors are read sector by sector until
slaxemulator@8085 235 +# sector per track count is known. Then they are
slaxemulator@8085 236 +# read track by track.
slaxemulator@8085 237 +# Assume no error on first track.
slaxemulator@8085 238 +
slaxemulator@8085 239 +#define FLOPPY_CYLINDERS 80 /* 80 cylinders minimum */
slaxemulator@8085 240 +#define FLOPPY_HEADS 2 /* 2 heads minimum */
slaxemulator@8085 241 +#define FLOPPY_SECTORS 18 /* 18 sectors minimum */
slaxemulator@8085 242 +
slaxemulator@8085 243 +print_loop:
slaxemulator@8085 244 + movb $0x6 + 'A' - 1, %al
slaxemulator@8085 245 + subb %cl, %al
slaxemulator@8085 246 + movw $regs, %si # caller %si is saved
pascal@12556 247 + call putcs # putc(%al) + puts(%si)
slaxemulator@8085 248 +# it will print out all of the registers.
slaxemulator@8085 249 + popw %bp # load word into %si
slaxemulator@8085 250 + jmp print_all # print %bp (status)
slaxemulator@8085 251 +check_limits:
slaxemulator@8085 252 + cmpb $FLOPPY_SECTORS+1, %cl # 18 sectors minimum
slaxemulator@8085 253 + jb check_head
slaxemulator@8085 254 + cmpb %al, %cl # max sector known ?
slaxemulator@8085 255 + ja next_head # no -> store it
slaxemulator@8085 256 +check_head:
slaxemulator@8085 257 + cmpb $FLOPPY_HEADS, %dh # 2 heads minimum
slaxemulator@8085 258 + jb check_cylinder
slaxemulator@8085 259 + cmpb %ah, %dh # max head known ?
slaxemulator@8085 260 + ja next_cylinder # no -> store it
slaxemulator@8085 261 +check_cylinder:
slaxemulator@8085 262 + pushaw
slaxemulator@8085 263 + cmpw $0x600,%bp # disk changed ?
slaxemulator@8085 264 + je reset_floppy
slaxemulator@8085 265 + pushw %es # print %es (named EX)
slaxemulator@8085 266 + pushw %dx # print %dx
slaxemulator@8085 267 + pushw %cx # print %cx
slaxemulator@8085 268 + pushw %bx # print %bx
slaxemulator@8085 269 + xchgw %ax, %si
slaxemulator@8085 270 + movb $2,%ah
slaxemulator@8085 271 + pushw %ax # print %ax
slaxemulator@8085 272 + movb $6,%cl
slaxemulator@8085 273 +print_all:
slaxemulator@8085 274 + movb $4, %ch # 4 hex digits
slaxemulator@8085 275 +print_digit:
slaxemulator@8085 276 + rolw $4, %bp # rotate to use low 4 bits
slaxemulator@8085 277 + movb $0x0f, %al
slaxemulator@8085 278 + andw %bp, %ax # %al = mask for nybble
slaxemulator@8085 279 + addb $0x90, %al # convert %al to ascii hex
slaxemulator@8085 280 + daa # in only four instructions!
slaxemulator@8085 281 + adcb $0x40, %al
slaxemulator@8085 282 + daa
slaxemulator@8085 283 + call putc # set %ah and %bx
slaxemulator@8085 284 + decb %ch
slaxemulator@8085 285 + jnz print_digit
slaxemulator@8085 286 + movb $0x20, %al # SPACE
pascal@12556 287 + int $0x10
slaxemulator@8085 288 + loop print_loop
slaxemulator@8085 289 + call wait
slaxemulator@8085 290 + cbw # %ah = 0
slaxemulator@8085 291 +reset_floppy:
slaxemulator@8085 292 + int $0x13 # reset controler
slaxemulator@8085 293 + popaw
slaxemulator@8085 294 +read_sectorslp:
slaxemulator@8085 295 + pushw %dx # some bios break dx...
slaxemulator@8085 296 + pushw %ax # limits
slaxemulator@8085 297 + subb %cl, %al # sectors remaining in track
slaxemulator@8085 298 + ja tolastsect
slaxemulator@8085 299 + movb $1, %al # 1 sector mini
slaxemulator@8085 300 +tolastsect:
slaxemulator@8085 301 + cbw
slaxemulator@8085 302 + cmpw %di, %ax
slaxemulator@8085 303 + jb more1trk
slaxemulator@8085 304 + movw %di, %ax # sectors to read
slaxemulator@8085 305 +more1trk:
slaxemulator@8085 306 + pushw %ax # save context
slaxemulator@8085 307 + movb $2, %ah # cmd: read chs
slaxemulator@8085 308 + int $0x13
slaxemulator@8085 309 + xchgw %ax, %bp # status
slaxemulator@8085 310 + popw %si # save %ax
slaxemulator@8085 311 + popw %ax # limits
slaxemulator@8085 312 + popw %dx
slaxemulator@8085 313 + jc check_limits
slaxemulator@8085 314 + xchgw %ax, %bp
slaxemulator@8085 315 +update_regs:
slaxemulator@8085 316 + incw %cx # next sector
pascal@12556 317 + movw %cx, %gs
slaxemulator@8085 318 + addb $2,%bh # next location
slaxemulator@8085 319 + decw %di # update sector counter
slaxemulator@8085 320 + jz putcdot
slaxemulator@8085 321 + decw %si
slaxemulator@8085 322 + jnz update_regs
slaxemulator@8085 323 +read_sectors:
pascal@12556 324 + movw %gs, %cx
pascal@12556 325 +# al is last sector+1
pascal@12556 326 +# ah is last cylinder+1
slaxemulator@8085 327 + xchgw %ax, %bp
slaxemulator@8085 328 + cmpb %al,%cl # reach sector limit ?
slaxemulator@8085 329 + jne bdendlp
slaxemulator@8085 330 +next_head:
slaxemulator@8085 331 + movb %cl,%al
slaxemulator@8085 332 + incb %dh # next head
slaxemulator@8085 333 + movb $1,%cl # first sector
slaxemulator@8085 334 + cmpb %ah, %dh # reach head limit ?
slaxemulator@8085 335 + jne bdendlp
slaxemulator@8085 336 +next_cylinder:
slaxemulator@8085 337 + movb %dh,%ah
slaxemulator@8085 338 +# NOTE : support 256 cylinders max
slaxemulator@8085 339 + incb %ch # next cylinder
pascal@12556 340 + cmpb $FLOPPY_CYLINDERS, %ch # reach cylinder limit ?
slaxemulator@8085 341 +read_first_sectors:
slaxemulator@8085 342 + movb $0,%dh # first head
pascal@12556 343 + jne bdendlp
slaxemulator@8085 344 +next_floppy:
slaxemulator@8085 345 + movb $0,%ch # first cylinder
slaxemulator@8085 346 + pushaw
slaxemulator@8085 347 + movw $swap_floppy,%si
slaxemulator@8085 348 + incb 12(%si)
slaxemulator@8085 349 + pushw %bx
pascal@12556 350 + call puts
slaxemulator@8085 351 + popw %bx
slaxemulator@8085 352 +waitfloppy:
slaxemulator@8085 353 + call wait
slaxemulator@8085 354 + jne waitfloppydone
slaxemulator@8085 355 + pushw %dx # some bios break dx...
slaxemulator@8085 356 + cbw
slaxemulator@8085 357 + int $0x13 # reset FDC
slaxemulator@8085 358 + movw $0x201,%ax
slaxemulator@8085 359 + int $0x13 # read first sector
slaxemulator@8085 360 + popw %dx
slaxemulator@8085 361 + rclb $1,%ah # floppy changed 06=>0D no error 00
slaxemulator@8085 362 + cmpb -2(%si), %ah # 0D then 00
slaxemulator@8085 363 + jne waitfloppy # no => try again
slaxemulator@8085 364 + incw %si
slaxemulator@8085 365 + orb %ah,%ah # was 00 ?
slaxemulator@8085 366 + jne waitfloppy
slaxemulator@8085 367 +waitfloppydone:
slaxemulator@8085 368 + popaw
slaxemulator@8085 369 +bdendlp:
slaxemulator@8085 370 + jmp read_sectorslp
slaxemulator@8085 371 +
slaxemulator@8085 372 +putcdot:
pascal@12556 373 +# REMOVE ME START
pascal@12556 374 +# pushw %ss
pascal@12556 375 +# popw %es
pascal@12556 376 +# REMOVE ME STOP
slaxemulator@8085 377 + movb $0x2e+3, %al # loading... message 2e = .
slaxemulator@8085 378 +putclf:
slaxemulator@8085 379 + subb $3, %al
slaxemulator@8085 380 +putc:
slaxemulator@8085 381 + movb $0xe, %ah
slaxemulator@8085 382 + movw $7, %bx # one dot each 64k
slaxemulator@8085 383 + int $0x10
slaxemulator@8085 384 + cmp $0xd, %al # CR ?
slaxemulator@8085 385 + je putclf
slaxemulator@8085 386 + ret
slaxemulator@8085 387 +
pascal@12556 388 +puts:
slaxemulator@8085 389 + movb $0xd, %al # CR
slaxemulator@8085 390 +putcs:
slaxemulator@8085 391 + call putc
slaxemulator@8085 392 + lodsb
slaxemulator@8085 393 + orb %al,%al # end of string is \0
slaxemulator@8085 394 + jnz putcs
slaxemulator@8085 395 + ret
slaxemulator@8085 396 +
slaxemulator@8085 397 +clock = 0x46C
slaxemulator@8085 398 +wait:
slaxemulator@8085 399 +wait4key:
slaxemulator@8085 400 + movw $clock, %di
slaxemulator@8085 401 +#define DELAY 5
slaxemulator@8085 402 + movb $(DELAY*182)/10,%cl
pascal@12556 403 + addb %fs:(%di),%cl
slaxemulator@8085 404 +waitkbd:
slaxemulator@8085 405 + movw $0x10D, %ax # test keyboard, timeout => CR
pascal@12556 406 + cmpb %fs:(%di),%cl
slaxemulator@8085 407 + je waitdone
pascal@12556 408 + int $0x16
slaxemulator@8085 409 + jz waitkbd
slaxemulator@8085 410 + cbw
slaxemulator@8085 411 + int $0x16 # eat char
pascal@12556 412 + movw %di, %fs # disable timeout
slaxemulator@8085 413 + incw %di # clear Z
slaxemulator@8085 414 +waitdone:
slaxemulator@8085 415 + ret
pascal@12556 416 +
pascal@12556 417 +regs: .asciz "X:"
pascal@12556 418 +
slaxemulator@8085 419 +swap_floppy: .ascii "Insert disk 1"
slaxemulator@8085 420 + .byte 7,13,0
slaxemulator@8085 421
slaxemulator@8085 422 # Kernel attributes; used by setup. This is part 1 of the
slaxemulator@8085 423 # header, from the old boot sector.