|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
+ s. I! ~: v8 W) h; d' W! E
+ V* p1 e5 z: k; S; [0 I以下是主框架代码:+ c/ @( }5 e! F* z2 F1 a
- ;======================================================================& I7 B8 \% K7 k+ F) U- O
- ;文件头( J2 l' ^5 X5 i$ x; @' n, J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量0 K1 M, c8 l# Y+ K) p
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
7 o2 _! W; U! k7 f$ M - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码- m* x1 ?: x2 m5 L
- ;======================================================================. w# g7 ^6 F# C* {# D5 Q% R% h% Y
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
! R- q+ w. J8 q5 v - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
! w1 I6 x) G2 x4 w6 k% S - ;======================================================================* s1 w) K* D- z. A' L# G- a
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1( H- z2 g) Y" C& n
- RESET_ADDR = $E000 ;主程序起始地址7 y/ t4 O8 U; v' r- ^+ k0 T) N; {
- ;======================================================================$ K1 i: T, u S: {0 d' t7 B
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 n' M0 ] A( _" ^0 Q7 s3 D% q( ^
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB2 |3 n# S+ M( m& y
- .INESMAP 4 ;Mapper号 (0-4095)/ j: y2 @8 s3 J1 \/ d: u! I
- .INESSUBMAP 0 ;子Mapper号 (0-15)% d% K* _0 P8 O) w9 x7 i
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
( H* z$ A9 X. ^ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# x9 m T* L) |
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. S4 E1 t) \& |0 I, y$ k7 ~ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
' Z6 ]) a3 G( U0 h! L7 m - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ L; ]: \/ b/ @" Y) e2 o - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
( O6 A9 s" \! f8 {; Z/ s+ [5 o - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ ~3 b. D2 F z% M - ;======================================================================
$ R' Z; I* ^. K. H8 _* S - .INCLUDE "fc_demo_config.asm" ;全局配置
' y+ ]- H) c" o5 s) l. D6 W) k5 _- S - .INCLUDE "fc_demo_constant.asm" ;NES常量2 ` t5 ~0 c3 U# I
- ;======================================================================
! }# J( O- ~8 g9 W$ |- X$ g8 k - ;音乐配置
7 x- L& k, B& O- u - .IF 0 = MUSIC_THEME / M3 n! x2 z1 u; k' s* i
- .INCLUDE "data/music/Gremlin 2/config.asm"' q8 _9 Z$ l8 O
- .ENDIF- X" O) \" [3 {5 b% ?
- 4 ~3 Y. W3 B6 T0 X* J( n
- .IF 1 = MUSIC_THEME; F8 Y' g9 @' R( J' r$ q! Q" j Y5 U% B
- .INCLUDE "data/music/Raf World/config.asm"$ e/ M* I- @* M7 \6 j/ W
- .ENDIF, D. Z" d' b6 G& @/ r! |
-
+ _4 h6 V: v! C+ J, U+ k6 A - .IF 2 = MUSIC_THEME
8 k! B- w% F( @9 X& x& c - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( p6 \" m. U* H+ r& ^8 u - .ENDIF4 n4 T( x8 m0 f+ G
0 V1 J' B- c# ?- ;======================================================================' u4 r: a E4 i& ~+ H o
- ;引用CHR图像数据) h; U/ X/ ]7 f. p; b
- .BANK NES_16KB_PRG_SIZE * 2
" I4 W/ N, M% C' V5 f - .ORG $0000; D5 m$ ~' V. b- e7 [& \/ \; |0 u
- .INCBIN "data/bkg.chr"
* q+ t0 G' C: N. _( _$ h0 h - .INCBIN "data/sp.chr"3 ?0 e1 x9 g `
- ) X$ n+ e3 q/ j
- ;======================================================================
( s4 p. v9 k+ T' R5 g# I - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank/ D# C% b5 B1 C
- .ORG RESET_ADDR
% e4 S* L* W9 y' V& l: P - ;======================================================================, J U: m9 ?0 }# i+ x
- ;引用其他源文件( A* u' P' z( Z, [6 |* {2 N: c
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理- k+ n7 P, F m, \& X; e
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理2 f0 ~5 x0 k; s" w
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
6 ~% D9 E6 c7 e, q; J; r2 S - ;======================================================================
, W& s! I W& d7 \8 u - ( V/ c' \, _7 k0 f* F! j, l
- ;======================================================================3 s: z4 _" ~2 m& q! w
- ;等待VBlank到来
! Z& K: ]' u& R4 C - Wait_For_VBlank
- S0 l2 A: @' H8 C* I: o6 v, r - LDA PPU_STATUS! G( z" ?7 Q) M3 u) U
- BPL Wait_For_VBlank
7 K( u5 i0 J/ A# N( F - RTS
8 B- `8 M/ B+ g - 9 z% t$ u7 O4 h* _
- ;======================================================================/ D6 u# x* Q' U8 p2 U% g; c
- ;调色板初始化; r6 v: [% P$ ^2 q
- Palette_Init$ s. D, v6 c: S- H" Y/ k
- LDA #$3F' V4 G8 c' ~" A9 v- N0 q
- STA PPU_ADDRESS. O: b0 s' h; c( V8 f' n
- LDA #$000 l2 x; h2 S! h) }2 r: V
- STA PPU_ADDRESS
0 g1 s. ~/ N6 m9 `) E u - LDX #$004 A! _2 M, I+ }7 l$ j: z5 U/ D+ `
- LDY #$20! [0 h3 Y0 q: ~& j* x
- .Write_Data
( n; Z6 U- A1 l+ x7 V: P; f - LDA Palette_Data,X- |7 \# o; h8 y- h+ b1 K6 I/ Z; D
- STA FC_PPU_Pal_Addr,X+ v( e3 ?: ~6 |& N X2 n) y
- INX
; ]# ^* }% O m$ r - DEY
$ a7 e& r6 k" l, [ - BNE .Write_Data
3 B/ m, {$ |& a b+ j' j9 { - .End
: X3 v) e& t- h. h7 U$ z - RTS: ]$ F; o# H7 V M1 ^9 m+ t
5 A) q% ]' J* ~! U! O! l- ;----------------------------------------
1 x. R2 z, f. S& C8 w, P - ;调色板数据
; a2 _& y3 k& A2 g6 n+ N% a - Palette_Data- I( E5 c h2 W2 ]8 R- x
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B) @4 e: ~, ^ C( a- ]6 y
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 {6 ^3 H5 o# Q) h1 J9 O - 2 h. y" z7 s" {2 i$ c& @! |& I
- ;======================================================================
& r8 `9 ]7 G( o6 e. |1 [7 e - ;命名表清空
' ^5 ~2 t' y! y - Nametable_Clear7 c. z; C7 Z1 T
- LDA #$20/ A& S5 ^$ v) n' ^: I# b# t }9 t
- STA PPU_ADDRESS
" ]( @" Q% x: x) _ - LDA #$00. G0 y5 Q. K0 [. F( b) P" |3 L
- STA PPU_ADDRESS
% p( K; ^' l3 S9 a2 { - LDA #$00
; p# ?! _/ i, o! c1 ` - LDX #$00: s2 C6 h( v6 `( x2 b
- LDY #$080 {* E m& N+ m( p3 z0 [1 r. K
- .Write_Data
/ A f ^( t- c( D/ L ]5 ~% V - STA PPU_DATA2 ]2 M- f& A7 J
- INX0 A5 I! K3 _9 H& f: l
- BNE .Write_Data
1 ~' H6 I0 Y1 H0 j# a' R' k - DEY
* m# J# _- C4 ^9 F" d - BNE .Write_Data. ]6 p; ]0 u$ V) ]
- .End t# S6 ]% [ j/ B4 K: e1 u
- RTS. f4 s5 [" N( Q7 S8 y& P
$ A8 J8 O# S% z/ ~( z* ~- ;======================================================================
Z( t( l) _1 L# I* a - ;音乐曲目切换
$ G/ H; u9 G2 @ - Music_Select_Process
# \0 V3 J. p7 f9 j5 t8 L - % f; S2 G* G( i, U
- .Pre_Music;上一曲
5 b7 G3 A5 }, k3 [ - LDA FC_Gamepad_Once
( m: u" R; k% [( H - CMP #JOY_KEY_LEFT
' t4 _+ I# [8 M# ` - BNE .Next_Music
5 P# ~( P q/ g8 _/ Q$ B, h - JSR Music_Play_Pre
; |9 B4 J- ~* U1 a( t" g - .Next_Music;下一曲8 R( y e3 n; P3 L, b
- LDA FC_Gamepad_Once3 h" O# S1 `1 o) v& t. H6 u# F5 v$ L
- CMP #JOY_KEY_RIGHT
3 ?% W5 ^2 G" j+ u# M( R - BNE .Next_10_Music9 r# w7 h& ^8 s& z- _
- JSR Music_Play_Next
Y4 Z3 D0 v+ M4 B& w - .Next_10_Music;上10曲
# q2 b# d% P6 D - LDA FC_Gamepad_Once
0 v% G: P' A( Z) ]! Q - CMP #JOY_KEY_UP
4 E% M) K" D9 e; w5 T8 q. E) r' m - BNE .Pre_10_Music5 p Y. N( [% I# z1 ]
- JSR Music_Play_Next_103 |9 u; ]9 {" q* c6 c; l& T
- .Pre_10_Music;下10曲
P N, i9 S5 D - LDA FC_Gamepad_Once) n! N4 k: f Y2 \; i. j# R9 @
- CMP #JOY_KEY_DOWN+ F) ]9 r% p/ l8 x! ]" `$ j6 b
- BNE .Reset
7 d4 S3 K/ X; R: ^& Q$ i - JSR Music_Play_Pre_10* q# q; H4 e/ z, b: s$ V9 ?5 b
- .Reset;重播当前曲目
) v; i1 T0 F0 d - LDA FC_Gamepad_Once) h0 h3 Y- n( P3 L7 _$ R& ^
- CMP #JOY_KEY_START
; ~+ S" {. p) K' B3 l - BNE .End L2 Q6 w5 y: B* u1 Z
- LDA FC_Music_Index
% P& e7 [, d& E, J - JSR Music_Init_Process
) }( g+ ^# S! E! R - .End5 g1 x3 |' I1 t6 O
- RTS7 `7 I: M: A) m0 H
6 G& B# u: X+ a, z8 S6 |# h- ;----------------------------------------------------------------------
# v# A" {9 {) e8 _ - ;播放上一曲' v. ^2 _ K* @7 L
- Music_Play_Pre
' g/ \4 w. c, |9 J+ v - LDA FC_Music_Index
7 v! s7 Z1 @, H5 U7 U# E - BEQ .End
8 z) }* e6 B K# N5 O8 H/ c - DEC FC_Music_Index
* R9 P7 Q) L/ B - LDA FC_Music_Index
8 c2 Z) [; y8 n - JSR Music_Init_Process+ [( y. G% S2 ?( X9 b
- .End
- \6 K* u/ \1 b' g) \ - RTS
. P( p1 f2 l2 d3 i' t - ;----------------------------------------------------------------------
: E% i. B$ ^+ Q9 |, G - ;播放下一曲
- M3 c! Y3 E+ x' x - Music_Play_Next, `! }1 F$ K2 `! z
- LDA FC_Music_Index
# H/ T! ?+ t M: S5 O - CMP FC_Music_Max_Index2 z; r- z: A; B; {$ l# i; K! [0 T
- BCS .End
- K# L% Y' `2 V" }# z - INC FC_Music_Index
$ b( @5 I1 b5 c5 {8 m' x' ?* g8 y3 G - LDA FC_Music_Index
# k* y0 @# z+ m- \( k& B. L - JSR Music_Init_Process
8 @2 @, O; h$ y8 p m& J - .End
% j5 Y- N& c% L- i# b# P! L - RTS+ Y0 N# {2 n: P5 s2 x5 a
3 a) k; o5 m/ q& u- ;----------------------------------------------------------------------
9 l, N, F5 V) E$ \# D - ;播放上10曲7 Q7 v4 n+ }3 P% V& }4 j; L6 s6 v
- Music_Play_Pre_102 e1 b7 e6 _, c& a* q
- LDA FC_Music_Index
' B# i) A4 J' g# {9 { - BEQ .End
2 q. g' P8 N/ k - SEC
k3 U3 ?, j/ t7 f+ f - SBC #10& A; P' c3 I# Q7 a3 A# g. s; Y1 j
- BCS .Pre_10. L6 h# f) T$ d$ {. x
- LDA #$00- k8 G' l) C+ C3 t9 Z9 A
- .Pre_10. j8 f+ u1 Z, F4 M: v
- STA FC_Music_Index6 l7 W/ p& x1 D8 l7 Y6 Z4 T c
- JSR Music_Init_Process9 V: ?9 Y; M1 ^& d- S
- .End8 @2 X$ g8 j# y; O1 r/ z) y
- RTS% z$ ~- W6 c9 g6 ~/ s: p8 k4 o8 h" x
- ;----------------------------------------------------------------------8 \& f' ?1 c( n- D* U3 N
- ;播放下10曲
6 b" c T* o5 G8 F, o) n - Music_Play_Next_10
% ~ i1 ]8 m3 q/ I P! ~ k - LDA FC_Music_Index
1 V2 \# J i7 X& U - CMP FC_Music_Max_Index8 G" }3 l6 Y0 V; S }8 p. x
- BCS .End b3 g9 ?) k& S, `* E& y
- CLC. @. Q% o+ b' c: M1 ?) ?; F& L
- ADC #10$ Q; b, q: s9 c. |
- CMP FC_Music_Max_Index, F, |- L4 ~& h6 x* F
- BCC .Next_10
3 [5 E$ [8 K1 J3 K! O+ p - LDA FC_Music_Max_Index0 ]+ o* z9 N) {. s7 c
- .Next_10
( ?4 Z2 m$ b- e& w U( ? - STA FC_Music_Index6 K0 l+ o7 u# w
- JSR Music_Init_Process
! [/ c( e. x; o - .End
& K6 |7 X( L# T' p( r - RTS8 D+ m2 ?& U' g" a& a1 z) F
$ t2 _* b, |. H+ I1 Q- ;----------------------------------------------------------------------. f6 e) g3 M2 l3 Q+ z8 ~' m9 k
- ;8位十六进制转3位十进制制
) ?0 I3 c7 {" s2 B7 z) k - Hex8ToDec
1 o6 {/ h4 G- `8 |& e - STA FC_Dec_Data_1
( ~; P0 `( N- {- u7 p6 y% r - LDA #$00, P3 d5 n# T4 G/ _: M* U; M
- STA FC_Dec_Data_100
9 @. A4 Q) k( Q+ U - STA FC_Dec_Data_10
9 f7 J2 B/ H1 l# G8 z) f - LDA FC_Dec_Data_1% M$ C# b6 H2 a# q. d5 ?* z- d: D
- .Convert_100/ D& Y/ w7 b4 I3 M0 E$ T1 `: O
- CMP #100. W l/ D( `* C
- BCC .Convert_10
* D$ A4 H( M' p$ ?0 H. X% \ - SEC
, `8 o A; O6 w0 M7 ~ - SBC #100$ O9 V. l8 e# h
- INC FC_Dec_Data_1000 A) @( R6 Z$ u K/ _2 o0 i
- BNE .Convert_100
: P$ e% x. s0 z" f- j" ?5 o - .Convert_10* m& F* f7 v+ u% z( y9 M8 Z. M
- CMP #10
* C, x: ]' Y% L2 v - BCC .End7 u, o2 g( o1 x' r/ b+ v
- SEC4 j' [6 [2 m5 s v; t- k0 |
- SBC #10
1 m' z! x Y4 v/ n& h - INC FC_Dec_Data_10 O! J Q, m' V& w- T
- BNE .Convert_10
8 J5 [9 m. P5 f; |* E - .End
7 G' `) r' L- w$ i1 p - STA FC_Dec_Data_1# z" U4 i- O: W t. L
- RTS- E6 c+ f/ z( I9 l/ ]
- 6 `5 Z' y& i6 o) Q
- ;----------------------------------------------------------------------1 @- `3 i8 q# M, M4 ~
- ;显示曲目信息2 ^9 \; N1 k, ]: s
- Music_Info_Display2 c2 y4 L4 I; g4 k# b& F. H$ l
- LDX FC_PPU_Buf_Count3 a! Y5 r/ q1 P3 r- ~9 C
- LDA #PPU_WRITE_MODE_CNT_LINE
$ ]" T1 Y0 q7 j7 l6 \ - STA Use_PPU_Buffer,X
( V' v3 x: L+ D" C* A& L( V. ?0 u - INX. K( ~/ O3 {7 H2 h; b) t# q
- - t! H# B+ O- {7 Z
- LDA #>MUSIC_INFO_POS2 D1 ~3 N/ S- s5 [5 F, Q: i
- STA Use_PPU_Buffer,X
, Z5 r) P2 Q/ w& b3 Q% ^: A8 Z - INX+ J$ G. H& \5 Z1 ~3 V5 i- _
- # g0 x. j# K( \- M8 w: b
- ;居中
/ v) I, l# J* Q( y6 \0 S) z - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
( r, p0 v# D. \ A9 J2 J - STA Use_PPU_Buffer,X' b3 ]& y9 a5 v6 F' T" {3 h
- INX
& W5 `+ n' ~1 d C9 Q G$ C -
9 w7 t2 y5 f% G+ S - LDA #$05
; G" M: `1 G8 h* p' w* Z. ] - STA Use_PPU_Buffer,X1 w" M; R) E- @8 A: G3 N4 L4 M
- INX
: `0 @. x4 i: u/ h6 f: J" e& \ -
0 m8 \/ I2 D* ?& B - LDA FC_Music_Index
5 k2 Q i/ O5 q4 f) }& H8 s* s; r - CLC/ _9 X( {! |0 @8 K. X7 D
- ADC #$01/ J% _; p W E
- JSR Hex8ToDec4 Y% u- K3 |5 k `
- ; A- I+ r& L: V" t. c6 d
- LDA FC_Dec_Data_10. q$ Y3 V" t8 o" Q+ E# Y* q% [
- CLC. _0 h- `2 h' V- J+ _
- ADC #'0'0 n' `$ F& K0 y) P
- STA Use_PPU_Buffer,X/ q0 \/ d* c& N: b1 f
- INX
7 [3 A& V% p& _2 H( g1 N - ( y7 A9 ^1 i( e
- LDA FC_Dec_Data_1
' k+ K4 P3 y' R( | - CLC, O6 B4 [3 v, A, X8 V; I8 E
- ADC #'0'
6 F* {* q/ F1 B, o8 c! W - STA Use_PPU_Buffer,X$ t2 W: d8 { Q' K
- INX
9 v: P1 n! j3 I5 r) b -
# R3 u& J& N! y; ^" `7 j$ T - LDA #'/'
9 J: P% X6 i. k: [8 n) L& U - STA Use_PPU_Buffer,X; G% Q6 o( s" l# r/ I- u
- INX
- X3 C8 g( T5 [ u! M# ?9 v -
. ~, z$ H2 S' }+ r: A - LDA FC_Music_Max_Index1 `7 V3 P2 @" ^0 I _
- CLC" ?# w+ r2 ?. r& W( o/ | r) T
- ADC #$015 B; Z0 L6 R) Q" _9 a9 Z! r
- JSR Hex8ToDec
* m; q4 \" ^$ g% A& a2 g -
9 V1 h! @5 w. Y - LDA FC_Dec_Data_10
8 u# M* X. z6 D; K1 l$ s - CLC" N+ J4 L0 [: L; R: t
- ADC #'0'% J; W2 k3 R8 D" z, J. B% z
- STA Use_PPU_Buffer,X7 D, v, T! P3 H$ p) @( p
- INX
+ y* q3 d( K& V+ T$ i9 d; l - $ {$ C+ [) c' Z, I/ X+ V8 t& b
- LDA FC_Dec_Data_1. E2 P; H: q# W; F
- CLC
# z# q6 ?. g. a+ D. s! G - ADC #'0'5 S, K7 \0 e6 H! n
- STA Use_PPU_Buffer,X
* H: Y6 c: v9 _1 E0 | _3 D - INX
' s ~4 W8 U$ S# s -
+ T# U$ D# O0 F& s - .End8 n0 u% S0 [! z
- STX FC_PPU_Buf_Count3 O) i1 R9 t, F4 W* ?& N
- RTS. V1 B0 U; M* ]
0 ^+ w: o1 ~8 P- ;----------------------------------------------------------------------! `3 ]5 M S$ p9 d4 K' u
- ;音乐曲目初始化处理
- P- A' {1 i7 Y$ r - Music_Init_Process
5 p+ n% b3 @3 m% P. e - PHA' [! G7 Q6 p8 p0 Z$ f
- JSR Music_Clear_Process( S6 k) R+ N9 F4 d8 _/ h
- LDA #$1F) Y8 q4 T p7 v( r3 [1 p
- STA $40156 w3 W7 i$ X/ ] O! e- Y
- PLA8 B2 Y, u4 \" I1 F4 @
- JSR Music_Init_Addr
! f: A2 x: A+ [, [2 G# v* ^* j- Z - JSR Music_Info_Display
( Z- K' g ]7 w3 M8 _7 n7 ?% X' [ - RTS
3 _* `# S; L) c0 f& W, \3 `' C
* v: t2 t0 W N' m* G2 _) V- ;----------------------------------------------------------------------
0 s; C5 w2 P* Z! R - ;音乐播放处理. u6 [" Q8 P6 I- d9 b
- Music_Play_Process
% l- X2 k' H) \3 `: v+ t - JSR Music_Play_Addr! h8 s0 g- m! r# r0 @- z+ q3 B
- RTS1 O+ A9 l! P) B2 ^$ J
5 T% S8 B& A2 X% k- ;----------------------------------------------------------------------7 |% f, b# V& W- w1 c, E
- ;音乐播放处理: F x/ Y! g0 _
- Music_Clear_Process
7 n' Y0 g" O) E4 @ - .IF Music_Clear_Addr
& z5 d/ L- e) G. k; i8 t0 U Z - JSR Music_Clear_Addr
4 s( ^: F6 B k1 i P - RTS a- o- S, |7 }4 Q+ R! V: r, ^6 @
- .ELSE" u' `4 Q# Y, Z. x2 C
- LDA #$1F
! ^4 S; A6 s A& x' f7 m1 } - STA $4015
" M) B/ z+ W. i* P3 u- A0 y" G( w - LDA #$00
, l- K) Q! Z( x: T$ L0 c - STA $4010
: ]" A! G( w' z+ o% O3 I/ t - LDX #$00
" L* S5 a! q( i0 ^ - LDA #$00
9 k* j; w, o, H* o( v, [* k1 B - 6 Z% F7 ^. i9 g e! e
- .Music_Clear_Zreo_Page_0
8 `: x: F. e3 D5 j, k6 J# O - STA $00,X5 W: y b$ _- |& v
- INX
* N( O, v3 j% V* y - CPX #Use_Zero_Page_Begin% [* L7 W8 k) H5 O3 U; t
- BCC .Music_Clear_Zreo_Page_0
4 P$ W( e9 }( J; @. G9 k" B - 6 S( h2 {& H! S+ Y! s# p' Z
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size2 b/ Y, u: ?7 Q% ^6 v# l) K
- .Music_Clear_Zreo_Page_1
# w5 |1 j& M" J, b ~ - STA $00,X
( c! Z4 U9 W- |4 R | - INX, E. `( t# i" ]& Q# ?: \! T
- BNE .Music_Clear_Zreo_Page_1
& ~( ?% n3 Y$ A2 { - 0 T# y0 ~+ L; P9 b. A7 V' x1 }- P3 `
- Music_Clear_Process_1
+ I* ^- ? _8 M9 e" P; U - STA $0600,X7 w* N" e6 g2 `1 P- _+ S3 j; T
- STA $0700,X) W4 P& L) b5 o9 V, C! S
- INX
8 W0 Q5 r! _' ^: \ - BNE Music_Clear_Process_1
; s! H) g7 }% L6 F, O& Z3 ^" { - LDA #$10
" G" ?& E R# p! z" v - STA $40008 g* ?( P8 n, x# f; G
- STA $4004! T/ s" L9 n0 x8 m$ o8 `
- STA $400C
+ h. q' a$ ~% q: I7 P - LDA #$00$ R( } Z4 \7 a @/ n
- STA $4008% B/ Z9 O: @$ Z' m- b* R' w) p4 G
- LDA #$0F
( A( b: V$ L2 d - STA $4015
+ H9 r! y& f& u - .ENDIF
4 {0 \$ h9 z m+ F7 w: d - i% `" |1 w8 {; ~2 ]
- RTS
* w' ~5 k/ D' U! W - / x+ Y. p% n! l. W' L
- ;======================================================================
! d4 z$ T% ~- ~, J: } - ;重启处理4 y8 g$ Z9 Y( B, M
- Reset_Program
& U" y. L! |9 l. O2 N! p - SEI. m4 `4 T7 E3 v- d$ T( ?
- CLD
" q# ~9 z/ |4 x$ a+ r" L T - LDA #$00
8 F9 Q4 B4 `9 w N! z( G - STA PPU_CTRL
6 ? q0 k( u1 |; n% l$ F - STA PPU_MASK
3 q$ L. R6 R3 N' W4 T0 S) } - STA JOY2_FRAME
" }0 o3 O2 K& l - STA APU_STATUS
7 W5 P) x0 Y9 T |0 k0 K, C - * @$ O, o. M8 j0 q6 b% a
- ;等待屏幕准备完毕
: ^0 Y1 f2 V4 }5 _5 Y* D - LDX #$02- X; |! _8 J1 ^
- .Wait_For_Screen_Ready
3 E: s3 o# `# F8 U" ` - LDA PPU_STATUS' a( w& B- p5 v9 f, R/ R$ i
- BPL .Wait_For_Screen_Ready
# p3 C6 R1 x- ^2 W - DEX; m! K0 S; l) a# A1 V, r
- BNE .Wait_For_Screen_Ready
9 T! x+ N1 v; j# _& o9 D3 @0 f) [ - , b' v% T L2 h/ ]5 O
- ;清空调色板! s! f) j$ G% M8 [* W
- Palette_Clear
$ y' v4 o3 Q0 I m1 ?2 i - LDA #$3F
) B5 m' n3 ^& n4 b - STA PPU_ADDRESS
" H% ~5 |- X+ G2 K/ b4 t" {- \5 l - LDA #$00
* @- c0 v& o: g! j4 X - STA PPU_ADDRESS0 s7 N; Y# z. B m, j6 H4 i
- LDX #$20
$ `; H/ v& q0 H+ S3 D& |/ ?; y - LDA #$0F
5 |2 Z# j! P' w: ~ - .Write_Data+ {- _# d: M4 w3 j Q0 Z5 Y2 f- B
- STA PPU_DATA# j2 A7 ]( A! c- Q. R
- DEX+ [+ a- w& R1 @$ h! H5 D) C/ j n
- BNE .Write_Data
4 V) K* W/ L- S, J4 U
- v5 ?% r) h1 x' N- ;清除声音 $4000-4013
5 s5 {# V4 A/ h1 i- g! ~8 T - LDY #$14
. | J! \5 w% r. B' d - LDX #$00
3 E# T5 v) {" L6 N$ ?6 C7 [' U- @5 { - .Sound_Clear0 ^6 n5 L7 O" \- P1 x- _
- STA $4000,X
1 m8 D+ R/ C8 J: F) _, x; z5 ] - INX
; T, X" r( m- t( N - DEY
! v0 _+ v5 h6 X/ @ - BNE .Sound_Clear
5 h4 s, n+ |. Z% q1 ^ -
/ H( I( [3 X( W! R& E" H - ;清除 RAM $0000-07FF ~6 w; H: I$ a9 B P# P* }/ |+ q
- LDA #$007 p7 z9 b2 o( k4 I' e
- STA $00
- X# L# k G: @- Z+ x$ x - STA $01
4 X, v3 C0 b1 j( }! D" W3 \ - TAY8 c2 e7 {2 x6 F: `5 v: S
- LDX #$08
R7 o. I% K. u9 b+ `+ w3 G6 G - .Memory_Clear
" e- j& u4 n; Q( ? - STA [$00],Y, E, ^* s3 |( d* s) k0 K8 V
- INY
, Z! D+ G' n+ z9 X' r" ~1 x - BNE .Memory_Clear5 ?. }+ u6 ^+ l9 x( R `' m: ?
- INC $01
1 _+ `4 A/ z- b0 b - DEX4 B9 Z* H! a+ B" c V2 I3 o
- BNE .Memory_Clear8 f4 G8 R5 |% |: G/ m1 N$ d& F/ b
-
% k' [6 t& _9 ~( R - ;精灵缓冲初始化4 G$ J4 ^; O8 X
- LDX #$00
7 B+ U) c/ |- R# x/ z# Y - LDA #$F8& g9 u) j% N( p$ t; Y# D
- .OAM_Clear
$ O$ C1 N: A$ }3 ` - STA OAM_DMA_Buffer,X/ L5 E4 {7 ?* h: V" {
- INX
7 a6 K: K! m$ u, o& R) c" s# k! c - BNE .OAM_Clear& {. t! O" K, v
-
" e; Q% u, _" `2 L v - ;栈指针初始化
8 V2 A8 Q7 O/ Y! S0 b - LDX #$FF
' C5 G( s4 |( Y9 V- _" k - TXS
9 k0 G, V1 N; n$ m9 K -
" Z! C& q' k; p) B, N+ J: M - JSR Nametable_Clear;命名表清空
7 u2 p5 Q8 b" @% a$ t3 o( o' B% x - JSR Palette_Init;初始化调色板缓冲9 B& P' f2 z ]4 o
- JSR Static_Text_Init;初始化静态文本
7 ~8 D' H. v) h. u -
0 |4 @" Y$ M% Z3 T' f& t - LDA #MUSIC_ITEM_TOTAL - 13 Q) k* `( b |, R$ E: A" c( d% m1 H. S
- STA FC_Music_Max_Index# t; i. @3 e4 M1 T
-
& s; E# r0 s A* r" Q - LDA #$1F3 u: [8 S9 _1 F! B
- STA APU_STATUS( L0 f0 Z" O5 o& J# Z3 f
- LDA #MUSIC_BGM - 1& X, R& ^4 t; w
- STA FC_Music_Index7 @- O3 s: L+ c: d
- JSR Music_Init_Process;音乐播放0 n. b. N+ W% }% b2 G t2 I
-
0 k: V' {! t# V; L - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)) A5 a6 r: [' {4 t- i
- LDA #$1E: q) X: O3 l1 }; y4 g' P9 |
- STA FC_PPU_Mask_Buf
$ I+ H' S( B3 B, f0 k) A3 m -
6 T$ L- o/ e q( k' ?7 g - ;启用NMI处理
2 V* H# ^: |- l* L. o - LDA #$80
. M' m+ |% {. | U: g2 l$ p - STA PPU_CTRL) p8 v+ y7 }$ V9 i# i& y8 F# v" U
-
' y( B1 [% g- Y& D - ;程序循环, 剩余工作交给 NMI 中断处理
" i: S8 G q9 Z) G: a9 v9 F - .Loop, U- D. R" [- Q# g" B h
- JMP .Loop. E; b5 W* A! z
- - b2 j+ S Y) }4 ?
- ;======================================================================
2 b; K% O5 v; ~! m0 n - ;不可屏蔽中断处理
6 a ~5 I" h4 @, T7 ? - Nmi_Program- K7 U: |3 r% C& j
- PHA8 O1 f' y- j9 ?4 [
- TXA8 d, G7 Q* p1 |
- PHA
0 C9 t4 J0 L2 P7 \; o, { - TYA
8 ~8 Y! }+ T) j1 g1 F8 B" u% |+ T( K - PHA
" _& ~+ q4 E3 X* h9 s -
9 ] N( J: [* U - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
8 u6 j; g) W Y& I' d$ o! S -
% G! x( F/ i- g: l2 {. j% N - JSR FC_PPU_Procrss;PPU处理. ?7 E0 e- K- P, K& v2 D
- 9 Q) D: o0 ]: b4 z5 R+ ]
- ;精灵内存更新
; R) z' b% u$ K* X ^% B' \ - LDA #$003 `% i, v; M! B) f
- STA PPU_OAM_ADDR
# `# V" S- w8 l- f2 z. M$ F* _) Y - LDA #OAM_DMA_Buffer / $0100( [# ~3 q5 V E4 l
- STA OAM_DMA
9 Q% X/ g" b. |% }" m - 6 e: g; J& F9 O, K
- JSR FC_Gamepad_Process;手柄输入处理! {# E6 I6 u7 P) g% F3 Q5 T
- JSR Music_Select_Process;音乐选曲处理# t2 V$ J, j$ c5 W0 y- H+ X3 v
- JSR Music_Play_Process;音乐播放处理/ k6 r. I2 h0 P7 z8 j2 f
-
! C8 w- o4 ?# _. ~& R! r - PLA
* J1 ]$ B) q* g) i- g - TAY
+ j( a K5 ^# d - PLA% G# T7 p" c3 y0 y; L, d2 W
- TAX
4 x& Q. @ x' G4 [ - PLA
& Z9 A* K& b5 d: }1 Q/ y+ @ - 2 [( e; H- X1 _; y
- RTI6 T/ z+ i6 r; }
! X+ b8 o4 C3 X+ j9 |* j/ J7 Z- ;======================================================================
% O- F$ u2 p- g, S - ;请求中断处理
& |4 m* ] @$ `* ?7 D; u - Irq_Program
; x. y, D5 U0 v" P - RTI) K8 c# Y% h8 O5 C W$ D! w
- 5 D) N" |0 E( Z1 i8 B6 ]. `. J
- ;======================================================================9 q+ g! |& D0 E: R8 R8 {4 p; u8 u) f
- ;中断向量表. B3 q4 }! x9 `0 T/ a6 @
- .ORG $FFFA |( s6 A, _/ L1 T* p
- .DW Nmi_Program ;NMI触发时执行
; F4 J' M/ l6 H; i8 {7 ~/ c" e - .DW Reset_Program ;载入ROM时最先执行. M- _4 A$ K: Z+ X4 v
- .DW Irq_Program ;IRQ触发时执行* | N- y( ]/ c4 ?% O
复制代码 0 t/ Z" N' v$ b. y% k1 F
; y8 d6 {. a+ i8 p
, q6 m1 t# g% J
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|