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 |