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: | ||||
| 	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
									
								
							
							
						
						
									
										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 | ||||
| 
 | ||||
| 
 | ||||
| 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
									
								
							
							
						
						
									
										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