**************************************************** 
* 
*  CAMAS      22.06.1988 ; 10:00         M. Kendi 
* 
**************************************************** 
* Module head for RTOS-UH 
MDLE:  DC.L   TASK1          for the loader 
       DC.L   0              for the loader 
       DC     $10 
       DC.B   'CAMAS ' 
*--------------------------------------------------- 
* 
TERMI   OPD    $4E41          HYPERPROCESSOR 
ENAB    OPD    $A032 
DISAB   OPD    $A034 
*--- 
DPC     OPD    $4E43 
OFF     OPD    $4E4F 
WSBS    OPD    $A00C 
RWSP    OPD    $A02A 
SUSP    OPD    $A028 
RETN    OPD    $4E4C 
*--- 
INVW    OPD.V   14             xfer FIXED(15) by val 
EPAR    OPD.V   19             end of parameter xfer 
ENTR    OPD.V   29             procedure entry 
*--- 
BACKT   EQU    14              T-LINK-OFFSETS 
FORT    EQU    10 
TYPE    EQU    8 
NAME    EQU    10 
* 
************************************************************** 
* 
*                       M A L L O C 
*             ----------------------------- 
*                  (06.06.1988 ; 21:00) 
* 
************************************************************** 
* 
* Die Laenge einer Datenstruktur muss durch 4 teilbar sein. 
* 
STABC   EQU    32            Struktur-Länge von ABC 
STDEF   EQU  1156            Struktur-Länge von DEF 
*-------------------------------------------------------------- 
>ABCMAX DS     0             Dimension of ZELBUK 
>ABCBUK DC.W   0 
        DC.L   0 
>ABCIDX DC.W   0 
        DC.L   0 
        DC.L   0             NEWBUK neue Adr. des jeweiligen Buches 
        DC.L   0             NEWIDX neue Adr. des jeweiligen Index 
        DC.L   0             NEWWSP neue Adr. der Work-Space 
        DC.L   0             OLDWSP alte Adr. der Work-Space 
*--------------- 
>DEFMAX DS     0             Dimension of INSBUK 
>DEFBUK DC.W   0 
        DC.L   0 
>DEFIDX DC.W   0 
        DC.L   0,0,0,0,0 
*--------------- 
* etc. etc. 
*--------------- 
* 
>MALLOC DC.W   0             1 = okay ; 0 = no Space 
* 
******************************************************************* 
* 
>ABCMAL V0                     HYPERPROZ. OFF 
        CMPI.B  =19,(A0)       KOTRL. OB EPAR 
        BEQ.S   ABC0           WENN JA, ALLES OKAY 
        SUSP                   SONST ABBRUCH,WENN NÖTIG 
        TERMI                  AUF DIE BRUTALE 
* 
ABC0    LEA     >ABCBUK,A3     (=> ABCMAX) 
        MOVE.L  20(A3),24(A3)  NEWWSP --> OLDWSP 
*------- 
        TST     (A3)           ABCMAX = 0 ? 
        BNE.S   ABC1 
        MOVE.L  =0,20(A3) 
        BRA     UNLINK         WENN JA,GEBE WSPC FREI 
*------- 
ABC1    MOVE.L  =STABC,D6 
        BRA     DOIT           FERTIG 
*============================================================== 
* 
>DEFMAL V0                     HYPERPROZ. OFF 
        CMPI.B  =19,(A0)       KOTRL. OB EPAR 
        BEQ.S   DEF0           WENN JA, ALLES OKAY 
        SUSP                   SONST ABBRUCH,WENN NÖTIG 
        TERMI                  AUF DIE BRUTALE 
* 
DEF0    LEA     >DEFBUK,A3     (=> DEFMAX) 
        MOVE.L  20(A3),24(A3)  NEWWSP --> OLDWSP 
*------- 
        TST     (A3)           DEFMAX = 0 ? 
        BNE.S   DEF1 
        MOVE.L  =0,20(A3) 
        BRA     UNLINK         WENN JA,GEBE WSPC FREI 
*------- 
DEF1    MOVE.L  =STDEF,D6 
        BRA     DOIT           FERTIG 
*============================================================== 
* etc. etc. 
*============================================================== 
        NOP 
* 
*************************************************************** 
* DOIT:                              ALLGEMEINER TEIL ZU MALLOC 
*************************************************************** 
* 
DOIT    MOVE    (A3),D1        MAKE WORK-SPACE (D1=DIMENSION) 
        MOVE    D1,D0          KOPIE DER NEUEN FELDGRÖSSE 
        MULS    D6,D1          MEMORY FÜR FELD (D6= STRUKTURLNG) 
        EXT.L   D0 
        ADD.L   D0,D0          MEMORY FÜR INDEX : FIXED(15) 
        ADD.L   D0,D1 
        ADD.L   =$20,D1        SUMME + FELDBESCHREIBBLOCK 
        WSBS                   SPEICHER ANFORDERN 
        BNE     NOWSPC         FALLS NO WORK-SPACE 
*---------------------------------------------------------------- 
        MOVE.L  A1,20(A3)      --> NEWWSP 
* 
        ADDA.L  =$20,A1 
        SUBQ.L  =2,A1 
        MOVE.L  A1,16(A3)      --> NEWIDX 
* 
        ADDQ.L  =2,A1 
        ADDA.L  D0,A1          + INDEX-FELD LÄNGE 
        SUBA.L  D6,A1          D6 = STRUKTUR-LÄNGE 
        MOVE.L  A1,12(A3)      --> NEWBUK 
