|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( M5 E, |1 T* \( D" j ~- Z6 X0 g, m 0 y( q9 {% z' ~8 j% P5 J+ D/ o5 |
以下是主框架代码:/ N. ^; @: {* P! s" ?0 h3 a; [
- ;======================================================================+ x8 @% j! m! c$ u- A6 j" V6 X
- ;文件头4 F i3 y( [5 H' c* X' J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; ^- f5 Y- ~& x' N$ U9 z" z) J
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 H6 S' G2 j" |
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码+ t$ x$ p! D* Z T" y( G' O
- ;======================================================================
6 A) O/ Z2 R$ O! h# C! { - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2- G# L1 y$ x9 C+ ^
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1: e0 Y R7 w+ U- J6 x1 C' E S
- ;======================================================================
( n: k9 [" D2 ?" p" s- c* y8 } - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
% O n, }8 R8 x& V2 z% }; D - RESET_ADDR = $E000 ;主程序起始地址( l& D$ S9 c% B, A9 H
- ;======================================================================: P' Y6 s" L- c! M1 H* ~1 H2 @
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) p! ]! M$ g2 j! X
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
' D2 E% O9 h% ?3 t- H' J2 { - .INESMAP 4 ;Mapper号 (0-4095)
3 O. v; h. l/ U6 G. C( x5 g - .INESSUBMAP 0 ;子Mapper号 (0-15)9 Z. a, w5 h. N- l, C i" r$ U
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
) y$ j: w0 Y+ x4 U% u - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)8 m/ u/ i( K/ m, X! S+ D m" d( g
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数) h* ~! |# ^( R& D
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
( n2 _, I6 o! V" Q! E# p - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)+ p! j* N/ b: \6 G8 f
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- F7 ]6 i- @- K0 G
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
1 [+ }8 Z7 C% ? - ;======================================================================
1 {7 ~0 x6 R3 W' s6 {: v, e9 H; Q - .INCLUDE "fc_demo_config.asm" ;全局配置5 E5 {) Z* F) s3 ~! V0 K) g
- .INCLUDE "fc_demo_constant.asm" ;NES常量
$ h( v+ n U2 L# c; O! w$ c9 s - ;======================================================================
% e! c. V- t8 K; m+ l4 G( S - ;音乐配置
- C! z* ?% q0 x3 P# D: O& a - .IF 0 = MUSIC_THEME 5 p( h3 X( L9 l) |
- .INCLUDE "data/music/Gremlin 2/config.asm"
4 O& y+ u+ Z# E - .ENDIF5 s$ a. d9 I9 v9 ]5 w4 c l
-
+ `' H7 E0 o5 \+ c - .IF 1 = MUSIC_THEME# B$ ` G+ I2 V+ Y* u
- .INCLUDE "data/music/Raf World/config.asm"
2 m! k. Q/ Y- k/ y% J: _ - .ENDIF4 J* `/ I1 \7 U4 [6 H9 J
-
7 }2 e' ~1 ^+ @/ o* P+ o9 } - .IF 2 = MUSIC_THEME ; D3 [4 H! |+ p
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm": s8 s8 _6 B' b. |: y
- .ENDIF
! s2 s0 y& G# j- v: k/ E. i
- W/ h+ |% w2 m% q" z& B0 H- ;======================================================================' i4 B4 Y0 v, a$ f7 P# n) b7 E
- ;引用CHR图像数据# V2 Y' d7 a. f1 p) A
- .BANK NES_16KB_PRG_SIZE * 2
8 ?6 A$ @ V' U i - .ORG $0000
/ N% u9 u$ U+ M2 N H: V, K - .INCBIN "data/bkg.chr"
# Q. b+ y6 w8 X( {+ Z4 S) O - .INCBIN "data/sp.chr"
% x, l! r2 U" f) T, B - ! ^9 m# x) g/ L) R+ |9 E5 ~
- ;======================================================================# ~4 K& l9 A: \% F
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank. R# h- S4 f$ H3 T6 a$ w, j
- .ORG RESET_ADDR
- m8 A' E0 ~; G2 ] - ;======================================================================
& Y: Q2 R& T# Y! i - ;引用其他源文件
D# v( o9 a) }+ ]1 z - .INCLUDE "fc_demo_ppu.asm" ;PPU处理7 ]+ Q5 F2 T) W+ U& o, r- T
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理/ v- ^; a# @# O$ a1 K+ V3 g1 Y5 b
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理$ \( l$ X5 X5 w4 y
- ;======================================================================) E* @' r* Y8 I9 |
- ! b6 |% [7 _7 T0 u. t6 |
- ;======================================================================
3 o+ u4 i5 i8 `# I2 d, \ - ;等待VBlank到来" ?% k( H. Q, o% s9 d5 \
- Wait_For_VBlank( i. P% ]$ E" \. ~; O5 o
- LDA PPU_STATUS8 @. F/ P2 L9 M
- BPL Wait_For_VBlank
$ X# Z/ I1 F; Q! A5 Q/ ? - RTS
3 E4 ?& L0 g" V ^8 K
+ [& G4 ?( n2 `2 w' ?- ;======================================================================* O M2 l V! D( Z% m+ V' u+ w
- ;调色板初始化% g/ P9 j" V/ E1 F* o2 g
- Palette_Init
/ P; R# U- Q) \ - LDA #$3F# |$ G' Q8 I" E) S9 F0 R5 @: o$ ^
- STA PPU_ADDRESS
) H( R) K1 I7 L* s: F- j; S - LDA #$00; L; b) Y7 G. W! P
- STA PPU_ADDRESS; Z# w- R$ ?( C4 j, k
- LDX #$00 a: }/ H8 f( F! Y3 \
- LDY #$20) @8 u& T9 Y7 [% O) L
- .Write_Data( i" ^* B" E+ B/ n- f$ }- i
- LDA Palette_Data,X
! K3 T4 u( ~4 I' D - STA FC_PPU_Pal_Addr,X. V6 p# f3 {2 O4 B) e2 n
- INX
0 T- _( n: o1 j8 p8 ?7 a8 j - DEY
- u0 `8 _. x. Q6 r. G' ] - BNE .Write_Data
+ x8 \: e( g/ n1 l3 B - .End7 x5 m4 B/ `. {2 ?" l! l+ a
- RTS G/ b' d+ @, k/ [5 O# z+ A
- # M& q7 X2 Y" s1 y
- ;----------------------------------------
3 p6 }) \& o& y& }( i1 x, _ - ;调色板数据; Q# z4 l4 s0 Q3 e
- Palette_Data% `% `" f$ E. z: Z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B4 q8 l' m, v' U5 {4 w% u7 g
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22+ U/ v" G& Z+ b, N! h) L- e4 F
-
$ F1 g8 Y! f8 @" ]1 | - ;======================================================================
) L0 R9 L! Y4 _5 [, z# _5 i' k - ;命名表清空7 v& R' J3 G9 b/ t) w2 E6 P, U( c" G
- Nametable_Clear$ q1 s$ ]& B# b3 z8 I, E
- LDA #$208 F- Y g/ u% l, q# D
- STA PPU_ADDRESS/ Y/ y+ D& q6 v5 y I" G0 ]8 Z
- LDA #$006 o5 o' P3 ~: U* i3 n6 b( _
- STA PPU_ADDRESS
+ q" l4 d# n- u- c( W - LDA #$003 }, B! W6 F1 c! N% B2 v
- LDX #$00, G( C9 r) P# D H: R5 m
- LDY #$08
. {* w! S& U5 ?. h - .Write_Data2 y* V# v, l, G* X- O* ]
- STA PPU_DATA
' H- X7 L& x9 j - INX
& X7 d7 S& k& Z: ?# g: L, z0 f - BNE .Write_Data
( }$ _" N$ Y1 s$ T! p - DEY
6 ^2 E" k! A8 N; l# m - BNE .Write_Data' x. g! R3 D+ S5 a* a" v% U) g
- .End+ Y+ O8 M" O" T' {
- RTS- n. m4 N7 A* M. A
5 t* Q+ Q8 X/ f! i7 O9 D- ;======================================================================2 ^4 G& x- j- M$ F; h8 g- k
- ;音乐曲目切换
$ s0 q! p4 C- C/ x) E' B6 R% | - Music_Select_Process
- [( K6 ~3 E" t; V" B# |2 c
5 s) t3 x$ a& M- .Pre_Music;上一曲, o* r, f/ p( U9 ~$ i: c
- LDA FC_Gamepad_Once0 d; ~; s, O3 z% R1 h
- CMP #JOY_KEY_LEFT
9 l2 @+ m6 V; \( R - BNE .Next_Music
5 n8 V" p+ i' D5 F/ X! | - JSR Music_Play_Pre$ w6 ]6 ^; X0 D1 J1 P" v
- .Next_Music;下一曲( A* F. ]1 `! o1 t/ }- ^$ L
- LDA FC_Gamepad_Once+ t# l1 H- j+ y9 D0 o0 P
- CMP #JOY_KEY_RIGHT7 I9 y% r$ z- t
- BNE .Next_10_Music. {/ a) e3 O5 A0 y1 I
- JSR Music_Play_Next
9 T- Y. _% K; K8 Z - .Next_10_Music;上10曲* \3 R; U% f# E8 ]! V) ^( z" N
- LDA FC_Gamepad_Once
' S+ Q- w0 Z; `$ j - CMP #JOY_KEY_UP
+ I8 R+ o. X0 d; u - BNE .Pre_10_Music
% B. E- d& {- V7 q/ O) I - JSR Music_Play_Next_10& |. t9 \4 J+ L2 R
- .Pre_10_Music;下10曲9 Y! f3 m! B2 s4 H _8 B% L
- LDA FC_Gamepad_Once
1 n( T0 o( e$ u! c2 E - CMP #JOY_KEY_DOWN% |" q$ s' {5 z! W; F5 I
- BNE .Reset4 v! c: }/ @/ F H8 a+ o
- JSR Music_Play_Pre_10
- z$ B. g; v8 L) _/ Q/ | - .Reset;重播当前曲目" B* o: v9 k# I1 O. k
- LDA FC_Gamepad_Once; b9 B; L- L/ m6 C2 E
- CMP #JOY_KEY_START
" k7 P5 Z( G: |. Y+ F - BNE .End- t/ ^, X K6 q- B8 d; A& }2 V
- LDA FC_Music_Index. a( X+ b% H/ N: A1 `/ }
- JSR Music_Init_Process
0 a+ P" d& ?# j' q6 D - .End
+ ]3 U8 S1 v+ c' j - RTS# [* n6 k( m2 |+ y
4 W& K& }; }( r- ;----------------------------------------------------------------------4 G- G% O3 \+ M1 t
- ;播放上一曲: X X$ t( @2 ?" R" D
- Music_Play_Pre( G1 J5 N& W3 H. m2 v' ^
- LDA FC_Music_Index: H! _& a8 d" j$ a# K6 \3 I
- BEQ .End
1 F7 f4 i4 [2 s S) X3 n - DEC FC_Music_Index
+ } {5 F' a: R6 D+ Z) } - LDA FC_Music_Index; z% T3 t) L u/ M( {
- JSR Music_Init_Process
7 I7 e' b/ W7 }/ c% c. [3 j - .End7 ~& ]4 I" ^& N4 Z! F
- RTS
7 Q# ?1 m* n, R; }) v. D+ m - ;----------------------------------------------------------------------
. I# D+ ?9 f3 Q1 H - ;播放下一曲( i u% B9 i, d1 O* A1 o$ b& ~+ u2 g
- Music_Play_Next/ T; i8 w# S- e2 C& P
- LDA FC_Music_Index C/ v& ^! p% g6 u8 _& i+ i
- CMP FC_Music_Max_Index9 L; J0 j' D8 b3 u# a0 c
- BCS .End6 @* \3 C$ S) |+ c
- INC FC_Music_Index2 }0 Q0 g0 ?! g6 Z( f
- LDA FC_Music_Index
$ L+ ^' q/ Y9 w8 N - JSR Music_Init_Process
$ S* H+ e: c+ f" r* c - .End
$ X8 r. y( q5 ~) } - RTS4 _/ w% U+ @/ T0 {
& m$ M" v$ Z/ @! B) }9 J, E4 O- ;----------------------------------------------------------------------2 \2 l) I) b. C! j: r& l; E5 ^
- ;播放上10曲
. ^) S* x8 Z* C' H - Music_Play_Pre_10% F ^) ^" G4 |" y" `( \
- LDA FC_Music_Index
" K( [" E0 F f: e! _/ s1 Z - BEQ .End$ _1 G3 y$ t' K) w& s
- SEC
0 D7 Z! Z; O6 H& V; G - SBC #107 U5 n$ b$ T/ q& H8 W+ z
- BCS .Pre_10$ O: G h1 R& v$ ^5 [' P2 ?: X
- LDA #$00( D- v. U( t- c* ^. {, W0 ]
- .Pre_10- S: y3 U) r) ` c; g' q& {. ~" L! Q
- STA FC_Music_Index5 E( M3 K3 a. t
- JSR Music_Init_Process( }5 P$ q8 Z, t* n! B( L! P2 [
- .End/ a, a8 k2 {' o8 M! \5 _
- RTS
) }* W6 {: [( ?: g$ t1 @' S - ;----------------------------------------------------------------------8 S# `" b0 D4 g7 F U; }
- ;播放下10曲' y6 _' D5 `$ `$ R! f6 b
- Music_Play_Next_10
% ]3 w" d* f5 L% ~% Y4 T - LDA FC_Music_Index
) h( ^/ X& y0 {# p) p% H - CMP FC_Music_Max_Index
8 _7 ~1 {- V$ S+ a - BCS .End
' V% p4 D- V2 b' O' E: F - CLC
6 F2 h P. a( u# g' \ - ADC #10- O6 F5 w8 T% v- V$ P
- CMP FC_Music_Max_Index
9 M, y. A0 u0 V6 u% f - BCC .Next_10
$ C* O& X* K5 f4 O, V- L) V - LDA FC_Music_Max_Index
' Z8 T% T7 |4 x/ E+ ^ - .Next_109 l$ u5 ^% F% m
- STA FC_Music_Index
# W5 [% E! z, D2 A - JSR Music_Init_Process
0 f9 o' M/ c _: L - .End. l: r' i- A+ f# n0 V
- RTS# ~1 L% O+ z* |/ \6 _; o* ^( R& k
" [0 K+ S T9 c: d- ;----------------------------------------------------------------------$ H, x8 ^ r# t0 f: G" r+ k
- ;8位十六进制转3位十进制制0 N m" M! [# u% n% ~% \! _
- Hex8ToDec! Z0 a& M2 C% v
- STA FC_Dec_Data_18 ^ q* i; O) k2 h1 o
- LDA #$00/ S/ D8 s2 \ B- f3 P0 Z% v
- STA FC_Dec_Data_100' R: W0 ?/ |) C
- STA FC_Dec_Data_10
' |# W, v9 \! ]$ d g8 F - LDA FC_Dec_Data_1
/ z- q+ E, r! G1 _8 ^2 }4 p - .Convert_1000 \: y7 B- G) R, m
- CMP #100
5 B. l0 @4 |6 S3 p0 r1 w - BCC .Convert_10
' C/ m; b- ~0 Z y5 ?+ l - SEC; l4 S5 b4 p6 [5 G/ W
- SBC #100' e. ]$ w* i: e" ]; U
- INC FC_Dec_Data_100' F0 Z. w8 |* t& S# A
- BNE .Convert_100: e. A% J: N* R* q+ s* U5 c# D4 \
- .Convert_10: }3 w9 }3 z8 @( E
- CMP #10* L! ]% D1 X- N) \* n
- BCC .End8 x3 G* z3 L& T- A! g7 N
- SEC
! ^. V" [# ~% m( C+ U/ h! q - SBC #10# M, x: f( g: w2 V5 k* E+ ?1 R
- INC FC_Dec_Data_102 P/ R5 ]/ ^$ ^) X) ^% X' O
- BNE .Convert_10; T4 E: i! u/ c1 a! g
- .End4 X+ d4 d5 Z" b" M1 V) u' U z9 ^
- STA FC_Dec_Data_1. q3 `5 x7 ] B+ Z6 g4 T* t
- RTS k' ]0 t7 Z/ L7 @1 A9 G
- 8 ~1 {$ U; x5 F5 w8 l. L t
- ;----------------------------------------------------------------------" j8 C, d' R o8 m2 |
- ;显示曲目信息
. e$ `3 g @% C, A, i - Music_Info_Display* z1 l% U, e& L* L2 p' R. l
- LDX FC_PPU_Buf_Count
5 F7 Q7 L! C1 x. e8 m - LDA #PPU_WRITE_MODE_CNT_LINE
7 e( |0 h3 W, A) P& p6 f - STA Use_PPU_Buffer,X
0 ~0 m7 U+ l6 {) a$ T4 e - INX
6 G* [8 x! _9 A& V! I& i -
7 K5 c X2 H) [ - LDA #>MUSIC_INFO_POS
* q4 ^$ O6 }) r4 p& N( G- ^9 o+ x - STA Use_PPU_Buffer,X
; r r1 `" i5 t - INX: ~7 H7 r. }3 F6 h- [
-
( z; ?, Y" w4 f4 N6 ]" a - ;居中
/ S0 I) j0 U$ ]1 R! t) P - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 N. H9 s0 h# ]; l. q7 A2 I- T
- STA Use_PPU_Buffer,X
3 C% V6 B4 Q2 n - INX7 T: y7 s( {, \- G/ M7 [% x5 U" M
-
, {, {; p g5 W; n- b - LDA #$05
" X$ z) ~9 `! ~7 ?+ [# b }5 X/ y - STA Use_PPU_Buffer,X/ k' H- t$ O* m1 B" ]2 U
- INX& E. S" |% [' v- D3 v# _
-
, F7 R. Q8 k7 C/ J4 |" v - LDA FC_Music_Index
I& K4 X# O# _1 k% R6 t2 H - CLC" |6 Q1 s$ s8 n9 V/ d* e0 i0 a
- ADC #$01% n7 R% A- }6 [4 V+ P
- JSR Hex8ToDec
0 y0 c7 F# P/ l0 g6 r; G( s \7 G -
8 `' i) v) K$ b! C* W/ B* M" } - LDA FC_Dec_Data_10/ D3 ^+ I3 Q6 x Q7 \: S
- CLC, E1 t: u V" D, Y
- ADC #'0'& R! J S$ d# ~
- STA Use_PPU_Buffer,X
) f. j$ F* p+ J: o' p3 [, b% D - INX/ D( _& b+ z5 F! i! n: X. G% v* {
- ! w; E: ^$ S6 ^9 R9 [1 R
- LDA FC_Dec_Data_17 q# Z Q$ {' r2 s" w, N/ _" U
- CLC
1 C( i8 ^) C, N) W5 c* y2 T3 \/ o - ADC #'0'& d6 ]9 [7 J1 N" Y# q
- STA Use_PPU_Buffer,X
/ \! F; Q/ J% U* {( c9 U; P" d* c+ { - INX) ], Z- i6 Q! O9 ?; \% e( }3 f C3 w
- 4 _8 s, n5 z4 z7 G; A
- LDA #'/'$ c( ^7 u* K7 q( b# |/ _
- STA Use_PPU_Buffer,X
; A0 c# r: M, a2 n+ B - INX6 M$ K i# u/ z5 K; O: o6 H! P. i
- / v7 s# c# J# [
- LDA FC_Music_Max_Index
$ n! o7 k) c: b( |9 P2 t - CLC
2 f3 | }& a' u. m: o/ G - ADC #$019 ^9 c- p4 q1 B/ e: ^# H
- JSR Hex8ToDec
- y2 [% f& p$ `( u6 Q5 ? -
/ I8 B- c4 p5 d5 e$ W - LDA FC_Dec_Data_10
6 b! o( d8 l3 b' q% _ - CLC, ~' n% ]9 y; t1 U, G0 c& C
- ADC #'0') U* X% I6 ]$ G/ z8 H m8 Q
- STA Use_PPU_Buffer,X
3 O& V- G3 W, G* w7 ] - INX
( R& U% f0 a; s( P& ~& _5 S7 t$ ] -
# X6 l& }& }4 m D0 n. r - LDA FC_Dec_Data_1; x' d( t$ h" L
- CLC
# |3 |# a# ^+ [: a - ADC #'0'# G# t& k$ w; `2 ?
- STA Use_PPU_Buffer,X7 ?3 r: X, c, U2 v1 P. q: c8 `
- INX! Z( N, [2 X: G
- 2 w+ p% p, G- T9 F0 E' m1 f2 Y- p( j
- .End
" ~, v* B/ ^2 J( B1 z# C - STX FC_PPU_Buf_Count
l, d+ J0 C8 {* g7 {4 i8 B - RTS. y+ t8 \; n. L, F3 l
! k9 o7 B- e" u8 y8 Y% g8 X- ;----------------------------------------------------------------------9 r* n9 Q- B& _! R! g) T$ s3 u
- ;音乐曲目初始化处理
5 X+ O1 K1 b( k* c" L. F - Music_Init_Process, e' z* f5 i* a3 @4 v9 _
- PHA7 S8 m( U6 a6 B6 \ [' \1 K
- JSR Music_Clear_Process
1 C/ w( v; D5 Z& o9 k& [' v E - LDA #$1F% r# \& h2 `% G
- STA $4015
( k( W4 c7 N4 s/ ]" T - PLA
% c- K, ]0 s9 g D" Q% \6 r" ?! @ - JSR Music_Init_Addr
' ?0 a6 d# X2 m0 ? - JSR Music_Info_Display
1 @" R% B' Y% J - RTS4 F% z' f$ b& p! K! f
- 5 m1 b1 ?& r* q
- ;----------------------------------------------------------------------8 u s" F( c' Q0 F
- ;音乐播放处理: v- M5 g& w, {' j0 L' P( O: y W
- Music_Play_Process
3 v/ S' u* q! G' i) ~ - JSR Music_Play_Addr8 C, @1 ?; p2 R% x1 _) o; C% }% d
- RTS
/ m0 d7 y2 l+ }2 z0 j$ S) k0 s - , p) L! [0 V* a
- ;----------------------------------------------------------------------9 x) E. P8 A8 k$ \) @
- ;音乐播放处理
}; \- W7 o2 K9 c - Music_Clear_Process
0 |( F! d. V" j$ u7 Y ` - .IF Music_Clear_Addr2 R2 U" D& K1 G. g8 \$ x5 x( H
- JSR Music_Clear_Addr; ]$ H" ~ ^/ n! w9 `
- RTS
! n: u/ B3 D4 T- X; L8 a7 {; L - .ELSE. z4 h- N- [! a! {9 t" Y
- LDA #$1F: `7 _3 _! W" x+ U8 Y
- STA $4015
3 n+ |$ f- H( X2 U - LDA #$00
7 z8 X0 q- c- f0 T1 p# K4 n - STA $4010. v: _7 w$ I, K/ N3 A* }+ e2 I
- LDX #$00" z- A) z" O L& m
- LDA #$00. ^9 R ^1 j* q! g
-
5 ?" G a7 ^. X - .Music_Clear_Zreo_Page_0
8 T4 J/ E) ^: @( N - STA $00,X% h8 c: ?; u/ f, N# j4 Y* Y. T j* r
- INX
" N3 z) i9 R/ I; o. R - CPX #Use_Zero_Page_Begin$ B6 X- m) o# a9 G% V3 L
- BCC .Music_Clear_Zreo_Page_0
% C2 h. o2 |5 T) X* p0 w -
0 s/ y/ R7 m! D! I - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
8 Q. v: i' Q# k, B* z5 x0 r- X. m - .Music_Clear_Zreo_Page_1
- K( G! i, N# n) A - STA $00,X5 L$ c7 F6 k( s" c! d
- INX" c0 M) |" y* ^. Q! H, F- n8 ^
- BNE .Music_Clear_Zreo_Page_1
. J, }! j; V8 W* v4 g - / Z6 M4 z( I% `0 d
- Music_Clear_Process_1
: T* K% y# R) s* g - STA $0600,X
- `" J7 w& @% C+ _: H - STA $0700,X
1 m# o Z' H" @: j/ W - INX/ J9 M3 `- x$ {8 Y3 x
- BNE Music_Clear_Process_1' U4 E1 G% U7 D& E; N
- LDA #$105 ^% |( S# i9 P4 W3 }% m( u
- STA $4000
0 k4 o$ c, P6 o9 O% h" }0 }) @2 q; r - STA $4004- Z3 U8 R+ F4 {' |6 O
- STA $400C
/ J& p1 ?. q- Q - LDA #$00
) E+ X( t' A: p - STA $4008; s0 [$ ?* c2 o4 }. D1 t
- LDA #$0F W0 F! A! k m$ g2 m8 m
- STA $4015
) w% Z' }* W5 l& A) | - .ENDIF7 J( l" _! b" f
- 8 @4 }5 T: O5 e
- RTS
4 R" j- E; t7 A+ u - ! d7 U! r4 z3 C) b
- ;======================================================================9 [- d0 l2 V/ ~5 E. q( i5 J, f
- ;重启处理
; V/ E. y. q7 k5 D9 E% T - Reset_Program1 ]5 j- f5 ^" M9 x4 _7 m
- SEI
# y5 j T, d' Y! z - CLD
- Z# F& X* N4 J) q$ F) G+ {4 | - LDA #$00
, W9 x# G6 ]8 } - STA PPU_CTRL) \( i1 V2 H* \$ h- |
- STA PPU_MASK$ q; s, T5 I2 R9 S' m
- STA JOY2_FRAME s& S! S* q! y! H) A
- STA APU_STATUS
+ x% x7 I, L. E; s( o6 ^: x/ D3 \ -
# P+ C" J1 l; _$ t" V - ;等待屏幕准备完毕
8 c4 d0 [2 ~! k- ]2 e3 o# }6 z - LDX #$02. f6 q( {& w. K7 g% H. n' }% ^% P
- .Wait_For_Screen_Ready
" u. R+ {2 Z. {2 b- w - LDA PPU_STATUS! P8 Y& r6 I) {4 g! P p3 @
- BPL .Wait_For_Screen_Ready& ~6 O Z+ w9 T/ z F
- DEX
: q# [$ P; h3 T t - BNE .Wait_For_Screen_Ready
1 p8 P9 h* a* s" M# U/ ~ - : t( z8 d) h. n, ]# ?/ V% R5 {5 n7 e
- ;清空调色板- h/ [9 \/ q, u' _1 ^' y
- Palette_Clear
" r, A3 S9 Z* ]& R' c - LDA #$3F
& v( p' C z+ \) I2 K1 u( r - STA PPU_ADDRESS! X) P; _5 G1 d4 L; N1 i
- LDA #$00
; l5 B& q1 @% y; G7 E( d - STA PPU_ADDRESS
" B) a" \# }5 r! ]1 {5 g - LDX #$20
/ ?7 M. c7 q/ _. C9 | v2 ^ - LDA #$0F
% ~7 K& E. g' n( n9 x$ u& \ - .Write_Data) o, A8 |" u! {. P% | N0 _' o
- STA PPU_DATA" f9 r# J9 z5 |1 T
- DEX
8 s2 X4 y0 [. N* F2 c' z | - BNE .Write_Data
9 [3 d4 Q% G- y K8 m$ O6 I
! b: S7 N; _- A* v1 o- ;清除声音 $4000-4013
8 U4 q+ n9 x. ?8 L2 f# p% i - LDY #$14$ k% V4 z5 d/ n
- LDX #$00* Z. e9 l: F% U' Z# E9 c& k
- .Sound_Clear
' s j+ C! ?7 |* |% T1 T - STA $4000,X
- n1 p# N# y( c/ s5 l1 c - INX/ q6 d7 G' a* {9 |, H! j
- DEY
$ k8 S: A) ]) q: ~1 ^ - BNE .Sound_Clear# G5 a& V- I5 `4 w2 s
-
/ x2 c# d" j8 y) V- N - ;清除 RAM $0000-07FF
2 H$ [& Z# i0 u9 E+ w - LDA #$00+ I4 R% Q1 R$ r
- STA $00/ T' Y" ~$ e1 _ l5 b
- STA $01% m' c9 i0 h4 D/ i
- TAY1 ~$ e$ M7 v; Q* u$ z
- LDX #$08
! M( H; C& u( \8 {4 m8 \6 D - .Memory_Clear- Q5 ~. c* }3 a4 G
- STA [$00],Y5 b6 w g. \/ [5 D
- INY
. v9 Q% X ~. I, ]0 s - BNE .Memory_Clear" p' S8 R! L" q$ P+ L2 S" g
- INC $01
+ L# X# k0 ]+ K& i1 G4 d6 ] - DEX0 s4 i! \, C4 g' y2 h4 H
- BNE .Memory_Clear/ L" T$ t4 |0 ~+ g& d6 b0 F$ H( |! y4 M+ F
- 6 m' \' z* Q6 w- v# d4 {/ k8 l$ O
- ;精灵缓冲初始化0 g, `$ m @" ]9 Q4 V2 D
- LDX #$00
' p: V4 j% C, w4 d$ ] - LDA #$F8
0 c& Q( ^: Z: ?- R - .OAM_Clear, k N% D; I4 x5 c3 X( I7 r
- STA OAM_DMA_Buffer,X) K3 m7 V; @6 o1 ~1 c0 K; I ~
- INX5 I. k, a3 Y7 Y
- BNE .OAM_Clear0 a Y( h1 {9 }
-
. o6 u. D5 ?* p8 S - ;栈指针初始化7 j* ^9 ~7 C3 K
- LDX #$FF% a x* S* c! @* s9 A
- TXS+ q/ O) n/ h9 u
-
& [) H% z" R' B - JSR Nametable_Clear;命名表清空# C8 N" J& M4 P4 b5 _- p
- JSR Palette_Init;初始化调色板缓冲4 _4 E% B, b; i5 S" a G
- JSR Static_Text_Init;初始化静态文本 G+ K: Q7 x: t& k
- 2 F! w* c! H9 P8 c, R# ~- e
- LDA #MUSIC_ITEM_TOTAL - 1
, U" E5 b4 g+ `& D2 S+ y1 [ - STA FC_Music_Max_Index
! K! [; B+ n7 ?3 i8 r" V' ^ - 0 g/ } u* w; p
- LDA #$1F7 Y. d: P! O& q* y1 A! k. B
- STA APU_STATUS
( D( ^$ C! C' x1 `. m) O - LDA #MUSIC_BGM - 1
. B: j" T/ b+ `# U8 h: ~ - STA FC_Music_Index5 J) u% q9 l6 H- O( v/ ~! \
- JSR Music_Init_Process;音乐播放+ E1 X1 W" b/ C+ L2 t- X* g
- / ?+ C. {# x, H
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态), y9 w3 Y" I$ g& e/ t6 `% x- q) C
- LDA #$1E
6 ~* a! o1 k8 R6 A - STA FC_PPU_Mask_Buf
`6 Y7 D5 v3 o/ f: ~3 o3 {. ] - 4 ]8 ~' d) j& M, B$ t
- ;启用NMI处理2 z* T% K, R3 _9 c' t
- LDA #$80 U. O, J) W5 F4 `' _
- STA PPU_CTRL
) v E( k% S; B7 I1 J* Z -
% o7 L/ W; |" n# G0 O$ F - ;程序循环, 剩余工作交给 NMI 中断处理1 g% P C5 \% i$ a6 {
- .Loop8 `5 M1 Z& Y1 C, ]4 \5 \' p7 _5 y
- JMP .Loop; G f" F( Z' |/ `
* D$ B& l* E# ^: @- C. r- ;======================================================================; E% b* ~% ~! \! V' s& p
- ;不可屏蔽中断处理
3 C/ e* P5 @' e7 Q& X: n - Nmi_Program9 ^; [7 B% u! a6 Z: l7 Y
- PHA1 @. C8 C6 f! w( y+ {0 _
- TXA( [! Q' }4 |" G4 e8 X
- PHA k3 r0 R0 ^( y5 @) _
- TYA
9 ~- W, y! O/ s - PHA
, ~% w& R p9 s - 6 _+ B$ |3 |5 r& K& P/ D0 {2 A$ {
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位- r7 ~: ]' O; n; _: l' ]/ h4 N
-
% R2 g" x$ v1 b( ~ - JSR FC_PPU_Procrss;PPU处理
* h6 r% h- W$ f9 i# m5 d0 Y - $ |: _" ~4 K- @& Y5 E% ^
- ;精灵内存更新 v( t1 R3 V; U
- LDA #$00' k8 k: S# |6 C6 {
- STA PPU_OAM_ADDR- T& |% m4 o) F9 I7 `
- LDA #OAM_DMA_Buffer / $0100" ^- A J1 {% b* B/ V0 L" o
- STA OAM_DMA
% Y7 z1 b8 A: ` - 4 t4 y h9 i0 E, d" }! m7 x- I2 S
- JSR FC_Gamepad_Process;手柄输入处理
; {! j7 l( g d+ i o- m7 f. ?9 B - JSR Music_Select_Process;音乐选曲处理" v4 B! o1 d) X
- JSR Music_Play_Process;音乐播放处理; Y+ A" u* E' m% H
-
4 x# A" @5 R! M; A+ [# I - PLA9 W' D( b0 r( p4 W! @0 t2 X
- TAY
- b* H4 H( h8 n3 b - PLA
, A8 L' |) O( J% \, j1 {* v; { - TAX
7 t9 b3 c% L2 [& m8 I/ E - PLA
2 |" R5 A" k0 U0 L4 b ?6 `4 o - ; t6 w7 ^2 d8 W0 X6 N8 n M
- RTI
2 j8 W8 D8 c! `/ W/ j. H
+ { S3 K, Y/ X9 t. m+ \- ;======================================================================2 {1 z0 ~! }! O# c* W6 k3 K0 A
- ;请求中断处理) H' T& E. T1 T+ n v6 C
- Irq_Program
( r+ c% E a; @: W - RTI
5 u4 B9 x# A! A - 1 D* m& a9 c& ]: `
- ;======================================================================( [+ Q2 K2 a9 O% t( t9 t. k
- ;中断向量表6 U% C! ?8 ?- q5 o2 Z
- .ORG $FFFA
7 g- J/ Y: H* j6 X - .DW Nmi_Program ;NMI触发时执行
- T' ]1 o4 B, W - .DW Reset_Program ;载入ROM时最先执行
1 C" Z& U' S- L% v4 q4 Z4 O& J - .DW Irq_Program ;IRQ触发时执行
0 S" z4 c. Y$ c) k- p/ I
复制代码 2 f/ I3 _! J; _. {
' A- m4 _3 l% I( i" f7 o- ]% ^9 w5 N
# h, ^: ^. \% ~: U6 d3 u# X
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|