EMU-NES #PL FORUM © 2004-2015

Nes/Pegasus/Famicom => Hacki i Romhacking/Programowanie => Wątek zaczęty przez: siudym Listopad 10, 2006, 12:48:13



Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 10, 2006, 12:48:13
Kilka lat temu bawiłem się w naukę assemblera 6502 oraz całego NES'a. Dzisiaj znowu wpadł mi do głowy pomysł, aby znowu coœ "poPISać" :)

Polecam tutorial (chyba najlepszy) programowania NES'a, niestety po angielsku:
http://www.patatersoft.info/gbaguy/nesasm.htm (http://www.patatersoft.info/gbaguy/nesasm.htm)

Oraz oprogramowanie użyte w tutku:
http://nesdev.parodius.com/nesasm.zip (http://nesdev.parodius.com/nesasm.zip)

Wiecej info, soft, dokumentacje:
http://nesdev.parodius.com/#PC (http://nesdev.parodius.com/#PC)

A tutaj zrobione "niby demko" przeze mnie,
udało mi się poruszyć sprite'a  :lol:
http://bmkmoto.w.interia.pl/nesdemko.zip (http://bmkmoto.w.interia.pl/nesdemko.zip)

Oczywiscie do tutoriala najlepiej sobie kupic ksiazke o programowaniu 6502 (atari/commodore) lub wydrukowac sobie z netu kursy programowania 6502 na atari (jest kilka w polskich wersjach) aby nauczyc sie podstaw assemblera pod ten procek.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: DarQo Listopad 10, 2006, 16:58:40
Danke! BTW jeśli ktoś myśli że po przeczytaniu całego tutoriala będzie już umiał robić gry to się może rozczarować :]


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 10, 2006, 20:28:53
Da się :)
http://nesdev.parodius.com/matrix.zip (http://nesdev.parodius.com/matrix.zip)
http://nesdev.parodius.com/masmix.zip (http://nesdev.parodius.com/masmix.zip)

Trzeba tylko chcieć i dobrze "zakumać" tutka :)
Oczywiscie posiadanie jakiegos doc'a/ksiazki o 6502 tez wymagane :)
Ja mam dwie takie:
http://www.allegro.pl/item141198823_mikrop...go_rodzina.html (http://www.allegro.pl/item141198823_mikroprocesor_6502_i_jego_rodzina.html)
http://www.allegro.pl/item132030139_atari_...zka_soeto_.html (http://www.allegro.pl/item132030139_atari_asembler_6502_ksiazka_soeto_.html)
Bardzo fajne :)

Wersja darmowa kursu 6502 dla atari jest tutaj (to samo prawie)
http://tajemnice.atari8.info/index.html (http://tajemnice.atari8.info/index.html)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 24, 2007, 11:57:06
Po godzinie udało się odpalić NESAsm na XP SP2. Potrzeba:
jakieœ pliki cwsdpmi.zip, DOSBox, nerwy:], znajomoœć holenderskiego (forum).


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 25, 2007, 16:07:43
albo wersja NESASM 2.52 dzialajaca na XP SP2 bezproblemowo od razu.. :heh:  :heh:


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 25, 2007, 16:57:23
Używam 2.51, bo tej drugiej jakoœ dokopać nie mogłem. Szczerze mówišc to doœć proste to programowanie... Może niedługo coœ swojego wypuszczę:]


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: aboabo Lipiec 25, 2007, 20:44:14
sluchajcie przydalby mi sie spis literatury dostepnej w sieci z ktorej moglbym sie nauczyc programowania pod ten procek od podstaw (posiadajac jedynie znajomosc basica). mam na mysli literature dedykowanš dla C64. materialow na ten temat jest bardzo duzo, szperanie jak wiadomo jest czasochlonne a dochodzenie do pewnych rzeczy samemu bolesne i jeszcze raz czasochlonne. poszukuje jak najkonkretniejszych materialow, ktore moglbym pobrac z netu. oczywiscie moga byc po angielsku.

na c64power jest bardzo fajny spis ksiazek ktore z pewnoscia by wystarczyly jednak nie zamierzam licytowac ich na allegro bo chetnych jest duzo, w pobliskich antykwariatach tez pusto.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 30, 2007, 21:31:32
ajajajajjaa..... Kombinuje jak kon pod gore... Zrobilem prosty program, poruszajacy tilesa, odpalajacy nieco dzwieku oraz wczytujacy nametable. Niby nic oryginalnego, ale chcialem za wszelka cene zrobic to TYLKO w kodzie, bez dodatkowych plikow. Czyli cala grafika CHR, PALETA, NAMETABLE itd jest definiowane w kodzie - fajnie, bo wszystko pod reka ;) (czyli NROM 32kb max + VRAM, normalnie mamy 32KB+8KB CHR ROM, wiec nieco mniej miejsca, bo dane CHR siedza w PRG, a nie w CHR ROM. Jednak 32KB to naprawde wiele miejsca, powaznie :D:D )

Niestety nametable (wczytalem tylko 1-sza 32tilesowa linie pozioma) zaczyna mi sie wyswietlac dopiero od prawie srodka ekranu, a nie od poczatku od gory...

Ogolnie wiem w czym problem, w rejestrze $2006, ktory to uzywamy do przygotowania odczytu palety i nametable, dubluje sie w kodzie chyba niepoprawnie... Kombinuje i nic.

Jak wywale pierwsze
Kod:
  lda #$3F  ;set ppu to start of palette
   sta $2006
   lda #$00
   sta $2006
   ldx #$00
to nametable startuje od gory, jednak paleta nie dziala... Aj... Pojecia juz nie mam, dopiero sie w sumie ucze ass'a i niestety juz mnie glowa boli... Zmieniam, kombinuje i nic... :D Dro00id jak mozesz sprawdz co-nieco ok?

(http://siudymus.w.interia.pl/vram_demo.jpg)

source: http://siudymus.w.interia.pl/vram_demo.asm (http://siudymus.w.interia.pl/vram_demo.asm)
nes rom: http://siudymus.w.interia.pl/vram_demo.nes (http://siudymus.w.interia.pl/vram_demo.nes)

Kod:
.inesprg 1
.inesmap 0
.inesmir 0
.ineschr 0

.bank 1    
.org $FFFA
.dw 0
.dw Start
.dw 0

.bank 0
.org $0000

YPos .db 00
XPos .db 00

.org $8000
Start:

jsr screen_off;ekran wylaczony
jsr cleartiles;czyscimy 4KB VRAMu
jsr tiles;kopiujemy tilesy z defchr do VRAM (w karcie)
jsr loadNames
jsr screen_on;wlaczamy ekran
jsr sound

lda #$3F;set ppu to start of palette
sta $2006
lda #$00
sta $2006
ldx #$00

loadpal:

lda Paldata,x
sta $2007
inx
cpx #$20
bne loadpal

infinite:

jsr vwait

ldx #$00;set start SPRRAM
stx $2003
ldx #$00
stx $2003

lda YPos;Y
sta $2004
lda #$01;tile number w pamieci VRAM na karcie
sta $2004
lda #%00000000;attr
sta $2004
lda XPos;X
sta $2004


lda #$01;reset pada (od)
sta $4016
lda #$00
sta $4016

lda $4016
lda $4016
lda $4016
lda $4016;reset pada (do)

lda $4016
and #1
bne PressU
lda $4016
and #1
bne PressD
lda $4016
and #1
bne PressL
lda $4016
and #1
bne PressR

jmp PressN

PressU:  ;tutaj jest to, co ma byc odpalone gdy wciskamy up

lda YPos
sbc #1
sta YPos
jmp PressN

PressD:  ;tutaj jest to, co ma byc odpalone gdy wciskamy down

lda YPos
adc #1
sta YPos
jmp PressN

PressL:  ;tutaj jest to, co ma byc odpalone gdy wciskamy left

lda XPos
sbc #1
sta XPos
jmp PressN

PressR:  ;tutaj jest to, co ma byc odpalone gdy wciskamy prawo
  ; jak dodam jsr vwait, to chodzi wolniej
lda XPos; bo czeka za kazdym ruchem na vb
adc #1
sta XPos
jmp PressN

PressN:  ;tutaj jest to, co ma byc wykonane gdy nic nie wciskamy
jmp infinite

screen_on:

jsr vwait
lda #%00000000
sta $2000
lda #%00011110;spr on, bg off, spr no clipp
sta $2001
rts


screen_off:

jsr vwait
lda #0
sta $2000
sta $2001
rts

vwait:

bit $2002
bpl vwait
rts

Paldata:

.db $3F,$20,$10,$00,$3F,$10,$10,$10,$3F,$10,$10,$10,$3F,$00,$00,$00
.db $3F,$16,$19,$01,$3F,$00,$00,$00,$3F,$00,$00,$00,$3F,$00,$00,$00

loadNames:

jsr vwait
lda #$20;set ppu to start vram
sta $2006
lda #$20
sta $2006
loadNames1:
lda nametable,x
sta $2007
inx
cpx #32;zmieniamy w zaleznosci od wielkosci nametable
bne loadNames1
rts

nametable:

.db $01,$01,$01,$01,$02,$02,$02,$02,$01,$01,$01,$01,$02,$02,$02,$02
.db $01,$01,$01,$01,$02,$02,$02,$02,$01,$01,$01,$01,$02,$02,$02,$02


tiles:                ;copy defchr tiles to VRAM

        lda #0        ;set VRAM row for first row of tiles ($0000)
        sta $2006
        lda #$10      ;skip the first tile (blank space)
        sta $2006
        ldy #0        ;reset indexer
tiles1:
        lda tileset,y
        sta $2007
        iny
        cpy #$20      ;number of tiles x 16 bytes ($10) per tile
        bne tiles1
        rts

cleartiles:                    ;clears out $0000-$0FFF in VRAM

        jsr vwait
        lda #0
        sta $2006
        sta $2006
        ldy #$10
cleartiles1:
        ldx #0
cleartiles2:
        sta $2007
        dex
        bne cleartiles2
        dey
        bne cleartiles1
        rts

sound:

lda %00011111
sta $4015

lda #%10101011
sta $4000
lda #%11111111
sta $4001
lda #%11111111
sta $4002
lda #%11111111
sta $4003
rts

tileset:

.defchr $23333331,\
  $32000013,\
  $30200103,\
  $30021003,\
  $30012003,\
  $30100203,\
  $31000023,\
  $13333332

.defchr $30000003,\
  $00000000,\
  $00223300,\
  $00211300,\
  $00211300,\
  $00223300,\
  $00000000,\
  $30000003

.defchr $00001111,\
  $00110000,\
  $11000000,\
  $00000000,\
  $00000000,\
  $00000000,\
  $00000000,\
  $00000000

; .defchr $00000000,\
;  $00000000,\
;  $00000000,\
;  $00000000,\
;  $00000000,\
;  $00000000,\
;  $00000000,\
;  $00000000
;dummy tile

*
Kod:
-> nieco rozpierniczyl skladnie kodu, jak cos dalem link do .SRC

ps. vjupiter: Ja sam do wszystkiego dochodze, metoda prob i bledow i czytania NESCTECH docow... Wszelkie tutoriale ASM jakos mi nie pomagaja :D Na forum nesdev tez banda filozofow... zero pomocy  :blink:

EDIT: Polecam ten tutorial http://www.c64power.com/?strona=programowanie (http://www.c64power.com/?strona=programowanie)
Duzoo pomaga w podstawach ;)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: aboabo Lipiec 30, 2007, 21:43:15
chodzilo mi tylko o lepsze zrozumienie tematu poprzez czytanie wlasciwej literatury. to i tak tylko wiedza ktora lezy u podstaw, wiadomo ze zaraz potem zaczynaja sie schody.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 31, 2007, 09:51:37
Ale ty skromny jesteœ:]

Nigdy w życiu do głowy by mi nie przyszło żeby grafikę do .asm dawać:] No i lepiej używać przerwań do VBlanka.
Co GBAGuy to myœlę że dobre na poczštek, ale tak w połowie to zmieniasz tutorial, bo już nic nie rozumiesz, tak zamieszał.

Niedługo się zabieram za poważniejszy projekt. Interesuje mnie jednak obsługa myszy i klawiatury. Chyba to te same $4016, ale pewnie w inny sposób odczytywane.

Co do samego języku (bioršc pod uwagę kompilator NESASM) to różni się od klasycznego Asemblera, więc jeœli chcesz zaczynać to najpierw powinieneœ poznać tajniki x86, a bynajmniej podstawy. Ułatwia sprawę...

Siudym: zobacz czy masz w Emu ustawionš Emulację PAL.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Senshu Lipiec 31, 2007, 10:07:28
Cytuj
Co do samego języku (bioršc pod uwagę kompilator NESASM) to różni się od klasycznego Asemblera, więc jeœli chcesz zaczynać to najpierw powinieneœ poznać tajniki x86, a bynajmniej podstawy. Ułatwia sprawę...
[snapback]14429[/snapback]

Każdy to pisze, i dodatkowo można to wyczytać w prawie każdym tutorialu...Pytam tylko po co ? Podstawy może załapać uczšc się asm dla NESa, będzie robił to co lubi i pozna tajniki tego procesora, więc nie widze powodu żeby kombinował najpierw z x86...dobrze mu idzie z NES.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 31, 2007, 10:25:02
Cytuj
Ale ty skromny jesteœ:]

Nigdy w życiu do głowy by mi nie przyszło żeby grafikę do .asm dawać:] No i lepiej używać przerwań do VBlanka.
Co GBAGuy to myœlę że dobre na poczštek, ale tak w połowie to zmieniasz tutorial, bo już nic nie rozumiesz, tak zamieszał.

Niedługo się zabieram za poważniejszy projekt. Interesuje mnie jednak obsługa myszy i klawiatury. Chyba to te same $4016, ale pewnie w inny sposób odczytywane.

Co do samego języku (bioršc pod uwagę kompilator NESASM) to różni się od klasycznego Asemblera, więc jeœli chcesz zaczynać to najpierw powinieneœ poznać tajniki x86, a bynajmniej podstawy. Ułatwia sprawę...

Siudym: zobacz czy masz w Emu ustawionš Emulację PAL.
[snapback]14429[/snapback]

Wlasnie nie rozni sie od typowego asemblera. Chyba, ze chodzi ci o ASM x86 to jasne jest inny, jednak jesli chodzi o ASM samego proca 6502 to oczywiscie to samo, identycznie wszystko jak w C64, wiec tutoriale na C64 mile polecane. Atari tez, sam mam dwie ksiazki ASM ATARI. Oczywiscie komputery maja jeszcze swoje rejestry systemowe, wiec te nie beda dzialac na NES'ie, wiadomo  :heh:

Tak wiec nie szukajcie jak cos NEs ASM'a jako tutka, ale 6502 ASM ogolnie ;)

GbaGuy - tak, dokladnie. Wlasnie napisalem, ze na DOBRY poczatek jest ok, ale tylko do nauki, bo nic z tego co napisal prawie nie dziala :D No moze przesadzam, no i fajne info o SRAM napisal hehe, akurat w necie nie bylo tego, a dziala fajnie.

Ja sporo sie nauczylem z samych NESTECH docow, ladowalem rozne wartosci do rejetrow itd.

A emulator mam na PAL, a nawet jak zmienie na ntsc to bedzie to samo, jedynie przesokoczy o 8pix w dole i gorze - czyli to samo bedzie ;)

A przerwania VB jak widzisz czesto uzywam,  testowo gdzie sie da, fajna sprawa, mozna nawet nieco spowalniac co-nieco w kodzie vblankami ;)

A musz i kawiataura... No nie wiem czy to $4016, bo moze byc tak, ze te konsole maja dodatkowo jakis uklad sterujacy :D Bo $4016 nie ma az tylu mozliwosci, ale kto wie... Zreszta nie widze nmigdzie info o tym...

PS. Jako testera kompilacji NES ASM polecam NESTOPIA lub FCEU, inne emu jakos ciezko radza sobie z jego wypocinami (przynajmniej te z "nauki jazdy" :)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 31, 2007, 10:39:56
Cytuj
Sorry... raczej $4017 - bo drugi port (dla drugiego gracza). I wtedy coœ tam grzebie. Usiłowałem to wy-"trace'ować":] ale kiepskie wyniki. Trudno jednoczeœnie tš samš myszš obsługiwać breakpointy  i niš poruszać... a pod FCEUD nie działa (testowałem Educational Computer).

Do pseudo-perfekcji (czyli potrzeb) brakuje mi trzech rzeczy... rzetelny dokument o komponowaniu muzyki, obsługi tej pierd**onej myszy i czegoœ gdzie jest sensownie wytłumaczone:

.dw NMI
.dw Reset
.dw IRQ
[snapback]14432[/snapback]


Do dzwieku mam jeden super, prosta sprawa jednak :)
Jak znade ci dam, mozna nawet w kodzie ASM napisac prosta muzyke (no nie zaraz prposta, zalezy ile bedziesz siedziec przy jej robieniu :D )
http://nesdev.parodius.com/2A03%20technical%20reference.txt (http://nesdev.parodius.com/2A03%20technical%20reference.txt)
Mialem drugi jeszcze, jak znajde podam.
Pomocna tez mapa rejestrow: **** JSR na dole**** :heh:



A:

.dw NMI
- Przerwanie niemaskowalne, jak ustawisz BIT7 w 2000 to mozesz je wlaczyc lub wylaczyc. Jak wlaczysz to .dw NMI bedzie WYKONYWANE zawsze w czasie VBLANK (wymuszony). Czyli robisz cos takiego np.:  Ustawione .dw NMI (nie musi byc nazwa NMI, mozy byc COKOLWIEK, bo te 3 maja priorytet, czyli NMI->RESET->IRQ) wiec mozna nazwac nawet: (bo te nazwy to etykiety)

.dw Jako
.dw Baba
.dw Mandaryna

Dobra dalej, bo zamace:
Masz ustawiony bit 7 w 2000 na 1 i .dw NMI, te NMI to etykieta jakiegos programu
np.

NMI:
tutaj dajesz jakis program, ktory bedzie ZAWSZE!! wykonywany 1/50 lub 1/60 sekundy czyli w czasie VBLANK - zawsze!

To samo z:

.dw Reset
.dw IRQ

.dw Reset (etykieta, ja mam np. Start wpisany) to przerwanie POWERU i RESETU (klawiszy lub przerwania programoweg).

Reset:
tutaj dajesz w odzie program, ktory wykonuje sie NA SAMYM poczatku, gdy wcisniesz power off w konsoli lub wcisniesz RETET. Zawsze zacznie sie od tego miejsca (labela)

.dw IRQ jest ogolnie NIE UZYWANY, bo nie ma pozytku w NESIE z niego :D No chyba, ze podlaczysz cos pod pin /IRQ w procesorze, jakis dodatkowy sprzet itd.

Zazwyczaj uzywa sie go tak:

.dw IRQ


IRQ:

rti ; czyli return from interupt (spierdaczaj z przerwania i wracaj skad przylazles  :heh: ) - w sumie to chyba nigdy nie wykonywane...

 :heh:  :heh:  :heh:  :heh:


Kod:
   +---------+----------------------------------------------------------+
    |  $4000  | pAPU Pulse #1 Control Register (W)                       |
    |  $4001  | pAPU Pulse #1 Ramp Control Register (W)                  |
    |  $4002  | pAPU Pulse #1 Fine Tune (FT) Register (W)                |
    |  $4003  | pAPU Pulse #1 Coarse Tune (CT) Register (W)              |
    |  $4004  | pAPU Pulse #2 Control Register (W)                       |
    |  $4005  | pAPU Pulse #2 Ramp Control Register (W)                  |
    |  $4006  | pAPU Pulse #2 Fine Tune Register (W)                     |
    |  $4007  | pAPU Pulse #2 Coarse Tune Register (W)                   |
    |  $4008  | pAPU Triangle Control Register #1 (W)                    |
    |  $4009  | pAPU Triangle Control Register #2 (?)                    |
    |  $400A  | pAPU Triangle Frequency Register #1 (W)                  |
    |  $400B  | pAPU Triangle Frequency Register #2 (W)                  |
    |  $400C  | pAPU Noise Control Register #1 (W)                       |
    |  $400D  | Unused (???)                                             |
    |  $400E  | pAPU Noise Frequency Register #1 (W)                     |
    |  $400F  | pAPU Noise Frequency Register #2 (W)                     |
    |  $4010  | pAPU Delta Modulation Control Register (W)               |
    |  $4011  | pAPU Delta Modulation D/A Register (W)                   |
    |  $4012  | pAPU Delta Modulation Address Register (W)               |
    |  $4013  | pAPU Delta Modulation Data Length Register (W)           |
    +---------+----------------------------------------------------------+
    |  $4014  | Sprite DMA Register (W)                                  |
    |         |                                                          |
    |         |  Transfers 256 bytes of memory into SPR-RAM. The address |
    |         |  read from is $100*N, where N is the value written.      |
    +---------+----------------------------------------------------------+
    |  $4015  | pAPU Sound/Vertical Clock Signal Register (R)            |
    |         |                                                          |
    |         |    D6: Vertical Clock Signal IRQ Availability            |
    |         |           0 = One (1) frame occuring, hence IRQ cannot   |
    |         |               occur                                      |
    |         |           1 = One (1) frame is being interrupted via IRQ |
    |         |    D4: Delta Modulation                                  |
    |         |    D3: Noise                                             |
    |         |    D2: Triangle                                          |
    |         |    D1: Pulse #2                                          |
    |         |    D0: Pulse #1                                          |
    |         |           0 = Not in use                                 |
    |         |           1 = In use                                     |
    |         +----------------------------------------------------------+
    |         | pAPU Channel Control (W)                                 |
    |         |                                                          |
    |         |    D4: Delta Modulation                                  |
    |         |    D3: Noise                                             |
    |         |    D2: Triangle                                          |
    |         |    D1: Pulse #2                                          |
    |         |    D0: Pulse #1                                          |
    |         |           0 = Channel disabled                           |
    |         |           1 = Channel enabled                            |
    +---------+----------------------------------------------------------+
tu doklaniej opisane
http://nesdev.parodius.com/2A03%20technical%20reference.txt (http://nesdev.parodius.com/2A03%20technical%20reference.txt)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 31, 2007, 10:46:09
Cytuj
.dw IRQ


IRQ:

rti

Takš kombinację też widziałem i wydawała mi się kretyńska:)
Czekam na dokument...

btw. muszę tš mysz rozszyfrować:D


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 31, 2007, 10:48:24
No bo w sumie po co to? Lepiej zrobic tak:

.dw 0 (jako irg) i po klopocie

:]


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 31, 2007, 18:31:42
Moje małe testowe dzieło sztuki:)
NES Testing Pad (http://rapidshare.com/files/46160003/TEST.NES.html)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Lipiec 31, 2007, 23:25:15
heh. Poprawione.

dziala idealnie, nametable wyswietla, porusza tilesa, odpala pare dzwiekow (wciskajac START testujemy wszystkie kanaly, jedynie bez PCM)  i wszystko w kodzie. Plik NES 16KB, bo tylko 1 bank bez chr (wszycho jest w prg) :heh:
Teraz mozna sie bawic dalej :) Postaram sie zrobic cos w stylu berzerk albo tron z atari ;P

http://siudymus.w.interia.pl/vram.nes (http://siudymus.w.interia.pl/vram.nes)

