;*************** TEXT x,y,vf,hf,"..." ***************** 
;*                                                    *
;*   Gibt einen Text an den Punktkoordinaten x,y in   *
;*   den Farben vf und hf aus.                        *
;*                                                    *
;* x = 0 - 639 \                                      *
;*              > je nach Fenstergröße (CLI = 640x200)*
;* y = 0 - 255 /                                      *
;*                                                    *
;* vf = Vorder- und hf = Hintergrundfarbe (0-31)      *
;*                                                    *
;* "..." = Text                                       *
;*                                                    *
;*       ...Erstellt mit dem SEKA-Assembler...        *
;******************************************************
;*            © 199O by  Michael Gottwald             *
;******************************************************

OpenLib  = -408
CloseLib = -414
Move     = -240
Text     = -60
SetAPen  = -342
SetBPen  = -348
Exit     = -144

;----Librarys öffnen--------------------------------------------------

run:     move.l  a0,Pointer          ;Zeiger auf Parametertext retten
         subq    #1,d0
         beq     error               ;keine Parameter ? - dann Fehler
         move.l  $4,a6
         lea     Dosname,a1
         jsr     OpenLib(a6)         ;Dos.Library öffnen
         move.l  d0,DosBase
         lea     GfxName,a1
         jsr     OpenLib(a6)         ;Graphics.Library öffnen
         move.l  d0,GfxBase
         lea     IntName,a1
         jsr     OpenLib(a6)         ;Intuition.Library öffnen
         move.l  d0,IntBase

;----Aktuellen RastPort holen und speichern---------------------------

         move.l  d0,a0
         move.l  52(a0),a0           ;A0 = aktuelle Fensterstruktur
         move.l  50(a0),RastPort     ;Zeiger auf RastPort holen

;----X-Position holen ------------------------------------------------

         move.l  Pointer,a0          ;Zeiger auf Parametertext holen
         bsr     getdez              ;1-3 stellige Dezimalzahl holen
         move.l  d0,d3               ;X-Position retten
         cmp.w   #639,d0             ;größer als 639 ?
         bgt     error               ;ja, dann Fehler
         
;----Y-Position holen und Cursorposition setzen-----------------------

         bsr     chkcom              ;auf Komma prüfen
         bne     error               ;Nein, dann Fehler
         bsr     getdez              ;Dezimalzahl (Y-Position) holen
         cmp.w   #255,d0             ;größer als 255 ?
         bgt     error               ;ja, dann Fehler
         move.l  a0,Pointer          ;Parametertext-Zeiger retten
         move.l  GfxBase,a0
         move.l  d0,d1               ;Y-Position nach D1...
         move.l  d3,d0               ;X-Position nach D0...
         move.l  RastPort,a1         ;RastPort nach A1...
         jsr     Move(a0)            ;...und Cursorposition setzen
         
;----Vorder- und Hintergrundfarbe holen und setzen--------------------

         move.l  Pointer,a0
         bsr     chkcom              ;auf Komma prüfen
         bsr     getdez              ;Vordergrundfarbe holen
         cmp.b   #31,d0              ;größer als 31 ?
         bgt     error               ;dann Fehler
         move.b  d0,APen             ;D0 retten
         bsr     chkcom              ;auf Komma prüffen
         bsr     getdez              ;Hintergrundfarbe holen
         cmp.b   #31,d0
         bgt     error
         move.l  a0,Pointer
         move.l  RastPort,a1
         move.l  GfxBase,a6
         jsr     SetBPen(a6)         ;Hintergrundfarbe setzen
         move.b  APen,d0             ;Vordergrundfarbe zurückholen
         move.l  RastPort,a1
         move.l  GfxBase,a6
         jsr     SetAPen(a6)         ;Vordergrundfarbe setzen

;----Text holen und ausgeben------------------------------------------

         move.l  Pointer,a0
         bsr     chkcom              ;auf Komma prüfen
chkup:   cmp.b   #34,(a0)+           ;kommen Anführungstriche ?
         bne     error               ;nein, dann Fehler
         move.l  a0,Pointer          ;Textanfangsadresse abspeichern
         clr.l   d0                  ;Textlänge-Zähler = 0
