*** HANDLEIDING MDL-LIB ***

- COPYRIGHT 1990 BY MDL-SOFT -

Uitleg voor de bestanden VRAM1 en VRAM2.

Als u dit nog niet gedaan heeft, lees dan eerst de  inleiding
(INLEIDNG.TXT)!

Bij deze uitleg wordt vermeld of een bestand alleen op  MSX2,
of op MSX1 en MSX2 werkt. Werkt een procedure op MSX1 en  -2,
dan staat hij in VRAM1 en VRAM2, werkt hij  alleen  op  MSX2,
dan staat hij in VRAM2.
Bedenk wel, dat van de MSX1 routines MSX2  versies  in  VRAM2
staan, die NIET op MSX1 gebruikt kunnen worden. Denk  hieraan
als u op een MSX2 programma's voor MSX1 schrijft.
Alles wat op MSX1 en MSX2 werkt, werkt uiteraard ook op MSX2+
(als het goed is).

----

Naam      : Base
Computer  : MSX1 en MSX2
Actie     : geen
Soort     : Array-systeem-variabele
Declaratie: Var Base:array[0..19] of integer absolute $F3B3;
Basic     : BASE

In  deze systeemvariabele staan de Video RAM-adressen van  de
tabellen  in dat Video RAM. Zowel op MSX1 als op MSX2  kunnen
slechts   base[0]   t/m   base[19]  worden   afgevraagd,   in
tegenstelling  tot  in BASIC. Dit wil zeggen, dat slechts  de
adressen  van  scherm 0 t/m 3 kunnen  worden  afgevraagd.  De
adressen  van  scherm  4 zijn gelijk aan die  van  scherm  2,
behalve  de  transparant tabel. De rest van de  adressen  van
scherm  4 t/m 8 liggen vast en kunnen niet veranderd  worden.
De  adressen  van deze tabellen dient u ergens anders  op  te
zoeken.

De 'basis'-indexen van dit array zijn als volgt:

base[0] = scherm tabel
base[1] = kleur tabel
base[2] = matrix (=karakter) tabel
base[3] = sprite transparant tabel
base[4] = spritevorm tabel

Wilt  u  van een bepaald schermtype het adres van  een  tabel
weten,   dan  dient  u  5 maal  het  schermnummer   bij   het
tabelnummer  op  te tellen. B.v. de sprite transparant  tabel
van scherm 2 kunt u opvragen d.m.v. base[3+5*2]=base[13].

De  adressen in deze variabelen kunnen ook veranderd  worden,
wijzigingen worden echter pas daadwerkelijk doorgevoerd nadat
een ScrMode (Basic:SCREEN) opdracht is gegeven.

----

Naam      : LeftTextPos
Computer  : MSX1 en MSX2
Actie     : geen
Soort     : Systeem-variabele
Declaratie: var LeftTextPos : integer absolute $F9F5;
BASIC     : Geen

In MDL-LIB kunt u gewoon met Write en WriteLn op een grafisch
scherm schrijven, net als op de PC. Deze variabele  bevat  de
X-cordinaat van karakter (1,1) op het scherm in beeldpunten.
De default waarde is  0,  na  iedere  ScrMode  (Basic:SCREEN)
opdracht krijgt deze variabele  deze  waarde.  Door  hem  een
andere waarde te geven, kunt u nauwkeurig de X positie van de
tekst bepalen.

----

Naam      : ScrMode
Computer  : MSX1 en MSX2
Actie     : Stelt schermtype in
Soort     : Procedure
Declaratie: Procedure ScrMode(mode:byte);
BASIC     : SCREEN

Met deze procedure kunt u een bepaald scherm-type  instellen,
waarvan het  codenummer  opgegeven  dient  te  worden  in  de
parameter genaamd 'mode'. Omdat de nummers  precies  dezelfde
zijn als in BASIC, verwijs ik u hierbij naar een  willekeurig
BASIC handboek. Kijkt  u  bij  de  eerste  parameter  van  de
SCREEN-opdracht.
Nog  een  opmerking:  op  grafische schermen  is  het  gewoon
mogelijk  om met Write en WriteLn te schrijven, ook  Read  en
ReadLn,  GotoXY  en ClrScr kunnen zonder  problemen  gebruikt
worden.
P.S.  Een klein bugje zorgt ervoor dat de computer reset, als
u  een WRITE(CHR(127)) uitvoert. Echter, in de praktijk  komt
zoiets zelden of nooit voor.

----

Naam      : TextMode
Computer  : MSX1 en MSX2
Actie     : Stelt laatst gebruikte tekstscherm in
Soort     : Procedure
Declaratie: Procedure TextMode;
Basic     : geen

