*** HANDLEIDING van MDL-LIB version 1.0 ***

- COPYRIGHT 1990 BY MDL-SOFT -

GRAPMSX.TXT: Uitleg van de grafische routines in de bestanden
GRAPMSX1.LIB en GRAPMSX2.LIB.

Als  u dit nog niet gedaan heeft, lees dan eerst het  bestand
INLEIDNG.TXT!

Dit  bestand bevat uitleg van de grafische routines voor MSX1
en  MSX2,  die  over twee bestanden zijn  verdeeld.  De  MSX1
routines  werken alleen op scherm 0 t/m 3, en het MSX2 scherm
4. De MSX2 routines werken alleen op scherm 5 t/m 8 (op MSX2+
misschien  ook  op  hogere schermen, dit heb ik  niet  kunnen
checken).

Bij   dit  bestand  staat  vermeld  op  welke   computer   de
desbetreffende opdracht werkt. Alles wat op MSX2 werkt, werkt
uiteraard  ook  op MSX2+ (als het goed is).

Veel  procedures uit deze bestanden werken precies  hetzelfde
als  op  de PC. Dit vergemakkelijkt het  overzetten  van  PC-
programma's  in  Turbo  Pascal naar MSX. (De  syntax  heb  ik
gehaald  uit  het  boek Turbo Pascal  Compleet,  dat  bij  de
compiler wordt meegeleverd).

Dan volgt nu de uitleg per procedure.

----

Naam      : Draw
Actie     : Trekt een lijn
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Draw(x1,y1, x2,y2, kleur:integer);
Basic     : LINE(x1,y1)-(x2,y2),kleur

Deze  procedure trekt een lijn van punt (x1,y1) naar  (x2,y2)
op  het  grafische scherm (met een nummer hoger  dan  1).  De
kleur waarin getekend wordt, staat gecodeerd in 'kleur'.
Bedenk,  dat punt (0,0) op het grafische scherm linksboven en
niet rechtsboven is, en dat punt (0,10) dus ONDER punt  (0,0)
ligt.

----

Naam      : DrawTo
Actie     : Trekt een lijn vanaf laatst getekende punt
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure DrawTo(x,y, kleur:integer);
Basic     : LINE -(x,y),kleur

Deze procedure trekt een lijn vanaf het laatst getekende punt
naar het punt (x,y). Verder zie Draw.

----

Naam      : Plot
Actie     : Tekent een punt
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Plot(x,y, kleur:integer);
Basic     : PSET(x,y),kleur

Deze  procedure  tekent  een  punt op  (x,y),  met  de  kleur
'kleur'. Verder zie Draw.

----

Naam      : Ellipse
Actie     : Tekent alle soorten van ellipsen
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Ellipse(x,y, straal, kleur,
                      beginhoek,eindhoek:integer;
                      afplatting:real);
Basic     : CIRCLE(x,y),straal,kleur,beginhoek*3.1415/180,
                        eindhoek*3.1415/180,afplatting

Met deze procedure kunt u alle mogelijke soorten van ellipsen
tekenen (vandaar het grote aantal parameters).
Het middelpunt van de te tekenen ellips is  punt  (x,y),  dat
meteen ook als laatst getekende punt wordt gebombardeerd (zie
DrawTo). De ellips wordt getekend met een straal 'straal' (in
beeldpunten), en met een kleur gecodeerd in 'kleur'.
Het is mogelijk maar een deel van de ellips  te  tekenen.  In
'beginhoek' en 'eindhoek' dienen de beginhoek en de  eindhoek
in graden te worden opgegeven (en NIET in radialen, zoals  in
Basic). Het  punt  0  zit  rechts  op  de  ellips  (en  niet
bovenaan). Dit is in Basic ook zo.
Als  een  gradennummer  als negatief getal  wordt  opgegeven,
wordt het gewoon behandeld als positief getal, maar vanaf het
opgegeven  punt  wordt een lijn getekend naar het  middelpunt
van de cirkel. Erg handig voor het tekenen van  Pacmannetjes:
Ellipse(128,96, 15, -320,-40, 1) bijvoorbeeld.
De  laatste parameter is een real en bevat de afplatting  (of
uitrekking) van de ellips. 1 is 'normaal': de vervorming  van
de  ellips is afhankelijk van de breedte en de hoogte van  de
beeldpuntjes.  Groter dan 1 is een 'uitrekking' (bijv.  1.6),
kleiner is een 'afplatting' (bijv. 0.4).

----

Naam      : Arc
Actie     : Tekent een boog
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Arc(x,y, hoek, straal, kleur:integer);
Basic     : geen