*---------------------------------------------------------------- 
        TST.L   24(A3)         = OLDWSP (ERSTER MALLOC-AUFRUF ?) 
        BEQ.S   CHANGE 
*---------------------------------------------------------------- 
*                              KOPIERE DIE FELDER 
        MOVE    (A3),D1        ANZAHL DER EINTRÄGE 
        BEQ.S   UNLINK         KEINE KOPIE (REINE VORSICHT) 
        MOVEA.L 8(A3),A1       ADRESSE VON INDEX  (QUELLE) 
        ADDQ.L  =2,A1 
        MOVEA.L  16(A3),A2     ADRESSE VON NEWIDX (ZIEL) 
        ADDQ.L  =2,A2 
        SUBQ    =1,D1          -1 WEGEN DBF 
COPY1   MOVE    (A1)+,(A2)+    TRANSFER 
        DBF     D1,COPY1 
*------- 
        MOVE    (A3),D1        ANZAHL DER EINTRÄGE 
        MULS    D6,D1          D1 = ANZAHL * STRUCT-LÄNGE 
        LSR.L   =2,D1          D1 // 4 
        MOVEA.L 2(A3),A1       ADRESSE VOM BUCH   (QUELLE) 
        ADDA.L  D6,A1          D6 = STRUKTUR-LÄNGE 
        MOVEA.L 12(A3),A2      ADRESSE VON NEWBUK (ZIEL) 
        ADDA.L  D6,A2 
        SUBQ    =1,D1          -1 WEGEN DBF 
COPY2   MOVE.L  (A1)+,(A2)+    TRANSFER 
        DBF     D1,COPY2 
*-------------------------------------------------------------- 
*                              GEBE ALTE WORK-SPACE FREI 
UNLINK  TST.L   24(A3)         IF OLDWSP=0 -> NOTHING TO UNLINK 
        BNE.S   UNLNK1 
        BRA.S   CHANGE 
* 
UNLNK1  OFF                    INTERRUPT SPERREN 
        MOVEA.L 24(A3),A1 
        MOVEA.L BACKT(A1),A2 
        MOVE.L  FORT(A1),FORT(A2) 
        MOVEA.L FORT(A1),A2 
        MOVE.L  BACKT(A1),BACKT(A2) 
        MOVE    =$10,TYPE(A1) 
        MOVE    =$4142,NAME(A1) 
        MOVE    =$4344,NAME+2(A1) 
        MOVE    =$4546,NAME+4(A1) 
        ANDI    =$D8FF,SR           INTERRUPT ERLAUBEN 
        RWSP 
* 
        MOVE.L  =0,24(A3)           RESET OLDWSP 
*---------------------------------------------------------------- 
*                              VERTAUSCHE DIE POINTER 
CHANGE  MOVE.L  12(A3),2(A3)   NEWBUK --> ___BUK 
        MOVE.L  16(A3),8(A3)   NEWIDX --> ___IDX 
        MOVE    (A3),6(A3)     NEW DIMENSION OF INDEX 
*---------------------------------------------------------------- 
        ST      >MALLOC        ALLES I.O. 
        JMP     2(A0)          FERTIG 
* 
*============================================================== 
*                              NO WORK-SPACE 
NOWSPC  SF      >MALLOC 
        MOVE    6(A3),(A3)     KORRIGIERE DIMENSIONS-GRÖSSE 
        JMP     2(A0)          KEINE WEITEREN VORKOMMNISSE 
* 
************************** ENDE MALLOC ************************* 
* 
* 
**************************************************************** 
* 
* RUGRAF    (rudimentäre Grafik  V1.1) 
*               01.05.1988 ; 23:00h 
* 
**************************************************************** 
* Variables: 
* 
CRS     DC.L    0              abs. Curs.-Adresse 
REST    DC.W    0              Pixel-Rest der Curs-Adr 
        DS      40             A3 = Pseudo-Stack 
PSTACK  DC.L    0 
VIDEO   EQU     $81A 
* 
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* 
*                                                  * 
* DRAW                           Zeichne eine Line * 
*                                                  * 
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* 
* 
* Procedure workspace definitions: 
* 
PAR0   EQU     0              1. x-Koordinate 
PAR1   EQU     PAR0+2         1. y-Koordinate 
PAR2   EQU     PAR1+2         Länge der Linie 
PAR3   EQU     PAR2+2         Richtung der Linie 
PAR4   EQU     PAR3+2         Farbe (0 bzw. 1) 
WSZ0   EQU     PAR4+2         Size of Workspace 
*--------------------------------------------------* 
>DRAW  ENTR    WSZ0.L         get workspace 
       INVW    PAR0.X         get par by value 
       INVW    PAR1.X         get par by value 
       INVW    PAR2.X         get par by value 
       INVW    PAR3.X         get par by value 
       INVW    PAR4.X         get par by value 
       EPAR                   end of parameter xfer 
* 
       LEA     PSTACK,A3 
* 
       MOVE    PAR0.X,D0 
       MOVE    PAR1.X,D1 
       MOVE    PAR2.X,D2 
       MOVE    PAR3.X,D3 
       BSR     CTRL1          Control Parameter 
       MOVE    D0,PAR0.X 
       MOVE    D1,PAR1.X 
       MOVE    D2,PAR2.X 
* 
       BSR     ABSCRS         A1 = abs. Curs.-Adr. 
