|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下, E- R9 Q r+ p2 {1 p+ J6 ~$ [
* }- h: ]7 i$ s8 n
以下是主框架代码:2 a/ K1 v* m# f: Q. i9 y
- ;======================================================================4 x0 ~( p0 |. c, r- g1 ]* Q+ N7 ?
- ;文件头8 g- _5 A5 j# Q. ^/ b( f0 |* I0 m
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! @3 \& s6 |1 w+ f, X, A - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
" B" C4 ?1 S5 A. I/ u6 R - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
% R' t) j8 b% W \ - ;======================================================================
6 F, U7 M1 L& X; Z3 c! t - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2; d9 V, x! y; F# r0 ^# m
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
5 }, O' W8 H5 v. F# o p - ;======================================================================
8 D6 M+ e: j* A9 X" G0 i - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 12 a/ L6 ?. T) [2 r0 [) c* Y
- RESET_ADDR = $E000 ;主程序起始地址
1 G6 z& W+ R) r& f1 ~ - ;======================================================================
9 T6 O; B2 R' g( h - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) r* i' t1 R8 U
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( q! H4 h; ?; L( w
- .INESMAP 4 ;Mapper号 (0-4095), x& F& P* Y3 W% Y4 A! \7 a/ k
- .INESSUBMAP 0 ;子Mapper号 (0-15)
& \' u: J& Q X4 W$ U! x9 c+ B - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏) r/ z: O1 f' F
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
@) {1 A9 k# b# _$ K- V - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)" |& w1 ?! N4 O4 W% \) l6 I
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)7 o) J0 f' m5 z, l. [* i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)/ h0 D5 R! k0 z' j( g' t9 f
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数) ]* \* q* H0 f0 [
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
# c( a0 V" h9 B* S( J - ;======================================================================8 a" x. Q* R7 s, }8 x
- .INCLUDE "fc_demo_config.asm" ;全局配置
$ M' S* F* h' f# u - .INCLUDE "fc_demo_constant.asm" ;NES常量
. b' H# v3 V4 M - ;======================================================================
1 y; J3 y2 F: B5 w$ ?# e - ;音乐配置! o O, f3 o, [9 t0 ~2 C+ W$ V
- .IF 0 = MUSIC_THEME & B" k) c' R* i3 ^0 z
- .INCLUDE "data/music/Gremlin 2/config.asm"
: e4 E! K( s# U5 T/ |1 l - .ENDIF
( D+ G$ q" L4 {: [& h, o - * c/ b: E" V9 V5 i# d
- .IF 1 = MUSIC_THEME
$ I' F# s- B4 q5 _! ^5 L4 B - .INCLUDE "data/music/Raf World/config.asm": u% |5 W q& a
- .ENDIF4 w! ]3 X* ^/ D
- 0 w3 S: w. V, ~
- .IF 2 = MUSIC_THEME
3 E$ r4 D; Y( Q. K% F# {3 v, i7 [+ C - .INCLUDE "data/music/Ninja Gaiden 3/config.asm": A$ w) Z$ O. r$ {6 H8 q" N) p
- .ENDIF0 N5 }. x4 |; x6 `2 h
5 v; M: s" F8 n- ;======================================================================
. ]# x7 `8 R. p - ;引用CHR图像数据1 s6 V7 }; O3 j) b! N, y
- .BANK NES_16KB_PRG_SIZE * 2/ h8 O/ d' o; v; s! t# ^; E
- .ORG $00006 {4 b) u- K# x- i( e
- .INCBIN "data/bkg.chr"
! v. G+ X% U+ K) w5 P. c - .INCBIN "data/sp.chr": z/ g7 d# P1 u" q6 s
- r8 x6 M2 K% A3 X9 D/ Q
- ;======================================================================
( v8 N8 W6 k2 E% W% m - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
7 z6 ]# b, T/ {. r - .ORG RESET_ADDR
% {7 B# [, G8 f; z, S9 ` - ;======================================================================
) d" W, x K& R/ E0 D - ;引用其他源文件0 s9 g. y2 [8 F3 ~3 M
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理4 c8 e' f2 p. Y. P! F( x/ \# y
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理+ C8 G3 A4 D+ k: I3 V1 g
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理6 g( x8 L. a$ f
- ;======================================================================
( J8 |: S+ o) M/ q o3 f7 f
! c2 t2 O i) ^6 t- _' Z- k- ;======================================================================% K: K) u S" X
- ;等待VBlank到来
, k) z1 P8 t" M- o2 m4 Y - Wait_For_VBlank6 k$ M- ?2 F& X2 S
- LDA PPU_STATUS" y0 L X! H) P# I8 m! w
- BPL Wait_For_VBlank
0 Z5 d7 Q/ q, Q" Z# T6 P8 |* u - RTS
! Y& E- j: O9 n' { X2 {8 n* \
5 F, ]6 ` q4 `) M+ s- ;======================================================================
# N+ G$ ^: k! `2 x- M - ;调色板初始化9 Z+ b8 |" z3 M: q9 p) z
- Palette_Init
% G; }( O$ ^& u+ [# L8 Z - LDA #$3F- W- S$ O! R0 M) V* M3 a: W* a
- STA PPU_ADDRESS2 s$ P% g/ |$ i! E
- LDA #$00
/ u& j$ p5 g0 b6 X6 h/ X - STA PPU_ADDRESS8 b% p' h" ?1 n9 n7 V
- LDX #$00
9 H6 f' l, l) k @ - LDY #$20
4 W! |( Q; z' G' [/ s u - .Write_Data- M* Z: C/ n! @$ [
- LDA Palette_Data,X
* J" T. F5 e% v% q- l2 w) K - STA FC_PPU_Pal_Addr,X
- o6 O8 G4 C" G/ Y J6 u% h& X. i4 a - INX% |) @. b$ _3 O' k n. _1 r0 v
- DEY
: ]* g/ Q# y2 [$ n; _ - BNE .Write_Data) s$ @! b: E: y3 G; D$ c# U
- .End
5 a: k& E7 [3 X" b7 x5 T. d- {8 u4 k - RTS1 J% i3 w6 W: M& q: p
" E1 U2 M/ f# X1 m4 Z- ;----------------------------------------
G) ^0 `! d4 \7 V [9 f - ;调色板数据
" u; q0 M8 f0 O; B0 n) f3 c" r- _ - Palette_Data
( {( f' l5 U" I2 ~0 g1 q0 s! n - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B+ \7 Q: y8 Y, e
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
* U9 b1 Q4 C8 Y3 X: r -
% }( Q. ?& i. X$ @- k0 J7 P - ;======================================================================' Z6 y* _( Y& P
- ;命名表清空
0 c5 ~( f5 ^0 ?2 [# Q; e - Nametable_Clear+ H( [0 o$ F v- ~9 h, |
- LDA #$20% h8 C a- B0 R7 d% S( ^
- STA PPU_ADDRESS
7 v. ^4 P; Y# J n - LDA #$00
' u! }( N4 m4 \& H X0 f - STA PPU_ADDRESS! t9 G* b- `3 d q
- LDA #$005 o( O, n( B- {# L; R' w6 ~$ B
- LDX #$00
5 X @' h8 J4 g - LDY #$08/ p! F7 H6 m$ m, k% _
- .Write_Data% P3 R& @6 ^* P; p* v' k
- STA PPU_DATA( J9 P4 g. V2 U$ Q( I
- INX- k- {. _0 K5 L( t* S
- BNE .Write_Data. Y! J; y( t5 V
- DEY* }: t1 _3 B+ z+ p/ C" m
- BNE .Write_Data" w I1 P) ~* D# o- j
- .End
; X5 p# ] i5 I! M - RTS% s1 f9 r3 [! z5 @8 n
& z! W- \0 G. B0 h9 ], i- ;======================================================================
2 r/ J/ ?2 F a# s - ;音乐曲目切换% b) K% r, G1 B! t
- Music_Select_Process
3 u7 O* r2 j C( Z+ x& R
! j, Q( \) H5 T- .Pre_Music;上一曲0 K# a m, h- p$ O
- LDA FC_Gamepad_Once
7 f4 G! f! d, x) n - CMP #JOY_KEY_LEFT
7 x$ D+ o" Y5 a4 F9 T/ p - BNE .Next_Music
# l% }6 I* Z* H \, `3 K - JSR Music_Play_Pre: m4 ^: X8 X: x- p( W
- .Next_Music;下一曲
- F6 l; g% U- p; l, N - LDA FC_Gamepad_Once2 X' J# @; H1 J% m7 ^6 K2 }
- CMP #JOY_KEY_RIGHT
" F/ n& Y! X$ k8 x( w( O - BNE .Next_10_Music
, M' z F, J- U" c+ Q - JSR Music_Play_Next& M% V/ u: b5 E. |2 c5 ^: O+ c" _; y) A
- .Next_10_Music;上10曲
) T0 s- n$ J3 L6 \ - LDA FC_Gamepad_Once
: X6 O9 P# `7 d7 j: t0 P - CMP #JOY_KEY_UP
9 Y5 _- Z. m* a- O+ o3 ` - BNE .Pre_10_Music
: ] E1 F* N0 H - JSR Music_Play_Next_10% u" o' ~# W; U! {
- .Pre_10_Music;下10曲% Z) l: N7 L% e; u: F
- LDA FC_Gamepad_Once
|4 n3 ?: G1 R8 y- ]5 i/ X/ S+ q - CMP #JOY_KEY_DOWN
- n0 t5 j3 ^% r; A9 V: X) q - BNE .Reset
- k9 N1 D8 o% H( O5 v - JSR Music_Play_Pre_10
0 ?& J9 \6 g9 X; u9 s; `0 W* B+ v - .Reset;重播当前曲目2 g5 O1 z5 c% D3 a: A
- LDA FC_Gamepad_Once
: s$ L) H+ ~, ?/ n! P U- K8 L* t - CMP #JOY_KEY_START
6 n7 Y. A G8 M5 p2 Y - BNE .End
6 V: z0 E% G) f# m1 U: l I* d - LDA FC_Music_Index5 R) u% _. F3 e0 k$ ^
- JSR Music_Init_Process
2 M6 X! N' d3 m) o3 p1 c. q+ A - .End
9 s2 f, x8 Y) J; K! ~ - RTS
$ k6 F# y4 {8 ~ - 9 @& ^ u7 d5 g4 t Q7 o8 _
- ;----------------------------------------------------------------------
& c2 E1 ?- `% \" I - ;播放上一曲
4 W8 b# r0 t. U) g' P) N - Music_Play_Pre
4 d+ a: y9 Z6 L6 _4 H* k h - LDA FC_Music_Index6 A$ X, _2 ]% V% L3 J+ e
- BEQ .End2 K+ ]' v9 z" N5 B7 M9 |
- DEC FC_Music_Index
+ K/ f/ I B+ l. y2 `+ ^ - LDA FC_Music_Index
: G% u/ Q/ Y2 P - JSR Music_Init_Process
, ]% f6 X/ P: N - .End$ F4 _. }$ Y, A, x
- RTS
" X o# o, L0 H, u9 G7 h - ;----------------------------------------------------------------------
[5 s8 N9 r6 A* |( I9 I- H( z - ;播放下一曲
) M8 W; P- Y1 [( o1 Y- Z - Music_Play_Next# H0 K) W% Z) P/ f5 Y. z$ {* j
- LDA FC_Music_Index H0 L+ b; y4 m; c' ?- j
- CMP FC_Music_Max_Index! g6 L& u; p0 n9 s" e0 T
- BCS .End( s- s; O7 H" z- A$ o* B7 p! A
- INC FC_Music_Index- z: a2 S! S9 x
- LDA FC_Music_Index1 e! x* X: x! E' J
- JSR Music_Init_Process) ^; Y/ ~+ {' m% m: ]5 M* X
- .End
6 V, ^; i: R j3 r4 L9 N - RTS
* X7 y R3 Y6 s- e+ |5 \) J* T - , n2 `$ h$ Z5 A* c8 N/ S; A+ h/ c
- ;----------------------------------------------------------------------
' v9 d. K" W; Q- y) R2 I& S" h - ;播放上10曲7 {( ^. o8 |. Q0 x
- Music_Play_Pre_10
$ ~/ i/ h% _' I. b - LDA FC_Music_Index- ^* j, D7 B- s S, n2 }4 q
- BEQ .End
* z6 W. R0 G9 V" Z) x" c( o - SEC4 \9 S9 ^. u' ^1 Q# {
- SBC #10! K/ s( U. @/ Z
- BCS .Pre_10
; i; K3 X8 \1 x) o - LDA #$00
- x4 F: k8 U5 e& `% Q7 Q& T, G - .Pre_105 z. G2 l1 s# y3 h+ C/ b
- STA FC_Music_Index8 _# V" l# D" W
- JSR Music_Init_Process, I. M+ G: ^; l
- .End
: _; t8 B2 |0 ^4 N5 a - RTS
4 W1 I- L- W$ {* h8 G4 D/ _ - ;----------------------------------------------------------------------+ ]$ X N( q7 y; @: P9 P! t
- ;播放下10曲# b) b g& v: U2 i" `
- Music_Play_Next_101 M! O7 |- p6 b, m9 ~
- LDA FC_Music_Index
# ~# b @' R g. P+ G - CMP FC_Music_Max_Index4 }! G R3 W8 B' X9 O- ~
- BCS .End9 Z. W' q$ v: S6 Z. E. H$ \4 D3 a
- CLC+ F+ k9 d. i0 U( j% ?5 k
- ADC #10
t& b( b' i; {' K6 ~! H - CMP FC_Music_Max_Index8 a: C" v1 h& v# I. M
- BCC .Next_102 y. R, v7 l% x J4 F) d1 [' Y
- LDA FC_Music_Max_Index" K% E. M6 _& ~( @( d3 V
- .Next_10
7 }0 c8 g' V( F; X3 G \ - STA FC_Music_Index
3 a, y# [" N: @% g0 _ - JSR Music_Init_Process
$ w# \+ r7 z/ E& O - .End
- O- s0 e# f- `$ U - RTS! R6 n& K! n- M) w o) Q8 p
_9 f+ b6 S2 v% G7 t# u& Z' w- ;----------------------------------------------------------------------4 Y, O2 n7 C2 C
- ;8位十六进制转3位十进制制
8 Q8 U) Z s" g; J6 m7 q' x - Hex8ToDec
/ `! a# U6 W+ }7 N! A - STA FC_Dec_Data_1
8 Y+ ]7 T) X# g% r i E8 i - LDA #$00, t. P9 Z; o# x
- STA FC_Dec_Data_100
+ G. \+ D; V; Y7 k - STA FC_Dec_Data_10
! `: U2 D. Y' G- i [7 F - LDA FC_Dec_Data_1# m' |$ O$ c' |) p
- .Convert_100
# w0 R& i7 S% ~ L3 ~+ d- ? - CMP #100
* B7 ~8 l5 f( o3 r/ B - BCC .Convert_10
$ `0 C% L' K# o( J: e - SEC( s2 o' z8 {0 ?: u
- SBC #100, M) q3 _5 f" M0 ^
- INC FC_Dec_Data_1005 \7 R4 o, D) a6 a' m5 x0 [
- BNE .Convert_100
; f; g# z; H5 p( k# h Q - .Convert_10
+ m' q" M }" P$ ~& @5 O3 I - CMP #101 F# v) W2 {" x9 d
- BCC .End" ^8 r# R3 ]0 }2 J" ~% R
- SEC \5 p/ K; b% ]' \
- SBC #10
3 q7 O, h' Q* D+ Z$ \ - INC FC_Dec_Data_10
6 ^7 `9 N s* U9 x) p - BNE .Convert_107 v8 {: n1 q/ e6 n. Z
- .End
; I" |0 C1 L& ]2 q - STA FC_Dec_Data_1
9 t; V0 m( m6 ~: j2 E8 B R - RTS @: l# @4 ?7 J5 q: C) ^/ r) y9 C
- " s; ?8 D5 v- d; v+ S' S
- ;----------------------------------------------------------------------
9 t) u, ~' S& c* C* S1 V" x/ L F - ;显示曲目信息
! `$ l# ]' L8 ~$ h - Music_Info_Display Q" u, U. M7 B; }% Z$ q7 q
- LDX FC_PPU_Buf_Count
8 v2 E. ]5 F% K: f/ T6 @ - LDA #PPU_WRITE_MODE_CNT_LINE( N* @& E9 u2 T& X
- STA Use_PPU_Buffer,X! I# S+ r" h. z5 k8 P# Z0 d
- INX# C- Y& c+ V9 N0 l. o* k# i
- 6 v3 b/ L5 l1 l
- LDA #>MUSIC_INFO_POS
' I( q+ a: m+ ?+ {& T# k# o7 W - STA Use_PPU_Buffer,X
& x2 @$ P# w$ z5 L+ z - INX
) a0 T7 K: V, y( O$ J6 f- Y; b0 G6 c -
) Z% Y1 Z3 ^3 r- ]# R8 M7 ` - ;居中1 ~ ]3 [" f: I: G% w
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' z$ p$ P9 I/ }) F9 w4 ^5 I
- STA Use_PPU_Buffer,X: ~4 ^! @+ O% Q$ ^" j4 O1 i% I
- INX% u- z3 ^5 l N+ V, b2 r1 k, W/ c
- & B/ ^ }% L6 }1 t
- LDA #$05
6 o( O0 C) |, u, J2 Q/ Z- @ - STA Use_PPU_Buffer,X( O7 ?9 s( K0 |" h5 s2 m& r8 F. W
- INX
4 E& {4 D$ s2 _' V- t! h% b -
- A1 `% W' ?& J' z# p, k$ D | - LDA FC_Music_Index8 j# }6 J( x0 @
- CLC* M& i/ \5 c/ U5 \
- ADC #$01
6 a8 b# B# y, j5 k - JSR Hex8ToDec- n: A. _. l6 t' h
-
* t- R$ _% e# k3 t - LDA FC_Dec_Data_10: Y9 y, S" v, ]+ [) a. F
- CLC* I7 W- A' p+ {) ~
- ADC #'0'
6 H+ B5 j' O8 V7 T - STA Use_PPU_Buffer,X( m( X! r8 s, w+ `( Z6 M
- INX
3 q- A4 \6 M% I3 ]- J" a! T -
+ K# t/ b2 V2 e' c7 L* F - LDA FC_Dec_Data_1' ^0 {2 u) S4 t0 Y
- CLC
. g* k& z% L5 t9 d$ r, {: K k D - ADC #'0'
) X* y( b* b" e3 i! o% L" g5 m/ x - STA Use_PPU_Buffer,X7 o& B9 \' ]9 G& P4 f# a' a* C
- INX
h4 ]* |' Y6 T/ ^ -
1 g0 ?/ A1 k2 w& s6 h+ @/ j- b - LDA #'/'
# W' a. k* O3 H- Z, n: c" C - STA Use_PPU_Buffer,X
# p& N: e& {+ `% k3 j D. Z6 U3 e; ` - INX
6 T% l" Q' ]5 K% \5 r+ @# z - * W& J; K! G# m! y
- LDA FC_Music_Max_Index
! b! [$ ~! l* M* ]9 D; L8 L: x/ c/ B" e* @ - CLC: I9 C+ F. N: H4 f
- ADC #$012 l: t! a) @* V% z9 O
- JSR Hex8ToDec
. t3 d( ?2 D1 o. c# h# c - : w' K- c, N- f, f' c
- LDA FC_Dec_Data_10
4 z& z/ A$ d( c* ~' h - CLC
1 _$ A8 j* r, ?) g! J - ADC #'0'- n, B" C9 Y$ C) H9 z. j, Y, e& D
- STA Use_PPU_Buffer,X
' ?" |, x I5 c# Q7 h# J8 B1 s( u% W - INX& R$ t/ v0 x4 r
- ( ?! f$ I+ q. I q% l* `2 C/ E
- LDA FC_Dec_Data_1
7 c+ m/ d i3 I, z& p5 @ - CLC3 w( S2 k8 w8 v' }& s2 Y
- ADC #'0'1 t6 Q4 D* e# o4 l$ O) j
- STA Use_PPU_Buffer,X
+ ?# W0 l8 D1 ~- Y0 `+ X - INX( c# I0 A. Y7 { J6 C. ?% f
-
% ^! z. c; U/ c - .End
1 |. A0 T q' ]( b - STX FC_PPU_Buf_Count
: Q; K' S0 l' ?- q6 m# l: S - RTS
5 \) u6 O O- v; O% t - 3 M5 R% i7 W+ U' A0 h6 z
- ;----------------------------------------------------------------------& S" \) `: p" q. Q4 _' U* L" I
- ;音乐曲目初始化处理1 z# z9 R k7 Q* H3 Q. J
- Music_Init_Process
. Z5 z y& c5 |$ {( R4 e4 p - PHA2 P/ Q5 b0 r" p3 x9 E
- JSR Music_Clear_Process, d9 d$ t& k0 n+ `
- LDA #$1F
4 H( H: R: `. k% m7 l - STA $4015: K l+ m: r. I8 U6 A( `" k6 o
- PLA
6 S& s0 }, D9 d, r3 f - JSR Music_Init_Addr+ Z& d; G6 f: |4 {& |
- JSR Music_Info_Display
! W1 e7 ~! x1 w& N9 _. T# R* }4 n4 j - RTS1 {: {' Q8 s1 W" u) [
- : e$ ~9 x0 b( v1 L& O8 u3 v6 m
- ;----------------------------------------------------------------------" m9 W) T) `2 U/ [: s
- ;音乐播放处理
* g r5 I# [- \4 P" u9 \( R5 A - Music_Play_Process5 j* o8 F& g3 S3 v6 B
- JSR Music_Play_Addr. s0 P/ a5 P' C6 ]! L
- RTS
Z3 Y& a4 P6 g - $ j: U$ m/ _* [6 L1 I4 i
- ;----------------------------------------------------------------------) G$ L& e1 U" t6 I# A
- ;音乐播放处理& D5 b6 M1 A2 S1 H3 V/ @7 H: r
- Music_Clear_Process
( a8 B. [) c7 f8 G4 ?9 } - .IF Music_Clear_Addr4 I& f i" j% W3 C; h
- JSR Music_Clear_Addr
3 h6 e% c; i3 `( `! q - RTS
/ @! y/ B/ [7 z1 t+ f. ` - .ELSE
3 H8 Y1 ]+ |# e- Z. K# ?3 Y - LDA #$1F/ _9 c; {. S" l4 Z. Y- i: T2 r- _
- STA $4015
; T$ q6 x9 i7 H' v" M - LDA #$00
( }3 h% S$ H# W F, ` - STA $4010
' T' c5 \/ _. C4 P4 z - LDX #$00
' i& X3 z5 l" e8 { - LDA #$002 @4 a3 V$ i; q' k
- % A2 [( b6 {8 D) ~- n- ~
- .Music_Clear_Zreo_Page_0
n! |( H" o# I - STA $00,X, k6 P+ N h# j' t: ~ u( Y
- INX
8 e* E3 M$ P" F' W; y; m - CPX #Use_Zero_Page_Begin
- h" R& [& d* q; S& n6 [ - BCC .Music_Clear_Zreo_Page_03 |; }. |- q, R
- 4 g; s% p! l& p, u
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
: }. x- D' G3 y. y& U: Z T* t - .Music_Clear_Zreo_Page_16 R8 S7 i$ m* d' F
- STA $00,X! k( ]9 Q; z4 _
- INX- Q5 x& S% ~# z4 i! A, B( W
- BNE .Music_Clear_Zreo_Page_13 g( Y0 X6 d' y7 Q& k4 T
-
. U" _* R% G( s7 T3 r$ T+ K- C- z - Music_Clear_Process_1% b' p! R4 b# J+ h' X) c1 t
- STA $0600,X- L! G, q/ p0 n) H& D
- STA $0700,X% R" P0 j! I8 q" G% D
- INX
' `* _ F' i) c, u; {( {% c! E4 T) E - BNE Music_Clear_Process_1
8 H8 x0 d$ `& T' } - LDA #$105 L8 F. W# g" I% R, r5 j0 Q: H
- STA $4000# S& p) c" e9 U: V5 H$ d& p; D. Y
- STA $4004. B4 s; V- W) ~
- STA $400C
! e1 S0 y/ J+ Q7 l - LDA #$00
4 A5 V8 J6 v! v+ j7 H7 k Y - STA $4008! w' q5 K) ^2 B2 q
- LDA #$0F
. X' q3 \! Y4 ?& ?9 m8 D+ z - STA $4015
E% x! l) D/ L) b$ S - .ENDIF
' `, h/ a) t& p8 D - ) s- D9 P6 y1 j6 A7 ?9 [
- RTS. J/ t& Y! ]4 q( W
- ) g$ D7 v4 h) u, U5 {/ w
- ;======================================================================
: {$ P( Z$ e9 @1 I' ^ - ;重启处理
& Y: F0 b1 B# t$ g( c3 v% E - Reset_Program
5 X/ q6 C; l$ y: P. y' w - SEI
7 Z& }, ^3 A- I" S7 ]: a; F% K$ j - CLD; M; E# N3 P! g0 r: {, }$ r. e
- LDA #$00
4 ] y; ~, V, ^5 r" B2 d - STA PPU_CTRL
5 K: k/ @, e, w/ R' p - STA PPU_MASK
* r# p9 Z, W# X9 N - STA JOY2_FRAME
( c! q6 _8 B# e- t% G - STA APU_STATUS
$ J7 W8 h* |8 E; { - , Q( r6 C2 ?8 U: `- O/ O% L( y$ A
- ;等待屏幕准备完毕6 P/ X5 E+ i' _4 M; D) `
- LDX #$02, _" q; X" O, v3 G+ h( K% ]" X# P! ^
- .Wait_For_Screen_Ready
. y! d2 _" r$ ] - LDA PPU_STATUS0 y+ N- r% i7 }) g
- BPL .Wait_For_Screen_Ready* _' b6 }- m i ^, Y- X, g
- DEX
- o' A8 O, }. f* t - BNE .Wait_For_Screen_Ready# {/ r2 l" d4 ?5 J
-
+ Q" l5 ] w0 Y" F - ;清空调色板, G( `; q2 w4 I+ V
- Palette_Clear: ?, v/ H+ r( u0 K& [2 ~( {0 z; R
- LDA #$3F
O9 G$ m" n' }/ R6 n$ A# ?5 |# M, I - STA PPU_ADDRESS
& h- A6 ^4 X( h- z3 O& D: @ - LDA #$00
. t5 Z/ r2 S) `. u5 q; d9 |: N7 l( N - STA PPU_ADDRESS
0 a; b/ D0 U5 f5 b4 l) I: s - LDX #$200 S, e Y! J" R- d% L5 Z
- LDA #$0F8 f4 M2 s" |- x0 O" P$ B
- .Write_Data
0 ~! l9 P, ^9 D. B! i) B - STA PPU_DATA
3 {. C# H2 u" T, J H - DEX' T! A% W' @$ h' E
- BNE .Write_Data+ N1 Y2 i$ B) u3 U
/ H+ {6 I8 x# Y- w/ i0 O- ;清除声音 $4000-4013
9 q1 h# U# ~, n* R$ p, P' [% ]: Y - LDY #$14
' q9 y0 A0 f5 a0 f/ ]$ P - LDX #$00
* D! ~* y+ \& n+ n - .Sound_Clear
" F U1 S7 N M7 Q, S" T - STA $4000,X
/ o' ]! w! Z* U) w8 V9 Y - INX
( _1 j4 F' ^/ p% F7 |, Q - DEY% X x, f: O7 @1 t" k- i
- BNE .Sound_Clear x3 a! I8 D1 X) q. X
- ) M/ `3 `7 P3 A2 Q, E
- ;清除 RAM $0000-07FF
- Z5 b& _( c8 N - LDA #$00
5 d* a4 f( B$ ? - STA $00
- ~8 [$ N# J' H8 ]. p - STA $01! }) i1 V8 } e
- TAY2 k0 ^- K, c7 T8 p: B: O
- LDX #$08' N1 O `! B) N9 [, h5 g
- .Memory_Clear8 ], ^' ?! S. P' G( J
- STA [$00],Y
9 @' A9 D4 U z" N8 ~+ @- J% z - INY
' O$ m- l4 L$ V! w6 J3 t - BNE .Memory_Clear
1 y7 ^& j2 y G0 [. d - INC $012 P" W" P+ t& k& q
- DEX
' j7 A6 t# A/ B$ T - BNE .Memory_Clear
) q% p( `& B' Y( r$ g - ) P+ {5 F* O$ U1 @
- ;精灵缓冲初始化
* a/ r, Z4 f; {5 `! d - LDX #$00
2 q/ H$ r& e6 _6 ? - LDA #$F8
' F- y& |! _" x# ?* o7 j+ P4 J - .OAM_Clear7 ^) D- }, I- [3 Y) u n/ `! w* S O' @
- STA OAM_DMA_Buffer,X) S' s9 ? \' M* Q+ r! y& Y, `# h
- INX
8 {* E+ x: s: a+ a0 u( W# G, ^7 k% ^ - BNE .OAM_Clear
! h! f6 a9 t9 }( K& |/ X1 K& ` -
4 N- ~: e: C. F) [7 x3 c - ;栈指针初始化3 h( w) @+ v' k8 J5 F% \% Q
- LDX #$FF- w/ r+ x8 l2 l6 [# h3 E
- TXS# q7 k: H- r3 I- L) i6 a
-
7 j! b( K8 U8 A- X2 O - JSR Nametable_Clear;命名表清空, e) n) I [' c/ [6 \( H
- JSR Palette_Init;初始化调色板缓冲$ \7 g# q" }# q. u
- JSR Static_Text_Init;初始化静态文本3 ^# y6 B& y- {) U& |" H1 Y. ]6 B
-
' r( X6 D6 F* N/ }, N# a* ^, O - LDA #MUSIC_ITEM_TOTAL - 1
8 X$ o) D" x& q1 ?* u2 o* [6 y. e - STA FC_Music_Max_Index
j. ]3 {7 L8 Z! X7 ^7 ^5 X- N3 g -
* R- }, K- v1 g - LDA #$1F( r+ X* W% D; F# b& n
- STA APU_STATUS
) b7 E; y: ]( I - LDA #MUSIC_BGM - 1 [3 `1 {1 _: C
- STA FC_Music_Index
4 k& R' e# f9 W9 o& \2 P - JSR Music_Init_Process;音乐播放7 l2 s- ^8 A; }% L
- 7 x7 A! _& [/ h+ g+ z t
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
! S1 @9 C; w1 q. ]7 j - LDA #$1E/ m* ?, x \* q* i0 C0 {( h1 I
- STA FC_PPU_Mask_Buf( J$ p% o) p, P& F# ~
-
* t; b9 ^5 o& [. k9 b: U - ;启用NMI处理: [% J- j1 r ~4 f6 m0 ^* s
- LDA #$80
1 B7 T' {+ u" L- |5 k; Z - STA PPU_CTRL2 b" n9 S0 B \0 q
-
. i, ]6 n i0 b- R - ;程序循环, 剩余工作交给 NMI 中断处理
9 a% s: x# G4 a4 k' T1 G, X% T& r - .Loop
; }5 a2 [: Q8 [% J6 q. W - JMP .Loop5 v0 u% u2 R8 D1 y) h
$ [- O" _+ S' _* P+ s- ;======================================================================
2 i2 w1 o; r0 e0 y5 Q - ;不可屏蔽中断处理
( y! W1 V$ D: K3 z: @$ Y9 G - Nmi_Program3 j( b2 l$ B; E" i
- PHA
5 E- K# \9 Z I' g9 t8 v- n - TXA' a: P' f( N" |* y( q6 V, k- F
- PHA1 s. e9 I& V: Z o' T$ u+ y) {+ c
- TYA
: I; d# }& h2 v# Y* L& g' r8 q% ^% d - PHA
& N U t1 y' V3 B G -
0 c& X7 [$ w- a - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
! u5 J+ z' L& y1 _1 s2 J - ! A2 e, s& m; r) `5 l, i
- JSR FC_PPU_Procrss;PPU处理) c# ~9 |' a0 {9 K/ Q1 b
- 8 e1 t2 P/ k2 n9 R! ^5 v
- ;精灵内存更新
2 e) {* ~ m+ a0 I - LDA #$00
2 r) l9 ]% _' Y! a - STA PPU_OAM_ADDR
7 N* d! b+ q8 \) m ^/ y - LDA #OAM_DMA_Buffer / $0100
h. Z' Z7 _$ {7 K2 r - STA OAM_DMA* G6 u+ R! I1 Z
-
8 [. ^6 D5 K6 Y - JSR FC_Gamepad_Process;手柄输入处理% V$ V/ G: O9 j- P7 U% L
- JSR Music_Select_Process;音乐选曲处理
8 G9 x$ P a6 ~7 w) ^ - JSR Music_Play_Process;音乐播放处理3 V+ t2 V0 s" o$ a
- ; i- p3 O1 N2 `: \
- PLA
[0 c. ?$ A+ Q" H5 ? - TAY4 q5 B3 N: g# F* F
- PLA
x# w$ o! l. ^ - TAX
7 ^" g# t' Y1 d; M9 K! D x - PLA
4 m% x. U0 B) `5 g% _3 Z - " J9 Y4 i; ?/ ^: k$ [: @
- RTI5 P8 f/ g) ~8 }# L k
- ) j2 n) f2 i" k! Q- q2 Q% y
- ;======================================================================
^$ Y# s, q3 j$ d) A/ o' f, k( N8 K - ;请求中断处理3 I" I9 c2 s$ y1 J1 w# f
- Irq_Program
4 K2 A; |/ P# d" R% b9 v - RTI
) S3 S" J/ [% n6 f - 8 i) v. z! y5 q$ c/ g
- ;======================================================================
& k% A$ W) u- d) Z! K - ;中断向量表0 `! y( c d. z2 l2 ^3 {, j% p
- .ORG $FFFA
# @9 K/ W! L; Z( \ - .DW Nmi_Program ;NMI触发时执行
8 @/ I9 G3 N4 q - .DW Reset_Program ;载入ROM时最先执行
. l$ y# M: |3 p, `$ x# O - .DW Irq_Program ;IRQ触发时执行& ~ }, u4 [0 y# P
复制代码 ; A! b+ y& T$ d; B4 b+ ]" b
6 {" z. h5 ^( Y* i' g9 \
! H! K- U: N# Y( v j( R! `https://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|