Met  deze  procedure  kunt u een boog tekenen,  beginnend  op
(x,y),  over  een hoek 'hoek' (negatief = tegen de  klok  in,
positief  =  met  de klok mee), met een straal  'straal'  (in
beeldpunten) en met een kleur gecodeerd in 'kleur'.

----

Naam      : Circle
Actie     : Tekent een cirkel
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Circle(x,y, straal, kleur:integer);
Basic     : CIRCLE(x,y),straal,kleur

Deze  procedure tekent een cirkel met middelpunt  (x,y),  met
een   straal  'straal'  (in  beeldpunten)  en  in  een  kleur
gecodeerd  in  'kleur'.  Het  middelpunt  wordt  het   laatst
getekende punt (zie DrawTo).

----

Naam      : GetDotColor
Actie     : Leest kleurcode van een punt
Computer  : MSX1 en MSX2
Soort     : Functie
Declaratie: Function GetDotColor(x,y:integer):integer;
Basic     : POINT(x,y)

Deze functie geeft de kleurcode van het punt op (x,y) terug.

----

Naam      : Box
Actie     : Tekent een rechthoek
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Box(x1,y1, x2,y2, kleur:integer);
Basic     : LINE(x1,y1)-(x2,y2),kleur,B

Deze   procedure  tekent  een  rechthoek,  als  twee   schuin
tegenover elkaar liggende punten daarvan worden opgegeven  in
(x1,y1) en (x2,y2). Verder hetzelfde als DRAW.

----

Naam      : FillBox
Actie     : Tekent een ingekleurde rechthoek
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure FillBox(x1,y1, x2,y2, kleur:integer);
Basic     : LINE(x1,y1)-(x2,y2),kleur,BF

Deze  procedure  tekent een ingekleurde rechthoek, als   twee
schuin   tegenover  elkaar  liggende  punten  daarvan  worden
opgegeven  in (x1,y1) en (x2,y2). Dit gaat veel  sneller  dan
een  combinatie Box-Fillshape (zie aldaar). Verder  hetzelfde
als DRAW.

----

Naam      : Logical
Actie     : Stelt logische operatie in
Computer  : MSX2
Soort     : Procedure
Declaratie: Procedure Logical(opr:byte);
Basic     : grafische opdracht met daarachter naam operatie

Deze  procedure  stelt  een logische operatie  in  voor  alle
tekenopdrachten  bevalve  Ellipse, Arc, Circle en  FillShape.
Als  een logische operatie is ingesteld, wordt  die  operatie
per  puntje  dat  getekend  wordt uitgevoerd met  de  bij  de
tekenopdracht  opgegeven  kleur  en de  oude  kleur  van  dat
beeldpuntje.
De operatie staat als volgt gecodeerd in 'opr':

 0= PSET (normale situatie)
 1= AND
 2= OR
 3= XOR
 4= NOT
 8=TPSET
 9=TAND
10=TOR
11=TXOR
12=TNOT

De  logische  operaties zijn dezelfde als die bij  de  Basic-
opdrachten, dus die worden hier niet uitgelegd.

----

Naam      : FillScreen
Actie     : Vult het scherm
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure FillScreen(kleur:integer);
Basic     : geen

Met  deze  procedure vult u het hele scherm in  de  opgegeven
kleur.  Vooral  handig  met  logische  operaties  (MSX2,  zie
Logical).

----

Naam      : FillShape
Actie     : Kleurt vlak in
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure FillShape(x,y, verf, rand:integer);
Basic     : PAINT(x,y),verf,rand

Deze  procedure vult een gesloten vlak van  een  willekeurige
vorm  vanaf (x,y) met de kleur 'verf'. 'rand' is de kleur van
het in te kleuren figuur. Deze parameter heeft in de schermen
2 en 4 geen functie, in verband met de manier van opslaan van
de  grafische  data in het Video RAM. 'rand' is  daar  altijd
gelijk aan 'verf', ook als u een andere kleur opgeeft.
Denk  eraan,  dat de figuur HELEMAAL gesloten moet zijn  (n
piepklein gaatje is genoeg om het mis te laten gaan),  anders
wordt het hele scherm ingekleurd.

----

Naam      : Pattern
Actie     : Definiert een 8x8 patroon
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Pattern(p : Pattern_Type);
Basic     : geen

Met  deze procedure kunt u een patroon definiren, dat  later
in  een vlak met FillPattern op het scherm gezet kan  worden.
Pattern_Type   is   in  de  library-file   gedefinieerd   als
ARRAY[0..7] OF BYTE.
Met  het array P wordt een 8x8 matrix gedefinierd. Elk  byte
uit  het  array correspondeert namelijk met een rij of  regel
uit  die matrix en elk bit binnen dat byte met een  kolom  in
die  rij:  een pixel op het scherm. Het array kan dus  worden
opgegeven als een reeks van 8 hexadecimale getallen,  waarbij
elk getal een weergave is van een bitpatroon. Een voorbeeld:

* - - - - - - *    10000001    $81
- * - - - - * -    01000010    $42
- - * - - * - -    00100100    $24
- - - * * - - -    00011000    $18
- - - * * - - -    00011000    $18
- - * * * * - -    00111100    $3C
- * * - - * * -    01100110    $66
* * * - - * * *    11100110    $E7

Dit patroon, of figuurtje, kan als volgt worden gedefinieerd:

Const Figuur : Pattern_type =
       ($81,$42,$24,$18,$18,$3C,$66,$E7);

Bij  gebruik  van dit patroon door de  procedure  FillPattern
wordt op elk punt waarvan het bit 1 is een punt gezet; op  de
punten waarvan het bit 0 is wordt niets gezet, daar blijft de
oude kleur dus behouden.

----

Naam      : FillPattern
Actie     : Vult een vlak met een patroon
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure FillPattern(x1,y1, x2,y2,
                                  kleur:integer);
Basic     : geen

Deze  procedure  werkt precies hetzelfde als FillBox,  alleen
wordt  nu in het met Pattern gedefinieerde patroon  gekleurd,
in de kleur 'kleur'. Verder zie FillBox.
(Dit  gaat  overigens niet al te snel. Op MSX2 zou u  CopyPic
ter versnelling kunnen gebruiken,  door  eerst  een  deel  te
tekenen, en dat deel daarna met CopyPic te vermenigvuldigen).

----

Naam      : Gwrite
Actie     : Schrijft tekst op het grafische scherm
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Gwrite(x,y:integer; tekst:libstr);
Basic     : OPEN "GRP:" AS #1:PRINT #1,"tekst"

In  Pascal  met MDL-lib is het mogelijk gewoon met  Write  en
WriteLn  op  het grafische scherm te schrijven, maar  dan  in
stappen  van  6x8 puntjes en niet al te snel (als u  aan  het
begin   van uw programma {$C-} opneemt gaat het al een   stuk
sneller).
Met   Gwrite  kunt  u  tekst  sneller  schrijven,  vanaf   de
coordinaten  (x,y). LibStr is een in MDLLIB.LIB  gedefinieerd
type,  dat als een string is gedefinieerd waarvan u de lengte
aan  uw  eigen wensen kunt aanpassen. In  de  oorspronkelijke
versie  is  LibStr  als STRING[80] gedefinieerd, maar  als  u
zoveel tekens niet nodig heeft, kunt u  hem beter wat  korter
maken.

----

Naam      : SetPage
Actie     : Stelt schermpagina's in
Computer  : MSX2
Soort     : Procedure
Declaratie: Procedure SetPage(projectie,werk:byte);
Basic     : SET PAGE projectie,werk

De MSX2 computer heeft een zo groot  video-geheugen,  dat  er
gegevens van meerdere beeldschermen tegelijk in kunnen worden
bewaard. Onder scherm 5 t/m 8  kunnen,  afhankelijk  van  het
beschikbare  video-geheugen,  het  volgende  aantal  schermen
worden opgeslagen:

schermmode | 64KB VRAM | 128KB VRAM
-----------+-----------+-----------
     5     |     2     |     4
     6     |     2     |     4
     7     |     1     |     2
     8     |     1     |     2