(http://siudymus.w.interia.pl/vram.png)


EDIT:

Testowalem na konsoli, niestety tylko nametable sie wyswietla, jeszcze ucina gorne 32x8 pixeli. Zreszta nie ma sie co dziwic, wiele dem testowalem i masa bledow zawsze ;) Aha. Moj kod to NROM PRG+VRAM, dzieki temu dev-cart UNROM idealnie nadaje sie jako tester programu :D Juz na forum pisalem o tym, ze na UNROM'ie mozna odpalac NROM'y ale bez CHR ROMU, jednak NROM z VRAM mozna hehe :)
(http://img295.imageshack.us/img295/1830/hardtestdw6.jpg)
Jak widac nieco przyciety obraz z lewej strony, jednak to nie wina kodu, a jedynie kijowego centrowania obrazu TV.


Drugie demko, ludzik i labirynt. Mam problem ze zmiana polozenia sprite'a, jest o polowe pix niesymetrycznie wzgledem tla w pionie... W tle napis emu nes, niestety zapomnialem polaczyc labirynt, wiec nikt nie wlezie tam hehe. A nie chce juz mi sie juz tego poprawiac ;)
http://siudymus.w.interia.pl/lab.nes (http://siudymus.w.interia.pl/lab.nes)
(http://img505.imageshack.us/img505/5513/dfdfdfla9.jpg)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Mejs Sierpień 01, 2007, 14:08:47
Dobry Siudym!!

Jak już tyle umiesz to tylko krok do wydania gry.
Szalej całym ciałem a gra wyjdzie, hoho, na szpitalnej!


hehe. ;]


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Sierpień 01, 2007, 14:12:54
Oj... Nawet nie wiesz jaka jeszcze dluuuuuuuuuuuuuuuga droga do tego.... :heh:

ps. Mozna zaladowac cala tablice nie uzywajac 16-bitowych wartosci. hehe Wystarczy wczytac ja "na raty". To dla tych, co tez beda miec problem z tym na poczatku ;)
Kod:
loadNames:

lda #$20;set ppu to start vram
sta $2006
lda #$00
sta $2006
loadNames1:
lda nametable1,x
sta $2007
inx
cpx #$FF
bne loadNames1

loadNames2:
lda nametable2,x
sta $2007
inx
cpx #$FF
bne loadNames2

loadNames3:
lda nametable3,x
sta $2007
inx
cpx #$FF
bne loadNames3

loadNames4:
lda nametable4,x
sta $2007
inx
cpx #$FF
bne loadNames4

rts

"loadNames*" i "nametable*" to etykietki oczywiscie. Podzielone na 4 czesci po 256 tilesow (czyli FF - 8bitowa wartosc).


Wyczyscilem nieco kod, teraz robie przerwe sobie... Juz oczy mnie bola od tego siedzenia w cyferkach.... Kod znowu przerobilem na VRAM only, a op przerwie bedzie trzeba dodac jakis poruszajacych sie przeciwnikow lub strzelanie or cos tam...  :heh:
(http://img235.imageshack.us/img235/9052/fdgfgdfgnl6.jpg)


A tutaj NSF load program... Niestety cos nie dziala, jeszcze posiedze przy nim, bo dzialac powinien ;) Wzorowany na kodzie nullsleep'a (oryginalnie pod X816, jednak kod prosty i odpalenie go pod NESASM nie powinno byc problemem. Obecnie nawet nie wywala bledow przy kompilacji, wiec jest ok. Jedynie gdzies haczyk jest...  :)  Adresy LOAD, INIT i PLAY trzeba samemu z headera NSF wczytac (sa pod 0008h, 000A i 000C)

Kod:

.inesprg 1
.ineschr 0
.inesmir 0
.inesmap 0


.org $C48D ; wczytujemy LOAD adres z NSF (z headerem to -$80)
.incbin "demo.nsf"; include NSF (header -$80 lub bez)

.org $8000

RST:
cld  ; clear decimal flag
sei  ; disable interrupts
lda #%00000000 ; nmi off
sta $2000

WaitV1:

lda $2002 ; czekamy na vb aby ppu ruszylo dupsko
bpl WaitV1

WaitV2:

lda $2002 ; i raz jeszcze dla pewnosci, ze ruszylo;)
bpl WaitV2


lda #$00 ; zerujemy przed lopem
ldx #$00 ; czyszczenia rejestrow dzwieku

Clear_Sound:

sta $4000,x ; prosty clear jak ch****... czysci 16bajtow 4000
inx
cpx #$0F
bne Clear_Sound

lda #$10
sta $4010
lda #$00 ; czyscimi DPCM
sta $4011
sta $4012
sta $4013

lda #%00001111 ; all channels on
sta $4015 ; poza dpcm

lda #$C0 ; synchronize the sound playback routine
sta $4017 ; to the internal timing of the NES

lda #$02 ; numer utworku w nsf
ldx #$00 ; $00 dla NTSC i $01 dla PAL
jsr $BE34 ; wczytujemy INIT adres z nsf

lda #%10000000 ; enable vblank (NMI)
sta $2000
Loop:   ; w kolo macieju...
jmp Loop


NMI:
lda $2002 ; read $2002 to reset vb flag
lda #%00000000 ; nmi off  
sta $2000
lda #%10000000 ; a teraz nmi on
sta $2000
jsr $F2D0 ; wczytujemy PLAY adres z NSF
rti

IRQ:

rti

.bank 1    
.org $FFFA
.dw NMI
.dw RST
.dw IRQ



Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: œmigło .::. Sierpień 04, 2007, 18:41:57
Cytuj
Testowalem na konsoli, niestety tylko nametable sie wyswietla, jeszcze ucina gorne 32x8 pixeli.

Prawdopodobnie to też jest kwestia wyœwietlania obrazu na TV. Np. przy pisaniu programów na atarkę dobrym nawykiem jest umieszczenie na poczštku listy obrazu bodajże 24-ech pustych linii.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Sierpień 04, 2007, 19:51:52
Nie nie... To pierwszy moj program w sumie, zle operowalem vblankami ;) Teraz robie z naciskiem na "hardware friendly code" ;P

EDIT:
Juz wiem jak ladnie i zgrabnie tworzyc kod, aby dzialal bezproblemowo na konsoli, a to bardzo wazna sprawa ;)

Ludek nieco "nieksztaltny" na ekranie, bo BG jest w drobna kratke, do tego TV rozciaga grafike, wiec wyglada jak wyglada ;)
Wszystko to podstawy, jednak bardzo wazne, poniewaz "czysty" i dobrze zrozumiany rdzen kodu to podstawa (masa kombinowania) :)

Real (pasek z winy aparatu)
Na fotce nie widac dobrze, ale gorna linia pixeli jest ucieta. To chyba te slynne "dummy" scanline 0 - czyli pusta linia obrazu renderowana jako pierwsza po VBlank (to tylko 1pix wysokosci, wiec nie widac tego zbytnio)
(http://img252.imageshack.us/img252/4387/spritemovehardsw3.jpg)

Emu:
(http://img252.imageshack.us/img252/2715/spritemovehardan6.png)

Vid:
http://www.youtube.com/watch?v=LC5e3IUmQsI (http://www.youtube.com/watch?v=LC5e3IUmQsI)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Sierpień 06, 2007, 19:50:32
Nie sšdziłem, że można aż tak zniekształcić sprite'a. Wiem, że wpływ ma krzywizna ekranu, ale że powstał taki Quasimodo:P

Muszę sprawdzić swoje demka...


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: aboabo Sierpień 06, 2007, 21:17:11
Cytuj
Ludek nieco "nieksztaltny" na ekranie, bo BG jest w drobna kratke, do tego TV rozciaga grafike, wiec wyglada jak wyglada wink.gif
w ten sposob mozna tworzyc bardzo psychodeliczne efekty! zwlaszcza jezeli uzyjesz dodatkowo przezroczystosci na elementach tła (patrz life force, 1 level jak wlatujesz do tętnicy).

z tš siatkš swietny patent, nasuwajš sie pomysly zaimplementowania iluzji optycznej.

podoba mi sie sposob w jaki zaanimowales spritea. raptem 3 albo dwie klatki, a postac porusza sie jak naspeedowana mrowka. zacne.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Sierpień 07, 2007, 00:16:10
Siatka ma jedna jeszcze zalete - gdy ustawie aby sprite wolno sie poruszal (tzn. nie aby sie wlekl, tak dwa razy wolniej niz teraz), to wyglada zupelnie jak by byl animowany, nogi sie fajnie ruszaja itd ;)

Tutaj plik NES - kierunki poruszanie sie sprite'a, select odpala prosty dzwiek, start zmienia ekran (tutaj do dopracowania, bo cos znowu nierowno sie wyswietla...)
Demo zrobilem glownie dla testow na konsoli - wynik wzorowy :] Dziala idealnie ;)
NROM 16k bez chr (vram)
http://siudymus.w.interia.pl/hard.nes (http://siudymus.w.interia.pl/hard.nes)

Sprawdzalem tez poprawnosc ladowania danych CHR z PRG ROMU do VRAM, kazdy z bankow CHR (4kb SPR i 4kb BKG) ma ustawiony jeden tiles na koncu bankow (FF). Wszystko dziala super.

EDIT: Zauwazylem, ze najlepszy emu do NESASM to VirtuaNES! Inne emulowaly demka czasami zupelnie inaczej niz odpalane na konsoli... VirtuaNES zdecydowanie najlepszy pod tym wzgledem. Jeszcze nnesterJ bardzo dobry pod tym wzgledem.

Cytuj
podoba mi sie sposob w jaki zaanimowales spritea. raptem 3 albo dwie klatki, a postac porusza sie jak naspeedowana mrowka. zacne.
[snapback]14563[/snapback]
Wlasnie ten sprite nie ma wcale klatek animacji  ;] Na tym wlasnie trick polega ;)


ps.
Jak ktos chce kod zrodlowy Super Mario Bros (disassembled) to prosze bardzo ;)
http://www.geocities.com/deethefigurine/smbdis.zip (http://www.geocities.com/deethefigurine/smbdis.zip)
http://pinocchio.jk0.org/nes/smb1_src.zip (http://pinocchio.jk0.org/nes/smb1_src.zip)


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: aboabo Sierpień 07, 2007, 21:53:07
Cytuj
Wlasnie ten sprite nie ma wcale klatek animacji cwaniak.gif Na tym wlasnie trick polega wink.gif
a no zauwazylem dopiero jak udostepniles demko. myslalem ze jest zaanimowany tak jak na wczesniejszym demku i o ta wlasnie animacje mi chodzilo.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Sierpień 22, 2007, 12:20:56
Jeœli zamierzacie animować ogień (płomień) to lepsze efekty uzyskuje się nie czekajšc na Vblank;] sprawdzone...


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Sierpień 22, 2007, 19:48:20
Chetnie, chetnie, ale dopiero jak skończę:]


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Wrzesień 10, 2007, 20:30:18
pomoze ktos?:P

virtuanes wogole mi nic nie pokazuje(szary ekran), o to moj kod:



Kod:
;-----------NAGLOWEK------------;

        .inesprg    1
        .ineschr    1
        .inesmir    1
.inesmap    0

.org $8000
.bank 0

Start:
lda #%00001000
sta $2000
lda #%00011110
sta $2001

lda #$3F; wskazuje na poczatek palety
sta $2006
lda #$00
sta $2006
ldx #$00

paleta:

lda pacpal, x; laduje palete do A
sta $2007
inx
cpx #$20; porownuje x z 32
bne paleta; jesli x=/= 32 skacze do paleta

vwait:
lda $2002   ;czeka az skonczy sie VBlank
bpl vwait

        lda #$20      ;poczatek VRAM ($2020)
        sta $2006      
        lda #$20    
        sta $2006

lda #$01;wpisuje do name table
sta $2007
lda #$02
sta $2007
lda #$6C
sta $2007
lda #$6C
sta $2007
lda #$6F
sta $2007

loop:
jmp loop

pacpal:

.include "pac.pal"; dane palety



;--------------CHR--------------;

.bank 2
.org $0000
.incbin "pac.chr"; 8kB

;-----------WEKTORY-------------;

       .bank 1          ;
       .org  $FFFA ;
.dw  0;(NMI_Routine)
.dw  Start;(Reset_Routine)
.dw  0;(IRQ_Routine)

I to tyle

Sam podejrzewam ze to paleta.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 10, 2007, 21:19:49
.No to po kolei. Używam nesasm, nie wiem co ty używasz, ale sšdzę że też to samo:)

1.
Kod:
.org $8000
.bank 0

Błšd!! Ma być w banku 0 .org $8000
czyli:
Kod:
.bank 0
.org $8000

2.
Kod:
.include "pac.pal";

.include pozwala dodac fragment KODU w asm np., sterownik, funkcje, procedury...

tu jest nam potrzebny .incbin (poniewaz to nie sa zadne instrukcje tylko bajty palety, więc:

Kod:
.incbin"pac.pal";


Myœlę, że to wszystko. Pod FCEU działa...


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Wrzesień 10, 2007, 21:31:23
dzieki wielkie, zupelnie zpaomnialem ze include to co innego od incbin :)
edit: ekhm, nie takich kolorow uzylem w mojej palecie :P


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Wrzesień 10, 2007, 21:40:03
Masz zla palete...

Paleta musi miec 32bajty, a Twoja ma 768... ;)
Jakis dziwny plik, to nie jest paleta nesasm wcale, czym to robiles?


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Wrzesień 10, 2007, 21:41:31
yy-chr


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Wrzesień 10, 2007, 22:42:05
Uzywaj tego programu:
http://www.keepmyfile.com/download/d1b49f1868724 (http://www.keepmyfile.com/download/d1b49f1868724)
(http://img120.imageshack.us/img120/3456/beztytuunv3.jpg)
Albo najlepiej definiowac w kodzie palete, wygodnie i pod reka. Ja tak robie.


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Wrzesień 10, 2007, 23:09:30
nie dizlaa mi ten program, kiedys go uzywalem, ale dupa ala  brakuje mu pliku COMDLG32.OCX


Tytuł: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Styczeń 08, 2008, 15:46:25
Całkiem niezły tutorial.
http://www.nespowerpak.com/nesasm/ (http://www.nespowerpak.com/nesasm/)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 03, 2008, 07:59:06
Sdm, jesli chodzi o animacje to bierz sie za mmc3 juz.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 03, 2008, 13:57:39
A co juz bawiles sie z MMC3? Wogole pod NESASM dzialaja instrukcje/rejestry MMC3???
Jak masz jakas ciekawostke, demko pod MMC3 to dawaj ;)

ps. Mala zmiana z poprzedniego przykladu poruszania sprite'a:
http://www.sdm.gower.pl/test_mario.nes

Kierunki poruszaja postacia, SELECT - zmienia tiles w 'sprajcie' oraz jest dzwiek. ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 03, 2008, 18:34:34

Co do MMC3 to mozliwe, ze nie zalezy od NESASM, akurat nie bawilem sie nim, jedynie nieco MMC1.

Nie możliwe, a na pewno. NESASM tylko zamienia ci mnemoniki na opcody.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 04, 2008, 16:49:31
Dobra, juz opanowalem BGR, jest tak jak powinien:)

Jak cos etykietka na BGR, moze sie komus przyda:

LoadNT1:

   LDX #$20
   STX $2006
   LDX #$00
   STX $2006
   STY $2006
   LDX #$04
   LDA #low(NameTable1)
   STA <$0000
   LDA #high(NameTable1)
   STA <$0001

LoadMap:

   LDA [$0000], y
   STA $2007
   INY
   BNE LoadMap
   INC <$0001
   DEX
   BNE LoadMap

   RTS


NameTable1 - oczywiscie odnosnik do incbin'a lub zdefiniowanej w kodzie tablicy.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 04, 2008, 19:42:26
Dobra, juz opanowalem BGR, jest tak jak powinien:)

Jak cos etykietka na BGR, moze sie komus przyda:

LoadNT1:

   LDX #$20
   STX $2006
   LDX #$00
   STX $2006
   STY $2006
   LDX #$04
   LDA #low(NameTable1)
   STA <$0000
   LDA #high(NameTable1)
   STA <$0001

LoadMap:

   LDA [$0000], y
   STA $2007
   INY
   BNE LoadMap
   INC <$0001
   DEX
   BNE LoadMap

   RTS


NameTable1 - oczywiscie odnosnik do incbin'a lub zdefiniowanej w kodzie tablicy.

Krótko mowiąc: gdy potrzebujesz wczytac coś co ma więcej niż 256 elementów wykorzystujesz indirect addressing. A swoją drogą, bo widzę że jeszcze nie probowales, staraj się wczytywac sprite'y/tile'e tuz po przerwaniu wywolanym VBlankiem, wtedy grafika nie bedzie sie pieprzyla, a i nawet plynny efekt mozna uzyskac.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 05, 2008, 13:17:06
No patrzac na twoje kody to wylaczasz ekran i wczytujesz grafike, a cala sztuka polega na wczytywaniu na wlaczonym ekranie, ale tak zeby sie nie spie**olil. To ze FCEU pozwala na zapis poza okresem VBlank bez wylaczania ekranu to nie znaczy tak bedzie na konsoli.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 05, 2008, 15:39:31
Testowalem takze wiele razy wczytywanie calej grafy PO calkowitym wylaczeniu PPUCTRL1 i 2, a wlaczajac PPUCTRL1/2 juz po wczytaniu - na konsoli smiga bez bledow.

A sztuka jest zeby ich nie wylaczac i popsuc grafiki w PPU.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 05, 2008, 18:16:57
Akurat nie wiem dlaczego 'sztuka' ? :) Zarowno nie wlaczajac i wlaczajac kod dziala ;) Uzywalem obu sposobow. Obecnie uzywam z wylaczaniem, bo bardziej mi pasuje ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 05, 2008, 18:46:12
Akurat nie wiem dlaczego 'sztuka' ? :) Zarowno nie wlaczajac i wlaczajac kod dziala ;) Uzywalem obu sposobow. Obecnie uzywam z wylaczaniem, bo bardziej mi pasuje ;)

To ze bardziej pasuje to rozumiem:) ale widze ze powinienes troche przegrzebac tematow na bbs nesdev. Niektorzy starzy wyjadacze znaja sie na rzeczy.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 06, 2008, 17:06:21
To juz sam nie wiem kto kogo nie rozumie... (widocznie patrzysz caly czas na moje stare testowe kody co sa na pierwszyst stronach tematu)
Mam praktycznie identyczny kod..

A tak na marginesie:

vblankwait1:       ; First wait for vblank to make sure PPU is ready
  BIT $2002
  BPL vblankwait1

vblankwait2:       ; Second wait for vblank to make sure PPU is ready
  BIT $2002
  BPL vblankwait2

na:

          JSR VBlankWait (uzywane gdzie potrzebne)

jako podprogram

VBlankWait:
  BIT $2002
  BPL VBlankWait
RTS


Wogole moje programy pisze uzywajac wielu podprogramow (JSR).

Na razie kodu nie pokazuje nikomu - wyszla mi prawie prosta gra z tego, wiec na chwile obecna cicho-sza. ;)

Mniejsza z tym... Mam pytanie dotyczace "The P65 Assembler" (Copyright (c) 2001,2 Michael Martin) - jak nim kompilowac? W paczkach sa same kody zrodlowe, czy to trzeba jakos skompilowac pod czyms czy jak...??



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 06, 2008, 19:53:17
Jak uzywa sie P65???
http://nesdev.parodius.com/NES101.zip
http://hkn.eecs.berkeley.edu/~mcmartin/P65/

??? Czy plik "p65" (bez extension) trzeba skompilowac czy co? Czyli mam demko ale jak skompilowac to do .NES ??

Co i jak ma sciagnac ze strony www.perl.com ??

EDIT: Proste demko, obecnie pracuje nad dodaniem jakiegos sensu = typu zrzucanie bomb przez latajacy obiekt i unikanie ich przez bohatera, dodanie muzyczki, animacja postaci itd.
http://www.speedyshare.com/451394120.html

(http://img205.imageshack.us/img205/7651/weqwewerweryt8.jpg)
ps. uboga kolorystycznie (jedno-odcieniowa) grafa ma swoja racje bytu - ma byc klimat prostych gier na ZX Spectrum ;)






Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Senshu Październik 07, 2008, 21:41:53
Podoba mi sie twoje zacięcie Siudym :) wygląda na to ze niebawem bedziemy mieli pierwsza gre od człowieka z polskiej sceny  ??? (pomiajac masmixa itp.)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Berion Październik 08, 2008, 23:24:05
Coś Ty za obelgi wypisał?  ???


PS: Jakbyś potrzebował grafika do jakiegoś konkretnego projektu to daj znać.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Październik 14, 2008, 23:18:33
co to za chip ten C1?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 14, 2008, 23:43:38
"Controller1" - pirackie MMC1 ;) Tak jak C3 to MMC3 ;) A siedzi i nic nie robi.. Odpalam na nim moje demka NROM.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Październik 15, 2008, 00:10:05
Nie chcesz zrobic dla niego truth table?:)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 15, 2008, 23:09:06
Małe info dotyczące grafiki NES'a, przydatne jak ktoś nie jest w stanie załapac o co biega w tym wszystkim. Napisałem bardzo łopatologicznie, wiele się powtarzając, wszystko dla dobra sprawy. Mam nadzieję, ze komuś sie przyda...
,

