|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下7 O6 r0 X' ?& h. O T

1 y; f! o+ ]( v5 |5 ^. q* ?3 [以下是主框架代码:- s0 s: L2 d1 N* i9 E+ z
- ;======================================================================
7 g/ _. M/ p& u4 P2 y7 T - ;文件头
7 Z" \9 T' v* P! Z9 N, c! ~, }3 D - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! D& X# v2 f- I - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量 E4 f. T3 L _) E1 a* ?$ e$ k
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
- I# B2 m: Q9 j' Q/ ` - ;======================================================================# R( N" G( j! m% d8 [
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 20 ]* [" n, Z; Z1 [4 W& T" D
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 17 M8 v: L. q" J" U3 l! x4 t' b' Z, j
- ;======================================================================7 I( B4 c# R# _
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 11 h+ K0 S3 a* P% J# z5 g
- RESET_ADDR = $E000 ;主程序起始地址9 {7 [+ E/ L& Y3 V, u( c
- ;======================================================================/ B' Q: ^% {" B& g
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB& ^' l# x* i8 @. _, r$ G
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
$ ~: \# c$ B5 m& `, A5 m - .INESMAP 4 ;Mapper号 (0-4095)
$ t) Y8 j6 x) t - .INESSUBMAP 0 ;子Mapper号 (0-15)3 D# O* C6 l) M& ]( G$ x; h
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- z2 s% V. ]( L! @, u, _% q# a
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
& b; w8 C, L2 t1 m! |. s - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& Z% l0 c1 t% ?- f7 d6 f! } - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)1 A- e9 {% ^( t9 q$ L
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)# g9 h9 {! ^) X9 _: a* K' w& Y0 \
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
3 e1 ^3 L) \& w+ W2 J - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
8 W, _+ d. k% R4 A0 \ - ;======================================================================8 N2 p( U$ }5 _2 V4 x. k
- .INCLUDE "fc_demo_config.asm" ;全局配置
6 a$ E6 D. U/ r6 `* p - .INCLUDE "fc_demo_constant.asm" ;NES常量. ]2 j" u: o: S4 T# E C2 F' ?
- ;======================================================================
, Y& N& ]' H, S9 _ p - ;音乐配置/ Z4 n2 b6 _8 j. ^# F+ ^+ T
- .IF 0 = MUSIC_THEME
0 E8 d3 m: O+ h9 e: H u - .INCLUDE "data/music/Gremlin 2/config.asm"
2 \+ ` d% j3 B! K L T - .ENDIF- s! G5 p0 b$ A2 J9 B
- 1 Y, _& p% @4 d7 o
- .IF 1 = MUSIC_THEME" o8 v/ Z. _" C( X9 i2 {% e
- .INCLUDE "data/music/Raf World/config.asm"
! M, h3 Y% N) ^ - .ENDIF3 z/ ?- ] {* f: k( I
- ' w- c( [9 G( s$ f N
- .IF 2 = MUSIC_THEME
" r$ l7 N- K7 L. d' p" T - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"( t' _. C' j C8 O
- .ENDIF' P( [4 P/ K: g4 V. I/ o4 c
9 z/ x* }/ o! L4 p+ e% @- ;======================================================================' F0 x( g t# V' k. [) a; s9 _
- ;引用CHR图像数据
1 S! c7 n9 Y* t& s, z3 @ - .BANK NES_16KB_PRG_SIZE * 2& o' O5 d4 j/ t" A2 c
- .ORG $0000
$ m h% Z8 V0 [: M8 o: a4 T$ c - .INCBIN "data/bkg.chr", l6 z! U8 f) V% C0 C- ^4 P8 @
- .INCBIN "data/sp.chr"1 V9 |) G. P; z% V# i
- 8 g$ K2 H, N7 T
- ;======================================================================
/ _. s% X4 f0 P6 ] - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
- Q5 C! w& A3 V' N% m2 L% L - .ORG RESET_ADDR0 \$ C8 G8 T" N
- ;======================================================================/ V- V0 H) }1 k* g
- ;引用其他源文件4 q2 c6 z- f" t8 M' {
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 c0 a$ d2 x: b: X: h* [$ d* B' H
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
* Q: }) q" g4 ~ - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
" \7 ?5 ^% A1 `* L% k - ;======================================================================
$ S! }- y$ B2 G9 b - 2 e0 J$ ~2 V ]/ J
- ;======================================================================
' H' `3 M/ K# r2 z. W! b# d - ;等待VBlank到来 Y& H! J5 e, H6 T- u
- Wait_For_VBlank* J" ?1 u* o5 J( G
- LDA PPU_STATUS w( o$ \% L5 {; `& g6 Z9 ]2 I
- BPL Wait_For_VBlank
' E6 o c" ~( M( D - RTS5 R' _$ L7 Y5 E$ h5 l
- 1 b0 o ^, J: o c
- ;======================================================================7 A7 l/ t1 W6 B1 K; W
- ;调色板初始化
0 X% y1 A S% y$ {. m3 R" B - Palette_Init
: w& O' E! Q+ R j2 \* z* }. N - LDA #$3F
2 w$ i, q8 x' x3 S2 V) J( H; Q* ] - STA PPU_ADDRESS. D6 S$ l$ g4 F# ]1 e( f8 t p4 [
- LDA #$00# a4 o! D# s! R* o( r
- STA PPU_ADDRESS
" U. T1 z( n8 I - LDX #$00
$ a$ D' b* `; _1 U+ M - LDY #$20% [( ?3 F' z4 C8 m t/ x
- .Write_Data2 F% S Z! ], b/ M% X
- LDA Palette_Data,X
- E1 Y7 O. f+ @* a: A2 ?" t - STA FC_PPU_Pal_Addr,X4 L: l+ {! x* c
- INX
6 _9 ^( `+ [" }% Z- w- H v* J - DEY: A' w5 N ^1 E
- BNE .Write_Data2 Q& n6 f' d) L, ^" }
- .End
* f4 s' \! Q9 M' Q - RTS
- n, l1 g# Q5 H1 }
4 \% H4 g- J c6 U1 `- ;----------------------------------------) S: T, [, L9 @" t$ Q, L' i" d$ N$ F
- ;调色板数据6 B. W! {8 Y6 o/ j2 x' O
- Palette_Data
" \; Z5 x2 \3 y% L - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
% T5 R& T( }; X+ s - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22& s1 P4 M, Y2 \2 Z" l$ n/ B- g, c, C
-
2 ]# i4 K: h, A: f$ M5 a- m2 A - ;======================================================================
$ I* i7 B9 Z$ i* k. h" z - ;命名表清空
# t% A4 Q( o. ]) {4 {7 x1 X% u - Nametable_Clear
1 @% N+ t% y+ P - LDA #$20
$ A+ ^; h9 `6 u, j0 e& U - STA PPU_ADDRESS
! `3 M; B2 V [/ W$ _' A( w - LDA #$005 m6 H! [8 i% |
- STA PPU_ADDRESS" `$ l5 [5 ~8 X. \; Z$ O: {
- LDA #$005 Q/ ]; t2 B( v8 ^
- LDX #$00
. w" E% \% f. q - LDY #$08
" B5 h+ V$ a9 ~$ x0 X0 j1 ~ - .Write_Data" n+ D4 e, j( d0 h3 j- L( R$ D' [: y
- STA PPU_DATA+ J2 @/ h# ]' H/ a. ?4 t. e1 q4 M
- INX
/ S+ L$ X- N7 i - BNE .Write_Data; g% [# e, y& K
- DEY
; T2 t# m: O% c/ V, Q3 c( w/ b8 ] - BNE .Write_Data1 O: p, P) v1 E9 {; h! g4 n& L1 H
- .End
8 y' C! ?! e# Z; ~4 m6 R; a - RTS6 o. X' w0 J8 {* k; L
- * P) S( q! o2 ?) E' M
- ;======================================================================
$ b6 I- j+ e: v: y2 P/ p. l3 T - ;音乐曲目切换- w! \) C2 A; U+ U
- Music_Select_Process+ @9 ~# Q4 W; y
- , {/ i; A. ~% I3 F5 ?6 [& ^+ X3 J2 c
- .Pre_Music;上一曲
% {. _9 H- Y, M9 v - LDA FC_Gamepad_Once- U/ F5 J% v7 R
- CMP #JOY_KEY_LEFT& Q, `7 p" z$ C( {% d3 d
- BNE .Next_Music
b" K2 o2 d5 U5 L; w) d j- t - JSR Music_Play_Pre
' F$ Q0 q) u: t& E. t) K; r - .Next_Music;下一曲9 c* u9 V" n8 Q: y
- LDA FC_Gamepad_Once
/ N/ [0 Z# r7 x5 Z - CMP #JOY_KEY_RIGHT
4 D% b; w8 K W. Q+ d - BNE .Next_10_Music% ^- f3 G/ `! i4 C. Y) M2 F- { C
- JSR Music_Play_Next1 j: O3 o. J# R0 q" x' v
- .Next_10_Music;上10曲
+ X8 B0 g1 p3 m5 o; A% n1 f r - LDA FC_Gamepad_Once* ^$ M8 e( X; M9 f
- CMP #JOY_KEY_UP
* M; V* E+ w5 C% H, A' O; A - BNE .Pre_10_Music1 K! z) d3 x, p h& q* I7 h
- JSR Music_Play_Next_10
% X/ W- ~8 _; U3 `+ \$ X - .Pre_10_Music;下10曲
& U: ?) W: ^2 } J6 G6 B - LDA FC_Gamepad_Once+ T5 G, E6 C. l7 y+ P
- CMP #JOY_KEY_DOWN" j; i" S" t! r
- BNE .Reset! N) p! \1 W( v# S
- JSR Music_Play_Pre_10
+ u, o" V2 O; {/ t+ @0 b - .Reset;重播当前曲目
2 x9 L3 D% X8 O2 j) e- v! I2 A1 h/ e - LDA FC_Gamepad_Once
+ ~/ ~/ Y% \* F! y - CMP #JOY_KEY_START1 }& F7 J; h" V5 x8 U
- BNE .End
& O$ d; z$ Y" {3 i- Z( F1 p1 P - LDA FC_Music_Index) t% b% N1 e: P; z0 [/ \$ N. R
- JSR Music_Init_Process1 \! V8 R1 V* d6 r \7 S
- .End
$ U" q: b& |; G: v, n% t% ~ - RTS
3 i/ r% t% [: W' H" R - , c0 Y9 M% T& Q. J7 w+ P
- ;----------------------------------------------------------------------
" K$ U; b9 l7 g0 y; K - ;播放上一曲
* P6 w& m5 `3 q& ?/ K - Music_Play_Pre
3 ?& w! E3 o* B* w - LDA FC_Music_Index5 _* }8 a. ~( M9 F8 A
- BEQ .End! v* U% k: u6 a5 u$ U
- DEC FC_Music_Index
' I ^; e; Y; x+ \% n; h: @ - LDA FC_Music_Index
3 t9 _$ ~$ H) ^, d* l) v- L4 y - JSR Music_Init_Process
. _1 M0 ~$ u5 m _; P$ L; b, Z - .End1 Q) T _# H" t2 `+ d$ I
- RTS
+ g6 }4 B4 c1 c - ;----------------------------------------------------------------------
& }4 b- D+ }, Y7 b. L8 _ - ;播放下一曲
' u& s; j, y5 B" N$ p" K - Music_Play_Next7 G% k8 T& q ^" K) ^: z& Y
- LDA FC_Music_Index
" y- i6 `7 R/ F. \& K* ?( P' o - CMP FC_Music_Max_Index
( U1 U1 W; Q: y" S3 s - BCS .End
& k/ V* |; z+ K7 o0 y - INC FC_Music_Index q% P8 @# F# V6 L' g2 T4 X
- LDA FC_Music_Index. [ x. n' C& J1 N2 \& ~+ J
- JSR Music_Init_Process
' K. j) x" _4 I' _: h- n" m - .End6 X6 k5 }9 j+ x1 F, K: F
- RTS$ Y9 b/ h9 X3 R9 R q2 w' P
" T9 u& }: w( y) S7 @5 d- ;----------------------------------------------------------------------' Q. K* O5 d0 B- q
- ;播放上10曲
4 I0 Y4 {; j* {( Q( c, b* ~ - Music_Play_Pre_10
" Z' D M* L; u& h - LDA FC_Music_Index
$ _7 U# g% D6 d - BEQ .End
- i4 I8 ?7 o( n, ]4 g - SEC
: ?: J. L5 O* F2 f - SBC #102 s! v0 h/ K3 j0 W& Z+ ^& c5 f' p
- BCS .Pre_101 G( |) N! f4 I
- LDA #$00
8 ]& x, V1 E7 x* D- s1 l- U - .Pre_10
( O5 @8 S+ s3 ~ - STA FC_Music_Index
# N; K$ d/ K* Q4 l' B' a - JSR Music_Init_Process
/ w" L# E9 E; C6 R3 p- w, D" l - .End( Z1 Z8 t+ h9 M" c) W3 h+ o9 N
- RTS, @: c" U3 Z7 o* a
- ;----------------------------------------------------------------------
7 R. U0 P' d1 E( V: i/ E - ;播放下10曲* n2 b' [! C7 ~# C4 h- E
- Music_Play_Next_10; F& E& ^# M) E" x
- LDA FC_Music_Index
, [/ l: t- n4 Z& X0 N8 r4 a8 C - CMP FC_Music_Max_Index) s, T2 B. V6 k" @# {3 [, h% m
- BCS .End! m) ?, N5 _0 x7 L5 d @
- CLC5 O/ m" @* I; w
- ADC #10& R3 k [. J0 d& a g
- CMP FC_Music_Max_Index1 J: ?* a- d" v' v5 {5 @/ |9 t
- BCC .Next_10
9 Y) i* W) V# |# f6 X+ } - LDA FC_Music_Max_Index# w% y( j- z8 i* M
- .Next_102 v) U% Z* k4 R
- STA FC_Music_Index
5 W/ k# h) D* W% ^. K - JSR Music_Init_Process$ H3 G9 Y6 w$ h) J* K; m- `
- .End. Y9 h- i8 k) k7 N3 y
- RTS
8 |- D! W3 H( ?% G - ! `0 Q6 p' Q2 E9 m/ e
- ;----------------------------------------------------------------------" h: Y. J2 V+ V
- ;8位十六进制转3位十进制制; D: t' W+ z: v
- Hex8ToDec
- B7 L2 ^" `* ? - STA FC_Dec_Data_12 X# X* _& m( a5 C5 i) h
- LDA #$00
, A0 f* `& P* x4 _% `4 i - STA FC_Dec_Data_100, x9 z( p- ?6 P5 z
- STA FC_Dec_Data_102 K3 x; Q/ v6 d
- LDA FC_Dec_Data_1
- t- k7 v% }3 \* S! k+ O - .Convert_100' p8 z! O! X" I7 a# k
- CMP #100/ h. L4 R' i7 y: w1 v& _4 x
- BCC .Convert_10
3 |, X* y! ^& K2 K - SEC$ ?. N( F7 E% u8 u+ i
- SBC #100
; g) Q' W9 {+ ^3 q- _5 z# ] - INC FC_Dec_Data_100$ \) |/ W8 G# M% t/ J2 o1 D7 I
- BNE .Convert_100) s" ^6 \. Q" {+ s4 n) r
- .Convert_10. Y- T$ y: c( s* ]
- CMP #10
0 W$ q$ D0 }3 t& v - BCC .End
X! d$ c8 J1 [. w6 B) J% S$ R, E; n - SEC* Q" w4 k* `/ g- D7 | T/ a: @
- SBC #10 i# d/ N# f) |3 _' @
- INC FC_Dec_Data_10
9 G# z; [; x& p* L - BNE .Convert_10. s6 s& p5 J. c
- .End- G4 j4 I' q" q, ]* c% s
- STA FC_Dec_Data_12 ^+ V5 M$ E+ R! J! P9 Q; S
- RTS
N. a+ m' A, o. a1 z - * M3 C& i2 w6 b1 I$ x: [- Y8 a
- ;----------------------------------------------------------------------! X! q* c5 y( ^5 F$ D
- ;显示曲目信息( q6 G9 T1 _& B* W' N- N
- Music_Info_Display
8 ^, }/ f6 m; D - LDX FC_PPU_Buf_Count
4 C0 `' }' j6 i1 b - LDA #PPU_WRITE_MODE_CNT_LINE
: d+ `4 [3 w1 \% Q" @$ i; q - STA Use_PPU_Buffer,X
) M6 j3 ?. D/ ?; R4 y; h1 Z/ @ - INX/ Q% D) K8 N4 w3 y
- ) J% N. `# I9 |* G& F; c
- LDA #>MUSIC_INFO_POS
8 j. d+ D1 C8 W7 R# y. h6 [$ w - STA Use_PPU_Buffer,X$ r. y$ E; B' g6 a$ j
- INX) y o0 w6 P6 ]$ A/ k8 I$ }' l
- % y; d% S, E, c9 ^ z
- ;居中
) E3 O& t1 ~6 O5 S/ K/ ^# N - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
! {$ s9 }: W- ?# [6 w$ s7 P - STA Use_PPU_Buffer,X6 u2 ^0 C, b1 P3 a6 }
- INX+ R+ l4 u: ?/ E% Q( N9 z
-
" ]& G w, s/ `3 n* W/ U - LDA #$05
& E% @. u$ h/ x. H - STA Use_PPU_Buffer,X9 g3 K, u- @& D9 B4 L- s6 k
- INX
& m9 V; Z. L+ F E1 C% q - 4 e8 P: V( p0 S; ^) r3 _0 }% r W5 X) f
- LDA FC_Music_Index
& h3 t2 \4 l" D6 @+ z - CLC
- Y7 X2 h1 [1 c - ADC #$01
+ p- \& v) ^% l2 N - JSR Hex8ToDec
S6 V; O$ m2 g" p7 F - 9 C5 b* b7 A# H* t: i
- LDA FC_Dec_Data_10, D4 P+ j9 @/ Q" v0 C1 T$ [ {+ z
- CLC- d; F7 U) Z( A' i* D
- ADC #'0'
3 y4 Z9 m5 b/ h- f& w* u - STA Use_PPU_Buffer,X1 \ [5 N6 R5 k1 \1 h4 m) ?' p
- INX
4 d$ B; X$ ~4 y, k; Z% C - * K% j5 B; z _
- LDA FC_Dec_Data_12 l6 ]+ ~; ~5 A8 @
- CLC* S" r2 l. O) ?3 h1 b( N4 }$ @
- ADC #'0'5 g$ `, R; E. {7 V; b' g* Q
- STA Use_PPU_Buffer,X6 t& [3 P( _. y" [4 w( L& A4 ~
- INX
% A' i; {) b. ~+ p- G - 4 G# d) D& b: B9 L
- LDA #'/'5 G) t; l/ V' s. i
- STA Use_PPU_Buffer,X) O \& y! o) O0 v' K5 s& b
- INX4 m3 g9 w& s5 S* B1 V7 a$ E
- ) J! D! c* B8 U2 q3 R4 q
- LDA FC_Music_Max_Index$ B+ h" K4 x7 ^: A+ @1 I
- CLC
$ _& y$ X( f3 p1 W# _2 M6 b7 U - ADC #$01
& f4 \+ ], G1 Z3 ~" h, F7 U \ - JSR Hex8ToDec' z& r: ~! o" Z& b3 D& j
- # }9 J4 g R3 b8 y/ K1 t) B7 }
- LDA FC_Dec_Data_10; u5 ^5 m7 {# c0 ^* G/ I
- CLC
3 Z& l! E* ~ w8 ]4 H2 S: N* @ ~8 a - ADC #'0'+ t6 T1 u- K) f% v( D8 C
- STA Use_PPU_Buffer,X
9 ^0 p: i6 V3 L1 f+ d* L/ P; I - INX
% q4 k+ H1 J; p6 B$ P$ | - 0 ?! W/ ^1 k& a% \1 X* C
- LDA FC_Dec_Data_1/ G; ]" z$ G! k% w. j8 w+ k
- CLC
t! m) K6 T+ u: B3 [ - ADC #'0'
5 g' D: x4 Z" ^1 E2 U6 S - STA Use_PPU_Buffer,X
2 f# U8 Q+ s7 Z6 k1 C3 V Z - INX
2 a; Y; V- `5 D' p - . U+ Z! O6 L8 `6 w& l
- .End
2 S* b8 V" u$ m5 S3 u: s7 w - STX FC_PPU_Buf_Count/ P! M2 B/ C. K! h% i. I
- RTS
) |* p4 k* b) Z - 3 a {+ o9 r5 w& q B3 N
- ;----------------------------------------------------------------------
9 ]# e8 A0 b/ t9 D - ;音乐曲目初始化处理
8 B8 y' t6 z, E6 x! }* C - Music_Init_Process
4 B# Y3 k' \0 Z# z2 U& x) ^ - PHA) a/ b$ n& \+ y
- JSR Music_Clear_Process. I! f6 @* k" Z- ?8 ?
- LDA #$1F
, f% t6 c+ i( a( z: [ - STA $4015. e) {* @" d. |& X
- PLA
) L4 Q; X- `3 o q - JSR Music_Init_Addr0 o6 S: ~1 e' m, c/ T9 r6 Q
- JSR Music_Info_Display
. S0 D0 X) O7 r# ^+ E! E$ \ - RTS8 x4 @ z% a/ V) Z) y
- ' i( L0 Z# S! y. h! L5 a" p
- ;----------------------------------------------------------------------
3 |( z5 o2 c# x: d9 i5 N4 l - ;音乐播放处理
) @* X4 U* t2 C. F4 S7 v3 ^# m - Music_Play_Process
( A6 ~6 z& l" {( | _ w: O+ x' p - JSR Music_Play_Addr
. a. y3 l K. E5 x' E - RTS
6 a) x, E$ ^5 p F
' X O/ k1 k* m. P% L. P! I( q, R- ;----------------------------------------------------------------------
: _" r _) q! G1 u& R - ;音乐播放处理. z" i; E" v$ Q M3 ~
- Music_Clear_Process
# |; F6 z$ y3 P( a - .IF Music_Clear_Addr
5 y; ?: ]# H# t1 \) N9 H* n - JSR Music_Clear_Addr
% |$ T$ Z* m6 i( R$ t! Y) R+ F E( u Q - RTS
2 ?2 L, v$ q8 _! w# `" z - .ELSE
$ R$ Z. g" K, v) c4 c& | - LDA #$1F6 D# D- J6 [% c8 c. C
- STA $4015+ j5 W, n8 p$ a. p
- LDA #$001 S/ o- Q/ J4 R
- STA $4010
# r" v: `$ e/ m3 ] - LDX #$003 y# U8 t1 W/ w6 v; s6 g2 l/ P
- LDA #$00
% q4 p& a1 I& D) D0 i& a. H - & W5 T) |/ [! t. v' A
- .Music_Clear_Zreo_Page_0( E+ s7 H4 N2 s7 N: \
- STA $00,X) }* i$ B! v: N; E; E' ~
- INX
5 g+ q; s; q* U) q% @% X - CPX #Use_Zero_Page_Begin7 ^; Q& J# @3 V* v! l3 ]' C/ \6 H
- BCC .Music_Clear_Zreo_Page_01 j! m$ a# y5 v: a
-
/ D6 F' z0 g3 x' r7 ~) d - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size# a; P; B, O1 B+ C9 n- e
- .Music_Clear_Zreo_Page_1
0 T8 z+ g% o5 A- ^) [: n8 i' } - STA $00,X1 X4 {- c+ K, T/ C, K, K: E+ G
- INX
5 l f. r8 [! i9 T2 i - BNE .Music_Clear_Zreo_Page_1" E' _3 t0 y# z- y3 f
- . n/ Q. x6 O2 K3 _
- Music_Clear_Process_1, P& Z* c% b- ] {7 j4 x# D
- STA $0600,X6 U$ ] e' k. U+ b) Y& S
- STA $0700,X$ @4 s* x) \$ c! n
- INX" T- J; @; F$ A. y
- BNE Music_Clear_Process_1
0 _" u) ?0 h x" a - LDA #$10
9 [3 U* d( N( W e+ A - STA $4000
9 d0 y7 s% C u: }) E( |4 O - STA $4004
% T- I. d, l! V3 H - STA $400C+ p9 n7 \& V7 Y9 B; ^5 r
- LDA #$00
9 T! C$ U# |7 D) T H# Q3 X - STA $4008
$ X6 y8 r. x% E2 x- U - LDA #$0F4 w! G) }$ I, D" A
- STA $4015
/ Y- c& K9 `' | - .ENDIF
2 h) Z5 f, F2 x3 h! u2 [# G; O -
8 j) F% K- z' g9 o } - RTS
e' S, w, t- V4 y - & r% l% ?+ x2 o- A: E/ Y* A
- ;====================================================================== x2 Z; V% e* d; [, [& ^# ]5 H
- ;重启处理7 ~+ D' E$ @. o' [6 q1 ~) E$ G2 m& ]
- Reset_Program
$ D( Z: a2 L- d' _, {! k0 r1 h7 L - SEI7 E: W0 N3 Z: ?% [* [- c
- CLD5 {" r9 y8 W- H3 i+ ^
- LDA #$00
5 B4 O4 T! K& Z8 P- b& Y% q+ M' |8 B - STA PPU_CTRL
b* a6 m: h/ q4 W- c; Z/ Q - STA PPU_MASK
% c$ i0 C" a( A+ y8 Q - STA JOY2_FRAME3 z+ A" W4 L% V) ^$ s$ T# q, l& E
- STA APU_STATUS
. ?0 S+ \- A4 O2 F$ s6 b -
, i+ _$ B! [8 _ - ;等待屏幕准备完毕" l2 k: f+ \6 C3 m9 ]
- LDX #$02
2 B+ z* |, K9 h" y - .Wait_For_Screen_Ready
0 C5 i7 [) ]# J3 [+ R% O1 U - LDA PPU_STATUS
8 `' x% R) w/ r$ t: v3 \. K" D, `8 L - BPL .Wait_For_Screen_Ready
0 h5 M* h0 f! f3 y3 a - DEX, a* l4 @: r7 y1 m( i5 s# k
- BNE .Wait_For_Screen_Ready1 t! l+ I; ~' z6 f
- 0 ?) X9 \8 [; M% S
- ;清空调色板4 z% H3 u0 ~; Y% ?1 F
- Palette_Clear
1 s ?+ ~. ? L% j1 s8 T - LDA #$3F4 _- a& w1 e& E0 D0 r8 c6 I+ l
- STA PPU_ADDRESS$ e. y6 V6 | j# ~" r* u- y
- LDA #$00
: e' Q7 d3 D- X! G9 V* E - STA PPU_ADDRESS
2 o/ ]6 `1 i+ K, s+ l$ a - LDX #$20
$ n2 X) k5 Z9 D4 }) ^: z8 Q4 ` - LDA #$0F
2 F. `1 b2 q/ Z - .Write_Data3 B) u5 G9 i5 J. R& ]5 a
- STA PPU_DATA. Z2 }; X7 i( C, |# Z- q8 N1 E* ]( o! M
- DEX
! p+ ~7 M& Z. ~) A, K - BNE .Write_Data
1 X9 W5 F& N4 K% {, x - : f, h! n) w. E& a; P
- ;清除声音 $4000-4013
! F! X; d9 S: N+ E1 | - LDY #$146 `; \5 x' P' t
- LDX #$00
3 H! N1 Q: d' ?6 Y9 {: x6 k: n - .Sound_Clear
5 h B; f' U5 T1 G" Y5 f - STA $4000,X' D, g/ O; [. w0 T
- INX
- I# `2 ?& e( v" U - DEY' ?% q2 C! g6 ?8 U9 h5 @4 n* `, E
- BNE .Sound_Clear
7 C# w: w8 h* }- @0 a$ N/ l -
2 p) i5 V' X$ n0 ? - ;清除 RAM $0000-07FF! `' ?7 _* y8 x: u$ U8 f
- LDA #$00/ n5 h6 A5 f P* Q' e. I5 g( ?
- STA $00- b* R- J) t+ r0 a$ B
- STA $01
# e. T/ {' \$ i( a( M( [( L# K- h - TAY
) ]4 W2 o5 |5 S - LDX #$08( V/ W V) Q1 l% l+ N/ B) I
- .Memory_Clear" L1 U; f$ z! L4 k1 V0 d9 [( L4 H3 W& l
- STA [$00],Y7 {$ |2 y$ Y6 M9 a& V9 Y% l
- INY/ b/ @6 [; a5 C/ Q J. r
- BNE .Memory_Clear8 @2 T$ ^, G# e1 _. _& K
- INC $01# I1 m p) v1 V1 ?
- DEX
2 s A( t+ l! l! Z1 V( F - BNE .Memory_Clear+ i1 S$ h! z7 q0 R/ Z
- ! q* t! E( L( ]& I' m
- ;精灵缓冲初始化
( M' H5 k$ }; U6 F! }) o! E - LDX #$001 v M+ W# M4 ^* Q/ [ r2 `
- LDA #$F81 o" F$ }$ W- a1 u1 d3 R1 M
- .OAM_Clear5 z7 ]7 P k9 _0 y m( J9 z, z4 i
- STA OAM_DMA_Buffer,X
" u$ ?5 V5 o! X1 } - INX
* l8 J9 `7 P( x6 g2 d0 D - BNE .OAM_Clear& b0 W, s" Y$ _6 V4 U# G. s
-
" x% e5 G# i( C5 s: J1 L. R - ;栈指针初始化
$ R( v5 j4 {; B. U; A - LDX #$FF
( k$ \5 e) Y, M: ^ - TXS
9 o0 p2 E6 s; |- I. s5 A# f' v. { -
1 m r3 A- x( l4 ~ - JSR Nametable_Clear;命名表清空2 Z9 f1 A& W8 a) Q8 S1 `
- JSR Palette_Init;初始化调色板缓冲
- X* o5 B( h1 F' ~# D - JSR Static_Text_Init;初始化静态文本' p8 Y) ~( n; U) A! c, ^2 @
- / q; K) D0 m+ W/ f
- LDA #MUSIC_ITEM_TOTAL - 13 K8 M( x8 u, y8 V+ W
- STA FC_Music_Max_Index
! e$ B$ q9 W3 x0 O$ w3 U+ b - # |9 i( x* ]- z( [
- LDA #$1F+ j/ G; D1 `0 C4 L! z1 l
- STA APU_STATUS( F% J0 l% F3 x
- LDA #MUSIC_BGM - 1. ?3 K; F- i4 F
- STA FC_Music_Index% d6 Q3 Y) ` Z0 l
- JSR Music_Init_Process;音乐播放( W4 j) `) t* J2 @0 Z
-
* m% v0 K! J) b2 b- i - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)- x9 K2 L; g# Z9 J' _6 Z
- LDA #$1E5 w7 N# |! `/ }
- STA FC_PPU_Mask_Buf
- W v9 |, T5 j" [* j - + ]7 p7 R3 ^# h% s% ^) D/ w! w
- ;启用NMI处理
: x( [8 e' p" t6 @0 _& n! D. A - LDA #$80
. p Q7 Z: `' k, z& W' g; [3 @ - STA PPU_CTRL, F' U3 b6 k& K* d3 }$ P" J6 l( |
- * T3 F( M+ ~( a! z% O* y; T
- ;程序循环, 剩余工作交给 NMI 中断处理9 M8 A) z1 J) @$ [! h Q5 m
- .Loop
5 m9 q0 }1 ~& C! ^0 W$ n" Q- ^' j0 s - JMP .Loop& {7 s& f" Y5 B' T8 v. ~6 \
- ' n, X/ G+ p& n3 H, R
- ;======================================================================
% u9 `$ O' \' a3 ] - ;不可屏蔽中断处理' E* ~; ^ L" c; V! y1 A2 l- Q
- Nmi_Program* X0 U# ~% s c3 F% H# N
- PHA
- o3 X. y" A6 x0 x! P - TXA; d% \/ N1 m) O2 T
- PHA
$ l. C2 p3 [, H - TYA7 ]) k9 X8 L5 G
- PHA5 {, }/ A! U( G$ N S! m3 ]
-
* c4 D [8 O8 P* D% I/ K$ \; j; U - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
3 \" b# L6 F x- ~3 S4 H5 R+ U -
/ Y' j9 x! }: u' q( i* x - JSR FC_PPU_Procrss;PPU处理4 w8 R2 H, d9 g" {/ E4 U" `
- 9 l, i% U2 l" S. L0 p- s2 g* n
- ;精灵内存更新
) F3 N/ ?5 H @. i" s - LDA #$00* ]- u; o& ?5 u% y
- STA PPU_OAM_ADDR* R' Z& p" S( b# T R
- LDA #OAM_DMA_Buffer / $0100
' t( B) y/ e7 F H$ O5 w - STA OAM_DMA2 U5 C& K* _# v7 N
- 7 x# u. g9 H' v8 \
- JSR FC_Gamepad_Process;手柄输入处理
: U/ w" d: x5 u% f ^+ X; i - JSR Music_Select_Process;音乐选曲处理; k, x& ~9 J2 m& a3 M& m6 w
- JSR Music_Play_Process;音乐播放处理! B" p2 I) q: s' T9 g
-
. w6 y8 ]: V0 {+ L/ A - PLA
; ~. S- l. h. t! f - TAY) f4 r$ e7 N' A5 s- z- Y4 Z2 ^/ p
- PLA
' h( X# d% F; i - TAX
8 m1 @8 A' k. c7 N- \ x - PLA$ t- \9 y+ Z( d* F/ y7 p r
- , r H9 [2 T" W: y/ ^
- RTI6 z/ ~' D5 o: m, U# z
- / D( |* }% A4 M8 m2 g8 M
- ;======================================================================- t, F( R4 g7 G4 ?4 }; s ] K
- ;请求中断处理$ y! u$ |& r S( `
- Irq_Program
8 T. z+ E9 d- L% ] - RTI0 H. B' w- z8 J d3 c
5 [# N" @- e, a+ p8 V, d- ;======================================================================
: e. ^) E: H% }+ [ - ;中断向量表: s1 z1 q. F* V# A
- .ORG $FFFA
* C4 A; o0 t8 O - .DW Nmi_Program ;NMI触发时执行
/ |0 t1 V, v3 j2 \, y h1 S& E0 n - .DW Reset_Program ;载入ROM时最先执行
8 K/ c4 K5 V: n6 t; |3 C1 v: K - .DW Irq_Program ;IRQ触发时执行8 p2 c+ a! R' ^' M7 O) p0 I6 J
复制代码 2 F+ v6 e+ ~( B3 v( Q$ ^" X/ `
; E" o( s: P/ K# |- F1 W) x' P( w$ `$ \0 W* ?! M. n
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|