|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下! w* }2 ]. B1 _& ~% h

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