De eerste parameter  van  SetPage  geeft  aan,  welk  van  de
beschikbare beeldschermen dient te worden  geprojecteerd.  De
tweede parameter  geeft  aan,  op  welk  van  de  beschikbare
beeldschermpagina's  eventuele  grafische  commando's  moeten
worden  uitgevoerd.  Het  is  dus  mogelijk   dat   het   ene
beeldscherm  wordt  geprojecteerd  terwijl  op   het   andere
beeldscherm wordt getekend!
Overigens, het maximale paginanummer is altijd gelijk aan het
aantal  pagina's minus n, aangezien de eerste pagina nummer
0  heeft.  Bij  een ScrMode opdracht wordt alleen  de  eerste
pagina  (nummer  0 dus) schoongemaakt, de  andere  pagina('s)
blijft/blijven behouden.

----

Naam      : GetPic
Actie     : Copieert grafische data in een variabele
Computer  : MSX2
Soort     : Procedure
Declaratie: Procedure GetPic(x1,y1, x2,y2:integer; var
                      buffer);
Basic     : COPY(x1,y1)-(x2,y2) TO buffer

Met  deze procedure kunt u een deel van een  grafisch  scherm
(met nummer 5, 6, 7 of 8), aangegeven door (x1,y1)-(x2,y2) op
dezelfde manier als bij Box (zie aldaar), naar een  variabele
copieren.  DEZE  VARIABELE  MOET GROOT GENOEG  ZIJN,  anders
slaat uw computer op tilt!

Formules  voor  de  grootte van de variabele  per  scherm  in
bytes:

Scherm 6     : grootte = (hrzpxl div 4)*vrtpxl+5
Scherm 5 of 7: grootte = (hrzpxl div 2)*vrtpxl+5
Scherm 8     : grootte = hrzpxl*vrtpxl+4

Hierbij  is hrzpxl het AANTAL pixels in horizontale richting,
en vrtpxl het AANTAL pixels in verticale richting.

----

Naam      : PutPic
Actie     : Plaatst plaatje uit variabele op scherm
Computer  : MSX2
Soort     : Procedure
Declaratie: Procedure PutPic(var buffer; x,y:integer);
Basic     : COPY buffer TO (x,y-<hoogte figuur>)

Deze  procedure  zet een door GetPic in een  variabele  gezet
plaatje  weer terug op het grafische scherm. (x,y) definiren
hier  de  LINKERBENEDENHOEK van het plaatje  en  NIET,  zoals
normaal,  de  linkerbovenhoek,  om de  PC-compatibiliteit  te
handhaven.

----

Naam      : CopyPic
Actie     : Copiert plaatje van ene deel scherm naar ander
            deel scherm, of van het ene scherm naar het andere
            scherm
Computer  : MSX2
Soort     : Procedure
Declaratie: Procedure CopyPic(x1,y1, x2,y2, sourcepage,
                      xd,yd, destpage:integer);
Basic     : COPY (x1,y1)-(x2,y2),sourcepage   TO
                      (xd,yd),destpage

Met deze procedure kunt u grafische plaatjes van het ene deel
van  het scherm naar het andere deel van het scherm copiren,
of  van het ene scherm naar het andere scherm. De  parameters
zijn als volgt:

(x1,y1)-(x2,y2)   definiren  het  vlak  waarbinnen  het   te
copiren plaatje ligt, zoals bij Box (zie aldaar).

'sourcepage'  is het paginanummer (zie  SetPage)  waarvandaan
gecopierd  wordt.  Als hier een waarde kleiner dan  0  wordt
opgegeven, dan wordt hiervoor de huidige werkpagina genomen.

(xd,yd) definiren de linkerbovenhoek van de plaats waar  het
plaatje heen dient te worden gecopierd.

'destpage'  is de pagina waarheen gecopierd dient te worden.
Ook  hier  geldt,  dat  als een  waarde  kleiner  dan 0 wordt
gegeven,  dat  dan  de  huidige  werkpagina  hiervoor   wordt
genomen.

----

Naam      : gml
Actie     : Voert Graphic Macro Language commando's uit
Computer  : MSX1 en MSX2
Soort     : Procedure
Declaratie: Procedure Gml(commands:libstr);
Basic     : DRAW "commands"

Met  deze procedure kunt u grafische nletter-commando's  in
stringvorm  uitvoeren,  net zoals dat in Basic  gaat  (alleen
dienen  hier enkele i.p.v. dubbele aanhalingstekens  gebruikt
te  worden).  Kijkt u in een Basic-handboek onder  het  DRAW-
commando hoe u deze commando's moet gebruiken.

Gebruik  in Pascal NOOIT het X...; en het =...; commando,  om
variabelen in te voegen. Hier voegt u immers Basic-variabelen
in,   en  geen Pascal-variabelen. Gebruik CONCAT  i.p.v.  het
X...;  commando,  en  STR (of FormatNumber uit  MISC.LIB)  en
CONCAT i.p.v. het =...; commando.

Voorbeelden:

gml('m100,100u20r20d20l20');

stringvar:='bm100,100e10f10g10h10'; gml(stringvar);

intvar := 125;
str(intvar,stringvar);
gml('bm50,50d'+stringvar+'r50');

Als u de commando's verkeerd gebruikt, kan het gebeuren dat u
de volgende melding op uw scherm ziet verschijnen:

BASIC ERROR 5
PROGRAM ABORTED

Dit  is  de beveiliging in de procedure CalBas  tegen  Basic-
foutmeldingen  (zie MDLLIB.TXT). En het klopt: fout nummer  5
is  inderdaad  de  Illegal Function Call, die Basic  in  zo'n
geval gegeven zou hebben.

----

*** EINDE GRAPMSX.TXT ***
                             