Marca 29, 2024, 00:12:57 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności:
Nowa strona główna  : http://www.emunes.pl
Zapraszamy do testowania !

Chat: http://chat.emunes.pl
Galeria cartów: http://carts.emunes.pl
 
   Strona główna   Pomoc Zaloguj się Rejestracja  

Reklama
Strony: 1 ... 5 6 [7] 8 9 ... 11
  Drukuj  
Autor Wątek: Programowanie Nes'a (procesora 6502)  (Przeczytany 78609 razy)
0 użytkowników i 1 Gość przegląda ten wątek.
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #120 : Września 29, 2010, 12:20:31 »

Napisalem prosty programik, który ma załadować palety i nametable (razem z attribute table). Na wszelki wypadek dopisałem 2 procedury ładujące nametable jedna w trybie absolutnym indeksowanym, a drugą w pośrednim postindeksowanym, jednak coś jest nie tak. W Nintendulatorze i FCEU po otwarciu przeglądarek pamięci PPU nie pojawia się nic, czyli nic się nie załadowało. Binarka NameTable jest w porządku, bo ładowałem ją jednym z programów dołączonych do kursu NESASM (tego PowerPak'owego).

Ogólnie mówiąc to zauważyłem, że problemy z wyświetlaniem czegokolwiek na ekranie pojawiają się kiedy próbuję używać procedur (rozkazami jsr i rts), natomiast kiedy układam wszystko etykietami bez wejść i powrotów procedur wszystko jest ok. Nie pierwszy raz probuję skompilować coś z procedurami zamiast etykiet i kompletnie nic mi nie wychodzi.

Czy ktoś mógłby naprowadzić mnie co jest w kodzie nie tak? Oto link do plików:
http://wrzucacz.pl/file/9841285754383


Zapisane
dr00id88
Gość
« Odpowiedz #121 : Września 29, 2010, 14:58:46 »

Bo żeś [CENZURUJE] [CENZURUJE].

Poprawione:
Kod:
 .dw nmi
  .dw reset
  .dw  0


edit: skończ już rzucać tymi "k**wami" i pochodnymi na forum, bo aż się odechciewa tu przebywać... [dop.daf]
EDIT:
... frustracja;)
« Ostatnia zmiana: Września 29, 2010, 19:23:54 wysłane przez dr88 » Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #122 : Września 30, 2010, 11:05:54 »

Dr88 oczywiście miał rację. Kod był pełny błędów. A oto paczka z poprawionym:

http://wrzucacz.pl/file/8561285837504
Zapisane
dr00id88
Gość
« Odpowiedz #123 : Września 30, 2010, 14:57:22 »



taki efekt, odpalane pod FCEU 0.98.13mm June 15. Postuje, bo nie wiem czy kolory palety tak celowo, czy cos nie tak:)
Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #124 : Września 30, 2010, 19:13:38 »

Kilka postów temu pytałem się, aby upewnić się czy wiem jak kolory są przypisywane obiektom, bo długo nie mogłem tego ogarnąć. Trochę w heksach bawiłem się i zmieniłem kilka rzeczy, żeby było widać, że nie skopiowałem obiektow z gry (wszystko jest w binarkach):
*W jednej z palet tła z mario podmieniłem kolor na fioletowy, zmieniłem kolor podłoża
*Dodałem niesymetryczne okienka w zamku, żeby było widać, że to nie z gry
*Wszystkie palety Sprite'ów ujednoliciłem do 4 tych samych kolorów, jeden z nich (ceglany bodajże) zamieniłem na fioletowy
*Poza tym napisałem sobie prockę do joya wykorzystującą przesunięcie z rotacją (z tym ror-ami i rol-ami miałem problem w x86)

« Ostatnia zmiana: Września 30, 2010, 21:47:27 wysłane przez CodAsm » Zapisane
siudym
Gość
« Odpowiedz #125 : Września 30, 2010, 22:44:40 »

*Poza tym napisałem sobie prockę do joya wykorzystującą przesunięcie z rotacją

hmm odpalilem ROM i ten mario to chodzi tylko w jedna strone. Tzn jaka rotacja? Moge nim sterowac, idzie do przodu, ale w druga strona idzie tylem, wiec nie ma tu rotacji.
Zapisane
dr00id88
Gość
« Odpowiedz #126 : Września 30, 2010, 23:42:23 »

Siudym, jemu chyba chodzilo o zapis 4016, 8 razy jeden bit.
Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #127 : Października 01, 2010, 21:47:27 »

1. Chodziło mi o obsłygę joya, tak aby wszystkie wyplute przez port $4016 osiem bitów zostało zebrane do jednej bajtowej zmiennej.
   Przebieg pętli wygląda mniej więcej tak:
     *Czytanie bitu z $4016
     *Wysunięcie go do znacznika c instrukcją lsr
     *Zebranie go przez rol i ewentualne przesunięcie w lewo (jeżeli pojawił się w poprzedniej iteracji)

2. Próbowałem dziś napisać procedurę. odwracania postaci, ale coś nie chciało działać. Wydaje mi się, że sposób jest ok. Kwestia
   czasu, powinienem dać radę zrobić. Jeżeli będę miał problem to napiszę.
Zapisane
siudym
Gość
« Odpowiedz #128 : Października 01, 2010, 22:01:52 »

To bardzo proste, przypisz dla joya lewo/prawo atrybuty sprajta odpowiedzialne za ich rotacje. Np. wciskajac lewo/prawo zmienia sie atrybut HORIZONTAL FLIP spritea. Dokladnie nie napisze, bo dawno nie siedzialem w tym, ale dojdziesz w mig. Mozesz dodac takze atrybut resetujacy spr po kazdym wciskaniu L/R, wtedy np. postac stojaca bedzie patrzec twarza w strone gracza, a dopiero lewo/prawo zmieniac sie (to wazne, bo samo GOŁE zmienianie samego Horizontal ATR bedzie losowe i czasem wciskajac kilka razy L/R bedzie chodzil odwrotnie hehe). Jest masa mozliwosci, ja gdy doszedlem do pewnego poziomu kombinacji stwierdzilem, ze juz nie wiedza a checi i samozaparcie mnie ogranicza  crazy (czyt.: Lenistwo)
« Ostatnia zmiana: Października 01, 2010, 22:04:22 wysłane przez siudym » Zapisane
dr00id88
Gość
« Odpowiedz #129 : Października 01, 2010, 23:18:45 »

stwierdzilem, ze juz nie wiedza a checi i samozaparcie mnie ogranicza  crazy (czyt.: Lenistwo)

i skromnosc  naughty
Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #130 : Października 02, 2010, 08:04:00 »

Miałeś rację Siudym. To działa:

http://wrzucacz.pl/recived?upload_id=4861285999039

Całkiem niedawno znalazłem poniższy dokument, zobaczymy czy uda mi się zrobić procedurę skoku:

http://www.flipcode.com/documents/gravity.txt
Zapisane
dr00id88
Gość
« Odpowiedz #131 : Października 02, 2010, 16:51:21 »


Całkiem niedawno znalazłem poniższy dokument, zobaczymy czy uda mi się zrobić procedurę skoku:

http://www.flipcode.com/documents/gravity.txt


Zwykła podręcznikowa krzywa balistyczna. Poczytaj raczej teorie na temat rzutu poziomego z jakiejs fizycznej licealnej ksiazki. To samo wylozone.
Zapisane
siudym
Gość
« Odpowiedz #132 : Października 03, 2010, 03:24:15 »

A dopisze dla potomnych: Poza SPR ATTR mozna podkladac pod L/R np. innego tilesa, zrobic sobie w CHR jednak klatke idacego w lewo, druga w prawo i podmienic nr. tilesa pod L czy R. Dodatkowo mozna zmieniajac ATR animowac go. Np. ustawiamy petle w ATR aby gdy trzymamy np. L zmienialy sie tilesy od 1 do 5. Mialem to w demku z latajacym nietoperzem. Mozna kombinowac, ja dodatkowo animacje przyspieszalem gdy sie wciskalo kierunki - taki efekt szybszego trzepotania skrzydel w locie niz stojac w miejscu  crazy
http://www.siudym.gower.pl/nes_demo_2.nes

To wersja bez zmiany akurat lewo/prawo.
« Ostatnia zmiana: Października 03, 2010, 03:27:30 wysłane przez siudym » Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #133 : Października 19, 2010, 19:33:00 »

Próbowałem nieco sformułować procedurę umożliwiającą skok postaci, miałem jednak problem. Co do krzywej balistycznej przestudiowałem wzory, z tego co widzę to jedyne co na nesie można zastosować to listę wartości ręcznie wyliczonych z wzorów na krzywą balistyczną (tu by się prosiło o jakieś adresowanie pośrednie  Tongue). Nawet postowali o tym na forum nesdev.

