home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE EventHandler;
- ⓪ (*$L-, Y+*)
- ⓪
- ⓪ (* Implementation des 'EventHandler's der Megamax Modula-2 Biblothek
- ⓪!*
- ⓪!* geschrieben von Manuel Chakravarty Created: 9.9.87
- ⓪!*
- ⓪!* Version 2.2 V#0129
- ⓪!*)
- ⓪!
- ⓪ (* 09.09.87 | Definitionen
- ⓪!* 13.09.87 | 'InstallWatchDog' und 'DeInstallWatchDog' implementiert
- ⓪!* 21.09.87 | 'commonHandler' und seine Benutzer impl.+ time/msgHdler
- ⓪!* 22.09.87 | 'HandleEvents' impl.
- ⓪!* 28.09.87 | Message-Install's lösen bei einem 'HandleEvents' jetzt
- ⓪!* autom. eine Abfrage nach Message-Events aus, diese Eve-
- ⓪!* nts werden falls nicht Abgefangen noch mal mittels
- ⓪!* 'WriteToAppl' gesendet. 'ShareTime' impl.
- ⓪!* 30.09.87 | SysInstall impl.
- ⓪!* 07.11.87 | Anpassung an GEM V 0.10
- ⓪!* 19.01.88 TT | levelCounter: deInstall korrgiert, searchList optimiert
- ⓪!* 30.03.88 | 'HandleEvents' ruft jetzt bei Msg.events nur noch die
- ⓪!* Proc's auf, die für den aufgetrettenen Msg.event-Typ
- ⓪!* angemeldet sind (einzige Ausnahme 'unspecMessage').
- ⓪!* 23.12.88 | 'ReadFromAppl' wird beim message add wirklich nur aufge-
- ⓪!* rufen, falls die Nachricht länger als 16 Byte ist. Außerdem
- ⓪!* wird des HIGH-Wert für die open arrays richtig übergeben.
- ⓪!* 01.03.89 | *** Def-Änderung *** auf 2.00. Neu: 'FlushEvents'
- ⓪!* 17.08.89 | 'KeyboardProc' um 'keys' erweitert
- ⓪!* 15.02.90 | Anpassung an Compilerversion 4.0
- ⓪!* 21.05.93 TT | Reentry bei ShareTime/FlushEvents verhindert.
- ⓪!*)
- ⓪
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, WORD,
- ⓪7ADR;
- ⓪
- ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE;
- ⓪
- ⓪ FROM PrgCtrl IMPORT EnvlpCarrier, TermCarrier,
- ⓪7CatchProcessTerm, SetEnvelope;
- ⓪
- ⓪ FROM ResCtrl IMPORT RemovalCarrier,
- ⓪7CatchRemoval;
- ⓪
- ⓪ FROM MOSGlobals IMPORT OutOfMemory, MemArea;
- ⓪
- ⓪ FROM GrafBase IMPORT Point, Rectangle,
- ⓪7Rect;
- ⓪2
- ⓪ FROM GEMGlobals IMPORT GemChar, MButtonSet, SpecialKeySet;
- ⓪4
- ⓪ IMPORT GEMShare;
- ⓪
- ⓪ FROM GEMEnv IMPORT ApplicationID;
- ⓪
- ⓪ FROM AESEvents IMPORT unspecMessage, menuSelected, windRedraw, windTopped,
- ⓪7windClosed, windFulled, windArrowed, windHSlid,
- ⓪7windVSlid, windSized, windMoved, windNewTop, accOpen,
- ⓪7accClose, Event, EventSet, ArrowedMode, MessageBuffer,
- ⓪7RectEnterMode,
- ⓪7MultiEvent;
- ⓪
- ⓪ FROM AESMisc IMPORT ReadFromAppl, WriteToAppl;
- ⓪
- ⓪
- ⓪
- ⓪ TYPE ptrCarrier =POINTER TO carrier;
- ⓪(carrier =RECORD
- ⓪;proc :PROC; (* Da Aufruf per JSR, sind *
- ⓪R* die Param. egal. *)
- ⓪;CASE (*messageEvent*):BOOLEAN OF
- ⓪=FALSE : |
- ⓪=TRUE : msgType:CARDINAL|
- ⓪;END;
- ⓪;next :ptrCarrier;
- ⓪;level :INTEGER;
- ⓪;(*future :LONGWORD;*)
- ⓪9END;
- ⓪9
- ⓪ VAR keyboardList,buttonList,stRectList,
- ⓪(ndRectList,messageList,timerList :ptrCarrier;
- ⓪(
- ⓪(watchDogExecuted: BOOLEAN; (* Semaphore between 'FlushEvents' and
- ⓪D* the watch dog servers. *)
- ⓪(flushExecuted : INTEGER; (* semaphore f. FlushEvents/ShareTime *)
- ⓪(
- ⓪(modLevel : INTEGER;
- ⓪(
- ⓪(voidI : INTEGER;
- ⓪(
- ⓪(
- ⓪ (* commonHandler - Führt Handling für 'keyboard', 'mouseButton', 'firstRect'
- ⓪!* 'secondRect' durch. 'data' sind die Daten, die
- ⓪!* an die einzelnen Proc's als Parameter übergeben werden
- ⓪!* sollen. 'list' ist die zu bearbeitende Proc-Liste.
- ⓪!*)
- ⓪ (*$J-*)
- ⓪ PROCEDURE commonHandler(REF data: ARRAY OF WORD; list: ptrCarrier): BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A0 ; 'list' -> A0
- ⓪(MOVE.W -(A3),D1 ; HIGH(data) -> D1
- ⓪(MOVE.L -(A3),A1 ; ADR(data) -> A1
- ⓪(CMPA.L #NIL,A0
- ⓪(BEQ endTRUE ; Leere List -> RETURN TRUE
- ⓪(
- ⓪(MOVE.W #TRUE, watchDogExecuted
- ⓪ loop
- ⓪(MOVE.W D1,D2 ; kopiere Param. auf A3-Stack
- ⓪(MOVE.L A1,A2
- ⓪ loop2
- ⓪(MOVE.W (A2)+,(A3)+
- ⓪(DBF D2,loop2
- ⓪(MOVE.L carrier.proc(A0),A2 ; Hole Proceduraddresse
- ⓪(MOVEM.L D1/A0-A1,-(A7)
- ⓪(JSR (A2) ; und springe Userproc. an
- ⓪(MOVEM.L (A7)+,D1/A0-A1
- ⓪(MOVE.L carrier.next(A0),A0 ; hole Zeiger auf nächstes Listenelement
- ⓪(CMPA.L #NIL,A0
- ⓪(BEQ ende ; Listenende? => Fertig.
- ⓪(TST.W -(A3)
- ⓪(BNE loop ; Falls Userproc. keinen Abbruch wünscht weiter
- ⓪(MOVE.W #FALSE,(A3)+
- ⓪(BRA ende
- ⓪(
- ⓪ endTRUE
- ⓪(MOVE.W #TRUE,(A3)+
- ⓪ ende
- ⓪$END;
- ⓪"END commonHandler;
- ⓪(
- ⓪ (*$J-*)
- ⓪ PROCEDURE keyboardHandler(VAR ch: GemChar; VAR keys: SpecialKeySet): BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪ CONST noParamB =8;
- ⓪(noParamW =noParamB DIV 2 - 1; (* -1, da HIGH mit 0 beginnt *)
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LEA -noParamB(A3),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.W #noParamW,(A3)+
- ⓪(MOVE.L keyboardList,(A3)+
- ⓪(JSR commonHandler
- ⓪(MOVE.W -(A3),D0
- ⓪(SUBQ.L #noParamB,A3
- ⓪(MOVE.W D0,(A3)+
- ⓪"END;
- ⓪ END keyboardHandler;
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE buttonHandler(clicks:CARDINAL;loc:Point;buts:MButtonSet;
- ⓪8specials:SpecialKeySet):BOOLEAN;
- ⓪ (*$J=*)
- ⓪8
- ⓪ CONST noParamB =10;
- ⓪(noParamW =noParamB DIV 2 - 1;
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LEA -noParamB(A3),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.W #noParamW,(A3)+
- ⓪(MOVE.L buttonList,(A3)+
- ⓪(JSR commonHandler
- ⓪(MOVE.W -(A3),D0
- ⓪(SUBA.W #noParamB,A3
- ⓪(MOVE.W D0,(A3)+
- ⓪"END;
- ⓪ END buttonHandler;
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE stRectHandler(loc:Point;buts:MButtonSet;
- ⓪8specials:SpecialKeySet):BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪ CONST noParamB =8;
- ⓪(noParamW =noParamB DIV 2 - 1;
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LEA -noParamB(A3),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.W #noParamW,(A3)+
- ⓪(MOVE.L stRectList,(A3)+
- ⓪(JSR commonHandler
- ⓪(MOVE.W -(A3),D0
- ⓪(SUBQ.L #noParamB,A3
- ⓪(MOVE.W D0,(A3)+
- ⓪"END;
- ⓪ END stRectHandler;
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE ndRectHandler(loc:Point;buts:MButtonSet;
- ⓪8specials:SpecialKeySet):BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪ CONST noParamB =8;
- ⓪(noParamW =noParamB DIV 2 - 1;
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LEA -noParamB(A3),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.W #noParamW,(A3)+
- ⓪(MOVE.L ndRectList,(A3)+
- ⓪(JSR commonHandler
- ⓪(MOVE.W -(A3),D0
- ⓪(SUBQ.L #noParamB,A3
- ⓪(MOVE.W D0,(A3)+
- ⓪"END;
- ⓪ END ndRectHandler;
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE messageHandler(msg:MessageBuffer):BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LEA -16(A3),A0 ; ADR(msg) -> A0
- ⓪(MOVE.W (A0),D0 ; msg[0] (type of the message) -> D0
- ⓪@; CASE msg[0] OF
- ⓪(CMP.W #menuSelected,D0
- ⓪(BEQ copy2
- ⓪(CMP.W #windRedraw,D0
- ⓪(BEQ copy5
- ⓪(CMP.W #windTopped,D0
- ⓪(BEQ copy1
- ⓪(CMP.W #windClosed,D0
- ⓪(BEQ copy1
- ⓪(CMP.W #windFulled,D0
- ⓪(BEQ copy1
- ⓪(CMP.W #windArrowed,D0
- ⓪(BEQ copy2
- ⓪(CMP.W #windHSlid,D0
- ⓪(BEQ copy2
- ⓪(CMP.W #windVSlid,D0
- ⓪(BEQ copy2
- ⓪(CMP.W #windSized,D0
- ⓪(BEQ copy5
- ⓪(CMP.W #windMoved,D0
- ⓪(BEQ copy5
- ⓪(CMP.W #windNewTop,D0
- ⓪(BEQ copy1
- ⓪(CMP.W #accOpen,D0
- ⓪(BEQ copy1from4
- ⓪(CMP.W #accClose,D0
- ⓪(BEQ copy1
- ⓪(
- ⓪(MOVEQ #unspecMessage,D0 ; keine message vom AES
- ⓪(LEA (A0),A1
- ⓪(MOVEQ #7,D1
- ⓪(BRA cont
- ⓪(
- ⓪ copy1
- ⓪(LEA 6(A0),A1 ; ab msg[3]
- ⓪(MOVEQ #0,D1 ; 1 Wort
- ⓪(BRA cont
- ⓪(
- ⓪ copy1from4
- ⓪(LEA 8(A0),A1
- ⓪(MOVEQ #0,D1
- ⓪(BRA cont
- ⓪(
- ⓪ copy2
- ⓪(LEA 6(A0),A1
- ⓪(MOVEQ #1,D1
- ⓪(BRA cont
- ⓪
- ⓪ copy5
- ⓪(LEA 6(A0),A1
- ⓪(MOVEQ #4,D1
- ⓪(
- ⓪ cont
- ⓪(MOVEQ #TRUE,D2 ; init. momentanes Ergebnis
- ⓪(MOVE.L messageList,A2
- ⓪(
- ⓪ loop
- ⓪(CMPA.L #NIL,A2
- ⓪(BEQ ende ; Falls Listenende, dann Fertig.
- ⓪(CMP.W carrier.msgType(A2),D0
- ⓪(BEQ typeMatch ; springe, falls Listenelem.typ = ges. Typ
- ⓪(TST.W carrier.msgType(A2)
- ⓪(BNE skipElem ; springe, falls Listenelem.typ # unspecMessage
- ⓪(MOVEM.L D0-D1/A0-A2,-(A7)
- ⓪(MOVE.L A0,A1 ; Kopierparam. für 'unspecMessage'
- ⓪(MOVEQ #7,D1
- ⓪(BRA loop2
- ⓪(
- ⓪ typeMatch
- ⓪(MOVEM.L D0-D1/A0-A2,-(A7)
- ⓪ loop2
- ⓪(MOVE.W (A1)+,(A3)+ ; kopiere Param.
- ⓪(DBF D1,loop2
- ⓪(MOVE.L carrier.proc(A2),A2
- ⓪(JSR (A2) ; springe Userproc. an
- ⓪(MOVEM.L (A7)+,D0-D1/A0-A2
- ⓪(MOVE.W -(A3),D2 ; neues momentanes Ergebnis -> D2
- ⓪ skipElem
- ⓪(MOVE.L carrier.next(A2),A2 ; nächstes Listenelem.
- ⓪(TST.W D2
- ⓪(BNE loop ; nochmal, falls momentanes Ergebnis # FALSE
- ⓪(
- ⓪(MOVE.W #TRUE, watchDogExecuted
- ⓪ ende
- ⓪(MOVE.L A0,A3 ; A3-Stack korrigieren
- ⓪(MOVE.W D2,(A3)+ ; momentanes Ergebnis zurückgeben
- ⓪"END;
- ⓪ END messageHandler;
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE timerHandler():BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(MOVE.L timerList,A0
- ⓪(CMPA.L #NIL,A0
- ⓪(BEQ endTRUE ; Leere List -> RETURN TRUE
- ⓪(
- ⓪ loop
- ⓪(MOVE.L carrier.proc(A0),A2 ; Hole Proceduraddresse
- ⓪(MOVE.L A0,-(A7)
- ⓪(JSR (A2) ; und springe Userproc. an
- ⓪(MOVE.L (A7)+,A0
- ⓪(MOVE.L carrier.next(A0),A0 ; hole Zeiger auf nächstes Listenelement
- ⓪(CMPA.L #NIL,A0
- ⓪(BEQ ende ; Listenende? => Fertig.
- ⓪(TST.W -(A3)
- ⓪(BNE loop ; Falls Userproc. keinen Abbruch wünscht weiter
- ⓪(MOVE.W #FALSE,(A3)+
- ⓪(BRA ende
- ⓪(
- ⓪ endTRUE
- ⓪(MOVE.W #TRUE,(A3)+
- ⓪ ende
- ⓪"END;
- ⓪ END timerHandler;
- ⓪
- ⓪
- ⓪ PROCEDURE InstallWatchDog(VAR handle:WatchDogCarrier;proc:EventProc);
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(MOVE.L -(A3),-(A7)
- ⓪(MOVE.L -(A3),D0
- ⓪(MOVE.W D0,-(A7)
- ⓪(SWAP D0 ; 'proc.event' -> D0
- ⓪(CMP.W #keyboard,D0 ; CASE proc.event OF
- ⓪(BEQ installKey
- ⓪(CMP.W #mouseButton,D0
- ⓪(BEQ installBut
- ⓪(CMP.W #firstRect,D0
- ⓪(BEQ.W installSt
- ⓪(CMP.W #secondRect,D0
- ⓪(BEQ.W installNd
- ⓪(CMP.W #message,D0
- ⓪(BEQ.W installMsg
- ⓪(CMP.W #timer,D0
- ⓪(BEQ.W installTime
- ⓪(TST.W (A7)+ ; an diesen Punkt kommt man theoretisch nie
- ⓪(TST.L (A7)+
- ⓪(BRA.W ende
- ⓪(
- ⓪ installKey ; install keyboard watch dog
- ⓪(TST.L keyboardList
- ⓪(BNE keyActive ; jump if 'keyboardList#NIL' (already plugged)
- ⓪(LEA keyboardHandler,A0
- ⓪(MOVE.L A0,keyboardPlug ; plug into the 'GEMshare.keyboardPlug'
- ⓪(MOVE.W #TRUE,keyboardPlugActive
- ⓪ keyActive
- ⓪(MOVE.L -(A3),A0 ; ADR(handle) -> A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.L (A7)+,carrier.proc(A0) ; init. carrier and make it first
- ⓪(TST.W (A7)+ ; element of the keyboard carrier list
- ⓪(MOVE.L keyboardList,carrier.next(A0)
- ⓪(MOVE.L A0,keyboardList
- ⓪(BRA.W ende
- ⓪(
- ⓪ installBut ; install mouse button watch dog
- ⓪(TST.L buttonList
- ⓪(BNE butActive
- ⓪(LEA buttonHandler,A0
- ⓪(MOVE.L A0,buttonPlug
- ⓪(MOVE.W #TRUE,buttonPlugActive
- ⓪ butActive
- ⓪(MOVE.L -(A3),A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.L (A7)+,carrier.proc(A0)
- ⓪(TST.W (A7)+
- ⓪(MOVE.L buttonList,carrier.next(A0)
- ⓪(MOVE.L A0,buttonList
- ⓪(BRA.W ende
- ⓪(
- ⓪ installSt
- ⓪(TST.L stRectList
- ⓪(BNE stActive
- ⓪(LEA stRectHandler,A0
- ⓪(MOVE.L A0,firstRectPlug
- ⓪(MOVE.W #TRUE,firstRectPlugActive
- ⓪ stActive
- ⓪(MOVE.L -(A3),A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.L (A7)+,carrier.proc(A0)
- ⓪(TST.W (A7)+
- ⓪(MOVE.L stRectList,carrier.next(A0)
- ⓪(MOVE.L A0,stRectList
- ⓪(BRA.W ende
- ⓪(
- ⓪ installNd
- ⓪(TST.L ndRectList
- ⓪(BNE ndActive
- ⓪(LEA ndRectHandler,A0
- ⓪(MOVE.L A0,secondRectPlug
- ⓪(MOVE.W #TRUE,secondRectPlugActive
- ⓪ ndActive
- ⓪(MOVE.L -(A3),A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.L (A7)+,carrier.proc(A0)
- ⓪(TST.W (A7)+
- ⓪(MOVE.L ndRectList,carrier.next(A0)
- ⓪(MOVE.L A0,ndRectList
- ⓪(BRA ende
- ⓪(
- ⓪ installMsg ; install message event watch dog
- ⓪(TST.L messageList
- ⓪(BNE msgActive ; already plugged ?
- ⓪(LEA messageHandler,A0 ; if not plug in
- ⓪(MOVE.L A0,messagePlug
- ⓪(MOVE.W #TRUE,messagePlugActive
- ⓪ msgActive
- ⓪(MOVE.L -(A3),A0 ; ADR(handle) -> A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.W (A7)+,carrier.msgType(A0) ; save type of message event -> handle
- ⓪(MOVE.L (A7)+,carrier.proc(A0) ; procedure address -> handle
- ⓪(MOVE.L messageList,carrier.next(A0) ; insert into message list
- ⓪(MOVE.L A0,messageList
- ⓪(BRA ende
- ⓪(
- ⓪ installTime
- ⓪(TST.L timerList
- ⓪(BNE timeActive
- ⓪(LEA timerHandler,A0
- ⓪(MOVE.L A0,timerPlug
- ⓪(MOVE.W #TRUE,timerPlugActive
- ⓪ timeActive
- ⓪(MOVE.L -(A3),A0
- ⓪(MOVE.W modLevel,carrier.level(A0)
- ⓪(MOVE.L (A7)+,carrier.proc(A0)
- ⓪(TST.W (A7)+
- ⓪(MOVE.L timerList,carrier.next(A0)
- ⓪(MOVE.L A0,timerList
- ⓪(
- ⓪ ende
- ⓪"END;
- ⓪ END InstallWatchDog;
- ⓪
- ⓪ PROCEDURE SysInstallWatchDog(VAR handle:WatchDogCarrier;proc:EventProc);
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(MOVE.L -12(A3),-(A7)
- ⓪(JSR InstallWatchDog
- ⓪(MOVE.L (A7)+,A0
- ⓪(CLR carrier.level(A0)
- ⓪"END;
- ⓪ END SysInstallWatchDog;
- ⓪
- ⓪ PROCEDURE DeInstallWatchDog(VAR handle:WatchDogCarrier);
- ⓪
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(MOVE.L -(A3),D1
- ⓪(MOVEQ #5,D0 ; There are 5+1 lists
- ⓪(PEA keyboardList
- ⓪(PEA buttonList
- ⓪(PEA ndRectList
- ⓪(PEA stRectList
- ⓪(PEA messageList
- ⓪(PEA timerList
- ⓪ loop
- ⓪(MOVE.L (A7)+,A0
- ⓪ loop2
- ⓪(MOVE.L (A0),A1
- ⓪(CMPA.L #NIL,A1
- ⓪(BEQ listEnd
- ⓪(CMP.L A1,D1
- ⓪(BEQ foundHandle
- ⓪(LEA carrier.next(A1),A0
- ⓪(BRA loop2
- ⓪ listEnd
- ⓪(DBF D0,loop
- ⓪(BRA ende ; handle was not installed
- ⓪
- ⓪ foundHandle
- ⓪(LSL.W #2,D0 ; pop remaining list pointer from the stack
- ⓪(ADDA.W D0,A7 ; A7:=A7+D0*4
- ⓪(MOVE.L carrier.next(A1),(A0) ; delete 'handle' out of the list
- ⓪(TST.L timerList
- ⓪(BNE cont1
- ⓪(CLR.W timerPlugActive
- ⓪ cont1
- ⓪(TST.L messageList
- ⓪(BNE cont2
- ⓪(CLR.W messagePlugActive
- ⓪ cont2
- ⓪(TST.L ndRectList
- ⓪(BNE cont3
- ⓪(CLR.W secondRectPlugActive
- ⓪ cont3
- ⓪(TST.L stRectList
- ⓪(BNE cont4
- ⓪(CLR.W firstRectPlugActive
- ⓪ cont4
- ⓪(TST.L buttonList
- ⓪(BNE cont5
- ⓪(CLR.W buttonPlugActive
- ⓪ cont5
- ⓪(TST.L keyboardList
- ⓪(BNE ende
- ⓪(CLR.W keyboardPlugActive
- ⓪ ende
- ⓪"END;
- ⓪ END DeInstallWatchDog;
- ⓪
- ⓪ PROCEDURE HandleEvents ( noClicks : CARDINAL;
- ⓪<butMask,
- ⓪<butState : MButtonSet;
- ⓪<moveDirec1: RectEnterMode;
- ⓪<rect1Size : Rectangle;
- ⓪<moveDirec2: RectEnterMode;
- ⓪<rect2Size : Rectangle;
- ⓪<time : LONGCARD;
- ⓪8REF procs : ARRAY OF EventProc;
- ⓪<usedProcs : CARDINAL);
- ⓪8
- ⓪ CONST procRecSize = 8; (* Länge des 'eventProc'-Typs *)
- ⓪
- ⓪ VAR msg : MessageBuffer;
- ⓪(mouseLoc : Point;
- ⓪(buttons : MButtonSet;
- ⓪(keyState : SpecialKeySet;
- ⓪(key : GemChar;
- ⓪(doneClicks, i : CARDINAL;
- ⓪(eventResult : EventSet;
- ⓪(handlerResult : BOOLEAN;
- ⓪(momEvent : Event;
- ⓪(
- ⓪(msgAdd : BOOLEAN;
- ⓪(a7Store : LONGCARD;
- ⓪7
- ⓪ (*$L+*)
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪8; last used index of 'procs' -> 'usedProcs' and D0
- ⓪(MOVE.W usedProcs(A6),D0
- ⓪(MOVE.W procs+4(A6),D1
- ⓪(TST.W D0
- ⓪(BEQ takeHigh
- ⓪(SUBQ.W #1,D0
- ⓪(CMP.W D0,D1
- ⓪(BCC cont
- ⓪ takeHigh
- ⓪(MOVE.W D1,D0
- ⓪ cont
- ⓪(MOVE.W D0,usedProcs(A6)
- ⓪8; Rufe MultiEvent auf, Ergebnis in 'eventResult'
- ⓪(CLR.W D1 ; registrierte events
- ⓪(MOVE.L procs(A6),A0
- ⓪ loop1
- ⓪(MOVE.W EventProc.event(A0),D2
- ⓪(BSET D2,D1 ; registriere den gefundenen Event
- ⓪(ADDQ.L #procRecSize,A0 ; nächstes Arrayelement
- ⓪(DBF D0,loop1
- ⓪<; Zusätzlich message event falls nötig
- ⓪(CLR.W msgAdd(A6)
- ⓪(BTST #message,D1
- ⓪(BNE noMsgAdd ; message event schon gesetzt => springe
- ⓪(TST.L messageList
- ⓪(BEQ noMsgAdd ; message Liste leer => springe
- ⓪(MOVE.W #TRUE,msgAdd(A6); message add erforderlich
- ⓪(BSET #message,D1
- ⓪ noMsgAdd
- ⓪
- ⓪(MOVE.B D1,(A3)+
- ⓪(ADDQ.L #1, A3 ; possible events auf den Stack
- ⓪(LEA noClicks(A6),A0
- ⓪(MOVEQ #12,D0 ; 'noClicks' bis 'rect2Size' auf den Stack
- ⓪ loop2
- ⓪(MOVE.W (A0)+,(A3)+
- ⓪(DBF D0,loop2
- ⓪(LEA msg(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.L time(A6),(A3)+
- ⓪(LEA mouseLoc(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA buttons(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA keyState(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA key(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA doneClicks(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA eventResult(A6),A0
- ⓪(MOVE.L A0,(A3)+ ; 'eventResult' als VAR-Parameter
- ⓪(JSR MultiEvent
- ⓪(MOVE.B eventResult(A6),D0
- ⓪(
- ⓪8; beachte message add
- ⓪(TST.W msgAdd(A6)
- ⓪(BEQ.W noMsgAdd2
- ⓪(BTST #message,D0
- ⓪(BEQ.W noMsgAdd2
- ⓪(BCLR #message,eventResult(A6)
- ⓪(MOVEQ #0,D0
- ⓪(MOVE.W msg+4(A6),D0
- ⓪(ADD.L #16,D0 ; msg[2]+16 (Länge der message) -> D0
- ⓪(MOVE.L A7,A0
- ⓪(SUBA.L D0,A0
- ⓪(SUBA.W #300,A0 ; 300 Byte Sicherheitszone für Stack
- ⓪(CMPA.L A3,A0
- ⓪(BCC enoughStack
- ⓪(LEA a7Store(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.L D0,(A3)+
- ⓪(JSR ALLOCATE
- ⓪(MOVE.L a7Store(A6),A0 ; ADR(buffer) -> A0
- ⓪(CLR.L a7Store(A6) ; Bedeutet: Benötigter Speicher nicht vom Stack
- ⓪(CMPA.L #NIL,A0
- ⓪(BNE allocOk
- ⓪(TRAP #noErrorTrap
- ⓪(DC.W OutOfMemory
- ⓪(BRA.W noMsgAdd2
- ⓪ enoughStack
- ⓪(MOVE.L A7,a7Store(A6)
- ⓪(SUBA.L D0,A7
- ⓪(MOVE.L A7,A0 ; ADR(buffer) -> A0
- ⓪ allocOk
- ⓪(MOVE.L msg(A6),(A0)
- ⓪(MOVE.L msg+4(A6),4(A0)
- ⓪(MOVE.L msg+8(A6),8(A0)
- ⓪(MOVE.L msg+12(A6),12(A0)
- ⓪(
- ⓪(MOVE.L A0,-(A7)
- ⓪(TST.W msg+4(A6)
- ⓪(BEQ noReadFromAppl
- ⓪(
- ⓪(JSR ApplicationID
- ⓪(MOVE.L (A7)+,A0
- ⓪(MOVE.L A0,D0
- ⓪(ADD.L #16,D0
- ⓪(MOVE.L D0,(A3)+
- ⓪(MOVE.W msg+4(A6),(A3)+
- ⓪(SUBQ.W #1,-2(A3) ; HIGH-Value is "no. elem.s" - 1
- ⓪(CLR.W (A3)+
- ⓪(MOVE.L A0,-(A7)
- ⓪(JSR ReadFromAppl ; ReadFromAppl(Appl...ID(),buffer[16..],0)
- ⓪
- ⓪ noReadFromAppl
- ⓪(JSR ApplicationID
- ⓪(MOVE.L (A7)+,A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE.W msg+4(A6),D0
- ⓪(ADD.W #16,D0
- ⓪(MOVE.W D0,(A3)+
- ⓪(SUBQ.W #1,-2(A3) ; HIGH-Value is "no. elem.s" - 1
- ⓪(CLR.W (A3)+
- ⓪(MOVE.L A0,-(A7)
- ⓪(JSR WriteToAppl ; WriteToAppl(ApplicationID(),buffer,0)
- ⓪(MOVE.L (A7)+,A0
- ⓪(
- ⓪(MOVE.L a7Store(A6),D0
- ⓪(BEQ dealloc
- ⓪(MOVE.L D0,A7
- ⓪(BRA noMsgAdd2
- ⓪ dealloc
- ⓪(MOVE.L A0,(A3)+
- ⓪(CLR.L (A3)+
- ⓪(JSR DEALLOCATE
- ⓪ noMsgAdd2
- ⓪@; call procs
- ⓪(CLR.W i(A6)
- ⓪ loop3
- ⓪(MOVE.W i(A6),D0
- ⓪(MOVE.W usedProcs(A6),D1
- ⓪(CMP.W D0,D1
- ⓪(BCS.W ende
- ⓪(MOVEQ #0,D2
- ⓪(MOVE.B eventResult(A6),D2 ; eventResult -> D2
- ⓪(BEQ.W ende
- ⓪(MOVE.W D0,D1
- ⓪(MULU #procRecSize,D1
- ⓪(MOVE.L procs(A6),A0
- ⓪(ADDA.W D1,A0
- ⓪(MOVE.W EventProc.event(A0),D1 ; proc[i].event -> D1
- ⓪(MOVE.W D1,momEvent(A6) ; momEvent:=proc[i].event
- ⓪(BTST D1,D2
- ⓪(BEQ.W noMatch
- ⓪(MOVE.L 2(A0),A1 ; proc[i].proc -> A1 (proc[i].event#message)
- ⓪(CMP.W #keyboard,D1
- ⓪(BEQ keyCall
- ⓪(CMP.W #mouseButton,D1
- ⓪(BEQ butCall
- ⓪(CMP.W #firstRect,D1
- ⓪(BEQ stRCall
- ⓪(CMP.W #secondRect,D1
- ⓪(BEQ ndRCall
- ⓪(CMP.W #message,D1
- ⓪(BEQ msgCall
- ⓪(CMP.W #timer,D1
- ⓪(BEQ.W tmrCall
- ⓪(BRA.W noMatch
- ⓪ keyCall
- ⓪(LEA key(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(LEA keyState(A6),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(JSR (A1)
- ⓪(BRA.W caseEnd
- ⓪ butCall
- ⓪(MOVE.W doneClicks(A6),(A3)+
- ⓪(MOVE.L mouseLoc(A6),(A3)+
- ⓪(MOVE.B buttons(A6),(A3)+
- ⓪(ADDQ.L #1, A3
- ⓪(MOVE.B keyState(A6),(A3)+
- ⓪(ADDQ.L #1, A3
- ⓪(JSR (A1)
- ⓪(BRA.W caseEnd
- ⓪ stRCall
- ⓪ ndRCall
- ⓪(MOVE.L mouseLoc(A6),(A3)+
- ⓪(MOVE.B buttons(A6),(A3)+
- ⓪(ADDQ.L #1, A3
- ⓪(MOVE.B keyState(A6),(A3)+
- ⓪(ADDQ.L #1, A3
- ⓪(JSR (A1)
- ⓪(BRA.W caseEnd
- ⓪
- ⓪ msgCall ; in A0 ist noch ADR(proc[i])
- ⓪(MOVE.W EventProc.msgType(A0),D1
- ⓪(
- ⓪(; Ist die Proc. vom Typ 'uspecMessage', so bekommt sie den Msg.event
- ⓪(; sowieso, egal von welchem Typ er ist.
- ⓪(
- ⓪(CMP.W #unspecMessage,D1
- ⓪(BEQ copy8from0
- ⓪(
- ⓪(; Sonst, muß der Typ des Msg.events gleich dem Typ sein, für den die
- ⓪(; Proc. angemeldet ist.
- ⓪(
- ⓪(CMP.W msg(A6),D1 ; Proc-Typ = Event-Typ ?
- ⓪(BNE.W noMatch ; Nein! => Kein Aufruf der Proc.
- ⓪(
- ⓪(CMP.W #menuSelected,D1
- ⓪(BEQ copy2
- ⓪(CMP.W #windRedraw,D1
- ⓪(BEQ copy5
- ⓪(CMP.W #windTopped,D1
- ⓪(BEQ copy1
- ⓪(CMP.W #windClosed,D1
- ⓪(BEQ copy1
- ⓪(CMP.W #windFulled,D1
- ⓪(BEQ copy1
- ⓪(CMP.W #windArrowed,D1
- ⓪(BEQ copy2
- ⓪(CMP.W #windHSlid,D1
- ⓪(BEQ copy2
- ⓪(CMP.W #windVSlid,D1
- ⓪(BEQ copy2
- ⓪(CMP.W #windSized,D1
- ⓪(BEQ copy5
- ⓪(CMP.W #windMoved,D1
- ⓪(BEQ copy5
- ⓪(CMP.W #windNewTop,D1
- ⓪(BEQ copy1
- ⓪(CMP.W #accOpen,D1
- ⓪(BEQ copy1from4
- ⓪(CMP.W #accClose,D1
- ⓪(BEQ copy1
- ⓪(BRA.W noMatch
- ⓪'
- ⓪ copy8from0
- ⓪(LEA msg(A6),A2
- ⓪(MOVEQ #7,D1
- ⓪(BRA doIt
- ⓪(
- ⓪ copy1
- ⓪(LEA msg+6(A6),A2 ; ab msg[3]
- ⓪(MOVEQ #0,D1 ; 1 Wort
- ⓪(BRA doIt
- ⓪(
- ⓪ copy1from4
- ⓪(LEA msg+8(A6),A2
- ⓪(MOVEQ #0,D1
- ⓪(BRA doIt
- ⓪(
- ⓪ copy2
- ⓪(LEA msg+6(A6),A2
- ⓪(MOVEQ #1,D1
- ⓪(BRA doIt
- ⓪
- ⓪ copy5
- ⓪(LEA msg+6(A6),A2
- ⓪(MOVEQ #4,D1
- ⓪ doIt
- ⓪(MOVE.L 4(A0),A1 ; proc[i].proc -> A1
- ⓪ copyLoop
- ⓪(MOVE.W (A2)+,(A3)+
- ⓪(DBF D1,copyLoop
- ⓪(JSR (A1)
- ⓪(BRA.W caseEnd
- ⓪ tmrCall
- ⓪(JSR (A1)
- ⓪ caseEnd
- ⓪(TST.W -(A3)
- ⓪(BNE noMatch
- ⓪(MOVE.W momEvent(A6),D0
- ⓪(BCLR D0,eventResult(A6)
- ⓪ noMatch
- ⓪(ADDQ.W #1,i(A6)
- ⓪(BRA.W loop3
- ⓪ ende
- ⓪"END;
- ⓪ END HandleEvents;
- ⓪ (*$L=*)
- ⓪
- ⓪
- ⓪ (*$L+*)
- ⓪
- ⓪ (*$J-*)
- ⓪ PROCEDURE dummy (): BOOLEAN;
- ⓪ (*$J=*)
- ⓪
- ⓪"BEGIN
- ⓪$RETURN TRUE;
- ⓪"END dummy;
- ⓪
- ⓪ PROCEDURE ShareTime (time: LONGCARD);
- ⓪"
- ⓪"VAR theProc: EventProc;
- ⓪"
- ⓪"BEGIN
- ⓪$IF flushExecuted <= 2 THEN (* erlaubt 2 Rekursionslevel *)
- ⓪&INC (flushExecuted);
- ⓪&theProc.event := timer;
- ⓪&theProc.timeHdler := dummy;
- ⓪&HandleEvents(0, MButtonSet{}, MButtonSet{},
- ⓪3lookForEntry, Rect(0,0,0,0), lookForEntry, Rect(0,0,0,0),
- ⓪3time, theProc, 0);
- ⓪&DEC (flushExecuted);
- ⓪$END
- ⓪"END ShareTime;
- ⓪
- ⓪ PROCEDURE FlushEvents;
- ⓪
- ⓪"BEGIN
- ⓪&REPEAT
- ⓪(watchDogExecuted := FALSE;
- ⓪(ShareTime (0L);
- ⓪&UNTIL NOT watchDogExecuted;
- ⓪"END FlushEvents;
- ⓪"
- ⓪
- ⓪8(* misc. managment *)
- ⓪8(* =============== *)
- ⓪
- ⓪ PROCEDURE levelCounter(start,child:BOOLEAN; VAR id:INTEGER);
- ⓪
- ⓪"PROCEDURE searchList(list:ptrCarrier);
- ⓪"
- ⓪$VAR nlist: ptrCarrier;
- ⓪"
- ⓪$BEGIN
- ⓪&WHILE list # NIL DO
- ⓪(nlist:=list^.next;
- ⓪(IF list^.level>=modLevel THEN
- ⓪*ASSEMBLER
- ⓪,MOVE.L list(A6),(A3)+
- ⓪,JSR DeInstallWatchDog
- ⓪*END
- ⓪(END;
- ⓪(list:= nlist
- ⓪&END
- ⓪$END searchList;
- ⓪"
- ⓪"BEGIN
- ⓪$IF child THEN
- ⓪&IF start THEN INC(modLevel)
- ⓪&ELSE
- ⓪(searchList(keyboardList);
- ⓪(searchList(buttonList);
- ⓪(searchList(stRectList);
- ⓪(searchList(ndRectList);
- ⓪(searchList(messageList);
- ⓪(searchList(timerList);
- ⓪(DEC(modLevel);
- ⓪&END;
- ⓪$END;
- ⓪"END levelCounter;
- ⓪
- ⓪ PROCEDURE termProc;
- ⓪
- ⓪"BEGIN
- ⓪$levelCounter(FALSE,TRUE, voidI);
- ⓪"END termProc;
- ⓪
- ⓪ PROCEDURE removalProc;
- ⓪"
- ⓪"BEGIN
- ⓪$(* Current 'modID = 0'. That means all init.s are released.
- ⓪%*)
- ⓪$levelCounter (FALSE, TRUE, voidI);
- ⓪"END removalProc;
- ⓪"
- ⓪ VAR envlpHdl : EnvlpCarrier;
- ⓪(termHdl : TermCarrier;
- ⓪(removalHdl : RemovalCarrier;
- ⓪(wsp : MemArea;
- ⓪
- ⓪
- ⓪ BEGIN
- ⓪"keyboardList := NIL;
- ⓪"buttonList := NIL;
- ⓪"stRectList := NIL;
- ⓪"ndRectList := NIL;
- ⓪"messageList := NIL;
- ⓪"timerList := NIL;
- ⓪"
- ⓪"modLevel := 1;
- ⓪"CatchProcessTerm (termHdl, termProc, wsp);
- ⓪"SetEnvelope (envlpHdl, levelCounter, wsp);
- ⓪"CatchRemoval (removalHdl, removalProc, wsp);
- ⓪ END EventHandler.
- ⓪ ə
- (* $FFF7C95C$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$000051E4$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416E$FFF8416EÇ$0000516E........T.......T......TT.......T.......T.......T.......T.......T.......T.......$00000B9B$0000515E$00005170$0000519D$0000516E$0000519D$000051AF$00005198$FFEEDCC0$0000527D$00005268$00005195$00005170$000005FA$000000D8$FFEEDCC0œÇâ*)
-