|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
0 |* i3 Z/ s/ N0 @( T
$ B9 @2 I0 l, Q2 ^# c/ H以下是主框架代码:
( P! ]. O( y S; g2 O" Q- ;======================================================================8 h+ G9 w. u4 O, u/ {
- ;文件头
1 M7 Z! i1 M2 U/ C - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量 I2 I, y0 \8 r3 n a/ `
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
4 ], R. q5 z; a$ o( ]5 d+ } - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码# j2 R! J/ i, a O7 W% g
- ;======================================================================
1 }0 t5 i6 l3 y! p4 @1 Q3 V. B) V - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
1 v; M/ p- a7 f7 N# N - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
* M$ b) K9 L ]% S - ;======================================================================/ i+ v2 K/ R. K8 n5 j
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! ?0 i9 H( Z$ p/ w' h3 Y - RESET_ADDR = $E000 ;主程序起始地址
* h, L8 C) P/ `) T% z* s% `( a - ;======================================================================& E/ U& g5 v6 r- Q
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 x/ Z- Z) O1 ]3 O( ]
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB a( ?5 f$ k; L3 ?1 _/ U
- .INESMAP 4 ;Mapper号 (0-4095); b: H) m9 |6 p; H/ S2 Y* H
- .INESSUBMAP 0 ;子Mapper号 (0-15)
' B0 d& ?, G$ U! T; h/ | - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
( |& L6 c7 n" s( h% { - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); ~1 `5 I% ^' A" R* T
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数); A$ P2 w r: ]+ p
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" q5 E: S$ L( B$ N - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
, L/ r0 Y1 H! x* M \- J - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数). f9 U8 _& b p9 G% |! P9 ^% E
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
5 ?# U; I' Y4 H) s - ;======================================================================9 ]$ q% \: N6 S( F, v
- .INCLUDE "fc_demo_config.asm" ;全局配置# x4 T, w3 f6 ^
- .INCLUDE "fc_demo_constant.asm" ;NES常量3 ]4 q S2 \6 P; ? S% F! ]9 @5 n0 u8 z# \4 ~
- ;======================================================================4 s* l) V9 u2 m) D
- ;音乐配置1 \1 \1 @( C( S. G$ o/ ]6 C
- .IF 0 = MUSIC_THEME
3 ^; A& P m" @4 }! y! E - .INCLUDE "data/music/Gremlin 2/config.asm"' B' N* ^+ e0 v+ ?8 K I, B, c
- .ENDIF9 X* A' [. ~' }" g! h5 ]% Y8 [
-
5 r0 ^. |/ y' `" \' g) v+ v - .IF 1 = MUSIC_THEME
, E1 @5 T9 {2 q - .INCLUDE "data/music/Raf World/config.asm"
- F0 C4 a) K3 L* G' m( _! A - .ENDIF( }! X: l" Y! i
- & h! ?1 W+ J6 a& L$ J, S3 {
- .IF 2 = MUSIC_THEME
0 ?$ w. ?! Y9 p5 M: N; e - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
6 }9 ]$ w2 h) c1 y: j - .ENDIF
, {& a* J/ x6 N( _" d - 9 o: G6 ~% U. l+ ^9 J
- ;======================================================================* H: E) F+ L3 H& L' p
- ;引用CHR图像数据2 }! k; |8 V. ?+ |& c c: B, t
- .BANK NES_16KB_PRG_SIZE * 25 c! c# f* N& ]0 Q
- .ORG $0000( e6 w2 f& S/ `
- .INCBIN "data/bkg.chr": r# K2 z, q% Z: S( R7 f' x* K
- .INCBIN "data/sp.chr"1 b: s0 d+ v4 C2 ~
-
2 }0 C y* ]: j; U5 M - ;======================================================================: a" V& U- M5 _5 N2 D9 H* U
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank0 J# ?) Q9 ?) x, F
- .ORG RESET_ADDR% r6 W6 K! r y
- ;======================================================================
" i* q+ P$ M4 o - ;引用其他源文件% \ ?& u4 X ?8 p! a' p u9 y2 s& j* _
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
5 d8 t7 e* A9 z( }1 ~ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
" a% p3 r: p4 v - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 l7 m& P* u# D5 f
- ;======================================================================
% k. b/ n$ w0 x2 ^0 g& e
6 x' ?3 h u+ @) L8 ^4 ]- ;======================================================================% a* E( [% {$ g$ \+ f
- ;等待VBlank到来
9 B& e3 V/ u( V$ q3 d' S - Wait_For_VBlank
/ B* r7 d! O3 @; x - LDA PPU_STATUS# G' z' s+ e a9 B6 m, U
- BPL Wait_For_VBlank( P1 j- D* H: V/ z
- RTS0 m8 M$ a9 T4 g: S3 K
- + k& Q; X4 r+ Q' ^* n
- ;======================================================================) ^. J' f$ a2 Q1 v7 d i0 ~
- ;调色板初始化
% x. [4 f" C2 s( H - Palette_Init9 G$ e+ m. W. { z" w9 ` P3 E
- LDA #$3F8 e, n- o* G7 Z2 w; g3 o/ T- n
- STA PPU_ADDRESS
* @- {3 s: y$ q' H# V - LDA #$00
7 z; M. ^$ z: h( a; ?* j - STA PPU_ADDRESS
e( T3 _: i8 W: V3 v) O1 L - LDX #$00% h o' N$ c! i2 s1 v* |
- LDY #$20
9 B- q5 o" [) F& ]) S6 f' a) k - .Write_Data
6 E9 ] J/ M) T, E. x2 Q# } - LDA Palette_Data,X
X5 D7 ]0 a% X1 v6 m2 C r - STA FC_PPU_Pal_Addr,X* A) {% Q9 i8 m3 Q" R
- INX
8 h* ~( Q4 B% b) X( x$ ~ - DEY, T+ T% s2 \% e7 w+ c
- BNE .Write_Data
3 J( A1 i" E9 J0 }1 S - .End
" Y; B0 E' z" A1 X( n A) ~/ A - RTS
3 C/ M3 S* e- T! B2 I& i
) p5 }4 K, a4 u' T' G- ;----------------------------------------
/ ~5 a( ]* ^. M, c& I - ;调色板数据0 `1 `4 b( i/ }, G" d
- Palette_Data9 B6 L. F# w' u( G- j
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B3 U: G7 ]& ?6 Z8 o4 @1 }" a
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
- g' f; R/ ?$ ?. U -
, U$ A0 W8 o# t- l. n - ;======================================================================0 |' q0 j( G: H' A# ~
- ;命名表清空
5 |& p* U2 a2 O2 { - Nametable_Clear
5 N. h) E, c- t' e! Q - LDA #$20
: W! M$ m3 {* y _1 [+ b0 s) c - STA PPU_ADDRESS
- k+ ^% i+ y" {& { - LDA #$002 F: L H- {; N" l7 O1 r/ q- l
- STA PPU_ADDRESS
, v+ v+ C8 _! T+ M$ ~% n7 i7 g - LDA #$00. L; V7 G$ ~, p; Z* r
- LDX #$00
9 v8 F# M& F: x( F" v( H0 J - LDY #$08
4 |$ H( c- }) i) Z: I% A* W1 p - .Write_Data: J& }% M p% [
- STA PPU_DATA
: a1 H; Q/ _3 B - INX8 p9 N6 \8 o" e* \5 y
- BNE .Write_Data
- L# f# F. \. k x% u - DEY
2 z; a; v- [* z( e) ]6 S - BNE .Write_Data
2 O) D( k6 r7 Y6 V/ w# {/ }5 I - .End
: [& F3 Y% G- X( P+ g% @3 s5 ] }9 V - RTS
% B; g/ K" E3 ]. f, j' R- f - 2 ^9 d- p# h4 @; \1 h
- ;======================================================================
" ]: n# ?- u; I% w% _ - ;音乐曲目切换- o+ h+ F, `, b! ]
- Music_Select_Process- e* r9 V2 y8 h& C4 S1 k1 O1 b
- / |& h+ j) r# q2 }
- .Pre_Music;上一曲
$ M$ R0 i& [! c# M V+ x$ A6 U - LDA FC_Gamepad_Once8 k3 E' k9 E! C; n6 e# o8 g* O
- CMP #JOY_KEY_LEFT
9 e, I) u* q/ N% r - BNE .Next_Music5 ]8 j: {6 `4 M
- JSR Music_Play_Pre
' P. W; z9 R2 l/ r) w8 k1 }; n - .Next_Music;下一曲1 R6 u6 R# h- T$ D4 i( T3 R: G
- LDA FC_Gamepad_Once" T7 h0 A0 ?7 w/ @2 W V. F; G7 j2 Y
- CMP #JOY_KEY_RIGHT
' N0 f" Y7 I/ m* c- J5 a) w - BNE .Next_10_Music" }6 A2 F' s) P6 h9 q# A! N% S
- JSR Music_Play_Next
# Q3 ~1 ~* I! O - .Next_10_Music;上10曲
5 o* @3 ], z& A p$ @( N - LDA FC_Gamepad_Once3 Z( u6 T. q1 p# ]: M6 j N
- CMP #JOY_KEY_UP
. T9 |$ \% x& `- M) j - BNE .Pre_10_Music( L2 b0 l. E$ d7 p7 B. M1 W2 V& N, d
- JSR Music_Play_Next_101 }+ W+ G* T/ M5 a. W
- .Pre_10_Music;下10曲" c3 t0 ?0 X7 w/ v) W% h
- LDA FC_Gamepad_Once4 S7 P/ v6 r& c: w& N
- CMP #JOY_KEY_DOWN3 T: l( a3 \- I9 \
- BNE .Reset, A) i7 C. Q8 K9 `* Y5 R
- JSR Music_Play_Pre_104 _3 S6 ~( A2 y
- .Reset;重播当前曲目
! k9 W4 k) c2 j1 Z; ? - LDA FC_Gamepad_Once
6 K- A& {4 L% R) t - CMP #JOY_KEY_START
3 O: T; C8 N- f9 ~; W1 f, Q2 Z/ e - BNE .End
, w: W" f5 p4 x4 l( b - LDA FC_Music_Index
6 i) o0 j# W7 p+ w! V - JSR Music_Init_Process
9 g2 J2 Q% [+ n4 B/ l( Y - .End
- z+ d- B7 A h2 h; Z: Y - RTS
) j/ B. D; r& ^% d$ L
) N- c# U& {5 |" u3 I, u- ;----------------------------------------------------------------------6 Y" T$ {6 \, c. F+ t! C% |8 r
- ;播放上一曲0 Y2 _( r2 _' _7 T% |2 k7 J
- Music_Play_Pre
* g* m: F0 R# e1 o `' E" P - LDA FC_Music_Index* y* o1 h3 K* p# s
- BEQ .End$ U2 [/ A& W1 g
- DEC FC_Music_Index# v) F# Z$ C% Y) _6 e- @+ B0 d O
- LDA FC_Music_Index
' |3 n/ a+ I; A. f7 F: q' r7 H" o) B* v& V - JSR Music_Init_Process3 D& z& E7 {# v
- .End
& V& [) t- m5 T7 Q - RTS
: `2 |+ I- ~3 @ - ;----------------------------------------------------------------------" I+ c$ g: z: _0 p: K
- ;播放下一曲
& i' d5 @! U. {) B - Music_Play_Next; K; x/ j9 |' C: v: k
- LDA FC_Music_Index
d3 J. F* _# x8 ?) P - CMP FC_Music_Max_Index
8 |* ?& c( V% C. Z3 I* f; e6 P - BCS .End$ t# D8 u- G5 [+ g. l
- INC FC_Music_Index
9 D7 \7 E0 U3 C9 K# D - LDA FC_Music_Index
- m, ~0 D9 I0 t( p+ O: D - JSR Music_Init_Process
6 E p/ D$ \+ q; ^; C1 d - .End$ P& z/ x5 U) R4 T3 T
- RTS
& R% c2 }+ C5 ^) K
0 c* Z Y" R/ H F, i* z4 j- ;----------------------------------------------------------------------
/ I9 I+ T5 _0 `5 q - ;播放上10曲1 N7 `- P: g. m$ P2 Q i
- Music_Play_Pre_106 S- c0 S8 v/ l) h B. M# s" F0 ]
- LDA FC_Music_Index2 q+ Q; f$ F; E& k+ }5 n; [0 r
- BEQ .End; A% z0 A; X5 |( K: t
- SEC! U y" }; d2 k- x
- SBC #10
* \! s* N, ]& l9 n9 M( r6 b - BCS .Pre_10
; j+ Z% d- Y5 d+ n# v - LDA #$00
2 J" h& W" t/ m0 T& Y c: R: [4 @ - .Pre_10
( ^9 v% i. _, e7 v - STA FC_Music_Index
* j# |5 w/ ?8 i+ w8 y - JSR Music_Init_Process
/ j- z6 F- i( z1 C% s t - .End
% ] |" i' b7 q( ^1 Q: L) x+ b% D - RTS
! S/ n% y+ w( p - ;----------------------------------------------------------------------
7 P |9 b( j5 `& A4 Z# ^ - ;播放下10曲
' F+ p) w) |7 ~+ B$ N9 v' k$ {# { - Music_Play_Next_105 @% ^- k$ G @' n
- LDA FC_Music_Index$ y* w& Y" F8 q7 q$ q
- CMP FC_Music_Max_Index8 x4 [$ F! v. w7 I4 R8 R/ _: z
- BCS .End
" K4 m( {/ g+ [1 y" J# m - CLC! @) M0 v' J5 h% E) t' ^4 g
- ADC #10
! p7 h7 I) m- Z8 V - CMP FC_Music_Max_Index
" D! F- C4 ]0 y - BCC .Next_10
" w2 M4 Y% ~9 h1 |* D0 w - LDA FC_Music_Max_Index
" s6 \$ y0 {7 ]4 \9 h - .Next_10
; S D8 h0 Q6 s# b' U) T5 P @ - STA FC_Music_Index
7 y# E5 R5 \3 [ - JSR Music_Init_Process2 p; H h* W" K* F9 k5 f
- .End
; Y! o9 K x5 p9 I' P3 @5 t, Q - RTS2 E, Z. }3 F% r8 Z6 X5 |
# U& }+ M/ M; O- ;----------------------------------------------------------------------4 G! {. t9 L/ A) c( o$ w4 V1 e
- ;8位十六进制转3位十进制制: m4 ~2 c. H6 r \5 ]; [! n% V
- Hex8ToDec
0 g7 G t, `& a - STA FC_Dec_Data_1! z {; t6 M! v" `
- LDA #$002 l6 b0 K: y# S8 P; H& @4 T$ G
- STA FC_Dec_Data_1007 x% e; e; }% K0 k" T
- STA FC_Dec_Data_10
* `/ C9 t5 h+ \$ V- j$ s - LDA FC_Dec_Data_1
9 U: K* ~4 f5 E3 { W8 z - .Convert_100
& m t6 H5 V/ B' \1 P7 m - CMP #100
/ T/ y8 y( w( w% Q4 P; |. G - BCC .Convert_10' ]8 I% k8 c4 f" E5 Z6 k. v6 Q
- SEC) ^& h8 c8 l) L/ Y# N1 i
- SBC #1007 }/ @- x$ {- o* F) _3 C2 E, {9 i) G: d
- INC FC_Dec_Data_100
h) `4 Z$ b: {6 b - BNE .Convert_100
2 d Z3 @) e7 J* x( @4 N/ {( ~! r0 W - .Convert_10
& g' ]9 f1 X9 F q6 K' x - CMP #10
$ i. ^0 z' X7 B$ m+ {$ K% a - BCC .End' _* |* }4 l, X5 q1 t% G
- SEC
7 b5 i6 ?, O# S9 K - SBC #10
' z* I- G3 ~2 y) R7 J3 y4 B - INC FC_Dec_Data_10
% K' X4 ?6 ]% A3 I: t( | - BNE .Convert_10
2 P" Y8 B4 C5 k, j$ N( ^ - .End& R6 G8 j$ F) r \6 k6 m8 P2 d) M
- STA FC_Dec_Data_1
3 }; r, w2 N, G" K1 [1 _8 H - RTS
) |- L8 g; a+ \) b. R. x - , I0 b: u W* y7 [ P3 M
- ;----------------------------------------------------------------------$ W) M+ e& A5 O+ Q# ~( f+ j/ E: R) o
- ;显示曲目信息+ h* Q: [& `* r/ E
- Music_Info_Display
+ ]+ h/ I1 D, Z, q4 ] - LDX FC_PPU_Buf_Count2 u- _( U. ^! ^% ~4 W6 p6 E
- LDA #PPU_WRITE_MODE_CNT_LINE/ K/ z% ^6 H3 q" z7 B2 K
- STA Use_PPU_Buffer,X' J4 F! `; i. V+ Q' V+ ~
- INX4 C! p" p4 v7 a) P. V8 e
- / Q/ p- u: r, x, |" F7 j! g, O" m
- LDA #>MUSIC_INFO_POS# Z/ }# }+ E n
- STA Use_PPU_Buffer,X
4 v0 b# J/ s8 Z: j; K+ i - INX9 O# _; O, x" R$ ]% m" f4 i, a
- 5 N/ R+ p5 o5 M# @, [
- ;居中
9 l! u x6 ?; ?# L) i% h - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
8 x# p4 G, Q6 D: K* W3 ^ - STA Use_PPU_Buffer,X
6 Z& b& w8 q2 H4 ]# J s! T - INX
1 {3 S6 F L% k- l - 8 m8 l- F; O0 e2 \1 h1 f4 w5 m( q; ?
- LDA #$055 o. _5 @( v7 ]) c! h( `
- STA Use_PPU_Buffer,X4 E' c. W, B! k. g' H. {
- INX
/ D. M! `6 s( Z -
% k& e& j" }% U q2 B - LDA FC_Music_Index
0 X4 I8 F9 s* J# h- r# | - CLC
. c% u6 W* v1 S0 G! p9 T' d - ADC #$01
2 }6 P, Q1 U; B( j( x - JSR Hex8ToDec4 P1 Y8 B& o9 v. h
- ' C6 d& h4 }' U* ], F& d
- LDA FC_Dec_Data_10
( T Q, h o f& T, J( v/ N( i" x - CLC4 u/ S* q# e. B0 B; n: |& p' O: e- Y
- ADC #'0'# @8 A- U( V r$ l* U
- STA Use_PPU_Buffer,X- l' N ^( F) M ^
- INX
" L1 M s' Y: N -
3 m6 _- N# ?5 \: g5 P! e, }- W+ N) f - LDA FC_Dec_Data_1" T" _8 o2 S. Z T
- CLC
& b% K. M/ i; r: ~& H - ADC #'0'+ E/ L6 H" S% H* J _0 U! |
- STA Use_PPU_Buffer,X7 J1 q+ [/ U$ ?4 `! c9 ]
- INX% {3 ]+ o# {/ X! r: j
- ) l& |1 J# Y% Y% d3 d y& I+ T
- LDA #'/') f- n) X! W8 K5 |5 b% G: u" G
- STA Use_PPU_Buffer,X
3 [; ^, q, O8 q, j6 Q- ^ - INX7 f$ D! |" J! ~6 g/ I; z1 X% {8 a
- + B: X0 P+ }0 N' U# z2 E. R
- LDA FC_Music_Max_Index3 y8 O8 u% }9 h
- CLC
1 s: ]: z. b W - ADC #$01
% Y% ~! n' ]! } - JSR Hex8ToDec: E+ S0 ~/ x0 c
-
& b3 ^* `+ G2 E - LDA FC_Dec_Data_10
& m+ f/ ~. d$ Q2 V% N - CLC
7 Z* L6 M0 @. y - ADC #'0'
% Y. z7 Q [+ O' [ - STA Use_PPU_Buffer,X0 y. H& j/ N! m% _) u9 n
- INX3 L3 r$ _4 O5 ^. V( W* O. H# U
-
# Y4 u, V$ A0 @. L - LDA FC_Dec_Data_1
- [" ~; f% t% w( e6 H - CLC
9 t% z1 I1 j/ W( M. o( _7 S+ t+ g$ f - ADC #'0'. \/ S5 R# B% M* d( A- s
- STA Use_PPU_Buffer,X
; T; ?% }* D" f! b- J+ t4 R - INX$ z9 }6 L6 G$ y+ h, C
- ) A6 r8 q- |4 G V
- .End9 A0 L5 \7 o) l7 ` o1 S/ K, O
- STX FC_PPU_Buf_Count, v4 w1 M$ O6 R) ^
- RTS# A' H2 o0 K8 c0 p7 q% P
- 3 H5 A1 R2 M" q7 F) Z
- ;----------------------------------------------------------------------1 t V/ C0 C" @% H1 c4 w" g, y
- ;音乐曲目初始化处理$ i4 L s$ ^2 F. e5 I
- Music_Init_Process
" T/ @: a8 N( E8 P$ C; c* B - PHA
9 P. w, k9 _0 u, ?: M+ i - JSR Music_Clear_Process
* T. M% U6 K+ @9 ~ t - LDA #$1F
; _; }4 ?: W/ ? - STA $4015& I& x/ M/ D* F( t. M: u
- PLA% p0 d) T5 w' x, B% @( T7 ~+ y7 F
- JSR Music_Init_Addr6 n1 T j2 A/ n; |
- JSR Music_Info_Display$ x$ u: |* g1 g$ M# k, q3 M
- RTS
* v( H/ N5 G2 Q
0 T- b7 ^3 m" v$ Q- ;----------------------------------------------------------------------! `! L2 X& x: p6 k8 H
- ;音乐播放处理
/ l+ w5 a5 W9 z2 H$ r - Music_Play_Process/ w; L$ f1 `2 Y& p) o( i: j
- JSR Music_Play_Addr& r) Y r& x$ \. l- {3 j: o& p- D0 C
- RTS" Z: ~; k7 i5 w
! L; j2 U. D- A! q3 A9 ?- ;----------------------------------------------------------------------. N0 H- e3 f: n) o- M' s
- ;音乐播放处理! ~" \5 K" e. X7 D) ~
- Music_Clear_Process
8 L. _8 z% k2 D" ^7 u: Y - .IF Music_Clear_Addr
$ l6 K/ N! w* ^$ h2 E - JSR Music_Clear_Addr
$ W3 p$ {9 q/ t6 A - RTS: q, @3 W3 Y& D6 m* G* j
- .ELSE) ^3 ?# M0 q" {- R1 g; |7 g
- LDA #$1F
- Z* J( p: J! z/ m - STA $4015
4 X1 l. {3 w. o, a+ M! r - LDA #$00) Q7 H2 Y* V H/ V: d! ?
- STA $4010
+ H/ A8 l. n* l1 O2 ~' k6 g - LDX #$00' U2 p; X, ~4 Y) ]: v) N
- LDA #$006 q" K1 l: L/ S" q/ S4 c& m( P& k
-
- ~: ]; E& f! K - .Music_Clear_Zreo_Page_0
/ Z+ \+ F; F1 C u% P0 U - STA $00,X6 R. e' T- p8 T
- INX
/ x) e b$ v2 ?9 v1 b - CPX #Use_Zero_Page_Begin& X4 C, f5 F' O' @/ E; x2 U
- BCC .Music_Clear_Zreo_Page_0, v- }4 ?1 i6 c$ ~+ f% j4 `; ^: x
- 5 U$ ~. W" b4 L: Y/ l* W
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
8 \- e5 l8 }- @ ~' j& j - .Music_Clear_Zreo_Page_1
6 ]- [* t" H. K! ^' G - STA $00,X
1 g! \+ w/ b$ X' d - INX# W' D( Y0 @; w4 O
- BNE .Music_Clear_Zreo_Page_16 P3 A/ e# F) N( z- {
- 4 P" Q( h8 Q! v; l
- Music_Clear_Process_14 p& p: C' L4 W V# L. E) q
- STA $0600,X
+ x; J8 G" k7 t% y! x# n - STA $0700,X
* } I9 X3 D8 v; A2 k - INX
0 I# \" o/ D9 I+ @6 ~& r8 @# q - BNE Music_Clear_Process_1
: x. T& t% P/ c) t' ^% D - LDA #$105 A" T! I' L( R. w, o& v
- STA $4000
4 Y8 @5 i" o6 g' M - STA $4004
4 V) o' e e" }5 |/ m: ]# X4 c - STA $400C
4 o6 o8 Y' U* w6 i( Y" g* t - LDA #$00$ t% w& r/ P, J! z% d
- STA $40082 u4 f* ^# h- f+ |$ v Y2 |
- LDA #$0F. |" u9 Y% X# ?
- STA $4015
8 \2 B6 Y1 q) p" | T, v; D- e5 X. _* T - .ENDIF: B; } o4 M* q# z3 B$ h
- 5 x; E6 ]. w2 B' c
- RTS ^$ D/ i& @8 l# s) S$ H7 ^
' u! Q' e: H1 G% n1 h/ [; U- ;======================================================================9 p0 v; Z2 t" n8 c! J0 t; g) b
- ;重启处理4 _7 P: T0 m" S" N4 |
- Reset_Program
7 x9 s$ n$ D M9 [- K+ r, u - SEI# X! B _$ Y; S' T# D9 c
- CLD( B+ q. ?5 }7 v' q- i& D- Q
- LDA #$00
' r3 C" o" _* c% C* ?4 U% r - STA PPU_CTRL
1 y2 y0 D i J2 N, B! l - STA PPU_MASK
: J M& U; Q! T0 e2 H - STA JOY2_FRAME/ r) Q9 K. N8 D3 n+ s( y
- STA APU_STATUS& y/ \( X4 y7 N; `( `6 w9 h
- " a, m. _. K7 _: y
- ;等待屏幕准备完毕
5 I4 N4 J* j; ?8 `! g- R# ] - LDX #$02
( @; I/ q8 [6 l: O( C; e - .Wait_For_Screen_Ready
; o# O/ R- I8 `" V1 H- D. M* k - LDA PPU_STATUS
* c2 w- K: `8 ]! p; v - BPL .Wait_For_Screen_Ready
6 y5 G& h" A! p8 b - DEX3 t( i2 l3 X/ p0 P/ b
- BNE .Wait_For_Screen_Ready# W0 U1 s( _+ F* M- ?
-
# e* J8 _+ O# @! }5 v# B/ U - ;清空调色板! g" R% [; P6 ]+ l
- Palette_Clear
. z& q: [- H$ Y1 V3 Y: p - LDA #$3F7 [, c6 q0 I1 }8 W
- STA PPU_ADDRESS
! n( ?, b8 l$ | - LDA #$00! Z8 [- g- Z0 G" j
- STA PPU_ADDRESS
% b2 g0 Q# U2 T1 ~ j4 j - LDX #$205 V) f, Z( G3 l& }
- LDA #$0F
: q; O& ]. ?! R7 {, E% E - .Write_Data0 ]- g# g- X5 F6 s7 a6 ]
- STA PPU_DATA
1 y& O; k; F. l0 e - DEX) q! ^. e7 C/ W2 g" B
- BNE .Write_Data
0 y H7 m% ?5 z' K1 D9 _0 `* S - 0 R, @) `4 ^1 z/ B
- ;清除声音 $4000-4013& i1 ~- }6 p+ P5 w* s
- LDY #$146 s# Y" J# E p" R6 D
- LDX #$00
4 F- T) N7 L1 p' n9 o1 H$ o - .Sound_Clear
/ \( m u6 Q5 j1 C0 y! a) V- r4 o - STA $4000,X
6 Z& q. e# w- B) [" ~ - INX
" t* ^! k F7 h* M$ U - DEY4 k/ H6 x$ I! [% r/ j3 U2 R
- BNE .Sound_Clear. Z# r! X4 J) E# f8 l+ E# T3 r7 u
- 0 G& Y6 \) E8 j; T
- ;清除 RAM $0000-07FF
: e+ T0 P/ j# d - LDA #$00
6 Z8 Q+ G' z) H* G) w- h; W - STA $00/ L. l- J3 d# @1 X* E4 |, z+ ?5 w
- STA $01
+ Y4 g/ M# i; ]2 E% b! | - TAY
, {( L) V! Y% L* z0 i- ~ - LDX #$08
( \2 U9 |- B2 M! H$ o2 D' f - .Memory_Clear
$ i/ k7 J8 u6 u: t - STA [$00],Y
% y! Q; n, @ M) s! W7 ~ - INY& k% ]. F. L3 ~' R$ c$ x6 c* I% P
- BNE .Memory_Clear
. L, T, b; @* M. a5 u - INC $01
t R) m+ s3 l* E - DEX% F' q+ F1 w% P. `
- BNE .Memory_Clear
$ r% P5 \& o) T) a: d! _5 L2 w+ h - 8 |1 _6 l4 _! G. H$ O
- ;精灵缓冲初始化
1 k, u& s2 }8 `7 d6 @ L - LDX #$007 L) c2 d2 k2 v9 j2 l
- LDA #$F8+ u0 Z, Z0 k8 u! ]7 j! r% ^$ D
- .OAM_Clear! ^9 F K- u2 x+ ?( l+ q
- STA OAM_DMA_Buffer,X$ A6 z- c9 j6 r. I
- INX* r3 E1 ~3 \0 J% {6 L# Z
- BNE .OAM_Clear& x5 v- [$ s, R$ T! q' L; |+ o
-
8 o6 d- {( z6 X% \: e: | - ;栈指针初始化 e4 t, j* @, K0 w( g' _+ m- A* [
- LDX #$FF
& o# M8 j3 S8 L2 z& ]* ^- | - TXS1 }# j9 Z( ~% p7 l3 F1 C) z% L. z
-
6 B! ]6 Z1 c4 |9 x" T) \& ^ - JSR Nametable_Clear;命名表清空6 Y! O$ O7 e- w; k4 G
- JSR Palette_Init;初始化调色板缓冲1 q* j8 Y8 u ?9 K b4 `
- JSR Static_Text_Init;初始化静态文本! @6 f0 w/ J* ]* O
-
* m! ~! a( V5 g - LDA #MUSIC_ITEM_TOTAL - 1, Y" G& P4 o) W1 \- }
- STA FC_Music_Max_Index
0 J' P2 U8 O6 N ] - 7 I& u# a& y6 A* n) s, B
- LDA #$1F. n' v8 k" b( @
- STA APU_STATUS0 P& j4 P: |3 M: d; f
- LDA #MUSIC_BGM - 1! c5 b* L. s+ @3 x( V1 w
- STA FC_Music_Index7 [8 c1 u) U" F
- JSR Music_Init_Process;音乐播放
1 o# u0 ^' @) X( {! T) m% o( { - . l! z& V4 d9 u& ]* }+ e+ \
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
% o* M5 p# t V: A - LDA #$1E
, N, M' e7 R0 q - STA FC_PPU_Mask_Buf
3 R6 l3 Z+ }0 y( [* Z. ?5 K - ) F6 d. |. ^4 Y2 A: w
- ;启用NMI处理
5 r' \: `* a5 x, m: m - LDA #$80
6 P( ]( K! h1 s( U0 s - STA PPU_CTRL/ i3 v. U1 q7 G% h2 N! `3 C
-
( \( X- A% d/ z3 X u7 o - ;程序循环, 剩余工作交给 NMI 中断处理- j, f( C) U* `* w
- .Loop
2 c$ J" o3 L8 [# w - JMP .Loop
8 F0 `7 W- E) U; e3 i K7 U - 0 {* p# G/ u8 s. s/ N0 T
- ;======================================================================) A' B: t3 r8 P$ \4 n
- ;不可屏蔽中断处理
d- ? U! E! J' u7 r - Nmi_Program! u9 i) t2 }5 K) N7 {
- PHA
+ N& M. J- Q. C+ {; F - TXA
, h& D. U0 _" Q" D - PHA
; e. T' t. V% F6 f - TYA
( z+ ~& _, [2 D0 I% F - PHA7 U- @% l6 r# Q. W. n0 E
-
1 {, X' E$ Z, a+ f( I - LDA PPU_STATUS;读取使得 PPU状态寄存器复位 v! I! \0 z( W, ^: {( d' {; N
-
9 W+ A2 b5 M) \3 K- @ - JSR FC_PPU_Procrss;PPU处理
2 c s P: `. G0 t -
! C5 |/ J* @! T% b+ k2 A6 \ - ;精灵内存更新3 r! O4 V1 l% k e T: i+ r
- LDA #$00
- T8 h. a0 F1 a& }: k) B7 H - STA PPU_OAM_ADDR
& |" F7 p6 P5 Y6 H# j5 I - LDA #OAM_DMA_Buffer / $0100* \: M: v T% J6 T6 H0 S: ?8 P( o, E
- STA OAM_DMA
% V0 w8 [# Y! |) S - - J0 c& B1 O6 @& b) a* h# d- O2 R3 _
- JSR FC_Gamepad_Process;手柄输入处理
* E7 l- e$ q/ E5 }' h" G* @3 _ - JSR Music_Select_Process;音乐选曲处理" r6 z8 d, f! Y1 m) L0 G/ S1 Y
- JSR Music_Play_Process;音乐播放处理' _4 ]$ Y5 I$ C3 P6 T C- A8 |: Z
-
6 h) f7 g4 G) h2 E/ ~; T; _& C - PLA! T' w8 d5 Y1 @# {; \- g# p6 }: p
- TAY
4 n& l/ k& G# e9 J& o% t% t; b - PLA6 q$ X, Z2 d$ Q- a+ C
- TAX3 s; Q% y2 t+ t& }; K7 H0 v* t
- PLA
0 W0 ]- j" v2 i0 L2 E+ D - 9 d2 G: j& L' ~+ J: f; Y
- RTI! ]8 Z7 k; k/ a1 V6 w
- . L/ B8 R4 h/ k( M: m7 F i
- ;======================================================================
) E8 z8 |6 H+ V2 @$ Q2 d - ;请求中断处理
0 ~( I; B9 ]2 v: @3 x! p5 d# t" p3 m - Irq_Program
: {, s0 L$ b) }$ u4 {% g& d2 S - RTI
# P; u( _ k1 X* z: k8 {
6 X# b2 m6 l" Q& D2 U% N4 f- ;======================================================================. n8 E9 G' c, l9 m5 w: d: X, m. S
- ;中断向量表
6 |6 i2 H* p [9 y$ y - .ORG $FFFA
( S: k) B6 K# p7 x ^ - .DW Nmi_Program ;NMI触发时执行2 v. g1 C. ^" L. n
- .DW Reset_Program ;载入ROM时最先执行8 E& X# [4 J; L5 K
- .DW Irq_Program ;IRQ触发时执行% `5 A- P$ }4 O/ f. E; s
复制代码
, {7 w" _ O Q, v, m8 x! F% C
# p+ F9 Q8 F3 J- X8 _
; X7 Z$ E/ h% {3 G. Yhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|