|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* r8 b9 d6 z9 |2 b. j
9 [8 K* O9 w$ ]6 U. R& b* H
以下是主框架代码:9 S {1 _5 S; v; P0 A0 O
- ;======================================================================* n' E0 k& R7 z" w- ]
- ;文件头
8 g$ u5 V0 z5 L3 ^/ P - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ C% Q& }2 l- p; j* a - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 J2 J" Y7 K4 ~) h$ m2 V) H
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
" }4 f U- z9 a! }* y5 w1 e5 H- H - ;======================================================================
( S- Z: x) k5 N6 y2 g2 D$ s7 e4 C - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 25 f4 q) e0 X( w* O5 |7 r* R/ B
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ L6 A9 D# L! y3 ] - ;======================================================================- ~ d) f+ M1 v+ }$ J, A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1. e. z/ O& e7 j# K" _- X" M# [$ n
- RESET_ADDR = $E000 ;主程序起始地址
. F0 S* F5 {9 I2 Y1 w - ;======================================================================
4 d- Y7 |# I6 f# I/ V% d: {8 m - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
o& ?$ q" D& M, T/ G - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! \2 W7 D0 \" R( p j
- .INESMAP 4 ;Mapper号 (0-4095)) W3 _! Z/ u7 @, y0 J
- .INESSUBMAP 0 ;子Mapper号 (0-15)4 |, n8 @3 J8 C, x
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
, n: ]4 d; z' U' _ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. n9 D) U/ p' x$ v; ]6 e' X! y* U - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数), g8 w' r8 U1 v, ~+ M3 n
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" u+ |: ?1 [0 S) r8 M. k* Y: Y7 q& @ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数), w. W8 A4 y3 x9 u6 z# K
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数). t! Q0 |* U6 U9 ^2 r
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
# A) h) V. }- ]$ J/ J5 `! Y8 } - ;======================================================================
: Q. Z4 [8 W: D, ~% G+ e - .INCLUDE "fc_demo_config.asm" ;全局配置5 B$ v; J k! w5 M" F
- .INCLUDE "fc_demo_constant.asm" ;NES常量, ^4 G8 \4 _. Y% q" x; g; c( W( Q5 b
- ;======================================================================: {4 V' w3 F" H0 w# E6 c
- ;音乐配置, w9 H- n+ X+ R, |& T1 f( U
- .IF 0 = MUSIC_THEME
2 q3 J6 z8 {) v5 `2 r% u. d - .INCLUDE "data/music/Gremlin 2/config.asm"
$ l7 A) y4 l* |0 S, ?" a - .ENDIF: ]4 M# `* m1 G
- - D x) y$ m+ o$ X1 ^* D8 L# m, z
- .IF 1 = MUSIC_THEME
' c q+ t9 b k+ E% k' o, t - .INCLUDE "data/music/Raf World/config.asm"
+ K( x4 m; w8 y - .ENDIF
8 A3 h' Y* @4 G - 8 i j1 [5 t" L
- .IF 2 = MUSIC_THEME F, x0 I, y4 f H
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
9 c2 x0 O4 l9 e1 \6 P - .ENDIF D/ x( Z% n) I# D( X5 D
- $ y% c% u" P& z7 X
- ;====================================================================== v' G& c) ~" I
- ;引用CHR图像数据3 ^( c/ h; N" R2 E* y8 S
- .BANK NES_16KB_PRG_SIZE * 2
0 s0 r3 ]4 [* D. U - .ORG $0000
& t" L$ u3 U, Y/ K n - .INCBIN "data/bkg.chr"' {* K3 f6 x7 P& B& t( C" J
- .INCBIN "data/sp.chr"
9 t" o- B2 U* v& G# a - ' D2 ]6 U2 z% j5 D
- ;======================================================================; o' M& v/ r+ k( L1 ]! Q! u
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank) h# S3 t+ @2 W9 t* U2 z% |+ @1 u
- .ORG RESET_ADDR* s! c( d k7 j3 _3 m7 D
- ;======================================================================: M2 O" w, N- w( _0 Y
- ;引用其他源文件0 h; y# z3 @ E% i! K
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
3 Y' i/ O5 D2 ~' _' A4 J. _ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
# q# w% U0 Y& E& N8 {& c - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 W) u% S0 x H/ F - ;======================================================================
4 V# ?4 h6 h' N6 m& V) u* b2 G
) j/ ~8 \# j6 k+ _- ;======================================================================
5 t7 ?. R6 b+ W; M5 w1 v4 q - ;等待VBlank到来
" A* N: V- G& o. o - Wait_For_VBlank% ]7 H+ y3 \& E8 p# `; h" y2 N n c
- LDA PPU_STATUS
7 I% `' E- t% x( f7 D8 V+ U - BPL Wait_For_VBlank' l8 X0 L# ]2 l& z3 ~! q( ?/ q
- RTS) }+ b; ~; @4 [7 l6 s
& d3 m; o. E; i+ R& F- ;======================================================================
9 U4 V% w$ S+ ~+ h, v1 S6 @ - ;调色板初始化+ u. _) _8 g/ [: J9 b" d' x: D4 f
- Palette_Init3 j6 N- r' D4 a8 t! Z
- LDA #$3F3 |: w) e! Z7 A- ~7 T9 v" a7 t- A
- STA PPU_ADDRESS% f8 L9 A" u0 n1 d7 `# I- a
- LDA #$00
/ u5 @* f2 S, q+ A/ [ - STA PPU_ADDRESS1 h- z" M1 ~0 v
- LDX #$00- H$ Z1 r" Z N5 g8 r1 J
- LDY #$20
( b7 W! K) |0 x1 ` - .Write_Data
" }& B4 o' U6 D. p - LDA Palette_Data,X9 W# ^. }4 H1 h+ F5 {8 H- Y+ g: `
- STA FC_PPU_Pal_Addr,X( w. p5 F& G% g* q5 v, H/ `: c
- INX
) X, m! n5 u3 a" D0 A2 q - DEY
$ a! y6 [! U, i( y# x - BNE .Write_Data
) s$ l& L" u' {2 E - .End
p" p. J4 I/ B - RTS
+ e I; H3 x/ g, F1 L( v, Z7 @ - 4 @* P4 Q5 t) c/ ~$ T! ^2 x
- ;----------------------------------------
1 Q& k- h6 \) u7 ] - ;调色板数据
, I2 j- N+ O+ K& w - Palette_Data. D1 K6 Y) E8 e# p" B- |# l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B8 w! s+ Z5 U5 m
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22. X7 I9 u0 v! ?* i3 p: ^
-
5 I, _' J9 `7 b7 Y, H - ;======================================================================2 R8 h8 o, O; A6 ?+ @4 O1 X
- ;命名表清空
8 J9 p7 h/ g; d - Nametable_Clear& C* K; o! i3 l1 ^
- LDA #$20
& k2 U# C7 ^9 A7 a3 \ - STA PPU_ADDRESS6 b$ [3 [ w4 G6 |$ @0 s1 Z
- LDA #$00% s, F" n. D ?- Y$ u: ^" q" ?
- STA PPU_ADDRESS
. U/ m8 Q+ I! n - LDA #$00
" U8 d( O- W# C, E- z6 [. ` - LDX #$003 f/ G) k0 S6 a4 T
- LDY #$089 K* Y; E/ {( g- X, C5 z/ Q) ^
- .Write_Data2 e3 M' \# S7 I& ^
- STA PPU_DATA3 x2 I4 H9 Z1 `% c$ d5 o# Y
- INX
{* A6 e1 Y+ w* d; T% d. V - BNE .Write_Data0 B+ n) j& [) d& a/ D
- DEY
& W0 k3 y6 n1 D0 v - BNE .Write_Data
$ B; j- \' Z5 t: ], C4 W2 P+ x - .End
0 b6 C/ t/ W1 O/ \4 j - RTS a! ]9 y9 N% a6 \6 D: X r# L Q* r
2 F' q5 X6 i7 P5 o3 C- y- ;======================================================================2 Z S, I0 g& W& ?
- ;音乐曲目切换/ w. _- e( B, m: l7 ~8 q: H' ? x4 x
- Music_Select_Process
( C9 i: q2 T) e# ^3 ~ - # t$ |0 A# t7 O
- .Pre_Music;上一曲
# x7 i7 x* ~% p5 D7 w - LDA FC_Gamepad_Once
8 g4 B: k* m0 J9 k1 K" i - CMP #JOY_KEY_LEFT
% [7 S2 p# W/ ]6 A* m) g& G& W - BNE .Next_Music
3 a- N9 M' {$ \3 b) `8 [! h - JSR Music_Play_Pre
Z. y5 j: q3 C2 V - .Next_Music;下一曲
. O* K6 |5 I1 K1 s; T! ^8 q4 | - LDA FC_Gamepad_Once
7 L( I; c/ J3 [' H. k - CMP #JOY_KEY_RIGHT
' y2 g( e% r1 o; e - BNE .Next_10_Music2 b! m- Z/ v: `' S8 ~
- JSR Music_Play_Next
1 T6 i/ T4 O! a3 l n2 J - .Next_10_Music;上10曲9 p5 Z1 j! K* W2 R! _
- LDA FC_Gamepad_Once
+ p/ M6 O( ~; Q2 `" V! G - CMP #JOY_KEY_UP
0 v2 A9 m7 o' S5 L8 }4 C, z1 D7 ]% h - BNE .Pre_10_Music- Q& |: h2 {: o: N, h+ H4 e
- JSR Music_Play_Next_10: R/ n% ^0 t" t6 p$ V
- .Pre_10_Music;下10曲
+ }% s( i8 F8 @: E2 B- L8 m& U" @ b - LDA FC_Gamepad_Once- I9 ]! k. f: B6 @* F7 }/ Z u
- CMP #JOY_KEY_DOWN \4 x6 L M. n& C
- BNE .Reset
! b+ L, [) S6 c6 c! U: I* R; [( a - JSR Music_Play_Pre_10
2 N$ h8 w4 ~. L2 \: b& F - .Reset;重播当前曲目. D7 M8 D+ A+ o% M
- LDA FC_Gamepad_Once
7 j5 P7 n* K3 L W l- R' `7 {& F - CMP #JOY_KEY_START* U, u7 L, ^/ j
- BNE .End2 J: K4 m( @5 J% E
- LDA FC_Music_Index
! Y! e7 }6 y; _' _9 Z7 G - JSR Music_Init_Process
1 q! a. A. E3 t% f - .End: @/ t K8 i, d: x1 s
- RTS
8 Y' E& t6 E8 ~" K4 B$ A0 _6 H, k8 {1 { - * V l0 r u. D' K1 m# ^
- ;----------------------------------------------------------------------, v$ a: h6 J F8 D S
- ;播放上一曲* r. e. i: f. j( p# e4 m/ G0 E
- Music_Play_Pre& p3 y) X" X9 U/ n) N8 y2 x k
- LDA FC_Music_Index, K2 m' ^, r7 P8 l# n& N7 a
- BEQ .End
1 Y" p5 K4 l. c5 E x# b' r - DEC FC_Music_Index8 |+ p6 U% Z0 ]; |' @9 u
- LDA FC_Music_Index: \" t& q0 W8 {$ {4 }% Q: ?- n
- JSR Music_Init_Process+ E) S' @$ g4 ^; |- I6 c
- .End+ t0 Z2 D2 c. z1 w
- RTS6 ~! j- \! s6 M: R% A* i7 g
- ;----------------------------------------------------------------------
* z' t9 i! p+ T' c3 c5 ? - ;播放下一曲
9 ?# _) X" w7 i+ o) q ]6 V - Music_Play_Next
+ I* @% t" d% P - LDA FC_Music_Index6 W2 K. [" d/ b, j: ~( }
- CMP FC_Music_Max_Index
& `/ H1 M* T8 f) @1 G% g - BCS .End
1 a( h1 t, }! f, K. \' N9 z - INC FC_Music_Index' _% a% g0 q* Z4 w
- LDA FC_Music_Index
( W/ @) Q% Z% z$ [/ Q - JSR Music_Init_Process) _2 Y/ w; |- T+ D. [
- .End9 A+ b) f8 R# `
- RTS
/ U5 a: H' Z, S d, b1 z
+ }$ \/ z, x, Z9 {- ;----------------------------------------------------------------------5 n1 A4 \/ G2 z; A% G
- ;播放上10曲
) Y0 b' _* S, G# b: Y0 p$ S* I - Music_Play_Pre_108 U6 ?9 M0 U: _7 `# \2 W+ p- e
- LDA FC_Music_Index
5 ~3 U3 [: l1 v, j* e - BEQ .End: [: ?. c2 f1 t* V: H+ z5 v
- SEC
' h' ^9 {* Z4 m+ n" N& u7 k - SBC #10
# o; W' T! K2 I5 C/ s - BCS .Pre_10* U( {, _! s: N8 X6 {0 G
- LDA #$00
' d. o9 e, d( I3 g. p9 w9 k" C" @/ @ - .Pre_10% {1 |, X7 K8 c |0 E. L a) C: Z
- STA FC_Music_Index) t! i# k! M8 J+ m( `5 M
- JSR Music_Init_Process
T( \ ~8 |6 M& S - .End
8 `* @( E/ f' j3 }0 x6 \ - RTS
; z5 E% d* n4 d& A; V1 i/ @ - ;----------------------------------------------------------------------- i8 Q0 f$ z, j) H0 w) y4 Y) F8 o
- ;播放下10曲: O3 z$ k8 r0 H, C; f* |% _% l1 u
- Music_Play_Next_10: \0 Z& j1 l0 P1 S. d# ^2 h
- LDA FC_Music_Index0 q; Q- j( [* W1 F
- CMP FC_Music_Max_Index: I; {+ n# j7 ]) i4 Q: o: S: H/ }
- BCS .End
* Z% S Y- |2 ~. v0 ]4 X - CLC: c9 z; V; p @- @, O! X
- ADC #10( R' T) i5 ?1 v3 v
- CMP FC_Music_Max_Index
" n, c* R( Q4 m: p# e - BCC .Next_10. l6 I; k+ ^$ P0 ~3 A5 h
- LDA FC_Music_Max_Index
2 z& c3 m$ M( ]2 e& J# H - .Next_10
' o- E7 ?8 n* M2 H7 K) L% [ - STA FC_Music_Index' k3 ^- b9 M% ^2 b& D U
- JSR Music_Init_Process3 l( _5 D2 V3 \
- .End% z: u# B+ H% q2 x& z8 L8 H3 G) J
- RTS
/ B: G, D5 R- J& A( B3 e7 p
* P% q: m0 J# R) \( A- ;----------------------------------------------------------------------
0 ]! O. J# ?0 l3 s/ m - ;8位十六进制转3位十进制制
$ J5 u9 d9 H+ B, [$ ] - Hex8ToDec. D$ r; T3 {/ a, I6 }( t
- STA FC_Dec_Data_1
" r4 {; P) V# N- k$ k4 g - LDA #$005 U+ w# M% S; u9 x+ B" e
- STA FC_Dec_Data_1007 B7 \1 r/ q8 r" K( }' E* N
- STA FC_Dec_Data_10
8 k G4 Z" n, X7 c - LDA FC_Dec_Data_1
& a( V& Q$ d C" t' ]* A0 }, f; J - .Convert_100
, D8 f' f7 K# G' b0 E1 e' ? - CMP #100
) r; t0 z. J n# \ - BCC .Convert_10 D' N( S8 c; x5 r( ]
- SEC) ]. N; o5 H( J" X9 g. K
- SBC #100
; `- d. x1 ^/ @/ R. L+ M - INC FC_Dec_Data_100' S1 |% I# i) `0 l$ [
- BNE .Convert_100
' o6 Y* |% m+ b# e. ` - .Convert_10
$ u: E/ C! U' R2 G/ e - CMP #10- y2 m. i9 o, H7 x8 _
- BCC .End1 Z- U! ~/ i# L& a% j+ s1 r4 a, c
- SEC7 `( C7 M3 q* d/ _7 j
- SBC #10
& j% Y, N2 a8 B7 E% i - INC FC_Dec_Data_105 R; M7 K! C8 }. A
- BNE .Convert_10
* ~% }2 Q' f( Z n* i - .End$ w7 H6 V& E, D1 o
- STA FC_Dec_Data_15 l) ]) V ]$ b: `: [0 \/ S3 l
- RTS
* j. C" h$ D% j; T - 3 W8 L/ W7 t# K6 s
- ;----------------------------------------------------------------------/ K: e& C8 h! X: U3 y: i! v# b
- ;显示曲目信息* `8 @. l% z2 a4 f1 J
- Music_Info_Display4 [# Y6 j$ @* V- {9 K
- LDX FC_PPU_Buf_Count' Z0 M! V5 d( D& G
- LDA #PPU_WRITE_MODE_CNT_LINE( L. h6 h5 F# c5 F& ^
- STA Use_PPU_Buffer,X
" }) g! m/ c9 W - INX4 {; L; z5 V/ ~( {$ m7 z* ]
-
6 `" a! T' I' P5 G E% E7 q" U9 j+ d - LDA #>MUSIC_INFO_POS
8 x9 m4 T- V/ ]" Q - STA Use_PPU_Buffer,X
7 F) b+ o/ ^4 M' E8 x - INX- v8 ?0 D) s7 z* z( \+ C
- $ V* C- D2 C( C p! C7 A
- ;居中
% L: F n7 @" F* o8 ] - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ O4 O5 }7 K$ |7 ^ - STA Use_PPU_Buffer,X
- m- E X* j# i. ]1 p1 K# e - INX* d5 d4 G& W1 y' x/ y A% c$ R1 ~
- ( ^4 U1 ^2 |+ X& V% Z
- LDA #$05
$ v* {3 J, j' z; Z7 R# h - STA Use_PPU_Buffer,X
8 e- l; Y, M K. {! C! L - INX8 d# n$ b; w3 L2 ^& j# J2 H- k/ z1 g
-
# d$ [: k0 c( ~% N6 B1 V! N# T: f - LDA FC_Music_Index
3 K8 t& T! @0 X# [( X - CLC
* i. h. d& ^5 T* N2 O4 e - ADC #$01: z) Z+ E; m* Y8 b
- JSR Hex8ToDec# q# P V% [/ l
- 6 Q1 G. ]! r" R
- LDA FC_Dec_Data_10
+ r2 m7 W1 B' e7 } - CLC, x+ ], }8 B' S# [
- ADC #'0'. G+ z! E5 a( H$ A# s. ` L
- STA Use_PPU_Buffer,X
6 A4 U6 \8 z; J W* o. j# J - INX
$ `8 v: ~# j4 u$ q. A- S8 U -
% L6 T( c! e1 q( O, Z8 _ - LDA FC_Dec_Data_1) [6 r) S3 {2 W) g8 f
- CLC
( f# t5 p: W) s - ADC #'0'
( N6 X u% j, b4 _, Y g5 h - STA Use_PPU_Buffer,X- m: z6 g" \* Z5 E6 e# ?+ k
- INX7 ]3 W* K& x- _/ w% V
-
9 d, G! Q( c3 K4 R" K, w - LDA #'/'( Y2 X4 `- ?) u+ f8 Q& s+ P
- STA Use_PPU_Buffer,X
6 I. z. y. h( ~" J: z9 s - INX6 M5 _1 J/ y& v" g' p
- * @$ z" @/ e0 H. x" ~5 f
- LDA FC_Music_Max_Index+ m( x) m* O+ C: k+ R
- CLC$ Z* m U& ~ T2 p! S
- ADC #$01
- H l3 q/ N8 C- `" _ - JSR Hex8ToDec) @ u8 ]1 G( _2 Y3 M& \* l- n: |
- ; ^3 @3 X3 F) ]5 x# m2 P
- LDA FC_Dec_Data_10* D" z$ a# y1 R1 a; h
- CLC/ d( b/ [ Z2 A
- ADC #'0'2 i) Y3 A" k' C& U
- STA Use_PPU_Buffer,X
7 V+ N8 r# Z, C - INX9 i1 C+ Z: v" U# t5 L# H" I
-
7 I7 ]! X0 t* ]% e* l; ` - LDA FC_Dec_Data_1
$ G. [3 N# c r2 c* c" U - CLC& q( [/ N r4 d' \( l% {
- ADC #'0'
& c: T3 X3 d5 m% @0 M - STA Use_PPU_Buffer,X/ I, e6 H5 z* L% T3 `
- INX
4 A' i* g& {* x+ H - 0 n8 } f1 x2 I' e) G" c3 S
- .End
4 |; ~+ F; z/ _3 a7 _* k8 A - STX FC_PPU_Buf_Count; g6 [6 V5 K3 J
- RTS" q" y9 k* Z' a# c, U3 f9 ]
5 }6 u# A7 b$ R/ j: X0 |- ;----------------------------------------------------------------------5 d5 H/ Y# s, s; i8 c2 n
- ;音乐曲目初始化处理
D( I2 Z& `* b8 B - Music_Init_Process
1 U3 h9 Z9 C0 `7 Q1 l - PHA
) T8 y) V m2 a8 L" D9 e* W( @ - JSR Music_Clear_Process
- v+ e. K9 ^/ I9 M - LDA #$1F2 P& A2 X4 D8 {: \
- STA $4015
3 ^! _! e5 F! }# n - PLA1 f: I( ?. }" k7 w3 y0 P8 A
- JSR Music_Init_Addr& T( D7 d3 f" r9 _. k/ e
- JSR Music_Info_Display4 s" }( E3 t: f
- RTS w$ j w, D" K0 g, i$ P
- * a( `4 D' N5 w' B) ^
- ;----------------------------------------------------------------------8 P M j9 S0 v/ C* ^) b; |
- ;音乐播放处理5 J W$ }0 Z: R; p l. ~
- Music_Play_Process
$ M2 k; h7 d/ Z1 p g" f& K6 l - JSR Music_Play_Addr( J+ M# x a$ p+ o" M
- RTS
; u4 g8 x2 v. Z* E% o
' V8 I+ H2 S/ Z. p! X N! B- ;----------------------------------------------------------------------
0 }2 A6 o; Y- [) a3 s1 ? - ;音乐播放处理
; q; p% g+ V& |, J6 ^ - Music_Clear_Process# q9 p; a% u {4 u( F, |6 x% P
- .IF Music_Clear_Addr; D9 p5 L" E7 l7 @, L9 ~
- JSR Music_Clear_Addr
3 C R0 }0 k z" {8 T9 C. d - RTS
2 |9 \: I" f4 |3 i% C5 p - .ELSE
4 o i O. E# v - LDA #$1F
: O3 u& B+ D* K j1 ? - STA $4015! g( q5 g$ e+ Q! k
- LDA #$00! E* M4 n/ h. F+ Q
- STA $4010
0 x( ~6 g# I0 _$ Q2 o& J7 A - LDX #$00; ~2 ? h/ D" |+ ?; k
- LDA #$00% g3 ?3 o3 |. _- y5 T$ g: F
- : j) \9 M, j2 }1 a
- .Music_Clear_Zreo_Page_0+ y2 ?% \; b7 g% L
- STA $00,X7 s" v7 U1 t G+ g& ^+ j
- INX
/ Z& {4 |! l+ d& L - CPX #Use_Zero_Page_Begin9 z) F5 y# N3 h3 F8 V5 z" _( t
- BCC .Music_Clear_Zreo_Page_0
, [0 q9 `# {$ z) y, S -
! j: M: \8 e( s" ~- z& y6 l - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size8 D7 [7 m8 K& Q- j
- .Music_Clear_Zreo_Page_1
8 @1 y( V& ?0 Z! W% E4 Z - STA $00,X7 E0 |0 l; M1 B0 X3 ^
- INX
- @2 k* S! Q# L0 H' t% K - BNE .Music_Clear_Zreo_Page_19 R8 b" ]3 m: i# {9 X* C
- * Z, c. z3 t6 F/ l) A3 |- F
- Music_Clear_Process_19 |1 C* I2 o( E* W, d+ m
- STA $0600,X
" u: g. D4 w4 r( }; A3 g- @ - STA $0700,X0 H: N2 ~' @# Z$ I, ^- B- I; G" i
- INX- h3 G$ X: s2 A2 V
- BNE Music_Clear_Process_1; X1 f6 u5 L3 `0 S- V
- LDA #$10
3 e, y7 C9 K( W! A4 R. g' \' k @ - STA $4000
- C5 w( Y) n7 A$ g2 k( E" L E2 P - STA $4004, E4 _6 O% u) y' g7 W
- STA $400C
' K I* F, o' ^' ~( u$ ` - LDA #$00
O3 Z% g1 l7 h \- c2 F& C - STA $4008' q i! c y( ]6 g! c3 |; D
- LDA #$0F/ m8 ?; z! i0 _6 a2 Q# g
- STA $4015$ @2 ?5 |4 r5 g2 r
- .ENDIF
3 R7 c. c: D/ t; o( z - + b7 X: |3 \! d
- RTS+ E- b2 `3 m5 |% ~$ s4 ~' C3 ?
( }5 {9 e! o, {9 e- ;======================================================================
3 T5 V$ \+ ?$ a2 u8 p5 x) R* @ - ;重启处理4 m( z& M( j: B, ~' p# o
- Reset_Program
6 j3 B+ j* J0 p; [2 L. D - SEI5 h% M% k% P3 [! E
- CLD
) K n4 E3 s7 ~9 n/ E M* t - LDA #$00
1 }: v- C* N' E. f5 ^! A3 e3 C( G - STA PPU_CTRL( s( U8 X6 v/ k7 I* g
- STA PPU_MASK
0 F0 W# V' T) { - STA JOY2_FRAME
: Q: h0 L" l; c/ }) Y - STA APU_STATUS# h" I4 d# Q ~" _; k( o, ~
-
& ^1 X* C5 [9 N1 J8 l: A0 G8 O - ;等待屏幕准备完毕& G; D& z" U, H% E0 W7 M' v' Q9 U& a
- LDX #$028 }9 d1 I3 e# c4 R
- .Wait_For_Screen_Ready/ f# }3 G# [- @( x+ u7 x
- LDA PPU_STATUS
3 f0 x7 n# Q' @& `3 O O+ Z# z - BPL .Wait_For_Screen_Ready' {. P j9 I/ ^# j" J! p
- DEX
9 m% e( n; T* V; Y - BNE .Wait_For_Screen_Ready
3 U: S9 a# T0 c5 {3 x - # p2 j) k+ K' W2 e
- ;清空调色板
3 `, i6 O4 m) h& g4 k - Palette_Clear
% C& b1 T! N5 B, q' f' ? - LDA #$3F
# O& |+ E+ ]& R* @6 ? - STA PPU_ADDRESS
9 R. b. I! c& q - LDA #$00$ \' ]! B8 a: @2 d9 {& e" p% b% s
- STA PPU_ADDRESS
( u6 X( Q- Z9 E3 M4 N; R) R - LDX #$203 Y. w! S8 p5 k" w+ J6 g; z( x7 k
- LDA #$0F( E/ L! d: d7 |! k
- .Write_Data
- |+ I& b* i, i2 N7 x3 l8 @ - STA PPU_DATA9 U& D4 `) A+ {0 Z. c& I# E9 b
- DEX( z4 a/ k& c5 Y0 Q3 t' Q
- BNE .Write_Data3 w* w3 ~$ B5 W: i( |6 A
( F3 ^0 Z6 } i6 Y- ^: @1 o- ;清除声音 $4000-4013/ B6 f9 ]; Z1 M* U Y. x7 d# C% X; w
- LDY #$147 F8 m/ H! r1 e1 t6 S
- LDX #$00' y$ s- W# K( k/ C w: }7 e9 |
- .Sound_Clear! ~3 T5 _% N, p. C% X, j. s
- STA $4000,X
2 I1 j) t8 i7 q9 n, S C& c - INX3 \# s8 t! M3 m c, r5 I1 Y
- DEY) u: F+ F: w# m- B- ^
- BNE .Sound_Clear
* ?8 Q7 h$ ~0 Q! L( F% S! Y -
' s8 X0 E' @- ?& o1 A7 ]- C - ;清除 RAM $0000-07FF3 C. ^ _' O! R6 q z" T
- LDA #$00
8 U! A+ J2 F& C$ g - STA $004 {: [6 k# c! {8 I4 I( ^
- STA $01
0 R7 c% z. `) F+ l - TAY
, W$ K$ F- E$ G3 R5 { - LDX #$08
! ?. U+ G, ]1 K1 O5 ?6 J# _+ [ - .Memory_Clear
9 a9 Q& a0 u! \& Z7 k - STA [$00],Y0 m/ }$ ^4 }4 c6 N0 Q
- INY5 j* m( q) h9 E, w* M% [; w$ z
- BNE .Memory_Clear
; @8 g) ^; g: v6 t) e* o) q - INC $01
" i- Q# o+ r* Z0 E) _ - DEX( S" B% a) K& G3 d) [' [
- BNE .Memory_Clear# ^+ V- D: S% h) \, r# \- M/ ]( v' |
-
/ S* I! H" G; C6 U - ;精灵缓冲初始化
) f+ W2 R; g: I/ U# u; W5 o - LDX #$003 n: q3 y) `) I4 Y/ Z0 i! h h% I
- LDA #$F8
# c3 M) t3 X. X5 B1 q - .OAM_Clear
: t- c3 N9 p2 ^' q' q- T) V - STA OAM_DMA_Buffer,X9 b0 X5 n' M; N' B
- INX9 s, n) l- U7 a$ C# c
- BNE .OAM_Clear8 m M$ O+ b9 f3 r3 h
-
' O( f7 { o, I5 q0 Q3 { - ;栈指针初始化
$ T# x- ]8 C2 j }; P- |& m* q - LDX #$FF0 S3 r% |1 {6 R/ a& H
- TXS* v: Y7 _1 P& x; z$ Q
-
0 L; g" J6 k/ b; d( q - JSR Nametable_Clear;命名表清空
' K( \0 ?8 }- ] - JSR Palette_Init;初始化调色板缓冲' c7 E5 G* X+ e$ a4 {- k H
- JSR Static_Text_Init;初始化静态文本/ f5 a# Y; Q% N
-
5 y+ m" V) `- S0 Y - LDA #MUSIC_ITEM_TOTAL - 1
4 i6 ~4 N3 C$ R - STA FC_Music_Max_Index% x& o5 s/ S7 A0 i9 }
-
7 |$ v& n6 f1 I& M. L - LDA #$1F
0 S1 e5 n$ V7 d9 k5 `$ g - STA APU_STATUS
1 z; |* Q& E' v8 s$ v4 j# P* Y - LDA #MUSIC_BGM - 1. W4 ?) F5 x" H a3 w
- STA FC_Music_Index
& Y7 D' T# V) h - JSR Music_Init_Process;音乐播放
" _) Z; t2 Z; O% e9 C -
5 _% I. }2 r1 g4 Q; B0 z - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
[$ _& x U/ U9 U" S - LDA #$1E
/ D' m" k, Q7 R6 G - STA FC_PPU_Mask_Buf
. V2 u# [% C1 T0 G6 ]& Z2 P, r8 b. L' \ -
: x, o+ y, |2 a. H - ;启用NMI处理
' o- n& I7 m% f; l6 { - LDA #$80: j% e% b' k8 a0 W
- STA PPU_CTRL5 |, \4 y. G+ {0 U* c6 a% c% `
-
, v* z* a; A1 a9 L - ;程序循环, 剩余工作交给 NMI 中断处理' M: z p# A }6 @+ V+ J) }
- .Loop
3 e4 \8 m6 J9 G - JMP .Loop
! K l, z. m7 x. U2 \6 x - 3 Y3 W+ h* X" }
- ;======================================================================
4 r4 x4 O7 J4 p2 _ - ;不可屏蔽中断处理/ R$ m, K. A! u/ q) L6 J1 w
- Nmi_Program
5 }* j2 a% |: h7 \8 S/ ^ - PHA# d6 l' g0 c3 j7 G) W4 L
- TXA
7 a- P: P- }6 d0 ]) D6 p - PHA
) U6 E+ r8 T; Q2 Z( Z - TYA) a* l0 \+ e" `4 A$ s
- PHA
; M$ O2 k( k6 w- C1 E# [$ t - - Y$ S: Q+ J% n3 C% S
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* s4 f9 T. N n s
-
8 d# A9 Q) j R- u( e9 @ - JSR FC_PPU_Procrss;PPU处理' a3 L7 K2 [8 @) o/ {3 j
-
( G0 S8 Y; T* P7 A2 h: ^6 u - ;精灵内存更新
" p0 c7 c. L1 z0 f0 O+ k - LDA #$00
2 o2 \; N0 A7 S: t9 p) p- p - STA PPU_OAM_ADDR
& h6 N8 W) n' G6 `0 P! r - LDA #OAM_DMA_Buffer / $0100$ f8 N4 J+ H3 Z, B' |
- STA OAM_DMA0 s4 D* m7 L- T9 e
-
+ G- P8 C: Q5 Z( E7 t7 I - JSR FC_Gamepad_Process;手柄输入处理
. d# j. r2 d! D - JSR Music_Select_Process;音乐选曲处理
9 P' U: K# `; Z+ T - JSR Music_Play_Process;音乐播放处理
1 t3 D- V/ [+ j. z( A -
5 d/ a, j1 r s8 g( [% `) \ - PLA
! _/ z- S: r d8 E0 @( b - TAY
/ K u4 U- |' ]4 P+ G/ ~ - PLA7 [9 j, l: X7 I+ T3 ~
- TAX
; E) ?+ {, a% m$ z4 X6 P - PLA" Q! \, m/ C( M# X3 E" X6 `
- 6 u; L+ z/ m7 _, V3 t% r
- RTI" w1 k4 Q# f5 i& R( j! X
- 4 \- c. b1 w6 ]8 Q6 V1 z4 s0 C
- ;======================================================================6 I, y8 W4 o# r8 A
- ;请求中断处理
# J, b G0 i& L+ o7 A - Irq_Program) }: [" m& d0 [8 G6 F
- RTI9 @8 F$ {3 p+ a
- 1 ]. ?( E$ y4 k. R
- ;======================================================================! X. w# N9 n( _# O2 z0 k$ A
- ;中断向量表% w, k0 o: c' [
- .ORG $FFFA- V/ b* T: K$ O+ X
- .DW Nmi_Program ;NMI触发时执行7 K$ }# Q; S9 b" @$ }; O5 n
- .DW Reset_Program ;载入ROM时最先执行
7 y4 P1 u" d* R$ d) k, C [ - .DW Irq_Program ;IRQ触发时执行6 f, D$ V1 z I! ~5 V5 k0 b' U
复制代码
5 g& n3 \2 X" M4 [( e) j3 [% \- o( K6 D6 K c1 U
$ R$ F5 D& g. b9 `" jhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|