|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下) g) b5 i+ Z# \

' }1 |5 _- T; q R" ~7 e+ Y以下是主框架代码:
) D& l0 \0 @7 R2 y5 T( A7 V- ;======================================================================* V4 H% V3 u; s ^2 T% [; p
- ;文件头7 W% b' K2 {; n
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ O* `; N2 a* a1 i: Z( l6 ~, v* M - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
0 q1 n! Y+ M/ q$ i0 I/ t" F - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码* [/ Y- N& ^0 V H8 e4 I; J
- ;======================================================================
* G/ m* |/ e* f& `& f3 X7 I - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2. }7 \5 `5 J/ G. S0 R: }5 R
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
: L' B& ?. C; F9 N& J - ;======================================================================
/ J/ G7 g2 {0 R; ?' j7 R! m$ e7 ~0 u - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1: ~! w! v7 c/ \! I% M* v
- RESET_ADDR = $E000 ;主程序起始地址
# R8 m4 ~, `1 Y" K& E$ v* Z - ;======================================================================* l( P2 u9 p8 Y& D, I
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
# _! s T s3 P - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
6 l! d8 s9 a, F' Y6 ~' w - .INESMAP 4 ;Mapper号 (0-4095)- E$ _9 F9 o" c
- .INESSUBMAP 0 ;子Mapper号 (0-15)8 N2 y8 t* `* x+ x
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
- _( _$ c- W0 O1 _. r2 D - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
4 x* ~5 ^. t9 Y9 y8 M - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
, ~5 k' j1 I0 V) b - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
9 T, W# \6 J! T7 m - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)3 V, f* W! W8 y4 p7 M0 H* z
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
5 d* l9 W: e, w9 s/ G8 J# k# j - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy): S+ G; g3 R) B
- ;====================================================================== `, j. R, s( }1 u, e/ n' A0 G
- .INCLUDE "fc_demo_config.asm" ;全局配置
0 e* b" {3 z- ^% F - .INCLUDE "fc_demo_constant.asm" ;NES常量
) c8 @* d) b. R - ;======================================================================
* m2 T" d' `9 B; j8 } - ;音乐配置( Z( d; n; X/ l+ U5 Q; u" B0 _, J
- .IF 0 = MUSIC_THEME 2 i- ]' `3 I: A+ O# q
- .INCLUDE "data/music/Gremlin 2/config.asm"3 d; J; y- s6 ~, S6 A% M/ `1 L
- .ENDIF9 s5 r* A3 a. s% R) O0 D2 @4 a! l3 X
-
' W, u* w- b4 u/ e% K - .IF 1 = MUSIC_THEME g$ `6 G. ], C5 p4 R
- .INCLUDE "data/music/Raf World/config.asm"$ z" g) N3 G1 u% g
- .ENDIF
: t1 ]# w( v; Z -
- Q4 J+ X5 W6 L) }9 j( w - .IF 2 = MUSIC_THEME
, m# M/ T9 G* T) V1 N - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
' v+ e4 i/ Q5 ?% @ - .ENDIF
+ @ k7 g$ b* [% A: r - - W/ s, E) v/ U# t: t/ B
- ;======================================================================! i, J5 o' e- d8 w6 ?- M
- ;引用CHR图像数据
4 n' t3 g$ N9 P1 x - .BANK NES_16KB_PRG_SIZE * 2
: |& |, S1 G% B7 _ w/ i - .ORG $0000$ b/ t: T+ e- D+ t6 G* G
- .INCBIN "data/bkg.chr"
( m, a* N& }5 I. F& Z5 e/ y8 {- p' } - .INCBIN "data/sp.chr"
/ d J& Y1 _3 v - 8 @- F; Y, h$ q' W" A; b
- ;======================================================================
; w% H' z' Q( L" [ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" |5 k1 l( N: i& M& L* B
- .ORG RESET_ADDR
0 N3 P8 B W% S4 R# W2 D - ;======================================================================+ ~/ ?, A' d5 I2 i
- ;引用其他源文件
0 A( u ]' w1 ]4 I$ E( V* h% r) w, o - .INCLUDE "fc_demo_ppu.asm" ;PPU处理. k/ h9 M8 a' w# Q: X, B
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 n$ z9 X' c7 m) O& \- y - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理7 H8 g; G. f+ Z8 b$ L$ ~- G
- ;======================================================================
_ H8 y. [: }, y9 Z$ S8 r0 U
' R+ X& \( Z, o- ;======================================================================- X5 W/ s1 A- @! @! N
- ;等待VBlank到来
# E* t U5 r- r7 k6 c - Wait_For_VBlank$ v7 U6 D v, ]( B6 z2 {3 D
- LDA PPU_STATUS! _" v. M* g/ Y$ N
- BPL Wait_For_VBlank
# J' L. Y3 g Q" T# T3 ^5 B/ g/ X - RTS4 ] Z. M2 i- x* v6 _
3 T3 V6 K; D2 Y3 [: a* Z7 o- ;======================================================================
4 g/ u2 n: [- J/ R - ;调色板初始化
$ q; k( V% y) r' \6 E* A - Palette_Init
! Q: s; h" h1 b0 m! @ - LDA #$3F# ^7 H3 W6 f" h- j# B
- STA PPU_ADDRESS
' s% W4 z* T: M2 o) m6 |9 N - LDA #$00! q6 P" u) \5 E+ H
- STA PPU_ADDRESS n3 X; }2 b( V7 q/ i0 G, {
- LDX #$00
3 G7 W' J- l3 z" U8 J - LDY #$20% M$ q+ I* j1 @
- .Write_Data7 ?3 `* S8 }9 Q% z
- LDA Palette_Data,X
' j" B* @! H3 }7 | - STA FC_PPU_Pal_Addr,X
( f8 }; n7 V1 W6 q. h8 k - INX
& Y. j; b( C1 {8 y8 S - DEY
' a3 ]% q! T* q) A" Z - BNE .Write_Data
. ^9 T. S A6 x: K" V8 F - .End: e6 h) `0 [: Z3 f, L* F% H
- RTS2 o# K f, r' D2 W1 ?5 k) a0 [
- 2 W+ r! ^ [& r5 i2 z
- ;----------------------------------------
4 y5 I( d' q. M2 V. ~6 Q- _ - ;调色板数据5 a4 R/ `8 c3 _3 `
- Palette_Data5 }* Y' D+ c2 P; I4 P1 G6 |/ B
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
+ f+ U& d4 M; e# P - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
' u; \0 C5 d7 P0 G9 m& Y2 B -
. ^) l G* _; P% U$ O - ;======================================================================
- ^' t N0 D* a% k. q - ;命名表清空
1 ` K& X' h# N5 `; \9 j! f* t - Nametable_Clear' B4 i( ?$ l, z' A: j1 A/ Q6 F
- LDA #$20
2 R* d" n6 ]2 s* Q - STA PPU_ADDRESS
, ?. k( x1 ^( b1 b) B; O# @ - LDA #$00
$ N. d4 z1 \) {9 R/ x - STA PPU_ADDRESS
6 y4 w% a% U- \5 r; r - LDA #$00( f O3 Y, O7 F( W
- LDX #$00
w4 I$ N* R; @1 L - LDY #$086 F$ a1 ?8 r$ h6 }/ g% ^1 e/ b( A
- .Write_Data
% F0 |0 d h1 f" s( L' } - STA PPU_DATA2 l; j3 c B' {
- INX' |+ T% e/ U7 a3 f; Z8 s
- BNE .Write_Data
$ w# M; p y: B) V" d+ u! n - DEY; ~8 k z) {# |( W& V$ L
- BNE .Write_Data7 }5 u1 }& h- m0 O! t1 l4 f6 T
- .End( h8 `) K9 t+ F2 ]# r$ ~
- RTS; Q+ z, J* \* i$ @
y4 o, N' N- `: W- ;======================================================================7 W8 a7 D0 P7 Y" ~
- ;音乐曲目切换+ O3 |$ {% u; P' J
- Music_Select_Process, ^+ T2 A5 _* g
- * Q* m, _' t8 Z/ b: x
- .Pre_Music;上一曲
o3 H, J- v% K( I7 H% p$ d& ]: v - LDA FC_Gamepad_Once: b" Q" J9 n4 ?. Q. w
- CMP #JOY_KEY_LEFT' h6 [$ t3 Z$ J( X' U
- BNE .Next_Music
/ J0 C: Y, _4 \/ |( Q - JSR Music_Play_Pre$ v) P! ~4 [& p
- .Next_Music;下一曲
% }9 P ~9 \# ^5 g( p; M/ E8 n4 q - LDA FC_Gamepad_Once
, s H) l8 r+ O1 ` y - CMP #JOY_KEY_RIGHT
! ]! ] r3 ^) H/ s& _ - BNE .Next_10_Music+ `4 ~; _ B2 |- `, P2 ] U0 t. T, C
- JSR Music_Play_Next b: V% I6 u# l& ?( O
- .Next_10_Music;上10曲# w: W3 R; S- d6 V0 q3 ?/ e" c
- LDA FC_Gamepad_Once
" D2 u5 t6 ^3 f3 }, U5 r - CMP #JOY_KEY_UP. P: @) q$ g! c$ [8 j0 n4 B
- BNE .Pre_10_Music1 G2 M5 o/ K9 ~+ p
- JSR Music_Play_Next_10# }# |1 t& Z: ]
- .Pre_10_Music;下10曲
& |' G, h+ T3 |* Y; N - LDA FC_Gamepad_Once
3 C$ m: D3 T# F5 `' _/ F: ]' u - CMP #JOY_KEY_DOWN, Z% l( U" Z$ J4 i8 S$ X X
- BNE .Reset
, c, p9 G1 a) c% s1 M) c+ C9 y. e - JSR Music_Play_Pre_10
1 y9 K7 o' V* a* L$ K C - .Reset;重播当前曲目
" C: R+ ?- \( K7 N+ q. Y4 f7 i1 i. T - LDA FC_Gamepad_Once
* {8 X8 }& j- [( w/ x - CMP #JOY_KEY_START
$ I3 j+ }! t3 ^" \% v - BNE .End
2 }' J' c9 u z6 ~ - LDA FC_Music_Index
6 s) V; `3 z2 x - JSR Music_Init_Process
: [# s4 Q8 ?3 ]* V9 w - .End
1 r* V; [% d1 P4 s4 o% J - RTS# G- k, R/ s/ |
- / a$ d2 [* W, q q
- ;----------------------------------------------------------------------
1 e" q' |5 ^, ^8 q) o - ;播放上一曲1 Z. D, [0 V% W. k
- Music_Play_Pre
; @* K& x. z, f$ z4 S+ m$ z - LDA FC_Music_Index
; h; m: A5 e# o6 p - BEQ .End
9 Q6 |# P) _4 z7 R% s( o - DEC FC_Music_Index; u! R" J. a/ H
- LDA FC_Music_Index
7 m3 n4 U! B1 ~5 [+ X( b - JSR Music_Init_Process
/ D2 C7 I; \6 v, O6 v - .End9 N- k" ^& W8 }4 ]* ^
- RTS
0 Y8 |' R# Y* l - ;----------------------------------------------------------------------
K, u- |; o, u$ h8 T - ;播放下一曲
& `" J5 b$ l) |9 Q1 {: W, X7 }, U - Music_Play_Next
; S, }; K3 U1 g7 D3 ] - LDA FC_Music_Index
/ \" a. J% D$ @2 }- K; K3 R' o - CMP FC_Music_Max_Index
?' x# E8 W8 b0 s0 d4 s - BCS .End% j! c) p+ a8 ]: l+ ^8 x0 ~
- INC FC_Music_Index
\- X+ w/ s3 \$ f+ @ - LDA FC_Music_Index
: F% `' p7 N+ R6 L3 H - JSR Music_Init_Process
& z3 D1 u& q g U9 p- d; k - .End) T) U/ ?1 G( f' g
- RTS
; U; e- G6 [5 V3 X) i }
& `5 e J: k2 t% M$ j$ U, U- ;----------------------------------------------------------------------* R4 t- s. z; R3 I% A
- ;播放上10曲$ X1 C9 j& J/ u% B
- Music_Play_Pre_107 ]) y7 |' e( }+ L
- LDA FC_Music_Index$ A, T- |3 M$ F7 ^8 c, T6 A* I* o
- BEQ .End" \) G8 b; B- q" d; V* f$ F& _
- SEC% w" K, o6 m- Z) F
- SBC #10
) Z* W$ k7 G5 ~3 v" y6 L - BCS .Pre_10
1 L2 C: `/ X: y/ S( h - LDA #$000 m+ p, T3 l3 Y
- .Pre_10
% N5 G0 ?& M2 t. L. j3 R" } - STA FC_Music_Index9 C, {& f/ P: i$ W' ]( Y$ G4 Q
- JSR Music_Init_Process
. g+ D% e2 X) T( [* O! F, I' q9 w - .End" F) @& C% ] h' [+ k% L
- RTS
* ?6 m$ H+ a( y* C4 Q - ;----------------------------------------------------------------------% ]) j: w0 T4 A( J. H8 g
- ;播放下10曲6 N" _% r2 n9 d( B, R( S
- Music_Play_Next_107 ~+ u# t n2 X5 \1 H5 Q# r
- LDA FC_Music_Index
0 B$ l. t/ o% N - CMP FC_Music_Max_Index* D& i1 [; ~! h, ?
- BCS .End/ G/ X8 {$ r _: x
- CLC
' `1 o6 g- i3 [, o! C - ADC #109 Q! M1 W- ?& S! D8 `6 n
- CMP FC_Music_Max_Index, @8 B+ C/ [3 W% v7 ^, p0 e8 ?9 L
- BCC .Next_10
6 A: G' n# c, D4 R: J9 J1 ^ - LDA FC_Music_Max_Index
" D1 i+ y& |% n G" A - .Next_10$ z1 f' ?9 f4 C5 i! i( r* t
- STA FC_Music_Index$ D5 x; E) H, d7 N: a
- JSR Music_Init_Process5 |% I! |' g1 F
- .End
' V5 f8 d4 F% o" g, w - RTS
! O- c5 w5 E! T7 J/ f
% v( m5 Q2 f4 b% o( c$ s- v! T- ;----------------------------------------------------------------------# x' `- u# R4 g* Z" j0 `6 @
- ;8位十六进制转3位十进制制
& I1 G9 [+ S9 X5 {$ @! S# x - Hex8ToDec
k" {& i3 I: q8 k - STA FC_Dec_Data_1# w6 P* C9 Z- |& f) T
- LDA #$003 E2 o# A* J( c5 m" ^" I* Z9 @' n/ {
- STA FC_Dec_Data_100) B( q; U5 B) S. I/ K" r* ^, V% c7 \
- STA FC_Dec_Data_10! E7 r4 K% F$ h+ C
- LDA FC_Dec_Data_1; u+ [% q1 d% U0 I. c( ~, m4 S& j4 s
- .Convert_1004 D5 G1 x" ]3 R) P) p$ y
- CMP #1009 x" i* k1 N1 `1 i. H" _
- BCC .Convert_10
, S7 ~5 m' S; U$ j, F - SEC
0 M; }* J) C+ `; G - SBC #100
4 Y; {7 |7 G1 g# y7 R - INC FC_Dec_Data_1009 I; W4 o8 Q. g; \. y# }1 t5 l
- BNE .Convert_100$ e) O, ~8 E! l& ]; v. e" D$ N2 T
- .Convert_10
4 ^ G: n |* @ - CMP #10& w2 A0 o; D6 Y T T
- BCC .End
' C$ O: x( _* Z$ l# |" E - SEC
' l8 K2 P9 P3 S# b1 ?6 I - SBC #10
8 w& Q" S; X8 H* S - INC FC_Dec_Data_10
r9 E2 @: c% L) B - BNE .Convert_105 p2 J2 x5 w9 y' c! A3 @6 I
- .End
; B! s+ x: p( H9 R* p# P+ S: i - STA FC_Dec_Data_1
" M8 [; V3 }! t- f - RTS/ J" r, O1 g2 X" y
- . l4 ]2 Y' s) `0 n' s7 C
- ;----------------------------------------------------------------------$ w6 W$ ?5 [/ p8 w7 ]
- ;显示曲目信息
5 u3 k) W' k7 ?; P$ R - Music_Info_Display8 S {( ^9 u/ @" w) T; b
- LDX FC_PPU_Buf_Count' {0 K" e X/ a; l* t* l. _
- LDA #PPU_WRITE_MODE_CNT_LINE( E( v# \; d. b2 h* P
- STA Use_PPU_Buffer,X0 y9 [0 S! Q( U& l/ a# O
- INX
1 j% N2 a2 c$ `6 p - ' _2 p3 G( G8 G; F! }0 _, w0 k
- LDA #>MUSIC_INFO_POS
+ N o6 [% L& z j7 \0 C; E - STA Use_PPU_Buffer,X" A7 h$ W! c4 ~( h9 O% d8 e
- INX3 i3 w5 |) k! M3 C9 }
- & m o4 y/ f) y6 [7 ?+ ?$ O! B# U5 E3 l
- ;居中
* P* x `8 B( o7 a- H - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2! o* W1 @8 c4 T8 [% u8 z
- STA Use_PPU_Buffer,X
2 B* h$ f" M" G, P - INX- q/ L y4 D/ c7 U5 _! R8 |
- ( e, M5 M) ^- K* n8 ^2 `- M
- LDA #$05
; b# E- C' b" d7 S$ _6 e - STA Use_PPU_Buffer,X
. M8 M R# a. e8 S; b - INX
- @) G2 x8 R* E @6 b; d0 Z2 e - 7 `( B/ b! ~7 w' b
- LDA FC_Music_Index
' m1 l, v# t2 z2 A* b& E; x - CLC
, F5 |2 c- B. T1 U% I - ADC #$01
+ T3 n/ w. J5 ~" j - JSR Hex8ToDec) s4 w8 q) `( V2 k4 Z$ D4 r, e
-
& v# G$ R9 u) w - LDA FC_Dec_Data_10
! m! a" g9 S) m5 r/ K- X - CLC i/ }* l& w+ B3 X$ h
- ADC #'0'( r( a# K& O8 l
- STA Use_PPU_Buffer,X
: ^" K5 M9 _0 l) R! f6 d - INX
/ a, n* e, _" I* {" r - 7 l: q& n/ }. i4 K
- LDA FC_Dec_Data_1
" B. w: U8 q- w P, ` - CLC$ @* E( a) U u; k
- ADC #'0'
1 S% c5 i. G N( P, \ - STA Use_PPU_Buffer,X
+ z+ Z. ]0 o* {8 E8 H - INX6 V+ h' E- x* `/ O6 V" e! Y8 @' S: {
-
, v' Q8 x# T9 S - LDA #'/'
: l5 E- B N" h+ Y( _; q& W+ P - STA Use_PPU_Buffer,X1 S: X9 c6 {* q2 O; G
- INX
& P0 [5 a! P5 v# U! l - * j; g8 d' M) t, b( v: {( W! r5 Q
- LDA FC_Music_Max_Index
" l5 U0 b8 _: b, L' P - CLC
7 H+ P7 J* w9 |* _$ j( V - ADC #$01" d, ?& H) p: B
- JSR Hex8ToDec
8 X4 u% ?6 v- d1 @. j8 ^4 g! [ -
o3 O8 c' d1 J" E/ u - LDA FC_Dec_Data_10( v: P9 J. w- ]
- CLC
7 b- r' s" N9 S: X - ADC #'0'2 `9 K) ]- e2 F$ \$ }
- STA Use_PPU_Buffer,X
8 W5 c6 b$ r4 Y- t - INX. x. f( e- J5 D* ?# | y7 |
- 9 Y, V/ l h; A M# j
- LDA FC_Dec_Data_1# o0 s3 z9 a# d& p# m& R1 t& A% a
- CLC
- N/ ?. D& Z3 N# q3 s0 s - ADC #'0'
- c6 W( y; H' c - STA Use_PPU_Buffer,X1 q; O0 H0 |! w; y$ H/ c9 a+ s
- INX% j H. q) y2 [' R" v+ Z6 c8 O
-
* V- o. M% U8 C - .End
4 i3 b: U6 S2 h1 a o, R - STX FC_PPU_Buf_Count# F# W3 w; o' |
- RTS
! Q6 ]# a- b2 F1 J, R- z/ j4 ?
3 i K% U0 K5 }" ]; {; m# k- ;----------------------------------------------------------------------1 u' |3 b' Y y- I0 g4 `7 p
- ;音乐曲目初始化处理" O! z$ U( c2 B! j, }! e+ n" T
- Music_Init_Process
2 B9 E" F/ C. ] - PHA
0 d2 I: B! x! r* ?, \6 a, u; Z - JSR Music_Clear_Process
% j- X% B( p! f6 e* }% C - LDA #$1F3 s% h. t0 Z% {) q' P4 U
- STA $40157 s1 g6 G1 D' g9 ~3 a
- PLA
) m3 i B1 S9 @, {/ Z - JSR Music_Init_Addr0 i' F7 W# e2 d
- JSR Music_Info_Display* }& f3 a' M$ ]4 y& {
- RTS8 ]' d- {, |; N \9 F+ \
- 4 @! H2 F# Q& c4 J/ e# K! x
- ;----------------------------------------------------------------------; h. v* | g: d, A4 n D: w. Q, X
- ;音乐播放处理
0 g0 f) L* p4 l& H& @/ R - Music_Play_Process
! y5 w9 J2 @0 G2 u4 R+ M - JSR Music_Play_Addr; y8 H1 `) w" K$ v/ [2 W! k! B
- RTS- @0 \0 @4 Y0 }8 Y9 \+ D
- 7 X9 `1 V8 f+ B
- ;----------------------------------------------------------------------$ m2 z6 J v8 a& ^1 z9 A
- ;音乐播放处理
, m/ t3 B# \" W - Music_Clear_Process: n. P8 K( x ~0 ~% _
- .IF Music_Clear_Addr2 ?2 q! |6 N3 v/ ~3 H4 x1 p$ f: P
- JSR Music_Clear_Addr4 J" Y$ j1 I& ?4 M* q, V9 f8 e' w% ]
- RTS
( v( C+ Z& I: P4 ^( ^. q4 f - .ELSE
$ k- G: S* K5 Z: l+ X$ }9 s6 q - LDA #$1F
" X% h( w" @5 ]; F- e2 _& o - STA $4015
, h' z9 u" p! Q - LDA #$00
2 U' ?: r5 V4 c" o - STA $4010
2 d" E. _% S, J6 n: ^ - LDX #$00
" }0 w; K5 k+ Y: U - LDA #$00+ s3 c) R5 F) W; i0 m$ s; E
-
/ B) y! X+ r2 g+ H6 K - .Music_Clear_Zreo_Page_08 S v! h1 q$ [# B# u
- STA $00,X
/ v& ?' o, [8 z; ~5 O8 \ - INX
% D) S! Z' @: ^- N+ }0 b - CPX #Use_Zero_Page_Begin
0 A6 }; r1 k$ I3 I& l% V z% S& ^( C4 N: s - BCC .Music_Clear_Zreo_Page_0
% B. R8 b- z F$ } ]: G- x -
$ a5 N- N* ~0 D H - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
* U5 a- _. O5 r5 I - .Music_Clear_Zreo_Page_1
0 \) X/ v& t* z+ R - STA $00,X
' @& ~& F$ q/ \, ^5 } - INX: L$ ~2 c6 q% [8 D' e
- BNE .Music_Clear_Zreo_Page_1' ]0 p, V. ~$ `' I/ i
-
- S0 Z( D7 r, E+ X% A( l - Music_Clear_Process_1
+ V" c, E$ j: e1 G3 Z - STA $0600,X! d, l( H9 o$ R' o
- STA $0700,X
6 Q8 L: I0 h+ A$ G - INX$ s2 X7 O, A8 k* ^# G
- BNE Music_Clear_Process_1
8 Y3 s2 z/ c l0 y0 ^0 X; ~2 d% G - LDA #$10
( a, z+ Z2 Z$ X% R9 t" O; g: u - STA $40004 A- W# p, n, M/ Y
- STA $4004
( r) o1 `; T" ?9 D! g( B4 c! r. D' r# j - STA $400C
: V( g. _$ n* b6 K* ] - LDA #$008 f4 @- Q* x; a$ {
- STA $40088 A& p! N# n! d q2 X/ M" D
- LDA #$0F( w' g+ p, ?& T: o
- STA $4015, j# L" M6 L m+ \4 C
- .ENDIF
4 i/ x4 D2 j# j, o+ U) U -
/ n2 E, X( t4 W) f. _, d, h - RTS
8 V. C' U0 x" J6 i) y
4 H# K8 z+ D% R# B D3 ]- ;======================================================================- o' A: `+ U. B6 q" ]' Z# K% T
- ;重启处理
4 I! k6 W& s, f9 ~( U - Reset_Program
- b+ l9 x; O$ U. i - SEI6 I U) z2 Q/ L4 F# E1 l8 N
- CLD
; e) A1 P. w/ i1 U - LDA #$00
, o- \" G( y# s$ t - STA PPU_CTRL8 [, L) x1 w- [
- STA PPU_MASK
; C* }- Z( A8 r5 t9 S' a& c - STA JOY2_FRAME
( h8 D- r8 W5 `9 y, e: ~ - STA APU_STATUS8 b, w% N( }7 H5 g
- ( t( m+ K$ q8 ?- ~" G3 C' ]' c6 r
- ;等待屏幕准备完毕
]4 _ V1 i5 g - LDX #$02
- n% V' q7 c2 G0 a - .Wait_For_Screen_Ready* d' t9 M* n1 J" R2 ]- i
- LDA PPU_STATUS
6 q1 H7 J) \ a7 \; Y4 F - BPL .Wait_For_Screen_Ready
q6 ^; @3 x* C7 C4 T- b z, s' [ - DEX
" n9 @# y! R* m( ^& M1 Y5 y- j - BNE .Wait_For_Screen_Ready. S* T- {+ G' y
- . D9 ~8 X, T* n
- ;清空调色板9 f" S/ U5 P! y. ]; u8 C
- Palette_Clear
, b# @4 L" k- D. r+ _9 e* W - LDA #$3F
f8 }0 z' q* a1 r9 x' A; ^5 f3 ]" _* Q - STA PPU_ADDRESS; P0 g7 P; ~ {% ]. K* [& O$ n
- LDA #$00! t. o' w% o) y9 N
- STA PPU_ADDRESS6 @( |, F& h% c" X8 t
- LDX #$20# p% |! I5 |, ^9 H( F% }
- LDA #$0F
^7 t' b! F8 ?$ ?6 R" |3 @3 P - .Write_Data4 e7 }+ [- U: |! v4 X
- STA PPU_DATA/ {2 `7 v+ n9 \4 M5 u# ~
- DEX
' C. Y1 W* X: E2 ~4 Y5 v - BNE .Write_Data) Z0 Z2 g. p9 S# k
0 q4 N1 J$ |, t0 D C- ;清除声音 $4000-4013
7 j0 {! X* Z# ~" U P - LDY #$14
7 }' d0 z# W% h - LDX #$00
4 _8 u5 ]2 j0 l& [$ u/ ^$ a( n5 h% b - .Sound_Clear
. h7 a1 i8 l. X4 v p: E9 P" } - STA $4000,X
) s0 A8 n) b4 o5 ] - INX
& Y$ C5 \1 T N8 e e+ U) @$ [9 F - DEY2 Z) z0 @, a* ]
- BNE .Sound_Clear% [2 Z7 j& e' t, }! W
- ; _1 I# U/ x/ q' U# u0 |8 o
- ;清除 RAM $0000-07FF3 |9 y$ e0 S. s9 P- y
- LDA #$00
# [% n" e/ M! t8 t - STA $00
" i9 F1 R6 ^. s" e - STA $01! z* x+ q* z# z7 t; A6 Z
- TAY! o, K! q# d e' R4 j0 S
- LDX #$08. N, d" a$ D. X+ @
- .Memory_Clear* T9 a4 N. k0 p! x5 g
- STA [$00],Y0 ^) D5 A. r3 f0 l* m7 S
- INY
6 g: c' g2 I5 p6 \# |" j3 X) q - BNE .Memory_Clear1 I+ @" e$ f: H5 l2 Q. A, Y
- INC $01( i6 k& p* X( z. _
- DEX/ h, K. I4 Y) l' H! Z- M' J( I
- BNE .Memory_Clear
8 P1 B/ ~, V2 K3 O0 y+ q+ P' L0 M -
) E# x( T2 z6 g# ^, i6 O9 S - ;精灵缓冲初始化
3 ^ z) c" i1 H7 l" _6 T - LDX #$006 t& i3 ?4 K5 T: V# F, a* G8 a7 X
- LDA #$F8
7 ]8 ^: ^+ A5 I' C7 L - .OAM_Clear
7 u2 c# G4 q) U& i W - STA OAM_DMA_Buffer,X |. `- }8 Z# h! Q/ K l( j
- INX
, Z8 }0 A: b& M. p - BNE .OAM_Clear6 L9 s8 P. p" d/ `
- 4 v- [# u" P# R% h! u
- ;栈指针初始化
: l! \$ \% i' E' M3 P - LDX #$FF
( K1 m" _' j c! P8 w - TXS
! b) ^; c* F6 l2 e( e) m4 ^ - - R) `% M, S( @7 I
- JSR Nametable_Clear;命名表清空1 a! l5 R, u+ T8 L. o. I5 B9 q
- JSR Palette_Init;初始化调色板缓冲2 K; \" Q9 z K
- JSR Static_Text_Init;初始化静态文本
/ f& `& y4 F8 \ - / Z9 a2 O" f/ K" q
- LDA #MUSIC_ITEM_TOTAL - 16 t+ t; K2 R" A5 U- I0 b
- STA FC_Music_Max_Index
3 t: j& |/ C5 \" |4 b& q& ~ - 1 ]. k) s6 e, C4 F" y, i T
- LDA #$1F
5 ~7 J% g8 _1 S6 A. s6 u - STA APU_STATUS
. y; K& n, }7 k1 d; |+ Z( k - LDA #MUSIC_BGM - 1
a0 y0 k7 o! P- J6 }1 r - STA FC_Music_Index# G" b- E1 \1 D/ ]3 j
- JSR Music_Init_Process;音乐播放
; h* Z! y$ d: R9 A# f" F0 _2 { -
4 [' Z {: ~+ w) s - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)* A/ I/ T4 Z* R, {
- LDA #$1E
}7 X, w: u% l u" J2 d - STA FC_PPU_Mask_Buf" z! M" g- f" {$ P4 l5 }
- 5 E. D- t1 X4 j. D9 T
- ;启用NMI处理7 D8 }/ Y( B( c9 ]: Y
- LDA #$80* Q0 ?: k# v3 J6 I7 B1 ]. a3 B q+ Y
- STA PPU_CTRL
2 @: s0 G* e) k8 I- A n4 n) l4 b - 9 C1 I( t9 L% Y2 l2 }: h+ `
- ;程序循环, 剩余工作交给 NMI 中断处理# Z8 s. J4 t* m4 P
- .Loop: [- L/ u. S3 f1 I3 B
- JMP .Loop
6 k. K3 ^0 Q P: l1 C - 1 N$ x0 q8 J$ g8 s
- ;======================================================================5 Z$ t% Y2 n( \* |% A
- ;不可屏蔽中断处理
' `" k/ A6 t" Z' ^, z7 h7 k! L) R - Nmi_Program
5 `/ T% a$ u4 f( \5 B - PHA
& C1 U/ w; o$ R( s; X - TXA
- s; A/ w; Y8 O) w" \ ` - PHA
/ n5 V; O& @! h8 v" d/ Y9 Z0 U - TYA2 u8 k3 U+ w7 K$ g+ w' A7 V
- PHA
: l4 [9 [0 C2 \! W3 ^7 }# @ g+ F' E - , q+ n5 W9 N: W/ |# b' k' l% W$ P
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 e" n1 U; }1 F' ]* g) V - 3 |) S+ h2 Z1 [/ P; h# {, A
- JSR FC_PPU_Procrss;PPU处理% b' ?0 K5 i9 n7 J- N- N0 R
-
/ c1 f' h3 r( a: O - ;精灵内存更新/ y6 q* v, f2 A+ _- o( x1 a: a
- LDA #$009 t- p: n9 g7 T4 d% b
- STA PPU_OAM_ADDR( H. ]4 [$ t3 a$ F
- LDA #OAM_DMA_Buffer / $0100
1 m6 l A/ ?; c - STA OAM_DMA1 M% ~0 y% D: X1 _
-
6 ?% `+ v' s \2 L P6 k1 G$ I) V - JSR FC_Gamepad_Process;手柄输入处理
7 i- x' N% F2 x; I - JSR Music_Select_Process;音乐选曲处理
7 D/ n3 M6 R, m N) c - JSR Music_Play_Process;音乐播放处理
1 d/ o% Q6 {5 R% V) ^' {' v: j. m - - _- h" ~" ~# T* y. f% ]
- PLA
, T$ d% F0 Y* V- s - TAY' F: ^, M$ M, o
- PLA4 a" Z, X* o" D i& _! Y
- TAX
% S( p# m/ `; T' k* t { - PLA
$ d1 L: m# a2 a
& {9 ?" I! P. X1 f& f1 o- RTI
0 O' x! k- s0 Y7 Q r
+ V3 U8 K/ V$ e- ;======================================================================
2 O; h, x! t+ z4 K - ;请求中断处理
* V& m* X0 w8 J& s, U - Irq_Program( u5 Q: h- V- K6 y* U; N' e2 z
- RTI1 U3 z1 Z' p; o+ L
5 I/ U. u* q m2 O- ;======================================================================
5 P4 N& h8 G; M# n - ;中断向量表
2 [/ {3 V" V9 p - .ORG $FFFA
* H/ U# j/ n) v) r+ r u - .DW Nmi_Program ;NMI触发时执行
# q# Y* `* J8 `: k - .DW Reset_Program ;载入ROM时最先执行 K% N3 [4 C! }# o
- .DW Irq_Program ;IRQ触发时执行
& O$ o* h5 d" x6 d
复制代码 ; b8 Q% t# H3 v+ j
( c; U h6 B9 c- O0 _& [( w
! s- S5 T* m5 h" L% z+ g8 F
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|