|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
4 `0 }0 J- @% q5 Y2 H) H7 X1 x ) M# |$ w: t; f1 A' Q0 |) l5 O
以下是主框架代码:
5 A9 k! H' B+ Q0 H3 o1 X- ;======================================================================
8 k/ ]' _4 H8 f! O - ;文件头0 C4 d; q) k- Y) I& s; i) ]
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量# _) P7 i5 Q$ p) G7 D0 n6 r' _/ W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 x# W6 S' d5 a9 k, D( ^+ [
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
$ r% [8 E+ E0 J, |1 t- t% N( i - ;======================================================================) S' {! i; y9 }( Q0 ?, s
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
3 y- {: T- h* |; o3 D( _& n+ i - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1. e- k) J/ l+ j2 ~. G
- ;======================================================================, q7 j, T7 N' g
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 11 L s2 B. f0 G0 H
- RESET_ADDR = $E000 ;主程序起始地址& c' l$ D3 l1 f {
- ;======================================================================
1 y9 f/ N9 Y7 ?9 o# x - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
, d ], F, X( f+ k5 D( U - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 z( s+ ?0 j( I* v ^, |, f
- .INESMAP 4 ;Mapper号 (0-4095)
+ g( k" ?; {$ \ - .INESSUBMAP 0 ;子Mapper号 (0-15)( D% A7 \& P8 j9 i0 y
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)7 }4 |( z3 }) X% p6 m$ B3 B/ E3 C$ w
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# n5 S$ W) P" o, N7 U
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数), a9 s, X" r: A) M7 J% C. y
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
3 z* Q. a" y$ i; b! C- r - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
$ B% d' r: ~, ^7 g- C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)& E$ P6 t3 z7 {* c: | `, i1 s: H6 Y
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
; l" N; e4 B Z K0 P1 g$ Z. y - ;======================================================================9 E, o9 L ?& P
- .INCLUDE "fc_demo_config.asm" ;全局配置
: S7 F* I" |" d/ F - .INCLUDE "fc_demo_constant.asm" ;NES常量! F. Q/ c; I- h4 I
- ;======================================================================
$ G! K' B# c6 S* i D# ` B - ;音乐配置$ j1 x" k9 q1 ^4 R+ Z I
- .IF 0 = MUSIC_THEME 4 P6 f2 O& `+ p
- .INCLUDE "data/music/Gremlin 2/config.asm"
1 b& n+ {9 Q* }/ P; ^" _ - .ENDIF
$ m+ _; p( O1 @1 a - , X2 ?$ Z# M4 g" z" z _
- .IF 1 = MUSIC_THEME
3 W4 z2 k! z x9 m5 k) J& x - .INCLUDE "data/music/Raf World/config.asm"
, P; `: G+ M, ^) u8 T6 a - .ENDIF
) `0 q/ ?2 l( h' E5 }% ~ -
* P0 u4 c; U* ]9 y - .IF 2 = MUSIC_THEME & N8 U3 S$ T& J2 Z
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"/ |( y: K; H9 j2 }
- .ENDIF% F# j7 |: Y2 h' U# f, A7 D
- : c$ }/ B+ Y5 \0 u
- ;======================================================================- M3 j5 G" B3 m9 D& m9 x- v- z
- ;引用CHR图像数据 J6 L+ V8 f3 S" x
- .BANK NES_16KB_PRG_SIZE * 2
* G/ u T; v% R- m5 m: a - .ORG $00000 A6 X) V$ M; Q o- C) Z: j
- .INCBIN "data/bkg.chr"
, S1 b1 M6 n8 p- f - .INCBIN "data/sp.chr"9 a8 \' K# c$ p* r
-
3 n" M6 p' |; G: o( t - ;======================================================================0 z) ?1 C6 G- F5 s3 e
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ b3 L+ w% e) l+ `( g* `; h" x% g - .ORG RESET_ADDR
% J$ M/ c" E0 j$ O9 R - ;======================================================================# G) a v4 X0 L7 f* [' d9 r: c P" x
- ;引用其他源文件, l1 V! w, V% _) {+ J, @
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理2 F) ^* Y& ^, W# I2 i
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
$ p* A: Y2 N& f3 e - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理* m$ t* C. T2 T6 i; t
- ;======================================================================) N9 B' }& l* D; C6 l' P) v
9 X1 g. p6 b1 z5 A' x0 [- ;======================================================================
+ r- p% X+ Y) p- F" t$ k9 U - ;等待VBlank到来
0 d; M3 u! \$ J4 P1 x- ?0 K - Wait_For_VBlank
2 a% q- Z0 H9 P+ j) i - LDA PPU_STATUS
' i" J) s( \5 p- q$ r - BPL Wait_For_VBlank0 i- V6 y3 X$ D% v
- RTS
( _# k3 m" \0 S5 u - " _$ z1 J" _2 B; A* A- G$ s
- ;======================================================================
8 r- C- P/ Q2 F/ F9 G - ;调色板初始化
4 [* }0 n( x4 h; j - Palette_Init. K! R a ]1 R: {$ {; t+ R9 E2 y
- LDA #$3F: h1 D6 K2 s# o6 l
- STA PPU_ADDRESS( D) F/ I2 W- h* x% H$ e
- LDA #$00
. L" }+ }. Q- r7 ?; Q - STA PPU_ADDRESS* |. h) {3 a# L3 u
- LDX #$00* f. N) i1 A5 I6 S
- LDY #$20
" h" c* ^, V0 \/ n - .Write_Data8 K# E: ~- z" K' n
- LDA Palette_Data,X4 W- q) j, w2 z. ?
- STA FC_PPU_Pal_Addr,X
9 C4 f9 w6 ^% Y5 K! T - INX
2 D( C. U' [5 N# M) p; y0 `) K - DEY4 G, r3 _- X2 m- \, X0 [
- BNE .Write_Data
! @* B0 w8 I; p6 r; W( l0 o5 c - .End
7 B S8 s) B3 d7 @: i1 ]9 m9 A* x$ | - RTS, \# i" ?3 o6 X7 {: E; ?( Q
# E6 Q- |. z1 ~. S; l) @8 n0 ?1 c- ;----------------------------------------) I. v! r2 v p1 s8 k# _' g6 p5 l
- ;调色板数据
. M2 G6 i- S/ W3 H P" A - Palette_Data% y& x$ A5 |: X+ ^% _
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B- G ]& |# O% o' b; ]$ q* z
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22& j* c( }7 ?% g7 } B
-
: ?- |% y0 Y& G6 d6 |+ Z - ;======================================================================8 _+ u; ]3 [9 |1 Z7 G" \3 c `" u
- ;命名表清空! y5 v; i: o: T" N5 |2 w# l
- Nametable_Clear
9 s7 S2 {* Z( M+ { - LDA #$20
+ }3 a7 M; Y- A( D, G( d: x& c - STA PPU_ADDRESS
; m# O! S' K7 ?+ V( a - LDA #$00
5 ^$ g4 h* Z8 J$ R - STA PPU_ADDRESS/ I* |8 ]$ I. H8 W. `( Y% E
- LDA #$00
, i0 l) I( Z% ] - LDX #$00
0 Q s7 C4 B9 _% e! a2 q8 L% M - LDY #$08" O) k) F) e; F& A8 b L7 l
- .Write_Data9 W _8 L/ f- m! m6 n6 @- B" H) h! Z
- STA PPU_DATA
% c! ] h7 f! O' I. _ - INX
* d h1 y- ]4 h J- h- e) w! D: y - BNE .Write_Data7 k3 V \6 I0 L5 B z$ r
- DEY! \0 t) e/ M' C0 P
- BNE .Write_Data
; e+ B. L. \7 L0 O2 i: [ - .End. C; |+ o' G1 h( [9 {
- RTS
; ]6 f* F) G7 e6 o( p+ ^
( p4 y; l9 k5 I6 h5 b# ~- ;======================================================================% A& o+ T1 Y+ X% }; o! h# e; Z7 t; N
- ;音乐曲目切换/ q3 Z5 E" E3 d$ m+ w
- Music_Select_Process
- Z" } T& T' ]8 k+ S! w) d - : y4 Z, m4 P0 _
- .Pre_Music;上一曲
j$ M* C. o0 t) M0 | - LDA FC_Gamepad_Once" ^" p0 c, J4 U u A* R' p. B' v
- CMP #JOY_KEY_LEFT+ ]! T. c; q* T3 a% U( o% H
- BNE .Next_Music. |1 C' A0 H! j, l( m% S: X; I# `& R8 U
- JSR Music_Play_Pre1 C; J" _! _8 C
- .Next_Music;下一曲
# P6 W- H: ~+ O5 C - LDA FC_Gamepad_Once
, I7 Q+ \& d' T# x+ ?. J - CMP #JOY_KEY_RIGHT. T$ a) ], j7 Z! _! M$ N! J2 `
- BNE .Next_10_Music! V' F1 T4 e1 J
- JSR Music_Play_Next( L' v+ C6 j% H a4 A4 I1 M, m
- .Next_10_Music;上10曲8 S W1 Q; Y6 z7 U/ D7 ?4 `
- LDA FC_Gamepad_Once
" G& J3 T# C3 E: o Y - CMP #JOY_KEY_UP
% a! @$ q1 _/ t - BNE .Pre_10_Music( X+ m4 s& j( T/ Q- L H
- JSR Music_Play_Next_10
0 d& j: i7 J$ C |8 O* b B; `, V - .Pre_10_Music;下10曲/ o6 a8 ]- ~: L0 c- z( z
- LDA FC_Gamepad_Once
, E+ j6 [, A5 J - CMP #JOY_KEY_DOWN+ u, v6 o# I$ t& v# w
- BNE .Reset4 E& ]9 |, s v3 [ E( x
- JSR Music_Play_Pre_10' `8 b( A0 g0 V" t
- .Reset;重播当前曲目+ ] I" ^- k; h8 X! |# ^8 D+ W
- LDA FC_Gamepad_Once" O) @! y) I7 E3 f: X
- CMP #JOY_KEY_START5 c7 {% |4 w9 O
- BNE .End
0 q" ~. c4 E+ E- c! s7 Q+ t - LDA FC_Music_Index, M& d6 r1 F' z7 ^" N
- JSR Music_Init_Process
) q3 \& a: b- G7 j - .End
. J7 Q" ?) c" @( s/ |9 v - RTS
6 F1 w1 N. F, Q* w - / |7 q% ?4 ?) q, _; H; w; Z& H S( h
- ;----------------------------------------------------------------------
- s+ j1 L+ W& X3 T! n8 p - ;播放上一曲
/ W, c( {# l% \. p - Music_Play_Pre
4 R& Q1 Q: |5 _2 C$ H( u - LDA FC_Music_Index8 D/ M* ?: D3 Z$ C
- BEQ .End& c4 ]$ _% v. a3 U2 Z4 S8 p
- DEC FC_Music_Index
: W; ~- h; D# w1 r) W - LDA FC_Music_Index
4 C/ p& a) A9 L" l4 L8 r+ c, b; V - JSR Music_Init_Process
6 f, @( @$ z) ^ - .End3 y+ y$ o! j) d' y% Y
- RTS1 n# w1 y; O. o6 q& x4 \4 H
- ;----------------------------------------------------------------------
7 ~& ^4 c) X9 v) j q/ f1 W - ;播放下一曲/ W" K( h6 s7 @. A
- Music_Play_Next, Z1 c: k# w. Z" Z* J& x
- LDA FC_Music_Index" ?* s4 G6 a9 o4 u
- CMP FC_Music_Max_Index
6 G l# E+ y& L1 M# b# a - BCS .End9 R- ^3 {; [! e; q. M0 l# |
- INC FC_Music_Index
_8 T1 m- A+ c4 `, ~& e - LDA FC_Music_Index
# e6 Z7 p$ m- R/ m" V5 I9 Z1 q - JSR Music_Init_Process3 D/ B Z+ w% f U& i
- .End
; ?- z" C5 z- [1 e - RTS! [3 ]4 T0 s6 ~$ J, N* |0 L
7 d u5 w8 }" h2 x- ;----------------------------------------------------------------------- y& [. N0 ` A% @4 x
- ;播放上10曲
, e- Z- j/ @( {! `, l7 } - Music_Play_Pre_10
8 q4 d I# G# |+ s$ o' @% \ - LDA FC_Music_Index
. G; H Z" n5 }! ]3 U - BEQ .End
3 N2 n, p$ i6 v/ n; l+ ^ - SEC
$ E h/ e, {0 u' y: c! K7 i - SBC #10
9 h1 v9 K; m U: N( X( C1 k4 c - BCS .Pre_10
1 T+ i, G( C0 T - LDA #$001 o1 u8 \% O' ]# [2 v6 ~
- .Pre_10
. s4 a( ?6 {9 t1 W* G - STA FC_Music_Index7 z1 v5 u5 C& ], Z0 L% w* g3 l
- JSR Music_Init_Process
/ h1 c* Z- Q4 }8 p - .End
8 ^; E4 Q8 l/ u# i( O - RTS
# e" a. F, d3 _8 n- B - ;---------------------------------------------------------------------- O7 M, C4 B6 z8 }* Z) Y- l
- ;播放下10曲
# W4 h7 l4 l5 U0 J - Music_Play_Next_105 z1 K/ |. c) }" v# S
- LDA FC_Music_Index* p) }& S) @! O; U: m6 }
- CMP FC_Music_Max_Index' a5 \5 l, e! n0 y
- BCS .End
9 q( b$ ?- u, h6 w2 y- i - CLC
8 o8 W8 A9 ?; C, j: d - ADC #10' Y$ R8 o3 e+ A4 ~
- CMP FC_Music_Max_Index
; \ a( d# H8 }* ]# \) B - BCC .Next_108 `* J% K* b+ ?& J
- LDA FC_Music_Max_Index
" O0 `! P4 ^3 r2 Y% Q7 l - .Next_10: ~- p R: u& m3 j* \9 q
- STA FC_Music_Index9 f4 I# C ?+ j2 H& f
- JSR Music_Init_Process
% O9 W- ]% v0 F8 h# o* \1 y8 q% G - .End
& H; g1 B' ~1 M$ X - RTS
7 H: a) f8 s! X9 ~
! J% C: K3 } K( k- T- ;----------------------------------------------------------------------5 e& v. }; _! Q& q
- ;8位十六进制转3位十进制制" z$ a5 ?' s0 W* D S
- Hex8ToDec6 x2 N& D7 O9 ~/ y
- STA FC_Dec_Data_12 v" ^- {: x }# s3 k( L2 X
- LDA #$00
! I. c0 T9 p4 \* ~6 T! w/ m0 e - STA FC_Dec_Data_100+ a" J$ t+ Y+ x$ c6 H
- STA FC_Dec_Data_100 P. {0 K7 j+ n Q) A6 t$ `$ ]
- LDA FC_Dec_Data_12 o: d6 d3 g. E3 a6 t, k" x
- .Convert_1001 m3 v) D U7 c: o7 ^' B
- CMP #100
' n* ^% B( U o2 Y3 U6 Y - BCC .Convert_10
. t9 x" | a- G3 Y$ Y) Z# @- ^% R - SEC
" x- I, M; y* |3 Z2 c) \4 }5 a - SBC #100
& Q7 ~8 _2 F$ Q8 m" e* D - INC FC_Dec_Data_100* G4 A6 ]4 l# M2 _
- BNE .Convert_1006 ^9 }+ Q+ F* H1 ^; p2 d( f
- .Convert_10
& s2 J2 |. _/ Y5 M: o6 G/ w - CMP #10' k0 z: \4 r6 [1 v) ~
- BCC .End! s: Z. |, X O
- SEC. s3 d: z+ Z( }% h
- SBC #10
?2 ^% B% L- a9 k+ J - INC FC_Dec_Data_10
9 E) y% o( G. c" s$ p7 b: i7 `' w - BNE .Convert_10( Y: E8 {" C8 r! h9 ^+ Q0 y
- .End
1 l/ c" `- q" ]' C; E - STA FC_Dec_Data_1( k# Y- V% R. r0 I+ b1 q
- RTS3 w; B4 p7 V5 }- N8 W$ J
9 j. D3 d; `$ X- ;----------------------------------------------------------------------
9 n" o* B! q9 C9 U, A" b0 s! e/ i - ;显示曲目信息
0 t7 o% y9 Y% ]( a% b! ~ - Music_Info_Display3 U% D+ p4 G3 _: z i
- LDX FC_PPU_Buf_Count
6 i( H, @9 I% F( ]+ u - LDA #PPU_WRITE_MODE_CNT_LINE6 ?- K: J* T1 A% Q5 O& e
- STA Use_PPU_Buffer,X' t. A9 R! n1 g5 [
- INX$ S! d2 @' P# F5 P: y' R* Q% \
-
: V+ P) J/ E& m0 } - LDA #>MUSIC_INFO_POS" R4 j5 w) ]5 X& y2 E8 e
- STA Use_PPU_Buffer,X
& m5 E6 t0 F+ m$ M - INX
3 |# Y3 s! f/ J0 e% H -
7 E C4 ~. d! W; j# @ - ;居中
' Z1 g [, L( d+ I7 Q - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2/ f1 ^3 C8 ~/ `$ ^( t0 W& y7 b6 I) ~
- STA Use_PPU_Buffer,X
4 Q' c0 c$ S6 K& O - INX
1 ~4 C; j- g, U8 @ -
9 Q2 ~9 P$ e+ ]2 l$ V - LDA #$05# Q* U X3 Z$ r3 E* K9 X8 h0 C ~
- STA Use_PPU_Buffer,X |* h5 c( M3 |2 @
- INX4 U$ v; t' l# r$ |: |
-
8 v2 }) j' r9 T8 N* z9 S# M - LDA FC_Music_Index4 V, X2 k. T& B9 n8 p i' @
- CLC; x; \& c. V; |, h' Q1 Q& a
- ADC #$01
2 [1 o1 l1 T7 G7 P% B4 W, p - JSR Hex8ToDec3 u" @2 T: W3 K
- P) C. O' `( u J0 ~
- LDA FC_Dec_Data_107 q( j* W* n4 P5 A1 X3 Y2 |
- CLC
: J0 b; X, |' ?! k - ADC #'0'; P. i" E4 h6 i% w0 E2 q. C! ? A ?
- STA Use_PPU_Buffer,X H# S) D6 v' Q
- INX
& ?+ Z* b( L) P+ o -
, q {$ H2 m. }; X9 T - LDA FC_Dec_Data_10 q0 v: Z, K2 y& L7 D2 m
- CLC
$ {# e& W( b% a" r' L L$ d0 w3 N5 a - ADC #'0'
2 v8 M+ k' e* {5 A5 {, K) i - STA Use_PPU_Buffer,X
! f3 B7 a9 |' g: f* H- E - INX
5 q: o0 u# _8 p' \ - 4 T; h9 n! ?' G
- LDA #'/'
7 e/ L: L. k& O# i2 @ - STA Use_PPU_Buffer,X
6 a; f. n: F) ? - INX
1 j: G, D" i+ [2 c# x! s" I- B - 1 c0 d# ~- T: Z
- LDA FC_Music_Max_Index
" q6 M8 _# x4 S1 }) R6 J3 T - CLC
9 i7 Z" `0 b* [! ]$ _/ b3 H - ADC #$010 Y4 ^" P/ ~( s _
- JSR Hex8ToDec' [3 v9 ]" c) _' \3 p
- . V, @- x* I- {/ j/ a* G+ w: R
- LDA FC_Dec_Data_10( F. m" ?5 S" D3 i s, ?: K+ ~
- CLC) |" X# G% d0 Q+ E1 V. L, j8 V
- ADC #'0'% m7 c# z( r0 Y
- STA Use_PPU_Buffer,X1 Q% s8 q2 }( `) j4 W
- INX
+ n5 A# j0 I1 F - - t1 h& _3 I$ E b, y8 t3 A0 }/ R# m
- LDA FC_Dec_Data_1
. V5 |) f7 \ W0 k - CLC
0 |8 r7 T- U9 n7 R) R( O - ADC #'0'
: o2 ]2 `$ z, a4 \( q9 y - STA Use_PPU_Buffer,X0 J1 ]/ T3 S$ w( \9 b/ ?$ Y
- INX
7 n: ?* j2 c$ [: M( M# \ - / I q, z4 E% k x3 ]+ }+ |
- .End9 ~. `, E8 ?2 r3 f* g! C0 {8 g
- STX FC_PPU_Buf_Count
: D& w" \$ Q9 T' E" L/ r/ B5 G2 a% s - RTS
5 v2 L1 c% f9 U; X& U* A2 P# M - 0 y x" c' v1 U- V T" n, O0 L
- ;----------------------------------------------------------------------# t' W/ {8 [& ]) y/ Q2 [3 \6 ?
- ;音乐曲目初始化处理
4 [+ J N( \& I5 T3 Y - Music_Init_Process
; s: ]2 R0 C( a: P* d - PHA( v C) d! B6 N0 c
- JSR Music_Clear_Process
% \2 U8 P1 `- U8 y3 \ - LDA #$1F$ i$ q7 i- ^/ p- D
- STA $40151 I$ p) a) B: y5 h% ^- I
- PLA# A) E$ ~. G% j$ ]+ z# `: I w6 T
- JSR Music_Init_Addr
2 H3 g$ b+ s/ j2 @' x P4 b' a0 { - JSR Music_Info_Display
( ? G1 P" A/ f( _7 C - RTS* O* _# G8 y9 `" X
- 9 j! c0 f% Z9 D
- ;----------------------------------------------------------------------- n! `5 G$ `: y9 I! L b; N
- ;音乐播放处理
4 x3 C" G" T+ X - Music_Play_Process
) B4 b( g7 Z$ N- u! c& y+ ]+ z - JSR Music_Play_Addr% l+ o* y0 U2 J" s) y( a: t! Z( n
- RTS
2 T1 U3 q9 o8 D- F. @$ s1 g$ {
+ ]& O V% i! e% B- ;----------------------------------------------------------------------5 N f* p/ ^4 B. D! z& s4 X
- ;音乐播放处理2 K0 N9 i2 i1 V1 A1 u4 r
- Music_Clear_Process
" D; v6 S0 P% \: ? - .IF Music_Clear_Addr; V1 Z+ e9 @; d2 E( R2 e
- JSR Music_Clear_Addr1 }" J& }8 x8 n5 F8 J
- RTS
. O0 D+ p Y2 T( y - .ELSE0 L( ?: ?* T, r9 P5 E
- LDA #$1F6 k. z6 O5 Y3 P _1 @; o
- STA $4015$ G# a9 A/ T' k) m7 v: j9 z
- LDA #$00" X! T) y; A8 k' s# E$ g! x
- STA $40100 D1 u0 `" R$ }2 D) \2 c
- LDX #$00
, L" y6 a+ O3 B( v$ L- n - LDA #$00
' m4 q/ Q; Y! i - ! b, s2 M4 I& S! M0 |3 Q& ~" l
- .Music_Clear_Zreo_Page_00 r3 G; b7 V, F6 j2 n
- STA $00,X
1 }; m+ ~' e t) T% V% Q- L5 H - INX3 c( C# Z/ {4 j$ Q1 A4 ~+ P
- CPX #Use_Zero_Page_Begin
! `/ \1 V w; I1 n/ R1 r2 [ - BCC .Music_Clear_Zreo_Page_0
3 q3 C+ G. ~* i+ F$ ^1 o -
. d" Y) M) e6 m5 t - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size' Y% o& H3 _" ^. C9 W$ u1 k
- .Music_Clear_Zreo_Page_1
, a2 R8 }* [% K$ _4 U6 y - STA $00,X y3 R0 T& E5 ^9 B. d. c5 i
- INX7 E" f) O4 l e6 x! S2 H {
- BNE .Music_Clear_Zreo_Page_1
$ [8 U) H2 k e K# K+ G - 4 X; o/ c9 F) B5 V w1 a
- Music_Clear_Process_1
7 S. E* I1 W/ K& B' B - STA $0600,X# d+ g* Y# X) b c) l! w2 o
- STA $0700,X3 }+ k8 i( x$ P
- INX
. @( P0 ?% l, e8 R% p% C) K% Y; C& T - BNE Music_Clear_Process_1
6 I9 i$ Z; Q: I0 s8 y! J - LDA #$107 e9 ~1 f' @' u" Z0 Z* g6 D
- STA $4000
0 t; Q. A/ V, H. u& S# \2 I - STA $4004
$ i. A: C- G+ e# a8 t9 U* N% B - STA $400C
! x9 L8 q( \+ X+ m, A" [6 {* t" ] - LDA #$00
* B* J( v, j* X6 j - STA $4008
- Y: i0 W2 n. q - LDA #$0F
4 ]% u" H2 R6 R# D# y# w# v3 C - STA $4015
b% f# T9 z" {) V5 q, V; p6 a - .ENDIF2 i0 m3 ~, p$ {: f( J" u
- " d1 V! q4 f1 b- ]$ D X! @. |
- RTS
# T `) G6 E. o8 ]4 B2 b+ l4 M
( s0 {" f( j4 o, F H: l) j- ;======================================================================; p( X- N1 ^2 @5 T+ |) T4 W7 C3 U
- ;重启处理+ q8 [: G" y' @2 }2 e
- Reset_Program4 H& Z) P. u2 w1 P
- SEI
8 \7 ?1 c/ S# d - CLD
V% r: R# ?# v9 k4 w- t, q& u - LDA #$00
. [5 b* F# [2 [ - STA PPU_CTRL9 r. `, g$ P* ]7 y3 X
- STA PPU_MASK$ Q9 f) V7 A$ Y0 ~ ~
- STA JOY2_FRAME7 w% z. o4 w; \' z5 Y! D
- STA APU_STATUS% N7 c# `! g% W8 |# s
- ; r7 z8 o( D6 g, s+ }8 \, A. {
- ;等待屏幕准备完毕- g2 p& v4 B$ n( l7 v9 z
- LDX #$02. R" |2 I3 F6 ]' v# Y
- .Wait_For_Screen_Ready
! |/ R3 h7 k8 X: J; i4 x - LDA PPU_STATUS
, @4 A, M5 R6 e0 [ - BPL .Wait_For_Screen_Ready7 L5 p. |* W3 H7 j( N
- DEX4 }& m' q( g9 h' d4 S- l
- BNE .Wait_For_Screen_Ready' J9 R. p4 v5 s) [! k. G
-
, e" ^+ S- R/ c/ ^ ~ - ;清空调色板7 f+ A4 {( t& Z3 o! _2 o# ~
- Palette_Clear0 k8 f; q3 o/ n% t8 P9 f
- LDA #$3F/ C0 q3 y' I$ Y, J3 P7 J) H
- STA PPU_ADDRESS3 @& O; [. P- h/ O, B/ W
- LDA #$00
/ l! p1 i/ J& _; I. h7 a - STA PPU_ADDRESS
9 u, j& B1 G5 P4 G9 n6 o1 f9 B - LDX #$20
6 q! s5 w2 N: h( u* `- } - LDA #$0F9 c2 ?6 Z3 A6 E; h4 M
- .Write_Data4 e5 p- R- ]; L; w" j% ?
- STA PPU_DATA. t2 L& G! f2 G, L
- DEX; J6 a2 t O7 [9 I
- BNE .Write_Data/ ^* D0 F+ A. \4 N C
- 7 t3 `0 s! q; o
- ;清除声音 $4000-4013
; {( S5 m( {! w& c& H* r% P2 i - LDY #$144 a. ?: [8 A4 Q6 r& Q1 U# J
- LDX #$009 v/ ?( m* p% x l/ C
- .Sound_Clear1 I' F* T: J8 [. e
- STA $4000,X# z" ]9 j9 O& y( W6 b8 s6 v; s) E
- INX
5 w1 Q' i; P! I - DEY
2 f- A" K" A' j6 x: k2 X - BNE .Sound_Clear0 ?) f0 r- R5 q$ P4 \4 M2 ~ P. E
- ; W* B7 q3 v( u, X. E. W1 L
- ;清除 RAM $0000-07FF: r; ?' V3 X" I1 i' F
- LDA #$00
. u/ l- [* y; n+ {4 t/ u7 @ - STA $00
' j8 L/ Z" g' @- Y' l' @7 H( M - STA $017 H* \9 m. P! T, y" A @
- TAY
G; V1 B8 E3 ^5 A' Z9 n6 ` - LDX #$08
8 Q$ I5 U1 D( d# e4 q - .Memory_Clear& i2 A% c5 O% \( Z3 k/ ^4 ^
- STA [$00],Y
% W2 n7 J& k0 S8 y# |4 V - INY
( ]( d* C7 \0 f9 K& O7 ^ - BNE .Memory_Clear, v$ C2 T2 k: r
- INC $01
$ D) ^$ n4 |9 j8 U - DEX' p p! J' t0 L8 w: i
- BNE .Memory_Clear
- D& \) a/ f% y/ n) b - # F# n5 i e, m
- ;精灵缓冲初始化3 ]/ _$ J, V$ `, E
- LDX #$00" ]* ?3 O/ j! O3 }- K4 v. i6 K6 K
- LDA #$F8
0 l( E: f5 H3 y9 f1 C( V - .OAM_Clear
) e5 X# M1 ]0 G$ U - STA OAM_DMA_Buffer,X
@# N8 m8 t( u- N2 F* x - INX
6 Q6 v9 C" q7 O4 V - BNE .OAM_Clear
2 k; X7 v6 _' ~* v1 W. p1 D! a5 d* p - 2 ?& Z2 W1 i& Y% ]) T1 m0 x
- ;栈指针初始化
5 j4 R" [: V" ]0 p4 D) w) T' M - LDX #$FF9 H0 B7 L* ?7 {* L) L
- TXS
8 P/ M% D$ b7 f - , B5 p: z/ M5 t) c6 `- E
- JSR Nametable_Clear;命名表清空
! L, H9 { e) }6 M. S2 J& G - JSR Palette_Init;初始化调色板缓冲
i0 y4 C& V' h1 o3 F5 q - JSR Static_Text_Init;初始化静态文本9 W; v1 W3 Q2 ?) m; U% S& v& F4 S( |
- * I, R$ C6 l5 l
- LDA #MUSIC_ITEM_TOTAL - 1
1 a0 s9 g) d% d; { - STA FC_Music_Max_Index s7 @! `6 M8 k* E6 S5 t
-
V8 U0 f8 h6 v) J - LDA #$1F
) ^3 F! _; ^* Q2 U - STA APU_STATUS
4 m* U) l! |0 A; V - LDA #MUSIC_BGM - 1
* C2 e1 H) v. S3 i1 E - STA FC_Music_Index
- m' n3 j; R: d9 M& V5 m$ J - JSR Music_Init_Process;音乐播放+ T/ u6 G2 P, @! B, e
-
! ?7 b, U2 a& N: g - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 l2 O+ n0 H3 [: U' T0 u
- LDA #$1E
* y" n/ g7 @7 c0 p - STA FC_PPU_Mask_Buf
0 H* G4 S3 _0 ~8 U9 D k& n2 t -
2 R$ M) k0 q* Z: P& z3 { - ;启用NMI处理
+ _" Z! w; b1 p& M7 L - LDA #$80
2 C8 P+ g) ?# W2 T( [' Z# @4 u4 p - STA PPU_CTRL1 _9 f( \2 w4 ?( U0 m
- 9 W; L4 \7 p$ y+ w; y( c6 j
- ;程序循环, 剩余工作交给 NMI 中断处理 f4 J: K0 L* h5 N
- .Loop
6 {: r" b0 c& U1 r t$ {; q - JMP .Loop
d+ f% n, V. v& x
: R; G& t7 Q2 v& H1 B, i! D- ;======================================================================; P1 S: M" j3 Y$ h" S; z$ f# u
- ;不可屏蔽中断处理" T4 X1 p: w* j7 x* y
- Nmi_Program5 T0 P) Y9 \5 u T9 W
- PHA
' V/ M/ B) F9 f4 O# R& [ - TXA# @# W. N9 G f+ V* V. X6 j
- PHA
3 G: I/ I: y4 W9 B7 G, [ - TYA
- L$ r: Q1 z+ z' [7 [ - PHA! S7 a9 R, e$ d
-
0 p/ Q1 G7 g1 O+ @+ m: v1 g - LDA PPU_STATUS;读取使得 PPU状态寄存器复位( |6 }% J" B( R; b8 J* `
-
1 |# J6 U3 _; Z0 ~ - JSR FC_PPU_Procrss;PPU处理! s3 j$ A a# t; [. g$ H
-
& P: Q1 _, h6 G5 q+ y F+ C+ m5 G( y - ;精灵内存更新% T9 \+ s% ?! b7 ^1 H
- LDA #$001 L1 z7 p, \" V: l/ u8 E
- STA PPU_OAM_ADDR- c% u5 Q' b1 k' i; q5 K4 i
- LDA #OAM_DMA_Buffer / $0100. Q1 Q% |; _( `# x: p: N: @
- STA OAM_DMA
6 M( e! G" X8 w5 P) o, e; z -
1 y: {6 \% m9 X" |6 O - JSR FC_Gamepad_Process;手柄输入处理4 z: _- {9 @) O# d
- JSR Music_Select_Process;音乐选曲处理
1 ~& s( A7 t) `: D- k7 O4 [& | - JSR Music_Play_Process;音乐播放处理
/ A' q! J! ^: q8 _1 | -
9 @; H# x3 h& g1 w; ~ - PLA
- H) K- \" N- T1 L& \ - TAY. u4 j- R# T+ i E# I: S$ d3 [
- PLA
# q+ a' l- u/ E$ j v - TAX- u, \# A5 s4 C; m
- PLA
, s0 h& v' T3 p - # E; s: d* y* W/ X9 Q% q' a
- RTI
% W) N0 M# j: ~% L4 _ - ; o8 G _$ a& E6 u1 a
- ;====================================================================== Z, }# k; `% I0 U2 g) l1 ]4 R A
- ;请求中断处理, u; B. R/ o4 |8 l
- Irq_Program
2 s: V, ^* G' a5 d* U6 q - RTI+ s5 I, c! a/ r) o9 J
- # ~0 K2 l: L0 X9 b5 i0 M. Q
- ;======================================================================( u/ C; W7 p' n9 u
- ;中断向量表& B% v& m& j1 o% ? s
- .ORG $FFFA
4 } ~ B! w* o5 r" E. q# p. H - .DW Nmi_Program ;NMI触发时执行- C, ?1 n7 t) N( c" }3 U
- .DW Reset_Program ;载入ROM时最先执行7 ^: X8 x. M4 U$ k6 P4 Q% Y* G
- .DW Irq_Program ;IRQ触发时执行
0 x, P. `1 e$ d: ^" U* d! U
复制代码
# Y" Y- J9 H4 d
|7 r$ u+ M: @( c3 i2 q
6 q6 V' [* Y% x X( s6 |) @ ^https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|