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