|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' V& D3 j8 {" c3 i* }* ]8 {

, V6 I+ _% ^* p' d$ }+ S7 I& \$ b% s0 q以下是主框架代码:' i1 J& Y: | `/ \' S6 ?9 v
- ;======================================================================
q3 Q2 A/ E' B$ k T# y - ;文件头& w; V# S/ S+ [+ E- U7 r
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
" @/ m8 B9 J8 a1 b+ m9 w - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
! m/ K) T! t* I N/ w - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
0 ]& y" l2 ~2 ^! G2 u6 J - ;======================================================================
' B+ z/ U4 u8 H9 {; w - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
, ^# P" B3 Z* Q6 A - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, Z. F! i# p8 a; { - ;======================================================================
, x* j7 j, X) w) I6 i7 l - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 13 S C5 b0 ~( N0 z+ y
- RESET_ADDR = $E000 ;主程序起始地址6 J( T( S+ R v, R' z: @1 K
- ;======================================================================7 M! M6 X' W+ G0 n
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB5 B4 J# i5 f; j) r
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB% y& t5 b& J- h7 W% F* j- x* a; |: L
- .INESMAP 4 ;Mapper号 (0-4095)
& o% Q+ n, o& q; H* p- F - .INESSUBMAP 0 ;子Mapper号 (0-15)- j3 T X& J! g7 z: |. e
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
% U! [8 x( X) i6 y. K - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. s# d' R' @/ L$ j - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
& N' R2 x4 I( M4 ?& O - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
8 Z/ W8 M' {. \5 c) O - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 Y3 y$ W: @- x
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数): j B. i+ n" D1 W, ?* y
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)) g& S3 I. Q: C/ |2 u1 |; k5 z b
- ;======================================================================
7 K Q- v* X l4 b5 ^ L8 D/ _ - .INCLUDE "fc_demo_config.asm" ;全局配置
, z4 O4 a" S* E3 W9 \ - .INCLUDE "fc_demo_constant.asm" ;NES常量; S6 w) K" |; S3 A* O# q" R5 \
- ;======================================================================7 ^; A! |/ G$ D) x, p( ~
- ;音乐配置8 s* p9 A f q6 Z$ e- H: r. Z% E
- .IF 0 = MUSIC_THEME " l( ~7 ^; x# G! E+ r; M6 `2 J) T
- .INCLUDE "data/music/Gremlin 2/config.asm"
0 }* y( n7 i5 I+ @: `2 l* G- k - .ENDIF; _9 S# F ?) O
-
% r+ s, Q4 J" Z# U - .IF 1 = MUSIC_THEME
; { G$ A! o. s - .INCLUDE "data/music/Raf World/config.asm"
+ ~8 n+ y3 {* V# X - .ENDIF; ]( y, ` x. [1 ] O" V
-
: o/ q4 A1 C& X' M - .IF 2 = MUSIC_THEME _ L3 X8 m& ^5 U
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ G/ l' }% I( O! y$ t# A% J9 i - .ENDIF
+ c6 g! [0 N( ^8 o( t - A$ o4 C+ J6 z8 _
- ;======================================================================9 x* m4 m7 g* c" N3 M' b
- ;引用CHR图像数据: P5 z6 k8 E4 K, I; Y
- .BANK NES_16KB_PRG_SIZE * 2
/ P; B- t4 W( N. P5 d3 o - .ORG $0000; S0 |' L' \& i; W3 ]+ b
- .INCBIN "data/bkg.chr"
& F6 Y/ L& o: [+ M' s/ ^ - .INCBIN "data/sp.chr"
. q; ]0 a8 H/ e8 `1 Y/ L9 | -
' H4 `/ w* _- q - ;======================================================================
3 l7 u4 [, k% o& [ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank e7 K7 p7 y1 V
- .ORG RESET_ADDR
, V+ n+ `1 r6 P3 G) w - ;======================================================================
% j8 g: y% h4 s3 g- N - ;引用其他源文件
4 Z/ j0 p# `9 m* i6 g - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 j i: H. U# G5 T - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
* ]8 F2 R' [+ K; v& h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% G! C- ~' Z* p; n# o - ;======================================================================
. t+ \3 }6 U6 f% c% I, j8 O$ S' h+ ?
# Z: b. Z% G* |7 _, O7 c& I- ;======================================================================
1 Z; r& k4 R( [0 l6 W; c* l3 {4 P - ;等待VBlank到来% c7 Y$ m# f3 ]+ A
- Wait_For_VBlank
" b2 |- z# b" N) q2 z( Z4 \' F0 W) F - LDA PPU_STATUS* R( L o! Z- K
- BPL Wait_For_VBlank2 b) D& w% n0 K8 i
- RTS
) |: d% u% ]+ L' q/ k! b
. k& `8 Y% y( U2 G9 ]! T- ;======================================================================
) }$ Y5 W( `+ g: \' `, U - ;调色板初始化$ ?- U! J: _. T% U; o4 q b
- Palette_Init2 ?# v+ e# y# C; i
- LDA #$3F
1 c. o" ^8 r6 L9 c# W - STA PPU_ADDRESS
6 i# }) K; m2 ~, J - LDA #$00
& J2 a5 {- b+ F7 h- n& c - STA PPU_ADDRESS. K; o4 \( b8 B |
- LDX #$001 ?8 x9 Y! j* u$ {3 \
- LDY #$20- N* _& d& G r; i
- .Write_Data
; @- K- ^ Z6 g7 S# v - LDA Palette_Data,X0 w6 n+ D- X/ o# y# e4 p
- STA FC_PPU_Pal_Addr,X
. E* U0 Y! I8 u* d - INX
, K1 T- T, v: n# b6 \' J, j - DEY
( k) E' Q1 M5 m8 E+ a - BNE .Write_Data3 k5 p7 @; D& W1 P
- .End# h8 V, h2 e* \
- RTS* E0 d: u2 [+ F! d2 R
- % l4 o# y/ b x: j1 t8 u9 y
- ;----------------------------------------
1 F9 s3 U6 O5 j; ]; x6 _3 z - ;调色板数据. | i: w7 X$ I7 S6 E
- Palette_Data
* c4 t, `" Q, h- {) I1 B1 {* t3 u - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B2 q1 a- [" |" t, {& s Q! H
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22$ D, t% d5 |2 E% ?* M
-
: v5 t+ V3 Z5 b7 M9 D. O8 e3 x - ;======================================================================
* ?1 c8 ^4 `7 @* ]: S0 q - ;命名表清空
H( t6 ]) o$ {, D" q - Nametable_Clear3 w% ]* e) X, T; c% F4 m
- LDA #$20) i; ^# d8 Q3 @1 t
- STA PPU_ADDRESS6 F w/ H" [0 |" d, u* l# ?3 B
- LDA #$00# U, ?2 s' h; y* U. U! j$ w- ^4 o
- STA PPU_ADDRESS
. B1 S! y) f8 F5 p - LDA #$00
& \8 N2 F, o3 @- m3 q2 e0 O - LDX #$00 B" _1 U7 w' ?( G6 e9 X
- LDY #$08
( j! _9 f3 _% q% {# h" ]* v - .Write_Data
; v; ^7 j3 R/ j8 @ - STA PPU_DATA: H8 `0 Y9 X$ D. z1 s z
- INX
6 [7 T- d1 i, y- J$ ]- \ - BNE .Write_Data. @2 d! c2 r4 }) ?! ]# \5 l
- DEY6 ?5 q( a$ g p) B
- BNE .Write_Data
4 Y. A3 r- R$ \; |* Z8 r - .End
) v4 u ]) z9 f# A& U! v - RTS$ b9 Q3 Y; B3 a8 y; d: R9 U
- 3 j8 n7 i2 E% ~* {
- ;======================================================================/ Q1 ` p, n2 I( D. V% `
- ;音乐曲目切换
6 A* R4 @5 k6 V - Music_Select_Process$ o* ]/ y y- b& o9 Z2 s
1 F ?6 M2 L" x2 u- .Pre_Music;上一曲
6 p( S Y+ W5 q; P( R! B6 i( s: J - LDA FC_Gamepad_Once( Z% B9 j3 G5 z1 i
- CMP #JOY_KEY_LEFT; V0 N- t% M% p! I; y
- BNE .Next_Music
; y3 N* ?3 A- \$ L# d6 @9 z: `& l - JSR Music_Play_Pre
4 Q) ^3 S7 u X a# p" O. y' M - .Next_Music;下一曲! h& F/ `, k8 t3 Z: `7 s: _0 Z6 e
- LDA FC_Gamepad_Once
; L8 k3 s* b5 c. X - CMP #JOY_KEY_RIGHT
- o% z* i ~! X9 f7 x. o# k# A# l - BNE .Next_10_Music; v# j5 G/ L! @; `- O% t
- JSR Music_Play_Next
8 `- @/ O" J; D2 \' s/ ~ - .Next_10_Music;上10曲
) t. T( D' ?: ^$ n - LDA FC_Gamepad_Once. g7 F; O( c. V9 E4 q; M! _
- CMP #JOY_KEY_UP4 y( z- a! [, I8 a: b: s
- BNE .Pre_10_Music d7 X a3 B1 J7 j
- JSR Music_Play_Next_10( c. E" q1 Q2 B: x& v& N: U) b
- .Pre_10_Music;下10曲6 u% }# q) D2 b" c0 b" X
- LDA FC_Gamepad_Once
# [; J# q, p+ t: i2 ^% [! o - CMP #JOY_KEY_DOWN2 o/ R* m4 u" N& T) f; M
- BNE .Reset
+ K. Q8 M6 p- }/ c6 p L R - JSR Music_Play_Pre_105 O' G8 y) z4 j2 _4 Y% U: U
- .Reset;重播当前曲目1 C4 k3 h) g) u
- LDA FC_Gamepad_Once
- h5 J% w+ c6 a) E& j! w4 f - CMP #JOY_KEY_START
0 d% n& \) r* {: ^- M - BNE .End
6 V' S! }% `; V9 u - LDA FC_Music_Index5 l& c4 l& m/ x- v+ }& o* J7 W
- JSR Music_Init_Process
1 ^! c( D; ~2 z1 K' { - .End+ S3 `" Q1 a. }7 }! D+ n% O- ?+ [
- RTS. ]8 H' U/ v; r$ X% b' n5 `3 ^
- 5 e7 S7 U3 z* |8 W0 {$ J# E
- ;----------------------------------------------------------------------5 y1 y& \1 o8 G7 H& E5 {0 w( L
- ;播放上一曲9 w3 K1 B/ o/ R) Z8 j& K& F
- Music_Play_Pre0 B6 Z6 l+ G2 H+ x$ g1 {; q$ I
- LDA FC_Music_Index N8 }9 O" M! V: i) _( I. d. a! A
- BEQ .End
" ]6 @0 [) p2 q% n1 L9 {6 M9 R - DEC FC_Music_Index4 _4 ?' g1 ^ m6 S% ?/ n( @- o9 {
- LDA FC_Music_Index1 s, f- C9 A" W4 A; {
- JSR Music_Init_Process
6 G E! p& h2 B3 M$ x3 o - .End$ x0 G" e j/ \! ~4 H1 ~2 T
- RTS
# f4 D2 b' q% X* L# {. W - ;----------------------------------------------------------------------7 {' ?8 p( @! ]& T$ x& ~
- ;播放下一曲
2 w; r3 J: n0 E0 Z - Music_Play_Next, P( V2 Y; n9 Y
- LDA FC_Music_Index
k5 n2 w2 H8 L# |0 D - CMP FC_Music_Max_Index
5 q( @, E/ r% E- ]* R2 `! [8 v - BCS .End
6 r% `+ b5 q& h$ W - INC FC_Music_Index. k% z) |1 w" Y/ k8 f& E
- LDA FC_Music_Index
1 [5 ~/ N8 Y0 d4 E; {4 v5 | l) c - JSR Music_Init_Process0 c( m4 h1 k4 n2 \
- .End
& E: ?6 T6 g5 X# D' w9 A! D, Y# ~6 Y - RTS
. P# I1 S4 v2 e# Y6 x, T+ `" D - - t% @& g/ u+ w8 T. Q K0 a
- ;----------------------------------------------------------------------6 U2 A$ |7 ~9 h* F' L
- ;播放上10曲9 c! a+ n* z1 F- }9 b7 X
- Music_Play_Pre_10
6 {% t+ c& F' }% W, X5 v" D - LDA FC_Music_Index
m9 t' H/ g# @( {4 ~ - BEQ .End
D- _4 S* [8 W5 c - SEC' Z, c: E6 q, L! s6 S+ J
- SBC #10) t; C* H4 a- v' e2 V
- BCS .Pre_10
. C0 m8 r7 f4 X5 H0 k. Q - LDA #$00
* j* N) G6 Y6 U% l - .Pre_10
4 P) @( e7 d1 g P) o - STA FC_Music_Index, G2 `' G8 e7 `9 n# J" |& M
- JSR Music_Init_Process. y9 W6 i7 c9 {
- .End
7 {0 ?2 R- i2 k - RTS* V" K; T" r8 F2 y9 P
- ;----------------------------------------------------------------------
/ M9 x# n0 h3 m4 Y - ;播放下10曲4 V" n2 ^5 @5 j x3 b
- Music_Play_Next_10 y7 x+ K9 s5 a' E& a0 ?& f0 D$ _
- LDA FC_Music_Index
# M; |: t7 e8 a4 E7 L- c( _1 S - CMP FC_Music_Max_Index |1 A% a& n7 t5 u8 o
- BCS .End
% B& I& @, @$ _8 C9 f6 ]: I - CLC
2 Q1 U+ \7 d; B* ]4 V - ADC #10/ x0 H7 H s$ t9 y4 _# x/ `6 W
- CMP FC_Music_Max_Index* A# f: v6 N3 Y. o: b
- BCC .Next_10% e$ O; k8 d, i2 K8 e8 @
- LDA FC_Music_Max_Index
( B3 p8 h: Q/ z/ X3 W# j - .Next_10
6 h; d% q7 {( @5 L+ d. Q - STA FC_Music_Index
- u# e K& A( G2 O3 V* I, |5 S - JSR Music_Init_Process4 X; t" ~+ g y3 z
- .End% F* F. N- d+ D) G/ y
- RTS/ _* ^1 D3 e' v# _
6 `% I0 l/ l0 z2 P% H2 b- ;----------------------------------------------------------------------7 ?- @3 Z+ Y6 [- C6 z
- ;8位十六进制转3位十进制制, o; o: c% \' K$ F4 V4 G+ o3 R
- Hex8ToDec; I/ h$ f+ j9 F2 m0 z9 `
- STA FC_Dec_Data_1$ e7 X4 c, Z, ]8 f5 m& G& Y8 r0 b
- LDA #$00
) v) X0 h1 D2 N9 Q# Y - STA FC_Dec_Data_100
5 I4 m5 \: }& ?- l& S* P, E2 M - STA FC_Dec_Data_10
4 Y9 n$ i# r' [; \/ q - LDA FC_Dec_Data_15 _, c) C4 w6 {& W
- .Convert_100
( |: u6 S# K0 k - CMP #1005 B0 R/ k) e6 g1 L* }
- BCC .Convert_10
" x9 D+ i3 c6 E: O' o/ X - SEC
: ~% z& W! U- ~* o7 u: e) P - SBC #100
) _) D! `. T8 P9 m+ _& t3 ` - INC FC_Dec_Data_100+ L' @( t4 \: }. Y
- BNE .Convert_100/ W2 Z# _7 T' h* {
- .Convert_10: r2 p$ u$ O4 J: u' z
- CMP #106 J: y7 E$ l# ?0 s" T# i
- BCC .End
. K$ S5 W; O/ y/ ^ - SEC7 c" z; R" x/ L) C0 r- h; \
- SBC #10
, I3 ^& O# h m" j - INC FC_Dec_Data_10
/ w1 t/ H/ v' V8 I2 h - BNE .Convert_101 B! f: E' Z) `; _0 ] o0 D) H, d
- .End
" H% G& l- a/ |5 m6 ^7 E9 @ - STA FC_Dec_Data_1+ t' D7 R; o P+ V6 D; x2 Q
- RTS
# b% f3 r d1 A& A6 _ - . s4 J0 k7 n: K7 ~
- ;----------------------------------------------------------------------% a3 y% p( T) R
- ;显示曲目信息
. x+ _7 Q- w5 s* }- T/ l% q8 h2 q m - Music_Info_Display7 b- r; B) ~+ V( x Z! X6 a; A
- LDX FC_PPU_Buf_Count% I# I, M1 s& O3 w
- LDA #PPU_WRITE_MODE_CNT_LINE
+ l! ^8 A, F4 u% u8 ^0 e! B7 _ - STA Use_PPU_Buffer,X" Q0 U; ~! G' j, T2 e& \' b
- INX
4 [* k9 i5 \" |3 M, R( o& y. J8 _ -
3 A( p# u2 e& g$ U4 U - LDA #>MUSIC_INFO_POS
$ Q) N0 \, S1 C- B3 M/ n6 q- o - STA Use_PPU_Buffer,X
. F3 R5 _! f1 g5 ^; m' s - INX
* L1 U2 _# u2 @; e4 ~2 t' k - % L4 f# ]' I: ]. r, C: w
- ;居中
% t% H4 N2 A0 B; U4 x5 e* i6 D - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' n% |0 y9 g: K- H+ K4 c" @4 |8 |! v
- STA Use_PPU_Buffer,X
) i- R; z! [# D - INX8 t: j0 y3 M- S" _3 x
- ; h( |; o0 E; w7 t6 i+ E
- LDA #$05/ s& L' `) E4 ~: p
- STA Use_PPU_Buffer,X
( p1 T, ^7 I2 |, d - INX$ r' S; V5 n& }% q, ~* \, F
-
+ \$ o- U. Q7 h/ s - LDA FC_Music_Index
3 @+ T( U$ h, J( \ - CLC
. s& J8 [- |8 x/ J' x$ Q5 v - ADC #$01
2 n9 H/ s3 n% B2 ~' g) L+ T9 ^" f$ E - JSR Hex8ToDec7 a9 p" \9 W- f+ D$ @0 Z
- ; P1 J8 E- {) S3 @0 v
- LDA FC_Dec_Data_10* J% A6 {; u5 T/ {: }* _8 W
- CLC
" |) y2 }5 l* F - ADC #'0'2 }; g" _+ l# O/ U, M/ t N
- STA Use_PPU_Buffer,X
! v/ g( O# S$ ~) }1 S1 I - INX7 j2 v7 K, h2 [ |* @: g+ q( j
-
. D$ s7 J+ b1 B% W: A1 Y - LDA FC_Dec_Data_1% r# }. f' Z" U" B+ S/ q" e) y" R8 Y
- CLC
3 d7 U/ A s( X8 E; ?5 I - ADC #'0'+ Q/ {1 Y! ]7 Y3 G
- STA Use_PPU_Buffer,X
A6 Y/ U8 ]% x" H9 f - INX
1 ^% E4 N+ Q+ T# c/ O/ ] - 3 h1 B z, I1 x: t$ E3 a
- LDA #'/'2 k9 L+ ~: h3 U r* H7 G- f2 j
- STA Use_PPU_Buffer,X5 ] J* e$ D3 M( t: ^3 D
- INX
4 T, k& ~. a) Y/ N5 N9 o -
! z$ s* k; z6 w9 z - LDA FC_Music_Max_Index- j F( E% H; J+ I) E6 H
- CLC
7 H( G2 j( ^) Q3 b+ L/ r0 w - ADC #$016 x B5 y% R# W9 |( L2 P' K l
- JSR Hex8ToDec
6 b) [ _" r+ S1 p" r% P- y% _" N3 m -
, F& w! @2 n- ?" O. \- F! x - LDA FC_Dec_Data_10
& W+ A V, s2 ~8 A2 I$ N - CLC
/ U* E5 C$ Y/ Q - ADC #'0'
K; C# V) J: \& P& m - STA Use_PPU_Buffer,X8 L$ G/ X+ u h. u, Q
- INX' t2 |' G- H# L9 z4 l
-
3 _3 x* J0 e( {9 L+ ^8 ?; A - LDA FC_Dec_Data_15 ]2 |9 d8 _( @7 _' \6 [6 \
- CLC. [# n6 J# \; h$ Z. Q
- ADC #'0'
0 E& _+ G4 y( l; s1 U& |2 l - STA Use_PPU_Buffer,X
: a" M U+ h7 E" E8 m: j1 _, m8 _ - INX6 G4 g4 U% m8 G% s( L
-
1 A6 \* e* n* D' a; G- z - .End; y+ k* @: C& Y( N8 u" Z3 a% O
- STX FC_PPU_Buf_Count
' o! D! @5 s% C) d- F - RTS6 k" o/ }4 V% Z) P& G3 s9 b
7 X% M9 B& G+ b- ;----------------------------------------------------------------------
4 B7 C6 p) o$ J" x; ]* e5 ^ - ;音乐曲目初始化处理
: M7 E- ^7 ]8 P% a2 j2 c - Music_Init_Process# q& G Y. [7 g2 L% H: r
- PHA
1 ~& o0 J) Z- a$ G8 }3 G - JSR Music_Clear_Process
) l8 U$ C- d' [- j) D' s( n - LDA #$1F D4 o6 G. E6 n# x: g3 {, Z2 K
- STA $4015
! e& y q6 P$ \1 [% O) y) `+ z& O/ J - PLA
8 N& }9 ?) S% z# r1 K - JSR Music_Init_Addr+ @! ^, s9 W6 x' f* H$ }3 ^
- JSR Music_Info_Display
2 g% x) N' o) ^4 i& V - RTS
* `" a. @ `3 F' \ - 0 u+ m! I a9 K: ?
- ;----------------------------------------------------------------------
! \% _7 o0 M7 P - ;音乐播放处理
; E4 y3 A6 j% O - Music_Play_Process
) [, Z8 ?" N. C" [ - JSR Music_Play_Addr& \3 X! M9 b* r6 C" g
- RTS
. U" M: P8 {6 e) c! r0 B1 K - ) I" \! _2 c/ U4 x- m, w
- ;----------------------------------------------------------------------
4 V6 B. X! G6 b$ @! N) t - ;音乐播放处理
! b% }( }1 R2 U w8 g$ f - Music_Clear_Process8 p4 [1 l9 A0 d+ m# s
- .IF Music_Clear_Addr
7 V4 m) s- ~5 b9 G ?# Z1 t$ i - JSR Music_Clear_Addr% }% s* `* R1 H) Q% }
- RTS5 n: c% ~+ r) @& d
- .ELSE; }: L; M, ` s# \4 s
- LDA #$1F
$ _8 t% K$ e) h% i - STA $4015
u0 M2 w# [2 T2 M5 R/ L - LDA #$00
3 }& U+ l) {7 F# c/ @+ \4 L - STA $4010
* U6 M/ r; G8 G, J( _: s3 p+ E$ A - LDX #$00
/ q0 O/ ?) ]/ ` f2 Z. T6 }5 M - LDA #$00/ G0 D; D( v+ N6 J8 H1 I( x
- , I/ z; x) _) E# Q9 M$ A5 m4 P
- .Music_Clear_Zreo_Page_0
9 ~ K& p! u5 p: V1 [0 C U - STA $00,X6 i' P; S) j8 w) s0 Y
- INX$ K0 h* F* x: ~ g5 Y, n
- CPX #Use_Zero_Page_Begin
$ U( l. F/ i6 p* e; L8 t9 Y/ J# P' I, } - BCC .Music_Clear_Zreo_Page_0
" D' j5 g3 r- A* Z% T5 S7 S - 5 j, O5 _; P* }8 C# H$ H
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
( r4 Z# i( X5 C1 c4 m - .Music_Clear_Zreo_Page_1. O( I: ?* Z& K. w2 T: k- Z
- STA $00,X" ?$ `: Q" a3 _- o
- INX
! I0 S. Y, X5 x0 A- Y ^; ~7 a: G+ B) J - BNE .Music_Clear_Zreo_Page_1 d( S5 B2 G4 V3 s
- $ F& m7 ~: U4 x8 A& O
- Music_Clear_Process_1" a5 g( M" v& O9 A) I$ J
- STA $0600,X( i) T/ H# ]& l: I! m+ @' [! A
- STA $0700,X5 A7 c8 ~3 n( U/ S3 }; e
- INX
, |) v- V2 `. |. X8 o9 } - BNE Music_Clear_Process_19 a3 o+ b, e2 Y/ F% z8 A m# N7 ?. I; R
- LDA #$10+ m0 F0 @ f8 W- v
- STA $40008 q7 S) B' f! A1 _$ n9 C8 ]+ ~& Q
- STA $4004
4 x5 f' V+ F: ~- G - STA $400C
- w u1 M8 ^% B6 E: I1 n% ` - LDA #$00; h, O2 C6 v5 Z2 X, C$ }
- STA $4008
; ~9 }# T; Q: Y$ g7 r - LDA #$0F, M6 \0 g' e t( T* Y
- STA $4015- I# M) L$ Q, i ]; r% a
- .ENDIF
3 }5 B: x0 M$ V - ( C5 Y; U6 v7 k, F4 a* b; e, x
- RTS: q- g. S/ }) G; H, v! ~
+ C* }' x) G. O+ Q8 c) q- ;======================================================================
) Y4 u0 V' J; Y0 f# Q; B - ;重启处理
) W8 m$ X0 i# G( p - Reset_Program
5 A% S5 Q0 n6 e# P3 j5 c8 y - SEI
# H! A; n1 m; L, T# l% F - CLD
3 I; F9 w) x! k7 b) y/ I$ | - LDA #$00" S5 n J( _6 D$ C ~
- STA PPU_CTRL
1 v0 ~# d' ~- @4 r" y( l - STA PPU_MASK
" r. e3 f% x; ]- b - STA JOY2_FRAME
4 H% Y' ?$ R3 d" f# t5 L! Y _ - STA APU_STATUS# X7 t5 L7 o1 w. x
-
! M: O4 B9 l* M% E0 ]7 i" e - ;等待屏幕准备完毕
+ r; J L1 Z/ O, q& q4 ` - LDX #$02( R- G `* h+ v
- .Wait_For_Screen_Ready
9 V: J/ n7 m, K/ \. ?+ e) R - LDA PPU_STATUS
+ ` S; ^, f/ a' J$ X5 ^0 n# ? - BPL .Wait_For_Screen_Ready
4 [3 c3 C. v7 D6 t1 z# B5 ^& ?# K) c - DEX7 c* i6 g3 c4 \" \
- BNE .Wait_For_Screen_Ready, D" {9 M. _4 Z
- 2 w2 U; K' `% n! i. ^- q2 D0 z
- ;清空调色板
u4 M/ ~0 L. R% c( `9 r - Palette_Clear4 k& F2 G8 }" O! O- T
- LDA #$3F; r$ J$ \ N' O. `& c' a& @
- STA PPU_ADDRESS
( t) q) E, Q1 o4 Q8 R& Z9 [ K - LDA #$004 A% L& B+ {4 Z# m, ~1 z6 n
- STA PPU_ADDRESS, K5 R- f3 D: e" S& J J5 L' I, X
- LDX #$20( j# t# |' ^) j$ M( j8 J
- LDA #$0F6 d, v0 X9 `9 E1 @
- .Write_Data
' g! ?' F; s3 D* f1 E( E - STA PPU_DATA& z. f6 k9 z* u: |
- DEX
$ [. z9 W$ T& @) t' h - BNE .Write_Data
" |- P" K& y7 |- V
7 O0 V3 y6 @! K2 z4 Y- ;清除声音 $4000-4013
' f4 O' O9 U( C3 p6 L) H8 W* P. m - LDY #$14; z" Y& c' |6 T+ ^. b+ X
- LDX #$00
5 S8 w7 P' L8 w( o - .Sound_Clear
; }. \9 e* ^: E5 U; s( O0 { - STA $4000,X
2 [ i$ [0 z2 q8 o N$ b* N - INX
# H3 p) g" O( p* V1 O - DEY
' R4 Y/ O+ ~$ q. d* U1 i# K - BNE .Sound_Clear( v4 g) c8 y' @3 D4 I/ r! @( {
-
& N; M, ?1 e2 Z; l. |" @5 A) c; \ - ;清除 RAM $0000-07FF
9 H: i5 U( p$ J) H7 u - LDA #$00) ]2 x. W' P3 ?( `5 O
- STA $00' ~' U7 D( I7 n, l
- STA $016 H, X0 ?3 E) L& h
- TAY
( G" C, Q8 B/ l - LDX #$08
. }7 |# L; R/ g# ]0 w - .Memory_Clear1 Q. n; U5 L: l& C
- STA [$00],Y/ B1 d/ E7 d, w3 V- ~. P
- INY
) Y `. [9 p9 B) x - BNE .Memory_Clear
( k+ @' O+ T4 _% M! V/ P - INC $016 M/ e M( n0 W$ r9 N
- DEX9 {9 A7 J8 |( r9 b6 ]* P0 x# O
- BNE .Memory_Clear, r3 t5 ]' u5 z
- " q9 g1 I% I3 ~& q: j& S2 H0 R l: k
- ;精灵缓冲初始化
m. K8 j, s# d2 O; j% L - LDX #$00
/ V1 t" b9 }1 Y0 c6 [ - LDA #$F85 ~! \( ]+ @) G. ~4 d+ p6 H
- .OAM_Clear8 d( h4 D! y3 {+ Z$ S; [
- STA OAM_DMA_Buffer,X' K! H% r+ E; z# @" T5 G
- INX9 Y# I1 F, M9 y& D$ T) d7 c
- BNE .OAM_Clear5 t0 {2 Y& _% j# m/ O: ?
- ( t' P1 C2 I+ y0 {, j8 k
- ;栈指针初始化1 D: S1 J" _3 Y0 b# E7 B8 a
- LDX #$FF
+ \! k: e2 e! p0 ] - TXS
* O( z4 n* C. }- N -
( N, I) \- F% r - JSR Nametable_Clear;命名表清空) c h7 D( Q; s; l2 f1 O% B
- JSR Palette_Init;初始化调色板缓冲: v Q4 P7 x! {
- JSR Static_Text_Init;初始化静态文本! e' M2 ^) M. Y5 j4 t$ U- H
-
# \' E5 n0 ]8 o) q - LDA #MUSIC_ITEM_TOTAL - 1$ N' p1 Y& \9 I- o: C
- STA FC_Music_Max_Index% b. Z% P- s7 q- g3 F
- 6 N; G& m! s# p3 J8 U+ ^
- LDA #$1F% M8 ~0 X8 Y. ]2 d5 P _
- STA APU_STATUS
+ p {& B7 g; {2 ]5 d$ i - LDA #MUSIC_BGM - 1. l+ R1 q. Y7 g- [
- STA FC_Music_Index% ~# T7 E' r+ j9 v
- JSR Music_Init_Process;音乐播放# N' B( H1 X; r* p6 M
-
' B# f4 T- e$ Z% ` - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
0 Z8 |% J: a7 i) ^* m. r0 b& o$ \ - LDA #$1E' e3 m1 A3 W; [ ^" `
- STA FC_PPU_Mask_Buf3 b3 W; w- k$ ?, E
- ( o+ q B/ e9 }9 h
- ;启用NMI处理
# k. q( v! n* C - LDA #$804 M9 t2 h; b9 e- _) ^8 p
- STA PPU_CTRL$ D% |6 G/ S8 B' r' y$ u
-
4 s3 ~# e( }' I1 }% N+ w z. V4 H - ;程序循环, 剩余工作交给 NMI 中断处理
0 U8 A4 {, g m8 X) c- r7 C: ~, v$ B - .Loop! y1 \8 M3 [) A: [* d" R0 d. h
- JMP .Loop$ @; W* c5 {$ l! {. C/ d% f" s/ p
$ O* L# |, @) ]6 V2 Y( [3 V3 Y$ Q( \- ;======================================================================# U! ~. e, G2 G% ~
- ;不可屏蔽中断处理
4 u# V6 G% c5 k2 o( a* P - Nmi_Program
& E& x, ~0 x! ~ D S - PHA
6 t# S& c+ l" E - TXA8 f1 M! B' T. f2 A2 n
- PHA( M. w4 L4 O: ?7 m( g0 D
- TYA
6 w& z8 s" l1 @$ _ - PHA: @% B+ }2 c5 [# s8 m9 v
-
/ H$ O6 K- H" p0 G* l7 {; _ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位9 B8 }* j) y' ~7 X) p; B
- 0 R# f* ^. F2 l+ J* M% u) O
- JSR FC_PPU_Procrss;PPU处理
- S4 u# L5 f O8 T( G -
% D4 T" g1 Q! c/ d j - ;精灵内存更新. ^$ V# e" V j6 A
- LDA #$00
" l7 P1 N9 ~, O o: N! r - STA PPU_OAM_ADDR
% b' J( R6 v; f4 l$ V9 H, I - LDA #OAM_DMA_Buffer / $0100
& o# Z7 [) q( x4 T - STA OAM_DMA
5 r" R3 o7 N" t* K2 {+ p - 0 |5 D! n8 O; D8 Z
- JSR FC_Gamepad_Process;手柄输入处理9 @. N% @4 z, u
- JSR Music_Select_Process;音乐选曲处理
1 c1 l: n2 e% X& |% K8 F - JSR Music_Play_Process;音乐播放处理
; \! |6 i6 o s3 Z9 r - 6 K1 ]6 m; U, J, A6 L
- PLA6 x; j, O+ g6 {/ P7 D j9 ]3 H
- TAY( _6 \ W! D# ^# e* I- s
- PLA
+ d7 m0 _6 a, K- y2 L - TAX
1 s" {- u, g- f3 ]; z; f2 s$ t4 @* @ - PLA
^5 v1 X# l! x: h$ Q- k - 8 w5 t( \* V1 E; l! E9 I
- RTI, \* L1 n/ ]4 n: o }+ F$ x. c! ]
5 _% r3 `; ?* d" Q2 s, H! `- ;======================================================================
( R$ W5 ?8 m0 b% k( T5 Q+ D - ;请求中断处理5 Y' h" |/ z# Y$ ?8 s
- Irq_Program
# ?) V! [3 @2 z( m: m) y - RTI
1 {% @) e0 Y) d+ l+ A0 s
/ @5 _, Y3 ], d$ G( r6 H& K% E( z8 I- ;======================================================================
y3 c/ D9 ?" s9 v0 [ - ;中断向量表6 x" n" B8 ]( V3 B- l
- .ORG $FFFA) s6 F" d. a( k( N/ ?
- .DW Nmi_Program ;NMI触发时执行* x: O7 O! n# _+ |: r
- .DW Reset_Program ;载入ROM时最先执行 ~' x" x3 @. m7 E' c
- .DW Irq_Program ;IRQ触发时执行
9 a4 x' @- F) n! e) x; v l
复制代码
: p8 _4 ]* A) k. `# U$ t% b3 ]" M- c l. _
$ G" R( H8 o8 P+ ]https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|