子供の頃から、愛するダンディコンソール用のゲームを書くという夢がありました。時間が経つにつれて、その夢が現れ、そして再び消えていきました。彼女は私にプログラミングの魔法を教えてくれました。20年以上経ちましたが、私はプログラマーです。また、困難でありながら幸せな子供時代に私の想像力を刺激した非常にダンディな魔法を理解しようとしています。今日は、この魔法の秘密をどのように学んだかをお話しします。ついに、画面にスプライトを表示し、背景を描く方法を学びました。
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 ;
したがって、背景を表示することは、記事のタイトルのスクリーンショットで見たアセンブラーのトピックを2週間研究した結果、かなり簡単な作業になります。実際、現在使用しているプログラミングのステレオタイプを破れば、アセンブラnesはそれほど複雑ではなく、アセンブラが使用可能なメモリ領域にアクセスできることが理解できるようになると、これらすべてを簡単に確認できます。そこにいくつかの情報を書き込むと、魔法のように画面に表示されます... これは自分に対する小さな勝利であり、夢への小さな一歩です。ご清聴ありがとうございました。またお会いしましょう。