|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
# \: f- e% k! Z) U' N$ L( e
7 H3 q4 m1 j- h8 m* M f以下是主框架代码:2 u( m9 n# b- ^8 @- j: S' m
- ;======================================================================0 o; C; F# @; j
- ;文件头 Q; k7 O/ K$ n/ W
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量& ^# e- ?' U- W h( H2 J6 j4 }
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 N7 \7 _* e& L) y& }& o
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
7 C& s. N3 [7 a* G - ;======================================================================
0 N8 H6 N7 n4 E- K5 J2 R - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
1 u) h: _' O+ l* B6 ?6 j* E9 u" f! Q0 N - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# o" _& v7 G4 E7 |3 B7 k4 p
- ;======================================================================6 L8 v( H+ b: `
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ W$ W7 s# s* S" C" j
- RESET_ADDR = $E000 ;主程序起始地址
4 b9 n G k! Z0 c. q/ j" t% h - ;======================================================================
, b8 e) p' P. b9 k0 @ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
6 e, i/ O- H6 H2 w - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 c2 }6 S0 U' @0 [& i - .INESMAP 4 ;Mapper号 (0-4095)
1 u F) b6 X( X' ?) k. A - .INESSUBMAP 0 ;子Mapper号 (0-15)$ T+ b5 B: c% D( E" ]/ o: G* V, ^
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
2 o+ y0 }9 K0 d6 P+ q, f - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
' a- b6 I7 b3 g- x$ m, V - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)- U* i4 U1 @. o
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)" T& W6 R; m$ z; `, p$ g
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)$ _, K, h7 S* H+ ?2 x8 p
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, u* q$ J) Z" P: J8 D4 h# _ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 \2 i6 q" E$ v6 Z1 o/ Y% ^
- ;======================================================================, t+ B2 F& ^7 K* C+ @# W% E
- .INCLUDE "fc_demo_config.asm" ;全局配置. B- u# L' D- ^& r8 S& Z
- .INCLUDE "fc_demo_constant.asm" ;NES常量
. F( _& Q: F5 q" R6 Y% Q' c - ;======================================================================: _) @! S# L/ g( m8 J3 B5 p- c, d
- ;音乐配置- s5 T) h# Q3 e+ J9 U6 f
- .IF 0 = MUSIC_THEME
1 q! Y% B5 l. B7 s$ L - .INCLUDE "data/music/Gremlin 2/config.asm", T9 U0 S9 Z; C2 ~7 K
- .ENDIF/ @# H5 }/ ]5 m+ N& Z7 n
-
8 p& t, k, k6 h! i% q- i; r - .IF 1 = MUSIC_THEME5 Y1 D1 Z7 F. T) G, n" _2 F5 Q7 Z
- .INCLUDE "data/music/Raf World/config.asm"
e" @. I5 N* x3 B) F( F& R( P5 t - .ENDIF' z' O% Y$ F, E
- ! P: }8 ?5 F: m. F4 ?
- .IF 2 = MUSIC_THEME
& X* d1 b2 I. s y1 i - .INCLUDE "data/music/Ninja Gaiden 3/config.asm", C: ], w. l/ P6 i8 i J& r
- .ENDIF1 y* L6 B* B8 t1 A
4 K4 V. m" C: A- B- ~# x7 j- ;======================================================================
# Q G7 u _% e/ f& X3 |. } - ;引用CHR图像数据1 O2 l( h: R6 x
- .BANK NES_16KB_PRG_SIZE * 2; x/ l: X( z( B8 A) Z& |2 o4 j
- .ORG $00000 }8 r$ X# ]/ B
- .INCBIN "data/bkg.chr"
' y: E5 t9 l& @ - .INCBIN "data/sp.chr"
M3 a7 X6 ^- c* I. Y - $ f( |7 O) T, U, r# |+ a) X9 t- p
- ;======================================================================! q# z2 j/ s# }9 P+ u. r2 g8 a9 R
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank! k. \1 o& `/ e6 R! L
- .ORG RESET_ADDR# q- G$ D; {: k3 p# J- m6 Y
- ;======================================================================
) @' s. s% Q# q# x7 ~; ~$ C' M - ;引用其他源文件% X; {* E8 V3 ^. M2 L
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ p8 h9 G2 V N8 ? - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理3 ] w) t4 g- G) H
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
$ d( l8 z2 _0 i+ z6 d' I* ] - ;======================================================================6 Q1 R1 Z2 }4 i' s' N; h1 v3 C, [% t
. w* y+ ^8 Y7 B' |" |/ M- ;======================================================================6 B# E, `5 Q+ L6 b
- ;等待VBlank到来# V4 D; d4 w% S. o8 E. x
- Wait_For_VBlank
/ D l* z. v8 X- H - LDA PPU_STATUS
. V; k# } x% N - BPL Wait_For_VBlank0 h7 m! D& u0 U. u7 `& V
- RTS
3 }" T: g& t5 J; S2 Q& [
# ?' {. k9 d; u" Y: s- a- ;======================================================================' O' L; Y" b3 B2 |6 c
- ;调色板初始化
4 d/ S2 q( y1 K/ O4 l - Palette_Init
0 p3 @; i8 X# k6 p2 g3 g - LDA #$3F
( \7 c5 w9 r- r# R - STA PPU_ADDRESS
) g. o+ \/ i3 g' n - LDA #$00
8 Q. ]3 I N, G3 V6 q2 N# ^ - STA PPU_ADDRESS
0 i$ n4 w/ J1 o* y. n1 ? - LDX #$00
! j s8 j* G: R* [ - LDY #$20: ^$ Q! F- w6 b
- .Write_Data7 v7 _! F2 j* D
- LDA Palette_Data,X& G$ N; } A9 B5 h; f: H; x3 W
- STA FC_PPU_Pal_Addr,X
* Q; ~8 W9 [ o5 R( T - INX6 M; t* p, x: I- s% I, k
- DEY3 Y$ M z4 O: B/ o9 a1 z P- z/ l
- BNE .Write_Data
; \( A: R' D" N, g6 a o$ G - .End) G; J; k! ?( C' P- l
- RTS/ d* v9 r# L' ]' ]/ q; }4 X! J- i, O
9 p- [) r* S; t& I; x- ;----------------------------------------) D' d# o% q& A5 V8 @0 P
- ;调色板数据
( Q7 t- L9 V7 a3 C# n - Palette_Data. R/ F4 O5 f: R; T. Y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B/ n B# Z* u0 M) l' C. m
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 223 K9 T- E0 D; g( L1 m7 Z
- 4 m) F. l- Q" Y) N. o
- ;======================================================================) [) V0 B& L O" i3 ^+ U. R
- ;命名表清空
& u7 C: {1 {7 o& c - Nametable_Clear' C, d( R$ c9 Q& t
- LDA #$20
+ m$ f; N; r5 j - STA PPU_ADDRESS" R4 j1 e2 ^* x* v7 ]* i0 E
- LDA #$00. P* K' k$ o8 h9 ]0 V5 f
- STA PPU_ADDRESS
6 Z" R7 P: ?/ V* W - LDA #$002 F0 K' [; r0 S8 D! s( ]2 p6 d
- LDX #$00
* C% W8 m( e+ |, d& [7 p - LDY #$08# u, a4 I6 ^4 m. o
- .Write_Data& C+ B( A# G4 n+ L+ j, I" @9 y. h
- STA PPU_DATA6 ?- y2 n' U4 ?4 R3 r' w& w8 w
- INX9 S8 @2 B- P! l
- BNE .Write_Data
- a( h m: y9 W5 A6 j - DEY: M1 F6 n* v2 y+ W5 j
- BNE .Write_Data& @/ |6 K, v, m ~8 O
- .End' g3 @4 Q5 v0 }# G- F" t
- RTS- c9 Z5 B7 }9 J& b$ T @) |. f
$ l' L- O. p$ I1 [- ;======================================================================
% b: Q7 t4 j& X: m2 |+ q! ? - ;音乐曲目切换
* ?* h4 }7 F; ~7 w- O$ V* x E - Music_Select_Process% X& G: o* r# X5 k: |* h0 t2 L
- # u W' m) B( a2 f2 y6 F
- .Pre_Music;上一曲, B. G O$ h: B+ P
- LDA FC_Gamepad_Once
7 \' Z2 e0 Y6 h& u3 u - CMP #JOY_KEY_LEFT
0 @# D. r( \" l - BNE .Next_Music
. ^. `: h8 `9 m: _& S+ B - JSR Music_Play_Pre
1 T" W+ T1 y8 b- O( Q% H - .Next_Music;下一曲6 d$ m5 o# P5 L9 Y1 ]) R. `7 j
- LDA FC_Gamepad_Once' B, d$ z+ c! k
- CMP #JOY_KEY_RIGHT; R3 I5 g) I) z3 n) i! P) @
- BNE .Next_10_Music& J7 g$ Y" k- ?
- JSR Music_Play_Next, s$ p5 d( D/ W' Y/ T; {3 ]
- .Next_10_Music;上10曲- b5 ?5 t0 A! R/ |+ Q
- LDA FC_Gamepad_Once' H1 Q' l d, a* u& L
- CMP #JOY_KEY_UP! I. p3 [) Q9 b6 P" |5 i
- BNE .Pre_10_Music/ z$ g7 V9 x9 r( Q' l' n. e# ^9 q
- JSR Music_Play_Next_100 T6 y+ l7 a' t7 q- S' x0 w# w1 V8 _
- .Pre_10_Music;下10曲7 t% A# ?3 w k0 x4 A# S( p7 B5 s
- LDA FC_Gamepad_Once
1 q5 q3 M# _* @9 @. l, V - CMP #JOY_KEY_DOWN
& a$ G- V# h: x0 B& [: Q0 L2 f - BNE .Reset
0 R; B. I: }. |7 ]+ d$ M* _, s/ I - JSR Music_Play_Pre_10
/ R" G% c0 B4 ] - .Reset;重播当前曲目
5 ~: F+ F) m, s9 G - LDA FC_Gamepad_Once
. S0 K3 D( E% @. r3 A - CMP #JOY_KEY_START
: ~4 l- G/ b3 W( X# a+ |1 ~+ n - BNE .End' n: k- K* y) ~: _/ O2 L7 ^
- LDA FC_Music_Index* X- m; j' J/ }/ ]
- JSR Music_Init_Process# d( C7 |! n5 `' s3 H, M4 r( U
- .End% B. R7 P9 n: X% k v. b
- RTS" K4 U3 n7 h1 W4 u. A) {* F
8 m# T( A: i7 ]- ;----------------------------------------------------------------------
+ V! d3 z [# `# X; q: c, O - ;播放上一曲
, h- e, ^7 \3 f! t h" e - Music_Play_Pre
. m. U, k( Q5 v* W* G - LDA FC_Music_Index+ g: b; s% p9 N' k5 {
- BEQ .End
9 c# p# @8 K5 H \+ ^% T - DEC FC_Music_Index
5 f3 i' F. R* m, M$ @* \ - LDA FC_Music_Index
9 T- p4 Y2 j" d6 X: b( M+ A# e4 { - JSR Music_Init_Process- T/ x5 B8 F6 m* r# y$ d. o
- .End- P. I6 @+ |8 A4 }
- RTS0 I0 p2 c# a/ r7 R9 c
- ;----------------------------------------------------------------------
/ J: B+ J! q& U) q - ;播放下一曲* e" X+ X1 j! B$ e4 ^( g) d. n
- Music_Play_Next
# u8 E4 @3 J ]" ^( _0 w- D - LDA FC_Music_Index
$ C. n A) v8 h+ }2 [ - CMP FC_Music_Max_Index
/ X/ m% J- F2 H; c" P5 G - BCS .End4 {+ d: T1 ]. c8 O
- INC FC_Music_Index- X; q& a! G- G! N
- LDA FC_Music_Index
" G2 G: m; l$ M( d! l - JSR Music_Init_Process
+ v7 a0 f4 h3 L2 U% } - .End
) p* v, |2 A( t- l* F- D; l - RTS* k' C$ u r" h- N: N3 U
- + D: j+ n" Y- C2 `+ }) B+ v
- ;----------------------------------------------------------------------3 B$ z; z5 m5 m; |' @9 @1 ]* O1 w
- ;播放上10曲
! Y, l6 u' ?$ N5 r1 E: M( m; i - Music_Play_Pre_10
" S9 ^) Z. g5 U; ?0 K/ m" u/ ^- T - LDA FC_Music_Index) R% f& l5 F' R$ s- O; L
- BEQ .End: |9 R0 J- h; @5 V5 I( w9 K
- SEC
+ R% [! H$ Y) X: I/ t% z5 @ - SBC #10' }- V7 @7 u9 m
- BCS .Pre_102 U% Y3 l7 z( M7 F5 }
- LDA #$00
3 g0 }- Q0 d- C( j6 F - .Pre_10
; s, p g7 M8 r - STA FC_Music_Index
0 s1 s0 K5 P& ?% p$ b - JSR Music_Init_Process
9 o1 K2 ?7 p. j) W1 } - .End2 w" t4 O% U; ~# I
- RTS1 {( j7 |8 o# p
- ;---------------------------------------------------------------------- n- s- r3 R' C _# ^- P2 l
- ;播放下10曲* F4 V! L; h9 z/ U% v3 I% K- G: ]
- Music_Play_Next_102 s) U( d: ]. g
- LDA FC_Music_Index
' Z0 j6 n m4 U, B# W" o - CMP FC_Music_Max_Index
4 f1 A; x& ^( t4 o' } - BCS .End) R4 G" w% T) X% s
- CLC
& L0 c4 X2 y4 ?( v7 O - ADC #10
9 B% L) D7 p" p* e - CMP FC_Music_Max_Index
; H2 D6 ~6 r' j+ n - BCC .Next_100 [/ V# w. c5 `
- LDA FC_Music_Max_Index# ?1 o) |6 {; l9 s
- .Next_107 n" r+ G- a1 |8 a
- STA FC_Music_Index y! W, {8 \% X k
- JSR Music_Init_Process6 L) ^ T8 J9 m! \, N
- .End( @" u2 w+ g+ _% {) O* I
- RTS. k* t+ D2 J+ W: ]
- ) J9 q4 S- j/ u0 Z P
- ;----------------------------------------------------------------------
- T9 h- T7 S1 H& ?% g8 s. i1 ~ - ;8位十六进制转3位十进制制
' ?4 e" \/ c, ]9 u W5 n+ {/ y - Hex8ToDec
1 d6 ^( S0 a+ k6 P7 z - STA FC_Dec_Data_1
2 ]* g0 T3 o2 u( y8 r" v2 @8 C2 l - LDA #$00
% n N/ J1 K, g4 Y0 n - STA FC_Dec_Data_100
- _, C0 b, t0 k$ Z/ ]6 m - STA FC_Dec_Data_10) P U6 Z7 s2 E' p% \( r
- LDA FC_Dec_Data_1
: o& Y1 v1 G3 `, ^/ U! g1 g/ G - .Convert_100, W' y3 j# S9 V1 A
- CMP #100
! ~, a4 _1 g# M - BCC .Convert_10
: m- V& a! s1 t# E1 ]( s- M - SEC
8 C. x) H' w+ M/ N - SBC #100
$ s, Y/ C4 E. O! Y; D% h - INC FC_Dec_Data_1007 B4 g; R* `2 e0 g8 @, q1 Y6 D
- BNE .Convert_100
7 V [; n# H3 c+ r - .Convert_10
# _! w2 q% W ]0 }) s - CMP #10
8 a3 X7 @3 y* _1 O3 o6 S - BCC .End T) R; f3 [2 T) l0 Q/ [" m
- SEC7 }& q* |/ W# u' x5 g
- SBC #10
% u* x" `& w. T - INC FC_Dec_Data_101 H' A. \. Z/ t- s6 S l0 f0 r
- BNE .Convert_10
! A+ [0 ?7 f" X. h! w t% ~- O - .End
7 D1 o1 ?- c3 \: }' \" w - STA FC_Dec_Data_1 {9 [, q- d1 `: D( M
- RTS
) D, h& }7 q( _ P2 F" Z3 j
; F# @7 Q0 O7 y4 k. \$ n- C' G) T- ;----------------------------------------------------------------------
, l) G2 M2 `2 N6 f" x5 K# E t' K - ;显示曲目信息4 h- @4 X( b/ ?! \' I
- Music_Info_Display4 w- q4 s0 [9 I' o$ i
- LDX FC_PPU_Buf_Count
1 l; k8 n9 T# M, i& w! E" l - LDA #PPU_WRITE_MODE_CNT_LINE
! i& K- o5 i# x0 E: B4 [6 A% a - STA Use_PPU_Buffer,X
7 A3 i/ p9 n; G: [4 C- x1 k - INX
0 w: J. j9 f$ x$ C- p" W - ) F+ _2 G0 M! |' P" W
- LDA #>MUSIC_INFO_POS' K/ [$ D# N9 b/ U3 {
- STA Use_PPU_Buffer,X
4 L/ @$ _0 w, b+ N: J - INX
- q0 m0 ]( e$ [- ] F3 j - 6 G3 ]! D9 ^, h3 r
- ;居中
- J/ k8 x. L# G - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 S( d! H- | h4 ~% R
- STA Use_PPU_Buffer,X3 a+ S: E: t1 M0 [/ O$ V5 c
- INX
1 v9 K* y6 @* T9 R7 j8 R -
1 F7 m7 h4 r4 {$ W - LDA #$05' _; }5 @! ^; [) F8 E
- STA Use_PPU_Buffer,X. e, S( Y1 b. r/ E
- INX
; E7 p; w7 f6 |/ S1 D6 I -
- K9 E( Z1 z, m0 { - LDA FC_Music_Index
" B$ e2 {0 `0 @7 [ - CLC: e' M: U6 v9 U: m/ o
- ADC #$01. j; v7 f) L' J" W8 j! R* W. M% q
- JSR Hex8ToDec
0 A+ B! e q( z# m4 s! } - ( _* z2 b% H3 c2 H# I3 z3 i1 V
- LDA FC_Dec_Data_10/ e1 j( u4 b0 j* L, b0 ~
- CLC, ^( p& ]' } D, I
- ADC #'0'1 l* b) U! E# L) u8 w _/ }+ ]
- STA Use_PPU_Buffer,X2 Z1 ^4 |) R7 e
- INX4 I0 G2 J0 f+ u2 J; s# p
-
8 o6 z' s% Q ?! W9 T - LDA FC_Dec_Data_16 F. n# n3 D$ T. o Q1 Q/ y
- CLC
" H/ g/ b+ r# f6 J+ ` - ADC #'0'
3 F8 N9 q0 v3 e2 B3 K - STA Use_PPU_Buffer,X1 Q" E. F. m8 H& J; j
- INX
& I K* b. H2 g) B* L - , H. d. w: v, Q, q# j% u5 n3 P/ b
- LDA #'/'+ b+ W6 M. f+ l( M3 Y% Y2 b; F% `3 B
- STA Use_PPU_Buffer,X: z" [5 d8 ~9 y& n
- INX5 y5 M+ S' H! s0 n
- ( i# l/ \, o) _! f: U
- LDA FC_Music_Max_Index
7 a2 R0 o0 n3 M - CLC
% J- } d7 v/ P" ~0 j - ADC #$01 n' B- K# I# N7 q+ V
- JSR Hex8ToDec1 M8 N" o3 i2 ^% W0 a8 ]7 d
-
* w1 v+ G8 v1 X P - LDA FC_Dec_Data_10
. m% F* n% G" @: l% s( ` - CLC
t" N5 N7 t6 H& K/ Z - ADC #'0'" v! ]5 w" K8 _" q6 I
- STA Use_PPU_Buffer,X5 @7 Z* c/ W: q$ ^& s) I
- INX/ n. ~; Z; ?2 w
- 3 ^- G( K M K- G: N
- LDA FC_Dec_Data_1
0 S6 C1 `% z* {* t: h% } - CLC' J0 {* q9 |( V- V, e! k* }1 s. b
- ADC #'0'6 S; U% h, ~# e5 ]$ ?$ E1 t
- STA Use_PPU_Buffer,X
+ A, m B O1 _- p8 T8 m% \9 l - INX; D: n" Q7 ^, S! v6 F! s
-
. z6 R$ j7 N& @" C4 b$ E - .End+ W4 ]3 L, f# v/ A3 ^- l
- STX FC_PPU_Buf_Count
g' Z$ @" L2 n - RTS
% \1 T2 Y( a+ s# Y4 _. ?( u; h/ A5 O0 F$ t - / c9 w! S$ U8 L
- ;----------------------------------------------------------------------
9 Z- B4 J" k* A4 C+ H% [% N - ;音乐曲目初始化处理% f% E3 V9 ?7 C) y
- Music_Init_Process
8 K% X3 \+ ?5 |% g; f6 S8 h - PHA
" K% ?+ a4 x8 A. A$ y9 B - JSR Music_Clear_Process( q0 @3 g0 ?1 w) t" \
- LDA #$1F
4 ]* J1 s4 g) y - STA $4015! A5 F5 c7 i" c- r+ ~) j" H4 M+ R
- PLA2 V0 O6 x' y2 j, Y
- JSR Music_Init_Addr {2 L7 h0 F# z- F$ C
- JSR Music_Info_Display
5 C4 E* y8 P, ?+ b& ?( h# l - RTS' u }7 ?; g, Q, p; p0 W% r
- + a0 P3 S7 N5 A) C% {5 a* w
- ;----------------------------------------------------------------------" H; ~5 S P7 U/ O, S1 r
- ;音乐播放处理
4 ?. c7 E# U0 D/ _& u. ?. k0 D - Music_Play_Process3 s; R( ]/ k* G) ?( Y' ]3 \
- JSR Music_Play_Addr+ B, Z8 ]- y4 A% j# F# a0 H: W
- RTS, ]/ i/ u$ V& [" c5 X7 a& ?. F
+ ?" q8 l/ T0 @) ]+ \$ p/ d" b- ;----------------------------------------------------------------------
. k/ a& g. v. m% \# V0 I - ;音乐播放处理
% Z% v5 u9 J! I7 z4 f - Music_Clear_Process+ v3 Q( w1 G3 \& M6 b+ ?0 d2 T
- .IF Music_Clear_Addr
. C6 O$ j' u+ s+ | - JSR Music_Clear_Addr
, E, D5 ~$ a. C) c$ b0 n! u# I, y - RTS
! c+ h! h) ^* N: C/ o' `2 }% n - .ELSE. P& s1 ^: |1 J8 W9 Q# i
- LDA #$1F
/ X4 b$ j. q3 ^7 J6 ` - STA $4015
0 W4 l0 b" a: H( o8 h - LDA #$00
1 O7 S2 k3 ?" d+ _ - STA $4010
" S6 l7 D" k0 t% x - LDX #$001 p- {! e6 g- ^. Z1 r
- LDA #$00
. F* A4 _, \& [# L- c - 7 z% H) |! T; Q& k
- .Music_Clear_Zreo_Page_0
; Y6 u2 ^5 x% w+ Y" F& Z: i - STA $00,X6 D1 D% ?* D5 Y
- INX7 Q$ a: R: z% I# j6 d
- CPX #Use_Zero_Page_Begin
0 g( V0 J, \4 I/ L5 t - BCC .Music_Clear_Zreo_Page_0
( x( X6 Q6 p' W) b# J -
1 s# |' e! A9 j1 [' F - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) o6 E6 q9 b+ A0 |3 T% G
- .Music_Clear_Zreo_Page_1# `9 _9 {) d3 [ s* l5 u q
- STA $00,X8 Q! Z+ y2 e1 E6 t% v ^
- INX
! ?2 d# Z& n- { - BNE .Music_Clear_Zreo_Page_1! y6 ^; x+ Z/ ~6 H; F
-
]; u' v. O) C2 {4 Y! j( j - Music_Clear_Process_1
+ G3 o$ t/ Y5 J9 M, d - STA $0600,X
$ O, }, h3 i) e* \, J- H F' x - STA $0700,X
6 x" w4 g5 l/ S1 f - INX9 a% u; w$ O' j
- BNE Music_Clear_Process_1
4 i- p2 ~2 X7 p8 Y& b* L - LDA #$10- l2 X4 ^3 c+ I3 {) Q# y
- STA $4000+ `: Q3 H n t) |
- STA $4004
% T" b; ~4 i& c9 g* W - STA $400C/ R2 F6 R$ E' i! s/ s6 E8 A
- LDA #$005 P, M- R8 h A: _
- STA $4008
! ~- h: F/ Z% n' E - LDA #$0F( E g+ z$ x" V8 k$ j2 I* t$ W
- STA $4015
" J( O/ }6 n+ p c2 t. k - .ENDIF
5 i* K' V& W6 c8 b -
* |) N8 @. }$ \: H7 E3 }; Z; D1 P7 r1 W - RTS) B6 K; N4 ^9 B/ v
- / r! Y7 |8 s$ }5 u l5 \2 [
- ;======================================================================
* t# K" F J# Y8 b% d& W - ;重启处理
/ q8 R/ D2 y7 w - Reset_Program
2 |: x. F& L4 ~* ~$ J: d. G9 b - SEI. q/ m4 d* V$ o9 E7 A' h
- CLD
$ v2 v1 O+ y4 }- ~9 S i; o- c" G2 W - LDA #$00
/ r- W1 Y# t1 O! j( m - STA PPU_CTRL( d$ ^; q% ?5 }6 u n' r
- STA PPU_MASK
: B: Z' N4 O0 L; v$ y - STA JOY2_FRAME
$ U! r" |9 _" {6 j9 \; b6 g - STA APU_STATUS# R) ?6 |- |+ ^- ~- Q2 _8 F
-
8 } }* @( B7 b1 j' t0 _2 Y - ;等待屏幕准备完毕
1 G+ I- R0 v3 t3 m, T8 A- M3 [ - LDX #$02* K) T9 ?0 T, u0 i
- .Wait_For_Screen_Ready* M! ~( g2 X0 G/ f# y* s
- LDA PPU_STATUS z0 {/ U/ c& X& b2 w/ a( \ F3 l
- BPL .Wait_For_Screen_Ready
7 p m1 c) f& z* m5 c5 H - DEX& C! B4 Z0 q5 C! e2 ^
- BNE .Wait_For_Screen_Ready
6 X$ \( z3 E$ a: z: X4 J -
! z1 _( a$ c5 J% x7 B" a+ P3 z# B - ;清空调色板' ?$ B$ R! K# D( P3 p* N
- Palette_Clear4 w, ^1 M' O+ _- O5 i
- LDA #$3F! k" X' V5 f, s$ H( U* i( u
- STA PPU_ADDRESS
* c% G2 N( f# v. }: q - LDA #$00
' \. ~7 \* e* E5 `4 N/ U - STA PPU_ADDRESS G9 Q: F/ m" i) G
- LDX #$20& P- p, m/ v- {3 E6 }4 }7 W1 s% z
- LDA #$0F4 ~; v: A. O' S( I% U/ n
- .Write_Data
4 `+ B; ~) @* }% M( Y8 @ - STA PPU_DATA
) w& V; u y0 v; y0 ~/ B - DEX! N0 I1 U0 ~" f7 ^6 }) _
- BNE .Write_Data: g" F9 u( l) T/ w
+ M2 ^- e! b- O# E3 A- F- U, P- ;清除声音 $4000-4013
4 e9 X( [3 i0 f6 B, J - LDY #$14. ?3 r- X! d: m* E ]: ~# q& R% p
- LDX #$00' k, ~" [6 [6 e9 M
- .Sound_Clear
4 l/ \' _/ Y" u - STA $4000,X
% {0 G2 C( g* E u - INX/ l5 n; T$ P* b7 o, D
- DEY
3 O3 M' D- d- f+ u - BNE .Sound_Clear
. w- C( \8 E! @- r5 O. {! S -
9 m/ i0 V" G S1 N) x% v - ;清除 RAM $0000-07FF
6 O U& A4 B1 R9 N5 n1 N - LDA #$003 b3 A4 q- T1 v
- STA $00
; r0 s: D! Y. ]; x - STA $01
1 [$ e: o! x+ V, _. }% y& X( e - TAY$ m' g) s C% w" y6 ~, Q& M$ g
- LDX #$08
% u5 f0 a, s, Z/ L - .Memory_Clear9 }# ~: D( a7 [- R
- STA [$00],Y; j9 n' Q" e5 o \( P# R
- INY6 ]% l {" _9 j" G
- BNE .Memory_Clear
- S& x* n2 V1 N - INC $01
# G. ?0 t- [$ T. q6 N5 Z, n# i0 T( E: a - DEX! `2 v$ Y0 i2 Z" t1 q2 Y
- BNE .Memory_Clear _2 b# h- J" e( R
-
) m3 K+ a) N: B# {( H - ;精灵缓冲初始化 i. y( Y7 ?# ~8 d# ^* [$ z {
- LDX #$007 j- D. m, d8 z, _6 @! n4 D/ {
- LDA #$F87 v: p* a! [ X+ _
- .OAM_Clear
( N I7 Z$ c @ s0 m1 w. Y - STA OAM_DMA_Buffer,X
" g. D* A$ Y; I$ L - INX7 [* e, K R' n) f q1 f
- BNE .OAM_Clear8 e9 y3 r. D/ U) g, p
-
3 ?! l# R% p% k( H7 g! G1 r5 W. G - ;栈指针初始化
0 ?% R3 p6 \: U6 C0 g - LDX #$FF
/ {0 l$ V) k1 B# Y5 w4 e/ X - TXS2 e/ z% p' t+ K( c: l8 h
- # \7 @) w, J& X+ O& O% [$ ]
- JSR Nametable_Clear;命名表清空
# k( c. A5 s7 r* B9 @3 P4 R - JSR Palette_Init;初始化调色板缓冲. G$ A7 n0 S1 f1 @% g8 g
- JSR Static_Text_Init;初始化静态文本
* Z# z/ ]1 L# L8 Q! ~ - " h. u( K; A/ z% y5 d8 {# _
- LDA #MUSIC_ITEM_TOTAL - 1
1 ~. ^5 j/ B+ g. X: Q5 @ - STA FC_Music_Max_Index0 P2 s, J. X/ y. q
- : w8 c2 S, Z9 z f9 V7 Y( P* t4 o) T
- LDA #$1F
/ f! G& c I; ? - STA APU_STATUS# Q! p1 a! `: V( D
- LDA #MUSIC_BGM - 1
7 J' V& R/ H, e- f - STA FC_Music_Index
V' f: g: X6 H4 w5 H! I - JSR Music_Init_Process;音乐播放$ ^, u' d' B [% c
- 4 \9 B" B& _/ }5 C! {
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态) o7 I1 a) T9 F- a4 c' W7 c7 W
- LDA #$1E
2 X Y+ ~4 ^9 n) D6 c - STA FC_PPU_Mask_Buf8 I5 D7 O' }3 K; C2 g3 d: h, c
-
5 b% f( L. [( U6 O2 q - ;启用NMI处理8 N: { I$ x/ _* z2 k- a
- LDA #$80- f7 i, H, \. \7 X% K! L
- STA PPU_CTRL
9 C5 }: `, j2 G" |/ I4 ]) T - % o# L; B4 \8 y7 ~( e2 c
- ;程序循环, 剩余工作交给 NMI 中断处理8 X$ P$ @( B+ S/ J9 d3 A$ K
- .Loop
4 j' P0 X+ m+ D - JMP .Loop
' G2 Y2 [/ K- [
8 _; t8 }. I2 d l( o- ;======================================================================2 `- @/ R) b7 l- ~) a" n$ o* E
- ;不可屏蔽中断处理 o. \: [* m0 d% b5 U1 w6 ?/ |
- Nmi_Program* h/ G- B+ @# }, | N9 L
- PHA: B4 N+ w$ _& B( ~( X$ `
- TXA6 w: B$ }/ O% |+ _) B. e
- PHA
8 l& ~& i6 R; B9 O- q/ Z# ~ - TYA* U0 T' H: l5 `+ m$ @+ X. m( J6 M
- PHA
" _* m1 R% D% x9 h8 h -
% F4 j3 @2 g' T E6 W) D+ I - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
/ y7 M5 G0 S7 O) Y7 ~: m - 0 g6 G4 E* ?# k% ]8 I. S `- Y
- JSR FC_PPU_Procrss;PPU处理
! Z: Q2 A( I# \, x+ ~ - , g- ?$ P$ Y5 |
- ;精灵内存更新: ^$ O! e) S6 R0 {1 O# e+ D
- LDA #$00
/ Y; s. D: T' x$ C - STA PPU_OAM_ADDR* s ^8 A4 s! Q) B( j3 I
- LDA #OAM_DMA_Buffer / $01009 `& F' D2 _+ T
- STA OAM_DMA
6 ]; V( m9 ~/ s5 Z( t -
$ t) V: \+ J: p5 U3 o - JSR FC_Gamepad_Process;手柄输入处理
: y! [2 I% U5 i4 T' ^" T, n - JSR Music_Select_Process;音乐选曲处理
( Q, w" U0 D5 Q+ ^" y1 o& k - JSR Music_Play_Process;音乐播放处理* I: S& _: X+ W& U" I( V+ y+ n
- 3 Z; d4 c5 w1 ]4 ?! {
- PLA
D9 b( `8 L2 R* b0 G - TAY9 ]# w% `% s6 s5 q4 d
- PLA8 }! ~: a, Q9 c% b3 G8 Y
- TAX: \6 n( j! L* I6 l
- PLA* A8 K5 b) ?0 ~
" K7 x9 M; \: W$ f& E- RTI
- A; \% F- t) N; n2 n
, I/ {8 _: [. _- U- ;======================================================================8 e& _( _9 P5 D: F! m; J
- ;请求中断处理' O- q8 r4 i0 Q( c4 W
- Irq_Program0 b* Y; W7 p. b6 f6 Z
- RTI
4 B+ ^$ P+ U: M, X/ b
$ ]& g3 H9 B1 z, Q( B3 x- ;======================================================================
$ F# m; O% ^& D6 C3 s - ;中断向量表0 t+ p, o# I" k; _
- .ORG $FFFA7 l$ _0 l0 V! V
- .DW Nmi_Program ;NMI触发时执行
% p/ H7 }$ |% g - .DW Reset_Program ;载入ROM时最先执行5 o" l; o2 {5 F" n5 i8 C
- .DW Irq_Program ;IRQ触发时执行
# s+ H1 v [7 n: W; p: ?
复制代码
4 P4 n: s" S: J
& t- r2 j+ v4 a6 T3 d3 I, z9 T
/ K$ I( D5 ` v( U; W; Jhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|