search:  addq.l  #1,d0               ;Zeichen zählen...
         cmp.b   #70,d0              ;mehr als 70 Zeichen ?
         bgt     error               ;kann nicht sein -> Fehler
         cmp.b   #34,(a0)+           ;kommen Anführungsstriche ?
         bne     search              ;nein, dann weiterzählen
         subq.l  #1,d0               ;D0 - 1 = Textlänge
         move.l  RastPort,a1
         move.l  Pointer,a0          ;Textanfang
         move.l  GfxBase,a6
         jsr     Text(a6)            ;Text ausgeben

;----Ordnungsgemäß aus dem CLI aussteigen-----------------------------

end:     clr.l   d1                  ;Return-Code = 0 (kein Fehler)
end2:    move.l  $4,a6
         move.l  IntBase,a1
         jsr     CloseLib(a6)        ;Intuition.Library schließen
         move.l  GfxBase,a1
         jsr     CloseLib(a6)        ;Graphics.Library schließen
         move.l  DosBase,a6
         jsr     Exit(a6)            ;beenden
         rts

;----Dezimalzahl auswerten--------------------------------------------

getdez:  cmp.b   #32,(a0)+           ;Leerzeichen überlesen
         beq     getdez
         subq.l  #1,a0
         move.l  #2,d1               ;Ziffernzähler setzen
         clr.l   d0
         clr.w   Numbers
loop2:   move.b  (a0)+,d0            ;nächstes Zeichen holen
         cmp.b   #13,d0              ;Carriage_Return ?
         beq     ready               ;dann keine Ziffer mehr
         cmp.b   #44,d0              ;Komma ?
         beq     back                ;dann keine Ziffer mehr
         lea     Numbers,a1          ;Basisadresse der Ziffernspeicher
         add.l   d1,a1
         sub.l   #48,d0              ;ASCII-Code - 48 = Zifferwert
         move.b  d0,(a1)             ;Ziffer abspeichern
         dbra    d1,loop2            ;D1 dekrementieren / D1 = 0 ?
         bra     ready
back:    subq.l  #1,a0               ;A0 wieder auf Komma biegen
ready:   addq.w  #1,d1
         clr.l   d0
         cmp.b   #3,d1               ;D1 noch 2 ?
         bne     cont
         add.l   #4,a7               ;ja, dann keine Ziffer gefunden
         bra     error               ;-> Fehler
cont:    lea     Muls,a2             ;Basisadresse der Multiplikatoren
         add.l   d1,a2
         lea     Numbers,a1
         clr.l   d0
         clr.l   d1
         clr.l   d2
         move.b  2(a1),d0            ;/Beide Bytes holen, damit wort-
         move.b  (a2),d1             ;\weise multipliziert werden kann
         mulu    d1,d0               ;1. Ziffer * Multiplikator
         addq.l  #1,a2
         move.b  1(a1),d1
         move.b  (a2),d2
         mulu    d2,d1               ;2. Ziffer (falls vorhanden)
         add.w   d1,d0
         move.b  (a1),d1
         add.w   d1,d0               ;+ 1. Ziffer (falls vorhanden)
         rts                         ;zurück (D0 enthält Dezimalzahl)

;----Auf Komma prüfen-------------------------------------------------

chkcom:  cmp.b   #32,(a0)+           ;Leerzeichen überlesen
         beq     chkcom
         subq.l  #1,a0
         cmp.b   #44,(a0)+           ;kommt Komma ?
         beq     ok                  ;ja, dann zurück
         add.l   #4,a7               ;Stapelzeiger zurückstellen
         bra     error
ok:      rts
;----Fehler (und beenden)---------------------------------------------

error:   move.l  #1,d1               ;Return-Code = 1 (Fehler)
         bra     end2

;---------------------------------------------------------------------
   even
DosName:  dc.b "dos.library",0
DosBase:  dc.l 0
GfxName:  dc.b "graphics.library",0,0
GfxBase:  dc.l 0
IntName:  dc.b "intuition.library",0
IntBase:  dc.l 0
Pointer:  dc.l 0
RastPort: dc.l 0
Numbers:  dc.b 0,0,0                ;Ziffernspeicher
Muls:     dc.b 100,10,1,1           ;Multiplikatoren
APen:     dc.b 0                    ;Zwischenspeicher für Vor.gr.farbe