Deze  procedure stelt, vanuit een grafisch scherm, het laatst
gebruikte  tekstscherm  in, d.w.z.  scherm  0 of  1.  Als  de
computer al  in  een grafisch scherm staat als deze procedure
wordt aangeroepen, heeft  de procedure hetzelfde  effect  als
ClrScr.

----

Naam      : SetXY
Computer  : MSX1 en MSX2
Actie     : Stelt X- en Y-coordinaten in
Soort     : Procedure
Declaratie: Procedure SetXY(x,y:integer);
Basic     : geen

Met  deze  procedure  kunt  u  de   grafische   cursor   (die
onzichtbaar is) op de coordinaten (x,y)  positioneren.  Wordt
vooral gebruikt door andere library-functies in  GRAPMSX1  en
GRAPMSX2, maar u kunt hem zelf ook gebruiken  als  dat  nodig
is.

----

Naam      : SetColor
Computer  : MSX1 en MSX2
Actie     : Stelt grafische tekenkleur in
Soort     : Procedure
Declaratie: Procedure SetColor(kleur:byte);
Basic     : geen

Zie SetXY, alleen met de tekenkleur op het  grafische  scherm
(dit is iets anders dan de voorgrondkleur!)

----

Naam      : Color
Computer  : MSX1 en MSX2
Actie     : Stelt schermkleuren in
Soort     : Procedure
Declaratie: Procedure Color(forclr,bakclr,bdrclr:integer);
Basic     : COLOR forclr,bakclr,bdrclr

Deze  procedure stelt de schermkleuren in. De voorgrond-,  de
achtergrond-   en   de  randkleur   moeten   achtereenvolgens
gecodeerd worden opgegeven. De codenummers zijn hetzelfde als
in BASIC, dus kijkt u in een willekeurig BASIC handboek onder
de COLOR opdracht om de codenummers per schermtype te vinden.
Scherm  0 heeft geen randkleur, maar  de  syntax  van  Pascal
eist dat die wel wordt opgegeven. U kunt hem het beste gelijk
maken   aan  de  achtergrondkleur,  zodat  hetzelfde   effect
behouden blijft als u een ander schermtype instelt.
Op   een   grafisch   scherm  wordt  alleen  de     randkleur
onmiddellijk  veranderd. De voorgrondkleur is hier  de  kleur
waarin  in het vervolg getekend/geschreven zal worden, en  de
achtergrondkleur wordt pas doorgevoerd NA een ClrScr.

----

Naam      : DefColor
Computer  : MSX2
Actie     : Herdefiniert kleuren
Soort     : Procedure
Declaratie: Procedure DefColor(kleur,rood,groen,blauw:byte);
Basic     : COLOR=(kleur,rood,groen,blauw)

Met  deze procedure kunt u een zelf-samengestelde  kleur  aan
een  kleurcode  toekennen. Hij werkt exact hetzelfde  als  in
BASIC,  dus  kijkt u in een BASIC handboek  bij  de  opdracht
COLOR=.

----

Naam      : WriteVram
Computer  : MSX1 en MSX2
Actie     : Schrijft een byte in het Video RAM
Soort     : Procedure
Declaratie: Procedure WriteVram(adres:integer;data:byte);
Basic     : VPOKE adres,data

Met  deze  procedure  kunt  u  een  byte  in  het  Video  RAM
schrijven,   op  het  opgegeven  adres.  Zeer  bruikbaar   in
combinatie   met  TranspTable  etc.,  zie  verder.  Om   deze
procedure  nuttig te kunnen gebruiken, is het nodig iets  van
de  opbouw  van  het Video RAM te weten, dat echter  in  deze
handleiding niet behandeld wordt.
Er  zijn  2  versies  van deze  procedure,  in  VRAM1.LIB  en
VRAM2.LIB. Met de MSX1 versie kunt u, OOK OP MSX2, slechts de
adressen  0 t/m 16383 bereiken. Wilt u hoger, dan moet  u  de
MSX2 versie gebruiken, die echter niet op MSX1 werkt.

----

Naam      : ReadVram
Computer  : MSX1 en MSX2
Actie     : Leest een byte uit het Video RAM
Soort     : Functie
Declaratie: Function ReadVram(adres:integer):byte;
Basic     : VPEEK(adres)

Met  deze  functie kunt u een byte op adres 'adres'  uit  het
Video RAM lezen. De inhoud van dit byte wordt door de functie
teruggegeven.
Zie voor de rest WriteVram.

----

Naam      : WriteVDP
Computer  : MSX1 en MSX2
Actie     : Schrijft in een VDP register
Soort     : Procedure
Declaratie: Procedure WriteVdp(reg,data:byte);
Basic     : Register 0-7:  VDP(reg)=data
            Register 8-46: VDP(reg+1)=data

