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