Sejak kecil, saya memiliki mimpi untuk menulis game untuk konsol pesolek kesayangan, seiring berjalannya waktu, mimpi itu muncul dan kemudian mereda lagi. Dia mengarahkan saya pada keajaiban pemrograman, dan sekarang lebih dari 20 tahun telah berlalu. Saya adalah seorang programmer, dan sekali lagi saya mencoba untuk memahami keajaiban pesolek yang begitu menggairahkan imajinasi saya di masa kanak-kanak yang sulit tapi bahagia. Hari ini saya akan memberi tahu Anda bagaimana saya mempelajari rahasia sihir ini, akhirnya saya bisa menampilkan sprite di layar dan belajar cara menggambar latar belakang.
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 ;
Jadi, menampilkan background berubah menjadi tugas yang agak sepele, hasil dari 2 minggu mempelajari topik assembler yang anda lihat di screenshot di judul artikel. Faktanya, assembler tidak begitu rumit jika kita mematahkan stereotip pemrograman yang kita gunakan sekarang, dan lebih mudah untuk melihat semua ini ketika saatnya tiba untuk memahami bahwa adalah mungkin bagi assembler untuk mengakses area memori yang tersedia untuk tulis beberapa informasi di sana, yang kemudian secara ajaib akan ditampilkan di layar ... Ini adalah kemenangan kecil atas diri sendiri, langkah kecil menuju mimpi. Terima kasih atas perhatiannya dan sampai jumpa.