1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/// Open-source DMG boot ROM replacement.
///
/// A hand-authored 256-byte SM83 machine code program that runs on the
/// emulated CPU from reset ($0000) and implements the Game Boy DMG startup
/// sequence:
///
/// 1. Initialise stack and clear VRAM.
/// 2. Configure APU registers (NR50/NR51/NR52) and initial BG palette.
/// 3. Read the Nintendo logo bitmap from the cartridge header ($0104–$0133),
/// expand each nibble to a double-wide 8×8 tile, and write the tiles to
/// VRAM starting at tile $01 ($8010).
/// 4. Configure the BG tile map so the logo appears in rows 8–9 of the screen.
/// 5. Set SCY=30 and animate the logo scrolling down over 15 VBlank frames.
/// 6. After the scroll, darken the palette and wait ~1 second.
/// 7. Re-read the cartridge logo and compare it byte-by-byte against the
/// embedded 48-byte reference copy; hang if they differ (matching real DMG
/// hardware behaviour that prevents non-licensed cartridges from booting).
/// 8. Compute the header checksum over bytes $0134–$014C and compare it with
/// the value stored at $014D; hang on mismatch.
/// 9. Set the documented DMG post-boot CPU register state:
/// A=$01, F=$B0, B=$00, C=$13, D=$00, E=$D8, H=$01, L=$4D, SP=$FFFE.
/// 10. Write $FF50 (BOOT register) to unmap the boot ROM; the CPU immediately
/// continues executing at $0100 in cartridge ROM.
///
/// ## Design notes
///
/// - APU is stubbed: NR50/NR51/NR52 are written with the correct post-boot
/// values but no actual audio is generated.
/// - The ® trademark symbol tile is omitted to keep the ROM within budget.
/// - LCD starts off at power-on (DmgBus initialises LCDC=0x00); the boot ROM
/// explicitly writes LCDC=0x91 to $FF40 just before the scroll animation
/// begins, matching the sequence real hardware follows.
/// - `WaitFrame` clobbers HL (safe because HL is not preserved after the tile
/// map is built).
///
/// ## Subroutine layout (placed backward from $00FE)
///
/// | Address | Routine | Size |
/// |---------|--------------------------|------|
/// | $00A6 | `DoubleBitsAndWriteRow` | 21 B |
/// | $00BB | `WaitFrame` | 10 B |
/// | $00C5 | `WaitBFrames` | 7 B |
/// | $00CC | `Lockup` | 2 B |
/// | $00CE | Nintendo logo reference | 48 B |
/// | $00FE | `BootGame` (LDH [$FF50]) | 2 B |
pub const DMG_BOOT_ROM: = ;