ZX Spectrum > PROGRAMOWANIE

Skopiowanie większej ilości danych do RAM

<< < (3/14) > >>

siudym:
Wlasnie BC nie moge uzyc jako koniec wskaznika wielkosci pliku. Moze nie opisalem dokladnie: Wskaznik FF bedzie zawsze w srodku pliku. Myk jest taki, ze plik binarny bedzie zawsze 1024 bajty (kwestia edytora, ktory taki bin wypluje), a skopiowane dane beda MAX 768 bajtow LUB MNIEJ (768 bo tyle tilesow 8x8 bedzie na ekranie w Sega Master System [256x192=768 - lub mniej). Wskaznik FF tym sterowac bedzie :) Aha i nie bedzie opcji aby wartosc FF byla jakos dodatkowo w innym miejscu bo ten 1kb to pamiec tilesow ekranu i FF to ostatni TILES ekranu zarezerwowany do tego celu (uzyty tylko raz w tym celu i nigdy w innym).

BC i NameTableEnd uzywalem wczesniej, ale szkoda mi bylo zajmowac bezsensu RAM na nieuzywane dane 768b+

matofesi:
OK. Ale... nie możesz na ten moment odłożyć BC na stos? Całość z LDIRem i tak będzie szybsza niż pętla sprawdzająca znacznik.

siudym:
W sumie to funkcja dziala ok, ale zawsze warto dopytac o alternatywy i analize :)

Pytanie o odpowiednik EOR z 6502, widze w Z80 jest instrukcja XOR - nie wiem czy poprawnie zapisalem kod Z80:

6502:

--- Kod: ---
LDA zmienna
EOR #$1D ; EOR (bitwise Exclusive OR)
STA zmienna     ; zapisz wynik


--- Koniec kodu ---


--- Kod: ---
LD A,(zmienna)
XOR $1D ; czy teraz XOR wykona sie na A ?
LD (zmienna),A ; i mozna zapisac do zmiennej wynik?




--- Koniec kodu ---

tapy:
Dobrze. Warto też zapamiętać, że XOR A jest często używany do zerowania akumulatora.

siudym:

--- Kod: ---
LDA zmienna
LSR A
LSR A
LSR A
STA wynik


--- Koniec kodu ---

Wartosc w zmienna jest w zakresie 00-FF, wykonujemy logiczne przesuniecie w prawo aby wywalic 3 nizsze bity.
Efektem bedzie "zaokraglenie" pewnych zakresow wartosci do jednej np:

- $00-$07 zapisze do wynik $00
- $08-$0F zapisze do wynik $01
- $10-$17 zapisze do wynik $02
- $18-$1F zapisze do wynik $03
- $20-$27 zapisze do wynik $04
(...)
- $E0-$E7 zapisze do wynik $1C
- $E8-$EF zapisze do wynik $1D
- $F0-$F7 zapisze do wynik $1E
- $F8-$FF zapisze do wynik $1F

W kodzie Z80 mam problem bo wyniki sa totalnie inne, domyslam sie, ze bit0 przenosi sie do bit7 czego nie ma w przypadku 6502
gdzie wypada i nie przenosi sie do bit7.
Probowalem uzyc rozkazu kasujacego znacznik C ale nic nie daje, z tego co czytam CCF nie kasuje ale robi invert C, niby OR A kasuje C
ale dalej nic nie zmienia - pewnie powodem sa same rozkazy shift right w Z80, ktore automatycznie przenosza bit0 do bit7??



--- Kod: ---
LD A,(zmienna)
;CCF ? OR A - nic nie zmieniaja
RRC A
RRC A
RRC A
LD (wynik),A


--- Koniec kodu ---

EDIT: hmm teraz dziala - czy to jedyna metoda aby uzyskac ten sam efekt?

   LD A,(zmienna)
   RR A
   OR A
   RR A
   OR A
   RR A
   OR A
   LD (wynik),A

wychodzi na to, ze musze za kazdym RR zerowac C aby bit0 nie wlazil w bit7 ?

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej