ZX Spectrum > PROGRAMOWANIE
Skopiowanie większej ilości danych do RAM
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
[#] Następna strona
Idź do wersji pełnej