Autor Wątek: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze  (Przeczytany 12831 razy)

SAJ

  • *****
  • Wiadomości: 1484
  • Miejsce pobytu:
    Terra Prime
Witam,

Jestem w trakcie zabawy z z80 i ptrzebuje kilka procedurek i funkcji, ktorych po wielu probach nie udalo mi sie napisac.
Jakos sama Komenda LD i milion postaci jakie moze miec mi sie zawsze myli i nie wiem czy kopiuje wartosc do pamieci czy pamiec do wartosci, czy moze jeszcze cos innego.

Potrzebuje kilka funkcji, ktore glownie przerzucaja obszary pamieci, ale czytajac wartosc z adresow start i stop z tabel.

Czy jest ktos, kto moglby mi w tym pomoc ?

Pozdrawiam.


ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #1 dnia: 2017.09.29, 12:27:47 »
To wcale nie jest trudne.

LD HL, 16384 - to ładuje do rejestru HL wartość 16384
LD (HL), 255 - to ładuje wartość 255
LD (HL), A - ładuje wartość rejestru A do adresu pamięci, na który HL wskazuje, czyli gdyby wykonać obie instrukcje po kolei, pod adres 16384 wskoczy wartość z rejestru A.

Do (powolnego) kopiowania obszarów pamięci można użyć LDIR albo LDDR

http://z80-heaven.wikidot.com/instructions-set:ldir

Szybsze kopiowanie, to za pomocą PUSH i stosu, ale to chyba temat na kolejną lekcję :)

« Ostatnia zmiana: 2017.09.29, 12:58:30 wysłana przez ZX Freeq »
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #2 dnia: 2017.09.29, 12:37:17 »
LD (HL), 255 - to ładuje wartość 255 do adresu pamięci, na który HL wskazuje

Hmm, jesteś pewien, że w Z80 jest taka operacja? ;)

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #3 dnia: 2017.09.29, 12:38:11 »
Masz rację.

LD (HL), A - powinno być.   :D

Chodziło o zobrazowanie idei nawiasów, a wyszło troszkę niepoprawnie.
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

SAJ

  • *****
  • Wiadomości: 1484
  • Miejsce pobytu:
    Terra Prime
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #4 dnia: 2017.09.29, 12:41:46 »
Masz rację.

LD (HL), A - powinno być.   :D

Hmm, jako nowicjusz mam sie w tym odnalezc ? :)

W C64 mam czysta separacje LDA od STA, przez co bardzo ladnie widac w ktora strone ida dane z punktu widzenia procesora.
W Microchip mam MOVLW i MOVWF, co tez ladnie separuje, tylko tutaj mam LD i milion mozliwosci, co mnie strasznie gubi.

Pozdrawiam.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #5 dnia: 2017.09.29, 12:55:50 »
Ten milion możliwości to tryby adresowania :)
W MOS możesz tylko ładować lub zapisywać dane pośrednio przez akumulator.
Z80 daje po pierwsze więcej rejestrów (oprócz A są jeszcze B,C,D,E,H,L plus drugi komplet, ale na początek nie ma co zaciemniać ;) ), a po drugie potrafi przesyłać dane bezpośrednio do pamięci (no prawie, bo adres wtedy musi być w rejestrach).
Zasada jest w sumie prosta:

LD cel, źródło

zawsze przesyła dane w kierunku cel <- źródło.

Jeśli jeden z argumentów jest podany w nawiasach, to znaczy, że jest to adresowanie pośrednie (dana znajduje/znajdzie się pod adresem zawartym w argumencie).
ZX/Enterprise/CPC/Robotron/C128D

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #6 dnia: 2017.09.29, 15:00:53 »
LD (HL), 255 - to ładuje wartość 255 do adresu pamięci, na który HL wskazuje

Hmm, jesteś pewien, że w Z80 jest taka operacja? ;)

A co z nią nie tak?
LD (DE), 255 nie ma, LD (BC), 255 też nie, ale do (HL) można.

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #7 dnia: 2017.09.29, 16:52:58 »
No faktycznie! Tzn, spróbowałem pod assemblerem w ZX Spin i przyjęło. A wg tabelki tutaj:
http://z80-heaven.wikidot.com/instructions-set:ld
tak nie można.... Widać nie ma rzeczy niemożliwych dla Z80 ;)
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #8 dnia: 2017.09.29, 16:57:56 »
Użyj innej tabelki :)
Wszystkie możliwe kombinacje LD z opisem.
ZX/Enterprise/CPC/Robotron/C128D

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #9 dnia: 2017.09.29, 17:34:16 »
Ha :)
Operacja wyglądała mi podejrzanie, rzuciłem okiem w sieci i nie znalazłem jej w tabelce.
I weź tu, człowieku, ufaj internetowi :D

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #10 dnia: 2017.09.29, 17:48:52 »
LD (HL),n kod rozkazu 36h
ZX/Enterprise/CPC/Robotron/C128D

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #11 dnia: 2017.09.29, 17:55:04 »

Hmm, jako nowicjusz mam sie w tym odnalezc ? :)

W C64 mam czysta separacje LDA od STA, przez co bardzo ladnie widac w ktora strone ida dane z punktu widzenia procesora.

Polecam kurs http://www.speccy.pl/archive/prod.php?id=416
Jest tam też symulator - można poćwiczyć.

Pokaż co napisałeś. Pomożemy z LD.

SAJ

  • *****
  • Wiadomości: 1484
  • Miejsce pobytu:
    Terra Prime
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #12 dnia: 2017.09.29, 20:15:46 »
Tutaj mam np snippet, ktorego uzywam do przerzucania 8kb czesci czegos wiekszego z przelaczaniem bankow.

W kodzie Zx przelaczenie banku bedzie polegalo na komendzie OUT <PORT>, <Nr Banku> jeszcze nie wiem na ktorym porcie.

Ktos wszesniej pisal, ze z80 jest w stanie przerzucac obszary pamieci bezposrednio, bez potrzeby ladowania do rejestru....

Nie wiem, wiec pytam..

Poadro.

LENLO:    ldx #00   <- dolna czesc dlugosci pliku do skopiowania
LENHI:    ldy #00   <- gorna czesc dlugosci pliku do skopiowania
CBANK:    lda #00  <- Nr Banku, w ktorym zaczynamy
         sta $DE00
CADDR:    lda $8200
MADDR:    sta $0801         
          dex
          cpx #$FF
          bne CC1
          dey
          cpy #$FF
          beq CRTOFF
CC1:      inc MADDR+1
          bne CC2
          inc MADDR+2
CC2:      inc CADDR+1
          bne CADDR
          inc CADDR+2
          LDA CADDR+2
          cmp #$A0
          bne CADDR
          inc CBANK+1
          lda #$80
          sta CADDR+2
          jmp CBANK
CRTOFF:   lda #$FF
          sta $DE00
          lda MADDR+1
          sta $2D
          lda MADDR+2
          sta $2E
PSTART:   <- Tu sie zaczynaja dziac inne rzeczy....

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #13 dnia: 2017.09.29, 20:44:14 »
A jakiś krótki opis? Rozumiem, ale nie do końca...
Nie znam asemblera MOS.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Potrzebuje Kilka drobnych funkcji na Z80 w Assemblerze
« Odpowiedź #14 dnia: 2017.09.29, 20:57:03 »
Jeśli dobrze widzę, to ten przykład jest samomodyfikującym się kodem. Według dzisiejszych standardów, to bardzo niedobrze ;)
ZX/Enterprise/CPC/Robotron/C128D