Programmation NES (dendy), assembleur 6502

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 ( ), .





  1. - 16 4 4 . .





  2. Nametable - 3230 , , 2 , 2 4- 4 . , , .





  3. - 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.








All Articles