Autor Wątek: Skopiowanie większej ilości danych do RAM  (Przeczytany 19236 razy)

Phonex

  • *****
  • Wiadomości: 1232
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #15 dnia: 2021.10.30, 16:13:37 »
Zamiast RRA trzeba użyć RRCA.
http://www.z80.info/z80syntx.htm#RRCA
Zawsze zaglądam na tą stronę jak coś mi nie działa w przesuwaniu, bo często myślę odwrotnie: że RRA przesuwa "normalnie", a RRCA przez C ;)

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #16 dnia: 2021.10.30, 16:24:18 »
Ale wlasnie robilem 3x RRCA i wynik byl zly. Chodzi o to aby bit0 wyskakujac nie pojawial sie w bit7.

Phonex

  • *****
  • Wiadomości: 1232
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #17 dnia: 2021.10.30, 16:41:11 »
Ach! Zasugerowałem się że użyłeś RRA. RR to skrót od Rotate Right, czyli przesuwa w kółko.
A tu trzeba użyć SRL A - Shift Right Logically (bo jeszcze jest przesuwanie arytmetyczne - zachowujące znak liczby (czyli bit 7)).
http://www.z80.info/z80syntx.htm#SRL
Ale uwaga, przesuwania logicznego w lewo - nie ma >:( (jest jakiś nieudokumentowany, ale coś robi inaczej, chyba wsuwa "1" zamiast "0").

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #18 dnia: 2021.10.30, 16:48:50 »
Dziala :) Kurcze jak ja zerkalem na rozkazy shiftu w prawo, ze go przegapilem...

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #19 dnia: 2021.10.30, 22:06:48 »
Nie moge juz edytowac, ale jeszcze taki myk jest:

   AND %11111000
   RR A
   RR A
   RR A

Zerujemy bity 0,1,3 i teraz nawet jak wyskocza do bit7 to nie spowoduja krzywdy ;)

Phonex

  • *****
  • Wiadomości: 1232
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #20 dnia: 2021.10.31, 10:31:14 »
Niezłe :)
O bajt krótsze i o pięć taktów szybsze niż 3*SRL A!

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #21 dnia: 2021.11.02, 12:28:31 »
Kolejny problem  8)

Mam w HL adres pamieci, ale musze odjac od H $89 - czyli jak w HL mam $C100 to odejmujac od H $89 powinienem miec w HL adres $3800.
Myslalem, ze wystarczy SUB H,$89 i potem w HL bedzie odpowiedni wynik, ale niestety tak to nie dziala.


LD D,$89
LD E,$00
SBC HL,DE

To dziala, nie wiem czy inna mozliwosc jest.

matofesi

  • *****
  • Wiadomości: 1965
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #22 dnia: 2021.11.02, 12:45:01 »
Arytmetyka 8-bit działa wyłącznie na akumulatorze. Czyli musiałbyś zrobić ld a,h/sub $89/ld h,a.

Jeśli robisz na 16 bitach to ld de,$8900 - będzie krócej niż dwa ld do połówek. Poza tym pamiętaj, że SBC odejmuje z przeniesieniem więc jeśli nie jesteś pewien czy CY jest wyzerowane to trzeba zrobić np. or a przed odjęciem.

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #23 dnia: 2021.11.02, 13:29:28 »
ok dzieki, a wartosci odejmowania nie spowoduja wykroczenie poza 0-255 bo zrodlowy adres ma zawsze C1-C6 wiec adres odjety bedzie tez podobnie zawsze 38-3D

matofesi

  • *****
  • Wiadomości: 1965
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #24 dnia: 2021.11.02, 13:39:31 »
Ale to nie o to chodzi co się stanie w wyniku - SBC HL,DE odejmuje od wartości HL wartość DE oraz wartość znacznika CY. Jeśli nie upewnisz się, że CY jest wyzerowane to może być tak, że SBC odejmie ci o jeden więcej niż się spodziewasz.

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #25 dnia: 2021.11.17, 14:46:04 »
Nie bardzo rozumiem zastosowania rejestrow indexowych w Z80 - dzialaja albo totalnie inaczej niz te w 6502, albo ich nie rozumiem:

Przykladowo mam w pamieci ram jakis ciag zmiennych np. zaczynaja sie w $C000

zmienna00 db
zmienna01 db
zmienna02 db
....
zmienna98 db
zmienna99 db

teraz w 6502 uzywajac np, rejestru indexowego Y moge zaladowac do akumulatora zmienna wskazana przez index:

ldy #$20
lda zmienna00,y

teraz w aku mam zaladowana wartosc zmiennej nr 32 (nazwy maja dec, wiec bedzie to wartosc ze zmienna32)

Jak cos podobnego zrobic w Z80?

matofesi

  • *****
  • Wiadomości: 1965
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #26 dnia: 2021.11.17, 14:54:43 »
Rejestry indeksowe IX/IY służą do "prostego" dostępu do bloku 256 bajtów adresowanego bezpośrednim indeksem. To co napisałeś to byłoby mniej więcej coś takiego:
ld ix,zmienna00
ls a,(ix+32)

Tyle, że to nie jest to, co robią rejestry indeksowe (i ich tryby adresowania) w 6502. Z80 jest pod tym względem znacznie bardziej "uproszczony" - ma w zasadzie trzy tryby adresowania na krzyż i nadrabia skomplikowanymi instrukcjami i liczbą rejestrów.

steev

  • *****
  • Wiadomości: 1303
  • Miejsce pobytu:
    inode 42
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #27 dnia: 2021.11.17, 15:00:33 »
ld hl,zmienna00
ld de,$20
add hl,de
ld a,(hl)

Indeksowe w Z80 działają inaczej - nie możesz wziąć indeksu z rejestru.

ld ix,tabela
ld a,(ix+0)
ld e,(ix+64)
ld c,(ix-10)

Natomiast, jeśli wyrównasz tabelę do granicy 256 bajtów ( do adresu $xx00) to możesz zastosować prostą sztuczkę
ld hl,tabela
...  ; dowolne operacje traktujące rejestr l jako rejestr indeksowy
ld d,(hl)
Machines should work. People should think.

siudym

  • **
  • Wiadomości: 66
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #28 dnia: 2021.11.18, 15:13:46 »
Nieco pogubiłem się.

Kombinuje:  ;) pewnie zle

ld a,$10 ; a jako index
call funkcja ; skocz wybrac z adresu $C000 bajt zwiekszony o wartosc w A
ld a,d
ld (zmienna),a            ; teraz w zmienna zapisalem wartosc spod adresu $C000+$10 ?


funkcja:
ld hl,$C000

; - teraz mozna dodac do L wartosc aku uzyskujac zwiekszony adres HL

add l,a ; adc?

ld d,(hl)
ret

« Ostatnia zmiana: 2021.11.18, 15:33:57 wysłana przez siudym »

steev

  • *****
  • Wiadomości: 1303
  • Miejsce pobytu:
    inode 42
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #29 dnia: 2021.11.18, 15:25:10 »
ld a,$10
 call pobierz
 ld (zmienna),a
 ... ; reszta kodu
 ret

pobierz:
 ld hl,$c000 ; lub ld h,$c0 - szybciej i jeden bajt mniej :)
 ld l,a
 ld a,(hl) ; zwraca wartość od razu w akumulatorze
 ret
Machines should work. People should think.