home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / CALLS.I < prev    next >
Encoding:
Text File  |  1990-11-21  |  9.4 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Calls; (* V#055 *)⓪ (*$Y+,L-,C-,H+*)⓪ ⓪ (*⓪"24.5.88: Stack bei CallSuperVisor muß nun 128 statt 512 Byte groß sein.⓪"29.8.88: Wirkung v. SysNewCaller und NewCaller war vertauscht; Funktionen⓪+nun lauffähig.⓪"26.7.89: Sys/NewCaller legen Entry-Prg im wsp ab - nun kein ALLOCATE mehr⓪+nötig⓪"10.5.90: CallExternal & CallSystem entfernt⓪"13.6.90: EnterSupervisorMode-Aufrufe raus⓪"24.10.90: $H+ eingebaut⓪"21.11.90: Korrektur bei NewCaller (Stack-Pointer und Call-Adr. wurden wg.⓪,Entfernung von $M- nicht mehr an die richtige Adr. gesetzt).⓪ *)⓪ ⓪ FROM SYSTEM IMPORT LONGWORD, ASSEMBLER, ADDRESS;⓪ ⓪ FROM MOSGlobals IMPORT OutOfStack, MemArea;⓪ ⓪ (*⓪ PROCEDURE CallExternal ( func: ADDRESS ): LONGWORD;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A0        ; Adr. der aufzurufenden Funktion⓪(MOVE.L  (A7)+,(A3)+     ; Rücksprungadr. auf anderen Stack retten⓪(MOVE.L  (A7)+,(A3)+     ; gerettetes A6⓪(JSR     (A0)⓪(MOVE.L  -(A3),-(A7)⓪(MOVE.L  -(A3),A0⓪(MOVE.L  D0,(A3)+⓪(JMP     (A0)            ; Zurück zum Aufrufer⓪$END⓪"END CallExternal;⓪ *)⓪ ⓪ PROCEDURE CallExtRegs ( pro: ADDRESS; VAR regs: Registers );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A0⓪(MOVE.L  -(A3),A1        ; Adr. der aufzurufenden Funktion⓪(MOVEM.L D3-D7/A3-A6,-(A7)⓪(MOVE.L  A0,-(A7)⓪(PEA     ret(PC)⓪(PEA     (A1)⓪(MOVEM.L (A0),D0-A6⓪(RTS⓪&ret:⓪(MOVE.L  A6,-(A7)⓪(MOVE.L  4(A7),A6⓪(MOVEM.L D0-A5,(A6)⓪(MOVE.L  (A7)+,56(A6)⓪(ADDQ.L  #4,A7⓪(MOVEM.L (A7)+,D3-D7/A3-A6⓪$END⓪"END CallExtRegs;⓪ ⓪ ⓪ (*⓪ VAR trapHelp: RECORD⓪0t1:CARDINAL; (* TRAP    #n                               *)⓪0t2:CARDINAL; (* ADDQ.L  #2,A7      ; Funktionsnr. runter *)⓪0t3:CARDINAL; (* MOVE.L  -(A3),-(A7); gerettetes A6       *)⓪0t5:CARDINAL; (* MOVE.L  -(A3),A0   ; Rücksprungadr.      *)⓪0t6:CARDINAL; (* MOVE.L  D0,(A3)+   ; Ergebnis auf Stack  *)⓪0t7:CARDINAL  (* JMP     (A0)                             *)⓪.END;⓪.⓪ PROCEDURE CallSystem ( trapNo, func:CARDINAL ): LONGWORD;⓪"BEGIN⓪$ASSEMBLER⓪(MOVEM.L (A7)+,D0/D2     ; Rücksprungadr. + gerettetes A6 laden⓪(MOVE.W  -(A3),-(A7)⓪(MOVE.W  -(A3),D1⓪(ORI     #$4E40,D1       ; TRAP #0⓪(LEA     trapHelp,A0⓪(MOVE.W  D1,(A0)         ; TRAP-Instr. setzen⓪(MOVEM.L D0/D2,(A3)      ; Rücksprungadr. auf anderen Stack retten⓪(ADDQ.L  #8,A3⓪(JMP     (A0)⓪$END⓪"END CallSystem;⓪ *)⓪ ⓪ PROCEDURE CallProc ( func: AddrProc; p: ADDRESS; REF workSpace: MemArea );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A0        ; workSpace⓪(MOVE.L  -(A3),A2        ; p⓪(MOVE.L  -(A3),D2        ; StatLink ('func')⓪(MOVE.L  -(A3),A1        ; ADR ('func')⓪(⓪(; Stack anlegen⓪(MOVE.L  A3,-(A7)                ; A3 retten⓪(MOVE.L  A7,D1                   ; alten SP laden zum Retten⓪(⓪(TST.L   MemArea.bottom(A0)      ; neuen SP-Bottom⓪(BEQ     stckerr                 ; Fehler⓪(MOVE.L  MemArea.length(A0),D0⓪(BEQ     stckerr                 ; Fehler⓪(⓪(CMPI.L  #16,D0          ; Den Rest checkt die aufzurufende Prozedur⓪(BCS     stckerr⓪(⓪(; neuen SP verwenden⓪(MOVE.L  MemArea.bottom(A0),A3⓪(ADD.L   MemArea.bottom(A0),D0⓪(MOVE.L  D0,A7⓪(⓪&useOld⓪(; para auf Stack⓪(MOVE.L  A2,(A3)+⓪(⓪(MOVE.L  D1,-(A7)                ; alten SP retten⓪(⓪(; Funktion aufrufen⓪(JSR     (A1)                    ; static link steht schon in D2⓪(⓪(MOVE.L  (A7)+,A7⓪(MOVE.L  (A7)+,A3⓪(RTS⓪(⓪&stckerr:⓪(TRAP    #6⓪(DC.W    OutOfStack      ; continue erlaubt⓪(BRA     useOld⓪$END⓪"END CallProc;⓪ ⓪ PROCEDURE CallSupervisor ( proc: AddrProc; data: ADDRESS; REF wsp: MemArea );⓪"BEGIN⓪$ASSEMBLER⓪(CLR.L   -(A7)⓪(MOVE    #$20,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪(MOVE.L  A7,USP⓪(MOVE.L  D0,A7⓪(⓪(MOVE.L  -(A3),A2        ; workSpace⓪(MOVE.L  -(A3),D1        ; para⓪(MOVE.L  -(A3),D2        ; StatLink ('func')⓪(MOVE.L  -(A3),A1        ; Funktionsadr.⓪(⓪(MOVE.L  A3,-(A7)⓪(⓪(; Stack anlegen⓪(MOVE.L  A7,A0                   ; alten SSP laden zum Retten⓪(MOVE.L  USP,A7                  ; USP ist default-SP⓪(⓪(TST.L   MemArea.bottom(A2)      ; neuen SP-Bottom⓪(BEQ     useOld⓪(MOVE.L  MemArea.length(A2),D0⓪(BEQ     useOld⓪(⓪(CMPI.L  #128,D0          ; Muß schon da sein für evtl. Interrupts⓪(BCS     stckerr⓪(⓪(; neuen SP verwenden⓪(MOVE.L  MemArea.bottom(A0),A3⓪(ADD.L   MemArea.bottom(A0),D0⓪(MOVE.L  D0,A7⓪(⓪&useOld:⓪(; para auf Stack⓪(MOVE.L  D1,(A3)+⓪(⓪(MOVE.L  A0,-(A7)                ; alten SP retten⓪(⓪(; Funktion aufrufen⓪(JSR     (A1)                    ; static link steht schon in D2⓪(⓪(MOVE.L  (A7)+,A7                ; alten SSP wiederherstellen⓪(MOVE.L  (A7)+,A3⓪(⓪(ANDI    #$CFFF,SR⓪(RTS⓪(⓪&stckerr:⓪(TRAP    #6⓪(DC.W    OutOfStack      ; continue erlaubt⓪(BRA     useOld⓪$END⓪"END CallSupervisor;⓪ ⓪ ⓪ PROCEDURE hdlCaller1;⓪"BEGIN⓪$ASSEMBLER⓪(PEA     (A6)            ; A6 auf Stack⓪(LEA     regs(PC),A6     ; Adr f. zu rettende Regs D0-A7⓪(MOVEM.L D0-A5,(A6)      ; regs D0-A5 retten⓪(MOVE.L  (A7)+,Registers.regA6(A6) ; A6 von Stack retten⓪(MOVE.L  A7,A4           ; SP merken⓪(LEA     $F1210000,A3    ; neuen Stack laden⓪(LEA     $F1210000,A7⓪(LEA     4(A4),A0⓪(MOVE.L  A0,Registers.parm(A6) ; alten SP als A7 merken⓪(MOVE.L  A6,(A3)+⓪(; SUBA.L  A5,A5           ; LINK-^ löschen (f. Error-Scanner)⓪(JSR     $F1210000⓪(MOVE.L  A4,A7           ; alten SP zurück⓪(MOVEM.L (A6),D0-A6⓪(RTS⓪®s:⓪(DS      64⓪$END⓪"END hdlCaller1;⓪ ⓪ PROCEDURE hdlCaller1E; END hdlCaller1E;⓪ ⓪ PROCEDURE hdlCaller2; (* für Supervisormode -> Usermode *)⓪"BEGIN⓪$ASSEMBLER⓪(PEA     (A6)            ; A6 auf Stack⓪(LEA     regs(PC),A6⓪(MOVEM.L D0-A5,(A6)⓪(MOVE.L  (A7)+,Registers.regA6(A6)⓪(MOVE.L  A7,A4           ; alter SSP⓪(MOVE.L  USP,A5          ; alter USP⓪(⓪(ANDI    #$CFFF,SR       ; User Mode⓪(LEA     $F1210000,A3    ; neuen Stack laden⓪(LEA     $F1210000,A7⓪(LEA     4(A4),A0⓪(MOVE.L  A0,Registers.parm(A6)⓪(MOVE.L  A6,(A3)+⓪(JSR     $F1210000⓪(⓪(; zurück in den Supervisor-Mode⓪(CLR.L   -(A7)⓪(MOVE    #$20,-(A7)⓪(TRAP    #1⓪(ADDQ.L  #6,A7⓪(⓪(MOVE.L  A5,USP⓪(MOVE.L  A4,A7           ; alten SSP zurück⓪(⓪(MOVEM.L (A6),D0-A6⓪(RTS⓪®s:⓪(DS      64⓪$END⓪"END hdlCaller2;⓪ ⓪ PROCEDURE hdlCaller2E; END hdlCaller2E;⓪ ⓪ (*$H-*)⓪ PROCEDURE NewCaller (     m2Proc       : RegsProc;⓪:enterUserMode: BOOLEAN;⓪:wsp          : MemArea;⓪6VAR entry        : ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),-(A7)     ; ADR (entry)⓪(MOVE.L  -(A3),D2        ; wsp.length⓪(MOVE.L  -(A3),A0        ; wsp.bottom⓪(MOVE.W  -(A3),D0        ; enterUserMode⓪(MOVE.L  -(A3),-(A7)     ; m2Proc⓪ ⓪(MOVE.L  4(A7),A1⓪(CLR.L   (A1)            ; entry:= NIL⓪ ⓪(TST.W   D0⓪(BEQ     noEnter⓪(LEA     hdlCaller2,A1   ; p1⓪(LEA     hdlCaller2E,A2  ; p2⓪(BRA     entCont⓪&noEnter⓪(LEA     hdlCaller1,A1⓪(LEA     hdlCaller1E,A2⓪&entCont⓪ ⓪(MOVE.L  A2,D0⓪(SUB.L   A1,D0           ; l: Länge der Eintrittsprozedur⓪ ⓪(MOVE.L  A0,D1           ; wsp.bottom⓪(BEQ     noStack⓪(MOVE.L  D0,D1           ; l⓪(ADDI.L  #512,D1⓪(CMP.L   D1,D2           ; l, wsp.length⓪(BCS     noStack⓪ ⓪(MOVE.L  A0,-(A7)⓪&l0:⓪(MOVE.W  (A1)+,(A0)+     ; (p1)+ -> (wsp.bottom)+⓪(CMPA.L  A2,A1⓪(BCS     l0⓪(MOVE.L  (A7)+,D0        ; wsp.bottom⓪ ⓪(MOVE.L  4(A7),A1⓪(MOVE.L  D0,(A1)         ; entry:= wsp.bottom⓪ ⓪(; Jetzt suchen wir nach Kennungen, wo Adressen nachzutragen sind.⓪(MOVE.L  D0,A1           ; wsp.bottom⓪#sea1 CMPI.W  #$F121,(A1)+⓪(BNE     sea1⓪(MOVE.L  A0,-2(A1)       ; wsp.bottom+l -> stcklo⓪#sea2 CMPI.W  #$F121,(A1)+⓪(BNE     sea2⓪(ADD.L   D0,D2⓪(MOVE.L  D2,-2(A1)       ; wsp.bottom+wsp.length -> stckhi⓪#sea3 CMPI.W  #$F121,(A1)+⓪(BNE     sea3⓪(MOVE.L  (A7),-2(A1)     ; call⓪(BRA     ende⓪ ⓪&noStack⓪(TRAP    #6⓪(DC.W    OutOfStack      ; continue erlaubt⓪&ende⓪(ADDQ.L  #8,A7⓪$END;⓪$(*⓪(IF enterUserMode THEN⓪*p1:= ADDRESS (hdlCaller2);⓪*p2:= ADDRESS (hdlCaller2E)⓪(ELSE⓪*p1:= ADDRESS (hdlCaller1);⓪*p2:= ADDRESS (hdlCaller1E)⓪(END;⓪(l:=p2-p1;⓪(IF l+512L > wsp.length THEN⓪*ASSEMBLER⓪,TRAP    #6⓪,DC.W    OutOfStack      ; continue erlaubt⓪*END⓪(END;⓪(entry:= wsp.bottom;⓪(IF entry # NIL THEN⓪*ASSEMBLER⓪,MOVE.L  p1(A6),A0⓪,MOVE.L  entry(A6),A1⓪,MOVE.L  (A1),A1⓪,MOVE.L  p2(A6),A2⓪*l0:⓪,MOVE.W  (A0)+,(A1)+⓪,CMPA.L  A2,A0⓪,BCS     l0⓪*END;⓪*p3:= entry + l - 14L;⓪*p3^:= entry + l;⓪*INC (p3,4);⓪*p3^:= entry+wsp.length;⓪*INC (p3,4);⓪*p3^:= ADDRESS(m2Proc)⓪(END⓪$*)⓪"END NewCaller;⓪ ⓪ PROCEDURE SysNewCaller ( m2Proc: RegsProc; enterUserMode: BOOLEAN; wsp: MemArea; VAR entry: ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(JMP     NewCaller⓪$END⓪"END SysNewCaller;⓪ ⓪ PROCEDURE DisposeCaller ( VAR entry: ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #4,A3⓪$END⓪"END DisposeCaller;⓪ ⓪ BEGIN⓪"(*⓪$trapHelp.t2:= $548F; (* ADDQ.L  #2,A7 *)⓪$trapHelp.t3:= $2F23; (* MOVE.L  -(A3),-(A7) *)⓪$trapHelp.t5:= $2063; (* MOVE.L  -(A3),A0 *)⓪$trapHelp.t6:= $26C0; (* MOVE.L  D0,(A3)+ *)⓪$trapHelp.t7:= $4ED0; (* JMP     (A0) *)⓪"*)⓪ END Calls.⓪ ə
  2. (* $FFFA9A0B$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$00002113$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277DÇ$000014DAT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001DB1$00001E08$00001E53$000014DA$000014C5$00001DE7$00001CEA$00001492$00001713$00001CD8$00001DE7$00001D71$00001D36$00001D71$00001D33$00001DD5öÇâ*)
  3.