|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下6 H' I' F9 ~1 e$ m% m O

* i/ e( X% P* j1 S! n0 x" g以下是主框架代码:
. ~4 {1 C8 l7 k7 i) R% [5 E- ;======================================================================% H& C( \; A" u, R1 s
- ;文件头9 U0 ?( Q3 D: E+ V7 v" C( y. U% K
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 r, g4 c8 ]6 t1 k5 z! E0 d: u
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
% a0 J+ Z$ i9 ^6 F - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
# B3 c% z, Q+ Q1 B& X5 A9 W - ;======================================================================7 n8 d& U. j% j9 I
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
3 X& f& D1 I4 v& ]8 j, ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
/ I" J- S2 `4 O. y. }9 i4 H - ;======================================================================' Z$ [9 c- V7 y+ H( D
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 Y: i" \% M3 N: ^! p* b
- RESET_ADDR = $E000 ;主程序起始地址
" B4 B4 ]8 Z$ y- z - ;======================================================================
2 C% Z2 o- R$ ~+ W/ L - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB# W+ u) F; `! s0 y3 A7 a# T* j# ?
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB m8 y4 i Y* S
- .INESMAP 4 ;Mapper号 (0-4095)
4 J H& m7 s x - .INESSUBMAP 0 ;子Mapper号 (0-15)
$ M9 _+ G8 t0 S - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)! V& l3 A" D+ d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)" k4 ?5 I& ]6 i {
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
+ V: H* _8 \; n4 |) ^ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)# R: B* r4 J8 i3 p
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- v, L/ Q* o$ t5 T2 f, }3 b, j& M
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, B+ _3 b1 P9 d/ }, ?( {! C - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
6 Q y, I0 I% O4 d - ;======================================================================0 L7 {& J# d2 r2 q7 F: P
- .INCLUDE "fc_demo_config.asm" ;全局配置
* o# p% k( g3 ^5 k- x - .INCLUDE "fc_demo_constant.asm" ;NES常量
" w: w" |1 B$ Q8 C% y a! X - ;======================================================================: c7 O5 o+ @- f" l' L
- ;音乐配置
+ C* V& l4 }3 }- U/ E5 r7 w - .IF 0 = MUSIC_THEME
6 F3 p6 N5 n7 m9 W5 F0 o - .INCLUDE "data/music/Gremlin 2/config.asm", @6 X* Z' y/ n' L/ x
- .ENDIF# ] L, j4 k' g) B" {" E
- I) D9 \6 v* G5 {8 }4 a: H! A
- .IF 1 = MUSIC_THEME
+ o' P4 }$ Q0 X% J/ |- e. ` - .INCLUDE "data/music/Raf World/config.asm"! {, @ X$ ^- R* j# H. o1 r
- .ENDIF
: Z- ^$ W, G# S" b. G% g - / H2 U; l3 \# _& W2 N# b! I) i
- .IF 2 = MUSIC_THEME
& \6 y5 R- @4 T) ], K7 o$ @# h - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
+ q& C0 E( X0 E0 B( I' G& b - .ENDIF
' z. p1 X; i3 m6 U- c - ) m9 p* g6 {- e: d: A
- ;======================================================================6 V6 r$ z" s# z) g& |8 s( M+ h
- ;引用CHR图像数据1 t: e% g. z) u8 r2 }, R L9 o" V; A
- .BANK NES_16KB_PRG_SIZE * 2
9 @+ P+ Y, @$ X2 a - .ORG $0000
! H. I1 [- f! P% B; H+ f! ^8 ^" g - .INCBIN "data/bkg.chr"
% V1 G7 m w+ U' N - .INCBIN "data/sp.chr"8 }( W7 S+ P. g- B+ _# ^
- * B* K8 h" g- P2 j- u
- ;======================================================================
, t! }8 |6 [9 U - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank/ R2 ?3 Y( e- s3 [1 t* o
- .ORG RESET_ADDR
8 q0 Q7 G) P u8 f. _ - ;======================================================================9 P v" c0 |# V9 L7 ]
- ;引用其他源文件
7 @. ~! `4 a# n& b - .INCLUDE "fc_demo_ppu.asm" ;PPU处理" w, r# c, p. k( W% x* V6 B
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
0 T. L; `0 _' U- S - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理" T# [" W5 d5 H+ R9 q y; r
- ;======================================================================
+ G+ s$ |1 M5 ~, \ i6 }
: J7 E$ h( }0 z6 e/ b# g6 M- ;======================================================================, t# X- J9 B, H" e
- ;等待VBlank到来
! d- Y+ m: p8 {9 V% u) o - Wait_For_VBlank
t* R* ~0 @) j% S+ w - LDA PPU_STATUS$ B8 a; ^" K# _7 Z: H" z9 P
- BPL Wait_For_VBlank
8 ?$ D; L L- c O Y' a s( ` - RTS
4 M- e7 J+ [ r( d4 A - 7 K5 `/ p7 M, b% x E! O0 _' @
- ;======================================================================
1 O. ]: i" L2 _3 i - ;调色板初始化
; \) J p' N- V& X - Palette_Init
" [/ f5 T5 A2 [; D7 a% t - LDA #$3F
) X5 ~& o. G, b- X% a - STA PPU_ADDRESS
, N F g% f4 m' ? - LDA #$00
) R% y. }' {& b, `- E8 Z; {* G+ \. R - STA PPU_ADDRESS9 }. Q y8 b* H2 n& Y
- LDX #$00
8 [) }& j3 u! s7 R* r$ R - LDY #$20$ Y7 G/ b! e& H! |& T+ U b5 b. |
- .Write_Data" f: l6 X1 l- Y( c
- LDA Palette_Data,X
- R1 ~1 F! g% Z - STA FC_PPU_Pal_Addr,X( M. k/ [9 x* k
- INX
/ W" I1 E$ G- T$ [7 [% c4 I - DEY
4 Z, b- Z$ T3 P! c, s - BNE .Write_Data
/ K7 _8 _4 h+ v* {5 g - .End
/ \0 t( s7 t ^7 ^5 g - RTS
5 |( A4 F' [- A6 O1 q3 t - / U' i" }* Z3 V9 R; X
- ;----------------------------------------
1 r0 p( l4 m5 v' t- O - ;调色板数据# q* s) U8 J5 I
- Palette_Data4 L9 Y0 e1 `$ c; m
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 I- ^' M+ d% z; W `3 d6 |9 K - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22- h6 Q' g- `; W4 m1 e
-
& m |) r7 h9 h9 X2 _( X - ;======================================================================
& O: A+ D5 L q5 \3 |7 H2 H - ;命名表清空. z9 X4 L, V% }) N V6 t/ {) `
- Nametable_Clear' t% E* f8 A* K3 o
- LDA #$20
3 A9 h( O) C2 _7 X# d - STA PPU_ADDRESS
+ |: |5 m, F' K+ y2 m - LDA #$00
/ w$ c1 O2 B5 [. o - STA PPU_ADDRESS2 k. Z. h# l+ H
- LDA #$00
; E: m2 z8 r* r5 e6 X - LDX #$00; }0 E2 r2 z' }" Q; ~
- LDY #$08+ F4 A" [' H' g$ g6 D, X( R( \8 e
- .Write_Data6 M! j4 U, M, A* P" a$ n
- STA PPU_DATA, B3 n1 w2 ^ L% n2 Z' K# O
- INX2 N x% f! q8 G+ ?
- BNE .Write_Data! n4 s: t7 b' J# {( O8 G; l
- DEY
Z* N/ q+ F4 o# |4 s2 Y - BNE .Write_Data
8 K1 v% @" h! L4 j( G4 a3 D- `: N - .End
3 Y$ R, ]6 b4 ]6 k# C) r - RTS/ h5 V7 j5 N; `
/ ~2 }) _7 U! o- ;======================================================================
* w8 u2 `0 s' m! b( o - ;音乐曲目切换$ s; S' d- b' I, H; \; o% v' [) N
- Music_Select_Process
& {. O$ H2 l5 } - 5 e' w& m0 h+ b- G4 U$ }9 O3 A0 W& B# q
- .Pre_Music;上一曲6 ^( k: Y1 a5 p7 ?- g
- LDA FC_Gamepad_Once
3 C5 Q% c! K3 Z( k7 M3 `7 g& B - CMP #JOY_KEY_LEFT
9 u6 ^# r( d' p - BNE .Next_Music+ X( L+ T" x) x3 `* h
- JSR Music_Play_Pre0 m" {1 @2 @9 N) P5 c- B. d
- .Next_Music;下一曲! e, A) o: F" ^! H! s: }) W: b
- LDA FC_Gamepad_Once
! w$ @1 f1 c3 E8 Z U& k) J - CMP #JOY_KEY_RIGHT' P6 N+ z. s0 v- Z: ^- F ~
- BNE .Next_10_Music! q0 G" Z% `: Q# P1 k' s& A
- JSR Music_Play_Next r' k. F+ Y9 p0 _4 j
- .Next_10_Music;上10曲4 V" j4 n/ q& x# _* d% t2 m
- LDA FC_Gamepad_Once
+ ~. F7 v3 [) P( p, Z - CMP #JOY_KEY_UP
) | Y2 ~$ ?" v# V3 [ - BNE .Pre_10_Music
- ]5 S0 o4 R# `9 z7 W. K- { - JSR Music_Play_Next_10
* l1 h# V. n+ P7 t' [2 @1 \ - .Pre_10_Music;下10曲9 E0 Z7 p9 t+ g, E9 b$ b: [ w
- LDA FC_Gamepad_Once" X, B6 O9 j$ Z8 `# A$ l/ @# R
- CMP #JOY_KEY_DOWN. A* Q0 L: K( F6 \" c( u! V& z# e
- BNE .Reset
) w- M! f! S4 O2 H; i - JSR Music_Play_Pre_10& A: P% P" P9 u; ?; U
- .Reset;重播当前曲目
. b; O7 @8 K* D: L4 A% i - LDA FC_Gamepad_Once
* z, P4 u) @& t$ M; H - CMP #JOY_KEY_START
/ Y1 ^3 t% T" J7 j - BNE .End
$ `6 Q+ E* q7 M/ p. ]. }, g# A9 _ - LDA FC_Music_Index
+ g% k4 L' u3 F+ e - JSR Music_Init_Process" t( |1 M; V5 h0 V" [' Y
- .End! G/ G% {0 \1 Z4 x) y( M
- RTS# l) ?0 @+ U# N) h+ S/ ?
- ) O* J: I0 f Q
- ;----------------------------------------------------------------------
" q/ y2 r) Q o7 \' F - ;播放上一曲3 r) _6 S& L- }2 X9 C! R! @: b7 J# U
- Music_Play_Pre3 F! j3 c/ v4 C% U. w" W( |" F
- LDA FC_Music_Index0 i* g7 S! X# E6 b: L
- BEQ .End
4 N- T5 _6 G! ?+ H4 M - DEC FC_Music_Index& ]2 U) X0 m1 Y$ P
- LDA FC_Music_Index
$ [+ o5 n1 G& v2 _* @- s - JSR Music_Init_Process
# _ o6 M; v0 D$ I! L, [# l$ R - .End
9 F! [& B9 V* s3 \3 L - RTS
, u( F3 U5 p% l3 d9 B( U+ v - ;----------------------------------------------------------------------
. Y+ q5 p5 }6 n - ;播放下一曲
. h$ Z5 W w4 T6 ~9 q$ b - Music_Play_Next
6 q9 h! i) T* B - LDA FC_Music_Index
; z$ S5 g, P( j3 B - CMP FC_Music_Max_Index' `. ?& A' B7 ?1 M. T3 K- v
- BCS .End0 j% U! Y$ l4 Y, V' _% K
- INC FC_Music_Index- Y& j) N5 A2 F9 L6 |* Q1 d
- LDA FC_Music_Index, `7 [+ g' V* C2 l6 f
- JSR Music_Init_Process& F4 R- r+ U+ A+ w
- .End
" U q& I h3 T* ]! d4 d0 l: h - RTS
5 o) a8 Y" R$ v( _ r* h
- @( I6 e- b- f# ^. ~1 C- N9 N- ;----------------------------------------------------------------------
8 `6 t% q2 G9 B. Y: _ - ;播放上10曲
7 e8 L- d/ H- h; }# x5 w% s0 u - Music_Play_Pre_10; h8 @2 [8 l* t; X
- LDA FC_Music_Index
, R6 C: d' }# s& a - BEQ .End( r) ]4 f2 W" o& P) m8 K
- SEC! `" H C7 n7 @+ ]3 D
- SBC #10' ]* E" G j( i9 I- r- S
- BCS .Pre_10) b- \$ \5 v% x; W3 J/ y3 ~
- LDA #$00
8 I! U' [: j# G2 q* L) e - .Pre_10
/ D/ X5 p; \% f9 n& t2 t - STA FC_Music_Index
; [2 j9 g5 h( a& Y! Z - JSR Music_Init_Process
" i7 j; D9 y# z3 m7 V9 Q( I: S _ - .End9 k. B! ?, Q& ?& w/ Y4 f* T
- RTS/ k6 h9 r0 Q* q+ \5 W0 K! {; o t
- ;----------------------------------------------------------------------
6 C, b1 V5 a; L) ` - ;播放下10曲% X0 m& n( j7 ~. M. Q1 R
- Music_Play_Next_10
7 n! U6 k! N# k) n: T - LDA FC_Music_Index; t# P! J% a7 t$ ~' G9 l" T7 \
- CMP FC_Music_Max_Index; B1 h3 P0 d0 w/ l* B; Y
- BCS .End! w: i Q& x2 R. L1 B" |8 R
- CLC
+ a1 h* m6 i6 }3 k% J - ADC #10) S4 b% G; w# D, k0 m0 S+ Q
- CMP FC_Music_Max_Index
$ N1 g- r; v; V" w+ X+ m( ]% B l! c - BCC .Next_10& D3 P8 Y3 O6 e% e' F1 H( Y
- LDA FC_Music_Max_Index
% k1 J& K9 w6 Q& I; m9 o h% M - .Next_10
- X8 `6 L- C. v" D+ K( q - STA FC_Music_Index2 l& {/ E, W# T( i) o
- JSR Music_Init_Process
+ }- _% e+ ]: o) P( c1 Y - .End
( D) Z, }, J, M5 y" J - RTS, J$ v: G+ i+ V5 A0 p
9 t0 Q9 D( c; k; F1 Z3 x- ;----------------------------------------------------------------------
" {( e( }* g; C8 N" y8 G" ?2 L - ;8位十六进制转3位十进制制' ]2 B' k; {. s3 U0 D
- Hex8ToDec* X+ H# ~ m( b7 B9 b
- STA FC_Dec_Data_1
# I" c+ X( {. W0 \ - LDA #$00
# @/ b6 c A9 u% Y - STA FC_Dec_Data_1004 p. n& i+ z: W `
- STA FC_Dec_Data_10
! u5 w* f6 g5 U2 O- t; u! } - LDA FC_Dec_Data_19 P8 g) ?9 X8 C9 D
- .Convert_100
9 u5 x" Q" Z) r* H& z+ z T* ^2 E - CMP #100$ C/ @0 }6 h$ s% l( D. ?$ }
- BCC .Convert_104 ^& @7 J' X4 Q. X
- SEC
# w' r+ D# e) [3 o+ A - SBC #100, g9 {1 Z3 ~! r# C/ w8 C- v. s$ K1 S
- INC FC_Dec_Data_100
* ]) Y: A4 i! n" `7 B# N - BNE .Convert_100
i) Y& O1 y$ F$ Z% v - .Convert_10" a, r% v$ W2 e& j8 F
- CMP #10
$ z6 Y4 u" S) m( C. _ - BCC .End
i7 I, v3 V& G* u6 {! t6 d - SEC
6 B! _! A) A. F$ U. p1 F6 G% L - SBC #10
: g& n' Q% W1 ^0 _8 H7 o) e - INC FC_Dec_Data_100 l- {9 e9 H+ V8 E- f4 O5 I
- BNE .Convert_10% T+ i9 S* d x) B- {1 V% A2 }3 j
- .End3 E1 L, |+ v5 y2 Y
- STA FC_Dec_Data_1
" `% W, C |+ T" M/ @2 v - RTS3 q- w6 C! ]: t3 b0 D- g8 {4 l5 f
0 ~! P3 G) p% E6 y. C- ;----------------------------------------------------------------------. M0 K H$ E9 h' [' Q
- ;显示曲目信息' H% P, v" H0 @" g+ E; u/ H
- Music_Info_Display
) ]2 G$ H: w7 h7 |" n8 j' ^ - LDX FC_PPU_Buf_Count
2 j' ]4 q& d0 P% V3 n - LDA #PPU_WRITE_MODE_CNT_LINE
! g" t) z9 P$ A# B3 s! |5 H - STA Use_PPU_Buffer,X
4 [3 ^9 O9 @, `5 i! e7 G - INX0 e# `% w7 L4 Z
- ; x& n0 r6 E6 j: e1 S8 v
- LDA #>MUSIC_INFO_POS
# L$ F4 Y$ F5 ~2 B$ M! Z - STA Use_PPU_Buffer,X8 g9 }* Q% K. a* q' C. b- M
- INX
. R/ v; q! N% z' n# a0 i5 e - : o% [# t/ W" M
- ;居中; x+ P( Q( Q7 _# Z3 O
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( `3 I# F2 K4 v# _5 i
- STA Use_PPU_Buffer,X
d6 A0 s9 V( y$ |, B - INX
6 ~- b3 e2 f# O# D: T7 d2 X - 0 {& X7 Z. K% ^
- LDA #$05
4 i1 C/ c7 M% k5 c - STA Use_PPU_Buffer,X
/ ]# S+ N+ ] r& x! Z n - INX1 _" e1 i5 i' }0 Q) e4 c
-
! u! G- ]$ {0 f' f - LDA FC_Music_Index3 n2 Y; Z3 {" Z" v( v
- CLC
$ S" \7 B. b9 z - ADC #$013 M2 ~5 u+ y: G0 }: ?
- JSR Hex8ToDec3 P) p9 C; h1 S" @4 M
-
2 F; j+ T) y# }/ z - LDA FC_Dec_Data_10& k' q6 f$ X' t# V
- CLC9 r+ J0 x- Z, p$ g1 n) N
- ADC #'0'3 j$ w: U: y& u- h& ?8 E# \
- STA Use_PPU_Buffer,X
' E; D! Y. K1 z2 R - INX# A( y: n- D9 \- M! b4 N
- ! Y6 m- v/ H7 q9 z2 m
- LDA FC_Dec_Data_1
* h# h3 W) C; o - CLC4 C: k1 v" C* r) O! a
- ADC #'0'8 M3 b, z7 t0 v3 {
- STA Use_PPU_Buffer,X
& M7 r1 j5 v* z9 v V C - INX
; v9 h. K# H3 S O" A# I2 S% z - 9 p' N. i5 n2 g% i2 W1 k. X) C
- LDA #'/') D7 S& M- f2 U" X9 r
- STA Use_PPU_Buffer,X
Y8 T V. {8 Z. i - INX
; ^' N! r2 h2 L8 | I# n - 5 R7 K8 v3 _; a6 y8 m# Q; p5 t
- LDA FC_Music_Max_Index1 J" E+ x3 i3 C
- CLC8 z9 @4 j+ y! v& {: I: x- E
- ADC #$01
% x+ ?" a, \- |9 F+ d( M, r4 ~ - JSR Hex8ToDec
( B) }5 {8 g' p0 @) d7 N x5 n) T- B -
% a4 f$ [* ?5 t( s; I8 [1 ? - LDA FC_Dec_Data_10$ Z9 I5 E3 H4 C8 P+ n
- CLC
9 A- c, u0 q4 q2 q) i; J - ADC #'0'
( L4 |: F0 @# W2 u7 I - STA Use_PPU_Buffer,X
9 j' R# V- E5 ?/ a+ M+ Z7 p - INX0 l9 V. ^) N, M- m: G
-
! f" H! s' j, z' R - LDA FC_Dec_Data_1
8 V- h+ @$ {& X/ P8 G) }) n - CLC
X; h7 {* X j# } q3 M( R - ADC #'0'
7 F! m; }+ a5 Y) Y - STA Use_PPU_Buffer,X( c" I, a1 A- h3 D6 @+ H
- INX
. e% \1 a! d2 x6 y: N$ s( a$ x -
8 e* k0 W# @6 ^- f+ f; ? - .End5 A7 q0 ?- v8 U" t
- STX FC_PPU_Buf_Count
5 E4 {0 ~+ B+ Z; g' r5 K+ l - RTS D6 W; I- B% B
- . l, f1 V5 ~ I9 K! h( \
- ;----------------------------------------------------------------------
% X: R9 ]. m# Y4 b1 |% w - ;音乐曲目初始化处理% W$ ~, K3 l" a6 h, b e
- Music_Init_Process& |1 j7 W, t3 q, P% d& V0 x
- PHA
" G" C9 D3 O: i' ~ - JSR Music_Clear_Process) \3 C9 n' E8 o3 _( i5 d
- LDA #$1F( i, w# j2 p1 o# K, f9 v- K
- STA $4015, d w7 T+ J+ d% A2 M2 Z" j x
- PLA
6 O( v+ J6 R0 Z; }5 W- H" } - JSR Music_Init_Addr" D2 s% }4 D6 G; s% \; i" c& O
- JSR Music_Info_Display7 ^1 r) S0 k3 j# m
- RTS6 p! c+ `+ {( E% h% I
- - X U3 h% O9 O* N1 d
- ;----------------------------------------------------------------------
+ }& h: p1 B4 d1 P& e) l3 e& g - ;音乐播放处理
% d4 r2 V1 k/ ^( A4 ] - Music_Play_Process
& S' `# J4 z0 I. @) c6 q - JSR Music_Play_Addr
6 S& m2 W/ J, l - RTS
+ v7 u) u& \8 P% ]1 v8 @
1 {9 p4 M R; h- X2 P1 D- ;----------------------------------------------------------------------
! {0 u/ v% Y5 L) k# y# R0 k/ |& l - ;音乐播放处理$ O* g: N6 [' q3 n# D. |
- Music_Clear_Process! }" M/ s( s6 F. Z: e5 q
- .IF Music_Clear_Addr5 K7 `7 x+ ~1 n' c+ G: w1 H
- JSR Music_Clear_Addr" S/ [- C' a u% ]; V+ ^
- RTS
; b( @4 i" M3 b/ R - .ELSE% v x0 j7 t) y! }
- LDA #$1F
( `' K% V2 ]8 V - STA $4015" L8 @. |/ P1 r1 b1 Y0 Q
- LDA #$00
' s/ W% V9 b. u/ \ - STA $4010+ l1 v! }4 |% D; h
- LDX #$00- Y! T6 L% ?. Y+ Q# T* X4 G# P
- LDA #$00/ k4 }! d" u" C1 S) t5 L
-
% Y8 a; b. G& e% ?2 U# t- X# u - .Music_Clear_Zreo_Page_0; J% O5 e W. w1 R2 d' k
- STA $00,X
* e2 a( W/ N: c" x - INX; L- ^: _. t" L/ R3 Q$ `' O
- CPX #Use_Zero_Page_Begin
0 j0 }1 C# I* @ P% S9 x. F) t& e - BCC .Music_Clear_Zreo_Page_02 `% Q- ?8 U/ Y9 } o! ]- c' W
- , x0 u9 V) ?% v/ h- n: {9 C0 p
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size, S! T# Z e; t- ]7 z
- .Music_Clear_Zreo_Page_1
8 w( f5 M7 e( G# z7 B - STA $00,X* N+ _8 H" @; \7 t
- INX' H: A* B0 C0 f0 g) e
- BNE .Music_Clear_Zreo_Page_1
6 ]* i2 i- r6 C$ X, f -
5 \( n2 o: k) U* ~ - Music_Clear_Process_1
! |: v( R) Y+ x. W. f- E* f - STA $0600,X) |) H) u) V. {6 d: a; A6 f
- STA $0700,X
" ^) H/ E) L9 a8 y. z6 z& F - INX
6 r2 V. S) q, i/ ^. i+ t - BNE Music_Clear_Process_1
, V3 E* {# m0 X v+ m& \% r* w" F - LDA #$10
. z5 U1 z+ R7 S( J: X5 X" q/ ^ - STA $40003 G4 f8 W/ g- U4 V& q& q: d
- STA $4004
4 E E) F% F( ~- s1 S7 M2 G% s - STA $400C$ r2 J* m# {; v! b$ f
- LDA #$00+ y6 ^( V( Z5 d) E7 t* a
- STA $4008
9 h1 E1 c% w3 y/ \0 | - LDA #$0F+ m; C- Z- P" p9 a) p# ]
- STA $4015
7 H; Z) _5 y7 U L0 O! \; w - .ENDIF# @* F9 X n: x% J! L/ h
-
# a% q: m1 |! ] - RTS
/ r- X6 R8 O7 y5 J3 w% b3 H
( \1 d( _- [8 d1 V) ^- ;======================================================================
8 H" q% V1 G; r8 [$ z - ;重启处理
/ R; q4 f! X" m1 ^. I# t7 U! B - Reset_Program8 ^2 R2 p+ X) s) @, j3 K
- SEI" g' G" [$ w+ l G2 r8 @) n: J
- CLD
7 w8 n/ ~! }% n5 h4 [; i0 I - LDA #$00
0 B2 Q# k( ?1 S; P$ G: o$ t - STA PPU_CTRL
, n" A! q @* `- ] c8 W - STA PPU_MASK J; ^3 `( u! C3 D; B. h
- STA JOY2_FRAME
% y: x4 t p* r: N; c - STA APU_STATUS
% m; S) g+ V) |0 q$ v8 A - / V4 [: c# S$ j9 u j1 z: x: W
- ;等待屏幕准备完毕: X% q ^# b- l, S7 }/ [, G2 _
- LDX #$02! G8 |$ r8 l8 S5 J, ]" f- R
- .Wait_For_Screen_Ready0 @+ s: ]# l/ l/ G% Z; D
- LDA PPU_STATUS
+ y! j9 x: o4 r1 K! P - BPL .Wait_For_Screen_Ready$ Z" j) k6 c% _! T
- DEX
0 d1 o2 @: N; L2 q* N- D: V: B" S - BNE .Wait_For_Screen_Ready
5 x$ ]$ E! w: b5 t8 E/ l4 ] -
" @* X, O+ b9 ~1 Z9 b; H3 R - ;清空调色板
/ L, S; \: H: m5 b2 S - Palette_Clear( b0 v7 S* f; k/ i& ^1 d5 ]3 ~
- LDA #$3F3 M/ j$ U; E$ g( s; O
- STA PPU_ADDRESS% |/ U! O. {" J b8 { l) N8 f8 U
- LDA #$00
) ?! U1 a' Q! n" s# Q* j$ E$ H - STA PPU_ADDRESS- \5 c: R# v+ F( \$ P* G
- LDX #$20
* J) q5 M, I4 p4 z9 c9 Y+ w) t6 ? - LDA #$0F
) T8 _; D( L5 T. Q" w. o - .Write_Data- X2 X: L) P$ ~) y; l* c; V, Y
- STA PPU_DATA5 t( F+ D+ Y6 B) Y% a! `$ t5 Z
- DEX7 D7 y9 y9 z" _+ a5 M
- BNE .Write_Data
7 ^! j- a+ t; y* g% c' d8 P+ O - 1 v0 w+ P5 ~7 I- E% h
- ;清除声音 $4000-4013 R$ X( d* [. H) ]# E; O
- LDY #$14
7 T! z# l; X1 \' z4 N _, u - LDX #$002 v5 K, B2 N. |& R9 j5 H" Q
- .Sound_Clear
) Y) B& H3 B2 ~* L - STA $4000,X
6 Y# E1 \1 K$ P1 h/ u) M8 _' D4 Z" Y - INX1 z( d3 `! d$ ?0 T% C
- DEY
* y3 u k, W8 y7 O8 }% w - BNE .Sound_Clear7 _" A" ^" _8 V" N% O3 z
- 7 `( s9 Z$ W5 ^4 o6 @5 p
- ;清除 RAM $0000-07FF
% c( S) M( \. v; t% s* T. d! S( s# X - LDA #$007 D# v# m& p9 n0 P8 w
- STA $00: b$ U- r0 M0 ~3 p; B
- STA $01
2 m. u" j& \" f6 f! r2 `0 o% ` - TAY* k3 s8 R; L( C$ U4 Q# B4 f6 Q/ f, U
- LDX #$080 n& b; d `2 P; r) m& }
- .Memory_Clear: z6 V/ U @( B) `
- STA [$00],Y
6 L, r( M/ I. F k7 G - INY+ ^ o1 n: o* c2 X8 I4 j
- BNE .Memory_Clear
" {- p9 r6 A+ D h! A - INC $015 l& |1 W& O0 {( b, h
- DEX
0 X- g2 ~ V; w+ L - BNE .Memory_Clear" x2 _8 l, Q! h# E2 x* V' I* {
-
( `8 v2 u! L3 n$ M. @ - ;精灵缓冲初始化 E+ x! k5 B, R; v5 f
- LDX #$000 J7 t: K. B4 D* W$ o0 J
- LDA #$F8( ~2 K d# U7 v8 A" {! I8 r
- .OAM_Clear
# w: G; V* M8 J T* ]& e' F$ z - STA OAM_DMA_Buffer,X
# A: b2 H4 [: E8 T6 H' ?. W/ G - INX! |( y5 A) L3 L# y
- BNE .OAM_Clear
7 ] L% l) H. M7 ~& { - 8 @# C9 I! E# ~4 H$ T M
- ;栈指针初始化
}# ^* l4 |; I0 ] - LDX #$FF
" K7 C4 U2 e0 J3 w - TXS
3 B( }( j7 }% B+ ] -
/ t8 R* K' O; A0 i# R# g* w4 Z - JSR Nametable_Clear;命名表清空
) ^2 q4 z# i$ x; L - JSR Palette_Init;初始化调色板缓冲/ Y6 y* F% ^4 C# J
- JSR Static_Text_Init;初始化静态文本+ Q* @' d) e5 T$ o3 `
- & y7 s w, w) v# W9 S- P
- LDA #MUSIC_ITEM_TOTAL - 1
% }( c& z" e4 ~( [' w - STA FC_Music_Max_Index7 X. b( V0 a2 U [ J( y0 X& O
- U) F: w8 H) a" o0 O
- LDA #$1F, h* r. A D+ _! d1 n$ z
- STA APU_STATUS$ g9 X7 P* f8 O3 w+ L% g' z
- LDA #MUSIC_BGM - 19 C) P) ~0 c! V1 h- Q E
- STA FC_Music_Index- ~) R, r1 B% [
- JSR Music_Init_Process;音乐播放
7 _9 a5 @% y* E) S) @ -
! {& |: r( h" W0 a+ g0 b; P. M - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
9 A9 f8 B& b+ ?8 N$ S - LDA #$1E0 y* c6 C m- b- V
- STA FC_PPU_Mask_Buf
% ~* u1 M# X: B& N( U# r. A& Y1 ? -
" c3 p0 o7 f! j& {1 w4 H - ;启用NMI处理
# q: G g2 w& X% q' P8 }$ B- D - LDA #$80
6 H) X* N+ T& k/ @0 ? - STA PPU_CTRL
- | @/ z& P5 X2 k+ e -
- V# D1 z$ J* p3 S - ;程序循环, 剩余工作交给 NMI 中断处理8 U2 ~2 F; U" h) j4 N* B
- .Loop P8 ^( p+ q4 P9 r0 h3 y9 s( `9 N
- JMP .Loop# l$ y0 v7 x6 f( }
C& ?) A1 j8 ~* w- s' E- ;======================================================================& D# a* x; k+ ?7 ]! \+ C7 J7 _
- ;不可屏蔽中断处理- _0 l0 n# B5 }7 c L
- Nmi_Program
5 L x) t3 k5 Z - PHA, M( l& r+ Y4 p9 ?' n9 e
- TXA8 m- M3 R7 Z( [* }; Q+ ?
- PHA
# I9 K( @, k$ X( _/ g& @ - TYA0 ^* Q$ `% l2 K3 G; @
- PHA
X' o1 g- v) u- o3 {1 I - 1 @; h, G+ h1 g! t6 M
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位% Q# f) j6 I$ w/ g2 X+ u# I) I, ^
- : Q- P- K# R1 S+ B
- JSR FC_PPU_Procrss;PPU处理- D* Q' E2 K, W) E) ~' Y( O) {5 j
- . X; M9 H+ A& A# l
- ;精灵内存更新
) E# ]% N. v& k# h; D/ L! L6 N6 K - LDA #$00
) a$ H* k; ~" c4 r - STA PPU_OAM_ADDR
9 w* E0 \0 @/ U* ~9 e6 O! B4 y - LDA #OAM_DMA_Buffer / $0100
+ p- }/ b# U K - STA OAM_DMA8 B r4 Z2 O6 @) N% o4 X* Y7 z
- / m5 M0 I/ H; g$ \6 }6 m# K
- JSR FC_Gamepad_Process;手柄输入处理
- \" c/ V+ d- ]' N - JSR Music_Select_Process;音乐选曲处理$ O; w; S% @1 R% t/ m! _: E, v
- JSR Music_Play_Process;音乐播放处理
! u. n, f9 M7 z- j' c - ' a- E$ F% X; K/ V3 q
- PLA6 \/ g% M& S$ B0 ]4 y
- TAY6 w+ u- K5 Z. b+ |) R
- PLA
. h2 K! I6 ?4 q- [. f& a8 N$ j& ~ - TAX+ Y w& U5 b: j8 V, \) C
- PLA
+ g8 @# _# I4 W/ F
1 r9 V! v8 M/ ]5 G# c6 D2 q* }- RTI5 p3 H5 U; m( X6 i
- * E9 s+ @; `7 f z
- ;======================================================================! R R) K/ K- V) W0 O6 c
- ;请求中断处理
& w$ ~4 p: }6 @7 K9 e. p - Irq_Program
( l% C( _0 A% o& |) Z7 Q- K - RTI6 x) ~4 f ?& T1 I/ P W9 b# X$ O
- 2 p6 p6 n6 |1 I* i: z" y. U. ~- C: l
- ;======================================================================- d) c" v9 _/ ^$ S
- ;中断向量表
; a- j3 E& _+ w3 `& O$ X - .ORG $FFFA8 J6 H4 q5 ?% z# F5 _1 w; L
- .DW Nmi_Program ;NMI触发时执行5 p, |/ {9 y$ M* `+ N
- .DW Reset_Program ;载入ROM时最先执行, H5 {- d( h% _/ I' D
- .DW Irq_Program ;IRQ触发时执行
" Y, l y1 e2 `7 t" d7 n8 K9 t
复制代码 6 W; v9 D0 Q) `
8 f0 v# V H8 k' O. p
$ `; Y( I& I6 J; ]7 K
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|