Autor Wątek: Tryb gigascreen  (Przeczytany 109613 razy)

andys

  • *
  • Wiadomości: 41
  • Miejsce pobytu:
    w domu
Odp: Tryb gigascreen
« Odpowiedź #75 dnia: 2012.03.11, 18:39:39 »
hehehe postanowilem sie przetrzezwiec i napisac:P chodzilo mi o twoja kwestiwe w shocku jednak. ta z bobsami. tam trzeba bylo przerzucac w kolko z 4 ekrany malujac kolejne dodatkowe bobsy. spojarzalem w diasemblera i sa tam ldi wiec nie ma tematu:P
7:45 http://www.youtube.com/watch?v=MllVhsN6MG0&feature=related
A jak juz jestes to mam pytanie o laske z holywood... przerysowaliscie to recznie? nigdy to nie bylo w formacie spectrumowym
« Ostatnia zmiana: 2012.03.11, 18:42:35 wysłana przez andys »

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #76 dnia: 2012.03.11, 19:58:54 »
W shocku ekran też jest tylko przewalany. A dokładniej 4 "ekrany". Ciągi LDI, dorysowywany jest jeden bob w każdej klatce. I zasadniczo szybciej się nie da albo jeśli się da, to kod będzie na tyle duży, że cztery klatki się nie zmieszczą w pamięci.

Co do animacji HPPRO Intro - nic nie przerysowywaliśmy. Na ile rozumiem - bo sam tego nie robiłem - kod został żywcem przeniesiony z C64 a w międzyczasie format animacji rozpracowany (to robota Rackne z Kazem do spółki) a potem Kaz napisał player'a do tego formatu danych a Ziutek modułem odtworzył oryginalną muzyczkę.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Tryb gigascreen
« Odpowiedź #77 dnia: 2012.03.13, 02:25:45 »
Mam lamerskie pytanie, jako, że 128 to dla mnie wciąż jest magią bezceremonialną.

1. Czy ktoś mógłby udostępnić najprostszy kod do przerzucania 2 obrazów linia po linii?
Czy każdy pilnie strzeże swoich dokonań, że udostępnienie takiego kodu to twórcze samobójstwo dla kodera?

Tak na marginesie: przydałoby się założyć topik do udostępniania procedur, routines, fragmentów kodu,
czy jak to jeszcze można nazwać, np. szukam także kodu do sterowania strzałką, był kiedyś opublikowany
w Bajtku, więc jest freeware. Co o tym sądzicie? Ja uważam, że jest wielu takich, tylko nie przyznają się,
że znają assembler "w jedną stronę" - rozumieją tylko kod który sami napiszą. i przyznam, zaliczam się do nich.
AY Music, ULA plus.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #78 dnia: 2012.03.13, 08:18:59 »
1. Czy ktoś mógłby udostępnić najprostszy kod do przerzucania 2 obrazów linia po linii?
Czy każdy pilnie strzeże swoich dokonań, że udostępnienie takiego kodu to twórcze samobójstwo dla kodera?

To ja ci powiem tak - koderzy się dzielą kodem. Tylko dzielenie - zwłaszcza przy bardziej zaawansowanym kodzie - jest procesem dwukierunkowym i zwykle jest to coś za coś. Chyba, że komuś się chce doprowadzać własny kod do stanu w którym nadaje się do pokazania ludziom i wtedy udostępnia go jako bibliotekę, engine etc.

Pisałem procedurę o która pytasz. I nie, nie dostaniesz jej z kilku powodów:
1. Kod jest brzydki i nie nadaje się do upublicznienia
2. Kod nie jest wyliczony na 100% i nie działa dokładnie tak, jakbym chciał, żeby działał
3. Efekt, który dostajesz jest tylko odrobinę lepszy niż mruganie co ramkę stąd nie chcę mieć nic wspólnego z jego popularyzacją.

Gdybyś chciał sobie coś takiego napisać to kod powinien wyglądać mniej więcej tak:

- ustaw procedurę obsługi przerwań, żeby ROM nie przeszkadzał
- wrzuć 1 obrazek do banku 5, drugi do banku 7

          ld a,16
          ld (bank),a
pętla:
          HALT

odczekaj  około 14365 taktów - tutaj pierwszy punkt w którym musisz eksperymentalnie dobrać czas do swojej pętli

          ld d,191
pętla2:
          ld a,(bank)
          ld bc,32765
          out (c),a
          xor 8

; powyższy kod to 13+10+12+7=42 takty pod warunkiem, że nie trafisz na contention i ULA nie wsadzi
; dodatkowego NOPa albo trzech ;)
; linia ekranu w 128 to 228 taktów zostaje ci więc 186 taktów

