|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
8 t2 l& P4 f3 h3 C- j, f3 e) k
, w: K a& a: L* B以下是主框架代码:
$ H7 f+ J! Q# Q- ;======================================================================& ^$ ?" T. ~& y8 I9 ?, r
- ;文件头- p. ^* {5 c; M, ~: s5 G6 p$ M! k
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
/ }! b; K7 I, n3 O/ w t - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
# w. m, M( C+ S$ o - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
0 T" m/ C4 Y9 a$ D \ - ;======================================================================7 f. o$ G& Z5 t, C6 {
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2# x5 ?& L3 P8 ?5 l3 f5 @% g$ a1 k, _
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
$ X0 t. Q3 C" P- J& X - ;======================================================================: ^" @* F0 X( G1 D! H9 l$ @
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 16 H1 r: I7 D0 ?+ S. |$ ]0 k/ m
- RESET_ADDR = $E000 ;主程序起始地址
5 [* `& P% n F7 z4 t - ;======================================================================
0 n l' U# R# ^$ ^6 u( _ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB6 m$ [0 U" ]6 d2 J' z n
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( [, d$ ^8 {2 {3 O2 u
- .INESMAP 4 ;Mapper号 (0-4095)
+ T6 R0 f9 B* e0 ]2 m# e- ?9 e - .INESSUBMAP 0 ;子Mapper号 (0-15)9 ~; f: Z% A/ E
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
8 `* S, M! z3 { - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)+ x* Q7 X0 j& c& a$ o/ n, j
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
N3 _+ }& n) Y* _ G - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 P7 y; T0 m9 f ^
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) W. Z4 x/ m8 E* |3 h/ O; P
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
0 F. \5 x3 B+ P6 S! h- r& T9 |* Z - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
! e( R" x3 \7 Y! A - ;======================================================================
! g8 N/ L( v( ]5 [3 c - .INCLUDE "fc_demo_config.asm" ;全局配置7 \; I, R* }+ p$ I+ x: i2 v
- .INCLUDE "fc_demo_constant.asm" ;NES常量9 e- K/ _. f, a# s$ R3 A
- ;======================================================================
# k- @& {2 ~7 P& `! u* t5 n; v' V - ;音乐配置# W" h4 j- U+ u" C% Z
- .IF 0 = MUSIC_THEME $ E. L; v3 V2 \. L) e8 {5 Y
- .INCLUDE "data/music/Gremlin 2/config.asm"
5 w; q) G3 V* g/ ~* Q - .ENDIF
( u3 E; v; q# M1 @" Z - / c$ i6 b2 }) J) y: @3 z% A
- .IF 1 = MUSIC_THEME
/ t5 H: m c) V: Z8 K$ D - .INCLUDE "data/music/Raf World/config.asm"
& x- B0 c. Q" v/ `& \ - .ENDIF2 A* b2 n1 \% b( i" k
- 9 t9 p M3 {; c4 G) {3 P; K* D T
- .IF 2 = MUSIC_THEME
5 T! C3 P0 Z* v3 Q; C# B7 f - .INCLUDE "data/music/Ninja Gaiden 3/config.asm") |& S3 G! |5 Q+ K; _! S2 D
- .ENDIF
8 ]* S7 R8 k6 G9 c. m* |7 H
7 V+ ^6 }/ F/ i3 U/ p. w, a- ;======================================================================
8 l4 y% g" L' o% M2 ]0 \3 i - ;引用CHR图像数据
6 Y7 j; V! [' z& V6 Q$ w: e - .BANK NES_16KB_PRG_SIZE * 2 r, Y$ A, V7 R; Z6 k
- .ORG $0000
7 d, a/ b) g0 X y8 p - .INCBIN "data/bkg.chr"/ Y* h: d# Q( `2 d8 |5 `' Q
- .INCBIN "data/sp.chr"
9 P+ M* }( V: @ -
7 I3 `/ D4 w: O l - ;======================================================================- k1 z7 \( z+ R7 H/ V, t: e. S: |" i
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
0 J! `+ i9 m6 _0 h - .ORG RESET_ADDR
) G8 [# H4 S/ }1 n - ;======================================================================
5 H% T1 {2 v0 B2 s) z7 g - ;引用其他源文件" W1 ^9 I) _9 D# g5 \ A
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理& S0 c9 `) a( n; v6 x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
9 }# f7 D/ L! e% g - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 q0 N4 e p ]
- ;======================================================================
& Q0 K7 J: K" f( T - ' N9 \" _+ O% Q# F( \7 W
- ;======================================================================; a S! [8 t- L' I# \$ A
- ;等待VBlank到来6 j4 I! ~, q; }& [: B
- Wait_For_VBlank: L$ ~( i: L7 h4 X3 Y. G
- LDA PPU_STATUS, {$ Z4 ~6 T& c8 ]& W% P8 W% w+ o
- BPL Wait_For_VBlank
4 v, C- t1 g1 T' q1 q# ~$ f - RTS# `3 A9 @' W; R
- ! Z. J9 q Z7 j* ~
- ;======================================================================" k l4 R" F1 o A9 L% }
- ;调色板初始化
! j% O: c+ D8 ^0 o% A - Palette_Init
3 n5 x6 ~: z$ x1 k( }/ | - LDA #$3F4 U: I0 s' Z% b# u' d( z0 A
- STA PPU_ADDRESS( t4 u5 N" d3 }) l0 m# z
- LDA #$00, w/ f4 y6 ]& }/ o1 Z
- STA PPU_ADDRESS% r. O2 R; g% |1 p+ V$ s( L3 O
- LDX #$00' D! q& \$ D- h5 o5 d, t' Z% M* G
- LDY #$20( i0 t/ C# n" B
- .Write_Data5 {6 K, h( ?3 \& E* R
- LDA Palette_Data,X
0 Q; L* s. }5 L M; v: D - STA FC_PPU_Pal_Addr,X
8 z9 \/ h, R3 } - INX
) ?, ~" l$ J g6 N$ V. ~9 S9 Q X - DEY
/ Y9 F5 @% P# J( @# C! Z - BNE .Write_Data% f. e; I2 a# u/ u
- .End( f' y+ Y1 M- j# p$ m9 U/ P- S
- RTS* C" J" ]* k' p* f8 r1 t8 R- v
1 b" E; \7 f! V. w- ;----------------------------------------
7 c) N& k4 Q3 U# I7 u! N7 Q2 G7 E6 _ - ;调色板数据
$ @4 X$ o) I6 p$ s( K; z8 G' P2 w$ t - Palette_Data
7 l* L* v+ k0 n- ^7 B: L - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B* J- \) o% Y2 {+ t; r' r( y
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22+ L- t; p y, |4 b6 A+ Z! j
-
, z/ L5 F2 }$ ?; ?2 W, N - ;======================================================================
- Z& \- u. m) N2 y9 L- d. k# z ?, p - ;命名表清空
% r$ l! w: M" _6 a+ S - Nametable_Clear
: }6 o; M- U3 p - LDA #$20
* G$ |3 k3 D n0 N5 r - STA PPU_ADDRESS- U* |8 D; o6 k) k2 D6 M2 l
- LDA #$00
4 T! f$ O! j5 z: L) T @ - STA PPU_ADDRESS8 z: @3 B0 {) T
- LDA #$00
5 e6 Q& Y i( E( F - LDX #$005 G: f, P. M% q( t) R& T8 i
- LDY #$08
5 S) M- ]7 C8 E. p - .Write_Data
' \% \' A, | ~! x, h6 u - STA PPU_DATA% W L. }. \# X1 h
- INX
" S) b3 P% c9 Y/ t$ N1 P, _ - BNE .Write_Data
4 x2 I* F; y8 F7 B. k - DEY T0 k( p }& w, N# G( V% A/ K
- BNE .Write_Data5 z* R' k! P& A. O& N9 t
- .End
t. y( b# c( @1 A8 L8 q+ l - RTS: Q4 j. }! ^3 A
- . D2 V( s7 p+ x$ R
- ;======================================================================
2 ?1 x9 [( G1 a5 W - ;音乐曲目切换! c' S% \8 p3 d. I0 m
- Music_Select_Process
0 ^6 e% n. H( Z8 A - ) M2 u7 T i3 A$ x4 j- J( A
- .Pre_Music;上一曲
1 J$ ]6 I. s5 g- q: C: @9 z A - LDA FC_Gamepad_Once9 s' x- d5 R9 q5 _" }9 N$ g" |& K
- CMP #JOY_KEY_LEFT" f6 ?2 J# o; S; e7 k; H
- BNE .Next_Music
7 m2 ?6 r3 S4 U! q4 ^9 f: j0 } - JSR Music_Play_Pre2 N- [0 A! H) U5 L' q& t% A, J
- .Next_Music;下一曲, {) H, z7 h% {4 t% H5 t1 {& \
- LDA FC_Gamepad_Once
" u# I' J! s r, h- b - CMP #JOY_KEY_RIGHT/ P6 I+ d# ^1 ]3 R
- BNE .Next_10_Music
- i0 p0 `8 U1 d0 E. Y - JSR Music_Play_Next
& F2 I1 |% X: e) g+ u- d - .Next_10_Music;上10曲: V* m/ O: f0 A6 O, |
- LDA FC_Gamepad_Once; m( D C' d+ W { Q$ x: d
- CMP #JOY_KEY_UP
9 S: y4 G3 i+ q) }) V - BNE .Pre_10_Music
$ |# b) c( K" H - JSR Music_Play_Next_10
' U. l# i$ i6 G9 H2 z - .Pre_10_Music;下10曲
8 d' p3 N$ `; B! U+ S! u; l) [& y - LDA FC_Gamepad_Once
) D6 x% ~, |9 v5 ]1 [ - CMP #JOY_KEY_DOWN
8 o9 F' O: x* p1 {' w9 h0 u& | - BNE .Reset
# Y- g- Q# }% n# X% s7 p - JSR Music_Play_Pre_108 F/ y8 s5 i g; I) ^; f( Y
- .Reset;重播当前曲目1 J4 O ~7 \4 [7 d' B; W
- LDA FC_Gamepad_Once
/ g, V% q/ ?, ^( r5 ^& a# A - CMP #JOY_KEY_START% t5 X. h# E! T1 G9 l
- BNE .End( v. N2 y0 r$ M4 u+ ^3 \
- LDA FC_Music_Index
. B" M( S; i3 P7 l$ c P( ` - JSR Music_Init_Process+ d: r. ^ U$ f" h8 Y$ a! i
- .End U7 i7 l7 k! Q. q
- RTS* Q$ e" A( @' @0 y4 e+ d
- 1 K! S( u- t& E; Z( J% {1 ]
- ;----------------------------------------------------------------------
8 Q$ R6 P S" o0 a. ^! M# T4 C- e7 K: p - ;播放上一曲
7 v! ~" b) f! ~% i0 S% U! f* U5 u - Music_Play_Pre; |: u( r$ D! `8 i% H0 Q- j6 r
- LDA FC_Music_Index
9 W; G) `4 ^( ?) a - BEQ .End. p, {3 |7 x* i
- DEC FC_Music_Index
# ~6 f( y8 r Z# H4 }9 {4 T - LDA FC_Music_Index- H% z. n% g; H" `, v/ W+ B a
- JSR Music_Init_Process
. W9 W! K8 @: x/ y. a4 A0 h- E/ e - .End1 T! n4 }- V: s% T9 L
- RTS9 T' X; P/ i9 z
- ;----------------------------------------------------------------------
# P' N! Q! I2 H t) W7 K) E* u - ;播放下一曲$ u5 e" R: T% c R# s8 C; g
- Music_Play_Next
: M, A, k- T. f6 g! c - LDA FC_Music_Index7 D2 A7 J1 @. U" N8 N8 W- s9 @
- CMP FC_Music_Max_Index
* q% U8 j* y7 ^ - BCS .End
$ }# y- o5 `: U6 z) O g: C - INC FC_Music_Index
& P4 Z3 n# w# E( F! {! y - LDA FC_Music_Index" @6 Z2 C% T$ \
- JSR Music_Init_Process
* ~9 _% @0 g1 U/ @4 [$ e1 P' u# p - .End
% z* A7 K" e }4 C1 _ - RTS
( D2 ^1 P" z, z: Y4 R0 g - ( B9 l5 }, u# e7 D
- ;----------------------------------------------------------------------0 b" e2 k' z; O# e- o
- ;播放上10曲8 \% V4 S; }$ m
- Music_Play_Pre_102 N, s6 x Q& x: }* }2 D, L
- LDA FC_Music_Index4 K1 r" |) s0 P, r/ X' v8 w
- BEQ .End
5 w8 A% W. U& |8 r - SEC
/ v# m. ?7 F9 X - SBC #10
5 U/ t, W9 m( i - BCS .Pre_10
" \3 A! n& w; L2 R7 ` - LDA #$001 r' E. B6 G% [
- .Pre_10
9 y) P# ^3 s) [* M W1 E2 Z' p# ^ - STA FC_Music_Index
* D. J* t7 F! ^1 B - JSR Music_Init_Process0 _$ N5 I2 D/ F; W
- .End4 }3 B2 c5 q, w" E
- RTS. t+ D# a5 }) E* X0 f/ R- }$ L
- ;----------------------------------------------------------------------# S; A% C7 g f% n
- ;播放下10曲
" M- F: [* s+ _3 k S, ? - Music_Play_Next_10
$ _" W" I% r. L. K" Q( V - LDA FC_Music_Index/ V; d1 [- x: _# J$ s% K- H
- CMP FC_Music_Max_Index
7 r6 k* G( X1 z" [: R6 p. l+ Y - BCS .End
1 v/ [$ [* |4 ]( u% S# S) l - CLC+ B/ K6 C! L7 `+ O5 Z' z
- ADC #10$ N7 u) Z* I4 \" v' d2 U3 k5 s6 F* U
- CMP FC_Music_Max_Index
- U! a5 ?5 q' L" | - BCC .Next_10
o8 t( ~# `; w# Z - LDA FC_Music_Max_Index
1 }5 H7 E# w& x1 k8 j U - .Next_10
6 H6 w/ {3 j- x& W( Q - STA FC_Music_Index2 J. l- J% i+ e, m2 y( O
- JSR Music_Init_Process
8 T9 k7 x# J5 }9 k! V ]0 P - .End
% z1 a+ R3 C7 {; L/ K$ r3 W" g- j - RTS
# U) F% A% s* S( | G4 T - 6 A! B, [) P$ k/ _& m6 t
- ;----------------------------------------------------------------------( F/ s/ _1 f, \- m+ Q& n3 H' w+ R
- ;8位十六进制转3位十进制制; q- d1 E: V5 p& O, i+ e
- Hex8ToDec* Q# W5 p4 k0 K3 z) X6 T
- STA FC_Dec_Data_1) I/ t7 @: W2 W( q4 e" |
- LDA #$005 ?: O8 e& w7 @! G) u8 W) F
- STA FC_Dec_Data_100) N1 s# t* D$ }; O! c2 V
- STA FC_Dec_Data_10
4 y2 N; x* t& g$ k) Y8 O - LDA FC_Dec_Data_1. J2 ?& U! r9 P9 ]: }
- .Convert_100
+ I6 _2 b/ x7 [3 i; ]) I( O - CMP #1007 l- A' B$ z. N0 h9 U* N3 L& @
- BCC .Convert_10
0 B# m; O- [/ Z. G - SEC
8 q4 u" ]: ? T" B& u! ? - SBC #100
* L4 s5 p' t* B - INC FC_Dec_Data_100( @0 x! m8 D u. v
- BNE .Convert_100
* g6 ^4 _1 J8 n/ W0 ?7 S; d0 L- O& z - .Convert_10% M/ @! W5 G) b+ _2 _2 }! t
- CMP #10
5 O+ g; ^6 ]8 a! W, `( _- | - BCC .End/ v+ Z5 D6 B2 R' c5 }4 \( f% j
- SEC
9 S3 J4 S1 P( ~6 y8 e* K0 S+ N - SBC #10
6 N% T; g% A7 r2 C8 U0 R - INC FC_Dec_Data_10" s6 a# E" z( v. H' e$ u! w7 m
- BNE .Convert_10
: B6 \/ N+ Z& I6 G - .End1 m8 O3 |% \, W
- STA FC_Dec_Data_1: p' o* J0 x1 Y. v
- RTS2 d* f2 r: j0 K# z' n
( I0 P; b9 C- p. {9 j: ~" t- ;----------------------------------------------------------------------
8 P* ]0 _2 w; X$ a3 {9 J - ;显示曲目信息
2 B2 ~" Z z' A& o6 i- C2 N - Music_Info_Display
) f8 m2 d$ T, q0 w - LDX FC_PPU_Buf_Count
8 f+ l6 O" j; ]: t: ]7 [1 T0 u$ z - LDA #PPU_WRITE_MODE_CNT_LINE7 i4 o" c" C2 J1 t5 h- i3 p
- STA Use_PPU_Buffer,X
8 f+ R1 {' k, D- t3 L2 L - INX
, w# b' t$ t, Z - 3 n- g$ v7 |' x; w
- LDA #>MUSIC_INFO_POS
; b% Y6 m1 p- B9 k% r/ t - STA Use_PPU_Buffer,X
# y \, a, a3 U& P# H - INX
5 v0 m( m! H, i. U -
5 ~4 p/ d% V5 K% g# U, C, M - ;居中 X$ D! V) B0 b) f+ A" z' u& v
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/27 ]8 J0 j, x7 ]
- STA Use_PPU_Buffer,X. j; q6 P3 d+ u9 j0 f+ j' K8 |
- INX
[" ^$ N! j$ n; m' h2 i: d. d - # G2 p1 I8 E9 T, r2 }
- LDA #$055 h- X2 \* D/ ]
- STA Use_PPU_Buffer,X( |1 \2 x" a' L3 m' z* k0 {1 l9 o
- INX
; v2 T& z. ]# T, g s- N* J - * L. e/ o0 V8 `. Y2 u7 d1 E- W
- LDA FC_Music_Index8 |7 P* W/ r2 {' g. x0 y" C. C6 h$ `; l
- CLC9 a' D- A' p& r$ B
- ADC #$011 ]2 x0 U! w2 ?" v
- JSR Hex8ToDec
, u7 e7 ]4 o3 [ -
4 k/ i# v+ Z+ I0 q( ?9 n - LDA FC_Dec_Data_10
9 k) p" x# b7 ~ - CLC2 q& k! j5 K! T# `: }8 V! C
- ADC #'0'
, K7 y! f! ?0 `, `7 G" E6 ^ - STA Use_PPU_Buffer,X5 _$ f+ U$ m4 z: w; a3 E
- INX
- D- p! U) A& N0 p -
+ r2 v4 \) i( p4 a - LDA FC_Dec_Data_1
9 T: [- f ?! Z/ X# ^/ n - CLC* m- r1 t5 R0 v, x0 |5 y
- ADC #'0'; {+ V% `2 i1 S0 J% R8 j
- STA Use_PPU_Buffer,X0 X l4 [: }; ^) O
- INX; h6 ~+ p5 v! [. H9 ?
-
/ G0 ]' R8 \+ o5 f' X1 g - LDA #'/'5 i) j- N }; ~" l
- STA Use_PPU_Buffer,X& A* U& Y: k7 r/ z4 c
- INX. G8 s9 {- j7 e! p
- . J" l" G" t9 c4 ^
- LDA FC_Music_Max_Index0 ~, h# e( Q8 v) A6 H' @" e+ B
- CLC- D% ^! r$ S6 Y5 J( p
- ADC #$01
. K1 ]* ?! c. ]+ q - JSR Hex8ToDec0 _0 ]" _; I) H% E+ c
- 3 V! K. p, t2 d0 B- i& S2 n
- LDA FC_Dec_Data_10
- m9 \3 v) b/ p% k- F - CLC4 y! j) C3 `/ f$ v6 }
- ADC #'0'
. p$ K4 Q& f7 z/ V g* f" } - STA Use_PPU_Buffer,X0 \/ b7 |3 n" S' O1 b& A9 o% U7 F4 M
- INX4 M- L1 C, Z+ y2 g( B, h
-
4 s3 T$ \ J# s* {$ Y9 W; c7 h - LDA FC_Dec_Data_1: l( K! O" q' H1 _6 b! }+ u& v* o
- CLC
# P3 F: R9 b! [4 D# x, y) X - ADC #'0'
- a' x5 i( e" Z, K2 u4 c- J - STA Use_PPU_Buffer,X4 W t) X; s' V6 P' p& ~, W/ Y
- INX1 |9 F2 P$ r1 E( H* u9 S6 U
-
9 \1 w! H$ X, Y0 G& Z - .End& t+ U, F( ^: e% W3 R6 s
- STX FC_PPU_Buf_Count
! f% ]/ @) _0 z# M - RTS
. d# f9 ~: ^7 Z% B - ; X/ r% D2 |3 e6 W- m: n
- ;----------------------------------------------------------------------
$ I3 X J% C3 O: Y - ;音乐曲目初始化处理
6 A- m$ |0 M* k4 _) X1 C8 i - Music_Init_Process
9 @4 D2 _9 K4 r& y4 Q - PHA
7 b8 R# D* C% M4 d; y* w1 z - JSR Music_Clear_Process
$ C- l4 T, U$ N, h! K5 E M0 h - LDA #$1F
$ r8 x" s; W+ K# b4 ]7 X - STA $4015- t+ G$ D* n8 \7 p- {6 @7 s
- PLA q0 [) U3 W! g* g4 }
- JSR Music_Init_Addr
+ s, T3 w* Q8 J7 B) n# c9 B - JSR Music_Info_Display+ T9 q/ h3 W/ V8 c0 [, |- |
- RTS; E% M I0 _6 _
0 C0 z0 J& U/ E ~% d# L3 n! \- ;----------------------------------------------------------------------
) B% h& F' G0 O0 O& {; o - ;音乐播放处理
% w9 t3 F# p9 B& f0 Q$ N4 L! a( C( p - Music_Play_Process, S; ~% E6 R" v5 E6 }4 ~1 H
- JSR Music_Play_Addr, N$ ^; z5 i8 C' I# I
- RTS, _% S& o: A- Q0 E
- ' q5 Q& f5 L0 t/ x5 {4 V
- ;----------------------------------------------------------------------
7 J4 C8 f, ]# {+ W( L - ;音乐播放处理' x, B% |+ T0 q0 {5 w) t
- Music_Clear_Process
/ q7 ~( v! D! E( @& ?) x - .IF Music_Clear_Addr( n8 ^! E) }# @5 k$ V& O1 B
- JSR Music_Clear_Addr
, l' N* ? X# c9 h - RTS
: A# H p) B3 {, i2 `! V0 Y9 X - .ELSE: W& ~) K8 d* X- s5 @; Y' L: {' x
- LDA #$1F
. J$ `* G5 \( \ h* `6 C* U - STA $4015: C2 s/ X% l- K% e& V2 I
- LDA #$00
' c2 O) ^" \7 w - STA $4010
7 b- ]9 y/ s* ` - LDX #$00
& P: E$ H0 j! Y! A' b7 U - LDA #$00+ a4 W. N0 [" P M( u
-
( A! ]- p4 d) [8 o7 _: A - .Music_Clear_Zreo_Page_0, U. @ j. Z+ K! @, a& S1 @) j
- STA $00,X5 l7 z& P; J& W4 I+ Y
- INX
4 y, y6 K; H3 _0 g% K; C! q - CPX #Use_Zero_Page_Begin S, X0 u2 _/ Q4 O6 N5 e1 m9 H
- BCC .Music_Clear_Zreo_Page_0
. W8 K* K4 y/ } - 4 i; _' A- {. z/ X7 w2 `
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" e# g% f3 Y7 J) B* B) f! W - .Music_Clear_Zreo_Page_1
3 [* O" e! Z; |6 h4 D6 {6 w1 S4 r - STA $00,X% m& F+ ~: v& y: \3 ^7 o! J7 s
- INX
/ l. b/ Q2 F( d* X2 B - BNE .Music_Clear_Zreo_Page_1- V4 v* Y" V2 z. x0 F2 m2 n4 E
- 1 L1 A9 m- d% E! Q6 F/ N
- Music_Clear_Process_13 ^! u* `% L$ P9 T# V
- STA $0600,X
( p# e0 t- j+ R# y. ~ - STA $0700,X' L! d; i8 t" A4 p' J8 A5 [. H
- INX
* U# Z# ~7 v* d) G, S - BNE Music_Clear_Process_1' U, B5 q Y6 L( k9 r
- LDA #$105 T0 Z9 D3 z; l$ K0 |
- STA $40005 z# i/ }; `/ G- b5 c" m8 @; r
- STA $40044 t' m. ~& e. E7 c" Z4 _/ k, \
- STA $400C
4 v% s0 b& D+ I4 H; M( H0 f$ H' ? - LDA #$00
* [ k8 L& G- p* P - STA $4008
4 {0 o. q' Y+ o* @5 x7 s5 j - LDA #$0F
# {) m! M7 A! B* j' [9 b9 [7 @ - STA $4015( w6 _0 b" {+ D0 d) c3 N
- .ENDIF. p% D$ K4 P* q+ i* ~0 H) g
-
) Q6 z, }! }" m+ l" A) ` - RTS
0 c9 V G; d$ `% r3 F4 j
4 N- ^ z1 ?; \- _7 S S- ;======================================================================" ^/ D g) T- C% s6 f2 i" B
- ;重启处理# N' S: }# I7 K2 \; z8 A
- Reset_Program& t7 Z! W: Q" G+ I/ t
- SEI) {( x t! a8 g% J( s8 i6 V
- CLD. i6 ?% ?6 y0 G, d
- LDA #$00
1 h0 ^- o9 C1 z* Q1 q& \ - STA PPU_CTRL
- v- q8 \3 L, l - STA PPU_MASK
: ^7 }' i- s' l6 A7 M* Y8 Q6 H - STA JOY2_FRAME' L6 P* ]3 ] o, E x8 o7 j7 h/ E
- STA APU_STATUS# f1 E( f* T, c. Y& [/ Q: }6 `
-
# C$ \6 s' l' s: a8 d; N - ;等待屏幕准备完毕
X3 D+ `4 w K1 Z# f) a9 S - LDX #$021 I5 X: H, R; m F
- .Wait_For_Screen_Ready
/ S- y% B/ i6 ]0 C0 h% k9 f - LDA PPU_STATUS( V$ C! i3 ?, s% d6 J
- BPL .Wait_For_Screen_Ready
, m6 {+ D3 k) u$ V! C0 P - DEX& m8 k4 X! E. r& h& q4 ^3 U
- BNE .Wait_For_Screen_Ready3 |1 K8 y3 q2 U" V% c1 v
-
2 B" m. t6 f- A/ b% o! @4 g$ c - ;清空调色板
8 e: g2 y/ q- @! @" @: D; H - Palette_Clear1 w7 ~2 N' T/ B
- LDA #$3F
* @' m: {% i3 E: t* K( _ - STA PPU_ADDRESS
5 n2 \: i# ~8 R2 p' M& ~8 n& _ - LDA #$00
" j8 B7 X/ y Q2 z5 a - STA PPU_ADDRESS
4 B' E3 o# M& f' p - LDX #$20% Q0 ?: _1 _/ B9 a
- LDA #$0F! g7 w( {# o+ r
- .Write_Data' E: E$ {5 z7 q( d) d* R b
- STA PPU_DATA
9 V2 a0 x8 ?% E! G - DEX
* e( Y/ \' z5 L; q - BNE .Write_Data
$ L% d# I( W6 g" M1 H8 j$ A, P* g
0 |- s! O& S) P- ;清除声音 $4000-40131 }$ |7 C3 w, O7 v
- LDY #$141 P, @6 d; b. u/ N9 V- p
- LDX #$00
, R7 S. D* ?, U2 ?5 a1 l - .Sound_Clear
+ d5 r, D1 L, {2 t" H/ R - STA $4000,X
. k8 M- K' ^$ }, i3 ^2 a7 S - INX2 T9 Q7 `: V) j" X7 [
- DEY! u: S0 [- ]) V. W- s: `6 Y
- BNE .Sound_Clear, @: T8 u6 H8 E0 [
- 3 E$ B$ d% d4 a! x/ _2 k& X
- ;清除 RAM $0000-07FF5 `/ u. e& K7 z, }+ k
- LDA #$00
1 J- q+ x# n$ z( d% ^: l - STA $00 O% N8 ?' e f! Q7 y2 g
- STA $01
; h1 u. J8 D$ e) K( ^* t0 k4 J - TAY
8 G5 R' t% ]0 w+ v. {9 v - LDX #$08
9 _; b7 o! `8 {, E/ \! G - .Memory_Clear
7 m, f! L+ Y4 ~' X# g - STA [$00],Y4 U8 G' M- c5 S
- INY
& L; |. p# }( B t3 Y2 B - BNE .Memory_Clear+ g; w' J3 u- S" ]# D* F, b% c
- INC $01. m) n+ _7 V9 O: S% X- I4 y
- DEX" i1 d8 z2 s6 z& a/ i! p4 V: J
- BNE .Memory_Clear! p; W: G0 P6 u8 D. n6 h4 F6 o
- 6 Y/ \2 T7 Z4 M' V
- ;精灵缓冲初始化( {: K7 t$ t; B# t5 P% a0 P
- LDX #$00. P% Z. s' Q( q. J( e9 h/ D
- LDA #$F8
- r8 Z& B6 W! x9 R) j - .OAM_Clear9 z# V& R9 I6 Z& q4 j
- STA OAM_DMA_Buffer,X1 C2 _, V% `. j
- INX
! x& e4 x; J( o' Y; W - BNE .OAM_Clear% h6 f0 Y+ ^" q3 ~- m+ p
- ) h5 C% i2 w# N, n* y3 C/ c
- ;栈指针初始化, w: k2 r! \. {
- LDX #$FF t0 a5 Q: M; o
- TXS* k s3 h( J" R6 g
- $ M2 M* b. U3 f; @; T. y1 W, k
- JSR Nametable_Clear;命名表清空# e! c. Y# e5 G$ s% m- |
- JSR Palette_Init;初始化调色板缓冲
+ y$ |) a# m5 J1 i& i" N4 s; m - JSR Static_Text_Init;初始化静态文本
, t. ^3 Y+ x [% s -
$ p m z$ K8 l- Q+ F- E9 Z0 N1 D - LDA #MUSIC_ITEM_TOTAL - 1
: }8 Z# s% @2 `# _ X# C5 m% M( \% J - STA FC_Music_Max_Index+ N% H/ l" Z+ u# Y
-
1 {6 Q' A8 x" k - LDA #$1F1 p q2 T' \# V# i0 Y& x
- STA APU_STATUS
* Q7 n" Z0 G4 V9 e+ [ - LDA #MUSIC_BGM - 1" U4 i! `; Y! ] Q. E2 C: a* u
- STA FC_Music_Index. k5 N, {: I! t5 G6 `
- JSR Music_Init_Process;音乐播放6 p" k6 B/ `0 w& Z! j3 {
- ' }' e4 k: x+ N5 o
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
6 ^$ t5 D t5 E9 I" C - LDA #$1E5 A# y6 K% R9 S
- STA FC_PPU_Mask_Buf* a/ O0 v: h$ j0 x: U
-
2 a+ V2 s# m0 Z0 ]) }0 {# Z- v - ;启用NMI处理- F! h" w7 y4 @5 ~0 y% m8 |
- LDA #$80
8 V+ t5 I+ j8 e5 f; `) G0 J7 }) Y - STA PPU_CTRL" P! M+ e3 j! y( B) v+ B9 r+ F
- # {6 Q' E7 r& [% X/ c
- ;程序循环, 剩余工作交给 NMI 中断处理
" c! s: o; e7 { - .Loop
' a+ P* e4 M2 @ - JMP .Loop
" g" |2 ^2 U) X# K, J* _: m1 x
% f, P. [* G" Q9 x% t" A- ;======================================================================
' ^3 H% }/ i1 r# k% b4 n/ x - ;不可屏蔽中断处理9 ~ V* h1 M- u& [! @
- Nmi_Program( d; s6 a* X% s1 ^2 m
- PHA; U# B3 |9 \$ h0 o7 U" E7 t
- TXA
* j' d/ e4 U0 ]8 _ - PHA7 J/ |8 N Y9 A
- TYA' w% ]/ P3 Q/ C4 v
- PHA& ^; p7 F" t% p0 f9 Y: ]& M- X
- : Y- R4 J4 l9 V
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位0 H: w, e& `( K m& z% I
-
0 e/ n# V, }" J- a) D - JSR FC_PPU_Procrss;PPU处理
A/ t5 I: W0 g8 }6 I - N! x9 K2 @6 e! e5 S- ]+ _& s* j
- ;精灵内存更新
u) f J% F# F0 n- H7 t, B - LDA #$009 |: F3 |# R2 I: i+ x
- STA PPU_OAM_ADDR
3 G4 W9 w, O% J. ~; h+ ~: R - LDA #OAM_DMA_Buffer / $0100* y7 M# O/ _% U8 O) q
- STA OAM_DMA; a: Q* x: v3 d4 k6 {, n
-
% ?: t( O( q/ G' N( ^ - JSR FC_Gamepad_Process;手柄输入处理# x) G3 ~9 b/ A7 B( S; {0 U
- JSR Music_Select_Process;音乐选曲处理& I9 @2 X5 D8 @- r
- JSR Music_Play_Process;音乐播放处理
& s8 C2 C: ^- G( j - ( t( W7 L5 r5 ]& e7 E6 v P$ Q
- PLA( ~; R: C' I6 n* l# O" w" r
- TAY
: ]3 a& t6 B7 |, g/ M5 [- b7 r9 T$ R, Z - PLA+ p& l$ a/ Z) z" _8 [7 a
- TAX
, }, z0 d- }2 Q4 n! z+ g N - PLA
. \: C8 V2 E! W4 E
, A! `9 m: m, Q1 X- RTI: X$ U; n3 }5 P8 Z: k
$ w: W$ n4 H4 T5 k. J+ H( f- ;======================================================================) \, u7 \( A5 S2 Y2 M
- ;请求中断处理
* ?' P' o9 q) D, V2 ^, w% \ - Irq_Program
) ~7 i8 f3 I* s, j4 U - RTI
$ Y! Q4 A/ }) L: x/ V! e. M
: I/ V$ c0 f2 w/ ?3 G) L. N" ]- ;======================================================================" ]. ?; T* ~! b$ B
- ;中断向量表
- e6 I4 I& k+ H' }+ |& Y- y `1 Z - .ORG $FFFA4 w% a$ G( b% X( O2 Q8 L
- .DW Nmi_Program ;NMI触发时执行
+ }- U6 H/ \. d! h: K - .DW Reset_Program ;载入ROM时最先执行
1 |* j4 o |4 G4 a7 R - .DW Irq_Program ;IRQ触发时执行5 e5 E, L# x& B; z9 E7 L
复制代码 1 x' s% [% E6 `: W4 E% [! B
( E$ }) a! P( V, X. v/ ^" t% c/ s
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|