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

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #30 dnia: 2021.11.18, 15:35:21 »
Dokladnie, B niepotrzebne :)

W temacie Z80 jak na razie powoli ale do przodu, uczac sie procesora na warsztat wzialem dwa systemy i na chwile obecna cos tam sie udalo sklecic (nieco bardziej zaawansowane HELLO WORLD'y ):

GameBoy klasyczny (wprawdzie procek to jakis custom-Z80 sharpa, ale jest podobnie)
https://www.youtube.com/watch?v=dVYdYis4nSQ

Sega Master System (ty klasyczny Zilog)
https://www.youtube.com/watch?v=BgfkQdMRYa4

Co nastepne? W planach albo MSX bo architektura podobna do SMS, albo ZX :)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4404
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #31 dnia: 2021.11.18, 15:44:01 »
Takie podstawy podstaw z programowaniem Z80 z analogiami do BASICa opublikowałem w dwóch ostatnich numerach Zin80. Być może pomogą. Link: https://www.speccy.pl/archive/prod.php?id=576

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #32 dnia: 2021.11.18, 15:52:14 »
Dzięki, to zawsze jest przydatne :)

Z ksiazek mam pewnie klasyczny, znany zestaw:

matofesi

  • *****
  • Wiadomości: 1939
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #33 dnia: 2021.11.18, 15:59:51 »
To ja zawsze jeszcze sugeruję to: http://www.zilog.com/docs/z80/um0080.pdf

steev

  • *****
  • Wiadomości: 1272
  • Miejsce pobytu:
    inode 42
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #34 dnia: 2021.11.18, 17:02:45 »
Machines should work. People should think.

matofesi

  • *****
  • Wiadomości: 1939
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #35 dnia: 2021.11.18, 22:11:08 »
@steev Yup. Choć w wypadku kogoś, kto zaczyna albo przechodzi z innej architektury undocumented zaczynają być potrzebne jakoś tak później... ;)

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #36 dnia: 2021.11.20, 12:56:51 »
Takie podstawy podstaw z programowaniem Z80 z analogiami do BASICa opublikowałem w dwóch ostatnich numerach Zin80. Być może pomogą. Link: https://www.speccy.pl/archive/prod.php?id=576

Właśnie sobie czytam i coś mnie zastanawia i zgłupiałem już :o
Chodzi o:

Cytuj
LD h,8
LD l,45
jest odpowiednikiem:
LD hl,2093
Powyższe dotyczy także par BC i DE.

Tego nie rozumiem, bo kompilujac wyniki mam takie:

LD H,8                     ;dec
LD L,45

- HL ma adres $082D, a gdy:

LD H,$08                             ;hex
LD L,$45

- HL ma adres $0845
« Ostatnia zmiana: 2021.11.20, 14:13:49 wysłana przez siudym »

trojacek

  • *****
  • Wiadomości: 6420
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #37 dnia: 2021.11.20, 13:37:40 »
$082D = 2093 dziesiętnie.

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #38 dnia: 2021.11.20, 14:12:16 »
ehhh racja.... nigdy nie uzywam adresow dziesietnie i zakrecilem sie odczytujac "domyslnie" w hex ;)

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #39 dnia: 2022.01.27, 20:21:14 »
Mam drobną zagwostkę... Mam pewną funkcję, która ma wyczyścić 1008 bajtów ($3F0) - zeruje ona jednak 736 bajtów:

https://i.postimg.cc/1XGt0Kg8/wram.png

ClearWRAM:

LD HL,$C000
LD BC,$03F0
XOR A

ClearWRAM_Loop:

LD (HL),A
INC HL
DEC C
JR NZ,ClearWRAM_Loop
DEC B
JR NZ,ClearWRAM_Loop

RET

- pierwsza pętla wykona DEC C z F0 do 00, po czym wykonuje DEC C wykonując 3x loop 256 bajtow - tak sie jednak nie dzieje

Można oczywiście zrobić tak - działa, ale zastanawia mnie gdzie tkwi błąd wyżej?

