|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下- i7 W3 v$ l0 V

1 ]6 s, d2 }6 G/ K- X( r以下是主框架代码:
5 c( ^& C- r9 ~- ;======================================================================
6 \" W0 b& i; x9 b0 y2 z - ;文件头
6 d9 b( C: k8 ?* c - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量( J8 m: k5 B+ T6 k2 W
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 z+ C, P$ V/ I7 l* a, {" |1 C
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, I9 A6 H" S' U - ;======================================================================6 v3 K& Z' }, a2 I; d
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2( j) w2 V3 d# w3 Z( g- n$ a- t
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1% x6 z/ d3 E% {& g# v
- ;======================================================================
" ?6 K# v4 p4 T5 b - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
& _8 u4 J- T$ M/ w3 [: x% p4 Z - RESET_ADDR = $E000 ;主程序起始地址
: A4 i# C5 Z/ B1 v7 i$ M - ;======================================================================
8 o7 q' F7 [& ^& d( R Y0 b - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB% ^2 p1 m* I, m) p4 K
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; `1 N, @# I5 N; B- }
- .INESMAP 4 ;Mapper号 (0-4095)
3 ~# P$ H8 D; N' b9 Q2 E3 F - .INESSUBMAP 0 ;子Mapper号 (0-15)
8 a/ l: a7 W6 S3 v% T$ {" q - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# k3 c( H4 B) |9 s5 _ - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
# {1 c6 N& N$ v) G - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)/ ?3 C' Z4 M! c( v! O# y0 r
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)6 d/ G% G' S) n
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 B- I2 e; _7 m: t, P0 ]! b7 p6 p
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 d5 M: V5 e/ \9 o1 t
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)" Y4 r H7 D/ U: `7 }
- ;======================================================================
# [2 \2 F( P3 H1 N5 N7 l7 G - .INCLUDE "fc_demo_config.asm" ;全局配置0 y# T0 m8 R" m0 t* G3 Y
- .INCLUDE "fc_demo_constant.asm" ;NES常量0 h! n: O8 y7 D9 {
- ;======================================================================; W7 L" d' b6 F' F
- ;音乐配置
2 L; M$ {* @, U8 T3 n7 f8 h - .IF 0 = MUSIC_THEME
. y* a( j* ~7 ^7 r( f: n - .INCLUDE "data/music/Gremlin 2/config.asm"# D3 i2 ^; P/ f% k
- .ENDIF( ~+ B+ j3 q, M0 r; W4 o
-
+ L0 j* E. g3 E - .IF 1 = MUSIC_THEME
3 b" ?0 {6 ?9 ~" Q - .INCLUDE "data/music/Raf World/config.asm"
5 r; |) z/ L" _: C, ]. S2 N. I - .ENDIF
6 }8 O6 o/ Y% L9 { -
9 x0 }- l; ~( `, e - .IF 2 = MUSIC_THEME # h! E9 z* |" L8 V0 U& j
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
4 M, s, S) S' q$ B- Q# b7 M0 P9 X5 ^: p - .ENDIF# @+ H- x1 q; S% e6 Q5 v
# P3 ^7 k x" k# e! `- ;======================================================================
* ^! P/ K, w3 Z0 D/ ]' n: C - ;引用CHR图像数据1 ^' ~2 g; |8 B( e/ M1 r7 l
- .BANK NES_16KB_PRG_SIZE * 29 X- A& T2 d, ^5 R
- .ORG $00001 i4 M8 e# |* R0 F! O$ Z/ i. Y
- .INCBIN "data/bkg.chr"
0 J/ T4 u! ~7 ]# [. _ - .INCBIN "data/sp.chr"3 p4 X- O& z0 c/ b0 u
-
/ @' z7 u& N' ]' g) y* o1 K - ;======================================================================- e8 ~; z6 @2 `1 A$ O4 W4 b
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, I, {7 f3 b( \7 K - .ORG RESET_ADDR9 }8 S2 ]5 G) M; ?8 m+ p" N7 _" p
- ;======================================================================1 y7 w6 T, P5 u- o0 c1 |$ Q0 m
- ;引用其他源文件
: Q. @4 m# t$ Z& E8 S - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
! i3 z' t- h# \! V5 t - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理0 f6 s& x4 Z+ w0 y
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
- O+ D7 o! E) n3 L( R7 X - ;======================================================================
1 Y1 r8 o3 v: M) S5 J! B z - ( n3 }# S7 M7 ^/ S* L
- ;======================================================================6 b7 f+ \: e# v4 L7 e9 G& i
- ;等待VBlank到来
7 {; P/ L: U9 f- D( O4 K3 o - Wait_For_VBlank
4 g) [4 y2 b( g* q. w - LDA PPU_STATUS
/ B& ~. f7 ?7 [ - BPL Wait_For_VBlank
# B, A! ~. X# ]$ f2 A" T - RTS$ J9 S+ ?& T& m K/ n/ X
- & i. d& e# z3 I! x3 | S0 c9 @
- ;======================================================================
% k( Z/ l) c) i. H - ;调色板初始化) }: ~( a, i. B- ?6 ~% Z
- Palette_Init* [; w! ?* |/ k' @+ d
- LDA #$3F
0 @ H5 \% v' q - STA PPU_ADDRESS
" ]8 R! r: F$ [8 l: k- @/ S+ M# y - LDA #$000 L( M; x) O2 P. D4 L: p
- STA PPU_ADDRESS; }$ r& o- W0 ]
- LDX #$00$ {* Q; ]/ k2 F7 ^' L
- LDY #$20
: o: r8 e8 u% \) @ - .Write_Data
. Y7 ?+ E0 h9 L - LDA Palette_Data,X/ S- p; ?8 _# y: n4 [2 \1 @
- STA FC_PPU_Pal_Addr,X
* Z" w7 r+ b% |; ?( l) t$ ]. v. B - INX
; O- k( r3 D+ ]7 W" L O - DEY
. x' R* t B& X* n - BNE .Write_Data2 W( d/ F) X2 Z. {; ]
- .End! H b- g0 W! k7 b& d
- RTS
% T2 s2 `4 \6 }- F - b' S$ B( C- p, l
- ;----------------------------------------4 Z" W3 b* H- X4 j! t1 V3 B
- ;调色板数据
1 o- E- K, o1 ?4 u! q7 V - Palette_Data1 j% [, y! G' x1 x j- D
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B3 R3 @" u! Y" k, f6 ~
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 226 K' {" ]. x, I& Z, {, \) B' e1 y5 Z
-
1 \4 y$ R4 w" M( V5 p% { - ;======================================================================
x5 k$ o7 c/ m. V; i) v - ;命名表清空
4 A0 m# ~! F& B7 d7 p' @+ [4 F - Nametable_Clear k) t! H Q8 g
- LDA #$20( S; `: E( ^# Q p( x! J
- STA PPU_ADDRESS
9 j8 D7 l" S# u - LDA #$006 h z5 \/ ]% K) Z, k( b
- STA PPU_ADDRESS
% h0 L" h% c+ v/ ]6 l \4 g - LDA #$00
( k+ _8 i* F( }9 y9 c9 Z3 J - LDX #$00
2 l+ n6 y* z9 f( R* `* U - LDY #$08
* P1 M/ Y& [' f - .Write_Data- |7 L* y' r* J0 t* r7 ]
- STA PPU_DATA
3 D, e9 z, ^, ^$ D# t% [9 K) y - INX
. N& }- d0 H/ M/ s - BNE .Write_Data
+ N0 B4 j* l5 V - DEY
6 D8 A" p1 M! ^9 N4 q2 U - BNE .Write_Data
6 N- c" {1 L+ d( D- k# } - .End- A9 D9 {2 h5 J5 h) A
- RTS. ^4 R( V6 n; h5 X' ?/ d7 Z* O# v
% b4 W' L. T! U! V% k. G- ;======================================================================; t% L6 t/ h2 t* w/ ]! N
- ;音乐曲目切换5 a p" c" R) J$ t0 ^1 q& r0 Q, M; R
- Music_Select_Process, Q8 {' e! ]% {3 ~! A7 X3 [
- ! A+ d& Y8 p7 v4 [ ]; s
- .Pre_Music;上一曲 R) F: z2 f: w3 S P) x! ]
- LDA FC_Gamepad_Once
% g( [% A2 t" w3 L5 ^ - CMP #JOY_KEY_LEFT: x* G4 ]3 U# \. V. ^7 y, e
- BNE .Next_Music
, ]. p. l, B/ x0 Y( p - JSR Music_Play_Pre
! L6 o+ l2 {0 K5 m; J o8 b$ D - .Next_Music;下一曲4 B6 E* h4 g3 M0 V
- LDA FC_Gamepad_Once4 H" P! j$ p7 p2 u
- CMP #JOY_KEY_RIGHT$ P8 v6 } V3 _: d. Q( h& L6 O! }, ?
- BNE .Next_10_Music: ]/ j) U3 ^6 x8 p/ [' i. B
- JSR Music_Play_Next& U1 N; n, ]$ f6 ?: c
- .Next_10_Music;上10曲; G, I; Q; q( E* G2 {# t' V
- LDA FC_Gamepad_Once5 I, Y2 [+ @% g; |3 S
- CMP #JOY_KEY_UP2 A; _0 y# r7 p0 ^0 I
- BNE .Pre_10_Music; [. H- ]8 U% F% o% i
- JSR Music_Play_Next_10
4 C- Q8 s/ J1 x8 X0 [0 H( v7 A - .Pre_10_Music;下10曲1 x9 O/ F/ a* G& c) I$ V
- LDA FC_Gamepad_Once1 w9 y: e- w: K. {
- CMP #JOY_KEY_DOWN& H0 h5 q8 T9 J3 f
- BNE .Reset
: c0 P9 t( t& E$ L - JSR Music_Play_Pre_10
7 D# R# T( p7 k4 X a. M) j - .Reset;重播当前曲目) P4 |+ G) i3 U" R r. g, |& P
- LDA FC_Gamepad_Once: ~' I# l) H- \' G* c8 Z7 f
- CMP #JOY_KEY_START8 d2 X' u8 a. H9 a9 b5 ^
- BNE .End2 z6 P1 A) s+ ~, X
- LDA FC_Music_Index9 D' I0 H$ [. U9 R
- JSR Music_Init_Process
7 T- _; Q3 e* N- P, b% A" l - .End3 X2 U9 {* s2 c) [$ I
- RTS
0 ] o4 t) \- S/ L" s7 H/ X - 0 a- l4 k+ c/ R
- ;----------------------------------------------------------------------
3 B0 H) V3 r( a* }+ J& E+ a6 V - ;播放上一曲: f, Y. R! {' z \+ n
- Music_Play_Pre6 b8 M" @% l- {6 ?. l
- LDA FC_Music_Index
- v# e0 _$ }' s- w - BEQ .End
0 v5 }6 d$ ^2 O2 H. E, S1 |' h% i - DEC FC_Music_Index5 m" j1 d5 s3 H$ o. ~4 ~/ F
- LDA FC_Music_Index& P7 V1 L$ H$ e2 s; K
- JSR Music_Init_Process
% x% {5 N, c1 k w - .End4 \! v, y5 Z3 u$ ^+ j
- RTS+ y! f9 W9 j. x. M0 ]$ B' V
- ;----------------------------------------------------------------------3 w' z' L" T6 Z- g
- ;播放下一曲
5 ^& n. S/ ?# W4 L - Music_Play_Next
6 ~5 {5 R. R9 }- n5 ]6 m# j - LDA FC_Music_Index
0 c3 G7 O+ w+ Z' @7 Y - CMP FC_Music_Max_Index- @9 x3 i8 ?) ^# L$ l) [% T
- BCS .End/ t! }4 D! I! {! ]( X2 L: Z8 q
- INC FC_Music_Index
& e4 Q }% \" M6 m) }, z - LDA FC_Music_Index$ p; A4 Z* E# L* K2 ^, h/ N& {+ c7 S. Z
- JSR Music_Init_Process
; \7 q V4 r/ m/ y, ^1 ~- \ - .End1 c8 J' R! M1 |4 A4 Q
- RTS
; V& d- S" A" M a; c- Q
/ r9 h+ r! v" O; R! U- ;----------------------------------------------------------------------
1 l c4 T, |2 B - ;播放上10曲 y- J7 L8 U( w$ o
- Music_Play_Pre_10
M8 L4 `7 B$ _; G2 e - LDA FC_Music_Index
: H% x6 T0 b% q& D! I" ~# \" P - BEQ .End: J; l; ~- p, J, g; m5 A+ n
- SEC
: d, @ [, w/ H$ U' {& | - SBC #10
' v. D1 N2 N0 i& s; t - BCS .Pre_10
# r$ Q& T1 G0 T* C8 R- x) a - LDA #$00
+ n1 K: s% Q$ m8 q o3 H - .Pre_10# d! ]/ U7 t" X: e" i5 v9 [
- STA FC_Music_Index
, ?) C) B5 u: w+ `( ?# p7 } - JSR Music_Init_Process$ P8 h, A" _' m( c6 O
- .End
$ d/ Z! I. f( a) ` - RTS
! X% Y3 g) t9 K; i. m% d - ;----------------------------------------------------------------------
$ V. L" O* {+ j8 X9 w: z - ;播放下10曲) o r# _) M8 I4 I( a; \% A1 f. ?: P
- Music_Play_Next_10% K7 q( @1 ]( p
- LDA FC_Music_Index
% x* Q2 q% U# o. Y7 F( N - CMP FC_Music_Max_Index' M! V* J$ W# o$ O0 b1 K& T; l$ H
- BCS .End
3 y& p4 U/ H6 {4 v& w) }1 w7 E - CLC! Z/ j4 A/ m+ i* u9 M
- ADC #10: U6 _& v, v! r: M8 m/ I" ]/ S
- CMP FC_Music_Max_Index
- w( ~; _" {5 u- |, _ - BCC .Next_108 ~- [1 q/ {; P- g
- LDA FC_Music_Max_Index i% u- y% U- O8 G5 |& S
- .Next_10
" l% ?# e) e$ Y+ \3 S' P - STA FC_Music_Index
, e" I5 B/ \: ^ - JSR Music_Init_Process; U7 ^9 [) M+ I# v( ?/ N7 f% `8 B
- .End
1 r1 d! s; C% z; V. b$ n - RTS) B O; E5 F" I+ T( W7 C) `
7 ~7 L0 D# r/ s$ p( T, }& ?- ;----------------------------------------------------------------------* Z$ ~9 i9 L- M5 U* p+ Y6 y
- ;8位十六进制转3位十进制制4 B2 b6 R. I5 S+ s U8 j( @4 v# T
- Hex8ToDec
, p# e: U3 I9 `! _ - STA FC_Dec_Data_1% \. M$ Z- ~7 N3 t* `) h
- LDA #$00 g2 {/ J' P ]- e
- STA FC_Dec_Data_100
0 S' I2 Q9 g7 ?6 \6 f - STA FC_Dec_Data_100 I" ] M7 Q9 `; X, b- v
- LDA FC_Dec_Data_1/ {0 _. v. P. \0 l, O5 s
- .Convert_100: b$ f0 e6 S# ^% i: S% b
- CMP #100' |! r7 P& Y6 i
- BCC .Convert_10
# |+ \: W, t3 m# R4 O - SEC
/ s3 `0 I; o2 ^; [ - SBC #1002 x8 \+ F# D! E8 x3 T* w* a
- INC FC_Dec_Data_1009 T! ]# P. h" b& J9 ]6 ]9 I/ l
- BNE .Convert_100
( Y6 A& g1 f# c3 L/ M - .Convert_10
- {9 U/ Q: X' [: c0 K/ U - CMP #109 |6 U7 B, c. @* T
- BCC .End
; T8 K: x. i. F9 d$ \: V! n - SEC' A7 V8 [) v* b/ a2 q
- SBC #10
$ e* O U% Q$ U0 e - INC FC_Dec_Data_103 F. p3 e7 C8 U' {- y
- BNE .Convert_10
/ k" r+ M l0 `$ x Z$ ^ - .End
0 x8 ?% R% |3 Q+ [! B - STA FC_Dec_Data_1; a1 W X |$ b; _5 E+ g! L1 I
- RTS
7 @" s5 F2 K8 b& N7 Z, J3 I. P - ; Z% P" j" Z" @4 j
- ;---------------------------------------------------------------------- {) z# X$ _/ r6 L8 a
- ;显示曲目信息
+ }* T+ Q$ @/ Y+ e" a - Music_Info_Display
4 f3 J A5 H" \5 O8 L/ o1 \1 H - LDX FC_PPU_Buf_Count
5 f+ }$ M* q5 V+ q5 i - LDA #PPU_WRITE_MODE_CNT_LINE
6 n3 a) I" {1 m) o& J! D - STA Use_PPU_Buffer,X
/ Y# i9 Q$ j+ M, U8 h - INX
+ |" J8 g/ B- e1 j -
# Z" J: N( i0 P" g& T' o' b& H* g - LDA #>MUSIC_INFO_POS! x" W* f& P$ W: C, ~, T: r
- STA Use_PPU_Buffer,X
0 v$ C5 @. l% O - INX
5 Y! y( Z* ~* H: t( o - 5 g' [* z$ Y6 b
- ;居中
1 o: F z' H9 o) h - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2- n1 G/ H3 f' u( E+ {( y% z
- STA Use_PPU_Buffer,X
( B( u( ~, I. _, B7 B8 M - INX
' A5 R+ r* o+ O0 O; w# M - 9 N0 r P+ v P8 B$ I( \& B- k; ]
- LDA #$059 c' c2 d: R$ j% ^0 v
- STA Use_PPU_Buffer,X
. ]1 T5 N9 ~5 F - INX' O- K" Q0 v3 j& c; p4 d! H4 X% x D( C
-
7 ^' ~1 o! {0 c) m' } - LDA FC_Music_Index/ \3 S- s4 D. w% X6 v2 l5 A p
- CLC
) ~/ ^- C3 c0 e: Y - ADC #$01
# ?1 G; b% }- {# S+ _; @6 r - JSR Hex8ToDec
: |3 P* G! [9 v1 g g - : H7 s _0 l: y& L$ E
- LDA FC_Dec_Data_10
5 D) v/ Q! g8 i; ] - CLC" v7 F$ N: _( N/ J* | S1 W* |
- ADC #'0'
' n1 X* @7 Z9 { z2 M4 e; y4 Z7 {0 h - STA Use_PPU_Buffer,X
4 Z; R5 m1 z9 }; Z' g; P - INX% d p0 l) ~5 W& {7 @( V, Y t
- + U" s9 C1 H! b( \
- LDA FC_Dec_Data_1, E4 k) p6 c" j1 e( l
- CLC# m4 l- v" A- Y
- ADC #'0'
, R' c6 `; {! V" ^( Z3 D) Q3 t& I - STA Use_PPU_Buffer,X
; s+ l) d c x8 H7 a0 @. e - INX* S6 ]: T( P! E$ Q
- * q: o) \! u, u* W1 A
- LDA #'/'
7 S! x8 ?/ v3 |9 X - STA Use_PPU_Buffer,X: s" D, {9 n$ w$ K3 _7 q( Z; e$ E
- INX/ [% u8 m5 H7 c: a) O
- 7 E5 G( [2 y8 ~# F- i( ~5 v
- LDA FC_Music_Max_Index" [, f$ K# S' \0 K7 T: j
- CLC
! U, J C& s: H+ P$ K, @6 j - ADC #$016 q& g) q+ D5 H) k4 m
- JSR Hex8ToDec
6 k. C3 R/ h7 x7 m+ U& |0 r -
- P# {1 K+ ]$ T9 V$ w4 f- c - LDA FC_Dec_Data_10
; s* w; O# N# d O- U. X - CLC8 _& k7 t- U6 @! d! }1 U4 P
- ADC #'0'6 F* k- o, Z! s& f
- STA Use_PPU_Buffer,X
' W3 Y+ F; [; s+ g - INX
6 o- d C* ~: l -
9 Z$ N2 H! d0 O& Y9 Y - LDA FC_Dec_Data_1
4 B- i+ j$ l8 \ - CLC7 `- k P, l& R
- ADC #'0'3 T) ^7 T, U7 K$ F- ?; G9 ~
- STA Use_PPU_Buffer,X
/ a4 D B/ d: p - INX# x6 ]2 b* i- ?( _' f1 N/ ?8 B
-
" G& h- D0 N2 _% E) ~3 h; @" N - .End
4 f3 L' j w; E% i - STX FC_PPU_Buf_Count
" q3 a6 V5 e c* S/ O. ~ - RTS
, ], z! I7 _7 B$ \& ~# t - 5 T' J3 B1 z' W& [
- ;----------------------------------------------------------------------2 t" J% E- A: a( j" \
- ;音乐曲目初始化处理# x( V t( I; v5 A9 F4 ?& M
- Music_Init_Process
- `1 f; {9 {: i/ ]4 K1 G) K. m - PHA
" o6 D; u9 Y# ?/ r% [+ `5 i1 V - JSR Music_Clear_Process* q# Y/ W) D& ?: E/ t$ v1 \( t
- LDA #$1F- ^ b1 V/ c1 T* e
- STA $4015# ~5 j+ e5 i A# o) s7 [5 ]
- PLA2 i8 L! _- h3 K. X- X* m6 {
- JSR Music_Init_Addr1 S: _9 f* C! r- B. o0 t# k
- JSR Music_Info_Display
- |8 N" }2 u% H1 v' w - RTS- {9 \7 i: s- L3 i) A8 J/ S
- ( x8 ^' G8 q" a4 h, Q; B
- ;----------------------------------------------------------------------
" p+ r# g, [5 q0 O/ M3 | - ;音乐播放处理
/ ?+ ?4 K$ u3 }' x$ | Q$ l - Music_Play_Process
/ Y H5 M4 m/ H% L1 G( o, @ - JSR Music_Play_Addr+ @1 C" a4 m$ m: I6 [: W. l
- RTS2 m P; g6 u6 }1 C q0 U$ k$ i9 R1 q
- 9 E! |, G; A5 D. I9 h6 ]
- ;----------------------------------------------------------------------
9 X# f6 e' D+ Q8 w2 V T) W - ;音乐播放处理
# b+ J b" D/ B# I - Music_Clear_Process
7 Z% y- r( A$ B( F1 ^* R1 ~" Y - .IF Music_Clear_Addr
, ?' M. [" o1 u$ u3 m1 ` - JSR Music_Clear_Addr0 E2 w& j# }5 j/ I5 S6 j: }
- RTS7 ]3 ~$ }/ L% c( ^ q
- .ELSE
/ i7 E8 m |1 k7 p% X: c G - LDA #$1F' [: T; t4 j& d( o2 d: D
- STA $40152 ?( v% b+ X" K3 r
- LDA #$00
! T# c2 t5 q) n6 ^7 {; k9 P& T O7 D - STA $4010+ o8 A8 \4 x9 O/ e+ E w5 g$ S
- LDX #$003 k5 E# U9 N+ X' r9 f# `
- LDA #$00
% c, L' x+ q5 U0 h( Z" X, r -
$ [1 A' o2 Q& Q9 m; Q s3 A - .Music_Clear_Zreo_Page_0
0 H3 B% `; J, f. n8 q e - STA $00,X
# N. D% k$ w0 {1 Q' ~ - INX7 S- _0 Q: q1 `* N1 v
- CPX #Use_Zero_Page_Begin3 z* A6 U; d7 l9 _0 P' Y9 O
- BCC .Music_Clear_Zreo_Page_0
2 \9 E% [: ^/ v: @9 u -
- U1 O0 r/ p+ ]9 m; C; X - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
3 V$ S' q' I8 ?: [% X& Z& g8 \4 a - .Music_Clear_Zreo_Page_1' V z& G% ]) p, i0 @& d' L
- STA $00,X# e; v K8 |* ^* f
- INX- w# H' U- \% o, H& h. @# ~' r
- BNE .Music_Clear_Zreo_Page_1
9 H; O! }& u* R" ~% f' t; w. R -
/ t( B& _/ a7 p7 I' _ - Music_Clear_Process_1
/ f8 T$ V" y: J - STA $0600,X
) _8 G7 }5 \6 O( z8 p7 K - STA $0700,X
1 i4 E" i& p4 W% C& j5 X0 c - INX( v5 j& r7 s J) m6 X
- BNE Music_Clear_Process_1
2 i; M! V$ l5 M - LDA #$10
5 h# P. r% S3 Y - STA $4000
9 E7 r" g1 }. R% |* o - STA $40047 A3 g6 P3 u$ n* h) l
- STA $400C5 f# S" e$ g" _7 s# _ m8 N. Q
- LDA #$00% [! ?; n4 T! I4 x$ E
- STA $4008+ ?& M5 J3 p7 r; U1 U/ P* ?
- LDA #$0F; S- q4 }! V5 L
- STA $4015$ I$ a7 `5 n, }
- .ENDIF
( i4 C0 z( P+ O8 l* @, Y -
, i+ {4 s' f8 z - RTS
. o! @' a/ ?2 B# ]
/ `( U* O7 z/ O' ]1 n" C- ;======================================================================
7 K/ Y- [# u; N6 P% ? @ - ;重启处理5 T0 j' o6 \2 y
- Reset_Program! H2 ~% l1 L. B
- SEI0 D! q% c4 W. ?$ s) ]
- CLD
5 Y& j& ~2 {% J; \' s M - LDA #$00
6 I; b( W- l6 R- j |# l. r - STA PPU_CTRL
+ k) V" I; o/ {: _. f. a# t - STA PPU_MASK
5 Y- V: ]+ |4 v% i - STA JOY2_FRAME
( E7 e A/ X- ]" | - STA APU_STATUS
4 Y6 @7 t z# o4 Z- u/ A - : K/ a$ p, l" y/ V# o1 F
- ;等待屏幕准备完毕
) {' _$ B: ^" M) F) i - LDX #$02
, d1 x; U4 w8 Y2 K3 B5 t - .Wait_For_Screen_Ready
4 y$ E9 e; h0 c" H2 j& a' }3 g - LDA PPU_STATUS, O. K n& T& K3 N, f, `
- BPL .Wait_For_Screen_Ready
5 ?# R9 ?1 N2 m8 z - DEX5 ?$ w4 x, @9 m: `5 h. ^( u" P
- BNE .Wait_For_Screen_Ready9 y. R0 q" ]. ~! x# L m1 \
- , c; [7 b" R" Q; S6 `# }" N9 x
- ;清空调色板
2 Y5 t% k9 e0 r5 d$ a: k9 {1 Y2 x - Palette_Clear
. O/ {! B! E0 _4 k! W( c - LDA #$3F) j& O/ w0 W4 t/ D
- STA PPU_ADDRESS
( t3 p+ h0 f* ?" }( B& i - LDA #$00
6 h5 u; f# ?1 y( f* b - STA PPU_ADDRESS
0 \ v' H+ m8 p$ x% [" {+ ^ - LDX #$201 K' `$ p6 {9 `5 ~5 y6 s" F7 t) ]
- LDA #$0F% V0 z5 F. u- ]- T* e4 z
- .Write_Data: e6 W1 d9 m' [# x
- STA PPU_DATA3 s# z7 K8 j8 w( t+ e) ~- X4 ^* ^
- DEX; b$ l2 Z- {7 {4 H: o4 p
- BNE .Write_Data
: Q" X! s, q$ d2 Y8 O - ) C$ l, O+ i0 f1 m
- ;清除声音 $4000-4013' o* T g. t8 e' ^9 r/ n h
- LDY #$14& S& \, z. W I% r/ Q
- LDX #$00. o+ r E" }/ N* s a3 Y' ?9 U
- .Sound_Clear
: K$ x4 l) X% J: ~1 M) k - STA $4000,X- }, i+ @! V+ M. q/ }8 ~4 ~4 Y; [! O
- INX: ~/ {3 S/ A, S) [$ ?
- DEY
6 V, ` _" a6 L1 G/ u/ _ - BNE .Sound_Clear3 {7 q: {* A2 g
- % M/ z6 P. C$ c+ z
- ;清除 RAM $0000-07FF2 l Q- m$ l, [5 j. X& I) l' |6 O& Q5 [
- LDA #$006 i5 \- h8 {- }, u' ?3 i
- STA $009 s. J$ O c$ R* H- _6 f' z
- STA $018 ~* m* Z! V# F
- TAY
$ ?. m( w* F7 U+ L( H+ _- z! s - LDX #$08
0 R: V; H# N# n. n# e' ^. I - .Memory_Clear! ]3 E0 s1 _. W% i1 w! J1 |
- STA [$00],Y
. ^5 i( W8 I; a6 _. H- k4 [6 P - INY
/ I+ b/ K: {4 J) A4 o - BNE .Memory_Clear% T& a+ n! w/ ^/ Q. _/ n' h
- INC $01. |: o5 Q6 W8 V2 S& e, `% w
- DEX
# C; P. W% |% j - BNE .Memory_Clear
9 U4 V( r" \! u+ b, ]7 j8 g - 3 l+ t% H& l0 V5 _; B: U
- ;精灵缓冲初始化8 V& F1 ]5 z2 |6 R" c2 ^$ {
- LDX #$00
w- o t) K$ P# ?& O* b. W - LDA #$F8; G0 f- B" G; w2 z* W: K+ h
- .OAM_Clear2 d, q8 E8 G& j" V% A
- STA OAM_DMA_Buffer,X$ y' B9 c3 e. }& u0 ]
- INX \4 w5 ?( q5 P3 M! O* g$ k
- BNE .OAM_Clear0 Z! K4 ]' Y4 y; E& ^7 I, @
-
4 r4 X0 r; A5 p6 w - ;栈指针初始化
6 v" x) {9 J" j U; z; G0 B - LDX #$FF
; j' o5 u& }8 L+ ~# i) @7 A - TXS3 e3 ~5 M+ L* S2 y/ S
-
7 t9 q/ \5 q2 M6 N. o% N - JSR Nametable_Clear;命名表清空
6 L4 j: D6 r) f* ~) J/ F - JSR Palette_Init;初始化调色板缓冲7 ^9 v, K1 T+ h. S1 s4 Z+ f6 t- ]' ~
- JSR Static_Text_Init;初始化静态文本5 Z( _2 {" `% h, M. U/ ~" {% e( m
-
7 x0 k+ L2 ~# W" l2 O) g - LDA #MUSIC_ITEM_TOTAL - 1) c" |% ^' b; M$ a) G# ~) G/ E) F) P/ C
- STA FC_Music_Max_Index9 e5 R% C. Q- H% C3 I3 d
-
* C- n; c# r/ z% G8 i - LDA #$1F
& O' T' V7 f" j& d; f* Z+ {& x& M0 r2 T - STA APU_STATUS
( g" A/ _. c& l. m( [ - LDA #MUSIC_BGM - 1
. A4 c) ~) I. T - STA FC_Music_Index
, e8 _$ T/ a! t- z& @7 I - JSR Music_Init_Process;音乐播放' v( m( y! U1 R3 l' j# r
- 3 v" ~& q0 Z5 O# I, e' }
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态) }3 d' o# d& K9 j0 @
- LDA #$1E) {% ?# E2 H2 ]3 Z6 b
- STA FC_PPU_Mask_Buf5 k. i3 d6 z B6 n) k
-
/ k) r& V3 S% z! H - ;启用NMI处理$ u( {" K @6 d) {/ `
- LDA #$80
4 V8 f4 g' J# N - STA PPU_CTRL
, J' i {, C8 _* l4 Z+ E0 r; x -
) m9 Q5 S1 w7 w - ;程序循环, 剩余工作交给 NMI 中断处理' O1 C- \! x, \! d
- .Loop
+ p) e0 |1 e: L9 s* K3 M) p: t - JMP .Loop
6 [3 S9 K/ [1 `+ y
; J- X7 ^4 u5 V. C9 \- ;======================================================================
N4 t' u5 `! c: a4 g+ t8 H( ` - ;不可屏蔽中断处理/ @7 P) e% w& \5 e) [$ H; p
- Nmi_Program
. i' r, ]9 l. G0 [! M - PHA8 s1 R" n* \/ {- H3 Y5 V/ J
- TXA& ]. H2 E! i* f# U7 N y
- PHA- h! w9 c( ?) q+ O5 O3 k7 t
- TYA
% C# ?7 m$ @. q; O; J9 i% J - PHA
o1 p* @9 ?2 N- l4 Z/ @' [% g* v -
. E& U1 T* _' O# C' ^* W% m - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
+ A( H* l+ i3 @* H - 6 S' K* `4 s; h
- JSR FC_PPU_Procrss;PPU处理7 y, p2 W& z( T1 h) I! D
- 3 V5 C! W/ C- @+ ~* W
- ;精灵内存更新
( R$ y6 Y- T- ?8 k* ]$ [' ~ - LDA #$00
! d9 F' B( W$ r - STA PPU_OAM_ADDR
9 @8 G; y& ]1 X+ G u - LDA #OAM_DMA_Buffer / $0100
" J( h. l9 Y5 h* O - STA OAM_DMA
* P: u8 J$ d6 N -
2 F; I2 |" c( Q- D& p8 {& ^3 ~0 s' @ - JSR FC_Gamepad_Process;手柄输入处理, S5 t# k9 ~1 L; Z
- JSR Music_Select_Process;音乐选曲处理$ O8 Q& g, J' T b
- JSR Music_Play_Process;音乐播放处理1 y( M( n7 @4 N- R5 w" V: U! F
-
) t9 M' q+ Q. R: P1 A - PLA
1 ?/ J3 u7 U! f5 h0 m/ b - TAY
- Z1 \, D; n+ K9 q - PLA( d4 i2 K2 m F" U6 T
- TAX' O7 H% I- V% V2 I- ?
- PLA
2 X! T: `4 T+ K% O8 X2 B/ J/ e - 0 O, F: v: m3 y
- RTI9 _3 m/ S- ^* Z6 P' A
- 2 | J1 Z9 t8 [) S" X( `1 T
- ;======================================================================
3 \0 M2 l3 g" `+ c - ;请求中断处理
3 n/ b; {: L4 k - Irq_Program
. s) I) `9 Y; R" C8 y; P - RTI
& N) \6 P {3 J% D - : q- q; g* u9 S7 S3 \
- ;======================================================================
: K& w1 P# ]) X" p3 N1 S- I$ M - ;中断向量表
+ D2 R3 v% L6 T' q F& D) m - .ORG $FFFA3 n9 K0 `7 y& F5 E. n
- .DW Nmi_Program ;NMI触发时执行
$ V. r' y& v0 F - .DW Reset_Program ;载入ROM时最先执行
9 D0 j% [6 B$ c, K - .DW Irq_Program ;IRQ触发时执行3 M0 Q9 ?. z& g6 h7 `" T
复制代码
. E" D8 B+ f/ m$ m
% g; U, s' k- s3 v, S9 a' d8 _$ H. ^* E
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|