* 
       MOVE    PAR2.X,D0      D0 = Länge 
       LEA     REST,A2 
       MOVE    (A2),D1        D1 = Rest 0...7 
* 
       TST     PAR4.X         Farbe: 
       BEQ     WHITE          weiss 
* 
*=================================================== 
* 
BLACK  MOVE    PAR3.X,D2      Richtung 
       CMP     =2,D2          Osten ? 
       BNE.S   BL1 
       BSR     BLEAST         Black East 
       BRA     EXIT           fertig 
BL1    BSR     BLSUD          Black South 
       BRA     EXIT 
* 
*--------------------------- 
* schwarze Linie nach Süden: 
*--------------------------- 
BLSUD  SUB     =7,D1          0 --> 7 
       NEG     D1             1 --> 6  etc. 
* 
BLCK1  BSET    D1,(A1)        D1 = "Maske" 
       ADDA.L  =80,A1 
       DBF     D0,BLCK1 
       RTS 
* 
*--------------------------- 
* schwarze Linie nach Osten: 
*--------------------------- 
BLEAST SUB     =7,D1          vgl. oben 
       NEG     D1 
       CLR     D2             D2 = "Maske" 
* 
BLCK2  BSET    D1,D2 
       SUBQ    =1,D0          DEC Länge 
       TST     D0 
       DBMI    D1,BLCK2 
       OR.B    D2,(A1)+ 
* 
       MOVE    =$FF,D2 
       TST     D0 
       BPL.S   BLCK3          Länge >-1 
       RTS 
* 
BLCK3  CMP     =8,D0 
       BMI.S   BLCK4          Länge < 8 
       MOVE.B  D2,(A1)+ 
       SUB     =8,D0 
       BRA.S   BLCK3 
* 
BLCK4  SUB     =7,D0 
       NEG     D0 
       MOVE.B  =$FF,D2 
       LSL.B   D0,D2 
       OR.B    D2,(A1) 
       RTS 
* 
*=================================================== 
* 
WHITE  MOVE    PAR3.X,D2      Richtung 
       CMP     =2,D2          Osten ? 
       BNE.S   WH1 
       BSR     WHEAST         White East 
       BRA     EXIT 
WH1    BSR     WHSUD          White South 
       BRA     EXIT 
* 
*------------------------ 
* weise Linie nach Süden: 
*------------------------ 
WHSUD  SUB    =7,D1          0 --> 7 
       NEG    D1             1 --> 6  etc. 
* 
WHIT1  BCLR   D1,(A1)        D1 = "Maske" 
       ADDA.L =80,A1 
       DBF    D0,WHIT1 
       RTS 
* 
*------------------------- 
* weisse Linie nach Osten: 
*------------------------- 
WHEAST SUB    =7,D1          vgl. oben 
       NEG    D1 
       MOVE   =$FF,D2 
* 
WHIT2  BCLR   D1,D2 
       SUBQ   =1,D0          DEC Länge 
       TST    D0 
       DBMI   D1,WHIT2 
       AND.B  D2,(A1)+ 
* 
       CLR    D2 
       TST    D0 
       BPL.S  WHIT3          Länge >-1 
       RTS 
* 
WHIT3  CMP    =8,D0 
       BMI.S  WHIT4          Länge < 8 
       MOVE.B D2,(A1)+ 
       SUB    =8,D0 
       BRA.S  WHIT3 
* 
WHIT4  MOVE   =$FF,D2 
       LSR.B  D0,D2 
       AND.B  D2,(A1) 
       RTS 
* 
* 
* 
* 
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* 
*                                                  * 
* BOX                             Zeichne eine Box * 
*                                                  * 
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX* 
* 
* Procedure Workspace Definitions: 
* 
PAR5    EQU    0              X-koordinate 
PAR6    EQU    PAR5+2         Y-koordinate 
PAR7    EQU    PAR6+2         Länge der X-Achse 
PAR8    EQU    PAR7+2         Länge der Y-Achse 
PAR9    EQU    PAR8+2         Farbe 
PAR10   EQU    PAR9+2         Extras 
WSZ1    EQU    PAR10+2        size of workspace 
*--------------------------------------------------* 
>BOX    ENTR   WSZ1.L         get workspace 
        INVW   PAR5.X         X-Koordinate 
        INVW   PAR6.X         Y-Koordinate 
        INVW   PAR7.X         X-Länge 
        INVW   PAR8.X         Y-Länge 
        INVW   PAR9.X         Farbe 
        INVW   PAR10.X        Extras 
        EPAR                  end of parameter xfer 
* 
        LEA     PSTACK,A3     Pseudo-Stack 
* 
        MOVE   PAR5.X,D0      X-Koord. 
        MOVE   PAR6.X,D1      Y-Koord. 
        MOVE   PAR7.X,D2      X-Länge 
        MOVE   =2,D3          Richtung Ost 
        BSR    CTRL1 
        MOVE   D0,PAR5.X 
        MOVE   D1,PAR6.X 
        MOVE   D2,PAR7.X 
* 
        MOVE   PAR8.X,D2      Y-Länge 
        MOVE   =4,D3          Richtung Süden 
        BSR    CTRL1 
        MOVE   D2,PAR8.X 
* 
        BSR    ABSCRS         A1 = abs. Curs.-Adr. 
* 
*=================================================== 
* D6 & D7 werden mit Farb-Muster geladen 
*--------------------------------------------------- 
        MOVE    PAR9.X,D0 
        CMP     =0,D0          weisse Box? 
        BNE.S   F1 
        CLR     D6             weisse Box! 
        CLR     D7 
        BSR     BOXEN 
        BRA     EXTRA 
F1      CMP     =1,D0 
        BNE.S   F2 
        MOVE    =$AA,D6        hell-graue Box 
        MOVE    =$00,D7 
        BSR     BOXEN 
        BRA     EXTRA 
F2      CMP     =2,D0 
        BNE.S   F3 
        MOVE    =$AA,D6        graue Box 
        MOVE    =$55,D7 
        BSR     BOXEN 
        BRA     EXTRA 
F3      CMP     =3,D0 
        BNE.S   F4 
        MOVE    =$FF,D6        dunkel-graue Box 
        MOVE    =$AA,D7 
        BSR     BOXEN 
        BRA     EXTRA 
F4      CMP     =4,D0 
        BNE.S   F5 
        MOVE    =$FF,D6        schwarze Box 
        MOVE    =$FF,D7 
        BSR     BOXEN 
        BRA     EXTRA          absolut sinnlos 
F5      CMP     =5,D0 
        BNE.S   F6 
        BSR     BOXEN          Box invertieren 
        BRA     EXIT 
F6      BSR     BOXEN          Box transperent 
        BRA     EXTRA 

* 
*================================================== 
* die Box wird gezeichnet 
*-------------------------------------------------- 
BOXEN   MOVE   PAR7.X,D0      X-Länge 
        MOVE   PAR8.X,D1      Y-Länge 
* 
        CLR    D4             lösche Maske 
        LEA    REST,A2 
        MOVE   (A2),D2        D2 = Rest 
* 
        SUB    =7,D2          0 --> 7 
        NEG    D2             1 --> 6 etc. 
        MOVE   =7,D3 
BOX1    CMP    D3,D2 
        BEQ.S  BOX2 
        BSET   D3,D4 
        SUBQ   =1,D3 
        BRA.S  BOX1 
BOX2    MOVE   (A2),D3        REST 
        ADD    D0,D3 
        CMP    =8,D3          X < 1 Byte-Raster ? 
        BPL.S  BOX4           nein 
        SUB    =7,D3 
        NEG    D3 
BOX3    BSET   D3,D4 
        DBF    D3,BOX3 
        BSR    BOXCOL         zeichne eine Spalte 
        RTS                   Fertig 
* 
BOX4    BSR    BOXCOL 
        MOVE   (A2),D3        REST 
        NEG    D3 
        ADDQ   =8,D3 
        SUB    D3,D0          X-Länge verkürzen 
* 
BOX5    CLR    D4             Maske 
        CMP    =8,D0 
        BMI.S  BOX6 
        BSR    BOXCOL 
        SUBQ   =8,D0 
        BRA.S  BOX5 
* 
BOX6    TST    D0 
        BNE.S  BOX7 
        RTS 
BOX7    MOVE   D0,D3 
        SUB    =7,D3 
        NEG    D3 
        CLR    D4             Maske 
BOX8    BSET   D3,D4 
        DBF    D3,BOX8 
        BSR    BOXCOL 
        RTS 
* 
*---------------------------------------------- 
* Streifen werden gezeichnet 
*---------------------------------------------- 
BOXCOL  MOVEM.L  D0/A1,-(A3)  store D0,A1 
        MOVE     PAR9.X,D0 
        TST      D0 
        BEQ.S    BXCL2        weisse Box 
        CMP      =5,D0 
        BEQ.S    INVERS       invertiere Box-Inhalt 
        CMP      =6,D0 
        BEQ      TRANS        transparente Box 
* 
        NOT      D4           negiere Maske 
BXCL1   TST      D1           D1 = Y-Länge 
        BEQ.S    BXCL3 
        MOVE     D6,D5        1.Grau-Streifen 
        AND      D4,D5 
        OR.B     D5,(A1) 
        ADDA.L   =80,A1 
        SUBQ     =1,D1 
        TST      D1 
        BEQ.S    BXCL3 
        MOVE     D7,D5          2.Grau-Streifen 
        AND      D4,D5 
        OR.B     D5,(A1) 
        ADDA.L   =80,A1 
        SUBQ     =1,D1 
        TST      D1 
        BNE.S    BXCL1 
        BRA.S    BXCL3 
* 
BXCL2   TST      D1            weisse Box 
        BEQ.S    BXCL3 
        AND.B    D4,(A1) 
        ADDA.L   =80,A1 
        SUBQ     =1,D1 
        BRA.S    BXCL2 
* 
TRANS   NOP                    transparente Box 
* 
* 
BXCL3   MOVE     PAR8.X,D1     Restore Y-Länge 
        MOVEM.L  (A3)+,D0/A1      "  "   A1 
        ADDQ.L   =1,A1 
        RTS 
* 
* 
INVERS  TST      D1            D1 = Y-Länge 
        BEQ.S    BXCL3         fertig 
        NOT      D4            negiere Maske 
        MOVE.B   (A1),D5       hole Byte ins D5 
        MOVE     D5,D6         kopiere Byte 
        AND      D4,D5         AND mit NOT-MASKE 
        EOR      D4,D5         EXOR mit NOT-MASKE 
        NOT      D4            Maske 
        AND      D4,D6         AND mit Kopie 
        OR       D6,D5 
        MOVE.B   D5,(A1)       zurück zum Bildschirm 
        ADDA.L   =80,A1 
        SUBQ     =1,D1 
        TST      D1 
        BEQ.S    BXCL3 
        BRA.S    INVERS 
