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 |