; domknięcie pętli to dodatkowe 14 taktów
; zostaję więc 172 takty, które musisz odczekać na przykład tak:

          rept 43
              nop
          endm

          dec d
          jp nz,pętla2

; domknięcie pętli zewnętrznej

; to poniżej jest po to, żeby w następnej ramce wyświetlanie zacząć od drugiego obrazka
; w ten sposób obrazki będą wyświetlane na przemian
          ld a,(bank)
          xor 8
          ld (bank),a

; tutaj zostaje miejsce na twój ewentualny dodatkowy kod
; zakładając, że wszystko zrobiłeś poprawnie masz około 12734 taktów

          jp pętla

bank:     db 0


Oczywiście to nie jest pełny kod - należy mu dorobić inicjalizację, pętlę opóźniającą na początku, kod na końcu (testowanie klawiatury, odpalanie muzyczki czy co tam jeszcze ci jest potrzebne), procedury powrotu do BASICa (jeśli kod ma wracać) etc.

Użyta mnemonika jest zgodna z assemblerem pasmo i te kawałki kodu, które podaję powinny się przy jego użyciu poprawnie skompilować.

Cytuj
szukam także kodu do sterowania strzałką, był kiedyś opublikowany w Bajtku, więc jest freeware

Co to oznacza "kod sterowania strzałką"? Do czego chcesz tego używać - asm czy BASIC? Jeśli BASIC to czy ma to być procedura działająca asynchronicznie (program w BASICu robi swoje a strzałka na wierzchu swoje) czy wystarczy synchroniczna procedura pozwalająca pojeździć strzałką i po kliknięciu zwracająca pozycję kliknięcia?

I co to znaczy "jest freeware"? Być może "freeware" (i raczej public domain w tym wypadku, choć należałoby dokładnie przeczytać tekst o którym mówisz czy przypadkiem jednak domyślna licencja nie jest jakaś inna) był tamten konkretny kod ale jeśli pytasz o funkcjonalny odpowiednik to on wcale nie musi być "freeware".

andys

  • *
  • Wiadomości: 41
  • Miejsce pobytu:
    w domu
Odp: Tryb gigascreen
« Odpowiedź #79 dnia: 2012.03.13, 13:06:03 »
e no mat  to nie 128..........
poszles na latwizne...jakie banki;p tu chodzi o 48:P
najszybciej na z80 jest przewalic w tyl przez stos dane.... ja do dzis nie wiem czy sie da tak cala ramke speccy  przewalic , ale patrzac na nmi2 mozna miec takie wrazenie. tak mozna 18 kolumn zrobic multicoloru.
O co ci chodzilo z myszka jak slusznie zauwazyl mat...... to ma tyle opcji;p
No i moge napisac to samo co mat:P kod czesto jest tak niechlujny, ze brzdko sie z nim kims dzielic;p czasem wystarczy, ze dziala;p

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #80 dnia: 2012.03.13, 13:34:24 »
@andys Jakbyś śledził dyskusję to byś wiedział o czym rozmawiamy :P

Pisałem 100 razy - nie da się zrobić takiego gigascreena jak ja go definiowałem na początku na Spectrum 48. Nie da się i już.  Takiego "normalnego" zgodnego z definicją z prostym mruganiem dwóch obrazków też się nie da, ale to już osobna kwestia. Możesz przewalić (ale też nie cały ekran) bitmapę albo atrybuty. Fizycznie nie da się jednego i drugiego.

Abrimaal zresztą zaczął swoją wypowiedź od
Cytuj
Mam lamerskie pytanie, jako, że 128 to dla mnie wciąż jest magią bezceremonialną.

Stąd moje założenie, że on przeczytał całą wcześniejszą dyskusję i pyta o mój kod robiący właśnie to, co wyżej opisałem.

andys

  • *
  • Wiadomości: 41
  • Miejsce pobytu:
    w domu
Odp: Tryb gigascreen
« Odpowiedź #81 dnia: 2012.03.13, 13:43:02 »
kurcze obliczales ile sie da? normalnie mnie to ciekawi.....
,...............@andys Jakbyś śledził dyskusję to byś wiedział o czym rozmawiamy.........
tu jest problem....bo na trzezwo wcale nie pisze://////

jednak po ominieciu paru lini (1 na 8 ) jak w nmi2 da sie. przrzucic... cos sceptycznie to gadasz......


ahhhh....abi musi sie teraz okreslic;p czy chce bankami obraz przewalac czy maltretowac z80;p
« Ostatnia zmiana: 2012.03.13, 13:49:36 wysłana przez andys »

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #82 dnia: 2012.03.13, 14:00:35 »
Nie ma czego obliczać. Gigascreen to dwa pełne obrazki. Zakładając, że robisz kod
LD HL,NN
PUSH HL

