
****************************************************
*                                                  *
*                     RUGRAF                       *
*           (rudimentäre Grafik  V1.0)             *
*               29.03.1988 ; 23:00h                *
*                     M.Kendi                      *
****************************************************
* DRAW   Zeile  30
* BOX     " "  178
*
*
       DC.L   0              for loader
       DC.L   0
       DC     $10            type: module
       DC.B   'RUGRAF'       module name
****************************************************
* Hyperprocessor Definitions:
*
INVW   OPD.V  14             xfer FIXED(15) by val
EPAR   OPD.V  19             end of parameter xfer 
ENTR   OPD.V  29             procedure entry 
RETN   OPD    $4E4C          return from procedure 
* 
**************************************************** 
* Address Definition & Module Variables 
* 
CRS    DC.L   0              abs. Curs.-Adresse 
REST   DC.W   0              Pixel-Rest der Curs-Adr 
* 
* 
*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 
* 
       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 
       RETN                  Return to PEARL 
BL1    BSR    BLSUD          Black South 
       RETN 
* 
*--------------------------- 
* 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 
       RETN 
WH1    BSR    WHSUD          White South 
       RETN 
* 
*------------------------ 
* 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         get par by value 
       INVW   PAR6.X         get par by value 
       INVW   PAR7.X         get par by value 
       INVW   PAR8.X         get par by value 
       INVW   PAR9.X         get par by value 
       INVW   PAR10.X        get par by value 
       EPAR                  end of parameter xfer 
* 
       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. 
* 
**************************************************** 
* 
       MOVE   PAR9.X,D0      Farbe 
       CMP    =0,D0 
       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     MOVE   =$FF,D6        schwarze Box 
       MOVE   =$FF,D7 
       BSR    BOXEN 
       BRA    EXTRA          absolut sinnlos 
* 
*************************************************** 
* 
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 
* 
*------------------ 
* 
BOXCOL MOVEA.L A1,A3         Store A1 
       TST     D6 
       BEQ.S   BXCL2         weisse 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 
       TST    D1 
       BEQ.S  BXCL3 
       AND.B  D4,(A1) 
       ADDA.L =80,A1 
       SUBQ   =1,D1 
       TST    D1 
       BNE.S  BXCL2 
* 
BXCL3  MOVE   PAR8.X,D1      Restore Y-Länge 
       MOVEA.L A3,A1          "  "   A1 
       ADDQ.L =1,A1 
       RTS 
* 
****************************************************
*
EXTRA  TST    PAR10.X
       BNE.S  EXT1
       RETN                  Return to PEARL
EXT1   MOVE   PAR10.X,D7
       CMP    =1,D7          umrahmen ?
       BNE.S  EXT2
       BSR    RAHM
       RETN                  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
       RETN
******* 
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
       RETN
******* 
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                                      
* 
* 
* 
**************************************************** 
*                                                  * 
* Verschiedene Subroutinen zu RUGRAF               * 
*                                                  * 
**************************************************** 
* 
* 
*--------------------------------------------------* 
* CTRL1    Kontrolliere DRAW-Parameter             * 
*                                                  * 
* D0=X-Koord. ; D1=Y-Koord. ; D2=Laenge ; D3=Richt.* 
* D4 wird verändert !                              * 
*--------------------------------------------------* 
CTRL1  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 
       RTS 
* 
*--------------------------------------------------* 
* ABSCRS         Absolute Cursor-Adresse berechnen * 
*                                                  * 
* D0 = X-Koordinate                                * 
* D1 = Y-Koordinate                                * 
* Ergebnis wird in CRS,A1  und REST abgelegt       * 
*--------------------------------------------------* 
* 
ABSCRS MOVEA.L $81A,A1       Screen-Adr. 
       LEA    CRS,A2 
       MOVE.L A1,(A2) 
* 
       MOVE   D1,-(A7)       Store Y-Koord. 
       MOVE   D0,D1          Store X-Koord. 
       LSR    =3,D0          D0 // 8 
       EXT.L  D0 
       LEA    CRS,A1 
       ADD.L  D0,(A1)        CRS = ($81A)+D0 
       LSL    =3,D0          D0 * 8 
       NEG    D0             D0 * -1 
       ADD    D1,D0 
       LEA    REST,A1 
       MOVE   D0,(A1) 
       MOVE   D1,D0          Restore X-Koord. 

       MOVE   (A7)+,D1       Restore Y-Koord. 
       MULS   =80,D1         D1 * 80 (bytes) 
       LEA    CRS,A1 
       ADD.L  D1,(A1) 
       MOVEA.L (A1),A1       A1, CRS = abs.Curs.-Adr. 

       RTS 

**************************************************** 
       END 
**************************************************** 


