|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下# E, _* n: ?9 m" N

. F& x/ [! W$ w4 t9 }, J l* `1 [以下是主框架代码:. t4 |5 ^' `9 }+ Q" N1 `( {
- ;======================================================================
4 c" N; L4 d9 ]* K& V( `: i+ @" L - ;文件头
' g1 n* u5 t/ [5 _2 S - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量: y- m+ H) R/ k9 C9 W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量, _* p# y b) b/ h) u7 ]! J" O
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) b# Q' \5 c. R4 }7 c - ;======================================================================4 |/ s+ w3 T1 Z6 e$ O
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2: e: K$ a1 p7 E1 p* f, X, p) U. q6 V
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
L' `2 [8 a# @7 f% X+ w - ;======================================================================( l) }" C9 y7 s) {5 h" T' s
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, `' P( k9 c8 B0 `/ t! [" H. E
- RESET_ADDR = $E000 ;主程序起始地址
( W9 r5 G9 \9 a! e7 m* w) g - ;======================================================================# G4 Q% V! @* g1 g
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! X. f1 X8 v$ r( Q- O- |) h - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
! E! \8 i; u3 D5 G7 t* ` - .INESMAP 4 ;Mapper号 (0-4095)
; ]6 ~7 v* y9 Q! l: u3 \' H# T - .INESSUBMAP 0 ;子Mapper号 (0-15)
4 |. G' P3 V1 ?" c8 G+ h5 j4 \9 h- y; ] - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)# U8 {4 S# m8 M C3 U- s
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)2 I5 q9 k# `4 V0 P6 O1 v
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)% ]! T7 s; K0 j6 U3 N
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
; Q4 Q2 M5 Q6 u' e - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)# V) ?4 q5 ~: l. \- I6 s
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
6 C3 c7 A& q0 R - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
4 P" P. c, E* f5 k5 }/ y" Q - ;======================================================================
7 y- s+ E* S+ J6 H' v - .INCLUDE "fc_demo_config.asm" ;全局配置. W/ {: ^5 l$ H0 [7 P. A' ~
- .INCLUDE "fc_demo_constant.asm" ;NES常量# d2 o4 r! X4 r# U+ [' q1 u" _
- ;======================================================================
0 E3 x) T9 `4 I9 J# f6 q - ;音乐配置8 j2 n# C1 l: Y
- .IF 0 = MUSIC_THEME
9 b% c9 L: j( e* X/ e; V/ C. O# V2 F# m - .INCLUDE "data/music/Gremlin 2/config.asm"8 Z* I8 r4 H' Z
- .ENDIF2 P1 y4 f$ { _1 s0 e. V
- / O# P: j, _0 {7 M! x) p/ |
- .IF 1 = MUSIC_THEME' a( X3 c/ X& O6 ]! s
- .INCLUDE "data/music/Raf World/config.asm"
" _" `9 S( Y& Y) M - .ENDIF) W D; R/ M# @( C) x0 T
-
|* O2 x- c( ` C- H3 s. g( P- X - .IF 2 = MUSIC_THEME 6 X% n0 @# T P9 D9 T8 c
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
, p: o/ D3 t! | - .ENDIF, v, z" e) e/ I* M' l1 w$ }
- a2 m' ]0 D' H
- ;======================================================================
; s; r; G; Z7 Q( L6 u7 l* J- P - ;引用CHR图像数据2 O3 m3 a) @5 l
- .BANK NES_16KB_PRG_SIZE * 2
" b8 ~: X; T, g: @ - .ORG $0000( h7 s$ z" I: C L- q
- .INCBIN "data/bkg.chr"3 O2 R/ S0 ]. }5 j( v( ^2 g3 d
- .INCBIN "data/sp.chr"' b8 G$ f" F) g$ d! w+ i' A
-
; x+ P+ f. f# v# M/ D4 a" f - ;======================================================================! S% G# ?% w" c" V! m9 F# J& v; ^
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank) {) O, O7 M! _, F& d
- .ORG RESET_ADDR8 A3 n6 G3 T* M) \# i! ~
- ;======================================================================
/ t4 r* Y3 ?7 d - ;引用其他源文件9 k w1 X, s) J \. D8 I% `/ F
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
0 s7 l( c! Q) b. H2 a, A4 ^- ~ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
6 C3 `1 }. F8 z9 G* p - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
# ?. Z) i- F: S$ Y - ;======================================================================* e+ P6 y% G0 X1 }
- 4 U) u9 A# f9 R
- ;======================================================================/ L' @$ g/ f2 ~9 A5 [5 W" X
- ;等待VBlank到来
& ~1 S o" R6 h. r6 K - Wait_For_VBlank1 R" w1 m0 |( S+ p6 @$ j& w2 I
- LDA PPU_STATUS* Q. I; y* i* U p
- BPL Wait_For_VBlank
6 V; }8 o9 c4 u, k) n - RTS2 {1 _( `, a. y# V! L9 n
- x5 c, u$ y6 Y+ z- ;======================================================================$ ]) c& U: H9 d/ ]
- ;调色板初始化
q6 ]: F$ k3 m& u - Palette_Init
% G, F U; y" [$ U- U/ X# y8 ] - LDA #$3F: N3 Y' Q M8 V1 ^& h+ i1 F( e
- STA PPU_ADDRESS
# X) a: J+ L; G7 |; v - LDA #$00
( o) |3 L1 a% g- P - STA PPU_ADDRESS- \6 j! g/ j/ }3 D* O" T+ x
- LDX #$00 b9 F' J" V4 N: B, Q0 c7 Z3 K
- LDY #$20
* U' \9 d) j/ ~4 m% b/ L" \$ W - .Write_Data
) u& w" b' P$ V/ M$ ~: o - LDA Palette_Data,X
/ F# j( z# t: P |8 _2 I - STA FC_PPU_Pal_Addr,X' q) o) ?" h6 d U: k; {: ~% z
- INX
8 W; g* R0 k- Q& i$ x* o9 c - DEY% E; e$ c: s/ s6 v- u
- BNE .Write_Data
0 K/ E R# K4 [% y3 C S2 W - .End
6 n d( Y7 Y. o( p! m! h - RTS; i. w3 x( d6 ?9 u. x; |
5 U* ]' [$ G7 R- ;----------------------------------------7 }- W$ e" G5 ?/ Z I2 [
- ;调色板数据6 G% ^6 J0 e1 M4 X
- Palette_Data
0 F- u" J! a. B( @7 I - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
/ X+ U, h: u$ x/ q1 E - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22% d$ o. b4 P+ }; K1 ~( D9 u
- : e- H) t1 i# K9 L" L g q; T
- ;======================================================================
1 e% e8 c. l/ V8 B( s - ;命名表清空
- O3 B3 P1 P& I: N - Nametable_Clear
. \. N/ H/ v0 d5 |; V w; z - LDA #$200 B4 |; D8 Q6 ~
- STA PPU_ADDRESS
8 M7 T# ^. D. {( x - LDA #$00
) g- {: g; e' i0 h - STA PPU_ADDRESS# _" d0 p: D" D$ x8 a: Q! ]
- LDA #$008 X: O, X8 w- n% l) f) W7 K9 l
- LDX #$00
: i6 s$ e& O) f( P4 ]6 k2 y - LDY #$08/ B8 D! H: [0 U( E
- .Write_Data2 i/ @& Z% C% c3 g
- STA PPU_DATA4 r' c# _' A# o7 L/ [/ E
- INX
s% e9 c% d1 u" ]7 w - BNE .Write_Data6 h9 F. M" O" e; D) y5 ^% R( N/ D
- DEY
) q% ?$ I& z+ ]- d& l& w& H - BNE .Write_Data1 ^- d5 u3 O4 B6 E
- .End
) N. T4 ]6 i5 T' Y - RTS6 I+ ?: E4 h' J# \
5 o& b+ T# C# G4 d) d7 v5 w. B3 u( j- ;======================================================================
* `* A# \- O9 c7 J; _* d - ;音乐曲目切换$ h1 r" @' m0 U6 G. u
- Music_Select_Process
* r9 `" M# l9 [& Y, D
2 U) N5 ?2 `) K# J- .Pre_Music;上一曲
) g/ W, V+ U2 g- B3 H$ A6 {/ `1 ~ - LDA FC_Gamepad_Once3 J: U* l8 q9 `) e% Q+ i; Z s
- CMP #JOY_KEY_LEFT+ l3 T0 e! @$ i) G8 [( q
- BNE .Next_Music$ M/ I9 F) U3 m' E+ c0 i
- JSR Music_Play_Pre
, d5 o- W- g0 g! a, ^5 R - .Next_Music;下一曲
1 c! `( n- `* j9 b. I - LDA FC_Gamepad_Once
( E& h* v" o9 A - CMP #JOY_KEY_RIGHT
; w# E- J% F/ M7 p# n, v Q# H- f4 [ - BNE .Next_10_Music: e# N# Y1 C; @# t- Z! B
- JSR Music_Play_Next ]; r+ F+ }9 z
- .Next_10_Music;上10曲
2 u. @0 z6 \6 O/ j% d) k - LDA FC_Gamepad_Once9 n& B9 g: {2 c7 w5 \ K" O
- CMP #JOY_KEY_UP
0 C! v! h/ j: } - BNE .Pre_10_Music+ E; f2 q' m4 I* F; N' F
- JSR Music_Play_Next_107 }) l! y* t* u' P
- .Pre_10_Music;下10曲
6 c8 m5 a! w0 u* O4 L - LDA FC_Gamepad_Once9 N3 H( U n% W/ @2 A
- CMP #JOY_KEY_DOWN) d; o2 B) J, q I/ @( W" s9 _
- BNE .Reset
, ]; b5 t. S; S4 L: B8 }3 |( v( v3 l - JSR Music_Play_Pre_10
5 P% Y1 \$ X7 h0 g0 D' v" f6 g - .Reset;重播当前曲目/ v# |) s H3 g; w: g J
- LDA FC_Gamepad_Once6 h. x+ i- V/ Z+ z2 O( j
- CMP #JOY_KEY_START
. |9 U% ?( e# U; L4 r - BNE .End
7 P7 o, q) ]- R4 e4 p - LDA FC_Music_Index
8 {# S5 O2 ^) p% F8 R$ i! | - JSR Music_Init_Process
* C3 l0 X- M! r# `/ W8 f& P! O0 P - .End7 r+ k7 I8 C2 e9 Y: t$ B$ ?0 Y2 C
- RTS
3 p3 x! ~; L; A" o' k - 7 s) q) T- [+ T
- ;----------------------------------------------------------------------( F( m& G. k1 {/ ?
- ;播放上一曲
: `; f H5 { {1 R/ P - Music_Play_Pre; D+ W1 i; r0 r* S$ [
- LDA FC_Music_Index* A3 N* e) j+ w0 V4 V* H& e a
- BEQ .End
- D! }: I: @ c/ @$ k2 J - DEC FC_Music_Index! j1 s# }# Y: ?$ r
- LDA FC_Music_Index1 `/ k; {5 d, s. w* [4 n- U/ g, j. t
- JSR Music_Init_Process8 ~& g5 O0 u7 N
- .End# Q# C& E. Z! ^
- RTS# P; P: _3 Z5 q" P& n' h1 E J
- ;----------------------------------------------------------------------
2 w3 R7 \5 V- P m& D4 h* x - ;播放下一曲
v! r L5 ]8 @. |- F - Music_Play_Next" c. g5 j; q+ A$ d9 c
- LDA FC_Music_Index
[7 D' g2 {* H) a; Q/ _ - CMP FC_Music_Max_Index
9 r6 p& c/ [% Z+ b2 t - BCS .End* N6 \3 m9 n k* e
- INC FC_Music_Index
8 O* Q5 v. r* n, c0 ?( o F$ M4 e - LDA FC_Music_Index
3 e. ?8 W& X! A- r - JSR Music_Init_Process
" O- ^$ E! a s - .End6 a3 B) V9 O0 `& J" h
- RTS+ k. \$ F% ^$ `1 j8 e
- % ^! Q8 \. K9 m0 I F2 g' _
- ;----------------------------------------------------------------------1 f7 G5 _8 L$ z6 r* c& x
- ;播放上10曲& Z0 I! |" c6 }6 y
- Music_Play_Pre_109 M8 w, a7 b+ z! s$ Y) J( u
- LDA FC_Music_Index
* v9 x& s6 n( @9 o8 O3 o - BEQ .End5 A8 R3 x5 e4 V! w6 W0 c9 t2 F
- SEC
' {% }, S! p# { - SBC #10/ g1 ]! k* P" x' L( u$ I( x
- BCS .Pre_10$ E& A9 |* |# z0 X
- LDA #$00
% C* q) z5 M' J; }! F2 C& Y( C+ t - .Pre_10
# D) Y- p4 M0 \ - STA FC_Music_Index D. P& k6 D- ?- \
- JSR Music_Init_Process
3 g. y, a- u+ a. Q3 n4 g) U - .End
) K4 H2 T: b6 j# s - RTS
) v$ L( P/ N( e( ?. q! H - ;----------------------------------------------------------------------" o# ?- }+ K# e0 Q7 m/ v* x
- ;播放下10曲
2 M9 x3 E" l$ }% _ - Music_Play_Next_108 i( t( A3 y% }" W
- LDA FC_Music_Index1 y4 Z. s+ g3 i
- CMP FC_Music_Max_Index
) Z6 G; O$ w8 D. q* K+ }3 A5 _" c+ O - BCS .End
4 ]* o" v/ y. c6 i) W3 r* O9 W - CLC
$ A4 H: e( p1 V) m - ADC #10( s9 V9 L# z; U4 o8 r# u8 T0 x* s
- CMP FC_Music_Max_Index
: q4 Q8 e$ b- Q0 @ - BCC .Next_101 r9 z/ V. I. n1 c6 E6 b' }
- LDA FC_Music_Max_Index
. ?' N1 i- |1 c; L7 n$ \8 m9 e - .Next_107 V* X; {- |. }2 i5 N* i' P
- STA FC_Music_Index
/ g6 ]$ t/ z3 H( g" s2 y4 Q5 [ - JSR Music_Init_Process
9 a( u. b0 n7 l' p6 V. h) ] - .End
8 ]2 g( v4 h- X% F5 j6 o* b! o - RTS
0 K, m7 L8 K$ K6 ~ G- } - 6 v1 S4 G( h# i y; j W' v& k
- ;----------------------------------------------------------------------
4 L3 Q" Q7 {- I7 Z: A - ;8位十六进制转3位十进制制
! }0 T( H5 x' @+ G4 K* g9 E - Hex8ToDec
% x- d4 r, U1 F! F - STA FC_Dec_Data_1) p: Y2 R5 x7 P
- LDA #$00, @1 K4 I3 h5 b0 c* w( Z! g
- STA FC_Dec_Data_100) Z8 e# Q" d6 D7 l6 r! ~4 O
- STA FC_Dec_Data_10* ]+ S& P3 U0 b i% ~! f
- LDA FC_Dec_Data_1% B% m4 K$ e2 n* r1 E! Y
- .Convert_100
# V% V' E' D( H" r/ C7 T) ] - CMP #1002 e4 O/ N( m: E) U
- BCC .Convert_10' b! I: s, M0 g! F, F# u
- SEC
4 S5 o' M" H" x+ ]" I/ q& N# ~! L - SBC #100
* y; q. H' }' b4 G - INC FC_Dec_Data_100
0 V: t8 Q9 x* ^8 i O& K$ N! c$ m' A: B - BNE .Convert_1007 I {* u+ c' b
- .Convert_10
; t1 B% ^9 O# ]4 S) W. E - CMP #101 | K+ A, ]% I4 Y
- BCC .End+ M& K N4 H. Q) o+ B
- SEC- T" Q9 E# c+ e* P, g5 x
- SBC #10 E( x$ @& e o3 Q4 F& u" L
- INC FC_Dec_Data_105 v8 k6 R6 s8 T: ?' f8 I
- BNE .Convert_10
3 Q% K; | R& j( K: [) m# W# I9 P6 }! H - .End% O: W" m; f0 [) J8 p \, w
- STA FC_Dec_Data_1
0 ]: z' S- j* Z2 I5 ?( P& F* | - RTS
1 O* i0 ?! ^+ O P6 ]
% c; T- i5 q/ t5 C4 \' ^5 w, x- F" u- ;----------------------------------------------------------------------
% P( j( Q3 h$ }# b3 L, I- l - ;显示曲目信息1 o* b/ z* o( w) x6 {
- Music_Info_Display
8 ~2 Z0 C2 j" M h - LDX FC_PPU_Buf_Count
, w" ?) r, D7 w7 c( H& T: q - LDA #PPU_WRITE_MODE_CNT_LINE0 t' ^0 Y% L0 \/ s1 l! j# |
- STA Use_PPU_Buffer,X
9 @5 r' {8 S6 n% L* n, } h - INX
" w) p: }% Y& g! Q7 Y- f, V - % Z. U2 ?* @6 A" G
- LDA #>MUSIC_INFO_POS
" @. ]0 a1 N7 E: y9 } - STA Use_PPU_Buffer,X
8 p' b* F6 n4 h9 Q" \6 x - INX
, F9 O" A0 D- J) `3 J* d1 c -
! e6 o" w- ^+ e! ^& J - ;居中
8 c% u' j. ]1 \+ a, ~ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 @& z) j6 V$ {5 F x3 d - STA Use_PPU_Buffer,X' A! k1 z. q; Y% q1 E D& B/ ~
- INX: r0 s+ E" A) H* f3 ^
-
0 U0 x. S+ J; i# @ - LDA #$059 |$ b$ M+ K4 i- S2 K: Z# D( l. o
- STA Use_PPU_Buffer,X$ I% n/ I+ ^1 M( R" H$ o e
- INX
! R G. W7 m' l, S9 a3 o -
+ S& j7 I3 [- G - LDA FC_Music_Index! Q5 ~2 Q/ d" J7 B
- CLC
8 y0 ^# B1 R6 i, p - ADC #$01
U7 P* N4 m/ {1 F - JSR Hex8ToDec. g8 q9 Y' q% y6 W& R1 q. H+ Y0 Y' G$ ]
- & B/ H6 o2 U! Y! I- j0 f
- LDA FC_Dec_Data_10. d# Z) S. W/ Z/ E
- CLC7 p/ c# g @8 k. K
- ADC #'0'
5 M4 k$ w% b5 S7 \4 V1 y - STA Use_PPU_Buffer,X7 V7 I0 m, Z% C# Q% A
- INX( w E" t1 Y# k. \0 n, e) ?0 m
- ! D( c- y w$ V5 L1 q$ o/ p- d& X
- LDA FC_Dec_Data_1
) \9 _) E$ H3 u* c4 b - CLC
9 n& u+ _& X: T, |7 H9 B0 M1 o; z - ADC #'0'
9 p) ]' X+ B- B* U$ ~# n% N - STA Use_PPU_Buffer,X
4 j8 h! I7 Q* l. v* ] - INX* Y4 r# Q1 l5 r5 m8 z8 |
-
1 z( S8 a |5 B" o# R - LDA #'/'
/ [- P% A8 g4 C8 ~6 ^ - STA Use_PPU_Buffer,X
/ p/ D# ` @1 _9 r& w/ T6 p - INX; e6 m p$ a6 w7 W) {9 ?& N3 r
- " n6 X$ s" L, R+ B% k
- LDA FC_Music_Max_Index
9 k% `7 E3 i* K. D' @, @8 ]4 ^ - CLC
, q: T1 z# Z& ]% d3 |9 G A* A - ADC #$01
% E5 G" o+ M# _' I - JSR Hex8ToDec
0 I: B5 G5 V7 G7 b -
4 ~) J% V6 F( G7 C7 C - LDA FC_Dec_Data_10
$ |! J Q( g% {+ Z2 _7 @7 _2 P - CLC& d" \0 ]2 O6 ?* w
- ADC #'0'( j1 V6 C2 e. }0 e
- STA Use_PPU_Buffer,X! j) v) B9 M# ]! w3 }8 }
- INX! y, J- x3 F( d- S! h3 t) h
- & d' f. s9 b% V
- LDA FC_Dec_Data_1$ G- Q1 ^5 R+ k2 G h* Z
- CLC
3 c% q' `0 W; S+ U8 | - ADC #'0'. \. c" b! S/ ?4 r, | j c' x7 {
- STA Use_PPU_Buffer,X( {3 c0 t8 C- b. U4 e. B# Z
- INX
- W$ H. X5 {: J - ) w- s' V/ U+ x/ ~3 g' ^
- .End
p& {$ J; ~( c7 {% c+ T3 D' a9 p& g - STX FC_PPU_Buf_Count2 Y0 W. k- Q( I7 M1 T' Q& F/ S
- RTS6 x0 x, Y* ~ ~) N% v8 J$ |
7 C# ]% e4 @7 [. Y% d3 T- ;----------------------------------------------------------------------- j) c0 O. m0 c& {- V
- ;音乐曲目初始化处理
* h7 m2 R% d5 f; w' t# G5 I - Music_Init_Process
0 ~. `/ b3 ~& S7 k) B - PHA% d" c$ r6 E; H/ m. q
- JSR Music_Clear_Process
& w5 A" S1 B! e3 B8 n - LDA #$1F" ~1 }2 m/ Z. Y6 h
- STA $40154 O" c( h# V$ T8 r( H4 V( E
- PLA
2 M; [9 T/ {- z/ b# i8 D0 ` - JSR Music_Init_Addr
- j k: Y' h1 _' D8 e( |1 X - JSR Music_Info_Display6 T1 M; h6 V' S4 A1 I! w- I
- RTS
; C _# f* A$ H! I2 L0 m: }" K - . R/ D. u$ g: z$ X8 f) [, D
- ;----------------------------------------------------------------------! g/ s" N! n' j6 Q
- ;音乐播放处理
3 B) d3 u. |; g: q, y4 A" m- ` - Music_Play_Process& \6 p9 r. @) x4 B
- JSR Music_Play_Addr
, `$ B( L, K9 b8 N. w2 ? - RTS( y+ r# x8 i j. T- V
- ' s$ y; a! `* B4 P* N5 f, s# n5 o+ g
- ;----------------------------------------------------------------------
0 I& w3 r& U1 Q7 l* w - ;音乐播放处理) z5 j, s0 r5 S1 P0 c: }4 i3 A
- Music_Clear_Process
* F0 K% ^( G7 L) w - .IF Music_Clear_Addr
! p9 K- i4 x5 ^# k1 V* W - JSR Music_Clear_Addr
; A- w% `9 K5 S' \$ z' x/ K - RTS( B3 M0 w4 b6 |# {
- .ELSE, k: M Q1 _; w7 Y* b- M" _6 R4 D
- LDA #$1F. x0 ^' i" [$ s2 e, `8 z/ N
- STA $4015
1 x# x/ \0 }5 e1 w+ U* R - LDA #$00
6 T9 l; h! ~) }( \# ^; P - STA $4010
! ?6 P/ I7 E; n7 _0 f2 e: [9 r - LDX #$00
9 |; }2 d. W: j4 o( G - LDA #$00# Y8 j% ?) D/ p! ~$ m
-
0 G1 n0 v. ]# O8 Z) L9 e3 x; n/ ` - .Music_Clear_Zreo_Page_0
8 C$ c& T7 B: \9 v - STA $00,X
$ r+ L- K* x. [8 _6 _ - INX
5 K, _/ s7 F# ^" n$ z - CPX #Use_Zero_Page_Begin
& A. L' J3 h w& v! H( u - BCC .Music_Clear_Zreo_Page_0$ `! C4 [* }4 p8 d3 o
- ; Z3 B' `0 \4 @ q
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
* ]& |7 z3 \9 ] - .Music_Clear_Zreo_Page_18 q0 Q) \ Y6 {* K. j
- STA $00,X: |% l. ~4 \( Y4 \, b
- INX
' F/ y9 @9 E6 s3 B n' K - BNE .Music_Clear_Zreo_Page_10 Q9 U: r% v* T2 N7 y- D5 |) x
- $ T" k9 X- P/ T3 v. V( b* n" d' M
- Music_Clear_Process_1
7 u: b. Q- t# ^5 o) L/ a - STA $0600,X3 I4 g' ~. }+ t) p) ^
- STA $0700,X
6 J; Y, U% u$ l" t. T6 V - INX
) I4 S4 e0 X8 B, V, F/ [ - BNE Music_Clear_Process_1
4 D1 U+ ^) U# g4 x1 H - LDA #$104 m) k0 h" P" L9 Q
- STA $4000 P& N/ |8 B2 Y8 x
- STA $4004* m* j+ D% {: N- U0 G
- STA $400C
7 A5 ~ O7 S2 G2 O. T$ G& i* q - LDA #$009 U% x( z% v* H- V ] @
- STA $4008
5 C4 W: x; E, `9 q+ L* t - LDA #$0F
( ^8 V2 y# Q" q+ `. Z$ b - STA $4015* o3 \% Q) L* A- T/ E" J
- .ENDIF
1 r/ f& o5 Q$ }; f7 r - * d: t1 `" Y9 j9 x/ O) c5 S4 I" [& x
- RTS. a1 V) e2 p+ { P
, p/ B: y% k! o; B# B# a. A- ;======================================================================
2 h: d6 R# @* y9 A! O# a! l - ;重启处理. s2 [& E/ W+ y R' b
- Reset_Program- Y6 @ Z8 o z% C
- SEI5 A6 t: e5 @+ Z; s! W" m/ T
- CLD# H0 H$ R2 o! X& K6 v
- LDA #$00
# g0 y! y4 X$ Z Z" Q7 o - STA PPU_CTRL1 M. g) `" n5 V- p( j- L+ M( B
- STA PPU_MASK
N6 W, u6 f/ ^, I% w& v% a" B - STA JOY2_FRAME2 ~3 h2 y1 |$ {2 P6 D
- STA APU_STATUS, B+ I& a8 U8 v" |1 }3 S+ @& f
- & A* l+ J/ d" R& _- s! O+ e1 u: x6 d
- ;等待屏幕准备完毕
: x8 `7 L; X! p' x8 ~* A+ @$ f7 g - LDX #$02
g( ?, A9 y; Q; ~* E - .Wait_For_Screen_Ready/ J( n) U E" J( X P9 D0 k# B
- LDA PPU_STATUS
# l3 n j/ @0 f3 N - BPL .Wait_For_Screen_Ready1 \# b( c W6 a0 Y* U& o8 m! T
- DEX& d3 B$ T/ I% Z* F; ]
- BNE .Wait_For_Screen_Ready1 Y9 G- w0 t, Z, P3 S! [9 b# R
- ! r7 u" Q$ E! n& t1 U5 u
- ;清空调色板
0 R7 C/ Y C/ L3 w - Palette_Clear' R% r& {7 q' @* x4 S/ C0 w
- LDA #$3F
: U; U4 U6 Z1 [3 q - STA PPU_ADDRESS, L2 Q% F8 z2 m: Y, D$ i. a: x
- LDA #$001 L) P2 P; n0 l- l% B
- STA PPU_ADDRESS
& ~; N) z) e3 e, n. k - LDX #$20
$ w+ F' Z8 W# p: m - LDA #$0F
0 C' x- S; Z: k* D" Y: } - .Write_Data
$ T+ R9 R) ~7 y7 B2 F. z. w$ t. G - STA PPU_DATA
1 B7 D; m6 |" E9 E, d - DEX5 I7 l. p& D _7 @6 v
- BNE .Write_Data k. d) H4 o1 p& i q
8 Z* Z5 r/ x* |1 ^7 K- ;清除声音 $4000-4013$ L/ r! m! r5 y
- LDY #$14
8 [# q3 r+ f. z5 ~: m; S - LDX #$00% E% N3 Q1 r3 G" r7 f1 `# c, N
- .Sound_Clear
e1 o0 W/ c' f- H' F - STA $4000,X
) E; x) `5 T+ H1 i1 c: Z. `5 B - INX, k4 S, t; _. m) O2 E
- DEY7 |6 P- G! r; @" p
- BNE .Sound_Clear/ _) _/ C3 L% p. w- a
- $ P+ Y5 Y! M. A0 s- \% H9 r/ ~
- ;清除 RAM $0000-07FF5 a' b, `) T# K }2 q- b* F$ l
- LDA #$00& `/ ~* k1 x& c4 c5 u
- STA $00
: \7 H' f8 d5 z1 ?$ x' S/ U - STA $01
) z. u R$ E! N - TAY
9 }0 c8 S" ^5 K - LDX #$08
K5 M& _6 s$ @" ~( Y7 ^1 U0 v - .Memory_Clear% Y# q6 _6 ?& Z0 `. o2 l
- STA [$00],Y, ~( u2 t; e: Z5 o5 i. e
- INY" _8 Y5 U' q( d3 M
- BNE .Memory_Clear
/ B% K1 l! y$ y8 m* N - INC $01* `" [; K+ a& \) d' t J) j
- DEX
0 {( ]* N9 c: T! E0 k - BNE .Memory_Clear
! u9 D1 K9 S3 S) U' ~; A - 1 ]/ h# E K& F0 \% d
- ;精灵缓冲初始化
! L% V r! M+ ~ - LDX #$004 q& \; O% ?! m$ D# [
- LDA #$F8
! {+ V- G! c: F6 @ - .OAM_Clear
9 }6 d `* e I9 }% D - STA OAM_DMA_Buffer,X
. g+ g: f3 O$ C8 [ - INX- s8 r, `, r/ L; r6 O7 t: @
- BNE .OAM_Clear/ }5 r, Q1 B; m
- 6 @- O& Z3 {$ J2 ~) a" X6 W
- ;栈指针初始化3 W4 [& L6 U6 Q. {" D/ d9 {1 q
- LDX #$FF7 W, |4 z5 h. d' Z7 D8 V q+ Z
- TXS+ P8 ~* ~; ?( e) X
-
' R) o" \, m5 j* o( M - JSR Nametable_Clear;命名表清空
9 }. h* v0 y/ H# a0 p S - JSR Palette_Init;初始化调色板缓冲
; C$ q/ S( e7 H: c - JSR Static_Text_Init;初始化静态文本2 B& B0 ?9 _# k- I+ {$ O6 A
-
( J7 i, D6 n4 z; `3 e - LDA #MUSIC_ITEM_TOTAL - 1
9 k6 q; {1 `0 r0 B8 G3 u - STA FC_Music_Max_Index
9 v$ v/ F! f( H0 i! W, q1 W -
6 O1 E9 b) w) F4 F% l3 o2 [+ @# t. t - LDA #$1F
% V7 x( Q+ K( d$ [3 j - STA APU_STATUS6 C1 C$ S/ Y$ s0 S) k
- LDA #MUSIC_BGM - 1
6 m/ r' U! y4 @ v - STA FC_Music_Index3 _/ N$ N- k3 v6 _% ^, v$ N6 L
- JSR Music_Init_Process;音乐播放5 h7 L4 c8 o2 [* r6 Z
- ) s% O1 A/ C- W0 U) |; V: y* I
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)+ G4 I8 s n7 Z `; R
- LDA #$1E
0 ?) z1 x6 t. U% y( ] - STA FC_PPU_Mask_Buf1 o; k: w( m" K/ g0 o) m* L" e5 t: A4 w
-
' p( X0 Z6 k" q. F4 \1 D - ;启用NMI处理
: h. g) r5 T( v2 M- Q+ p - LDA #$801 b E# E! m( t9 L
- STA PPU_CTRL
: h9 q) o5 ]/ [! X - ) J! h$ T! T/ p. O. V
- ;程序循环, 剩余工作交给 NMI 中断处理
6 _6 U1 A+ l4 K* v - .Loop- g: t6 p0 d. R: B+ L
- JMP .Loop7 h5 J- K. v$ @0 A4 V' _$ X
) v) s B( J( z2 v' v- ;======================================================================
" j9 A- o- d) D - ;不可屏蔽中断处理
7 a+ O) p) @9 f0 ~$ f - Nmi_Program
; z: y& K! W5 k' S. G( }8 I m - PHA+ D% a7 p/ ^/ D
- TXA) f7 d6 ]- W' v$ y6 I. |
- PHA
$ p$ z4 M: J8 l) T - TYA
0 R+ T+ j! I& f b: X - PHA" _0 g4 p1 s: P- x( i
-
3 P0 D% {4 ~$ `4 t - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
3 u; I4 w5 w" Y& n+ e3 m ? - $ R7 V9 Y R- Z! y2 u1 |; J
- JSR FC_PPU_Procrss;PPU处理$ n# P) L; N& r% i0 {5 \6 X
-
5 ~. R/ q3 S6 |4 P - ;精灵内存更新
6 m8 K) @# S: r( {1 Q! J! V - LDA #$00
& U. B, A. h3 B& N* Q+ e - STA PPU_OAM_ADDR: Y" g$ \# k. ?9 x- i9 B0 U
- LDA #OAM_DMA_Buffer / $0100
7 l3 ]# M4 m! B5 u& I4 p - STA OAM_DMA
( r1 Q& b2 w. \% c" R -
) I5 o$ X4 m* l2 U - JSR FC_Gamepad_Process;手柄输入处理3 z0 u( N& r" r& q, k
- JSR Music_Select_Process;音乐选曲处理. x' n7 P- C. p* h( K5 p* w, X) b2 \
- JSR Music_Play_Process;音乐播放处理
P% i9 n. x( L# A/ b- q" T1 w/ D -
) i! v* p5 c ^) w. O) r - PLA% J! R; O5 t: l, {) D. a* p2 E
- TAY
: l2 ? Z, Z+ J! Q( _! k7 T$ W. K - PLA
& ]5 P! ~; o) U0 [3 A - TAX
4 l5 D+ u* [7 @" e& j - PLA
, x/ r* \9 s2 }) }% Z/ l6 t' u
% g; _3 m7 @5 L3 I- RTI
! [0 G- I9 y6 g6 {. } - 7 m0 X6 M' E& X4 \/ |
- ;======================================================================
5 E) @- _( z6 C* I, v2 I6 y1 m& ] - ;请求中断处理' x7 k2 W; `$ t% k7 z1 y+ D. r% M% ~
- Irq_Program
6 G$ ]! _5 |- U# z, X3 X1 j2 k- f; F/ j - RTI
0 v% Z, k1 q% V+ ?) e9 u; p
' o+ Y8 @! S( S% f4 g: s) J- ;======================================================================2 X& t1 ^8 `! m! }! ?; Z& ]
- ;中断向量表
2 V3 k1 P% K( a g - .ORG $FFFA
1 A+ _( K7 D5 \ l5 a* J& l1 F - .DW Nmi_Program ;NMI触发时执行
2 Q7 u+ i& K0 ^ - .DW Reset_Program ;载入ROM时最先执行
, w: R9 \3 L% j/ D* V$ S' B; T - .DW Irq_Program ;IRQ触发时执行7 j1 {. t! j7 e+ w+ K
复制代码
k0 w# ]* y* a' x& ^) k) A. Y' G9 ?0 J; Z" N2 Y
: ]* ]0 T6 B/ B6 j qhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|