Met  deze procedure kunt u een byte naar een register van  de
VDP   (Video   Display  Processor)  schrijven,  alleen   voor
gevorderden  dus. Echter, de nummering loopt iets anders  dan
in  BASIC,  zoals u hierboven kunt zien. Bij nummers boven  7
moet u in Basic 1 bij het PASCAL-nummer optellen. (Dit  geldt
trouwens ook als u in machinetaal programmeert).
'reg'  is  hier het register waarin geschreven  moet  worden,
'data' is het te schrijven byte.
Overigens,  deze  andere nummering geldt  alleen  voor  MSX2,
aangezien MSX1 alleen de registernummers van 0 t/m 7 heeft.

----

Naam      : ReadVdp
Computer  : MSX1 en MSX2
Actie     : Leest uit een VDP register
Soort     : Functie
Declaratie: Function ReadVdp(reg:byte):byte;
Basic     : Register 0-8:  VDP(reg)
            Register 9-46: VDP(reg+1)

Met  deze  functie  kunt u een VDP register uitlezen,  echter
alleen als dat register niet 'write only' is. De registers 32
t/m  46 (Basic: 33 t/m 47) zijn 'write only', de rest kunt  u
ook  uitlezen met deze procedure. 'reg' is het uit  te  lezen
register, de functie geeft het byte dat in dat register staat
terug.

----

Naam      : ReadStatus
Computer  : MSX1 en MSX2
Actie     : Leest een VDP status-register uit
Declaratie: MSX1: Function ReadStatus:byte;
            MSX2: Function ReadStatus(reg:byte):byte;
Basic     : Register 0:   VDP(8)
            Register 1-8: VDP(-reg)

Met deze functie kunt u een VDP status-register uitlezen (dat
is  iets  anders dan een gewoon VDP register!).  Een  status-
register kan niet worden veranderd, en bevat informatie  over
de VDP, die hier echter niet gedocumenteerd wordt.
Zoals  u  hierboven ziet, is ook hier de nummering weer  iets
anders  dan  in BASIC. Statusregister 0 is in  Basic  VDP(8),
terwijl  u  voor de overige registers in Basic  de  negatieve
waarde moet nemen.
Omdat  MSX-1  maar n status-register heeft (Basic  nr.  8),
heeft de MSX-1 versie geen parameter, en de MSX-2 versie wel.

----

Naam      : ReadVramPort
Computer  : MSX1 en MSX2
Actie     : Geeft de VDP read-poort terug
Soort     : Functie
Declaratie: Function ReadVramPort:byte;
Basic     : PEEK(6)

Deze  functie  geeft het nummer van de read-poort van de  VDP
terug,  dat  op iedere MSX computer  verschillend  kan  zijn.
GEBRUIK  DUS ALTIJD DEZE FUNCTIE, in plaats van  rechtstreeks
uit de VDP te lezen met een constant register-nummer.
Als u een blok bytes uit het Video RAM wilt lezen, dan kunt u
dat  doen  door ReadVram in een lus te gebruiken, maar als  u
PORT[]   daarvoor  gebruikt  gaat  het  veel   sneller.   Het
onderstaande  vvoorbeeld  maakt voldoende duidelijk  hoe  dit
werkt.

(de nodige includes niet vergeten!)

var bytes:array[0...999] of byte;
    poort:byte;
    i    :integer;

(...)

  { lees de bytes 0-999 uit het VRAM in het array BYTES }
  poort:=ReadVramPort; { dit in een variabele zetten maakt
                         het sneller }
  bytes[0]:=readvram(0); { lees 1e byte }
  for i:=1 to 999 do { lees volgende bytes }
    bytes[i]:=port[poort];

----

Naam      : WriteVramPort
Computer  : MSX1 en MSX2
Actie     : Geeft VDP write-poort
Soort     : Functie
Declatatie: Function WriteVramPort:byte;
Basic     : PEEK(7)

Deze  functie werkt exact hetzelfde als ReadVramPort,  alleen
geeft deze de write-poort van het VRAM terug. U schrijft  een
blok  bytes door het eerste byte met WriteVram te  schrijven,
en  de  volgende  bytes met PORT[prt]:=waarde,  waar  prt  de
variabele is waarin het resultaat van WriteVramPort is gezet.
(Zet  dit  altijd in een variabele, dat  is  gigantisch  veel
sneller).
Voor  een zinnig voorbeeld, zie het programma MDLTEST, in  de
MSX1 grafische test.

----

Naam      : InitCharMode
Computer  : MSX1 en MSX2
Actie     : Stelt multicolor character mode in
Soort     : Procedure
Declaratie: Procedure InitCharMode(width,char1,char2:byte);
Basic     : geen