I tak 3456 razy potrzebujesz (10+11) * 3456 = 72576 taktów. Na 128 masz 70908 taktów w ramce, na 48 69888. Problem tylko taki, że nawet jakbyś z czegoś zrezygnował (mniejsze obrazki itp.) to albo dojdziesz do rozmiaru znaczka pocztowego albo kod się skomplikuje na tyle, że wszystko się przestanie mieścić. Poza tym oczywiście musisz się liczyć z tym, że w którymś miejscu zetnie cię raster i całość przestanie wyglądać nawet przyzwoicie (bo to jest max tego, co mogę powiedzieć o gigascreenie jako takim).

Jak widać - da się upchnąć kod. Nie da się tego zrobić sensownie.

Ale jak chcesz to możesz próbować.


andys

  • *
  • Wiadomości: 41
  • Miejsce pobytu:
    w domu
Odp: Tryb gigascreen
« Odpowiedź #83 dnia: 2012.03.13, 14:09:51 »
olac gigascreen.... co to w ogole za wymysl.... podoba mi sie cyrklowanie nawet nopami.... to jest wyzwaniem jakims... a wiec zawsze trzeba cos odpuscic aby caly ekran przewalic...w nmi2 zrobili to prerfekcyjnie..... widzialem w trakcie kodu nopy;p
czujesza robiac to zapisujac na tapie?:PPPp
pytanie
mieszkacie wszyscy w toruniu?

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #84 dnia: 2012.03.13, 14:37:49 »
O żesz... Czy ty w ogóle czytasz to, co piszesz? Bo ja tak i trochę mnie oczy bolą i mam problemy ze zrozumieniem twojej wypowiedzi.

Odpowiadając - mam nadzieję - na kwestie z tejże wypowiedzi... W którym miejscu NMI2 widziałeś przerzucanie całego ekranu? W tej z multiscrollerem? A zauważyłeś, że scrollery mają małą czcionkę i nie mają wysokości 8 pikseli? To są 24 scrollery po 5 pikseli każdy - 3840 bajtów na ramkę do przerzucenia. Ja wiem dokładnie jak to jest robione, bo identyczną technikę zastosowałem w TL3 na Samie. Na początku jak leci scroller na atrybutach program generuje prescrollowane teksty poszczególnych scrollerów a potem je przerzuca szybkimi pętlami (prawie na pewno ciągi LDI).

Wstawianie NOPów w kod, który wymaga precyzyjnego wyliczenia czasu wykonania jest jak najbardziej naturalne. Tak jak wstawianie różnych innych rozkazów, które na oko nijak się mają do kontekstu a są używane, bo mają czasy wykonania 6,7 albo 11 taktów.

Nie widzę nic niezwykłego w robieniu takich rzeczy z zapisywaniem na taśmie - pracowaliśmy a ten sposób dość długo i było dobrze.

Nie wiem kogo masz na myśli pisząc "wszyscy". Ja mieszkam w Toruniu.

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: Tryb gigascreen
« Odpowiedź #85 dnia: 2012.03.13, 14:43:51 »
a wiec zawsze trzeba cos odpuscic aby caly ekran przewalic...w nmi2 zrobili to prerfekcyjnie....

No całego tak czy siak nie przewalisz :p Przecież było to pisane. A perfekcyjnie nie zrobili, bo w pewnym momencie widać jak się około połowy ekranu ścina obrazek, czyli mija z rastrem/ramką (jak tam se to kto nazywa). Więc górna część jest wyświetlana "na bieżąco" a w dolnej wyświetla to co było przerwanie wcześniej. Bo chodzi chyba o tą część z ogromnym logosem latającym góra/dół i samplem w tle? No i przewalają tam jakieś 85% ekranu. Większy bajer dla mnie to właśnie ten sampel, bo jest wpleciony pomiędzy kod rzucający na ekran.
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #86 dnia: 2012.03.13, 15:08:52 »
No dobra. To o czym piszesz to jest NMI 3.

Ścina się na środku - taki sam efekt będzie jak się będzie kombinowało z gigascreenem na 48 przy dużym obrazku. Przy takim rozmiarze grafiki nie uniknie się ścinania zwłaszcza jeśli poza samą grafiką chcemy coś tam jeszcze zmieścić.

