From 02e2ef3cafbaa292208c18eb0b8f8659636c195a Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Thu, 5 Mar 2015 23:00:28 +0100 Subject: [PATCH] Add basic support for MBC. --- src/cartridge.ml | 26 ++++++++++++++++++++++++-- src/cpu.ml | 6 +++++- src/oboy.ml | 4 +--- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/cartridge.ml b/src/cartridge.ml index 7e5587c..c82ae24 100644 --- a/src/cartridge.ml +++ b/src/cartridge.ml @@ -9,7 +9,7 @@ type t = { full_rom : bytes; nintendo_logo : bytes; title : string; -(* mem_type : memory_bank_controller; *) + mem_type : memory_bank_controller; rom_size : int; ram_size : int; (* header_checksum : bytes; @@ -24,6 +24,16 @@ let check_nintendo_logo cartridge = \xBB\xBB\x67\x63\x6E\x0E\xEC\xCC\xDD\xDC\x99\x9F\xBB\xB9\x33\x3E" in (Bytes.compare cartridge.nintendo_logo reference) == 0 +let get_cartridge_type = function + | 0x00 -> ROM_ONLY + | 0x01 -> MBC1 + | x -> Printf.printf "%02X\n" x; failwith "Invalid cartridge type." + +let mem_type_name = function + | ROM_ONLY -> "ROM_ONLY" + | MBC1 -> "MBC1" + + (** ROM size is expressed in KB *) let get_ROM_size = function | 0x00 -> 32 (* no ROM banking *) @@ -69,6 +79,10 @@ let read_cartridge file = let title_b = Bytes.sub full_rom title_offset title_size in let title = Bytes.to_string title_b in + (* Cartridge type - memory bank *) + let mem_type_code = Bytes.get full_rom 0x0147 |> int_of_char in + let mem_type = get_cartridge_type mem_type_code in + (* ROM size *) let rom_size_code = Bytes.get full_rom 0x0148 |> int_of_char in let rom_size = get_ROM_size rom_size_code in @@ -77,9 +91,17 @@ let read_cartridge file = let ram_size_code = Bytes.get full_rom 0x0149 |> int_of_char in let ram_size = get_RAM_size ram_size_code in - Some { full_rom; nintendo_logo; title; rom_size; ram_size } + Some { full_rom; nintendo_logo; title; mem_type; rom_size; ram_size } with | Sys_error msg | Invalid_argument msg (* This is triggered by Bytes.sub *) | Failure msg -> prerr_endline msg; None + + +let print_info cartridge = + let open Printf in + printf "Title: %s\n" cartridge.title; + printf "Mem. type: %s\n" (cartridge.mem_type |> mem_type_name); + printf "ROM size: %iKB\n" cartridge.rom_size; + printf "RAM size: %iKB\n" cartridge.ram_size diff --git a/src/cpu.ml b/src/cpu.ml index a9fc8a5..cd0314d 100644 --- a/src/cpu.ml +++ b/src/cpu.ml @@ -99,7 +99,11 @@ let run cpu (cartridge: Cartridge.t) = printf " JP \t0x%04X\n" addr; cpu.reg.pc <- addr; inc_cycles cpu 16 - | '\xE0' -> printf " LDH \t(0x%02X), A\n" (int_of_char n); + | '\xE0' -> printf " LDH \t(0xFF%02X), A\n" (int_of_char n); + (* fixme *) + inc_pc cpu 2; inc_cycles cpu 12 + + | '\xF0' -> printf " LDH \tA, (0xFF%02X)\n" (int_of_char n); (* fixme *) inc_pc cpu 2; inc_cycles cpu 12 diff --git a/src/oboy.ml b/src/oboy.ml index 7bc667f..508478b 100644 --- a/src/oboy.ml +++ b/src/oboy.ml @@ -12,9 +12,7 @@ let power_up cartridge = then print_endline "Invalid ROM." else print_endline "Valid ROM."; - printf "Title: %s\n" cartridge.title; - printf "ROM size: %iKB\n" cartridge.rom_size; - printf "RAM size: %iKB\n" cartridge.ram_size; + Cartridge.print_info cartridge; let cpu = Cpu.init_cpu in run cpu cartridge