Name Table to ogólnie widoczny cały ekran w pełnej rozdzielczości NES'a - 256x240 pixeli, który składa się z tablicy 32x30 Tiles'ów (każdy 8x8 pikseli). Name Table dokładnie ma rozmiar 1024 bajtów, a każdy bajt odpowiada jednemu Tiles'owi ( zawiera numer Tilesa znajdującego się w Pattern Table/CHR ROM). Kto potrafi liczyć, zapewne doszedł do pewnej niezgodności, bo skoro Name Table składające się z grupy 32x30 ma ich 960, to dlaczego ma rozmiar 1024 bajtów? Sprawa jest prosta - ostatnie 64 bajty to Attribute Table - tablica zawierająca dane kolorów z palety NES'a. Każdy bajt w Attribute Table odpowiada za grupę 4x4 Tilesów na ekranie - czyli kolejne podzielenie całego ekranu na tablice 32x32 pixele. Na tym nie koniec, taka tablica 32x32 pixele (4x4 Tiles'y) dzieli sie ponownie na cztery części - każda zwie się Square (0,1,2,3). Square składa się z 2x2 Tiles'ów (cztery Tiles'y). Każde Square może posiadać zdefiniowany w Attribute Table adres banku kolorów w palecie tła (16 wcześniej zdefiniowanych kolorów przez użytkownika w palecie tła). Cała paleta posiada zdefiniowane 32 kolory - 16 dla tła oraz drugie 16 dla sprite'ów.  Nas interesuje paleta tła, podzielona na cztery banki, każdy po 4 kolory. Jedno Square czyli kwadrat 2x2 Tilesy może mieć maksymalnie 4 kolory - tyle ile jeden bank w palecie. Właśnie po to jest Attribute Table. Innym słowem - nie można zrobic obiektu 16x16 pixeli np. drzewa używajac więcej niż 4 kolory. Takie ograniczenie ma NES (pomijam wieksze możliwosci dodane przez sprzętowe kontrolery pamięci).
Aha.. Attribute Table można sobie w kodzie zrobic, a Name Table np. jako plik 960 bajtowy. Jednak przydatniej miec wszystko w jednym pliku.

Tablice atrybutów posiada także Sprite. Jest ona nieco inna, posiada wiecej możliwości. Pamięc przeznaczona na Sprite'y to 256 bajtów - jedna ze "stron" pamięci WRAM (2KB). Nie jest ona na stałe nigdzie, trzeba ja zaadresowac używając jeden z rejestrów za to odpowiedzialny ($2003, ale nie będę zagłębiał się, bo to nie tutorial ASM ;) )


Teraz przedstawie to obrazkowo, sporo się powtarzając ;P

Name Table. Różnica między PAL a NTSC nie jest niczym specjalnie trudnym do zrozumienia. NT jest taka sama dla PAL jak i NTSC, jedyną ważniejszą różnicą jest brak wyświetlanych górnych i dolnych 8 pikseli obrazu. Więc projektując coś pod NTSC należy pamiętac, aby nie "malowac" tam nic ważnego, ponieważ w NTSC na ekranie nię będzie to widoczne. Rozmiar jest ten sam dla PAL/NTSC czyli 1024 bajty, z czego 960 to 32x30 Tiles'ów i na końcu 64 bajty atrybutów kolorów.
(http://www.siudym.gower.pl/nesasm/tutor01.png)


Każdy bajt w Name Table to 8-bitowy (czyli 1bajt) numer Tiles'a znajdującego się w CHR ROM (Pattern Table inaczej - bo CHR ROM to właśnie PATTERN TABLE).
Ilośc Tiles'ów w Pattern Table dla tła (tak, tła, bo te 8KB CHR jest podzielone na połowę - jedna dla Sprajtów a druga dla Tła) to 256. Oczywiście 'numerki' zapisane w hex'ach, czyli pierwszy Tiles to 00 a ostatni FF.
Polecam Windows'owski kalkulator przestawiony na "Widok Naukowy" - ma świetne opcje przeliczania różnych wartości na binarne, Hex, dec. itd. W obie strony.

(http://www.siudym.gower.pl/nesasm/tutor02.png)

Każdy jeden bajt w Attribute Table odpowiada za przypisanie odpowiedniego banku kolorów z Palety tła do grupy 4x4 Tiles'ów. Tych bajtów atrybutów jest 64 sztuki, tyle co na ekranie jest grup 4x4 (32x32 pix). Taka grupa 4x4 dzieli się ponownie na cztery części, czyli cztery grupki 2x2 tilesów zwane SQUARE. Na cztery części dzieli się także bajt, dając nam możliwośc zmiany kolorów każdej grupce 2x2 osobno (każdej Square).

(http://www.siudym.gower.pl/nesasm/tutor03.png)
(http://www.siudym.gower.pl/nesasm/tutor04.png)


Tutaj mamy przedstawione wszystko najprościej. Na ekranie (w Name Table) wstawiliśmy cztery takie same grzybki, jednak dzięki Attribute Table zmienione zostały banki kolorów na cztery różne dla każdej Square (Grzybek to akurat jedne Square 2x2 Tiles). Teraz każdy grzybek (każde Square) ma inne kolory (mimo, ze fizycznie sa identyczne).

(http://www.siudym.gower.pl/nesasm/tutor06.png)


Pattern Table. To nic innego jak CHR ROM. NROM może zaadresowac tylko 8KB danych CHR, które są podzielone na dwie części. Jedna (pierwsze 4KB) to cała grafika (256 Tiles'ów) przeznaczonych na Sprajty. Drugie 4KB to cała grafa przeznaczona na tła (także 256 sztuk Tiles'ów). Podział nie jest na stałe i można go zmienic np. grafika tła będzie piewszymi 4KB, a sprajty drugie. Wszystko zmieniamy w rejestrze kontrolującym PPU. Jednak przyjeło się, ze pierwsze to SPR, a drugie BGR (BKG). Jak juz pisałem wcześniej, każdy z 256 Tilesów ma swój adres/numer od 00 do FF (1-256) i dzięki temu można bardzo szybko przypisac cos w kodzie do danego Tiles'a. Przypomina to układanie porozwalanych puzli (Pattern Table) w całośc (Name Table).

(http://www.siudym.gower.pl/nesasm/tutor07.png)
(http://www.siudym.gower.pl/nesasm/tutor08.png)



Sprites. Zabawa ze sprajtami przypomina nieco to, co robimy z grafiką tła.
Nie ma tylko czegoś takiego jak Name Table dla sprajtów, wszystkie sprajciki definiujemy nieco inaczej. Wszystkich sprites może byc max. 64 sztuki, każdy ma swoje 4 bajty atrybutów, a wszystko mieści się w 256 bajtach pamieci WRAM.

(http://www.siudym.gower.pl/nesasm/tutor09.png)




Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: bemberg Październik 15, 2008, 23:20:36
Jak już się tyle naharowałeś to może jednak pokusisz się o tutek? Taki od podstaw, wraz z narzędziami, wtedy na pewno więcej osób zajmie się asm...


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Berion Październik 16, 2008, 14:31:47
Tutorial do czego? Pisania w ASM6505 czy w ogóle ASM jako taki? Jest tego pełno w sieci, ale fakt, przydałby się taki w którym wymienione byłyby różnice pomiędzy 6505 a np. x86.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 16, 2008, 16:14:32
Jak do czego? Nauczyc sie ASM 6502 jedno, a zakumac sens dzialania grafiki NES'a to drugie. Znajac ASM 6502 a nie znajac dzialania grafy nic nie zrobisz.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 16, 2008, 17:54:36
Jak do czego? Nauczyc sie ASM 6502 jedno, a zakumac sens dzialania grafiki NES'a to drugie. Znajac ASM 6502 a nie znajac dzialania grafy nic nie zrobisz.

takich tutkow jest od licha na nesdev. a i tak bez podstawowej znajomosci assemblera nie masz co zaczynac. musisz potrafic myslec jak procesor:)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 16, 2008, 18:40:56
Tutoriali ASM jest sporo, dlatego go nie robie. Jednak informacje na temat grafiki moga byc trudne do opanowania jak ktos zaczyna, zwlaszcza napisane po angielsku, dlatego zrobilem tutorial do grafiki w łopatologiczny sposob.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Berion Październik 16, 2008, 21:40:05
Toć wyżej napisałem odpowiedź na post bemberga, nie Twój mości Siudym. ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: bemberg Październik 18, 2008, 02:15:48
No chyba jeżeli napisałem o tutorialu pod postami ociekającymi specyfikacją nesa, wiec raczej nie chodziło mi o samego asm :) Myślałem nad czym takim, jak opisanie krok po kroku jak napisać proste demko, skompletować jakieś narzędzie i przedstawić to po polsku, a może do kogoś nie dochodzą obcojęzyczne tutoriale :p Nie powstało jeszcze nic takiego, więc myślę że warto byłoby spróbować, jeżeli oczywiście siudym ma czas i chęci :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 25, 2008, 15:10:24
A idz pan... http://www.siudym.gower.pl/nes_demo_3.nes
Na emu ok, sa dzwieki VRC6, nagrane demo na dev-cart z ukladem VRC6 i dupa, nic nie slychac...
Pobawie sie z VRC7, ciekawe czy cokolwiek zagra na karcie z VRC7 i konsoli :/


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: grimm Grudzień 08, 2008, 15:48:20
Nie wiem czy ktos juz to dawal:
http://www.speedyshare.com/679455453.html
Swietny kurs asma 6502 po polsku, dosc przystepnie i jednoczesnie dokladnie wytlumaczone:)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Grudzień 10, 2008, 16:22:02
Mam to samo ale jako ksiazke (dokladnie ta sama kopia), mozna kupic ja na allegro. Kiedys (z 3 lata temu) dalem 63zl, a teraz widzialem po 20z bywaja.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Merki Grudzień 26, 2008, 22:34:37
A ja mam swego rodzaju pytanie:

Ucze sie NES ASM z tutka Patater SOft (byl tez chyba przytaczany na poczatku wątku) i w dniu 5 wyswietla sie tło oraz sprite. W zwiazku z kodem jaki tam jest mam kilka pytań.


Dlaczego w bloku dotyczącym ustawień sprite jako adres pod którym ma być zapisywany sprite w rejestrze $2003 podajemy adres $0000? Przeciez pare akapitow wczesniej jest nawet napisane ze wszystko co tyczy sie sprite ma byc zapisywane pod adresem $1000 ( i zajmowac nie wiecej niz 4kb), a to co w $0000 dotyczy tła? A moze cos zle rozumiem?prosze o wytlumaczenie lub skierowanie do innego wyjasnienia :)

Drugie pytanie: w tym samym tutku (dzien 5) znajduje sie petla "infin". Do czego ona sluzy?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: grimm Styczeń 07, 2009, 00:45:20
Za pomoca 2003 i 2004 dostajemy sie do spr-ram, to osobna czesc pamieci, ktora przechowuje tylko dane o sprajtach (gdzie je wyswietlic, same obrazki sa w 4 kB pattern tables o ktorym wspomniales). A infin jak nazwa wskazuje wykonuje sie w nieskonczonosc i mozemy podziwiac efekt tego co stworzylismy ile tylko chcemy.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Styczeń 07, 2009, 07:12:39
A ja mam swego rodzaju pytanie:

Ucze sie NES ASM z tutka Patater SOft (byl tez chyba przytaczany na poczatku wątku) i w dniu 5 wyswietla sie tło oraz sprite. W zwiazku z kodem jaki tam jest mam kilka pytań.


Dlaczego w bloku dotyczącym ustawień sprite jako adres pod którym ma być zapisywany sprite w rejestrze $2003 podajemy adres $0000? Przeciez pare akapitow wczesniej jest nawet napisane ze wszystko co tyczy sie sprite ma byc zapisywane pod adresem $1000 ( i zajmowac nie wiecej niz 4kb), a to co w $0000 dotyczy tła? A moze cos zle rozumiem?prosze o wytlumaczenie lub skierowanie do innego wyjasnienia :)

Drugie pytanie: w tym samym tutku (dzien 5) znajduje sie petla "infin". Do czego ona sluzy?

Nie przywiazuj duzej wagi do kursu gbaguya. Niekiedy to on sam nie  wie co pisze.Zdecydowaniie lepiej kieruj sie wskazowkami kursu na stronie powerpaka.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Wrzesień 26, 2009, 15:25:30
Ktos bawi sie nesasm?? Tak cisza i cisza... Chcialbym zobaczyc nawet jakies najprostrze wypociny userow forum :/ Nikogo to nie interesuje ?  :biggrin:

Dzisiaj nie mialem co robic i po roku przerwy pobawilem sie paroma rozkazami, nic specjalnego, wiecej eksperymentowania.

http://www.siudym.gower.pl/nesasm/inny.nes

Pobawie sie w jakies zanimowanie 16x32 obiektu. Wiem jak, ale lenistwo ogranicza heh


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 27, 2009, 16:10:53
no ostatnie to demko zlotowe bylo.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Wrzesień 28, 2009, 00:02:34
Niestety, asm to juz relikt przeszlosci :<


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 28, 2009, 01:04:30
Niestety, asm to juz relikt przeszlosci :<

WYPLUJ TE SLOWA!!! ASM NIGDY NIE ZGINIE :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Berion Październik 05, 2009, 23:46:14
Aghem ghem... taka jest prawda. Zginać może i nie, ale pozostanie już raczej na zawsze w sferze sceny. Może i dobrze - "ten elitarny Assembler"  :heh:


;]


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Styczeń 14, 2010, 17:58:19
Ktos bawi sie nesasm?? Tak cisza i cisza... Chcialbym zobaczyc nawet jakies najprostrze wypociny userow forum :/ Nikogo to nie interesuje ?  :biggrin:

Dzisiaj nie mialem co robic i po roku przerwy pobawilem sie paroma rozkazami, nic specjalnego, wiecej eksperymentowania.

http://www.siudym.gower.pl/nesasm/inny.nes

Pobawie sie w jakies zanimowanie 16x32 obiektu. Wiem jak, ale lenistwo ogranicza heh
Łooo,łoo,Panie Siudym,
Od kilku dni coś kombinowałem z NESASM i idzie mi całkiem nieźle,właściwie mógłbym już zacząć robić grę...ale brak mi własnie muzyki :)
Znalazłem z kilka naście sposobów,ale większość po prostu się nie kompilowała.
Więc może mógłbyś zdradzić jakim kodem mogę odpalić muzykę napisaną w jakimś programie?:)(np.Famitracker)
Czy też może muzyka jest odtwarzana jako kod?Jeśli tak to raczej nie za dobrze :)
Może zapodam za jakiś czas jakieś "demko" ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Styczeń 25, 2010, 21:35:00
Dobra,jak obiecałem,Tak zrobiłem.
Prototyp Gry można pobrać z www.denine.pl.tl
W pełnej wersji będzie kilka plansz,kilka postaci skinów do postaci.
(miło by też mieć muzyczkę,ale niestety,nie wiem jak...)
Pozdrawiam,
D9


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: spazz4 Styczeń 25, 2010, 22:48:29
Na jakim emulatorze testowałeś demko ? na nestopi zwisa po pokazaniu planszy.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Senshu Styczeń 25, 2010, 23:08:16
Pod virtua nes działa ok, całkiem fajne demko jak na początek. Swoją drogą, chciałbym, żeby mi tak kasa spadała z nieba ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Styczeń 26, 2010, 00:13:17
Dobra,jak obiecałem,Tak zrobiłem.
Prototyp Gry można pobrać z www.denine.pl.tl
W pełnej wersji będzie kilka plansz,kilka postaci skinów do postaci.
(miło by też mieć muzyczkę,ale niestety,nie wiem jak...)
Pozdrawiam,
D9



Muzyczka.. np. FamiTracker, znajdziesz informacje na nesdev

i popracuj nad kompatybilnoscia. ale jest dobrze:)

pomijajac fakt, ze ogolnie nie lubie tego Jajka:D


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 28, 2010, 08:09:47
Witam wszystkich

Cieszę się, że znalazłem to forum. Dobrałem się do kursów o NES i znalazłem 26 stronicowe opracowanie o architekturze NES, poza tym kurs GBAGuy'a. Swego czasu byłem rok na filologii angielskiej, teraz studiuje infę. W Asemblerze x86 pod Win i DOS robię już trochę czasu. Po odkryciu wspomnianych materialów odbiło mi. Po 2 dniach mam tłumaczenie 2 części GBA Guy'a dość staranne na ile umiem i 8 stron przekładu wspomnianego opracowania. Siudym, jeżeli w to się bawisz to proponuję współpracę w postaci wymiany/przekładów materialów, a za jakiś czas jak będę za pan brat z architekturą NES jakiś projekt.

Poza tym mam kilka pytań technicznych do doświadczonego kolegi.
1. Czytałem ostatnio twój artykuł o grafie pod NES i szukam podobieństw w organizacji obrazu w NES do konstrtukcji np. typu VGA, tzn. wspomniałeś o klonach to zajebiście mi przypomina płatową organizację obrazu jak w programowaniu VGA (każdy Tiles ma 2 platy, czyli w dwóch różnych bajtach jest po bicie odpowiadającym kolorom?- pomijając paletę?).
Poza tym zastanawiam się nad ogólną obsługą układów, czy są jakieś podobieństwa w obsłudze portów PPU, a portów VGA/EGA?
2. Z polskich rzeczy jest opracowanie o asm 6502 pod Atari, pisane tu już bylo, że asembler ten nie różni się znacznie od NES, jakie są różnice w architekturach NES, Atari i C64, które wpływają na programowanie? Różne porty?
3. Poszukuję źródeł jakichś NES'owych gier- jasne debugger i deasm, jasne, ale szybszą metodą byłoby znalezienie źródeł niż się babrać w zdeasemblowanym zoptymalizowanym kodzie i dochodzić kupy instrukcji, które jak później się okazuje służą jedynie do wyrównywania stosu i takichtam. Nie idzie znaleźć np źródeł do Prince of Persja?Pytam, bo moje poszukiwania twają, ale czasem można na coś trafić przypadkiem.
4. Czy w późniejszym czasie nie zaczęto gierek NES kompilować pod C i jakieś jezyki wysokiego poziomu? Wysokiego w sensie NES, bo takie C jakiego się wtedy uzywało to prawie asm. Na dzień dzisiejszy moja na ten temat kończy się na tym, że GBAGuy piszę , że w przeciwieństwie do Game Boy'a na NES nie, żadnego wartego uwagi kompilatora C.


Pozdrawiam.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Maj 28, 2010, 10:49:20
Witam wreszcie zaawansowanego nowego użytkownika, który nie przyszedl tutaj sie podzielic pogladem, ze gral kiedys z kolega w Contre i byla fajna!

1. 2. Nie moja dzialka;)
3. Nie wiem czy sa takowe gdzies zamieszone o.O Ale jesli tak to chetnie na nie spojrze. Swoja droga to spotkalem sie tylko z oporzadzonym ladnie DISASMEM SMB1.
4. NESHLA, a poza tym na nesdev trwa kombinowanie z biblioteka w C i mysle ze to ulatwi duzo pracy, chociaz na razie to jeszcze ciezko jej uzywac. A co do kursow GbaGuya to jest tam kilka miazdzacych bledow. Tekst o mapperze to juz bardzo pomylony. Jak sie chce naprawde w to bawic to z czasem zrozumiesz na czym polegaja bledy. Poza tym gdizes w linkach powyzej podalem dosc dobry Tutorial.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 28, 2010, 11:16:13
Jak spojrzałem na daty ostatnich postów to się trochę przeraziłem, tym bardziej cieszę się, że ktoś zagląda na to forum. Dr88 am nadzieję, że jest ktoś poza Tobą z ludzi zainteresowanych NESAsm zajrzy. Cóż wyjaśni się niedługo.

Myślę, że gdyby zebrać kilka osób z tego forum możnaby coś sensownego napisać. Ze swojej strony biorę się za robotę. Kiedy bedę miał nieco poważniejszą wiedzę o kodowaniu w tym i jak się przyzwyczaję do składni NES, odezwę się z bardziej konkretnymi problemami, wątpliwościami propozycjami. Ponieważ źródła i linki, którymi dysponuję spokojnie mi wystarczą na jakiś czas nauki.

Dobra spadam do magicznej krainy NESAsm-a...

Pozdrawiam


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Maj 28, 2010, 11:39:37
Poprzegladaj demka na poprzednich stronach oraz ostatnie zlotowe


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 28, 2010, 11:47:43
Ok. Póki co korzystam z tego:

http://www.nespowerpak.com/nesasm/nesasm.pdf

Bardzo dobry kurs, bo bezpośrednio nastawiony na architekturę NES-a.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Berion Maj 28, 2010, 18:38:07
(...) wspomniałeś o klonach to zajebiście mi przypomina płatową organizację obrazu jak w programowaniu VGA (każdy Tiles ma 2 platy, czyli w dwóch różnych bajtach jest po bicie odpowiadającym kolorom?- pomijając paletę?).

4 bo cztery kolory. ;]

Cytuj
Nie idzie znaleźć np źródeł do Prince of Persja?

Do komercyjnych gier nie znajdziesz, nawet abandonware.

Cytuj
Jak spojrzałem na daty ostatnich postów to się trochę przeraziłem, tym bardziej cieszę się, że ktoś zagląda na to forum. Dr88 am nadzieję, że jest ktoś poza Tobą z ludzi zainteresowanych NESAsm zajrzy. Cóż wyjaśni się niedługo.

"W temacie" jest całkiem sporo osób. Prócz Siudyma i Dr88, na pewno Grimm który wszczepia cuda do Dizzy'ego i reszta wypowiadających się w niniejszym temacie (prócz mnie, jam grafik i scenowiec ;]).

Cytuj
Myślę, że gdyby zebrać kilka osób z tego forum możnaby coś sensownego napisać.

Na zeszły zlot z dr88 przygotowaliśmy "na szybkiego" demko na zlot. Ale czy da radę namówić większe grono na "coś większego" to raczej wątpię.

Scena NES to nie scena Atari. :(

Cytuj
Dobra spadam do magicznej krainy NESAsm-a...

Niechaj ASM 6052 będzie z Tobą. ;]


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Rocket Maj 29, 2010, 02:16:57
Tu masz kody źródłowe do 2 gier: Pocohontas i Boogerman.
http://www.speedyshare.com/files/22676812/Sources.rar (http://www.speedyshare.com/files/22676812/Sources.rar)

Gdzieś można jeszcze znaleźć kod źródłowy do M.C Kids, tylko nie umiem go teraz znaleźć.

Znalazłem jeszcze kod źródłowy do Metroid'a. Może się przyda:
http://www.romhacking.net/docs/459/ (http://www.romhacking.net/docs/459/)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 29, 2010, 20:07:47
Rocket dzięki za źródła, na pewno przydadzą się.

Odnośnie nauki i kursów kończę tłumaczyć na polski tutorial NES, do którego link podalem kilka postów wstecz. Nawet wspominają tam o DMA dla Sprite'ów. Do niedawna nie sądziłem, że w tym 8- bitowym gówienku było DMA...

Znalazłem od groma dokumentacji technicznych NES. W oficjalnej dokumentacji były przypisy do 50 źródeł informacji, za granicą scena i źródła informacji na NES to jednak wymiatają...Czemu u nas tak nie jest skoro każdy na Pegasus'iku kiedyś grał. Nie twierdze, że kazdy gracz musi się interesować, ale przecież nawet ułamek graczy mogłby być ogromna ilością. Cóż pytanie retoryczne.

Dochodzę do wniosku, że na początku póki nie jest się w stanie przewartościować zawartości merytorycznej jakiegośtam znalezionego w necie kursu (jeżeli ma się choć minimalne pojęcie o NESAsm) nie powinno się do takowego zagladać, lepsze są dokumentacje i opisy techniczne.
Później przecież jest już minimum teorii i maksymalna ilość map portów/pamięci no i opisy rejestrów układów NES. Przynajmniej ja tak to sobie wyobrażam.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Maj 31, 2010, 01:05:25
Niewatpliwie, ale zacznij pisac to sie dopiero zaczniesz wkurwiac, jak ci mryga bez powodu:D

A co do tlumaczen, to na pewno bem**rg ci jajca wylize ze szczescia, nie mogl sie nikogo doprosic zeby przetlumaczyc tutki:)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 31, 2010, 16:01:25
Ten tutorial , który obecnie w wersji surowej jest już gotowy (zawartość merytoryczna ok są mapy pamięci, tylko chcę jeszcze ujednolicić i doszlifować). Co do pochodzenia tutoriala, trafiłem na niego całkiem przypadkiem pogrzebłaem na necie i taki sam można znaleźć na stronie głównej PowerPaka :P toteż, ktoś chyba już o tym źródle informacji wspominał wcześniej w tym wątku.. Idę tłumaczyć oficjalną dokumentację NES, a w wolnym czasie dopracuję wersję ostateczną tekstu, teraz czytam sobie jego polską wersję co o niebo jest wygodniejsze.

Zaczęłem korzystać z FCEUXD SP bardzo wygodny debuger ma. Tylko trochę coś czasem narzeka jak próbuje się odpalić grę, w której nagłówek NES nie jest sformatowany standardowo.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Maj 31, 2010, 17:37:19
Dlatego stwierdzam, że potrzebuję jeszcze czasu i nie chcę puszczać surowej wersji w net. Kilka dni powinno mi wystarczyć (mam sesję, ale powinienem się wyrobić). Notabene, kto by się podjął konsultacji merytorycznej (jeżeli chodzi o język i terminy techniczne)?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Maj 31, 2010, 23:25:04
Pisz tu co potrzebujesz:) btw. co studiujesz?;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 01, 2010, 09:09:42
dr88 estem na pierwszym roku infy.

Co do dokumentu z przekładem pozostalo formatowanie tekstu typu czcionki i takie tam dla poprawienia czytelności. Co do terminów angielskich, których nie jestem pewnien, zrobię ich listę i za jakiś czas umieszczę w watku, kto będzie wiedział to napisze najwyżej.

W tym momencie wiem, że nie do końca zrozumiałem pojęcie Scanlinii podczas umieszczania Sprite'ów na ekranie.

Chcialem się jeszcze spytać:
Czy mapy pamieci w ogóle warto tłumaczyć, bo wydaje mi się, że są czytelniejsze po angielsku?

Jako próbkę dam 2 podrozdziały z mojego przekładu kursu NESAASM znajdującego się na stronie PowerPak'a.




Palety

Przed wyświetleniem jakiejkolwiek grafiki na ekranie, musisz ustawić paletę kolorów. Istnieją 2
odrębne 16 bajtowe palety. Jedna jest używana do Tła, druga zaś do Sprite'ów. Bajt w palecie odpowiada jednemu z 52 bazowych kolorów, które NES potrafi wyświetlić. Kolor $0D jest błędnym kolorem i nie powinno się go używać.

Palety w PPU zaczynają się pod adresami $3F00 i $3F10. Do ustawienia adresu palty w PPU używamy portu PPU $2006. Wartość do tego portu musi zostać zapisywana dwuetapowo, raz dla bajta starszego i raz dla młodszego bajta.

   lda $2002 ; odczytaj stan PPU, aby zresetować starszy I młodszy zatrzask
   lda #$3F  
   sta $2006 ; zapisz starszy bajt adresu $3F10
   lda #$10
   sta $2006 ; zapisz młodszy bajt adresu $3F10

