|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' p( Z9 M& i1 z. ]5 N6 Z& j# ^

. ]! v! S' t/ ?: h2 e3 {以下是主框架代码:1 M' N! L' V8 U5 f
- ;======================================================================$ y8 I) D3 S" D) b4 E' }
- ;文件头
; B+ Y/ e6 O1 |8 D( k - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量& L* Y- z- U3 M: R9 J
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ z* A& a! H: m& k) V
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码4 [9 R7 y7 L, Z
- ;======================================================================
$ T P8 t- B3 V( m1 q - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
+ ^. o) p0 K/ U) \2 q9 \$ b4 s& M - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& Z- m: u& `! y( k' v - ;======================================================================
2 Y. U* l) J* W$ N; |3 r7 x - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 17 Q V0 C- { T4 V5 Q
- RESET_ADDR = $E000 ;主程序起始地址
$ F8 l- ~* Q" { |6 C- S% l+ ^9 o - ;======================================================================
; ~* }! F4 R2 N9 P$ w - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
9 Z, M7 e4 p1 [( W7 l$ K - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 P1 H0 A5 B( b+ ]. w9 ^6 t7 J
- .INESMAP 4 ;Mapper号 (0-4095)
+ Q2 W! L# V+ p4 U; I# `: f& \ - .INESSUBMAP 0 ;子Mapper号 (0-15)
0 ]+ a# o5 L+ y U - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏); N! g1 |+ ~/ t* n
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( l; [) S5 ~8 } - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
$ |6 {/ q7 u$ @( w6 R - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( {. C1 M2 i2 T4 l0 x
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- l& }- l- R" c
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数): g$ Z4 `2 c* K" B) K
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)9 L2 K. y* B& `
- ;======================================================================
9 ~+ [4 u! o; n4 P3 f4 `$ ]* b - .INCLUDE "fc_demo_config.asm" ;全局配置8 K" i, h7 y1 [/ q
- .INCLUDE "fc_demo_constant.asm" ;NES常量
: [# {4 a5 z! F, P - ;======================================================================: u, K+ O( H. i2 t& @! m
- ;音乐配置
/ T' W9 M- Q. o0 I# E. x/ \# Z - .IF 0 = MUSIC_THEME / J0 d1 u& t3 W
- .INCLUDE "data/music/Gremlin 2/config.asm"
: t6 a" V: E! i% q% K% ] Q. I - .ENDIF
9 H; h& J; N& a& ] - 8 K: {: K/ Y# b6 r4 y
- .IF 1 = MUSIC_THEME
- W. C$ P, H2 l+ V( [3 n+ L - .INCLUDE "data/music/Raf World/config.asm"9 }6 w6 ^& x$ r& B8 }5 x7 G" T
- .ENDIF
9 t% G) P1 l o/ e7 F6 C8 L -
$ }1 ^( d# k: [, _& W - .IF 2 = MUSIC_THEME
0 u9 h& @5 h1 a8 X) ` - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"8 _2 b" `* P7 N9 Z& I
- .ENDIF5 ]) Q. _/ A1 n7 t# ] x
- ( H4 c G* m3 e
- ;======================================================================% R$ y% R( n6 N/ W( x4 `; t4 {# I
- ;引用CHR图像数据
* M5 q7 X4 Y- B3 L% d* @ - .BANK NES_16KB_PRG_SIZE * 2% C' l0 f9 ?0 c! f) p( P* x
- .ORG $0000. B' z* ~8 u9 ^ ~
- .INCBIN "data/bkg.chr"
; e) m' S l) d1 n - .INCBIN "data/sp.chr"- C2 C/ g' O4 R: Z
-
! ]+ _8 o& [+ G* P+ x1 f% Q - ;======================================================================3 s: k. W3 `: {3 M1 K1 u
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank7 d' ~9 f7 ^' w4 L
- .ORG RESET_ADDR
$ R1 D5 J% S' S% ^# d3 A" Y - ;======================================================================
$ u1 W0 p( R7 ^0 K - ;引用其他源文件9 V/ Y1 B! Z) x+ R5 [ a
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理# n3 e1 W0 S* l t
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
9 [7 w6 C9 [) G - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
- F1 q* T) r) ?" _ - ;======================================================================2 q1 l9 s& R- ^0 v
, v* j b! y+ d4 u1 q: _2 q- ;======================================================================8 f( @) z P( r0 W8 D8 o; U7 f
- ;等待VBlank到来& K# Z& [; T# n4 H" [2 I9 n
- Wait_For_VBlank( s- x) L& M6 t) E4 h
- LDA PPU_STATUS
) N( f" ~% F, P7 m/ T( y' z - BPL Wait_For_VBlank
$ m& s+ \: o' a$ ?; g - RTS2 g! d3 @& i; q7 @: {
' x( F: \/ J" d# O- ;======================================================================
3 E; A. G9 |3 u: j' y; B - ;调色板初始化
* c6 c. P) Q; C" F; A7 p - Palette_Init; X' V& o, H! ~* Q+ a
- LDA #$3F
0 W; O0 k" K- N& }) r - STA PPU_ADDRESS
4 B0 x# {& g+ k - LDA #$00
" y9 d) Q) {5 r# w7 V5 _ A$ H - STA PPU_ADDRESS
6 ]. g* U/ O8 s - LDX #$001 u. H4 J* h7 B, d
- LDY #$20
: A- M2 w2 ~- j( z; d- g - .Write_Data
% P8 k, O/ y2 w8 E) h" L - LDA Palette_Data,X0 ]( m3 h: \; ], k/ m. K z6 Q
- STA FC_PPU_Pal_Addr,X8 |& p/ H* k4 @0 e- }
- INX
5 R" m m; C; ]* W8 ^ - DEY1 u3 q: z2 w+ ]0 c5 F7 e
- BNE .Write_Data
5 P6 f' V4 I7 p$ f9 O: K - .End
4 V9 m5 d& b* {- @% a, ~ - RTS
8 [, p) @: r8 b7 q. B# N: J
5 y# n* T( X$ r' k% y% ?$ w- ;----------------------------------------* u1 l% C* w# L$ c9 `' k4 y {9 d
- ;调色板数据; Y& ^; Q. x; U; r3 A v, o% X
- Palette_Data
. |9 W4 \* z! P6 U) Q* c$ W* ` - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 P+ P& N ^! p& g' _' Z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
( ]5 A K# Q+ L- B9 \% t -
( Z9 U* Y T1 @$ w - ;======================================================================
- M# p" X/ o# v) O; ^( Q - ;命名表清空3 D! r9 t& `" n/ R4 j) U
- Nametable_Clear1 r; d# U K' N7 k ?) U
- LDA #$20: V9 x( D/ v& ?. E& ~
- STA PPU_ADDRESS( S2 O' l. {! H) ?# z N, _
- LDA #$00
$ }! F) W* z* C - STA PPU_ADDRESS, v- R/ W, Y7 }* c! b
- LDA #$00
* ^2 z( F) M$ M; p6 V/ u2 t - LDX #$00
0 \% D5 \1 N1 A ?0 ]( |# [ - LDY #$08$ @: v6 f$ l, o) j1 b
- .Write_Data
' U& l0 r; i7 C& V - STA PPU_DATA1 W6 w( _# N5 ?4 }& V
- INX
, N. q0 D+ I3 z0 n6 a - BNE .Write_Data+ @% B7 h9 J/ w/ O" [% l- d
- DEY
: P, g$ k& s& K% A: t% ` - BNE .Write_Data2 p9 U# ]* p9 E2 L) p( L
- .End
- ?& g2 Y" s8 b- q* t v" w - RTS
2 }4 K) e! ~8 B1 W- e5 N8 Q3 h
1 y& F& a+ J$ c7 D) y( B- ;======================================================================
) u/ ^3 U8 _4 Z4 u - ;音乐曲目切换
/ d. {6 ]; D, Y: S - Music_Select_Process% y% C4 ]" x7 j% D3 H! l; L. k
! o8 S+ X: ^- x% Z) I' z$ {- .Pre_Music;上一曲3 f/ k8 `4 a) ^- c6 z' q; d2 x7 P
- LDA FC_Gamepad_Once
( P7 N. k0 w; w1 m3 [ - CMP #JOY_KEY_LEFT
: ?% x. y6 d1 d - BNE .Next_Music
+ Z! H# K9 _4 t* [+ r - JSR Music_Play_Pre
$ B% p' T; Y4 } - .Next_Music;下一曲% l6 X* v# V; T
- LDA FC_Gamepad_Once2 W8 u+ r+ d' ^
- CMP #JOY_KEY_RIGHT/ W5 R H' Y9 F$ M \" H) V( s9 g( a
- BNE .Next_10_Music" G- w& j8 N/ {! }! S
- JSR Music_Play_Next- @% x- S! M0 s2 X( V5 Q8 K
- .Next_10_Music;上10曲2 A- C- v g, M
- LDA FC_Gamepad_Once
& g* O f z) @# T" ]0 U2 ]. g! l - CMP #JOY_KEY_UP: t3 O2 z* q1 Z, O+ a" u& D3 l
- BNE .Pre_10_Music
0 n) V) z7 c: W8 A l. i - JSR Music_Play_Next_105 K' U2 O- [& l- C
- .Pre_10_Music;下10曲
: s2 ~4 E6 |* @: T- @& {# n# x - LDA FC_Gamepad_Once1 s( T& X, G# l- w+ ]3 e3 M
- CMP #JOY_KEY_DOWN# W: v/ @8 x6 P
- BNE .Reset7 ]# a% l2 V4 E7 I4 ~* N& P
- JSR Music_Play_Pre_10
7 D8 P7 p- d1 V& l2 c- _' ^ - .Reset;重播当前曲目
( b5 G. x1 S- Z+ H5 e - LDA FC_Gamepad_Once, U; y8 O" ?: W% x" o
- CMP #JOY_KEY_START6 d& F8 ^( r f1 W/ J
- BNE .End
) B3 _, a* C* X6 _& |8 u - LDA FC_Music_Index m- \. l$ S0 Y$ ^# Z. m
- JSR Music_Init_Process( ^# f: |0 l: L! ]4 e
- .End
6 R3 q4 `- m, T& b$ d# X; W& J. a - RTS
( ]' f% w |/ L+ m/ p - # q( d! j7 {1 h- U4 Q" S! \
- ;----------------------------------------------------------------------" A4 w8 N& N4 z- ^2 _3 M
- ;播放上一曲6 C0 d& T" N4 |* [0 [
- Music_Play_Pre. }, l& [9 z' L& ?: \9 D1 a
- LDA FC_Music_Index
3 j& Z; u( x: l2 \6 M0 w; Q; S4 t - BEQ .End' Z, o7 j, Z6 i: l/ l5 u
- DEC FC_Music_Index
% E# M# N7 F6 H- q. K+ ` A - LDA FC_Music_Index5 \0 X. M1 R! \0 O' n
- JSR Music_Init_Process
. a0 x0 |' y8 s2 Y, f! e# e - .End5 Y# ^* o2 g. T- M) L
- RTS
9 S4 w% [ c$ `: S- {. s8 E - ;----------------------------------------------------------------------
5 F1 _% E7 o9 { @8 P u3 I2 N - ;播放下一曲0 Z" W# B% p5 t! R
- Music_Play_Next' ~6 `0 A; p, S, S# `# G( J
- LDA FC_Music_Index
5 s6 f5 e( P! {$ p3 y. v- p - CMP FC_Music_Max_Index
% k' h8 g A- a$ F6 Z W - BCS .End
2 ]0 ~/ H7 Q+ j) \0 L. J" R - INC FC_Music_Index
+ ?1 b7 |- }: a% e! k* n. }: A0 o - LDA FC_Music_Index
* @& `! B' Z5 T( E - JSR Music_Init_Process
+ ?3 R" E) b7 T6 v v; D/ G! E - .End# u) i9 \/ H& r; {: }
- RTS' ]# f4 ?4 A- b
- ) N6 `/ B5 c" U5 F
- ;----------------------------------------------------------------------
9 f \# o0 t, V6 a+ H - ;播放上10曲
2 q! q: Y2 ^' e& j9 a( P7 o& s h - Music_Play_Pre_10
! G# c$ ?( L: `4 C1 \. X - LDA FC_Music_Index
6 P; \8 u: y% L - BEQ .End
6 J$ G# d# u) H& i# V - SEC
- q/ ]- \ k( X" j& a4 d, R8 R - SBC #10. t& }0 K9 i. }; e. B7 v
- BCS .Pre_10
. S0 E" l& |& X2 {6 u8 B$ n - LDA #$001 t) k) L$ G1 b( l; p
- .Pre_10
8 T0 A3 C: L& P. t" m0 h3 v0 J - STA FC_Music_Index& Y, B' ]0 `- U" A8 `5 r
- JSR Music_Init_Process! ?5 X7 D: u: s& `" |
- .End4 A9 v' `% D, Z6 z, C
- RTS
# Z: v' g. j" a - ;----------------------------------------------------------------------2 s8 o; _; @, |! |4 N
- ;播放下10曲$ _- I' m* d( m1 Q! w5 O8 R
- Music_Play_Next_10
+ v9 U( E1 `3 X! P6 V2 d* l! l - LDA FC_Music_Index
6 j) e, {5 n4 X5 u6 R) F9 g - CMP FC_Music_Max_Index
6 S' H9 F0 c. Y/ y3 V5 m; q* P - BCS .End& r' S# `+ J+ ?- Q
- CLC( o: X) o+ T! Z y& w) a
- ADC #10
2 x" k( p- y; x! K - CMP FC_Music_Max_Index
/ T+ X7 ]1 W# r4 q, U9 J - BCC .Next_10; ?) k9 A) }# V
- LDA FC_Music_Max_Index
+ }; v: s8 j1 j) r* B - .Next_109 Z# t' d3 o1 r: j% ^1 E8 N7 C
- STA FC_Music_Index) y' w. W: L: B
- JSR Music_Init_Process- t& O& ^0 `& a C" D7 J. C
- .End! N3 S2 U9 X( J+ j: \0 E" ]/ l/ j
- RTS! K$ i' I7 o1 b3 L* ]7 E
- $ y6 ~. o3 r3 O* ~" ~
- ;----------------------------------------------------------------------
/ z% `1 Y: }2 u5 R! F7 W+ y - ;8位十六进制转3位十进制制
( Z! C( T/ Q5 m% H6 G1 @ - Hex8ToDec: R- Q' F/ Z" d! Q B6 P
- STA FC_Dec_Data_1: O5 t, d }" @ ^4 _! G$ h' C
- LDA #$00
! n( `1 G7 G) G. T - STA FC_Dec_Data_1007 h, x) _0 Z$ T F
- STA FC_Dec_Data_10
( I% ~0 S s% W8 y! Z7 V - LDA FC_Dec_Data_1' \0 l5 k8 M2 o. t) M' A2 x
- .Convert_100
4 B) U1 ^ H3 t& G# t8 M. n3 e - CMP #100! m5 T/ c# S* \6 d, h, j
- BCC .Convert_10) l0 w0 h, C! D+ d$ K
- SEC g0 D. a. Y) b# z
- SBC #100: m$ \+ }6 b! a9 S
- INC FC_Dec_Data_100
! \4 O! c# _: V% X; Q7 @; H: m - BNE .Convert_100
2 Z% Z$ M; Y9 ?% v- z* ~0 ?* F% y - .Convert_10
8 A# V- }6 E: E9 L6 q6 S - CMP #10% p: w) \" n" Y5 e* Y. u1 S9 }1 `
- BCC .End
4 j$ G' {6 R" _: B# \. A% S3 a - SEC
) J# B$ f o ]. k& ` - SBC #10
6 n! { o/ d7 ]1 E( g/ `! h - INC FC_Dec_Data_10% j+ Z6 G9 _/ _
- BNE .Convert_106 D$ f, A/ b/ N2 Z% n
- .End* G- Z j" J9 U8 R( H9 g
- STA FC_Dec_Data_1- l( f B3 b: [; C- j2 {3 `( R T
- RTS
# A7 H( A; R& N0 t
( q" i" Y8 v% R- ;----------------------------------------------------------------------; E1 Z# M3 T: C6 [; B$ s& v
- ;显示曲目信息: M, i* J( z5 p7 J r
- Music_Info_Display5 R' j0 Q3 h Q7 S) K- Y
- LDX FC_PPU_Buf_Count2 d/ a9 S% p6 ^& Q* X+ r8 n- R
- LDA #PPU_WRITE_MODE_CNT_LINE
! A; M% f k! f - STA Use_PPU_Buffer,X
) C6 H9 X z7 D7 p/ E - INX& y8 ~ z/ z7 Z; e2 E5 }" f
-
/ U t' b# m3 R& i- F( H$ @9 C$ X z - LDA #>MUSIC_INFO_POS
: ^4 u5 ~# A U; m, N8 O - STA Use_PPU_Buffer,X$ v R9 p" x1 \% o# v+ u
- INX0 ]. ?9 ]. S9 T: w) o3 P' u3 p. g' u
- : `+ R a! f3 y: s" Y! E1 {
- ;居中! h$ a/ Z- I3 H% c
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2" G* A# ?. i+ J( H# j: T% `
- STA Use_PPU_Buffer,X! |/ F; Y1 H9 x# J+ B9 z, V1 X t) v
- INX
+ _3 Q( B8 p% f' x0 y6 |6 E -
: o* j& Z5 R0 m& {$ P - LDA #$05
. n( u3 p+ S2 f8 {$ b - STA Use_PPU_Buffer,X: W# H* O/ J( k z; q& V1 |
- INX
' O1 m3 @0 P! p& w6 N! B -
% D c$ M2 K6 v; J/ `% | - LDA FC_Music_Index! m/ {% j5 \7 ~1 E) }+ ~
- CLC) {9 g% `6 c: J
- ADC #$01
2 I% V8 U7 t, B5 B - JSR Hex8ToDec! Q# E& x* u1 V; O; X
-
4 x o0 W3 _4 Y - LDA FC_Dec_Data_10
7 O6 N* d# W/ T/ O4 ^ - CLC
5 u( Y5 C: r C - ADC #'0'
3 x1 Z1 [6 l* D5 y' R" M7 q - STA Use_PPU_Buffer,X, ]; g% ]7 i/ A( y6 `$ Q# K
- INX+ U) L2 u m2 ]4 y+ U+ P$ l
- + d( ^ L$ o8 P' a
- LDA FC_Dec_Data_1
( k. ^5 D/ D* I# f - CLC' \3 s; ?* L% R. A9 w ^6 S4 Q$ w8 |
- ADC #'0'# k& L8 x; ]$ z {; N
- STA Use_PPU_Buffer,X/ h7 P* u* F3 M$ g1 M3 ~8 p# {( X
- INX
& Z2 h) }0 [$ {. R! J5 d - # T/ G% g0 V7 j* e7 L
- LDA #'/'
/ ?( ^" m( i; u7 @: A% l - STA Use_PPU_Buffer,X
( l: [* L2 Q8 H% @3 F - INX
4 \2 y, j; f8 _* H -
) _" J, O( Q& }0 J7 J* S. x - LDA FC_Music_Max_Index
& D& i% {7 r# v8 d: n! R' o - CLC; |. t- d2 U3 c5 Q! F
- ADC #$01
: x6 y( X, T1 A: p- j3 ?4 ]% P( J - JSR Hex8ToDec2 M; e$ W; T# D6 m/ ]. `
- % `% A- Y8 @+ M! d. K1 c$ Y0 m
- LDA FC_Dec_Data_10
3 i& x) R' _# I& D9 u' W7 v& i - CLC$ f1 s( d" I7 w" Q" e" L7 J; V
- ADC #'0'% I# h/ R- U; ]) s8 y4 M
- STA Use_PPU_Buffer,X) ^4 Y7 l, I9 @5 @1 J9 e
- INX, B. k; M% w& N" |
-
]! p* K2 {" [- M4 ?' y4 N - LDA FC_Dec_Data_1/ l, q3 ?9 ]/ J" V+ S; P
- CLC+ Z1 K+ j* H& D+ I. e
- ADC #'0'9 ^! G7 L ^" u8 o4 U
- STA Use_PPU_Buffer,X& W) N7 E4 u7 W1 Z4 s+ J
- INX4 F5 v8 n! p0 o8 Y$ l4 f+ g+ b/ c
-
: C6 o' |+ W- | - .End( x2 ? `/ y+ B' u
- STX FC_PPU_Buf_Count: l, O6 P( C, d. w. q& v
- RTS
7 i+ Z, S% N* [1 w/ r2 p4 I - 0 g; q* S) v2 B4 h1 U
- ;----------------------------------------------------------------------
# n- G) H; V% @# a; Z - ;音乐曲目初始化处理( x0 p, m2 p% H( E
- Music_Init_Process
0 t6 D: Q4 V( S4 ^ - PHA
4 W" t; S* {/ t7 P1 R5 h - JSR Music_Clear_Process3 `" H" d- v# F2 \: m) H
- LDA #$1F7 K% M" K- M& k; x- ~2 D8 ~4 D
- STA $40151 E8 y: y9 x# N- C* Z7 \
- PLA9 M# f$ L& G4 a8 S, v3 S2 t: ]
- JSR Music_Init_Addr ?5 X5 E7 s% I' z8 {; M, t& {
- JSR Music_Info_Display
* a8 i6 U. w* [ - RTS
# d& E. s( h9 ?7 D$ T% l% J% X
7 a! N" N2 z8 d& F- ;----------------------------------------------------------------------
+ a$ D) K& O+ T& ~7 I4 ]. R - ;音乐播放处理
' v6 P& l6 |- x) M - Music_Play_Process- p5 o7 o. v9 v8 A
- JSR Music_Play_Addr; L; s( n1 r) o w1 q, h. K7 e
- RTS Z0 u3 P: i$ ~2 q
/ e8 ?: K$ E; r L' y7 U# p F- ;----------------------------------------------------------------------* K3 U! E( m- M; s
- ;音乐播放处理3 ?) q( `1 c, Q0 B( z
- Music_Clear_Process
5 P% E: U0 s" t7 }0 Q - .IF Music_Clear_Addr
) H+ O# r! l( p. E4 ` - JSR Music_Clear_Addr1 q! {. b+ ~5 d' ~) K
- RTS7 R X1 D7 G% K) \( W3 q
- .ELSE
& H/ @5 C1 s. H* s5 ~8 \ - LDA #$1F7 w6 g! K5 t, e; S( C9 G
- STA $4015
! q# E" R' e. d# z4 o/ y* I - LDA #$00( L* r, d4 E M Z( l
- STA $4010
: {9 Y/ o" ?7 T# O - LDX #$00
! @- L/ ~& @6 o Y. a6 Z, `8 z' ` - LDA #$006 ]" C9 w, d2 R0 r1 W! @
-
G+ I7 |6 ~, {! W5 f ` b, l - .Music_Clear_Zreo_Page_0, K& g# }8 Q/ H3 I( x: U, @$ \+ `) M
- STA $00,X$ P: ~8 A3 Q; m; I
- INX
% C! G. o- @2 [1 O - CPX #Use_Zero_Page_Begin
3 ?& x6 @9 z3 z3 I9 k! }/ Y( o3 w' F - BCC .Music_Clear_Zreo_Page_08 k; l8 {: r7 L" P, k: o
- - h1 h& _; }5 S. V
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size4 k7 l6 q: T! e
- .Music_Clear_Zreo_Page_1
9 X, \ b( F5 F* O - STA $00,X
5 y. ^$ m7 t, i2 f7 h - INX
# ?9 R+ P! y( K$ H) b& q! u - BNE .Music_Clear_Zreo_Page_14 v* C9 e, t$ t j/ u$ D- A
-
/ `# k X- x' V$ Q' h2 q: e - Music_Clear_Process_1
3 X( x7 ?# E( K - STA $0600,X' D2 V1 G+ [' s" ~7 T7 i
- STA $0700,X
1 x9 a* z+ V# O/ e% c& i" \ - INX, c B: s5 A0 i* E- X5 x n
- BNE Music_Clear_Process_15 d( O% ~2 z& b' J; t7 y: o# t
- LDA #$101 O- ?# D/ P* ^: X' w' B% f! ]
- STA $4000+ s; j& o! p% i- g7 O
- STA $4004# D' D: Z# i% J6 j
- STA $400C
0 w& r7 r/ S5 |# S4 x) b+ r5 K' N - LDA #$00
5 d. _! V5 M) W! E# ` - STA $4008' T7 s! E6 N% Z
- LDA #$0F
+ ?/ Q8 y7 `* ?% d' N8 f - STA $4015' Y0 o8 f6 c: L0 P4 y2 I# j
- .ENDIF
2 b3 I+ X! ], b; q& _# S1 n$ u -
6 y5 v/ n4 m4 ]8 v9 C5 v) p& ?3 { - RTS
( G. P( ^. Q% r- X& M - * k: ~8 H8 S; N% L& O
- ;======================================================================
h8 U2 z$ T1 M - ;重启处理. ^" V* E! D1 u9 n
- Reset_Program/ K7 L3 w" Q& ?6 v0 w4 E% x, n
- SEI
" b: J; }& Y7 I4 n' c7 ]" l - CLD
7 \$ N2 T# k& {' @ - LDA #$00
2 l+ v5 x/ U6 [, P; R0 Y - STA PPU_CTRL
[/ Z1 b; c8 l* c- D3 E+ V- X - STA PPU_MASK
7 n- Y+ f3 ^$ h - STA JOY2_FRAME; Y* T+ ^: O t; Q
- STA APU_STATUS o3 M9 L2 M/ k( W" c
-
/ N. j8 S6 p$ c; b6 ~ - ;等待屏幕准备完毕
4 ?5 J' k& z' u5 y) q6 | - LDX #$02
3 i' d+ m, Y4 r" E8 D |; H - .Wait_For_Screen_Ready$ g( h- E) U6 u# ~2 s
- LDA PPU_STATUS
4 J3 a8 i0 s9 ~& C% W# H - BPL .Wait_For_Screen_Ready
5 l5 ^5 q1 U7 m: g) I6 @; i3 B+ p - DEX
8 R; |9 N& A! O) | { - BNE .Wait_For_Screen_Ready5 w' k6 }- n3 S' w* {
- - Q) d: K# [3 O0 v
- ;清空调色板2 h V4 P3 S, J& d. Q" j, t
- Palette_Clear0 h) m& ?: N2 q' [
- LDA #$3F
/ c" o& f7 Q" i+ u3 O - STA PPU_ADDRESS
$ H& G& V# f0 ^4 w - LDA #$00
, q: g9 _6 B9 w+ \% _7 @ - STA PPU_ADDRESS0 U2 b3 u! `( B* _7 p
- LDX #$20& I' P; t4 H" o2 U
- LDA #$0F
* R6 Z/ C7 \; N6 w7 ~3 i; T - .Write_Data
5 F3 [( h( `0 L/ K. m, r - STA PPU_DATA& w' l) z" M5 ~5 m2 J/ Q
- DEX4 l6 a0 ^, K5 C% D. G
- BNE .Write_Data# w0 v2 V% E$ s( t9 m
' w3 P7 Q: b2 d" X$ I- ;清除声音 $4000-4013
. Q. L* e: A* u( v9 {# X! D - LDY #$14
W* W3 h6 m: Z v1 r1 J) j; d - LDX #$00& B1 i! o4 Z4 R$ i/ x
- .Sound_Clear
g) N6 Q; j3 J! c" L( o8 M) f# ^ - STA $4000,X$ y! o5 W; v2 e- ]" [+ `$ m
- INX' p g: R0 Y* g3 m% w1 R4 |. L( R& ~
- DEY
( l9 g" B! {- }- z7 O - BNE .Sound_Clear; ^& ^( z* V2 ]4 k- E2 K
- 6 T- B7 | M) m; O# W7 J) o" I
- ;清除 RAM $0000-07FF
5 ^1 x) R5 |, h* V$ t9 | - LDA #$00, {8 T+ T& }, I
- STA $005 y" H* p$ P2 U: t6 H4 U+ k
- STA $01
0 z- S: ~- {& H! F) ~( t6 }. G - TAY/ U$ e2 ^. T5 s- O8 i) R, Z
- LDX #$08( e" H: ?) {# b p+ H
- .Memory_Clear3 ?8 ~0 `* ]. o: O" `0 o! q
- STA [$00],Y
$ M5 g0 n7 I+ a - INY: j/ b0 T8 P" N1 D x) P
- BNE .Memory_Clear
. S" J6 I" F( v/ m$ _9 @ - INC $01. z) v3 e& D3 t+ G
- DEX
7 T! ?4 Q+ I1 |) a1 e" D$ \ - BNE .Memory_Clear: D4 V% U& k+ }) v' t- S
- H, {: t- j! N) `) u* ]* A" Z( O( W
- ;精灵缓冲初始化; h( h8 E" [6 Y% T. s
- LDX #$00
% f6 u1 g& v% o5 @0 Q5 }; w5 ^8 ? - LDA #$F8
: C: b9 i9 m, Z; ?( c8 C8 K) [, Z - .OAM_Clear
6 c7 |9 P( [; E3 i - STA OAM_DMA_Buffer,X0 [+ `- D: @( D2 n
- INX
; m2 j" Z: p f6 b! b8 \, @' G0 w% h - BNE .OAM_Clear7 _5 \3 |" V3 L
- 6 {, d9 q/ K2 m; C
- ;栈指针初始化
) y) V, J+ m# X% _* f- c1 r; n) L - LDX #$FF
# v& h5 M, ~; y: b3 I3 O+ W - TXS2 T0 i3 ]0 B, D4 f) h7 Q
- - G/ ~7 A' O8 c
- JSR Nametable_Clear;命名表清空* F2 Y# k ~4 A) a( {. W/ |
- JSR Palette_Init;初始化调色板缓冲
* [+ C; e5 T ^' }9 d" l, o7 M% ~$ E - JSR Static_Text_Init;初始化静态文本
1 Z* w' w) n3 r- b { - , p) V- J* A" n+ M( ]
- LDA #MUSIC_ITEM_TOTAL - 1
* t" }( x# A. c9 s; T1 f4 d& y. d& J - STA FC_Music_Max_Index# `5 u0 P+ \5 F: U2 J6 F
-
/ ?) ~6 @7 ^1 F, { - LDA #$1F5 M6 d' T* e) _1 b0 o
- STA APU_STATUS
. B/ ^) j% q6 p9 h+ I- k4 x - LDA #MUSIC_BGM - 1
5 @: t# b9 J2 w! m+ f+ S - STA FC_Music_Index
`, j" a4 d; n4 z, i0 q& i - JSR Music_Init_Process;音乐播放! A3 N& s5 W6 @$ u
- & C' W/ z4 z& k* l9 L/ c6 x/ n
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态). ~; Q6 }9 [' @& I
- LDA #$1E
! B9 J- B6 O% G/ l E/ ^8 |# A - STA FC_PPU_Mask_Buf0 L0 _+ g5 Y' `4 c# X. ^
-
( s1 i7 t: {& V4 G7 Y# X5 F% p - ;启用NMI处理
/ ^% R4 ~0 X! C. y% u4 D( ^# M& S - LDA #$80& S- z4 I) x5 u! {: g% b
- STA PPU_CTRL
' X3 K1 A) [4 a& c5 t -
+ d* ~$ G* ?0 t. M& H - ;程序循环, 剩余工作交给 NMI 中断处理3 E5 c! l9 u P& m5 ]) r
- .Loop
: n0 A* V% O( x/ L% a - JMP .Loop
6 A6 ?2 y1 H5 c, s4 E
" _* o5 a4 h6 L9 v% \- ;======================================================================9 N9 W8 J. l) Q1 L5 G
- ;不可屏蔽中断处理
2 C0 z$ R+ Y. i V4 H9 p - Nmi_Program
; u) m" p8 q! i, Z - PHA- t( a7 _9 F6 q0 P9 \2 |
- TXA
$ B: ~5 `" ~ a3 U- F0 B9 n - PHA
# P! V2 @2 |+ y$ W! O - TYA
7 l, ]3 [% Q" |+ w P% q. a - PHA& w, C% N* T5 a4 _- ^
- 7 L1 v! e" _" v4 b& x* {+ ]; u) `
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位$ F. X% I$ H. R8 n6 G e# X
- ' k4 a" D' e! w) R1 O. n2 f/ H8 J
- JSR FC_PPU_Procrss;PPU处理
* e$ E- x$ N7 B, b) D -
6 I, O+ A/ |6 K6 U O* x# H4 Q2 T - ;精灵内存更新9 |; T* ~; h" H _
- LDA #$003 s9 ~$ D# F: u
- STA PPU_OAM_ADDR
0 T W4 C8 Q* c2 j: F - LDA #OAM_DMA_Buffer / $0100
4 E5 ]# T0 J( A8 ]9 | - STA OAM_DMA+ X g- L$ R7 i6 R+ e
- 9 m- u8 u( b$ Z' [
- JSR FC_Gamepad_Process;手柄输入处理; Z1 I8 I. \3 u$ Q% E
- JSR Music_Select_Process;音乐选曲处理
6 l% |" E% a3 S7 C: V; _% ~: i - JSR Music_Play_Process;音乐播放处理8 v0 L; t/ a4 C3 m2 S6 ]# a: i1 u
-
5 \, ~; j0 R1 _4 Q, f' V% m - PLA
" C; b/ J1 h: b" ?4 v - TAY
3 e. X0 r. M( f/ { - PLA& m" |" \9 j5 \% u4 q
- TAX! f0 `) t( P. T0 Y* s
- PLA! `7 u M% D# M6 W8 [0 o8 N. h1 i
- ' t8 r% d Y# X* w6 I% P
- RTI
6 e" S/ l7 j) K l
* z% E. ]6 ]. C. s" _( f6 S' ?- ;======================================================================- W' a% [& h) o
- ;请求中断处理
& X0 Z, T3 l+ d X$ \5 q - Irq_Program! \" j2 t0 _0 H J2 }( q. d
- RTI- `2 n2 P/ m. c4 o7 `# c2 d# o% Q
- 2 ~( b0 W2 ]# _/ K
- ;======================================================================
j( b( Z' z; N T8 V8 E, ]+ H - ;中断向量表
0 r& h8 _/ A% b* t1 ^ - .ORG $FFFA
) p3 e' i! Z6 ] - .DW Nmi_Program ;NMI触发时执行
% t C# L/ |; I' ~! E2 z - .DW Reset_Program ;载入ROM时最先执行
; V1 l( k9 d& @8 l - .DW Irq_Program ;IRQ触发时执行
' U5 ^4 G! [9 }) }
复制代码 5 Z6 x5 m4 w& A$ v: N; K3 c# U
- J. \! J" g$ u1 m1 I4 N# N# F7 }$ y
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|