Cytuj
ClearWRAM:

   XOR A
   LD ($C000),A

   LD HL,$C000
   LD DE,$C001
   LD BC,1024-15
   LDIR

   RET

matofesi

  • *****
  • Wiadomości: 1939
  • Miejsce pobytu:
    Toruń/Poland
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #40 dnia: 2022.01.27, 20:38:03 »
Gwoli ścisłości wypełnia ci 752 (0x2f0) bajty a to dlatego, że w B masz 3 - pierwsze 240 kończy z 2 w B, potem 256 z 1 i na koniec 256, po którym B schodzi do zera - 240+256+256 - 752 :)

trojacek

  • *****
  • Wiadomości: 6420
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #41 dnia: 2022.01.27, 21:02:59 »
Pętla w pętli? Jest sens tak komplikować?

    LD HL, $C000
    LD B, 252    ; 1008 / 4
    XOR A

LOOP
    LD (HL), A
    INC HL
    LD (HL), A
    INC HL
    LD (HL), A
    INC HL
    LD (HL), A
    INC HL
    DJNZ LOOP


Pisane w samolocie na telefonie,  więc wybaczcie brzydkie formatowanie.

BTW, ten LDIR powinien mieć  w BC 1024 - 17, czyli 1007.

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #42 dnia: 2022.01.27, 21:28:52 »
Heh jak zwykle banalne rozwiązanie, źle przeanalizowałem. Dzięki.

siudym

  • **
  • Wiadomości: 61
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #43 dnia: 2022.01.28, 11:43:38 »
Teraz pytanie nieco bardziej skomplikowane ;)

Znowu mam problem z zastąpieniem rejestrów indexowych w 6502 na Z80. Mam taki kod, mam nadzieje dobrze opisałem - chodzi o zastąpienie go możliwie podobnie ale pod Z80:

Cytuj
- licznik "counter" bedzie miec wartsci od 0 do 7
- teraz przykladowo:
- ladujemy do rejestru X counter majacy wartosc np. 01
- ladujemy do akumulatora flagi z "flags"
- wykonujemy and zawartosci akumulatora na bitmaskach zwiekszonych o rejestr x czyli 01 czyli o 00000010
- and w tym przypadku wyzeruje wszystko w akumulatorze poza bit1
- gdy bit1 bedzie zapalony, wykona sie skok BNE, gdy zgaszony wykona kod ponizej czyli "jsr innafunkcja"

- analogicznie kazda inna wartosc podana w "counter" np. 07 = wykona and 10000000 (bitmask zwiekszone o 7) na flags,
  czyli sprawdzany bedzie bit7 flags czy jest zapalony czy nie i zaleznie od tego wykonany lub nie "jsr innafunkcja"


   LDX Counter

   LDA Flags               ; gdy wykryjemy gold, sprawdzamy czy bit zapalony pierwszego w kolejnosci z levactivesprites
   AND BitMask,x               ; i gdy zapalony pominie wstawienie gold skaczac do zwiekszenia indexu X
   BNE skip               ; wykonaj skok BNE gdy wynikiem and bedzie zapalona wskazana flaga w "flags"

   JSR innafunkcja

skip:


;################################################################################

BitMask:

   .byte %00000001
   .byte %00000010
   .byte %00000100
   .byte %00001000
   .byte %00010000
   .byte %00100000
   .byte %01000000
   .byte %10000000

trojacek

  • *****
  • Wiadomości: 6420
  • Miejsce pobytu:
    Warszawa
Odp: Skopiowanie większej ilości danych do RAM
« Odpowiedź #44 dnia: 2022.01.28, 12:08:22 »
Jest proste rozwiązanie, jeśli BitMask zaczyna się od adresu modulo 256.
W takim przypadku:

    LD HL, BitMask ; właściwie wystarczy do H załadować starszy bajt adresu

    LD L, Counter
    LD A, Flags
    AND (HL)
    JR NZ, skip
    JR innafunkcja
skip