* 
* 
*=================================================== 
* EXTRAS 
*--------------------------------------------------- 
EXTRA   TST      PAR10.X 
        BNE.S    EXT1 
        BRA      EXIT          Return to PEARL 
EXT1    MOVE     PAR10.X,D7 
        CMP      =1,D7          umrahmen ? 
        BNE.S    EXT2 
        BSR      RAHM 
        BRA      EXIT           Return to PEARL 
EXT2    CMP      =2,D7          dick umrahmen ? 
        BEQ      DICK 
******* 
DOPPEL  BSR      RAHM 
        ADDQ     =3,PAR5.X      X-Koord. + 3 
        ADDQ     =3,PAR6.X      Y-Koord. + 3 
        SUBQ     =6,PAR7.X      X-Länge  - 6 
        SUBQ     =6,PAR8.X      Y-Länge  - 6 
        BSR      RAHM 
        BRA      EXIT 
******* 
DICK    BSR    RAHM 
        ADDQ   =1,PAR5.X      X-Koord. + 3 
        ADDQ   =1,PAR6.X      Y-Koord. + 3 
        SUBQ   =2,PAR7.X      X-Länge  - 6 
        SUBQ   =2,PAR8.X      Y-Länge  - 6 
        BSR    RAHM 
        BRA     EXIT 
******* 
RAHM    MOVE   PAR5.X,D0      X-Koord. 
        MOVE   PAR6.X,D1      Y-Koord. 
        BSR    ABSCRS 
        LEA    REST,A2 
        MOVE   (A2),D1        D1= REST; A1= Curs.-Adr 
        MOVE   PAR7.X,D0      X-Länge 
        BSR    BLEAST         Black East 
* 
        MOVE   PAR5.X,D0      X-Koord. 
        MOVE   PAR6.X,D1      Y-Koord. 
        BSR    ABSCRS 
        LEA    REST,A2 
        MOVE   (A2),D1        D1= REST; A1= Curs.-Adr 
        MOVE   PAR8.X,D0      Y-Länge 
        BSR    BLSUD          Black South 
* 
        MOVE   PAR5.X,D0      X-Koord. 
        ADD    PAR7.X,D0      X-Länge 
        MOVE   PAR6.X,D1      Y-Koord. 
        BSR    ABSCRS 
        LEA    REST,A2 
        MOVE   (A2),D1        D1= REST; A1= Curs.-Adr 
        MOVE   PAR8.X,D0      Y-Länge 
        BSR    BLSUD          Black South 
* 
        MOVE   PAR5.X,D0      X-Koord. 
        MOVE   PAR6.X,D1      Y-Koord. 
        ADD    PAR8.X,D1      Y-Länge 
        BSR    ABSCRS 
        LEA    REST,A2 
        MOVE   (A2),D1        D1= REST; A1= Curs.-Adr 
        MOVE   PAR7.X,D0      X-Länge 
        BSR    BLEAST         Black East 
        RTS 
* 
* 
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*
*
* FULL,PFEILL,PFEILR,PFEILO,PFEILU
*
*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*
* Modul-Variable:
*
PFLEFT  DC.W   $0000,$0000,$0200,$0600,$0A00,$13FE,$2002,$4002
        DC.W   $2002,$13FE,$0A00,$0600,$0200,$0000,$0000,$0000
*
PFRIGH  DC.W   $0000,$0000,$0040,$0060,$0050,$7FC8,$4004,$4002
        DC.W   $4004,$7FC8,$0050,$0060,$0040,$0000,$0000,$0000
*
PFUP    DC.W   $0000,$0080,$0140,$0220,$0410,$0808,$1E3C,$0220
        DC.W   $0220,$0220,$0220,$0220,$0220,$0220,$03E0,$0000
*
PFDOWN  DC.W   $0000,$03E0,$0220,$0220,$0220,$0220,$0220,$0220
        DC.W   $0220,$1E3C,$0808,$0414,$0220,$0140,$0080,$0000
*
FULBOX  DC.W   $0000,$0180,$03C0,$07E0,$0E70,$1C38,$381C,$700E
        DC.W   $700E,$381C,$1C38,$0E70,$07E0,$03C0,$0180,$0000
*=============================================================
* Procedure workspace definitions:
*
PAR11   EQU     0              1. x-Koordinate
PAR12   EQU     PAR11+2        1. y-Koordinate
WSZ2    EQU     PAR12+2        Size of Workspace
*
*--------------------------------------------------*
>PFEILL ENTR    WSZ2.L         get workspace
        INVW    PAR11.X        X-Koordinate 0...78
        INVW    PAR12.X        Y-Koordinate 0...24
        EPAR                   end of parameter xfer
        BSR     SUPIC2         --> A1 = VIDEO-Pointer
        LEA     PFLEFT,A2
        BRA     DOPIC2          fertig!
*--------------------------------------------------*
>PFEILR ENTR    WSZ2.L         get workspace
        INVW    PAR11.X        X-Koordinate 0...78
        INVW    PAR12.X        Y-Koordinate 0...24
        EPAR                   end of parameter xfer 
        BSR     SUPIC2         -->  A1 = VIDEO-Pointer 
        LEA     PFRIGH,A2 
        BRA     DOPIC2          fertig ! 
