/** * @file Specific definitions of the event handlers (CPU & UI) used within this program * @copyright Alexander Bass 2024 * @license GPL-3.0 */ import { EventHandler } from "./eventHandler"; import { Instruction, ParameterType } from "./instructionSet"; import { u2, u3, u8 } from "./num"; // // CPU Event Handler Definition // export enum CpuEvent { MemoryChanged, RegisterChanged, ProgramCounterChanged, InstructionParsed, ParameterParsed, InvalidParsed, InstructionExecuted, Cycle, Print, Reset, Halt, // ClockStarted, // ClockStopped, MemoryAccessed, SwitchBank, SetFlagCarry, } type VoidDataCpuEventList = CpuEvent.Halt | CpuEvent.Reset | CpuEvent.Cycle; // | CpuEvent.ClockStarted // | CpuEvent.ClockStopped; interface CpuEventMap { [CpuEvent.MemoryChanged]: { address: u8; bank: u2; value: u8 }; [CpuEvent.MemoryAccessed]: { address: u8; bank: u2; value: u8 }; [CpuEvent.RegisterChanged]: { register_no: u3; value: u8 }; [CpuEvent.ProgramCounterChanged]: { counter: u8 }; [CpuEvent.InstructionParsed]: { pos: u8; code: u8; instr: Instruction }; [CpuEvent.ParameterParsed]: { pos: u8; code: u8; param: ParameterType }; [CpuEvent.InvalidParsed]: { pos: u8; code: u8 }; [CpuEvent.InstructionExecuted]: { instr: Instruction }; [CpuEvent.SwitchBank]: { bank: u2 }; [CpuEvent.Print]: string; [CpuEvent.SetFlagCarry]: boolean; } export interface CpuEventHandler extends EventHandler { listen(type: E, listener: () => void): void; dispatch(type: E): void; listen(type: E, listener: (ev: CpuEventMap[E]) => void): void; dispatch(type: E, data: CpuEventMap[E]): void; } interface CpuEventHandlerConstructor { new (): CpuEventHandler; } export const CpuEventHandler = EventHandler as CpuEventHandlerConstructor; // // Ui Event Handler Definition // export enum UiEvent { // Maybe move these into a UI -> CPU signal system? RequestCpuCycle, RequestMemoryChange, RequestRegisterChange, // Ui Events EditOn, EditOff, ConsoleOn, ConsoleOff, ExplainerOn, ExplainerOff, VideoOn, VideoOff, } interface UiEventMap { [UiEvent.RequestCpuCycle]: number; [UiEvent.RequestMemoryChange]: { address: u8; value: u8 }; [UiEvent.RequestRegisterChange]: { register_no: u3; value: u8 }; } type VoidDataUiEventList = UiEvent.EditOn | UiEvent.EditOff; export interface UiEventHandler extends EventHandler { listen(type: E, listener: (ev: UiEventMap[E]) => void): void; dispatch(type: E, data: UiEventMap[E]): void; listen(type: E, listener: () => void): void; dispatch(type: E): void; } interface UiEventHandlerConstructor { new (): UiEventHandler; } export const UiEventHandler = EventHandler as UiEventHandlerConstructor;