Depuis l'enfance, je rêvais d'écrire un jeu pour la console dandy bien-aimée, au fil du temps, le rêve est apparu puis s'est éteint à nouveau. Elle m'a orienté vers la magie de la programmation, et maintenant plus de 20 ans se sont écoulés, je suis programmeur, et encore une fois j'essaie de comprendre la magie de ce très dandy qui a tellement excité mon imagination dans une enfance difficile mais heureuse. Aujourd'hui, je vais vous raconter comment j'ai appris les secrets de cette magie, j'ai finalement pu afficher des sprites à l'écran et appris à dessiner un arrière-plan.
php , assembler , assembler api . Dendy ( NES, Famicom), , , , . ():
1. CPU -
2. PPU -
3. APU -
, PPU . , 2 CHR ( ) . 0- 1-, 88, 2- . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 0 0 + 1 1 1 1 1 1 1 1
0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0
0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0
0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0
, 3- :
0 + 0 = 0 -
0 + 1 = 1 -
1 + 1 = 2 -
1 + 0 = 3 -
, background 4 , 3-. , 1- .
, , A, X, Y. X, Y . A.
LDA {argument} - A argument ( #20, hex #$20, %00010010)
STA {address} - A ( ppu )
X Y
LDX {argument} - X
LDY {argument}
STX {address} - X
STY {address} - Y
INX - increment X
INY - increment Y
CPX {argument} - x
CPY {argument} - y
:
JMP {address} - BEQ {address} - CPX true BNQ {address} - CPX
, :
?
?
NES, PAL 256x240, NTSC 256x224. 88, 3230 PAL, NTSC . , 3 : , nametable ( ), .
- 16 4 4 . .
Nametable - 3230 , , 2 , 2 4- 4 . , , .
- nes 3232 22 , 88 , 1 , %00000000. 2 2 .
-----------------
| 0 | 1 |
-----------------
| 2 | 3 |
-----------------
, , . 2 :
00 - 0- 4-
01 - 1-
11 - 2-
10 - 3-
nes
, , , X PPU $2005 X Y, .
LDA #25 ; X
STA $2005 ; #25
LDA #00 ; 0 Y
STA $2005 ; #0
LDA #100 ; Y
STA $2004 ; OEM data PPU
LDA #00 ; ( )
STA $2004 ;
LDA #%00010111 ;
; ,
STA $2004 ;
LDA #192 ; Y
STA $2004 ;
88 6. , $2000 - $2400 , $2400 - $2800 . nametable.
LDA #$20 ;
STA $2006 ; 2
LDA #$00 ;
STA $2006
, X Y, .
LDA $24 ; CHR
STA $2007 ;
;
, ,
LDX #00 ; 0 x decimal #$00 - #$FF
section:
;
LDA $24
STA $2007
CPX #255
INX
BNE section
255 255 , . Y 4 . , $3F00-$3F0F - 16 . nametable
LDA #$3F ; $3F
STA $2006
LDA #$00 ;
STA $2006
LDA $22 ; nes
STA $2007 ; $3F00
LDA $05 ;
STA $2007 ; $3F01
; 14
16 16
background_pallete:
.byt $01, $02, $03, $04
.byt $05, $22, $23, $24
.byt $25, $26, $27, $28
.byt $31, $32, $33, $34
LDX #$00 ; x 0
LDA #$3F ; $3F
STA $2006
LDA #$00 ;
STA $2006
loadPallete:
LDA background_pallete, x ; background_pallete
; , x +1
STA $2007 ;
CPX #$0F ; X 16
INX ; X = X+1
BNE loadPallete ; X 16
;
, $23C0 - $23FF $23C0, $23C8 8 8 .
, , , , , $2007
LDA #$23
STA $2006
LDA #$C2
STA $2006 ; $23C2
LDA %00001100 ; ,
STA $2007 ;
Ainsi, afficher l'arrière-plan se transforme en une tâche assez banale, résultat de 2 semaines d'étude du sujet des assembleurs que vous avez vu dans la capture d'écran dans le titre de l'article. En fait, l'assembleur nes n'est pas si compliqué si l'on brise les stéréotypes de programmation que l'on utilise actuellement, et il est plus facile de regarder tout ça quand vient le moment de comprendre qu'il est possible pour un assembleur d'accéder à une zone mémoire disponible pour écrivez-y quelques informations, qui s'afficheront alors comme par magie à l'écran ... C'est une petite victoire sur soi-même, un petit pas vers un rêve. Merci à tous pour votre attention et à bientôt.