DEFINITION MODULE Handler; (* Exception and Event Handling. *) FROM SYSTEM IMPORT ADDRESS, WORD; EXPORT QUALIFIED (* CONSTs *) BufferEmpty, BufferFull, KeyboardInt, ADCComplete, VSync, TimerInt, Escape, Other, NoUserSuppliedHandler, (* TYPEs *) Register, RegisterSet, PSRBit, PSRContents, LinkTableEntry, ModuleRecord, PointerToModuleRecord, UsersEnvironment, UsersEnvironmentPTR, ConditionHandlerType, UserEventHandler, ExceptionType, TypeCode, (* PROCEDUREs *) Signal, CallHandler, DeclareEventHandler, RemoveEventHandler, EventStatus, SetEventStatus, DeclareConditionHandler, XSignal, XCallHandler, XDeclareEventHandler, XRemoveEventHandler, XEventStatus, XSetEventStatus, XDeclareConditionHandler; CONST BufferEmpty = 0; BufferFull = 1; KeyboardInt = 2; ADCComplete = 3; VSync = 4; TimerInt = 5; Escape = 6; Other = 255; TYPE Register = (pc,sp1,fp,upsr,mod, r0,r1,r2,r3,r4,r5,r6,r7, f0,f1,f2,f3,f4,f5,f6,f7); RegisterSet = SET OF Register; PSRBit = (c,t,l,b3,b4,f,z,n,u,s,p,i); PSRContents = SET OF PSRBit; TypeCode = (Init,Stop,Except,ExceptPassedOn, Diagnose,DiagnosePassedOn,DescribeFrame, DescribeModuleData,Unwind); Huge = [-1000000..+1000000]; LinkTableEntry = WORD; ExceptionType = (NVI,NMI,ABT,FPU,ILL,SVC,DVZ,FLG,BPT,TRC,UND); PointerToModuleRecord = POINTER TO ModuleRecord; ModuleRecord = RECORD StaticBase : ADDRESS; LinkTableBase : POINTER TO ARRAY Huge OF LinkTableEntry; ProgramBase : ADDRESS; Reserved : WORD; END; UsersEnvironment = RECORD Validity : RegisterSet; PC : ADDRESS; SP1 : ADDRESS; FP : ADDRESS; UserPSR : PSRContents; Mod : PointerToModuleRecord; Register : ARRAY [0..7] OF WORD; FPRegister : ARRAY [0..7] OF WORD; END; UsersEnvironmentPTR = POINTER TO UsersEnvironment; TYPE ConditionHandlerType = PROCEDURE(TypeCode, INTEGER, VAR UsersEnvironment, VAR UsersEnvironment):INTEGER; TYPE UserEventHandler = PROCEDURE( INTEGER,INTEGER,INTEGER, INTEGER,VAR UsersEnvironment); CONST NoUserSuppliedHandler = 0; PROCEDURE Signal(Cause:INTEGER;Buffer:ADDRESS); PROCEDURE CallHandler( Type:TypeCode; Parameter:INTEGER; VAR CurrentEnv:UsersEnvironment; VAR ExceptEnv:UsersEnvironment):INTEGER; PROCEDURE DeclareEventHandler (NewHandler : UserEventHandler; Event:CARDINAL; Action:CARDINAL; Handle:CARDINAL):INTEGER; PROCEDURE RemoveEventHandler (Handler : UserEventHandler; Event:CARDINAL; Handle:CARDINAL):INTEGER; PROCEDURE EventStatus(Event:CARDINAL):INTEGER; PROCEDURE SetEventStatus( Event:CARDINAL; Enable:BOOLEAN):INTEGER; PROCEDURE DeclareConditionHandler(ConditionHandler : ConditionHandlerType) :INTEGER; PROCEDURE XSignal(Cause:INTEGER;Buffer:ADDRESS); PROCEDURE XCallHandler( Type:TypeCode; Parameter:INTEGER; VAR CurrentEnv:UsersEnvironment; VAR ExceptEnv:UsersEnvironment):INTEGER; PROCEDURE XDeclareEventHandler (NewHandler : UserEventHandler; Event:CARDINAL; Action:CARDINAL; Handle:CARDINAL):INTEGER; PROCEDURE XRemoveEventHandler (Handler : UserEventHandler; Event:CARDINAL; Handle:CARDINAL):INTEGER; PROCEDURE XEventStatus(Event:CARDINAL):INTEGER; PROCEDURE XSetEventStatus( Event:CARDINAL; Enable:BOOLEAN):INTEGER; PROCEDURE XDeclareConditionHandler(ConditionHandler : ConditionHandlerType) :INTEGER; END Handler.