
|
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
------------------------------------------------------------
|