ZX Spectrum > PROGRAMOWANIE

Proste i przyjemne procedurki asemblerowe dla początkujących

(1/21) > >>

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

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej