
|
Screen5-10/11 converter Genic Clubguide, 00-00-00
SCREEN 5 -> SCREEN 10/11 CONVERTER
====================================
Bij SCREEN 10 en 11 van de MSX2+ kun je ook het oude 16 uit
512 kleuren palet nog gebruiken. Het is dus mogelijk om
SCREEN 5 plaatjes naar die schermen over te zetten. Zo kun
je bijvoorbeeld op de ene helft van het scherm 2+ graphics
gebruiken en op de andere helft SCREEN 5 graphics.
Informatie over beeldopbouw
Voor ieder pixel op SCREEN 5 staat in het VRAM een groepje
van 4 bits. De volgorde van de pixels wordt gerekend van
linksboven, beeldlijn voor beeldlijn naar rechtsonder. Elk
groepje van 4 bits bevat het kleurnummer van het
overeenkomstige pixel. De kleurnummers gaan van 0 t/m 15. Op
een beeldlijn staan 256 pixels, dus er zijn 128 bytes per
lijn nodig. Er zijn 212 lijnen, dus in totaal beslaat de
beeldopslag 212 * 128 = 27136 bytes.
Voor iedere 4 pixels in SCREEN 10/11 staat in het VRAM een
groepje van 4 bytes. Ook hier gaat de volgorde van
linksonder naar rechtsboven. Die vier bytes zijn als volgt
opgebouwd: (binair)
C7 C6 C5 C4 C3 C2 C1 C0
1 Y Y Y Y A K K K
2 Y Y Y Y A K K K
3 Y Y Y Y A J J J
4 Y Y Y Y A J J J
Er zijn twee mogelijkheden:
- Als A=0 dan gaat het via het YJK principe. (Net als in
screen 12, alleen dan met Y van 0-15 in plaats van 0-31.)
- Als A=1 dan is Y het kleurnummer zoals je dat in screen 5
gewend bent (0-15 uit een palet van 512). J en K worden dan
genegeerd.
Het programma
Op de disk staan twee kant-en-klare programma's: SC5CONV.M2P
en SC5CONV2.M2P. De eerste in basic, met KUN gaat het wel
snel; de tweede in machinetaal.
We moeten eerst de palettabel verplaatsen. Die staat bij
SCREEN 5 namelijk vanaf &H7680 en bij SCREEN 10/11 vanaf
&HFA80. De palettabel is 32 bytes lang, dus hij wordt als
volgt verplaatst:
FOR I=0 TO 31 : VPOKE &HFA80+I,VPEEK(&H7680+I) : NEXT I
COLOR=RESTORE
COLOR=RESTORE is nodig om de verplaatste palettabel ook
werkelijk te zien.
Bij het omzetten moeten we er rekening mee houden dat elk
pixel in SCREEN 5 een halve byte inneemt, en in SCREEN 10/11
een hele byte. Daarom beginnen we rechtsonderaan met
omzetten. Dus:
FOR I=27135 TO 0 STEP -1
We lezen een byte en scheiden de twee pixels. De linker
noemen we P2 en de rechter P1:
P1 = VPEEK(I) AND 15 (15 = &B00001111)
P2 = VPEEK(I) AND 240 (240 = &B11110000)
Pixel P1 komt op adres I*2+1 en pixel P2 komt op adres I*2.
Om het A-bit op 1 te zetten moeten we er nog 8 bij optellen
(het A bit is het 3e bit, en 2^3 = 8). Pixel P1 moeten we
nog 4 bits naar rechts schuiven, dus vermenigvuldigen met 16
(2^4 = 16).
VPOKE I*2,P2+8
VPOKE I*2+1,P1*16+8
NEXT I
Nu is het programma klaar. Maar het gaat super langzaam. Met
KUN erbij is de snelheid goed (ongeveer net zo snel als
machinetaal). Probeer SC5CONV.M2P maar eens!
Nu in machinetaal
Als je geen KUN hebt zul je het in machinetaal moeten
vertalen. De volgende basic regels moeten vertaald worden:
1 FORI=27135TO0STEP-1
2 P1=VPEEK(I)AND15
3 P2=VPEEK(I)AND240
4 VPOKEI*2,P2+8
5 VPOKEI*2+1,P1*16+8
6 NEXTI
(Je hebt hiervoor uiteraard een assembler nodig!)
De getallen geven aan bij welke basic-regel het hoort.
ORG D000H ; beginadres
VPEEK: EQU 174H ; deze routine heb je nodig
VPOKE: EQU 177H ; idem
LD HL,27135 1,6 ; begin rechtsonder
LUS: CALL VPEEK 2,3 ; A = VPEEK(HL)
LD B,A 3 ; bewaar A in B
AND 0FH 2 ; onderste vier bits worden
LD C,A 2 ; opgeslagen in C
LD A,B 3 ; oude A weer terug
AND F0H 3 ; bovenste vier bits
PUSH HL ; bewaar adres
ADD HL,HL 4,5 ; adres = 2*HL
ADD A,8 4 ; zet bit 3 (A-bit)
CALL VPOKE 4 ; VPOKE HL,A
INC HL 5 ; adres = 2*HL+1
LD A,C 5 ; haal onderste vier bits terug
ADD A,A 5 ; dit is hetzelfde als A=A*16
ADD A,A 5 ; hierdoor worden de vier
ADD A,A 5 ; onderste bits de vier
ADD A,A 5 ; bovenste
ADD A,8 5 ; zet bit 3 (A-bit)
CALL VPOKE 5 ; VPOKE HL,A
POP HL ; haal oude adres weer terug
DEC HL 1,6 ; HL = HL-1
LD A,H 1,6 ; kijken of HL gelijk is
OR L 1,6 ; aan 0. als dat niet zo is,
JP NZ,LUS 1,6 ; dan spring naar LUS
RET ; terug naar basic
Kijk maar eens hoe snel het nu gaat! (zie SC5CONV2.MSX) Niet
veel sneller dan met KUN, maar wel veel sneller dan in
basic.
Nu hebben we de SCREEN 5 graphics dus omgezet naar SCREEN
11. Maar de MSX2+ graphics zijn bijna altijd in SCREEN 12.
Gelukkig is het omzetten van SCREEN 12 naar SCREEN 11 erg
eenvoudig. Bij SCREEN 12 worden 5 bits voor Y gebruikt. Het
meest rechtse bit daarvan is in SCREEN 11 het A-bit, dat in
de YJK mode op 0 moet staan. We hoeven dus alleen maar alle
A-bits gelijk te maken aan 0. Dat doen we met AND &B11110111
(=247).
In Basic ziet dat er als volgt uit:
10 SCREEN 11
20 BLOAD"NAAM.S12",S
30 LINE(0,0)-(255,211),247,BF,AND
40 IFINKEY$=""THEN40
50 END
Je kunt in regel 40 eventueel een save commando zetten om
het plaatje te saven. Veel succes met het programma.
Stefan Boer
|