|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* @% D' s0 \$ R" ^- {2 V

( _# M& h7 _7 Q4 f4 `7 r: Z! I; v以下是主框架代码:
2 H% V5 s2 F5 I- ;======================================================================" Q# h" i' ~2 {) Y3 I* W5 R4 `" j
- ;文件头' ~( `+ K. q1 n$ |
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! M4 ]2 C5 E: V/ b - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
$ w; \8 Z% z2 L$ J& g - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码5 h7 Z. @& W9 z; [7 V
- ;======================================================================5 y" B4 d) w3 @( X
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
) f; t9 P* N% d; y4 V6 u( u+ o; G - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1- f- K/ ~) E0 l" x
- ;======================================================================4 H, A6 ?: t+ ?! Z$ {( H2 p$ u* O
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 15 W' K. f5 h2 M6 @7 |+ ?1 v) a/ \
- RESET_ADDR = $E000 ;主程序起始地址
- Q: j ?) y2 y - ;======================================================================
& H( U) j( r; `, j - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB m( T" T) B5 E0 Y' }. a7 `
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB6 V" W8 }$ O! R+ Z, {7 a5 E
- .INESMAP 4 ;Mapper号 (0-4095)6 T& z2 P' @$ a& A- E4 c( ^
- .INESSUBMAP 0 ;子Mapper号 (0-15)
2 ]6 Z. q6 e+ u6 C - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
) h! I. M+ y2 @, z: K - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( D0 C* G A. ]7 j/ p z. Q - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 G% X9 U, z6 l
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
$ t( ?3 `3 `) |. q" X! R; L; o - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 c2 a" f0 x9 L
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
' h5 p0 p l" c4 T+ D: O: ? - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
9 i9 z" v b+ o. d0 |4 Q$ c - ;======================================================================
9 Y/ s4 l3 u5 @6 a) f - .INCLUDE "fc_demo_config.asm" ;全局配置6 n" N. `; G9 H! U; T
- .INCLUDE "fc_demo_constant.asm" ;NES常量
& ~" @3 @% p$ Y, }, L$ j - ;======================================================================; v9 f y' T) H, I6 _) d
- ;音乐配置
9 W6 k9 ]9 K7 C7 [& k1 e - .IF 0 = MUSIC_THEME
- W6 H: Z6 l! T2 I+ p8 o - .INCLUDE "data/music/Gremlin 2/config.asm"
3 [7 G4 R- W" h; n, d6 M - .ENDIF
0 _/ Q5 O$ o# j% k7 R -
) D4 J- t% r! b8 ? - .IF 1 = MUSIC_THEME
9 x4 Y4 v% @% \5 J( }- B - .INCLUDE "data/music/Raf World/config.asm"" h2 } @ c4 H4 _% n+ P7 q
- .ENDIF8 y' F3 v& {5 u g2 M' Z5 i% l
- / N) y5 `3 m$ ]
- .IF 2 = MUSIC_THEME
' I! t1 b' C4 t3 v5 h - .INCLUDE "data/music/Ninja Gaiden 3/config.asm": A9 K U8 \8 S% {0 x3 u
- .ENDIF( `+ Q! x+ q, v% N) i
' X+ v& V4 A1 I G- ;======================================================================
) k" }' Q& m7 ~0 j, i n) ~- o - ;引用CHR图像数据
! \, o3 C: a* Z+ n - .BANK NES_16KB_PRG_SIZE * 2
. f0 B% r! H4 X* ?3 B5 \- y1 r' Q - .ORG $0000
# q0 ]9 v2 h0 L* O7 `2 F - .INCBIN "data/bkg.chr"8 G. u7 i0 K' f* [! K6 p
- .INCBIN "data/sp.chr"
9 N+ K7 U' T0 g; x8 v& j+ @/ T - * z1 g3 q, x4 d0 |7 U4 g
- ;======================================================================
4 Y/ h% j# ?" c$ d) G - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
) h: C; J. ?% G/ Q3 q+ l3 |) A- A - .ORG RESET_ADDR. l6 }. t1 B, J+ p5 `" p0 ^
- ;======================================================================* p: w' F& |4 I5 m) |7 k
- ;引用其他源文件( U& T+ _' n4 K9 @* s& s
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
/ D8 k3 G" L6 a! X; i u8 Z - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
1 _0 Q5 f' }7 i0 |- g; G- `: D - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理! ~7 Q* b) d$ g3 {
- ;======================================================================
+ w; l7 k) A8 Y8 ]! C4 {3 I# r0 m5 b - ' n* j# I) Y3 o/ p- t. p
- ;======================================================================+ l6 p1 M4 ~! j5 p7 @( D: l4 x
- ;等待VBlank到来" B- p1 B% n4 N
- Wait_For_VBlank
- e$ [7 Q: Z( g - LDA PPU_STATUS
+ a% X9 X7 p* W' D - BPL Wait_For_VBlank7 `# Y3 @9 y) A, D7 Y4 M- C
- RTS
% W( v p& B% f( R - + a9 Q! R! K: L
- ;======================================================================! m# B6 x2 i% F" O: X5 n) K
- ;调色板初始化
2 I# L; X9 |# l+ Z- X - Palette_Init9 b. W! e) }+ B: L0 M
- LDA #$3F
$ G6 r$ B8 Z$ L9 s- D' z - STA PPU_ADDRESS
/ S3 r u9 d% { - LDA #$004 J) M, V; \3 G- O7 P, }
- STA PPU_ADDRESS& q1 z0 T4 C1 l8 t+ _* o3 F
- LDX #$00
: y. X1 ]0 O ? - LDY #$20
& v3 a" E( L! a$ x' _ - .Write_Data& h1 T: A: S/ Q) d6 F: Y+ y8 C
- LDA Palette_Data,X, e, Z: I) ]) R5 ^: R8 N
- STA FC_PPU_Pal_Addr,X
1 l) U @2 G" `- { - INX
% z7 D. l7 ^2 E - DEY' g) j: \. n4 t/ R- r; n; _- H
- BNE .Write_Data
8 @, a% O5 z: i( N8 m% E, Y - .End
( F6 d# Y& O1 D, Y/ B/ x. } - RTS
- b& \$ C, B3 M2 K7 Y4 k6 c - 1 t% Y) z) K6 I7 G0 m+ B! j5 M
- ;----------------------------------------
$ z9 D3 N$ d3 Y' n, E3 M3 o - ;调色板数据
6 g. Y3 V: M: q - Palette_Data
# a0 @7 u: i- _3 \3 y - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
1 E1 L+ _0 f5 s - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
3 M' X+ p9 V8 P - ; q4 C: J3 C6 N' X% `0 I
- ;======================================================================
( n7 [& L% o* ]8 \4 e - ;命名表清空7 D) ^" x! ^( R: l0 f5 x
- Nametable_Clear
6 E4 `; K) s0 Q' r8 _ - LDA #$20$ ^, o) ?! T5 G. D7 u
- STA PPU_ADDRESS
1 Y, \2 s( `4 h ~$ m# O0 D - LDA #$004 Z" p( |' X {0 c0 H/ ]
- STA PPU_ADDRESS4 S0 p! ]4 W, A( F
- LDA #$00
2 t8 T" ~4 _+ M0 ^5 c, q - LDX #$00
0 i; f% w; }' ]: D2 N B R/ Y - LDY #$08
0 z3 l' f5 k+ C! e: W q+ t - .Write_Data* u) [; U4 I. @* H2 v
- STA PPU_DATA
! l+ ^- ?7 t5 U5 Z - INX( n6 W/ W4 V. l
- BNE .Write_Data
# E/ Y1 J' ^* V4 k* M0 m6 d - DEY
7 @1 r6 l" l1 C# z( _ T - BNE .Write_Data, ~+ [4 O3 N% n/ l2 _( C
- .End
2 A+ t* H$ u- v1 J# O) `% C - RTS; z( G, E+ P/ N6 X) f
- 9 Y4 |& K% W4 _7 E
- ;======================================================================! A4 s! J* m# D' _
- ;音乐曲目切换
1 B# Y, z# y" p# U1 } - Music_Select_Process5 F5 O0 H" i- p/ v0 I* D
- . V8 y# O; y s. X
- .Pre_Music;上一曲- h0 i( W( k2 A. S
- LDA FC_Gamepad_Once
- l& I( ]1 O% q: H5 e& R - CMP #JOY_KEY_LEFT
& n& K) X! p; e2 o$ i: D' Z% j - BNE .Next_Music+ P( M1 E: J8 G
- JSR Music_Play_Pre
1 U. b$ r: j0 Y3 c7 x - .Next_Music;下一曲8 p1 c: O1 U3 s1 m& H
- LDA FC_Gamepad_Once
1 E: j/ [9 \5 | E7 p - CMP #JOY_KEY_RIGHT! k4 v% `4 T/ Z. q; p
- BNE .Next_10_Music& ^7 S5 [6 c& Y: T
- JSR Music_Play_Next
& i" [! G7 v8 M - .Next_10_Music;上10曲; y& e- z0 v; X9 z
- LDA FC_Gamepad_Once/ V2 I4 Y: A$ k# [1 h3 _, b
- CMP #JOY_KEY_UP
L, B" S! ?) o' b5 a9 i - BNE .Pre_10_Music
; {, \% X- {: s( H - JSR Music_Play_Next_10
1 N6 l. L. t% [ - .Pre_10_Music;下10曲
0 Q$ P) K' u. B5 }' y8 [% s - LDA FC_Gamepad_Once) X5 n) B8 ]% a- }0 z( B3 K6 a
- CMP #JOY_KEY_DOWN
v7 v! e8 H; K) F - BNE .Reset
5 J6 q- {8 t& \5 ~, Z - JSR Music_Play_Pre_10# u q/ T+ i, Y: u! _
- .Reset;重播当前曲目. ^ d6 M1 X1 a" ~, [
- LDA FC_Gamepad_Once, h) [: X' U/ H1 @# B2 @3 R
- CMP #JOY_KEY_START
6 e4 a V) ~1 C2 [! X# L% y# A5 _ - BNE .End8 ]5 e/ @/ O) l9 t* @5 ]
- LDA FC_Music_Index v! P0 Z. w2 o# Y9 _2 v
- JSR Music_Init_Process
8 {( k* o5 u, b - .End
2 c3 G& n$ W7 J' M4 O - RTS
2 D5 v7 n( i: d
' D- A7 V) v5 y' V' L$ W) N- ;----------------------------------------------------------------------6 a1 o/ {4 p8 i( ~+ f/ f
- ;播放上一曲
9 l& ?0 a% Z0 U8 G/ t - Music_Play_Pre
; s% K% F) p3 s- P6 o% F% | - LDA FC_Music_Index9 U) ]7 J Q7 ]. i$ x. ?
- BEQ .End
- C% T* e! F1 ~4 c: }3 a" t3 a - DEC FC_Music_Index
3 y, S v w, I6 y9 y. k _ - LDA FC_Music_Index4 w, ^/ {% S" K. x
- JSR Music_Init_Process
5 A0 Q+ x$ [8 c - .End
: S+ y/ M8 ~5 s9 ]& B" Y - RTS
* I9 m8 o; r9 N - ;----------------------------------------------------------------------
5 C& H9 d' h4 N: o9 ~1 M - ;播放下一曲
: a" F( @' z$ @) u4 U" g+ G: e% J - Music_Play_Next
4 {% V) p7 i! X4 W: [ f0 O2 M- ? - LDA FC_Music_Index
8 } ]* Z6 r. W2 n - CMP FC_Music_Max_Index# f* m7 }' k! a# [, B; Q) J
- BCS .End1 ]0 R. p! [/ O+ G2 r
- INC FC_Music_Index' c9 P9 Z/ Y4 X# z) _) E
- LDA FC_Music_Index
) n2 w, t( A6 t' q - JSR Music_Init_Process n. l* m$ n( [6 [. Y5 {
- .End
- M) z$ g0 H- } - RTS
+ u8 L) V6 u0 e3 \ M& r% y7 `4 z - 0 K$ H7 G$ G( ?0 G/ b, _
- ;---------------------------------------------------------------------- \" J7 i- o* Z
- ;播放上10曲5 X, @& o; r7 L; k3 c
- Music_Play_Pre_106 O+ [6 p2 A6 u7 L
- LDA FC_Music_Index
# X' ~7 P6 y4 @& O# S( F, |& A - BEQ .End
8 L" m& t7 v$ y - SEC
" h, B0 r1 Q- d8 P% D! @$ S - SBC #10
' `# A" M, B: q) S) R - BCS .Pre_10
2 Y7 ^% e8 u- Q5 K$ |/ w* b - LDA #$00
# ?( T2 @" T8 H. }- G - .Pre_10* [7 `/ c& \. f& h% v
- STA FC_Music_Index% O/ }* S0 b7 u# _7 a
- JSR Music_Init_Process
4 s. g% D. f) A z& j* C/ A' [ - .End: F1 ?$ ]! Y, @5 s8 G0 t
- RTS
2 z$ S. l$ @! F/ r - ;----------------------------------------------------------------------
* Q0 S/ i+ h; E1 C2 ^8 p3 O/ c! @ - ;播放下10曲
& O) S7 N4 q4 c" P/ ~3 C - Music_Play_Next_10
$ J" w3 X" U" @$ L2 \1 z2 R& I: { - LDA FC_Music_Index
/ G, a9 ^" r3 F- v& p - CMP FC_Music_Max_Index1 p7 [; f: _. R/ C/ O6 p3 @5 v
- BCS .End! c1 d( y1 p) D5 s
- CLC& e6 k- k' a* E
- ADC #10
. L. Y: k1 ], O! m" Q, z. S - CMP FC_Music_Max_Index; ]1 E* h# x r7 S
- BCC .Next_10% F/ S7 H3 O) I4 u2 s, y l
- LDA FC_Music_Max_Index
0 k3 n0 @0 ~1 s& w! F, N' s - .Next_105 X1 B7 G. d3 A) X7 |# v
- STA FC_Music_Index) n2 }; `, d( _3 V* _4 c- y
- JSR Music_Init_Process
0 @" T( N/ P% w* d; \! k8 l - .End1 i& V+ h# B. c# v5 P2 i
- RTS
( k, Q' I9 o+ U; S
2 [ w+ O. K3 X) \5 Y% w: i3 g5 T- ;----------------------------------------------------------------------
2 ^8 ]" t% d2 V! {, C2 ^3 F0 O - ;8位十六进制转3位十进制制3 O) ^4 \/ U1 |. ` W1 x8 y- y
- Hex8ToDec$ d, s5 m2 F9 h& l
- STA FC_Dec_Data_18 U) [$ i3 E" P+ i
- LDA #$00
; c* G: |5 [! x* D3 m - STA FC_Dec_Data_1006 l& n! |5 T' _. `% o |
- STA FC_Dec_Data_102 ?5 |# m9 J- r, j) e" b
- LDA FC_Dec_Data_1& z& v& ?: g2 V* o
- .Convert_100
9 j" T# T, L5 X, o - CMP #100
) E5 S0 o5 I g( Z. E3 G - BCC .Convert_10
& a* x O" A; e1 Z3 b$ l1 I - SEC
3 c8 _7 `/ l1 s5 ^0 g8 M - SBC #100& t9 \6 _, Y2 Q
- INC FC_Dec_Data_100
; r% m) J( E+ v; ~ g - BNE .Convert_100
5 ^9 b* }3 X; Y - .Convert_10+ K3 f# \9 ^! [; h) W: @3 k
- CMP #104 N! e% Y$ j k4 T8 s
- BCC .End0 ^6 `+ F1 ]1 d
- SEC; M1 ^; ]4 ?$ N: r% _7 T) Y8 g" x
- SBC #108 x3 |0 F) s3 [) Y/ ?% l$ W& c
- INC FC_Dec_Data_10
! v8 w! |& D, D+ U' a5 l& z1 H: Z, N - BNE .Convert_10( M6 L8 D* v- Y! x
- .End* d$ ^" j' q5 H( w# ?' [
- STA FC_Dec_Data_13 w4 {+ j+ X- q
- RTS: T( L5 K' F3 {& V6 y# f
" F; T0 M- t* F& c- ;----------------------------------------------------------------------
4 ]7 a& u8 ?4 v7 i - ;显示曲目信息
/ d! f( {; Z2 ?. f - Music_Info_Display s$ ?, l4 z! A F
- LDX FC_PPU_Buf_Count
g1 R% F9 J0 x7 ?3 _ - LDA #PPU_WRITE_MODE_CNT_LINE
. e* N+ L: b/ `" \1 @$ _ - STA Use_PPU_Buffer,X
& N. u2 B3 b+ i1 M5 I - INX
* J% v7 p- ?' l- k) @; G -
" h. j( e% z& O. S3 e: g - LDA #>MUSIC_INFO_POS8 Z# v2 ?" G m6 C$ t
- STA Use_PPU_Buffer,X
& e4 q1 v, ~4 {3 h m8 u$ I# f - INX
( j" H7 |( h& { q* b! c$ p V - ( M6 G" u. L- z0 U; C. R4 n' R* `
- ;居中
2 ]' |4 R3 }6 e7 k6 \ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
. y; I$ Y0 r( f' f/ c+ g" } - STA Use_PPU_Buffer,X
$ m z6 b9 {& T3 s3 r - INX
' y+ h6 B( y* O4 ~, c - 6 e* k% \' f5 U8 j s
- LDA #$05 d, _# H; m7 `" p: d# J
- STA Use_PPU_Buffer,X
7 Z- s1 K6 P2 V. c Y( B" Y. U - INX
& [2 e6 D* Q2 o! k2 v y - 7 p0 L& Z5 X: F. q* W- O7 Z
- LDA FC_Music_Index3 O4 {+ c0 S2 V1 z. Y
- CLC
% W' d# O; {- ]. n9 k* | - ADC #$01* {( E+ f \$ c1 E
- JSR Hex8ToDec- W" |& f N6 n( t0 | n
-
0 F: C' {3 _8 n6 {+ {$ v - LDA FC_Dec_Data_102 b& {' S, Y) [; i, d
- CLC
# }0 P$ g" U" I! S0 O4 } - ADC #'0'
" z$ a! R& e6 w# \0 C - STA Use_PPU_Buffer,X. i$ O) u& M; k
- INX" M( l. d" h8 m( d
- 6 Y/ E) j; v6 f
- LDA FC_Dec_Data_1
, F) |0 K5 C* k; c - CLC
8 y& y" t3 p% p - ADC #'0'
5 s2 A* a) v) [# N9 u2 x+ F - STA Use_PPU_Buffer,X# p% Z$ w E C$ c3 L. \% Z8 L+ k3 h7 |
- INX; |: R/ N7 ^* M L
- 5 F1 F _# R$ j" Q, I V8 x% o; U
- LDA #'/'
7 q' ~9 D0 f* t4 }) z5 D - STA Use_PPU_Buffer,X
' _7 r; y9 X6 N; H - INX
) U: ^6 w3 ~/ w -
, ]& Z# V, z- y5 ? - LDA FC_Music_Max_Index
8 z, Q3 D2 k( f+ H" l1 t6 l - CLC. @& i) |( e2 Y% c
- ADC #$01& s4 E, u* r7 s" v/ W" t$ A. q5 u
- JSR Hex8ToDec2 A; M% ~; G+ q2 f
- 2 x4 @8 S4 T2 S" G
- LDA FC_Dec_Data_10! S1 ? K8 ^/ M1 F& ?
- CLC
' I& `' W& {* s# R4 A! a/ D/ P. K - ADC #'0'* P3 [) z: O K- X0 w
- STA Use_PPU_Buffer,X
) [6 X& n0 } o7 Z- m1 q - INX5 z+ o' o+ L5 @) x6 U
-
: c9 Z, L$ ] a0 O. x2 r Q - LDA FC_Dec_Data_1
; [% K9 X) [, k- l- o/ x2 | - CLC0 j) T0 j: H& `
- ADC #'0'; }4 y4 O1 f5 X8 b
- STA Use_PPU_Buffer,X C: ]1 i; X9 s. W$ L9 a' ~- t8 }
- INX8 q7 T1 M. q) A7 g( L3 |8 m+ M
- % O8 Z& [7 B* [6 {$ q+ ]3 ~
- .End2 l- X5 T+ C- K# N* z: H
- STX FC_PPU_Buf_Count
( e9 Z. A1 |" l+ k% Q H% ` - RTS
; c* R4 E2 ^# G# r2 y0 \0 Q
2 q+ R& A& M& L! O; x- ;----------------------------------------------------------------------
0 e+ E1 E# }' ? - ;音乐曲目初始化处理
* U1 \6 \& ~: p - Music_Init_Process
8 I5 e* Y3 C, w' d - PHA
; I- G, s$ ^/ [: E, M l- Z - JSR Music_Clear_Process
4 T& t, H$ _- O' ^2 y3 r - LDA #$1F1 v4 n, l* l8 s1 m! {# `) V, [
- STA $4015
- [. m z& O7 ? - PLA
! Y# z7 d& j/ @ - JSR Music_Init_Addr
2 d9 _( G% }- c" o - JSR Music_Info_Display
* ^+ m6 p* b( s- F/ ]& m - RTS
9 X1 U4 ?/ c& Z. A* E; e( A& {
! ]9 i5 U, c* z# \/ O5 M0 _- ;----------------------------------------------------------------------
' [) ?* z2 p* ^4 j% g% ~2 B - ;音乐播放处理5 E5 B. o7 q" m1 _$ y
- Music_Play_Process! u; |! B! J- h' {1 ^
- JSR Music_Play_Addr8 O }. H( m9 s! Q/ U
- RTS
5 o; l1 M' p# P4 E6 N - 2 ^6 |$ s& Q [. \* X
- ;----------------------------------------------------------------------2 u1 G( X* w' V
- ;音乐播放处理
3 _ J/ h2 Q2 d$ x$ o; w2 Z2 q - Music_Clear_Process7 u. m, V3 @5 G6 K8 W
- .IF Music_Clear_Addr3 P/ i. E3 u* ^" w- p; I8 G
- JSR Music_Clear_Addr
) o5 K7 |* G" W0 V* ~ - RTS
! M* W" l, n6 q: g - .ELSE6 p. Q( M$ p2 H/ W3 u* u
- LDA #$1F
$ r- B L3 W7 ?! ^ - STA $4015
. x! S( w" V8 n8 ^ - LDA #$008 i2 I( ^- x5 t' i" f4 [
- STA $4010
$ |7 h+ ]# a) L# a - LDX #$000 r# @: S2 X: b
- LDA #$00
' g# H: P* j3 X1 U - , A1 A$ r& k# F" s9 w# q) V
- .Music_Clear_Zreo_Page_0& \3 {; K( w! F5 D
- STA $00,X
G! _/ H5 T( g$ F( ~ - INX
7 v! M7 a3 m* _7 e" L7 ? - CPX #Use_Zero_Page_Begin
, ]& x9 H U3 Q g/ G - BCC .Music_Clear_Zreo_Page_0) o- q% P; ]8 C9 ~
-
. D8 k- r" @6 G: @; L - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size: g9 u( a1 m8 E0 s" c! V
- .Music_Clear_Zreo_Page_1 ^. S, T1 H& u8 h% z9 {) @; k
- STA $00,X* g P; ]; J7 m: r& H- y
- INX$ m: f1 w& Z2 v2 h
- BNE .Music_Clear_Zreo_Page_11 [/ l' z- _& I/ O, d
- 8 I" a; l# b. [( B$ T
- Music_Clear_Process_1# u4 V( K8 T5 I% S- z& N4 K& z" K
- STA $0600,X, L4 B* c, F& s' ~3 v2 T" g$ {
- STA $0700,X- c$ F& I1 q4 d
- INX
; B5 y4 ~$ y9 u! F - BNE Music_Clear_Process_1
4 S% Q1 q+ L" w1 ` r - LDA #$10& j( j% r4 x6 b) t
- STA $4000$ P7 m7 \: E* n
- STA $4004
9 l$ b3 G8 r$ x! p - STA $400C
- X8 [+ t# E" d4 G3 \$ x0 p* O - LDA #$00
; A* U; X% _4 `4 Z7 e8 F - STA $4008
' {" M# ~ a. I: G4 R - LDA #$0F$ V' @7 |2 w4 ?" z
- STA $4015
0 s6 A4 F C* i+ T/ j - .ENDIF2 v% L- Z) ?/ z* u# H. i, E
- j5 s; K, p0 j6 N) H& d0 j
- RTS
, M+ Y- g- A: S
+ ^; D5 d1 y8 i: N& \9 j o- Z$ z- ;======================================================================
# g4 v& H: t: W7 } - ;重启处理5 |/ R7 t$ {3 b2 g3 e
- Reset_Program
1 B2 p% f$ m2 ?, t) P; ^ - SEI
4 a6 z) _% f) y! i7 v! p' F& l8 `: q - CLD6 i) |# c7 j! o. M3 ^1 b
- LDA #$00
, K6 k* D. `% \ `. k - STA PPU_CTRL
7 I# V- u* ~2 N - STA PPU_MASK. n. v! x2 q/ w9 ~. ]
- STA JOY2_FRAME) d! s ]- T H8 a! h: i
- STA APU_STATUS
( {4 b; p5 m8 }( F1 t' z: c' d7 ^* f -
; s% E" K! q) y$ S' J - ;等待屏幕准备完毕 \& r. s8 O/ X l
- LDX #$026 \$ z' X$ l9 T2 R6 q+ _6 `
- .Wait_For_Screen_Ready" z' O7 ^0 D! R9 w
- LDA PPU_STATUS
6 H" u( Z4 I$ @4 E! r8 w, X8 I - BPL .Wait_For_Screen_Ready& o x/ O6 E6 {' m
- DEX8 M+ j/ z9 b4 _& s
- BNE .Wait_For_Screen_Ready, M: }: Z, S5 m2 H; L3 c1 Q8 S
- 2 Z+ D! T7 U6 E0 K$ r
- ;清空调色板% T2 K/ I/ ?$ q: }; B: |* T
- Palette_Clear8 c* f0 I/ P* l9 |+ C% s X9 @
- LDA #$3F5 q) y: ]' w2 E
- STA PPU_ADDRESS' p) c% x0 k: F2 q
- LDA #$003 s" x p" X2 |6 i
- STA PPU_ADDRESS
* U% ^) a3 \2 f2 g4 h! E - LDX #$20' Y9 X# I, J7 j) |/ V7 ^
- LDA #$0F. q5 U* o2 M d4 y$ M9 {8 |
- .Write_Data
5 b4 t: |+ R4 R Q - STA PPU_DATA
0 _& S+ y# ?7 G$ P5 O( Y6 t - DEX M$ a1 ^. e5 R, O. q9 x
- BNE .Write_Data2 I' R' k' d x8 b) T* U2 @8 s% e
1 U( b8 a/ v+ `( }% U$ ^- ;清除声音 $4000-4013
+ L+ Z" T* X' V" H9 s- g; B/ r' o - LDY #$14
2 n7 v/ {7 I O5 x. ~8 ~ - LDX #$00
% B4 ?, A1 I$ i+ a3 h3 k% m0 b - .Sound_Clear
' ]2 f) n! X7 _- [7 \+ b - STA $4000,X
7 g# k" m1 g' W s2 i - INX
2 I( J$ \# m7 T7 _4 w* Q - DEY" I; t) u; O+ a( l4 _# i
- BNE .Sound_Clear5 p+ L/ {& B2 B q7 C3 K' n, L7 ~
- ( D3 [! t3 Q0 S' N: u; i
- ;清除 RAM $0000-07FF
Q6 ]- {/ h& r. `$ K$ }: \/ ] - LDA #$00
! r2 e% A/ b9 r7 O - STA $001 S4 c; I4 x' }/ Z* H
- STA $01& j O; E- C# S- S9 Z
- TAY
+ ^5 p3 E7 x/ a: i1 W4 I - LDX #$084 d: C6 G! S R( b, [6 `1 S" _
- .Memory_Clear4 L1 P8 g( |+ m" L: {+ J2 L
- STA [$00],Y
: k. D- v* q1 N& ?4 }& b8 u% h - INY
9 j2 m- s& V5 J w- X/ \9 b - BNE .Memory_Clear
9 O: Y+ v# s4 M. q z3 Z3 I1 u7 S: J - INC $01
. K, _% {( u( Y& U - DEX# n2 J8 S) C! K8 w! l
- BNE .Memory_Clear
8 t2 g( |' H* _6 C' P -
# u, F3 y7 E* a, A7 q: w/ h - ;精灵缓冲初始化6 P, i$ H$ S- v# c2 e7 M, O( ^
- LDX #$00+ ]6 N+ R. {) q- A% e! Q
- LDA #$F88 s$ B7 M# ] g2 R
- .OAM_Clear
( @; @8 i7 A% V' j! t6 f - STA OAM_DMA_Buffer,X5 b4 L5 Q9 E% H/ E" y9 U G6 C* d
- INX
: v- R# f- _- `. e - BNE .OAM_Clear
" p, n& E4 d: j; i$ e - ; h9 X" J" e5 F; J0 v# Y
- ;栈指针初始化0 e+ a4 t- B* u0 ~% f+ n( }- h
- LDX #$FF
?7 a# n/ t4 G+ a- `" T - TXS8 e' l3 u- |2 C2 }% k2 C
- 0 {, x. J- T/ j, W2 N4 x
- JSR Nametable_Clear;命名表清空
- z: c; w* {8 K( j/ i7 k. b - JSR Palette_Init;初始化调色板缓冲; p8 t: S$ }, V4 m& W
- JSR Static_Text_Init;初始化静态文本
7 K) v1 P% R: N! O4 V/ |0 g" r - # E4 U& W/ ^" R0 s! X' R
- LDA #MUSIC_ITEM_TOTAL - 1
. H7 l) E5 y, e2 \. G+ O: H - STA FC_Music_Max_Index# u \8 i. W- U" X
- . S& f, I0 b" z$ Z
- LDA #$1F4 o3 c, z7 Z$ n
- STA APU_STATUS N9 ?6 ^: h: {6 O7 R
- LDA #MUSIC_BGM - 1
7 o3 g, U$ c/ V% `; j - STA FC_Music_Index
g. X5 O) o" ]* Z; K0 j! { - JSR Music_Init_Process;音乐播放
/ S6 h4 j# h, |4 N* P8 o5 I -
- b+ _8 x ^& ] - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
+ t, `, H5 K4 X. Q8 P - LDA #$1E
+ V! P- w- S: m - STA FC_PPU_Mask_Buf$ T V9 _1 i* u. A
-
# D& A: ]! \0 R - ;启用NMI处理7 T/ l' B$ L' r
- LDA #$80
( v# ?0 r$ U' ~7 }7 t - STA PPU_CTRL
/ H- M$ v( J* Y9 c( u* \ - ( ~: y# r1 v, P: L5 n
- ;程序循环, 剩余工作交给 NMI 中断处理" v2 O* H5 {0 ]6 f9 j
- .Loop
+ }- h0 T+ G- {3 l+ l. J; o k8 ` - JMP .Loop
9 V2 s& D) E3 L8 J - ; p7 P( ~7 I7 I* F! {. ?; K
- ;======================================================================' k( t: ]) D$ M( @ A$ e( X ?
- ;不可屏蔽中断处理
$ `& X3 i/ j8 g - Nmi_Program
" e4 }4 q6 y6 l, @' B# ? - PHA2 ?) n" e* u) S
- TXA9 y) V4 E. E% y( R q' ?
- PHA
3 E& D' e3 ^" n! a - TYA
) P- H( Q! Q9 r8 D& S2 c$ q" e6 X - PHA
& S4 k3 s7 l V) h9 C - 7 {& o/ Y4 _8 ?& B& [" i- [6 k1 u6 Y
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位# i0 H2 m& ^0 {, U+ u4 Q
-
- C+ ^$ x, F! T7 _; _6 h+ {4 } - JSR FC_PPU_Procrss;PPU处理
+ \/ g1 c9 h/ [* V3 d2 D - * j g+ k3 j! F7 @" t9 W
- ;精灵内存更新( V% e4 n6 K( u+ T
- LDA #$000 n0 W+ P: y) a5 {7 x
- STA PPU_OAM_ADDR
2 R/ H' ] ]/ Q% q. G f& w - LDA #OAM_DMA_Buffer / $0100
: z; _# O8 B6 g8 }- j7 r/ g1 Y - STA OAM_DMA
- H" D( Y" E0 O3 J" X6 y -
7 L& j" b. C0 e. F( \7 G( V3 k- d, E - JSR FC_Gamepad_Process;手柄输入处理
# ]5 E, l( n7 b; K - JSR Music_Select_Process;音乐选曲处理 t5 o' x. y: Z7 `! Y
- JSR Music_Play_Process;音乐播放处理
/ B) _" N4 x3 [% v9 f - 7 T& h8 k" E. R7 q+ `* A
- PLA0 C# x( f% u# @' @& n/ q
- TAY9 j6 v* ~' a* W! \8 Y' y/ y O
- PLA/ e3 L7 K6 ?! R' z: Q4 c- |
- TAX
/ ^/ ?. K# W! D( C, D) P. Y - PLA5 ~1 O- i% E$ z( |% n0 l0 v$ R! V& X! ^
- . J" X R. _4 a9 M, E1 l. M% B$ a
- RTI: E/ z6 z( `( z, Q
- % s+ A6 Q( t. c4 E v: M
- ;======================================================================
; ^& G" N% v$ V2 [8 P6 H4 {: T* E' y - ;请求中断处理
l n9 V' A& ^$ Z( Y% ]. v: r - Irq_Program. b, v, Q! w0 _2 M2 e
- RTI
% q8 i1 n2 e1 e, V2 T6 @ - 1 \5 m w" K) Y" T9 E' Z) V
- ;======================================================================
0 x8 f* b7 }) w6 m$ ?! i' |# B - ;中断向量表
) z0 b. T. M: E7 _3 M ~7 O( o - .ORG $FFFA0 W O3 G. v( A& _, |$ I
- .DW Nmi_Program ;NMI触发时执行
* @, ~8 s/ u L- {' q - .DW Reset_Program ;载入ROM时最先执行- l5 x* B% l; l7 }4 J: @- g
- .DW Irq_Program ;IRQ触发时执行$ c1 d7 y6 U) f) s, h
复制代码 $ J0 d1 }8 }& S' s9 K9 J Q
9 K$ ^8 G- W1 p+ n, f- d9 |
* G/ S" i0 X' ]* [6 V
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|