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