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