|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下4 T$ M% g9 v! u: C

! w. I8 x9 g+ m+ T" q以下是主框架代码:* W" K3 n6 S4 A" _- @3 O
- ;======================================================================' s' X8 q8 r6 }: @, l
- ;文件头
. Z+ S/ z2 c# }1 U - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
2 J( T H/ k0 N - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量9 ?* G: Q2 I! O; Q! n. S; T8 f4 h' b
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ X' K; F6 w# F/ V* f0 L* u - ;======================================================================- B" j( i( K) _" a+ c
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2& N" `. l5 g% h* V* g( b+ i2 }, W# m
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1( u1 g1 H% j& g2 ?. A
- ;======================================================================
% n* b7 K! v; J' b& O; Y! e - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1$ j9 j! J. [# H
- RESET_ADDR = $E000 ;主程序起始地址
, `+ ]8 c% Y! S5 p - ;======================================================================1 ?( {2 k3 Z' k6 f$ M" ^- N* A3 t
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 h2 s& O6 L* f( U* n. b/ j# ~7 x4 S
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB3 q: l7 Q3 [. ^
- .INESMAP 4 ;Mapper号 (0-4095)6 G5 m2 u4 l0 T, v
- .INESSUBMAP 0 ;子Mapper号 (0-15)0 b6 j7 ?0 W' \) U. m
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)1 A0 p0 w5 n3 h$ }) O( Q" a3 d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)7 t2 L& Q1 H. H- S1 P! K1 \& N
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
! b- p& T% N: e; y - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)% N; o9 F2 e" n$ Q/ ?' l( t1 W
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
# R3 J4 Z7 K2 Z3 r" [& F! A - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)+ e. ]! e. x% b
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)0 k% E Y7 S- E. A0 B
- ;======================================================================! R2 r" J/ u. L2 w4 w+ X' }$ E
- .INCLUDE "fc_demo_config.asm" ;全局配置
4 \1 x7 R1 y# z: ^ - .INCLUDE "fc_demo_constant.asm" ;NES常量# B- h1 J' b$ b: d0 i5 S, q; n
- ;======================================================================
1 _$ [- J6 m8 k* e - ;音乐配置
" V: B0 T$ J. S! V9 z" |6 r - .IF 0 = MUSIC_THEME + Y9 [2 g9 i+ n* [" ]
- .INCLUDE "data/music/Gremlin 2/config.asm"9 V0 O. f- `% H# x+ ^% C
- .ENDIF
4 r8 L! l5 \2 m; z! `' w1 X% _+ I -
& j9 r! n1 V+ ]% V, b2 G4 S - .IF 1 = MUSIC_THEME
_2 t7 r1 ^' r0 p" a( E I - .INCLUDE "data/music/Raf World/config.asm"5 ^( [7 \5 v1 P2 d+ n# Q
- .ENDIF! |1 A5 v* y8 N! A* t* @
-
) G* p/ Z+ s5 ^# |' Z7 T" r - .IF 2 = MUSIC_THEME 8 q* O2 h( E+ q
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"$ P% {7 @# @+ \# ~5 `
- .ENDIF/ m# L" i5 D- P" M" C$ ?' ]' U
- " f7 j w$ b% R# V5 j6 d
- ;====================================================================== B n9 s. i+ ?& M! ^4 k3 h
- ;引用CHR图像数据
# U$ f) @4 t$ g0 i1 j% H+ [& ^ - .BANK NES_16KB_PRG_SIZE * 22 j' w3 t) D- R9 a( y
- .ORG $0000
- i( I9 [2 x, U. l) ^ - .INCBIN "data/bkg.chr"# r6 U2 Y7 F+ S
- .INCBIN "data/sp.chr"
9 U0 r7 v4 {# h, W( ^9 v -
$ h% l Y# v: }) N D0 [ - ;======================================================================) V' t2 ]" }2 v R) ^( T. ~ ?. i, [
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* H2 M) C# d: u0 |9 _' Y; ? - .ORG RESET_ADDR! u- }$ z/ b9 |6 ^3 b
- ;======================================================================% R4 f/ D6 B8 a% U
- ;引用其他源文件
1 F. t& e3 D& w- R8 I- b+ D% A - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 s3 U# R# l' F6 c! w - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ g. ? n& M# z7 ]7 q) u2 F* }7 ?
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
: H5 g3 O w1 u U. Z& A - ;======================================================================
) x/ F; C6 l" S# P3 ~ - 5 _8 R5 o' P: Z$ E) c9 I8 \1 g
- ;======================================================================1 ^- r) j7 E4 b( s. l; l7 ^ n- V
- ;等待VBlank到来
# Y; w- o- L1 P - Wait_For_VBlank9 |3 [7 W d M6 C% v5 _) o( ]
- LDA PPU_STATUS
" l7 {* z$ Z' R - BPL Wait_For_VBlank
- L( C/ i1 }' O - RTS
9 E2 J& y3 Q6 T& P$ v - 0 @/ H; ~ {# P9 H
- ;======================================================================% o: y" E, A) |2 R3 Y: r" U
- ;调色板初始化+ a; N% s! [+ G/ u- z8 _. m
- Palette_Init
4 h8 o1 m. f" m- q - LDA #$3F0 v2 c) j& \- V" u! n6 |; N
- STA PPU_ADDRESS/ W$ x# A7 G, x/ O0 m; |
- LDA #$00- o. D$ h, R) J$ w, j; C( _
- STA PPU_ADDRESS
. [8 w- p2 F& u - LDX #$00
% @1 |# J3 b+ _) a2 O o4 g - LDY #$20
; w( O' f9 K. |5 B c1 m - .Write_Data" K) U9 I+ W, A- d$ _
- LDA Palette_Data,X
4 a; w& d8 `( {" u( d( V& R - STA FC_PPU_Pal_Addr,X/ j0 b, M% U/ J( r2 h P2 M& {& G
- INX! [: l& C9 S: O7 v0 o6 p; _
- DEY; V0 M' A/ w5 p/ B2 t
- BNE .Write_Data+ I0 Q8 K4 V3 s
- .End- h8 k2 M' S1 w" O$ T
- RTS
' q; ~5 {/ H' Z+ p# i
7 V9 d0 _9 |7 z- ;----------------------------------------
5 \8 j$ s9 H/ l, r - ;调色板数据# v6 i3 W; W+ Y8 a6 h
- Palette_Data
3 \1 n; _6 {; e - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
$ K9 ^8 y5 h+ G' u - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
- Z4 t( G b2 K" W8 F - ; I8 l5 E4 w% [) z* |1 j) x+ R
- ;======================================================================+ y+ ^2 \+ P5 r, w& t$ h: c
- ;命名表清空! h4 E: f% }6 |9 \0 G
- Nametable_Clear8 U, `1 U# N$ p/ H; W
- LDA #$20
# O( V* [; @1 i - STA PPU_ADDRESS4 y( Q2 m2 A0 C& J
- LDA #$008 J9 v4 t7 g {3 Z4 C6 X
- STA PPU_ADDRESS
3 F: m5 l6 ~7 ]( d. G! k, { - LDA #$00
, O# D$ s5 a \" y6 O+ ^, _ T& \ - LDX #$00
0 {0 w. m) t1 z* _* {2 S/ K - LDY #$08
- e2 {5 {5 M: N - .Write_Data
% L! e3 [, {- C2 Y( F - STA PPU_DATA
1 _& U' |/ g/ c - INX, h# M5 N+ d( V% a2 X) ^
- BNE .Write_Data
% e. R4 Y" j7 |+ A& O - DEY
- g$ o# s" m ^) K# a' v - BNE .Write_Data
$ G# `2 t2 d0 ` - .End0 k2 {% K" |5 b$ W9 p. A
- RTS! ~6 p1 l: c/ [4 Z7 Q. t9 n+ ^
/ F& Z8 Q Q5 t- ;======================================================================
$ N! |& v/ x7 X- s. x/ M - ;音乐曲目切换+ |# e8 ~+ E4 ~7 x
- Music_Select_Process0 ?6 h, |9 i, o+ b5 Y
- 8 Y( w$ v/ W+ g: G& l9 z
- .Pre_Music;上一曲! D& W3 ^( ~( \! ^* m
- LDA FC_Gamepad_Once: z; k' Y5 V$ N0 g$ i8 g/ H
- CMP #JOY_KEY_LEFT# }" k0 ~) e3 _. w) X& n0 b# u
- BNE .Next_Music. d; v7 m3 a$ }; Z0 z3 d$ j( l( L
- JSR Music_Play_Pre
8 S; N' z+ Q& Z% c) K! c - .Next_Music;下一曲! ~! Z P. J& e" F, T' q4 Q$ I( z
- LDA FC_Gamepad_Once B5 B1 W K- r4 A$ c
- CMP #JOY_KEY_RIGHT
4 \8 W* o% h S; l: @ - BNE .Next_10_Music7 k( f6 t* @% I4 k
- JSR Music_Play_Next
9 ^' _2 f; O; H2 x5 A6 y9 z - .Next_10_Music;上10曲! K7 g: s6 W$ E2 T
- LDA FC_Gamepad_Once
6 c% y) k) N3 r7 _2 } - CMP #JOY_KEY_UP
3 r3 B" b7 O( E - BNE .Pre_10_Music. M* b9 \8 p$ q8 T
- JSR Music_Play_Next_101 B2 f$ |' e5 t
- .Pre_10_Music;下10曲
8 C$ _6 q$ Y( C1 [ - LDA FC_Gamepad_Once, I7 |* V' S }# a! K- |
- CMP #JOY_KEY_DOWN
( P" e5 q: T' Z' S - BNE .Reset
' ^, s0 m. R- V/ O - JSR Music_Play_Pre_10& W3 n# h% |- H: h; g$ y
- .Reset;重播当前曲目$ u0 _- G5 s8 B( O) a
- LDA FC_Gamepad_Once9 ]) w d9 u$ o
- CMP #JOY_KEY_START
6 R6 y; B7 p* l5 Q" G8 r4 }6 u - BNE .End
1 V6 m. O8 T M - LDA FC_Music_Index+ y9 Y/ X! f. |/ D* ~* H) `
- JSR Music_Init_Process% L# z5 ]4 u1 k1 P1 t8 k
- .End
6 t; x3 O3 }2 T) u3 A2 O - RTS2 {9 R& Q; Y5 O" x9 d& e
( j% ]2 s" U5 ?7 p- ;----------------------------------------------------------------------
" |0 m0 `+ h7 B4 `6 q - ;播放上一曲
7 q2 e! n, E7 l' O - Music_Play_Pre5 E, A5 e' p4 A! s: E7 S" x. i
- LDA FC_Music_Index
- |1 Z3 R6 Q" b) }4 S - BEQ .End
" d$ x* M: o( p- p- V - DEC FC_Music_Index: s2 b: b. H V# A' n
- LDA FC_Music_Index
: ^# V r- u; a - JSR Music_Init_Process
) e+ f9 |1 T5 V( b8 n( y, D - .End
3 U0 ]9 y2 `- @$ m - RTS
: K" L6 S8 Y1 J& Z0 S, g* a - ;----------------------------------------------------------------------
8 r& P" z* e1 P: ^1 G) v - ;播放下一曲
+ E2 f: o! c8 k. s" R% b( R - Music_Play_Next8 [4 l& @( r6 u- D. V
- LDA FC_Music_Index
8 ]/ W8 K d& ?+ C6 `3 Z0 f - CMP FC_Music_Max_Index5 _+ E! h. b4 | p& {
- BCS .End
$ I) u9 h7 k" u% U- E& S3 ? - INC FC_Music_Index
/ u& {: I/ O$ e3 a- W6 H - LDA FC_Music_Index+ x2 s& {+ A+ P% V+ B1 A2 @6 u
- JSR Music_Init_Process
, a4 \# |' `. r) }+ X4 E, O" F - .End o# i7 C6 O: u+ G: N7 w; z
- RTS2 e: B$ b( `" ]0 H6 s
- / V. [1 d8 {" E( B6 i! Z
- ;----------------------------------------------------------------------1 z/ k3 C; p, h& S
- ;播放上10曲
P& I& Y# K3 E8 g! r - Music_Play_Pre_10* Q; d/ M( N p& O$ a
- LDA FC_Music_Index
% z& B- S* r0 {2 B( W - BEQ .End j: U4 r$ B3 s; f; O- b
- SEC) \' F$ n8 C$ ^: U, }
- SBC #105 F9 Q* E" s9 b% a. }
- BCS .Pre_10$ a. D( ?1 M1 A7 D6 C
- LDA #$00: u+ n. |+ z7 T( S2 S
- .Pre_10' V1 Q3 @( E0 s' |1 Q+ r# a! ^
- STA FC_Music_Index4 x9 \0 u7 r, B1 J
- JSR Music_Init_Process
' h2 p2 I7 }9 K1 ~7 _8 _8 B# ` - .End: x; E/ L6 G: M$ P
- RTS
. f5 f$ S% R7 x" b: s! X4 \6 n - ;----------------------------------------------------------------------) {. F) h/ p0 m& t$ h% }
- ;播放下10曲
7 U9 C8 s2 L/ t- t) G& s. ~ - Music_Play_Next_10
S7 M9 i/ L! H6 w" W - LDA FC_Music_Index, p2 {# ~; C( N9 g- C
- CMP FC_Music_Max_Index9 j; H+ A8 J3 _" C1 {8 g
- BCS .End
( A' ~" H$ m9 i) p9 I$ W# s - CLC. Z# w# |2 v) X2 T0 o) T E4 A0 G
- ADC #105 ^) v" }$ r' \2 u4 B9 o; S) C
- CMP FC_Music_Max_Index
: |3 q- M! I2 N - BCC .Next_10% b: ?) v9 A' `' H) k) F4 Q: d
- LDA FC_Music_Max_Index
, R! W8 N, ~- T" [4 X% E/ W, Z" O - .Next_101 S: N0 w; M& u6 R
- STA FC_Music_Index. k. g( R" e1 }" ` _0 @1 ?% S
- JSR Music_Init_Process
, o$ p- u/ U. V; ~& h - .End8 f6 y9 C' e& q, O% j/ T& ]
- RTS
# O! [3 d: o4 z& A+ y8 E2 R
/ w; s1 v4 u) ?- ;----------------------------------------------------------------------1 A, k+ l: n: j6 r9 N. A: N5 Y
- ;8位十六进制转3位十进制制# Y* S0 Z+ z: I* G0 W
- Hex8ToDec# U3 u5 V8 U8 E& ^/ B& G; {% R) ?/ b
- STA FC_Dec_Data_1, O& W+ N3 n2 t% t$ E! t: A
- LDA #$00
/ w) u& R! y7 R - STA FC_Dec_Data_100
% W s, t5 m# v1 v3 G* N - STA FC_Dec_Data_104 Z0 b- B/ Z" |$ h9 ~
- LDA FC_Dec_Data_1$ e/ p* j' q; X2 O7 R7 E5 J
- .Convert_100
1 ~3 E6 Y$ }. V8 N - CMP #1008 d7 Z! I8 S; S! J+ U
- BCC .Convert_10( ?4 _$ `3 X4 k" g' b
- SEC
8 E0 j$ t+ i& S- V; @) n; g/ ` - SBC #100
6 x! _' s) G4 c$ G. M+ \ - INC FC_Dec_Data_1006 Q4 j7 Z# y. |7 u9 Q1 D# Z, j
- BNE .Convert_100
& h: a" D. h. T! o - .Convert_104 J3 m5 E; g8 ?6 {2 Q* v! P
- CMP #10
3 H1 T* O* A1 @9 N$ h6 E - BCC .End
9 r, [ o# a( p- S - SEC3 l& a8 H6 M& E) r
- SBC #10+ R, |' D/ W5 }' u/ N; `
- INC FC_Dec_Data_10
! O8 ?3 D. a$ z; M - BNE .Convert_106 A+ c& {8 L1 p/ q w5 N' P
- .End
+ D h1 N7 I) z - STA FC_Dec_Data_1
# [8 A+ q$ T3 f, Z5 Z% \ - RTS& P& }! _8 E4 F: O
5 z0 k# f3 Q8 }) L: z& B- ;----------------------------------------------------------------------" u' h: o- d6 n# f8 A
- ;显示曲目信息! d- x! E! R; N( I' S9 `
- Music_Info_Display3 S9 \6 |) i; j1 j
- LDX FC_PPU_Buf_Count$ C' M8 X9 T, |* ~( y z# W
- LDA #PPU_WRITE_MODE_CNT_LINE) }* K& p. @: z- f
- STA Use_PPU_Buffer,X
/ N: c+ w m* r; [3 D$ E0 q$ J - INX
0 ~2 B3 P6 x! E: Z" r% | -
1 F2 l! u( \# g# y, ~7 M1 @ - LDA #>MUSIC_INFO_POS: l2 j/ r8 s- o4 i
- STA Use_PPU_Buffer,X
0 E, L+ w& q% b - INX
5 }% Q2 B. [9 U+ j+ K( P - % x! A3 i& y5 c7 n: A
- ;居中
, _8 ]( e% h+ I( T; L - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
# s% Z8 S, _! E! r) y/ v6 } - STA Use_PPU_Buffer,X. B8 O7 `5 `" @) \
- INX" R" f( _* y- C, x5 v l( K$ \4 h
-
& [! k+ U- q. a: [- F" C# K% {, O - LDA #$05
* E9 J( n3 O6 J7 ~/ M - STA Use_PPU_Buffer,X3 }% y& l+ M2 m. ?! Y
- INX
0 m9 G6 a. I$ |- H5 a, Q; O3 t - ) d& P$ X8 B4 E8 n
- LDA FC_Music_Index
4 k- M. @' L r7 U! k - CLC
2 \4 n* E. b4 K2 ]* C& o - ADC #$01+ N( ~( e3 a9 n l9 s# b
- JSR Hex8ToDec
: A1 }( r B% t5 y - ( _7 c Z: K4 Q! ]
- LDA FC_Dec_Data_10
; g. P# ]5 |2 F- q w - CLC
& U, R1 K+ ^) o. t. o: ?# v6 V, ?3 c - ADC #'0'
. X8 t& {8 d2 W1 p1 d- h* ~; {6 u - STA Use_PPU_Buffer,X
, C% _3 ^1 u3 z3 ^ - INX
4 {. u1 ?! y, ^5 l. ]* K1 h -
9 ]' F9 g; J" Y% l9 U; ` - LDA FC_Dec_Data_1
0 j6 z" N8 ?* O - CLC
* m7 j2 Z/ r4 F- M+ @% e - ADC #'0'
( D" O8 b: o9 ` - STA Use_PPU_Buffer,X
; l( ^$ P2 w) d9 d) x& S - INX
& t$ r/ a( b% ?" I& O2 ]- H -
. L% }' r3 b U- f R8 J, O: ? - LDA #'/'
2 R) W. P# c: Q, n7 n/ G+ }% m- A - STA Use_PPU_Buffer,X
& `& j L6 L0 C - INX% O& a0 s8 U ^5 Z. t" C- l2 N
-
: V+ B Y; x$ u& m) @ - LDA FC_Music_Max_Index2 U4 g2 X6 m2 o; g# Y( R
- CLC
. r& O5 F1 p. D7 r* O0 F/ v; k - ADC #$01
! O5 c7 p2 n$ P+ T7 x - JSR Hex8ToDec6 r, e Z: D: K7 @/ [6 o. j o
- b T9 d9 N+ L, e$ t7 B) Q
- LDA FC_Dec_Data_10
7 w0 }/ E- V* V- ? - CLC- c7 ~1 Z& m& L
- ADC #'0'! C; x1 i, ~$ J$ L7 M7 Q
- STA Use_PPU_Buffer,X
4 |! V e e1 Q: q) N% x - INX, d0 o. v( H( m; E
- ! n2 {2 _( u" f+ r, o
- LDA FC_Dec_Data_1
8 {9 C1 h/ K( p2 J - CLC
' t- S1 S1 I+ y - ADC #'0'
}$ j4 U. `* {4 V& j) f8 S - STA Use_PPU_Buffer,X
; V8 X* Z% c1 C% S ]1 [! | - INX" k, U. A [0 O) M" y
- 9 V9 q9 v5 ^3 t% p9 D: x0 K! v
- .End- G0 O* C' N8 M" Q7 d
- STX FC_PPU_Buf_Count
k! C, X- r6 ~; B1 |/ [2 g - RTS
8 }: t2 V: \! m - , V. _& v1 k$ C x) n
- ;----------------------------------------------------------------------
( i, e, M, K; b( d - ;音乐曲目初始化处理
* k7 i" q, _/ L) p) x& F- i3 c - Music_Init_Process8 ]; F' B a9 l$ a$ g3 @2 ~ \7 j
- PHA
4 X4 V+ T) }( R - JSR Music_Clear_Process, O9 w! I+ R- c1 \- X
- LDA #$1F* m0 y! Q5 u2 A z) u8 ^! a3 r
- STA $4015
0 E, R! x0 Q5 m$ S" I - PLA ]" n% b) n: b6 {
- JSR Music_Init_Addr
- W( b3 U! p/ A9 G - JSR Music_Info_Display8 X8 u0 P" s" V$ c+ E+ u2 H
- RTS2 h' {: R, O: m" A# a Q, o
) l( [2 I& X1 A% e: j- ;----------------------------------------------------------------------$ v: z* Y6 [7 R6 f! L8 G, m7 z9 ?
- ;音乐播放处理
4 p3 i, I' h% C' g! u I- c+ k - Music_Play_Process
u" x) Q& Q) w - JSR Music_Play_Addr" u; l2 K* y9 @* s. |
- RTS/ S8 I; V+ D( P4 h
* T0 g, B E, R: \# Y% T; @( A- ;----------------------------------------------------------------------( N1 J" w) |; Z/ G6 |" n
- ;音乐播放处理3 Y2 V; I3 y& m5 S2 Y
- Music_Clear_Process4 _# g& X+ O% L6 n1 ^
- .IF Music_Clear_Addr
4 F! H1 K2 D O6 i - JSR Music_Clear_Addr2 D3 i/ c0 F- q4 K7 U1 g
- RTS2 {9 Y0 Y1 ^1 v5 {. u" v, E
- .ELSE
1 \# U# _# w) c/ T - LDA #$1F
1 F3 @7 o" T5 P' D8 B# S - STA $4015) i2 t& i, Y" ]1 u
- LDA #$00" M' g: V- ~! G# h
- STA $4010
5 i. W! y& f# N - LDX #$00
! ?& o% w8 G, L0 R W - LDA #$00
" }4 J# ~+ |( r- _: u E -
& b. D! S5 V8 r* t' X: E - .Music_Clear_Zreo_Page_0' | b/ z/ A; @. B+ m! K& |
- STA $00,X1 i, i) W( R. d, f' ], c, |: u' v& i
- INX
- c, }; i8 S- b! Q! o' }) R - CPX #Use_Zero_Page_Begin
0 Z) Q# o' r& s8 F1 }; j5 s4 Q8 _ - BCC .Music_Clear_Zreo_Page_0
6 f* Y7 x' Y; o% p -
f) i# A' O6 x6 O! G9 x! u7 X - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size0 r. ]! d {* N6 B+ k
- .Music_Clear_Zreo_Page_1
, y, f& O2 W/ C, K3 S% [' ] - STA $00,X
5 Y4 O: V0 p. Y/ `6 E - INX0 t: W. v: u1 C; y
- BNE .Music_Clear_Zreo_Page_1
/ o* @& d5 w1 Q; K, {; x - - W7 ~% S" L$ O
- Music_Clear_Process_14 Z5 t1 G# k+ d8 ?9 C9 g0 |
- STA $0600,X
$ W) n3 R B+ W* F - STA $0700,X# [1 K' \: j4 g, G
- INX# v; Y. L, A1 V5 C, }) @9 J/ w
- BNE Music_Clear_Process_1
0 n7 ?# c. v4 c! x; f! m - LDA #$10' u% A4 _/ I) A8 W
- STA $4000- ~1 X2 [- p6 b& d
- STA $4004
0 _' r: [/ V% m: L - STA $400C
# n# w {, W7 w4 U: h3 H. L6 ] - LDA #$00+ t8 V( d; y o. i- k
- STA $4008 W: u5 N$ O0 ]4 j* M0 y* W+ p9 v! `
- LDA #$0F% a! U# Q ^" k% }* s
- STA $4015
3 h/ Q5 l0 _) v8 [$ r Y% e1 c( a - .ENDIF
/ d% c" ^3 {$ j' b3 f1 Z -
. N9 `! h5 Y6 J. d - RTS9 G3 w0 B2 e/ q# Z
- 5 M; H' |/ c, Z9 o! s
- ;======================================================================, W) k+ b9 b/ P
- ;重启处理9 T! l+ b& J4 }' s
- Reset_Program2 ^8 Z, p4 B4 w2 o+ ?
- SEI
5 w m, C) M' O - CLD, j+ f1 M: R# M% C3 ]5 t! y) {
- LDA #$009 e8 B9 q U/ Z( _* H
- STA PPU_CTRL) n% H1 [- l6 ]1 q# ]' h
- STA PPU_MASK
+ c2 z7 C5 j2 {( ~* V - STA JOY2_FRAME/ W; u3 R. Q; c1 c) o2 G
- STA APU_STATUS* J, v% t! q2 U& B. J( j1 P1 w
-
. d! Q: O& q7 C - ;等待屏幕准备完毕+ h. \' X! }( i4 B N
- LDX #$02
7 `' z3 N% ]2 w9 T& x; F - .Wait_For_Screen_Ready
1 M" x4 w3 s$ G$ e) B - LDA PPU_STATUS) a; L/ P' f) l' {0 L S6 p4 F+ h
- BPL .Wait_For_Screen_Ready+ B. ` V s2 u3 `2 K, E ~* z- ?" ]
- DEX
3 a& f3 L* p* p- {% j$ C3 H! N6 e% g - BNE .Wait_For_Screen_Ready" o% \; Y! G; O8 ~3 x
-
# I* |) S Y" ]/ U$ ] - ;清空调色板
/ L! [5 f' v7 ^9 N1 S1 T - Palette_Clear+ l, |; d" V& L& l% z. E* y
- LDA #$3F
% q) q) A$ p, ]5 e5 b5 _0 Z& V - STA PPU_ADDRESS" E+ l& b; B" q; y: _
- LDA #$00# X0 _. q/ d4 U/ B+ j' c3 U
- STA PPU_ADDRESS
' p- }: Z8 e1 V9 l7 K - LDX #$20/ s/ F' X0 T% Z5 p& m
- LDA #$0F
+ O8 X( Q& ?& l, Z4 L - .Write_Data; ~8 q+ M3 Z% q2 n" _# `
- STA PPU_DATA
7 R+ \! S% R* i+ W - DEX8 ^& I; o- D2 `3 L( O: c4 i5 W9 b9 A4 |
- BNE .Write_Data$ p9 A! l% G6 s
- / I8 N! T, g+ `% L. J7 e4 q7 w1 t
- ;清除声音 $4000-4013
7 y2 O" C: b( J* Y! ^3 u7 d3 p& g - LDY #$14
, f& h, `3 M8 s+ ]& H+ m, R$ \ - LDX #$00. k" v0 O, J7 e9 C* O% r
- .Sound_Clear
( y" V, n- a/ S: M1 \ - STA $4000,X9 j4 K- n! x; S$ p( g4 a: u1 |
- INX* C" f1 \1 j6 d+ L( i
- DEY% P) z# ]3 I/ U5 _' T0 y# L4 q
- BNE .Sound_Clear
, B0 h2 E& v; }! c9 F0 z -
3 s4 m$ q/ g% m- B5 r - ;清除 RAM $0000-07FF+ J- u4 S, x1 _
- LDA #$00: T% K0 v$ E. k* h0 {/ ^
- STA $00
* [; p$ d& W$ `! X$ o; y - STA $01
9 T2 a) J. J1 a4 J - TAY7 u8 j, T/ M7 u& t( V2 I+ @
- LDX #$08" |, t6 f* Y N# g1 ^6 V- \$ N- B
- .Memory_Clear
9 r3 a$ d' d* B) _" e- U' W, T6 V - STA [$00],Y
% _5 l, P" X6 `# H: l { - INY, ?, A$ b D4 n* u) o( a' G1 }4 E
- BNE .Memory_Clear
: ?9 b1 d5 k; L4 g {# N/ r - INC $01
' \1 P2 b$ H, Y+ k- O. @7 N - DEX5 ]2 M1 t4 N1 j; [( ~" r: F
- BNE .Memory_Clear$ B8 Z6 N& `% O' j
-
9 ^% z/ ^ w2 y: Q$ Y - ;精灵缓冲初始化 I8 F- ^( o: _. P% U; O
- LDX #$00
+ z% P/ L" y1 u9 V3 ~$ E - LDA #$F88 L0 P7 A/ E& u8 P# Q; h3 A
- .OAM_Clear
: D, _. R/ {& P - STA OAM_DMA_Buffer,X8 L4 g/ B; O$ G
- INX2 u/ n. \1 H: h+ {" H8 A
- BNE .OAM_Clear
) ^; Z& C, P2 F( J -
) Y% c9 U& C( e: U- w$ n: p - ;栈指针初始化
5 @( S; B/ `' Y/ b: { - LDX #$FF
! Y+ W; t( P! J& X$ o( N - TXS, I) m- U( ^9 J R$ a+ M1 o: M9 z
-
- E& u& q/ S# S3 _* G9 E. J# \ - JSR Nametable_Clear;命名表清空" G( Y4 X$ ?2 r, I0 z. O i
- JSR Palette_Init;初始化调色板缓冲9 U. W& V i" N* S" c: M& m& f
- JSR Static_Text_Init;初始化静态文本
. _5 w8 E# Z" K# b& _( V -
4 u) d ^7 ?& ~. T+ } - LDA #MUSIC_ITEM_TOTAL - 1' P+ @3 C$ q. w
- STA FC_Music_Max_Index
0 C: w8 ^, o7 C; ~: f -
5 I! V8 x" }; M8 A) p& D2 B6 f - LDA #$1F3 a( m N: j, J/ i1 [
- STA APU_STATUS% R ]# Y( F) [7 r/ t& c t
- LDA #MUSIC_BGM - 19 G+ D: u0 J# c( w2 B, Y
- STA FC_Music_Index
0 X/ s" C8 ?1 E, D - JSR Music_Init_Process;音乐播放
" r. {9 Z1 a) C. h; {8 r% q) T$ i2 _1 V - 2 e2 z6 Z9 \% R4 U! E% i
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
0 P# g5 k$ m: Q5 H, L - LDA #$1E
& D0 R: t. i+ K; e& G' i3 n - STA FC_PPU_Mask_Buf
! E- H; x+ y6 e' @+ T4 G5 \+ O, l - + q$ Q4 b- p# O) t: x% e9 v9 N5 | b
- ;启用NMI处理' v$ ^% W6 O. I; X4 g
- LDA #$80/ t4 j, q8 n# n* z
- STA PPU_CTRL/ G3 I) Z; y$ K2 B
-
6 t! P3 B, I7 z - ;程序循环, 剩余工作交给 NMI 中断处理
5 J( o* S& Y- k: K! m! s. j7 G - .Loop) |' _* X0 {; Y, l) }. P6 f) K
- JMP .Loop, g% j2 T2 d/ [5 }, g0 n' j2 b2 w. W
- 7 C2 r; X, M1 _2 G% o O
- ;======================================================================
& n7 p1 y3 ?; h; G - ;不可屏蔽中断处理
5 T' G+ _* J& X, B' A0 L0 Q# | L - Nmi_Program
8 q; a$ \! F! f4 `* t - PHA
o- H: P+ f; A+ ?6 }8 `/ M% o0 h - TXA
: i1 I# n; q/ _2 f0 f9 L/ ?+ r) z9 ] - PHA8 _$ O* ?8 d4 O+ x; O, S
- TYA
1 s- i6 H1 x8 V& ] - PHA. } w+ c" b- `+ _3 M
-
; Y' v; r' [, B) |5 A' o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
! u- r8 m3 C: ] A1 a8 \ - . H3 @" q. ]4 y/ l
- JSR FC_PPU_Procrss;PPU处理# M# j. R# P3 ], P
- ; \: a0 C' T/ V" E Q. g
- ;精灵内存更新5 z- a" z1 Y0 }4 w9 t% @
- LDA #$00. S d) q! y P1 P4 D; \. b
- STA PPU_OAM_ADDR( Y6 G9 Z* N2 ?3 M8 I0 w4 C
- LDA #OAM_DMA_Buffer / $0100. Y! e/ }0 Y# j$ y6 i
- STA OAM_DMA- U* N0 `! o" l/ ^9 R1 e
-
( i& ~9 L- l ]9 @ - JSR FC_Gamepad_Process;手柄输入处理) d9 K: Q$ z/ h3 _5 q
- JSR Music_Select_Process;音乐选曲处理
5 _' T) e$ ?' x# D' t - JSR Music_Play_Process;音乐播放处理
1 O& j, r) s. U) M& ^; H - 0 w8 {$ i0 k) R0 g. x( [
- PLA v' M5 o) x7 O4 R8 }
- TAY
$ I& R f' K0 p0 S% w - PLA+ Q+ d _/ U* c7 e7 J
- TAX0 E" @8 d* q/ a1 O: f4 v! R& S
- PLA
$ z8 }) t) X; e: R+ P3 l& [ - * Q! @1 J$ X) a8 T" f
- RTI h8 _# u: S0 W6 s- n1 L! `* U
, z" V8 L1 ^/ w4 t8 `- ;======================================================================
, U- ?# y4 G! u' x2 } - ;请求中断处理- R" b: X; m* b$ [+ j* a
- Irq_Program
2 u& ^, q( ]& b: U$ \5 r - RTI, t! I$ g9 |% [* @ w6 G; \+ ]
- ' ]3 I$ j$ H" a. F; K
- ;======================================================================: G* }8 N) a3 C `: y; E
- ;中断向量表
/ y+ [# U. h' Z: S4 |9 f - .ORG $FFFA- O9 z a9 M5 f" d* D0 S+ {9 D
- .DW Nmi_Program ;NMI触发时执行. b: Q+ } I, l M' D" i1 s
- .DW Reset_Program ;载入ROM时最先执行
4 `* @) a7 v( {. D( ]' ?+ g8 N - .DW Irq_Program ;IRQ触发时执行$ Z/ [) E4 L) g2 z" V
复制代码
# y: l: }) f% o2 \2 {4 t
; W3 l& N! H: q5 n% h
E% o6 j/ `/ z- P1 }https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|