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