;»»»»»»»»»»»»»»»»»»»»»» COLOR nr,rgb nr,rgb ...«««««««««««««««««««««««
;»                                                                   «
;»        Ändert den Inhalt mehrer Farbregister vom CLI aus.         «
;»                                                                   «
;» Parameter: nr = 2-stellige Nummer  | rgb = 3-stellige Hexzahl für «
;»                 des Farbregisters: |       die Farbmischung       «
;»                 00 - 31            |       Ziffern: 0-9, dann A-F «
;»                                                                   «
;» Zwischen einem Parametersatz (nr,rgb) und dem nächsten muß 1 Leer-«
;» zeichen stehen !                                                  «
;» Erstellt mit dem SEKA-Assembler.                                  «
;»                                                                   «
;»                    © 199O by  Michael Gottwald                    «
;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»«««««««««««««««««««««««««««««««««««

   OpenLib  = -408
   CloseLib = -414
   SetRGB4  = -288
   Exit     = -144

run:

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

         move.l  a0,Pointer        ;Zeiger auf Parametertext retten
         subq    #1,d0
         beq     error             ;keine Parameter ? - dann Fehler
         move.l  $4,a6             ;Exec_Base holen
         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 ViewPort holen und ablegen-----------------------------

         move.l  d0,a0
         move.l  $38(a0),a0        ;Aktuellen Screenhandle holen
         add.l   #$2c,a0           ;...auf ViewPort biegen...
         move.l  a0,ViewPort       ;...und ablegen

;----Erstes Zeichen suchen und auf Ende ("CR" Code 13) prüfen---------

look:    move.l  Pointer,a0        ;Zeiger auf Parametertext holen
loop:    cmp.b   #32,(a0)+         ;Leerzeichen überlesen
         beq     loop
         subq.l  #1,a0
         cmp.b   #13,(a0)          ;CR-Code (RETURN) gefunden ?
         beq     end               ;ja, dann beenden

;----Parameter auswerten----------------------------------------------

         move.l  #0,a1    
         bsr     getchar           ;Ziffer auswerten
         mulu    #10,d0            ;erste Ziffer = Zehner
         exg     d0,a1             ;nach A1 retten
         bsr     getchar           ;Einer holen
         add.l   d0,a1             ;in A1 steht nun die Farbreg.nr.

         cmp.b   #44,(a0)+         ;auf Komma prüfen
         bne     error             ;falls nicht gefunden, Fehler
         bsr     gethex            ;Hexzahl-Ziffer auswerten
         exg     d0,d1             ;Rot-Wert nach D1
         bsr     gethex            ;nächste Ziffer...
         exg     d0,d2             ;Grün-Wert nach D2
         bsr     gethex            ;letzte Ziffer...
         exg     d0,d3             ;Blau-Wert nach D3
      
         move.l  a0,Pointer        ;Zeiger retten
         exg     a1,d0             ;Farbregisternummer nach D0
         move.l  GfxBase,a1        ;Endadresse der Graphics-Lib. holen
         move.l  ViewPort,a0       ;Zeiger auf ViewPort...
         jsr     SetRGB4(a1)       ;Farbregister ändern
brk:     jmp     look              ;Nächsten Parametersatz oder Ende
                                   ;suchen

;----Dezimalziffer holen und überprüfen-------------------------------

getchar: clr.l   d0
         move.b  (a0)+,d0          ;Zeichen (Ziffer) holen
         cmp.b   #47,d0            ;Zeichencode >= 48 ("0") ?
         bls     error             ;<= 47, dann Fehler
         cmp.b   #57,d0            ;Zeichencode <= 57 ("9") ?
         bgt     error             ;> 57, dann Fehler
         sub.l   #48,d0            ;Zeichencode - 48 = Ziffernwert
         rts

;----Hexadezimalziffer holen und überprüfen---------------------------

gethex:  clr.l   d0
         move.b  (a0)+,d0
         cmp.b   #47,d0
         bls     error
         cmp.b   #57,d0
         bgt     chkhex            ;auf Hexadezimal (A-F) prüfen
         sub.l   #48,d0
         rts
chkhex:  cmp.b   #64,d0            ;Zeichencode >= 65 ("A") ?
         bls     error             ;kleiner, dann Fehler
         cmp.b   #70,d0            ;<= 70 ("F") ?
         bgt     little            ;> 70, dann auf Kleinbuchst. prüfen
         sub.l   #55,d0            ;Zeichencode - 55 = Ziffernwert
         rts
little:  cmp.b   #96,d0            ;<= 96 ("a") ?
         bls     error
         cmp.b   #102,d0           ;<= 102 ("f") ?
         bgt     error
         sub.l   #87,d0
         rts

;----Librarys schließen-----------------------------------------------

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)              ;Ende des Programms
         rts

;----Ende (alles o.k.)------------------------------------------------

end:     clr.l   d1                ;Return-Code = 0 (kein Fehler)
         bra     end2

;----Fehler (und beenden)---------------------------------------------

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

;---------------------------------------------------------------------
  even
IntName:  dc.b "intuition.library",0
IntBase:  dc.l 0
GfxName:  dc.b "graphics.library",0,0
GfxBase:  dc.l 0
DosName:  dc.b "dos.library",0
DosBase:  dc.l 0
ViewPort: dc.l 0  
Pointer:  dc.l 0
