-----------------------------------------------------------------
        136 VERSCHILLENDE KLEUREN MET SLECHTS 4 BITPLANES
-----------------------------------------------------------------

Een van de dingen  die je bij het programmeren van de Amiga zeker
wilt  gebruiken zijn kleuren.  Heb je meer kleuren nodig dan voeg
je  eenvoudig een  bit-plane toe  aan  het scherm  en het  aantal
kleuren zijn  verdubbeld.  Er is echter een limiet. Kom je bij 32
kleuren,  5 bit-planes,  dan is het officieel op.  Met wat moeite
is het  mogelijk een  zesde bit-plane aan te maken,  maar je hebt
dan nog  steeds 32 kleuren  met 32 schaduw-kleuren.  Een alterna-
tief is dan nog de  HAM-mode met 4096 kleuren,  maar dat kost erg
veel geheugen en is moeilijk te behandelen.

Dit keer  wil ik het hebben  over een alternatief dat 136 kleuren
kan laten zien, tegelijk,  op slechts 4 bit-planes. Tevens is dit
vanuit AmigaBasic eenvoudig te programmeren.

Het idee is het volgende.  Een schilder maakt nieuwe kleuren door
twee  bestaande  kleuren te mixen.  Ook met licht kun je  kleuren
mixen. Rood en blauw licht geeft paars, rood  en groen geeft geel
en groen en blauw levert cyaan op.

Op  de  computer kunnen  we echter  een pixel  geen twee  kleuren
geven. wat we wel kunnen  doen is pixels naast  elkaar een andere
kleur geven waardoor,  voor onze ogen, een andere kleur ontstaat.
Dit effect  wordt beter  naarmate de  resolutie hoger  wordt.  De
pixels liggen dan dichter bij elkaar.

Laten  we eens  een patroon  bekijken dat  bestaat uit de kleuren
rood (1) en blauw (0) :

   10101010101010101010101010
   01010101010101010101010101
   10101010101010101010101010
   01010101010101010101010101

enz.

U ziet dat naast elke 1 een 0 staat aan alle  vier de kanten. Dit
laat ons paars zien op het scherm.

Het onderstaande  programma is een programma  dat deze combinatie
laat zien. Het staat op de diskette onder de naam PRG01.

   DIM P%(1)

   PALETTE 3,1,0,0  : REM ROOD
   PALETTE 2,0,0,1  : REM BLAUW
   PALETTE 1,1,1,1  : REM WIT
   PALETTE 0,0,0,0  : REM ZWART

   LINE (100,50)-(200,150),1,b
   LINE (250,50)-(350,150),1,b
   LINE (400,50)-(500,150),1,b

   PAINT (1,1),2,1
   PAINT (101,51),3,1

   P%(0)=&HA5A5
   P%(1)=&H5A5A
   PATTERN ,P%

   PAINT (401,51),3,1

   P%(0)=&HFFFF
   P%(1)=&HFFFF
   PATTERN ,P%


Dit programma  tekent met het LINE-kommando drie vlakken.  Via de
eerste twee  PAINT-kommando's  worden de rode  en blauwe  vlakken
gevuld. Daarna wordt het patroon gezet met het PATERN-kommando en
het derde vlak wordt gevuld met een kombinatie van rood en blauw,
paars.

U zult  zien dat  het effect  erg mooi is.  Vooral  omdat we  het
normale  AmigaBasic-scherm  gebruiken met een  resolutie van  640
bij 200.  Probeer het effect zelf maar eens met een resolutie van
320 by 200, in lo-res.  U moet daarvoor een scherm en een venster
aanmaken.

Laten we even het PATERN-kommando bekijken :

PATTERN Patroon%

Hierbij is  Patroon% een 16-bit getal  waarin het  patroon staat.
Je moet  daarvoor in het twee-tallig stelsel denken.  Een massief
patroon is dan : 1111111111111111.

AmigaBasic is echter niet  geschikt om in het twee-tallig stelsel
te werken.  Echter wel het zestien-tallig stelsel.  Daarin tellen
we van 0 tot 15 met de volgende cijfers :

0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f

