ZX Spectrum > PROGRAMOWANIE

Skopiowanie większej ilości danych do RAM

<< < (2/14) > >>

Phonex:

--- Cytat: Dalthon w 2021.10.25, 17:29:35 ---

--- Cytuj ---copy_loop:
        ldi
        inc hl
        inc hl
        jp po,copy_loop
--- Koniec cytatu ---

Tutaj problemem jest to że warunkowy skok odnosi się do zwiększania HL - co też nie ma prawa zadziałać ;)

--- Koniec cytatu ---

Racji nie masz, młody padawanie, nie dlatego nie działa :P
Skok warunkowy odnosi się do LDI, tylko warunek jest źle dobrany.
I za dużo zwiększania HL, instrukcja LDI sama już raz zwiększa.
Tak jest dobrze:

--- Kod: ---copy_loop:
        LDI
        INC HL
        JP PE, copy_loop
        RET

--- Koniec kodu ---

Dalthon:

--- Cytat: Phonex w 2021.10.25, 22:06:39 ---Racji nie masz, młody padawanie, nie dlatego nie działa :P

--- Koniec cytatu ---
oj tam, oj tam ;) ale dziękuję - nie pamiętam już by ktoś mnie nazwał "młody" :D

siudym:
Jeszcze bym prosil o weryfikacje kodu:

NameTable to bedzie plik incbin o wielkosci do 1024bajtow, ale ze wzgledu, ze nie bedzie zawsze tej samej wielkosci bedzie ograniczony bajtem o wartosci FF w "srodku". Czyli kopiujemy dane pod adres $C100 i skopiuje sie tyle ile pozwoli ustawiony w pliku $FF:


--- Kod: ---CopyNT:

LD HL,NameTable ; kopiujemy do HL adres zrodla
LD DE,$C100 ; kopiujemy do DE adres docelowy

CopyNT_Loop:

LD A,(HL) ; ladujemy do A wartosc spod adresu wskazanego w HL
CP $FF ; sprawdzamy czy wartosc w A = FF
JR Z,CopyNT_End ; jak wartosc sie zgadza skok zakonczyc funkcje a jak nie to wykonaj "LD (DE),(HL)" nizej instrukcja LDI
LDI ; ("LD (DE),(HL)", then increments DE and HL, and decrements BC)
JR CopyNT_Loop ; skocz zapetlic operacje

CopyNT_End:


--- Koniec kodu ---

trojacek:
Wygląda całkiem OK.
Jedyne, do czego bym się przyczepił, to brak "bezpiecznika". Jeśli z jakichś przyczyn pętla nie znajdzie kodu #FF, to się zrobi nieprzewidywalna (w skrajnym przypadku może kopiować bajty nawet aż do "przekręcenia licznika" i znalezienia jakiegoś #FF w pamięci ROM, a w międzyczasie m.in. zamazać stos). Warto więc pierwszy bajt po buforze ustawić na #FF.

matofesi:
@trojacek Yhym... Pytanie tylko jak to sobie wyobrażasz? Zakładam, że "bezpiecznik" jest dlatego, że dane będą wczytywane "skądś" czyli jakieś I/O albo coś więc co do zasady nie wiesz ile ich będzie ciężko więc postawić znacznik w odpowiednim miejscu. Trzeba by wypełniać cały bufor FFami przed wczytaniem danych albo zmienić procedurę wczytywania żeby dopisywała znacznik.

Z drugiej strony jeśli dane są faktycznie wczytywane statycznie poprzez incbin przy kompilacji to cała koncepcja jest zupełnie bez sensu bo wtedy dokładnie wiemy ile jest tych danych i wystarczy zrobić LDIRa.


--- Kod: ---ld hl,NameTable
ld de,$c100
ld bc,NameTableEnd-NameTable
ldir

...

NameTable: incbin "plik.bin"
NameTableEnd:


--- Koniec kodu ---

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej