ZX Spectrum - adresy VRAM

Jak jistě víte adresování pixelů na ZX Spectru není tak úplně jednoduché. Rozhodně není lineární jako např. v režimu VGA 13 na PC takže je nutné provádět všelijaké přepočty, které ovšem mohou za určitých okolností naopak práci s VRAM poněkud zrychlit. Předně VRAM je rozdělena na 3 části po 2kB, tyto části začínají na adresách 16384, 18432 a 20480. Každá část obsahuje 8 řádků o osmi bodech na výšku a 32 bytech (tj. 256 bodech) na šířku. Za tím vším teprve následují atributy - 768 bytů, které určují barvu znaků (čtverců o 8x8 bodech).

řádekřádek b.1.VRAMdvojkově2. VRAMdvojkově
0.000001638401000000 000000004915211000000 00000000
1.000011641601000000 001000004918411000000 00100000
2.000101644801000000 010000004921611000000 01000000
3.000111648001000000 011000004924811000000 01100000
4.001001651201000000 100000004928011000000 10000000
5.001011654401000000 101000004931211000000 10100000
6.001101657601000000 110000004934411000000 11000000
7.001111660801000000 111000004937611000000 11100000
8.010001843201001000 000000005120011001000 00000000
9.010011846401001000 001000005123211001000 00100000
10.010101849601001000 010000005126411001000 01000000
11.010111852801001000 011000005129611001000 01100000
12.011001856001001000 100000005132811001000 10000000
13.011011859201001000 101000005136011001000 10100000
14.011101862401001000 110000005139211001000 11000000
15.011111865601001000 111000005142411001000 11100000
16.100002048001010000 000000005324811010000 00000000
17.100012051201010000 001000005328011010000 00100000
18.100102054401010000 010000005331211010000 01000000
19.100112057601010000 011000005334411010000 01100000
20.101002060801010000 100000005337611010000 10000000
21.101012064001010000 101000005340811010000 10100000
22.101102067201010000 110000005344011010000 11000000
23.101112070401010000 111000005347211010000 11100000
atrib. - 2252801011000 000000005529611011000 00000000

Rozsáhlejší a podrobnější tabulka viz soubor na odkazovaný na konci této stránky.

Ukázka výpočtu adresy ve VRAM pro souřadnice XY

Podobná rutina je v ROM na adrese 8881, ale je stavěná na trochu jinou kombinaci registrů na vstupu, což se mi nehodilo a nepočítá s VRAM od 49152, takže jsem si napsal něco podobného, trochu jinak. Ta rutina v ROM je o něco rychlejší, včetně potřebné přípravy mi to vychází cca o 9T, takže vcelku nepatrně.

;==============================================================================
; SPRITE_XY2ADDR - výpočet adresy ve stínové VRAM
;==============================================================================
; výpočet adresy ve VRAM podle souřadnic spritu, počítá adresu do 2. VRAM od adresy 49152
;
; Požaduje:
; 	souřadnice v HL
;	H = Y
;	L = X
;
; Vrací:
;	adresu v HL
;	počet rotací vlevo v A
;
; Mění:
;	DE (ukládá do něj mezivýsledky a nakonec prohodí s HL)
;
; Časová náročnost 19*4 + 6*7 = 118T + return a call

SPRITE_XY2ADDR	ld	a,h		; 4T - vezmi Y z H do A
		rrca			; 4T - 3x rotací vpravo (dolní 3 bity na místo horních)
		rrca			; 4T
		rrca			; 4T
		and	00011000b	; 7T - ponech jen bity Y7 a Y6 posunuté 3x vpravo
		or	11000000b	; 7T - pričti 192 (49152 = 11000000 00000000)
		xor	h		; 4T - sxoruju s Yovou souřadnicí
		and	11111000b	; 7T - ponechám horních 5 bitů
		xor	h		; 4T - takže dvojitý xor ovlivní jen dolní 3 bity
		ld	d,a		; 4T - výsledek ulož do D, horní byte je hotov
		ld	a,h		; 4T - naposledy vezmu souřadnici Y
		rlca			; 4T - 2x vlevo
		rlca			; 4T
		and	11100000b	; 7T - ponechám bity Y5, Y4, Y3
		ld	e,a		; 4T - uložím do E
		ld	a,l		; 4T - vezmu Xovou souřadnici
		rrca			; 4T - 3x vpravo
		rrca			; 4T
		rrca			; 4T
		and	00011111b	; 7T
		or	e		; 4T - přioruju dříve získané bity z Y
		ld	e,a		; 4T - výsledek uložím do E, dolní byte je hotov
		ld	a,l		; 4T - naposledy Xovou souřadnici
		and	00000111b	; 7T - ponechám dolní 3 bity, X v bytu (rotace vpravo)
		ex	hl,de		; 4T - prohodím, výsledná adresa se dostane do HL
		ret

Výpočet adresy atributu

Máme-li adresu pixelu, je dopočítání adresy atributu docela snadné.

;=============================================================================
; ATTRADR - výpočet adresy atributu z adresy pixelu
;=============================================================================
;VSTUP-	v HL adresa pixelu

ATTRADR		ld	a,h
		rrca
		rrca
		rrca
		xor	1010000b
		ld	h,a
		ret

Download

[ Zpět na hlavní stránku ]

Cygnusova stránka o ZX Spectru a kompatibilních počítačích byla napsána (přepsána) výhradně pomocí svobodného Open Source softwaru. V případě že naleznete chybu, nebo byste rádi cokoliv co se ZX Spectrem souvisí, neváhejte mi napsat na některý z mých emailů, nebo pracovně do zaměstnání. Stručně o mém webu se můžete dočíst zde.