Mój pomysł bazowałby jednak na tym co umieszczono we wcześniej linkowanym dokumencie (http://www.flipcode.com/documents/gravity.txt) :
*współrzędna x powinna być niezależna (wystarczy obsługa kursorów joypada, która już jest- ewentualnie dodanie tam animacji)
*powinno się modyfikować jedynie koordynatę y
*dla uproszczenia kodu możnaby dodać flagę określającą zwrot skoku
  1 ->w górę
  0 -> w dół
*konieczne byłoby utworzenie stałych:
  -maksymalnej/minimalnej wysokości postaci
    podłoga=208 (bo pod postacią mamy 4 Tiles'y)
    najwyzszy_punkt= podłoga - jump_height
  -przyspieszenia (np. a=10 )
  -wysokości skoku (np. jump_height=100)

*Jeżeli jest naciśnięty klawisz skoku, to za każdym NMI wykonywałoby się następującą procedurę:

  W_górę:
    V=V-a
    y=y-V
  W_dół:
    V=V+a
    y=y+V
  Sprawdź_Wspolrzedne:
    ;Kod sprawdzający czy współrzędna postaci w następnym przebiegu ma być zmniejszana czy zwiększana
    ;Ustawiająca flagę zwrotu skoku
  AktualizacjaSprite'ów:
    ;Przepisanie y'ków do odpowiednich komórek SPR-RAM

______________________________________________________________________________________________________________

Nie oczekuję że ktoś rozwiąże za mnie problem, ale prosiłbym o drobną pomoc:
-czy dobrze rozumuję
-czy w tej koncepcji nie ma jakichś rażących błędów
-ewentualna pomoc w sformułowaniu szczegółowszego pseudokodu
______________________________________________________________________________________________________________

Dodam ponadto, że próbowałem zakodować w NESASM'ie to wszystko, ale coś musiałem spieprzyć z warunkami, bo postać leci cały czas w górę. (Bez ogólnej procedury kolizji coś czuję, że to będzie i tak marnota). Oto fragment kodu, który miał obsłużyć skok:


Kod:
 ; Procedura wywoływana w kodzie inicjalizacyjnym
  
  init_jump_variables:
    lda #$00
    sta jumping
    lda #$d0 ; Gdy postać stoi na ziemi
    sta coord_y
    lda #$00
    sta velocity
    lda #$0a
    sta acceleration
    lda #$00
    sta jump_dir ;początkowy kierunek skoku:
; *#$00 - W górę
; *#$01 - W dół

  ; Procedura skoku postaci wywołowywana w każdej klatce

  handle_jump:    
 
   ; Na początek należy sprawdzić czy postać skacze
    lda jumping
    cmp #$01
    bne end_handle_jump
  
   jump_up:
    lda jump_dir
    cmp #$00
    bne jump_down    

    lda velocity     ;     \
    clc             ;      \ v = v + a
    adc acceleration ;      /
    sta velocity     ;     /
    
    lda coord_y        ;     \
    sec        ;      \ y = y - v
    sbc velocity        ;      /
    sta coord_y         ;     /
       ;
            ;    a = coord_y
    cmp #$a0        ;    if(coord_y <> 160)
    bne update_sprite_y ;     W następnym NMI bohater ma się nadal wznosić        
                        ;    else
    lda #$01            ;     Ustaw kierunek na przeciwny
    sta jump_dir        ;
    
    jmp update_sprite_y

   jump_down:    
    lda jump_dir
    cmp #$01
    bne jump_up

    lda velocity        ;   \
    sec                 ;    \ v = v - a
    sbc acceleration    ;    /
    sta velocity        ;   /

    lda coord_y         ;   \
    clc                 ;    \ y = y + v
    adc velocity        ;    /
    sta coord_y         ;   /

  
    cmp #$d0            ;  if(coord_y <> 208)
    bne update_sprite_y ;   W następnym NMI bohater ma nadal spadać  
     ;  else
    lda #$00            ;   Ustaw kierunek na przeciwny (zostanie on użyty przy następnym skoku)
    sta jump_dir        ;
    
    lda #$00
    sta jumping

  update_sprite_y:

    lda coord_y
    clc
    adc #$08
    sta $0200  
    sta $0204
    lda coord_y
    sta $0208
    sta $020C

  end_handle_jump:

    rts
   
______________________________________________________________________________________________________________

Zastosowałem odwrócone znaki (gdyż chciałem operować na dodatnich wartościach i nie babrać się w kodzie U2- dodatkowe potencjalne błędy- moje dopiero raczkujące umiejętności kodowania w asm6502)

Za każdą najdrobniejszą pomoc/wskazówkę z góry dziękuję.
« Ostatnia zmiana: Października 19, 2010, 19:40:01 wysłane przez CodAsm » Zapisane
dr00id88
Gość
« Odpowiedz #134 : Października 20, 2010, 06:23:05 »

Mowilem, sprawdz sobie ten rzut poziomy, to co napisales, ze wspolrzedna x nie jest modyfikowana to normalne, w koncu to funkcja f(x).
Zapisane
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #135 : Października 22, 2010, 14:41:33 »

W opracowaniach na temat rzutu poziomego jest sporo innych wzorów, ale zdaje się, że na NES-ie spokojnie wystarczy mi to:

________________________________________________________________________________________________________________
Prędkość i wysokość

V = sqrt(Vx2+Vy2)
h=gT2/2

gdzie:
Vx=const= V0
Vy=g*T

I przemieszczenie uzyskane za pomocą krzyżaka (tzn. w lewo/w prawo - tego nigdzie nie trzeba liczyć)

l=Vx*T     (Nie interesuje nas, jeżeli chcemy tylko skoku w pionie)

Symbole:
g- Grawitacja (eksperymentalnie dobrana stała wartosc w programie tak, aby Vy obliczona z powyższego wzoru była w miarę odpowiednia- na oko)
h- Wysokość (dobrać odpowiednią skalę w pikselach lub Tilesach)
T=1/60 s (gdyż w czasie sekundy mamy 60 NMI, a interesuje nas o ile wzniesie się postać w znanym ułamku czasowym)
Vy- Prędkość w pionie
l- Droga przebyta w poziomie
______________________________________________________________________________________________________________

Jeżeli to co tu mam jest ok i wystarczające to najpierw trza napisać poniższe procedury dla liczb 16 bitowych (?):
-mnożenia
-dzielenia
-potęgowania
-pierwiastkowania (?)
______________________________________________________________________________________________________________

Moim problemem jest przełożenie sobie teorii fizyki na praktykę tzn. jak powinienem użyć wszystkich tych wielkości w kodzie. Tak więc podejmuję kolejną próbę.

EDIT:
Po przeszukaniu NESDev sporo jest na ten temat informacji wraz z wzorami:
http://nesdev.parodius.com/bbs/viewtopic.php?t=5192&postdays=0&postorder=asc&highlight=gravity&start=0&sid=4b740314897218bb76705750bae3288b - O fizyce
http://nesdev.parodius.com/bbs/viewtopic.php?t=3096&highlight=gravity - O skakaniu

http://tasvideos.org/GameResources/NES/Rockman/Data.html

« Ostatnia zmiana: Października 22, 2010, 21:34:48 wysłane przez CodAsm » Zapisane
mog123
Chorąży
***
Offline Offline

Wiadomości: 221


WWW
« Odpowiedz #136 : Października 26, 2010, 00:00:19 »

widać że słabo z algorytmami Tongue

Są gotowe algorytmy na pierwiastkowanie i potęgowanie, o ile potrafisz czytać schematy blokowe algorytmów. Mnożenie i dzielenie jest banalne jak umiesz dodawać i mnożyć liczby.
Zapisane

http://mog123x.blogspot.com/
Moje pięć groszy.
mog123
Chorąży
***
Offline Offline

Wiadomości: 221


WWW
« Odpowiedz #137 : Października 26, 2010, 00:06:13 »

Jest masa mozliwosci, ja gdy doszedlem do pewnego poziomu kombinacji stwierdzilem, ze juz nie wiedza a checi i samozaparcie mnie ogranicza  crazy (czyt.: Lenistwo)

Też doszedłem do tego momentu, gdy chciałem się uczyć to chęci było pełno. Gdy nauczyłem się wszystkiego czego chciałem i niby miałem przystąpić do "prawidłowego" pisania gry, to już mi się odechciało. Pisałem na GBA :p
Zapisane

http://mog123x.blogspot.com/
Moje pięć groszy.
CodAsm
Szeregowy
*
Offline Offline

Wiadomości: 49


« Odpowiedz #138 : Października 26, 2010, 10:42:34 »

widać że słabo z algorytmami Tongue

Są gotowe algorytmy na pierwiastkowanie i potęgowanie, o ile potrafisz czytać schematy blokowe algorytmów. Mnożenie i dzielenie jest banalne jak umiesz dodawać i mnożyć liczby.

1. Jeżeli idzie o mnożenie i dzielenie to zdaje się, że lepsze są przesunięcia bitowe i dodawania OR.
2. Co się tyczy pierwiastkowania sprawa nie jest już taka prosta, bo procesor 6502 jest wolny, a w NMI trzeba zostawić nieco cykli    na logikę gry, narysowanie kilku kolumn/wierszy (dwóch do trzech) Tilesów i transfer dma, a pierwiastkowanie to przecież i tak niewielka część procedury fizyki...Niestety moja aktualna wiedza jest lata świetlne od tematu Timing Code.
Zapisane
dr00id88
Gość
« Odpowiedz #139 : Października 26, 2010, 11:08:13 »

a metoda Newtona-Raphsona to nie łaskaw w google pogrzebac? I nie bajeruj nam przesunieciami bitowymi, bo to kazdy osiol wie, ze szybsze.
Zapisane
Strony: 1 ... 5 6 [7] 8 9 ... 11
  Drukuj  
 
Skocz do:  

Działa na MySQL Działa na PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC Prawidłowy XHTML 1.0! Prawidłowy CSS!
Strona wygenerowana w 0.045 sekund z 19 zapytaniami.