51

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Kolejny sukces. Weronika przyjęła na swoje łono procesor WDC 65C816S z taktowaniem 5 MHz. Skutek - efekt odświeża się co 3 ramki (z synchonizacją do VBL), w stosunku do 10 na "gołej" Atarce. Postaram się niebawem przedstawić naoczne dowody.

52

(220 odpowiedzi, napisanych Sprzęt - 8bit)

laoo/ng napisał/a:

Ktoś zainteresowany emulacją Weroniki w Atari++ 1.51?

Byłoby miło i umożliwiło pisanie programów bez posiadania sprzętu innym osobom. W razie potrzeby konsultacji pisz na priva, jeśli zdecydowałbyś się na stworzenie emulacji.

53

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Idea przełączania banków jest nadal obowiązująca i działa tak jak napisałeś.

Wstrzymanie działa w ten sposób, że po starcie podawany jest sygnał "0" na pin /RES, co rzekomo miało zatrzymywać procesor, a okazało się, że generuje on jakieś impulsy na szynach, w związku z czym potrzebne były dodatkowe zabezpieczenia. Linia HALT nie jest wykorzystywana. Ustawiana jest na sztywno na "1".

Reset działa w ten sposób, że ustawiamy VER_CPU_RESET_PULSE_LOW, odczekujemy moment, ustawiamy VER_CPU_RESET_PULSE_HIGH, ponownie czekamy i od tego momentu procesor jest zrestartowany. Proces można powtarzać.

Odnośnie zdjęć, to na chwilę obecną dysponuję jedynie takimi.

54

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Obiecane zdjęcia:

http://img708.imageshack.us/img708/1098/weronika20modub320str1.jpg

http://img697.imageshack.us/img697/702/weronika20modub320str2.jpg

55

(220 odpowiedzi, napisanych Sprzęt - 8bit)

W kwestii przelotowości modułu wypowiedzie się zapewne Zenon.

56

(220 odpowiedzi, napisanych Sprzęt - 8bit)

.enum    EAtariRegisterBits
    SEMAPHORE_READ    = 7
    SEMAPHORE_WRITE    = 7
   
    BANK1_ENABLE    = 5    // $A000-$BFFF -> $E000-$FFFF or $6000-$7FFF
    BANK0_ENABLE    = 4    // $8000-$9FFF -> $C000-$DFFF or $4000-$5FFF
   
    RAMBANK_CFG    = 1
   
    VERONICA_CPU_RESET    = 0
.ende

.enum    EVeronicaRegisterBits
    SEMAPHORE_READ    = 7
    SEMAPHORE_WRITE    = 7
   
    WINDOW_LOCATION    = 6
.ende

.enum    EAtariRegisterStates
    UNLOCK_ATARI    = (1 << EAtariRegisterBits.SEMAPHORE_WRITE)
    VERONICA_UNLOCKED    = (1 << EAtariRegisterBits.SEMAPHORE_READ)
    SEMAPHORE_MASK    = (1 << EAtariRegisterBits.SEMAPHORE_READ)
   
    BANK0_ENABLED    = (1 << EAtariRegisterBits.BANK0_ENABLE)
    BANK0_DISABLED    = (0 << EAtariRegisterBits.BANK0_ENABLE)
    BANK1_ENABLED    = (1 << EAtariRegisterBits.BANK1_ENABLE)
    BANK1_DISABLED    = (0 << EAtariRegisterBits.BANK1_ENABLE)
    BANKS_ENABLED    = (BANK0_ENABLED | BANK1_ENABLED)
    BANKS_DISABLED    = 0

    BANK0_MASK    = (1 << EAtariRegisterBits.BANK0_ENABLE)
    BANK1_MASK    = (1 << EAtariRegisterBits.BANK1_ENABLE)
    BANKS_MASK    = (BANK0_MASK | BANK1_MASK)
   
    RAMBANK_CFG_MASK    = (1 << EAtariRegisterBits.RAMBANK_CFG)

    VER_CPU_RESET_PULSE_LOW        = (0 << EAtariRegisterBits.VERONICA_CPU_RESET)
    VER_CPU_RESET_PULSE_HIGH    = (1 << EAtariRegisterBits.VERONICA_CPU_RESET)
    VER_CPU_RESET_MASK    = (1 << EAtariRegisterBits.VERONICA_CPU_RESET)
.ende

.enum    EVeronicaRegisterStates
    UNLOCK_VERONICA    = (1 << EVeronicaRegisterBits.SEMAPHORE_WRITE)
    ATARI_UNLOCKED    = (1 << EVeronicaRegisterBits.SEMAPHORE_READ)
    SEMAPHORE_MASK    = (1 << EVeronicaRegisterBits.SEMAPHORE_WRITE)

    WINDOW_LOCATION_C000    = (0 << EVeronicaRegisterBits.WINDOW_LOCATION)
    WINDOW_LOCATION_4000    = (1 << EVeronicaRegisterBits.WINDOW_LOCATION)
    WINDOW_LOCATION_MASK    = (1 << EVeronicaRegisterBits.WINDOW_LOCATION)
.ende

