Screen splitting Genic Clubguide, 00-00-00 Screen Splitting Screen splitting. Velen zullen zich hierbij niets, maar dan ook niets kunnen voorstellen. De term is puur verzonnen,dus ik kan u wat dat betreft geruststellen. Dit is eigenlijk alleen maar kost voor de betere machinetaal-freaks onder u. Screen splitting is een bepaalde truuk met de MSX-2 Video-processor om meerdere aparte schermen onder elkaar te simuleren. Het principe is alleen in machinetaal te construeren,maar kan vanuit basic gebruikt worden. Je kunt het voor de meest simpele dingen gebruiken, bijvoorbeeld: je wilt een bepaald logo het scherm in laten stuiteren, maar als je dan vdp(24) gebruikt, verschijnt er allemaal rommel onder in het beeld, want het video-geheugen onder lijn 212 (of 192) wordt gebruikt voor de sprites. Met zo'n screen split kun je dan bijvoorbeeld onder lijn 100 scherm pagina 1 schakelen, met vdp(24) op 0 gezet, waardoor dit gedeelte niet meestuitert. Of nog beter, je zet onder lijn 100 het scherm uit, zodat dit altijd zwart is. Screen splitting is mogelijk op iedere scherm-modus, en je kunt voor ieder split-blok alle VDP-registers anders instellen. De theorie Zoals bekend verondersteld mag worden genereert de MSX standaard een interrupt van 50 Hz. (Japanse modellen: 60 Hz.) Dat houdt dus in, dat de computer 50 keer per seconde naar adres 0038H in de ROM springt bij het opstarten. Hoe komt dit nu? Dit verschijnsel wordt gegenereerd door de VDP, die, steeds als hij een scherm heeft 'doorgeseind' naar uw monitor of TV, een signaal doorgeeft aan de Z80, die op zijn beurt dan weer zorgt voor de interrupt. De VDP is er op gebouwd om ook een signaal af te geven als hij bij een bepaalde lijn is, en dit principe hebben we nu net nodig. VDP registers 0 en 1: Bit - 7 6 5 4 3 2 1 0 ----------------------------------------- REG #0 - 0 DG IE2 IE1 M5 M4 M3 0 ----------------------------------------- REG #1 - 0 BL IE0 M1 M2 0 SI MAG ----------------------------------------- Als je de computer aanzet, en PRINT VDP(1) intypt, dan zul je zien, dat [IE0] altijd 1 is. Als je dan intypt VDP(1)=VDP(1) AND &B11011111, zul je zien dat de computer geen toetsen meer uitleest. Dit bit, [IE0], geeft namelijk aan dat de computer steeds onderaan het scherm een 'interrupt' moet genereren. Het bit [IE1] is heel handig bij de screensplit. Als dit gezet is, zal de computer steeds bij lijn X (Dit staat in register #19) ook een interrupt generen. De computer geeft nu dus een interrupt bij lijn X, in plaats van onderaan het scherm. Als we nu op iedere interrupt die lijn in register #19 met bijvoorbeeld 20 verhogen, dan krijgen we zo'n interrupt om de 20 lijnen. De interrupt komt dan meer als 50 keer per seconde voor. Dus als er nog muziek moet komen op diezelfde routine, let er dan wel op, dat die alleen aangeroepen wordt op bijvoorbeeld lijn 100, want anders loopt je muziek op zo'n slordige 100 Hz (als je 1 interrupt er bij maakt !) en dat is wel wat erg veel van het goede. Als er nou bij de eerste interrupt (bij lijn 100) VDP(24)=0 wordt ingegeven, en onderaan in het scherm VDP(24)=128, dan krijg je boven in het beeld dus een gedeelte normaal, en onderin het beeld is het plaatje verschoven. !! Dit principe kun je gebruiken met alle VDP-registers !! Hoe weet ik nou of die interrupt van de VDP komt? In het voorbeeld gaan we er gewoon van uit dat de interrupts alleen van de VDP komen. Maar we kunnen uit de VDP status-registers halen of die interrupt van de VDP komt, en of hij van de lijn interrupt komt of niet. Daar ga ik hier niet op in, wat dit uitlezen is in de praktijk meestal niet nodig. Alleen zul je merken dat bij het voorbeeld de screen split 'trilt' bij de scheiding. De meeste japans spellen kennen dit verschijnsel ook, maar het kan verholpen worden m.b.v de status-registers. De praktijk. Een voorbeeld - source code. We gaan dit voorbeeld eens uitvoeren: (DEZE ROUTINE MOET AANGEROEPEN WORDEN OP ADRES &HFD9A) DUS: &HFD9A: JP INTERR ; ; ; JUMPER: DEFB 255 ; INTERR: DI ; GEEN ANDERE INTERRUPTS ERDOORHEEN. LD A,(JUMPER) OR A JP Z,LIJN ; JUMPER ONGELIJK 0, DUS ; DEZE INTERRUPT IS OP DE LIJN. ONDER: XOR A LD (JUMPER),A ; DE VOLGENDE INTERRUPT IS WEL OP DE ; LIJN LD A,100 ; ZET DE LIJN IN REGISTER #19 OUT (&H99),A LD A,19 OR 128 OUT (&H99),A ; ;-------Hier komen de VDP-registers van boven. ; LD A,0 ; ZET VDP(24) OP 0. OUT (&H99),A LD A,23 ; REGISTER #23 OR 128 OUT (&H99),A ; ;-------Einde veranderde VDP-registers van boven. ; LD A,(&HF3DF) ; OUDE WAARDE VAN VDP(0) OR 16 ; ZET [IE1] OP 1. LD (&HF3DF),A OUT (&H99),A LD A,128 OUT (&H99),A RET ; SPRING TERUG ; LIJN: ; DEZE ROUTINE WORDT UITGEVOERD OP ; LIJN 100 (IETS LAGER !) LD A,255 LD (JUMPER),A LD A,(&HF3DF) RES 4,A ; RESET [IE1] LD (&HF3DF),A OUT (&H99),A LD A,128 OUT (&H99),A ; ;-------De veranderde registers onder de lijn. ; LD A,128 ; VDP(24)=128 OUT (&H99),A LD A,23 ; REGISTER #23 OR 128 OUT (&H99),A ; ;-------Einde veranderde registers onder de lijn. ; RET ; ; ; Dit programma staat ook op deze Clubguide onder de naam "SPLIT.BIN". Deze file begint op adres &H9000. Het resultaat komt alleen ten goede op een plaatje,dus: 10 REM "SPLIT.ART" 20 REM -door C.Cremers- 30 REM 40 SCREEN 5 : REM bijvoorbeeld screen 5. 50 BLOAD "plaatje.extensie",S 60 COLOR = RESTORE : REM niet bij screen 8 70 BLOAD "SPLIT.BIN" 80 POKE &HFD9A,&HC9 90 POKE &HFD9B,0:POKE&HFD9C,&H90 : REM POKE ADRES 100 POKE &HFD9A,&HC3 : REM ZET DE INTERRUPT AAN. 110 ON STOP GOSUB 130 : REM STOP ON 120 GOTO 120 130 POKE &HFD9A,&HC9 : REM CTRL-STOP 140 VDP(0)=VDP(0)AND&HEF : REM EVENTUEEL BIT [IE1] UITZETTEN 150 VDP(24)=0 : REM VDP(24) TERUG OP 0 !! 160 END Nou, in principe moet je nu in staat zijn zelf een screen split te construeren. Experimenteren kan tot verassende effecten leiden! Ideeen : - Meerdere screen-splits na elkaar zijn mogelijk, maar daarvoor is een andere routine nodig. Dan moet dus, op een screen-split, een nieuwe lijn naar register #19 geschreven worden, en de volgende interrupt moet goed afgevangen worden. - Met VDP(24) kun je bereiken, (zie voorbeeld) dat hetzelfde gedeelte van een plaatje 2 keer op het scherm verschijnt. Zo kun je een scroll bijv. boven in het beeld laten lopen, en onder in het beeld diezelfde scroll een sinus-beweging laten maken, zonder veel moeite voor de VDP ! - Let erop, dat, registers die je boven in het beeld verandert, ook weer terugzet na die lijn. - Het palet is ook een VDP-operatie. Twee of meer verschillende paletten op het beeld zijn heel goed mogelijk. Let wel op, dat de overgang niet zichtbaar is, want dit oogt niet echt afgewerkt. (Bijv. door een zwart balkje van een paar lijnen hoog, of een kleur die in beide paletten aanwezig is. Voor vragen, opmerkingen, suggesties of toevoegingen: Cas "Parallax" Cremers v.Oldenbarnevelt straat 37 6181 BC Elsloo (LB) Tel.: 04490-74593 (Ma-Vr van 19:00 tot 22:00) ------------------------------------------------------------ N.B. Voor eventuele routines die gebruik maken van het screen-split principe houdt de redaktie van Clubguide zich van harte aanbevolen. Stuur uw inzending naar: Ronald Egas De Blauwe Wereld 53 1398 EP Muiden Tel. 02942-3813 ------------------------------------------------------------ |