Teraz port danych PPU $2007 jest gotowy, aby przyjąć dane. Najpierw pod adresem, który ustawiłeś ($3F00) zostanie dokonany zapis, natępnie PPU inkrementuje adres ($3F01). Po każdorazowym zapisie bajtu do palety adres będzie inkrementowany.
Poniższy przykład ustawia pierwsze 4 kolory w palecie:

   lda #$32  ; jasno sinawy
   sta $2007
   lda #$14  ; różowawy
   sta $2007
   lda #$2A
   sta $2007 ; zielonawy
   lda #$16
   sta $2007 ; czerwonawy

Dalsza część kodu wypełniająca resztę palety, bylaby skonstruowana analogicznie.
Na szczęście istnieje krótszy sposób na napisanie całego tego kodu. Wtedy używa się dyrektywy .db, do umieszczania w pamięci bajtów lub ich grup, które opisywane są etykietą mieszczącą w sobie adres do początku tych danych.

   PaletteData:                     
     .db   $0F, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A  $38  $3C, $3D, $3E, $0F
     .db   $0F. $1C, $15, $14, $31, $02, $38, $3C, $0F, $1C, $15, $14, $31, $02. $38, $3C

Wtedy, aby skopiować te bajty do palety w PPU, musimy użyć pętli. Rejestr X zostanie użyty jako indeks palety i licznik przebiegów (iteracji) pętli. Chcemy skopiować 32 bajty, zatem pętla zaczyna się z zerową wartością licznika (X) i jest wykonywana dopóki, dopóty X nie osiągnie wartości 32.

   ldx #$00      ; zacznij od x = 0 (Licznik pętli -> x)
      LoadPalettesLoop:
   lda PalleteData, x   ; Załaduj dane spod adresu (PaletteData + wartość w x)
                 ; W pierwszym przebiegu pętli załaduje się PaletteData + 0
                 ; W drugim przebiegu pętli załaduje się    PalleteData + 1
                 ; W trzecim przebiegu pętli załaduje się   PalleteData + 2
            ; itd./etc.
   sta $2007      ; Zapisz do PPU
   inx          ; X = X + 1
   cpx #$20      ; Porównaj X do wartości hex'a $20 = 32d
   bne LoadPalettesLoop   ; Rozgałęzienie do LoadPaletteLoop jeżeli porównanie nie dało
                ; w rezultacie zera, jeżeli porównywana wartość  równa 32 to zakończ pętlę


Duszki (Sprite'y)

Wszystko co będzie się poruszać niezależnie od Tła ma być stworzone jako Sprite. Sprite  jest Tile'em o wymiarach jedynie 8x8 pikseli, który PPU wstawia, w dowolnym miejscu ekranu.
PPU posiada wystarczającą ilość wewnętrznej pamięci na pomieszczenie 64 Sprite'ów.

Sprite'y DMA
Najszybszym i najprostszym sposobem na przeniesienie Twoich Sprite'ów do pamięci Sprite'ów jest użycie DMA (Bezpośredni dostęp do pamięci), Oznacza to po prostu skopiowanie obszaru/bloku pamięci CPU RAM do pamięci PPU RAM. Na kości RAM zwykle do tego celu używany jest obszar adresowy z przedziału $0200-$02FF. By zacząć transfer, do portów PPU nalezy zapisać 2 bajty:

   lda #$00
   sta $2003  ; ustaw młodszy bajt (00) adresu pamięci RAM
   lda #$02
   sta $4014  ; ustaw starszy bajt (02) adresu pamięci RAM. a transfer zostanie rozpoczęty


Podobnie jak z odświeżaniem grafiki, operacja ta musi zostać wykonana na początku powrotu pionowego (VBlank), tak więc kod przytoczony powyżej musi znaleźć w sekcji NMI.


Dane Sprite'ów
Każdy duszek wymaga 4 bajtów danych informujących o położeniu (X,Y), atrybutach oraz nazwie Tile'a,


Współrzędna Y- pionowe położenie Sprite'a na ekranie. $00 jest wierzchołkiem ekranu. Wszystko  znajdujące się za $EF, jest już poza dolną krawędzią ekranu.


Numer Tile'a- jest to numer Tile'a < 0..256> dla grafiki pobieranej z Tablicy Wzorow.

Atrybuty- ten bajt przechowuje informację o kolorze oraz sposobie wyświetlania:

   7 6 5 4 3 2 1 0
   |   |  |      |  |
   |   |  |      + +- Paleta (4 - 7) Sprite'ów
   |   |  |        
   |   |  +------ Pierwszeństwo (0: Przed tlem; 1: Za tłem)
   |  +--------- Odwróć/Pokaż (?) Sprite'a w poziomie
   +----------- Odwróć/Pokaż Sprite'a w pionie

Współrzędna X- Połozenie poziome na ekranie, $00 znajduje się po lewej stronie, natomiast wszystko za $F9 znajduje się poza ekranem

*Jeżeli chcesz zmodyfikować Sprite'a 0, zmieniasz bajty $0300-0303.
*Bajty Sprite'a 1 znajdują się pod adresem $0304-0307
*Informacje o Sprite 2 znajdują się pod adresem $0308-030B, itd.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Czerwiec 01, 2010, 10:14:54
Ktora polibuda:P? Lubelska?

EDIT:

Tiles - liczba mnoga od Tile :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 01, 2010, 10:50:36
E tam polibuda zwykła sobie taka uczelnia prywatna dzienna. Całą wiedzę muszę niestety nabywać sam, bo w szkole nie ma za wysokiego poziomu. Pomijając:
-podstawy elektroniki i miernictwa- zadania z kodensatorami, cewkami i tranzystorami
-teorię obwodów i sygnałów- zadania z układów zastepczych rezystorów i nieco teorii
-matma i algebra liniowa- całki i bardzo obszernie macierze
-programowanie i algorytmizacja- nienawidzę, bo wałkuja zadania z matmy w programach i schematy NS (a taki strukturalny zapis algorytmów). Olałem sobie semestr i podrzuciłem kolesiowi mój kod bootloadera ładujacego jadro systemu w systemie plików FAT12.

Ogólnie bardzo się interesuję OSDev, a przecież NESDev to też rodzaj takiego okrojonego systemu operacyjnego, elegancko są wektory przerwań i oczywiscie przerwanie niemaskowalne NMI tylko że w NES pełni raczej rolę odpowiadających im na PC IRQ0 (przerwanie zegarowe na którym opiera się wyswietlanie klatek). NES daje poczucie, że pisze się modyfikację systemu operacyjnego tylko o wiele ciekawszą (jakby nie patrzeć obsługa I/O i przerwań obowiązkowa chociaż to rozwiązanie blizsze BIOS-owi niż potocznie rozumianemu systemowi operacyjnemu).

Składnia NES jest bardzo przejrzysta, tylko mam problem ze zrozumieniem instrukcji stosu. jeżeli ktoś może o tym napisać coś to byłbym wdzięczny.

I ostatnia kwestia, co tyczy się Tiles'ów czasem w trzeba zastosować formę liczby mnogiej wyrazów, zeby słowo nie brzmialo jak ucięte, to był mój celowy zabieg, ale moze w sumie niepotrzebny. Mogę to w sumie poprawić.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Czerwiec 01, 2010, 11:12:38
Jak moze brzmiec jak uciete:)

Jest 1 Tile, a 2 Tilesy:)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 16, 2010, 10:20:32
Ostatnio znalazłem na NESDev bardzo ciekawy dokument pod adresem:
http://nesdev.parodius.com/6502_cn.txt

W końcowej części dokumentu jest bardzo ciekawa rzecz.
Mianowicie, każda instrukcja ze zbioru 6502 jest opisana w postaci listy instrukcji C co pozwala na:
-Całkowite zrozumienie co robi instrukcja i na jakie rejestry, znaczniki oraz inne parametry wpływa
-Napisanie rekompilatora z architektury NES na architekturą 80x86
-Jeżeli pójdziemy dalej można napisać interpreter kodu NES na zwykły komputer, czyli program pełniący jedną z funkcji emulatora

Przykładowo opis dwóch instrukcji (adc i and) 6502 w składni C wygląda tam tak:


/* ADC */
    unsigned int temp = src + AC + (IF_CARRY() ? 1 : 0);
    SET_ZERO(temp & 0xff);    /* This is not valid in decimal mode */
    if (IF_DECIMAL()) {
        if ( ((AC & 0xf) + (src & 0xf) + (IF_CARRY() ? 1 : 0)) > 9) temp += 6;
    SET_SIGN(temp);
    SET_OVERFLOW(!((AC ^ src) & 0x80) && ((AC ^ temp) & 0x80));
    if (temp > 0x99) temp += 96;
    SET_CARRY(temp > 0x99);
    } else {
    SET_SIGN(temp);
    SET_OVERFLOW(!((AC ^ src) & 0x80) && ((AC ^ temp) & 0x80));
    SET_CARRY(temp > 0xff);
    }
    AC = ((BYTE) temp);

/* AND */
    src &= AC;
    SET_SIGN(src);
    SET_ZERO(src);
    AC = src;

--------------------------------------------------------------------------------------------------
Taki projekt kompilatora np. w javie pojawił się na stronie:
http://www.6502asm.com/


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Czerwiec 17, 2010, 00:41:59
Nie no 6502_cn.txt ciekawy, z tym ze smierdzi mi tu C :D:D

ale co do pisania interpretera pod 8086 to uwazam, za niezbyt rozwazny pomysl, zwlaszcza, ze problemem okaza sie Mappery. Mozna to rozwiazac implementujac mappowaniu pamieci, ale to juz robimy z tego emulator;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 22, 2010, 10:05:33
Oto tymczasowy link do pliku z moim przekładem NESAsm (ze strony NesPowerPack.com w formacie .odt), prosiłbym dawać mi znać na priv jakby coś raziło błędem.

http://www.sendspace.pl/file/b09bc7761db30e8cb295f4f


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Czerwiec 22, 2010, 12:28:35

- asembler asembluje, a nie konwertuje;)
- Tile/Tiles juz ci mowilem;)
- praktyka uczy:) Jezeli gra odpali na NesterzeJ, Nestopii, JNesie, to wtedy mozemy spekulowac ze dziala na konsoli. Sam FCEU na duzo niedorobek przymyka oko
- nie The Molester tylko Tile Molester
- dopisz, ze NOAC jest gowniany;)


- w paru miejscach ogonkow ci brakuje, przepusc to przez sprawdzanie pisowni i bedzie ok.


//na razie tyle;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 29, 2010, 15:17:32
Artykuł powoli poprawiam jak będzie ukończony to wrzucę/odświeżę aktywny link. Poza tym w trakcie pracy nad artykułami o PPU i Mirroring'u na podstawie NESDev oraz kilku innych artykułów. Zastanawiam się czy wklejać takie artykuły w tym wątku czy stworzyć nowy wątek, ponieważ według mnie programowanie procesorów 6502 to dziedzina o dużo szerszym zakresie. Czy ktoś jest zainteresowany w ogóle serią artykułu o Developing-u konsoli NES?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: alzen Czerwiec 29, 2010, 15:41:39
Ja jestem bardzo zainteresowany.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Czerwiec 29, 2010, 22:37:15

Składnia NES jest bardzo przejrzysta, tylko mam problem ze zrozumieniem instrukcji stosu. jeżeli ktoś może o tym napisać coś to byłbym wdzięczny.

Jaki problem?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 30, 2010, 10:37:20
O instrukcjach stosowych znalazłem bardzo dobry artykuł, a jego esencją są dwa kawałki kodu, ktore do końca wyjaśniły o co idzie. Ideą tego kodu jest, że wszystkie natychmiastowe dane przechodzą przez akumulator i istnieją rozkazy umożliwiające operacje cząstkowe (np. zanim umieścimy na stosie zawartość rejestru X musimy umieścić ją w akumulatorze i dopiero, gdy znajduje się ona w akumulatorze wrzucamy ją na stos).

;* 1 Kod *

 ldx #$ff   ; Ustaw wskaźnik stosu (rejestr S), na pierwszy element
 txs      ; s = x = #$ff (jest to jedna z czynności wykonywana w kodzie inicjalizacyjnym)

_push_stack:
;Położenie na stosie wartości rejestru A:
 lda #$e0   ; a = #$e0
 pha      ; s = $ff  i a = #$e0

 ldy #$bb   ; y = #$bb
 tya          ; a = y = #$bb
 pha      ; s = $fe  i a= #$bb

 txa          ; a = x; Przed polożeniem wartości x na stosie trzeba ją zapisać do A
 pha      ; Połóż wartość $ff (Pochodzącą z kodu inicjalizującego) na stosie. s=$fd



