*************************************************************************                                                                      **   Diese Assemblerroutinen ermoeglichen es, dass Teile des Bildes     **   in einem zweidimensionalen FIXED(15)-Array gespeichert und von     **   dort wieder zurueck auf den Bildschirm kopiert werden koennen.     **                                                                      **   Volker Westphal     April '87                                      **                                                                      **************************************************************************BYTZEI EQU   80              * Anzahl der Bytes pro Zeile, in der*                              640*400-Aufloesung sind es 80,*                              in der 640*200-Aufloesung 160 Bytes*MAIN   EQU    $81A           * dort steht die Addresse des Haupt-*                              bildschirms** einige Definitionen fuer den Hyperprozessor*RETN   OPD    $4E4CENTR   OPD.V  29INVW   OPD.V  14ARNS   OPD.V  122EPAR   OPD.V  19** PWSP-DEF*INDEX  EQU    0XW1    EQU    INDEX+2YW1    EQU    XW1+2XW2    EQU    YW1+2YW2    EQU    XW2+2ADR    EQU    YW2+2DIM2   EQU    ADR+4DIM1   EQU    DIM2+2WSPSZ  EQU    DIM1+4OFF    EQU    INDEX+2DIM    EQU    OFF+4** Modulkopf*BEGIN  DC.L   0       DC.L   0       DC     $10       DC.B   'WINDOW'** CALCA setzt A2 auf die Begin des mit INDEX.X gewaehlten Arrayteils*CALCA  CLR.L  D0       MOVE   DIM1.X,D0       ADD    D0,D0       CLR.L  D1       MOVE   INDEX.X,D2       SUBQ   =1,D2LOOPC  ADD.L  D0,D1       DBF    D2,LOOPC       ADDQ   =2,D1       ADD.L  ADR.X,D1       MOVEA.L D1,A2       RTS** CALCB setzt A1 auf die linke obere Ecke des Bildausschnitts*CALCB  MOVE.L =BYTZEI,D0       MULU   D7,D0       ADD.L  D6,D0       TST.L  $9E(A4)       BNE    CALCB1       MOVE.L MAIN,$9E(A4)CALCB1 MOVEA.L $9E(A4),A1       ADDA.L D0,A1       RTS** CPYBCK kopiert das zuerst uebergebene ein-dimensionale Array* in das Zweite (zwei-dimensional), wobei INDEX angibt, ab welchem* Arrayelement (zweite Dimension) dies geschieht.* Dies Procedure ist noetig, da das Array, in dem die Windows ge-* speichert werden, wesentlich groesser als 64 K ist.*>CPYBCK ENTR  WSPSZ.L       INVW   INDEX.X       ARNS   OFF.X,DIM.X,$0401.X       ARNS   ADR.X,DIM2.X,$0801.X       EPAR       JSR    CALCA       MOVE.L =2,D0       ADD.L  OFF.X,D0       MOVEA.L D0,A1       MOVE   DIM.X,D0       SUBQ   =1,D0CPYBC1 MOVE   (A1)+,(A2)+       DBF    D0,CPYBC1       RETN** CPYHIN ist die Umkehrung von CPYBCK*>CPYHIN ENTR  WSPSZ.L       INVW   INDEX.X       ARNS   OFF.X,DIM.X,$0401.X       ARNS   ADR.X,DIM2.X,$0801.X       EPAR       JSR    CALCA       MOVE.L =2,D0       ADD.L  OFF.X,D0       MOVEA.L D0,A1       MOVE   DIM.X,D0       SUBQ   =1,D0CPYHI1 MOVE   (A2)+,(A1)+       DBF    D0,CPYHI1       RETN** Aufruf durch CALL WWPUT (INDEX,XW1,YW1,XW2,YW2,ARRAY)** ARRAY   ist ein zweidimensionales FIXED(15)-Array, wobei die erste*         Dimension den Platz fuer das Window angibt und die zweite*         Dimension die Anzahl der Windows* INDEX   waehlt das Window aus* XW1     linker Rand des Windows, angegeben in Bytes, muss ein Viel-*         faches von 4 sein* YW1     oberer Rand, in Rasterzeilen* XW2     Breite in Bytes, auch in Vielfachen von 4* YW2     Hoehe in Rasterzeilen*>WWPUT ENTR   WSPSZ.L       INVW   INDEX.X       INVW   XW1.X       INVW   YW1.X       INVW   XW2.X       INVW   YW2.X       ARNS   ADR.X,DIM2.X,$0801.X       EPAR       BSR    CALCA       MOVE   XW1.X,D6       MOVE   YW1.X,D7       BSR    CALCB       MOVE   XW2.X,D1       MOVE   YW2.X,D0       MOVE   D6,(A2)+       MOVE   D7,(A2)+       MOVE   D1,(A2)+       MOVE   D0,(A2)+       SUBQ   =1,D0LOOP1  CLR.L  D2LOOP2  MOVE.L 0(A1,D2.W),(A2)+       ADDQ   =4,D2       CMP.W  D1,D2       BLT    LOOP2       ADDA.L =BYTZEI,A1       DBF    D0,LOOP1EXPUT  RETN** Aufruf durch CALL WWGET (INDEX,ARRAY)** Parameter wie bei WWPUT, der gespeicherte Bildausschnitt wird an* die Bildschirmposition kopiert, von der er gekommen ist.*>WWGET ENTR   WSPSZ.L       INVW   INDEX.X       ARNS   ADR.X,DIM2.X,$0801.X       EPAR       BSR    CALCA       MOVE   (A2)+,D6       MOVE   (A2)+,D7       BSR    CALCB       MOVE   (A2)+,D1       MOVE   (A2)+,D0       CMP    =0,D5       BNE    EXPUT       SUBQ =1,D0LOOP3  CLR.L  D2LOOP4  MOVE.L (A2)+,0(A1,D2.W)       ADDQ   =4,D2       CMP.W  D1,D2       BLT    LOOP4       ADDA.L =BYTZEI,A1       DBF    D0,LOOP3       RETN       END