|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
7 c9 p8 L+ p1 c% H' } ! {- [4 u6 t9 W0 N( L' f- m
以下是主框架代码:% O" g# R1 E4 N1 p/ P
- ;======================================================================
. X5 z9 |; K/ t5 f - ;文件头3 r4 p* W/ O% h8 G3 @; h
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 B4 q0 j2 v9 ^
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
+ R- _! s" l; L - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: F7 }' g0 O* _. ]! j3 l
- ;======================================================================
/ l* g) {! H6 W, a - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2& @6 Z4 m8 \$ n" Q- N+ E* {' @, r
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ L: q F; o4 w/ ]0 n - ;======================================================================
, e+ h) r8 [& A( x6 \ - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1; O$ @- m$ [; P# W* Y
- RESET_ADDR = $E000 ;主程序起始地址
3 h8 Q/ b4 T; I3 ] - ;======================================================================8 K. {) M! S2 Q" j* D- S2 l
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; W& K" M4 R& D- F+ S' A3 X: b* Z
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
8 a; h2 s+ U0 k7 ?! q2 ]5 e) e9 k/ D - .INESMAP 4 ;Mapper号 (0-4095)+ K Z8 |7 `( P( b4 n4 z& @
- .INESSUBMAP 0 ;子Mapper号 (0-15)
. x9 H' \0 e* \$ P* L- C/ O4 | - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 c- S* {# ]% R' z5 {$ R4 [ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
0 f3 z1 T; m' m4 X" n1 } - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)1 O r2 U7 R6 @. L! f+ \, S
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)( Z X$ x7 [9 f* ^* w0 S
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
* A/ F' f" [. u# P' K$ ]) o - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
1 Q9 O% x i G3 V. H - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)6 h. X8 K# R- h& \* ^
- ;======================================================================
3 v# L ^& s- ] } - .INCLUDE "fc_demo_config.asm" ;全局配置
4 ?2 [. s& @3 r( E6 v - .INCLUDE "fc_demo_constant.asm" ;NES常量: g3 @* \, T. r2 [' R
- ;======================================================================
( z' H C m# l: O - ;音乐配置
7 Y# b: I0 b1 ~& r/ _7 |' O - .IF 0 = MUSIC_THEME
% A4 u$ e) [: j z+ Q3 G- z - .INCLUDE "data/music/Gremlin 2/config.asm"
6 U! Z% x2 a0 y - .ENDIF
: ~6 ?9 H- h- T4 m - / d7 U. ^4 M3 \/ p
- .IF 1 = MUSIC_THEME% z. y, e' D! G- ?! i: F
- .INCLUDE "data/music/Raf World/config.asm"
2 r1 t* j9 D6 B8 A, @ - .ENDIF
p2 m; g0 h; ^) M, w2 U. y% E' O3 K - " C, D3 R5 N" I+ Q5 k
- .IF 2 = MUSIC_THEME
8 ~$ z' I4 u" Y) j) V, k9 I" D - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"6 ?9 m: Q9 {: K6 [
- .ENDIF
! t! ?5 v7 [2 i( J/ ~6 Z5 x) G' Q - . i5 D; v* l# U( \8 _2 D
- ;======================================================================
' h8 y( ]* v# i2 h& X3 w - ;引用CHR图像数据
( c( ^0 Q6 N; h5 ? - .BANK NES_16KB_PRG_SIZE * 23 f& R D$ j# Z' c
- .ORG $0000
- S6 K% O4 z8 Q2 _ - .INCBIN "data/bkg.chr"
: M. R- C$ b& k5 a2 F" G - .INCBIN "data/sp.chr"+ Z4 @( y) P0 `# [( w! Y/ |* E
- " ^( P% B$ [3 E) y7 U; K& x
- ;======================================================================
; j" W4 \/ H K" k - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ _8 ]! q: J |! K! n! C- d - .ORG RESET_ADDR
3 b6 w6 H0 E# ?+ g& G* e; i" d6 _- X1 p - ;======================================================================2 [1 ^1 x/ z o1 z9 V* W! h, y
- ;引用其他源文件
; \+ _$ t8 W- C! E0 q2 ` - .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 ?7 C: o6 O) ~* j, {9 B/ p
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
( p* @( _+ g& Q4 d - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 K1 N6 U/ B% n - ;======================================================================
' H% j4 s" ?5 L
2 Z- `7 z9 f. N- ;======================================================================
0 j" j0 y! ?. [) y2 S# A - ;等待VBlank到来) a! I& U( x7 x+ h) O& p! c% M) ]
- Wait_For_VBlank I5 w" x; ~! |' r/ A
- LDA PPU_STATUS
1 n! q, }" J/ p- w. D* ]6 P - BPL Wait_For_VBlank
Z; v( N8 F$ ]. L6 z; D - RTS
! f( f$ G: o# c* J - . x! u" \! `* r" Z& r
- ;======================================================================5 J! g4 K& v8 [: C9 J
- ;调色板初始化
/ C* E. I& c* f5 w0 V2 K - Palette_Init
d: ~9 P2 h+ A% w! _ - LDA #$3F
: J# k F# r U! @/ |+ T0 [9 R - STA PPU_ADDRESS2 m0 v. H Y- O$ z
- LDA #$00
" ^+ W0 O. q: X0 i+ D - STA PPU_ADDRESS# R) Z- S9 U' X. i$ w
- LDX #$00
1 E+ z% G N' D5 z - LDY #$20: Q$ o& \9 @0 P/ d
- .Write_Data
/ T" _3 ~- `3 }" T - LDA Palette_Data,X& a/ c/ ^/ a9 R7 Z7 {+ u+ d- X+ l
- STA FC_PPU_Pal_Addr,X( ^2 L( V! L7 B. @
- INX
- r0 {% ^+ }- F. ^- ^ - DEY
( l) d/ r! `" s- L; M. p- R: w - BNE .Write_Data
: B" o) h; c1 U9 V1 U# K! b - .End D2 V, K0 J* e; ?! S# w& Q7 \
- RTS
" ?- x4 {5 l o% r. a - }/ h% F- L$ R3 l" R3 T) X
- ;----------------------------------------
}% @4 H4 P, B" m2 a( H1 C( c - ;调色板数据
# f! u/ J6 J+ ?1 F9 ]+ @' q - Palette_Data; d# S$ u8 O/ V } A. P, Y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
$ f+ Y1 {, _' W" V - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ v) l1 r/ V$ N6 I
-
$ i* j. K/ v& g3 k- j - ;======================================================================2 C5 [7 S+ ^; j, h& {
- ;命名表清空$ c3 H3 i+ @7 V! B* I* d4 T: n8 Z U
- Nametable_Clear
( N- G8 ^8 q9 p C% C2 L - LDA #$20
% ~8 r$ x9 I9 m/ o2 g$ } - STA PPU_ADDRESS6 E6 e8 _& V% t+ `4 o+ u
- LDA #$00. P! ]* a7 y' l* i; o) \3 n
- STA PPU_ADDRESS
' B, T3 K0 t9 l/ e: V' r, n& O# u3 Y, n - LDA #$00" a, y, Y; w1 n
- LDX #$00; c# H6 `+ }% U* `0 F* r, z& X
- LDY #$08
4 P+ h6 s& }; S7 W - .Write_Data
; B* I1 ]% `) m0 i' f - STA PPU_DATA/ l" m, X% B( q( q$ ?: ^3 P2 {
- INX. `- k+ _3 \/ k: E+ _" |3 {" A
- BNE .Write_Data1 V$ h. `0 W: I8 y2 R. A" [
- DEY! H' k/ l1 R8 P1 a/ X: n" K7 B& K
- BNE .Write_Data6 P. e" Q& @' x, X
- .End
6 I* V# P2 ~- u - RTS
; s* _( r! u7 p; U: p3 V/ N
6 g1 S0 H- L+ i" G7 Z- ;======================================================================+ K* r4 [" Z3 G" @* L$ [) m7 ]
- ;音乐曲目切换
9 H0 R# D; b9 U6 c( s, X* ^ - Music_Select_Process; ~5 [' i# O Z; }7 O7 _4 c7 z7 L
c' j$ p1 ]- \- .Pre_Music;上一曲
/ U/ e/ a- d& x, D$ S) o - LDA FC_Gamepad_Once
. S, G1 q% X8 K, r - CMP #JOY_KEY_LEFT# D5 N G1 {7 M9 I5 a( H
- BNE .Next_Music) {8 o( I5 b: e3 G& w
- JSR Music_Play_Pre
% _) O. m+ \9 m4 F9 W. I6 M! k# z - .Next_Music;下一曲: T6 H/ T7 i7 l ^2 L
- LDA FC_Gamepad_Once
8 t1 C% X0 w- l$ C: E6 S) q - CMP #JOY_KEY_RIGHT
9 T6 C) p4 v$ X. o7 J - BNE .Next_10_Music
. n1 J' ~1 s1 b0 \' I( | _: A - JSR Music_Play_Next. R7 ~- T. y: a w3 P) L! x; n
- .Next_10_Music;上10曲
& P% M0 H! n, I- c - LDA FC_Gamepad_Once4 P. P+ W# e% p5 v
- CMP #JOY_KEY_UP2 b3 R1 [! g/ ?
- BNE .Pre_10_Music/ I$ D* ?% X& k
- JSR Music_Play_Next_10
6 r* z. R; Q; U# p - .Pre_10_Music;下10曲
, K/ ^1 [- l8 M- p: y - LDA FC_Gamepad_Once# D2 t, t$ Y2 N) d9 b
- CMP #JOY_KEY_DOWN6 Q0 W B- c7 \$ f* J* K* J
- BNE .Reset
) A5 X1 d3 Y k5 \' X7 X/ D - JSR Music_Play_Pre_106 K4 E$ a7 B3 j P
- .Reset;重播当前曲目
: C3 i# ^* P/ d; C: C' X - LDA FC_Gamepad_Once
* F; Q. t( B+ D0 F1 ?$ Q9 E7 y - CMP #JOY_KEY_START
$ b% T6 ?! Q* _/ W, n: l" M) r x - BNE .End0 }% H. e2 |9 v. j
- LDA FC_Music_Index
# v6 I" Z# T' p5 B* X - JSR Music_Init_Process
: O/ U3 N) _1 k - .End
! s9 f+ m% ~* Q* K/ M4 I! y& G' @ - RTS
( k8 \0 L% x3 }8 H' Y( D8 A
/ U# R: Q# K7 j( L- ;----------------------------------------------------------------------5 R9 F) S) K8 p( m: @; l
- ;播放上一曲
+ O( w% a3 R1 H* I' [# q - Music_Play_Pre
9 U. [- \8 T; L$ u: Q9 N - LDA FC_Music_Index) K" `. J; A0 J9 V0 d
- BEQ .End
- t) I9 _8 I V6 P - DEC FC_Music_Index
$ h, ?! F$ J. ~ - LDA FC_Music_Index
# p; O+ P5 m# T9 ^( \- e2 N2 N - JSR Music_Init_Process
, l8 z2 b7 P& q* W3 X$ E - .End
" `, L% k1 f& _' S7 @" Z - RTS: ]. @. c; B) s I, m L
- ;----------------------------------------------------------------------' P# y3 V% j. c
- ;播放下一曲) }' h7 @- F2 K0 R- }8 c" B7 B8 S, l
- Music_Play_Next
! A- |' `5 j5 S6 Z$ L - LDA FC_Music_Index
l9 w) k3 y7 m+ M - CMP FC_Music_Max_Index
? o: y* g7 \! Y& } J" Y - BCS .End4 O1 M" c* B7 }. `* E. F& F1 P1 ~
- INC FC_Music_Index
& z1 ]/ e/ i4 Q3 i - LDA FC_Music_Index3 F8 O) G. S4 b: k: [# j
- JSR Music_Init_Process/ y2 d% I) A7 k7 n& M7 ]
- .End
' d6 j8 t. h( P% ]) U/ X - RTS
% [, x+ b1 u; Y& N1 u
. F' s# e$ J, |- w* Q7 B8 o- ;----------------------------------------------------------------------
# |. V. f2 o3 W# B, H- _7 H - ;播放上10曲) P, s* n1 V: o \& y) i
- Music_Play_Pre_10# | F, v. ^, w b$ g5 b! D {
- LDA FC_Music_Index. m8 p0 w d" W( Z+ p
- BEQ .End
1 u5 V1 @; O1 @ - SEC' z1 A$ I K$ J1 c
- SBC #100 Q# I9 a$ K+ p+ d
- BCS .Pre_10' H9 m% ~" j3 W6 R7 Q2 h! o
- LDA #$00
7 G( d# }2 n" f; K$ I# n8 ^5 @/ s - .Pre_10
- Z9 A1 \, M- N8 R! u5 Q - STA FC_Music_Index
+ g I% }" G/ E+ ]. @ - JSR Music_Init_Process2 Z( D+ H+ p1 n
- .End
) w+ K9 O" a0 d, h4 B% s& E - RTS# c8 M, D" L0 y4 b
- ;----------------------------------------------------------------------+ D* ]3 @$ e$ k
- ;播放下10曲4 ~$ S# J8 q3 F. r3 h' ~* s
- Music_Play_Next_10
6 M. }/ e3 q) s- X% z - LDA FC_Music_Index ^% |9 [: g4 q8 y' p" ?9 ^
- CMP FC_Music_Max_Index
6 ^7 ?, R9 O7 @. G! S- F8 v - BCS .End
! ]$ g; j3 }+ }: i. @( R$ K - CLC" ^# S5 }; T, J. j+ s& l2 T
- ADC #103 Z8 {2 o8 P a3 Y2 E: b7 x
- CMP FC_Music_Max_Index1 N" c7 P9 m1 n i/ F* Q( W& Y
- BCC .Next_10
2 h4 g6 `+ f6 n9 i - LDA FC_Music_Max_Index
6 l/ l5 d/ N* x% Y) z3 q - .Next_10
5 e! U% G% [1 q* J, [0 Z - STA FC_Music_Index1 Q7 m. \* {6 }
- JSR Music_Init_Process
" Y3 c/ h$ W. G) ~4 V7 s0 ?& r5 U - .End
# P( x6 [5 F/ T$ N9 n! V - RTS* o! B. k& G9 F( h
' ~+ u8 u, j: B2 F2 m# h2 R' r* A" G- ;----------------------------------------------------------------------' J) q) V$ P, r
- ;8位十六进制转3位十进制制% Y" k9 ^% R; i
- Hex8ToDec5 e6 ], \1 G' H) F. N; J- P2 @ Z
- STA FC_Dec_Data_1! ?+ A4 p( w, ]: p0 _3 u
- LDA #$001 p" Y+ K8 H( y
- STA FC_Dec_Data_100
, P9 L/ l0 m+ L+ u' F/ {! V - STA FC_Dec_Data_10: K' C9 @3 E) R! l$ M9 M# D
- LDA FC_Dec_Data_1# H9 }" |4 Y0 H" K3 P: J& A) L0 ^
- .Convert_100
- z8 x! j& }' k* l - CMP #100/ r$ x# ? [! K/ d" V! w
- BCC .Convert_10% F6 R S$ J* A0 d& p
- SEC" j& O$ t. }( @/ c; s
- SBC #100
! q! u; b& f' J2 D7 B- d - INC FC_Dec_Data_100
* d. T) M: X) Q" r O - BNE .Convert_1002 o# b! ~. D5 j- S1 i6 t/ F8 L# O
- .Convert_10
# {' a: e# C' h/ B0 B' f2 l - CMP #10
8 L& O& G! }* ]* d& k" A8 ~ - BCC .End
7 `5 R- A+ X/ U( U( G; \7 k4 H9 B - SEC7 _. H9 l3 d. J2 @9 G. A- `
- SBC #108 l& z0 n! A* g9 k# M$ \
- INC FC_Dec_Data_10
% F8 q3 }& o( y9 B/ y+ i# k5 Q, \ - BNE .Convert_10
+ U- X# i: _/ ~- l# E4 q0 e - .End
! L( z' c, ^/ f: h - STA FC_Dec_Data_1
# l( N e$ |; G+ u' b - RTS
. s7 q5 n, C- i( l) Z - ) W- @4 @2 v9 I( y* j) ^
- ;----------------------------------------------------------------------3 A2 S U% |4 Q r$ j( R
- ;显示曲目信息
4 C6 o" `0 u7 \' C5 n1 ~ - Music_Info_Display
5 l5 t x, |! U& Q( ^5 g1 h - LDX FC_PPU_Buf_Count2 N2 z8 t7 r @. S
- LDA #PPU_WRITE_MODE_CNT_LINE! P4 u0 c0 a# a3 i/ R* E
- STA Use_PPU_Buffer,X
# ^; r# K" @9 B3 L1 Y5 n - INX5 g% |& S" q1 x
- 7 l7 c1 V; c0 V! A, q
- LDA #>MUSIC_INFO_POS3 J0 H# B/ ?8 g% M) }& j6 N
- STA Use_PPU_Buffer,X( E% \% v9 T( g+ P8 G/ {4 G
- INX
1 q, ~: r& ^1 t! S" j -
' g: K- z6 S1 D+ E1 | - ;居中' C8 T7 Y* t7 V. O9 w3 M& p+ @
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; r7 e3 ?% @* W& t3 A - STA Use_PPU_Buffer,X
# O8 T5 s. E w4 ] - INX! A# o% A% A3 Q$ c/ Z
- + a) c( h" t0 w% ? m+ q
- LDA #$05& x; r+ Q* }- w% I% b$ \
- STA Use_PPU_Buffer,X5 K/ K. p7 k8 V, o9 p/ c) P
- INX5 U, o; a' {1 m8 Q* Z+ F
- 5 R8 L M% ~) L. [, `6 V
- LDA FC_Music_Index" |0 M7 u% H! g7 _7 a+ ]
- CLC
+ E: ~" ~6 ~+ [$ A - ADC #$01
! F0 ]/ m& P9 Z - JSR Hex8ToDec3 ]2 `' o# Q' y, k
-
: c* U3 W0 D- @" b4 q - LDA FC_Dec_Data_10
; A/ b6 y/ W6 j! J; y - CLC: y, G4 c; H" b# n6 }+ v! |* ?
- ADC #'0'6 T; a! j$ E) @ @1 h
- STA Use_PPU_Buffer,X* F- K2 }. y' b3 \! X
- INX2 d+ i' ]7 K3 y3 R q( W
-
! x# x( u$ e: D2 ^5 x& N% z) t# u - LDA FC_Dec_Data_1
# Y) r4 A# _# q& x6 y - CLC5 A# _& s4 i# T0 Q+ b' \3 S+ v, K8 s
- ADC #'0'
3 ]5 l# Q( |& P( ]* @- f' j( d( v - STA Use_PPU_Buffer,X
, _4 ~' q- X# }/ n& C - INX
U; {( l, E6 \ {! _; Y - 2 G3 J3 w0 }2 `2 _" x8 S) f0 p
- LDA #'/'. {% g& ]! R! v, Z2 c# ^9 D
- STA Use_PPU_Buffer,X
U& R0 p) ?8 j' `) e - INX
1 S2 c3 B: h' e7 G3 m - / {4 p+ C! x k- s& @
- LDA FC_Music_Max_Index* `8 d; |' h" e4 i
- CLC
+ K1 h7 H6 q$ J; g% _+ U/ u# [- b - ADC #$01 h6 K, B H; ~% C" e' D
- JSR Hex8ToDec
9 l: \" G8 Q# f2 w - 2 o# I/ C. `" e- E: a
- LDA FC_Dec_Data_105 e1 Q+ {% R7 I) I/ l( O& o
- CLC
, q$ t% _- j' C A2 F H - ADC #'0'/ n) y4 i7 _/ ~" [
- STA Use_PPU_Buffer,X
6 ]/ V& A! i& S/ D" p; Z - INX
' E# ^' i# H: K1 N -
( I5 A+ K. g+ m/ X) u) |2 N - LDA FC_Dec_Data_1
3 s; s }9 A- Q - CLC
( Z A/ P! X5 q. v3 h9 N" f; G - ADC #'0'
{& S5 y# c; F4 E9 E - STA Use_PPU_Buffer,X
2 a, C |% L( f8 f - INX0 q' v) Y) W, E( ~
- % D- f) S/ _& ?2 Y7 y
- .End
: u0 B" T! w# U+ p# E$ p/ @# a - STX FC_PPU_Buf_Count# H; i8 L2 o2 z) k5 x9 [. g# \; G
- RTS, _1 ?9 Y; [: U$ W& q0 S5 E8 g x
& c- f+ u2 L( o- ;----------------------------------------------------------------------
. |7 n# s! W/ h2 V$ m5 l - ;音乐曲目初始化处理0 B3 g) o. s) W$ A
- Music_Init_Process
: }5 t3 f: U8 {$ Y8 U$ \ - PHA
+ B {* W% s' o) H - JSR Music_Clear_Process
$ F. ]/ B( |' m U - LDA #$1F2 L! P* U* w, k$ J7 A
- STA $40151 t2 V7 o1 `4 D7 k" |6 E7 H/ O
- PLA2 r" \: z' w0 x; o0 o
- JSR Music_Init_Addr* c9 ~2 u1 g8 m6 b
- JSR Music_Info_Display
m* v0 S' A# S- P1 h - RTS9 }9 f8 ]/ V7 ?4 z/ o% P( c
* \% r, E6 W- S2 i2 b+ N2 q" e' j- ;----------------------------------------------------------------------
0 {( |. Y9 m) s. m; {$ T - ;音乐播放处理/ L9 u6 N6 k- _2 _/ o
- Music_Play_Process
$ |8 ~! |3 ^+ O0 \" l7 H - JSR Music_Play_Addr
( I# T Y1 l" y6 V& [. m7 w - RTS
! f0 Y% I1 S/ I8 a" h
, o+ E% a# @5 s* {$ i' E- d- ;----------------------------------------------------------------------) C2 \* v0 }# o) j. y
- ;音乐播放处理7 O+ x; N" T' l& T" D- Y5 V7 j* H9 _7 Z
- Music_Clear_Process
7 s9 W; A- \: m6 p- j - .IF Music_Clear_Addr
- h8 m& e" d+ K, H8 A, P' d" _0 c( a$ O1 l - JSR Music_Clear_Addr
3 p9 d( X# `) F8 p, w1 Z8 K0 Y0 E; c0 v - RTS
( V% X0 u# ?! {: Z, n2 ]5 V - .ELSE
B" r* Z* \& K0 w7 I# X - LDA #$1F& [7 B' ?/ M6 x$ U! `3 J
- STA $40154 T% l2 [: `$ ?$ @
- LDA #$006 l; n) i, r% }0 t0 E
- STA $4010
! `% ?/ P; m+ e. i7 F - LDX #$00
! ]4 H& z7 D' R* a$ @, x - LDA #$00: l8 m3 N( `7 u, V) y$ Q
-
0 D5 F0 S- ]" G2 Y) ?) Z8 s - .Music_Clear_Zreo_Page_09 t/ X" I- U1 v% R5 m! \
- STA $00,X
( I( |) A) @6 @- a - INX
! R: k9 j# u2 o" ?8 w3 f - CPX #Use_Zero_Page_Begin. d! k6 \. c5 P2 `! W% _
- BCC .Music_Clear_Zreo_Page_04 J y1 _9 O, `/ b
- 1 s' T% [. w5 p3 J% O. o
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
3 c* G1 v, n! R" N; A; m - .Music_Clear_Zreo_Page_1
; m; h) h& H( `2 \" ] a - STA $00,X T5 \+ ]" Q5 d8 p& L& H& X; c k
- INX9 U1 o) m4 P2 }1 l5 u$ l6 a
- BNE .Music_Clear_Zreo_Page_1; ?- ?: _ B& D& x
- $ e& h5 o/ b5 Z2 f& j+ |9 l) X
- Music_Clear_Process_1
8 V$ |) B/ e" K3 P) M" M - STA $0600,X; S j' D( E5 N! i6 p. L( R: O' D
- STA $0700,X. V/ f# B0 L* v9 U* g# [
- INX
' \$ M8 m; [9 U) z6 h4 c - BNE Music_Clear_Process_1$ S$ D! d9 s4 T) j5 D
- LDA #$10+ K& Z1 l0 H0 n& k1 K& E6 u, b9 o) ~
- STA $4000, F/ e1 f8 F6 [9 V: r& a
- STA $4004+ o. {; w2 L4 M1 Y( W' v, Z J( @
- STA $400C
: K# Y3 k7 d R - LDA #$00: O$ b- L! Y0 w" L! ]7 J ~
- STA $4008# h8 u& L5 V8 f$ ]+ {
- LDA #$0F
r6 l+ A/ m$ s" }0 | - STA $4015
_5 g) D( x. }$ ~# w - .ENDIF
A5 E& J' M2 y$ `) D1 r- a$ w# e - ! X/ w9 J8 k ^# @
- RTS- {3 F. T n ` D
- 0 }2 R# C2 }# A* m! O: N
- ;======================================================================3 U8 U& k% D7 p6 q
- ;重启处理
. s @1 {- X, s# \3 e7 J% S - Reset_Program g( E/ V, g, f+ |( ^" H
- SEI+ i( } w3 g2 l
- CLD: Z5 N! A3 `+ j% y5 G" v
- LDA #$00
4 \$ x) a( |. K - STA PPU_CTRL6 U# W1 e: H: ^$ n6 v8 r
- STA PPU_MASK- F7 K& ~, O- D! ^9 T0 \7 v
- STA JOY2_FRAME4 |+ P9 ]6 B6 A2 M& M, ^
- STA APU_STATUS' [+ H: K7 H5 Q
- - \: f: q/ V ?6 `4 J0 @& U
- ;等待屏幕准备完毕! J& z: w* W* X$ E
- LDX #$02# j( i4 Y) V* m/ ~0 `
- .Wait_For_Screen_Ready
8 f. d2 o1 e6 t$ w! x$ I) e( w - LDA PPU_STATUS
; @ P) v# f4 J' d. Y' K3 M- K - BPL .Wait_For_Screen_Ready) a3 k- s8 U: ~7 A5 x# \/ Q
- DEX
4 t$ W5 h' H4 ?5 F2 `* L - BNE .Wait_For_Screen_Ready8 \. W3 n3 b/ m
-
* l$ u0 q1 w7 g5 Q- c0 X3 o M - ;清空调色板
* V7 O' L4 }) D3 `1 q1 m8 n - Palette_Clear
: S8 \7 x6 L8 M. ~; k/ X - LDA #$3F" V" U" \% ]$ T# g: X
- STA PPU_ADDRESS
. g, w8 L1 p2 T: G# Z6 I2 r/ g - LDA #$00# H7 {/ h1 U2 }: q
- STA PPU_ADDRESS% J$ N- h! z/ N
- LDX #$20' Z& U0 @# I) z5 o- E( c1 W( o
- LDA #$0F( i& S. c4 g- R0 L" V8 e! c
- .Write_Data% _: t$ _6 s. q, O" i% B D
- STA PPU_DATA
u* }. o6 k; d! H( U$ E2 j - DEX6 M! O6 S: d3 k0 A* w
- BNE .Write_Data
" y: y& k4 o0 z8 B; i: U: x$ Y
+ O3 L) n; Y3 r( m- ;清除声音 $4000-4013
% _3 d. I0 V4 ^+ Y9 Y - LDY #$14) I+ e+ f( G" r- Z
- LDX #$008 L% O5 i1 ^5 G' J
- .Sound_Clear, W0 e" v6 y% s' q# U* h. ]3 c
- STA $4000,X
7 S) Y' B# P/ D: Y' R - INX5 O/ A" q5 u8 N; _( {
- DEY
+ x+ A) p6 t; M; f( _3 W! i+ S# Z - BNE .Sound_Clear- x* F. r' X9 q4 R* b
- n9 W N! K6 h3 V* a
- ;清除 RAM $0000-07FF
l! p" ]) F% @ - LDA #$00
3 ^* @3 o; \, v( H - STA $00
( h, m) ~- _% e; s! I - STA $011 e+ f% A3 l; U$ o
- TAY7 n2 n8 q( J4 R- k6 y
- LDX #$081 t* O7 N, u: J* D' d/ Y5 k6 S5 f
- .Memory_Clear
8 L1 Z. w" j7 t$ b: j- B/ C' \ - STA [$00],Y
( A& u, ^: d, \2 h* H - INY: T, E; g M4 J1 i$ w
- BNE .Memory_Clear
" U* J1 V0 P2 O6 z5 ?# ?+ ? - INC $01; l+ a2 l% h6 B. S" j
- DEX& A0 y, ?7 b8 B* V) M- s) A$ Y
- BNE .Memory_Clear
8 n, `& G/ k9 m# e2 z6 n# Z7 R* | - - J$ {" j8 P+ e
- ;精灵缓冲初始化1 r8 Z4 v* x6 x6 R
- LDX #$00. Y2 K2 P! i8 K" k
- LDA #$F8
$ t/ s: E; s8 ?" p+ A - .OAM_Clear7 o! z6 g* g. Y* \3 d! W" o) Q
- STA OAM_DMA_Buffer,X4 |$ @$ U) c# ^# D. `! ?- @+ \/ ~
- INX
% ^' C& G& i5 I7 J- o! M - BNE .OAM_Clear
7 X: {- ~8 m4 \( ?. n; I2 z -
1 e1 L4 h3 n. W+ Y/ r" f/ v - ;栈指针初始化# P: S6 Z; E2 D6 m
- LDX #$FF
( H# y6 @* a6 Z( w7 x* G - TXS
) [9 \5 b+ s3 p1 U8 m* I - ) a0 Q; B5 F8 Y% y1 G8 |
- JSR Nametable_Clear;命名表清空
3 I( T0 v( W2 K! } @ - JSR Palette_Init;初始化调色板缓冲
9 @- F/ s1 L7 v2 H+ w - JSR Static_Text_Init;初始化静态文本
4 c( @% p7 }( {8 i1 g - ' ^: k$ k/ x+ e0 s+ r
- LDA #MUSIC_ITEM_TOTAL - 15 W- z o5 x; i5 F, l" Z% E
- STA FC_Music_Max_Index
! L! M- \' O+ V- g7 k - " j6 p6 m; G. s
- LDA #$1F. {; c) l" [5 x! n) Z' |, b, N
- STA APU_STATUS
8 C8 Y$ Y8 M* x, \& @2 C$ F8 L6 ? - LDA #MUSIC_BGM - 1( K; c" s8 y5 N6 D, H3 c9 ]+ Q
- STA FC_Music_Index
' k6 X- J/ Y; n. }$ @+ D - JSR Music_Init_Process;音乐播放) R% ?2 c2 g/ J
- : A' e+ z6 i7 E4 u5 G$ v( ?/ a
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)! h9 Z; f0 L" X& Z
- LDA #$1E
' o3 a( C1 ~- ?/ v5 f - STA FC_PPU_Mask_Buf
( X8 g$ I1 [/ D! [9 e+ E V* M -
2 l; f' s* @) n4 |* |- A' t - ;启用NMI处理
$ h7 a L! x& |: v2 M! d - LDA #$80
O- r* r$ ?& y7 j/ I1 R" s - STA PPU_CTRL
. H0 I% ]+ c# m% l2 w0 u -
x& Z' ?- s/ r$ }, F+ w - ;程序循环, 剩余工作交给 NMI 中断处理7 l' b8 W# [$ N1 W9 y2 Y" W# q% ~
- .Loop K' y6 d7 m( h( B
- JMP .Loop' o% e! R. c! F, |0 s9 }) L8 P
- + k2 l& h: y* [$ `# P
- ;======================================================================: `+ K8 }: Q" s
- ;不可屏蔽中断处理9 f6 y+ ?" ]1 W8 ]- o/ W
- Nmi_Program
3 C! l8 R1 p/ U7 j - PHA
7 j8 p" l' R% h4 ~, d9 `& K" W0 O$ D - TXA
I5 Z) o* T* l( { - PHA# }2 W; s. ?0 _% l1 e
- TYA
" p. `9 P$ \2 E1 X: }* z% q - PHA
& P- R2 N' v" Y {( k* f - 8 U3 ]) P8 ~ W& Y& n4 A
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位' f: ^& N$ ^% Z: M6 ]
-
6 w' R2 M; f. ?# ?9 K - JSR FC_PPU_Procrss;PPU处理: w: `" S% V" A
- + y5 h: Z- r- f' R% H+ F
- ;精灵内存更新
' {) E* m q0 g# c8 t) ^$ O" ] - LDA #$00$ j$ I. I W, J
- STA PPU_OAM_ADDR. f2 v6 D" H( m3 U4 ^
- LDA #OAM_DMA_Buffer / $0100) t0 Q# y/ O6 ~! l) r
- STA OAM_DMA# D. ]" s b8 J, H) x
- : ?' J8 Y& S h0 q/ X
- JSR FC_Gamepad_Process;手柄输入处理
. N7 E5 y Z: L) }; o8 V& c - JSR Music_Select_Process;音乐选曲处理) M2 ^$ c2 T& [6 X
- JSR Music_Play_Process;音乐播放处理' ^# @6 s7 i+ ^1 A$ q& N
- 5 G$ @' c2 R0 t7 B1 d
- PLA! }( d5 q0 W( M; C3 E( I
- TAY( Z: U! v9 h8 s- h$ g4 F
- PLA
, N3 C: U& v5 R. y f5 _' v0 [7 \ - TAX# m! C3 v2 P s
- PLA
5 P' j+ g$ v" L* \! I& b, F, X, S V - 9 Q' ?* `) x9 }! j8 N6 h' o
- RTI
* e9 n: S. d2 {, n - % `3 B8 ?3 h6 O7 o! o0 o
- ;======================================================================
& c, ^: r4 \0 M8 }: o J - ;请求中断处理
: r" S' n' e }& B8 l - Irq_Program
0 C( l7 _' b# a6 e - RTI
3 Y: l% p9 p1 a; w
: z, T! I& r# `$ `7 ]/ w0 ~2 X- ;======================================================================) g A9 r9 V: {6 u1 t: l, J1 a7 o0 I
- ;中断向量表1 V1 z/ Z3 }( B2 ^9 j
- .ORG $FFFA
+ ^( l3 P/ i0 r& R1 B$ n - .DW Nmi_Program ;NMI触发时执行
* D3 o8 Y/ z* K( J1 B. W - .DW Reset_Program ;载入ROM时最先执行
1 ^( n7 R& C" [! b0 H4 Z - .DW Irq_Program ;IRQ触发时执行8 u+ z: A' ~" r' y* b$ A1 e8 |" L
复制代码
3 U" h- R: c* q0 ?/ N8 P
+ E& X7 p. |) h. X+ Q K" x! a) c. B7 w: `. Q
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|