Weronika nigdy nie była projektowana jako moduł obsługujący przerwania, a bardziej jako koprocesor. Wszelkie przerwania w procesorze Weroniki są zablokowane na poziomie elektronicznym (/IRQ, /NMI na "1").

57

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Rejestr sprzętowy zlokalizowany jest pod adresem $0200. Reszta strony została zarezerwowana dla przyszłych rozwiązań.
Po włączeniu zasilania procesor jest wstrzymany. Po RESET okno zlokalizowane jest pod $C000. Istnieje możliwość przełączenia go pod $4000. Decyduje o tym bit D6 rejestru sprzętowego. Procesor resetujemy od strony Atari przy użyciu bitu D0 rejestru sprzętowego ($D5C0). Obecnie moduł nie jest przelotowy.

Decyzja dot. publikacji zdjęć należy do Zenona.

58

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Postaramy się zaprzęgnąć do pracy odporniejszy na wyższe takowanie procesor (WDC 65816).

59

(220 odpowiedzi, napisanych Sprzęt - 8bit)

Ja również chciałbym w tym miejscu podziękować Zenkowi za ogrom wniesionej pracy, cierpliwość i zaangażowanie. Bez jego wiedzy i doświadczenia projekt nie miałby najmniejszych szans powodzenia.

pajero napisał/a:

No to proszę podać ile jest to na "oko" :)
Liczę na testy na innych produkcjach.

Ciężko powiedzieć dokładnie, gdyż na razie próbkowanie czasu wykonywania procedury nie jest dostępne. Wykonam to niebawem. Procesor Weroniki nie jest obiążony balastem "cyklokradów", więc otrzymujemy obecnie pełną moc wynikającą z taktowania częstotliwością ~1,63 MHz. Po uwzględnieniu podatku od cyklokrada po stronie Atari mamy 1.53 MHz dla wspomnianego programu. Mamy tutaj zatem w przybliżeniu 2x większą moc w stosunku do gołej Atarynki. Efekt wykorzystuje przetwarzanie równoległe, dzieląc ekran na dwie równe półówki. Górną część ekranu otrzymuje Atari, dolną Weronika. Taki schemat postępowania jest najsensowniejszy na obecnym etapie rozwoju modułu. W przyszłości, gdy moc procesora wzrośnie znacznie, takie działanie będzie mniej pożądane. W konsekwencji, lepszym rozwiązaniem będzie dokonywać obliczenia całkowicie po stronie Weroniki, co oczywiście nie oznacza, że nie możemy korzystać z mocy Atari również w takim wariancie.

W najbliższym czasie dokonam porządkowania kodu protokołu komunikacyjnego, a po tym dokończę Demo. Będzie to o wiele łatwiejsze, gdy moduł trafi w moje ręce, ponieważ efekt pisany był "na wyczucie", bez dostępu bezpośredniego do Weroniki.

Co do innych produkcji - muszą one najpierw powstać, ale tym zajmą się - miejmy nadzieję - również inne osoby, gdy moduł się upowszechni.

60

(100 odpowiedzi, napisanych Fabryka - 8bit)

Wybór wariantu uzależniałbym od tego jakie postawione są cele. Jeżeli wydajność gry w oparciu o procedurę rysującą odcinki byłaby niesatysfakcjonująca, to wybrałbym wariant #2. Liczniki oraz podpis rysowałbym w polu gry. Zachowuje to klimat pierwowzoru. Nakładanie ich zrealizowałbym na sprite'ach lub procedurze kreślącej odcinki ze zoptymalizowanymi kierunkami o wielokrotności 90 (ew. 45) stopni. Ta sama optymalizacja wyjdzie wydajności na dobre w przypadku rysowania samych asteroidów, choć zysk będzie zapewne niewielki. Rysowanie UFO oraz statku gracza powinno być szybsze w przypadku wariantu sprite'owego.

W przypadku wyboru wariantu #2 można dodatkowo pokusić się o optymalizacje:

a) Rysowanie tylko tych bajtów w kolumnie, które posiadają w masce OR wartość różną od #0. Definicje takiego sprite'a należałoby przygotować uprzednio z zastosowaniem kodowania zbliżonego do kompresji RLE. Wtenczas moglibyśmy rysować pakietami w kolumnie. Należałoby tutaj uwzgędnić jeszcze "poszatkowanie", a w zasadzie tak pogrupować oraz połączyć bajty w kolumnie, aby tego poszatkowania nie było zbyt wiele. Wartość dwóch/trzech pakietów w kolumnie powinna być optymalna. Oczywiście dane sprite'ów powinny być zwielokrotnione dla wszystkich ośmiu kombinacji przesunięć w obrębie bajtu. Ten sam mechanizm możnaby wykorzystać do przywracania tła.

b) Wygenerowanie procedur rysujących dla wszystkich kombinacji kształt/przesunięcie poziome. Bazuje to na obserwacji, że środek dużych asteroidów jest pusty. W szczególności, gdy w masce OR występuje wartość #0, pomijamy taki zapis. Dodatkowo, jeśli w masce OR mamy #$ff, to wpisujemy bezpośrednio lda #$ff / sta (screen),y, zamiast nakładania pełnego z użyciem rozkazu ora. Należałoby oszacować ile to może zająć pamięci, ale myślę, że są szanse na zmieszczenie się.

