8. 9. 2009

Z archivu MB Maniax: Převod atributových souřadnic na pixelovou adresu ve videopaměti

Následující článek se nacházel na SpeccyWebu v sekci Coding a jeho autorem není nikdo jiný, než Mike/ZeroTeam. Užijte si ho.

--
Určite ste vo svojich programoch prišli k zaujímavému problému, ako previesť 'atribútové' súradnice na pixelovú adresu vo videopamäti. Ale no tak, aspoň jeden z Vás určite áno. Keďže Spectrum nemá lineárne adresovanie videopamäti, treba skutočnú adresu vypočítať. V prvom rade si zožeňte tabuľku adries videopamäti. Nájdete ju v napríklad v ZXM č. 06/94 alebo v tabuľke videopamäti od Nairama. Ako je známe, tak videopamäť je rozdelená na tri tretiny. Najprv si všimnime vyšší bajt adries prvých riadkov v atribútoch. Pre prvú tretinu je to #40, pre druhú #48 a pre tretiu #50. Skúsme si tieto čísla zapísať pod seba v dvojkovej sústave:

01000000
01001000
01010000

Ukážme si teraz, ako vyzerajú niektoré Y-súradnice z prvej, druhej a tretej tretiny. Zoberme si napríklad 3, 12 a 22.

00000011
00001100
00010110

A vida, každá tretina je už zakódovaná, ako v Y-súradnici, tak v hornom bajte adresy. Povedzme, že naša rutinka na výpočet pixelovej adresy očakáva súradnicu X v registri C a súradnicu Y v registri B a nazvime si ju napríklad CHCU_PIXEL_ADRESU. Môžeme teda začať s prvým krokom:

CHCU_PIXEL_ADRESU ld a,b
and 11000b
add a,40h
ld h,a

Tak, vyšší bajt máme za sebou a skúsme sa pozrieť na nižší. Vezmime si začiatočné adresy (s X súradnicou rovnou nule). Opakujú sa tam čísla #00, #20, #40, #60, #80, #A0, #C0 a #E0. Napíšme si ich teda znova pod seba v dvojkovej sústave.

00000000
00100000
01000000
01100000
10000000
10100000
11000000
11100000

Určite už radostne vykrikujete: "Aha, stačí rotovať Y súradnicu o 5 bitov doľava". Áno, určite máte pravdu, ale čo by sa stalo, keby sme ju rotovali o 3 bity doprava? Určite na správnu odpoveď príjdete aj sami. Pozor na nechcené bity, tie treba vynulovať dobre miereným andom. K takto pripravenej adrese ešte pričítame X súradnicu. Pozor na to, aby súradnica neprekročila rozmedzie 0-31. Skúsme teda doplniť náš program.

CHCU_PIXEL_ADRESU ld a,b ;vstup: reg.C - X, reg.B - Y
and 11000b ;výstup: HL - adresa vo videopamäti
add a,40h
ld h,a
ld a,b
and 111b
rrca
rrca
rrca
add a,c
ld l,a
ret

Tak a to je všetko, čo by Vám malo stačiť ako odpoveď na Vašu otázku 'Ako získať pixelovú adresu z atribútových súradníc' a hanbili ste sa ma opýtať.

mikezt

Žádné komentáře: