
|
De MSX2 ViDeo-Processor. M. vd Kooij, 00-00-00
De MSX2 ViDeo-Processor.
Hier zullen de meeste registers genoemd worden met hun functie, het is aan te
bevelen om al enige kennis (Basic in ieder geval) hiervan te hebben, deze
tekst is meer bedoeld voor het snel opzoeken van 'hoe was tie ook alweer'.
Allereerst alle registers op een rijtje, met basic en de video nummers, want
de basic interpreter gebruikt andere waardes voor de vdp registers.
BASIC
VDP() reg 7 6 5 4 3 2 1 0
0 0 0 DG IE0 IE1 M5 M4 M3 D
1 1 0 BLK IE2 M1 M2 0 SZ MAG
9 8 MSE LCS TP CBD VRS1 VRS0 SPD B/W
10 9 LN 0 SYM1 SYM0 IL E/O NTSC DCD
Betekenis:
DG - Digitize
0=Normaal, 1=Digitaliseer mode
IE0 - Vertical Retrace Interrupt Enable
IE1 - Horizontal Retrace Interrupt Enable
IE2 - Light pen/mouse Interrupt Enable
M5/1 - M5 M4 M3 M2 M1 Screen
0 0 0 0 0 1
0 0 0 0 1 0 ( 40 koloms)
0 0 0 1 0 3
0 0 1 0 0 2
0 1 0 0 0 4
0 1 0 0 1 0 ( 80 koloms)
0 1 1 0 0 5
1 0 0 0 0 6
1 0 1 0 0 7
1 1 1 0 0 8
Screen 10,11 en 12 zijn verbouwde screen 8.
D - External VDP-input
BLK - Enable/Disable Display
Het scherm aan of uit zetten
SZ - Sprite Size
0=8*8 Sprites, 1=16*16 Sprites
MAG - Magnify Sprites
0=Normaal, 1=2* zo groot
MSE - Light pen/mous (1=mouse)
LCS - Light pen/coincidence select (1=light pen)
TP - Transparant mode
0=Kleur 0 is transparant, 1=Kleur 0 niet transparant
CBD - Color Bus Direction
0=Output(normaal), 1=Input(Digitaliseren)
VRS1/0 - Video RAM Select
VRS1 VRS0 KB
0 0 1*16
0 1 4*16
1 0 1*64
1 1 64 High speed
SPD - Sprite Disable (Sprites: 0=normaal, 1=geen sprites op scherm)
SYM1/0 - Synchronisation mode (Voor digitaliseren en mixen)
SYM1 SYM0 mode
0 0 Intern
0 1 Mix
1 0 Extern (Digitize)
1 1 none
IL - Interlace mode (uitleg over interlace volgt later)
E/O - Even/Odd Display
NTSC - TV mode select(0=NTSC (Japan), 1=PAL (Europa))
De interne interrupt is in europa 50 Hz, door NTSC nul te
maken, wordt het beeldscherm 60 * per seconde naar het
beeldscherm gestuurd, ook zal de muziek anders gaan klinken
(PLAY). De z80 processor wordt niet sneller, zoals onterecht
een keer is geschreven in een blad!
DCD - Dot Clock Direction
BASIC
VDP() reg 7 6 5 4 3 2 1 0
2 2 0 A16 A15 A14 A13 A12 A11 A10
3 3 B13 B12 B11 B10 B9 B8 B7 B6
11 10 0 0 0 0 0 B16 B15 B14
4 4 0 0 C16 C15 C14 C13 C12 C11
5 5 D14 D13 D12 D11 D10 D9 D8 D7
12 11 0 0 0 0 0 0 D16 D15
6 6 0 0 E16 E15 E14 E13 E12 E11
15 14 0 0 0 0 0 F16 F15 F14
Betekenis:
A16/A10 - Scherminfo Tabel
B16/B6 - Kleur Tabel
C16/C11 - Matrix Tabel
D16/D7 - Spriteinfo Tabel
E16/E11 - Sprite patroon Tabel
F16/F14 - Video RAM access
Scherm info:
Kan alleen in pagina's van een Kbyte schakelen, en bevat het adres
waarvandaan de data van het scherm staat. (screen 0 : #00000) In screen 5 tot
8 kan hiermee de pagina geschakeld worden en wordt dan ook in basic door SET
PAGE gebruikt.
In screen 2 tot 4 staan hier getallen die niet verandert worden, deze
getallen geven aan welke plaats op het scherm bij een karakter hoort, screen
2 en 4 bevatten derhalve 3 maal 0 tot 255.
Kleur tabel wordt door de schermen 1 tot 4 gebruikt:
Screen 1: kleurcode voor 8 karakters, de tabel is dus 32 bytes lang. Screen 2
en 4: Hier wordt per rij van 8 pixels de kleur bijgehouden. In de scherm
matrix tabel staat per acht bits aangegeven of die pixels aan of uit staan.
Bits 3 tot 0 bepalen de kleur van een '0' bit uit de scherminfo tabel.
Terwijl 7 tot 4 de '1' bepalen. Screen 3: Iedere Byte bevat de kleuren van
twee pixels.
Matrix tabel wordt in screen 0 tot 4:
Hier worden de patronen opgebouwd, deze patronen worden door de namen tabel
getoond.
Screen 0: 2048 bytes groot, bevat alle karakters. De processor zoekt bij het
opbouwen van het scherm uit de namen tabel welk karakter er getoond moet
worden, en uit de patroon tabel hoe dat karakter er uit moet zien.
Screen 1: dezelfde manier, behalve dan dat uit de kleur tabel ook nog de
kleur van dat karakter opgezocht wordt.
Screen 2 tot 4: In de namentabel wordt aangewezen welk 'karakter' er getoond
wordt, en in deze matrix wordt aangegeven of die pixels aan of uit staan.
Sprite info:
Bevat y-as, x-as en het nummer van de geprojecteerde sprite. Deze tabel bevat
waardes voor 32 sprites, die sprites kunnen de nummers 0 tot 255 hebben, en
dus bij 16*16 sprites ook andere delen van het VRAM bestrijken dan de sprite
patroon tabel. Bij de MSX2 wordt het 4de byte niet gebruikt, in MSX1 bevatte
dit de kleur van de sprite.
Opbouw tabel:
byte 1: Y-as sprite
byte 2: X-as sprite
byte 3: sprite nummer (verwijst naar sprite patroon tabel)
byte 4: Ongebruikt
Voor de MSX2 geld dat alle horizontale sprite lijnen een andere kleur kunnen
hebben. Deze tabel staat 512 bytes onder de sprite info tabel en voor iedere
sprite zijn hier 16 bytes gereserveerd.
Opbouw:
bit 0 tot 3: kleurcode horizontale lijn.
bit 5: geSET betekend dat een sprite botsing niet gedetecteerd wordt.
bit 6: geSET betekend dat deze lijn niet getoond wordt; voor deze lijn
nooit botsingdetectie. Als deze lijn van de sprite een lijn van
een andere sprite met een hogere prioriteit (eerder in de
sprite info tabel staat) passeert met dit bit op nul en als de
lijnen van de sprites op dezelfde horizontaal liggen, dan wordt
de lijn van deze sprite toch geprojecteerd. Bij overlap wordt op
de spritelijnen echter ook nog een logische OR toegepast.
bit 7: geSET betekend dat de sprite lijn 32 beeldpunten naar links
geprojecteerd wordt.
Sprite patroon tabel:
Bij 8*8 sprites zijn hier 8 bytes en bij 16*16 sprites zijn hier 32 bytes
gereserveerd.
BASIC
VDP() reg 7 6 5 4 3 2 1 0
7 7 TC3 TC2 TC1 TC0 BDC3 BDC2 BDC1 BDC0
13 12 C3 C2 C1 C0 BC3 BC2 BC1 BC0
14 13 ON3 ON2 ON1 ON0 OF3 OF2 OF1 OF0
Betekenis:
TC3/0 - Text Color
BCD3/0 - Back Drop Color
C3/0 - Color
BC3/0 - Back Color
ON3/0 - Blink On (1/5 seconde)
OF3/0 - Blink Off(1/5 seconde)
register 7 bevat in elk ander scherm dan 0 de rand (border) kleur,
Screen 8 gebruikt voor zijn 256 kleuren alle bits.
Screen 1-5 en 7 gebruiken allen bit 3 tot 0
Screen 6 gebruikt BDC3 en BDC2 voor de kleur van alle verticale even lijnen,
terwijl BDC1 en BDC0 gebruikt worden voor alle verticale oneven lijnen, dit
geeft een 16 kleuren effect.
In screen 0 kan tekst met deze registers geinventeerd worden of een andere
kleur krijgen. Dan bevat TC3 tot TC0 de voorgrond kleur van de geinventeerde
tekst en BDC3 tot BDC0 de achtergrond kleur. Dit is de reden dat het
tekstscherm geen andere border kleur dan de voorgrond kleur kan krijgen. Met
register 13 kan daarna de tijd ingesteld worden dat het getoond moet worden.
ON3 tot ON0 voor aan en OF3 tot OF0 voor uit. Dit kan ook voor interlacing
gebruikt worden, ON wordt gebruikt voor de even pagina en OF voor de oneven
pagina. C3/0 en BC3/0 bevatten de voorgrond en de achtergrond kleur in
screen 0.
BASIC
VDP() reg 7 6 5 4 3 2 1 0
16 15 0 0 0 0 RS3 RS2 RS1 RS0
17 16 0 0 0 0 C3 C2 C1 C0
18 17 S/I 0 RC5 RC4 RC3 RC2 RC1 RC0
19 18 dV3 dV2 dV1 dV0 dH3 dH2 dH1 dH0
20 19 IL7 IL6 IL5 IL4 IL3 IL2 IL1 IL0
21 20 0 0 CBX5 CBX4 CBX3 CBX2 CBX1 CBX0
22 21 0 0 CBY5 CBY4 CBY3 CBY2 CBY1 CBY0
23 22 0 0 CBZ5 CBZ4 CBZ3 CBZ2 CBZ1 CBZ0
24 23 LS7 LS6 LS5 LS4 LS3 LS2 LS1 LS0
Betekenis:
RS3/0 - Register nummer van Statusregister
C3/0 - Color code
S/I - 0=Automatisch ophogen van RC5/0, 1=Niet ophogen
RC5/0 - Register nummer van Controlregister
Hier kan een register nummer worden opgeslagen:
Met indirecte toegangs poort (#0007)+3 kan er naar het
register geschreven worden dat RC5/0 aanwijst, als er
geschreven is wordt aan de hand van S/I wel of niet opgehoogd
Dit is handig om achter elkaar een aantal registers van
waarde te veranderen.
dV3/0 - delta Vertical adjust
dH3/0 - delta Horizontal adjust
IL7/0 - vertical line number of Line Interrupt
CBX5/0 - Color Burst value of phase 0
CBY5/0 - Color Burst value of phase 1/3
CBZ5/0 - Color Burst valeu of phase 2/3
LS7/0 - horizontal line start Video RAM
Toekennen van kleuren palet:
Eerst register 16 (C3 tot C0) met kleurcode vullen.
Daarna verzenden van twee Bytes naar de pallette schrijfpoort nl:
bit 7 6 5 4 3 2 1 0
Byte 1 0 R2 R1 R0 0 B2 B1 B0
Byte 2 0 0 0 0 0 G2 G1 G0
Deze kleurcodes worden door de computer ergens apart in het VRAM opgeslagen,
dat doet de VDP niet zelf, daarom hebben de BIOS routines in het EXTROM de
voorkeur: GETPLT (#0149) om kleur code op te halen en SETPLT (#014D) om een
kleur te zetten.
In screen 8 geldt de volgende formule: 32*G+4*R+B waarbij G en R tussen de 0
en de 7 liggen en B tussen de 0 en de 3.
Adjust: dV3/0 en dH3/0 zijn als volgt opgebouwd:
Het 4e bit is geSET als het getal positief is.
Het registers kan 2* de waardes -7 tot 8 bevatten en wordt opgeslagen in het
two complement. Dus -7 wordt 0111 en 8 wordt 1000.
Smooth scroll:
In register 24 staat voor screen 5 tot 8 de eerste Y-as die afgebeeld moet
worden.
In screen 0 wordt hiermee het eerste byte aangegeven die voor het vormen van
de karakters gebruikt wordt, dit houd in dat een karakter rold als je het
register de waarde 0 tot 7 geeft.
Statusregisters:
BASIC
VDP() reg 7 6 5 4 3 2 1 0
8 0 F SD C S4 S3 S2 S1 S0 (Dit register staat in
-1 1 FL LPS I4 I3 I2 I1 I0 FH het AF register bij de
-2 2 TR VR HR BD 0 0 E/O CE interrupt routine)
-3 3 X7 X6 X5 X4 X3 X2 X1 X0
-4 4 0 0 0 0 0 0 X9 X8
-5 5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
-6 6 0 0 0 0 0 0 Y9 Y8
-7 7 C7 C6 C5 C4 C3 C2 C1 C0
-8 8 BX7 BX6 BX5 BX4 BX3 BX2 BX1 BX0
-9 9 0 0 0 0 0 0 BX9 BX8
Betekenis:
F - Vertical Retrace Interrupt
Bij een interrupt wordt hier gekeken of het van de VDP kwam
(0=Nee, 1=Ja) zoniet dan wordt naar de NMI-routine gesprongen
SD - Vijfde cq. negende sprite gedetecteerd (1=teveel sprites)
C - Botsing tussen sprites gedetecteerd (1=botsing)
S4/0 - Nummer van de vijfde cq. negende sprite
FL - Muis of lichtpen schakelaar status
LPS - Tweede muis of lichtpen schakelaar status
I4/0 - Videochip LSI-nummer (Identicatie 1-V9938 2-V9958)
FH - Horizontal Retrace Interrupt
TR - Transfer met CPU data ready
VR - Vertical Retrace timing
HR - Horizontal Retrace timing
BD - Border Detected
E/O - Even or Odd field status (0=even, 1=oneven pagina afgebeeld)
CE - Command Executing status (0=klaar)
X9/0 - X-coordinaat spritebotsing, muis of lichtpen
Y9/0 - Y-coordinaat spritebotsing, muis of lichtpen
C7/0 - Kleurencode gelezen kleurregister
BX9/0 - Border X-coordinaat van spritebotsing
Het programmeren van de VDP:
De registers:
BASIC
VDP() reg 7 6 5 4 3 2 1 0
32 33 SX7 SX6 SX5 SX4 SX3 SX2 SX1 SX0
33 34 0 0 0 0 0 0 0 SX8
34 35 SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0
35 36 0 0 0 0 0 0 SY9 SY8
36 37 DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0
37 38 0 0 0 0 0 0 0 DX8
38 39 DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0
39 40 0 0 0 0 0 0 DY9 DY8
40 41 NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0
41 42 0 0 0 0 0 0 NX9 NX8
42 43 NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0
43 44 0 0 0 0 0 0 NY9 NY8
44 45 C7 C6 C5 C4 C3 C2 C1 C0
45 46 0 0 0 0 DIRY DIRX (N)EQ MAJ/MIN
46 47 CM3 CM2 CM1 CM0 LO3 LO2 LO1 LO0
SX= source X-coordinaat
SY= source Y-coordinaat
DX= destination X-coordinaat
DY= destination Y-coordinaat
NX= number X-dots
NY= number Y-dots
C = kleur register
CM= commando
LO= logische operatie
We kunnen alleen een begin punt opgeven, als we van 0 tot 255 (x) willen
copieeren dan moet in NX 256 staan en in DIRX 0.
Als er we van begin-X naar rechts gaan om bij eind-X te komen dan moet DIRX
nul zijn, anders 1.
Bij Y geld, werken we van boven naar beneden, dan DIRY=0.
Tabel van commando's en wat er allemaal ingevuld moet worden:
Code Com SX SY DX DY NX NY C DIRY DIRX (N)EQ MAJ/MIN LOG COM
1111 HMMC + + + + + + + +
1110 HMCM + + + + + + +
1101 HMMM + + + + + + + + +
1100 HMMV + + + + + + + +
1011 LMMC + + + + + + + + +
1010 LMCM + + + + + + + +
1001 LMMM + + + + + + + + + +
1000 LMMV + + + + + + + + +
0111 LINE + + + + + + + + + +
0110 SRCH + + + + + +
0101 PSET + + + + +
0100 PINT + + +
LOGische bewerkingen: nieuwe schermkleur=oude kleur LOG source kleur
0000 PSET 1000 TPSET
0001 AND 1001 TAND
0010 OR 1010 TOR
0011 XOR 1011 TXOR
0100 NOT 1100 TNOT
Bij de commando's staat de eerste H of L voor High of Low speed, dit houd in
dat er bij het copiereen wel (High) of niet (Low) de bewerkingen in Bytes
worden uitgevoerd. het copieeren van een stuk VRAM gebeurt in screen 5 dus
met 2 punten tegelijk als een H commando gebruikt wordt.
HMMC en LMMC: Verplaatsen van RAM naar VRAM
Kleur van eerste byte (of pixel) moet in het kleur register(44)
staan. Vervolgens wordt het kader gevuld door de rest van de
data achter elkaar naar het kleur register te schrijven. Uit
het TR bit van statusregister 2 kunnen we afleiden of alle data
verplaatst is.
HMCM en LMCM: Verplaatsen van VRAM naar RAM
Nu wordt de data gelezen uit statusregister 7 (andere registers
kunnen immers niet gelezen worden).
het TR bit verteld weer wanneer alles binnen is.
HMMM en LMMM: verplaatsen VRAM->VRAM
razendsnel verplaatsen SX,SY,NX,NY,DIRY,DIRX geven source weer.
Beginpunt van destination gaat in DX en DY. Dus eigenlijk het
zelfde als BASIC 'COPY(SX,SY)-(SX+NX,SY+NY) TO (DX,DY)' als
DIRX en DIRY nul zijn tenminste.
HMMV en LMMV: VRAM vullen met kleur
Op de zelfde manier als bij ?MMM wordt hier het te bewerken
gebied aangegeven.
bij H commando's zijn dus geen LOGische bewerkingen mogelijk!
LINE Kader in DX,DY,NX,NY,DIRX,DIRY en MAJ/MIN
Het bijzondere is dat als er meer Y dan X punten zijn, dat dan
NY en NX verwisseld worden en moet MAJ/MIN geSET zijn!!
SRCH zoekt een punt in DIRX richting, SY bevat lijn waarop gezocht
moet worden.
(N)EQ =0 dan wordt er een punt gezocht die dezelfde kleur heeft
als het kleurregister (44).
(N)EQ =1 dan wordt er een punt gezocht die een andere kleur
heeft als het kleurregister.
PINT geeft kleur code van (SX,SY) in statusregister 7.
Bij het programmeren moet de interrupt uit staan, dan eerst CE-bit
kontroleren of de processor de volgende opdracht kan uitvoeren.
Dan parameters wegschrijven, met als laatste het register 46, omdat dan de
VDP met het uitvoeren van de opdracht begint.
In het MSXROM bevatten adres #0006 en #0007 een aantal I/O poorten die
gebruikt mogen worden om de VDP op een snelle manier te lezen.
(#0006) data leespoort
(#0006)+1 status leespoort (de inhoud van adres #0006 dus, plus 1)
(#0007) schrijfpoort
(#0007)+1 commando schrijfpoort
(#0007)+2 pallette schrijfpoort
(#0007)+3 indirecte toegangspoort
Schrijven naar een VDP-register:
Eerst wordt data geschreven, daarna het registernummer MET BIT 7 geSET!
De gewone VDP registers kunnen niet gelezen worden de Status registers wel.
In schema:
bit 7 6 5 4 3 2 1 0
Byte 1 da7 da6 da5 da4 da3 da2 da1 da0
Byte 2 1 0 re5 re4 re3 re2 re1 re0
Betekenis:
da7/0 - data bits (7 in totaal)
re5/0 - register (39 registers)
Dit wordt naar (#0007)+1 gestuurd
Hier volgt een routine een VDP register te beschrijven.
Naam: VDPWRT
Doel: Schrijft naar een VDP-register
Invoer: B=Data, C=Register
Uitvoer: Niets
BIOS: Gelijk aan WRTVDP (#012D) in EXTROM
79 LD A,C
08 EX AF,AF'
3A 07 00 LD A,(#0007) ; lees dataschrijfpoort
3C INC A ; A=nu commandopoort
4F LD C,A ; in C
78 LD A,B
F3 DI
ED 79 OUT (C),A ; Schrijf data
08 EX AF,AF'
F6 80 OR #80 ; SET bit 7
ED 79 OUT (C),A ; Nu pas registernummer
FB EI
C9 RET
Lees (status) register:
Eerst wordt register 15 beschreven met het gewenste register, dan wordt de
status leespoort gelezen, daarna wordt weer 0 naar register 15 geschreven
omdat de interrupt routine rechtstreeks het status register wil uitlezen
zonder eerst 0 naar register 15 te sturen.
In schema:
Eerst naar commando poort (#0007)+1
bit 7 6 5 4 3 2 1 0
Byte 1 0 0 re5 re4 re3 re2 re1 re0
Byte 2 1 0 0 0 1 1 1 1 (#8F)
Dan lezen uit Status leespoort (#0006)+1
bit 7 6 5 4 3 2 1 0
Byte da7 da6 da5 da4 da3 da2 da1 da0
Dan weer schrijven naar commando poort
bit 7 6 5 4 3 2 1 0
Byte 1 0 0 0 0 0 0 0 0 (#00)
Byte 2 1 0 0 0 1 1 1 1 (#8F)
Betekenis:
re5/0 - Register
da7/0 - Data
Routine om status registers te lezen.
Naam: VDPRD
Doel: leest VDP (status) register
Invoer: Statusregister in A
Uitvoer: data in A
BIOS: Gelijk aan VDPSTA (#0131) in EXTROM
2A 06 00 LD HL,(#0006)
24 INC H ; H commando schrijfpoort
2C INC L ; L status leespoort
4C LD C,H
F3 DI
ED 79 OUT (C),A ; schrijft te lezen register naar
3E 8F LD A,#8F ; intern register 15 (#0F)
ED 79 OUT (C),A
4D LD C,L
ED 78 IN A,(C) ; Lees status leespoort
F5 PUSH AF
AF XOR A
4C LD C,H
ED 79 OUT (C),A ; zet register 0 terug
3E 8F LD A,#8F
ED 79 OUT (C),A
FB EI
F1 POP AF
C9 RET
VRAM lezen of schrijven:
Werkwijze bij lezen en schrijven
- register 14 beschrijven
bit 0-2: komen overeen met de 3 hoogste bits van het 17 bits adres
bit 3-7: moeten geRESET zijn.
- byte wegschrijven naar commandopoort
bit 0-7: komen overeen met 8 laagste bits van 17 bits adres
- byte wegschrijven naar commando poort
bit 0-5: komen overeen met bit 8-13 van het 17 bits adres
bit 6 : geRESET betekent LEZEN, geSET betekend SCHRIJVEN
bit 7 : Moet geRESET zijn
In schema:
bit: 7 6 5 4 3 2 1 0
byte 1: 0 0 0 0 0 Ab16 Ab15 Ab14
byte 2: 1 0 0 0 1 1 1 0
byte 3: Ab7 Ab6 Ab5 Ab4 Ab3 Ab2 Ab1 Ab0
byte 4: 0 L/S Ab13 Ab12 Ab11 Ab10 Ab9 Ab8
Betekenis:
Ab17/0 - VRAM adres bits, 17 bits voor 128k
L/S - 0 lezen (I/O poort (#0006)+1)
1 schrijven (I/O poort (#0007)+1)
Naam: SETWRT
Doel: zet VDP om te schrijven
Invoer: HL=VRAM-adres, B=pagina (0 of 1 wijst altijd 64k pag. aan)
Uitvoer: C bevat data schrijf poort
3A 07 00 LD A,(#0007)
F3 DI
3C INC A
4F LD C,A
7C LD A,H
E6 C0 AND #C0
B0 OR B
07 RLCA
07 RLCA
ED 79 OUT (C),A ; Schrijf drie hoogste bits naar
3E 8E LD A,#8E ; register 14
ED 79 OUT (C),A
ED 69 OUT (C),L ; schrijf 8 laagste bits
7C LD A,H
E6 3F AND #3F ; Bit 7 en 6 wordt 0
F6 40 OR #40 ; zet bit 6 om te schrijven
ED 79 OUT (C),A ; schrijf laatste bits
0D DEC C ; wordt data schrijfpoort
C9 RET
Naam: SETRD
Doel: zet VDP om te lezen
Invoer: HL=VRAM-adres, B=pagina (0 of 1 wijst altijd 64k pag. aan)
Uitvoer: C bevat data lees poort
3A 07 00 LD A,(#0006)
F3 DI
3C INC A
4F LD C,A
7C LD A,H
E6 C0 AND #C0
B0 OR B
07 RLCA
07 RLCA
ED 79 OUT (C),A ; Schrijf drie hoogste bits naar
3E 8E LD A,#8E ; register 14
ED 79 OUT (C),A
ED 69 OUT (C),L ; schrijf 8 laagste bits
7C LD A,H
E6 3F AND #3F ; Bit 7 en 6 wordt 0
ED 79 OUT (C),A ; schrijf laatste bits
0D DEC C ; wordt data leespoort
C9 RET
Deze routines doen hetzelfde als NSETWRT (#0171) en NRDWRT (#0174) in het
MAINROM.
Schrijven en lezen kan gebeuren door HL met eerste 16 bits te vullen en B met
het 17e bit
Daarna kan door IN (C),A of OUT (C),A gelezen of geschreven worden.
Organisatie van het VIDEO geheugen:
Scherm: 5 6 7 8
resolutie: 256*212 512*212 512*212 256*212
bits per pixel: 4 2 4 8
punten per byte: 2 4 2 1
max aantal kleuren: 16 4 16 256
grootte van een pagina: 32k 32k 64k 64k
aantal pagina's: 4 4 2 2
Eind adres in VRAM (begin=0): #7FFF #7FFF #FCFF #D3FF
(Dit betreft BSAVE,S adressen,
voor de schermen)
Deze tekst is een soort samenvatting van allerlei artikelen die ik tot mijn
beschikking had en over dit onderwerp gingen.
Martijn van der Kooij
Overigens heeft Martijn Dekker een Pascal lib. gemaakt die ook gebruik maakt
van de hier beschreven technieken.
|