home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE FastGEM0;(*Y+*)
- ⓪
- ⓪
- ⓪ (* --------------------------------------------------------------------------
- ⓪!* System-Version: MOS 1.1
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Version : 0.01
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Text-Version : V#0008
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Modul-Holder : Manuel Chakravarty
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Copyright July 1988 by Manuel Chakravarty
- ⓪!* Vertriebsrechte für ATARI ST unter MEGAMAX Modula-2
- ⓪!* liegen bei Application Systems Heidelberg
- ⓪!* --------------------------------------------------------------------------
- ⓪!* MCH : Manuel Chakravarty
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Datum Autor Version Bemerkung (Arbeitsbericht)
- ⓪!*
- ⓪!* 14.08.89 MCH V0.01 Urversion; 'CopyOpaque' impl. + def.
- ⓪!* --------------------------------------------------------------------------
- ⓪!* Modul-Beschreibung:
- ⓪!*
- ⓪!* Dies Modul stellt eine schnelle Kopierfunktion für beliebige Bildschirm-
- ⓪!* bereiche zur Verfügung.
- ⓪!*
- ⓪!* --------------------------------------------------------------------------
- ⓪!*)
- ⓪
- ⓪ (* =========== ZU TUN: ==============
- ⓪!*
- ⓪!* -- Überprüfen, ob die Routinen immer VDI aufrufen, wenn die ASM-Routine
- ⓪!* versagt.
- ⓪!*
- ⓪!* =========== DOCU: ================
- ⓪!*
- ⓪!*)
- ⓪
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE, ADDRESS;
- ⓪
- ⓪ FROM GrafBase IMPORT Rectangle, BitOperation, PtrMemFormDef, MemFormDef,
- ⓪7GetBlitterMode, GetScreen;
- ⓪
- ⓪ FROM GEMEnv IMPORT DeviceHandle;
- ⓪
- ⓪ IMPORT VDIRasters;
- ⓪
- ⓪
- ⓪ TABLE.W masks: $FFFF, $7FFF, $3FFF, $1FFF, (* Tabelle für 'copyOpaque' *)
- ⓪0$0FFF, $07FF, $03FF, $01FF,
- ⓪0$00FF, $007F, $003F, $001F,
- ⓪0$000F, $0007, $0003, $0001;
- ⓪0
- ⓪((* wortbreite, planes *) (* Bildschirmauflösungen *)
- ⓪(
- ⓪(rez: 80, 4, (* Low-Res *)
- ⓪180, 2, (* Mid-Res *)
- ⓪140, 1; (* High-Res *)
- ⓪(
- ⓪ PROCEDURE CopyOpaque (dev : DeviceHandle;
- ⓪6sourceMem,
- ⓪6destMem : PtrMemFormDef;
- ⓪6sourceFrame,
- ⓪6destFrame : Rectangle;
- ⓪6mode : BitOperation);
- ⓪6
- ⓪"VAR screenAddr : ADDRESS;
- ⓪(words, planes : CARDINAL;
- ⓪(wordAlign : BYTE;
- ⓪
- ⓪"PROCEDURE longCopy;
- ⓪"
- ⓪$(*$L-*)
- ⓪$BEGIN
- ⓪&ASSEMBLER
- ⓪(TST.W sourceFrame.w(A6)
- ⓪(BPL ok1
- ⓪(CLR.W sourceFrame.w(A6)
- ⓪ ok1
- ⓪(TST.W sourceFrame.h(A6)
- ⓪(BPL ok2
- ⓪(CLR.W sourceFrame.h(A6)
- ⓪ ok2
- ⓪
- ⓪(MOVEM.L D3-D7/A3-A5,-(A7)
- ⓪(
- ⓪(MOVE.W planes(A6),A3 ; Anzahl Randwörter links -> A3
- ⓪(MOVE.W A3,A4 ; Anzahl Randwörter rechts -> A4
- ⓪(
- ⓪(MOVE.W sourceFrame.x(A6),D0
- ⓪(MOVE.W D0,D2
- ⓪(ANDI.W #$F,D0
- ⓪(MOVE.W #16,D7
- ⓪(SUB.W D0,D7
- ⓪(MOVE.W D7,-(A7) ; Anzahl linke Randbits merken (Stack)
- ⓪(ADD.W D0,D0
- ⓪(LEA masks,A0
- ⓪(MOVE.L A0,A1
- ⓪(ADDA.W D0,A0
- ⓪(MOVE.W (A0),D1 ; Linke Kopiermaske -> D1
- ⓪(MOVE.W D1,D3
- ⓪(NOT.W D3 ; Linke negierte Kopiermaske -> D3
- ⓪(
- ⓪(ADD.W sourceFrame.w(A6),D2
- ⓪(ANDI.W #$F,D2
- ⓪(MOVE.W D2,-(A7) ; Anzahl rechte Randbits merken (Stack)
- ⓪(ADD.W D2,D2
- ⓪(ADDA.W D2,A1
- ⓪(MOVE.W (A1),D4 ; Rechte negierte Kopiermaske -> D4
- ⓪(MOVE.W D4,D2
- ⓪(NOT.W D2 ; Rechte Kopiermaske -> D2
- ⓪(BNE c
- ⓪(CLR.W (A7) ; Keine rechten Randbits merken
- ⓪(MOVE.W #0,A4 ; Rechts ist Wortgrenze => Keine Maske nötig
- ⓪ c
- ⓪(
- ⓪(MOVE.W sourceFrame.w(A6),D0
- ⓪(SUB.W (A7)+,D0 ; Randbits abziehen
- ⓪(SUB.W (A7)+,D0
- ⓪(BPL c2
- ⓪(AND.W D2,D1
- ⓪(OR.W D4,D3
- ⓪(MOVE.W #0,A4
- ⓪(CLR.W D0
- ⓪ c2
- ⓪(LSR.W #4,D0
- ⓪(MULU.W planes(A6),D0
- ⓪(MOVE.W D0,D7
- ⓪(ADD.W A3,D7
- ⓪(ADD.W A4,D7
- ⓪(MOVE.W words(A6),A5
- ⓪(SUBA.W D7,A5
- ⓪(ADDA.W A5,A5 ; Zeilenoffset in Byte -> A5
- ⓪(MOVE.W D7,-(A7) ; Anzahl pro Zeile zu kopierende Words -> Stack
- ⓪(LSR.W #1,D0
- ⓪(SCS wordAlign(A6) ; wordAlign-Flag -> 'wordAlign'
- ⓪(MOVE.W D0,A2 ; Anzahl Longs pro Zeile -> A2
- ⓪(
- ⓪(MOVE.W sourceFrame.h(A6),D5 ; Anzahl Zeilen -> D5
- ⓪(
- ⓪(; Startaddressenberechnung
- ⓪(
- ⓪(MOVE.W sourceFrame.y(A6),D0
- ⓪(MULU.W words(A6),D0
- ⓪(ADD.W D0,D0
- ⓪(MOVEQ #0,D7
- ⓪(MOVE.L D7,A0
- ⓪(MOVE.W D0,A0
- ⓪(MOVE.W sourceFrame.x(A6),D0
- ⓪(LSR.W #3,D0
- ⓪(AND.W #$FE,D0
- ⓪(ADDA.W D0,A0
- ⓪(ADDA.L screenAddr(A6),A0 ; sourceAddr -> A0
- ⓪(
- ⓪(MOVE.W destFrame.y(A6),D0
- ⓪(MULU.W words(A6),D0
- ⓪(ADD.W D0,D0
- ⓪(MOVEQ #0,D7
- ⓪(MOVE.L D7,A1
- ⓪(MOVE.W D0,A1
- ⓪(MOVE.W destFrame.x(A6),D0
- ⓪(LSR.W #3,D0
- ⓪(AND.W #$FE,D0
- ⓪(ADDA.W D0,A1
- ⓪(ADDA.L screenAddr(A6),A1 ; destAddr -> A1
- ⓪(
- ⓪(CMPA.L A0,A1
- ⓪(BCS.W forward
- ⓪(
- ⓪(; --- Kopie RÜCKWÄRTS ---
- ⓪(
- ⓪(MOVE.W sourceFrame.h(A6),D0
- ⓪(SUBQ.W #1,D0
- ⓪(MULU.W words(A6),D0
- ⓪(ADD.W (A7)+,D0 ; Anzahl zu kopierende Wörter pro Zeile add.
- ⓪(ADD.W D0,D0
- ⓪(ADDA.W D0,A0
- ⓪(ADDA.W D0,A1
- ⓪(
- ⓪(BRA startBack ; Start Kopierschleife (rückwärts)
- ⓪ lBack
- ⓪(MOVE.W A4,D0 ; Start rechte Maske
- ⓪(BRA sBRight
- ⓪ lBRight
- ⓪(MOVE.W -(A1),D6
- ⓪(AND.W D4,D6
- ⓪(MOVE.W -(A0),D7
- ⓪(AND.W D2,D7
- ⓪(OR.W D6,D7
- ⓪(MOVE.W D7,(A1)
- ⓪ sBRight
- ⓪(DBF D0,lBRight
- ⓪(
- ⓪(TST.B wordAlign(A6) ; Start Align
- ⓪(BEQ noAlignB
- ⓪(MOVE.W -(A0),-(A1)
- ⓪ noAlignB
- ⓪
- ⓪(MOVE.W A2,D0 ; Start kopiere Longs
- ⓪(BRA sBLongs
- ⓪ lBLongs
- ⓪(MOVE.L -(A0),-(A1)
- ⓪ sBLongs
- ⓪(DBF D0,lBLongs
- ⓪(
- ⓪(MOVE.W A3,D0 ; Start linke Maske
- ⓪(BRA sBLeft
- ⓪ lBLeft
- ⓪(MOVE.W -(A1),D6
- ⓪(AND.W D3,D6
- ⓪(MOVE.W -(A0),D7
- ⓪(AND.W D1,D7
- ⓪(OR.W D6,D7
- ⓪(MOVE.W D7,(A1)
- ⓪ sBLeft
- ⓪(DBF D0,lBLeft
- ⓪
- ⓪(SUBA.W A5,A0 ; Addr. der nächsten Zeile ermittlen
- ⓪(SUBA.W A5,A1
- ⓪ startBack
- ⓪(DBF D5,lBack
- ⓪(
- ⓪(BRA ende
- ⓪(
- ⓪(; --- Kopie VORWÄRTS ---
- ⓪(
- ⓪ forward
- ⓪(ADDQ.L #2,A7 ; A7 bereinigen
- ⓪(BRA startFore ; Start Kopierschleife (vorwärts)
- ⓪ lFore
- ⓪(MOVE.W A3,D0 ; Start linke Maske
- ⓪(BRA sFLeft
- ⓪ lFLeft
- ⓪(MOVE.W (A1),D6
- ⓪(AND.W D3,D6
- ⓪(MOVE.W (A0)+,D7
- ⓪(AND.W D1,D7
- ⓪(OR.W D6,D7
- ⓪(MOVE.W D7,(A1)+
- ⓪ sFLeft
- ⓪(DBF D0,lFLeft
- ⓪(
- ⓪(TST.B wordAlign(A6) ; Start Align
- ⓪(BEQ noAlignF
- ⓪(MOVE.W (A0)+,(A1)+
- ⓪ noAlignF
- ⓪
- ⓪(MOVE.W A2,D0 ; Start kopiere Longs
- ⓪(BRA sFLongs
- ⓪ lFLongs
- ⓪(MOVE.L (A0)+,(A1)+
- ⓪ sFLongs
- ⓪(DBF D0,lFLongs
- ⓪(
- ⓪(MOVE.W A4,D0 ; Start linke Maske
- ⓪(BRA sFRight
- ⓪ lFRight
- ⓪(MOVE.W (A1),D6
- ⓪(AND.W D4,D6
- ⓪(MOVE.W (A0)+,D7
- ⓪(AND.W D2,D7
- ⓪(OR.W D6,D7
- ⓪(MOVE.W D7,(A1)+
- ⓪ sFRight
- ⓪(DBF D0,lFRight
- ⓪
- ⓪(ADDA.W A5,A0 ; Addr. der nächsten Zeile ermittlen
- ⓪(ADDA.W A5,A1
- ⓪ startFore
- ⓪(DBF D5,lFore
- ⓪(
- ⓪ ende
- ⓪(MOVEM.L (A7)+,D3-D7/A3-A5
- ⓪&END;
- ⓪$END longCopy;
- ⓪$(*$L=*)
- ⓪
- ⓪"BEGIN
- ⓪$ASSEMBLER
- ⓪(SUBQ.L #2,A7
- ⓪(MOVE.L A7,(A3)+
- ⓪(SUBQ.L #2,A7
- ⓪(MOVE.L A7,(A3)+
- ⓪(JSR GetBlitterMode
- ⓪(MOVE.W (A7)+,D0
- ⓪(AND.W (A7)+,D0
- ⓪(BNE vdiCopy ; Springe, falls Blitter vorhanden + aktiv
- ⓪(
- ⓪(MOVE.W mode(A6),D0
- ⓪(CMP.W #onlyS,D0
- ⓪(BNE vdiCopy ; Springe, falls kein replace-mode
- ⓪(
- ⓪(MOVE.L sourceMem(A6),A0
- ⓪(MOVE.L MemFormDef.start(A0),D0
- ⓪(MOVE.L destMem(A6),A0
- ⓪(CMP.L MemFormDef.start(A0),D0
- ⓪(BEQ cont
- ⓪#
- ⓪ vdiCopy
- ⓪$END;
- ⓪$VDIRasters.CopyOpaque (dev, sourceMem,destMem, sourceFrame, destFrame,
- ⓪;mode);
- ⓪$ASSEMBLER
- ⓪(BRA ende
- ⓪"
- ⓪ cont
- ⓪(TST.L D0
- ⓪(BNE mfdbValid
- ⓪(
- ⓪(; Bildschirmaddresse und die Breite einer Scanzeile ermitteln
- ⓪(
- ⓪(SUBQ.L #4,A7
- ⓪(MOVE.L A7,(A3)+
- ⓪(SUBQ.L #4,A7
- ⓪(MOVE.L A7,(A3)+
- ⓪(SUBQ.L #2,A7
- ⓪(MOVE.L A7,(A3)+
- ⓪(JSR GetScreen
- ⓪(
- ⓪(MOVE.W (A7)+,D0
- ⓪(LSL.W #2,D0
- ⓪(LEA rez,A0
- ⓪(ADDA.W D0,A0
- ⓪(MOVE.W (A0)+,words(A6)
- ⓪(MOVE.W (A0),planes(A6)
- ⓪(ADDQ.L #4,A7
- ⓪(MOVE.L (A7)+,screenAddr(A6)
- ⓪(BRA cont3
- ⓪(
- ⓪(; Werte aus MFDB übernehmen
- ⓪(
- ⓪ mfdbValid
- ⓪(MOVE.L D0,screenAddr(A6)
- ⓪(MOVE.W MemFormDef.words(A0),words(A6)
- ⓪(MOVE.W MemFormDef.planes(A0),planes(A6)
- ⓪(
- ⓪ cont3
- ⓪(MOVE.W sourceFrame.x(A6),D0
- ⓪(ANDI.W #$F,D0
- ⓪(MOVE.W destFrame.x(A6),D1
- ⓪(ANDI.W #$F,D1
- ⓪(CMP.W D0,D1
- ⓪(BNE vdiCopy
- ⓪(CMPI.W #1,planes(A6)
- ⓪(BNE vdiCopy
- ⓪(BSR longCopy
- ⓪(
- ⓪ ende
- ⓪$END;
- ⓪"END CopyOpaque;
- ⓪
- ⓪
- ⓪ END FastGEM0.
- ⓪ ə
- (* $FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$00001CBF$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95$FFEC9B95ü$00000027T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000006B7$00001CAF$000006FA$00000020$FFEC88E0$00002066$0000063D$000005E1$00000027$00002056$00002043$00000703$00000885$00000896$000006FA$0000064BñÇâ*)
-