|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 h5 t9 F' e2 m0 w* K+ Z A

" `& I- g& q5 T以下是主框架代码:& A2 d+ T. E$ L- m, i' j* y
- ;======================================================================3 ?9 K9 a& w, x9 s. t
- ;文件头8 h. u3 [9 b7 T( S2 @. n6 [
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
* c7 u) t! Q1 [/ e1 s, M7 M/ I - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量% a' t& l2 i( z2 N* C' ]9 g, K
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码( e- A! ]; j: [5 a
- ;======================================================================8 \; n+ M1 H- e& y2 g& B
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 22 _: _; e* S- ?) ~$ i2 ]* h5 x* t
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
/ p# X$ J% s# B8 Q# J - ;======================================================================8 l2 H% e& U7 l
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ M2 ~6 Y) I: p1 u+ f' k8 D - RESET_ADDR = $E000 ;主程序起始地址; U/ m; F/ Y# v( N
- ;======================================================================
8 W h4 B K+ P7 }% B$ Q. k - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB, v! q6 i* V2 I# P8 s2 n' Y
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
+ e% h7 X/ I+ o' [0 F" r - .INESMAP 4 ;Mapper号 (0-4095)4 G( t) t; j9 s# Q; T
- .INESSUBMAP 0 ;子Mapper号 (0-15)
3 N/ h+ l' k S1 b - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)* [3 L: l s3 ~2 W; F# ~% q( ~
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在). B. ?' K* M7 q8 }7 P1 M4 O! n
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
# b/ k) _+ R1 ? - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)2 x `* P' V. Q0 M$ F7 p5 g
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- G2 e0 o$ d \& _# F* K8 _5 l
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
) R$ s4 g$ {; A. T$ A, W" B - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)# y9 |" ^: U H3 H
- ;======================================================================
) [5 n0 U4 M2 u& Z3 b" x2 O - .INCLUDE "fc_demo_config.asm" ;全局配置
) X8 b6 \' P+ o# t5 E& F - .INCLUDE "fc_demo_constant.asm" ;NES常量
" c; u- E9 X7 {% g - ;======================================================================
( A2 c7 E; i9 k2 A - ;音乐配置4 A0 B; \( Q7 |
- .IF 0 = MUSIC_THEME
P1 F/ ~ n0 h' j5 E8 Y. @; h) [+ ]# I - .INCLUDE "data/music/Gremlin 2/config.asm"
# y- Q+ J* j+ K5 ]1 R4 N - .ENDIF* c! N( g4 [5 ~' x* N
- / E" {% M5 [# _% P4 G# j2 ~; q
- .IF 1 = MUSIC_THEME" f8 R, j3 d6 P' \5 J% v4 p. w, o- `
- .INCLUDE "data/music/Raf World/config.asm"
5 i9 k$ v$ s7 G) P - .ENDIF
+ t2 t& L' B3 e+ W -
& n) W m. W e2 c {( w - .IF 2 = MUSIC_THEME
! s+ q9 u) S: |5 { - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"* Z: b9 t* I& }4 V& r; W( H, o3 y$ k
- .ENDIF
+ W+ Y3 g- E4 v
/ U5 x* T" B+ G6 U) ?$ P( D. h- ;======================================================================8 h2 \1 s6 {) g, ?& a* a
- ;引用CHR图像数据
( x* c8 ]) \1 y- E% W5 G# r - .BANK NES_16KB_PRG_SIZE * 21 t- a7 {$ N9 F, L/ O, ~2 h
- .ORG $0000: I/ c( D$ Z- x9 g4 m3 [: W
- .INCBIN "data/bkg.chr"
/ h3 p% U# Y1 e3 M) L% I5 } - .INCBIN "data/sp.chr"9 E$ n Y/ A; l; Y5 Z
-
0 _1 t) T8 |, j U0 R - ;======================================================================3 L) p4 n& q. d- w1 p; A- _/ W; H
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, I/ Q# }6 O( e! K! k! Y2 u, S - .ORG RESET_ADDR
" g: h4 g3 s; Y4 g - ;======================================================================2 W5 N: e% ~0 ?0 |
- ;引用其他源文件 |9 g$ k$ g& I
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理! L& R$ M! w8 s' I2 G
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
& S v8 `0 z- C# r - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理' @3 Z* I: P; a2 Y. r/ |$ Z) M1 D
- ;======================================================================
& ?5 s; W* }5 t# }( K$ X0 O
; a: G; w* A0 g" x! { J! D5 E- ;======================================================================; V! F$ y/ F) x0 h% _+ R
- ;等待VBlank到来7 j X, Y! e5 q5 i( ^4 I2 w" |
- Wait_For_VBlank6 A9 F& Q2 f2 T- R* c" U
- LDA PPU_STATUS
" `) G V1 N4 M0 L) u& ~ - BPL Wait_For_VBlank: _4 }2 M- N" u+ J0 r' ~' @
- RTS
8 {8 I. i- C: b( |7 S" q
( q7 @' X9 j5 \6 f- ;======================================================================+ r1 ?3 |1 \. b
- ;调色板初始化' t U' D7 s3 r2 i! f7 |
- Palette_Init
: Y+ N1 V2 n R: F! s) t - LDA #$3F
) l$ ^3 {( {7 M n8 R - STA PPU_ADDRESS
' x$ F# J. Y, g - LDA #$00
' k* l$ Q& a2 g. V- H2 S0 l - STA PPU_ADDRESS
: P4 T9 p: Q: y- O z# ] - LDX #$00
$ m6 C# @& z" W3 ^+ F( X1 k - LDY #$20: ^, P' F' k3 T* _# C: v7 q0 u+ t: I
- .Write_Data
4 j; `1 S8 U2 C# t/ B; `# [( _ - LDA Palette_Data,X) N q, E4 {+ t
- STA FC_PPU_Pal_Addr,X& {! ]7 ^, H6 E
- INX
. I- J+ s1 C+ m' ^2 j* R - DEY" y& C" C, M3 u Q* j3 @. W& [. z1 M
- BNE .Write_Data% C8 _8 |1 ]3 w# k
- .End3 O( [2 [9 g2 V6 L
- RTS* x' \8 c0 U+ x, T; }
- 3 J- ?6 \* g' U1 Z1 d
- ;----------------------------------------
5 ~: |1 u0 c2 ~: c" P - ;调色板数据
1 i7 A5 M% n Y* b - Palette_Data6 g- ?" l3 p# q5 q. g
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
0 n9 z$ {# r3 t/ M S/ j/ Y - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
8 N( ?! ~) j& R& c -
) G- B: Y" ^1 ^- g6 {0 {, R% G! w6 V - ;======================================================================
2 j( t, ?. n, L - ;命名表清空1 d- [( |* r/ `6 ^0 Z
- Nametable_Clear
8 o* G$ L9 y h% `2 w9 f. u2 w) |- \1 M - LDA #$20+ {! Q9 s) S& a( X
- STA PPU_ADDRESS
) m! q1 s! u2 I; k" V - LDA #$00
3 N7 c4 [9 H0 T& S$ `' U7 [ - STA PPU_ADDRESS0 k4 V4 E8 f! c- K3 G% \
- LDA #$005 P {3 e6 ^# p1 q+ G& D
- LDX #$00$ ?" [6 B ]2 I' j2 X
- LDY #$082 G* g+ @. S. D; v9 g
- .Write_Data
7 h% h9 Y8 Z) T8 p( c$ ]/ s8 r# g - STA PPU_DATA7 Y: g2 E! d& d! Z2 i
- INX* ?) u& l! F2 m, P" m
- BNE .Write_Data7 L. r; r( w) d4 Z
- DEY
$ H5 ?: \$ N+ G% ]- I# \ - BNE .Write_Data1 C& |) C Y9 I6 R
- .End4 d$ ~+ \, [0 R, d
- RTS
3 @; ?, d- B& F3 B7 Q6 C* k - 2 F u; O2 s' e. B, S
- ;======================================================================
3 ~9 N/ H* P9 ~$ N- ~9 G2 P - ;音乐曲目切换
+ W" H% [' i& a& w4 q - Music_Select_Process
\. z g1 Z, Y/ T - - X& l- ~( C8 D, F- y5 q5 Q
- .Pre_Music;上一曲' Z% c T, S4 Q9 V7 D
- LDA FC_Gamepad_Once: N C- y+ R1 z9 m' }1 E' R9 M/ ~
- CMP #JOY_KEY_LEFT
2 l, L7 _( h) p7 m: z- j - BNE .Next_Music
& A3 e% |7 @* @( s* b# `$ K - JSR Music_Play_Pre
7 I$ q9 G( Z' j+ H, l3 X4 ?" | - .Next_Music;下一曲+ h3 g7 p+ v8 z8 V9 [0 [6 Z
- LDA FC_Gamepad_Once2 V. a8 f1 z; K# E4 d$ W$ ^
- CMP #JOY_KEY_RIGHT
. v" H6 z p2 n4 c V) a2 t& c4 h1 E - BNE .Next_10_Music
) K4 t" d w& E* |: J - JSR Music_Play_Next
5 Q- ~1 b+ \7 \5 x6 x - .Next_10_Music;上10曲8 M8 m+ v. D8 s1 `& |
- LDA FC_Gamepad_Once
! E3 l5 |5 ~# ^0 d8 k( S - CMP #JOY_KEY_UP9 Z7 i) d8 |& X3 Y8 r% F4 _7 R
- BNE .Pre_10_Music
6 b' ^6 @% O2 H- Z2 ? - JSR Music_Play_Next_10" Y& I7 W5 p& e) Y* O7 f4 b
- .Pre_10_Music;下10曲0 D4 M( O' B6 X
- LDA FC_Gamepad_Once
7 i8 t X4 \0 Y7 S% D, K" J - CMP #JOY_KEY_DOWN/ T9 w) b+ P/ o8 s
- BNE .Reset
5 t& h' r$ Z! K8 X - JSR Music_Play_Pre_10. o( l6 m9 A1 Z
- .Reset;重播当前曲目
q1 l. J: X! J: { - LDA FC_Gamepad_Once7 }, u7 Y% E/ F6 T. k* H5 y
- CMP #JOY_KEY_START
' J2 G1 E( q- b$ r2 H } - BNE .End
8 Y: W' M# O1 X9 f# y3 B+ @& e - LDA FC_Music_Index
- w( V! h$ Y6 i - JSR Music_Init_Process4 J# F! @2 l' I8 o
- .End# h, M$ I# S/ P! b! |1 B
- RTS: R! J+ |; x2 I
- 4 Q0 n+ [1 Q9 S$ H& C
- ;----------------------------------------------------------------------9 R* |/ C: B. w. O; j) I$ n
- ;播放上一曲
! g' e0 v) |8 Y) w# Z2 z8 V' l - Music_Play_Pre# `1 `6 c5 n) X5 _( L; r8 Z, T
- LDA FC_Music_Index
E& ^+ n# y4 ~/ p) B - BEQ .End
. J9 M, ^$ j9 ~ Z( R - DEC FC_Music_Index
/ i& y2 f% T4 Y* t - LDA FC_Music_Index! D! H Y. G0 M. p7 N
- JSR Music_Init_Process
' v8 ~+ ^! J* o5 r% f$ S0 I - .End
b# g1 f8 A8 O w; \- M& V* O - RTS
4 d6 b9 Y1 @" v* |& Y( }( K; K - ;----------------------------------------------------------------------
7 x! w! i! K- m7 u - ;播放下一曲8 `1 x, d0 N7 I8 d
- Music_Play_Next6 A/ D$ \* R! r) @( k
- LDA FC_Music_Index( v1 e7 B8 c& r Q* |0 S
- CMP FC_Music_Max_Index3 y+ E) B6 `& m H; J6 z
- BCS .End3 o* `2 H) ]2 }+ k4 z
- INC FC_Music_Index
- Q/ n# V2 {# ~& T1 C p' ^4 s! d - LDA FC_Music_Index
. K5 D" Q5 R2 y) h - JSR Music_Init_Process
, r+ i6 q/ Y+ G8 G - .End
8 u1 A; Q1 q' z - RTS
. j/ z' P. r' ^1 t8 x" o( H
9 O3 _0 B& \1 l% {- ;----------------------------------------------------------------------
. N/ ? p6 d/ o9 z0 u* U - ;播放上10曲
5 u. Z5 d$ ?8 s- d$ p+ T - Music_Play_Pre_101 c; B( g# _; O
- LDA FC_Music_Index1 X- C* U. |' o) z
- BEQ .End4 I0 p/ R7 `: @+ v1 K4 V+ {
- SEC
& _( A* ?# g, H# x9 e$ @ T - SBC #101 @5 W0 y0 M+ X6 i C5 ]
- BCS .Pre_10
- U0 H: ~! e: y- V4 Y3 Y - LDA #$00. p$ [& ~: n3 M( X5 e% \
- .Pre_10# w0 O1 Y# \0 z: W& K
- STA FC_Music_Index
. ]2 o# `8 H ?( p. a0 h5 A - JSR Music_Init_Process( A M J4 [% i" u: B, O |
- .End" f; `% N* Y# H6 B! s3 D
- RTS* m- [" R E1 y" u
- ;----------------------------------------------------------------------0 v; t/ H# p- G/ B# S a& P2 U
- ;播放下10曲
# ~3 E5 o! }. f! ? - Music_Play_Next_105 [ Q) z" O1 w4 C0 W M
- LDA FC_Music_Index
+ @+ B$ x' E K$ T6 I - CMP FC_Music_Max_Index
9 t/ q: y. K$ J - BCS .End+ n; K+ K$ q0 L5 ?1 U! h; f
- CLC
& P3 S& T9 x& w - ADC #10
) @% m1 g! w7 e* z1 {2 y - CMP FC_Music_Max_Index: W# u9 s' c1 R) S$ T; K# k" i1 j
- BCC .Next_10
: Y8 [% U7 o1 a5 ^' @' k/ p# A$ _ - LDA FC_Music_Max_Index
- L9 ^- h" `/ U6 B: I+ l- f - .Next_100 ^& v) {, D6 T9 k% J% u
- STA FC_Music_Index% e i& o7 d6 _, t& _, ?& w3 H
- JSR Music_Init_Process0 e A9 c" b b8 s) [3 S
- .End
# F# [( \0 D+ ]" [# i - RTS
) ?9 }" n) C# z3 u8 X3 V- U
; G/ W: f! u/ G1 U- ;----------------------------------------------------------------------
9 C* s2 A. `/ L8 J4 M" c - ;8位十六进制转3位十进制制
U/ L' V# e- `) J. i# d2 W - Hex8ToDec
, ~ R" `( C* G. M5 Z+ `, D* f - STA FC_Dec_Data_1
. U1 X( E0 P! d6 L - LDA #$00, W( Q8 O5 |+ A0 L4 ]
- STA FC_Dec_Data_1009 c7 ~0 S6 i* V5 x& p, T
- STA FC_Dec_Data_10
# L5 J. t6 f( \, j2 d+ v - LDA FC_Dec_Data_1
$ p2 v4 O7 n5 a8 h( b' E3 s% W' T# g- b. O - .Convert_1000 a5 _% G4 N N
- CMP #100; V8 M$ I, e* p) N5 F+ h% h
- BCC .Convert_10
; ?' T5 y' l. y9 D; V! X; |$ o: T; O - SEC; {4 l7 i" r! B8 @, k
- SBC #100; R+ k& }; F, w' j6 q* j7 t
- INC FC_Dec_Data_100
% ~; D- u6 }* r% E& n4 c - BNE .Convert_100
$ \& l6 P; u$ S/ @ - .Convert_10
& F0 u- v7 L+ m1 O - CMP #10
! l8 i" M4 f. s% g! ^2 G* C - BCC .End
8 ]) I" e4 \! }$ `# G1 S4 b3 }; D - SEC$ o4 L* T! k0 ?/ d# _# ?
- SBC #10
/ _3 x: R; \ h/ g# T# ]( f - INC FC_Dec_Data_10; E: K# r4 J K
- BNE .Convert_10
* m7 X. H! o2 N7 {& z8 S) N - .End
$ m1 q, e5 }) F$ Y% p - STA FC_Dec_Data_1. b9 x/ ]' u* T' ]4 {5 A0 @
- RTS' d4 ?3 t! g' ~5 B* y
/ ~/ C. {8 f6 g- ;----------------------------------------------------------------------
; G3 P$ n4 Y: N7 g1 a4 d7 \5 k% ? - ;显示曲目信息( P" W: p/ l; J6 @9 [0 h3 H
- Music_Info_Display
+ f+ p" O# K8 h) l" M" l$ ^6 M - LDX FC_PPU_Buf_Count( s0 B6 j+ P; o5 X& K. I+ c( i
- LDA #PPU_WRITE_MODE_CNT_LINE
& v7 B- s0 q- O7 [* j - STA Use_PPU_Buffer,X3 z; _/ n$ i& w
- INX- M: }1 j0 C! e
- : G4 I( I2 r) l% d5 t
- LDA #>MUSIC_INFO_POS
" ^+ k# q4 ]' H1 z6 \ - STA Use_PPU_Buffer,X R7 O( P8 U* ?# Y4 T* W
- INX
; G* Y/ A2 w0 C2 s: \# L2 l' {/ K( X -
4 k& O3 w) Q& |; W% s - ;居中
8 E0 J3 u/ T" \) |: r/ } - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 ?1 _/ `0 u& i4 T9 w: ]
- STA Use_PPU_Buffer,X7 l, ^ ~& `& G; S1 k* ?* N
- INX$ D6 A4 M7 H5 `! b; j4 G
-
3 p# S/ E- C; v Z - LDA #$05
- U& \) v1 f' t2 Y! @. }9 ?9 y# w - STA Use_PPU_Buffer,X
7 [% V7 C% W, C& t' d2 S J& _9 D - INX
: A& r6 c0 r6 b, Y. | -
! G: M: y5 S* Z) S& h - LDA FC_Music_Index
8 x- j$ i: q% k& P# y" B. C - CLC5 R3 D C7 V& K' q$ R! P9 ?/ W
- ADC #$01
! i4 C6 b: n- o, s2 W1 R( X" ^* o8 i; |! W - JSR Hex8ToDec) @7 d- g$ [" D- J3 l
- 1 Y+ }& K$ Z" ~3 i# n2 x/ p
- LDA FC_Dec_Data_10
0 J& c) G. P+ t6 R6 ~ - CLC
9 Z/ R0 h0 c2 ^ - ADC #'0'
6 e# j3 k! `3 H% u9 G/ O - STA Use_PPU_Buffer,X
$ u( k; M3 t1 N; T! n# f+ r - INX* `, ^, r7 x9 g K& j' p0 u
-
& ^6 H& Q: \* N# y* ~4 E - LDA FC_Dec_Data_12 f* ?$ Q; L" j) X, W
- CLC7 y% X1 J7 k/ X# X' i
- ADC #'0'2 c+ p" Q: J9 {7 A8 l
- STA Use_PPU_Buffer,X
! u+ n; W! T) c: s) S2 f - INX, D' [( Y. c- m7 _; m2 U. M! X
-
6 _3 ?/ G5 d1 O# _& X5 Q - LDA #'/'
# F7 y6 m# M) p8 ~ - STA Use_PPU_Buffer,X9 x" c$ A, |0 ^( f
- INX$ B% C. f) L" t/ s4 U: e
- 3 E5 r. p; _0 W0 S- ]: G4 u
- LDA FC_Music_Max_Index9 H6 d' x6 C/ ]7 U
- CLC
# f, B( S9 m/ ^' m5 y# z3 @ - ADC #$01
5 W. T/ f& m! c0 w - JSR Hex8ToDec; Q0 N4 W0 R6 K; o
-
& K: `# L7 E% u# Z3 b - LDA FC_Dec_Data_10
/ L- [9 `0 ?: m* w8 O$ Q - CLC
7 h; s% B- g, E5 w - ADC #'0'
/ t7 a( x7 Z2 C2 n/ {9 O2 R - STA Use_PPU_Buffer,X
1 H$ C7 |5 D2 b3 \0 x+ ] - INX! }6 x6 n2 Y) D0 B1 [
-
9 @6 K1 A i1 U - LDA FC_Dec_Data_1
7 w- u+ k7 R8 H! m - CLC
% b) b8 C" r0 k/ N9 C - ADC #'0'
c/ L; @7 h, \) F - STA Use_PPU_Buffer,X: n/ {, |/ k6 J6 B4 c9 Z% h
- INX: m4 B* G& `; [
- g; P- O( e' h
- .End8 @ z" I8 L3 R y' V3 d
- STX FC_PPU_Buf_Count, A. T. c2 t6 w" I
- RTS
8 i ]6 e# W3 N" w0 Y$ x
4 ^8 e! ^! w+ o% F- ;----------------------------------------------------------------------. l; H9 B* L3 i/ @, H: D% X
- ;音乐曲目初始化处理5 ]+ m4 M; r R1 a. h. ?3 p
- Music_Init_Process4 j- K# q% o5 c$ l' f
- PHA
; y( R# L/ c6 g8 t `: ~ - JSR Music_Clear_Process
/ h* P" U* ?9 x* D/ o" S" s5 N - LDA #$1F
/ m" y8 j% b* Y& G8 ^ - STA $4015
& o X6 r3 l2 D8 f - PLA
e ?% f6 D' C4 A' S1 i - JSR Music_Init_Addr
$ R. {" |( g3 F9 h9 `1 r4 c! @ - JSR Music_Info_Display
0 e/ q6 i* }2 Z - RTS
! f# b0 g3 V8 o9 Z u& o+ ] - 7 C3 y$ }# v( u, I
- ;----------------------------------------------------------------------# F, B* Y# J, w7 d% `
- ;音乐播放处理# M/ z3 g! O/ s
- Music_Play_Process
7 u4 w, f! |' Q2 K - JSR Music_Play_Addr
) E1 u, R% g4 }# C/ ~5 t, B+ P! a, x - RTS
, e4 U! P1 s9 O3 W8 h1 o1 _
1 \7 ^6 Y. T/ C+ q/ Y# |. {0 q- o- ;----------------------------------------------------------------------
1 v: a4 B& A/ ^ - ;音乐播放处理1 y, K$ M" L' R$ x* N, t6 ?6 {
- Music_Clear_Process
5 C! h, S4 A- f6 `" o6 ? K - .IF Music_Clear_Addr
" Y1 a0 u+ W+ p$ D6 w$ D+ a - JSR Music_Clear_Addr
! K2 n7 C, m2 @" M" K3 J; ? - RTS8 t( f4 ~- H' w+ ?! m: g [$ S
- .ELSE1 g( O* @! K5 c. l
- LDA #$1F' I/ H$ x+ k! u: ]6 W' @
- STA $4015, c9 H1 k8 |: d: |
- LDA #$00$ r! O" I9 a) Q7 S$ c- t ~" m& A0 o
- STA $4010. s' q, L6 I$ k9 I' ]: e N
- LDX #$00
9 t/ M3 t: n, [7 M% | - LDA #$00
- k, d. L0 ~8 v9 @9 l, b, H' ^+ _ - 1 r0 v$ l/ c* g; B
- .Music_Clear_Zreo_Page_0
- L0 n3 T3 L. l6 W - STA $00,X3 Z6 M/ Z; l \
- INX
, C0 f" y. X5 t. t, ~0 i; a - CPX #Use_Zero_Page_Begin3 }; v2 T# l% D0 r @# g2 I6 t
- BCC .Music_Clear_Zreo_Page_0; M @5 f- a9 L
- 5 S$ ^6 ^% ^) i4 f
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size# O& J9 X! m( E4 h# J8 m2 J, e2 I+ n) }. H
- .Music_Clear_Zreo_Page_1
6 u, w9 }" W5 n - STA $00,X
5 X0 m" u. \/ [* e! {$ v - INX, Q+ w8 V. A4 X v4 I
- BNE .Music_Clear_Zreo_Page_1
& n+ S2 Y, i& D; f& y, O$ x- I2 j1 n - ' C$ Z) e, S9 V. @; ~$ s7 c9 n& x
- Music_Clear_Process_1+ {8 C7 E: t: ~8 f: D
- STA $0600,X
$ f( K7 ?+ X" x4 U7 V - STA $0700,X
7 s6 F* h) c7 P2 X" D - INX1 h: e2 o# C! k6 o! B$ W( K4 x
- BNE Music_Clear_Process_1
( v0 y. D" D7 A$ I# ^ - LDA #$104 [) B4 B/ Q5 ?4 P
- STA $4000
8 v! G* C# u5 c* f& a5 P& L! Z - STA $4004
) K9 c! Z6 y) x( p& ]- c' g - STA $400C8 e' V6 }' a3 }
- LDA #$00- q3 p; n8 N7 }! X
- STA $4008: \- \; X6 S% U2 M
- LDA #$0F
7 c1 K1 V6 E; V7 d( b& j - STA $4015$ f7 w9 T. L9 f, F' ]2 F' @
- .ENDIF, J6 _9 f" D* b$ S# [7 b
- 2 b& v4 \$ H. Q1 A9 j( x
- RTS
8 v4 s, ?1 `+ y# o - 2 H0 C2 A g# t% {
- ;======================================================================# \3 O, [+ O5 y6 M+ g
- ;重启处理
0 F9 f& ]/ |8 u/ `& j& ?7 }4 _ - Reset_Program
7 b7 [0 Z1 J7 A: _: c2 S - SEI8 y( x, R7 B# x. _/ ?9 X* k
- CLD
1 ?- f( w, M! R. r. B0 M# Z. ? - LDA #$005 o: B( f: R* S9 _& f
- STA PPU_CTRL
; X, t3 u$ C' k( _4 s+ G9 m8 ^ - STA PPU_MASK
3 J, C+ J" ]& e8 b; M( A - STA JOY2_FRAME
& w2 k5 n0 D w; e2 B$ Z, z: i - STA APU_STATUS1 G5 m7 H3 t7 z; c, A
- . g, o' P5 ~( Q8 u0 K1 Q
- ;等待屏幕准备完毕
$ g' ~* G5 j9 H - LDX #$028 P0 p K& _2 Q
- .Wait_For_Screen_Ready
, O, c+ _+ p/ ?/ E1 x - LDA PPU_STATUS0 d0 W8 z @6 A2 ~; O* J/ s
- BPL .Wait_For_Screen_Ready9 P! A, {) Q7 y. U5 O
- DEX6 h& | K* r$ J1 I
- BNE .Wait_For_Screen_Ready
! @) E9 U& [: e9 d5 E, D) S - ' P) _$ Z9 f; S. ?
- ;清空调色板
' N, K* v z, W! ` - Palette_Clear, ^. T8 ^9 l5 B5 b C N2 h# x; |
- LDA #$3F5 ]" S3 N3 k6 f2 P
- STA PPU_ADDRESS
2 v' @8 [. A9 g+ I: H* C - LDA #$00
9 B! U1 s* r/ L7 k: C% V* S - STA PPU_ADDRESS
0 f. V' b! a8 o3 V" `& ^; o; a - LDX #$20! v- L7 Y9 K$ N9 s l/ q k
- LDA #$0F
/ T4 K9 m( a1 J t; w' g - .Write_Data! O/ g! }' n, ]8 n
- STA PPU_DATA
) \/ \0 [4 J5 [5 V9 C - DEX
2 q" [5 H# p1 R% Q8 e - BNE .Write_Data3 q8 m/ r+ D* ]( G6 e; q3 ~
- 2 Y w- s* t3 \3 W
- ;清除声音 $4000-4013
2 M0 W) G# {- u& _+ Q - LDY #$14
* M' i3 Z" W f+ O T - LDX #$00. a& T; N% b, W: j2 R
- .Sound_Clear0 Y+ \6 |* _0 I0 N
- STA $4000,X! U+ d4 E, i7 v# H# F5 s8 C* F
- INX" V: [6 ?7 V9 r f+ {
- DEY+ x1 G! Y! k+ T1 p+ W; u. G( F7 n
- BNE .Sound_Clear! q2 C+ Z% ~6 r% Q
- 5 x- m, {( p: y: U
- ;清除 RAM $0000-07FF
! ^% a; i% Z9 m1 C- o# o) ^; P - LDA #$00
( H3 s4 j+ v2 k4 D$ `0 S" w - STA $00
% x; r) H6 @ j9 k$ h8 P: Z - STA $01/ M/ W' L" E' E( L8 J
- TAY+ S7 v( a0 L8 C
- LDX #$08
$ {3 Q& h) P4 b- I. m2 \; Q. x - .Memory_Clear
( k: U' P1 [, a0 J - STA [$00],Y, | \5 t4 U! y s1 M
- INY7 d+ ~ r% g3 X Q5 C, X. r" w/ B m
- BNE .Memory_Clear/ M3 M3 Z/ a) d6 Z; w9 H2 [& k7 I' h
- INC $01
- q k2 m8 f9 U3 X) b" ]! I - DEX. Z t0 B( [4 }
- BNE .Memory_Clear+ d; G9 Z; j G, t$ F
-
& o* B6 X+ O; V3 ^ - ;精灵缓冲初始化
$ j- `# D5 @$ S) s9 N+ O) z - LDX #$00
% d& C3 o& N* r8 y& V2 h4 h - LDA #$F8
& ^4 q4 p; y& p5 [" E F( ^. S - .OAM_Clear
o B3 D) i! p. T - STA OAM_DMA_Buffer,X" l- P) z, P$ V0 }. `$ c/ N$ o
- INX1 e: X) a9 q2 |1 r! N! M: l. K! d: _8 G
- BNE .OAM_Clear
" h$ H* e8 ?1 y( E0 G2 {% p+ U -
5 y4 H6 A8 t0 A( P2 u - ;栈指针初始化; p' |( y7 r$ D
- LDX #$FF% \( j Y3 i: S3 Z O
- TXS6 ]5 q. z* N0 g' R- {9 J: R/ B9 [
-
/ f! s1 {4 O2 i7 ^/ F2 v - JSR Nametable_Clear;命名表清空
+ g5 S: O) B+ W8 H0 F$ Y& L - JSR Palette_Init;初始化调色板缓冲
5 X4 ? U$ W7 ?; [& @4 ] F7 d - JSR Static_Text_Init;初始化静态文本+ w5 a- }- q: [
- 0 l( J( ]. o) B/ B0 t- z) h5 _
- LDA #MUSIC_ITEM_TOTAL - 1
# h: ^6 L! `1 e6 @9 f4 t - STA FC_Music_Max_Index
1 ?; f2 Q* N) A' ^6 T -
) ^+ N# g) A9 Y0 Z0 B: X1 ] - LDA #$1F8 U3 w3 g2 S1 \! W4 @# N; ]
- STA APU_STATUS2 ]+ r1 J0 F) o9 C4 h% S* `8 |
- LDA #MUSIC_BGM - 1
4 l" \/ s5 G/ W: R: E - STA FC_Music_Index I8 p' c5 O" N/ c, W: E
- JSR Music_Init_Process;音乐播放9 n9 S; m& u3 ?
- 9 |6 U; ?, p- _. E l7 G- q+ S) l
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" {1 w$ b o* {9 F1 A - LDA #$1E! n# j: J. [8 k% h6 O! O/ g$ c4 M
- STA FC_PPU_Mask_Buf- A( R& J& J, M8 k! U
- - f( V3 n6 t# W$ y3 v+ _
- ;启用NMI处理
5 ~! D- J# Q, C- I - LDA #$80
1 J0 C6 b8 F; X( O - STA PPU_CTRL
6 b; @5 Z+ ]" O1 j* d - ( r( T. Y c" F
- ;程序循环, 剩余工作交给 NMI 中断处理, Z/ m% A P/ l
- .Loop1 c* i _* T; i! s: O- E! u& T
- JMP .Loop+ `* h! g0 \9 D; T5 @9 X! A
: d7 T( a5 B8 q, D- ;======================================================================
$ a2 g$ b: {/ N. d - ;不可屏蔽中断处理
2 A1 w3 }5 ]6 e: D( m2 I - Nmi_Program
( z; x3 q/ g& x @0 ? - PHA
# J, V% Q. I ?6 Q. n2 `& g - TXA9 A4 z: r: j4 ~- |) v# |
- PHA
3 R/ C& _9 B; h' R* ~! z4 ~) c8 D! P; v - TYA
$ K8 Y# b1 t7 ^- p! u - PHA
) A& }- y! R- o d& m - 5 t% t# I- B1 K( i+ O8 i
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 s. O- S0 i$ h -
- Q8 P' }2 ^5 _, }3 C - JSR FC_PPU_Procrss;PPU处理/ k: s1 z0 \7 d. M+ x3 F$ |
- , y" ]7 x3 [% Z/ S
- ;精灵内存更新
4 O; E3 ^" y4 m2 z% v - LDA #$007 a4 p: J) F7 B# v1 S k) c+ b
- STA PPU_OAM_ADDR
) O8 L+ ^! [) D/ L, x, v - LDA #OAM_DMA_Buffer / $0100% H) [% W0 }2 ^0 P% {3 C5 T
- STA OAM_DMA) S% V: l- e/ T1 E6 H
-
& t' R2 t0 D# v* e2 W - JSR FC_Gamepad_Process;手柄输入处理
: e) k7 k; ^1 ?% I' m6 p) W - JSR Music_Select_Process;音乐选曲处理
5 N- w& `+ m% P: Z+ o; i - JSR Music_Play_Process;音乐播放处理
) d+ e% j: K# B - 3 D3 N- T; l$ |+ a
- PLA
) D- R0 s; ^1 L+ a! { - TAY' ?4 ~; Y! @" _9 H' |/ G4 i% f2 `
- PLA
) m V. P- w' A8 N: K - TAX
' S3 U! M' |* l6 g4 V - PLA" W [( H( {6 h; {* `" S7 [
+ D6 S% R. ~/ v7 J9 q( l* l- RTI2 z4 ?! A+ r- F5 m% n j2 f& V7 b
, v( Z0 D8 l; m- G% j+ @- ;======================================================================
- @8 W$ P& e' D/ R& R9 O- z - ;请求中断处理
! m1 ~8 A7 f2 o! P/ y$ R - Irq_Program0 ~: {+ u. I! p9 c) |9 C. e4 H
- RTI( Y% u0 l+ E7 T: w6 G u3 ?8 A
- 6 x! r& H7 ~( H* o, ]; X8 d
- ;======================================================================
! x3 R" S3 l s - ;中断向量表- A: Y$ Y$ o' W5 v/ o
- .ORG $FFFA
- e" M+ n7 ` i4 s3 T3 | - .DW Nmi_Program ;NMI触发时执行+ p6 s' s9 `7 J. f
- .DW Reset_Program ;载入ROM时最先执行- {( M9 z; R q# g+ C* m) e% f
- .DW Irq_Program ;IRQ触发时执行
5 |) }! v; k0 Z. `. m5 j
复制代码 $ m1 C6 }" a. p
4 S0 r% }" S& J* V& M
( N7 v# a4 P4 K+ t. ?5 B- m
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|