; *************************
; *      Linien V1.0      *
; * Geschrieben im Jahre  *
; * 1991 von N. Tausch    *
; *  Public Domain (FD)   *
; *************************

ExecBase:       equ 4
OldOpenLibrary: equ -408
CloseLibrary:   equ -414
FindTask:       equ -294
WaitPort:       equ -384
Forbid:         equ -132
Permit:         equ -138
GetMsg:         equ -372
ReplyMsg:       equ -378

OpenWindow:     equ -204
CloseWindow:    equ -72

Move:           equ -240
Draw:           equ -246
RectFill:       equ -306
SetAPen:        equ -342

Delay:          equ -198

pr_CLI:         equ 172
ThisTask:       equ 276
IDCMP:          equ 512
Flags:          equ 70670

                movea.l ExecBase,a6             ; Testen ob von CLI o.
                movea.l ThisTask(a6),a0         ; Workbench gestartet
                moveq #0,d0                     ; wurde!
                tst.l pr_CLI(a0)
                bne.s CLI                       ; Gestartet von CLI

                lea 92(a0),a0                   ; Ansonsten WorkBenchMessage
                jsr WaitPort(a6)                ; holen und sichern
                jsr GetMsg(a6)
                move.l d0,WBenchMsg

CLI:            lea IntName,a1                  ; intuition.library öffnen
                jsr OldOpenLibrary(a6)
                move.l d0,IntBase
                beq.w Ende                      ; Falls Fehler dann Programmende

                lea GfxName,a1                  ; graphics.library öffnen
                jsr OldOpenLibrary(a6)
                move.l d0,GfxBase
                beq.w Intschliessen             ; Falls Fehler dann intuition schliessen
                                                                ; und Programmende
                lea DosName,a1                  ; dos.library öffnen
                jsr OldOpenLibrary(a6)          ; (für Delay-Funktion!)
                move.l d0,DosBase               ; Falls Fehler dann graphics u. intuition
                beq.w Gfxschliessen             ; schliessen u. Programmende

                movea.l IntBase,a6              ; Öffne das Fenster
                lea NewWindow,a0
                jsr OpenWindow(a6)
                move.l d0,WindowHandle          ; Falls Fehler dann intuition,graphics
                beq.w Dosschliessen             ; u. dos.library schliessen u. Ende
                movea.l WindowHandle,a0
                move.l 50(a0),RastPort          ; RastPort holen

Schleife:
                jsr CLW                         ; Lösche Fensterinhalt
                lea Tabelle,a0                  ; Tabellenanfang nach a0
Schleife2:
                cmp.l #0,(a0)                   ; Schon Ende erreicht?
                beq.s Schleife                  ; Ja? Dann von vorne
                cmp.l #50000,(a0)               ; Soll der Fensterinhalt gelöscht
                beq.w CLS                       ; werden? Ja? Dann tue es!
                cmp.l #60000,(a0)               ; Soll ein wenig gewartet werden?
                beq.s Warte                     ; Ja? Dann tue es!
                movea.l GfxBase,a6              ; Startpunkt einer Linie aus der
                movea.l RastPort,a1             ; Tabelle holen und setzen
                move.l (a0)+,d0
                move.l (a0)+,d1
                jsr Move(a6)

                movea.l RastPort,a1             ; Endpunkt einer Linie aus der
                move.l (a0)+,d0                 ; Tabelle holen und Linie zeichnen
                move.l (a0)+,d1
                move.l a0,a5
                jsr Draw(a6)

                movea.l WindowHandle,a0         ; Wurde das Schließsymbol betätigt?
                movea.l 86(a0),a0
                movea.l ExecBase,a6
                jsr GetMsg(a6)
                tst.l d0                        ; Wenn ja dann Fensterschliessen,
                bne.w Windowzu                  ; Libraries schliessen und Ende
                movea.l DosBase,a6              ; Ansonsten warte ein wenig
                move.l #2,d1
                jsr Delay(a6)
                move.l a5,a0
                bra Schleife2                   ; und zur nächsten Linie

Warte:          movea.l a0,a5                   ; Unterprogramm wartet eine
                movea.l DosBase,a6              ; Sekunde lang
                move.l #50,d1
                jsr Delay(a6)
                movea.l a5,a0
                move.l (a0)+,d0
                bra Schleife2

CLS:            jsr CLW                         ; Unterprogramm löscht den
                move.l (a0)+,d0                 ; Fensterinhalt
                bra Schleife2

CLW:            movea.l a0,a5                   ; Fensterlöschroutine
                movea.l GfxBase,a6              ; Setzt Vordergrundfarbe
                move.l #0,d0                    ; gleich der Hintergrundfarbe
                movea.l RastPort,a1
                jsr SetAPen(a6)
                movea.l RastPort,a1
                move.l #2,d0
                move.l #10,d1
                move.l #197,d2
                move.l #108,d3
                jsr RectFill(a6)                ; Und füllt den Fensterinhalt mit
                move.l #1,d0                    ; einem Rechteck
                movea.l RastPort,a1
                jsr SetAPen(a6)                 ; Farbe wieder auf normal setzen
                movea.l a5,a0
                rts

Windowzu:
                movea.l IntBase,a6              ; Fenster schliessen
                movea.l WindowHandle,a0
                jsr CloseWindow(a6)

Dosschliessen:                                  ; dos.library schliessen
                movea.l ExecBase,a6
                movea.l DosBase,a1
                jsr CloseLibrary(a6)

Gfxschliessen:                                  ; graphics.library schliessen
                movea.l ExecBase,a6
                movea.l GfxBase,a1
                jsr CloseLibrary(a6)

Intschliessen:                                  ; intuition.library schliessen
                movea.l ExecBase,a6
                movea.l IntBase,a1
                jsr CloseLibrary(a6)

Ende:           movea.l ExecBase,a6             ; Wenn von der WorkBench
                move.l WBenchMsg,d0             ; aus gestartet wurde
                beq.s Ende2                     ; dann die WorkBenchMessage wieder
                jsr Forbid(a6)                  ; zurückgeben
                movea.l d0,a1
                jsr ReplyMsg(a6)
                jsr Permit(a6)
Ende2:          moveq #0,d0                     ; Ansonsten ohne Nachrichten-
                rts                             ; austausch Programm beenden

; ************** Daten ***************

WBenchMsg:      dc.l 0
WindowHandle:   dc.l 0
RastPort:       dc.l 0
DosName:        dc.b 'dos.library',0
DosBase:        dc.l 0
IntName:        dc.b 'intuition.library',0
IntBase:        dc.l 0
GfxName:        dc.b 'graphics.library',0
GfxBase:        dc.l 0
NewWindow:
                dc.w 209,57,204,113             ; x,y,Breite,Höhe
                dc.b 3,1                        ; Vordergrund-,Hintergrundfarbe
                dc.l IDCMP                      ; IDCMP-Flags
                dc.l Flags                      ; System-Flags
                dc.l 0,0                        ; Zeiger auf Gadget und MenüHackenImage
                dc.l TitelText                  ; Zeiger auf Titeltext
                dc.l 0,0                        ; Zeiger auf Screen und eigene Bitmap
                dc.w 204,113,204,113            ; minx,miny,maxx,maxy
                dc.w 1                                          ; 1 für Workbenchscreen
TitelText:  dc.b 'Linien',0     ; Fenstertitel
                even
Tabelle:                        ; Tabelle
                dc.l 50000,100,10,100,90,20,50,180,50
                dc.l 100,10,90,50,100,15,80,50  ; 60000 bedeutet warten
                dc.l 100,25,60,50,100,30,50,50  ; 50000 bedeutet Fenster löschen
                dc.l 100,35,40,50,100,40,30,50,100,45
                dc.l 20,50,100,10,110,50,100,15,120,50
                dc.l 100,20,130,50,100,25,140,50,100,30
                dc.l 150,50,100,35,160,50,100,40,170,50
                dc.l 100,45,180,50,100,90,90,50,100,85
                dc.l 80,50,100,80,70,50,100,75,60,50
                dc.l 100,70,50,50,100,65,40,50,100,60
                dc.l 30,50,100,55,20,50,100,90,110,50
                dc.l 100,85,120,50,100,80,130,50,100,75
                dc.l 140,50,100,70,150,50,100,65,160,50
                dc.l 100,60,170,50,100,55,180,50,60000
                dc.l 50000,20,10,180,10,180,10,180,90
                dc.l 20,10,20,90,180,90,20,90,20,15,100,10
                dc.l 20,20,90,10,20,25,80,10,20,30
                dc.l 70,10,20,35,60,10,20,40,50,10,20
                dc.l 45,40,10,30,10,20,50,20,50,30,90
                dc.l 20,55,40,90,20,60,50,90,20,65,60
                dc.l 90,20,70,70,90,20,75,80,90,20,80
                dc.l 90,90,20,85,100,90,100,90,180,85
                dc.l 110,90,180,80,120,90,180,75,130
                dc.l 90,180,70,140,90,180,65,150,90
                dc.l 180,60,160,90,180,55,170,90,180
                dc.l 50,180,50,170,10,180,45,160,10,180
                dc.l 40,150,10,180,35,140,10,180,30,130
                dc.l 10,180,25,120,10,180,20,110,10,180
                dc.l 15,100,10,60000
                dc.l 50000,100,10,100,60,60,10,110,60
                dc.l 20,10,120,60,20,30,120,55,20,50,120
                dc.l 50,20,70,120,45,20,90,120,40,60,90
                dc.l 110,40,100,90,100,50,140,90,100,50
                dc.l 180,90,100,50,180,70,100,50,180,50
                dc.l 100,50,180,30,100,50,180,10,100,50
                dc.l 140,10,100,50,60000
                dc.l 120,40,80,40,80,40,80,60,80,60,120
                dc.l 60,120,60,120,40,60,30,60,70,60,70
                dc.l 140,70,140,70,140,30,140,30,60,30,40
                dc.l 80,160,80,160,80,160,20,160,20,40,20
                dc.l 40,20,40,80,180,90,180,10,180,10,20
                dc.l 10,20,10,20,90,20,90,180,90,60000
                dc.l 20,50,100,10,20,30,60,10,20,50,100,90
                dc.l 20,70,60,90,100,90,180,50,140,90,180
                dc.l 70,180,50,100,10,180,30,140,10,60000
                dc.l 100,20,40,50,40,50,100,80,100,80,160
                dc.l 50,160,50,100,20,100,30,60,50,60,50
                dc.l 100,70,100,70,140,50,140,50,100,30,60000
                dc.l 0            ; 0 = Ende der Tabelle
      end

