home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Runtime;
- ⓪ (*$Y+,L-,R-,N+,C-,M-*)
- ⓪
- ⓪ (**********************************************************************
- ⓪
- ⓪,Runtime Support fuer Atari Modula-Compiler V#097
- ⓪
- ⓪!30.10.86 Version fuer Atari, mit neuem Stringformat:
- ⓪,CAP, STAS angepasst,
- ⓪,RangeCheck fuer CHR.
- ⓪"1.11.86 STAS fuer Stringlaenge > 32K korrigiert;
- ⓪,Prozeduren zur Coroutinen-Unterstuetzung als Dummy.
- ⓪"3.11.86 CHR und CAP fuer neue Char-Darstellung (mit folgendem SyncByte)
- ⓪!30.11.86 Set-Operationen verkraften ungerade Laengenangaben
- ⓪!19.12.86 TrapCode 7 fuer Zugriff ueber NIL-Pointer definiert
- ⓪!22.01.87 TRAP-Auswertung wieder impl.
- ⓪!04.02.87 STAS: BCS ok2 statt BEQ ok2.
- ⓪!27.02.87 TRAP 15: trp0->trp9; GEM-Alert impl.; DivByZero,TRAPV,Addr- und
- ⓪,Bus-Error abgefangen; Vektor-Restauration per SetTerminateProc;
- ⓪,trp7 (access via NIL-Ptr) raus.
- ⓪!02.03.87 Traps:USP wird gerettet; Scan-Aufruf impl.
- ⓪!19.03.87 Fehlerbehandlung -> GEMError-Modul
- ⓪!09.05.87 TRAP-Nummern geändert
- ⓪!19.06.87 neue Real-Arithmetik
- ⓪!30.06.87 IOTransfer impl.
- ⓪!08.07.87 D7->#1; bei Fehler wird Aufrufer angescanned.
- ⓪!22.07.87 IOTransfer, LISTEN, usw. impl.;
- ⓪!23.07.87 @PRIO impl, IOTransfer kann auch auf Vektoren >= $400 ange-
- ⓪,wendet werden.
- ⓪!11.08.87 abermals D7->#1 in Set-Funktionen (wie kam D7 da wieder hin ??)
- ⓪!29.08.87 @IDIV korrigiert (UNLK u. MOVEM vertauscht)
- ⓪!08.09.87 @IOCA neu
- ⓪!27.10.87 FLOAT und TRUNC auf LONGCARD-Parameter umgestellt
- ⓪!13.11.87 @LSTN decr. IR um Eins
- ⓪!16.12.87 Realvergleiche korrigiert (Null galt als größer als Zahlen
- ⓪-mit negativem Exponenten): RELE, REGE, RELT, REGT
- ⓪!17.12.87 Realvergleiche jetzt hoffentlich ok
- ⓪!16.01.88 @PRIO geht auch im Superv.-Mode
- ⓪!01.04.88 @FPDIV für negativen Divisor korrigiert; @IOCA geht jetzt.
- ⓪!09.04.88 Coroutinen-Anpassung f. 68020.
- ⓪!28.05.88 @RES1 und @RES2 für Procedure Entries (ab Comp 3.6a) verwendet
- ⓪!19.07.88 @SMEM, @RELE, @REGE, @RELT, @REGT zerstören nicht mehr D3/D4.
- ⓪!12.08.88 CAP berücksichtigt auch nicht-deutsche Umlaute.
- ⓪!01.01.88 TRUNC löst Runtime-Error bei neg. Arg. aus
- ⓪!19.01.89 881-Unterstützung von MR (26.8.88) übernommen (Cond: A68881)
- ⓪!15.06.89 Include-File f. Prozessoren
- ⓪!16.06.89 881-Routinen überarbeitet (optimiert, Errors)
- ⓪!04.07.89 @STAS korrigiert - machte bei ungeradem Source-String Mist
- ⓪!19.08.89 Runtime läuft nun gleichzeitg mit 68000 & 68020
- ⓪!30.11.89 Optimierungen in Long-Mul/Div/Mod (LINK verlagert)
- ⓪ ***********************************************************************)
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, WORD;
- ⓪
- ⓪ IMPORT SysInfo;
- ⓪
- ⓪ FROM SFP004 IMPORT FPUInit, FPUError;
- ⓪
- ⓪ CONST
- ⓪
- ⓪ (*$I FPU.CNF *)
- ⓪
- ⓪(DftSF = $0010;
- ⓪
- ⓪ VAR has020: BOOLEAN;
- ⓪
- ⓪ (*$? A68881:
- ⓪ CONST
- ⓪(fpstat = $fffa40; (* Response word of MC68881 read *)
- ⓪(fpstatlo= $fffa41;
- ⓪(fpctrl = $fffa42; (* Control word of MC68881 write *)
- ⓪(fpcmd = $fffa4a; (* Command word of MC68881 write *)
- ⓪(fpcond = $fffa4e; (* Condition word of MC68881 write *)
- ⓪(fpop = $fffa50; (* Operand long of MC68881 read/write *)
- ⓪ *)
- ⓪
- ⓪ (************** Coroutinen-Unterstuetzung **************)
- ⓪
- ⓪
- ⓪ PROCEDURE BadReturn; (* RTS aus CoRoutine anmeckern *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(TRAP #6
- ⓪(DC.W -15-$6000 ; kein cont, scan prev
- ⓪$END
- ⓪"END BadReturn;
- ⓪
- ⓪
- ⓪ (*
- ⓪#Transferdaten beim Usermode:
- ⓪(2 Byte - 0: zeigt Usermode an / 1: Vektor zus. restaurieren
- ⓪(4 Byte - PC
- ⓪(2 Byte - SR
- ⓪(4 Byte - A6
- ⓪(56 Byte - D0-A5
- ⓪
- ⓪#Transferdaten beim Supervisormode:
- ⓪(2 Byte - $FFxx, zeigt Supervisormode an
- ⓪(4 Byte - USP
- ⓪(60 Byte - D0-A6
- ⓪(4 Byte - Dummy
- ⓪(2 Byte - SR
- ⓪(4 Byte - PC
- ⓪ *)
- ⓪
- ⓪ (* Kennung: Zustand:
- ⓪$0 Normal u. Exc-Rückkehr - Usermode
- ⓪$1 Warten auf Exc - Usermode, Vektor restaurieren
- ⓪$$FF Exc-Rückkehr - Supervisormode
- ⓪ *)
- ⓪
- ⓪ PROCEDURE @NEWP ( p:PROC; a:ADDRESS; n:LONGCARD; VAR prc:ADDRESS );
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(
- ⓪(MOVE.L -(A3),A1 ; 'prc'
- ⓪(MOVE.L -(A3),A0 ; SIZE (workspace)
- ⓪(MOVE.L A0,D1
- ⓪(BCLR #0,D1
- ⓪(MOVE.L -(A3),D0 ; ADR (workspace)
- ⓪(ADDQ.L #1,D0
- ⓪(BCLR #0,D0
- ⓪(ADDA.L D0,A0 ; ENDADR (workspace)
- ⓪(MOVE.L -(A3),D2 ; ADR (procedure)
- ⓪(CMPI.L #90,D1 ; ist workspace groß genug ?
- ⓪(BCC wspOk
- ⓪(
- ⓪(TRAP #6
- ⓪(DC.W -10-$4000 ; 'out of stack'
- ⓪(UNLK A5
- ⓪(RTS
- ⓪(
- ⓪&wspOk:
- ⓪(MOVEM.L A3/A5,-(A7)
- ⓪(
- ⓪(MOVE.L D0,A3
- ⓪(
- ⓪(MOVE.L D2,-(A0) ;Adresse für scan
- ⓪(ADDQ.L #2,(A0) ;scan-Adr etwas vorsetzen
- ⓪(CLR.L -(A0) ;voriges A5
- ⓪(MOVE.L A0,A5 ;für UNLK in backScan()
- ⓪(MOVE.L #BadReturn,-(A0) ;Fehlerbehandlung bei RTS aus Coroutine
- ⓪(
- ⓪(MOVEM.L D0-A5,-(A0) ; Bis auf A3,A5 nur Dummy-Werte
- ⓪(MOVE.L A6,-(A0)
- ⓪(MOVE.W SR,-(A0)
- ⓪(MOVE.L D2,-(A0)
- ⓪(CLR.W -(A0)
- ⓪(
- ⓪(; nun den SP in 'prc' ablegen
- ⓪(MOVE.L A0,(A1)
- ⓪(
- ⓪(MOVEM.L (A7)+,A3/A5
- ⓪(UNLK A5
- ⓪$END
- ⓪"END @NEWP;
- ⓪
- ⓪ PROCEDURE @TRAN ( VAR source,dest:ADDRESS ); (* Transfer *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; Aufruf erfolgt immer im Usermode, der zu startende Prozeß
- ⓪(; kann in beiden Modi ablaufen
- ⓪(
- ⓪(MOVE.L -(A3),A2 ; dest
- ⓪(MOVE.L -(A3),A1 ; source
- ⓪(MOVE SR,D2
- ⓪(
- ⓪(; JSR EnterSupervisorMode
- ⓪(
- ⓪(MOVE #$2700,SR ; keine Interrupts !
- ⓪(
- ⓪(; ③aktiven Prozeß beenden④
- ⓪(MOVE.L USP,A0
- ⓪(MOVE.L (A0)+,D0 ; Rücksprungadr. hinter TRANSFER
- ⓪(MOVEM.L D0-A5,-(A0)
- ⓪(MOVE.L A6,-(A0)
- ⓪(MOVE.W D2,-(A0)
- ⓪(MOVE.L D0,-(A0)
- ⓪(CLR.W -(A0)
- ⓪(
- ⓪(MOVE.L (A2),D0 ; zuerst retten, falls A1=A2
- ⓪(MOVE.L A0,(A1)
- ⓪(MOVE.L D0,A6
- ⓪(
- ⓪(; ③neuen Prozeß starten④
- ⓪(TST.W (A6)+
- ⓪(BEQ stUsr
- ⓪(BMI stSup
- ⓪(
- ⓪(; starte Usermode, vorher Vektor restaurieren
- ⓪(MOVE.L (A6)+,D0 ; alter Vektor
- ⓪(MOVE.L 4+2+4+4(A6),A0 ; D1: Vektoradr.
- ⓪(MOVE.L D0,(A0)
- ⓪(TST has020
- ⓪(BEQ no20
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ stUsr: ; starte Usermode
- ⓪(TST has020
- ⓪(BEQ no20b
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20b:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ stSup: ; starte Supervisormode
- ⓪(MOVE.L A6,A7
- ⓪(MOVE.L (A7)+,A0
- ⓪(MOVE.L A0,USP
- ⓪(MOVEM.L (A7)+,D0-A6
- ⓪(ADDQ.L #4,A7
- ⓪(TST has020
- ⓪(BEQ no20c
- ⓪(MOVE.W (A7),-(A7)
- ⓪(MOVE.L 4(A7),2(A7)
- ⓪(MOVE #DftSF,6(A7)
- ⓪ no20c:
- ⓪(RTE
- ⓪$END
- ⓪"END @TRAN;
- ⓪
- ⓪ PROCEDURE @LSTN;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; JSR EnterSupervisorMode
- ⓪(MOVE SR,-(A7)
- ⓪(MOVE SR,D0
- ⓪(ANDI #$0700,D0
- ⓪(BEQ ok
- ⓪(MOVE SR,D0
- ⓪(SUBI #$0100,D0
- ⓪(MOVE D0,SR
- ⓪(NOP
- ⓪(NOP
- ⓪&ok:
- ⓪(MOVE (A7)+,SR
- ⓪(ANDI #$FFFF-$2000,SR ; Back into user mode
- ⓪$END
- ⓪"END @LSTN;
- ⓪
- ⓪ PROCEDURE hdlExc;
- ⓪"(* Für IOTRANSFER-Auslösungen per Exception *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; Der Aufruf kann aus beiden Modi kommen, der zu startende
- ⓪(; Prozeß ist immer im Usermode
- ⓪(
- ⓪(MOVE #$2700,SR ; keine Interrupts !
- ⓪(
- ⓪(BTST.B #5,4(A7) ; aus welchem mode ?
- ⓪(BNE frSup
- ⓪(
- ⓪(; Entry aus User mode
- ⓪(
- ⓪(; Daten auf den USP retten
- ⓪(MOVE.L A6,-(A7)
- ⓪(MOVE.L USP,A6
- ⓪(MOVEM.L D0-A5,-(A6)
- ⓪(MOVE.L (A7)+,-(A6)
- ⓪(MOVE.L (A7)+,A0 ; ^Transfer-Daten
- ⓪(MOVE (A7)+,-(A6) ; SR
- ⓪(MOVE.L (A7)+,-(A6) ; PC
- ⓪(CLR.W -(A6)
- ⓪(
- ⓪(; A0 zeigt auf:
- ⓪(; 2 Byte - 1, zeigt IOTR an
- ⓪(; 4 Byte - alter Exc-Vektor
- ⓪(; 4 Byte - PC
- ⓪(; 2 Byte - SR
- ⓪(; 4 Byte - A6
- ⓪(; 56 Byte - D0-A5
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+32+8(A0),A2 ; A2: alter dest^
- ⓪(MOVE.L A6,(A2)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+4(A0),A3 ; D1: Vektoradr.
- ⓪(LEA 2(A0),A6
- ⓪(MOVE.L (A6)+,(A3) ; alten Vektor restaurieren
- ⓪(TST has020
- ⓪(BEQ no20d
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20d:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ frSup: ; Entry aus Supervisor mode
- ⓪(
- ⓪(; Daten auf den USP retten
- ⓪(MOVEM.L D0-A6,-(A7)
- ⓪(MOVE.L USP,A6
- ⓪(MOVE.L A6,-(A7)
- ⓪(ST.B -(A7)
- ⓪(
- ⓪(MOVE.L 2+4+60(A7),A0 ; ^Transfer-Daten
- ⓪(
- ⓪(; A0: (s.o.)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+32+8(A0),A2 ; A2: alter dest^
- ⓪(MOVE.L A7,(A2)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+4(A0),A3 ; D1: Vektoradr.
- ⓪(LEA 2(A0),A6
- ⓪(MOVE.L (A6)+,(A3) ; alten Vektor restaurieren
- ⓪(TST has020
- ⓪(BEQ no20e
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20e:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪$END
- ⓪"END hdlExc;
- ⓪
- ⓪ PROCEDURE hdlCall;
- ⓪"(* Für IOTRANSFER-Auslösungen per JSR *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; Der Aufruf kann aus beiden Modi kommen, der zu startende
- ⓪(; Prozeß ist immer im Usermode
- ⓪(
- ⓪(MOVE.L D1,-(A7)
- ⓪(MOVE SR,D1
- ⓪(BTST #13,D1 ; aus welchem Mode ?
- ⓪(BNE frSup
- ⓪(
- ⓪(; Entry aus User mode
- ⓪(
- ⓪(; JSR EnterSupervisorMode
- ⓪(
- ⓪(;BREAK
- ⓪(MOVE #$2700,SR ; keine Interrupts !
- ⓪(
- ⓪(; ③aktiven Prozeß beenden, Daten auf den USP retten
- ⓪(; auf USP stehen noch: D1.L, 2 Byte, ^Dest-Transfer-Daten, PC.L
- ⓪(MOVE.L A0,-(A7)
- ⓪(MOVE.L USP,A0
- ⓪(MOVE.L (A0)+,-(A7) ; D1 retten
- ⓪(MOVE.L (A0)+,-(A7) ; ^Transfer-Daten
- ⓪(MOVE.L (A0)+,-(A7) ; PC retten
- ⓪(MOVEM.L D0-A5,-(A0)
- ⓪(MOVE.L A6,-(A0)
- ⓪(MOVE.W D1,-(A0) ; SR
- ⓪(MOVE.L (A7)+,-(A0) ; PC
- ⓪(MOVE.L (A7)+,14(A0) ; D1 in Transfer-Daten ablegen
- ⓪(MOVE.L (A7)+,A1 ; ^Transfer-Daten
- ⓪(MOVE.L (A7)+,42(A0) ; A0 in Transfer-Daten ablegen
- ⓪(CLR.W -(A0)
- ⓪(
- ⓪(; A1 zeigt auf:
- ⓪(; 2 Byte - 1, zeigt IOTR an
- ⓪(; 4 Byte - alter Exc-Vektor
- ⓪(; 4 Byte - PC
- ⓪(; 2 Byte - SR
- ⓪(; 4 Byte - A6
- ⓪(; 56 Byte - D0-A5
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+32+8(A1),A2 ; A2: alter dest^
- ⓪(MOVE.L A6,(A2)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+4(A1),A3 ; D1: Vektoradr.
- ⓪(LEA 2(A1),A6
- ⓪(MOVE.L (A6)+,(A3) ; alten Vektor restaurieren
- ⓪(TST has020
- ⓪(BEQ no20f
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20f:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ frSup: ; Entry aus Supervisor mode
- ⓪(
- ⓪(MOVE.L (A7),D1
- ⓪(ADDQ.L #2,A7
- ⓪(MOVE.L 2(A7),(A7) ; ^Transfer-Daten 2 Byte tiefer
- ⓪(MOVE SR,4(A7) ; SR darüber
- ⓪(
- ⓪(;BREAK
- ⓪(MOVE #$2700,SR ; keine Interrupts !
- ⓪(
- ⓪(; ③aktiven Prozeß beenden, Daten auf den USP retten
- ⓪(MOVEM.L D0-A6,-(A7)
- ⓪(MOVE.L USP,A0
- ⓪(MOVE.L A0,-(A7)
- ⓪(ST.B -(A7)
- ⓪(
- ⓪(MOVE.L 2+4+60(A7),A0 ; ^Transfer-Daten
- ⓪(
- ⓪(; A0: (s.o.)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+32+8(A0),A2 ; A2: alter dest^
- ⓪(MOVE.L A7,(A2)
- ⓪(
- ⓪(MOVE.L 2+4+4+2+4+4(A0),A3 ; D1: Vektoradr.
- ⓪(LEA 2(A0),A6
- ⓪(MOVE.L (A6)+,(A3) ; alten Vektor restaurieren
- ⓪(TST has020
- ⓪(BEQ no20g
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20g:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪$END
- ⓪"END hdlCall;
- ⓪
- ⓪
- ⓪ PROCEDURE @IOTR ( VAR source,dest:ADDRESS; vecAddr:ADDRESS );
- ⓪"CONST JSRInstr = $4EB9;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; Aufruf erfolgt immer im Usermode, der zu startende Prozeß
- ⓪(; kann in beiden Modi ablaufen
- ⓪(
- ⓪(MOVE.L -(A3),D1 ; vector
- ⓪(MOVE.L -(A3),A2 ; dest
- ⓪(MOVE.L -(A3),A1 ; source
- ⓪(MOVE SR,D2
- ⓪(
- ⓪(; JSR EnterSupervisorMode
- ⓪(
- ⓪(MOVE #$2700,SR ; keine Interrupts !
- ⓪(
- ⓪(; Daten für 'hdlExc' und 'hdlCall':
- ⓪(; 2 Byte - 1, zeigt IOTR an
- ⓪(; 4 Byte - alter Exc-Vektor
- ⓪(; 4 Byte - PC
- ⓪(; 2 Byte - SR
- ⓪(; 4 Byte - A6
- ⓪(; 56 Byte - D0-A5
- ⓪(
- ⓪(; ③aktiven Prozeß beenden④
- ⓪(MOVE.L USP,A0
- ⓪(MOVE.L (A0)+,D0 ; Rücksprungadr. hinter IOTRANSFER
- ⓪(MOVEM.L D0-A5,-(A0)
- ⓪(MOVE.L A6,-(A0)
- ⓪(MOVE.W D2,-(A0)
- ⓪(MOVE.L D0,-(A0)
- ⓪(
- ⓪(MOVE.L D1,A3
- ⓪(MOVE.L (A3),-(A0) ; alten vektor retten
- ⓪(
- ⓪(MOVE #1,-(A0)
- ⓪(
- ⓪(MOVE.L (A2),D0 ; zuerst retten, falls A1=A2
- ⓪(MOVE.L A0,(A1)
- ⓪(MOVE.L D0,A6
- ⓪(
- ⓪(CMPA.W #$400,A3
- ⓪(BCS isExc
- ⓪(MOVE.L #hdlCall,-(A0)
- ⓪(BRA cont0
- ⓪ isExc MOVE.L #hdlExc,-(A0)
- ⓪ cont0 MOVE #JSRInstr,-(A0)
- ⓪(
- ⓪(MOVE.L A0,(A3) ; neuen vektor auf 'JSR hdlExc/hdlCall'
- ⓪(
- ⓪(; ③neuen Prozeß starten④
- ⓪(TST.W (A6)+
- ⓪(BEQ stUsr
- ⓪(BMI stSup
- ⓪(
- ⓪(; starte Usermode, vorher Vektor restaurieren
- ⓪(MOVE.L (A6)+,D0 ; alter Vektor
- ⓪(MOVE.L 4+2+4+4(A6),A0 ; D1: Vektoradr.
- ⓪(MOVE.L D0,(A0)
- ⓪(TST has020
- ⓪(BEQ no20h
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20h:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ stUsr: ; starte Usermode
- ⓪(TST has020
- ⓪(BEQ no20i
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20i:
- ⓪(MOVE.L (A6)+,-(A7) ; PC
- ⓪(MOVE.W (A6)+,-(A7) ; SR
- ⓪(MOVE.L (A6)+,-(A7) ; A6
- ⓪(MOVEM.L (A6)+,D0-A5
- ⓪(MOVE.L A6,USP
- ⓪(MOVE.L (A7)+,A6
- ⓪(RTE
- ⓪(
- ⓪ stSup: ; starte Supervisormode
- ⓪(MOVE.L A6,A7
- ⓪(MOVE.L (A7)+,A0
- ⓪(MOVE.L A0,USP
- ⓪(MOVEM.L (A7)+,D0-A6
- ⓪(ADDQ.L #4,A7
- ⓪(TST has020
- ⓪(BEQ no20j
- ⓪(MOVE.W (A7),-(A7)
- ⓪(MOVE.L 4(A7),2(A7)
- ⓪(MOVE #DftSF,6(A7)
- ⓪ no20j:
- ⓪(RTE
- ⓪$END
- ⓪"END @IOTR;
- ⓪
- ⓪
- ⓪ PROCEDURE @IOCA ( vecAddr:ADDRESS );
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A1
- ⓪(CMPA.L #$400,A1
- ⓪(BCS isExc
- ⓪(MOVEM.L D3-D7/A3-A6,-(A7)
- ⓪(; JSR EnterSupervisorMode ; Regs D0,A0 können verändert werden !
- ⓪(MOVE.L (A1),A1
- ⓪(JSR (A1)
- ⓪(ANDI #$CFFF,SR
- ⓪(MOVEM.L (A7)+,D3-D7/A3-A6
- ⓪(RTS
- ⓪&isExc:
- ⓪(MOVE.L (A7)+,A2
- ⓪(MOVE SR,D1
- ⓪(; JSR EnterSupervisorMode ; Regs D0,A0 können verändert werden !
- ⓪(MOVE.L (A1),A1
- ⓪(TST has020
- ⓪(BEQ no20k
- ⓪(MOVE #DftSF,-(A7)
- ⓪ no20k:
- ⓪(MOVE.L A2,-(A7)
- ⓪(MOVE D1,-(A7)
- ⓪(JMP (A1) ; rettet sicher alle Register
- ⓪$END
- ⓪"END @IOCA;
- ⓪
- ⓪
- ⓪ PROCEDURE @PRIO; (* Set Interrupt Priority *)
- ⓪"BEGIN
- ⓪$(* IR-level in D2, auf Bitpos. wie SR; A2 nicht verändern ! *);
- ⓪$ASSEMBLER
- ⓪(MOVE SR,D0
- ⓪(BTST #13,D0
- ⓪(BNE sup ; wir sind im Supervisormode
- ⓪(; JSR EnterSupervisorMode
- ⓪(MOVE D2,SR
- ⓪(RTS
- ⓪&sup:
- ⓪(ANDI #$F0FF,D0
- ⓪(ANDI #$0F00,D2
- ⓪(OR D2,D0
- ⓪(MOVE D0,SR
- ⓪$END
- ⓪"END @PRIO;
- ⓪
- ⓪
- ⓪ PROCEDURE @EXCL; (* Exclude Element aus Set *)
- ⓪"
- ⓪"BEGIN (* SetAdr und Element auf Stack *)
- ⓪$ASSEMBLER
- ⓪'MOVE.W -(A3),D0
- ⓪'MOVE.W D0,D1
- ⓪'LSR.W #3,D0
- ⓪'MOVE.L -(A3),A0
- ⓪'BCLR D1,0(A0,D0.W) END
- ⓪"END @EXCL;
- ⓪"
- ⓪
- ⓪ PROCEDURE @INCL; (* Include Element in Set *)
- ⓪
- ⓪"BEGIN (* SetAdr und Element auf Stack *)
- ⓪$ASSEMBLER
- ⓪(MOVE.W -(A3),D0
- ⓪(MOVE.W D0,D1
- ⓪(LSR.W #3,D0
- ⓪(MOVE.L -(A3),A0
- ⓪(BSET D1,0(A0,D0.W) END
- ⓪$END @INCL;
- ⓪"
- ⓪
- ⓪ PROCEDURE @SAND; (* '*' auf Sets *)
- ⓪
- ⓪#BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪)ASSEMBLER
- ⓪+MOVE.L A3,A0
- ⓪+ADDQ.W #1,D0
- ⓪+BCLR #0,D0 ;sync. D0
- ⓪+SUBA.W D0,A0
- ⓪%Lp MOVE.W -(A3),D1
- ⓪+AND.W D1,-(A0)
- ⓪+SUBQ.W #2,D0
- ⓪+BHI Lp
- ⓪)END
- ⓪#END @SAND;
- ⓪!
- ⓪
- ⓪ PROCEDURE @SXOR; (* '/' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.L A3,A0
- ⓪*ADDQ.W #1,D0
- ⓪*BCLR #0,D0 ;sync. D0
- ⓪*SUBA.W D0,A0
- ⓪$Lp MOVE.W -(A3),D1
- ⓪*EOR.W D1,-(A0)
- ⓪*SUBQ.W #2,D0
- ⓪*BHI Lp
- ⓪(END
- ⓪"END @SXOR;
- ⓪!
- ⓪
- ⓪ PROCEDURE @SSUM; (* '+' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.L A3,A0
- ⓪*ADDQ.W #1,D0
- ⓪*BCLR #0,D0 ;sync. D0
- ⓪*SUBA.W D0,A0
- ⓪$Lp MOVE.W -(A3),D1
- ⓪*OR.W D1,-(A0)
- ⓪*SUBQ.W #2,D0
- ⓪*BHI Lp
- ⓪(END
- ⓪"END @SSUM;
- ⓪!
- ⓪
- ⓪ PROCEDURE @SDIF; (* '-' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.L A3,A0
- ⓪*ADDQ.W #1,D0
- ⓪*BCLR #0,D0 ;sync. D0
- ⓪*SUBA.W D0,A0
- ⓪$Lp MOVE.W -(A3),D1
- ⓪*AND.W -(A0),D1
- ⓪*EOR.W D1,(A0)
- ⓪*SUBQ.W #2,D0
- ⓪*BHI Lp
- ⓪(END
- ⓪"END @SDIF;
- ⓪
- ⓪
- ⓪ PROCEDURE @SMEM; (* IN-Operator auf Sets *)
- ⓪
- ⓪"BEGIN (* Element.W und Set auf Stack, SetLaenge in D0 *)
- ⓪$ASSEMBLER
- ⓪(MOVE.W D0,D1
- ⓪(NEG.W D1
- ⓪(BCLR #0,D1
- ⓪(LEA 0(A3,D1.W),A0 ;A0 ist ^SetAnfang
- ⓪(MOVE.W -(A0),D2
- ⓪(MOVE.W D2,D1
- ⓪(LSR.W #3,D2
- ⓪(CMP.W D0,D2
- ⓪(BCC NOMEM
- ⓪(BTST D1,2(A0,D2.W)
- ⓪(BEQ NOMEM
- ⓪(MOVE.L A0,A3
- ⓪(MOVE.W #1,(A3)+
- ⓪(RTS
- ⓪&NOMEM
- ⓪(MOVE.L A0,A3
- ⓪(CLR (A3)+
- ⓪$END
- ⓪"END @SMEM;
- ⓪"
- ⓪
- ⓪ PROCEDURE @SEQL; (* '=' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.W D0,D1
- ⓪*NEG.W D1
- ⓪*BCLR #0,D1
- ⓪*LEA 0(A3,D1.W),A0 ;^Anfang des 2. Sets
- ⓪*LEA 0(A0,D1.W),A1 ;^Anfang des 1. Sets
- ⓪*MOVE.L A1,D1
- ⓪*SUBQ.W #1,D0
- ⓪$Lp CMPM.B (A0)+,(A1)+
- ⓪*DBNE D0,Lp
- ⓪*SEQ D0
- ⓪*AND.W #1,D0
- ⓪*MOVE.L D1,A3
- ⓪*MOVE.W D0,(A3)+
- ⓪(END
- ⓪"END @SEQL;
- ⓪
- ⓪
- ⓪ PROCEDURE @SNEQ; (* '#' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.W D0,D1
- ⓪*NEG.W D1
- ⓪*BCLR #0,D1
- ⓪*LEA 0(A3,D1.W),A0 ;^Anfang des 2. Sets
- ⓪*LEA 0(A0,D1.W),A1 ;^Anfang des 1. Sets
- ⓪*MOVE.L A1,D1
- ⓪*SUBQ.W #1,D0
- ⓪$Lp CMPM.B (A0)+,(A1)+
- ⓪*DBNE D0,Lp
- ⓪*SNE D0
- ⓪*AND.W #1,D0
- ⓪*MOVE.L D1,A3
- ⓪*MOVE.W D0,(A3)+
- ⓪(END
- ⓪"END @SNEQ;
- ⓪
- ⓪
- ⓪ PROCEDURE @SLEQ; (* '<=' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.W D0,D1
- ⓪*NEG.W D1
- ⓪*BCLR #0,D1
- ⓪*LEA 0(A3,D1.W),A0 ;^Anfang des 2. Sets
- ⓪*LEA 0(A0,D1.W),A1 ;^Anfang des 1. Sets
- ⓪*MOVE.L A1,D2
- ⓪*SUBQ.W #1,D0
- ⓪$Lp MOVE.B (A1),D1
- ⓪*AND.B (A0)+,D1
- ⓪*EOR.B D1,(A1)+ ;Set1 * Set2 =! Set1
- ⓪*DBNE D0,Lp
- ⓪*SEQ D0
- ⓪*AND.W #1,D0
- ⓪*MOVEA.L D2,A3
- ⓪*MOVE.W D0,(A3)+
- ⓪(END
- ⓪"END @SLEQ;
- ⓪
- ⓪
- ⓪ PROCEDURE @SGEQ; (* '>=' auf Sets *)
- ⓪
- ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)
- ⓪(ASSEMBLER
- ⓪*MOVE.W D0,D1
- ⓪*NEG.W D1
- ⓪*BCLR #0,D1
- ⓪*LEA 0(A3,D1.W),A0 ;^Anfang des 2. Sets
- ⓪*LEA 0(A0,D1.W),A1 ;^Anfang des 1. Sets
- ⓪*MOVE.L A1,D2
- ⓪*SUBQ.W #1,D0
- ⓪$Lp MOVE.B (A0),D1
- ⓪*AND.B (A1)+,D1
- ⓪*EOR.B D1,(A0)+ ;Set1 * Set2 =! Set2
- ⓪*DBNE D0,Lp
- ⓪*SEQ D0
- ⓪*AND.W #1,D0
- ⓪*MOVEA.L D2,A3
- ⓪*MOVE.W D0,(A3)+
- ⓪(END
- ⓪"END @SGEQ;
- ⓪
- ⓪ (********* Real-Vergleiche *********)
- ⓪
- ⓪ PROCEDURE @REEQ (a,b:LONGREAL):BOOLEAN; (* a = b *)
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪$; !!! sind bei 881 nicht unbenutzte Bits, die hier falsche Erg. liefern k?
- ⓪$MOVE.L -(A3),D0
- ⓪$MOVE.L -(A3),D1
- ⓪$MOVE.L -(A3),D2
- ⓪$CMP.L -(A3),D1
- ⓪$BNE NE
- ⓪$CMP.L D0,D2
- ⓪$BNE NE
- ⓪$MOVE.W #true,(A3)+
- ⓪$RTS
- ⓪ !NE CLR.W (A3)+
- ⓪"END
- ⓪ END @REEQ;
- ⓪
- ⓪ PROCEDURE @RENE (a,b:LONGREAL):BOOLEAN; (* a # b *)
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪$; !!! sind bei 881 nicht unbenutzte Bits, die hier falsche Erg. liefern k?
- ⓪$MOVE.L -(A3),D0
- ⓪$MOVE.L -(A3),D1
- ⓪$MOVE.L -(A3),D2
- ⓪$CMP.L -(A3),D1
- ⓪$BNE NE
- ⓪$CMP.L D0,D2
- ⓪$BNE NE
- ⓪$CLR.W (A3)+
- ⓪$RTS
- ⓪ !NE MOVE.W #true,(A3)+
- ⓪"END
- ⓪ END @RENE;
- ⓪
- ⓪ (*********** Longint - Arithmetik ***********)
- ⓪
- ⓪ PROCEDURE @IMUL (a,b:LONGINT):LONGINT;
- ⓪ BEGIN
- ⓪#ASSEMBLER
- ⓪'MOVE.L D3,-(A7)
- ⓪'CLR.W D3
- ⓪'MOVE.L -(A3),D0
- ⓪'BPL IMUL5
- ⓪'NEG.L D0
- ⓪'MOVEQ #1,D3
- ⓪ !IMUL5 MOVE.L -(A3),D1
- ⓪'BPL IMUL4
- ⓪'NEG.L D1
- ⓪'BCHG #0,D3
- ⓪ !IMUL4 MOVE.L D0,D2
- ⓪'MULU D1,D0
- ⓪'SWAP D1
- ⓪'TST.W D1
- ⓪'BEQ IMUL1
- ⓪'SWAP D2
- ⓪'TST.W D2
- ⓪'BEQ IMUL2
- ⓪'BNE IMERR
- ⓪ !IMUL1 SWAP D1
- ⓪ !IMUL2 SWAP D2
- ⓪'MULU D1,D2
- ⓪'SWAP D2
- ⓪'TST.W D2
- ⓪'BNE IMERR
- ⓪'ADD.L D2,D0
- ⓪'BVS IMERR
- ⓪'BMI IMERR
- ⓪'TST.W D3
- ⓪'BEQ IMUL3
- ⓪'NEG.L D0
- ⓪ !IMUL3 MOVE.L D0,(A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'RTS
- ⓪'
- ⓪ !IMERR LINK A5,#0
- ⓪'TRAP #6 ; Overflow
- ⓪'DC.W -7-$4000
- ⓪'CLR.L (A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'UNLK A5
- ⓪#END
- ⓪ END @IMUL;
- ⓪
- ⓪ PROCEDURE @CMUL (a,b:LONGCARD):LONGCARD;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪'MOVE.L -(A3),D0
- ⓪'MOVE.L -(A3),D1
- ⓪'MOVE.L D0,D2
- ⓪'MULU D1,D0
- ⓪'SWAP D1
- ⓪'TST.W D1
- ⓪'BEQ CMUL1
- ⓪'SWAP D2
- ⓪'TST.W D2
- ⓪'BEQ CMUL2
- ⓪'BNE CMERR
- ⓪ !CMUL1 SWAP D1
- ⓪ !CMUL2 SWAP D2
- ⓪'MULU D1,D2
- ⓪'SWAP D2
- ⓪'TST.W D2
- ⓪'BNE CMERR
- ⓪'ADD.L D2,D0
- ⓪'BCS CMERR
- ⓪'MOVE.L D0,(A3)+
- ⓪'RTS
- ⓪'
- ⓪ !CMERR LINK A5,#0
- ⓪'TRAP #6 ; Overflow
- ⓪'DC.W -7-$4000
- ⓪'CLR.L (A3)+
- ⓪'UNLK A5
- ⓪#END
- ⓪ END @CMUL;
- ⓪
- ⓪ PROCEDURE @IDIV (a,b:LONGINT):LONGINT;
- ⓪ BEGIN
- ⓪#ASSEMBLER
- ⓪(MOVEM.L D4-D5,-(A7)
- ⓪(
- ⓪(CLR.W D5
- ⓪(MOVE.L -(A3),D0
- ⓪(BEQ IDERR
- ⓪(BPL IDIV5
- ⓪(NEG.L D0
- ⓪(MOVEQ #1,D5
- ⓪ !IDIV5 MOVE.L -(A3),D1
- ⓪(BPL IDIV6
- ⓪(NEG.L D1
- ⓪(BCHG #0,D5
- ⓪ !IDIV6 CLR.L D2
- ⓪(CLR.L D4
- ⓪ !IDIV1 CMP.L D0,D1
- ⓪(BLS IDIV2
- ⓪(LSL.L #1,D0
- ⓪(ADDQ.W #1,D2
- ⓪(BRA IDIV1
- ⓪ !IDIV3 LSR.L #1,D0
- ⓪ !IDIV2 LSL.L #1,D4
- ⓪(CMP.L D0,D1
- ⓪(BCS IDIV4
- ⓪(SUB.L D0,D1
- ⓪(ADDQ.W #1,D4
- ⓪ !IDIV4 DBF D2,IDIV3
- ⓪(TST.W D5
- ⓪(BEQ IDIV7
- ⓪(NEG.L D4
- ⓪ !IDIV7 MOVE.L D4,(A3)+
- ⓪(MOVEM.L (A7)+,D4-D5
- ⓪(RTS
- ⓪(
- ⓪ !IDERR LINK A5,#0
- ⓪(TRAP #6 ; Div by zero
- ⓪(DC.W -5-$4000
- ⓪(CLR.L (A3)+
- ⓪(MOVEM.L (A7)+,D4-D5
- ⓪(UNLK A5
- ⓪$END
- ⓪ END @IDIV;
- ⓪
- ⓪ PROCEDURE @CDIV (a,b:LONGCARD):LONGCARD;
- ⓪ BEGIN
- ⓪ ASSEMBLER
- ⓪'MOVE.L D3,-(A7)
- ⓪'MOVE.L -(A3),D0
- ⓪'BEQ CDERR
- ⓪'MOVE.L -(A3),D1
- ⓪'CLR.L D2
- ⓪'CLR.L D3
- ⓪'TST.L D0
- ⓪'BMI CDIV2
- ⓪ !CDIV1 CMP.L D0,D1
- ⓪'BLS CDIV2
- ⓪'ADDQ #1,D2
- ⓪'ASL.L #1,D0
- ⓪'BPL CDIV1
- ⓪ !CDIV2 ASL.L #1,D3
- ⓪'CMP.L D0,D1
- ⓪'BCS CDIV3
- ⓪'SUB.L D0,D1
- ⓪'ADDQ #1,D3
- ⓪ !CDIV3 LSR.L #1,D0
- ⓪'DBF D2,CDIV2
- ⓪'MOVE.L D3,(A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'RTS
- ⓪'
- ⓪ !CDERR LINK A5,#0
- ⓪'TRAP #6 ; Div by zero
- ⓪'DC.W -5-$4000
- ⓪'CLR.L (A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'UNLK A5
- ⓪ END
- ⓪ END @CDIV;
- ⓪
- ⓪ PROCEDURE @IMOD (a,b:LONGINT):LONGINT;
- ⓪ BEGIN
- ⓪ ASSEMBLER
- ⓪'MOVE.L D5,-(A7)
- ⓪'CLR.W D5
- ⓪'CLR.L D2
- ⓪'MOVE.L -(A3),D0
- ⓪'BEQ IMODER
- ⓪'BPL IMOD2
- ⓪'NEG.L D0
- ⓪ !IMOD2 MOVE.L -(A3),D1
- ⓪'BPL IMOD1
- ⓪'NEG.L D1
- ⓪'MOVEQ #1,D5
- ⓪ !IMOD1 CMP.L D0,D1
- ⓪'BLS IMOD5
- ⓪'LSL.L #1,D0
- ⓪'ADDQ.W #1,D2
- ⓪'BRA IMOD1
- ⓪ !IMOD3 LSR.L #1,D0
- ⓪ !IMOD5 CMP.L D0,D1
- ⓪'BCS IMOD4
- ⓪'SUB.L D0,D1
- ⓪ !IMOD4 DBEQ D2,IMOD3
- ⓪'TST.W D5
- ⓪'BEQ IMOD6
- ⓪'NEG.L D1
- ⓪ !IMOD6 MOVE.L D1,(A3)+
- ⓪'MOVE.L (A7)+,D5
- ⓪'RTS
- ⓪'
- ⓪ IMODER LINK A5,#0
- ⓪'TRAP #6 ; Div by zero
- ⓪'DC.W -5-$4000
- ⓪'CLR.L (A3)+
- ⓪'MOVE.L (A7)+,D5
- ⓪'UNLK A5
- ⓪#END
- ⓪ END @IMOD;
- ⓪
- ⓪ PROCEDURE @CMOD (a,b:LONGCARD):LONGCARD;
- ⓪ BEGIN
- ⓪ ASSEMBLER
- ⓪'MOVE.L D3,-(A7)
- ⓪'MOVE.L -(A3),D0
- ⓪'BEQ CMERR
- ⓪'MOVE.L -(A3),D1
- ⓪'CLR.L D2
- ⓪'MOVE.L D0,D3
- ⓪'BMI CMOD2
- ⓪ !CMOD1 CMP.L D0,D1
- ⓪'BLS CMOD2
- ⓪'ADDQ #1,D2
- ⓪'ASL.L #1,D0
- ⓪'BPL CMOD1
- ⓪ !CMOD2 CMP.L D0,D1
- ⓪'BCS CMOD3
- ⓪'SUB.L D0,D1
- ⓪ !CMOD3 LSR.L #1,D0
- ⓪'CMP.L D1,D3
- ⓪'DBHI D2,CMOD2
- ⓪'
- ⓪'MOVE.L D1,(A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'RTS
- ⓪'
- ⓪ !CMERR LINK A5,#0
- ⓪'TRAP #6 ; Div by zero
- ⓪'DC.W -5-$4000
- ⓪'CLR.L (A3)+
- ⓪'MOVE.L (A7)+,D3
- ⓪'UNLK A5
- ⓪#END
- ⓪ END @CMOD;
- ⓪
- ⓪ PROCEDURE @ASGN;
- ⓪ BEGIN
- ⓪#ASSEMBLER
- ⓪'MOVE.L -(A3),A0
- ⓪$!X MOVE.W (A0)+,(A4)+
- ⓪'DBF D0,X
- ⓪#END
- ⓪ END @ASGN;
- ⓪
- ⓪ PROCEDURE @STAS;
- ⓪ (* D0: LAENGE DES SOURCESTRING/BYTE; D1: LAENGE DEST.STRING/BYTE *)
- ⓪ BEGIN
- ⓪#ASSEMBLER
- ⓪'MOVE.L A3,A0
- ⓪'MOVE.L D0,D2
- ⓪'ADDQ.L #1,D0 ; D0 als StackOffset: muss synch. werden!
- ⓪'ANDI.W #$FFFE,D0 ; nicht BCLR verwenden, sonst Fehler bei DBEQ (unten)
- ⓪'SUBA.L D0,A0 ; A0 zeigt auf Sourcestring
- ⓪'BRA y
- ⓪$
- ⓪$z SWAP D1 ;*** Kopierschleife
- ⓪$x SUBQ.L #1,D2
- ⓪'BCS ok2 ; Source-Ende, Dest. muss Endmarke bekommen
- ⓪'MOVE.B (A0)+,(A4)+
- ⓪$y DBEQ D1,x
- ⓪'BEQ ok ; Endmarke der Source wurde eben kopiert
- ⓪'SWAP D1
- ⓪'DBF D1,z
- ⓪'
- ⓪'TST.L D2 ;*** Ende der Schleife, weil Dest voll
- ⓪'BEQ ok ; Source komplett kopiert (hatte keine Endmarke)
- ⓪'TST.B (A0)
- ⓪'BEQ ok ; sonst muss die Endmarke das naechste Zeichen sein
- ⓪'SUBA.L D0,A3 ; leider nein: String Overflow
- ⓪'TRAP #6
- ⓪'DC.W -8-$4000
- ⓪#ok2 CLR.B (A4)+
- ⓪#ok SUBA.L D0,A3
- ⓪#END
- ⓪ END @STAS;
- ⓪
- ⓪
- ⓪ PROCEDURE @COPY;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪&move.l (a7)+,A1 ;Ruecksprung-Adr
- ⓪&
- ⓪&; Platzbedarf ausrechnen
- ⓪&
- ⓪&move.w -2(a3),d1 ;High-Wert
- ⓪&addq.w #1,d1 ;Anzahl Elemente
- ⓪&mulu d0,d1 ; * Elementlaenge = Anzahl Bytes
- ⓪&addq.l #1,d1 ;synchronisieren
- ⓪&bclr #0,d1
- ⓪&
- ⓪&; Platz reservieren, Pointer bereitstellen
- ⓪&
- ⓪&suba.l d1,a7
- ⓪&movea.l -6(a3),A2 ;^ Source-Daten
- ⓪&move.l a7,-6(a3) ;neuer ^ Kopie
- ⓪&movea.l a7,a0 ;^ fuer Kopierschleife
- ⓪&move.l d1,-(a7) ;fuer Release
- ⓪&
- ⓪&; Kopierschleife
- ⓪&
- ⓪&bra lp2
- ⓪!lp1 swap d1
- ⓪!lp move.b (A2)+,(a0)+ ;schoen langsam umkopieren...
- ⓪!lp2 dbf d1,lp
- ⓪&swap d1
- ⓪&dbf d1,lp1
- ⓪&
- ⓪&jmp (A1) ;zurueck zum Aufrufer
- ⓪$END
- ⓪"END @COPY;
- ⓪
- ⓪
- ⓪ PROCEDURE @COPS;
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪&move.l (a7)+,A1 ;Ruecksprung-Adr
- ⓪&move.l (a7)+,d2 ;Adresse der zu rufenden Prozedur retten
- ⓪&
- ⓪&; Platzbedarf ausrechnen
- ⓪&
- ⓪&move.w -2(a3),d1 ;High-Wert
- ⓪&addq.w #1,d1 ;Anzahl Elemente
- ⓪&mulu d0,d1 ; * Elementlaenge = Anzahl Bytes
- ⓪&addq.l #1,d1 ;synchronisieren
- ⓪&bclr #0,d1
- ⓪&
- ⓪&; Platz reservieren, Pointer bereitstellen
- ⓪&
- ⓪&suba.l d1,a7
- ⓪&movea.l -6(a3),A2 ;^ Source-Daten
- ⓪&move.l a7,-6(a3) ;neuer ^ Kopie
- ⓪&movea.l a7,a0 ;^ fuer Kopierschleife
- ⓪&move.l d1,-(a7) ;fuer Release
- ⓪&
- ⓪&; Kopierschleife
- ⓪&
- ⓪&bra lp2
- ⓪!lp1 swap d1
- ⓪!lp move.b (A2)+,(a0)+ ;schoen langsam umkopieren...
- ⓪!lp2 dbf d1,lp
- ⓪&swap d1
- ⓪&dbf d1,lp1
- ⓪&
- ⓪&move.l d2,-(a7)
- ⓪&jmp (A1) ;zurueck zum Aufrufer
- ⓪$END
- ⓪"END @COPS;
- ⓪
- ⓪ PROCEDURE @SCAS; END @SCAS;
- ⓪
- ⓪ PROCEDURE @RES1; (* Procedure Entry ohne Priority *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; Null-Link (keine Parameter, keine lok. Vars), norm. $200 Stack-Check
- ⓪(LEA $200(A3),A0
- ⓪(CMPA.L A7,A0
- ⓪(BCC stackerror
- ⓪&cont
- ⓪(MOVE.L (A7)+,A0
- ⓪(LINK A5,#$0000
- ⓪(MOVE.L A7,A2
- ⓪(MOVEM.L A4/A6,-(A7)
- ⓪(MOVE.L A2,A6
- ⓪(JMP (A0)
- ⓪&stackerror
- ⓪(TRAP #6
- ⓪(DC.W $BFF6 ; Stack overflow, caller caused
- ⓪(BRA cont
- ⓪$END
- ⓪"END @RES1;
- ⓪
- ⓪ PROCEDURE @RES2; (* Procedure Entry ohne Priority *)
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(; D0.W: Link-Wert
- ⓪(; als Stacksicherheitswert wird $200 angenommen
- ⓪(LEA $200(A3),A0
- ⓪(ADDA.W D0,A0
- ⓪(CMPA.L A7,A0
- ⓪(BCC stackerror
- ⓪&cont
- ⓪(MOVE.L (A7)+,A0
- ⓪(; LINK #<D0>,A5:
- ⓪(MOVE.L A5,-(A7)
- ⓪(MOVE.L A7,A5
- ⓪(SUBA.W D0,A7
- ⓪(
- ⓪(MOVE.L A7,A2
- ⓪(MOVEM.L A4/A6,-(A7)
- ⓪(MOVE.L A2,A6
- ⓪(JMP (A0)
- ⓪&stackerror
- ⓪(TRAP #6
- ⓪(DC.W $BFF6 ; Stack overflow, caller caused
- ⓪(BRA cont
- ⓪$END
- ⓪"END @RES2;
- ⓪
- ⓪ PROCEDURE @RES3; END @RES3;
- ⓪ PROCEDURE @RES4; END @RES4;
- ⓪ PROCEDURE @RES5; END @RES5;
- ⓪ PROCEDURE @RES6; END @RES6;
- ⓪ PROCEDURE @RES7; END @RES7;
- ⓪ PROCEDURE @RES8; END @RES8;
- ⓪ PROCEDURE @RES9; END @RES9;
- ⓪
- ⓪
- ⓪ PROCEDURE CAP (ch: CHAR): CHAR;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(CLR D0
- ⓪(MOVE.B -2(A3),D0
- ⓪(LEA tab(PC),A0
- ⓪(MOVE.B 0(A0,D0.W),-2(A3)
- ⓪(RTS
- ⓪"
- ⓪"tab: DC.B $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
- ⓪(DC.B $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F
- ⓪(DC.B ' ','!','"','#','$','%','&',$27,'(',')','*','+',',','-','.','/'
- ⓪(DC.B '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?'
- ⓪(DC.B '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'
- ⓪(DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_'
- ⓪(DC.B '`','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'
- ⓪(DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','{','|','}','~',''
- ⓪(DC.B 'Ç','Ü','É','A','Ä','À','Å','Ç','E','E','E','I','I','I','Ä','Å'
- ⓪(DC.B 'É','Æ','Æ','O','Ö','O','U','U','ÿ','Ö','Ü','¢','£','¥','ß','ƒ'
- ⓪(DC.B 'A','I','O','U','Ñ','Ñ','ª','º','¿','⌐','¬','½','¼','¡','«','»'
- ⓪(DC.B 'Ã','Õ','Ø','Ø','Œ','Œ','À','Ã','Õ','¨','´','†','¶','©','®','™'
- ⓪(DC.B 'IJ','IJ','א','ב','ג','ד','ה','ו','ז','ח','ט','י','כ','ל','מ','נ'
- ⓪(DC.B 'ס','ע','פ','צ','ק','ר','ש','ת','ן','ך','ם','ף','ץ','§','∧','∞'
- ⓪(DC.B 'α','β','Γ','π','Σ','σ','µ','τ','Φ','Θ','Ω','δ','∮','ϕ','∈','∩'
- ⓪(DC.B '≡','±','≥','≤','⌠','⌡','÷','≈','°','∙','·','√','ⁿ','²','³','¯'
- ⓪"END
- ⓪ END CAP;
- ⓪
- ⓪
- ⓪ PROCEDURE CHR (c: WORD): CHAR;
- ⓪ BEGIN ASSEMBLER
- ⓪(MOVE.B -(A3),D0 ;Low-Byte wird Char
- ⓪(TST.B -(A3)
- ⓪(BEQ ok ;High-Byte muss 0 sein
- ⓪(LINK A5,#0
- ⓪(TRAP #6
- ⓪(DC.W -7-$4000 ;Overflow
- ⓪(UNLK A5
- ⓪#ok MOVE.B D0,(A3)+
- ⓪(CLR.B (A3)+
- ⓪'END
- ⓪ END CHR;
- ⓪
- ⓪ PROCEDURE HALT;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪(LINK A5,#0
- ⓪(TRAP #6
- ⓪(DC.W -11-$4000 ; HALT
- ⓪(UNLK A5
- ⓪"END
- ⓪ END HALT;
- ⓪
- ⓪ PROCEDURE FLOAT(i: LONGCARD): LONGREAL;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪ (*$? ~A68881 & ~M68881:
- ⓪&MOVE.W #$0102,D0 ;Exponent 32
- ⓪&MOVE.L -(A3),D1
- ⓪&BEQ ZERO
- ⓪&BMI Large ;ist linksbündig
- ⓪ POS SUBQ.W #8,D0 ;linksbündig machen
- ⓪&LSL.L #1,D1
- ⓪&BPL POS
- ⓪ Large SWAP D0
- ⓪&SWAP D1
- ⓪&MOVE.W D1,D0
- ⓪&CLR.W D1
- ⓪&MOVE.L D0,(A3)+
- ⓪&MOVE.L D1,(A3)+
- ⓪&RTS
- ⓪ !ZERO CLR.L (A3)+
- ⓪&CLR.L (A3)+
- ⓪ *)
- ⓪ (*$? M68881:
- ⓪(FMOVE.L -(A3),FP0 ; kein Runtime-Fehler möglich
- ⓪(FMOVE.D FP0,(A3)+
- ⓪ *)
- ⓪ (*$? A68881:
- ⓪(; FMOVE.L -(A3),FP0 ; kein Runtime-Fehler möglich
- ⓪(MOVE.W #$4000,fpcmd
- ⓪ DoDl1 TST.B fpstatlo
- ⓪(BEQ DoDl1
- ⓪(MOVE.L -(A3),fpop
- ⓪(; FMOVE.D FP0,(A3)+
- ⓪(MOVE.W #$7400,fpcmd
- ⓪ DoDl3 MOVE.B fpstatlo,D0
- ⓪(BEQ DoDl3
- ⓪(MOVE.L fpop,(A3)+
- ⓪(MOVE.L fpop,(A3)+
- ⓪(TST.B fpstatlo
- ⓪ *)
- ⓪"END
- ⓪ END FLOAT;
- ⓪
- ⓪ PROCEDURE TRUNC(r: LONGREAL): LONGCARD;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪ (*$? ~A68881 & ~M68881:
- ⓪'LINK A5,#0
- ⓪'MOVEM.L D3-D4,-(A7)
- ⓪
- ⓪'MOVE.L -(A3),D0
- ⓪'MOVE.L -(A3),D1
- ⓪'SWAP D1
- ⓪'BTST #0,D1
- ⓪'BNE nega ;Zahl ist negativ -> Fehler
- ⓪'ASR.W #3,D1
- ⓪'MOVE.W #32,D4
- ⓪'SUB.W D1,D4
- ⓪'BLT Err ;Exponent war > 32: 0.FFF.. * 2^32 ist MaxLCard
- ⓪'CMP.W #32,D4
- ⓪'BCC ZERO ;Exponent war <= 0
- ⓪'MOVE.L D1,D2
- ⓪'SWAP D0
- ⓪'MOVE.W D0,D2
- ⓪'LSR.L D4,D2
- ⓪'BRA X
- ⓪!!ZERO CLR.L D2
- ⓪!!X MOVE.L D2,(A3)+
- ⓪'MOVEM.L (A7)+,D3-D4
- ⓪'UNLK A5
- ⓪'RTS
- ⓪
- ⓪!!NEGA TRAP #6
- ⓪'DC.W -6-$4000 ; Out of range: Arg. ist negativ
- ⓪'BRA cont
- ⓪!!ERR TRAP #6
- ⓪'DC.W -7-$4000 ; Overflow: Arg. ist > MaxLCard
- ⓪!!CONT CLR.L (A3)+
- ⓪'MOVEM.L (A7)+,D3-D4
- ⓪'UNLK A5
- ⓪ *)
- ⓪ (*$? M68881:
- ⓪(; !!! Abfrage auf neg. Ergebnis und Überlauf fehlt noch!
- ⓪(FINTRZ.D -(A3),FP0
- ⓪(FMOVE.L FP0,(A3)+
- ⓪ *)
- ⓪ (*$? A68881:
- ⓪(; !!! Abfrage auf neg. Ergebnis fehlt noch!
- ⓪(; FINTRZ.D -(A3),FP0
- ⓪(MOVE.W #$5403,fpcmd
- ⓪ DoDl1 MOVE.B fpstatlo,D0
- ⓪(BEQ DoDl1
- ⓪(CMPI.B #8,D0
- ⓪(BNE error2
- ⓪(MOVE.L -8(A3),fpop
- ⓪(MOVE.L -(A3),fpop
- ⓪(SUBQ.L #4,A3
- ⓪(; FMOVE.L FP0,(A3)+
- ⓪(MOVE.W #$6000,fpcmd
- ⓪ DoDl3 MOVE.B fpstatlo,D0
- ⓪(BEQ DoDl3
- ⓪(CMPI.B #2,D0
- ⓪(BNE error
- ⓪(MOVE.L fpop,(A3)+
- ⓪(TST.B fpstatlo
- ⓪(RTS
- ⓪ error2 SUBQ.L #8,A3
- ⓪ error LINK A5,#0
- ⓪(JSR FPUError
- ⓪(UNLK A5
- ⓪(CLR.L (A3)+
- ⓪ *)
- ⓪"END
- ⓪ END TRUNC;
- ⓪
- ⓪
- ⓪ (*$? A68881:
- ⓪ PROCEDURE DoComp;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪+LEA -16(A3),A3
- ⓪+MOVE.L A3,A0
- ⓪+MOVE.W #$5400,fpcmd
- ⓪"!DoCl1 TST.B fpstatlo
- ⓪+BEQ DoCl1
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.W #$5438,fpcmd ;FCMP ?,FP0
- ⓪"!DoCl2 MOVE.B fpstatlo,D0
- ⓪+BEQ DoCl2
- ⓪+CMPI.B #8,D0
- ⓪+BNE DoCError
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.W D1,fpcond
- ⓪+CLR.W D0
- ⓪+MOVE.B fpstatlo,D0
- ⓪+MOVE.W D0,(A3)+
- ⓪+RTS
- ⓪"!DoCError
- ⓪+LINK A5,#0
- ⓪+JSR FPUError
- ⓪+UNLK A5
- ⓪+CLR (A3)+
- ⓪"END;
- ⓪ END DoComp;
- ⓪ *)
- ⓪
- ⓪
- ⓪ PROCEDURE @RELE (a,b:LONGREAL):BOOLEAN; (* Op1 <= Op2, neu *)
- ⓪ BEGIN ASSEMBLER
- ⓪&(*$? ~A68881:
- ⓪(MOVEM.L D3/D4,-(A7)
- ⓪(MOVEQ #16,D4
- ⓪(MOVE.L -(A3),D0 ;zweiter Operand
- ⓪(MOVE.L -(A3),D1
- ⓪(BEQ zer2
- ⓪(MOVE.L -(A3),D2 ;erster Operand
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ zer1
- ⓪(BTST D4,D3
- ⓪(BNE neg1 ;Op1 negativ
- ⓪(BTST D4,D1
- ⓪(BNE neg2 ;Op2 negativ
- ⓪(CMP.L D1,D3 ;beide Operanden positiv
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D0,D2
- ⓪(BLS neg3
- ⓪(BRA neg2
- ⓪!neg1 BTST D4,D1
- ⓪(BEQ neg3 ;Op1 negativ, Op2 positiv
- ⓪(CMP.L D3,D1
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D2,D0
- ⓪(BLS neg3
- ⓪!neg2 CLR.W (A3)+ ;Op1 positiv, Op2 negativ
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪(RTS
- ⓪!zer2 SUBQ.L #4,A3 ;Op2 Null, Op1 <= 0 ?
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ neg3 ;Op1 = Op2 = 0
- ⓪(BTST D4,D3
- ⓪(BNE neg3 ;Op2 = 0; Op1 < 0
- ⓪(BRA neg2
- ⓪!zer1 BTST D4,D1 ;Op1 Null, Op2 # 0: ist Op2 < 0?
- ⓪(BNE neg2 ; ja
- ⓪!neg3 MOVEM.L (A7)+,D3/D4
- ⓪(MOVE.W #TRUE,(A3)+
- ⓪&*)
- ⓪&(*$? A68881:
- ⓪(MOVE.W #$15,D1 ;Conditional LE
- ⓪(JMP DoComp
- ⓪&*)
- ⓪'END
- ⓪ END @RELE;
- ⓪
- ⓪ PROCEDURE @REGE (a,b:LONGREAL):BOOLEAN;
- ⓪ BEGIN ASSEMBLER
- ⓪&(*$? ~A68881:
- ⓪(MOVEM.L D3/D4,-(A7)
- ⓪(MOVEQ #16,D4
- ⓪(MOVE.L -(A3),D0 ;zweiter Operand
- ⓪(MOVE.L -(A3),D1
- ⓪(BEQ zer2
- ⓪(MOVE.L -(A3),D2 ;erster Operand
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ zer1
- ⓪(BTST D4,D3
- ⓪(BNE neg1 ;Op1 negativ
- ⓪(BTST D4,D1
- ⓪(BNE neg2 ;Op2 negativ
- ⓪(CMP.L D1,D3 ;beide Operanden positiv
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D0,D2
- ⓪(BCS neg3
- ⓪(BRA neg2
- ⓪!neg1 BTST D4,D1
- ⓪(BEQ neg3 ;Op1 negativ, Op2 positiv
- ⓪(CMP.L D3,D1
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D2,D0
- ⓪(BCS neg3
- ⓪!neg2 MOVE.W #true,(A3)+ ;Op1 positiv, Op2 negativ
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪(RTS
- ⓪!zer2 SUBQ.L #4,A3 ;Op2 Null, Op1 <= 0 ?
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ neg2 ;beide Null
- ⓪(BTST D4,D3
- ⓪(BNE neg3 ;Op2 = 0, Op1 < 0
- ⓪(BRA neg2 ;Op2 = 0, Op1 > 0
- ⓪!zer1 BTST D4,D1 ;Op1 = 0, Op2 # 0: ist Op2 > 0?
- ⓪(BNE neg2 ; nein
- ⓪!neg3 CLR.W (A3)+ ;Op1 negativ, Op2 positiv
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪&*)
- ⓪&(*$? A68881:
- ⓪(MOVE.W #$13,D1 ;Conditional GE
- ⓪(JMP DoComp
- ⓪&*)
- ⓪#END
- ⓪ END @REGE;
- ⓪
- ⓪ PROCEDURE @RELT (a,b:LONGREAL):BOOLEAN;
- ⓪ BEGIN ASSEMBLER
- ⓪&(*$? ~A68881:
- ⓪(MOVEM.L D3/D4,-(A7)
- ⓪(MOVEQ #16,D4
- ⓪(MOVE.L -(A3),D0 ;zweiter Operand
- ⓪(MOVE.L -(A3),D1
- ⓪(BEQ zer2
- ⓪(MOVE.L -(A3),D2 ;erster Operand
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ zer1
- ⓪(BTST D4,D3
- ⓪(BNE neg1 ;Op1 negativ
- ⓪(BTST D4,D1
- ⓪(BNE neg2 ;Op2 negativ
- ⓪(CMP.L D1,D3 ;beide Operanden positiv
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D0,D2
- ⓪(BCS neg3
- ⓪(BRA neg2
- ⓪!neg1 BTST D4,D1
- ⓪(BEQ neg3 ;Op1 negativ, Op2 positiv
- ⓪(CMP.L D3,D1
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D2,D0
- ⓪(BCS neg3
- ⓪!neg2 CLR.W (A3)+ ;Op1 positiv, Op2 negativ
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪(RTS
- ⓪!zer2 SUBQ.L #4,A3 ;Op2 Null, Op1 <= 0 ?
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ neg2 ;beide Null
- ⓪(BTST D4,D3
- ⓪(BNE neg3 ;Op2 = 0, Op1 < 0
- ⓪(BRA neg2 ;Op2 = 0, Op1 > 0
- ⓪!zer1 BTST D4,D1 ;Op1 = 0, Op2 # 0: ist Op2 > 0?
- ⓪(BNE neg2 ; nein
- ⓪!neg3 MOVE.W #TRUE,(A3)+ ;Op1 negativ, Op2 positiv
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪&*)
- ⓪&(*$? A68881:
- ⓪(MOVE.W #$14,D1 ;Conditional LT
- ⓪(JMP DoComp
- ⓪&*)
- ⓪&END
- ⓪ END @RELT;
- ⓪
- ⓪ PROCEDURE @REGT (a,b:LONGREAL):BOOLEAN;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪(MOVEM.L D3/D4,-(A7)
- ⓪(MOVEQ #16,D4
- ⓪(MOVE.L -(A3),D0 ;zweiter Operand
- ⓪(MOVE.L -(A3),D1
- ⓪(BEQ zer2
- ⓪(MOVE.L -(A3),D2 ;erster Operand
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ zer1
- ⓪(BTST D4,D3
- ⓪(BNE neg1 ;Op1 negativ
- ⓪(BTST D4,D1
- ⓪(BNE neg2 ;Op2 negativ
- ⓪(CMP.L D1,D3 ;beide Operanden positiv
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D0,D2
- ⓪(BLS neg3
- ⓪(BRA neg2
- ⓪!neg1 BTST D4,D1
- ⓪(BEQ neg3 ;Op1 negativ, Op2 positiv
- ⓪(CMP.L D3,D1
- ⓪(BLT neg3
- ⓪(BGT neg2
- ⓪(CMP.L D2,D0
- ⓪(BLS neg3
- ⓪!neg2 MOVE.W #true,(A3)+ ;Op1 positiv, Op2 negativ
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪(RTS
- ⓪!zer2 SUBQ.L #4,A3 ;Op2 Null, Op1 <= 0 ?
- ⓪(MOVE.L -(A3),D3
- ⓪(BEQ neg3 ;beide Null
- ⓪(BTST D4,D3
- ⓪(BNE neg3 ;Op2 = 0, Op1 < 0
- ⓪(BRA neg2 ;Op2 = 0, Op1 > 0
- ⓪!zer1 BTST D4,D1 ;Op1 = 0, Op2 # 0: ist Op2 > 0?
- ⓪(BNE neg2 ; nein
- ⓪!neg3 CLR.W (A3)+ ;Op1 negativ, Op2 positiv
- ⓪(MOVEM.L (A7)+,D3/D4
- ⓪!*)
- ⓪!(*$? A68881:
- ⓪(MOVE.W #$12,D1 ;Conditional GT
- ⓪(JMP DoComp
- ⓪!*)
- ⓪&END
- ⓪ END @REGT;
- ⓪
- ⓪
- ⓪ (********* Real-Arithmetik *********)
- ⓪ PROCEDURE @RNEG (a:LONGREAL):LONGREAL;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪(TST.W -8(A3)
- ⓪(BEQ ZERO
- ⓪(BCHG #0,-7(A3)
- ⓪"!ZERO
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪(TST -8(A3)
- ⓪(BEQ zero
- ⓪(BCHG #7,-8(A3)
- ⓪"!zero RTS
- ⓪"*)
- ⓪$RTS
- ⓪"END
- ⓪ END @RNEG;
- ⓪
- ⓪ (*$? A68881:
- ⓪ PROCEDURE DoDouble;
- ⓪ (* Erwartet in Register D1 eine Co-Instruction *)
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪+LEA -16(A3),A3
- ⓪+MOVE.L A3,A0
- ⓪+MOVE.W #$5400,fpcmd
- ⓪"!DoDl1 TST.B fpstatlo
- ⓪+BEQ DoDl1
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.W D1,fpcmd
- ⓪"!DoDl2 TST.B fpstatlo
- ⓪+BEQ DoDl2
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.L (A0)+,fpop
- ⓪+MOVE.W #$7400,fpcmd
- ⓪"!DoDl3 MOVE.B fpstatlo,D0
- ⓪+BEQ DoDl3
- ⓪+CMPI.B #8,D0
- ⓪+BNE DoDErr
- ⓪"!GoBack MOVE.L fpop,(A3)+
- ⓪+MOVE.L fpop,(A3)+
- ⓪+MOVE.W fpstat,D0
- ⓪+CMPI.B #2,D0
- ⓪+BNE DoDErr2
- ⓪+RTS
- ⓪"!DoDErr2 SUBQ.L #8,A3
- ⓪"!DoDErr LINK A5,#0
- ⓪+JSR FPUError
- ⓪+UNLK A5
- ⓪+CLR.L (A3)+ ; RETURN 0.0
- ⓪+CLR.L (A3)+
- ⓪"END;
- ⓪ END DoDouble;
- ⓪ *)
- ⓪
- ⓪ PROCEDURE @RMUL (a,b:LONGREAL):LONGREAL;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪+LINK A5,#0
- ⓪+MOVEM.L D3-D7,-(A7)
- ⓪+MOVEM.W -16(A3),D0-D7
- ⓪+TST.W D0 ;Op1 = 0 ?
- ⓪+BEQ.L ZERO
- ⓪+TST.W D4 ;Op2 = 0 ?
- ⓪+BEQ.L ZERO
- ⓪+ADD.W D0,D4 ;vorl. Exponent; neues Sign in bit0
- ⓪+BVS.L range ;Ueber/Unterlauf
- ⓪+MOVE.W D4,-(A7)
- ⓪+MOVE.W D3,D4
- ⓪+MULU D7,D4
- ⓪+CLR.W D4
- ⓪+SWAP D4
- ⓪+CLR.W D5
- ⓪+MOVE.W D3,D0
- ⓪+MULU D6,D0
- ⓪+ADD.L D0,D4
- ⓪+BCC L0
- ⓪+ADDQ.W #1,D5
- ⓪"!L0 MOVE.W D2,D0
- ⓪+MULU D7,D0
- ⓪+ADD.L D0,D4
- ⓪+BCC L1
- ⓪+ADDQ.W #1,D5
- ⓪"!L1 MOVE.W D5,D4
- ⓪+SWAP D4
- ⓪+CLR.W D5
- ⓪+MULU D1,D7
- ⓪+ADD.L D7,D4
- ⓪+BCC L2
- ⓪+ADDQ.W #1,D5
- ⓪"!L2 MOVE.W -6(A3),D7
- ⓪+MOVE.W D2,D0
- ⓪+MULU D6,D0
- ⓪+ADD.L D0,D4
- ⓪+BCC L3
- ⓪+ADDQ.W #1,D5
- ⓪"!L3 MULU D7,D3
- ⓪+ADD.L D3,D4
- ⓪+BCC L4
- ⓪+ADDQ.W #1,D5
- ⓪"!L4 MOVE.W D4,D3
- ⓪+MOVE.W D5,D4
- ⓪+SWAP D4
- ⓪+CLR.W D5
- ⓪+MULU D7,D2
- ⓪+ADD.L D2,D4
- ⓪+BCC L5
- ⓪+ADDQ.W #1,D5
- ⓪"!L5 MULU D1,D6
- ⓪+ADD.L D6,D4
- ⓪+BCC L6
- ⓪+ADDQ.W #1,D5
- ⓪"!L6 MOVE.W D4,D6
- ⓪+MOVE.W D5,D4
- ⓪+SWAP D4
- ⓪+MULU D7,D1
- ⓪+
- ⓪+MOVE.W (A7)+,D7
- ⓪+ADD.L D1,D4
- ⓪+BMI ISADJ
- ⓪+ADD.W D3,D3
- ⓪+ADDX.W D6,D6
- ⓪+ADDX.L D4,D4
- ⓪+SUBQ.W #8,D7
- ⓪+BVS ZERO
- ⓪"!ISADJ TST.W D3
- ⓪+BPL NORND
- ⓪+ADDQ.W #1,D6
- ⓪+BCC NORND
- ⓪+ADDQ.L #1,D4
- ⓪+BCC NORND
- ⓪+ADDQ.W #8,D7
- ⓪+BSET #31,D4
- ⓪"!NORND BSET #1,D7 ;markiere als # 0
- ⓪+BCLR #2,D7 ;loesche Schutzbit
- ⓪+SUBA.W #16,A3
- ⓪+MOVE.W D7,(A3)+
- ⓪+MOVE.L D4,(A3)+
- ⓪+MOVE.W D6,(A3)+
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"range BMI ovfl ;Summe der Exponenten war so gross,
- ⓪@;dass sie ins negative ueberlief
- ⓪"zero SUBA.W #16,A3
- ⓪+CLR.L (A3)+
- ⓪+CLR.L (A3)+
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"ovfl SUBA.W #16,A3
- ⓪+TRAP #6
- ⓪+DC.W -7-$4000 ;overflow
- ⓪+CLR.L (A3)+
- ⓪+CLR.L (A3)+
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪+MOVE.W #$5423,D1
- ⓪+JMP DoDouble
- ⓪"*)
- ⓪"END
- ⓪ END @RMUL;
- ⓪
- ⓪
- ⓪ PROCEDURE @RDIV (a,b:LONGREAL):LONGREAL;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪(LINK A5,#0
- ⓪(MOVEM.L D3-D7,-(A7)
- ⓪(MOVE.W -(A3),D5
- ⓪(MOVE.L -(A3),D4
- ⓪(MOVE.W -(A3),D1
- ⓪(MOVE.W -(A3),D3
- ⓪(MOVE.L -(A3),D2
- ⓪(MOVE.W -(A3),D0
- ⓪(JSR @FPDIV
- ⓪(MOVEM.L (A7)+,D3-D7
- ⓪(UNLK A5
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪'MOVE.W #$5420,D1
- ⓪'JMP DoDouble
- ⓪"*)
- ⓪"END
- ⓪ END @RDIV;
- ⓪
- ⓪ PROCEDURE @FPDIV;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪+TST.W D0
- ⓪+BEQ.L ZERO1
- ⓪+TST.W D1
- ⓪+BEQ.L DIVBY0
- ⓪+BCLR #1,D1 ; !TT 01.04.88
- ⓪+SUB.W D1,D0 ;vorl. Exponent und Sign in D0
- ⓪+BVS.L range ;Ueber/Unterlauf
- ⓪+CLR.L D7
- ⓪+MOVEQ #49,D1
- ⓪+BRA L1
- ⓪"!L0 ADD.L D7,D7
- ⓪+ADDX.L D6,D6
- ⓪+ADD.W D3,D3
- ⓪+ADDX.L D2,D2
- ⓪+BCS ONEBIT
- ⓪"!L1 CMP.L D2,D4
- ⓪+BHI ZERBIT
- ⓪+BNE ONEBIT
- ⓪+CMP.W D3,D5
- ⓪+BHI ZERBIT
- ⓪"!ONEBIT SUB.W D5,D3
- ⓪+SUBX.L D4,D2
- ⓪+ADDQ.B #1,D7
- ⓪"!ZERBIT DBF D1,L0
- ⓪+BTST #17,D6
- ⓪+BEQ LESS05
- ⓪+LSR.L #1,D6
- ⓪+ROXR.L #1,D7
- ⓪+ADDQ.W #8,D0
- ⓪+BVS ovfl
- ⓪"!LESS05 LSR.L #1,D6
- ⓪+ROXR.L #1,D7
- ⓪+BCC NORND
- ⓪+ADDQ.L #1,D7
- ⓪+BCC NORND
- ⓪+ADDQ.W #1,D6
- ⓪+BCC NORND
- ⓪+ROXR.W #1,D6
- ⓪+ADDQ.W #8,D0
- ⓪+BVS ovfl
- ⓪"noRnd BSET #1,D0
- ⓪+BCLR #2,D0
- ⓪+MOVE.W D0,(A3)+
- ⓪+MOVE.W D6,(A3)+
- ⓪+MOVE.L D7,(A3)+
- ⓪+RTS
- ⓪+
- ⓪"range BMI ovfl ;Differenz der Exponenten war so gross,
- ⓪@;dass sie ins negative ueberlief
- ⓪"zero1 CLR.L (A3)+
- ⓪+CLR.L (A3)+
- ⓪+RTS
- ⓪+
- ⓪"ovfl TRAP #6
- ⓪+DC.W -7-$4000 ;overflow
- ⓪+BRA errend
- ⓪+
- ⓪"DivBy0 TRAP #6
- ⓪+DC.W -5-$4000
- ⓪"errend: CLR.L (A3)+
- ⓪+CLR.L (A3)+
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪+MOVE.W D0,(A3)+
- ⓪+MOVE.L D2,(A3)+
- ⓪+MOVE.W D3,(A3)+
- ⓪+MOVE.W D1,(A3)+
- ⓪+MOVE.L D4,(A3)+
- ⓪+MOVE.W D5,(A3)+
- ⓪+MOVE.W #$5420,D1
- ⓪+JMP DoDouble
- ⓪"*)
- ⓪"END
- ⓪ END @FPDIV;
- ⓪
- ⓪
- ⓪ PROCEDURE @RADD (a,b:LONGREAL):LONGREAL;
- ⓪ BEGIN
- ⓪%ASSEMBLER
- ⓪%(*$? ~A68881:
- ⓪+LINK A5,#0
- ⓪+MOVEM.L D3-D7,-(A7)
- ⓪+MOVEM.W -16(A3),D0-D7
- ⓪+SWAP D1
- ⓪+MOVE.W D2,D1 ;höchste 32 Mant.-Stellen (a) in D1
- ⓪+SWAP D5
- ⓪+MOVE.W D6,D5 ;höchste 32 Mant.-Stellen (b) in D5
- ⓪+
- ⓪+ANDI.W #$FFFE,D0
- ⓪+BEQ.L RETN2 ;ein Argument ist 0
- ⓪+ANDI.W #$FFFE,D4
- ⓪+BEQ.L RETN1 ;ein Argument ist 0
- ⓪+CLR.W D6
- ⓪+CMP.W D0,D4
- ⓪+BLT PASST
- ⓪+BNE TAUSCH
- ⓪+CMP.L D1,D5
- ⓪+BCS.L PASST1
- ⓪+BNE TAUSCH
- ⓪+CMP.W D3,D7
- ⓪+BLS.L PASST1
- ⓪"!TAUSCH EXG D0,D4
- ⓪+EXG D1,D5
- ⓪+EXG D3,D7
- ⓪+MOVE.W -16(A3),D2
- ⓪+MOVE.W -8(A3),-16(A3)
- ⓪+MOVE.W D2,-8(A3)
- ⓪"
- ⓪"!PASST SUB.W D4,D0 ;Exp.differenz immer positiv!
- ⓪+LSR #3,D0
- ⓪+BEQ.L PASST1
- ⓪+CMP.W #16,D0
- ⓪+BEQ S16
- ⓪+BHI SGT16
- ⓪+SWAP D7
- ⓪+MOVE.W D5,D7
- ⓪+SWAP D7
- ⓪+LSR.L D0,D5
- ⓪+LSR.L D0,D7
- ⓪+BRA.L DONE
- ⓪"!S16 ADD.W D7,D7
- ⓪+MOVE.W D5,D7
- ⓪+CLR.W D5
- ⓪+SWAP D5
- ⓪+BRA DONE
- ⓪"!SGT16 CMP.W #32,D0
- ⓪+BEQ S32
- ⓪+BHI SGT32
- ⓪+SUB.W #16,D0
- ⓪+LSR.L D0,D5
- ⓪+MOVE.W D5,D7
- ⓪+CLR.W D5
- ⓪+SWAP D5
- ⓪+BRA DONE
- ⓪"!S32 ADD.W D5,D5
- ⓪+SWAP D5
- ⓪+MOVE.W D5,D7
- ⓪+CLR.L D5
- ⓪+BRA DONE
- ⓪"!S48 CLR.L D5
- ⓪+CLR.W D7
- ⓪+MOVEQ #$FF,D6
- ⓪+BRA PASST1
- ⓪"!SGT32 CMP.W #48,D0
- ⓪+BEQ S48
- ⓪+BHI.L RETN1
- ⓪+SUB.W #32,D0
- ⓪+SWAP D5
- ⓪+MOVE.W D5,D7
- ⓪+CLR.L D5
- ⓪+LSR.W D0,D7
- ⓪"!DONE ROXR.W #1,D6
- ⓪"!PASST1 MOVE.W -16(A3),D2 ;Vorzeichen beider Operanden gleich?
- ⓪+MOVE.W -8(A3),D0
- ⓪+ADD.W D2,D0
- ⓪+BTST #0,D0
- ⓪+BNE SUBTR
- ⓪+ADD.W D7,D3
- ⓪+ADDX.L D5,D1
- ⓪+BCC NOFL
- ⓪+ROXR.L #1,D1
- ⓪+ROXR.W #1,D3
- ⓪+BCC INCEX
- ⓪+ADDQ.W #1,D3
- ⓪+BCC INCEX
- ⓪+ADDQ.L #1,D1
- ⓪"!INCEX ADDQ.W #8,D2 ;D2 ist Exp. der betr.mäßig größeren Zahl
- ⓪+BVS.L OVFL
- ⓪"!FERTIG SUBA.W #16,A3
- ⓪+MOVE.W D2,(A3)+
- ⓪+MOVE.L D1,(A3)+
- ⓪+MOVE.W D3,(A3)+
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"!NOFL TST.W D6
- ⓪+BPL FERTIG
- ⓪+ADDQ.W #1,D3
- ⓪+BCC FERTIG
- ⓪+ADDQ.L #1,D1
- ⓪+BCC FERTIG
- ⓪+ROXR.L #1,D1
- ⓪+BRA INCEX
- ⓪"
- ⓪"!SUBTR ADD.W D6,D6
- ⓪+SCS D6
- ⓪+SUBX.W D7,D3
- ⓪+SUBX.L D5,D1
- ⓪+TST.L D1
- ⓪+BMI FERTIG
- ⓪+SUBQ.W #8,D2
- ⓪+ADD.W D6,D6
- ⓪+ADDX.W D3,D3
- ⓪+ADDX.L D1,D1
- ⓪+BMI.L fertig
- ⓪+BEQ LGT32 ;Ausloeschung in der Mantisse.. normalisieren
- ⓪+SWAP D1
- ⓪+TST.W D1
- ⓪+BNE LLT16
- ⓪+MOVE.W D3,D1
- ⓪+CLR.W D3
- ⓪+SUB.W #128,D2 ;8 * (16 bit Shift)
- ⓪+BVS zero
- ⓪+TST.L D1
- ⓪+BMI fertig
- ⓪"!L0 SUBQ.W #8,D2
- ⓪+BVS zero
- ⓪+ADD.L D1,D1
- ⓪+BPL L0
- ⓪+BRA fertig
- ⓪"!LLT16 SWAP D1
- ⓪"!L1 SUBQ.W #8,D2
- ⓪+BVS zero
- ⓪+ADD.W D3,D3
- ⓪+ADDX.L D1,D1
- ⓪+BPL L1
- ⓪+BRA fertig
- ⓪"!LGT32 SUB.W #256,D2 ;8 * (32 bit Shift)
- ⓪+BVS zero
- ⓪+MOVE.W D3,D1
- ⓪+BEQ.L ZERO
- ⓪+BMI L3
- ⓪"!L2 SUBQ.W #8,D2
- ⓪+BVS zero
- ⓪+ADD.W D1,D1
- ⓪+BPL L2
- ⓪"!L3 SWAP D1
- ⓪+CLR.W D3
- ⓪+BRA fertig
- ⓪"!ZERO SUBA.W #16,A3
- ⓪+CLR.L (A3)+
- ⓪+CLR.L (A3)+
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"!RETN1 SUBA.W #14,A3 ;Exponent stimmt schon
- ⓪+MOVE.L D1,(A3)+ ;Mantisse muß (bei Ausgang 2 hierher)
- ⓪+MOVE.W D3,(A3)+ ; noch getauscht werden!
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"!RETN2 MOVE.L -(A3),-8(A3)
- ⓪+MOVE.L -(A3),-8(A3)
- ⓪+MOVEM.L (A7)+,D3-D7
- ⓪+UNLK A5
- ⓪+RTS
- ⓪+
- ⓪"!OVFL TRAP #6
- ⓪+DC.W -7-$4000 ;overflow
- ⓪+BRA ZERO
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪+MOVE.W #$5422,D1
- ⓪+JMP DoDouble
- ⓪"*)
- ⓪"END
- ⓪ END @RADD;
- ⓪
- ⓪ PROCEDURE @RSUB (a,b:LONGREAL):LONGREAL;
- ⓪ BEGIN
- ⓪"ASSEMBLER
- ⓪"(*$? ~A68881:
- ⓪$TST.W -8(A3)
- ⓪$BEQ N
- ⓪$BCHG #0,-7(A3)
- ⓪"N JMP @RADD
- ⓪"*)
- ⓪"(*$? A68881:
- ⓪$MOVE.W #$5428,D1
- ⓪$JMP DoDouble
- ⓪"*)
- ⓪"END
- ⓪ END @RSUB;
- ⓪
- ⓪
- ⓪ BEGIN
- ⓪"has020:= SysInfo.Has020 ();
- ⓪ (*$? A68881:
- ⓪"FPUInit
- ⓪ *)
- ⓪ END Runtime.
- ⓪ ə
- (* $00000A8D$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFEE685A$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34Ç$00000A3FT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000028$FFEE685A$000014A5$00001A0C$00002342$00002CC0$00003461$0000352F$0000372B$00003739$00000A3F$000097A0$00009EAD$00009EB7$0000AC5E$0000AC68¼Çâ*)
-