Softscroll in ML Genic Clubguide, 00-00-00 SOFT-SCROLL IN MACHINETAAL Verbaast u zich ook altijd over die enorm mooie scrolls die we de laatste tijd in vele demo's te zien krijgen? Door de vele vragen over hoe deze scrolls zelf kunnen worden ontworpen, hebben we besloten dit eens uit de doeken te doen. Voor degenen die niet in machinetaal kunnen programmeren maar toch wel eens een mooie scroll willen demonstreren in een eigen (basic) demo, is de machinetaal zo geschreven dat iedereen deze routine kan gebruiken. Want helaas, om de uitleg te begrijpen is kennis van machine taal wel aanbevolen. DE INTERRUPT Om een perfecte scroll te krijgen is het aanbevolen om de Machinetaal-routine via een interrupt aan te sturen. Aangezien de interrupt vrij constant wordt aangeroepen zal de scroll dan ook vrij constant scrollen. Zie voor een uitgebreide uitleg over de interrupt de cursus op ClubGuide vier en vijf. De eigenlijke routine bestaat alleen maar uit een COPY- instructie. Daar komen echter nog diverse tellers bij. Onder andere een om bij te houden welke (grafische) letter op dat moment op het scherm wordt gezet. COPY-INSTRUCTIE Om een snelle scroll te krijgen maken we gebruik van de snelste methode om een grafisch deel te copi‰ren. Namelijk direct via de OUT-poorten. Om deze instructies te begrijpen verwijs ik u naar het artikel over het direct aansturen van de VDP. Maar als u zich aan de juist volgorde van de routine houd kan er (haast) niks misgaan. Hieronder volgen de registers die gevuld moeten worden voordat een copy instructie werkt zo als hij moet werken. VDP reg - bit: 7 6 5 4 3 2 1 0 ----------------------------------------------------- 33 32 - SX7 SX6 SX5 SX4 SX3 SX3 SX1 SX0 34 33 - 0 0 0 0 0 0 0 SX8 35 34 - SY7 SY6 SY5 SY4 SY3 SY2 SY1 SY0 36 35 - 0 0 0 0 0 0 0 SY8 37 36 - DX7 DX6 DX5 DX4 DX3 DX2 DX1 DX0 38 37 - 0 0 0 0 0 0 0 DX8 39 38 - DY7 DY6 DY5 DY4 DY3 DY2 DY1 DY0 40 39 - 0 0 0 0 0 0 0 DY8 41 40 - NX7 NX6 NX5 NX4 NX3 NX2 NX1 NX0 42 41 - 0 0 0 0 0 0 0 NX8 43 42 - NY7 NY6 NY5 NY4 NY3 NY2 NY1 NY0 44 43 - 0 0 0 0 0 0 0 NY8 45 44 - CH3 CH2 CH1 CH0 CL3 CL2 CL1 CL0 46 45 - 0 MXC MXD MXS Y X E/N M/M 47 46 - CM3 CM2 CM1 CM0 LO3 LO2 LO1 LO0 ----------------------------------------------------- SX8-SX0 -Origineel X-coordinaat SY8-SY0 -Origineel Y-coordinaat DX8-DX0 -Beeld X-coordinaat DY8-DY0 -Beeld y-coordinaat NX8-NX0 -Aantal horizontale punten NY8-NY0 -Aantal verticale punten CH3-CH0 -Kleurcode CL3-CL0 -Kleurcode Y -Richting Y-coordinaat X -Richting X-coordinaat E/N -Gelijk/Niet gelijk (0=gelijk) M/M -Major-Minor (0=X-as is major richting 1=Y-as is major richting) CM3-CM0 -Copy van? naar? (D0h is Vram to Vram) Inderdaad een hele waslijst, uitprinten is dan ook zeker aanbevolen. Maar waar hebben we deze informatie eigenlijk voor nodig? Welnu, ten eerste moeten in deze registers de X en de Y coordinaten worden gezet van het te copi‰ren gedeelte en de coordinaten van het punt waar het blok naar toe moet worden gecopieerd. Ook belangrijk is het aantal punten dat moet worden gecopieerd. We zullen een en ander aan de hand van een voorbeeld proberen duidelijk te maken: EEN PRAKTIJKVOORBEELD De volgende assembler listing staat ook op de disk onder de naam SCROLL.ASM (op te starten met SCROLL.MSX) ORG &HC500 Begin op adres:&HC500 LD HL,&HFD9F LD DE,&HC50E LD BC,&H0005 LDIR Bewaar oude interrupt JP ZETINT NOP NOP Hier komt de oude interrupt NOP te staan NOP NOP ZETINT DI Zet interrupts uit en LD HL,SCROLL Zet nieuwe interrupt LD A,&HCD Zet nieuwe interrupt LD (&HFD9F),A LD (&HFDA0),HL LD A,&HC9 LD (&HFDA2),A EI Zet interrupt weer aan RET Einde instellingen VDPRD LD A,02 VDP status lezer OUT (&H99),A LD A,&H8F Dit hoeft u niet te OUT (&H99),A begrijpen. IN A,(&H99) EX AF,AF' (Zie voor uitleg VDP-cursus) XOR A OUT (&H99),A LD A,&H8F OUT (&H99),A EX AF,AF' RET Keer terug. SCROLL DI Geen andere interrups. LOOP1 CALL VDPRD RRA JR C,LOOP1 CALL ZETRGS LD HL,&HD000 Register waarden vanaf &hD000 LD C,&H9B LD B,15 15 Registers vullen. OTIR Copieer (van page:1) LD A,(&HD013) INC A verhoog teller *2 INC A LD (&HD013),A LD A,(&HC5A6) Letter opkomst teller. DEC A LD (&HC5A6),A JP NZ,ZETFNT Indien niet nul dan verder LD A,8 Zet teller op 8 LD (&HC5A6),A LD HL,(&HC5A7) Adres tekst teller. INC HL LD (&HC5A79,HL LD A,(HL) CP 255 JR NZ,XYZET LD HL,&HE000 Tekst van af &hE000 opnieuw LD (&HD5A7),HL LD A,(HL) XYZET PUSH AF SLA A Bereken X-coordinaat page:1 SLA A (coordinaat) SLA A SLA A LD (&HD013),A POP AF AND &HF0 Bereken Y-coordinaat page:1 LD (&HD015),A ZETFNT CALL VDPRD Kijk of VDP klaar is RRA JR C,ZETFNT CALL ZETRGS Zet registers om te copieren LD HL,&HD014 LD C,&H9B LD B,15 OTIR Copy nieuw stukje letter EI RET KLAAR! ZETRGS LD A,&H20 Zet register om te copieren OUT (&H99),A LD A,&H91 OUT (&H99),A RET NOP opkomst teller NOP Adres waar de tekst te vinden NOP is. END Inderdaad, een hele listing voor een scrollroutine. Maar het loont de moeite want hiermee onstaat een mooie animatie. Het programma werkt als volgt: Allereerst word de oude interupt bewaart en word er een nieuwe opgezet, die naar de scroll routine springt. VDPRD : leest de VDP en kijkt of deze klaar is met de vorige copy. SCROLL: dit is het eigenlijke gedeelte om te scrollen. de OTIR zorgt er voor dat de data vanaf &hD000 naar de registers wordt geschreven. Het volgende deel onderzoekt welke letter er op het moment moet worden gecopieerd. Als de letter nog niet helemaal is gecopieerd dan wordt het volgende karakter ingelezen en worden de X en Y-coordinaten van de volgende letter berekend. Vervolgens wordt een stuk letter van twee pixels breed gecopieerd. ZETRGS: Zorgt dat de VDP klaar staat om te copi‰ren. Met deze informatie moet u in staat zijn het begrip soft-scroll te begrijpen. Om de routine te gebruiken moet er op pagina 1 een FONT (letterset) worden gezet. Deze letterset is precies zo opgebouwd als de normale letterset dus ieder karakter kan gebruikt worden! De scroll is te laden vanuit de program-loader. Veel succes met de routine! R. v/d Meulen |