|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( k4 _, v" d( F( G ( v9 M2 y) y2 T `( j1 i
以下是主框架代码:, P/ }# Q; r" T8 t
- ;======================================================================" A* h5 Y8 J% S
- ;文件头
* w0 ^9 p: [0 ?! Q3 s: r - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量7 n/ T( n& Q' F7 r' T9 g# `
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量: ^, S8 x9 x, y, P5 {! }( v) h, a, W
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) `% c, t3 x9 f- J; _ - ;======================================================================
; z" ~& O5 m. S- r( H U3 d& H7 X - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% n# P8 f, n! r5 l: k - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 15 B9 k8 j, y+ D+ r% z& J
- ;======================================================================
: s: t) U- n) R& Z9 u- Z" S - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
* G& C! n" h- _. c8 L1 u - RESET_ADDR = $E000 ;主程序起始地址
7 z. `! x* P8 D# S9 [% \8 I - ;======================================================================& S# V5 _! K& V9 C9 r D9 Z
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB3 q% W3 r5 ^6 w, @7 d" L
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB8 T$ |- p7 E) c5 I9 z# v. ~# y; U
- .INESMAP 4 ;Mapper号 (0-4095)2 ~: {3 O R, y5 e
- .INESSUBMAP 0 ;子Mapper号 (0-15)7 S5 P: y& ^+ E x+ a+ m
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
/ V6 v/ Q1 a- Y' [3 X0 ?9 r1 f0 i - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)$ [1 B( T% \7 a; p0 t
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
2 [0 {# p/ n1 ^5 y - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ `6 f& G' f2 h; Z
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)9 f/ w# U! Q+ L: j$ E. N
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)3 H3 l4 W* z6 f; X# f; `
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy) f, _$ i9 z8 s5 k b" [7 X
- ;======================================================================
/ ]* Z4 r' Z/ Q! O8 e - .INCLUDE "fc_demo_config.asm" ;全局配置, ?9 q* V) ?3 t7 i% E
- .INCLUDE "fc_demo_constant.asm" ;NES常量
) S7 @$ H2 G# ? X3 U - ;======================================================================
& ~0 u! C8 a0 L/ S7 ` - ;音乐配置5 h- V2 x8 p1 |# W9 \0 e/ O3 ^
- .IF 0 = MUSIC_THEME 0 _6 t' ~; g3 h; k) l3 H+ \
- .INCLUDE "data/music/Gremlin 2/config.asm"
0 X5 T, k, k& h$ ~0 C - .ENDIF
* p% J. T& g( }' Y5 a& W+ a -
. p" @3 F) w8 T9 u" Y, O - .IF 1 = MUSIC_THEME
% l1 z9 |" f& e) G - .INCLUDE "data/music/Raf World/config.asm"& {3 `7 v6 {5 ? W- G
- .ENDIF
9 \" J' i) Y7 f' Y8 o+ K - 0 R3 w& h. Y8 F
- .IF 2 = MUSIC_THEME ' V8 v1 J ^: | i
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"- ], {$ H# S- k- x0 r6 v5 A
- .ENDIF" g& h' n: X* E3 v$ S4 B
/ M8 c9 w3 S4 x1 R6 o- ;======================================================================, h6 |* r" r8 F( K5 o, O* A6 u
- ;引用CHR图像数据
( A, w( C9 J: n) f. X B - .BANK NES_16KB_PRG_SIZE * 2
+ D# |5 i1 K/ d" i - .ORG $0000( r. Q- U( S V6 G
- .INCBIN "data/bkg.chr"
' A( ^+ y' x' q& r& E+ p) E* W - .INCBIN "data/sp.chr"
! z0 E! e. @# U. P& ~ - 6 A* j) l: n5 u) {
- ;======================================================================0 l6 R' O" q* y- r5 m2 W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank5 X* q1 B) Z/ M3 h) H" D
- .ORG RESET_ADDR3 Y. ^1 l. m' Y2 Z' [
- ;======================================================================2 ?; }4 g% O, \! W4 r
- ;引用其他源文件2 S& Q3 j3 A `4 `9 |. y* s
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ ^/ a) v+ w5 D- M4 r& \
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
+ Y, `( O$ J- a( w - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
' l" }: V" Z5 O% Z7 z - ;======================================================================
3 c* m0 \$ {6 S$ h/ T! `7 l% e0 x
: \- U4 d; A* Z$ \/ s& a# ?+ C3 @* c- ;======================================================================
! Z3 i, M) i. t; s# f0 O$ X - ;等待VBlank到来
" U9 h& _6 i1 Q! A7 j# f - Wait_For_VBlank) i0 G7 \. T) ?& s/ m" t1 J% k. x3 B
- LDA PPU_STATUS, s) X* ^, L1 Z2 w
- BPL Wait_For_VBlank9 Y: s X% h5 m+ d6 w
- RTS
0 ]! A$ s" l+ m6 H0 L" _
: D/ {! A+ B" L5 k4 [; v8 Z- ;======================================================================
8 [9 D1 N* g6 T5 J8 t - ;调色板初始化
( N$ s, w+ T3 L0 ?' M* h - Palette_Init
" S4 y3 o! @! ] }7 ?9 e - LDA #$3F
F; n+ B) e! o, \1 y - STA PPU_ADDRESS% _4 `' t: R8 n* w9 x+ @
- LDA #$003 e i0 U; h5 Q/ ^, G
- STA PPU_ADDRESS
7 _9 ?/ E' W1 n7 h( s! C5 C - LDX #$00) \, p8 M6 P8 S+ s; @ n8 g
- LDY #$20, Z# n) }5 `2 Y
- .Write_Data; f& J8 y9 P+ x) O% E. ]
- LDA Palette_Data,X
0 O+ x+ I$ E. t$ a" W - STA FC_PPU_Pal_Addr,X: X6 s. c( J; s/ ?6 [* D9 B
- INX- P% [ \% s6 @1 ~
- DEY
. N5 i) S* A& J, v' B' j - BNE .Write_Data6 @8 B J1 u) z. N$ N) v& T) @1 }: h
- .End' B1 a* ?3 B+ V
- RTS2 Z4 ~) z% J4 @) j- ?
- ' m* T; o+ \ i4 A
- ;----------------------------------------4 q* @- J5 {0 ^
- ;调色板数据* S2 d: `, D6 w/ ?% V# B2 d3 v& _# N
- Palette_Data/ R/ R6 c n, r# l
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, y$ I% [6 M; J+ T
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22; ~( R' F3 ~: V8 Y, L" ~- g% M
-
]$ L' d( t9 D9 {1 X9 m6 Z4 G L; V - ;======================================================================$ `) o M/ b: [7 q" b |3 t
- ;命名表清空" A' d3 [$ I% A; V7 C/ P
- Nametable_Clear2 E0 B* e" Q: Q1 x) u1 W
- LDA #$20
6 U1 E7 ~. Q, j8 I( a, E* T. o - STA PPU_ADDRESS
8 e9 s+ G; ~9 Y - LDA #$003 |) r$ E8 g" T: ?2 B( \$ ~
- STA PPU_ADDRESS- t2 c3 s9 }7 i( W: T3 N
- LDA #$002 ^( P/ E) K3 U+ l1 }& Z# M
- LDX #$00
# |" B5 i- ?4 H% i& ~* k - LDY #$08, g& U* g" H! X
- .Write_Data( _6 P9 z# J: j n' s/ [* ^- ^1 E
- STA PPU_DATA2 c' h( x$ o7 R7 i+ Y
- INX
# F- E, k$ {, [4 K/ o! V4 t - BNE .Write_Data
* N( M3 }& Y, Z$ g; x9 A3 B - DEY9 `$ b# J4 u' h
- BNE .Write_Data
$ n" N1 A- b) a* ~ - .End# e. O) r2 ]6 d: t. S a. b
- RTS
) |6 n; m) Y: K! E/ T" \ - 9 w d$ ^0 |( i6 l: _, E2 k) K9 M T ~
- ;======================================================================
, k' O- _- p4 Z6 ] - ;音乐曲目切换
d$ P( p) ~. T. ~% X5 \& Q! ^" ^ - Music_Select_Process
9 s' m. t/ ~ W4 v, [$ s2 d - + Q0 o9 h' D5 ?4 l* r. k
- .Pre_Music;上一曲
1 }* |, _0 B0 s& B5 ?7 o$ g - LDA FC_Gamepad_Once
' V) r& _2 a5 T& P. O: o4 m - CMP #JOY_KEY_LEFT
' B* }7 p# e/ f3 ^ - BNE .Next_Music# I. O \! `% l' x1 S% U) E6 W
- JSR Music_Play_Pre8 {* ?6 f+ i7 S: Y
- .Next_Music;下一曲
7 p; ^# y, S/ p2 s0 Q - LDA FC_Gamepad_Once* U4 `$ K3 {, X# I
- CMP #JOY_KEY_RIGHT
9 C% N( f: W6 I3 G: I+ A - BNE .Next_10_Music8 `3 L/ |5 g7 E9 }! E
- JSR Music_Play_Next
6 {* r) n/ Q% K0 s1 w( ? - .Next_10_Music;上10曲& d5 w' N0 v" x$ @- L. f0 T
- LDA FC_Gamepad_Once
# r: F* j! C2 \) Q2 k - CMP #JOY_KEY_UP
0 V5 ~5 o; z) n- q - BNE .Pre_10_Music
" q4 ]& r$ B9 J L' g# N - JSR Music_Play_Next_10, H p/ H. p2 b0 Q( S5 o
- .Pre_10_Music;下10曲
- v, B$ N3 v# j: x2 T- S9 t - LDA FC_Gamepad_Once
9 Y2 w* K+ `2 P$ d7 q' ~) N% e! W - CMP #JOY_KEY_DOWN
+ Q" d6 z' p3 _+ e - BNE .Reset
- P( _& J0 u7 V* V9 J( G - JSR Music_Play_Pre_10
/ L: E6 |6 M2 M2 r" G+ F - .Reset;重播当前曲目
& T8 B9 P- J6 S( r# I' K+ ^* @" V, t - LDA FC_Gamepad_Once
3 M% R8 b4 ?. J/ y- v% M - CMP #JOY_KEY_START
8 W# b b# |+ ^( U- p - BNE .End
. N9 J- r- h3 v4 h9 V7 G - LDA FC_Music_Index" y, O6 @ _/ E6 u5 y% f7 |( y3 V
- JSR Music_Init_Process
# W, O5 A& u& B8 S4 i6 ^1 a - .End
+ e, V9 \3 d( s3 s1 p$ J9 _ - RTS
* k4 V: v* y k! z8 B L' ]8 y, a9 i
0 a, O) Q) a5 v U. c$ y- ;----------------------------------------------------------------------7 E) D* i' E6 }: R. I
- ;播放上一曲- A$ B& v1 y5 A2 s5 N# S9 J
- Music_Play_Pre
& P+ y5 P* |) M& R# L2 E - LDA FC_Music_Index
( c4 C" g8 t: j0 N - BEQ .End) l2 @' N% A; b3 a9 L8 a% v" \
- DEC FC_Music_Index
, Z6 w. P- m) k* U% o/ v - LDA FC_Music_Index2 |, ?) q: }# F) R
- JSR Music_Init_Process
/ K4 g) {: \ ~( U7 M - .End2 U( @8 _# z: ?
- RTS
" i9 v& K/ |5 a! x; @4 C* p - ;----------------------------------------------------------------------% V* l; H5 e4 Y3 a0 {
- ;播放下一曲: h. D: P; Q, R' v6 z
- Music_Play_Next! O' D. P0 P, u7 V9 v
- LDA FC_Music_Index
1 E; ~2 \* C0 R' i1 x% I - CMP FC_Music_Max_Index1 j! i" C: f8 f
- BCS .End
- k2 J9 f9 \* b: P - INC FC_Music_Index* t) c3 s. E+ f; D4 o$ b
- LDA FC_Music_Index3 T) T# n: B5 _+ T% a
- JSR Music_Init_Process
& y8 q: d* c0 _7 J! a - .End* p. }7 s% }8 A
- RTS* B' d1 x- p9 Q- \# m6 O4 n6 t5 Y
, H3 b* d1 K8 _3 e# H1 I- ;----------------------------------------------------------------------! S3 p6 ~) m( [; ~5 _/ N
- ;播放上10曲9 [; o+ W/ E4 |& Y6 |2 P, C; N$ ]
- Music_Play_Pre_10; v% J$ d; R1 u8 d
- LDA FC_Music_Index. E$ h1 ?5 ?" G- u
- BEQ .End. C! _4 n R$ [ a
- SEC
: J8 g- e) \) b2 G - SBC #10" e2 r9 _$ J2 G% o( {5 w
- BCS .Pre_10
$ p# ]9 d+ B: m+ R: J& O - LDA #$00
' ?; g' ?; `5 P - .Pre_10
, P; j }% P6 T: m - STA FC_Music_Index a$ G: X( h1 n: a) @& u
- JSR Music_Init_Process
& q; A5 f3 `+ P! ]2 C+ o - .End* b1 W4 I+ V: [
- RTS2 g9 ]: _9 ^9 D0 {% y
- ;----------------------------------------------------------------------
4 U( w. `. J5 z4 V* ?, b4 p - ;播放下10曲
4 ^- o! r2 W) ^7 {8 I0 V8 I - Music_Play_Next_10/ g2 e2 {3 h* T$ C7 m& N
- LDA FC_Music_Index, Q2 }! O& n% w# ~+ m
- CMP FC_Music_Max_Index) _2 i0 P( F9 q0 d4 E/ Q
- BCS .End `" O% Y7 Z$ P- X! H- ]6 P
- CLC+ M: z0 V& _4 {- \
- ADC #10
; |( `$ t( S9 d+ X" u - CMP FC_Music_Max_Index
7 y; ?# u6 U5 X7 m# s - BCC .Next_108 E1 d+ B6 r5 f9 W4 {7 V5 f
- LDA FC_Music_Max_Index9 M- ^4 D* F5 M
- .Next_104 u" h$ H% j" f1 J& a& }6 w3 s9 n
- STA FC_Music_Index
4 ?. j' E3 A2 s4 W$ h. x - JSR Music_Init_Process
/ {7 t! v- X* S! \ r - .End
/ P: F* t. q4 V# I; c - RTS5 B# X: T. i4 E
- 7 X9 J( L3 {5 Y* o/ |/ s6 T
- ;----------------------------------------------------------------------/ s4 x7 J5 }: w% D! d6 P7 G
- ;8位十六进制转3位十进制制
" ]+ U: w6 \3 {# N/ p0 A - Hex8ToDec" f1 W. H& O6 V
- STA FC_Dec_Data_1' w5 i3 a( A/ ^; o: ?6 S# ^
- LDA #$00
1 I' C l- ]+ }# t - STA FC_Dec_Data_100. q6 {# s6 C8 p- D7 ?
- STA FC_Dec_Data_10" y4 \) p2 @6 L8 d
- LDA FC_Dec_Data_1" V F; ~$ B9 c# m$ b; o) Q
- .Convert_1008 e' T6 l$ N& M. N" k, R: C' q
- CMP #100
4 S: `8 m) [, `- x - BCC .Convert_10
, v# R' H: n; s1 Z& b - SEC
/ a# C( U: U7 \8 ~4 B% {; k - SBC #100; {# k2 t- V& }! l* Y
- INC FC_Dec_Data_100; E- [7 M N$ z
- BNE .Convert_1006 Q. r% k) u: v; Q3 S) M" T
- .Convert_10- k, ]1 X! k) U c8 j `6 A. e1 X
- CMP #10
q3 I7 l' a2 b5 W7 M1 y - BCC .End
8 p$ n, H8 ~; i6 j! [ - SEC
6 ]2 f7 A' n n - SBC #10
1 e1 Q" z5 V: \) w d - INC FC_Dec_Data_108 Q' ]9 }1 K6 ]- }
- BNE .Convert_10
4 E% s! U0 Y3 | - .End/ h4 p5 Z; |9 O7 l" ?
- STA FC_Dec_Data_1
# A5 m+ |0 b/ s - RTS8 a. h ?4 d0 n. Z' h+ X
7 ^; R6 Q) v1 } y. e G- ;----------------------------------------------------------------------5 X' y4 L+ ^% ]1 u( O8 a
- ;显示曲目信息4 _" Z+ M8 b) ^+ ~/ G- s
- Music_Info_Display
6 z0 i" w) z0 g( D3 m - LDX FC_PPU_Buf_Count/ m2 B1 r$ i+ Y' k* E! t
- LDA #PPU_WRITE_MODE_CNT_LINE
1 A$ q/ j6 D8 r3 x, S - STA Use_PPU_Buffer,X
8 ~( Z; o- p2 @1 r0 | - INX2 E6 g* R. m- m% b* k3 S$ F
-
) x/ R8 E2 P. n5 w - LDA #>MUSIC_INFO_POS
6 V) u4 N- Z- O0 r( g9 [- @% u - STA Use_PPU_Buffer,X4 [7 N: V# e) C6 J
- INX
; k' f: L# \+ b* S' x, F; o -
* l. g+ w/ ]1 m: D* }% G( [ - ;居中
% Z k0 ?- r2 A, y% ~$ I* k3 a - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2, Y4 L: L* M' `! M6 ^- j
- STA Use_PPU_Buffer,X# _& d" B; B% K5 j6 z N, F, E
- INX9 E, F; Z+ b2 A K4 y2 g1 u
- / F; @: d$ E) ^. W) `
- LDA #$053 l2 _9 n: n+ `& [* f
- STA Use_PPU_Buffer,X. t; e E' |6 g% u! P
- INX4 F" e1 A2 C, c: L- c0 D p
- 8 b `: P( A: l2 h0 V" }0 h6 a
- LDA FC_Music_Index
2 P- B+ C8 L+ |: d1 A" O - CLC
: t! ^ J% i8 h1 w - ADC #$01
7 T$ v+ m. u0 a& x% K2 x - JSR Hex8ToDec
5 w" I! ]7 [9 L N3 k* B4 C -
" a6 l+ |3 \) o Y - LDA FC_Dec_Data_102 H$ T* T! Z: s. d
- CLC
& D1 W4 {. T- ^7 I8 h - ADC #'0' V" A6 }6 |7 i" h7 e) u( V+ A) A2 M
- STA Use_PPU_Buffer,X% w1 ]- F2 X/ W3 T
- INX
% E4 M( \& Z' y+ j -
1 L% k# k- f" z9 e& A - LDA FC_Dec_Data_16 y( ?) g; `6 }, ]
- CLC1 t2 D8 Y; E ~9 b
- ADC #'0': j, u% K5 v$ s; U5 _
- STA Use_PPU_Buffer,X( T; q& f+ y3 K0 ^
- INX
6 d0 z" D7 \* S+ k9 L1 S/ h5 Q7 Y -
) k. h9 U" s( p" _. E - LDA #'/'
0 {! S% S" y. V' g" p - STA Use_PPU_Buffer,X
Z, K$ N! a4 M+ O m - INX- T$ m% }$ H/ P5 B, ~
- & `; t4 b, }2 Q$ J
- LDA FC_Music_Max_Index; n K: D0 o! m2 Q0 {/ a
- CLC
0 l6 `# M" u, q. c - ADC #$010 [' k+ o+ ^$ K- G" d+ C" V5 Q
- JSR Hex8ToDec
4 |4 k/ e% z+ p! M D. k$ A -
& m f/ d# v1 c- v, G2 [ - LDA FC_Dec_Data_10
/ d+ `) R, s+ m- y2 C - CLC+ s; y& K' m& y5 O- U' C
- ADC #'0'
* N4 L1 Z- w( w% v$ l - STA Use_PPU_Buffer,X1 B6 q( Z' j- E# _1 {
- INX
: v) |% V6 B( h R0 ^ j* v - 4 t2 d6 f' X4 @) j$ A! ]
- LDA FC_Dec_Data_1
A" C: J- | S! [ - CLC' N0 P8 o% r3 ~: A
- ADC #'0'% ]; T& w, J: K) s. r$ Y. P$ ?
- STA Use_PPU_Buffer,X
* D, |3 @* U7 f" ?, x' O+ C - INX
% c4 R1 y8 U/ S2 N+ [; q -
) b4 ^9 ^) l n$ c/ Z0 V - .End
+ F2 [2 _ t, \5 `* [% Q1 B - STX FC_PPU_Buf_Count' @8 \/ n# }; `( g# f Z# I' K
- RTS b; r& Y" y/ h- `
- # ?* }9 ^: m4 o' W% e
- ;----------------------------------------------------------------------
! X' p1 Y. Q. E5 `$ K2 F' _9 S - ;音乐曲目初始化处理0 m- E* F- o% |5 ^( {
- Music_Init_Process `, k- ?& G. I7 x/ F; K3 L, Z7 u
- PHA
) l; V1 j$ P$ ~2 e) X& j d W - JSR Music_Clear_Process3 u3 b8 n6 u. V; r' W' F' r& g
- LDA #$1F" a; O4 q9 M6 y: u$ [
- STA $40150 i- Y* @* ?) a G8 @
- PLA8 J, J; [; C! i7 `; q8 `
- JSR Music_Init_Addr
8 c& a+ W9 A0 \# v# r+ K. i9 A - JSR Music_Info_Display
, G' z+ G# C/ z4 x" t9 q6 R, ?, p - RTS, }7 E5 T0 U& s/ _! s
- ! z) g' L5 N5 e/ r1 B: f8 `
- ;----------------------------------------------------------------------
# \6 j3 m" U! V$ B! @& F - ;音乐播放处理
7 ?, i2 {! z8 h# Q - Music_Play_Process
! j* A. {/ \* A4 x. x- f7 v - JSR Music_Play_Addr3 D3 J* b7 ]0 ]# G. L1 E7 I
- RTS* p+ z1 G$ R& \! w) T6 r
- 3 R5 r+ J: ~) J% A2 ]2 W: I8 U! Z
- ;----------------------------------------------------------------------
: w0 K' T* r! ?5 _$ r0 r% V6 W - ;音乐播放处理9 Y _0 t: ~' G: S( [8 W
- Music_Clear_Process6 \; }+ T; B5 e4 O% k+ ~3 D6 w
- .IF Music_Clear_Addr, d* D4 g- r2 Y! x2 d% }- [1 m- e" g
- JSR Music_Clear_Addr
! t# E- i, t$ G* ] - RTS+ o3 S% @" V- H8 Y/ q6 Q$ W5 t
- .ELSE" R/ I1 z3 j" [
- LDA #$1F
8 w- A6 @- C8 q: V' n, t - STA $4015
2 ~2 e$ g3 L. @0 o - LDA #$00
j/ {5 h' }( h: D" d - STA $40108 U7 x. f0 O# S
- LDX #$00
- k4 p; Y* q5 K6 `0 c - LDA #$00
$ C$ k; I- K; s, I) O0 _% b -
b) b1 o. O+ p- ] - .Music_Clear_Zreo_Page_0( r# q# f3 F, m2 }
- STA $00,X
! E# a4 K- M$ O. I* O" D1 } - INX
& |" Z$ g# g" A) w" u& v - CPX #Use_Zero_Page_Begin
5 a$ D! ^1 x" Z. Y2 W/ M - BCC .Music_Clear_Zreo_Page_0" y: I! h. G- ]% G5 n6 ]5 z3 |
- 2 d. l F$ z" }2 A1 t6 C0 o4 y |
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
! q# b9 y/ o r. M - .Music_Clear_Zreo_Page_1) s. H0 j- V( J- r. `1 S
- STA $00,X) }+ A4 k8 A1 R7 M m
- INX
" d) @8 e" C6 ^8 g" W - BNE .Music_Clear_Zreo_Page_1
7 H3 a9 a2 z- \5 ^" |5 K( @ - ! I- u1 t1 U q. \2 ?' K
- Music_Clear_Process_1
7 r: ] p: S( u l - STA $0600,X! e; K7 `* b$ s
- STA $0700,X, t3 p R5 k) n/ }
- INX
1 \3 J3 q8 L2 U( T& W - BNE Music_Clear_Process_1
, E. e. z0 M* d3 [# ^ - LDA #$10# ^$ B1 l. D& c! }; x' r& [
- STA $4000
- H- F) j3 _/ S2 z" Y) R" m I8 D - STA $4004
K( b: @% ~1 W$ H3 B! l! | - STA $400C
. S( C" {+ E1 [, ?/ }6 l - LDA #$00
, N8 A! t# s; d& S - STA $4008
l9 n2 ?7 E( W; ^ - LDA #$0F
3 x9 S# z" [# v. @# R - STA $4015* b# M: J% V. T. D8 R8 |' v; b
- .ENDIF
* l) P& Y$ T. l, {0 O8 J - $ D7 `; q0 z( B" n
- RTS
: F7 A. b7 S8 b7 j" f - % i4 g# y% C! G U
- ;======================================================================
( ~! j; Z0 s0 w K: S/ F$ ^3 L - ;重启处理; L6 @/ K* Z: e4 I3 a8 n
- Reset_Program
: I" W- W% @$ s" {: H6 z - SEI
0 i( e- l2 Z! b4 T7 x - CLD' P) R6 i* O3 X9 N6 @
- LDA #$00
. {3 S& i1 j6 H3 D! Z x( {/ O1 C - STA PPU_CTRL4 |% {5 j& ?2 c/ Q
- STA PPU_MASK& F, I: }8 T- k+ W" i2 ^* Y
- STA JOY2_FRAME3 W/ P4 S& M7 b7 v( P- D7 i" W
- STA APU_STATUS
+ i; ~* y/ ^$ j0 m0 l, K9 j- p" R - 4 J) q9 C4 r+ g- u+ l0 _5 I2 h5 ~0 q
- ;等待屏幕准备完毕2 M* {6 @" D6 u1 V: q4 l$ F6 Q4 @
- LDX #$02- O" J& M) |; u- \
- .Wait_For_Screen_Ready
! e" y. _3 ]4 w - LDA PPU_STATUS0 A1 }9 x) o |5 J0 O
- BPL .Wait_For_Screen_Ready: v: T7 z# f) J7 k- W+ Z' E
- DEX
. b9 k( q/ @# A9 [ - BNE .Wait_For_Screen_Ready
) M4 ?$ a' W/ G1 J" p -
# V% t/ ^) P; `* U7 j; F0 ~, k - ;清空调色板& k) p! Q/ w2 H* }( t! S
- Palette_Clear
4 E) L0 x9 _) j- z; k6 i - LDA #$3F
u4 X5 H% f9 I( N3 z' L4 H; G$ y - STA PPU_ADDRESS
/ g3 }7 M' c& T g% ^: L7 N& a - LDA #$00
+ ]+ e7 X" K7 M - STA PPU_ADDRESS
3 n2 H+ Q& N5 t4 `( K- @9 T - LDX #$20$ J6 ~/ P$ G; M
- LDA #$0F
& l, z+ b1 u9 B! H( V' W - .Write_Data
) q* d2 r: L3 i5 e. b+ l$ \ - STA PPU_DATA* W, S" b( [0 @" n% N
- DEX
0 Q5 i8 q- c- Y6 I. p3 e - BNE .Write_Data7 P0 ^' F3 s7 x; H
- 8 z4 I# n' h+ G/ j' L: S; }! s9 \
- ;清除声音 $4000-4013
5 i2 M/ X# N- H( v - LDY #$144 C; {* L @% D& X! [
- LDX #$00
3 k5 I6 l6 s6 j1 Z! n - .Sound_Clear% |6 v+ g! T6 P
- STA $4000,X
- O% \3 X! L9 y+ ]" Q - INX$ t$ e# T# v+ Q- R( `
- DEY6 O% ? _5 ]; | y) {5 V
- BNE .Sound_Clear
% C( Y# s& @# C7 x# i" }# X4 t - / ]5 b0 G- i4 C, h
- ;清除 RAM $0000-07FF2 E) E5 z( ~/ ?- d4 f
- LDA #$00
8 } S+ a# N& u" l. G2 w. T$ L( l - STA $00( s% x- ?- \! n: P1 R
- STA $01* C! o# V; r& }8 e0 {' [7 @
- TAY; t7 ^) h: I& q* K S$ M
- LDX #$08/ L9 D( j T& K/ }! g
- .Memory_Clear
8 h9 L2 H1 ^) x9 j ?& F! V - STA [$00],Y. j* u& \. j' o3 S/ u" i
- INY
0 u- W2 U& W( m. s% U3 B r - BNE .Memory_Clear
) P! }2 `0 i, ? e/ y( I( ` - INC $01$ g4 W1 l3 x: d" j5 ~
- DEX2 t; h: O1 a. ~* I0 _3 ~
- BNE .Memory_Clear
5 R! ?. @# P4 l5 R3 _5 D x - ( V5 k$ v! `$ D
- ;精灵缓冲初始化6 ^- ~. Y5 j# n9 v% B
- LDX #$00
' `8 n! _3 j8 R3 D - LDA #$F8
* P9 P, g, g; s8 v( q% g% r - .OAM_Clear- W1 r% T4 S: C2 O+ t
- STA OAM_DMA_Buffer,X
* H; W2 C) B0 { - INX0 {( x1 O& Y4 ?$ Z& W: r" U& i) l
- BNE .OAM_Clear
6 y+ ^6 L, _$ F( S1 X e/ L. Y - 3 ~; m1 c/ `5 s) u; `
- ;栈指针初始化+ N. v" E# g" T. S5 D y5 |
- LDX #$FF; C- O7 K. k/ q! ?, A; M
- TXS) R% L# l0 x+ `' x! @$ T+ N7 |0 v
-
. V; f0 F* d- |8 ^# S: u - JSR Nametable_Clear;命名表清空
' B: m8 f( I: } - JSR Palette_Init;初始化调色板缓冲
6 O8 ?$ n! ?2 {& I - JSR Static_Text_Init;初始化静态文本) U/ n/ O* Y# j# M6 C; S8 F
-
( f0 E- A' G" L/ f1 n8 C - LDA #MUSIC_ITEM_TOTAL - 1
6 J/ [* G g) Z6 d - STA FC_Music_Max_Index
8 t0 F/ W& \; \" N- C4 j2 H+ t! Z - ( h: W7 i+ [, |) E( m; [$ ~
- LDA #$1F
" s ?6 g }( j1 g- F5 i6 U8 m - STA APU_STATUS
$ z- d) `" g7 _" Q* T1 z, T - LDA #MUSIC_BGM - 10 i2 v$ B+ {( ^/ a: e! c
- STA FC_Music_Index
% v0 n- ?4 Z9 u2 W& m* X7 j8 M# p; V - JSR Music_Init_Process;音乐播放
. M8 d6 a+ ^; d% K4 n6 a5 s# I - 5 M9 h5 R9 w' I6 X% b
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 j( m# ]& X8 X& u7 x; E. Z0 ]( x - LDA #$1E
5 _7 @$ J% o1 |: _$ V - STA FC_PPU_Mask_Buf3 ~& ]+ Z2 n2 l8 C( a: d
- 2 K% ]3 Y" v/ J- w" r i
- ;启用NMI处理! T- |5 X* w5 i3 m! w$ U
- LDA #$806 w0 t2 s% `0 |, a
- STA PPU_CTRL
: C7 Q+ ^3 D( ~" p - / R% Q6 p8 c3 U2 B
- ;程序循环, 剩余工作交给 NMI 中断处理( n. @5 e- L" w
- .Loop' F0 T$ E7 h# g8 b) K, {1 V0 W
- JMP .Loop9 S% ^( H: p2 k4 ?
- 4 `2 F9 T; }) `( {6 N9 i
- ;======================================================================& I3 Z) z+ M# f4 b; v/ s& _: S
- ;不可屏蔽中断处理
* x7 p+ w8 F( k4 e- I - Nmi_Program! z; r( j' X0 O
- PHA
0 s& y6 v' d; \ A - TXA% ^0 |! N/ G; i% b7 C3 V
- PHA
" Y) L5 t9 W* n5 T - TYA
) ^4 W& O' O# R+ }3 B; Z. v6 R - PHA
4 q. x* x( `; o" P - 8 r! s4 E( P( |' i& C. F
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( I0 r* R2 F$ {8 y7 j( W - 0 v$ U1 v/ w1 Z
- JSR FC_PPU_Procrss;PPU处理) p. S7 c* x; w) ]
-
; |2 i+ D: A7 T+ P - ;精灵内存更新
% G y9 Y& I2 v# {$ | - LDA #$00& B) |9 C) K+ o, b
- STA PPU_OAM_ADDR f( N, I" c8 A9 ^( I! t( l/ ?9 r
- LDA #OAM_DMA_Buffer / $01004 k e2 b# N: ?
- STA OAM_DMA6 P! z- _# a6 Y5 n
-
+ a! Z4 q1 U7 T7 r - JSR FC_Gamepad_Process;手柄输入处理1 B8 r' T8 p) O5 d y+ M4 O0 d7 n( N$ ^
- JSR Music_Select_Process;音乐选曲处理
% a* L2 l' C- S+ X) m3 @ - JSR Music_Play_Process;音乐播放处理
% V9 M* N( o5 m2 q& f6 X& N -
n) ~: {: z! V3 ^4 N - PLA
" W7 `$ O" ^8 }1 l5 l( f% l - TAY( m m o2 m0 G+ K7 F3 J
- PLA
7 s! k* K5 x7 Y+ s$ O% F; C - TAX, |# p! U% ?! J I7 W
- PLA
% p. C/ }% r: e' x. l/ E - 7 h. C4 l2 H5 s# m. A# M+ {& f
- RTI5 u0 f/ c j7 O* d) y1 u
" s7 ^# I7 j4 D5 p- ;======================================================================
2 }) l- l4 m) h( e - ;请求中断处理
: f& Z A& y2 P - Irq_Program& F, R9 D. S, w7 l0 Z, k( I7 V
- RTI
3 F! I8 d8 O# ^0 L
" d4 x& h$ E# x- ;======================================================================
! W7 E" D* ~/ |0 A$ t. G% a - ;中断向量表2 w9 \8 K: F8 W: g: ^
- .ORG $FFFA& ~+ S3 W* T$ ~8 d, l
- .DW Nmi_Program ;NMI触发时执行
/ H1 s+ Q4 L; e# O - .DW Reset_Program ;载入ROM时最先执行* W( E) v8 h1 B# ]8 [
- .DW Irq_Program ;IRQ触发时执行- Q! j; r: s& U+ N2 `
复制代码
/ I @, ^' H+ ~7 x) P- T) ~
+ \& H x, q9 e: i' B: ?0 z6 i r* S, W; @+ b8 r4 T
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|