@@ -77,7 +77,7 @@ static void GameBoy_simulate_boot(GameBoy* const gb) {
7777 gb -> boot_rom_enable = false;
7878}
7979
80- GameBoy GameBoy_new (const uint8_t * const boot_rom , uint8_t * const rom , const size_t rom_len ) {
80+ GameBoy GameBoy_new (uint8_t * const boot_rom , uint8_t * const rom , const size_t rom_len ) {
8181 GameBoy gb = (GameBoy ){
8282 .cpu = Cpu_new (),
8383 .boot_rom = boot_rom ,
@@ -114,6 +114,9 @@ GameBoy GameBoy_new(const uint8_t* const boot_rom, uint8_t* const rom, const siz
114114
115115void GameBoy_destroy (GameBoy * const restrict gb ) {
116116 free (gb -> rom );
117+ if (gb -> boot_rom != nullptr ) {
118+ free (gb -> boot_rom );
119+ }
117120 gb -> rom = nullptr ;
118121 gb -> rom_len = 0 ;
119122}
@@ -126,9 +129,8 @@ uint8_t GameBoy_read_io(const GameBoy* const restrict gb, const uint16_t addr) {
126129
127130 if (addr == 0xFF01 ) {
128131 // FF01 (serial transfer data)
129- // TODO: implement properly
132+ // TODO: implement serial transfer
130133 return 0xFF ;
131- // return gb->sb;
132134 }
133135
134136 if (addr == 0xFF02 ) {
@@ -138,22 +140,16 @@ uint8_t GameBoy_read_io(const GameBoy* const restrict gb, const uint16_t addr) {
138140
139141 if (addr >= 0xFF04 && addr <= 0xFF07 ) {
140142 // FF04-FF07 (timer and divider)
143+
144+ // clang-format off
141145 switch (addr ) {
142- case 0xFF04 :
143- return gb -> div ;
144- break ;
145- case 0xFF05 :
146- return gb -> tima ;
147- break ;
148- case 0xFF06 :
149- return gb -> tma ;
150- break ;
151- case 0xFF07 :
152- return gb -> tac ;
153- break ;
154- default :
155- BAIL ("Unexpected I/O timer and divider read ($%04X)" , addr );
146+ case 0xFF04 : return gb -> div ;
147+ case 0xFF05 : return gb -> tima ;
148+ case 0xFF06 : return gb -> tma ;
149+ case 0xFF07 : return gb -> tac ;
150+ default : BAIL ("Unexpected I/O timer and divider read ($%04X)" , addr );
156151 }
152+ // clang-format on
157153 }
158154
159155 if (addr == 0xFF0F ) {
@@ -193,13 +189,12 @@ uint8_t GameBoy_read_io(const GameBoy* const restrict gb, const uint16_t addr) {
193189 }
194190
195191 if (addr == 0xFF4D ) {
196- // FF4D (CGB registers, unimplemented as of now )
192+ // FF4D (CGB registers, CGB-only )
197193 return 0xFF ;
198194 }
199195
200196 if (addr == 0xFF4F ) {
201- // FF4F
202- BAIL ("TODO: I/O VRAM bank select read ($%04X)" , addr );
197+ // FF4F (VRAM bank select, CGB-only)
203198 }
204199
205200 if (addr == 0xFF50 ) {
@@ -208,18 +203,18 @@ uint8_t GameBoy_read_io(const GameBoy* const restrict gb, const uint16_t addr) {
208203 }
209204
210205 if (addr >= 0xFF51 && addr <= 0xFF55 ) {
211- // FF51-FF55 (VRAM DMA)
212- BAIL ( "TODO: I/O VRAM DMA read ($%04X)" , addr ) ;
206+ // FF51-FF55 (VRAM DMA, CGB-only )
207+ return 0xFF ;
213208 }
214209
215210 if (addr >= 0xFF68 && addr <= 0xFF6B ) {
216- // FF68-FF6B (palettes)
217- BAIL ( "TODO: I/O palettes read ($%04X)" , addr ) ;
211+ // FF68-FF6B (LCD color palettes, CGB-only )
212+ return 0xFF ;
218213 }
219214
220215 if (addr == 0xFF70 ) {
221- // FF70 (WRAM bank select)
222- BAIL ( "TODO: I/O WRAM bank select read ($%04X)" , addr ) ;
216+ // FF70 (WRAM bank select, CGB-only )
217+ return 0xFF ;
223218 }
224219
225220 BAIL ("Unexpected I/O read (addr = $%04X)" , addr );
@@ -358,14 +353,11 @@ void GameBoy_write_io(GameBoy* const restrict gb, const uint16_t addr, const uin
358353 if (value != 0 )
359354 gb -> boot_rom_enable = false;
360355 } else if (addr >= 0xFF51 && addr <= 0xFF55 ) {
361- // FF51-FF55 (VRAM DMA)
362- BAIL ("I/O VRAM DMA write ($%04X, $%02X)" , addr , value );
356+ // FF51-FF55 (VRAM DMA, CGB-only)
363357 } else if (addr >= 0xFF68 && addr <= 0xFF6B ) {
364- // FF68-FF6B (palettes)
365- BAIL ("I/O palettes write ($%04X, $%02X)" , addr , value );
358+ // FF68-FF6B (LCD color palettes, CGB-only)
366359 } else if (addr == 0xFF70 ) {
367- // FF70 (WRAM bank select)
368- BAIL ("I/O WRAM bank select write ($%04X, $%02X)" , addr , value );
360+ // FF70 (WRAM bank select, CGB-only)
369361 } else if (addr == 0xFF7F ) {
370362 // Tetris tries to write here. Probably a no-op.
371363 } else {
0 commit comments