|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
1 i+ X7 \/ e: f! W; @* y
# D3 M$ I$ |: ]0 V( `* U以下是主框架代码:0 N9 `% R2 Q- |2 A! w. T
- ;======================================================================7 _) B, Y. }* m+ S$ [8 \" j
- ;文件头! z. X! L- A9 `/ l
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量2 x" n6 p7 X7 D2 q$ g" E/ G% C7 H7 l3 J
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量+ C" S, Z! `" L/ H, r J
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
. }7 n* \' n' h - ;======================================================================" h6 M8 @* E2 Z; H
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
/ G# w% z3 }& `: o, n7 Q - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
7 F3 [1 U& \/ ?1 }4 ]9 s - ;======================================================================$ o. {- {, l5 s4 g }6 U: `* h; p% Y
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
/ J% S: P% f* C( j4 Q - RESET_ADDR = $E000 ;主程序起始地址
" k% ^( h0 G! ], }. d; k - ;======================================================================
' @) Q3 S0 v9 A0 q4 a - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
0 o, H4 Z7 f5 b% M* a - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
0 K2 a9 K0 b. g: c$ C: z0 _. P - .INESMAP 4 ;Mapper号 (0-4095)! c2 A# I' n6 q$ M- |6 r1 u. I! B
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 C' Y8 [$ X) ~4 B$ f
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
3 b1 S1 C3 w! q - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# z& R5 L3 i, \1 D/ ?6 J( Z
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
+ F* b/ x: `* {! L8 @1 d - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数); v4 n% _/ I; d, m
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% t. {' f) v- @5 y, r5 \
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
2 J- s. ^5 ^, S- K) I* [ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
' A# e6 f8 m% R @* O6 D% L - ;======================================================================1 {4 H# [! v+ m& i! R' j
- .INCLUDE "fc_demo_config.asm" ;全局配置1 J- }) n: i4 l- N8 Z+ F3 B
- .INCLUDE "fc_demo_constant.asm" ;NES常量
& L, b Z+ }! j9 `% A! i" V - ;======================================================================8 `# V/ K4 q- ?! E; j# p
- ;音乐配置
8 @" E* ~ T: \3 Z' a9 B - .IF 0 = MUSIC_THEME
. V6 ~. A, O: t& X - .INCLUDE "data/music/Gremlin 2/config.asm"
$ b" W& G3 x3 L4 L& y - .ENDIF
/ l1 f6 L0 }3 e, D -
9 M+ d r: U, d" _ - .IF 1 = MUSIC_THEME
' z/ @1 y2 ~' E e) } - .INCLUDE "data/music/Raf World/config.asm"! d6 Y4 h0 q2 ]$ ]1 M% _( b# p' x
- .ENDIF
/ E8 l1 x: z! W J' V -
; i+ e$ E3 C7 T; x - .IF 2 = MUSIC_THEME
1 K6 I, }4 S1 B% q3 T" f9 U9 F; ? - .INCLUDE "data/music/Ninja Gaiden 3/config.asm") D* w# s; F/ D0 P! E0 h" _
- .ENDIF- s) I* y* D) y) J, O9 K9 e
0 p* B- G/ s2 x( u- ;======================================================================+ n; A) S1 |! D {9 C+ c& X
- ;引用CHR图像数据2 c; h& {. y* q5 n/ E
- .BANK NES_16KB_PRG_SIZE * 21 b$ }1 Z l' E+ S- q6 X& x3 U' O
- .ORG $0000
- u2 I" \7 ?: w - .INCBIN "data/bkg.chr"
. m+ g- ~$ \; y) c; N - .INCBIN "data/sp.chr"
0 _9 g/ C6 p) q* \+ R - , c4 a' L1 o1 ^2 _$ y" b) [
- ;======================================================================8 s8 l% r' d5 K! S
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank; K8 g4 _+ P, a) R, q% G
- .ORG RESET_ADDR
# ]) D+ t; ^$ \2 ~0 {7 S* J7 s3 t - ;======================================================================
; \- R0 u* I( ^4 U) g - ;引用其他源文件
/ v1 w. J8 D5 E1 S - .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 S" f9 d ?2 e% a E
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
# u9 b- R9 E) }/ ]+ s - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
d7 \( i: l+ k2 y - ;======================================================================
6 I7 T/ x& B& G- ]/ o - 3 C w6 l5 F3 l/ ]: x
- ;======================================================================
, H8 ] A9 P7 u4 d% V - ;等待VBlank到来) p X% E" Z" x+ \8 X" G( n& I) {
- Wait_For_VBlank
% p w3 A P/ [- e' f - LDA PPU_STATUS" N0 ^1 S5 }1 L, l
- BPL Wait_For_VBlank" o$ k6 z2 W6 ]# V; p
- RTS' T# u7 J Z' V( k# j
- 2 m6 O( o2 \, m/ W5 g5 q# P3 ?0 c) j
- ;======================================================================. f' ~; d4 @, D/ z& Q
- ;调色板初始化5 U0 S4 ~" K* U. B1 y
- Palette_Init; B: V) u* S: o/ g" o
- LDA #$3F) K T- h; N4 M$ J6 u: v* ~
- STA PPU_ADDRESS
. l5 a& z* ~ G0 O# {# U - LDA #$00
- M: d- A+ z4 ?7 |6 d. m - STA PPU_ADDRESS
" O: }: C* N0 u9 n - LDX #$005 m% N3 r, J$ H) A
- LDY #$20* C) B- r/ T5 `" k, j0 r/ e3 |
- .Write_Data' ~3 L6 b% r9 P+ o, ^; Y
- LDA Palette_Data,X. U: ` }* u9 r4 a! @
- STA FC_PPU_Pal_Addr,X) c$ B5 u) w, S- l
- INX6 T- B' k2 J- H/ v! T
- DEY, t0 d: B+ p" f# y* S2 b0 C- j
- BNE .Write_Data J# q; D9 z N k
- .End6 [, m: U1 s% F1 |6 R& S( A
- RTS
6 F9 x4 X+ C; V7 i4 H @: r - . X) y, _0 k1 L" D: f ?+ a
- ;----------------------------------------' E! k, R4 e w/ e9 |5 h2 A! o
- ;调色板数据/ g# R: C7 J+ m8 m
- Palette_Data
9 ^. M" O9 _1 R! S - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
* I3 d& |6 ?9 f- @2 s - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 222 }, g/ A+ ~, C& m, C8 `
-
! q( U5 i" u, A- e2 X7 y2 { - ;======================================================================) {( C5 G3 I& j: }/ W; r% s
- ;命名表清空0 u) S! R1 B5 D
- Nametable_Clear
* E3 W0 W. C, r4 [" `4 z# R. r - LDA #$208 V: g0 {8 h7 t& |( B# u- A
- STA PPU_ADDRESS! l: \! c1 T6 U& \: q+ @( V0 W
- LDA #$00
8 _& z# L: y" y1 G$ X X - STA PPU_ADDRESS% H: S7 k8 }, k! }9 B
- LDA #$00
. I6 D0 W: Q2 y* M - LDX #$00/ Z: j; U, s# B2 e* d2 d9 R
- LDY #$08
. e) L- J8 \; x0 x - .Write_Data
+ D7 d4 q/ u! R- [: j - STA PPU_DATA
$ m+ r% e X) u8 r - INX8 m! J1 i4 o# Z' Z
- BNE .Write_Data$ y3 T) X- E$ M, c6 w% ~
- DEY) y. P. A$ x3 h# _4 Y
- BNE .Write_Data% m8 J, `# I# q1 F
- .End$ G% D2 w* p. J& A* }9 I" X* S* a
- RTS: K. l& P- x" r' e$ V
& l) H+ f9 }- ?4 y& j0 I$ f' g- ;======================================================================
$ ~% d U% I0 N' R# [8 a3 y" c0 s - ;音乐曲目切换
3 l) L6 A: \' p9 T' y, h - Music_Select_Process! {5 r9 u2 H' _" u3 @0 f
- 8 w& x7 c$ p; L. N4 N0 I4 _
- .Pre_Music;上一曲
" T8 V; [- |0 ~" t0 p2 Z - LDA FC_Gamepad_Once, S7 x. D. r+ v }( K! ^
- CMP #JOY_KEY_LEFT9 I( `4 y& F: p5 D4 M1 w1 h
- BNE .Next_Music. h1 V4 d4 B; K; p
- JSR Music_Play_Pre
8 [& h$ c; y7 M6 m& b+ T( K- }* s - .Next_Music;下一曲2 h/ t! V4 q& w9 F) q' X
- LDA FC_Gamepad_Once
5 T8 q b- l4 S& h' k1 E) g - CMP #JOY_KEY_RIGHT
& D$ S* G( L7 \; @& | - BNE .Next_10_Music
% f. m. S2 W6 r* m& O) `5 s( ]5 Y - JSR Music_Play_Next
+ J& V& ^5 X3 B3 |& {1 C - .Next_10_Music;上10曲
4 P- I& _0 q" H$ S$ l" G; \ - LDA FC_Gamepad_Once
8 U! q$ l' t! p5 s m/ u+ w - CMP #JOY_KEY_UP
6 k+ Y! ]8 d/ O! \ - BNE .Pre_10_Music" ~, ^, V5 z3 k
- JSR Music_Play_Next_104 j& F- d' }8 K& D3 V9 R" m2 C
- .Pre_10_Music;下10曲1 J* S' A% i% f* k( w
- LDA FC_Gamepad_Once% G6 H1 T- `" m( H. o
- CMP #JOY_KEY_DOWN
2 \4 d. n. P' _' ^- H; Q - BNE .Reset- k! G" q+ f* l2 i
- JSR Music_Play_Pre_10
2 F: ]0 Y; u. X8 z4 J - .Reset;重播当前曲目
, j& G- @3 @9 d5 \: J - LDA FC_Gamepad_Once' X) ]! K" | B
- CMP #JOY_KEY_START; W" l3 L3 n$ V! Q
- BNE .End
" n0 R; k) E2 s' R$ v0 x - LDA FC_Music_Index
3 L: c8 }# \1 |5 j" l2 Y - JSR Music_Init_Process
% N. A# I' l4 B' a+ ]2 p - .End3 r3 h* P+ X$ Q
- RTS) s1 \% i/ L U9 Q
- . ?4 o! s6 C$ F( i7 ~
- ;----------------------------------------------------------------------
& J9 }- Y9 I! [/ q8 t w# q+ Q - ;播放上一曲: L: x. Q( G+ J T$ M
- Music_Play_Pre* C* I; M5 g8 q1 d% d
- LDA FC_Music_Index8 N& T# u1 |. T0 y
- BEQ .End' _1 Y3 Q/ ~# q& p) A
- DEC FC_Music_Index9 |0 x! S+ a& V& F2 b i" e
- LDA FC_Music_Index
1 v0 {. u' E0 c% }8 S4 n% d - JSR Music_Init_Process; P' A! Z. S$ X( Y% T
- .End
1 W# s/ O5 o/ o0 M0 Z% @3 ~# i3 v - RTS
' \- G$ M% [0 x2 X - ;----------------------------------------------------------------------( |8 P) F; f/ Y6 A. E# W- k
- ;播放下一曲8 n/ g& C$ r' C% h' y! T Y# f
- Music_Play_Next
' `+ U1 H1 O/ m& w4 K4 c7 [ - LDA FC_Music_Index
8 r$ l* Y% {' v6 q$ A - CMP FC_Music_Max_Index
, r7 i7 ~3 c) q8 j" [ - BCS .End. u0 R' n! }1 C; K2 |5 p6 W8 ~9 R
- INC FC_Music_Index
3 W7 B" o% y/ n# B - LDA FC_Music_Index; w6 g/ ^+ Y: P% q4 @
- JSR Music_Init_Process
3 r# z% n! W% Q; S/ s - .End
]" C7 e1 C5 ?7 g: U - RTS
f. J; h7 ] b+ P6 Z; T
7 m5 d; n$ U" y- ;----------------------------------------------------------------------
$ J$ c3 X. ~0 P6 t6 r' b8 X - ;播放上10曲/ x8 h8 g+ ~% E# Q/ ]& P% u1 E
- Music_Play_Pre_10
, e) D/ @1 L2 U7 Q9 C- r' ^0 r; K - LDA FC_Music_Index: V" M" { r' p- `7 m
- BEQ .End
4 G/ c, k ~' M - SEC
# Z0 M, ~/ q/ W. `' J - SBC #100 ~" }" G$ c! @( ?
- BCS .Pre_10% O9 Q+ x2 {. w* @* f2 H/ M4 p
- LDA #$00
) f8 U, o6 {4 u$ |/ s8 _# L# ~ - .Pre_10
4 J" d! c2 b5 }4 Z - STA FC_Music_Index
% t! n) s3 ^# v2 p* g2 m5 F# \, G) N - JSR Music_Init_Process
( Z |1 r0 c: ^- {5 u G- L! Q - .End
6 K8 m8 ^+ t% ]: C - RTS- T$ g9 Y4 N4 l1 x' A) W$ y
- ;----------------------------------------------------------------------2 ?8 J2 @8 S/ g' p! P# D
- ;播放下10曲 e' x9 v8 ]' U) c/ g: d
- Music_Play_Next_10. L# K$ m2 ^3 ~ A+ U
- LDA FC_Music_Index1 C5 A/ F% G2 y3 q7 |
- CMP FC_Music_Max_Index4 p1 n, O- o# I4 J! d
- BCS .End5 e" `& g0 A9 }' E7 q
- CLC+ a% L) O4 h. Z# ]
- ADC #10
5 F! l. l# Z9 V" _8 x& ~ - CMP FC_Music_Max_Index
3 E4 c, l$ t( E8 L$ v% U, ] - BCC .Next_10
2 g0 Z7 n6 d/ `! ?! x! S - LDA FC_Music_Max_Index* U4 D5 Q- v+ x7 O
- .Next_10
; u& f: P: y# r% M3 N - STA FC_Music_Index
5 M6 B" G% W# m; w3 k - JSR Music_Init_Process
; y( K# @. H7 n5 S" H - .End
. S) u5 g/ r3 W8 D6 a - RTS
: c& _6 F8 C& k* b1 {* e! N- X - F0 Z5 ~* Y6 d: R! A2 `
- ;----------------------------------------------------------------------8 _- Z- M) y% p: u/ u
- ;8位十六进制转3位十进制制: O) [/ O0 a0 _# M8 P& K
- Hex8ToDec( R% z1 J) I( {( J# c
- STA FC_Dec_Data_1
5 T; f( G: k8 f9 w - LDA #$00
9 j/ Q' o9 ~: l5 u - STA FC_Dec_Data_100) G- I+ l% b' [: }5 i
- STA FC_Dec_Data_10
: ?1 Z4 ^7 Q) M$ M - LDA FC_Dec_Data_1
1 p4 }! a6 p9 U3 U! F6 n - .Convert_100
- I' V* J4 ~9 d; }, U - CMP #100/ X5 I6 L- b/ M
- BCC .Convert_10
. \& l$ k6 W) H" I4 z - SEC
7 `5 i; m; M' P1 X8 m% i - SBC #100
\: u$ O# |. a- ?& V3 A - INC FC_Dec_Data_100
K& J$ J1 Q" E: t0 r' B# s! B - BNE .Convert_100: N7 [9 S6 E; W- N& O$ S! M! b& y
- .Convert_10, y) `; F1 N5 ^& R/ X
- CMP #10
: L3 g0 ^( P; I4 P6 u' V - BCC .End s2 L$ W/ W, J
- SEC
& g7 F* Z# f. \% S - SBC #10. N" R3 X/ E# @+ j- ]
- INC FC_Dec_Data_10( n; d1 I( H, D( k, F
- BNE .Convert_10$ t& h/ N8 w; p1 {$ E
- .End3 R- S5 x# F4 u: n5 Q) P \6 i& n1 U
- STA FC_Dec_Data_1
" ?: e0 \, d" R4 P2 t' ]5 C; C3 P - RTS P8 A; _. G: D- G6 @
- H* x" I% X/ m! W( R& {- ;----------------------------------------------------------------------2 m ~1 R! l- l5 G* ?6 S
- ;显示曲目信息2 [, w- A2 L& k* Q" `5 t) y
- Music_Info_Display
& ~+ G$ I4 o2 q1 Q6 o& E* Q - LDX FC_PPU_Buf_Count
- k# ~3 X$ D" V/ Z- g+ w a - LDA #PPU_WRITE_MODE_CNT_LINE8 J$ z5 V/ c }
- STA Use_PPU_Buffer,X1 `* Q r! p# C6 _' h2 W
- INX
" L; d: L1 W. z, h -
0 z# z7 f1 L0 G* V9 S9 O* T - LDA #>MUSIC_INFO_POS
% U7 S5 C/ m z: ?& n1 f X# r$ K Z - STA Use_PPU_Buffer,X
2 W# U0 u! N& e5 _ - INX8 ~8 A, O) I) G% A3 o" B8 L% y
-
4 k1 k" O, V; Y) }0 S5 T$ C - ;居中) ?. P/ F" ]. y- x5 R2 u, y* ^/ N
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
7 P$ C( w$ `5 @( E& p - STA Use_PPU_Buffer,X
# O: m% p0 Y% ^; X$ i# s2 C% C - INX
( L7 _) `- M! S4 P, o -
5 n- W O f: {! d, T - LDA #$054 h3 `: L1 i- F6 v2 E( s
- STA Use_PPU_Buffer,X/ o# _8 h% N* |( f8 A9 T
- INX. d( N6 _# O V$ J7 S$ e
- 3 X+ a5 B9 f& F/ r, U
- LDA FC_Music_Index: y6 T R/ m, A
- CLC ?6 b' g4 _) ?& h
- ADC #$015 s9 s B0 N9 `% a$ w7 F/ T7 }
- JSR Hex8ToDec
) m' `$ }+ h* u& b - ( A3 b" }4 ]: `7 T
- LDA FC_Dec_Data_10
! p, F% ?! A" s, l5 J! I - CLC
: a2 L& I* f8 u1 t _! M O7 _* I6 B - ADC #'0'1 ]! [& H/ G9 W2 s. p, V( o. Q* R i
- STA Use_PPU_Buffer,X
$ ^- E" D( k) F/ C$ y' y5 s - INX; r4 }& }7 W I$ s: F* H2 U
- . j7 p l# W3 w0 {
- LDA FC_Dec_Data_1
9 w. S* q: {& W+ U - CLC
$ D" `: V" {+ r1 b0 j, I- M - ADC #'0'$ u0 M- p/ d1 I
- STA Use_PPU_Buffer,X
% T( o" x+ { [( H - INX
/ l; _3 m1 L* a' b) B8 S2 D - ) }; R. ~4 P7 Y. ~( X8 ~7 S6 u
- LDA #'/'
) G# \- t0 q8 {1 b$ y - STA Use_PPU_Buffer,X7 C' Q! Y" s" Z. {5 ~) E
- INX4 R+ w9 f; m9 {8 {; _, `
-
. w+ H1 Q# ?; p+ A* W# A5 j- l1 P - LDA FC_Music_Max_Index
6 F) J! u: b ?) `3 _, b$ s% g - CLC
& T+ a4 _ H% {/ B% a* _& b s' S - ADC #$01. J9 y1 s' g) \. g: F4 b- d2 Y
- JSR Hex8ToDec
( o8 t( A. ]2 b - # Z- Q; @. i$ p
- LDA FC_Dec_Data_10
2 V" {+ F4 ~3 E" O - CLC2 s% `' ?; x* B0 S; Y
- ADC #'0'
' ]: ~, @; o" K3 a. w8 m4 C - STA Use_PPU_Buffer,X
" I% G! I5 M% c - INX
1 F0 z; I1 `/ A! f -
: j& Z1 v, e& f2 Z5 D - LDA FC_Dec_Data_1- i" _- a7 g( i3 G0 S* K/ t# }
- CLC% d1 r! R o8 d. a* a. r! n
- ADC #'0'
% R" M& J% `4 I9 z - STA Use_PPU_Buffer,X
4 `" L, P3 f1 ~ G* J$ ~ - INX
0 P# v. i5 |( D3 j. K- E -
. o3 k& ?4 K1 L3 A6 k - .End
! r! W) T* ~7 j f$ ^ - STX FC_PPU_Buf_Count
* y0 H' ]$ A7 s* i2 k/ x - RTS
. C5 i) L$ {4 `( n: c: x H) y0 r, M
% p8 E, p/ s5 v. b$ Z- ;----------------------------------------------------------------------
% J/ N' F6 a; G! i - ;音乐曲目初始化处理
/ z6 b- q; W: H% l) t: U) D! H - Music_Init_Process
- J0 _! ^' B( A - PHA
! _9 G1 k7 t; Q - JSR Music_Clear_Process
' z" ?/ t. v7 V9 ~* M$ i - LDA #$1F
+ @& J0 `' @+ w8 F5 { - STA $4015
& ?9 R" f7 r! z6 ? - PLA
, B. o% b$ ^: y8 h1 a - JSR Music_Init_Addr K3 D) [1 a n# u$ F
- JSR Music_Info_Display! T7 b) J/ }: l/ T. B
- RTS
$ V n" |6 T2 }4 ~5 o9 } - 6 W8 Y; s3 f, ]
- ;----------------------------------------------------------------------
# O+ K5 Z, ~5 W% o8 I2 Q - ;音乐播放处理 s) u, w5 ]: F. g0 V' [# ~
- Music_Play_Process
1 r( P& y, m; h' T4 D0 R - JSR Music_Play_Addr) e5 d0 d5 K4 Z7 L1 q+ w
- RTS1 a) H; t2 E% S8 G' d
/ Q; M& e; w7 @9 O9 W- ;----------------------------------------------------------------------" H7 s6 G8 ]# Y# l: }
- ;音乐播放处理
: @8 D+ d( Q6 W0 i: X+ j - Music_Clear_Process
" s1 C! ~, M8 `$ [+ a- x* O - .IF Music_Clear_Addr2 u) T& C2 b# I7 n9 E x) U% M
- JSR Music_Clear_Addr, S2 M+ @! i" y4 t* X6 H
- RTS
) a- h! a3 z& p - .ELSE' X' ?! ~6 L* Z+ Q
- LDA #$1F
& c' J `4 P; A: ^6 z/ `8 z - STA $4015
k9 i0 q7 c1 Z) R/ _, p# C - LDA #$00- |# n8 _( v6 m% d, d& L3 r
- STA $4010: j# [# [- H4 f8 e# a9 [4 y" L
- LDX #$005 Y& e: v" i' w4 e& m
- LDA #$00* g3 U7 F* o: s) @/ ^3 C
-
8 Z; x( S% n; O @# {0 I - .Music_Clear_Zreo_Page_0
9 U2 g# m+ D, F1 y2 z - STA $00,X# z4 d: z' g3 g7 f
- INX
. T; r, ~1 s8 B, C% y - CPX #Use_Zero_Page_Begin& u1 ?1 ^& F7 x: C
- BCC .Music_Clear_Zreo_Page_04 `( Q& P: b- B; m( f
- / q( W# x, U! Z4 A
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
. T; w. C% B' w$ Z - .Music_Clear_Zreo_Page_1
, }$ ]" T- m9 C( k - STA $00,X6 ~' m+ f5 X3 C3 M" O6 L
- INX2 R& A! A' _* \
- BNE .Music_Clear_Zreo_Page_1/ q- ^6 M" {/ {# I
-
4 g3 G! ]3 ]$ m; J; N! |( @7 Z - Music_Clear_Process_1
8 H }% X7 _, t% Y - STA $0600,X$ `$ a2 H, d, d# r# n2 h
- STA $0700,X
5 F& b% ~% a1 `5 c' S y - INX
& R0 R% C+ ^, _) |) r8 z* s7 s - BNE Music_Clear_Process_1
1 E$ r3 W9 j) S' q5 M. M$ \0 j - LDA #$10
% {, B$ Z4 T* d - STA $4000+ q1 ~7 p; ]: f' n
- STA $4004$ Z, Q. i0 l' k$ h* x
- STA $400C
% T1 x4 @: s! r( R/ |; C! L - LDA #$00. m9 B( q0 T/ q; _. D
- STA $4008
9 S' J$ r) Q5 i, W( c. H- X - LDA #$0F
7 v# ~/ W& v/ Z2 `: O4 Y& K - STA $4015
& [$ p0 B# D* }' C( c; A - .ENDIF
% T5 d: h3 e( S+ K" d -
6 A' R( Z9 k" r5 i/ R - RTS0 P! N2 k5 F5 E' T3 j
- ( ~& j. S `$ X/ h
- ;======================================================================( N4 @. N' F' h- k0 f% q
- ;重启处理
+ p }( d$ w7 O J - Reset_Program# [2 F3 e: r' _
- SEI
' f2 M; g6 n! V9 ? - CLD
" P/ k9 [! F4 ^. v+ ~5 |/ b - LDA #$00
, a0 J) O0 b- B& t0 o - STA PPU_CTRL
- I9 `, g0 u- _! Q6 ?8 l7 U( R - STA PPU_MASK
* i- Z @6 s/ p: X8 T' Q, y* p - STA JOY2_FRAME
- B) ?9 ?* G" L - STA APU_STATUS/ V& Z' u/ O7 g* C0 h- ]
-
r" h; C* _- f$ N/ c" I) x7 | - ;等待屏幕准备完毕( j) T8 x) I$ [2 l: ~$ R
- LDX #$024 q6 \( R, A- q1 y
- .Wait_For_Screen_Ready) E% a% u: }. s4 l; N+ k* i
- LDA PPU_STATUS
: e8 M3 Y0 ?% t - BPL .Wait_For_Screen_Ready
* `9 w9 o0 Z: J7 U+ [ - DEX
* C8 e; S6 F( v3 r2 N. R - BNE .Wait_For_Screen_Ready
) U1 n# ^, u( K; h# f; x - & O5 s4 _5 e1 s0 U4 q
- ;清空调色板
) O3 {! |. R ^' V - Palette_Clear
4 U7 _4 `4 G. |, {4 w) U - LDA #$3F Z7 V( F% a9 n* g& s1 g
- STA PPU_ADDRESS
0 F& q& [* M. ^, K3 c: t5 ~ - LDA #$00
5 C9 G9 y6 {: V! E* Z6 s - STA PPU_ADDRESS+ Q. y6 _$ D! o; |
- LDX #$20
# g/ f& q" ?) E2 E$ y. G - LDA #$0F/ M4 }& |: h: {2 O: D
- .Write_Data
( E( Y; n8 Y6 P+ s C - STA PPU_DATA
* n# Y0 V8 p _; L7 o' X - DEX9 S% P: J. Y: {4 r
- BNE .Write_Data1 {$ C; Y; X! a4 {+ x7 K5 h4 R
- " z2 K1 h: X. X7 T6 \$ r
- ;清除声音 $4000-40139 U: x5 I* P8 H8 M, \
- LDY #$14
/ c7 t, p2 Q8 Z9 I) Z/ B - LDX #$006 g \0 c" [" K
- .Sound_Clear% d5 ], @+ V0 i# {# _
- STA $4000,X
/ O O' |+ U( D( K R1 q - INX
[3 {$ N p& @; T - DEY
$ c& x r8 u+ Y' G# Q/ K( }' [ - BNE .Sound_Clear' i4 ?4 B' W8 J) v2 b C
-
5 p4 \1 t- \' G* j - ;清除 RAM $0000-07FF
0 C5 V7 r3 C, N" N4 F' x5 n9 j - LDA #$00
0 F2 V1 R& b1 X( k9 b# A/ P - STA $00. @, u% K+ z0 v3 {) a8 B
- STA $014 d- H; F) g/ C4 F U' t
- TAY
7 C7 Z: _. y0 _ - LDX #$082 }: Z0 e' B0 p1 H
- .Memory_Clear
. g0 Z- f0 d! f7 f - STA [$00],Y. z+ ^9 e! r. I
- INY
( I0 m; k5 i5 j# t - BNE .Memory_Clear
7 I5 X, N0 p: g8 j4 W4 B/ P1 u - INC $01
' j3 t' G& E% r; ` i0 }7 M - DEX- d$ ?+ g) B( M. K
- BNE .Memory_Clear
+ X; s/ @5 U4 a4 z -
; A8 T) t, ]1 H1 L; g; s" p; O - ;精灵缓冲初始化
n& f& k; {. \- ?- Q3 @ ? ~3 v - LDX #$007 }2 B* J$ N2 s" Y% W6 i, w
- LDA #$F8) j* G( S4 C v9 X! M+ ]; _
- .OAM_Clear( L/ H6 o& E, n2 f6 P& m
- STA OAM_DMA_Buffer,X4 w* n/ R- c9 R) {( @! N8 _% u
- INX9 C" D! o4 S# u, E2 [. M( d! Z3 o! {
- BNE .OAM_Clear
, R& L2 ~* e1 q9 C4 z - * K3 S! N5 l$ |- f& `2 l
- ;栈指针初始化. n- q# L' B! I% U, o9 Y+ M- k
- LDX #$FF6 u+ Q+ }. J7 e
- TXS H, C" v+ x$ Y" {
- 4 n6 ^ x$ p# f; p! X3 u
- JSR Nametable_Clear;命名表清空5 k$ [3 f$ v. K l: y$ s4 a
- JSR Palette_Init;初始化调色板缓冲
# p) ^3 w! _3 @- b - JSR Static_Text_Init;初始化静态文本
. a3 _- J4 V) q8 O6 F -
$ e; K8 n" b5 {/ v5 n6 U - LDA #MUSIC_ITEM_TOTAL - 1
1 F1 T7 x, c9 u9 t- e% u: H) G# y - STA FC_Music_Max_Index% ^7 i, y/ t* k* T- E
-
z6 X2 h9 L( _4 } - LDA #$1F
7 l& i" K% U; i; A - STA APU_STATUS: _* c+ G2 Z5 V9 W1 D
- LDA #MUSIC_BGM - 1
; Q7 D, z% c1 c6 b* q$ | - STA FC_Music_Index
z6 o; n; z- G, t5 a3 t# M - JSR Music_Init_Process;音乐播放
+ D% W& Z$ A8 L; F9 K# z( K3 \3 h -
4 z- Q; K2 \- t# T6 [- J - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
: @( ^% {* K' l9 [+ u, K4 }( Y - LDA #$1E2 H& d! h/ W x; B
- STA FC_PPU_Mask_Buf
- C7 E3 l1 q* q1 x! `, A2 C2 Q - 4 u4 q* I# {* v, k @5 d6 W3 @
- ;启用NMI处理
6 I Y- R y( U* g/ y - LDA #$80
1 I9 x. j- L' b5 ~2 X. b* b6 m! \ - STA PPU_CTRL/ m) _" s3 N+ p: T
-
9 {! m6 X, Q$ v, `, C0 t - ;程序循环, 剩余工作交给 NMI 中断处理
2 `) O3 P1 V1 T4 Q0 z - .Loop
1 k/ Z5 H( M3 k9 d0 E( K# \. V; @ - JMP .Loop
O1 J S* R. }$ Z: @
* q" v2 h1 W# E- ;======================================================================2 l/ k/ l o" Z8 H, B
- ;不可屏蔽中断处理: p4 W: U/ o! e0 U; z
- Nmi_Program
" T2 r2 H M5 s6 u2 D1 z' t& y - PHA
$ C) e. h" E- J$ k - TXA
7 a# c( v! e7 F9 M - PHA
4 T4 M- f3 I$ L, v' ~' X - TYA2 R" q+ n# z8 G' ^0 @0 d. Y
- PHA
2 J) F, |1 `# }: N% Q, _ -
( c; G: L# x3 F2 R% K# k# S5 m! h - LDA PPU_STATUS;读取使得 PPU状态寄存器复位1 Y0 |; h% R+ H
- 5 b; j6 _+ a/ s, X8 U, N1 [- R
- JSR FC_PPU_Procrss;PPU处理* _# l2 t, H5 o( x0 P! l% r+ ~
-
1 ^( i4 ]: ^; S1 V - ;精灵内存更新
' V- ?- W; t2 e9 | - LDA #$00
4 L! E3 l( V0 D) `$ w% f - STA PPU_OAM_ADDR
4 \. e" w* O/ A+ ^' U6 p# B1 { - LDA #OAM_DMA_Buffer / $0100$ M: C P; n/ z$ e, V: O; J# ]9 U
- STA OAM_DMA: X6 R' y" E* Q6 l$ g1 v
-
1 }2 y! Y8 y! a9 H) f. Q4 {, x - JSR FC_Gamepad_Process;手柄输入处理
8 i) C+ g, b9 {/ r0 M' ~- T - JSR Music_Select_Process;音乐选曲处理
4 [' u4 G1 r( o' |2 P" q - JSR Music_Play_Process;音乐播放处理
8 f* j1 H: x' E! a+ A -
, Z2 F; M! n ^4 K/ b+ a' h0 n - PLA" i* c; j) Q& s$ K6 K
- TAY, _! R* K; f& `1 s* a. }2 @
- PLA
5 w# u3 f' @) R8 ^, d3 P - TAX9 u+ [' I# B' J7 [
- PLA! a: Q& | I0 ?4 g& j
, J5 U$ U- p3 {- RTI9 g+ g" B) D: R# u3 T' E
# A: w8 X) j+ ]- ;======================================================================: _: b+ e3 j+ M: A2 }
- ;请求中断处理) M% J! t, A$ X; F0 u
- Irq_Program; ]# T4 Y8 A% d$ L |) {
- RTI. V% F! V' N9 A1 g. ^
- $ o: _5 Q" w* c! E
- ;======================================================================. T% C5 y3 F. L2 V H
- ;中断向量表& ~. W: \) N3 A9 m0 H. C9 x
- .ORG $FFFA3 D- {# `0 J+ m- [, @0 \8 X
- .DW Nmi_Program ;NMI触发时执行6 F m5 j5 i% s' x
- .DW Reset_Program ;载入ROM时最先执行9 o! B v$ |/ C! t' V# [
- .DW Irq_Program ;IRQ触发时执行
5 Q5 ]# l3 q0 R
复制代码 . Q6 A/ y/ U N2 D% Z2 X% w4 ^
# P3 `- u# {- A+ U. [1 o, O0 p. P
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|