|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下 S; V4 D$ C/ E6 {& ]+ v, M

* @2 P2 f7 ~9 e, e) n以下是主框架代码:. j9 N2 _$ f( ~7 d7 T2 q$ [/ G
- ;======================================================================
+ `" r2 x: W6 d - ;文件头' K( m) K9 y$ m7 a& ~ @
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
5 g: V( W6 E& P% Q( M8 s5 A; U - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. x& Y& B: A) p7 X6 m - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码. d/ [7 Q; ^. f
- ;====================================================================== R& D+ v. y" A! y$ [
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2( k4 c$ W& q9 }
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1; _! m5 Q6 {3 E8 Y# x
- ;======================================================================0 l4 o. \6 d5 H7 T3 s
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
0 s8 c% z4 v d" L! \! A! i. `- ` - RESET_ADDR = $E000 ;主程序起始地址1 t* t$ M7 `2 [* C; [& y
- ;======================================================================
$ u& \* y7 U7 w' y( G. I, p - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
0 X- O9 S2 N& { o% d - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
+ \" m8 ?. z8 A0 Z: G - .INESMAP 4 ;Mapper号 (0-4095). M* D+ r8 v7 G. q
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 [' ~+ M1 [! Q* }) \
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)% v8 D! Q* e" J/ E& g
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ e! [& G$ w4 T. a' e/ n
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)* T1 F+ m" f" |4 i, b0 w
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数). H- y! V7 K% `7 W+ s6 K- B* a
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)5 Q/ D6 L$ D, \4 D$ Q) c5 s
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
% }# x1 Q! G! E* N; F+ A; u I! f. p - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) t6 a( M6 `1 U
- ;======================================================================8 A/ C' f% }/ F6 B
- .INCLUDE "fc_demo_config.asm" ;全局配置
- ^: |3 Q& d" s2 t' E' l- a" z - .INCLUDE "fc_demo_constant.asm" ;NES常量
8 a" u( r8 {, r; O+ T' B - ;====================================================================== a; A6 H* N% h' u+ Q
- ;音乐配置
& C# L1 F6 d, s8 t" G6 T9 M - .IF 0 = MUSIC_THEME 9 ~$ ?0 Z) z# i! `& R3 |: }7 c' m
- .INCLUDE "data/music/Gremlin 2/config.asm"
2 J; X+ ]2 k! I k/ C7 j - .ENDIF' M2 L5 o$ c! x, Q3 F
- 5 [4 Q: y) Y z
- .IF 1 = MUSIC_THEME1 ]6 r8 w: @- W. U }/ y. N
- .INCLUDE "data/music/Raf World/config.asm"
9 R& }0 ~7 ]. Q7 G) p" N - .ENDIF
3 q/ u B/ w Q7 y# V% K% F1 d b - ; |* X [1 x* B2 ?4 F
- .IF 2 = MUSIC_THEME
( e) v0 @- ~3 v. J0 y - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
9 \+ N: _& q! h7 ~ - .ENDIF
6 i8 w% d- M$ h& x/ y2 W6 o& _4 X R - , G0 J' p, @2 A& P; N) j/ ~5 A2 {
- ;======================================================================
8 v# r& k9 E i - ;引用CHR图像数据
; T+ _' v+ }2 \1 x8 y# W0 d5 X1 X - .BANK NES_16KB_PRG_SIZE * 2
& J* ?2 I4 T# N - .ORG $0000# e& W6 [) j1 N# U& h! R3 I3 B
- .INCBIN "data/bkg.chr"
# d3 G2 c0 r# X - .INCBIN "data/sp.chr"
0 _/ h; ?5 X$ z. b -
7 D/ f" |/ n0 L. D9 ^1 y. s - ;======================================================================
$ X6 l7 z7 K: D: C C - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ X, S' X( N; D; t. j { e2 N# A - .ORG RESET_ADDR
! \) s+ x. u9 c: M# Z8 Q& H2 C' v, T+ K K - ;======================================================================7 _$ i( {8 C% S2 Y) e
- ;引用其他源文件
8 B: z" J+ s( ? - .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 {) i& B5 ], I
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
. q! r: j' O! ]* ^1 G - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理& l: T8 y& N' u/ Q% l! u1 P6 e
- ;======================================================================# Y5 C+ ~ i" E0 Y' z; g! A u
, S# F9 L& T9 o0 P$ t e( j- ;======================================================================
, |7 g7 y' Z; C - ;等待VBlank到来
! }; l( \, x1 I* w* X6 k# Q& a - Wait_For_VBlank& Z" R4 Z0 B1 C& N- Z2 |
- LDA PPU_STATUS
' a- ?* k" Z* h& M; k) P - BPL Wait_For_VBlank
9 r) H2 f7 f" k/ [8 f* ^ - RTS& V* }) v4 S4 G- R$ {2 V! _# E
- & X4 w; \1 ~" F, r; M
- ;======================================================================/ _1 w: F, w' J' v+ I$ t8 H- U
- ;调色板初始化* d3 y7 D5 n% m E
- Palette_Init
) l, ~5 g, D% B7 d+ a, N4 n - LDA #$3F
+ n6 M& k" o! N* l9 F: g - STA PPU_ADDRESS! U; O9 k$ i+ A( s
- LDA #$00
8 t5 f$ ~7 z% o. j& N4 v3 C n - STA PPU_ADDRESS
6 ?5 C3 R) Z1 @) A - LDX #$000 w* p" b l7 [& H# U
- LDY #$20
) B7 u6 Z* W3 z$ y* u - .Write_Data- [8 t2 w& N/ z5 b# B) _ f
- LDA Palette_Data,X
0 q& B/ t7 ]7 Q* W7 b6 _ - STA FC_PPU_Pal_Addr,X- K7 D- N- \% u
- INX7 o! \* H3 \! p8 w6 y
- DEY
* s( y# V; ~$ p: t: Q - BNE .Write_Data* I% t) ]" r# E/ s4 w& _+ I9 U5 ^
- .End! e3 L5 d9 C- J
- RTS
c) v8 E0 T' J" X8 a& R% I/ c - 9 }5 \% {3 b$ _# N6 S, D
- ;----------------------------------------
- H E5 p# w8 }: q) L - ;调色板数据3 D. _) M/ A/ f) c9 p6 N( i
- Palette_Data
! U t1 Q' d3 M8 o8 Z3 v8 ]9 J5 c - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) U' |& o" E8 C4 V2 g# |4 d - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
# I6 C, X1 f3 X' L$ H, f: W6 ~% N -
8 D+ R# t" {6 \8 q6 [+ d+ N - ;======================================================================; a1 S6 a s% G
- ;命名表清空
: d' C3 i1 x( w1 W+ L - Nametable_Clear
% o: K' c" Y; b# O - LDA #$20- D* S! G7 u4 o: _( ]
- STA PPU_ADDRESS
- m0 L) n. i2 ]2 A - LDA #$007 y: d; h' J. c- h7 n
- STA PPU_ADDRESS
4 D5 d7 f6 ? j& _ - LDA #$006 T7 H1 H. I4 D. J% ~0 y
- LDX #$006 b3 ^2 O0 x3 T- D
- LDY #$08
% s3 T' R6 ~) {/ u - .Write_Data
( o k# Y1 j( m5 d; S - STA PPU_DATA
, R* G4 _7 ]( g7 ^3 L/ X - INX
; {6 D* Z l" N C) H - BNE .Write_Data
$ a7 E/ r) B$ U8 X$ Y4 d - DEY
2 p7 o* G [! v$ q" a0 g) x& g - BNE .Write_Data! N/ ]1 \0 J+ Y; i) p0 _* @
- .End
; l, l. J$ ^5 m$ a" y1 c, k0 } - RTS# C/ ^' n: a1 [! s
- $ t. s/ \/ I8 _& c, ]9 B
- ;====================================================================== Q$ I8 D5 n+ N- I! \3 l" k
- ;音乐曲目切换
. B: f; G& C& \; Z - Music_Select_Process
, Z3 p# a, o" m' A& V$ t
' S& D# V5 D% h. V, Z! r& m" S- .Pre_Music;上一曲
, w# T+ e; w d8 z" o - LDA FC_Gamepad_Once( D/ O# G+ Q( v2 D$ F# i
- CMP #JOY_KEY_LEFT
! |% c* A+ v# }$ | k# X - BNE .Next_Music
, c+ J" ^8 i* O( [7 K - JSR Music_Play_Pre
" Y# b3 k( k: w0 h - .Next_Music;下一曲0 f/ J6 [" ~- r
- LDA FC_Gamepad_Once
8 g/ T; |' z: `8 @' V/ M" e - CMP #JOY_KEY_RIGHT
! L( U* {+ u+ J6 {- |5 W - BNE .Next_10_Music* c+ \# `. J( o/ U7 {7 E [
- JSR Music_Play_Next5 l4 a3 G4 u6 J
- .Next_10_Music;上10曲6 s; b+ U% k5 a7 g. C. B
- LDA FC_Gamepad_Once
* e; C9 Z( ~# I: j - CMP #JOY_KEY_UP
) @ A$ e! d4 r" z" d/ j - BNE .Pre_10_Music f! ?* q' f6 K! m6 n
- JSR Music_Play_Next_107 E1 f. I- c6 ]$ I8 F' s8 m Q
- .Pre_10_Music;下10曲5 ~- D/ c% J J+ S$ A5 V0 h
- LDA FC_Gamepad_Once* {" |+ \6 d; Y* |& [% U
- CMP #JOY_KEY_DOWN
: s; Q( O2 T- ^) c6 k7 z1 l9 _/ p - BNE .Reset
- R6 b. M& c5 D4 `7 p0 \ - JSR Music_Play_Pre_10
+ Q( h( }, X' \* Q* O - .Reset;重播当前曲目
/ J/ k' Q( U1 S D! z6 l - LDA FC_Gamepad_Once
' @# p- Q" r3 q& X; k9 x# Y - CMP #JOY_KEY_START
* |: Z! J s R3 H/ ^6 \1 a7 G; ^ - BNE .End
' R" u2 w% ^ g' d& A- x T - LDA FC_Music_Index4 [: x/ T0 L p, w. @# E
- JSR Music_Init_Process" [) \/ V5 l9 E: t# |
- .End
! k( _2 [8 O5 \: Q9 m0 v+ D8 C' z - RTS
( n) p0 ^2 i) _& s7 q - 2 i/ a4 C1 E6 N% a% J/ u
- ;----------------------------------------------------------------------0 B/ H7 U. I! g: @" W2 {. C/ j- \, Z: o
- ;播放上一曲9 R1 ^6 u9 N( F6 H
- Music_Play_Pre
+ [& C2 Z0 ~) Q- D, p - LDA FC_Music_Index
; K; e' v, @5 l( H( S5 I/ L9 M& B/ ~ - BEQ .End
% U3 N$ F1 f c8 F - DEC FC_Music_Index
; N; [, t/ n; F, B - LDA FC_Music_Index" b* V7 |+ ^& e" |
- JSR Music_Init_Process0 D1 U" G' E2 K3 \4 I0 n, I
- .End
4 H; O0 [# |* I' a - RTS: w" W8 J' f$ [, {2 h; X2 M
- ;----------------------------------------------------------------------
& N# d0 w g3 c6 x S - ;播放下一曲
' N" @ F& z6 m( O - Music_Play_Next
0 h( g. t6 g f+ h) }! m - LDA FC_Music_Index) |2 w) X( H9 v0 Y( m) D# i" G
- CMP FC_Music_Max_Index
V0 _, F. P/ U4 y - BCS .End3 m; Z4 W) n7 P4 e) f. J& T
- INC FC_Music_Index
* o* j0 k5 h. L! D) k - LDA FC_Music_Index
7 k0 t& J- w" z - JSR Music_Init_Process5 M g S4 I7 [: k7 W1 [* }4 D
- .End* p; X0 q4 }# k9 b, v
- RTS
# y/ S! R2 p0 y) [
- q* C! x M; [' o1 K- ;----------------------------------------------------------------------3 l, G4 @" F+ @9 t. p) u
- ;播放上10曲. p! i$ t/ k1 [4 y
- Music_Play_Pre_10* Q( ^. C# ?0 U; ^) q- o
- LDA FC_Music_Index
0 ]8 b4 a1 P1 Q1 O- e+ B - BEQ .End2 f+ Z2 ]& ?; F. Q4 N. c
- SEC) R8 R6 O+ q4 f! e; q2 [$ o
- SBC #10( H& m e' O% { W7 C
- BCS .Pre_101 R; f' J* A! I( e
- LDA #$00
5 A6 v+ }2 C' I% k% T5 j9 F - .Pre_10
# w' y s/ v8 Z- c; ]; ` - STA FC_Music_Index3 \7 P" s& T2 o. R. n9 G
- JSR Music_Init_Process+ O. L8 z- h% C1 J2 v+ z
- .End: v$ P" ]# ~: v8 q- x& V
- RTS; \# Z" B6 B/ T- {6 o# g
- ;----------------------------------------------------------------------; K8 P/ \: m6 M8 @) A# _2 O
- ;播放下10曲: F5 Z7 S J5 K8 f' W
- Music_Play_Next_10
& y: ]0 Z% k1 q - LDA FC_Music_Index
& {3 t8 t+ E. c" ^ - CMP FC_Music_Max_Index
. K! E7 r4 F# E% E - BCS .End0 `$ D. ~* n6 i
- CLC
, @+ h; f" k0 ` - ADC #101 h# d7 Z: P( H/ p' A
- CMP FC_Music_Max_Index
* I$ R; t" e! J; A - BCC .Next_10
3 e7 H1 d: g' M; r% Y1 b - LDA FC_Music_Max_Index+ N( i" k. b9 v' u' C" \1 \% h
- .Next_105 P& ~1 A9 g: J/ @" H. P
- STA FC_Music_Index f, c. J# ~$ v0 R' _3 s2 h9 s
- JSR Music_Init_Process
; j* S: `- K. ]4 W - .End0 G: E6 |# d% T/ l. ~+ D
- RTS& O0 l0 @- K9 w1 i0 L" Z
- O, F" N, }: @: G. @) \- ;----------------------------------------------------------------------3 F. }: g M2 @, Z( \
- ;8位十六进制转3位十进制制
2 j2 M- R' ]+ r! u$ m6 V/ y+ ~ - Hex8ToDec
+ q/ \" ^ d* G! z6 L) h, V - STA FC_Dec_Data_1* [, W7 n$ E# F
- LDA #$00
1 Q9 y. O' B: e5 Z: T4 [ E& e# p - STA FC_Dec_Data_100
5 N, m$ ~. @3 U& _ - STA FC_Dec_Data_10, A+ {/ n; a9 U* h
- LDA FC_Dec_Data_1
; f6 L/ O! H3 K9 i* C1 [ - .Convert_100
7 k1 Z* a# A9 l' N - CMP #100
& D/ J" b! u0 `+ O, l! ^, J& X2 | - BCC .Convert_10- {. k1 r8 H5 ^9 M1 e' H
- SEC4 D( c& k: v9 m7 K6 X
- SBC #100
y- A7 h; L9 Q, Y$ k% {5 { - INC FC_Dec_Data_100- R' b4 k) w7 j# i$ H) s
- BNE .Convert_1004 D4 ~0 ~" c7 j* F% ]2 V
- .Convert_10
) ?/ M! M% e! h& e3 n; D0 \ - CMP #10 G2 `+ |; y( L% D1 v) y
- BCC .End5 K( [( D# N4 w; F1 K
- SEC
# [1 K5 t- b* l9 k1 | - SBC #10( V v7 w8 I' g
- INC FC_Dec_Data_10- ~1 t0 M6 ?5 H
- BNE .Convert_10
. ]. M7 g' ~# a# ?# F - .End
- C- J3 `0 ]9 }( H% C; t - STA FC_Dec_Data_1 K5 I& t; y6 a. {+ F; @- k8 H
- RTS
+ }* B R/ j8 Y6 P - p5 R2 `; \, ~7 m5 U
- ;----------------------------------------------------------------------
4 H/ H( [, j4 B - ;显示曲目信息0 K+ ]' B* E- g$ G0 P
- Music_Info_Display
% x: z: z n, A8 w5 R - LDX FC_PPU_Buf_Count- O7 e7 C3 ~# k) y" L
- LDA #PPU_WRITE_MODE_CNT_LINE
1 y! h" D4 \' ?1 E - STA Use_PPU_Buffer,X
- }$ Q* f- `, C/ T- ? - INX9 D) ?8 n1 s2 f' ]
- : l6 d |4 B. i0 H" q* ?
- LDA #>MUSIC_INFO_POS
% A* p! u1 `7 z" T9 e1 o - STA Use_PPU_Buffer,X$ w1 _# Y, q e z! z0 I6 i) ]
- INX3 M C' o- h0 B8 E5 }# M9 I& W
- % j0 _/ X% a) v( q' D
- ;居中
/ k9 e5 q" P o/ \3 W - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
. b1 r1 g! L0 X - STA Use_PPU_Buffer,X3 R3 ~) _/ K; I% C o: X+ p
- INX
# W M& V8 p G/ \$ ~! r0 S -
: e0 Y: Z* h. b, c - LDA #$058 I* E7 N9 `" {/ P0 u
- STA Use_PPU_Buffer,X5 s& w6 n8 Z G; ?
- INX
/ F7 D, v5 M0 W( ~0 K& g( w -
2 b# F7 K6 v {, z2 x3 E: H - LDA FC_Music_Index3 B1 |% j& ~& q9 v" g9 Y. r
- CLC$ I/ ~; D" }* e+ |" U( `! V9 D
- ADC #$01; p$ Y' E! R( W
- JSR Hex8ToDec
4 Z0 y7 p( v( |0 E6 j5 O - & o' [1 }' ?, V- |( W, D6 z7 m
- LDA FC_Dec_Data_10
, e- ], V3 A/ E0 L" i2 r - CLC: n) w* x; r$ d' C5 g! p
- ADC #'0'( G( F+ F0 B. B4 m& s
- STA Use_PPU_Buffer,X0 W" {( W" s# X- h' p% g
- INX
: N. j6 v8 [4 r, a2 V; @" r - ' ?* t) r6 N, D1 I- r
- LDA FC_Dec_Data_19 l8 {6 K7 `5 [3 I1 J' F9 i" Y! D
- CLC
: i* `( Z$ Y$ k V - ADC #'0'
/ u% O7 c6 C0 H- ~. ~: x/ A - STA Use_PPU_Buffer,X$ X/ t E# w; k1 ]0 w
- INX# w2 Y5 E7 G: F( m, H# h( j
- * r3 U( K8 S3 K; G1 n( G$ J7 d
- LDA #'/'
1 m9 [8 [- o2 o- @3 S - STA Use_PPU_Buffer,X
# J3 |. `- y9 f3 D; r% V" Y - INX
! n. ^9 {! ^$ j! j& F; A -
4 C' y+ I7 K- u& s+ d - LDA FC_Music_Max_Index
5 Q( W8 w1 i$ v - CLC
3 _! M9 A6 _8 X5 x, K - ADC #$01, K8 T* r( e5 ]0 [0 |+ n, M
- JSR Hex8ToDec: T/ v* c6 k* O% y& a) x: q$ m
-
" `5 ~$ u. F; {4 d: T - LDA FC_Dec_Data_10
) }7 g' p$ {8 a/ d% u% _ - CLC7 J2 Y# M# Y e G2 k, {# E
- ADC #'0', ^1 q2 S/ S6 L2 s, y& n
- STA Use_PPU_Buffer,X3 h6 S! S6 R/ B7 ]9 N( @
- INX7 b6 a; o; q r/ W5 i$ c% a
-
. @# G5 l; F2 O - LDA FC_Dec_Data_1
9 p( U C* k m Z* J6 ` - CLC, a% W, B: U, j5 c
- ADC #'0'% P! b: e( {' Y7 Z
- STA Use_PPU_Buffer,X1 E6 {( Q/ N4 U) Z8 k _* q% o0 x
- INX
0 g9 W# V; y2 C. P5 `3 u# u -
5 d( J: ?& [8 y1 u8 E7 X" ] - .End. U9 `/ w* U3 b7 U
- STX FC_PPU_Buf_Count
' T, D" w0 k% ` - RTS8 P/ Z/ R5 V, M1 l/ j! ^& ~- ~( V6 N
! L* K5 q5 o! `0 \( A$ R- ;----------------------------------------------------------------------
8 F$ e5 e- e) M7 N5 h - ;音乐曲目初始化处理
3 h( h' }1 a. a b - Music_Init_Process
( ?: \) \# n% T$ p9 d+ a0 u - PHA
# ~$ Y8 W, o) E4 F; {4 d8 \+ Q0 S) b) Z - JSR Music_Clear_Process O' R# C8 q- j' Q# w4 h. O
- LDA #$1F4 f( Q9 R6 P1 R. y1 N z/ f
- STA $4015
7 D1 e+ P ~2 z4 n - PLA/ I' _8 M. t( t! K
- JSR Music_Init_Addr
R) j& q1 m* G - JSR Music_Info_Display* O6 B+ @5 ?, o' K, v
- RTS
6 m) e; B2 K/ E- W7 @
# j% I- f1 k! X8 v G1 a8 w- ;----------------------------------------------------------------------
: d+ |9 j) q; I- \. @' z ^ - ;音乐播放处理0 w7 x2 G/ h5 n% r, S- l% H" N
- Music_Play_Process
4 y( }8 I' p$ v - JSR Music_Play_Addr
- W* m% s" E( g. W) F4 y' z: d - RTS
* n9 r) b& B8 J4 b
0 ^! H6 J: _; f- ;----------------------------------------------------------------------' U) b6 F/ Q5 E+ {' i% P" @* e
- ;音乐播放处理
% ?( T2 }" @' w( F& C - Music_Clear_Process6 L! M, j; T2 F6 w
- .IF Music_Clear_Addr; T3 b$ S( q' Q+ M8 Q& h# [) S: [
- JSR Music_Clear_Addr! i' r; d$ A) T- N6 h
- RTS$ I# U+ t7 q4 U; F: l9 M& r6 A, V% n
- .ELSE& `4 m, L" R0 F. j" W+ _
- LDA #$1F$ [- g9 Y8 E: @4 ^, {; X
- STA $4015. M7 g9 \* A" @( ~ x( D
- LDA #$00
) @% `; q0 i% v, \ - STA $40107 h) c7 p! [" D& W- F) i8 c
- LDX #$00
/ p* v" F8 l7 G& F* t+ x - LDA #$00
1 ?2 a3 d9 M# ^2 x0 u9 L8 R3 s -
3 M: R P2 ?3 N! a - .Music_Clear_Zreo_Page_05 _/ k( H1 P, P% M/ V7 P# K
- STA $00,X# o/ ^% Q4 x% Y$ K0 V
- INX. ]* D2 a" ], U0 V9 A
- CPX #Use_Zero_Page_Begin
6 D+ ?: g. D# K9 P# e) V4 C: r: j# z - BCC .Music_Clear_Zreo_Page_0$ ]3 [# M' `; g
-
# x/ T& R& ~' v - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
- {, H8 M- V% I8 x' k - .Music_Clear_Zreo_Page_15 q# x9 }" h7 M0 u, Z% L
- STA $00,X. M5 u3 @ t7 { _ Q5 a/ M. ~" |
- INX
+ U2 h5 F9 d/ { - BNE .Music_Clear_Zreo_Page_1- K \) @, P6 ]4 @4 M
-
2 a2 h* C" ]6 f* j# {* h: V! C g2 s: h - Music_Clear_Process_1- M8 h3 Q, }2 p5 }8 Z
- STA $0600,X* R3 V+ y ^$ }4 _) M
- STA $0700,X7 h+ z" ^" _, K5 ]2 X1 I( a
- INX. f. [% B, P5 b/ Z- R2 _; O
- BNE Music_Clear_Process_1" O9 ^# m" M* [/ T: p5 L
- LDA #$10# u# {6 ^! s! I
- STA $4000
2 {5 K9 u ]7 M& p* x# I- V" M) u - STA $4004$ a$ x, g W/ N. E9 [$ X# Z% D7 @# x
- STA $400C+ b$ B( ^+ U5 L) M3 f; |+ q
- LDA #$003 j+ @7 ]: m" d% k
- STA $4008# v) h9 q9 T1 n+ z; g
- LDA #$0F
8 y6 K* v1 B5 w R$ L - STA $4015
: F8 z* B$ z! `0 D6 T - .ENDIF
3 H( o! s3 L9 M; t -
; x# q1 D+ c; Q$ J f' T; W - RTS$ v% Y% `, J, Y) B# f
- + r+ [4 H9 t p h
- ;======================================================================* }- z& P1 t5 c0 _7 `/ B9 v
- ;重启处理
1 w- `( P, p7 o+ l4 I2 C - Reset_Program
, j G2 q* g7 f& n5 D - SEI% Q- Q, F& H9 ~' z
- CLD
, L4 U( k! U; y, v* s) X - LDA #$00
: f! D; e& o; V) r" Z* l - STA PPU_CTRL+ V! J" b1 J9 t' Y
- STA PPU_MASK2 t* P, U7 ~2 i( H- U
- STA JOY2_FRAME
: F/ R5 f4 ^" E; a4 U2 v - STA APU_STATUS. d6 i# `1 O* r8 J5 Q0 h: e
-
+ D* H* \, s7 G9 u! t - ;等待屏幕准备完毕
j9 ~2 f2 T6 o f ]6 |* Z+ g' S - LDX #$02& i+ f+ P# q% A% g
- .Wait_For_Screen_Ready
6 y6 A3 K* H1 Z - LDA PPU_STATUS
1 O# A, R& g- b1 C" E2 Y6 D - BPL .Wait_For_Screen_Ready
" `, g4 G* C4 m - DEX/ ~# W! F8 d2 d' V5 i% F X
- BNE .Wait_For_Screen_Ready
, P1 x0 R5 D7 H! R& t6 @9 d -
, g f5 I' u9 {, q$ l# N. V - ;清空调色板1 ]. {" B/ \. [9 r: [1 M/ v
- Palette_Clear# |6 V) U' w7 ?+ Q) z! G
- LDA #$3F
+ D( L- u+ L( [& J' x - STA PPU_ADDRESS' A$ e; v% N) j5 F
- LDA #$00
a; }1 p: | M$ j. c1 U/ u - STA PPU_ADDRESS3 m) F9 d/ t f/ q9 r
- LDX #$20
" v( ]' o! S2 d, s0 q j* @ - LDA #$0F
4 `2 b3 |+ Z3 z4 Q. I! L- Z. l - .Write_Data
0 g6 {7 k' W5 h: e - STA PPU_DATA! l% N8 _$ p9 F y- r
- DEX
5 n6 q: C/ w0 y- ]7 d# ~0 z - BNE .Write_Data
1 A9 F& \ A! _4 z% ^1 f
& X1 K0 `4 {6 M5 P1 D0 C/ p- ;清除声音 $4000-4013
, M2 Z' D% k8 w# L - LDY #$14
8 c4 n5 }4 J& E( |2 F - LDX #$00) A" d' ?8 C- y0 |3 C
- .Sound_Clear
2 i$ ^3 q& L6 V1 P7 P7 j4 [ - STA $4000,X
! G* D" q+ @* W- i' `+ j- h- T - INX
- Z+ Y7 k5 h3 h+ R4 e$ ^! V$ T! z8 } - DEY
2 l1 P' m6 f9 W/ g a4 {; z* d - BNE .Sound_Clear
. @- I) k8 Z0 z4 }" y8 Q9 | - 8 N% [- z% A0 b: p+ P3 |+ D) S
- ;清除 RAM $0000-07FF0 J2 z+ L3 f" |1 X
- LDA #$002 F3 g w7 q: A& ^0 L( \4 Z
- STA $00" X, G, V) _: Z- L, H4 O }- s
- STA $01
3 S2 `* E, H9 C' W1 h! J7 M! k - TAY2 j' |% q4 |6 G/ i- v- \9 i
- LDX #$08
: ^0 R5 q4 w$ Z* s4 { - .Memory_Clear/ w4 u; G) x8 _$ h
- STA [$00],Y
. \8 J5 |) a8 w+ z! w0 e6 Q - INY! x' X" M& ~# Z/ D7 E t0 W
- BNE .Memory_Clear
; F* Z' `' C4 }; M$ P) B - INC $01
c+ a+ Z4 I1 @8 k1 w - DEX
; U U4 H6 |+ j) a - BNE .Memory_Clear
3 k) i+ i! r* d; T! p v4 W9 j -
9 b* K; r& m/ x# f7 ~" ~* _ - ;精灵缓冲初始化" T$ A' q6 q5 f% q( F2 I
- LDX #$00' d- H5 j# Y1 [ J) \
- LDA #$F8
; e) s# I" ] s* O% t& F" F - .OAM_Clear5 } ^% a- C* }1 t F3 o6 ?9 ~
- STA OAM_DMA_Buffer,X
. S( T2 T$ I1 A2 N ` - INX
+ T7 G- }$ _$ {, D4 E - BNE .OAM_Clear
9 F9 _* Q7 I- p$ U0 `/ c -
1 }9 a' \" a- K1 {( m - ;栈指针初始化
* A8 |/ ~) a1 _# {5 R" h' v; u4 e - LDX #$FF
7 [& ^. W! l1 u Y- `% c: J - TXS# f0 F0 h: o6 D6 u% r _
-
9 p; `7 j$ i! s4 J! L# l2 U2 s$ j - JSR Nametable_Clear;命名表清空" A/ ^" m B# a+ E0 R& Z
- JSR Palette_Init;初始化调色板缓冲
# v; R) G3 _9 m3 n. k - JSR Static_Text_Init;初始化静态文本4 z' V' g( [5 M
- ( r! _/ |* Z5 b( r
- LDA #MUSIC_ITEM_TOTAL - 1
5 o( P: s3 i! C9 j" u - STA FC_Music_Max_Index6 K4 {3 b: c9 x" r3 s$ y2 w3 p) B
- 8 i1 A* p8 z8 x. F0 f$ b8 b# k6 o
- LDA #$1F+ o$ O% v1 Y' }
- STA APU_STATUS- Q8 N6 W1 O; B
- LDA #MUSIC_BGM - 1& ]9 M# d, J8 i8 e* i2 B; o( [+ U0 x& h
- STA FC_Music_Index
* i' x; K+ ? q: _. x# o. y, U - JSR Music_Init_Process;音乐播放+ |. ~' V/ s' U$ Q; ~
- 8 M* _! v9 e0 O3 ]& V: u: e0 m$ E
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" m( C' q# P% L6 v2 e% V8 } - LDA #$1E
: Y, z8 }! X% V+ B - STA FC_PPU_Mask_Buf
^6 G: r' X0 g Y' ]: ] - 3 W0 n$ b" E8 C4 V6 u& `
- ;启用NMI处理% s Z0 V# Q! J0 F3 F( j
- LDA #$80
! L( G- i9 B# J* J- B( c - STA PPU_CTRL1 V9 S3 v8 C/ g! ^) ~5 r
- - F8 Z" q) f" d9 ]8 d9 D8 o
- ;程序循环, 剩余工作交给 NMI 中断处理
' ?# x* ^! }3 z5 V3 V" q - .Loop
" G! Y, }' X1 [- m6 X - JMP .Loop4 I/ B% }+ i, a% v/ l
H1 _+ E& x3 D- ;======================================================================4 E9 x. v. q3 L7 I! b; O
- ;不可屏蔽中断处理: Z1 f) E1 G1 F& N1 c$ e6 j8 \! s
- Nmi_Program5 E1 n$ R' z8 T; |4 w, s4 ]
- PHA7 H) D5 w) X, `, Z
- TXA
) l8 A, n6 z; l - PHA
# @3 Q- r; b) K5 G - TYA
9 ?) ]; x9 x) v' t$ j - PHA% S6 K$ C/ M" Z/ T* ?" ?
-
( z- {% @/ h1 }" @3 ~ - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
$ c8 I0 _$ D& w1 s - 7 H7 J7 s1 p7 q1 P/ c+ M- J
- JSR FC_PPU_Procrss;PPU处理
. z3 s3 | d0 y0 M - 2 `! o% q# R6 m O" \
- ;精灵内存更新: J m# t/ Q. Y. D" u+ k" b
- LDA #$00
5 r# r h& | N3 g, A - STA PPU_OAM_ADDR
) y" x1 s7 c& {) A; l: B% Y& D - LDA #OAM_DMA_Buffer / $0100
5 f9 q1 F; `- v6 l" u - STA OAM_DMA
$ d3 A$ G3 {7 T7 i; s, K! }7 u - ) V, p! U- F2 O0 B$ j- w
- JSR FC_Gamepad_Process;手柄输入处理
0 }1 v+ @3 B& m- F. o5 Y" M b - JSR Music_Select_Process;音乐选曲处理
$ J" u$ w A. i( N: v - JSR Music_Play_Process;音乐播放处理
( ^& n6 {. S/ K, X6 t$ p -
/ }6 @, ? F% H; ^" U* o9 h8 l - PLA
1 e$ }6 c, s, p: { - TAY
1 W! D0 w. J( t& h& V0 w. C - PLA
Y5 {, B- c* o. {! G - TAX
: e8 c( t! k' v2 ^ h - PLA0 C( Z" |0 F8 F( \0 {
/ A: o6 ?7 b7 q! x5 H6 ^- RTI
' L8 h3 U- k7 j) T& g0 |5 Q - \% a, J3 B* e1 Q* t; U: N! W
- ;======================================================================7 h$ }- o ^/ X( O. K
- ;请求中断处理2 h' I( ?. ^5 e% r/ w" q' r
- Irq_Program
I' l: L4 G4 f8 B0 |; y - RTI: N( d+ T% J5 f% x" q4 W0 ^' T7 z
0 b- v$ X l5 `9 f! B" g- ;======================================================================
5 P7 g; ^: C8 y9 M! z( j. A - ;中断向量表
( z* n# @( b0 p - .ORG $FFFA
9 w+ t% R8 h* ?) h - .DW Nmi_Program ;NMI触发时执行8 p# ]0 N, V1 U( w/ ?) b
- .DW Reset_Program ;载入ROM时最先执行. J) P- j: H6 G( K' U
- .DW Irq_Program ;IRQ触发时执行/ F* t& r! C0 |% B* S
复制代码 7 A* K, h( ]" ]7 S4 `0 C! f
2 W7 z+ K. S; Z* R0 I5 N/ Y5 Y" n6 x& o9 e5 w8 {
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|