*--------------------------------------------------* 
>PFEILO ENTR    WSZ2.L         get workspace 
        INVW    PAR11.X        X-Koordinate 0...78 
        INVW    PAR12.X        Y-Koordinate 0...24 
        EPAR                   end of parameter xfer 
        BSR     SUPIC2         -->  A1 = VIDEO-Pointer 
        LEA     PFUP,A2 
        BRA     DOPIC2          fertig ! 
*--------------------------------------------------* 
>PFEILU ENTR    WSZ2.L         get workspace 
        INVW    PAR11.X        X-Koordinate 0...78 
        INVW    PAR12.X        Y-Koordinate 0...24 
        EPAR                   end of parameter xfer 
        BSR     SUPIC2         -->  A1 = VIDEO-Pointer 
        LEA     PFDOWN,A2 
        BRA     DOPIC2          fertig ! 
*--------------------------------------------------* 
>FULL   ENTR    WSZ2.L         get workspace 
        INVW    PAR11.X        X-Koordinate 0...78 
        INVW    PAR12.X        Y-Koordinate 0...24 
        EPAR                   end of parameter xfer 
        BSR     SUPIC2         -->  A1 = VIDEO-Pointer 
        LEA     FULBOX,A2 
        BRA     DOPIC2          fertig ! 
* 
*========================================================== 
* SUB-PRG. für doppelreihige Muster; 
* berechnet die Bildschirm-Koordinaten: 
*---------------------------------------------------------- 
SUPIC2  MOVE    PAR11.X,D0 
        MOVE    PAR12.X,D1 
        CMP     =79,D0 
        BPL     PIC2EX         X-Koordinate zu gross 
        EXT.L   D0 
        CMP     =25,D1 
        BPL     PIC2EX         Y-Koordinate zu gross 
* 
        MOVEA.L VIDEO,A1       hole Video-Adr. 
        ADDA.L  D0,A1          plus X-Koord. 
        MULS    =1280,D1       80 X 16 = 1280 
        ADDA.L  D1,A1          plus Y-Koord. 
        RTS 
* 
PIC2EX  ADDQ.L  =4,A7          restauriere Stapel 
        BRA     EXIT 
* 
*============================================================ 
* DO_PIC_2:  zeichnet doppelreihige Muster auf den Bildschirm 
*------------------------------------------------------------ 
DOPIC2  MOVE.L  A1,D0          get a copy of Vidio-Pointer 
        MOVEA.L  A2,A3         get a copy of MusterPointer 
        MOVE    =15,D2         D2 = Zähler 
PIC21   MOVE.B  (A2),(A1)      copy into Screen 
        ADDQ.L  =2,A2 
        ADDA.L  =80,A1         increment Zeile 
        DBF     D2,PIC21 
* 
        EXG     D0,A1          get back VIDEO-Pointer 
        ADDQ.L  =1,A1 
        ADDQ.L  =1,A3          Adr. of PFLEFT 
        MOVE    =15,D2         D2 = Zähler 
PIC22   MOVE.B  (A3),(A1)      copy into Screen 
        ADDA.L  =2,A3 
        ADDA.L  =80,A1         increment Zeile 
        DBF     D2,PIC22 
        BRA     EXIT 
        NOP 
*--------------------------------------------------* 
* 
EXIT   RETN 
* 
* 
*==================================================* 
* Verschiedene Subroutinen zu RUGRAF               * 
*==================================================* 
* 
*==================================================* 
* CTRL1    Kontrolliere DRAW-Parameter             * 
*                                                  * 
* D0=X-Koord. ; D1=Y-Koord. ; D2=Laenge ; D3=Richt.* 
*--------------------------------------------------* 
CTRL1   MOVE.L  D4,-(A3)       store D4 
        TST     D0 
        BPL.S   CT1 
        CLR     D0             X-Koord. war negativ 
        BRA.S   CT2 
CT1     CMP     =640,D0 
        BMI.S   CT2 
        MOVE    =639,D0        X-Koord. > 639 
* 
CT2     TST     D1 
        BPL.S   CT3 
        CLR     D1             Y-Koord. war negativ 
        BRA.S   CT4 
CT3     CMP     =400,D1 
        BMI.S   CT4 
        MOVE    =399,D1        Y-Koord. > 399 
* 
CT4     SUBQ    =1,D2          Länge 
        TST     D2 
        BPL.S   CT5 
        NEG     D2             Länge war =< 0 

CT5     CMP     =2,D3          Richtung Osten ? 
        BEQ.S   CT7 
*                              sonst nach Süden ! 
*                              weitere Richtungs-Ctrl. 
*                              hier anhängen 
* 
        MOVE    D2,D4          Länge --> D4 
        ADD     D1,D4          Y-Koord. + Länge 
        CMP     =400,D4 
        BMI.S   CTEXIT         alles okay 
        MOVE    D1,D2          Y-Koord. 
        NEG     D2 
        ADD     =398,D2 
        BRA.S   CTEXIT 
* 
CT7     MOVE    D2,D4          Länge --> D4 
        ADD     D0,D4          X-Koord. + Länge 
        CMP     =640,D4 
        BMI.S   CTEXIT         alles okay 
        MOVE    D0,D2          X-Koord. 
        NEG     D2 
        ADD     =638,D2        Länge war zu lang 
* 
CTEXIT  ADDQ    =1,D2          korrigiere Länge 
        MOVE.L  (A3)+,D4       restore D4 
        RTS 
