2020-12-26 22:21:04 +00:00
|
|
|
# Code for the first 2 disk sectors, that all programs in this directory need:
|
|
|
|
# - load sectors past the first (using BIOS primitives) since only the first is available by default
|
|
|
|
# - if this fails, print 'D' at top-left of screen and halt
|
|
|
|
# - initialize a minimal graphics mode
|
|
|
|
# - switch to 32-bit mode (giving up access to BIOS primitives)
|
|
|
|
# - set up a handler for keyboard events
|
|
|
|
# - jump to start of program
|
|
|
|
#
|
|
|
|
# To convert to a disk image, first prepare a realistically sized disk image:
|
|
|
|
# dd if=/dev/zero of=disk.img count=20160 # 512-byte sectors, so 10MB
|
|
|
|
# Create initial sectors from this file:
|
|
|
|
# ./bootstrap run apps/hex < baremetal/boot.hex > boot.bin
|
|
|
|
# Translate other sectors into a file called a.img
|
|
|
|
# Load all sectors into the disk image:
|
|
|
|
# cat boot.bin a.img > disk.bin
|
|
|
|
# dd if=disk.bin of=disk.img conv=notrunc
|
|
|
|
# To run:
|
|
|
|
# qemu-system-i386 disk.img
|
|
|
|
# Or:
|
|
|
|
# bochs -f apps/boot.bochsrc # boot.bochsrc loads disk.img
|
|
|
|
#
|
|
|
|
# Since we start out in 16-bit mode, we need instructions SubX doesn't
|
|
|
|
# support.
|
|
|
|
# This file contains just lowercase hex bytes and comments. Zero
|
|
|
|
# error-checking. Make liberal use of:
|
|
|
|
# - comments documenting expected offsets
|
|
|
|
# - size checks on the emitted file (currently: 512 bytes)
|
|
|
|
# - xxd to eyeball that offsets contain expected bytes
|
|
|
|
#
|
|
|
|
# Programs using this initialization:
|
|
|
|
# - can't use any syscalls
|
|
|
|
# - can't print text to video memory (past these boot sectors)
|
2020-12-27 16:33:22 +00:00
|
|
|
# - must only print raw pixels (256 colors) to video memory (resolution 1024x768)
|
2020-12-27 06:33:48 +00:00
|
|
|
# - must store their entry-point at address 0x8800
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
## 16-bit entry point
|
|
|
|
|
|
|
|
# Upon reset, the IBM PC:
|
2020-12-27 04:26:11 +00:00
|
|
|
# - loads the first sector (512 bytes)
|
|
|
|
# from some bootable image (see the boot sector marker at the end of this file)
|
|
|
|
# to the address range [0x7c00, 0x7e00)
|
|
|
|
# - starts executing code at address 0x7c00
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# offset 00 (address 0x7c00):
|
|
|
|
# disable interrupts for this initialization
|
|
|
|
fa # cli
|
|
|
|
|
|
|
|
# initialize segment registers
|
|
|
|
# this isn't always needed, but the recommendation is to not make assumptions
|
|
|
|
b8 00 00 # ax <- 0
|
|
|
|
8e d8 # ds <- ax
|
|
|
|
8e d0 # ss <- ax
|
|
|
|
8e c0 # es <- ax
|
|
|
|
8e e0 # fs <- ax
|
|
|
|
8e e8 # gs <- ax
|
|
|
|
|
|
|
|
# We don't read or write the stack before we get to 32-bit mode. No function
|
|
|
|
# calls, so we don't need to initialize the stack.
|
|
|
|
|
|
|
|
# 0e:
|
|
|
|
# load second sector from disk
|
|
|
|
b4 02 # ah <- 2 # read sectors from disk
|
|
|
|
# dl comes conveniently initialized at boot time with the index of the device being booted
|
|
|
|
b5 00 # ch <- 0 # cylinder 0
|
|
|
|
b6 00 # dh <- 0 # track 0
|
|
|
|
b1 02 # cl <- 2 # second sector, 1-based
|
2020-12-27 06:33:48 +00:00
|
|
|
b0 10 # al <- 16 # number of sectors to read; all sectors must be in a single track
|
2020-12-26 22:21:04 +00:00
|
|
|
# address to write sectors to = es:bx = 0x7e00, contiguous with boot segment
|
|
|
|
bb 00 00 # bx <- 0
|
|
|
|
8e c3 # es <- bx
|
|
|
|
bb 00 7e # bx <- 0x7e00
|
|
|
|
cd 13 # int 13h, BIOS disk service
|
2020-12-28 07:01:14 +00:00
|
|
|
0f 82 8a 00 # jump-if-carry disk-error
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# 26:
|
|
|
|
# undo the A20 hack: https://en.wikipedia.org/wiki/A20_line
|
|
|
|
# this is from https://github.com/mit-pdos/xv6-public/blob/master/bootasm.S
|
|
|
|
# seta20.1:
|
|
|
|
e4 64 # al <- port 0x64
|
|
|
|
a8 02 # set zf if bit 1 (second-least significant) is not set
|
|
|
|
75 fa # if zf not set, goto seta20.1 (-6)
|
|
|
|
|
|
|
|
b0 d1 # al <- 0xd1
|
|
|
|
e6 64 # port 0x64 <- al
|
|
|
|
|
|
|
|
# 30:
|
|
|
|
# seta20.2:
|
|
|
|
e4 64 # al <- port 0x64
|
|
|
|
a8 02 # set zf if bit 1 (second-least significant) is not set
|
|
|
|
75 fa # if zf not set, goto seta20.2 (-6)
|
|
|
|
|
|
|
|
b0 df # al <- 0xdf
|
|
|
|
e6 64 # port 0x64 <- al
|
|
|
|
|
|
|
|
# 3a:
|
|
|
|
# adjust video mode
|
|
|
|
b4 4f # ah <- 4f (VBE)
|
|
|
|
b0 02 # al <- 02 (set video mode)
|
2020-12-27 16:33:22 +00:00
|
|
|
bb 05 41 # bx <- 0x0105 (graphics 1024x768x256
|
2020-12-27 06:01:45 +00:00
|
|
|
# 0x4000 bit = configure linear frame buffer in Bochs emulator; hopefully this doesn't hurt anything when running natively)
|
2020-12-27 07:45:37 +00:00
|
|
|
# fallback mode: 0x0101 (640x480x256)
|
2020-12-26 22:21:04 +00:00
|
|
|
cd 10 # int 10h, Vesa BIOS extensions
|
|
|
|
|
|
|
|
# 43:
|
2020-12-27 05:21:07 +00:00
|
|
|
# load information for the (hopefully) current video mode
|
|
|
|
# mostly just for the address to the linear frame buffer
|
|
|
|
b4 4f # ah <- 4f (VBE)
|
|
|
|
b0 01 # al <- 01 (get video mode)
|
2020-12-28 06:38:07 +00:00
|
|
|
b9 07 01 # cx <- 0x0107 (mode we requested)
|
2020-12-28 06:52:39 +00:00
|
|
|
bf 00 7f # di <- 0x7f00 (video mode info)
|
2020-12-27 05:21:07 +00:00
|
|
|
cd 10
|
|
|
|
|
2020-12-28 06:38:07 +00:00
|
|
|
# 4f:
|
2020-12-26 22:21:04 +00:00
|
|
|
# switch to 32-bit mode
|
|
|
|
0f 01 16 # lgdt 00/mod/indirect 010/subop 110/rm/use-disp16
|
2020-12-27 05:04:46 +00:00
|
|
|
a0 7c # *gdt_descriptor
|
2020-12-26 22:21:04 +00:00
|
|
|
0f 20 c0 # eax <- cr0
|
|
|
|
66 83 c8 01 # eax <- or 0x1
|
|
|
|
0f 22 c0 # cr0 <- eax
|
2020-12-27 05:04:46 +00:00
|
|
|
ea e0 7c 08 00 # far jump to initialize_32bit_mode after setting cs to the record at offset 8 in the gdt (gdt_code)
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# padding
|
2020-12-28 06:38:07 +00:00
|
|
|
# 63:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00
|
2020-12-27 05:04:46 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
## GDT: 3 records of 8 bytes each
|
|
|
|
|
2020-12-27 05:04:46 +00:00
|
|
|
# 80:
|
2020-12-26 22:21:04 +00:00
|
|
|
# gdt_start:
|
|
|
|
# gdt_null: mandatory null descriptor
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
# gdt_code: (offset 8 from gdt_start)
|
|
|
|
ff ff # limit[0:16]
|
|
|
|
00 00 00 # base[0:24]
|
|
|
|
9a # 1/present 00/privilege 1/descriptor type = 1001b
|
|
|
|
# 1/code 0/conforming 1/readable 0/accessed = 1010b
|
|
|
|
cf # 1/granularity 1/32-bit 0/64-bit-segment 0/AVL = 1100b
|
|
|
|
# limit[16:20] = 1111b
|
|
|
|
00 # base[24:32]
|
|
|
|
# gdt_data: (offset 16 from gdt_start)
|
|
|
|
ff ff # limit[0:16]
|
|
|
|
00 00 00 # base[0:24]
|
|
|
|
92 # 1/present 00/privilege 1/descriptor type = 1001b
|
|
|
|
# 0/data 0/conforming 1/readable 0/accessed = 0010b
|
|
|
|
cf # same as gdt_code
|
|
|
|
00 # base[24:32]
|
|
|
|
# gdt_end:
|
|
|
|
|
|
|
|
# padding
|
2020-12-27 05:04:46 +00:00
|
|
|
# 98:
|
2020-12-26 22:21:04 +00:00
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
|
2020-12-27 05:04:46 +00:00
|
|
|
# a0:
|
2020-12-26 22:21:04 +00:00
|
|
|
# gdt_descriptor:
|
|
|
|
17 00 # final index of gdt = gdt_end - gdt_start - 1
|
2020-12-27 05:04:46 +00:00
|
|
|
80 7c 00 00 # start = gdt_start
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# padding
|
2020-12-27 05:04:46 +00:00
|
|
|
# a5:
|
2020-12-26 22:21:04 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
2020-12-27 05:04:46 +00:00
|
|
|
# b0:
|
2020-12-26 22:21:04 +00:00
|
|
|
# disk_error:
|
|
|
|
# print 'D' to top-left of screen to indicate disk error
|
|
|
|
# *0xb8000 <- 0x0f44
|
|
|
|
# bx <- 0xb800
|
|
|
|
bb 00 b8
|
|
|
|
# ds <- bx
|
|
|
|
8e db # 11b/mod 011b/reg/ds 011b/rm/bx
|
|
|
|
# al <- 'D'
|
|
|
|
b0 44
|
|
|
|
# ah <- 0x0f # white on black
|
|
|
|
b4 0f
|
|
|
|
# bx <- 0
|
|
|
|
bb 00 00
|
|
|
|
# *ds:bx <- ax
|
|
|
|
89 07 # 00b/mod/indirect 000b/reg/ax 111b/rm/bx
|
|
|
|
|
|
|
|
e9 fb ff # loop forever
|
|
|
|
|
|
|
|
# padding
|
2020-12-27 05:04:46 +00:00
|
|
|
# c1:
|
2020-12-26 22:21:04 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
## 32-bit code from this point (still some instructions not in SubX)
|
|
|
|
|
2020-12-27 05:04:46 +00:00
|
|
|
# e0:
|
2020-12-26 22:21:04 +00:00
|
|
|
# initialize_32bit_mode:
|
|
|
|
66 b8 10 00 # ax <- offset 16 from gdt_start
|
|
|
|
8e d8 # ds <- ax
|
|
|
|
8e d0 # ss <- ax
|
|
|
|
8e c0 # es <- ax
|
|
|
|
8e e0 # fs <- ax
|
|
|
|
8e e8 # gs <- ax
|
|
|
|
|
|
|
|
# load interrupt handlers
|
|
|
|
0f 01 1d # lidt 00/mod/indirect 011/subop 101/rm32/use-disp32
|
2020-12-28 06:52:39 +00:00
|
|
|
f8 7d 00 00 # *idt_descriptor
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# enable keyboard IRQ
|
|
|
|
b0 fd # al <- 0xfd # enable just IRQ1
|
|
|
|
e6 21 # port 0x21 <- al
|
|
|
|
|
|
|
|
# initialization is done; enable interrupts
|
|
|
|
fb
|
2020-12-27 06:33:48 +00:00
|
|
|
e9 01 0b 00 00 # jump to 0x8800
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# padding
|
2020-12-27 05:04:46 +00:00
|
|
|
# ff:
|
2020-12-26 22:21:04 +00:00
|
|
|
00
|
|
|
|
|
|
|
|
# 100:
|
|
|
|
# null interrupt handler:
|
|
|
|
cf # iret
|
|
|
|
|
|
|
|
# padding
|
|
|
|
# 101:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# 110:
|
|
|
|
# keyboard interrupt handler:
|
|
|
|
# prologue
|
|
|
|
fa # disable interrupts
|
|
|
|
60 # push all registers to stack
|
|
|
|
# acknowledge interrupt
|
|
|
|
b0 20 # al <- 0x20
|
|
|
|
e6 20 # port 0x20 <- al
|
|
|
|
# TODO: perhaps we should check keyboard status
|
|
|
|
# read keycode into eax
|
|
|
|
31 c0 # eax <- xor eax; 11/direct 000/r32/eax 000/rm32/eax
|
|
|
|
e4 60 # al <- port 0x60
|
2020-12-27 07:38:52 +00:00
|
|
|
# eax <- *(keyboard normal map + eax)
|
|
|
|
8a # copy m8 at rm32 to r8
|
|
|
|
80 # 10/*+disp32 000/r8/al 000/rm32/eax
|
|
|
|
00 80 00 00 # disp32
|
|
|
|
# store eax in 'keyboard buffer'
|
2020-12-28 05:09:22 +00:00
|
|
|
89 # copy r32 to rm32
|
2020-12-27 07:38:52 +00:00
|
|
|
05 # 00/indirect 000/r32/eax 101/rm32/use-disp32
|
2020-12-28 06:33:47 +00:00
|
|
|
30 7d 00 00 # disp32
|
2020-12-26 22:21:04 +00:00
|
|
|
# epilogue
|
|
|
|
61 # pop all registers
|
|
|
|
fb # enable interrupts
|
|
|
|
cf # iret
|
|
|
|
|
|
|
|
# padding
|
2020-12-27 07:38:52 +00:00
|
|
|
# 129:
|
|
|
|
00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# 130:
|
|
|
|
# keyboard buffer
|
|
|
|
00 00 00 00
|
|
|
|
|
|
|
|
# padding
|
|
|
|
# 134:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00
|
2020-12-26 22:21:04 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
2020-12-28 06:52:39 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
2020-12-26 22:21:04 +00:00
|
|
|
|
2020-12-28 06:52:39 +00:00
|
|
|
# 1f8:
|
|
|
|
# idt_descriptor:
|
|
|
|
ff 00 # idt_end - idt_start - 1
|
|
|
|
00 7e 00 00 # start = idt_start
|
|
|
|
|
|
|
|
# 1fe:
|
2020-12-26 22:21:04 +00:00
|
|
|
# final 2 bytes of boot sector
|
|
|
|
55 aa
|
|
|
|
|
|
|
|
## sector 2
|
|
|
|
# loaded by load_disk, not automatically on boot
|
|
|
|
|
|
|
|
# offset 200 (address 0x7e00): interrupt descriptor table
|
|
|
|
# 32 entries * 8 bytes each = 256 bytes (0x100)
|
|
|
|
# idt_start:
|
|
|
|
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# entry 8: clock
|
|
|
|
00 7d # target[0:16] = null interrupt handler
|
|
|
|
08 00 # segment selector (gdt_code)
|
|
|
|
00 # unused
|
|
|
|
8e # 1/p 00/dpl 0 1110/type/32-bit-interrupt-gate
|
|
|
|
00 00 # target[16:32]
|
|
|
|
|
|
|
|
# entry 9: keyboard
|
|
|
|
10 7d # target[0:16] = keyboard interrupt handler
|
|
|
|
08 00 # segment selector (gdt_code)
|
|
|
|
00 # unused
|
|
|
|
8e # 1/p 00/dpl 0 1110/type/32-bit-interrupt-gate
|
|
|
|
00 00 # target[16:32]
|
|
|
|
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00
|
|
|
|
# idt_end:
|
|
|
|
|
|
|
|
# offset 300 (address 0x7f00):
|
2020-12-28 06:52:39 +00:00
|
|
|
# video mode info:
|
|
|
|
00 00 # attributes
|
|
|
|
00 # winA
|
|
|
|
00 # winB
|
|
|
|
# 304
|
|
|
|
00 00 # granularity
|
|
|
|
00 00 # winsize
|
|
|
|
# 308
|
|
|
|
00 00 # segmentA
|
|
|
|
00 00 # segmentB
|
|
|
|
# 30c
|
|
|
|
00 00 00 00 # realFctPtr (who knows)
|
|
|
|
# 310
|
|
|
|
00 00 # pitch
|
|
|
|
00 00 # Xres
|
|
|
|
# 314
|
|
|
|
00 00 # Yres
|
|
|
|
00 00 # Wchar Ychar
|
|
|
|
# 318
|
|
|
|
00 # planes
|
|
|
|
00 # bpp
|
|
|
|
00 # banks
|
|
|
|
00 # memory_model
|
|
|
|
# 31c
|
|
|
|
00 # bank_size
|
|
|
|
00 # image_pages
|
|
|
|
00 # reserved
|
|
|
|
# 31f
|
|
|
|
00 00 # red_mask red_position
|
|
|
|
00 00 # green_mask green_position
|
|
|
|
00 00 # blue_mask blue_position
|
|
|
|
00 00 # rsv_mask rsv_position
|
|
|
|
00 # directcolor_attributes
|
|
|
|
# 328
|
|
|
|
00 00 00 00 # physbase <== linear frame buffer
|
2020-12-26 22:21:04 +00:00
|
|
|
|
2020-12-28 06:52:39 +00:00
|
|
|
# 32c
|
|
|
|
# reserved for video mode info
|
|
|
|
00 00 00 00
|
2020-12-26 22:21:04 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
2020-12-27 06:33:48 +00:00
|
|
|
|
|
|
|
# offset 400 (address 0x8000):
|
|
|
|
# keyboard normal map:
|
2020-12-27 07:38:52 +00:00
|
|
|
00
|
|
|
|
# es
|
|
|
|
1b
|
|
|
|
# |<--- digits -------------->| - = bs
|
|
|
|
31 32 33 34 35 36 37 38 39 30 2d 3d 08
|
|
|
|
# offset 40f
|
|
|
|
# tb q w e r t y u i o p [ ]
|
|
|
|
09 71 77 65 72 74 79 75 69 6f 70 5b 5d
|
|
|
|
# offset 41c
|
|
|
|
# enter
|
|
|
|
0a 00
|
|
|
|
# offset 41e
|
|
|
|
# a s d f g h j k l ; ' ` \
|
|
|
|
61 73 64 66 67 68 6a 6b 6c 3b 27 60 00 5c
|
|
|
|
# offset 42c
|
|
|
|
# z x c v b n m , . /
|
|
|
|
7a 78 63 76 62 6e 6d 2c 2e 2f
|
|
|
|
# offset 436
|
|
|
|
00 00 00 00 00 00 00 00 00 00
|
2020-12-27 06:33:48 +00:00
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# 500:
|
|
|
|
# keyboard shift map:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# 600:
|
|
|
|
# keyboard ctrl map:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# padding (there might be more keyboard tables)
|
|
|
|
# 700:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
|
|
|
|
# 800:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
# a00:
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
|
|
# offset c00 (address 0x8800)
|
2020-12-26 22:21:04 +00:00
|
|
|
|
|
|
|
# vim:ft=subx
|