|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( P* B( i j' ^( d- ~7 V: l

4 }) u. k5 ^3 l/ A7 z以下是主框架代码:+ a2 `; p$ F: F4 f3 V
- ;======================================================================0 y: r. g8 T+ v0 @! o
- ;文件头
- R+ Q$ L* q3 Z! T" Y - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
9 o# y) ^" x* x, n; p - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量1 F( p8 e- [1 M; l
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码' \% b. J4 N: ~
- ;======================================================================
3 o* U0 s& S* g" a- z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2" F1 ^/ l7 Y6 ]
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1: i R& M6 n4 E9 n9 W1 C
- ;======================================================================
: s3 O3 ~ r) c, ^9 I; ?- J3 k - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
( N+ } M1 E8 }9 y) I( L' X, \ - RESET_ADDR = $E000 ;主程序起始地址
# X; r+ `. ], @7 H9 U - ;======================================================================
, z1 n0 J% w3 c& B, s - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB" N0 t- \) U, L7 E) C- e
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
# ~& |$ x; L/ Y1 u" B7 X - .INESMAP 4 ;Mapper号 (0-4095)
) e; a! p2 f5 D* H' c/ { - .INESSUBMAP 0 ;子Mapper号 (0-15)6 N3 M Z# V8 {. F
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
]7 y9 C6 {8 @2 h! e" c - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)+ D. S4 Q' H. t* T# N- i/ Z
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' B) {* s, z- Z
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)2 c8 @' |" F: H. ^) `
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)( U& ^9 I7 L7 z* @7 l1 v
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
# x: |" o! v O - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy); G$ n! E4 C. p, D
- ;======================================================================
+ O( _5 R" w4 m( [4 @2 q( L! w - .INCLUDE "fc_demo_config.asm" ;全局配置
/ n2 A) z$ |. K: ~ - .INCLUDE "fc_demo_constant.asm" ;NES常量/ X* E& D; t4 ?2 ]8 h
- ;======================================================================4 _: P8 E; N3 W
- ;音乐配置# S- v" {+ A9 T5 S+ G
- .IF 0 = MUSIC_THEME
2 Q$ l$ d+ V& o - .INCLUDE "data/music/Gremlin 2/config.asm"- e- \7 u2 n t* O; c
- .ENDIF
- K* W) D' Z: z5 _( Z+ m% s - 0 n8 S8 I4 T1 A. W/ b% I
- .IF 1 = MUSIC_THEME( N% T* c3 s$ B- F* P$ V
- .INCLUDE "data/music/Raf World/config.asm"4 t% h) @1 v( O m
- .ENDIF R7 \2 Q& h2 h6 I( h1 j
- " P- P* C7 `% a2 u5 N S8 O
- .IF 2 = MUSIC_THEME , o) V4 {+ {6 G- w& Y: H
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. w" B& s z7 k8 ~( e7 F9 E( R- p - .ENDIF
; O* d- Z, x4 b - 7 J- e* c' l$ L0 _$ x0 k. V0 R
- ;======================================================================4 D1 ~" ?; Z" g" s& w
- ;引用CHR图像数据
( |- E. T3 y P - .BANK NES_16KB_PRG_SIZE * 2) m0 T I& W% M5 _5 P
- .ORG $0000$ ?& X3 Y* C9 O# a" x0 f. I
- .INCBIN "data/bkg.chr"
6 T# I1 Z7 ^3 I - .INCBIN "data/sp.chr"
' S0 a2 h9 ?7 a, C% u+ T( P; P) ] - 5 m+ x" F1 \4 m1 W# q5 `
- ;======================================================================3 A& c( |% L* c; m* p" G! ~1 q
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 g3 G' A. r' _7 q5 i - .ORG RESET_ADDR3 o; x8 e# [' L* g* j. Q
- ;======================================================================4 K7 r/ D8 R' ]! i
- ;引用其他源文件
2 D5 B; K+ ?% f8 x' ^( O9 O# U - .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 P0 y3 x8 ^3 G4 Q; P2 g
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
, j0 L1 e9 T- z: O. D0 c. G' g6 ^0 J( q- o - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理* }, z& ]0 R/ L$ i4 N" z) g
- ;======================================================================
% A1 F1 z, U" k/ | ` - 3 F. N, l" N }& g" x3 K" c: N, Q
- ;======================================================================
9 d8 }! I+ Q, K- V' H - ;等待VBlank到来
1 u- A7 S7 o, A - Wait_For_VBlank
) @2 i# H: t! p5 t$ \) K" J - LDA PPU_STATUS0 H- }+ w4 \0 a8 U. Q% R8 x
- BPL Wait_For_VBlank" m+ O. I% j; f% `& ?1 U
- RTS
) M, }, B2 ~5 D: @! |
/ h& ?, W' g' g( ~7 y2 I- ;====================================================================== O; _9 S9 m* C. X' E
- ;调色板初始化
7 M0 V$ _ x- v! P( P, H+ L8 M - Palette_Init4 I5 Q) N2 W! {" z6 W
- LDA #$3F
! P- W9 V# s% e: T - STA PPU_ADDRESS
& w/ G: M1 L. S9 W7 X7 }2 X - LDA #$009 j/ l$ ], X$ @4 ]" ]7 o0 ^3 }4 @0 `
- STA PPU_ADDRESS
# `$ s2 w. C( [ T$ G3 F f- v - LDX #$00$ C% ?+ o$ B" E" B6 m
- LDY #$20
" S$ J2 H0 |3 O9 B" O( g% ~ - .Write_Data: T, L! c- M9 [$ K5 a/ K1 n$ I( ~& @
- LDA Palette_Data,X
/ [% I; J* l c - STA FC_PPU_Pal_Addr,X
1 W. c: a& M; x# c+ t6 D2 x - INX
* r1 T( h, U K' ^( b' k - DEY; _6 w" l( A* c% S. @3 L
- BNE .Write_Data, ?% n# d( F- u) L
- .End
: [9 e5 k0 D5 u( M% {4 t - RTS
2 l0 X9 Q$ U) A/ W) {, Z' ^0 e8 }
1 g7 a7 [8 V3 b/ H4 s% T- ;----------------------------------------
) _% P O7 f, ^+ |4 ]# J/ v - ;调色板数据
; Y7 F5 ^( d0 Q! D1 B$ a n4 U - Palette_Data2 @3 M% B$ X% l# c8 r, Q
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B' g5 n) \! @, C+ v' n% z) h
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' S7 n6 u# T& K/ p7 g - * i7 ]$ v) e @$ H+ e* h
- ;======================================================================! t3 r8 e$ }8 A
- ;命名表清空
( b6 G- d ]) z v - Nametable_Clear
2 d6 `$ S0 f% j& A* `. z2 v - LDA #$20
3 I7 |4 Q* g$ W6 B0 Q - STA PPU_ADDRESS6 [) h1 f, Z! j
- LDA #$00. d% P1 X& K0 k% G* ]
- STA PPU_ADDRESS- E" I0 H3 t5 u# E6 T' \# A" B f
- LDA #$00
# d* w% a& u( C% c - LDX #$00( P5 h* Z% d- T: G% Q+ }
- LDY #$08
! b+ e* U/ q9 b3 f0 Z- R2 ^6 v& { - .Write_Data% h; J" K3 _9 c( J
- STA PPU_DATA
n1 b3 E* G# P' P$ ~- X - INX4 y5 I0 c# B- c
- BNE .Write_Data6 G5 [5 Y- e2 F# M
- DEY" l4 D4 p3 U9 S/ B& r# N2 v6 u
- BNE .Write_Data
; R; Z( d3 h& V, A( }0 J( _% j - .End. B; B$ p$ ]6 B0 G* E
- RTS8 [; }, L% N1 _/ A; ?0 o+ X3 p" K
- * |+ A" Z! @6 J/ M, M9 L* e) X5 G
- ;======================================================================
$ h" r# S, V) W6 _' X) p: o( @ - ;音乐曲目切换
4 ^5 Z1 Y C2 j% O - Music_Select_Process; r1 v2 }, l4 C# x8 k
! o! ^+ h/ y8 c- .Pre_Music;上一曲
1 S$ P$ ^1 A, i - LDA FC_Gamepad_Once
2 T4 I( v' c5 o: O+ l V - CMP #JOY_KEY_LEFT) E) c: R+ I0 P& y! F; q9 @
- BNE .Next_Music( ?$ @' z0 V4 b+ A
- JSR Music_Play_Pre* |. A/ z4 } E9 |1 c Y/ p
- .Next_Music;下一曲" g# ]& V, s9 N5 f
- LDA FC_Gamepad_Once G' c4 y1 k: W/ Y8 i" y9 D
- CMP #JOY_KEY_RIGHT
9 n) S: _! V# ]) ?+ M! S - BNE .Next_10_Music
. V! `* o$ U' | - JSR Music_Play_Next
6 H U2 C/ g& h) S9 J1 }) Q6 w - .Next_10_Music;上10曲
3 f/ N2 l6 } e% I1 c. Z: v0 l - LDA FC_Gamepad_Once# m4 i c5 \! p; C
- CMP #JOY_KEY_UP9 T" O( X8 v2 [4 z) U
- BNE .Pre_10_Music
: c* ~8 B M: n$ ^' E - JSR Music_Play_Next_10
- j' c) Q( a8 d - .Pre_10_Music;下10曲
$ k3 H* K* P0 m4 k: d. U0 ]; @ - LDA FC_Gamepad_Once
) T: |) X3 l( c0 i' o# ?1 W - CMP #JOY_KEY_DOWN0 c! n) g$ O" T
- BNE .Reset
( h! ^# q3 P7 t7 o* A* _ - JSR Music_Play_Pre_10
/ s0 Y8 j& Z9 [: e - .Reset;重播当前曲目
/ q7 W) @. c/ K2 K$ c" l' k - LDA FC_Gamepad_Once7 i" S: @2 V. c/ I, S% Z
- CMP #JOY_KEY_START
1 T7 x% J, q& \9 a - BNE .End* N! W- z9 t- w
- LDA FC_Music_Index; N; c3 g Q8 |( q! p0 }; q' E
- JSR Music_Init_Process/ T' W1 ^; G+ O8 _8 [
- .End
% c$ ^, w# b3 l6 M - RTS. y+ a+ q1 j: c! A' V- n, b
- - M: s0 R4 [% m$ X( R: d
- ;----------------------------------------------------------------------( K- Y) N u) b1 {
- ;播放上一曲
3 t6 ~/ ~" |3 n0 p5 O - Music_Play_Pre/ x: Q- t6 [; k) C
- LDA FC_Music_Index T# Z K4 T' u6 n. W- R% t) A
- BEQ .End' s+ ~$ w2 @2 n. ]* T1 m9 c
- DEC FC_Music_Index
+ ?9 a6 g; c' \& D/ v2 k# y g - LDA FC_Music_Index
/ |7 |7 s& J" Q& w! G; w6 i - JSR Music_Init_Process
- q' ^5 s9 N/ N - .End: d0 V& B4 e6 p1 h1 G
- RTS! H0 g) S/ T) N* K( U
- ;----------------------------------------------------------------------; [3 L: u+ U8 F6 x5 S6 c% z* Q
- ;播放下一曲
1 s3 A3 b4 E" C* D2 s% v9 y - Music_Play_Next$ B8 J6 M8 X/ a$ r
- LDA FC_Music_Index
( R6 {; y0 b% Z! I! u! V7 |' r - CMP FC_Music_Max_Index
" K9 D" }! H6 b# Z4 f6 d1 q - BCS .End3 ~' B3 Q5 l! t0 K) f6 q" K4 |
- INC FC_Music_Index( t! ^* h0 v d) o) c
- LDA FC_Music_Index
+ l- Z) V9 P$ b+ l9 C/ L- B& E; H5 d, z - JSR Music_Init_Process8 N& e, W; x+ N* ?5 H0 E) s
- .End
9 P( u U$ S0 G8 x5 {4 ? - RTS
0 O, K" U& h5 @. _9 A$ Y, C
7 B; a! A% w& K. T f+ G% r! H- ;----------------------------------------------------------------------6 r3 J a+ V; Z# ~- R# _
- ;播放上10曲- _, m2 L9 w3 D9 S5 K: l
- Music_Play_Pre_10 E0 \2 H! K/ E" Z
- LDA FC_Music_Index2 A: P; P/ Y* a4 d9 \. {* P' v0 e# Y
- BEQ .End
7 L% o3 ^# W* x2 ]9 d* w. v - SEC: C9 l9 h' H0 f8 {2 u4 c
- SBC #10" _* S0 T0 ^6 F- `7 a! S
- BCS .Pre_10
% \2 @% S' Y$ u# Q% q+ O3 X - LDA #$00* r# G1 H; D3 p& U8 c& x& e7 D' H
- .Pre_10
% ?# O5 c: g' w9 n8 A% J - STA FC_Music_Index% D0 I0 C% ^4 l) ~2 p: x- ?4 I3 R$ i
- JSR Music_Init_Process
5 t9 p( M6 N' g/ w: N, ~0 s# W - .End
% T; t v! k5 B' I- p - RTS
3 Q3 s3 a# u# J* s; |% r - ;----------------------------------------------------------------------' C" r9 d+ J# A0 [; ~; S# ]& J' {
- ;播放下10曲
. g. k6 w7 J- Z' j4 {( S0 _ - Music_Play_Next_10
9 Z) ^! v" f) M2 |- y& Y' f0 l: | - LDA FC_Music_Index0 n0 Y" k" V1 V6 l
- CMP FC_Music_Max_Index' y. H/ m j( j8 _* e! J4 S" m
- BCS .End
! |# V: L+ v- S - CLC
3 P( t7 F$ b# d2 t4 W0 j6 y - ADC #103 I+ w! B1 ^1 j R% p1 W1 p0 M
- CMP FC_Music_Max_Index5 F4 E' t0 t5 Z- A: Z0 [9 e
- BCC .Next_109 ?; \& ~4 q; B& r1 s" X0 a
- LDA FC_Music_Max_Index' I- r9 T9 W1 ?+ o4 z/ ~; d
- .Next_101 ]! b j9 v# O2 [! |
- STA FC_Music_Index# Q1 U0 o) O8 |5 l
- JSR Music_Init_Process
! A, _7 L' ^9 |; ?& h; H - .End+ X- T- {- N1 \& X* w0 m
- RTS" I a0 W. x4 x
- $ c! s2 h1 h, f' T5 R& S
- ;----------------------------------------------------------------------: K5 W: [; H( F% V
- ;8位十六进制转3位十进制制4 W! X0 \& r* F
- Hex8ToDec0 n! g) C& J4 b W, F. m
- STA FC_Dec_Data_1, z5 B: |4 y& m
- LDA #$00
0 o, X( z( c7 R" } - STA FC_Dec_Data_100# t9 c& z9 C# ?7 ~) v! g
- STA FC_Dec_Data_10" X4 ?" a' z. w0 v& n/ `1 Z3 V9 q
- LDA FC_Dec_Data_1
$ Q& P. a3 ]& c* y6 n% V/ R6 o+ g - .Convert_1006 i4 i7 F1 N" s" `$ Y, w( j
- CMP #100
5 M4 V# H0 C6 v# |5 r( m$ K; A s - BCC .Convert_10 H f" B1 H1 K: m8 H
- SEC
% q! d" J% c0 _* ?1 Q6 h4 f3 n+ V - SBC #100
$ ]4 A+ a( l! Y8 q - INC FC_Dec_Data_100# I* A* p: @& j% b
- BNE .Convert_1004 r/ x* ^0 v; b7 g& a
- .Convert_10/ Z8 Z4 O3 t2 g! k, s6 y& S# ?8 h3 N
- CMP #10) S/ {2 h, s5 i5 O. |! s- H
- BCC .End
+ P! B z& k% N5 I5 t9 N - SEC
! X3 a' j% {2 t/ ~7 e. }. a4 R - SBC #10
5 ^4 g; Y6 r1 |/ a' a- W2 h - INC FC_Dec_Data_106 v& x1 ~# }2 T! A9 \
- BNE .Convert_107 q: A- y5 Q7 Z5 c
- .End4 _" `& @- p0 z
- STA FC_Dec_Data_1
+ S: @# N0 ^4 |, j g; ~, k - RTS; D* E4 P8 D- Z+ v4 t
- , ^" t1 s' e8 R$ y
- ;----------------------------------------------------------------------
" E- N1 e4 u( \# N3 b - ;显示曲目信息% H# H& f( q. ?1 t! ?9 ?
- Music_Info_Display6 U/ c! q' W5 j! H
- LDX FC_PPU_Buf_Count
) F7 ` u' @) ] - LDA #PPU_WRITE_MODE_CNT_LINE
9 A# [# U! V! _; }% p( G2 O - STA Use_PPU_Buffer,X* Z' y5 ^# a* t% D7 P3 s
- INX: N# [. x: o1 Z7 T# r
- 6 n" G7 N. Q; k' }/ ^+ s/ Q
- LDA #>MUSIC_INFO_POS& j( u# i U3 g9 {9 ~/ i: g
- STA Use_PPU_Buffer,X T1 r7 M: }1 i$ L, \' Q3 a
- INX, z/ W% L$ H" l: r
- 7 r% L5 S, L5 p) }; S1 J& s
- ;居中0 a4 a$ S6 L6 J, j. q
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2" r+ |0 Z' u4 ?. W5 @7 g z
- STA Use_PPU_Buffer,X2 g- _5 F! L8 D+ N) M( T: k7 S2 b: Z! P
- INX4 z* b. y' m9 C0 Q! @) R" M' {
-
* T$ a5 r5 }' U2 o) n- ? - LDA #$058 l8 w6 s- P' Q" C. g% }$ x. t
- STA Use_PPU_Buffer,X% K) [# R0 B9 D- n5 \" N1 _8 q
- INX: |9 ~- U) A6 y' F# E( S
-
M. G# C3 y9 ~8 U4 l - LDA FC_Music_Index
9 I1 }, }; S+ ]6 N# r& @ - CLC( i Y$ e4 \7 f) T, {7 ^' N
- ADC #$016 \8 r' Q0 O1 ~, M: ]% U+ ~
- JSR Hex8ToDec2 B) |4 {7 D; u, t
-
2 I5 p) a5 b. F' f% N8 _ - LDA FC_Dec_Data_10
2 o/ B/ R# U; E H% y* n5 V; K - CLC' {% y$ t* V% h' s+ `1 q% M
- ADC #'0'3 \0 ]+ E( Z9 X" m& o( X# v
- STA Use_PPU_Buffer,X
' M$ F- ?; o; G' m$ O2 \+ J9 Y - INX
0 H4 J" M8 S0 e* Y - " r* s3 Q8 N7 @/ x
- LDA FC_Dec_Data_14 ^& X! f) i' E: O- B: X' H
- CLC
5 N, E2 r' n# _3 q8 L0 U - ADC #'0'6 V" z" G9 V6 Y
- STA Use_PPU_Buffer,X& x: H; @% I: ~6 F
- INX8 m9 w1 t8 r2 D, F$ A9 ~' I5 S
-
3 i2 `) [6 V! ^0 A! m% g& u1 B - LDA #'/'6 Q& ^$ a2 X* _# u* l
- STA Use_PPU_Buffer,X. A8 a" q! l, r6 G3 o( K; h- U! j
- INX
0 ?3 l, I& c3 ]. D5 P - ) z1 ~$ a. c s( B
- LDA FC_Music_Max_Index5 z. U$ F3 [% \* n
- CLC: [- |# J8 X& Y) `" b
- ADC #$012 U: R8 p, ]4 z
- JSR Hex8ToDec
, R1 B1 [- F' j/ ]" o1 Q6 ?$ Q | -
: {! w: z, m% D - LDA FC_Dec_Data_10
7 n/ f7 a& W o0 ]* d - CLC
0 d: r& m# h( W1 r# R% s - ADC #'0': e' e. ~: H" s0 j- {
- STA Use_PPU_Buffer,X
# r* F& ]7 u% Q( D! u6 h - INX I( K8 k* R# D
-
2 w3 Z- v# ~) r7 m. c - LDA FC_Dec_Data_1' g4 _. z: u1 P) O. O
- CLC9 U0 w! i B: p' ^* `- G9 Z4 j8 }
- ADC #'0'/ R% T6 C% N2 K/ V* n& L
- STA Use_PPU_Buffer,X
+ L8 J# M+ R' C0 M - INX; u/ u1 }7 l. B" G* N
- ' ]- Z0 J+ ?( e" V1 L
- .End1 D4 I6 y8 d! @" V
- STX FC_PPU_Buf_Count( v6 D0 a1 S! m0 Z3 e! F2 f7 q
- RTS/ x2 J' ^& U5 p9 i
7 I3 v* [. E* b; W6 N# e- ;----------------------------------------------------------------------/ q/ g/ r- z& O; A
- ;音乐曲目初始化处理
6 l: Z5 A1 W/ ?. w1 b8 P - Music_Init_Process
% e$ h- q+ o/ b+ N- k - PHA
# _1 m! y: @( N X* @ - JSR Music_Clear_Process# v7 t6 `( ~! {) C, G# P; _: _0 n
- LDA #$1F% E! T, \6 x" K$ _7 N5 h* P0 ~3 v5 Q
- STA $4015
) W5 g4 K a3 k2 _% W - PLA
! k; s- I( b% ~$ u - JSR Music_Init_Addr
2 W. r0 C& c5 O/ m2 `. b - JSR Music_Info_Display
# W9 i' V) r% t' r/ a9 I* ^ - RTS( J- p+ a/ S4 j: H8 e3 v
- 3 J. Y% ^$ a& _8 v. z
- ;----------------------------------------------------------------------! A6 l- `" F. z$ | V6 ` [
- ;音乐播放处理5 O* h+ `0 W9 @1 U
- Music_Play_Process. s1 E- |1 U9 t. ^3 ^' L o2 S$ s
- JSR Music_Play_Addr
0 q$ |) L+ W; G0 r6 }8 j - RTS+ U& ?3 V' n1 T( a; R1 d
- ) d0 N* B l, S- G
- ;----------------------------------------------------------------------
' u4 f0 S+ ?8 } - ;音乐播放处理
5 V* a o0 V8 W1 x4 I* f - Music_Clear_Process/ p9 w7 l* I) `1 w/ q) t' `
- .IF Music_Clear_Addr" x6 c3 I. i7 F# e6 w
- JSR Music_Clear_Addr3 b+ I$ G( b6 l! V
- RTS
: N o9 H% g7 s% @7 X' n, C - .ELSE2 @3 k I# V9 J+ P E% \( a0 X
- LDA #$1F2 [$ h8 ]4 d9 W) _. N
- STA $4015! ^" c! T* Y+ a" y5 R9 i7 O
- LDA #$00
' r- b8 Q5 Q% s0 W r4 u( l$ o - STA $4010$ H0 v; W9 R y
- LDX #$009 l5 m* T* ~* d- R) d
- LDA #$00
I9 P# L$ k! s& x -
- m+ Z. t' o0 L" V; U8 ^: R7 A - .Music_Clear_Zreo_Page_0
0 h. G$ {8 r+ u3 X* v& [3 t - STA $00,X
7 p" s8 h% a3 q g I" R$ B - INX, Q9 C+ `( }# R8 l0 e1 X
- CPX #Use_Zero_Page_Begin
' M3 |* C! h1 Y6 e" r - BCC .Music_Clear_Zreo_Page_0
( @! \( m4 V9 D- {, A6 d: i1 C% D2 u -
9 y; J$ F4 {+ z - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
2 i# A+ K' d/ H2 _$ i9 D" @% ~ - .Music_Clear_Zreo_Page_1: T, L0 {2 o Y' t6 t% N
- STA $00,X
! y, N9 w0 h, H$ d4 f - INX
' c; U* _8 N! r7 A - BNE .Music_Clear_Zreo_Page_18 T& s" I/ U7 h U
- 6 i n1 x: {( y# J+ O
- Music_Clear_Process_12 t1 Y9 }5 i2 M: o4 B
- STA $0600,X
) a. A' w9 A" p% X4 x4 w3 ] - STA $0700,X5 e6 V! i1 \/ B2 [) n# f5 B1 @
- INX
v# ]# M1 V: c) x7 n, [ - BNE Music_Clear_Process_1
) _: x: T1 F% R& u - LDA #$10
/ g2 D: \. E; b" X) O) Y - STA $4000
% U, f$ M$ C; @- F - STA $4004
- Q6 M6 H$ q1 {, n - STA $400C* T# j% \$ D1 W. n% b+ s) g* k
- LDA #$00
1 T7 Z; {( r2 c+ G - STA $40083 Y% u" H1 }/ L! \* n
- LDA #$0F
" G9 K1 Z/ }* y9 y - STA $4015
1 L0 _% ?# X. w* T+ x6 A2 D( ~1 w - .ENDIF
$ q$ X( o! T4 A9 ^5 X -
: E; e" |( D r' B - RTS" h0 X3 @5 ?% C4 A1 x
0 K. m/ Q3 L$ O$ r$ q- ;======================================================================! m! c4 S# n7 o0 g" @8 U
- ;重启处理) x7 S" R8 j7 \5 ]
- Reset_Program
6 i# x' H' {& u - SEI/ R% P: \; K; `; n" N
- CLD
; q' H8 a: `; V: t9 ]; \ - LDA #$00# i2 \) T5 ^- H: p
- STA PPU_CTRL; E3 [$ \/ t2 F. {! [6 F" @
- STA PPU_MASK6 L% U. O% U8 Y+ h6 V( H
- STA JOY2_FRAME
% t$ h$ `) x3 J - STA APU_STATUS$ G! g: ~* W7 Y( a* G: \
-
( q, ]: x6 M) S0 a1 G+ J - ;等待屏幕准备完毕
1 G0 h8 T; L; E - LDX #$02
* o0 ?1 U7 D" a4 ?4 q8 `7 ` - .Wait_For_Screen_Ready8 y; t0 o# [% n! V- l
- LDA PPU_STATUS* {9 [& o) e8 y4 p' R9 F6 ]3 E
- BPL .Wait_For_Screen_Ready2 o" B/ u9 J' X& P- T: U* \. o1 \
- DEX7 Z0 w3 D% y" i5 S; s0 Z& P% h4 I7 X0 t
- BNE .Wait_For_Screen_Ready
8 D& y3 S6 O+ U" ]: M! X -
/ b8 s' V. G, \' J0 l( M# n - ;清空调色板
& E% W6 H( }# ]! V, p - Palette_Clear
/ ?# i6 d8 a! v c. M8 h: r - LDA #$3F* i" k! x7 o0 a z' S
- STA PPU_ADDRESS4 ^- U7 ?7 t% K& I5 J `6 [
- LDA #$00
# M2 s) {- x, T* V8 N - STA PPU_ADDRESS* ^) J U9 W2 h2 W9 ^$ d
- LDX #$20
# ]# r7 n: W1 d) X/ i% }8 T - LDA #$0F
" s, u9 _% O5 u0 Y& y4 c* t - .Write_Data% [$ u, }$ r* \" H* Q' a
- STA PPU_DATA
4 T2 _, V; _8 o3 k! f - DEX3 @5 `+ \* i9 q
- BNE .Write_Data8 p4 G. K( B. ^! w/ T6 k+ ]
- 4 r( S3 h$ @, P) t/ V N# R
- ;清除声音 $4000-4013& B) L# U5 P6 H, b
- LDY #$14
, l: A7 K5 T. z; j# x - LDX #$00
4 r' Z1 E6 |+ `- Z6 |6 A - .Sound_Clear
1 c# u) J5 [7 K2 b) T+ `6 l$ s4 v - STA $4000,X, F4 u1 B$ Q7 E' a& R: c" u1 R
- INX' v! ^( x% m% s; E- m# y
- DEY
3 ]% c( |/ \/ {% K8 I* { - BNE .Sound_Clear
) L5 \" J+ y9 d1 u- E* G: ? -
+ f" z0 a( x! ]7 C3 W - ;清除 RAM $0000-07FF
' O( I2 w b m' S' d1 g5 z3 }2 G - LDA #$00
- P u" M' a) ?' w7 v/ e. B. Z* Z - STA $00
! e" l! ]& K; X( B( ~ - STA $01
2 n8 q1 K5 u6 p# n - TAY
- {7 _: y8 G# ?$ R2 E9 e- I - LDX #$08
9 N, L l! w# B& A2 Z5 w" c - .Memory_Clear
5 R. j3 M% F3 X: J& o4 ^ - STA [$00],Y
* x( h/ i3 F; F8 c0 b - INY* w3 V3 V! ]# T
- BNE .Memory_Clear
1 H% k! y( F6 }4 m5 x1 X - INC $01
) E' w$ w6 F' G h. E2 W; P - DEX
* j4 }8 E, i. t' Y9 c5 c - BNE .Memory_Clear9 c1 \4 L- C+ b; @# P5 F
-
# S# j8 n+ d# [, ^0 ?& e - ;精灵缓冲初始化
1 q3 e) l! U0 L - LDX #$00. ^1 F9 k* S v% E
- LDA #$F8# C/ O& O; M) \ _
- .OAM_Clear
& i) r& H0 y% ~ - STA OAM_DMA_Buffer,X. u% N; }! [0 b% ]+ _8 I
- INX
2 r! S0 C$ T& O+ j1 j - BNE .OAM_Clear
! O# N1 m4 D' N# c8 Q9 q; O1 s1 k, m -
8 K( c5 O: I6 Y/ V! v& {* u. [ B) p: M - ;栈指针初始化+ L- M% u f, N2 h" A% r I" i
- LDX #$FF+ u' L6 s% i; a3 a
- TXS
- {7 n4 m2 c: z9 p - 5 v. B4 ^2 ]9 M: k7 R# v9 y( k
- JSR Nametable_Clear;命名表清空
2 x& g( Z" N5 b e! }( C0 }% I- s - JSR Palette_Init;初始化调色板缓冲- P- J& ]; \2 x4 V1 Q6 I
- JSR Static_Text_Init;初始化静态文本
9 d' l; g, G' n$ G5 E* X0 X -
! Y1 w9 T* A* L, Q - LDA #MUSIC_ITEM_TOTAL - 1
8 k" |9 L* e( u - STA FC_Music_Max_Index+ S4 ?( s4 C, a- @. h- q
- % Q3 q+ a# D3 X/ N7 }1 ]4 w* U
- LDA #$1F
" Y7 {& w8 H! i7 [7 ~ - STA APU_STATUS
' ?. _. T! b" E# E2 i, B5 U; W - LDA #MUSIC_BGM - 1, s# L$ n1 |8 p! p
- STA FC_Music_Index# U+ z$ g( q. ]( M4 e
- JSR Music_Init_Process;音乐播放; v. Y8 Q: R/ U& Z) B! {
- * J" o' o, e3 u$ k
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
2 M6 S" a, [+ k5 {* U - LDA #$1E$ h2 l t/ r$ L& A( D
- STA FC_PPU_Mask_Buf& _3 O7 \/ W8 B- g- ^$ k& `1 [) g
-
& S" z: B/ e6 G# X+ W. n( h7 s - ;启用NMI处理) n4 j# |; F$ t6 k
- LDA #$80* y; x$ l/ ?% F G
- STA PPU_CTRL/ o4 Q- k) l& n- Q5 J/ \9 K
-
: R6 e* ?$ K! a! a' g - ;程序循环, 剩余工作交给 NMI 中断处理
( t* |! j, ~2 D5 E+ x - .Loop+ x$ F, f& ~1 E0 M6 x; p8 b
- JMP .Loop# M$ a6 h, v. M Z
; G8 D* N, [7 y0 G2 A6 M- ;======================================================================
- Y/ p# O! i+ U - ;不可屏蔽中断处理# U0 _: y+ d4 }4 e. L- U! r# H4 q: O
- Nmi_Program2 Z) \" [7 f0 a1 Y! q9 G
- PHA. w5 L" C5 N2 H
- TXA
R9 P' u) [# _! Z6 J! A - PHA
3 @ k7 `- ` D6 z' F4 F - TYA
6 h2 M" h! Q: `4 E k - PHA% J$ f8 n I( ?8 h Z R
- % M: s( C+ c1 e+ ?
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
: U8 D, a1 k% l7 l$ m - 6 a$ T; V( D s* f8 w% i5 S
- JSR FC_PPU_Procrss;PPU处理
( S8 U7 b6 t4 Y% ~ ]8 v5 d - , [0 f" [$ o \0 o% O+ F" N
- ;精灵内存更新
C9 k' B$ g0 g6 |/ [5 r - LDA #$00 J% W( b9 b' t
- STA PPU_OAM_ADDR
- g+ X8 J6 F% t, D ~3 v( V - LDA #OAM_DMA_Buffer / $01004 E- W( B6 ]* J) @3 y7 J5 H: R: I
- STA OAM_DMA4 |7 D/ D$ f, e/ y$ L$ k/ W, o* u8 S
- 1 q. T# V/ K" ]$ U
- JSR FC_Gamepad_Process;手柄输入处理" h, K: i% P& K4 L
- JSR Music_Select_Process;音乐选曲处理
: p+ R) b" v7 x - JSR Music_Play_Process;音乐播放处理8 n/ F8 ~6 p) s8 ^0 C
-
' I! U4 h( b5 {% e - PLA; l* `( V* k% u/ ^0 g4 ~
- TAY: c4 o# {& L/ n+ v4 R
- PLA# O) J v# }! ^7 L& j
- TAX
2 O$ g0 V3 }% H1 F9 t- Y, n - PLA
$ K* s7 H% _6 \
- Q: L; H& m4 a6 @* N- RTI) I. I4 Y# x+ W
$ n4 b! r g1 o [. f4 ~- ;======================================================================
& H) T& E8 w) u9 l/ M2 p. j - ;请求中断处理: d3 I3 ~+ [! E
- Irq_Program
?& L$ c) \+ t9 f! G - RTI
2 C5 y9 `0 z. E& C5 [( t8 p% m. F - * _/ T; W1 b% h
- ;======================================================================
, T( q$ S* e8 m5 o( i; o - ;中断向量表- `0 d4 ~$ s5 d
- .ORG $FFFA( k/ Q* ~5 z9 j
- .DW Nmi_Program ;NMI触发时执行# r3 C" \' m* g N; A! Q
- .DW Reset_Program ;载入ROM时最先执行3 c2 k9 A0 F' E0 V' h
- .DW Irq_Program ;IRQ触发时执行
9 {) ~2 c. ~9 J" ?
复制代码 " g; V4 N# S! {2 C
0 f5 e' N6 ~/ [! O1 y8 Y
2 A+ m1 K) G. K* ahttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|