* 
*================================================== 
* ABSCRS         Absolute Cursor-Adresse berechnen 
* 
* D0 = X-Koordinate 
* D1 = Y-Koordinate 
* Ergebnis wird in CRS,A1  und REST abgelegt 
*-------------------------------------------------- 
* 
ABSCRS  MOVEM.L D0-D1/A2,-(A3) 
        MOVEA.L VIDEO,A2        A2 = Video-Adr. 
        LEA     CRS,A1          A1 = CRS 
        MOVE.L  A2,(A1) 
* 
        MOVE    D0,D1           kopiere X-Koord. 
        LSR     =3,D0           D0 // 8 
        EXT.L   D0 
        ADD.L   D0,(A1)        CRS = ($81A)+D0 
        LSL     =3,D0          D0 * 8 
        NEG     D0             D0 * -1 
        ADD     D1,D0 
        LEA     REST,A2 
        MOVE    D0,(A2) 
        MOVEM.L (A3)+,D0-D1/A2 restore X & Y Koord. 
        MOVE.L  D1,-(A3)       store Y-Koord. 
* 
        MULS    =80,D1         D1 * 80 (bytes) 
        ADD.L   D1,(A1) 
        MOVE.L  (A3)+,D1       restore Y-Koord. 
        MOVEA.L (A1),A1        A1, CRS = abs.Curs.-Adr. 
* 
        RTS 
* 
**************************************************** 
* 
* 
* 
**************************************************** 
* 
* M O U S E             12.05.1988 ; 11:00 
* 
**************************************************** 
>HIDEM  V0                     HYPERPROZ. OFF 
        CMPI.B  =19,(A0)       KOTRL. OB EPAR 
        BEQ.S   HID0           WENN JA, ALLES OKAY 
        SUSP                   SONST ABBRUCH,WENN NÖTIG 
        TERMI                  AUF DIE BRUTALE 
* 
HID0    MOVE    >MOUST,D0      EXTERN MAUS-STATUS 
        BNE.S   HID1           IF MOUST /= 0 THEN GOTO HID1 
        JMP     2(A0)          ELSE RETURN TO PEARL 
* 
HID1    MOVE.L  MAUS,D0 
        DISAB                  DISABLE MAUS 
        MOVE    =0,>MOUST      MOUST = 0 
        BSR     MSABS          A2 = abs. Curs.-Pos. 
        BSR     HIDE           HIDE MAUS 
        JMP     2(A0)          THAT'S WAS IT 
**************************************************** 
>SHOWM  V0                     HYPERPROZ. OFF 
        CMPI.B  =19,(A0)       KOTRL. OB EPAR 
        BEQ.S   SHW0           WENN JA, ALLES OKAY 
        SUSP                   SONST ABBRUCH,WENN NÖTIG 
        TERMI                  AUF DIE BRUTALE 
* 
SHW0    MOVE    >MOUST,D0      EXTERN MAUS-STATUS 
        BEQ.S   SHW1           IF MOUST == 0 THEN GOTO SHW1 
        JMP     2(A0)          ELSE RETURN TO PEARL 
* 
SHW1    BSR     MSABS          A2 = abs. Curs.-Pos. 
        BSR     SHOW           SHOW MAUS 
        MOVE    =2,>MOUST      MOUST = 2 
        MOVE.L  MAUS,D0 
        ENAB                   ENABLE MAUS-INTERRUPT 
        JMP     2(A0)          THAT'S WAS IT 
**************************************************** 
*      task head for RTOS-UH 
TASK1: DC.L   0              for loader 
       DC.L   MDLE           for loader 
       DC     $81            type: resident task 
       DC.B   'MOUSE '       task name 
*---------------------------------------------------- 
       DC     PRIO           task priority 
       DC.L   WSPLEN         work space length 
       DC.L   0,0            for System 
       DC     PRIO           also priority 
       DC.L   MOUSI          start-PC 
       DC.L   0,0,0,0,0,0,0,0      64 bytes zero 
       DC.L   0,0,0,0,0,0,0,0 
* 
**************************************************** 
*      task variables 
MAUS   DC.L   $80000000      mouse interrupt 
MTO    DC     0              old mouse status 
* 
PFEIL  DC.L   $00000000,$40000000,$60000000,$70000000 
       DC.L   $78000000,$7C000000,$7E000000,$7F000000 
       DC.L   $7F800000,$7FC00000,$7FE00000,$70000000 
       DC.L   $60000000,$40000000,$00000000,$00000000 
RAND   DC.L   $3FFFFFFF,$5FFFFFFF,$6FFFFFFF,$77FFFFFF 
       DC.L   $7BFFFFFF,$7DFFFFFF,$7EFFFFFF,$7F7FFFFF 
       DC.L   $7FBFFFFF,$7FDFFFFF,$7FEFFFFF,$700FFFFF 
       DC.L   $6FFFFFFF,$5FFFFFFF,$3FFFFFFF,$FFFFFFFF 
BILD   DC.L   0,0,0,0,0,0,0,0  Zwischen-Speicher 
       DC.L   0,0,0,0,0,0,0,0 
**************************************************** 
PRIO   EQU    10             task priority 
WSPLEN EQU    $290           workspace length 
STACK  EQU    WSPLEN         workspace length 
* 
*====================================================== 
*  TASK: (aufbauen auf der Idee von Herrn C.-M. Weitz) 
*====================================================== 
MOUSI  LEA    STACK.T,A7     set up stack 
       MOVE.L MAUS,D0        get interrupt mask 
       DISAB                 disable MAUS interrupt 
       MOVE.B $8E6,D0        get new mouse status 
       CMP.B  MTO,D0         compare with old one 
       BEQ.S  MSMOVE         no change --> movement 
