aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-10-20 14:31:37 +0200
committerBad Diode <bd@badd10de.dev>2022-10-20 14:31:37 +0200
commitbc14ac83a5ad898aafd312e4d5f8fe8f43c60b0f (patch)
treed2f01bb2cd1ce28e2908fada710e3be4971d1e94
parent42dcdb3a98a957974225b5f699c02891db176c55 (diff)
downloaduxn64-bc14ac83a5ad898aafd312e4d5f8fe8f43c60b0f.tar.gz
uxn64-bc14ac83a5ad898aafd312e4d5f8fe8f43c60b0f.zip
Replace makemask with custom C code
-rw-r--r--Makefile23
-rw-r--r--tools/makerom/Makefile62
-rw-r--r--tools/makerom/src/bootdata.c506
-rw-r--r--tools/makerom/src/main.c188
-rw-r--r--tools/makerom/src/types.h30
5 files changed, 800 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index f69dd8d..57e7ceb 100644
--- a/Makefile
+++ b/Makefile
@@ -32,10 +32,12 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS))
32# Output names and executables. 32# Output names and executables.
33TARGET := uxn64 33TARGET := uxn64
34ELF := $(BUILD_DIR)/$(TARGET).elf 34ELF := $(BUILD_DIR)/$(TARGET).elf
35BIN := $(BUILD_DIR)/$(TARGET).n64 35BIN := $(BUILD_DIR)/$(TARGET).bin
36ROM := $(BUILD_DIR)/$(TARGET).n64
36 37
37# Target tools. 38# Target tools.
38TOOLS_BIN2CARR := tools/bin2carr/build/bin2carr 39TOOLS_BIN2CARR := tools/bin2carr/build/bin2carr
40TOOLS_MAKEROM := tools/makerom/build/makerom
39 41
40# Main compilation tool paths. 42# Main compilation tool paths.
41CC := $(SDK_BIN)/mips32-elf-gcc 43CC := $(SDK_BIN)/mips32-elf-gcc
@@ -43,8 +45,6 @@ LD := $(SDK_BIN)/mips32-elf-ld
43AS := $(SDK_BIN)/mips32-elf-as 45AS := $(SDK_BIN)/mips32-elf-as
44OBJDUMP := $(SDK_BIN)/mips32-elf-objdump 46OBJDUMP := $(SDK_BIN)/mips32-elf-objdump
45OBJCOPY := $(SDK_BIN)/mips32-elf-objcopy 47OBJCOPY := $(SDK_BIN)/mips32-elf-objcopy
46# TODO: Replace with internal tools to avoid dependencies.
47MAKEMASK := $(SDK_BIN)/makemask
48 48
49# Compiler and linker configuration. 49# Compiler and linker configuration.
50CFLAGS := -Wall -Wextra -pedantic 50CFLAGS := -Wall -Wextra -pedantic
@@ -65,16 +65,18 @@ else
65 CFLAGS += $(RELEASE_CFLAGS) 65 CFLAGS += $(RELEASE_CFLAGS)
66endif 66endif
67 67
68main: $(BIN) 68main: $(ROM)
69 69
70# Compile the elf file. 70# Compile the elf file.
71$(ELF): $(SRC_MAIN) $(UXN_ROM_C) $(WATCH_SRC) | $(BUILD_DIR) 71$(ELF): $(SRC_MAIN) $(UXN_ROM_C) $(WATCH_SRC) | $(BUILD_DIR)
72 $(CC) $(CFLAGS) $(LDFLAGS) -o $(ELF) -T $(SRC_LN) $(SRC_MAIN) $(LDLIBS) 72 $(CC) $(CFLAGS) $(LDFLAGS) -o $(ELF) -T $(SRC_LN) $(SRC_MAIN) $(LDLIBS)
73 73
74# Create the valid .n64 rom from the elf file. 74# Create the valid .n64 rom from the elf file.
75$(BIN): $(ELF) $(OBJECTS) $(WATCH_SRC) | $(BUILD_DIR) 75$(BIN): $(ELF) $(WATCH_SRC) | $(BUILD_DIR)
76 $(OBJCOPY) -O binary $< $@ 76 $(OBJCOPY) -O binary $(ELF) $(BIN)
77 $(MAKEMASK) $(BIN) 77
78$(ROM): $(BIN) $(TOOLS_MAKEROM) $(WATCH_SRC) | $(BUILD_DIR)
79 $(TOOLS_MAKEROM) $(BIN) -o $(ROM)
78 80
79# Build the uxn rom's C file. 81# Build the uxn rom's C file.
80$(UXN_ROM_C): $(TOOLS_BIN2CARR) | $(BUILD_DIR) 82$(UXN_ROM_C): $(TOOLS_BIN2CARR) | $(BUILD_DIR)
@@ -84,9 +86,12 @@ $(UXN_ROM_C): $(TOOLS_BIN2CARR) | $(BUILD_DIR)
84$(TOOLS_BIN2CARR): 86$(TOOLS_BIN2CARR):
85 make -C tools/bin2carr 87 make -C tools/bin2carr
86 88
89$(TOOLS_MAKEROM):
90 make -C tools/makerom
91
87# Test the output .n64 in an emulator. 92# Test the output .n64 in an emulator.
88run: $(BIN) 93run: $(ROM)
89 $(EMULATOR) $(BIN) 94 $(EMULATOR) $(ROM)
90 95
91# Remove build directory. 96# Remove build directory.
92clean: 97clean:
diff --git a/tools/makerom/Makefile b/tools/makerom/Makefile
new file mode 100644
index 0000000..2f520aa
--- /dev/null
+++ b/tools/makerom/Makefile
@@ -0,0 +1,62 @@
1.POSIX:
2.SUFFIXES:
3.PHONY: main run clean
4
5# Source code location and files to watch for changes.
6SRC_DIR := src
7BUILD_DIR := build
8SRC_MAIN := $(SRC_DIR)/main.c
9SRC_OBJ :=
10OBJECTS := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRC_OBJ))
11WATCH_SRC := $(shell find $(SRC_DIR) -name "*.c" -or -name "*.s" -or -name "*.h")
12INC_DIRS := $(shell find $(SRC_DIR) -type d)
13INC_FLAGS := $(addprefix -I,$(INC_DIRS))
14
15# Output names and executables.
16TARGET := makerom
17BIN := $(BUILD_DIR)/$(TARGET)
18
19# Main compilation tool paths.
20CC := gcc
21LD := ld
22AS := as
23OBJDUMP := objdump
24
25# Compiler and linker configuration.
26CFLAGS := -Wall -Wextra -pedantic
27CFLAGS += -DBIN_NAME=\"$(TARGET)\"
28CFLAGS += $(INC_FLAGS)
29LDFLAGS :=
30LDLIBS :=
31RELEASE_CFLAGS := -O2 -DNDEBUG
32DEBUG_CFLAGS := -O0 -DDEBUG -g
33
34# Setup debug/release builds.
35DEBUG ?= 0
36ifeq ($(DEBUG), 1)
37 CFLAGS += $(DEBUG_CFLAGS)
38else
39 CFLAGS += $(RELEASE_CFLAGS)
40endif
41
42main: $(BIN)
43
44# Compile and link everything in one go.
45$(BIN): $(SRC_MAIN) $(OBJECTS) $(WATCH_SRC) | $(BUILD_DIR)
46 $(CC) $(CFLAGS) $(LDFLAGS) -o $(BIN) $(SRC_MAIN) $(OBJECTS) $(LDLIBS)
47
48# Run the program
49run: $(BIN)
50 ./$(BIN)
51
52# Remove build directory.
53clean:
54 rm -rf $(BUILD_DIR)
55
56# Create the build directory.
57$(BUILD_DIR):
58 mkdir -p $(BUILD_DIR)
59
60# Inference rules for C files.
61$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
62 $(CC) $(CFLAGS) $< -o $@
diff --git a/tools/makerom/src/bootdata.c b/tools/makerom/src/bootdata.c
new file mode 100644
index 0000000..c6f99af
--- /dev/null
+++ b/tools/makerom/src/bootdata.c
@@ -0,0 +1,506 @@
1const u8 bootdata[] = {
2 0x40, 0x80, 0x68, 0x00, 0x40, 0x80, 0x48, 0x00,
3 0x40, 0x80, 0x58, 0x00, 0x3c, 0x08, 0xa4, 0x70,
4 0x25, 0x08, 0x00, 0x00, 0x8d, 0x09, 0x00, 0x0c,
5 0x15, 0x20, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00,
6 0x27, 0xbd, 0xff, 0xe8, 0xaf, 0xb3, 0x00, 0x00,
7 0xaf, 0xb4, 0x00, 0x04, 0xaf, 0xb5, 0x00, 0x08,
8 0xaf, 0xb6, 0x00, 0x0c, 0xaf, 0xb7, 0x00, 0x10,
9 0x3c, 0x08, 0xa4, 0x70, 0x25, 0x08, 0x00, 0x00,
10 0x3c, 0x0a, 0xa3, 0xf8, 0x3c, 0x0b, 0xa3, 0xf0,
11 0x3c, 0x0c, 0xa4, 0x30, 0x25, 0x8c, 0x00, 0x00,
12 0x34, 0x09, 0x00, 0x40, 0xad, 0x09, 0x00, 0x04,
13 0x24, 0x11, 0x1f, 0x40, 0x00, 0x00, 0x00, 0x00,
14 0x22, 0x31, 0xff, 0xff, 0x16, 0x20, 0xff, 0xfd,
15 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x08,
16 0x34, 0x09, 0x00, 0x14, 0xad, 0x09, 0x00, 0x0c,
17 0xad, 0x00, 0x00, 0x00, 0x24, 0x11, 0x00, 0x04,
18 0x00, 0x00, 0x00, 0x00, 0x22, 0x31, 0xff, 0xff,
19 0x16, 0x20, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00,
20 0x34, 0x09, 0x00, 0x0e, 0xad, 0x09, 0x00, 0x00,
21 0x24, 0x11, 0x00, 0x20, 0x22, 0x31, 0xff, 0xff,
22 0x16, 0x20, 0xff, 0xfe, 0x34, 0x09, 0x01, 0x0f,
23 0xad, 0x89, 0x00, 0x00, 0x3c, 0x09, 0x18, 0x08,
24 0x35, 0x29, 0x28, 0x38, 0xad, 0x49, 0x00, 0x08,
25 0xad, 0x40, 0x00, 0x14, 0x3c, 0x09, 0x80, 0x00,
26 0xad, 0x49, 0x00, 0x04, 0x00, 0x00, 0x68, 0x25,
27 0x00, 0x00, 0x70, 0x25, 0x3c, 0x0f, 0xa3, 0xf0,
28 0x00, 0x00, 0xc0, 0x25, 0x3c, 0x19, 0xa3, 0xf0,
29 0x3c, 0x16, 0xa0, 0x00, 0x00, 0x00, 0xb8, 0x25,
30 0x3c, 0x06, 0xa3, 0xf0, 0x3c, 0x07, 0xa0, 0x00,
31 0x00, 0x00, 0x90, 0x25, 0x3c, 0x14, 0xa0, 0x00,
32 0x27, 0xbd, 0xff, 0xb8, 0x03, 0xa0, 0xf0, 0x25,
33 0x3c, 0x10, 0xa4, 0x30, 0x8e, 0x10, 0x00, 0x04,
34 0x3c, 0x11, 0x01, 0x01, 0x26, 0x31, 0x01, 0x01,
35 0x16, 0x11, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
36 0x24, 0x10, 0x02, 0x00, 0x35, 0x71, 0x40, 0x00,
37 0x10, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
38 0x24, 0x10, 0x04, 0x00, 0x35, 0x71, 0x80, 0x00,
39 0xae, 0x2e, 0x00, 0x04, 0x25, 0xf5, 0x00, 0x0c,
40 0x0d, 0x00, 0x01, 0xde, 0x00, 0x00, 0x00, 0x00,
41 0x10, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
42 0xaf, 0xa2, 0x00, 0x00, 0x24, 0x09, 0x20, 0x00,
43 0xad, 0x89, 0x00, 0x00, 0x8d, 0xeb, 0x00, 0x00,
44 0x3c, 0x08, 0xf0, 0xff, 0x01, 0x68, 0x58, 0x24,
45 0xaf, 0xab, 0x00, 0x04, 0x23, 0xbd, 0x00, 0x08,
46 0x24, 0x09, 0x10, 0x00, 0xad, 0x89, 0x00, 0x00,
47 0x3c, 0x08, 0xb0, 0x19, 0x15, 0x68, 0x00, 0x0c,
48 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0x08, 0x00,
49 0x03, 0x08, 0xc0, 0x20, 0x03, 0x30, 0xc8, 0x20,
50 0x03, 0x30, 0xc8, 0x20, 0x3c, 0x08, 0x00, 0x20,
51 0x02, 0xc8, 0xb0, 0x20, 0x02, 0x88, 0xa0, 0x20,
52 0x00, 0x12, 0x90, 0x40, 0x22, 0x52, 0x00, 0x01,
53 0x10, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
54 0x3c, 0x08, 0x00, 0x10, 0x02, 0x88, 0xa0, 0x20,
55 0x24, 0x08, 0x20, 0x00, 0xad, 0x88, 0x00, 0x00,
56 0x8d, 0xe9, 0x00, 0x24, 0x8d, 0xfa, 0x00, 0x00,
57 0x24, 0x08, 0x10, 0x00, 0xad, 0x88, 0x00, 0x00,
58 0x31, 0x29, 0xff, 0xff, 0x24, 0x08, 0x05, 0x00,
59 0x15, 0x28, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
60 0x3c, 0x1b, 0x01, 0x00, 0x03, 0x5b, 0xd0, 0x24,
61 0x17, 0x40, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
62 0x3c, 0x08, 0x10, 0x1c, 0x35, 0x08, 0x0a, 0x04,
63 0xad, 0xe8, 0x00, 0x18, 0x10, 0x00, 0x00, 0x03,
64 0x3c, 0x08, 0x08, 0x0c, 0x35, 0x08, 0x12, 0x04,
65 0xad, 0xe8, 0x00, 0x18, 0x3c, 0x08, 0x08, 0x00,
66 0x01, 0xc8, 0x70, 0x20, 0x01, 0xf0, 0x78, 0x20,
67 0x01, 0xf0, 0x78, 0x20, 0x25, 0xad, 0x00, 0x01,
68 0x2d, 0xa8, 0x00, 0x08, 0x15, 0x00, 0xff, 0xc4,
69 0x00, 0x00, 0x00, 0x00, 0x3c, 0x08, 0xc4, 0x00,
70 0xad, 0x48, 0x00, 0x0c, 0x3c, 0x08, 0x80, 0x00,
71 0xad, 0x48, 0x00, 0x04, 0x03, 0xc0, 0xe8, 0x25,
72 0x00, 0x00, 0x18, 0x25, 0x8f, 0xa9, 0x00, 0x04,
73 0x3c, 0x08, 0xb0, 0x09, 0x15, 0x28, 0x00, 0x16,
74 0x00, 0x00, 0x00, 0x00, 0xae, 0x38, 0x00, 0x04,
75 0x27, 0x35, 0x00, 0x0c, 0x8f, 0xa4, 0x00, 0x00,
76 0x23, 0xbd, 0x00, 0x08, 0x24, 0x05, 0x00, 0x01,
77 0x0d, 0x00, 0x02, 0x90, 0x00, 0x00, 0x00, 0x00,
78 0x8e, 0xc8, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x08,
79 0x01, 0x16, 0x40, 0x20, 0x8d, 0x09, 0x00, 0x00,
80 0x8e, 0xc8, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x08,
81 0x01, 0x16, 0x40, 0x20, 0x8d, 0x09, 0x00, 0x00,
82 0x3c, 0x08, 0x04, 0x00, 0x01, 0xc8, 0x70, 0x20,
83 0x03, 0x30, 0xc8, 0x20, 0x3c, 0x08, 0x00, 0x10,
84 0x02, 0xc8, 0xb0, 0x20, 0x10, 0x00, 0x00, 0x21,
85 0xae, 0x37, 0x00, 0x04, 0x24, 0xd5, 0x00, 0x0c,
86 0x8f, 0xa4, 0x00, 0x00, 0x23, 0xbd, 0x00, 0x08,
87 0x24, 0x05, 0x00, 0x01, 0x0d, 0x00, 0x02, 0x90,
88 0x00, 0x00, 0x00, 0x00, 0x8c, 0xe8, 0x00, 0x00,
89 0x3c, 0x08, 0x00, 0x08, 0x01, 0x07, 0x40, 0x20,
90 0x8d, 0x09, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x10,
91 0x01, 0x07, 0x40, 0x20, 0x8d, 0x09, 0x00, 0x00,
92 0x3c, 0x08, 0x00, 0x18, 0x01, 0x07, 0x40, 0x20,
93 0x8d, 0x09, 0x00, 0x00, 0x8c, 0xe8, 0x00, 0x00,
94 0x3c, 0x08, 0x00, 0x08, 0x01, 0x07, 0x40, 0x20,
95 0x8d, 0x09, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x10,
96 0x01, 0x07, 0x40, 0x20, 0x8d, 0x09, 0x00, 0x00,
97 0x3c, 0x08, 0x00, 0x18, 0x01, 0x07, 0x40, 0x20,
98 0x8d, 0x09, 0x00, 0x00, 0x3c, 0x08, 0x08, 0x00,
99 0x02, 0xe8, 0xb8, 0x20, 0x00, 0xd0, 0x30, 0x20,
100 0x00, 0xd0, 0x30, 0x20, 0x3c, 0x08, 0x00, 0x20,
101 0x00, 0xe8, 0x38, 0x20, 0x24, 0x63, 0x00, 0x01,
102 0x00, 0x6d, 0x40, 0x2a, 0x15, 0x00, 0xff, 0xc3,
103 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0a, 0xa4, 0x70,
104 0x00, 0x12, 0x94, 0xc0, 0x3c, 0x09, 0x00, 0x06,
105 0x35, 0x29, 0x36, 0x34, 0x01, 0x32, 0x48, 0x25,
106 0xad, 0x49, 0x00, 0x10, 0x8d, 0x49, 0x00, 0x10,
107 0x3c, 0x08, 0xa0, 0x00, 0x35, 0x08, 0x03, 0x00,
108 0x3c, 0x09, 0x0f, 0xff, 0x35, 0x29, 0xff, 0xff,
109 0x02, 0xc9, 0xb0, 0x24, 0xad, 0x16, 0x00, 0x18,
110 0x03, 0xc0, 0xe8, 0x25, 0x27, 0xbd, 0x00, 0x48,
111 0x8f, 0xb3, 0x00, 0x00, 0x8f, 0xb4, 0x00, 0x04,
112 0x8f, 0xb5, 0x00, 0x08, 0x8f, 0xb6, 0x00, 0x0c,
113 0x8f, 0xb7, 0x00, 0x10, 0x27, 0xbd, 0x00, 0x18,
114 0x3c, 0x08, 0x80, 0x00, 0x25, 0x08, 0x00, 0x00,
115 0x25, 0x09, 0x40, 0x00, 0x25, 0x29, 0xff, 0xe0,
116 0x40, 0x80, 0xe0, 0x00, 0x40, 0x80, 0xe8, 0x00,
117 0xbd, 0x08, 0x00, 0x00, 0x01, 0x09, 0x08, 0x2b,
118 0x14, 0x20, 0xff, 0xfd, 0x25, 0x08, 0x00, 0x20,
119 0x3c, 0x08, 0x80, 0x00, 0x25, 0x08, 0x00, 0x00,
120 0x25, 0x09, 0x20, 0x00, 0x25, 0x29, 0xff, 0xf0,
121 0xbd, 0x09, 0x00, 0x00, 0x01, 0x09, 0x08, 0x2b,
122 0x14, 0x20, 0xff, 0xfd, 0x25, 0x08, 0x00, 0x10,
123 0x10, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
124 0x3c, 0x08, 0x80, 0x00, 0x25, 0x08, 0x00, 0x00,
125 0x25, 0x09, 0x40, 0x00, 0x25, 0x29, 0xff, 0xe0,
126 0x40, 0x80, 0xe0, 0x00, 0x40, 0x80, 0xe8, 0x00,
127 0xbd, 0x08, 0x00, 0x00, 0x01, 0x09, 0x08, 0x2b,
128 0x14, 0x20, 0xff, 0xfd, 0x25, 0x08, 0x00, 0x20,
129 0x3c, 0x08, 0x80, 0x00, 0x25, 0x08, 0x00, 0x00,
130 0x25, 0x09, 0x20, 0x00, 0x25, 0x29, 0xff, 0xf0,
131 0xbd, 0x01, 0x00, 0x00, 0x01, 0x09, 0x08, 0x2b,
132 0x14, 0x20, 0xff, 0xfd, 0x25, 0x08, 0x00, 0x10,
133 0x3c, 0x0a, 0xa4, 0x00, 0x25, 0x4a, 0x00, 0x00,
134 0x3c, 0x0b, 0xff, 0xf0, 0x3c, 0x09, 0x00, 0x10,
135 0x01, 0x4b, 0x50, 0x24, 0x3c, 0x08, 0xa4, 0x00,
136 0x25, 0x29, 0xff, 0xff, 0x3c, 0x0b, 0xa4, 0x00,
137 0x25, 0x08, 0x04, 0xc0, 0x25, 0x6b, 0x07, 0x74,
138 0x01, 0x09, 0x40, 0x24, 0x01, 0x69, 0x58, 0x24,
139 0x3c, 0x09, 0xa0, 0x00, 0x01, 0x0a, 0x40, 0x25,
140 0x01, 0x6a, 0x58, 0x25, 0x25, 0x29, 0x00, 0x00,
141 0x8d, 0x0d, 0x00, 0x00, 0x25, 0x08, 0x00, 0x04,
142 0x01, 0x0b, 0x08, 0x2b, 0x25, 0x29, 0x00, 0x04,
143 0x14, 0x20, 0xff, 0xfb, 0xad, 0x2d, 0xff, 0xfc,
144 0x3c, 0x0c, 0x80, 0x00, 0x25, 0x8c, 0x00, 0x00,
145 0x01, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
146 0x3c, 0x0b, 0xb0, 0x00, 0x8d, 0x69, 0x00, 0x08,
147 0x3c, 0x0a, 0x1f, 0xff, 0x35, 0x4a, 0xff, 0xff,
148 0x3c, 0x01, 0xa4, 0x60, 0x01, 0x2a, 0x48, 0x24,
149 0xac, 0x29, 0x00, 0x00, 0x3c, 0x08, 0xa4, 0x60,
150 0x8d, 0x08, 0x00, 0x10, 0x31, 0x08, 0x00, 0x02,
151 0x55, 0x00, 0xff, 0xfd, 0x3c, 0x08, 0xa4, 0x60,
152 0x24, 0x08, 0x10, 0x00, 0x01, 0x0b, 0x40, 0x20,
153 0x01, 0x0a, 0x40, 0x24, 0x3c, 0x01, 0xa4, 0x60,
154 0xac, 0x28, 0x00, 0x04, 0x3c, 0x0a, 0x00, 0x10,
155 0x25, 0x4a, 0xff, 0xff, 0x3c, 0x01, 0xa4, 0x60,
156 0xac, 0x2a, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0b, 0xa4, 0x60,
171 0x8d, 0x6b, 0x00, 0x10, 0x31, 0x6b, 0x00, 0x01,
172 0x15, 0x60, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00,
173 0x3c, 0x0b, 0xb0, 0x00, 0x8d, 0x64, 0x00, 0x08,
174 0x02, 0xc0, 0x28, 0x25, 0x3c, 0x01, 0x5d, 0x58,
175 0x34, 0x21, 0x8b, 0x65, 0x00, 0xa1, 0x00, 0x19,
176 0x27, 0xbd, 0xff, 0xe0, 0xaf, 0xbf, 0x00, 0x1c,
177 0xaf, 0xb0, 0x00, 0x14, 0x3c, 0x1f, 0x00, 0x10,
178 0x00, 0x00, 0x18, 0x25, 0x00, 0x00, 0x40, 0x25,
179 0x00, 0x80, 0x48, 0x25, 0x24, 0x0d, 0x00, 0x20,
180 0x00, 0x00, 0x10, 0x12, 0x24, 0x42, 0x00, 0x01,
181 0x00, 0x40, 0x38, 0x25, 0x00, 0x40, 0x50, 0x25,
182 0x00, 0x40, 0x58, 0x25, 0x00, 0x40, 0x80, 0x25,
183 0x00, 0x40, 0x30, 0x25, 0x00, 0x40, 0x60, 0x25,
184 0x8d, 0x22, 0x00, 0x00, 0x00, 0xe2, 0x18, 0x21,
185 0x00, 0x67, 0x08, 0x2b, 0x10, 0x20, 0x00, 0x02,
186 0x00, 0x60, 0x28, 0x25, 0x25, 0x4a, 0x00, 0x01,
187 0x30, 0x43, 0x00, 0x1f, 0x01, 0xa3, 0x78, 0x23,
188 0x01, 0xe2, 0xc0, 0x06, 0x00, 0x62, 0x70, 0x04,
189 0x01, 0xd8, 0x20, 0x25, 0x00, 0xc2, 0x08, 0x2b,
190 0x00, 0xa0, 0x38, 0x25, 0x01, 0x62, 0x58, 0x26,
191 0x10, 0x20, 0x00, 0x04, 0x02, 0x04, 0x80, 0x21,
192 0x00, 0xe2, 0xc8, 0x26, 0x10, 0x00, 0x00, 0x02,
193 0x03, 0x26, 0x30, 0x26, 0x00, 0xc4, 0x30, 0x26,
194 0x25, 0x08, 0x00, 0x04, 0x00, 0x50, 0x78, 0x26,
195 0x25, 0x29, 0x00, 0x04, 0x15, 0x1f, 0xff, 0xe8,
196 0x01, 0xec, 0x60, 0x21, 0x00, 0xea, 0x70, 0x26,
197 0x01, 0xcb, 0x38, 0x26, 0x02, 0x06, 0xc0, 0x26,
198 0x03, 0x0c, 0x80, 0x26, 0x3c, 0x0b, 0xb0, 0x00,
199 0x8d, 0x68, 0x00, 0x10, 0x14, 0xe8, 0x00, 0x06,
200 0x00, 0x00, 0x00, 0x00, 0x8d, 0x68, 0x00, 0x14,
201 0x16, 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
202 0x04, 0x11, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
203 0x04, 0x11, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
204 0x3c, 0x09, 0xa4, 0x08, 0x8d, 0x29, 0x00, 0x00,
205 0x8f, 0xb0, 0x00, 0x14, 0x8f, 0xbf, 0x00, 0x1c,
206 0x11, 0x20, 0x00, 0x06, 0x27, 0xbd, 0x00, 0x20,
207 0x24, 0x0a, 0x00, 0x41, 0x3c, 0x01, 0xa4, 0x04,
208 0xac, 0x2a, 0x00, 0x10, 0x3c, 0x01, 0xa4, 0x08,
209 0xac, 0x20, 0x00, 0x00, 0x3c, 0x0b, 0x00, 0xaa,
210 0x35, 0x6b, 0xaa, 0xae, 0x3c, 0x01, 0xa4, 0x04,
211 0xac, 0x2b, 0x00, 0x10, 0x3c, 0x01, 0xa4, 0x30,
212 0x24, 0x08, 0x05, 0x55, 0xac, 0x28, 0x00, 0x0c,
213 0x3c, 0x01, 0xa4, 0x80, 0xac, 0x20, 0x00, 0x18,
214 0x3c, 0x01, 0xa4, 0x50, 0xac, 0x20, 0x00, 0x0c,
215 0x3c, 0x01, 0xa4, 0x30, 0x24, 0x09, 0x08, 0x00,
216 0xac, 0x29, 0x00, 0x00, 0x24, 0x09, 0x00, 0x02,
217 0x3c, 0x01, 0xa4, 0x60, 0x3c, 0x08, 0xa0, 0x00,
218 0x35, 0x08, 0x03, 0x00, 0xac, 0x29, 0x00, 0x10,
219 0xad, 0x17, 0x00, 0x14, 0xad, 0x15, 0x00, 0x0c,
220 0xad, 0x13, 0x00, 0x04, 0x12, 0x60, 0x00, 0x04,
221 0xad, 0x14, 0x00, 0x00, 0x3c, 0x09, 0xa6, 0x00,
222 0x10, 0x00, 0x00, 0x03, 0x25, 0x29, 0x00, 0x00,
223 0x3c, 0x09, 0xb0, 0x00, 0x25, 0x29, 0x00, 0x00,
224 0xad, 0x09, 0x00, 0x08, 0x3c, 0x08, 0xa4, 0x00,
225 0x25, 0x08, 0x00, 0x00, 0x21, 0x09, 0x10, 0x00,
226 0x25, 0x08, 0x00, 0x04, 0x15, 0x09, 0xff, 0xfe,
227 0xad, 0x00, 0xff, 0xfc, 0x3c, 0x08, 0xa4, 0x00,
228 0x25, 0x08, 0x10, 0x00, 0x21, 0x09, 0x10, 0x00,
229 0x25, 0x08, 0x00, 0x04, 0x15, 0x09, 0xff, 0xfe,
230 0xad, 0x00, 0xff, 0xfc, 0x3c, 0x0b, 0xb0, 0x00,
231 0x8d, 0x69, 0x00, 0x08, 0x01, 0x20, 0x00, 0x08,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x27, 0xbd, 0xff, 0x60, 0xaf, 0xb0, 0x00, 0x40,
234 0xaf, 0xb1, 0x00, 0x44, 0x00, 0x00, 0x88, 0x25,
235 0x00, 0x00, 0x80, 0x25, 0xaf, 0xa2, 0x00, 0x00,
236 0xaf, 0xa3, 0x00, 0x04, 0xaf, 0xa4, 0x00, 0x08,
237 0xaf, 0xa5, 0x00, 0x0c, 0xaf, 0xa6, 0x00, 0x10,
238 0xaf, 0xa7, 0x00, 0x14, 0xaf, 0xa8, 0x00, 0x18,
239 0xaf, 0xa9, 0x00, 0x1c, 0xaf, 0xaa, 0x00, 0x20,
240 0xaf, 0xab, 0x00, 0x24, 0xaf, 0xac, 0x00, 0x28,
241 0xaf, 0xad, 0x00, 0x2c, 0xaf, 0xae, 0x00, 0x30,
242 0xaf, 0xaf, 0x00, 0x34, 0xaf, 0xb8, 0x00, 0x38,
243 0xaf, 0xb9, 0x00, 0x3c, 0xaf, 0xb2, 0x00, 0x48,
244 0xaf, 0xb3, 0x00, 0x4c, 0xaf, 0xb4, 0x00, 0x50,
245 0xaf, 0xb5, 0x00, 0x54, 0xaf, 0xb6, 0x00, 0x58,
246 0xaf, 0xb7, 0x00, 0x5c, 0xaf, 0xbe, 0x00, 0x60,
247 0xaf, 0xbf, 0x00, 0x64, 0x0d, 0x00, 0x02, 0x20,
248 0x00, 0x00, 0x00, 0x00, 0x26, 0x10, 0x00, 0x01,
249 0x2a, 0x09, 0x00, 0x04, 0x15, 0x20, 0xff, 0xfb,
250 0x02, 0x22, 0x88, 0x21, 0x00, 0x11, 0x20, 0x82,
251 0x0d, 0x00, 0x02, 0x90, 0x24, 0x05, 0x00, 0x01,
252 0x8f, 0xbf, 0x00, 0x64, 0x00, 0x11, 0x10, 0x82,
253 0x8f, 0xb1, 0x00, 0x44, 0x8f, 0xa3, 0x00, 0x04,
254 0x8f, 0xa4, 0x00, 0x08, 0x8f, 0xa5, 0x00, 0x0c,
255 0x8f, 0xa6, 0x00, 0x10, 0x8f, 0xa7, 0x00, 0x14,
256 0x8f, 0xa8, 0x00, 0x18, 0x8f, 0xa9, 0x00, 0x1c,
257 0x8f, 0xaa, 0x00, 0x20, 0x8f, 0xab, 0x00, 0x24,
258 0x8f, 0xac, 0x00, 0x28, 0x8f, 0xad, 0x00, 0x2c,
259 0x8f, 0xae, 0x00, 0x30, 0x8f, 0xaf, 0x00, 0x34,
260 0x8f, 0xb8, 0x00, 0x38, 0x8f, 0xb9, 0x00, 0x3c,
261 0x8f, 0xb0, 0x00, 0x40, 0x8f, 0xb2, 0x00, 0x48,
262 0x8f, 0xb3, 0x00, 0x4c, 0x8f, 0xb4, 0x00, 0x50,
263 0x8f, 0xb5, 0x00, 0x54, 0x8f, 0xb6, 0x00, 0x58,
264 0x8f, 0xb7, 0x00, 0x5c, 0x8f, 0xbe, 0x00, 0x60,
265 0x03, 0xe0, 0x00, 0x08, 0x27, 0xbd, 0x00, 0xa0,
266 0x27, 0xbd, 0xff, 0xe0, 0xaf, 0xbf, 0x00, 0x1c,
267 0x00, 0x00, 0x48, 0x25, 0x00, 0x00, 0x58, 0x25,
268 0x00, 0x00, 0x60, 0x25, 0x29, 0x9a, 0x00, 0x40,
269 0x53, 0x40, 0x00, 0x18, 0x00, 0x00, 0x10, 0x25,
270 0x0d, 0x00, 0x02, 0x43, 0x01, 0x80, 0x20, 0x25,
271 0x58, 0x40, 0x00, 0x08, 0x29, 0x3a, 0x00, 0x50,
272 0x00, 0x49, 0xd0, 0x23, 0x03, 0x4c, 0x00, 0x19,
273 0x00, 0x40, 0x48, 0x25, 0x00, 0x00, 0xd0, 0x12,
274 0x01, 0x7a, 0x58, 0x21, 0x00, 0x00, 0x00, 0x00,
275 0x29, 0x3a, 0x00, 0x50, 0x17, 0x40, 0xff, 0xf1,
276 0x25, 0x8c, 0x00, 0x01, 0x00, 0x0b, 0x20, 0x80,
277 0x00, 0x8b, 0x20, 0x23, 0x00, 0x04, 0x20, 0x80,
278 0x00, 0x8b, 0x20, 0x23, 0x00, 0x04, 0x20, 0x40,
279 0x0d, 0x00, 0x02, 0x60, 0x24, 0x84, 0xfc, 0x90,
280 0x10, 0x00, 0x00, 0x03, 0x8f, 0xbf, 0x00, 0x1c,
281 0x00, 0x00, 0x10, 0x25, 0x8f, 0xbf, 0x00, 0x1c,
282 0x27, 0xbd, 0x00, 0x20, 0x03, 0xe0, 0x00, 0x08,
283 0x00, 0x00, 0x00, 0x00, 0x27, 0xbd, 0xff, 0xd8,
284 0xaf, 0xbf, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x25,
285 0x0d, 0x00, 0x02, 0x90, 0x24, 0x05, 0x00, 0x02,
286 0x00, 0x00, 0xf0, 0x25, 0x24, 0x1a, 0xff, 0xff,
287 0xae, 0x9a, 0x00, 0x04, 0x8e, 0x83, 0x00, 0x04,
288 0xae, 0x9a, 0x00, 0x00, 0xae, 0x9a, 0x00, 0x00,
289 0x00, 0x00, 0xe0, 0x25, 0x00, 0x03, 0x1c, 0x02,
290 0x30, 0x7a, 0x00, 0x01, 0x53, 0x40, 0x00, 0x03,
291 0x27, 0x9c, 0x00, 0x01, 0x24, 0x42, 0x00, 0x01,
292 0x27, 0x9c, 0x00, 0x01, 0x2b, 0x9a, 0x00, 0x08,
293 0x17, 0x40, 0xff, 0xf9, 0x00, 0x03, 0x18, 0x42,
294 0x27, 0xde, 0x00, 0x01, 0x2b, 0xda, 0x00, 0x0a,
295 0x57, 0x40, 0xff, 0xef, 0x24, 0x1a, 0xff, 0xff,
296 0x8f, 0xbf, 0x00, 0x1c, 0x27, 0xbd, 0x00, 0x28,
297 0x03, 0xe0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
298 0x27, 0xbd, 0xff, 0xd8, 0xaf, 0xbf, 0x00, 0x1c,
299 0xaf, 0xa4, 0x00, 0x20, 0xa3, 0xa0, 0x00, 0x27,
300 0x00, 0x00, 0x40, 0x25, 0x00, 0x00, 0x50, 0x25,
301 0x34, 0x0d, 0xc8, 0x00, 0x00, 0x00, 0x70, 0x25,
302 0x29, 0xda, 0x00, 0x40, 0x57, 0x40, 0x00, 0x04,
303 0x01, 0xc0, 0x20, 0x25, 0x10, 0x00, 0x00, 0x20,
304 0x00, 0x00, 0x10, 0x25, 0x01, 0xc0, 0x20, 0x25,
305 0x0d, 0x00, 0x02, 0x90, 0x24, 0x05, 0x00, 0x01,
306 0x0d, 0x00, 0x02, 0xb4, 0x27, 0xa4, 0x00, 0x27,
307 0x0d, 0x00, 0x02, 0xb4, 0x27, 0xa4, 0x00, 0x27,
308 0x93, 0xba, 0x00, 0x27, 0x24, 0x1b, 0x03, 0x20,
309 0x8f, 0xa4, 0x00, 0x20, 0x03, 0x5b, 0x00, 0x19,
310 0x00, 0x00, 0x40, 0x12, 0x01, 0x04, 0xd0, 0x23,
311 0x07, 0x43, 0x00, 0x03, 0x03, 0x4d, 0xd8, 0x2a,
312 0x00, 0x88, 0xd0, 0x23, 0x03, 0x4d, 0xd8, 0x2a,
313 0x53, 0x60, 0x00, 0x04, 0x8f, 0xa4, 0x00, 0x20,
314 0x03, 0x40, 0x68, 0x25, 0x01, 0xc0, 0x50, 0x25,
315 0x8f, 0xa4, 0x00, 0x20, 0x01, 0x04, 0xd8, 0x2a,
316 0x53, 0x60, 0x00, 0x06, 0x01, 0x4e, 0x10, 0x21,
317 0x25, 0xce, 0x00, 0x01, 0x29, 0xdb, 0x00, 0x41,
318 0x57, 0x60, 0xff, 0xe0, 0x29, 0xda, 0x00, 0x40,
319 0x01, 0x4e, 0x10, 0x21, 0x00, 0x02, 0x10, 0x42,
320 0x8f, 0xbf, 0x00, 0x1c, 0x27, 0xbd, 0x00, 0x28,
321 0x03, 0xe0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
322 0x27, 0xbd, 0xff, 0xd8, 0x30, 0x84, 0x00, 0xff,
323 0x24, 0x1b, 0x00, 0x01, 0x38, 0x84, 0x00, 0x3f,
324 0xaf, 0xbf, 0x00, 0x1c, 0x14, 0xbb, 0x00, 0x03,
325 0x3c, 0x0f, 0x46, 0x00, 0x3c, 0x1a, 0x80, 0x00,
326 0x01, 0xfa, 0x78, 0x25, 0x30, 0x9a, 0x00, 0x01,
327 0x00, 0x1a, 0xd1, 0x80, 0x01, 0xfa, 0x78, 0x25,
328 0x30, 0x9a, 0x00, 0x02, 0x00, 0x1a, 0xd3, 0x40,
329 0x01, 0xfa, 0x78, 0x25, 0x30, 0x9a, 0x00, 0x04,
330 0x00, 0x1a, 0xd5, 0x00, 0x01, 0xfa, 0x78, 0x25,
331 0x30, 0x9a, 0x00, 0x08, 0x00, 0x1a, 0xd1, 0x00,
332 0x01, 0xfa, 0x78, 0x25, 0x30, 0x9a, 0x00, 0x10,
333 0x00, 0x1a, 0xd2, 0xc0, 0x01, 0xfa, 0x78, 0x25,
334 0x30, 0x9a, 0x00, 0x20, 0x00, 0x1a, 0xd4, 0x80,
335 0x01, 0xfa, 0x78, 0x25, 0x24, 0x1b, 0x00, 0x01,
336 0x14, 0xbb, 0x00, 0x03, 0xae, 0xaf, 0x00, 0x00,
337 0x3c, 0x1a, 0xa4, 0x30, 0xaf, 0x40, 0x00, 0x00,
338 0x8f, 0xbf, 0x00, 0x1c, 0x27, 0xbd, 0x00, 0x28,
339 0x03, 0xe0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
340 0x27, 0xbd, 0xff, 0xd8, 0xaf, 0xbf, 0x00, 0x1c,
341 0x24, 0x1a, 0x20, 0x00, 0x3c, 0x1b, 0xa4, 0x30,
342 0xaf, 0x7a, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x25,
343 0x8e, 0xbe, 0x00, 0x00, 0x24, 0x1a, 0x10, 0x00,
344 0xaf, 0x7a, 0x00, 0x00, 0x24, 0x1b, 0x00, 0x40,
345 0x03, 0x7e, 0xd8, 0x24, 0x00, 0x1b, 0xd9, 0x82,
346 0x00, 0x00, 0xd0, 0x25, 0x03, 0x5b, 0xd0, 0x25,
347 0x24, 0x1b, 0x40, 0x00, 0x03, 0x7e, 0xd8, 0x24,
348 0x00, 0x1b, 0xdb, 0x42, 0x03, 0x5b, 0xd0, 0x25,
349 0x3c, 0x1b, 0x00, 0x40, 0x03, 0x7e, 0xd8, 0x24,
350 0x00, 0x1b, 0xdd, 0x02, 0x03, 0x5b, 0xd0, 0x25,
351 0x24, 0x1b, 0x00, 0x80, 0x03, 0x7e, 0xd8, 0x24,
352 0x00, 0x1b, 0xd9, 0x02, 0x03, 0x5b, 0xd0, 0x25,
353 0x34, 0x1b, 0x80, 0x00, 0x03, 0x7e, 0xd8, 0x24,
354 0x00, 0x1b, 0xda, 0xc2, 0x03, 0x5b, 0xd0, 0x25,
355 0x3c, 0x1b, 0x00, 0x80, 0x03, 0x7e, 0xd8, 0x24,
356 0x00, 0x1b, 0xdc, 0x82, 0x03, 0x5b, 0xd0, 0x25,
357 0xa0, 0x9a, 0x00, 0x00, 0x8f, 0xbf, 0x00, 0x1c,
358 0x27, 0xbd, 0x00, 0x28, 0x03, 0xe0, 0x00, 0x08,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x02, 0x00, 0x10, 0x01, 0x40, 0x0a, 0x00, 0x88,
361 0x04, 0x40, 0x22, 0x02, 0x08, 0x10, 0x41, 0xff,
362 0x08, 0x08, 0x40, 0x44, 0x01, 0x20, 0x08, 0x7f,
363 0x02, 0x04, 0x10, 0x10, 0x80, 0x84, 0x04, 0x20,
364 0x41, 0xfe, 0x08, 0x08, 0x40, 0x22, 0x01, 0x10,
365 0x08, 0x80, 0x44, 0x04, 0x3f, 0xc0, 0x07, 0x00,
366 0xc6, 0x08, 0x08, 0x80, 0x24, 0x01, 0x40, 0x02,
367 0x00, 0x10, 0x00, 0x80, 0x02, 0x00, 0x90, 0x04,
368 0x40, 0x41, 0x8c, 0x03, 0x80, 0x7e, 0x02, 0x0c,
369 0x10, 0x10, 0x80, 0x44, 0x02, 0x20, 0x09, 0x00,
370 0x48, 0x02, 0x40, 0x12, 0x01, 0x10, 0x08, 0x80,
371 0x84, 0x18, 0x3f, 0x00, 0x7f, 0xe2, 0x00, 0x10,
372 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0xff, 0x08,
373 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04,
374 0x00, 0x3f, 0xf0, 0x7f, 0xe2, 0x00, 0x10, 0x00,
375 0x80, 0x04, 0x00, 0x20, 0x01, 0xff, 0x08, 0x00,
376 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00,
377 0x20, 0x00, 0x07, 0x00, 0xc6, 0x08, 0x08, 0x80,
378 0x24, 0x01, 0x40, 0x02, 0x00, 0x10, 0x00, 0x83,
379 0xf2, 0x00, 0x90, 0x04, 0x40, 0x61, 0x8d, 0x03,
380 0x88, 0x40, 0x12, 0x00, 0x90, 0x04, 0x80, 0x24,
381 0x01, 0x20, 0x09, 0xff, 0xc8, 0x02, 0x40, 0x12,
382 0x00, 0x90, 0x04, 0x80, 0x24, 0x01, 0x20, 0x08,
383 0x07, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20,
384 0x01, 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x10,
385 0x00, 0x80, 0x04, 0x00, 0x20, 0x03, 0x80, 0x00,
386 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04, 0x00,
387 0x20, 0x01, 0x00, 0x08, 0x00, 0x42, 0x02, 0x10,
388 0x10, 0x80, 0x82, 0x08, 0x0f, 0x80, 0x40, 0x22,
389 0x02, 0x10, 0x20, 0x82, 0x04, 0x20, 0x22, 0x01,
390 0x20, 0x0a, 0x80, 0x62, 0x02, 0x08, 0x10, 0x20,
391 0x80, 0x84, 0x02, 0x20, 0x08, 0x40, 0x02, 0x00,
392 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00,
393 0x08, 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80,
394 0x04, 0x00, 0x3f, 0xf0, 0x80, 0x0c, 0x00, 0x70,
395 0x07, 0x40, 0x5a, 0x02, 0xc8, 0x26, 0x41, 0x31,
396 0x11, 0x88, 0x8c, 0x28, 0x61, 0x43, 0x04, 0x18,
397 0x20, 0xc0, 0x04, 0x40, 0x23, 0x01, 0x14, 0x08,
398 0xa0, 0x44, 0x82, 0x22, 0x11, 0x10, 0x88, 0x44,
399 0x42, 0x22, 0x09, 0x10, 0x28, 0x81, 0x44, 0x06,
400 0x20, 0x10, 0x0f, 0x01, 0x86, 0x10, 0x08, 0x80,
401 0x48, 0x01, 0x40, 0x0a, 0x00, 0x50, 0x02, 0x80,
402 0x14, 0x00, 0x90, 0x08, 0x80, 0x43, 0x0c, 0x07,
403 0x80, 0x7f, 0x82, 0x02, 0x10, 0x08, 0x80, 0x44,
404 0x02, 0x20, 0x11, 0x01, 0x0f, 0xf0, 0x40, 0x02,
405 0x00, 0x10, 0x00, 0x80, 0x04, 0x00, 0x20, 0x00,
406 0x0f, 0x01, 0x86, 0x10, 0x08, 0x80, 0x48, 0x01,
407 0x40, 0x0a, 0x00, 0x50, 0x02, 0x80, 0x14, 0x10,
408 0x90, 0x48, 0x81, 0x43, 0x0c, 0x07, 0x90, 0x7f,
409 0x82, 0x02, 0x10, 0x08, 0x80, 0x44, 0x02, 0x20,
410 0x21, 0xfe, 0x08, 0x20, 0x40, 0x82, 0x04, 0x10,
411 0x10, 0x80, 0x84, 0x02, 0x20, 0x10, 0x1f, 0x81,
412 0x02, 0x10, 0x08, 0x80, 0x44, 0x00, 0x10, 0x00,
413 0x70, 0x00, 0x70, 0x00, 0x40, 0x01, 0x10, 0x08,
414 0x80, 0x42, 0x04, 0x0f, 0xc0, 0x7f, 0xf0, 0x10,
415 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08,
416 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04,
417 0x00, 0x20, 0x01, 0x00, 0x40, 0x22, 0x01, 0x10,
418 0x08, 0x80, 0x44, 0x02, 0x20, 0x11, 0x00, 0x88,
419 0x04, 0x40, 0x22, 0x01, 0x08, 0x10, 0x40, 0x81,
420 0x08, 0x07, 0x80, 0x40, 0x12, 0x00, 0x88, 0x08,
421 0x40, 0x42, 0x02, 0x08, 0x20, 0x41, 0x01, 0x10,
422 0x08, 0x80, 0x44, 0x01, 0x40, 0x0a, 0x00, 0x20,
423 0x01, 0x00, 0x82, 0x0c, 0x10, 0x60, 0x82, 0x8a,
424 0x24, 0x51, 0x22, 0x89, 0x14, 0x45, 0x14, 0x28,
425 0xa1, 0x45, 0x0a, 0x28, 0x20, 0x81, 0x04, 0x08,
426 0x20, 0x40, 0x11, 0x01, 0x04, 0x10, 0x20, 0x80,
427 0x88, 0x02, 0x80, 0x08, 0x00, 0x40, 0x05, 0x00,
428 0x44, 0x04, 0x10, 0x20, 0x82, 0x02, 0x20, 0x08,
429 0x40, 0x11, 0x01, 0x08, 0x08, 0x20, 0x80, 0x88,
430 0x04, 0x40, 0x14, 0x00, 0x40, 0x02, 0x00, 0x10,
431 0x00, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x7f,
432 0xe0, 0x01, 0x00, 0x10, 0x01, 0x00, 0x08, 0x00,
433 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x04,
434 0x00, 0x40, 0x04, 0x00, 0x3f, 0xf0, 0x0f, 0x80,
435 0x82, 0x08, 0x08, 0x40, 0x42, 0x02, 0x10, 0x10,
436 0x80, 0x84, 0x04, 0x20, 0x21, 0x01, 0x08, 0x08,
437 0x40, 0x41, 0x04, 0x07, 0xc0, 0x02, 0x00, 0x30,
438 0x02, 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08,
439 0x00, 0x40, 0x02, 0x00, 0x10, 0x00, 0x80, 0x04,
440 0x00, 0x20, 0x01, 0x00, 0x0f, 0x00, 0x84, 0x08,
441 0x10, 0x40, 0x80, 0x04, 0x00, 0x20, 0x02, 0x00,
442 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02,
443 0x00, 0x1f, 0xe0, 0x0f, 0x00, 0x84, 0x08, 0x10,
444 0x40, 0x80, 0x04, 0x00, 0x40, 0x1c, 0x00, 0x10,
445 0x00, 0x40, 0x02, 0x08, 0x10, 0x40, 0x81, 0x08,
446 0x07, 0x80, 0x01, 0x00, 0x18, 0x00, 0xc0, 0x0a,
447 0x00, 0x90, 0x04, 0x80, 0x44, 0x04, 0x20, 0x21,
448 0x02, 0x08, 0x1f, 0xf8, 0x02, 0x00, 0x10, 0x00,
449 0x80, 0x1f, 0x81, 0x00, 0x08, 0x00, 0x40, 0x02,
450 0x00, 0x17, 0x80, 0xc2, 0x04, 0x08, 0x00, 0x40,
451 0x02, 0x08, 0x10, 0x40, 0x81, 0x08, 0x07, 0x80,
452 0x0f, 0x00, 0x84, 0x08, 0x10, 0x40, 0x82, 0x00,
453 0x10, 0x00, 0xbc, 0x06, 0x10, 0x20, 0x41, 0x02,
454 0x08, 0x10, 0x40, 0x81, 0x08, 0x07, 0x80, 0x3f,
455 0xc0, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, 0x00,
456 0x80, 0x04, 0x00, 0x40, 0x02, 0x00, 0x10, 0x01,
457 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x0f, 0x00,
458 0x84, 0x08, 0x10, 0x40, 0x82, 0x04, 0x08, 0x40,
459 0x3c, 0x02, 0x10, 0x20, 0x41, 0x02, 0x08, 0x10,
460 0x40, 0x81, 0x08, 0x07, 0x80, 0x0f, 0x00, 0x84,
461 0x08, 0x10, 0x40, 0x82, 0x04, 0x10, 0x20, 0x43,
462 0x01, 0xe8, 0x00, 0x40, 0x02, 0x08, 0x10, 0x40,
463 0x81, 0x08, 0x07, 0x80, 0x02, 0x00, 0x10, 0x00,
464 0x80, 0x04, 0x00, 0x20, 0x01, 0x00, 0x08, 0x00,
465 0x40, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
466 0x20, 0x01, 0x00, 0xd8, 0x06, 0xc0, 0x12, 0x01,
467 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x04, 0x40, 0x22, 0x01, 0x10, 0x08,
470 0x87, 0xff, 0x04, 0x40, 0x22, 0x01, 0x10, 0x08,
471 0x83, 0xff, 0x84, 0x40, 0x22, 0x01, 0x10, 0x08,
472 0x80, 0xc0, 0x06, 0x00, 0x10, 0x01, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x80, 0x44, 0x41, 0x24,
476 0x05, 0x40, 0x1c, 0x00, 0x40, 0x07, 0x00, 0x54,
477 0x04, 0x90, 0x44, 0x40, 0x20, 0x00, 0x00, 0x00,
478 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x20, 0x01,
479 0x00, 0x08, 0x0f, 0xfe, 0x02, 0x00, 0x10, 0x00,
480 0x80, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01,
483 0x80, 0x04, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04,
490 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40,
491 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00,
492 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
493 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494 0x00, 0x00, 0x01, 0x80, 0x0c, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03,
497 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x07, 0x00, 0x44, 0x04, 0x10, 0x20, 0x80, 0x04,
499 0x00, 0x40, 0x04, 0x00, 0x40, 0x02, 0x00, 0x10,
500 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x07,
501 0x00, 0xc6, 0x08, 0x08, 0x80, 0x24, 0x31, 0x42,
502 0x4a, 0x22, 0x51, 0x22, 0x89, 0x22, 0x36, 0x10,
503 0x02, 0x40, 0x21, 0x86, 0x03, 0xc0, 0x00, 0x00,
504 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
506};
diff --git a/tools/makerom/src/main.c b/tools/makerom/src/main.c
new file mode 100644
index 0000000..bce8709
--- /dev/null
+++ b/tools/makerom/src/main.c
@@ -0,0 +1,188 @@
1#include <getopt.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6
7#include "types.h"
8#include "bootdata.c"
9
10#define CHECKSUM_START 0x00001000
11#define CHECKSUM_LENGTH 0x00100000
12
13#define MAX(A,B) (A) < (B) ? (B) : (A)
14
15typedef struct Bytes {
16 u8 *data;
17 size_t len;
18} Bytes;
19
20typedef struct Checksum {
21 union {
22 u64 crc;
23 u8 data[8];
24 };
25} Checksum;
26
27Bytes
28read_file(FILE *file) {
29 Bytes bytes = {0};
30
31 // Get file length.
32 fseek(file, 0, SEEK_END);
33 bytes.len = ftell(file);
34 bytes.len = MAX(bytes.len, CHECKSUM_START + CHECKSUM_LENGTH);
35
36 // Allocate memory, ensuring we have a minimum size for checksum purposes.
37 bytes.data = calloc(1, bytes.len);
38
39 // Copy file contents to memory.
40 fseek(file, 0, SEEK_SET);
41 fread(bytes.data, 1, bytes.len, file);
42 return bytes;
43}
44
45u32
46read_big_endian(u8 *data) {
47 return (data[3] << 0) |
48 (data[2] << 8) |
49 (data[1] << 16) |
50 (data[0] << 24);
51}
52
53u32
54rol(u32 x, u32 n) {
55 return (x << n) | (x >> (32 - n));
56}
57
58Checksum
59calculate_crc(Bytes bytes) {
60 Checksum checksum = {0};
61 u32 t1 = 0xF8CA4DDC;
62 u32 t2 = 0xF8CA4DDC;
63 u32 t3 = 0xF8CA4DDC;
64 u32 t4 = 0xF8CA4DDC;
65 u32 t5 = 0xF8CA4DDC;
66 u32 t6 = 0xF8CA4DDC;
67 for (size_t i = CHECKSUM_START; i < (CHECKSUM_START + CHECKSUM_LENGTH); i += 4) {
68 u32 num = read_big_endian(&bytes.data[i]);
69 if ((t6 + num) < t6) {
70 t4++;
71 }
72 t6 += num;
73 t3 ^= num;
74 u32 r = rol(num, (num & 0x1F));
75 t5 += r;
76 if (t2 > num) {
77 t2 ^= r;
78 } else {
79 t2 ^= t6 ^ num;
80 }
81 t1 += t5 ^ num;
82 }
83 u64 upper = t5 ^ t2 ^ t1;
84 u64 lower = t6 ^ t4 ^ t3;
85 upper = read_big_endian((u8*)&upper);
86 lower = read_big_endian((u8*)&lower);
87 checksum.crc = upper << 32 | lower;
88 return checksum;
89}
90
91void
92print_usage(void) {
93 printf("Usage: %s [options] <filename>\n", BIN_NAME);
94 printf("\n");
95 printf("\t-o <out_file.c> Path to the output file. If blank, stdout will be used.\n");
96 printf("\t-v Verbose.\n");
97 printf("\t-h Prints usage.\n");
98 printf("\n");
99}
100
101int main(int argc, char *argv[]) {
102 FILE *in_file = stdin;
103 FILE *out_file = stdout;
104 char *in_file_path = NULL;
105 char *out_file_path = NULL;
106 bool verbose = false;
107
108 // Handle arguments and flags.
109 int option;
110 while ((option = getopt(argc, argv, "hvo:")) != -1) {
111 switch (option) {
112 case 'h': {
113 print_usage();
114 return EXIT_SUCCESS;
115 } break;
116 case 'o': {
117 out_file_path = optarg;
118 } break;
119 case 'v': {
120 verbose = true;
121 } break;
122 default: {
123 print_usage();
124 return EXIT_FAILURE;
125 } break;
126 }
127 }
128 in_file_path = argv[optind];
129
130 // Open source file.
131 if (in_file_path == NULL) {
132 in_file = stdin;
133 } else {
134 in_file = fopen(in_file_path, "rb");
135 if (in_file == NULL) {
136 fprintf(stderr, "%s: can't open input file: %s\n",
137 BIN_NAME, in_file_path);
138 return EXIT_FAILURE;
139 }
140 }
141
142 // Open destination file.
143 if (out_file_path == NULL) {
144 out_file = stdout;
145 } else {
146 out_file = fopen(out_file_path, "wb");
147 if (out_file == NULL) {
148 fprintf(stderr, "%s: can't open output file: %s\n",
149 BIN_NAME, out_file_path);
150 return EXIT_FAILURE;
151 }
152 }
153
154 // Read source file into memory.
155 Bytes bytes = read_file(in_file);
156
157 // Write bootdata at offset 0x40 of dst file.
158 memcpy(bytes.data + 0x40, bootdata, sizeof(bootdata));
159
160 // Calculate CRC after bootdata was added on the dst file.
161 Checksum checksum = calculate_crc(bytes);
162 if (verbose) {
163 printf("Checksum: 0x%02X%02X%02X%02X%02X%02X%02X%02X\n",
164 checksum.data[0],
165 checksum.data[1],
166 checksum.data[2],
167 checksum.data[3],
168 checksum.data[4],
169 checksum.data[5],
170 checksum.data[6],
171 checksum.data[7]);
172 }
173
174 // Write crc bytes at 0x10 offset on the dst file.
175 memcpy(bytes.data + 0x10, checksum.data, 8 * sizeof(u8));
176
177 // Save the output file.
178 fwrite(bytes.data, 1, bytes.len, out_file);
179
180 // Cleanup.
181 if (in_file != stdin) {
182 fclose(in_file);
183 }
184 if (out_file != stdout) {
185 fclose(out_file);
186 }
187 return EXIT_SUCCESS;
188}
diff --git a/tools/makerom/src/types.h b/tools/makerom/src/types.h
new file mode 100644
index 0000000..ef9a47a
--- /dev/null
+++ b/tools/makerom/src/types.h
@@ -0,0 +1,30 @@
1#ifndef _COMMON_H
2#define _COMMON_H
3
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7
8typedef uint8_t u8;
9typedef uint16_t u16;
10typedef uint32_t u32;
11typedef uint64_t u64;
12typedef int8_t s8;
13typedef int16_t s16;
14typedef int32_t s32;
15typedef int64_t s64;
16typedef volatile u8 vu8;
17typedef volatile u16 vu16;
18typedef volatile u32 vu32;
19typedef volatile u64 vu64;
20typedef volatile s8 vs8;
21typedef volatile s16 vs16;
22typedef volatile s32 vs32;
23typedef volatile s64 vs64;
24
25#define KB(N) ((u64)(N) * 1024)
26#define MB(N) ((u64)KB(N) * 1024)
27#define GB(N) ((u64)MB(N) * 1024)
28#define TB(N) ((u64)GB(N) * 1024)
29
30#endif // _COMMON_H