;* 2 Kod *
_pull_stack:
  pla      ; Zdjęcie wartości $FF oraz skopiowanie jej do rejestru X
  tax      ; S = $fd

  pla      ; Zdejmij ze stosu kolejną wartość (#$bb) i wrzuć ją do rejestru Y.
  tay      ; S = $fe.

  pla      ; Zdejmij $e0 na stos, a później zapisz do A.
      ; S = $ff - Od tego miejsca zaczęliśmy używać obszaru stosu do zapisu danych.

Dochodzą do tego jeszcze instrukcje:

;* -1 Umieszczające na stosie zawartość rejestru statusu procesora (rejestru P)  
        Rozkaz php ( rejestr P -> Stos)

;* -2 Zdejmujące wartość ze stosu do rejestru statusu  procesora (rejestru P)
        Rozkaz plp  ( rejestr  P <- Stos)


To by było na tyle odnośnie stosu. Szkoda, że nie ma on, żadnych sprzętowych zabezpieczeń przed przepełnieniami.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Czerwiec 30, 2010, 11:11:24
*!* Wydaje mi się że w oryginalnym kodzie ktoś zjadł ostatnią instrukcję procedury _pullstack tzn. ostatniej instrukcji tay (jest dopisana powyżej), bo w komentarzach było napisane, że wartość jest przenoszona do Y.

Wydaje mi się że nie, nie byłoby TAY po drugim zdjęciu ze stosu - wsadzając drugie TAY na końcu nadpisze się poprzednią wartość. Bez tego w X, Y i A jest po jednym elemencie i nic nie ginie.



edit:
pha      ; $1ff = #$e0 oraz s=a=#$e0

s=#$fe
Po każdym wrzuceniu wskaźnik stosu maleje o 1, a nie ustawia się na element wrzucony.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Czerwiec 30, 2010, 19:18:05
Nie do końca dobry jest ten artykuł...

O instrukcjach stosowych znalazłem bardzo dobry artykuł, a jego esencją są dwa kawałki kodu, ktore do końca wyjaśniły o co idzie. Ideą tego kodu jest, że wszystkie natychmiastowe dane przechodzą przez akumulator i istnieją rozkazy umożliwiające operacje cząstkowe (np. zanim umieścimy na stosie zawartość rejestru X musimy umieścić ją w akumulatorze i dopiero, gdy znajduje się ona w akumulatorze wrzucamy ją na stos).

Prawda, nie można zapisać stałej bezpośrednio na stos (adresowanie natychmiastowe). Najpierw należy ją wpisać do akumulatora, dopiero jego zawartość można odłożyć na stosie, programista może odkładać na stosie tylko zawartość A lub P! [tu był bug - dobrze, że koledzy po fachu kontrolują, co za głupoty inni wypisują] Podobnie się ma rzecz ze wskaźnikiem stosu, nie można go zainicjować wartością wprost, pozycję szczytu stosu należy najpierw zapisać do rejestru X, a następnie przesłać do S. Rozwiązanie to może wydawać się dziwne i nie logiczne, w porównaniu choćby z 8-bitowymi intelami tamtego okresu, ale właśnie to dzięki temu znacząco udało się uprościć blok zarządzania procesora, a co za tym idzie nieco przyśpieszyć szybkość pracy w porównaniu z tymi intelami, niestety utrudnia programowanie w asm i pogarsza czytelność kodu.

;* 1 Kod *

 ldx #$ff   ; Ustaw wskaźnik stosu (rejestr S), na pierwszy element
 txs      ; s = x = #$ff (jest to jedna z czynności wykonywana w kodzie inicjalizacyjnym)

Te komentarze są tragiczne, zasada mówi, że komentarz opisuje, co robi linijka, w której się znajduje (trochę inaczej się to ma w przypadku bloków instrukcji). Pierwsza linijka wcale nie ustawia wskaźnika stosu, przecież tam nie ma operacji na S... obie oczywiście poprawnie inicjują stos w obszarze pamięci. Warto także wiedzieć że S ma tak na prawdę 9 bitów! tylko że najstarszy jest na stałe ustawiony na "1" bo stos w 6502 co prawda może mieć zaledwie 256 elementów. ale są one umieszczone na pierwszej stronie pamięci (0100h - 01FFh), ta zablokowana jedynka na najstarszej pozycja zapewnia natychmiastowe wystawienie na magistrale adresowa właściwego aderesu, bez tracenia czasu na kombinowanie jak go obliczyć, kolejne przyśpieszenie... Dodatkowo stos, jako ze 6502 jest poprawioną kopia motoroli, w przeciwieństwie do inteli, jest stosem ze wskaźnikiem dekrementowanym, czyli po odłożeniu wartości na stos, kolejny element nie jest odkładany w komórce wyżej, a w komórce niżej. Poprawnym jest więc zainicjowanie stosu adresem najwyższym, czyli 01FFh (pamietamy o stałej jedynce, zapisujemy do S tylko 0FFh), odkładanie kolejnych wartości będzie powodowało przesuwanie wskaźnika stosu w stronę komórki 0100h. Warto jeszcze wiedzieć, że blok zarządzania procesora najpierw odkłada wartość na stosie, a później dekrementuje S, nie odwrotnie, dlatego wskaźnik stosu wskazuje na komórkę stosu, do której ma trafić bieżąca wartość, a nie komórkę, do której trafiła poprzednia (to drugie rozwiązanie jest stosowane we współczesnych procesorach). Ciekawe jeszcze tylko jaką wartość przyjmuje S po resecie, jeśli 0FFh to po co go inicjować? jeśli 0h to to by było mega bugiem popełnionym przez inżynierów z motoroli, jeśli S nie jest zmieniany podczas resetu to rzeczywiście taka inicjalizacja ma sens.

_push_stack:
;Położenie na stosie wartości rejestru A:
 lda #$e0   ; zapisanie stałej do akumulatora
 pha      ; odłożenie stałej zapisanej w A na stos (i dekrementacja wskaźnika stosu)
 
Dlaczego wszystkie te komentarze zawierają zawartość rejestrów a powinny wyniki wykonania instrukcji?..
Rejestry powinno się przedstawiać graficznie, jest to bardziej czytelne!

ldy #$bb   ; y = #$bb
 tya          ; a = y = #$bb
 pha      ; s = $fe  i a= #$bb

 txa          ; a = x; Przed polożeniem wartości x na stosie trzeba ją zapisać do A
 pha      ; Połóż wartość $ff (Pochodzącą z kodu inicjalizującego) na stosie. s=$fd

Bzdura, wykonałeś 3 instrukcje odłożenia wartości na stosie i żadnej zdjęcia wartości ze stosu, S wskazuje na 0FFh - 3h = 0FCh, tam trafi następna dana odłożona na stos.

;* 2 Kod *
_pull_stack:
  pla      ; Zdjęcie wartości $FF oraz skopiowanie jej do rejestru X
  tax      ; S = $fd

Jest to prawdą, tylko przy założeniu że kod ten stanowi integralną całość z poprzednim, dokładniej następuje po nim.
A teraz dla większych jaj zawartość S jest dobrze podana mimo, że policzona na podstawie błędnego założenia wcześniej,
wykonujesz jedno zdjęcie wartości ze stosu, S = 0FCh + 1h = 0FDh

 pla      ; Zdejmij ze stosu kolejną wartość (#$bb) i wrzuć ją do rejestru Y.
  tay      ; S = $fe.

  pla      ; Zdejmij $e0 na stos, a później zapisz do A.
      ; S = $ff - Od tego miejsca zaczęliśmy używać obszaru stosu do zapisu danych.

Dochodzą do tego jeszcze instrukcje:

;* -1 Umieszczające na stosie zawartość rejestru statusu procesora (rejestru P)  
        Rozkaz php ( rejestr P -> Stos)

;* -2 Zdejmujące wartość ze stosu do rejestru statusu  procesora (rejestru P)
        Rozkaz plp  ( rejestr  P <- Stos)


To by było na tyle odnośnie stosu. Szkoda, że nie ma on, żadnych sprzętowych zabezpieczeń przed przepełnieniami.

I co niby miałby zrobić procesor w chwili przepełnienia? Co najwyżej zgłosić przerwaniem jakiś błąd krytyczny, ale 6502 to nie te czasy, układy przerwań jeszcze wtedy raczkowały, zapełnienie stosu możesz sprawdzać programowo przecież, wydaje mi się że pisząc w asm te 256 bajtów to i tak za dużo;p Obowiązek dbania o nieprzepełnienie stosu tak czy siak spoczywa na programiście.
Poza tym uwaga Koksa, to co poprawił też było okrutną bzdurą, jak pisałem najlepiej pokazują to rysunki i tabelki, trudno to opisać zielonemu w tym temacie;p Nie polecam książki Kruszyńskiego ("uP 6502 i jego rodzina"), to jest to tam zupełnie zamotane, rysunki ą dobre, ale opis tragiczny. Znacznie lepiej poradził sobie z tym Ruszczyc ("Asm 6502"), celowo podaję polską literaturę, zobacz jak się co nazywa po polsku, tłumaczysz dosyć specyficzny tekst techniczno-naukowy, zadbaj o jego poziom, nie mam na myśli utworzenia na zasadzie 'jaki jestem mądry', a raczej na zasadzie 'jakie to proste', z tym że nie powinieneś dopuszczać w tłumaczeniu do niejednoznaczności, czy pisać jakiś bzdur.
Mogłem coś przeoczyć... Poza tym wszystkim w Asemblerze pierwsza kolumna to dyrektywy asemblera i etykiety, druga to rozkazy, staraj się tak pisać, zdecydowanie poprawia czytelność i umożliwia asemblację!


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Czerwiec 30, 2010, 20:58:10
Najpierw należy ją wpisać do jednego z rejestrów (akumulator albo rejestr stanu procesora),
Do rejestru stanu procesora nie można nic wpisywać. Jego zawartość umieszcza się na stosie w celu późniejszego przywrócenia.


wskaźnik stosu wskazuje na komórkę stosu, do której ma trafić bieżąca wartość, a nie komórkę, do której trafiła poprzednia (to drugie rozwiązanie jest stosowane we współczesnych procesorach).
W jakich procesorach? Sprawdziłem, że w moim Celeronie stos działa dokładnie tak jak w 6502, różni się tylko rozmiarem wskaźnika i możliwością zmiany segmentu.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Czerwiec 30, 2010, 22:37:58
Do rejestru stanu procesora nie można nic wpisywać. Jego zawartość umieszcza się na stosie w celu późniejszego przywrócenia.
Racja pomotałem, naleciałości z intela:/ Programista ma tylko częściowy dostęp do tego rejestru, przez instrukcje kasowania i ustawiania bitów, o ile dobrze pamiętam 3 można ustawić, 4 skasować. Więc jednak można wpisywać kilka bitów ;p Kurcze jakoś tak byłem pewien, że można załadować cały P jedną instrukcją, patrze teraz do książki Ruszczyca i racja tylko te kilka bitów można modyfikować programowo.
Właściwie na upartego można tak: #wartość -> A -> stos -> P, tylko nie ma to sensu wszystkie niezbędne flagi w P można ustawiać/zerować programowo, grzebanie w całym rejestrze na raz może być niebezpieczne jak pisałem.

Czepiałem się bugów, a sam popełniłem olbrzymiego. Jak to mawia moja znajoma:"ale się wygłupiłam..." Może mój kontakt z 6502 ograniczę do grania w gry pisane pod maszyny z tym prockiem.

W jakich procesorach? Sprawdziłem, że w moim Celeronie stos działa dokładnie tak jak w 6502, różni się tylko rozmiarem wskaźnika i możliwością zmiany segmentu.
Na pewno MSP430 działa jak opisałem, w x86 jest chyba jak piszesz, nigdy nie miałem potrzeby przyjrzeć się temu jakoś bliżej. Z tym że chyba jednak najpierw jest zmiana adresu we wskaźniku, a później odłożenie danej na stosie, teraz nie potrafię tego znaleźć, jak znajdę napiszę na pewno, chyba że ty masz gotowca gdzieś pod ręką;p Podaj sznurka proszę. Poza tym Twój celeron nie jest nowy, jest po prostu nowszą wersją 8086, właściwie to ta architektura ma chyba z 30 lat...


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 30, 2010, 23:58:51
Co do odpowiedzi:

1. Porawiłem to i owo w moim poprzednim poście
2. Moje komentarze opisują, krótkie bloki funkcjonalne, czasem dzielę czynności na dwulinijkowe, bo np. instrukcje ldx i txs traktuję jako pewną całość (przyzwyczajenie z Intela, poza tym wspominałem o operacjach cząstkowych).
3. Czasem wskaźnik rozumie się dla uproszczenia jako daną na, którą wskazuje, robi się tak w jezykach C/C++, aby nie komplikować sprawy (wewnętrzne mechanizmy są zaszyte w kompilatorach). Mozna to rozumieć jako pewną nieścisłosć, bo w asemblerach nie ma jako takich operatorów na wskaźnikach (no intel ma operatory seg i offset, ale to inna bajka).
4. Co do stosu bardziej przemawia do mnie informacja, że stos to zbiór zmiennych z podkreśleniem, ze dostęp mamy tylko do ostatnio dodanego elementu, a nie zbiór adresów, które mogą dodatkowo wskazywać na inne adresy, czytałem gdzieś, że w bardziej zaawansowanych programach na 6502 można stosować 3 poziomowe tablice wskaźników, a ja dopiero miesiąc temu dowiedziałem się o istnieniu NESAsm-a, to nie moje tempo...


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Lipiec 01, 2010, 00:39:32
Sluchaj czy nas aby na debili nie uwazasz;> My naprawde wiemy k***a czym sa wskazniki, takze daruj sobie ten opis;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Lipiec 01, 2010, 00:51:44
Chciałem coś napisać, ale dynamika zmian postów, poprawek i kasowania ich chyba mi nie pozwoli ostatecznie;p
Z zabawą ze wskaźnikami i ich arytmetyką jest jak w c, nie jest to ani przyjemne, ani przejrzyste, ale daje bardzo duże możliwości.
Co do trybów adresowania no to podstawa kursu Asm. Nie wiem jak bardzo nie używałeś google; ale: http://atarionline.pl/biblioteka/materialy_ksiazkowe/Asembler%206502%20%28v1%29.pdf rozdział 5, str. 93 bodajże. Nie wiem czy tam nie ma jakiś błędów powstałych podczas cyfryzacji. bo chyba ta książka jest w 2 wersjach, surowa i z poprawkami.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Lipiec 01, 2010, 08:48:29
Wolę 6502jsm.txt z parodiusa i NES Doc. Kilka trybów adresowania używa się nie wiedząc, że takowe się stosuje. Tryby adresowania dopiero w użyciu mówią mi coś a nie w ebookach, więc nie będę się upierał, że dobrze je znam. Grucus ja dopiero poznaję podstawowe sprawy, mam poprawioną wersję tego ebooka, do którego link podałeś. Co do postów,to co jest niepotrzebne i nie związane z tematem trza usuwać, z czasem to powinno być bardziej stosowane w internecie :P.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 01, 2010, 20:20:30
Zacząłem sobie coś pisać, fajna zabawa. Na razie nie udało mi się wydobyć dźwięku.
http://www.4shared.com/file/AEOWvLGq/PR2.html (http://www.4shared.com/file/AEOWvLGq/PR2.html)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Lipiec 02, 2010, 12:18:11
Na początek warto zapoznać się z poniższym prostym kodem, odpowiada on za ciągły dzwięk w jednym kanale APU, nieraz zdarzało się slyszeć taki dźwięk jak konsola się zawiesiła. Dalej jest zresztą petla forever:

reset:
  lda #$01   ; square 1
  sta $4015
  lda #$08   ; period low
  sta $4002
  lda #$02   ; period high
  sta $4003
  lda #$bf   ; volume
  sta $4000
forever:
  jmp forever


port    -> $4015 port konfiguracyjny kanałów DMC + flagi licznika długości fali
         ->ang. $4015  ---d.nt21     DMC control and length counter enabled flags (write)

porty ->$4002/$4003- młodszy i starszy bajt licznika długości okresu fali.

port  -> $4001     EPPP NSSS     Sweep unit: enabled, period, negative, shift count


Więcej szczegółów:

http://wiki.nesdev.com/w/index.php/APU_Length_Counter  - licznik długości fali (po jakim czasie fala zostanie wyciszona)
http://wiki.nesdev.com/w/index.php/APU_Pulse - kanały odpowiedzialne za falę kwadratową
http://wiki.nesdev.com/w/index.php/APU_Envelope - jak zmienić głośność?              
http://wiki.nesdev.com/w/index.php/2A03 - ogólna mapa rejestrów 2A03 (pAPU)

no i na koniec dwa linki ogólnie omawiające rejesty APU:

http://wiki.nesdev.com/w/index.php/APU_registers
http://wiki.nesdev.com/w/index.php/APU          

Przepraszam za nieco chaotyczny post, ponieważ pisałem go w pośpiechu.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 02, 2010, 15:29:51
Dzięki. Nie mogłem znaleźć, w jakich jednostkach podaje się okres fali. Okazało się że w jakichś dziwnych, ale na nesdev wiki podane są gotowe wzory:

tval = fCPU/(16*f)-1        prostokąt

tval = fCPU/(32*f)-1        trójkąt

gdzie:
tval - 11-bitowa wartość jaką trzeba wpisać,
f - częstotliwość fali [Hz],
fCPU - częstotliwość zegara procesora (około 1789000 NTSC i 1663000 PAL).


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Lipiec 02, 2010, 23:32:09
Okres, jako że jest czasem, zazwyczaj wyraża się w sekundach...

Co do trybów adresowania: Nie wyobrażam sobie wydajnego programowani (chyba nawet żadnego programowania) w asm bez znajomości tego, to podstawa.
Ja się uczyłem tak:
1. Architektura tego co programujemy - rejestry i do czego służą
2. Tryby adresowania
3. Lista instrukcji
4. Połączenie p-ktu 2.i 3. - jakie rozkazy i jakie tryby, przez jakie tryby można uzyskać dostęp do określonych rejestrów
5. Testy, próby, zabawy, generalnie kilogramy romantycznych godzin z klawiaturą ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Lipiec 04, 2010, 18:23:15
Oto ogólny artykuł o układzie APU z NESDev. Niestety mnogość nazw układów moze sprawić, że tekst może być ciężkostrawny. Dodałem nieco przypisów, aby rozjaśnić to co może wydać się niezrozumiałe. Proszę o wyrozumialość jeżeli coś sknociłem. Gdyby przekład artykułu być kompletnym gniotem, usunę go.


APU

Jednostka APU (Audio Processing Unit) jest układem konsoli NES generującym dźwięk w grach. Istnieją dwa typy chipów realizujących funkcjonalność układu APU:
-RP2A03 (NTSC)
-RP2A07 (PAL)
Rejestry tego układu są odwzorowane w obszarze adresowym $4000-$4017.

Dla jasności, dokumentacja ta opisuje w skrócie operacje wykonywane przez APU, jednak nie odnosi się ona do, żadnej konkretnej realizacji sprzętowej. Jeśli tylko dane zachowanie jest udokumentowane, dokładny rodzaj licznika lub rejestru przesuwnego użytego do jego realizacji nie ma znaczena, Zresztą,bez dostępu do bardzo kosztownych narzędzi analizy (inżynierii) wstecznej na poziomie chipów, można jedynie spekulować nad dokładnym sposobem realizacji sprzętowej urządzenia.

Rejestry            Kanały dostępowe    Jednostki funkcjonalne
$4000-$4003    Fala Kwadratowa 1    Zegar, Licznik Długości Fali, Obwiednia dźwięku, Odchylenie
$4004-$4007    Fala Kwadratowa 2    Zegar, Licznik Długości Fali, Obwiednia dźwięku, Odchylenie
$4008-$400B    Fala Trójkątna       Zegar, Licznik Długości Fali, Licznik Liniowy
$400C-$400F    Szum               Zegar, Licznik Długości Fali, Obwiednia dźwięku,
                                                        Rejestr Przesuwny -> Zapis/Sprzężenie Zwrotne  
$4010-$4013    Kanał modulacji            Zegar,Czytnik Pamięci,Bufor Próbek,Układ Wyprowadzający
              przyrostowej (DMC)
$4015       Wszystkie               Aktywacja Licznika Długości Fali/Odczyt tejże
$4017       Wszystkie               Licznik Ramek/Sekwenser

---------------------------------------------------------------------------------------------------------
*Tu kilka wyjaśnień dotyczących tabelki. (CodAsm)

Dostęp do każdego kanału APU uzyskuje się za posrednictwem odpowiednich rejestrów zmapowanych w niewielkiej  przestrzeni pamięci ($4000-$4017). Każdy kanał ma kilka jednostek funkcjonalnych, zaś każda jednostka funkcjonalna posiada rejestr umozliwiający komunikację CPU z taką jednostką.
Starałem się, dobrać jak najstosowniejsze odpowiedniki jednostek funkcjonalnych, mogłem się mylić,  więc dla pewnego wyklarowania dalej podaję jak nazwy tych jednostek brzmią w oryginale oraz po zdaniu opisującym czym jest większość z tych jednostek.

-Zegar (Timer)- Jest on uzywany przez każdy z 5 kanałów i słuzy on do sterowania częstotliwością   dźwięku. Zawiera on dzielnik taktowany zegarem procesora (cykl dzielnika=cykl procesora)
-Licznik Długości Fali (Length Counter)- Jak nazwa wskazuje jest on odpowiedzialny za długość fali.
Jak to bywa z licznikami jest on ładowany pewną wartością początkową, która jest  sekwencyjnie dekrementowana aż do osiągnięcia zera. Po osiągnięciu zera kanał, którym steruje ten licznik jest całkowicie wyciszany
-Obwiednia dźwięku (Envelope)- generuje głośność o stałym natężeniu lub zmiennym (wtedy jest ładowana wartością, która jest sekwencyjnie dekrementowana. Sama obwiednia dźwięku jest, krótkim zapisem amplitudy dźwięku. Ma ona na celu upodobnienie danego dźwięku do jego odpowiednika w rzeczywistości.
-Odchylenie (Sweep)- Jednostka odchylenia słuzy do korekcji okresu fali kwadratowej (w górę lub w dół). Odchylanie fali w celu jej korekcji odbywa się co pewien czas (np. zgodnie z Licznikiem Ramek)
-Licznik liniowy (linear counter)
-Rejestr Przesuwny Zapis/Sprzężenie Zwrotne (shift register w/ feedback)
-Czytnik pamięci (memory reader)
-Bufor Próbek (Sample Buffer)
-Jednostka Wyprowadzająca (output unit)
-Dostępność i Stan Licznika Długości Fali (Length Counter enable and status )
Pozwala włączać/wyłączać poszczególne kanały oraz umożliwia odczyt aktualnego stanu kanałów oraz flag przerwań APU
-Licznik Ramek/Sekwenser (Frame Counter/Sequencer)- Taktuje on zegar z niską częstotliwością dla
poszczególnych kanałów oraz umozliwia opcjonalne generowanie przerwania z częstotliwością 60 Hz. Nazwa "Frame Counter" jest bardzo myląca, ponieważ nie ma on nic wspólnego z sygnałem Video.

---------------------------------------------------------------------------------------------------------

Każdy z kanałów posiada własną charakterystykę taktowania generatora próbek, mają one także układy modulujące w różny sposób sygnał. Układy modulatorów sterowane są zegarami Licznika Klatek/Sekwensera (Frame Counter/Sequencer).DMC odgrywa próbki podczas, gdy pozostałe kanały generują fale o róznych kształtach. Każda podjednostka należąca do określonego kanału działa równolegle i niezależnie od pozostałych jednostek układu, zaś modyfikacja jakiegoś parametru kanału dotyczy zazwyczaj tylko podjednostek kanałów. Taka zmiana jest wprowadzana dopiero w chwili rozpoczęcia kolejnego cyklu wewnętrznego układu.

Odczyt/Zapis rejestru stanu umożliwia udostępnianie i blokowanie kanałów, a także na sprawdzenie aktualnej wartości Rejestru Stanu Licznika.

Dane wyjściowe wszystkich kanałów są łączone z uzyciem nielinionego schematu miksowania

*APU posiada własny Mixer zbierający wszystkie wyniki z poszczególnych kanałów i przetwarzający je na analogowy sygnał Audio (CodAsm).


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Merki Lipiec 05, 2010, 16:01:49
Witajcie znowu ;) pisalem do was kiedys na forum, nawet post gdzies sie zachowal tyle ze zapomnialem hasla i zalozylem nowe konto (e-mail ze zmiana hasla starego konta wciaz nie doszedl...). Koniec offtopu.

Mam nadzieje ze zrozumiecie ze jestem dopiero poczatkujacy i pewne terminy troche mi sie mieszaja ;) zacząłem studiowac nesasm.pdf z nespowerpack oraz dokumentacje nesa z nesdev. Jako pierwszy program z Nesasm.pdf to wyświetlenie jednolitego tła o kolorze niebieskim. O ile kilku instrukcji w bloku inicjajycjnym jeszcze nie rozumiem (co narazie do szczescia mi nie potrzebne), o tyle chciałbym zrozumieć o co chodzi z tym NMI i vblank bo już zupełnie namieszali.

O ile dobrze rozumiem NMI to rodzaj przerwania generowanego przez PPU. Jednak, żebu go uaktywnić potrzeba włączyć odpowiedni bit w rejestrze $2000 tak?

Wkleje więc może fragment kodu z programu :

Kod:
STX $2000    ; disable NMI
  STX $2001    ; disable rendering
  STX $4010    ; disable DMC IRQs

vblankwait1:       ; First wait for vblank to make sure PPU is ready
  BIT $2002
  BPL vblankwait1

Pierwsza instrukcja wpisuje 8 zer do rejestru 2000. Są tam rózne opcje, wśród nich jak czytam bit 7 mówi coś o NMI i vblank (ciężko mi zrozumieć-indicates whether a NMI should upon VBlank Czy chodzi o to, że przy vblank ma byc generowany NMI (1) czy też nie (0)?)

Druga instrukcja też wpisuje zera do 2001-brak obrazu. Teraz zaczyna się to czego nie rozumiem. Program niby czeka na vblank (czyli moment gdy działo elektronowe rysuje nową linie u gory ekranu). Instrukcja BIT nie wiem co robi ;/ I teraz koncowe pytania:

VBlank jest sygnałem który pojawia się zawsze niezależnie od konfiguracji rejestrów PPU?
NMI jest z kolei przerwaniem które może być generowane lub też nie podczas nadejścia sygnału vblank?

Pewnie lamerskie pytania zadałem, ale nie chcę wchodzić głębiej nie znając podstaw ;)





Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Lipiec 05, 2010, 17:06:38
1. Tak więc po raz kolejny daję link do mojego przekładu kursu nesasm.pdf ze strony
    nespowerpak.com (Przekład jest w formacie pdf):

   http://www.plikos.pl/17pj/NesAsmPL.pdf.html (http://www.plikos.pl/17pj/NesAsmPL.pdf.html)  

    Merki, myślę, że powinno to nieco rozwiać twoje wątpliwości.

2. Jestem w trakcie poprawek przygotowanych przeze mnie polskich wersji artykułów z NESDev:
    *Rejestry PPU.
    *Kod inicjujący
    *Kilka innych, które mam w surowych wersjach, jest ich sporo, ale ich jakość merytoryczna
     wymaga jeszcze wiele godzin na poprawki i doszlifowanie
    *Zastanawiam się nad roszerzeniem oraz przeredagowaniem artykułu o APU, który umieściłem kilka
      postów wcześniej (Narazie sama teoria oderwana od rzeczywistości, więc niewielka użyteczność
      poza tym ciągle tabelki rozjeżdżają mi się w postach)

3. Ostatnio, bardziej zajmowałem się czytaniem kodów źródłowych, natomiast artykuły musiały zaczekać, w ciągu następnych dni postaram się nadrobić zaległości.



Oto artykuł o kodzie inicjującym:



Kod inicjalizacyjny

W momencie podłączenia konsoli NES do zasilania lub jej zresetowania, program powinien wykonać nastepujące czynności w ustalonym do tego celu banku.


*(Algorytm+ Kilka szczegółów implementacyjnych sprzętu)

-Ustaw Bit blokady IRQ (flaga ta nie dotyczy jednak wszystkich IRQ- w tym procedury RESET- gdyż  
 możliwa jest symulacja w kodzie programu Resetu za pomocą rokazu:
 jmp $FFFC)
 [jest tp skok jak do zwykłej procedury, wrzucającej na stos i zbierącej ze stosu adres powrotny]
-Blokada przerwania NMI dla PPU oraz blokda Rendering'u grafiki [Rendering to po prostu pozazywanie
 Tiles'ów Tła lub Sprite'ów na ekranie- przyp CodAsm]
-Inicjalizacja Wskaźnika Stosu (sp) wartością #$FF (młodszy bajt adresu pierwszego elementu na
 stosie)
-Inicjalizacja Mapper'a (jeśli takowy jest uzywany)

Od tego miejsca kod inicjujący może zostać umieszczony albo w ustalonym do tego (niezmiennym) banku albo w odrębnym banku. W tym celu należy przełączyć bank za pomocą instrukcji jmp.

-Zablokowanie/Trybu dziesiętnego (decymalnego). Jest to konieczne nie tylko dlatego, że układ 2A03 nie posiada trybu dziesiętnego, ale również w celu zagwarantowania zgodności ze standardowymi debugger'ami
-Blokada przerwań zegarowych APU (w przypadku, gdy uzywany jest Mapper wyzwalający przerwania IRQ)
-Zablokowanie przerwań kanału DMC (IRQ DMC- przerwanie generowane przez APU)
-Ustawienie całego uzywanego przez Twój program RAMU na określone wartości ( aby nie zawierały przypadkowych śmieci). Czesto dotyczy to obszaru RAM wewnętrznego (@ $0000-$07FF) i jeżeli jest to konieczne to również PRG-RAM (@ $6000-$7FFF). Natomiast nie dotyczy to obszarów, w których zapisane jest coś co chcemy pamiętać po (miękkim) Resecie konsoli (Np. Spis najlepszych wyników graczy- Highscores)

-Odczekanie co najmniej 30000 cykli przed odczytem lub zapisem rejestrów $2003-$2007 (Związane jest to ze stanem PPU po włączeniu zasilania). Najpowszechniej stosowanym rozwiązaniem jest oczekiwanie na moment, w którym PPU wygeneruje w rejestrze $2002 (PPUSTATUS -> tylko do odczytu) sygnał powrotu pionowego (W całym kodzie inicjalizacyjnym musi to być wykonane dwukrotnie)


Niektóre Mapper'y nie posiadają ustalonych banków, a zamiast tego w danej chwili przełączają 32KB pamięci- dotyczy to AxROM, BxROM, GxROM oraz niektórych konfiguracji MMC1.
Konieczne jest zapisanie Wektorów Przerwań, aż do miejsca, w którym wykonywany jest skok (jmp) do osobnej sekcji, jest to duplikowane w każdym banku. [Co do podkreślonego fragmentu zdania mam pewne wątpliwości -> CodAsm]
Często zdarza się, że obszar ostatniej 256 bajtowej strony pamięci zawiera Wektory Przerwań, początek kodu inicjalizującego oraz tramoplinę służącą do skoków pomiędzy kodami (danymi) dwóch różnych banków.

A teraz próbka kodu inicjalizującego, z odrobiną komentarzy:

Kod:

reset:
 sei ; Ignoruj IRQ
 cld ; Wyłącz Tryb Dziesiętny
 ldx  #$40
          stx  $4017 ; Wyłącz przerwania Ramek APU
          ldx  #$ff
          txs  
          stx  $2000
          stx  $2001
 stx  $4010
 
 ; Opcjonalnie (pominięte)
 ; Ustaw Mapper i Skocz do dalszej częsci kodu inicjalizującego

 ; Wyczyść flagę powrotu pionowego (VBlankFlag)
 ; Tak więc wiadomo już, że oczekujemy na rozpoczęcie się powrotu pionowego

 ; Pierwszy z dwóch okresów oczekiwania na powrót pionowy, aby mieć pewność, że stan  
          ; PPU jest ustabilizowany

@vblankwait1:
 bit  $2002
 bpl  @vblankwait1

 ; Teraz mamy około 30000 jałowych cykli zanim stan PPU zostanie ustabilizowany,
 ; Jedyną rzeczą, jaką można w tym czasie zrobić to zapisanie RAMU określonymi wartościami
 ; Tak więc wypełniamy pamięć wartościami $00, co odpowiada przygotowywaniu
          ;przez kompilatory jezyka C sekcji BSS.
 ; Dla wygody wartość x przy pierwszej iteracji wynosi zero
 
 txa
@clrmem:
 sta  $0000, x
 sta  $0100, x
 sta  $0300, x
 sta  $0400, x
 sta  $0500, x
 sta  $0600, x
 sta  $0700, x
 
 ; Adresy $0200-$02ff celowo pomijamy, gdyż druga strona pamięci RAM używana jest na
 ; potrzeby listy wyświetlanych Sprite'ów, kopiowanych do OAM
 ; OAM powinna zostać zainicjalizowana wartościami z Zakresu $EF-$FF, a nie zerami,
 ; gdyż w takim wypadku otrzymasz masę niepotrzebnych Sprite'ów- śmieci w punkcie (0,0)
 
 inx
 bne  @clrmem

 ;innymi rzeczami, które można wykonać pomiędzy powrotami pionowymi mogą być np.:
 ;-ustawienie Audio (Dźwięku)
 ;-wypełnienie rejestrów Mapper'a odpowiednimi wartościami.

@vblankwait2:
 bit $2002  
 bpl @vblankwait2
 
   
W miejscu znajdującym się za tym kodem można wypelnić danymi obszary nastepujących tablic:
-Name Tables (w tym Attribute Tables)
-Pattern Tables (o ile na panel głównym używana jest CHR-RAM)
-Palletes

Po wykonaniu wszystkich powyższych czynnosci można przystąpić do wyswietlania grafiki. [Operacje na wymienionych Tablicach, ale to już inna historia ->CodAsm]


      Oryginalna wersja artykułu pojawiła sie pod adresem:
         http://wiki.nesdev.com/w/index.php/Init_code
   

            



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Lipiec 23, 2010, 15:10:02
1. Dochodzę do wniosku, że nie ma sensu brać się za nic dopóki nie poznam porządnie architektury 6502 i nie napiszę   
   kilku rozsądnych programów, bo moja wiedza w tym zakresie kuleje. Odpuszczę sobie publikowanie moich   
   wypocin jeżeli chodzi o tegoroczne lato. Podrukowałem sobie tony dokumentacji i mam całe wakacje. Kiedy przyjdzie 
   czas wrócę do tłumaczeń.

2. Wracając do sposobu nauki byłem zawsze za tym, żeby czytać dużo kodu i jeżeli ewentualnie pojawi się jakieś
    dziwne adresowanie wtedy zajrzeć do odpowiedniego źródła, dotychczas to działało.
 
3. Grucus dzięki za cenne informacje o stosie 6502. Być może  moje komentarze do kodu są rzeczywiście nieczytelne.