* 
       LEA    MTO,A1         get address of MTO 
       MOVE.B D0,(A1)        save status 
       BTST   =1,D0          test left button 
       SNE    >LBTN          save result of test 
       BTST   =0,D0          test right button 
       SNE    >RBTN          save result of test 
* 
*================================================== 
* Status und Bewegung der Maus: 
* 
MSMOVE: BSR    MSABS          A2 = abs. Curs.-Pos. 
        MOVE   >MOUST,D0      0 = hide,  2 = show & move 
        TST    D0 
        BNE.S  MOUS1 
        BSR    HIDE           hide Mouse 
        BRA    MSEX           Intpt bleibt disabled 
*
MOUS1   BSR    HIDE           MOUST = 2  <=> MOVE IT 
        MOVE.B $8E7,D0        get x-movement 
        BEQ.S  MSY            no x-movement 
        EXT.W  D0             sign extend to word 
        ADD    >MX,D0         add old position 
        CMP    =627,D0        test for screen border 
        BCS.S  MOUS4          b: not out of range 
        BPL.S  MOUS3          b: MX greater than 627 
* 
* MX is negativ, replace by 0 
        MOVEQ  =0,D0          MX = 0 
        BRA.S  MOUS4 
* 
*       MX is greater than 627, replace by 627 
MOUS3:  MOVE   =627,D0        x = 627 
MOUS4:  MOVE   D0,>MX         save new x 
*------------------------
MSY:    MOVE.B $8E8,D0        get y-movement 
        BEQ.S  MOUS7          b: no y-movement 
        EXT.W  D0             sign extend to word 
        ADD.W  >MY,D0         add old position 
        CMP.W  =384,D0        test for screen border 
        BCS.S  MOUS6          not out of range 
        BPL.S  MOUS5          y greater than 384 
* MY is negativ, replace by 0 
        MOVEQ  =0,D0          y = 0 
        BRA.S  MOUS6 
* MY is greater than 384, replace by 384 
MOUS5:  MOVE.W =384,D0        y = 384 
MOUS6:  MOVE.W D0,>MY         save new y 
MOUS7:  BSR    MSABS 
        BSR    SHOW 
* 
MSEXIT  MOVE.L MAUS,D0        get interrupt mask 
        ENAB                  enable MAUS interrupt 
MSEX    TERMI                 end 
* 
* 
* 
*================================================== 
* HIDE: 
* zwischengespeichertes Bild wird zurückgezeichnet, 
* weshalb die Maus verschwindet. 
*================================================== 
* 
HIDE:  MOVE   =15,D0         Zähler 
       LEA    BILD,A1        A1: Bild-Adresse 
M1:    MOVE.L (A1)+,(A2)     A2: abs. Curs.-Position 
       ADDA.L =80,A2 
       DBF    D0,M1          Bild --> Curs.-Position 
       RTS 
* 
* 
*======================================================== 
* SHOW: 
* das Bild an der absol. Maus-Position wir 
* zwischengesp. und an dieser Stelle die Maus gezeichnet 
*======================================================== 
* 
SHOW:  MOVE   =15,D0 
       LEA    BILD,A1        vgl. oben 
       MOVEA.L A2,A3         store abs.Curs.-Adr. 
SH1:   MOVE.L (A2),(A1)+     Screen --> Bildspeicher 
       ADDA.L =80,A2 
       DBF    D0,SH1         Curs.-Position --> Bild 
* 
       MOVEA.L A3,A2         abs. Cursor-Pos. 
       LEA    PFEIL,A1 
       MOVE   =15,D0         Zaehler 
SH2:   MOVE.L (A1)+,D1 
       LSR.L  D4,D1          D4: MX MODULO 16 
       OR.L   D1,(A2) 
       ADDA.L =80,A2 
       DBF    D0,SH2         Pfeil --> Bildschirm 
* 
       MOVEA.L A3,A2         abs. Cursor-Pos. 
       LEA    RAND,A1 
       MOVE   =15,D0         Zaehler 
SH3:   MOVE.L (A1)+,D1 
       ROR.L  D4,D1          D4: MX MODULO 16 
       AND.L  D1,(A2) 
       ADDA.L =80,A2 
       DBF    D0,SH3         Rand  --> Bildschirm 
       RTS 
* 
* 
*======================================= 
* MSABS: 
* es wird die abs. Cursor-Pos. berechnet 
*======================================= 
* 
MSABS:  MOVE.L $81A,D3       D3: Screen-Adr. 
        MOVE   >MX,D1 
        EXT.L  D1 
        DIVS   =16,D1         D1: MX // 16 
        MOVE.L D1,D4          D4: MX MODULO 16 
        SWAP   D4 
        AND.L  =$0000FFFF,D1 
        LSL.W  =1,D1          D1 MUL 2 
* 
        MOVE   >MY,D2 
        EXT.L  D2 
        MULS   =80,D2         D2: MY MUL 80 
* 
        ADD.L  D1,D3 
        ADD.L  D2,D3 
        EXG    D3,A2          A2: absolute Curs.-Adr. 
        RTS 
* 
* 
* 
**************************************************** 
        END    TASK1 
**************************************************** 
        END 
















































