Add Interrupt module
This commit is contained in:
		
							parent
							
								
									de755822d3
								
							
						
					
					
						commit
						4df4aea484
					
				
					 4 changed files with 71 additions and 1 deletions
				
			
		
							
								
								
									
										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…
	
	Add table
		Add a link
		
	
		Reference in a new issue