Add Interrupt module

master
Fabien Freling 2016-02-28 23:41:06 +01:00
parent de755822d3
commit 4df4aea484
4 changed files with 71 additions and 1 deletions

View File

@ -6,6 +6,7 @@ debug:
check:
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_bit.byte --
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_interrupt.byte --
clean:
rm -rf _build

39
src/interrupt.ml Normal file
View File

@ -0,0 +1,39 @@
(**
* Copyright (c) 2016, Fabien Freling
* All rights reserved.
*
* This source code is licensed under the BSD 2-clause license found in the
* LICENSE file at the top level directory of this source tree.
*)
(* let IME = ref false;; *)
type t =
| V_Blank
| LCD_Stat
| Timer
| Serial
| Joypad
let get_flags byte =
let nth_interrupt i =
match i with
| 0 -> V_Blank
| 1 -> LCD_Stat
| 2 -> Timer
| 3 -> Serial
| 4 -> Joypad
| _ -> failwith "Invalid interrupt index." in
let rec get_flag byte i accu =
match i with
| 0 | 1 | 2 | 3 | 4 ->
if Bit.is_set byte i then
let interrupt = nth_interrupt i in
get_flag byte (i + 1) (interrupt :: accu)
else
get_flag byte (i + 1) accu
| _ -> accu in
get_flag byte 0 []

View File

@ -1,7 +1,7 @@
open OUnit2
let test_signed test_ctx =
let test_signed _ =
let n = 0xFA in
let s = Bit.signed_byte n in
assert_equal s (-6)

30
test/test_interrupt.ml Normal file
View File

@ -0,0 +1,30 @@
open OUnit2
let test_interrupt _ =
let input_refs = [
( 0b00000000, [] );
( 0b00000001, [ Interrupt.V_Blank ] );
( 0b00000010, [ Interrupt.LCD_Stat ] );
( 0b00000100, [ Interrupt.Timer ] );
( 0b00001000, [ Interrupt.Serial ] );
( 0b00010000, [ Interrupt.Joypad ] );
] in
let test =
function ( byte, ref_flags ) ->
let computed_flags = Interrupt.get_flags byte in
List.iter2 (fun f1 f2 -> assert_equal f1 f2) ref_flags computed_flags in
List.iter test input_refs
(* Name the test cases and group them together *)
let suite =
"suite">:::
[
"test interrupt parsing">:: test_interrupt
]
let () =
run_test_tt_main suite