MILC logo

IndexVorigeVolgendeLeeg

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.

    

Index

Vorige

Volgende