Om  een getal  in het  twee-tallig stelsel  om te zetten naar het
zestien-tallig  stelsel moet  je groepjes  van 4 bits  bij elkaar
zetten :

     1111  1111  1111  1111      = massief
      F     F     F     F

     1111  0000  1111  0000      = stippellijn
      F     0     F     0

Nu moet je er &H voor zetten  zodat Amigabasic weet dat je in het
zestien-tallig stelsel werkt.

Het PATERN-kommando wordt dan :

     PATERN &HF0F0

Dit  PATERN-kommando  maakt lijnen met  een patroon. Omdat we een
vlak willen vullen  met verschillende  lijnen  moeten we een iets
andere versie van het PATERN-kommando gebruiken.  Uiterlijk is er
niets  anders, we werken  echter met  een array  i.p.v. een  een-
voudige variabele.
Willen we een eenvoudig schaakbord-patroon maken :

     1111000011110000
     1111000011110000
     0000111100001111
     0000111100001111

Om  dit op  het scherm  te kunnen  zetten moeten  we het volgende
doen :

   DIM P%(3)
   P%(0)=&HF0F0
   P%(1)=&HF0F0
   P%(2)=&H0F0F
   P%(3)=&H0F0F
   PATERN ,P%

Hebben we nu een  2-bit-plane scherm dan kunnen  we kiezen uit 10
verschillende patronen : 0, 1, 2, 3, 01, 02, 03, 12, 13 en 23.
3 Bit planes maakt zo 36  kleuren mogelijk en  4 bit planes geeft
136 kleuren.
Gaan  we in lo-res  werken dan levert 5 bit-planes 528  verschil-
lende kleuren.

Laten we het demo-programma maar  eens bekijken dat als  PRG02 op
de diskette staat :

Het openen van het scherm :

   SCREEN 1,640,200,4,2
   WINDOW 2,,(0,0)-(631,186),0,1

   DEFINT a-z

   DIM Patroon(1)

De kleuren instellen die anders zijn dan standaard :

   PALETTE 4,.6,0,0
   PALETTE 5,1,1,.1
   PALETTE 7,.4,.4,.4
   PALETTE 10,.7,.7,.7
   PALETTE 11,.3,.3,0
   PALETTE 12,1,0,0
   PALETTE 13,0,.6,0
   PALETTE 14,0,0,1
   PALETTE 15,1,0,1

Het aanmaken van drie vlakken :

   FOR x=0 TO 629 STEP 37
       LINE (x,0)-(x,184),2
   NEXT x

   FOR y=0 TO 184 STEP 23
       LINE (0,y)-(629,y),2
   NEXT y

De eerste kleuren neerzetten :

   FOR x=1 TO 556 STEP 37
       PAINT (x,1),c,2
       c=c+1
   NEXT x

Het patroon instellen :

   Patroon(0)=&HAAAA
   Patroon(1)=&H5555
   PATTERN ,Patroon

   Vulroutine 593,1,0,1

De speciale kleuren neerzetten :

   x=1:y=24:c1=0:c2=2
   WHILE count <= 118
         ColorCycle c1,c2
         Vulroutine x,y,c1,c2
         x=x+37:IF x > 593 THEN x=1
         y=y+23:IF y > 162 THEN y=24
         count=count+1
   WEND

Het patroon weer terugzetten :

   Patroon(0)=&HFFFF
   Patroon(1)=&HFFFF
   PATTERN ,Patroon
   END

Deze subroutine zet de juiste kleur en vult een vlak :

   SUB Vulroutine (x,y,Clr1,Clr2) STATIC
       COLOR Clr1,Clr2
       PAINT (x,y),Clr1,2
   END SUB

Deze subroutine zorgt dat de volgende kleur aan de beurt komt :

   SUB ColorCycle (c1,c2) STATIC
       c2=c2+1
       IF c2 > 15 THEN
          c1=c1+1
          IF c1 > 15 THEN c1=0
          c2=c2+1
       END IF
       IF c2 > 15 THEN c2=0
   END SUB

-----------------------------------------------------------------

Programma's bij deze tekst :

   PRG01 - PRG02

Subroutine bij deze tekst :

   SBR01

-----------------------------------------------------------------