Met  deze  procedure kunt u de z.g.n. 'multi-color  character
mode'  inschakelen.  Dit is een veredeld  soort  tekstscherm,
maar dan met maar liefst max. 16 kleuren per karakter.
De   procedure  maakt  gebruik van scherm 2  of,  voor  MSX2,
scherm  4.  Dit  betekent,  dat  u  3   karaktersets  tot  uw
beschikking   hebt,   die  allen  een   derde  deel  van   de
schermregels in beslag nemen. Karakter nr. 65 kan op regel  5
bijvoorbeeld iets anders zijn dan op regel 20.
Ik  ga  hier  niet  uitgebreid  uitleggen  hoe  u   karakters
definiert,   hiervoor   zult  u andere   literatuur   moeten
raadplegen. Als u het programma MDLTEST goed doorkijkt,  kunt
u daar ook erg veel van leren.
Hieronder een korte uitleg van de parameters:
'width'  is de schermbreedte die het gecombineerde grafische-
en tekstscherm moet krijgen. Minimaal 1, maximaal 32.
'char1'  en  'char2' zijn ASCII-waarden,  die  bepalen  welke
karakters  bij  aanroep  alvast  vanuit de BIOS  in  de  drie
karaktersets moeten worden gezet, zodat u ook gewone  letters
kunt  gebruiken.  Alle  karakters tussen 'char1'  en  'char2'
worden in het VRAM gezet.
Tot  slot  nog  de  opmerking  dat  u  de   zelfgedefinieerde
karakters  natuurlijk  gewoon  met Write en  WriteLn  op  het
scherm kunt zetten.

----

Naam      : TranspTable
Computer  : MSX1 en MSX2
Actie     : Geeft VRAM-adres sprite transparant-tabel
Soort     : Functie
Declaratie: Function TranspTable:integer;
Basic     : geen

Deze   functie   geeft,  onafhankelijk   van   de   gebruikte
schermmode, het adres van de transparant-tabel van de sprites
terug.  De functie van de transparant-tabel is het  bijhouden
van de cordinaten van de sprite op ieder transparant, en  de
kleur daarvan, en het spritenummer van ieder transparant. Hoe
deze  gegevens opgeslagen liggen, wordt hier niet  besproken.
Hiervoor  dient  andere  literatuur te  worden  geraadpleegd.
Bijvoorbeeld  in  het MSX(2) BASIC handboek  van  Stark-Texel
wordt dit zeer helder uiteengezet.

----

Naam      : PattTable
Computer  : MSX1 en MSX2
Actie     : Geeft VRAM-adres spritevorm-tabel
Soort     : Functie
Declaratie: Function PattTable:integer;
Basic     : geen

Deze  functie  werkt hetzelfde als TranspTable, alleen  geeft
deze  het adres van de spritevorm-tabel, waarin de  vorm  per
sprite ligt opgeslagen. Verder zie TranspTable.

----

Naam      : ColorTable
Computer  : MSX2
Actie     : Geeft VRAM-adres spritecolor-tabel
Soort     : Functie
Declaratie: Function ColorTable:integer;
Basic     : geen

Deze  functie werkt hetzelfde als TranspTable,  alleen  geeft
deze  het  adres van de spritecolor-tabel, waarin de  kleuren
per beeldlijn van de sprites liggen opgeslagen, en die alleen
op scherm 4 t/m 8 aanwezig is. Verder zie TranspTable.

----

Naam      : SpriteSize
Computer  : MSX1 en MSX2
Actie     : Stelt spritegrootte in
Soort     : Procedure
Declaratie: Procedure SpriteSize(grootte:byte);
Basic     : SCREEN schermtype,grootte

Deze  procedure  stelt  de spritegrootte in.  Altijd  NA  een
ScrMode geven, en na iedere ScrMode weer opnieuw geven.
In 'grootte' staat de spritegrootte als volgt gecodeerd:
0=8x8, onvergroot
1=16x16, onvergroot
2=8x8, vergroot
3=16x16, vergroot
Bedenk,  dat  een 8x8 sprite 8 bytes in  de  spritevorm-tabel
inneemt, en een 16x16 sprite 32 bytes.

----

Naam      : ClearSprites
Computer  : MSX1 en MSX2
Actie     : Wist alle sprites
Soort     : Procedure
Declaratie: Procedure ClearSprites;
Basic     : DEFUSR=&H69:A=USR(0)

Wist  simpelweg alle sprites van het scherm en uit het  VRAM.
Sprites dienen opnieuw te worden gedefinierd. Is razendsnel.


**** EINDE VRAM.TXT ****
                                                                                   