Sprites in ML Genic Clubguide, 00-00-00 SPRITES IN ML SPRITES ZOALS ZE WERKELIJK ZIJN ================================= Iedereen die een beetje met BASIC heeft zitten klooien zal gemerkt hebben dat sprites heel makkelijk zijn in het gebruik en in aansturing, maar dat komt alleen maar omdat de BIOS zich intensief bemoeit met de spriteaansturing. Als je dus gaat proberen om sprites in ML te gebruiken kom je al snel voor raadsels te staan die je niet ‚‚n twee drie op weet te lossen. Je kunt natuurlijk gebruik gaan maken van de BIOS routines maar persoonlijk heb ik daar een hekel aan. Als je besluit om een aansturing te gebruiken die niets met de BIOS te maken heeft, dan kan je een aantal leuke grapjes uithalen die heel handig kunnen zijn. Zo is het mogelijk om op 1 scherm van 32kB 1024 sprites van 16x16 te ontwerpen waarvan je er 64 per keer kunt gebruiken. Als er van pagina gewisseld wordt, dan hoeven de sprites niet mee veranderd te worden. De feitelijke aansturing wordt ook sneller en het is bij een sprite botsing mogelijk om de coordinaten van de gebotste sprites op te vragen. Dit zijn een paar voorbeelden van de verschillen tussen de BIOS aansturing een een direkte aansturing. Nu volgt een beschrijving en uitleg van de VDP registers die met sprites te maken hebben. B7 B6 B5 B4 B3 B2 B1 B0 Reg. 1 x x x x x x SZ MAG 8 x x x x x x SPD x 11 x x x x x x D16 D15 5 D14 D13 D12 D11 D10 D09 D08 D07 6 0 0 E16 E15 E14 E13 E12 E11 SZ = Sprite size (0=8*8 1=16*16) MAG = Magnify sprites (1=magnify) D16 - D07 = Adres voor spritekleur en positie in VRAM E16 - E11 = Adres voor spritepatronen in VRAM (Hierover later meer) Statusregisters: B7 B6 B5 B4 B3 B2 B1 B0 Reg. 0 x 5S C F4 F3 F2 F1 F0 3 X7 X6 X5 X4 X3 X2 X1 X0 4 1 1 1 1 1 1 1 X8 5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 6 1 1 1 1 1 1 x Y8 5S = 1 als: er op screen 1 t/m 3 meer dan 4 sprites op 1 horizontale lijn staan. er op screen 5 t/m 8 meer dan 8 sprites op 1 horizontale lijn staan. C = 1 als er een spritebotsing plaats vindt. F4 - F0 = Is het nummer van de sprite die als vijde of negende op 1 horizontale lijn staat. X8 - X0 = X-coordinaat van botsende sprite Y8 - Y0 = Y-coordinaat van botsende sprite Dit is alle informatie over sprites die in de VDP registers te vinden is. Het tweede deel over de statusregisters laat niets te wensen over en is helemaal duidelijk. Het eerste deel is echter wat lastiger omdat er wat addertjes onder het gras zitten. Het gaat daarbij over de registers 11,5 en 6. Reg. 11 en 5 vormen samen een adres waar de kleur- en positietabel van de sprites zich bevindt en registers 6 geeft aan waar de patroontabel van de sprites begint. Het eerste addertje dat we tegen komen is dat Reg.5 niet zomaar alle waardes mag hebben tussen 0 en 255. Feitelijk kan Reg.5 maar 32 waardes hebben omdat er bij andere waardes geen sprites op het scherm komen. Een beschrijving van de registers: Reg. 6 bevat het startadres van de patroontabel (vorm van de sprites) en kan liggen tussen 0 en 63. Het adres kan in BASIC berekend worden met PATADR = VDP(6)*2^11 Natuurlijk moet je rekening houden met het feit dat het VRAM 128kB groot is. Is VDP(6)>31 dan zit je in de hoogste 64kB. In ML gaat het zo (In A staat de waarde van R#6) RLCA RLCA RLCA RES 0,A LD H,A ; Het patroonstartadres staat in HL en als je in LD L,0 ; de hoogste 64kB zit dan is de Cy hoog. RET Reg. 11 en 5 (Opm: VDP(12)=Reg.11=R#11) bevatten samen een referentieadres waaruit het startadres van de positietabel en de kleurtabel gehaald kan worden. In BASIC: XYADR = VDP(12)*2^15+(VDP(5)-3)*128:' Positie COLADR = VDP(12)*2^15+(vdp(5)-7)*128:' Kleurtabel Ook hier moet je weer op de hoogste 64kB passen. Hier kan je daarop testen door te kijken of VDP(12)>1 In ML: (In A en B staan de waardes van R#5 en R#11) SUB 3 ; Trek 3 van A af als je het positieadres RRCA ; wilt hebben en trek er 7 vanaf als je PUSH AF ; het kleuradres wilt hebben. AND &H80 LD L,A POP AF AND &H7F LD H,A LD A,B RRCA LD B,A AND &H80 OR H LD H,A LD A,B ; In HL staat het betreffende startadres RRCA ; en de Cy geeft aan of je in de hoogste RET ; 64kB zit. Met deze informatie ben je nu in staat om de startadressen van de spritetabellen te berekenen, maar ben je nog niet in staat om de VDP registers van een andere waarde te voorzien. Zoals vermeld kan reg. 5 niet zomaar elke waarde krijgen, maar de waardes die dit register kan krijgen kan je eenvoudig berekenen met de formule: VDP(5) = X OR 7 Deze formule is getest op screen 5 t/m 8 en klopt daar altijd. De regel is gewoon dat bit 0 t/m 2 van Reg.5 altijd 1 moeten zijn om sprites op het scherm te kunnen toveren. Reg.6 mag elke waarde hebben en het komt er praktisch op neer dat je in screen 5 en 6 om de 16 lijnen en in screen 7 en 8 om de 8 lijnen een nieuwe patroontabel kunt beginnen. Vb: Screen 5, VDP(6)=31 ==> Startlijn = 31*16 = 496 ==> Page 1, lijn 496 - 256 = 240 Reg.11 kan de waardes 0 t/m 3 bevatten en elke waarde komt overeen met 32kB VRAM. In screen 5 en 6 kan je dus de ingestelde page lezen door reg.11 te lezen. Dit is heel leuk, want nu kan je dus de spritetabellen op page 3 zetten terwijl je de sprites op page 0 zichtbaar maakt zonder dat die tabellen in de weg zitten. Opm: Je kunt beter Reg.2 lezen om er achter te komen welke page is ingesteld, maar als je vanuit BASIC de schermen instelt dan levert dit geen problemen op. Dit was het voorlopig, een volgende keer zal ik de feitelijke invulling van de tabellen toelichten. Alex van der Wal |