|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
0 s& S: v6 X# C; X3 j$ O
7 T/ F3 o7 a4 `. c6 V以下是主框架代码:
. Y- s! i1 w- O" d6 N+ z- s y- ;======================================================================$ a' {7 r& c' i% i7 n( E) Y0 o
- ;文件头' U+ d+ a% ?2 }( S$ E' R
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
$ r6 q8 t6 n5 [ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量% v1 e5 a1 i. ^6 X4 {
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
i1 b* h& }( Q1 F3 d7 o - ;======================================================================* v* Q$ i* `; y3 t
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
h( d% ^# {% ?7 w - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1+ [2 r$ b, e) e8 E* b1 W
- ;======================================================================
4 M- x! N1 Q2 H8 ^) f - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, `1 a% C& Y4 Z& s
- RESET_ADDR = $E000 ;主程序起始地址5 y- O3 K" f: o. u
- ;======================================================================
. i, z/ J2 \# l6 O7 E# K/ h) i7 k4 _ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB" K8 R4 t; x) [, _( n
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB0 N4 h5 O+ q8 A' g
- .INESMAP 4 ;Mapper号 (0-4095)) k/ w. K' L- |. v+ W( V3 I
- .INESSUBMAP 0 ;子Mapper号 (0-15)
" O3 r, d8 S0 O - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)! Y# Q8 W" Q! E- q
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
9 o; W0 t% [: G; E/ r! q( i5 A$ B - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' n4 R% E# B) S
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& u/ L5 w9 K( G- r& x4 d' W, l" M - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)- [ c' w) q1 |* F
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)& m# o3 _ L- G6 x4 w
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
* r9 Y# n* L* C2 U' v4 N# p - ;======================================================================2 S: O, t$ s* J0 S0 |1 ?% }
- .INCLUDE "fc_demo_config.asm" ;全局配置% R8 R% b x6 c7 o
- .INCLUDE "fc_demo_constant.asm" ;NES常量
0 v; o0 V) H9 O; ~ - ;======================================================================
V O/ L' C/ }0 c9 \% [ - ;音乐配置! h% j4 ^) R' d" X$ p; u
- .IF 0 = MUSIC_THEME
* O$ v& u! D( n# b- Y - .INCLUDE "data/music/Gremlin 2/config.asm"8 [ t( l( Z8 W7 c1 a% ?' f
- .ENDIF
" F( t& y3 \; d: v: C4 h; ^3 f8 } -
& g8 u& e3 L, {! V2 A - .IF 1 = MUSIC_THEME
5 Q$ m& X+ G! g( [/ c - .INCLUDE "data/music/Raf World/config.asm"
. b/ m; P3 @# p4 w/ S C - .ENDIF( u4 S8 R7 h; Z5 E
- 6 R3 \: k7 D) ?% L$ ^/ J& N9 B. D
- .IF 2 = MUSIC_THEME 6 _! s& D2 O! K( Z2 C, q
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
* a6 N) k* P; P( S - .ENDIF
6 m* @8 X, R: ^ - 4 ^3 V1 O! j' A N
- ;======================================================================
6 m: B+ C( b% s( g$ h% F4 _8 W- \/ z$ t - ;引用CHR图像数据3 F6 x" d3 m! ~2 m" N. g0 A
- .BANK NES_16KB_PRG_SIZE * 2
; W& v. g- G& P3 Z; p: ~ - .ORG $0000 j1 x' ]2 [. L% w; d/ |- f
- .INCBIN "data/bkg.chr"
- I) k; s1 p8 l0 ?( }7 t - .INCBIN "data/sp.chr"
4 L- u+ I8 F7 b2 D$ W - 7 X( [& c8 D M' Q' E
- ;======================================================================
8 F) J1 G1 F c - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
3 b0 N& U' R7 M: p, e9 y7 {' ~ - .ORG RESET_ADDR0 |- a5 U3 x# r, Y! g9 a8 `: M
- ;======================================================================
. ~, S! G5 A1 v6 f - ;引用其他源文件, i1 }" l9 n* [
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理 v" c4 k3 _ w/ A% \( @
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理& G% I+ H! T; h! O
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
3 M; o1 ]0 ~+ z' F, R8 X1 K - ;======================================================================
9 F8 v8 p8 I8 \( S( F7 q - $ F/ J4 O, ?6 T/ p
- ;====================================================================== Z) N$ x1 K: o/ B& `$ D/ Q; }" h
- ;等待VBlank到来
" X' `. H' Q' }3 _ - Wait_For_VBlank
# A, M2 d# U) | - LDA PPU_STATUS& b; H9 S. _6 p) [
- BPL Wait_For_VBlank
, j* T3 n4 G2 W) z- w - RTS. {( w+ B# x5 g+ r. a7 z% v4 D
- 0 Q3 P9 E" w- X. b5 i
- ;======================================================================
- J& Z5 u3 j( E/ R) q9 E$ [ - ;调色板初始化# Y: I3 g# [' O, h0 i% Q( F- o
- Palette_Init
: J/ v. E; n% e4 Q6 c7 | - LDA #$3F
' K( [6 r9 z+ g! }! g. @+ Y - STA PPU_ADDRESS, i6 F0 g: t. e' H; \, p1 @( i1 K
- LDA #$00+ P* V: G* O( t* E0 k* ^' i0 R. p, B
- STA PPU_ADDRESS1 u6 v- \9 i0 M/ m
- LDX #$00
) T3 \" p7 ~2 P( w; d' S& U* j - LDY #$20
5 c$ `# u+ Y v# d" v - .Write_Data
; M$ }0 F. S( ^2 H+ D$ R - LDA Palette_Data,X8 E* ] `& o. `
- STA FC_PPU_Pal_Addr,X
" _% W0 u5 a! Q& s! [- m - INX N6 w& B* O7 @8 @: m% e
- DEY
2 p, l1 C0 A+ {5 f# Q - BNE .Write_Data/ X" ~/ [. g. ~) \/ v ]
- .End0 Z# F h, d2 k- s4 L& H* b
- RTS0 c: r* g8 [2 R3 |0 F# E' A" _! W7 L
- 5 }. b( H/ G4 M2 G" N- n
- ;----------------------------------------/ ]! i0 L& h+ `& X1 r
- ;调色板数据
* h/ `0 ] g- b% g( F7 B - Palette_Data1 c8 Z8 y$ K8 u
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 ^1 ]% [0 j5 R1 S! i2 X - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22: N+ V1 y9 M. r% k4 P4 r
- ( E% R( @- Y9 ~1 t1 }8 j
- ;======================================================================
2 G2 N' m9 s- i, R3 R. F. ]8 E - ;命名表清空
$ j0 |( C8 I2 b; f. W8 V' J! z1 Q - Nametable_Clear
: [; Y+ c) w+ q* y) r& [1 o - LDA #$20
( a8 j# R+ C6 U: e: _ - STA PPU_ADDRESS5 v6 f: j0 i2 H7 N4 |8 [' r
- LDA #$00& \+ r! c- O2 J6 s+ `$ G. [
- STA PPU_ADDRESS. c$ W7 @' K$ w, b0 c E5 }. \) E
- LDA #$007 K! s( J, J4 ^0 q% z# `/ V/ f
- LDX #$00
$ L. a/ g& m( U2 | V - LDY #$08
. F& [) W' ~4 ?) C$ U9 j - .Write_Data/ a1 i. j( e9 ^- c0 G: O" o
- STA PPU_DATA
6 \$ J% ~' v1 ? R4 p$ o1 k# u6 P/ ? - INX
' t7 b7 q# U! q3 f9 K) n - BNE .Write_Data) Z8 q5 M/ h3 H) {2 J
- DEY
- h+ V. M+ Y: _ - BNE .Write_Data
+ i$ n8 _% d7 g. Y - .End2 y2 o, V$ T! v) f% e# R# d* T
- RTS. v b% C+ u. j M$ W1 @& K
- ; Q6 G5 C4 S/ U, j; J. k) y, N
- ;======================================================================7 F+ ?$ G* z0 K, c1 a% K
- ;音乐曲目切换
- O# @" e. L& K) o" i# M, C. | - Music_Select_Process
- F1 j; s1 o; r8 L3 s
; a! o. ]2 ^2 K$ K* b: J4 ^- .Pre_Music;上一曲; w K! l5 M) R3 g% d2 n
- LDA FC_Gamepad_Once
8 o0 P6 ~' f5 C6 M - CMP #JOY_KEY_LEFT+ P4 v4 z1 n! ^. ^. g% z# t
- BNE .Next_Music& n/ @1 G3 Y& \& G! P5 h/ O1 N
- JSR Music_Play_Pre7 i1 P2 K" n; j4 |% w! P
- .Next_Music;下一曲 r* X4 W0 q4 ]# M
- LDA FC_Gamepad_Once8 [7 I6 u1 {+ ]( ?( C0 O, e
- CMP #JOY_KEY_RIGHT
# Z; @! d D j8 b, j, ` - BNE .Next_10_Music& H, @' \1 N6 _% C/ j3 J
- JSR Music_Play_Next
q/ ?0 `5 E2 `8 L& G. S - .Next_10_Music;上10曲8 ]* p0 N) r& ]/ Q. P: {2 |
- LDA FC_Gamepad_Once6 `# u" J- ~! P) F9 ]" _
- CMP #JOY_KEY_UP
9 |# }& ~1 R: T" m5 C) C, D - BNE .Pre_10_Music
; ?' r8 j7 \. [/ n# i1 F - JSR Music_Play_Next_10
; ?# L2 U+ h. l9 C - .Pre_10_Music;下10曲
$ Y! G6 F# r. Q8 o( F# ^7 H - LDA FC_Gamepad_Once
& I; \7 e9 l! A' m5 K/ i7 ? - CMP #JOY_KEY_DOWN& |! g& d* c+ Q! \
- BNE .Reset
6 @5 U0 e1 v, T n4 {( ~- ^ - JSR Music_Play_Pre_10
. z% k' K m5 X9 m9 `: \ - .Reset;重播当前曲目
8 ^1 j2 k: C; v) b0 V1 o* ~ - LDA FC_Gamepad_Once
2 `9 Z* F% f( u: X: W- ` - CMP #JOY_KEY_START7 ^9 n% n5 t; h) I" d+ a' v
- BNE .End
4 C6 Y4 \5 ~" Q0 |' k - LDA FC_Music_Index
% a9 L6 Y) ` B) l - JSR Music_Init_Process e8 |7 I7 d$ z) c S
- .End
* R; i0 ? p" D - RTS2 N2 P7 U B4 ~' L( R; Y. Z
- 6 q$ F5 G- N6 Z
- ;----------------------------------------------------------------------
; F* s$ g) G7 R/ f! N* I0 f - ;播放上一曲) s' u$ Y; @5 w/ w9 U1 M% G
- Music_Play_Pre
: \/ ]- b0 \; g2 X3 y - LDA FC_Music_Index
1 B" y& ` \" n- y - BEQ .End
7 Q8 k: T6 a$ f$ |# s - DEC FC_Music_Index
% o1 y( q- o1 u, K2 m) O - LDA FC_Music_Index
, S; S' R) m8 p7 T! n% v - JSR Music_Init_Process# Z& w |7 b& f$ `* l
- .End& Z5 n5 @! i/ G+ S
- RTS
c) M% P# X2 S! v( l" ?2 T$ C - ;----------------------------------------------------------------------
9 j/ w" A' @9 ] - ;播放下一曲
, D7 V/ |2 `, ~) s: `0 K - Music_Play_Next# Q Z( j8 W) ?& |& g: `
- LDA FC_Music_Index6 R+ b9 B% ~% i1 P3 W$ ~. [' }5 F
- CMP FC_Music_Max_Index7 X x: w& E4 E$ Q0 \ [
- BCS .End
; D# D. L E8 T6 ` s - INC FC_Music_Index9 o% M Y- U$ Y3 I, T
- LDA FC_Music_Index5 S w2 p$ n' X& ?" X7 U* r
- JSR Music_Init_Process# o3 f/ d7 A. ^& h6 m" S# M
- .End
2 ]8 H1 ?/ j9 u" ]$ a- W) J - RTS( W9 x4 ?) n, e: h: G' ^
- . q' I# N- k/ E+ ^5 G
- ;----------------------------------------------------------------------
$ Z% i# x! l2 _* S7 ] - ;播放上10曲
: D" Z. A: D3 j8 S - Music_Play_Pre_10' `7 a3 r3 J, v5 z& u) z
- LDA FC_Music_Index9 ? y/ O+ _# l5 \0 S
- BEQ .End8 x [1 W/ ^9 d1 J
- SEC+ l& G" f% { M
- SBC #106 U6 J' J+ p/ H7 S
- BCS .Pre_108 q& I" i. S! _. A7 r! T6 o- g
- LDA #$002 t" s& r4 g7 o1 B
- .Pre_10
* F! f( T% y& c3 `( M7 i& p. F - STA FC_Music_Index
5 q/ g/ I* N9 `$ V" Q8 U - JSR Music_Init_Process6 k8 k% M0 P8 E8 m/ M) A% S
- .End$ b, _# W7 R. @/ ]8 l2 {5 E
- RTS
: s1 b: l+ i# `" z2 S* W - ;----------------------------------------------------------------------( H. e' E5 l1 T6 M1 Y& p
- ;播放下10曲1 y' S# a! `4 D- L% p
- Music_Play_Next_10
" S* J- K8 i5 O4 h! U a - LDA FC_Music_Index6 H9 @/ N4 W5 T/ Y4 n# X3 X
- CMP FC_Music_Max_Index
- T# G1 p. @* L7 C - BCS .End
2 ~$ |0 k9 b7 Z3 n/ j: x! X: t' j - CLC! i9 W* j/ j9 K+ a, |; }
- ADC #10- e4 }7 ^5 v0 E3 g: u. ~
- CMP FC_Music_Max_Index# | v8 T2 v) k0 l# N
- BCC .Next_10% t- |2 ` J7 @8 C; `, |/ D; c" [( \
- LDA FC_Music_Max_Index9 O- ]: f p/ F( q
- .Next_10# @6 u3 c% [5 f) T2 Z, c+ w0 e6 j" |: N
- STA FC_Music_Index7 M& x* t0 `/ t% ?# y# i/ t
- JSR Music_Init_Process
2 X' r5 J5 J7 m! S+ @/ W& l8 s- v4 R - .End$ h* t8 X, {* O F$ h1 k1 r% |
- RTS
/ V. @3 Z8 m' P
/ d5 g J* X9 s. w0 |: l& o) E: E- ;----------------------------------------------------------------------- I/ P7 k! x E, h5 Y. V
- ;8位十六进制转3位十进制制
7 S q1 y8 ~+ i1 p - Hex8ToDec: W- _+ h+ F) a$ [
- STA FC_Dec_Data_1
. [" ~3 V# ~( B, ~1 y: Y! W4 Y/ O; p - LDA #$00
) R' P2 S- O6 \# m0 f, d8 { - STA FC_Dec_Data_1003 g( J. w7 m7 E
- STA FC_Dec_Data_10
) S! d- G, X! U' v$ @- h4 X! u' a1 ] - LDA FC_Dec_Data_1( t" X8 w( E3 y+ m0 F' S
- .Convert_100
2 O [8 U& d: M2 x - CMP #100
" x6 z" G/ X, V. Q - BCC .Convert_106 e1 s0 H0 F( F
- SEC- F. U" F3 Q$ C4 d o' {# x& r
- SBC #100
' h& e9 |) h6 q' f) M9 k7 Z - INC FC_Dec_Data_100
% O; C0 @7 e' C+ D6 g: H - BNE .Convert_1000 S. e) u) s+ Z
- .Convert_10
' s$ r d& Y! l9 @* b3 R8 C - CMP #10' ` x6 N3 P' {4 i$ q0 m4 y1 J
- BCC .End
: ]9 ?; ~; H- j' ~% S1 c+ i - SEC
$ w4 Z1 M( G/ f9 G. h - SBC #10
9 F: D3 e6 @ q3 ?- a) q - INC FC_Dec_Data_10
) ~6 c: A' k! g' W9 ]# d | - BNE .Convert_105 H+ L: r$ |5 j
- .End2 a# W5 S. R$ e4 c* F* y' t
- STA FC_Dec_Data_1' p& _. {8 D. k- f0 n7 U. M
- RTS" o( V% C) B! R+ b) U1 n: V
- ! r. O( c3 Y* p* U2 d t
- ;----------------------------------------------------------------------* Y! G! o# g5 l3 h' _' w
- ;显示曲目信息
! r( f9 Q' X( [: {& y - Music_Info_Display
5 X/ e2 {8 O3 F2 x - LDX FC_PPU_Buf_Count
9 d- [. E5 r$ P; E* Q - LDA #PPU_WRITE_MODE_CNT_LINE( B- a' M( W! G8 q8 q3 W
- STA Use_PPU_Buffer,X4 T4 Q$ `, O7 L
- INX8 @( _' R* H4 b) b
- ; @5 n) [) I( l# N
- LDA #>MUSIC_INFO_POS
' U% K6 Z0 k" w( R! x! T0 _; r - STA Use_PPU_Buffer,X) g# K% `/ t0 U7 h/ K2 e0 i/ ?
- INX' w; K" v4 A; P* u
- ! V9 x* O" _+ e; C
- ;居中2 h" ?, E! w2 s) d( y
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 x; @$ T6 [1 O1 m
- STA Use_PPU_Buffer,X2 j) ~& t0 \* n7 P. g
- INX1 D+ c/ x7 P+ X! j- v
-
& F4 ]4 W2 j3 [! D( y - LDA #$05
, B2 r7 c" `& D q3 i6 f - STA Use_PPU_Buffer,X
$ _7 [2 a$ N, b& O. i( ^5 i, F6 C - INX
, A( r- q3 f$ B' p2 L6 w -
1 n3 w/ ~, w# |2 w% u - LDA FC_Music_Index: G7 W$ L- k. p1 @6 P: G# f( i3 p5 A
- CLC+ E0 N1 m0 \7 e/ I% E. k- t
- ADC #$01
" P/ e* J) |# b5 U0 V+ V - JSR Hex8ToDec4 V' _9 i& G. r6 v) F) d) V% ^
-
* U7 Y% Z; {1 z5 y; v - LDA FC_Dec_Data_10
, I( z5 ]& z7 W3 v- @ - CLC
, k6 V& w1 T: o; Q! F - ADC #'0') R2 s# n& F- m
- STA Use_PPU_Buffer,X
$ E) f! A" C8 k# n5 M% ^* s* V4 c - INX
; f" }! ]. X, I6 N f" ?+ J0 A - ) a/ T+ Z- p, r. E
- LDA FC_Dec_Data_1
9 F- J% K4 U9 c1 G) S - CLC
5 q: p& Y9 `/ @+ i4 X - ADC #'0'
- d0 }) d2 I1 `# ~) y! ]) v - STA Use_PPU_Buffer,X: c( G7 d+ e/ `; @' z' l
- INX. J W# O ]6 c, A; a/ [
- # {( \0 q8 A4 p6 ^+ H
- LDA #'/': k8 s! g( m4 P3 g; Q: U7 Y
- STA Use_PPU_Buffer,X& F3 L% x% d. S
- INX
1 z; D. T5 a N& S5 [0 W -
* r7 D9 Q/ a6 Z7 f4 q - LDA FC_Music_Max_Index5 I* [3 F0 `( D- W" |
- CLC
, T* o" T& [) C1 D% J - ADC #$01
7 t6 ^6 j: j' e) S) H5 @' k. S - JSR Hex8ToDec% K# c% o! q/ I+ f. o( p3 u/ v
- 1 f( z) P+ Z g8 V# G" H
- LDA FC_Dec_Data_10
0 Y) O6 D8 r) [ - CLC
' o8 Y* L% d' U - ADC #'0'
9 c- u: O( c% B; K+ s; n7 E: [ - STA Use_PPU_Buffer,X, k) u; H# t2 L- J$ C
- INX
' @: ^6 b8 @# Z ]$ q - + U2 c' O$ F9 s; ^2 E
- LDA FC_Dec_Data_1
7 n3 q* K) N1 i! k8 e# |) R - CLC9 [# z" \4 h! }
- ADC #'0'0 i+ d. S9 c; f
- STA Use_PPU_Buffer,X
5 s( J" ` {% i - INX
4 E& p* b2 [ m1 \ - " l2 f2 S! E' k8 |( [& v I# E
- .End* A. _+ G+ s8 F, I* K d
- STX FC_PPU_Buf_Count
3 b! r: q, D0 U1 b: q/ o i - RTS7 G' b9 L+ j: e( t7 H
; @9 {4 J' F2 q7 I( `- ;----------------------------------------------------------------------4 X7 L: Y5 j+ M, X
- ;音乐曲目初始化处理* [3 X5 y! Z5 Y k6 X2 r V; ] d
- Music_Init_Process3 O2 Y3 a/ y# `% |$ h! r
- PHA* p; C+ n7 r" P
- JSR Music_Clear_Process5 u( {+ R& ~, P% } B' d
- LDA #$1F$ Q3 W7 @8 o# y. T# o0 q: f
- STA $4015
9 O7 I5 n/ P4 Y- w3 x - PLA
$ q+ K, s/ `$ k9 a2 M$ \" I! l' x1 u - JSR Music_Init_Addr
1 N' }+ M9 J* P. l5 g6 T - JSR Music_Info_Display# R* v6 l$ v* O! k
- RTS
" _! C) H" N: ?5 m' H# q - 5 T: V/ D+ K$ H3 z2 G7 i
- ;----------------------------------------------------------------------
* C9 k0 ?5 I; i/ c - ;音乐播放处理
0 s/ A, N" H- \& ]4 w - Music_Play_Process
* h2 `% I/ L: U% d# F- b% c - JSR Music_Play_Addr; r: E/ {( o& c3 D! O m* n
- RTS
; F" |3 Q- Y1 l' X - - b9 Z# {, G, N0 L) `( V5 L: \
- ;----------------------------------------------------------------------
; a& I! |" A+ v( _9 h - ;音乐播放处理
& Q; z+ Y% H1 _/ W/ t - Music_Clear_Process* m& Q; |( X' D3 v
- .IF Music_Clear_Addr
" k( T9 ^. J `' _: ^% W - JSR Music_Clear_Addr
) v9 v+ A/ ]/ l - RTS! j$ I3 j- X$ R+ d1 f9 {
- .ELSE9 h0 _5 m, \6 [# k0 I( U& O! }
- LDA #$1F) c" ~# f+ s* N' H Q7 E
- STA $4015
/ T8 J3 {5 ]% x - LDA #$00. @+ [ [- Z% G7 L
- STA $4010- h$ S& M. B4 a
- LDX #$00
; Z. _) X* w' A9 _0 G6 F - LDA #$00
8 ^+ Y8 l7 u% D4 p6 V -
0 \% G, \& ] {' R% |1 Z - .Music_Clear_Zreo_Page_0; ]* n( F& j7 j, Z1 ]
- STA $00,X
& @6 F$ u4 Q8 p2 `2 _+ k8 w* I - INX
1 H' A. f$ U1 a. L& U3 j - CPX #Use_Zero_Page_Begin
: _3 B4 q% e( ^4 l1 W& | - BCC .Music_Clear_Zreo_Page_0/ x2 u; r9 {4 e3 w: t
-
7 q6 |/ Y( T; j3 J0 E) ~1 o - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
2 v* I& J2 ^& S, {8 \0 P& V - .Music_Clear_Zreo_Page_1
5 Z3 _2 Z8 X$ F: |: ` - STA $00,X7 N8 a) J7 L# }& v, j) f
- INX9 L4 N" U' x* Z, G
- BNE .Music_Clear_Zreo_Page_1
, d8 B" S9 r7 B. l -
5 A1 X% p* P: q# _2 ` - Music_Clear_Process_1
& q1 |7 v$ f+ J! z @1 d - STA $0600,X9 O9 T& E7 H s" n' \
- STA $0700,X
4 u; C# @: N8 B3 \) B8 j - INX L9 H& p7 z! T; t9 D" c, N* H2 s
- BNE Music_Clear_Process_14 |* [! o5 O* m( Y" G% U1 R4 a
- LDA #$10
4 u- K* \) z: d# X" Y - STA $4000% Q4 j* T2 x2 F7 F2 C, g
- STA $4004
2 X4 D: A- l+ ~+ t& { - STA $400C
( G! u- U# E4 S2 ? - LDA #$00
2 F, z/ Q0 G% u# Z2 i# ` - STA $4008
( [; q7 P9 n M/ w - LDA #$0F
+ q7 x% w) D8 |0 t1 O - STA $40150 Q* U& o; |) j$ H7 Y( H, `8 i7 o' m$ v
- .ENDIF, K4 y& O4 r# n% I2 k- Z: `
-
7 h* N! K- n' E, M/ d - RTS( v9 p1 G B8 E; C1 O) J4 w4 V
- * \$ F" s. k) {% O' ]
- ;======================================================================
2 i) S! s6 @, w4 z3 N2 V5 C( H5 u! C3 q - ;重启处理( H3 z8 ^8 Q" X' L* ^. X4 u
- Reset_Program. M$ G% A; T4 n" G( T# o4 R, E. H
- SEI( E8 y5 J' V' A4 k: @& w2 ]% O
- CLD
9 a0 J( ?* [) [6 O6 B - LDA #$00
6 ]; C0 n. Z3 z - STA PPU_CTRL4 d. q) c) Z7 a$ i; O5 n6 J
- STA PPU_MASK
5 J* f: n- ~0 |5 V& J" c/ d }: V6 y/ t - STA JOY2_FRAME0 A. a+ t/ j3 A, r
- STA APU_STATUS( S9 U6 T2 E" c7 k
- 2 H. [" F) s( K8 e2 Q
- ;等待屏幕准备完毕
Z& w0 c' d% L! r3 Z( V& S - LDX #$026 E* I/ p( V" h3 O( S$ ~
- .Wait_For_Screen_Ready( P6 w) v* P) `" Q4 d9 U* m
- LDA PPU_STATUS
' q+ b* h6 V( ]+ Q: U j - BPL .Wait_For_Screen_Ready
- {. v: X1 Z q: l, G: u: b' C - DEX8 M3 y9 _( s2 V! ^: R, k: R5 e$ Q
- BNE .Wait_For_Screen_Ready, q" o+ m" H: e+ ]% w
- / a. E0 |) @$ u& l% N
- ;清空调色板% M6 u( {" b, s( N8 D# r' \% u4 e
- Palette_Clear' [ j2 N$ R; k' _+ f9 g( _; y
- LDA #$3F/ S* [% d) H5 @
- STA PPU_ADDRESS! F; q7 T& U* O- ~* J; t
- LDA #$001 Q) w& Q% O' T4 r6 @% C
- STA PPU_ADDRESS1 J8 p7 N5 y/ ~3 Q6 ]
- LDX #$20
6 P6 A: e5 G% A* z2 p) t+ c# ]* l - LDA #$0F" j2 q+ ^. \) q- {. `& l
- .Write_Data ^/ z! i# R( i2 w, Z. E- F
- STA PPU_DATA
4 |* a9 I. P# ^+ }" c" n ~ - DEX3 H" |( {$ H8 p7 Y4 H- m0 f. O
- BNE .Write_Data/ T7 Z3 M6 t! @
- / i' F D2 k2 ~1 ^; ?' a$ _
- ;清除声音 $4000-40135 P# c( M9 @& {2 d! |1 g$ f
- LDY #$14
{5 K2 P) y5 s3 X9 C z+ ~ - LDX #$00: {, ^5 B1 U3 O; u7 h) i. L: W
- .Sound_Clear" n/ C" f0 M% {9 v) G! e% [
- STA $4000,X
& L( ~1 O4 R2 | - INX
2 `4 X" o/ f) Z+ u- i# D# M7 D - DEY
+ d0 @* m2 J' n2 m, A - BNE .Sound_Clear* o& Q8 T; w- N0 g" R! K7 t7 O
- ' J' i3 } C! d) M: @. J7 u
- ;清除 RAM $0000-07FF4 ^" U+ X. l. O! G
- LDA #$00
7 n' s' J* z- F - STA $007 |' D1 i% V6 Q; |8 S6 {
- STA $015 j. Z" p0 q+ u$ |3 m* l1 b* g
- TAY. p5 U- q5 B+ e2 a
- LDX #$08
; e; x& l2 G5 n - .Memory_Clear
, T# w5 b9 d' H9 F' p - STA [$00],Y
7 C+ S( z7 d7 S, g6 L% Q' L0 c - INY
: @# D6 m% s4 j6 [ - BNE .Memory_Clear: }+ W L& t3 l& ~) H
- INC $01: E# ^" u4 Q {" h' S
- DEX" i1 p/ w$ r+ X& `
- BNE .Memory_Clear4 B7 j$ |( c% `! |. i+ ]! K
-
) A7 H5 ?2 V( k0 G; { - ;精灵缓冲初始化
, F4 ?- W" F1 }- `& f0 X - LDX #$00: u4 r* r4 p/ R( d! R
- LDA #$F8
# G, Z. @, S2 N/ r3 Q! _$ a - .OAM_Clear
. |9 f$ \3 h, O7 ^( c( ?- | - STA OAM_DMA_Buffer,X4 }' l6 z8 D: j& V( g; c6 T
- INX7 h8 K7 ]/ o( [8 |
- BNE .OAM_Clear" U V2 J$ L3 m8 D w' @
-
/ V) T6 d! L9 q- z T! c - ;栈指针初始化6 c( J% |1 T( n5 u
- LDX #$FF1 r! E6 Z( x; o5 H- H9 n# h6 @6 _! t
- TXS0 E# [+ a3 S, ?4 w q D
- , w) b) u! |# P; y: k% z* I
- JSR Nametable_Clear;命名表清空: X- f4 N- w8 T- n. }$ ~
- JSR Palette_Init;初始化调色板缓冲
. J$ W# m& ^: N% ]- \( a - JSR Static_Text_Init;初始化静态文本' h4 v8 m( I4 p$ {2 d; c* H+ h9 v
-
! O' n9 ~# R: }7 b, @5 L' W - LDA #MUSIC_ITEM_TOTAL - 1+ v/ ]% `& p# h' [% O
- STA FC_Music_Max_Index
$ y% @, E! }, ~* `, c -
; b3 O O' L8 c0 _) v - LDA #$1F
" O% L" O3 Q) c( Z( [, t - STA APU_STATUS
0 P/ L/ G7 [9 ] - LDA #MUSIC_BGM - 1" {. ^0 x1 C# e2 D
- STA FC_Music_Index( l) X) ^) h6 z
- JSR Music_Init_Process;音乐播放/ B7 N! C# ~8 v
-
: p4 k9 n+ W9 ]$ I5 W - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
6 k: |% e& l8 `) U - LDA #$1E
% B; o6 ~- j7 d- [; h2 ?$ o9 P - STA FC_PPU_Mask_Buf
0 g3 h0 f6 k! p1 @0 S, H5 X" o - / U, X; s; P6 |5 h1 j! `# I
- ;启用NMI处理 ^8 m$ F6 S7 n6 ]3 { H
- LDA #$80
r; ?1 T( [8 e/ ^2 s1 _ - STA PPU_CTRL ~3 f# D, u0 M& _! Z
-
H- r0 h; M! C$ |& k5 a# W - ;程序循环, 剩余工作交给 NMI 中断处理
/ E2 }, I1 Q1 ~8 l - .Loop4 i1 |# ]! k( P5 ~% ]
- JMP .Loop
' H8 G: N' ^: T& N/ A - 0 M+ |6 W' L3 Q8 J$ |% A6 C
- ;======================================================================' v( k9 o7 l& x' l
- ;不可屏蔽中断处理3 s& G( O' k H6 w8 y( h2 E$ r
- Nmi_Program
! S3 z# W. a, w5 F; h" ` - PHA; Q- E. f$ i8 a: Q8 U! L
- TXA, V% N8 Z' }, u5 f1 x3 H
- PHA! w; {2 D7 M; Y5 I- ?5 n
- TYA
1 e" n1 \! v4 G- ?* p' [3 ` - PHA
7 ^2 s4 v0 b. H- X4 H) G - " a' x9 w( u1 L8 E* u4 I; ^6 n0 T
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
7 ]9 Z( u0 M' U6 q - 4 s% D/ Y7 C# s& s
- JSR FC_PPU_Procrss;PPU处理
3 }! L$ X3 b5 K1 J t. C -
* }& m. [: V. _% [$ b: M - ;精灵内存更新. M+ ]0 b' h2 t& @$ E, n
- LDA #$00
4 W0 h) e0 a3 ?, f - STA PPU_OAM_ADDR
5 v' ~/ v" W& T' V# W - LDA #OAM_DMA_Buffer / $0100. T! d/ q1 P$ |
- STA OAM_DMA
3 ^( D* Y% e9 ?& r: |: R - ) W) y, A2 l' S" s f1 ~8 U
- JSR FC_Gamepad_Process;手柄输入处理
' V- _# k- N4 y7 [1 c5 q7 q: O - JSR Music_Select_Process;音乐选曲处理9 n, w% K; v" I6 j/ Y
- JSR Music_Play_Process;音乐播放处理9 {1 M0 {( M2 ]
- , R1 t. ]8 f9 l: K
- PLA; G7 i; Y/ t* j0 ^7 T
- TAY
3 N7 T5 x0 W+ l( c - PLA7 I- v* n0 [' E) L1 `- s0 [
- TAX
" e; n# r6 L1 T( S6 n+ R - PLA" o$ a% }& Y. n# k+ ^
' t& }- k, Q2 O- ^5 Q2 R+ Z) n- RTI
9 f" @" r ^3 T, T7 q& c* O - 6 x: ]" o" D+ D9 U; p
- ;======================================================================2 |/ @; L9 d$ N$ E! k9 Y$ M
- ;请求中断处理
7 C% x" P! N2 ~& I - Irq_Program/ M4 i! f# R" A+ m
- RTI
7 U2 @6 Z7 C" m/ H& |6 j - ! c q$ p3 ]$ z7 R
- ;======================================================================* V+ t; S9 [% _
- ;中断向量表
; g+ u5 D' I% B+ H' [9 K& w - .ORG $FFFA' f" w# i) l! H
- .DW Nmi_Program ;NMI触发时执行9 @) c/ \% t: c6 l2 j2 D
- .DW Reset_Program ;载入ROM时最先执行- J! s2 N0 t5 e$ o1 N
- .DW Irq_Program ;IRQ触发时执行
) `: W) [: g8 L$ F5 n$ M9 m$ _4 p2 ?
复制代码
6 H! W7 E9 s7 t/ z& o* u8 D# `% K$ l4 \$ g0 J h6 B7 B% d1 z
: d3 r3 t* ?/ b( U
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|