(** * 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 (** Return the list of interrupt flags sorted by priority. *) 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 | _ -> List.rev accu in get_flag byte 0 []