Programozástechnika: Karakterscroll

4 csillagos Cikk értékelése: 4,87 (15 szavazatból)

Bevezető

A ZX Spectrumon legegyszerűbben megvalósítható scroll rutinok egyikére mutatok példát. Bár kétségtelen, hogy ez a legkevésbé szívesen alkalmazott scroll, mégis fontos mérföldkő a bonyolultabb scrollok megértése felé vezető úton. (Milyen szépen fogalmaztam...)

Feladat

A feladatban 8x8 pixeles standard ASCII karaktereket írunk ki adott karaktersor 32. oszlopába, majd az egész sort egyel balra toljuk.

Elméleti háttér

Standard ASCII karakterkészlet
Az ASCII szabvány az egyik legrégebbi karakter azonosító formula a számítástechnikában. Lényege, hogy az egyes karakterekhez egy egyedi sorszámot (ún. indexet) rendel. Így pl. a szóköz a 32., az 'A' betű 65., míg a 'z' a 122. indexen -és csakis ott- található. Az írásjelek, betűk és számok 32-127-ig vannak értelmezve, a többi definiálatlan, vagy ún. speciális karakter ( pl. az újsor kódja a 13). Tehát a karakterek 0-127-ig vannak vannak leindexelve. Ez azért is fontos, mert így alkalmazható rájuk 7 bites tömörítés (7 biten leírható lagnagyobb szám a 127).

Karakterkészlet a Spectrumon
A Spectrumban a karakterkészlet $3D00 címtől helyezkedik el a memóriában 768 byte hosszan. Az ASCII karaktereket 32-127 indexel, külön-külön 8 byte-on, sorfolytonosan tárolja a memóriában. Ez a 96 karakteres font készlet szabvánnyá is vált a Spectrumosok között, így szinte minden rajzoló és font szerkesztő -pl. Art Studio- támogatja.

Karakter pozíció
A ZX Spectrum képernyő memóriája egy "kissé" trükkös (mondhatni rémálom). Megpróbálom a lehető legegyszerűbben megközelíteni a problémát: A Spectrum video memóriája címzés szerint 3 harmadra van osztva. Minden harmad 8 karaktersort tartalmaz, melyek mindegyike 8-8 pixelsorból áll. A harmadok egyenként $800 (2048) byte hosszúak és valahogy így épülnek fel: $0000-$00FF 0. sorok, $0100-$01FF 1. sorok ... $0700-$07FF 8. sorok. A sorok szerkezete: $00-$1F 0. sor, $20-$3F 1.sor ... ... $E0-$FF 8. sor.

Példa: Határozzuk meg tetszőleges harmad 2. karaktersor 5. pixelsorának 0.byte-jának a címét:


   addr = $40 + $0500 + $00 = $0540
   ahol a $40 = 2. karaktersor
          $0500 = 5. pixelsor
A Spectrum soronként 256 pixel megjelenítését teszi lehetővé, amit nagyon okosan 32 byte-on ír le. Az-az egy byte-on 8 pixelt. Ez azért lehetséges, mert a Spectrum külön kezeli az attribútumokat a a pixel adatoktól, így egy pixel leírható 1 biten (igaz vagy hamis). Ez rendkívűl memóriatakarékos eljárás, azonban, mint később látni fogjuk, nagyon megnehezíti a programozók életét.
A videomemória a $4000-$57FF területen a pixel-, míg az $5800-$5AFF területen az attribútum adatokat tárolja.
Az egyes harmadok:

   0. $4000-$47FF
   1. $4800-$4FFF
   2. $5000-$57FF
Példa: Határozzuk meg 100. pixelsor 8. byte-jának címét:

   100 div 64 = 1 --> 2. képernyőharmad
   100 mod 64 = 36 --> a 2. harmad 36.sorát keressük
   36 div 8 = 4 --> 3. karaktersor
   36 mod 8 = 4 --> 3. pixelsor

   addr = $4000 + ($01 * $0800) + $60 + $0300 + $08 = $4B68 (19304)
   ahol   $4000 = képernyő memória kezdő címe
          $01 * $0800 = képernyő harmad
          $60 = karaktersor
          $0300 = pixelsor
Elsőre kicsit bonyolult, de bele lehet jönni...
A látvány nem túl szép, de nagyon hatásos. Úgy megy 50 fps-al, mint a huzat.

A cscrleft.asm tartalmazza a Karakterscroll balra c. effekt részletes leírását és elméleti bemutatóját a témáról;
a cscrleft.tap fájl pedig emulátorban futtatható TAP formátumban.
Jó kódolást!

Publikálás a portálon: 0000-00-00 00:00:00