Na oko sądząc - grafika na górze ma 40 pikseli czyli zostaje 152 do przerzucenia. Cała ramka to 312*224 czyli 69888 taktów. To daje około 460 taktów na jedną linię grafiki czyli 32 bajty. Używając ciągów LDI mamy 32*16=512 - za dużo. Para PUSH/POP to 21 taktów na 2 bajty - 336 taktów na linię - zostaje około 124 taktów na każdą linię na przesuwanie stosu itp. Do tego synchronizacja do ramki, równomiernie rozłożony kod i zasadniczo powinno się dać zrobić. A odgrywanie sample'a o ile pamiętam robiło się dwoma out'ami, czyli coś takiego
ld a,rejestr
ld bc,$FFFD
out (c),a
ld a,wartość
ld b,$bf
out (c),a
7+10+12+7+7+12=55 taktów.

Ciasno, ale nadal powinno się dać zrobić i w efekcie wygenerować sample'a z częstotliwością około 7 kHz.


andys

  • *
  • Wiadomości: 41
  • Miejsce pobytu:
    w domu
Odp: Tryb gigascreen
« Odpowiedź #87 dnia: 2012.03.13, 15:29:05 »
Kurnias Mat gdzies ty sie chowal;p taki zatematyk na taki szkrab jak speccy to zloto... ja to znam tylko z zalozenia pewne kwestie.... scrolll mial po 7 piksli nw nmi no chyba, ze jeszcze raz ogladne.....jedna linia tylko byla odpuszczona na znak.
Mi bardzo przeszkadzalo nagrywanie non stop:( literatury brak:( wszsytko sam dochodzilem:( i tylko bajtek..... szkoda,, ze tak wyszlo bo nie dosiaglem swoich celow....... a teraz to tam walic to wszysstko choc fajnie po latach pogadac o tym....
mat mieszkam obok;p flaszeczka? spotkanko?


sprawdzilem;p
http://www.youtube.com/watch?v=Cx5DsWCHEOI dodam teraz ze atrybuty tez lecialy;p choc zapomnialem o tym..... da sie i tyle..... moze wiekszosc danych sie powtarzala ale da sie...oraz stosowali nopy aby nie widziec czegos w trakcie rysowania....
« Ostatnia zmiana: 2012.03.13, 15:39:54 wysłana przez andys »

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Tryb gigascreen
« Odpowiedź #88 dnia: 2012.03.13, 15:39:27 »
Dobra. Zasadniczo jestem tolerancyjny. Ale z tobą nie będę dalej dyskutował póki nie zaczniesz pisać z sensem albo na trzeźwo.

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: Tryb gigascreen
« Odpowiedź #89 dnia: 2012.03.13, 19:19:07 »
aaaa... te scrolle :p

To jest jeden i ten sam w każdej linii, dodatkowo wiele z nich ma to samo położenie w poziomie, co pozwala jednorazowo nawalać na ekran te same dane bez pobierania ich na nowo. Czyli pobiera raz i nawala w kilku miejscach. Co innego przerzucać cały ekran dowolnych danych, a co innego powtarzające się fragmenty. Wiele trików jest o to opartych.
Nie zerkałem w kod np. Shocka (chessboard-szachownica), ale tam górna część ekranu jest skopiowana na dół z lustrzanym odbiciem. Generalnie zrobiłbym to tak:
1. LD SP, początek grafiki do wrzutu
2. pop hl
3. ld (nn),hl (górna część) (nn - miejsce na ekranie)
4. ld (nn),hl (dolna część)
5. pop hl
6. ld (nn),hl
... aż do końca linii
7. LD SP, początek linii niżej...
i tak do końca...
a zdaje się tam jeszcze parę linii w całej tej perspektywie też się powtarza.

W NMI 3 (część Doubleback) jest wrzucanie całego ekranu + atrybuty i sprite'y i mini-scroller na dole, ale to jednak niewielka animacja powielana kilkanaście razy, a nie przerzucana grafika. Co by nie mówić, bardzo efekciarskie toto jest :D

Tu pewnie sprawa ma się nieco inaczej bo walimy te same rzeczy na ekran. W pamięci jest przeliczana mała animacja (nanoszenie jednego planu na drugi) o rozmiarach 4x32 bajtów, następnie procedura klonowania tego na ekranie:

1. LD SP, początek linii z grafiką
2. POP HL / POP DE
3. LD SP, koniec pierwszej linii ekranu pierwszej tercji
4. PUSH DE / PUSH HL (x8)
5. LD SP, koniec linii ekranu pierwszej tercji, ale połówka tercji (za jednym zamachem, żeby potem znowu tego nie pobierać)
6. PUSH DE / PUSH HL (x8)

potem kolejna i kolejna linia... Tym sposobem zapełnisz cały ekran grafiką, ale tylko niewielką i powtarzającą się. No i pewnie z połowę pamięci zajmie procedura przerzucania tego.
Oczywiście to tylko esencja, bez konkretnych pętli i "gotowca" - raczej sama idea...

No i do Gigascreenu ma się nijak :p
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...