ZX Spectrum > PROGRAMOWANIE
Proste i przyjemne procedurki asemblerowe dla początkujących
sect0r:
Chciałbym umieścić często używane i przydatne procedury w jednym miejscu.
W większości będą przepisane z książek, znalezione gdzieś na forach, w gazetach itp.
Oczywiście nie muszę wspominać, że chętnie ujrzymy zoptymalizowane, szybsze odpowiedniki tych procedurek.
Osoby uczące się, lub chcące nauczyć się asemblera prosi się o komentowanie i zadawanie pytań ;)
Zacznę od prostego czyszczenia ekranu przy pomocy LDIR
--- Kod: ---Niszczone: A
Wyjście: BC=0, DE=5800h, HL=57FFh (lub inne wartości DE, HL użyte przez nas)
LD HL,4000h
LD BC,17FFh
LD (HL),L
LD D,H
LD E,1
LDIR
RET
--- Koniec kodu ---
Użycie LD (HL),L (dopóki L=0) jest szybsze i zajmuje mniej pamięci niż LD (HL),0
Procedurkę można dostosować do czyszczenia jednej, dwóch części , czy całego ekranu.
Poniżej odpowiednie przydatne wartości HL i BC
Adres w HLGóra4000hŚrodek 4800hDół5000h
Wartość dla BC1 część część 07FFh1 i 2 część ekranu0FFFhcały ekran17FFh
Dla przykładu, jeśli chcemy wyczyścić dwie dolne tercje użyjemy
LD HL,4800h
LD BC,0FFFh
PS. Jeśli posiadamy jakieś ważne warości w rejestrach A, B, C, D, E, H, L możemy odłożyć je na stosie poprzez użycie PUSH xx (gdzie xx to para rejestrów np. BC),
a następnie po powrocie z procedurki ściągamy je komendą POP xx
sect0r:
Kolejne procedurki
Dla podanego w HL adresu ekranu (bajtu), otrzymamy w BC adres odpowiadającej mu komórki w pamięci atrybutów (przypominam że atrybuty w ZX Spectrum odnoszą się do pola 8x8 pixeli)
--- Kod: ---Wejście: HL=adres komórki pamięci ekranu
Niszczone: HL,BC,DE,A
Wyjście: DE=adres komórki atrybutów
LD A,H
RRCA
RRCA
RRCA
AND 3
OR 58h
LD D,A
LD E,L
RET
--- Koniec kodu ---
I jej odwrotność, znajdująca adres pierwszego bajtu (pierwsze 8x1 pikseli) w pamięci ekranu odpowiadającego danej komórce pamięci atrybutów
--- Kod: ---Wejście: HL=Adres atrybutów
Niszczone: HL,BC,DE,A
Wyjście: DE=adres pamięci ekranu, A=D
LD A,H
AND 3
RLCA
RLCA
RLCA
OR 40h
LD D,A
LD E,L
RET
--- Koniec kodu ---
sect0r:
Odnośnie pierwszego listingu, powinno być
Wartość dla BC:
1 część ekranu 07FFh
2 części ekranu 0FFFh
cały ekran 17FFh
matofesi:
To ja tylko powiem, że kasowanie pamięci LDIRem jest fajne pod warunkiem, że nam się nie spieszy ;) Wykonanie w odpowiednio wyliczonej pętli sekwencji LDI zajmie więcej miejsca ale zaoszczędzi sporo czasu traconego przy LDIR na wewnętrzną obsługę pętli.
A z procedurami liczącymi różne adresy ekranu to też radzę uważać - jeśli potrzebujemy ich często to warto się zastanowić czy da się takie informacje stablicować i wyjmować dane z tablicy zamiast liczyć :)
Oczywiście w większości zastosowań nie ma to strategicznego znaczenia, ale jak się dłubie jakieś bardziej zaawansowane efekty graficzne to trzeba się liczyć z każdym taktem ;)
Tygrys:
A jak liczenie się z każdym taktem.. to z pomocą przychodzi stos ;)
Ale to może temat nie na post a bardziej artykuł.
Nawigacja
[#] Następna strona
Idź do wersji pełnej