Pozdr.                                                             


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 27, 2010, 21:24:59
NESASM jest zły  :chess:
http://www.nesdev.com/bbs/viewtopic.php?t=3726 (http://www.nesdev.com/bbs/viewtopic.php?t=3726)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Sierpień 09, 2010, 22:17:17
Fajny opis NES.

http://nocash.emubase.de/everynes.htm


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 06, 2010, 09:39:30
Mam pytanie dotyczące palety, bo nie jestem pewnien czy dobrze zrozumiałem jak to działa:

*Mamy po 16 wpisów palety dla Sprite'ów i dla Tła, każdy taki wpis zawiera numer koloru w systemie NES (mamy miejsce na 64, ale NES potrafi wyświetlić jedynie 52 z nich).

[Nie jestem pewien czy dobrze zrozumiałem działanie palety od tego miejsca]

Kolor dla danego piksela (powiedzmy, że chodzi nam o ten w górnym lewym rogu tilesa 8x8) jest liczony w następujący sposób:

a.) Pobierany jest najstarszy bit z pierwszej płaszczyzny Tile'a w Pattern Table
b.) Pobierany jest najstarszy bit z drugiej płaszczyzny Tile'a w Pattern Table
c.) Pobierane są odpowiednie 2 bity z odpowiedniego wpisu Attribute Table (powiedzmy, że policzyliśmy Square (16x16 pix), w którym znajduje się dany tile i wyizolowaliśmy odpowiednie 2 bity z wpisu w Attribute Table)

Teraz klecone są do kupy bity, które pobraliśmy w powyższych trzech krokach w następujący sposób:

                              ccba
                              ||||                        
                              |||+ Bit z pierwszego płatu Tilesa \ Te dwa bity wybierają kolor
                              ||+- Bit z drugiego płatu Tilesa     / z odpowiedniej 4 kolorowej                
                              ||                                               palety
                              |+-- \ Te dwa bity są pobrane z odpowiedniego wpisu w Attribute Table
                              +--- / (określają jednocześnie, która 4 kolorowa paleta została wybrana)

Więc powstaje nam teraz 4 bitowy offset, który dodajemy do odpowiedniej palety w zależności czy mamy do czynienia ze Sprite'm czy Tilesem Tła, czyli

 $3F00 + ccba = Adres Koloru
   lub
 $3F10 + ccba = Adres Koloru

I otrzymujemy odpowiedni adres wpisu palety, w którym jest zapisany kolor wyświetlanego w danej chwili piksela.

[Tu koniec tego czego nie jestem pewny]

Mam nadzieję, że za bardzo nie zagmatwałem.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Wrzesień 06, 2010, 11:09:21
Attribute Table jest tylko dla tła, każdy sprite ma swój bajt z atrybutami w którym jest też numer palety.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 11, 2010, 07:22:05
1. Koks chciałem podziękować za szybką odpowiedź

2. Znalazłem ostatnio link do dość obszernego tutoriala NES napisanego przez bunnyboy'a (dużo o programowaniu APU):

   http://www.nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155 (http://www.nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155)

   I kilka innych dokumentów i stron:

   http://neshla.sourceforge.net/ (http://neshla.sourceforge.net/)
   http://graphics.stanford.edu/~ianbuck/proj/Nintendo/ (http://graphics.stanford.edu/~ianbuck/proj/Nintendo/)
   http://kevtris.org/nes/index.html (http://kevtris.org/nes/index.html)
   http://jonathan.microclub.ch/NES_raster/index.html (http://jonathan.microclub.ch/NES_raster/index.html)
   http://everything2.com/node/2023188 (http://everything2.com/node/2023188)
  
  


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 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




Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 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;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 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


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 30, 2010, 14:57:22
(http://www.pictures.emunes.pl/hosting/4.png)

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


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 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)



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Wrzesień 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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Wrzesień 30, 2010, 23:42:23
Siudym, jemu chyba chodzilo o zapis 4016, 8 razy jeden bit.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Październik 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ę.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 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)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 01, 2010, 23:18:45
stwierdzilem, ze juz nie wiedza a checi i samozaparcie mnie ogranicza  :crazy: (czyt.: Lenistwo)

i skromnosc  :naughty:


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Październik 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


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Październik 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  :P). 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ę.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 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).


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Październik 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



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Październik 26, 2010, 00:00:19
widać że słabo z algorytmami :P

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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Październik 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


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Październik 26, 2010, 10:42:34
widać że słabo z algorytmami :P

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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 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.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Październik 26, 2010, 16:32:46
V = sqrt(Vx2+Vy2)

Po co to obliczać? Do procedury skoku wystarczą poszczególne składowe, pierwiastkowanie nie jest tutaj potrzebne.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Październik 26, 2010, 20:47:48
widać że słabo z algorytmami :P

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.

Tak jak napisał dr88, każdy osioł to wie, że szybsze. Ale co jak wykroczy poza zakres?:P


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Październik 26, 2010, 21:31:59
Zobaczysz w praniu jak to wyglada :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Listopad 01, 2010, 14:09:49
Może nie wygląda to najlepiej, ale wreszcie coś zaczyna działać...

http://wrzucacz.pl/file/4841288616944


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Listopad 04, 2010, 02:32:33
No zaczyna działać... Popracuj nad obsługą pada, to co teraz zrobiłeś nazywa się, o ile mnie pamięć nie myli, koder priorytetowy... W każdym razie po wykryciu naciśnięcia przycisku, w tym rozwiązaniu, niemożliwe jest sprawdzenie pozostałych przycisków.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Listopad 04, 2010, 15:30:59
No właśnie...Wygląda, że ten sposób prowadzi w ślepą uliczkę. W jednym NMI nie da się obsłużyć na raz dwóch różnych przycisków pada.

Inny pomysł polegałby, żeby odczytywać w jednym NMI klawisze kursorów, a w drugim przycisk skoku.
*Przyciski kursorów nadają początkową Vx i inkrementują odpowiednie składowe ruchu x
*Przycisk skoku nadaje początkową Vy i inkrementuje odpowiednie składowe ruchu y (gdy postać spada rzecz ma się odwrotnie)

Kolejny problem to skok z rozbiegu. Wymagałby on:
*Ciągłego czytania drugiego przycisku pada (do momentu samego skoku).
*Zmiany przyśpieszenia (żeby było widać jak postać przechodzi ze stanu chodzenie do stanu bieganie)
*Dodania jakiegoś współczynnika tarcia o ile jest sens aż tak szczegółowo to robić.
*Powiedzmy, że przycisk rozbiegu byłby odczytywany jedynie co trzecie NMI.

Nie wiem czy byłby to dobry sposób, ale to pierwsze co mi się nasuwa i chyba jest możliwie łatwe do zaimplementowania?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Grucus Listopad 07, 2010, 20:35:03
No właśnie w jednym NMI da się obsłużyć więcej, jeśli zmienisz sposób obsługi klawiatury (nie będziesz używał kodowania priorytetowego), ale i tak to jest ślepa uliczka.
Nie znam architektury NES-a, ale zdaje mi się że rozumiem jak to powinno działać, przynajmniej tak było by logicznie: CPU i PPU działają niezależnie, PPU generuje NMI gdy skończy "rysować" obraz, wtedy następuje powrót plamki z dolnego prawego rogu obrazu do górnego lewego, z czym związane jest wygaszenie plamki. Czas ten jest bardzo krótki. Chodzi o to aby nie mieszać "w locie" w rejestrach PPU podczas "rysowania" obrazu, a tylko w czasie tego krótkiego przerwania, gdy nic nie jest wyświetlane (jest kilka powodów takiego postępowania, w wielkim skrócie pozwala to uniknąć bugów graficznych) przeprogramować PPU. Zdaje się że zostało to przemyślane tak aby CPU w pętli głównej i podprogramach robił wszystko, a w NMI na podstawie tych danych tylko zapisywać odpowiednie wartości do rejestrów PPU, tak aby mógł wyświetlić kolejną klatkę obrazu. Jeśli jest inaczej proszę o dokładnie wyjaśnienie. Oczywiście czas, w którym PPU generuje obraz można dowolnie wykorzystać w CPU.
Przy powyższym założeniu możesz Skonfigurować wszystko na starcie i na podstawie odczytu klawiatury obliczyć wszystkie niezbędne zmienne do zapisania ruchu, biegu, skoku i dowolnej ich kombinacji, a w NMI tylko odczytywać klawiaturę i na podstawie tego co wyliczysz w programie głównym odpowiednio programować rejestry PPU. Na pytanie jak odczytać wiele klawiszy: twój błąd powstał z błędnego założenia że w jednej chwili tylko jeden będzie naciśnięty, gdy sprawdzasz po kolei klawisze i trafisz  na naciśnięty, nie sprawdzasz kolejnych, od razu wywołujesz funkcję mu przypisaną. Powinieneś zawsze sprawdzić w pętli wszystkie 8 klawiszy, a w razie znalezienia przyciśniętego wywołać przypisaną mu funkcję i przejść do sprawdzenia kolejnego klawisza! Aż będzie wszystkie 8, nie mniej i nie więcej, oczywiście dla każdego z osobna wywoływać jego funkcję. Mam nadzieję że coś z tego zrozumiesz.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Listopad 12, 2010, 19:29:18
Po lekturze kilku kodów źródłowych zauważam, że moim najgłupszym błędem jest pozostawienie pętli głównej pustej- w moich programach nazywa się ona forever (lepiej byłoby ją nazwać main).

Przykładowo pętla main w źródle Bill World (http://nesdev.parodius.com/billworld01.zip) :
*czyści spr-ram
*czyta joypad (zapętlenie obsługi joya, o którym wspominał Grucus)
*obsługuje pauzę
*czeka na nadejście nmi, które wykona resztę roboty
*wykonuje powyższy schemat od początku

Obsluga joya w tym kodzie wygląda mniej więcej tak (trzy pierwsze punkty obsługuje pętla main, ostatni jest zaszyty w nmi):
*zapamiętanie ostatnio odczytanego przycisku pada  \   
*odczyt aktualnie wciśniętego przycisku                  /  procedura czytająca jopad
*obsługa pauzy
*obsługa wszystkich przewidzianych w grze kombinacji przycisków (np. rożne kombinacje przycisku skoku i krzyżaka)

Niestety zdałem sobie sprawę, że jestem cały czas strasznym Newbie w temacie asemblera pod NES i muszę jeszcze wiele się nauczyć, ale myślę, że uda mi się z czasem lepiej rozpracować temat

Na koniec dwie strony:
*http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html (http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html) - artykuły z opracowanymi fragmentami
  zdeasemblowanrgo kodu gry Faxanadu i nie tylko)
*http://games.greggman.com/game/programming_m_c__kids/ (http://games.greggman.com/game/programming_m_c__kids/) - artykuł jednego z autorów gry M. C. Kids


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mog123 Listopad 15, 2010, 21:04:58
programowałeś kiedyś w C?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Listopad 15, 2010, 21:44:46

Na koniec dwie strony:
*http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html (http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html) - artykuły z opracowanymi fragmentami
  zdeasemblowanrgo kodu gry Faxanadu i nie tylko)

o, to dosc ciekawe!


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Listopad 17, 2010, 13:09:30
programowałeś kiedyś w C?

1. mog123 Nie wiem czy to można nazwać programowaniem, nie utrzymywałem nigdy nic większego niż 100 linijek (kiedy skrobałem w WinAPI mogło być nieco więcej). Proste rzeczy. Jeżeli idzie o asm lubię go sobie zapisywać w pseudokodzie C (w taki sposób najczęściej wykorzystuję C).


Na koniec dwie strony:
*http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html (http://www.the-interweb.com/serendipity/index.php?/categories/8-NES/P2.html) - artykuły z opracowanymi fragmentami
  zdeasemblowanrgo kodu gry Faxanadu i nie tylko)

o, to dosc ciekawe!

2. Co się tyczy Faxanadu ostatnio zagrywam się w to bez pamięci, jak dla mnie dzieło sztuki na MMC1.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: alzen Grudzień 26, 2010, 13:50:33
Nie wiem czy temat jest odpowiedni, chciałbym spytać jaką księżkę polecalibyście do nauki Assemblera 6502?

Miałem kiedyś książkę autorstwa Jana Ruszyca, "Informatyka Mikrokomputerowa - Assembler 6502 - ATARI" (jest chyba dalej do pobrania na jednym z polskich for o ATARI). Książka była z 1987 roku i jako, że na razie niemalże wcale się na tym nie znam nie wiem czy programowanie pod 6502 dla ATARI nie różni się nieco od programowania tegoż mikroprocesora dla Pegasusów/NESów.

Poza tym jak pisałem, książkę tę miałem ale chyba już na dobre się zgubiła (a na kompie czytać nie lubię), więc prosiłbym o jakieś sugestie dobrych publikacji dla noobów; nie muszą być polskojęzyczne, z angielskimi też sobie poradzę; byleby w miarę czytelnie wprowadzały w tego assemblera (ta książka Ruszyca była jak dla mnie bardzo przystępna).


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Grudzień 26, 2010, 19:03:21
Programowac potrafisz?
Bawiles sie kiedykolwiek Asemblerem?
Nie masz rodziny badz mieszkasz w piwnicy?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: alzen Grudzień 26, 2010, 21:44:21
dr88, jak zwykle bez konkretnej odpowiedzi.

Bawiłem się tyle o ile; ale chciałbym się w tym trochę rozeznać bo to jednak interesująca kwestia. Co do programowania, poza kilkoma skryptami w Bashu raczej niewiele więc raczej nie programuję. Zdaniem wielu to bardzo utrudnia podejście do Assemblera ale mam to w nosie :).

Polecajcie dobre publikacje i nie marudźcie; Ruszyc super zrobił tą książkę bo wychodził od przeliczania dzięsiętnych na szesnastkowe co też musiałem przerobić i sugeruje przerabianie rozdziałów jeden po drugim więc jak najbardziej dla mnie; ale może jest jeszcze coś ciekawego. Albo poszukam Ruszyca albo czegoś innego, jak nie to zostaną publikacje z sieci ale wolałbym to co miałem a sieciowymi jeśli coś załapię to się posiłkować raczej.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Grudzień 27, 2010, 11:53:43
ana Ruszyca, "Informatyka Mikrokomputerowa - Assembler 6502 - ATARI" (jest chyba dalej do pobrania na jednym z polskich for o ATARI)

A daj se na luz ze sciaganiem... Na alleraztanioidrogo.pl masz je czesto ponizej 10zl. Ja chyba kupilem za 9+wysylka.
Ja sam mam wlasnie ta ksiazke. Procek ten sam, wiec co za roznica czy NES czy ATARI czy komoda. Wiadomo ten NES'owy ma chyba mniej rozkazow, ale te najwazniejsze i samo sedno sprawy jest te same. Kup i czytaj.

Dla przykladu:
http://www.siudym.gower.pl/nes_demo_2.nes

Sposob animowania tego nietoperka wyszukalem wlasnie w tej ksiazce. Oczywiscie nie bylo to opisane w sensie "jak cos animowac" ale szukalem rozwiazania petli. Znalazlem przykladowy kodzik i w symie bez wiekszych zmian NESASM slicznie go przyswoił.

Dobra rada - kup ta ksiazke + te tutoriale ASM dedykowane dla NES z nesdev i je sobie podrukuj. Wsio.

A jak jednak chcesz sciagac:
http://atarionline.pl/biblioteka/materialy_ksiazkowe/Asembler%206502%20%28v2%29.pdf


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: alzen Grudzień 27, 2010, 21:24:13
Thx siudym.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Styczeń 05, 2011, 14:53:36
1. Ponieważ link polskiej wersji Tutoriala NESAsm jest już dawno niekatualny, podaję nowy (poprawiłem kilka drobnych błędów)

http://wrzucacz.pl/file/8231294235601

Tak na marginesie kompletny kurs NESAsm i dużo więcej o programowaniu gier pod NES można znaleźć  na forum NintendoAge pod poniższymi adresami:
    http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155
    http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=33287

2. (Do alzen'a)
    Programowanie NES różni się od ogólnego programowania 6502 przede wszystkim poniższymi:
    -mapą pamięci (po prostu inna organizacja pamięci dla danych graficznych i muzycznych)
    -urządzenia I/O (czyli inaczej obsługujemy wyświetlanie grafiki i granie przez chip dźwiękowy)
      używamy po prostu innych adresow portów I/O
    -brak obsługi trybu dziesiętnego (systemy BIN/HEX muszą być samodzielnie przez programistę
     zamieniane na BCD)
    -NES nie ma żadnego systemu operacyjnego, a więc i procedur ułatwiających nam życie
     (np. do obsługi liczb ułamkowych), trzeba je sobie samemu napisać
    -w NES-owej wersji procesora 6502 nie ma kilku instrukcji, które są w Atarynce czy C64

    *Wspólną cechą NES i innych konsol działających na procesorach 6502 jest to że kod wykonujący  
      obliczenia jest niemalże identyczny i można go wklejać w kod źródłowy prawie w postaci
      niezmienionej(Np. dodawanie,mnożenie i obliczanie jakiejś funkcji).
      Jednak w przeciwieństwie do innych maszyn w NES sami musimy zatroszczyć o tryb dziesiętny
      jak napisałem w 3 myślniku.
    
3. alzen jeżeli nie będziesz czegoś rozumiał/wiedział, to służę pomocą o ile sam będę wiedział.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 09, 2011, 22:14:18
1. Ostatnio na forum nesdev znalazłem link do fajnego symulatora 6502. Jest dość prosty w użytku.
   Zanim umieści się jakąś prockę w kodzie nes można sobie ją przetestować.

  http://home.pacbell.net/michal_k/

2. Link do wtyczki przeznaczonej do IDA pro umożliwiającej debugowanie rom'ów NES (i do wątku na   
    którym go znalazlem).

  http://www.openrce.org/repositories/users/dennis/NESpackage.zip
  http://nesdev.parodius.com/bbs/viewtopic.php?p=40454&sid=f1ab6cadbccc30268721e1c140be5c73

3. Męczę się z konfiguracją ca65 (cc65) przez ostatnie dni. Bardzo polecany kompilator na
    bbs-ie. W poniższym wątku piszą trochę o konfiguracji, gdyby ktoś miał ochotę pobawić ca65 to
    poza samą dokumentacją kompilatora i programu np. GNU Make na początek polecam przeczytać
    ten wątek. W ogóle serwis, na którym znajduje się poniższe forum jest całkiem ciekawy.

   http://www.nesworld.com/cgi-bin/yabb/YaBB.pl?num=1263859326

   


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Czerwiec 10, 2011, 00:25:24
no to sie przerzuc juz na asm6


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Czerwiec 12, 2011, 09:31:57
1.Na początek linki do dyskusji dotyczących, który jest lepszy ca65 czy asm6:

http://nesdev.parodius.com/bbs/viewtopic.php?t=7014&highlight=asm6+cc65
http://nesdev.parodius.com/bbs/viewtopic.php?t=3605&start=0

2. Linki o tym jak lepiej ogarnąć ca65:

http://www.nesdev.com/bbs/viewtopic.php?p=4582&sid=e330a1ab803685a8b32253faed1c5721
https://bitbucket.org/ddribin/nerdy-nights/src

3. Każdy z tych asemblerów ma swoje wady i zalety:

   asm6:
   *łatwość przeniesienia kodu z NESASM, gdyż składnia jest podobna
   *prosta asemblacja, bo odbywa się w jednym kroku (kompilator i linker to jedno)
   *obsługa wygodnych etykiet lokalnych '+' i '-'
   *obsługa większej ilości banków niż nesasm, więc lepiej jest z mapperami
   *łatwość tworzenia małych plików  

   ca65:
   *składnia nieco różni się od NESASM (chodzi tu głownie o określanie adresów w romie i konfigurację)
   *proces kompilacji jest rozbity na kilka etapów (asemblacja i łączenie) co daje elastyczność
   *konieczność przygotowania pliku konfiguracyjnego .cfg i reguł w pliku makefile
   *mappery nie stanowią tu żadnego problemu ze względu na możliwości konfiguracji
   *nieco inna obsługa etykiet lokalnych '+' i '-'
   *dużo kombinowania i możliwość wystąpienia błędów na wielu etapach co może być irytujące

4. Większość lepszych programistów na nesdev preferuje ca65. Jakimś cudem udało mi się szczęśliwie skonfigurować  
    wszystko. Poza tym każdy programista, student informatyki powinien według mnie przynajmniej  
    orientować się jak działa mechanizm skryptów makefile, więc póki co pozostaję przy ca65. :-P


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 26, 2011, 21:03:40
http://www.4shared.com/file/xoXx9B-0/ramdemo.html
Test RAMu zamiast ROMu jako CHR. Grafika wysypuje się przy próbie zapisu podczas renderingu, nawet do pattern table nieużywanego w danym momencie. Przycisk A ustawia PT1 jako aktywną, Przycisk B wyłącza rendering i nadpisuje PT0,  a Select nadpisuje PT0 bez wyłączenia renderingu - trzymając można zaobserwować glitche.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Wrzesień 03, 2011, 19:26:56
Skromny projekcik w ASM6. Pobawiłem się trochę portami APU.

http://www.sendfaile.com/download/2006/ProjektAPUzip.html


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mientos4 Listopad 18, 2011, 21:24:53
Nie wiem czy to widzieliście, ale fajny tutorial(chociaż nie znam japońskiego, ale kody da się rozczytać)