c) Wszędzie tam, gdzie stosunek wypełnienia bajtów kształtu obiektu pikselami do całkowitego obszaru prostokąta otaczającego obiektu jest duży, zastosować rysowanie na sprite'ach. W praktyce dotyczyć to będzie statku głównego oraz małych asteroidów.

61

(22 odpowiedzi, napisanych Zloty)

Jakieś propozycje nowej lokacji, czy ta sama co ostatnio, a może McDonald?

62

(8 odpowiedzi, napisanych Miejsca w sieci)

Absolutnie NOWY. Szczególnie widoczne jest to na klawiszu SELECT oraz klapce nad CARtem.

63

(51 odpowiedzi, napisanych Zloty)

Będziemy z Rastanem.

64

(13 odpowiedzi, napisanych Programowanie - 8 bit)

vega napisał/a:

Czy player RMT można tak ustawić, żeby pod NTSC grał nieco wolniej? bo muza jest za szybka

DLI w odpowiednio policzonych interwałach.

65

(51 odpowiedzi, napisanych Zloty)

koala napisał/a:

czy wszystkim pasuje termin piątek 27 listopada o godzinie 17 w city rocku?:)

Mnie (wstępnie) pasuje.

66

(51 odpowiedzi, napisanych Zloty)

Oba terminy mi pasują. Piątek 13'tego odpada.

67

(51 odpowiedzi, napisanych Zloty)

"Marek Konopka" jest ... chętny.

68

(4 odpowiedzi, napisanych Scena - 8bit)

Paczka wysłana.

69

(4 odpowiedzi, napisanych Scena - 8bit)

Listę wszystkich utworów do Delty już skompletowałem. Są tam wszystkie rarytasy. Podeślę ci je za chwilę.

70

(3 odpowiedzi, napisanych Programowanie - 8 bit)

Korzystając z okazji podepnę się do wątku i poproszę (po raz n'ty) Tomasza o dopisanie ustawiania adresu dla zmiennych zerostronicowych bez ich alokacji poprzez:

.zpvar = adres

Uprzejmie proszę o pozytywne ustosunkowanie się do mojej prośby.

71

(18 odpowiedzi, napisanych Programowanie - 8 bit)

xxl napisał/a:

ale tak sie nie da ?chyba? d i e musza byc na stronie zerowej (emulowane rejestry z80) - adresowanie ... (de),y

.align 256

 inc _d
 ldx _d
 lda FlagiSkokowZawierajace_0_oraz_20_Tbl,x
 bne ver2

continue

ver2
 clc
 adc _e
 sta _e
 bcs continue

 lda _d+1
 adc #-$08
 sta _d+1
 jmp continue

EDIT: W poprzedniej wersji występował błąd. Zamiast

 lda _d+1
 adc #-$08
 sta _d+1

miało oczywiście być

 lda _dh
 adc #-$08
 sta _dh

72

(18 odpowiedzi, napisanych Programowanie - 8 bit)

Pod adresem _d+1 zawarte jest faktyczne _d. Rozkaz inc _d+1 dokonuje automodyfikacji argumentu instrukcji lda pobierającej status skoku, a zarazem argument do dodania w późniejszej instrukcji adc _e, w przypadku dokonania skoku. Wyeliminowałem również konieczność dokonywania skoku JSR enter2 oraz powrotu poprzez RTS, zakładając, że umieścimy cały zaproponowany przeze mnie kod w miejsce JSR enter2. Z tego powodu etykieta continue określa miejsce, od którego następuje kontynuacja wykonywania programu po zakończeniu działania optymalizowanego fragmentu.

Tablica FlagiSkokowZawierajace_0_oraz_20_Tbl jest skonstruowana tak:

$20, 0, 0, 0, 0, 0, 0, 0, $20, 0, 0, 0, 0, 0, 0, 0, itp.

czyli wygenerowana formułą !(i & 7)*0x20 i pełni jak już wspominałem dwoistą funkcję. Pierwsza określa decyzję dotyczącą skoku do dalszego kodu, a druga argument (#$20) do dodania do _e.

73

(18 odpowiedzi, napisanych Programowanie - 8 bit)

Przepraszam, nie wiem, jak wstawiać znacznik kodu. Poniższe prezentuje pewien pomysł, aniżeli gotowe rozwiązanie.

.align 256

  inc _d+1
_d lda FlagiSkokowZawierajace_0_oraz_20_Tbl
 bne ver2

continue

ver2
 clc
 adc _e
 sta _e
 bcs continue

 lda _d+1
 adc #-$08
 sta _d+1
 jmp continue

Edit: Wstawka z kodem poprawiona.

74

(31 odpowiedzi, napisanych Programowanie - 8 bit)

W demach MEC'u chodziło o wykorzystanie standardowego zestawu znaków.

75

(6 odpowiedzi, napisanych Zloty)

Lewis, wyślij może wiadomości na priv do mnie, bo ode mnie do Ciebie chyba nie dochodzą.