Add Interrupt module
This commit is contained in:
parent
de755822d3
commit
4df4aea484
1
Makefile
1
Makefile
|
@ -6,6 +6,7 @@ debug:
|
||||||
|
|
||||||
check:
|
check:
|
||||||
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_bit.byte --
|
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_bit.byte --
|
||||||
|
ocamlbuild -use-ocamlfind -I src -lflag -g test/test_interrupt.byte --
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf _build
|
rm -rf _build
|
||||||
|
|
39
src/interrupt.ml
Normal file
39
src/interrupt.ml
Normal 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 []
|
|
@ -1,7 +1,7 @@
|
||||||
open OUnit2
|
open OUnit2
|
||||||
|
|
||||||
|
|
||||||
let test_signed test_ctx =
|
let test_signed _ =
|
||||||
let n = 0xFA in
|
let n = 0xFA in
|
||||||
let s = Bit.signed_byte n in
|
let s = Bit.signed_byte n in
|
||||||
assert_equal s (-6)
|
assert_equal s (-6)
|
||||||
|
|
30
test/test_interrupt.ml
Normal file
30
test/test_interrupt.ml
Normal 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
|
Loading…
Reference in a new issue