http://www37.atwiki.jp/kikakubu4/pages/62.html


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Listopad 18, 2011, 21:35:49
To wygląda jak programowanie NESa w C.
Tego już raz dokonał Shiru w grze Alter Ego (http://nesdev.parodius.com/bbs/viewtopic.php?t=7999)
Jednak używanie tego sposobu odbija się (jak pisał gdzieś shiru) na wydajności.To w sumie zrozumiałe, często funkcje są szybsze gdy napisane w ASM.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Listopad 18, 2011, 23:09:25
To wygląda jak programowanie NESa w C.
Bo to jest język C.

Jednak używanie tego sposobu odbija się (jak pisał gdzieś shiru) na wydajności.To w sumie zrozumiałe, często funkcje są szybsze gdy napisane w ASM.

Zawsze funkcje napisane w ASM są szybsze niż w C.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Styczeń 08, 2012, 15:51:23
A tak na marginesie bo juz moje linki dead

Te wczesniejsze wynalazki ponownie upload.

http://www.siudym.webd.pl/nesasm/nes_demo_1.nes
http://www.siudym.webd.pl/nesasm/nes_demo_2.nes


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Marzec 09, 2012, 13:18:22
Wczesniej nie importowalem do demek swoich NSF, a jedynie publiczne NSF z gier. Mam problem z wyeksportowanymi NSF z famitracker, mysle, ze problem jest z blednymi wartosciami INCBIN, PLAY oraz INIT. Wczytane do kodu nie odpalaja muzyki, natomiast z nsf z neta wszystko dziala. Z famitraka nic.

Jakies pomysly?

Daje tego nsf - zrobiony w chwilke aby cokolwiek bylo.
http://www.siudym.webd.pl/nesasm/dupa.nsf

Czy ktos moze zaladowac to do jakiegos kodu asm i sprawdzic czy sie odpala? Nie wiem czy to famitracker ma jakies dziwne nsf czy te adrest problemem sa.

(http://img263.imageshack.us/img263/8294/95091247.gif)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Marzec 09, 2012, 19:21:13
Odpala się. (asm6)
Kod:
incbin inesheader.bin
org $8000
reset:
ldx #0
txa
-
sta 0,x
sta $200,x          ;czyszczenie obszarów używanych przez nsf
dex
bne -

lda #%10000000
sta $2000          ;włączenie NMI

lda #0
ldx #0
jsr $ab00          ;init

-
jmp -

nmi:
jsr $ab03          ;play
irq:
rti

org $a998          ;(kurde, nie init) load - trzeba odjąć rozmiar nagłówka ($aa18-$80)
incbin dupa.nsf

org $fffa
dw nmi
dw reset
dw irq

użyty inesheader.bin
Kod:
4E 45 53 1A 02 00 00 00 00 00 00 00 00 00 00 00


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Marzec 09, 2012, 20:39:59
Ale w NESASM nie :/

No nic to detal, chcialem sie pobawic nieco msx. Na razie oleje sprawe.

Dawno nic nie robilem i wylecialo mase z glowy. Pobawilem sie nieco starym demkiem animacji. Mam zamiar zrobic mega plynnie poruszajacego sie stworka. Zobaczymy co wyjdzie...

http://www.siudym.webd.pl/nesasm/new.nes

EDIT:

Jakies pomysly na najprostrze metody skoku? Kombinuje rozne metody ale kiepsko mi idzie, nie wiem jak to ugryzc.

Druga sprawa - ladowanie dwoch screenow. Prosty kod ladowania jednej NT, ale jak zaladowac dwie? Scrolling wyglada tak, ale nie wiem jak zrobic dwa osobne ekrany. Dawniej probowalem to w tym demku http://www.siudym.webd.pl/nesasm/nes_demo_2.nes

Kod:
LoadNT1:

LDX #$20
STX $2006
LDX #$00
STX $2006
STY $2006
LDX #$04
LDA #low(NameTable1)
STA <$0000
LDA #high(NameTable1)
STA <$0001

LoadMap1:

LDA [$0000], y
STA $2007
INY
BNE LoadMap1
INC <$0001
DEX
BNE LoadMap1

RTS


NameTable1:

.incbin "test.map1"

NameTable2:

.incbin "test.map2"



Aha moze stare juz, ale tak dawno w temacie nie bylem.

http://nesdev.parodius.com/bbs/viewtopic.php?t=7237&start=0

Polecam, zarypisty TOOL.
Tylko load palety ma 16bajtowy, palety 32bajtowe czyli BGR+SPR nie wczyta, wiec trzeba np. podzielic plik 32 na dwie czesci i load pierwszej czesci BGR. Wczytuje nametable nawet z atrybutami, swietna sprawa do edycji.

Ciekawy tutorial, sporo info:
http://www.nintendoage.com/forum/messageview.cfm?catid=22&threadid=7155


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Marzec 12, 2012, 22:48:40
Cytuj
Jakies pomysly na najprostrze metody skoku? Kombinuje rozne metody ale kiepsko mi idzie, nie wiem jak to ugryzc.
Znaczy?
Użyj "Jmp":P
Hmm..zawsze możesz zrobić tablicę pointerów.
A ten kod chyba masz pod inny kompilator niż NESASM3.Lepiej by było jakbyś zapodał cały kod, bo np. nie wiem co jest w Y przed tym:
Kod:
STY $2006
.Po za tym ja w tym kodzie widzę tylko zapis do jednego NT, żeby załadować do innego trzeba kod powtórzyć z zmienionym adresem na $2006.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Marzec 12, 2012, 22:55:42
Dobra kij w oko, zerkam na stare demka moje i lepiej to juz sobie od nowa poczytam wszytsko niz reanimowanie chaotycznych demek :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: CodAsm Kwiecień 28, 2012, 00:05:51
Siudym pisałeś o animacji postaci, więc wnioskuję, że chodzi Ci o skok ludzika. Trochę sam kiedyś kombinowałem i nie do końca mi to wyszło. Skok postaci jak wiadomo składa się z kilku klatek i w każdej klatce zmieniają się współrzędne x i y postaci:
*x jest inkrementowane/dekrementowane (w zależności, w którą stronę skacze postać)
*y jest zmniejszane/zwiększane wykładniczo (odpowiednio jeżeli postać wznosi się/spada) wg. wzoru:
   a--;     // Zmniejszanie przyśpieszenia przy wznoszeniu postaci
   V=V-a; // Zmniejszenie prędkości o wartość aktualnego przyśpieszenia
   y=y-V; // Zmniejszenie y (wznoszenie się postaci) o wartość aktualnej prędkości
Przy zwiększaniu y oczywiście znaki we wzorach zamieniamy na +, zatem:
   a++;     // Zwiększanie przyśpieszenia przy wznoszeniu postaci
   V=V+a; // Zwiększanie prędkości o wartość aktualnego przyśpieszenia
   y=y+V; // Zmniejszenie y (spadanie postaci) o wartość aktualnej prędkości


Przy tym trzeba utrzymywać znacznik, który określa czy postać jeszcze się wznosi czy już spada.
*Przy wznoszeniu się w górę, w każdej "klatce" skoku zmniejszamy y (bo przesuwamy Sprite'a w górę) o wartość aktualnej prędkości. Prędkość ta jest zmniejszana o wartość aktualnego przyśpieszenia, które z każdą klatką zbliża się do zera. Postać wznosi się coraz wolniej zgodnie z intuicją :)
*Przy spadaniu, w każdej klatce zwiększamy y o wartość aktualnej prędkości, z kolei prędkość jest zwiększana o wartość aktualnego przyśpieszenia, które rośnie. Postać spada coraz szybciej. Po osiągnięciu pewnej stałej maksymalnej wartości przyśpieszenia, przyśpieszenie te jest zerowane.

Jest to wspomniana przez dr88 krzywa balistyczna.

Współrzędne (x,y) rosną podczas spadania i maleją podczas wznoszenia się co jest niezgodne z intuicją, poza tym początkowe położenie postaci to na pewno nie będzie (0,0), więc warto zatroszczyć się o jakąś warstwę, która najpierw wyliczy logiczne współrzędne (x,y), a następnie przetłumaczy je na fizyczne współrzędne ekranu (nic ponad prostą arytmetykę dodawanie/odejmowanie).

Pozostaje jeszcze problem, którego nie rozwiązałem w swoim programie, jednoczesna obsługa przycisku skoku i kursora co wyglądało, jak wyglądało (nie wiem czy widziałeś ten ROM, był kiedyś na forum, jeżeli nie to mogę go poszukać). Nie wiem czy będzie to jasne, ale mam nadzieję, że tak:
*W każdym NMI wywoływana jest warstwa obsługująca joystick, na podstawie, której przechowujesz dane o tym jakie wystąpiły zdarzenia przysków (tak, aby informacja o ruchu była przechowywana dopiero po sprawdzeniu wszystkich przycisków). Mam tu na mysli takie zdarzenia jak przycisk_wciśnięty, przycisk_puszczony itd.
*Po wykonaniu kodu warstwy joypada NMI przechodzi do procedury, tłumaczącej zdarzenia joypada na zdarzenia postaci (czyli np. skok w prawo), właśnie tu wyliczane są współrzędne logiczne postaci za pomocą powyższych wzorów. Jest to robione dla kolejnej klatki położenia postaci.
*Na koniec wykonywana jest warstwa kodu tłumacząca współrzędne logiczne postaci na fizyczne

Jeszcze 2 uwagi:
*Zastosowanie kodu U2 sprawi, że w przedstawionych na początku wzorach na x,y będziesz tylko dodawał (wartości ujemne lub dodatnie, ale jedynie dodawał)
*Cała ta metoda jest uniwersalna i wg. niej można zrobić właściwie cały kod obsługujący pad (i zdarzenia postaci).
_____________________________________________________________________________________
Co do kodu ładującego NameTable fajny jest "scrolling5.asm" z kursu NESASM (BunnyBoy'a). Jest nieco zawiły i przesiedziałem wiele wieczorów zanim go zrozumiałem, ale ma dużo sensu. Kod NMI wykonuje kilka rzeczy:
*Scrolluje ekran (w każdym NMI o 1 piksel, więc co 8 NMI o szerokość jednego Tilesa)
*Ładuje kolumnę NameTable (Jeżeli licznik "scroll" zawinie się do wartości 0 to NT jest przełączana za pomocą "eor")
*Ładuje następną kolumnę AttributeTable (Jeżeli załadowana została odpowiednia ilość kolumn NameTable odpowiadających szerokości półbajta AttributeTable, a więc szerokość 2 Square'ów, (4 Tilesów))
*Wykonuje Transfer DMA Sprite'ów
*Odpowiednio ustawia rejestry PPU_ADDR (starszą i młodszą część) i PPU_SCROLL (starszą i młodszą część)
*Odpowiednio ustawia rejestry konfiguracyjne

Kod ten znajduje się w zipie pod adresem:
http://www.nespowerpak.com/nesasm/nesasmsrc.zip (http://www.nespowerpak.com/nesasm/nesasmsrc.zip)
_____________________________________________________________________________________
Może podane przeze mnie metody nie są proste, ale postanowiłem, że napiszę o tym czego sam uczyłem się metodą prób i błędów. Nie siedzę w żadnych ASM'ach z pół roku, więc przepraszam za wszelkie pomyłki.
_____________________________________________________________________________________
[Edit]: Źródło gry Zooming Secretary napisanej w C na NES:
          http://www.tigsource.com/2012/04/22/zooming-secretary/

                                                Pozdrawiam


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Maj 25, 2012, 00:52:20
___________________________________________________________________________________
Co do kodu ładującego NameTable fajny jest "scrolling5.asm" z kursu NESASM (BunnyBoy'a). Jest nieco zawiły i przesiedziałem wiele wieczorów zanim go zrozumiałem, ale ma dużo sensu. Kod NMI wykonuje kilka rzeczy:
*Scrolluje ekran (w każdym NMI o 1 piksel, więc co 8 NMI o szerokość jednego Tilesa)
*Ładuje kolumnę NameTable (Jeżeli licznik "scroll" zawinie się do wartości 0 to NT jest przełączana za pomocą "eor")
*Ładuje następną kolumnę AttributeTable (Jeżeli załadowana została odpowiednia ilość kolumn NameTable odpowiadających szerokości półbajta AttributeTable, a więc szerokość 2 Square'ów, (4 Tilesów))
*Wykonuje Transfer DMA Sprite'ów
*Odpowiednio ustawia rejestry PPU_ADDR (starszą i młodszą część) i PPU_SCROLL (starszą i młodszą część)
*Odpowiednio ustawia rejestry konfiguracyjne
                                       Pozdrawiam

Tzn ja juz doszedlem jak to zrobic, sposobem banalnym. Ostatnio co znowi siedzialem w ASM wlasnie najwiecej kombinowalem nad mega prostymi rozwiazaniami itd. Na chwile obecna olewam znowu sprawy nesasm.

http://nesdev.parodius.com/bbs/viewtopic.php?t=4456

http://siudym.webd.pl/nesasm/2nt.nes

Kod:

.inesmir 1

JSR LoadNT1

----subrutines----


LoadNT1:

LDX #$20
STX $2006
LDX #$00
STX $2006
STY $2006
LDX #$08                       ;change
LDA #low(NameTable1)
STA <$0000
LDA #high(NameTable1)
STA <$0001

LoadMap1:

LDA [$0000], y
STA $2007
INY
BNE LoadMap1
INC <$0001
DEX
BNE LoadMap1

RTS

---------------------

NameTable1:

.incbin "test.map1"     ;nametable0
.incbin "test.map2"     ;nametable1



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 24, 2013, 15:00:42
Mala prosba o wytlumaczenie mi jednego - chodzi o strukture kodu nesasm, zasady dzialania i zasady przerwan. Bede co jakis czas pewnie teraz debilne pytania zadawal, ale mocno mnie to ciekawi i tez chce pewne sprawy w 100% poukladac w glowie.

Tutaj obrazek prostego kodu nesasm, czyli kod resetu, zaladowanie palety, wywalenie sprite na ekran itd (nie jest caly, tylko poczatek).

(http://img14.imageshack.us/img14/9497/2zy1.jpg)

Co co mi chodzi:
Strzalkami niebieskimi zaznaczone oczywiscie start dzialania kodu po resecie konsoli, konczy sie to nieskoczona petla. Interesuje mnie dokladna zasada dzialania i w jakim przerwaniu to dziala. Przerwanie NMI jest mi znane - kod przerwania NMI jest wykonywany w czasie powrotu "renderingu" konczacego ramke na poczatek i tak 50/60x na sec. Ale jak sie dzieje to po resecie (juz nie chodzi o NMI) ? Czy po wcisnieciu start/reset konsola robi to od razu ladujac ten kod resetu i konczy nieskonczona petla, oraz dlaczego czesto kod resetu/startu jest przerywany czekaniem vblank?  Czy chodzi o to, ze moze nie wyrobic sie w czasie 1/50sec i dlatego wstawiane sa "pauzy" vblank? I jak to sie ma do samego NMI, ktore takze wykonywane jest 1/50sec miedzy renderingiem kodu? Bo oba przerwania RESETU i NMI musza sie zmiescic w czasie.

Ciezko mi to opisac nawet, ale mam nadzieje, ze ktos łebski mega krok po kroku łopatoligicznie opisze :)

Tutaj wogole vblanki sa 2x miedzy czysczeniem ramu, chodzi o to, ze samo czyszczenie moze nie zmiescic sie w "czasie" vblank?

EDIT: Takie uzupelnienie jeszcze po przemysleniu - skoro dopiero pod koniec kodu startu/resetu wlaczane jest przerywanie NMI (bit7 w $2000), to jesli czas przerwania VBLANK nie jest wczesniej wlaczony, to po co wogole wstawianie wczesniej czekanie na vblank?? Skoro NMI wlaczane jest pod koniec zaraz przed infinity loop?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Październik 24, 2013, 17:42:24
Cytuj
jesli czas przerwania VBLANK nie jest wczesniej wlaczony, to po co wogole wstawianie wczesniej czekanie na vblank??
Sam vblank jest nawet, gdy przerwanie jest wyłączone.
Po resecie trzeba poczekać, aż PPU będzie gotowy na zapis do $2006. Nie ma to nic wspólnego z czyszczeniem ramu w pętli clrmem.
http://wiki.nesdev.com/w/index.php/PPU_power_up_state
Kod:
The easiest way to make sure that 29658 cycles have passed, and the way used by commercial NES games, involves a pair of loops like this in your init code:
  bit $2002   ;; clear the VBL flag if it was set at reset time
vwait1:
  bit $2002
  bpl vwait1  ;; at this point, about 27384 cycles have passed
vwait2:
  bit $2002
  bpl vwait2  ;; at this point, about 57165 cycles have passed
Dopiero teraz się o tym dowiedziałem, może dlatego trzeba resetować moje demo zanim ruszy  :chess:

A ja mam inne pytanie:
Kod:
ldx #$ff
txs
Czy to jest potrzebne, jeśli nie przechowuje się na pierwszej stronie niczego oprócz stosu?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 24, 2013, 18:09:28
No ja tez bylem pewny tego, ze vblank jest caly czas, ale dlaczego opisywane jest 7 bit w $2000 jako "turning ON vblank period" ?? Tak jakby sie go dopiero wlaczalo.

Czyli te 2x vblank wait to przeciagniecie nieco czasu startu?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Październik 24, 2013, 19:27:46
Cytuj
dlaczego opisywane jest 7 bit w $2000 jako "turning ON vblank period" ??
Wygląda na wyrwane z kontekstu (albo błąd), ten bit włącza przerwanie. Jeśli ten bit jest ustawiony, to przy każdym vblanku jest wykonywane NMI. Jeśli ten bit nie jest ustawiony, to przy vblanku nic się nie dzieje, można go tylko sprawdzić przez port $2002.
Cytuj
Czyli te 2x vblank wait to przeciagniecie nieco czasu startu?
Tak, żeby dało się załadować paletę do VRAMu.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 26, 2013, 22:02:35
Ok. dzieki.
Wogole znalazlem ciekawy link:
http://skilldrick.github.io/easy6502/

Potrzebuje pomocy i jakiegos wyjasnienia jednej sprawy. Kombinuje (jak kon pod gore) jak w mozliwie prosty sposob, za pomoca NMI zrobic zapeltajace sie sprajty. Chodzi dokladnie o ich poruszanie - a dokladniej np. o poruszenie sie w jednym kierunku, powrot do startu i ponownie to samo doiokola wojtek.

tutaj cely kod:
http://www.siudym.webd.pl/nesasm/loop.zip

Ty wycinek - jak widac kombinacja, trzecia zmiana dalem INC tak z ciekawosci, ale to tylko proba. Jak opisalem - chodzi mi o poprawe i wytlumaczenie jak zrobic to o co mi chodzi. Ogolnie jak zrobic takie wlasnie zmiany poruszania sie i zapetlenia.

Kod:
NMI:

LDA #$00
STA $2003
LDA #$02
STA $4014

JSR Track

RTI

Track:

lda $0203
clc
adc #$01
cmp #$80
beq skip1
sta $0203

rts

skip1:

lda $0200
sec
sbc #$01
cmp #$80
beq skip2
sta $0200

rts

skip2:
inc $0203

rts



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Październik 27, 2013, 00:04:59
Nie zapisujesz koordynatu Y jeśli warunek sprwadzający Y się spełni. Zrób tak:
Kod:
skip2:
sta $0200
inc $0203

rts
Oczywiście sprit będzie leciał w górę aż znów osiągnie pozycję 0x80. Jeśli chcesz by leciał tylko 80 pikseli w górę to musisz zastosować licznik.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 27, 2013, 09:25:22
Dzieki, faktycznie :]

Probowalem licznik, ale nic nie wychodzilo mi. Jak zrobic tutaj licznik aby np. sprite startowal od meijsca lewej strony do konca ekranu, zawrocil i robil to po odpaleniu nonstop? Ogolnie - jak spowodowac aby $203 mozna bylo RAZ okreslona ilosc zwiekszyc, zastopowac i ponownie ale juz zmniejszych wartosc $203 i taka petla nonstop.

Ja probowalem jak widac zrobic tak, ze ustawienie pozycji juz w SPR RAM sprajta, zostalo zwiekszane do pewnej danej wartosci aby poruszal sie, potem konczone calkowicie i wykonywane odwrotnie. Jednak jak 2x cos kombinowalem z zmniejszeniem/zwiekszeniem $0203 to pierdzielilo sie gdyz raz zastopowana po wykonaniu wartosc np. INC z $203, ponownie sie zmieniala. Tzn jak po INC robilo sie DEC to sie oba wykonywaly i stalo to w miejscu albo drgalo itd.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Październik 27, 2013, 11:22:36
Cytuj
Tzn jak po INC robilo sie DEC to sie oba wykonywaly i stalo to w miejscu albo drgalo itd.
Nie widzę kodu, ale zgaduję że dalej porównywałeś do stałej. Zastosuj licznik.
Zakładamy że:

Zmienne:
XGracz-Obecna pozycja Gracza na osi X
YGracz-Obecna pozycja Gracza na osi Y.
XPrawo-Ile pikseli ma pojechać w Prawo
XGora-Ile pikseli ma pojechać w Górę
-XGracz i YGracz to $203 i $200
-Koordynaty są już zapisane do RAMu przed wykonaniem kodu.
-Przed rozpoczęciem kodu w NMI, XPrawo wynosi 0x80(można by zapisać w tym miejscu,
 gdzie zapisujemy koordynaty początkowe gracza.

Pisane na szybko(i tak by profesor nie widział... ;) ), bo jestem na zajęciach na uczelni, ale powinno być ok:
Kod:
NMI:
LDA #$00
STA $2003

LDA #$02
STA $4014 ;Wyslij całą stronę RAMu do pamięci spritów(OAM)

JSR Track ;Ruszaj spritem

RTI

Track:
lda XPrawo
cmp #$00
beq Track.Gora ;skocz, jeśli gracz NIE ma ruszyć sie w prawo.

dec XPrawo ;Zmniejsz licznik poruszania się w prawo
inc XGracz ;zwiększ pozycję gracza na osi X

lda XPrawo ;Sprawdza czy po poruszeniu graczem,
cmp #$00 ;Licznik XPrawo zmienił się na 00.
bne Track.end ;Jeśli nie to skocz...jeśli tak to zostań

lda #$80
sta YGora ;Ustaw licznik dla ruchu w górę.

jmp Track.end ;Skocz do zakończenia poruszania graczem.

Track.Gora: ;Skoczyliśmy tutaj, bo ma się nie ruszać w prawo.
;A to znaczy ze jedyną opcją jest ruch w górę...
dec XGora ;Zmniejsz licznik ruszania się w górę.
dec XGracz ;Zmniejsz pozycję gracza na osi Y.

lda YGora
cmp #$00
bne Track.end ;Jeśli NIE skończyło ruszać graczem w górę...

lda #$80
sta XPrawo ;Ustaw by gracz przejechał 80 pikseli w prawo.

Track.end:
rts ;Zakończ kod ruszania graczem.
Są też inne sposoby, bardziej profesjonalne, ale najpierw ogarnij to.
Wogóle, cieszę sie ze dochodzi kolejny polski koder na NES ;)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Październik 27, 2013, 12:17:05
Dzieki :) Ja wlasnie obecnie staram sie proste metody ogarnac, aby je zrozumiec :)
Kod caly w linku dalem wczesniej, ale ogolnie to co najwazniejsze wkleilem.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: dr00id88 Kwiecień 13, 2014, 15:16:33
http://gutomaia.net/pyNES/


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: retRoben Lipiec 09, 2014, 15:00:32
Można prosić o NesASMPL.pdf ?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Verteks Lipiec 23, 2014, 20:09:27
Panowie, przydałaby mi się wasza pomoc. Nie mam pojęcia, w jaki sposób podmieniać nametable (całe 1KB na raz) - mógłby mi ktoś przedstawić plan działania krok po kroku? Mam dwa ekrany - jeden pełni rolę titlescreenu, a drugi ekranu rozgrywki. Aby odpalić grę, trzeba wcisnąć start. Następnie program ma podmienić całe tło.
Przejrzałem już wiele tutków z NintendoAge i NesDev, dotychczas wszystkie zagadnienia potrafiłem pojąć i zastosować w praktyce, a nad tym siedzę już któryś dzień z kolei studiując kody źródłowe i kombinując, gdzie i jak ładować tło - zawsze skutek jest taki, że program się zawiesza. Znalazłem tyle, że trzeba wyłączyć renderowanie ekranu w $2001, dodatkowo trzeba stworzyć zmienną, która wyskakuje z NMI, gdy program jest zajęty. Do tego mam już przygotowaną procedurę ładującą tło z odpowiedniego adresu zapisanego w tablicy na podstawie zmiennej - tylko nie mam, co z nią zrobić oprócz załadowania pojedynczego ekranu.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 24, 2014, 11:10:41
Nie bardzo rozumiem. Aktywne nametable można wybierać dwoma najmłodszymi bitami portu $2000.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Verteks Lipiec 24, 2014, 11:50:04
Kod z danymi poszczególnych nametable:
Kod:
.bank 1
  .org $E000
nametableStart:
  .incbin "NAM/titleflower.nam"
nametableRoom1:
  .incbin "NAM/room1.nam"

gamerooms:
  .dw nametableStart
  .dw nametableRoom1
Pliki *.nam, to nametable o rozmiarach 32x30 + atrybuty (całość to 1KB). Na razie są dwa, ale będzie ich więcej.
Na początku programu ładuję nametable spod adresu nametableStart (JSR LoadBackground):
Kod:
vblankwait2:       ; First wait for vblank to make sure PPU is ready
  BIT $2002
  BPL vblankwait2

  JSR LoadBackground

  LDA #%10010000   ; enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
  STA $2000

  LDA #%00011110   ; enable sprites, enable background, no clipping on left side
  STA $2001

  LDA #TITLESCREEN
  STA gamemode
  ... ; dalej jest pętla główna programu
Podprogram LoadBackground ładuje całe nametable (1KB) spod adresu nametableStart w ten sposób:
Kod:
LoadBackground:
  LDA #$01
  STA updating_background              ;"disable" NMI

  LDA #%00000110                       ;disable sprites, disable background, no clipping on left side
  STA $2001

  LDA $2002             ; read PPU status to reset the high/low latch
  LDA #$20
  STA $2006             ; write the high byte of $2000 address
  LDA #$00
  STA $2006             ; write the low byte of $2000 address

  LDY gameroom
  LDA gamerooms, y ; Laduje adres wskazujacy na poczatek danego nametable
  STA pointerLo       ; put the low byte of the address of background into pointer
  ; INY po to, aby zaladowac adres konczacy dane nametable
  LDA gamerooms+1, y ; Laduj adres wskazujacy na koniec danego nametable (ktory zarazem jest poczatkiem kolejnego nametable)
  STA pointerHi       ; put the high byte of the address into pointer

  LDX #$00            ; start at pointer + 0
  LDY #$00
OutsideLoop:
 
InsideLoop:
  LDA [pointerLo], y  ; copy one background byte from address in pointer plus Y
  STA $2007           ; this runs 256 * 4 times
 
  INY                 ; inside loop counter
  CPY #$00
  BNE InsideLoop      ; run the inside loop 256 times before continuing down
 
  INC pointerHi       ; low byte went 0 to 256, so high byte needs to be changed now
 
  INX
  CPX #$04
  BNE OutsideLoop     ; run the outside loop 256 times before continuing down

  LDA #$00                             ;"enable" NMI
  STA updating_background

  RTS
Mój problem polega na tym, że JSR LoadBackground jest wykonywane tylko raz - dla pierwszego ekranu i nie wiem, gdzie po raz kolejny wstawić JSR LoadBackground, żeby podmienić całą zawartość jednej z dwóch nametable. Próbowałem umieścić w głównej pętli programu, bądź w NMI, ale program zawsze łapię zwieche po przesłaniu ~180 bajtów.
W żołnierskich słowach - mam kilka nametable i w trakcie działania programu chce je w całości podmieniać (program nie używa przewijania tła).



Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Lipiec 24, 2014, 12:07:50
gameroom jest ustawione na 2?
NMI nie psuje zawartości rejestrów?

edit: odtwarzanie muzyki mogłoby też nadpisywać wskaźnik.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Lipiec 24, 2014, 14:13:52
Tak, jak pisze koksu. Jeśli zechcesz załadować drugi ekran, to musi mieć on numer 02. Trzeci będzie miał numer 04, czwarty 06 itp. To dlatego że w tablicy pointerów jeden ekran to dwa bajty.
Choć, oczywiście możesz zrobić:
Kod:
LDA gameroom
 ASL A
 TAY
 LDA gamerooms, y ; Laduje adres wskazujacy na poczatek danego nametable
Wtedy każdy pokój będzie miał każdy kolejny numer.

Przydałoby się jakbyś podał też co się dzieje w NMI. Albo w ogóle cały zip z plikami projektu.

Cytuj
program zawsze łapię zwieche po przesłaniu ~180 bajtów.
Ciężko to stwierdzić bez pełnego kodu, ale powinieneś zawsze wyłączyć ekran przed wypisywaniem czegokolwiek do PPU (Grafika, palety, nametable, atrybuty)...czekanie na Vblank też by było przydatne.
A co do samego czekania na Vblank, to słyszałem że sposób którego używasz może być zawodny. Nie, nie na emulatorach, tylko na prawdziwym sprzęcie. Lepiej jest ustawić zmienną na koniec NMI, czyli coś takiego:

Kod:
NMI:
;;;;kod NMI;;;;;
 inc Vblank

 rti
A potem przy czekaniu na Vblank:
Kod:
VbWait:
 lda #$00
 sta Vblank
VbWait.loop:
 lda Vblank
 beq VbWait.loop

 rts

Chcesz podmienić nametable po naciśnięciu start?
Pseudocode, bo nie mam twoich źródeł i nie wiem co jak się nazywa:
Kod:
Pętla główna:
 Czekaj na Vblank
 Czyść sprity
 Ustaw sprity
 Sprawdź sterowanie
    jeśli naciśnięto START to skocz do "Zmiana ekranu"

 Skocz do "Pętla główna"

Zmiana ekranu:
 Wyłącz ekran
 Czekaj na Vblank
 Załaduj nowe Nametable
 Czekaj na Vblank
 Włącz ekran

 Skocz do...;;;;;;;;;;;;;gdzies tam, bo nie wiem, co ma dalej się dziać
Mam nadzieję, że odpisałem w miarę zrozumiale, co dość rzadko mi się zdarza...;\


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Verteks Lipiec 24, 2014, 15:24:18
Wygląda na to, że program działa jak należy - Koks podał rozwiązanie problemu. Ustawiałem gameroom na 1, a nie na 2 - zapomniałem o tym, że to dwubajtowe "słowo".

...NMI nie psuje zawartości rejestrów?

edit: odtwarzanie muzyki mogłoby też nadpisywać wskaźnik.
Dźwiękami się jeszcze nie bawiłem.
1. Co masz na myśli pisząc psucie zawartości rejestrów? Aby się przed tym ochronić, to trzeba przy wywołaniu przerwania NMI odkładać wartości rejestrów i przywracać po wyjściu? Czy mylę pojęcia?
2. W jaki sposób odtwarzanie muzyki może nadpisać wskaźnik?

A co do samego czekania na Vblank, to słyszałem że sposób którego używasz może być zawodny. Nie, nie na emulatorach, tylko na prawdziwym sprzęcie. Lepiej jest ustawić zmienną na koniec NMI, czyli coś takiego...
A to nie wiedziałem, wiele kodów z przykładami które studiowałem ma czekanie na VBlank na początku NMI.

Chcesz podmienić nametable po naciśnięciu start?
Pseudocode, bo nie mam twoich źródeł i nie wiem co jak się nazywa:
Kod:
Pętla główna:
 Czekaj na Vblank
 Czyść sprity
 Ustaw sprity
 Sprawdź sterowanie
    jeśli naciśnięto START to skocz do "Zmiana ekranu"

 Skocz do "Pętla główna"

Zmiana ekranu:
 Wyłącz ekran
 Czekaj na Vblank
 Załaduj nowe Nametable
 Czekaj na Vblank
 Włącz ekran

 Skocz do...;;;;;;;;;;;;;gdzies tam, bo nie wiem, co ma dalej się dziać
Mam nadzieję, że odpisałem w miarę zrozumiale, co dość rzadko mi się zdarza...;\
W moim kodzie rolę "Zmiana ekranu" pełni podprogram LoadBackground (patrz mój ostatni post, ostatni kod). Zamiast czekania na VBlank mam tą zmienną updating_background. Tak to wygląda:
Kod:
NMI: ; początek NMI, te komendy poniżej są od razu na początku, gdy ekran ma być odświeżany
  LDA updating_background          
  BNE skip_graphics_updates
Kod:
LoadBackground:
  LDA #$01
  STA updating_background              ;"disable" NMI
  ... ; procedura ładowania tła
  LDA #$00                             ;"enable" NMI
  STA updating_background
Jaka jest różnica pomiędzy metodą powyższą, a zastosowaniem dwóch VBlank'ów? Rozumiem, że dwa VBlanki pełnią przy ładowaniu backgroundu taką samą rolę jak po resecie?


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 17, 2014, 21:25:55

Czy ktos moze zna jakis temat na forum.nesdev czy innych gdzie poroszono i rozpisano nieco sprawy skakania sprite'a? Chce jakos ugryzc temat, ale nie wiem od czego zaczac. Przydalaby sie jakas rozpiska czy ogolna schematyka skoku co i jak. Za wszelkie info z gory dzieki.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Listopad 18, 2014, 01:27:39
Żeby gracz\obiekt mógł skakać najpierw musisz mieć jakąś formę grawitacji. Na początek sprawdzaj czy tiles pod obiektem jest pusty, jeśli tak to dodawaj do pozycji Y obiekty. Jak już to będziesz miał, to wtedy możesz zrobić skakanie.
Najpierw sprawdzanie czy gracz powinien skoczyć.
Kod:
1.Sprawdź czy gracz nacisnął skok
     Jeśli nie, idź do punktu 4
     Jeśli tak, kontynuuj
2.Sprawdź, czy gracz stoi na jakimś bloku\drabinie czy czymś.
     Jeśli nie, idź do punktu 4
     Jeśli tak, kontynuuj
3.Nadaj jakieś zmiennej jakąś wartość (np. 10)
4.Zakończ funkcję

A potem tylko:
Kod:
1.Sprawdzaj czy rzeczona zmienna większa niż zero
     Jeśli nie, idź do punktu 5
     Jeśli tak, kontynuuj
2.Sprawdź czy nad głową gracza jest jakiś blok(nie pusty tiles)
     Jeśli tak, idź do punktu 6
     Jeśli nie, kontynuuj
3.Odejmij od koordynatu Y obiektu (Obiekt bedzie się wznosił do góry)
4.Odejmij jeden (lub więcej) od zmiennej do której zapisałeś w poprzedniej funkcji.
5.Zakończ funkcję

6.Zapisz 0 do zmiennej do której wcześniej zapisałeś 10.
7.Zakończ funkcję

Używając takiego kodu, obiekt bedzie skakał na wysokość 10 pikseli.

Jest to najprostsza metoda jaką mogę wymyślić, jak coś, to pytaj śmiało.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 22, 2014, 19:06:57
Dzieki - najpierw o cos takiego mi chodzilo.

Interesuje mnie metoda skoku Jet Set Willy.
http://www.youtube.com/watch?v=55kya95mvPM

W koncu dobry programik do nametable znalazlem - 8nam, kiedys go uzywalem, ale zapomnialem o nim calkiem. Nawet wygodny i uzywa NT ATTR.

(http://s8.postimg.org/fz8vyeizn/ness.png)
Na szybko ekranik namalowany.

EDIT:
Sporo zapomnialem przez ten czas, dzis siedzialem nieco grzebiac w nesasm. A takie demko sklecilem ograniczajace ruch obiektu.
https://www.dropbox.com/s/atitvfwjh264tno/democage.nes?dl=0
(http://s18.postimg.org/5uucmat3t/ness2.png)

Demko pokazujace plynne animowanie roznych SPR - wczesniej mialem problem, bo udalo mi sie zrobic to tylko z pierwszym SPR, a kolejne juz nie. Teraz jest ok i mozna nimowac dowolna ilosc.
https://www.dropbox.com/s/dpz58trf2zfgjt2/anim.nes?dl=0
(http://s11.postimg.org/8iza8pn2b/animnes.jpg)

http://www.youtube.com/watch?v=9T3a4l10MHA


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 26, 2014, 01:56:43
Niestety jestem kiepski z nauk scislych, ale powoli coraz wiecej ogarniam. Obecnie rozgryzam temat grawitacji. Na ta chwile proste efekty, ale zawsze do przodu :)

https://www.dropbox.com/s/4ajxpj8disqyt51/gravity.nes?dl=0
(http://s8.postimg.org/f5rdd2rud/gravity.png)
http://www.youtube.com/watch?v=ezoGgV2_BsE

Demko pokazujace skaczacego SPRITE'a. Taki wstepny silnik umozliwiajacy skakanie postacia.
https://www.dropbox.com/s/kcznyiy1vxxp854/jumper.nes?dl=0
http://www.youtube.com/watch?v=xvOEraXZJY8

Demo pokazujace skaczacego SPRITE jak wyzej +  wczesna wersja detekcja kolizji z potworkiem (sa bugi, ale to pierwszy raz). Skaczac go omijamy, jak dotyka giniemy o resetuje sie od nowa.
https://www.dropbox.com/s/lxopqu3i0cn3546/jumperenemy.nes?dl=0
(http://s15.postimg.org/7u88solln/enemy.png)
http://www.youtube.com/watch?v=cE_886mLXJs


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Hilfer Listopad 27, 2014, 17:34:18
Hmm może nie do końca NES,ale postaram się jakoś wrzucić książkę co znalazłem Jan Ruszyc - "Informatyka mikrokomputerowa - Asembler 6502" jako pdf , książka z mojej uczelnianej biblioteki jako jedyna o 6502, limity czasowe mnie wkurzają, więc zrobię pdf :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 27, 2014, 20:13:07
Przeciez ona w necie jest dostepna bezproblemowo, czy to PDF czy TXT lub DJV. Google wypluwa pelno linkow.
Ja mam swoja kiedys zakupiona, ale wersja elektroniczna przydatna bo nie zawsze ma sie pod reka.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Hilfer Listopad 27, 2014, 20:33:40
Przeciez ona w necie jest dostepna bezproblemowo, czy to PDF czy TXT lub DJV. Google wypluwa pelno linkow.
Ja mam swoja kiedys zakupiona, ale wersja elektroniczna przydatna bo nie zawsze ma sie pod reka.

Wybacz Siudym, lecz szukałem kiedyś i nic nie znalazłem sama kupa :) Wolę, więc właśnie wstawić tutaj :)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 27, 2014, 20:47:43
Z 6502PL polecam bardzo przyjaznie opisany tutek:
http://c64power.com/index.php/artykuly/45-assembler

Co do ksiazki:
http://atarionline.pl/biblioteka/materialy_ksiazkowe/Asembler%206502%20(v1).pdf
http://tajemnice.atari8.info/ksiazki/zipped/Asembler_6502_oryginalna.zip
http://tajemnice.atari8.info/ksiazki/zipped/Asembler_6502_poprawiona.zip
http://www.serious-dial.atari.pl/pliki/ksiazki/pl/Asembler_6502.zip
http://atarionline.pl/biblioteka/materialy_ksiazkowe/Jezyki_Atari%20XL_XE_cz.1.djvu

A tu fajna ksiazka, ktora tez posiadam kiedys kupiona:
Microprocesor 6502 i jego rodzina.
http://www.serious-dial.atari.pl/pliki/ksiazki/pl/Microprocesor_6502.zip
Bardziej sprzetowo 6502, ale warto miec.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: mustwearkhakies Listopad 27, 2014, 23:36:45
Kod:
Siudym wrócił do kodowania! YESSSSSss!!!1

Dobra robota Siudym, oby tak dalej, od zawsze podobały mi się Twoje klimaty, heh, mam nadzieje, że dasz radę coś przed/na zlot napisać i nam zaprezentować ;-)


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: siudym Listopad 29, 2014, 22:18:34
Bardzo prosta mini gra, jest zabugowana :D :crazy: I tak sam siebie podziwiam, ze cokolwiek ogarniam w NESASM.
https://www.dropbox.com/s/91nb9oicsstmo57/hide%21game.nes?dl=0 (https://www.dropbox.com/s/91nb9oicsstmo57/hide%21game.nes?dl=0)
(http://s30.postimg.org/5uvenn5ep/hidegame2.png)(http://s30.postimg.org/fgoz3xwkh/hidegame1.png)
http://www.youtube.com/watch?v=zO_V-4_Joig

Demko przedstawiajace inne skakanie sprite. Nic specjalnego, ale staralem sie aby skok wzglednial wzniesienie, spadal sam z niego itd. Jest masa bledow:
https://www.dropbox.com/s/uuymjikryb0b5xj/jmpspr2.nes?dl=0 (https://www.dropbox.com/s/uuymjikryb0b5xj/jmpspr2.nes?dl=0)
(http://s9.postimg.org/hjrbkdrin/jumpoingsprite.png)
http://www.youtube.com/watch?v=Sud-1BVGXlg

A to demko "MULTI ROOM WALKER" - albo Multi NT Load :) Tu idziemy SPRITE'm przez 8 NameTables:
https://www.dropbox.com/s/nkpa2awh28md028/multiroom.nes?dl=0 (https://www.dropbox.com/s/nkpa2awh28md028/multiroom.nes?dl=0)
(http://s1.postimg.org/jxiisj3a7/multiroom.png)
http://www.youtube.com/watch?v=Stpx8KbOEyY

Pseudo-DualBGR demo:
(dzieki D9 za fix)
https://www.dropbox.com/s/7rj8yz5fbb7iyj6/dualbgrscrl.nes?dl=0 (https://www.dropbox.com/s/7rj8yz5fbb7iyj6/dualbgrscrl.nes?dl=0)
https://www.dropbox.com/s/5ns070yt1pa5eo2/demoscrl2.nes?dl=0 (https://www.dropbox.com/s/5ns070yt1pa5eo2/demoscrl2.nes?dl=0)
(http://s23.postimg.org/l2zls1tej/dualbgr.png)

http://www.youtube.com/watch?v=Kd2KfLNNvZY


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Mejs Styczeń 27, 2015, 19:04:50
Siema, uczę się assemblera z tutka Nerdy Nights i utknąłem delikatnie na czwartym tygodniu.

Kod:
 .inesprg 1   ; 1x 16KB PRG code
  .ineschr 1   ; 1x  8KB CHR data
  .inesmap 0   ; mapper 0 = NROM, no bank swapping
  .inesmir 1   ; background mirroring
  

;;;;;;;;;;;;;;;

    
  .bank 0
  .org $C000
RESET:
  SEI          ; disable IRQs
  CLD          ; disable decimal mode
  LDX #$40
  STX $4017    ; disable APU frame IRQ
  LDX #$FF
  TXS          ; Set up stack
  INX          ; now X = 0
  STX $2000    ; disable NMI
  STX $2001    ; disable rendering
  STX $4010    ; disable DMC IRQs

vblankwait1:       ; First wait for vblank to make sure PPU is ready
  BIT $2002
  BPL vblankwait1

clrmem:
  LDA #$00
  STA $0000, x
  STA $0100, x
  STA $0300, x
  STA $0400, x
  STA $0500, x
  STA $0600, x
  STA $0700, x
  LDA #$FE
  STA $0200, x    ;move all sprites off screen
  INX
  BNE clrmem
  
vblankwait2:      ; Second wait for vblank, PPU is ready after this
  BIT $2002
  BPL vblankwait2



; ************** NEW CODE ****************
LoadPalettes:
  LDA $2002    ; read PPU status to reset the high/low latch
  LDA #$3F
  STA $2006    ; write the high byte of $3F00 address
  LDA #$00
  STA $2006    ; write the low byte of $3F00 address
  LDX #$00
LoadPalettesLoop:
  LDA palette, x        ;load palette byte
  STA $2007             ;write to PPU
  INX                   ;set index to next byte
  CPX #$20            
  BNE LoadPalettesLoop  ;if x = $20, 32 bytes copied, all done


SPRAJT1:
  
  LDA #$80
  STA $0200        ; put sprite 0 in center ($80) of screen vert
  LDA #$80
  STA $0203        ; put sprite 0 in center ($80) of screen horiz

  LDA #$01
  STA $0201        ; tile number = 1
  LDA #$01
  STA $0202        ; color = 0, no flipping

  LDA #%10000000   ; enable NMI, sprites from Pattern Table 0
  STA $2000

  LDA #%10010000   ; enable sprites
  STA $2001
  LDA #$00

SPRAJT2:
  
  LDA #$AA
  STA $0204        ; put sprite 0 in center ($80) of screen vert
  LDA #$10
  STA $0207        ; put sprite 0 in center ($80) of screen horiz

  LDA #$00
  STA $0205        ; tile number = 0
  LDA #$14
  STA $0206        ; color = 0, no flipping

 
  JMP SPRAJT1



 

NMI:

  

  LDA #$00
  STA $2003  ; set the low byte (00) of the RAM address
  LDA #$02
  STA $4014  ; set the high byte (02) of the RAM address, start the transfer



  RTI        ; return from interrupt
 
;;;;;;;;;;;;;;  
  
  
  
  .bank 1
  .org $E000
palette:
  .db $0F,$31,$32,$33,$0F,$35,$36,$37,$0F,$39,$3A,$3B,$0F,$3D,$3E,$0F
  .db $0F,$1C,$15,$14,$0F,$02,$38,$3C,$0F,$1C,$15,$14,$0F,$02,$38,$3C


  .org $FFFA     ;first of the three vectors starts here
  .dw NMI        ;when an NMI happens (once per frame if enabled) the
                   ;processor will jump to the label NMI:
  .dw RESET      ;when the processor first turns on or is reset, it will jump
                   ;to the label RESET:
  .dw 0          ;external interrupt IRQ is not used in this tutorial
  
  
;;;;;;;;;;;;;;  
  
  
  .bank 2
  .org $0000
  .incbin "mario.chr"   ;includes 8KB graphics file from SMB1

No i jaki mam problem? Ładnie wyświetla mi sprajty tam gdzie chce ale po załadowaniu %10010000 w adres $2001 kolor tła nie zmienia się.
W dodatku nie potrafię zmienić koloru sprajtów, wpisuje różne wartości w $0206 i $0202 i tylko przy $01 odwraca mi kolory, innego efektu nie uzyskałem.

Link do tutka: http://nintendoage.com/forum/messageview.cfm?catid=22&threadid=6082


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Koks Styczeń 27, 2015, 19:42:34
po załadowaniu %10010000 w adres $2001 kolor tła nie zmienia się.
Może dlatego, że tło nie jest wyświetlane?

wpisuje różne wartości w $0206 i $0202 i tylko przy $01 odwraca mi kolory
W drugiej cyfrze (szesnastkowo) jest sens ustawiać tylko 0-3, poza tym pierwsze dwie palety są identyczne z drugimi dwiema:
.db $0F,$1C,$15,$14,$0F,$02,$38,$3C,$0F,$1C,$15,$14,$0F,$02,$38,$3C


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Mejs Styczeń 27, 2015, 21:06:05
Dziękuję Koksu! Dzięki Twoim poradom na czacie udało mi się zrobić prostą animację. Sprite patroluje obszar 10 pikseli.

Cytuj
POZYCJE: ;pozycje początkowe
  LDA #$80
  STA $0505
  STA $0506
  STA $0502
  JMP SPRAJT1

MAGIA: ;program idący w góre
  LDX $0506
  DEX
  CPX #$80 ;sprawdzamy czy ludzik wrócił na miejsce
  BEQ RESET
  STX $0506

SPRAJT1:
 
  LDA $0506
  STA $0200        ; put sprite 0 in center ($80) of screen vert
  LDA $0502
  STA $0203        ; put sprite 0 in center ($80) of screen horiz

  LDA #$01
  STA $0201        ; tile number = 1
  LDA #$00
  STA $0202        ; color = 0, no flipping

  LDA #%10010000   ; enable NMI, sprites from Pattern Table 0
  STA $2000

  LDA #%01010000   ; enable sprites
  STA $2001
  LDA #$00
  
  JMP SPRAJT1

NMI:
 
  

  LDA #$00
  STA $2003
  LDA #$02
  STA $4014

  LDA $0505
  CMP #$90 ; sprawdzamy czy doszedł do dolnej granicy
  BEQ MAGIA

  INC $0505 ; jeśli nie, przesuwamy go w dół
  LDA $0505


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: 1990in1 Październik 28, 2015, 23:44:08
Co roku na famiconach są prezentowane (czasem HWowe), Koks ma w podpisie tyż.


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: Dizzy9 Listopad 13, 2015, 22:48:06
Gdyby ktoś był zainteresowany, to podaję link to kodu źródłowego który napisałem dla siudyma do nauki. Myślę że można się z kodu nieco nauczyć....mamy wykrywanie kolizji między obiektami, wykrywanie kolizji z tłem, sposób an obsługę obiektów, wczytywanie danych z tablic pointerów, obsługa pada itp itd.
Grafikę wykonał Siudym (obecnie "sdm" na tym forum).
https://dl.dropboxusercontent.com/u/1309313/NES%20Proj/Engine/a_e2.rar


Tytuł: Odp: Programowanie Nes'a (procesora 6502)
Wiadomość wysłana przez: ramagus Grudzień 19, 2016, 14:55:24
wznowienie książki o assemblerze 6502 dla atari, jak pisał siudym przyda się w programowaniu na Nes'a i pegasusa, nakład ograniczony śpieszcie się!

http://allegro.pl/show_item.php?item=6648915659&snapshot=MjAxNi0xMi0xOVQwNToyNTozMVo7YnV5ZXI7ZjIwMDA3MmQ1NzkzNjM3MTAwN2E4NjEyOGU0YThjZTY2ZmVjM2Y3ZWFiNmY2NmY0ZTU2YzFhMDNiYWVhNjAzMg== (http://allegro.pl/show_item.php?item=6648915659&snapshot=MjAxNi0xMi0xOVQwNToyNTozMVo7YnV5ZXI7ZjIwMDA3MmQ1NzkzNjM3MTAwN2E4NjEyOGU0YThjZTY2ZmVjM2Y3ZWFiNmY2NmY0ZTU2YzFhMDNiYWVhNjAzMg==)