Autor Wątek: Asembler ZX Spectrum - Pytania na początek (Cartridge).  (Przeczytany 8281 razy)

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #15 dnia: 2023.02.13, 14:02:39 »
Trzy najmłodsze bity (0,1,2) to ink, trzy kolejne (3,4,5) paper, kolejny (6) to bright a ostatni (7) to flash.
Czyli czarne na białym to 00 111 000, białe na czarnym z brightem 01 000 111, mrugające niebieskie na czerwonym 10 010 001 itd.

A... I kolory przekładają się na bity jako GRB czyli FL BR PG PR PB IG IR IB.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #16 dnia: 2023.02.13, 14:37:37 »
Ekran widzę podobnie jak CPC, ale różnica wielkości. Pierwszy Bajt $4000 to pierwsze 8 Pix od góry znaku, kolejna linia 8 Pix to + $100 do adresu.
Powoli wszystko staje się jasne.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #17 dnia: 2023.02.14, 13:05:26 »
Chciałbym doprecyzować wyliczenie Y/X obiektu na pozycje znaku bo nie wiem czy do końca załapałem, a widzę w kodzie Sprite ma 8 grafik.
Obiekt ma 8 "pośrednich" grafiki dla ruchu poziomego, bo bez tego wyliczenie będzie co jeden znak wiec ruch wyjdzie co 8pix skokowo - dlatego jest 8 przestawionych grafik aby ruch był płynny pomiędzy przejściem między znakami 8x8?

W pionie widzę nie jest to wymagane i ruch jest przestawiany co jedna linie.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #18 dnia: 2023.02.14, 13:10:54 »
Jak w każdym systemie bez spriteów albo sprzętowego scrolla - jak chcesz mieć płynnie to musisz mieć poprzesuwane (zajmuje pamięć) albo przesuwać w locie (zjada procesor). Więc zwykle robi się poprzesuwane i jeszcze z maską jeśli chcesz mieć nakładane na jakieś tło.

W pionie jedynym problemem jest przeliczanie albo wyciąganie z tablicy adresów kolejnych linii.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #19 dnia: 2023.02.14, 14:23:01 »
Ok czyli dobrze zrozumiane. To mój "pierwszy" raz ze sprzętem bez sprzętowych Sprites. Czyli aby Animować obiekt muszę kolejne 8 grafik przygotować dla każdej klatki?

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #20 dnia: 2023.02.14, 14:54:05 »
Tak. Zakładając, że chcesz przesuwać co piksel. Czasem można np. ograniczyć ilość robiąc animację, która w kolejnych klatkach się przesuwa sama w sobie a do tego trzymasz np. 4 klatki i przesuwasz co dwa piksele. Ale to już bardziej decyzje "artystyczne" ;)

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #21 dnia: 2023.02.20, 13:04:27 »
Nie mam zbytnio czasu, ale dziś chwilkę usiadłem znowu z ASM i takie proste platformowe demko gry napisałem.
Skakanie klawisze "WSAD", jeszcze nie robiłem nic z kodem Joy'a.
Nie wiem dlaczego ale za nic w świecie nie mogę uruchomić TAP na RetroVirtualMachine - wkładam "virtualnie" kasetę, wykonuje PLAY i poza dźwiękami wczytywania nic się nie dzieje.


matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #22 dnia: 2023.02.20, 13:32:20 »
A może LOAD ""?...

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #23 dnia: 2023.02.20, 15:25:57 »
Nie wiem dlaczego ale za nic w świecie nie mogę uruchomić TAP na RetroVirtualMachine

A tak off-topic i z czystej ciekawości - czemu się tak uwziąłeś na jeden z najmniej popularnych (zwłaszcza wśród programistów) emulator?

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #24 dnia: 2023.02.20, 18:18:02 »
Nie uwziąłem się - zawsze sprawdzam na wszystkich możliwych emu.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #25 dnia: 2023.02.20, 23:22:58 »
Nie uwziąłem się - zawsze sprawdzam na wszystkich możliwych emu.

A to już coś, czego zupełnie nie rozumiem... Jeśli sprawdzisz kod na emulatorze, który oferuje 100% zgodność z docelowym hardware to po co testować na innych emulatorach? Jakich wyników oczekujesz, bo zakładając, że wszystkie nowoczesne emulatory dają zbliżoną zgodność zakrawasz trochę o definicję szaleństwa - robisz w kółko to samo oczekując... innych wyników? ;)

I pytam serio, bo jakoś nigdy mi nie przyszło do głowy robienie czegoś takiego.

siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #26 dnia: 2023.02.21, 11:39:13 »
To fajnie, cieszę się, że jest 100%, dobrze wiedzieć. Ale dlaczego nie sprawdzać na innych? Jest to zabronione, nie wypada? Tym bardziej dlaczego miałbym
Cytuj
"zakrawać trochę o definicję szaleństwa"
z tak zwyczajnego powodu? Zawsze sprawdzam na różnych emu tak z przyzwyczajenia, może z ciekawości dlaczego "nie działa", a może jestem zwyczajnie głupi.
Przepraszam, ale ja odwrotnie dziwię się, że to może być tak dziwnym zachowaniem.
« Ostatnia zmiana: 2023.02.21, 11:54:30 wysłana przez siudym »

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #27 dnia: 2023.02.21, 11:57:43 »
Ymmm... Mnie się po prostu zawsze wydawało, że docelowym środowiskiem do uruchamiania programów jest fizyczny sprzęt. Emulacja jest narzędziem, żeby to uruchamianie było wygodniejsze i nigdy nie traktowałem emulacji jako celu. Jeśli więc program działa na fizycznym sprzęcie "testowanie" go na różnych emulatorach jest tak naprawdę testowaniem emulatorów. Ale spoko - nie będę ci zabraniał pracy po swojemu mimo, że nie rozumiem metodologii takiego działania. Mamy - jeszcze - demokrację i wolność słowa itp.

Tyle, że - abstrahując od szerszej perspektywy - używasz RetroVirtualMachine, który jest wysoce niszowy i nie sądzę, żeby ktoś na forum (zwłaszcza z osób programujących) był w stanie ci ewentualnie pomóc w dojściu dlaczego ten konkretny emulator nie robi czegoś, czego od niego oczekujesz. Stąd również moje pierwotne zdziwienie.

Ale powtórzę - masz prawo pracować jak ci wygodnie i ja już nie będę zadawał głupich pytań i ograniczę się do odpowiedzi na konkretne pytania o ile będę znał te odpowiedzi.



siudym

  • **
  • Wiadomości: 83
  • Miejsce pobytu:
    IŁAWA
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #28 dnia: 2023.02.21, 13:54:43 »
Ale gdzie ja napisałem kiedykolwiek, że jestem użytkownikiem RetroVirtualMachine ? :)
Ja zwyczajnie szukając emu ZX właśnie te dwa mi wpadły w oko i takie także mi polecono. Używam Spectaculator jedynie, a RVM jako opcja z czystej ciekawości czy się odpala na nim także. Jak znajdę inne emu to także z ciekawości na nich odpalę i nie będzie w tym żadnego obłędu, szaleństwa itd ;)

Zrobiłem małe update demka z Willy, kod generowania Sprites ("Obiektów") niestety czyści pozystałość Sprite'a w jego całości czyli 16x16, więc nachodząc na siebie te z wyższym "priorytetem" kasują te z niższym. Domyślam się, że trzeba by użyć coś, co przed wstawieniem Sprite'a w nowe miejsce na ekranie sprawdzi obecność zapalonych pikseli, zapamięta je i podczas kasowania pominie ich wymazanie. ?

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Asembler ZX Spectrum - Pytania na początek (Cartridge).
« Odpowiedź #29 dnia: 2023.02.21, 19:36:00 »
Raczej nie sprawdzanie tylko maskowanie. Robisz sprite'a i maskę do niego a potem przy nakładaniu pobierasz zawartość, maską kasujesz to, co ma być puste a potem ORujesz sprite'a i dopiero to wrzucasz w ekran.

Jeśli bajt sprite'a wygląda tak:
00001100
00011100
00111000
00110000
00110000

Przygotowujesz maskę np tak:
11110011
11100011
11000111
11001111
11001111

W pamięci pakujesz dane naprzemian - bajt maski, bajt sprite'a. A potem zamiast prostego pobierania i wrzucania w ekran robisz coś takiego:

; de - ekran
; hl - sprite

ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a


Maska może być o piksel "grubsza" - w efekcie dostaniesz efekt jaki można zobaczyć w grach - sprite na z ramką dookoła.

To tak z grubsza.

Chyba, że nie masz tła i chcesz tylko "nałożyć" sprite'a - wtedy wystarczy
ld a,(de)
or (hl)
ld (de),a

Oczywiście do tego musisz dodać czyszczenie w odpowiednim punkcie tak, żeby ci raster nie ściął grafiki, ale tego raczej nie muszę ci tłumaczyć :)