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