
|
Grafisch werken met de OUT poorten Genic Clubguide, 00-00-00
GRAFISCH WERKEN MET DE OUT POORTEN
Normaal wordt deze cursus 'Rechtstreeks met de VDP
communiceren' geschreven door iemand anders, maar een week
voor de deadline werd mij gevraagd om dit klusje even op te
knappen, omdat de auteur die dit zou schrijven verhinderd
was. Na hard doorwerken is het gelukkig toch nog gelukt om
een artikel op papier - of moeten we zeggen: op disk? - te
krijgen.
Zoals gezegd gaan we het in deze aflevering hebben over het
direct aansturen van de VDP registers. Enige kennis van
machinetaal is echter wel vereist om een en ander te kunnen
begrijpen.
HET AANSTUREN VAN DE VDP
Er zijn twee manieren om de VDP aan te spreken:
- Via de BIOS CALLS (voorgeprogrammeerde routines).
- Via de OUT instructies
De BIOS routines hebben hetzelfde effect als de
OUT-instructies. Het enige verschil is dat een BIOS-routine
veel gemakkelijker te bereiken valt. Door een simpele CALL
kan de routine worden opgestart, alle andere problemen
regelt de MSX2 verder zelf. Zo zal er worden gekeken of de
VDP nog bezig is met een vorige instructie, en indien
noodzakelijk zal een slot-selectie worden toegepast om in
het SUBROM direct toegang te verkrijgen. Het grote
voordeel van de BIOS-CALLS is dat de routine op elke
MSX-computer werkt, dus bijvoorbeeld ook op een MSX3 Turbo+.
Nu zult u zich afvragen: Waarom worden dan niet altijd de
BIOS-CALLS gebruikt, in plaats van de meer complexe
OUT-intstructies? Buiten het feit dat sommige effecten niet
met de BIOS-routines te bereiken zijn is er een groot
voordeel: het gaat sneller. Tijdwinst wordt geboekt doordat
er geen INTER-SLOT CALL behoeft te worden uitgevoerd, zoals
bij de BIOS-routine. Bovendien doet de BIOS-routine dezelfde
OUT'S, doch leest eerst de parameters (coordinaten
bijvoorbeeld) uit het het geheugen, nadat ze daar door de
zogenaamde DS-instrukties zijn neergezet.
Lezen en schrijfen (lezen alleen uit STATUS-registers) van
de VDP gaat via POORTEN, aan te spreken met OUT en IN.
Hieronder een overzicht van de verschillende soorten
registers van de VDP, met daarachter het adres in de waar de
IN/OUT waardes verborgen zitten en daarachter het getal dat
in praktisch elke MSX-2 computer hetzelfde is.(let op! niet
alle computers!) Dit adres is gewoon uit te lezen met:
LD C,(0006) -eventueel daarna INC C voor POORT-1 =(0006)+1
waarna het IN of OUT-adres in C staat. Schrijven gaat dan
met OUT (C),A, lezen met IN A,(C). In geval van schrijven
moet de DATA dan natuurlijk wel in A staan.
----------------------------------------------------------
Omschrijving poort Te vinden op -> bevat meestal:
VRAM READ (0006) POORT 0 98h
VRAM WRITE (0007) POORT 0 98h
STATUS READ (0006)+1 POORT 1 99h
COMMAND WRITE (0007)+1 POORT 1 99h
PALETTE WRITE (0007)+2 POORT 2 9Ah
INDIRECT REGISTER ACCES (0007)+3 POORT 3 9Bh
----------------------------------------------------------
Om u even gerust te stellen, voor diegenen onder u die niet
weten wat ze met deze tabel aanmoeten: dit zal later worden
duidelijk gemaakt. De poorten zijn nu eenmaal erg belangrijk
aangezien alle communicatie met de VDP via deze poorten
loopt.
LET OP: het gaat hier over het lezen en schrijven van
REGISTERS niet van Video-RAM!
EEN VOORBEELD
Deze eerste routine beschrijft naar een intern register van
de VDP. De assembler listing ziet er als volgt uit:
NAAM: vdprd
Doel: Schrijf naar VDP register
Invoer: B=data C=register
Uitvoer:
LD A,C
EX AF,AF'
LD A,(0007) ; Lees data schrijfpoort.
INC A
LD C,A ; C bevat commando poort.
LD A,B
DI ; Zet interrupts uit.
OUT (C),A ; Schrijf DATA
EX AF,AF'
OR 80h ; Zet MSB (hoogste bit)
OUT (C),A ; Schrijf REGISTER.
EI
RET
Zoals u ziet wordt het schrijfpoortadres uit locatie 0007
gehaald, C kan ehcter ook meteen gevuld worden met &H99 want
de meeste MSX-2 machines bevatten deze waarde. Om er zeker
van te zijn dan de routine op iedere MSX-2 werkt wordt in
alle listings de waarde uit 0007 (of bij lezen 0006)
gehaald. De interrupts moeten worden uitgezet tijdens het
lezen en schrijven. Met deze routine kunt u de eerder
vermelde registers beschrijven.
Zoals gezegd is het onmogelijk de registers zelf uit te
lezen, bij de status-registers kan dit echter wel. Dit is
erg handig, aangezien deze registers de toestand waarin de
VDP verkeerd aangeven.
Om een status-register te lezen moet de computer eerst weten
welk register er moet worden uitgelezen. Dit register moet
in register 15 worden geplaatst. In de praktijk is een
status-register als volgt uit te lezen:
Naam: vdprd
Doel: leest VDP status register
Invoer: te lezen status register in A
Uitvoer: data in A
LD HL,(0006)
INC H ; H Commando schrijf poort (0007)+1
INC L ; L commando lees poort (0006)
LD C,H
DI
OUT (C),A ; Schrijf te lezen STATUS register
LD A,&h8f ; register naar 15 en zet MSB
OUT (C),A
LD C,L
IN A,(C) ; Lees STATUS register
PUSH AF
XOR A
LD C,H
OUT (C),A ; Zet register 0 terug.
LD A,&h8f
OUT (C),A
EI
POP AF
RET
Aan het einde van de listing ziet u dat de waarde NUL weer
naar register 15 wordt gezet, omdat dit de default waarde
is, die ten alle tijde gehandhaafd moet blijven.
Nu moet u zelf in staat zijn om de VDP-poorten te lezen en
te beschrijven, een heel belangrijk onderdeel van de
VDP-programmering. Volgende keer gaan we wat dieper in op
diverse instrukties zoals de VDP-voorwaarden en instellingen
om lijnen te trekken, punten zetten en om te copie‰ren.
Als toegift hier nog enkele registers die de MSX-2 Video
Chip gebruikt:
1. VDP() reg. 7 6 5 4 3 2 1 0
-------------------------------------------------------
0 0 O DG IEO IE1 M5 M4 M3 D
1 1 O BLK IE2 M1 M2 O SZ MAG
9 8 MSE LCS TP CBD VRS1 VRS0 SBD B/W
10 9 LN O SYM1 SYM0 IL E/O NTSC DCD
Betekenis:
DG -Digitize
IE0 -Vertical Retrace Interrupt Enable (voor o.a. screen-
IE1 -Horizontal Retrace inerrupt Enable split)
IE2 -Light pen/mouse Interrupt Enable
M5/1 -M5 M4 M3 M2 M1
0 0 0 0 0 SCREEN-1
0 0 0 0 1 SCREEN-0 (40 tekens)
0 0 0 1 0 SCREEN-3
0 0 1 0 0 SCREEN-2
0 1 0 0 0 SCREEN-4
0 1 0 0 1 SCREEN-0 (80 tekens)
0 1 1 0 0 SCREEN-5
1 0 0 0 0 SCREEN-6
1 0 1 0 0 SCREEN-7
1 1 1 0 0 SCREEN-8
D -External VDP-input
BLK -Enable/Disable Display
SZ -Sprite size
MAG -Magnify Sprites
MSE -Light pen/mouse (1=muis)
LC5 -Light pen/coincidence select (1=light pen)
TP -Transparant mode (1= color 0 niet transparant)
CBD -Color bus Direction
VRS1/0-Video RAM select
VRS1 VRS0
0 0 -1*16 Kb
0 1 -4*16 Kb
1 0 -1*64 Kb
1 1 -64 Kb High Speed
SPD -Sprite disable
SYM0/1-Synchronisatie Mode
SYM1 SYM0
0 0 -Intern
0 1 -Mix
1 0 -Extern (Digitize)
1 1 -none
IL -Interlaced Mode
E/O -Even/odd Display
NTSC -TV/Monitor Select
DCD -Dot Clock Direction
Natuurlijk zijn er nog VEEL MEER registers maar daarover de
volgende keer meer.
R. v.d. Meulen
|