|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下" C5 N3 G0 P" F3 k p
% J& s0 e. `( G% L% Q) N" |, j
以下是主框架代码:
5 O B3 v# U; j% N) {" v. {- ;======================================================================! ^8 G# Z$ E9 R$ V- w1 t
- ;文件头
' E! ~1 K# e3 s% D) K - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量2 s2 O8 g* w k3 H
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* F. T+ h; ?4 `8 p0 H
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
, T; T b0 j$ y# F' C2 V - ;======================================================================
: _. w, I6 K/ V4 c6 b# ~# c - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2' M0 f& \6 Q9 O# o5 Z1 z
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& B/ i3 Y0 V* q H: j) S% e5 a' b - ;======================================================================* k; Z' ]+ {. }# \
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- ~( s# C; p0 Q& N% j$ J
- RESET_ADDR = $E000 ;主程序起始地址
9 V: S- k5 P* |) u' s - ;======================================================================& ^, t; o' j) o1 o
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 x' M; F/ A, H* b D V5 @
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
5 J% j9 k0 ]; z: h - .INESMAP 4 ;Mapper号 (0-4095). c( k J, I$ c8 c
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 l: n, X7 e* @: a. j* e- L
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
7 T, n9 d. c" o/ A: @8 ~* b - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 f( Q9 @, B" ^ S! W ?2 I - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)- l& a$ j2 v* W5 j* W0 \* g: z
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
/ Y3 [1 M% U1 i4 |" f8 ~ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
7 b% r/ Z8 L! W5 u - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
, t/ J! B/ Q: ~. g4 d3 i - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
9 O; I+ n* a' b) a7 E1 l1 d7 j - ;======================================================================) O2 A' q d/ X1 `3 q1 ]& ^" u
- .INCLUDE "fc_demo_config.asm" ;全局配置
j, V8 o' E; S6 p: z j - .INCLUDE "fc_demo_constant.asm" ;NES常量
4 \% j. Q. A( Z5 B+ v- S% [8 L+ s* ? - ;======================================================================
7 M- p/ N* Z% a - ;音乐配置" q1 y. Q8 u L
- .IF 0 = MUSIC_THEME
9 P2 f/ b l0 s - .INCLUDE "data/music/Gremlin 2/config.asm"5 G( X+ J' e( S) L
- .ENDIF4 D, f, I$ P( K3 \1 v: \- x
-
4 y, i8 F$ r8 |: F& | - .IF 1 = MUSIC_THEME9 O7 g1 v* j( s% m" R' h* F5 ?) C
- .INCLUDE "data/music/Raf World/config.asm"
4 p# P- d4 h8 I - .ENDIF
. _7 Q% O) W) _& ~% y -
& j# F. Q5 @ t8 q - .IF 2 = MUSIC_THEME 0 Z# q% f! \- M5 m, n# e( @& K
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
$ c) U" F% }2 ]/ y4 E. b0 c0 w - .ENDIF
: A4 ^+ s, j! a2 l - 3 G) ?: R0 _+ \; a
- ;======================================================================
# G5 @- ]/ k) K4 I v: p - ;引用CHR图像数据
3 I2 A- j4 P7 U5 ^! ] - .BANK NES_16KB_PRG_SIZE * 2
0 \ H9 A' l5 M ~7 Z1 u - .ORG $0000
: x P6 I) R8 m5 ]& |6 y - .INCBIN "data/bkg.chr"# K8 B- L9 v6 O$ [) R6 h
- .INCBIN "data/sp.chr"( K- Q% B& \. R
-
* M4 L8 [! X1 @! f - ;======================================================================! g8 }" c! b2 D' d+ c
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank0 |9 }, S. K0 @( a: _4 b- v
- .ORG RESET_ADDR' E. q# X+ N6 g
- ;======================================================================" v* O l& Z% F
- ;引用其他源文件5 |1 S2 s! `7 Z* u
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理. V( i& ]- k# v0 m) h1 c% F
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- T6 D/ Y1 e( h/ m h; ? - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
# [3 K! G1 A. _! q, u - ;======================================================================* K1 }. Z, D; n+ Z) d
- 5 `3 f* a# o) b) o3 A
- ;======================================================================2 L* }0 }' ^5 ]7 ?+ T4 ?
- ;等待VBlank到来
# A/ o; h6 @7 y R1 Y* s - Wait_For_VBlank4 J4 |" y+ H& ^% C# i8 F8 E
- LDA PPU_STATUS8 O4 V' ^' Y) Q8 ]5 A# u
- BPL Wait_For_VBlank
, ~* ]% x0 r0 @. r# Y& H - RTS
# N1 C' y7 l0 e/ B
; ^' ^9 V2 L" z9 ^6 T- K9 i- ;======================================================================- B, a( X- ?5 z$ F, r
- ;调色板初始化
; J" N. H0 k* `9 |5 | - Palette_Init
2 n# H/ w- q) r2 F! @ - LDA #$3F
. ]2 n/ M) l# b/ f' }0 ~9 N6 o5 v - STA PPU_ADDRESS; Y# E: X- y4 I8 ^* O! ~3 z8 V2 _
- LDA #$00
8 C5 c& c* h4 x - STA PPU_ADDRESS
; w) ^' D$ l* ?. \ - LDX #$00
7 n, i2 z* x+ `2 c# F% b - LDY #$209 [( Q1 Y, v/ D% G. a) m
- .Write_Data* ?, z4 @9 f% B: f$ l" R
- LDA Palette_Data,X
% b# e* l7 Z. Z. A - STA FC_PPU_Pal_Addr,X
; T. R7 U; Z9 K1 u! J - INX
- k8 o8 Z! F3 N! I1 A0 `. ` - DEY
' S- a% j# b( L- M1 F, ~ - BNE .Write_Data4 t' T- z+ l2 |0 l* x* P; x) D: l
- .End, C- k! ~3 T) o. q F
- RTS
/ ^1 O6 k6 ^1 k* p' ~ - 2 @8 H* P0 E' ^: m6 T+ C7 E
- ;----------------------------------------2 x4 F! B: _0 C4 T' Z
- ;调色板数据
( T( j. ]* V" f7 ?8 v& W, P7 W - Palette_Data
9 M3 M2 {+ r, p6 k; K( i. _0 O - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B7 K8 [6 ?- f1 Z6 J8 H
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
4 q2 t7 R. J* T4 L7 z+ {; @ ? -
8 w7 Q% l0 }6 ?/ a3 w - ;======================================================================
4 F; N# \' z& T0 a. l# R - ;命名表清空8 V o. ?5 X: S9 B
- Nametable_Clear
! R8 n) }2 d. G4 } - LDA #$20
- D) G4 y! n7 W1 l- n) Z, Q - STA PPU_ADDRESS
3 w; e9 R+ o: m0 N" s - LDA #$00
- o- Q5 D4 D; |+ u2 O7 }) b - STA PPU_ADDRESS, l7 ]! R8 Q' @, h
- LDA #$00
( h$ s! [0 q1 L' ~' T& w) F - LDX #$00: |# i& t6 @' [: F" e9 J
- LDY #$08* p4 y6 k9 D& w- j
- .Write_Data7 b2 j8 b. r6 ?& L
- STA PPU_DATA! j1 v& ]8 |6 A
- INX
) w, D5 z3 x$ r - BNE .Write_Data
3 f( O; r9 \, B$ ` - DEY
6 s# u3 P5 L: Y( n - BNE .Write_Data
0 Z( N/ a" U$ x6 z - .End+ U- @ ~# A4 R3 m# B) W$ k" O, u3 i
- RTS* i2 `' U, P' d1 V5 w/ g
- ) @" R) j% ?4 A8 _
- ;======================================================================
7 G* l' u# [. r" a- q. \ - ;音乐曲目切换
& I; S2 U8 j* ^, S5 G/ d" N - Music_Select_Process
& T, f @4 W( }. q# c" i
- {. m- [6 m2 J. y. N- .Pre_Music;上一曲1 K: a' @9 w2 F
- LDA FC_Gamepad_Once
7 |, g: C E5 f9 s8 z. g; b+ d( ]+ G - CMP #JOY_KEY_LEFT8 V8 ?( Y5 J6 Y" l
- BNE .Next_Music" \' M7 X+ ?/ F+ D
- JSR Music_Play_Pre
; `4 E5 G& C# V2 {6 L, _1 _ - .Next_Music;下一曲+ P5 s0 I: d& v, h' F+ ~
- LDA FC_Gamepad_Once9 ]1 S1 j8 @: ^( x
- CMP #JOY_KEY_RIGHT/ [) Y7 Y% z# ^4 z# l7 S
- BNE .Next_10_Music" B. d* ?& h5 t' h A z5 B
- JSR Music_Play_Next
, {% t% J' I5 i" g - .Next_10_Music;上10曲% }3 ]3 n5 j- _- L! r
- LDA FC_Gamepad_Once( o6 `0 |1 K5 }$ Y* w
- CMP #JOY_KEY_UP9 C0 m! {! R G- @
- BNE .Pre_10_Music
5 N y2 k6 A& [ ?0 E - JSR Music_Play_Next_10
1 d9 q2 W+ A9 N- g( h" \. g8 U' u - .Pre_10_Music;下10曲
- U( l$ x, {0 v( N% R: t$ |8 U - LDA FC_Gamepad_Once
* d" y, I- T( `2 d+ @! T; H - CMP #JOY_KEY_DOWN
/ U7 _$ J% m/ n5 x/ k - BNE .Reset
" r, }7 k% c! H- X* M- v: B C$ j - JSR Music_Play_Pre_101 n- ^+ h, Z' }4 s. ~
- .Reset;重播当前曲目
& _7 p" m# g D6 _% t% ^ - LDA FC_Gamepad_Once
. ^) Q( m& c- J; d! {) k0 [ - CMP #JOY_KEY_START
! |$ n* r+ V/ o* L# v. `, C8 z - BNE .End5 @# _3 ~! \+ I5 g8 e
- LDA FC_Music_Index! M# K! b; v0 y* N
- JSR Music_Init_Process+ b* t& `, _& ?% ~1 V' G
- .End' b" R- q4 D( t' D* ?, l
- RTS
6 B. I& ` S; I" o/ i5 { - & P0 {6 ?9 z5 ]5 c- R
- ;----------------------------------------------------------------------
1 J1 x# [1 j% U- H - ;播放上一曲& Y9 i; O; w3 F+ A4 @" S' ?
- Music_Play_Pre1 P& T2 A S9 `% F
- LDA FC_Music_Index. q: S- e9 c; ]. L% z
- BEQ .End$ f$ G7 o0 Q. s3 j% }2 b
- DEC FC_Music_Index& i3 \5 C5 r4 E6 e: R
- LDA FC_Music_Index
0 l% q8 Q( s7 B; Z - JSR Music_Init_Process
0 k, S* c( `! F9 q- F; r# c - .End2 v M' Z+ _. t/ J, U
- RTS
8 E5 z# G! f8 l3 | - ;----------------------------------------------------------------------
9 D# e. V, q2 J/ Y - ;播放下一曲 |5 [2 j% i+ Z
- Music_Play_Next
- Y! J! Q S# R' f8 A8 w/ \ - LDA FC_Music_Index. x' T1 I1 B! ]% |) X' s
- CMP FC_Music_Max_Index
) ]5 D0 ?! ]- k - BCS .End
" ~) _! |3 J3 J- P' D) f6 W - INC FC_Music_Index% u m6 ^4 d) J2 q: u
- LDA FC_Music_Index
" R7 ~' q b* ?1 i6 W - JSR Music_Init_Process o" S3 h, V/ s- H/ L5 ]% v
- .End
9 a( `* w* A# t( }, A _ - RTS7 y' O0 ^$ b! F4 O- e
- ( j; Q* E3 i6 K8 t/ O: n
- ;----------------------------------------------------------------------
/ n7 U2 T6 j9 o1 L* r& x - ;播放上10曲
; I+ W6 _/ c& {. O - Music_Play_Pre_10
! \- E Q( a) K - LDA FC_Music_Index6 Z V y$ r$ p- E* F) d
- BEQ .End: d% n; E2 M8 Q) h
- SEC
9 y' K; y }4 Z4 ?# s7 Y' M - SBC #10" }: k0 a% k1 K
- BCS .Pre_10( H+ y( ] L% ]& l: b2 x8 g
- LDA #$00$ l) E o% C0 o: g4 N" R
- .Pre_10
) k; v0 T5 @0 C9 y8 c+ p" _; } - STA FC_Music_Index
E6 E, @0 u; c - JSR Music_Init_Process
1 f( g: z8 I; X" x3 J1 p' x+ M! h - .End2 o* S7 k2 X1 J/ {
- RTS
) t1 p- p% r& m: k - ;----------------------------------------------------------------------, A" f4 j& k9 j1 |, Y
- ;播放下10曲* n s1 n+ g! ^" m' f
- Music_Play_Next_10
0 y& I2 P6 u2 m( ?- z8 H - LDA FC_Music_Index
) q/ t: T* U r - CMP FC_Music_Max_Index
7 b! H6 b7 e6 c/ d' ^9 U - BCS .End
, t& e# Y" k4 G5 q, t - CLC
* P" a% m, [4 ^/ B - ADC #10$ t6 J& Y; S* ?/ u7 [3 ?
- CMP FC_Music_Max_Index' F; P/ U8 r# F( y0 z/ o
- BCC .Next_10 V" s% O) w }' m" ~
- LDA FC_Music_Max_Index! B/ @1 O2 ]0 v5 L9 ]
- .Next_10
" O: W$ r9 u6 m& N } i* t6 N - STA FC_Music_Index
7 K/ p$ N1 E. p. f) [' r; l* E - JSR Music_Init_Process
8 |+ j! ?' O! [0 E! W! ~" I* a+ \ - .End- ^9 r. Q; a( ]2 a9 @5 W; O! q
- RTS/ ^9 y4 M$ m: P4 u+ W: e( ^
- 6 w# G. y3 |9 T) I6 z
- ;----------------------------------------------------------------------
) a" }. s l7 t8 B - ;8位十六进制转3位十进制制! x$ P. D2 ~8 E/ a# V
- Hex8ToDec
. S7 ?0 a, [, A8 z2 Q. s - STA FC_Dec_Data_17 @$ U+ T& K0 B5 H- V* ~6 _
- LDA #$008 V; Q. W! R1 u i; L8 F# M2 B
- STA FC_Dec_Data_100
8 l* B3 V- O# B4 M* O3 f - STA FC_Dec_Data_10; _( S+ L% d" y. P1 N/ e
- LDA FC_Dec_Data_1* h! `) @- n7 ?* n L: w; M
- .Convert_100
$ M- _% [. H {7 G" `& Z" A - CMP #1004 z' g8 Q( g& @6 `) M% z6 E; X
- BCC .Convert_106 H1 ^* g3 ~. M7 g. E
- SEC
3 M9 v5 ?" m6 c2 F: m - SBC #100. X/ f4 }! d M5 b0 ^3 S) g$ H
- INC FC_Dec_Data_100$ V: f6 W+ X" S- ~
- BNE .Convert_100# ~6 K. ~* ]5 e& K
- .Convert_10
% }" ^) H6 A* N) o1 f - CMP #105 h6 h# }- n, a k1 @6 \
- BCC .End
* k4 D8 E! a# S5 n0 g8 D, N t" O - SEC
, x' \. S0 S" H0 l1 U* A# B5 c - SBC #10& `$ Z5 H- v0 f/ Q5 |- o
- INC FC_Dec_Data_10' Z) ~0 f! w) a* S
- BNE .Convert_10. B% ?" e5 B% |5 b" b
- .End
+ Q) l* b) \. ^) N; x1 _ - STA FC_Dec_Data_1! o2 T' M$ {% X. y& S
- RTS' v0 v& Y1 A/ p
% m2 g- J6 M# |- ;----------------------------------------------------------------------" {8 V. B! j! d( |5 n6 q5 k! @) ?
- ;显示曲目信息# }: n! E) I( a" n
- Music_Info_Display9 m6 v' y4 X+ x6 ~
- LDX FC_PPU_Buf_Count- V% w$ t' x/ P8 B
- LDA #PPU_WRITE_MODE_CNT_LINE+ e2 h3 j9 W' E1 ?- c# h
- STA Use_PPU_Buffer,X
3 E' g/ j' q: Z - INX
4 Y" A" J( @, U7 l& ]: W -
S: }" `- d! ^. l - LDA #>MUSIC_INFO_POS$ ^( I! j( v# M
- STA Use_PPU_Buffer,X
- T, t$ w7 t8 f: W. n - INX- J! I; ^' S1 S5 a
- % J {. K5 V' l2 K% i$ R5 d
- ;居中$ L3 I: i" Z$ l. ~" L& c% k( Q7 V
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/29 q) y( |5 s4 d; b' k, r
- STA Use_PPU_Buffer,X5 y0 P& j# D$ Y) k( K
- INX
- P* \. p$ h& g -
0 c& T% ~, Q% N1 [ - LDA #$05
# p; h1 T! i; r1 F6 H( ` - STA Use_PPU_Buffer,X
2 W/ l, W9 K* h; ^+ Q - INX
* `. f: E9 J. D2 U5 q! q( t -
. [3 [8 l4 N4 B6 F. l( n: _! d - LDA FC_Music_Index' F+ F; N$ X" F8 k
- CLC
/ t+ K, S w0 \" r9 |2 O - ADC #$01( X3 M. h! N9 R& }1 N" e/ r$ @& Z: C% x
- JSR Hex8ToDec
( O' o& O! t* l- ] - % D9 E/ l% \! b' c3 C
- LDA FC_Dec_Data_10 G: W( |- \) P
- CLC
. o: h* ^) g! y! S - ADC #'0' q* X {1 X$ k. X; M
- STA Use_PPU_Buffer,X
3 F. o" { v' v9 N, \" `$ R - INX+ ~% m5 q( p) c
- $ P# D) D7 @" a7 f! s
- LDA FC_Dec_Data_18 m3 j# Z7 s# ^2 z
- CLC8 b0 r' R& W8 x* }+ f
- ADC #'0'
U+ V, f" ?/ S& d. ~ - STA Use_PPU_Buffer,X
+ u! e i& R/ o4 O) n5 H - INX, M7 K! ~( c( _1 S! Z+ u7 h3 `
- ) ~! ?5 I8 {# x6 m2 d( r7 m2 i
- LDA #'/'
4 w0 g& N" E3 ^ M - STA Use_PPU_Buffer,X
- o# B% o/ j D) D - INX) y& g/ G8 F: D! k0 Z6 w3 Y
- q! C2 d z T- K/ Z3 ~4 \
- LDA FC_Music_Max_Index
( M8 R6 R* n$ t$ M! @ - CLC
( ]1 V$ E, b$ d, |; \5 U - ADC #$01
7 B, r) A8 [1 N5 D# w - JSR Hex8ToDec
5 l' A# y$ ~! Y5 k; R5 g - " s7 D C Q2 |
- LDA FC_Dec_Data_10
' g/ x8 y B' l# O" h - CLC! b4 v( A" @ v K/ @
- ADC #'0'6 @0 x! u# h( T% q* V
- STA Use_PPU_Buffer,X
) T& R& Q0 y' j1 O - INX' D, O& {& I$ z1 n
-
+ C0 G$ ]0 R. I- b8 A7 a9 \1 d# b - LDA FC_Dec_Data_1
6 a8 n# V8 e' `/ I7 k8 L1 U5 Q - CLC
* ]1 w8 Q0 D( k; b' u - ADC #'0'
1 r+ y9 q3 f9 u! G1 q - STA Use_PPU_Buffer,X
, A3 D2 J8 _( ~% z' e/ ]% J% Y$ q! @ - INX4 L. L& I S1 W- L0 E
-
, A. c& r) ^2 j% a/ V; O- F( J - .End
* i0 e; Q8 f0 R: T - STX FC_PPU_Buf_Count
9 y( a& v t9 W, D% e% I; _+ L# B - RTS0 b% C$ u6 M- o
- 8 H! G8 `5 z) |" I) Z
- ;----------------------------------------------------------------------
! z& W# T, k3 [ - ;音乐曲目初始化处理7 A2 m$ P* w1 j0 o" w- v
- Music_Init_Process
9 [ `6 A. S3 `: o+ G { - PHA$ L6 h+ k) i# Y s/ m
- JSR Music_Clear_Process5 y% Q4 ] ^2 T7 X. m- z- O
- LDA #$1F
g# C8 ^. y( Z - STA $40157 P$ i$ F: G# r; ^% v1 d$ ]
- PLA
* v/ q C) h' F) |% b y - JSR Music_Init_Addr
5 K/ [0 D( U* ^; E8 B" Z2 ^& f - JSR Music_Info_Display @# X& G# T- z6 Y" i% Z
- RTS
+ b+ |* s% A+ S& P* K2 q
5 U: S% a" G1 U9 L# E: C- ;----------------------------------------------------------------------: f; m/ w, G6 u7 r9 H
- ;音乐播放处理
) E. g+ R6 ?; y. Q% V# ~& b- t - Music_Play_Process
2 u1 j. V* ?1 v2 M! H - JSR Music_Play_Addr2 _+ u9 ~9 Y6 ]- Q5 X' T6 f
- RTS' h3 t# @9 ]- X) }2 J( G/ I
- 2 a5 z. \; A6 \* o- n5 o% I
- ;----------------------------------------------------------------------
7 W! h2 S7 M& }) H5 M - ;音乐播放处理
3 C6 Q+ |) @! E8 S2 q! x - Music_Clear_Process. V8 k5 z/ m6 ^
- .IF Music_Clear_Addr
$ v. C9 x( m0 I, F# |: q! Q - JSR Music_Clear_Addr' V) W9 R- f4 O, x6 w
- RTS
, e0 B! c0 i9 B' V# b6 ` - .ELSE4 V1 Y5 ]# a& [, R
- LDA #$1F
" }; k& I& @5 e - STA $4015% l+ z6 R) I2 ?1 Y% G1 s3 G7 h6 _
- LDA #$00+ a( L" i5 O4 Q+ t
- STA $4010
3 ?8 {& G9 Q/ `3 Q, T - LDX #$00
" l. ^, }0 w$ Z% v" { - LDA #$00: f9 \# k$ q/ ?, c
- - l& U8 @. ?1 i# M4 Z" ?
- .Music_Clear_Zreo_Page_0
4 K& [9 a5 C; `) i& U - STA $00,X
4 O/ x) x# {' f$ F* | - INX
& l% P% R. \' R+ ~6 E - CPX #Use_Zero_Page_Begin: _2 L2 E# ]% I h! U- n
- BCC .Music_Clear_Zreo_Page_0
! C% S% `0 x, p/ r% W4 o J0 ^" i -
0 v4 B2 C. a; C9 D$ M7 y - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
8 R. Z9 }6 F+ i# }3 u1 E8 i7 A - .Music_Clear_Zreo_Page_13 _: A$ t5 {+ s+ u6 X$ T! d1 W \
- STA $00,X0 g- q* `$ t) O" ~3 N
- INX
H/ p2 ^7 M d - BNE .Music_Clear_Zreo_Page_1% L" ~, I. |1 [$ ^
- 3 P7 s' R& y! \) ~
- Music_Clear_Process_1
y! u& ? P0 P$ ? - STA $0600,X0 B* H& p ^; ?% X2 [4 A
- STA $0700,X+ e$ m- F: O2 S& w( ~: i6 J+ O
- INX
- z6 G, {9 r& B+ H - BNE Music_Clear_Process_1* |9 f4 H3 m. _" E3 F
- LDA #$10
( Y8 ^/ ~5 Q$ n1 ^! U( R - STA $4000
3 O' q0 q6 p5 T: T( ~ - STA $4004
, |9 t9 E1 h& A5 T" w- z" y - STA $400C& R3 W9 p3 V5 R) n% ^+ E
- LDA #$00 ]( s' q9 D i3 Q
- STA $40081 o0 S" j; q- k5 k
- LDA #$0F! z8 w2 U+ \$ d4 n
- STA $4015
' g( m! r8 V# o) t - .ENDIF
3 l5 ]8 b, [6 l% d4 i) _- L -
" p1 n! q1 {: m& ?$ ` - RTS! G! D! b! x4 u" |) f4 l2 ]
- 1 h3 W/ u+ O+ y" i8 @/ {0 J
- ;======================================================================
|4 g. _/ \; p' k - ;重启处理
/ L& _$ V7 \$ k7 _ - Reset_Program6 s. b2 Z3 j3 q0 X1 O: i
- SEI
+ D/ N k" h2 l3 I - CLD
- G% e. O' s. D: l - LDA #$00) w4 d9 x6 A* v& v* U
- STA PPU_CTRL
! u! l' n) M b& |, G - STA PPU_MASK
7 D7 ~9 c( ]5 ~5 t4 E - STA JOY2_FRAME% f7 z1 Y& a. p& I( h: s T
- STA APU_STATUS* H. C/ V Z$ z7 N
- ; j) D" l" f9 z3 P( H" D( O4 k
- ;等待屏幕准备完毕4 y' r y! w/ W' ^$ |
- LDX #$028 O) t$ g3 v0 ~7 {; {; N% f1 H B
- .Wait_For_Screen_Ready2 Q, b6 }3 T6 q7 _6 |6 r
- LDA PPU_STATUS
9 F- K4 Y% H) H4 d5 Y3 j - BPL .Wait_For_Screen_Ready
9 b/ Y. q8 P6 A/ D% O5 B; _ - DEX! L, S5 c. S \5 i5 y" v
- BNE .Wait_For_Screen_Ready
+ g( p: E0 f; {, {, \' E* M B1 X - 2 I6 x/ q2 o- u' B
- ;清空调色板! M: a+ s8 [' l& H" R6 s( t
- Palette_Clear& G* w n7 @8 ^1 Y6 u
- LDA #$3F
4 `& H, M+ p Y: r3 D3 m - STA PPU_ADDRESS4 S* w( }" v2 Q$ g& L% k5 F, e& K
- LDA #$008 ?, h6 g3 U6 V( Z3 A" B/ C0 j) E1 G
- STA PPU_ADDRESS6 q3 d+ `; u" E
- LDX #$20
+ G `, u( `- o5 P2 R7 }' G - LDA #$0F
0 [5 p h( V8 e6 P0 v - .Write_Data* R" I+ i. N# ~7 V9 B( ^
- STA PPU_DATA3 z" W# p# I. V8 o2 t# P
- DEX
. t4 h: G! m Q. _+ V - BNE .Write_Data
, u* z5 a0 c7 O3 p- ^ - # K1 b9 F" Z* r# y9 z# Z: U- n7 r: P' I9 c
- ;清除声音 $4000-4013' D6 G0 x1 |! ^# ^
- LDY #$142 B0 ^ X+ E$ I/ G' ~+ r9 M, e
- LDX #$007 s' D/ [* c# o* ]% P, l
- .Sound_Clear
8 A7 z5 J7 c' S! C1 U - STA $4000,X
3 Y/ c# s; Z+ P( k - INX
# i1 o/ V5 B3 v+ @ - DEY
, ~ Q8 G9 Q8 t - BNE .Sound_Clear
$ z9 y5 A' C2 l9 Y' e8 C- B5 { - ! S8 N! s" l h1 x- q
- ;清除 RAM $0000-07FF
- m5 d' [( R- v% ~$ r - LDA #$00; W5 |8 p) ~! `, E* \- N* K. ~
- STA $00
; D6 _3 |' g4 g# E# D: P - STA $01) }5 R c3 o' {2 @) h4 `3 ~+ @( p
- TAY: b1 H; D3 L0 y5 R4 f% Q8 j5 N0 ?
- LDX #$088 X2 {4 ]3 v6 l" L: ?4 z1 G
- .Memory_Clear
% q: ]3 z, a p9 ^$ T - STA [$00],Y
7 b% [4 X% u! A/ l. C - INY- Z" k; m# y8 ^. a. ~ m
- BNE .Memory_Clear
" U% c5 W" S2 G# M ^; V - INC $010 ^4 J A" A. R
- DEX" h, v1 J' S: L* s( ~. l0 A
- BNE .Memory_Clear
' g+ c+ R2 M8 u - , {8 Z9 N4 p, e7 D& |% p
- ;精灵缓冲初始化* [- o7 j" p" C% q8 H' ]4 ~
- LDX #$00: s, o2 y& f; k- B$ `% h
- LDA #$F85 E H" i& w+ m3 z0 G3 [
- .OAM_Clear/ {) r$ Y( W/ \+ Q, | E& g$ x
- STA OAM_DMA_Buffer,X0 C+ f a: `' o, l/ }; h/ m, \
- INX
6 [! G9 O/ T: W$ r0 F+ @ - BNE .OAM_Clear# \- K3 ?+ M: o+ H
-
+ |6 G- z# t8 w; G/ A! X! | - ;栈指针初始化! I1 E; Y, F: M# }! G, U( q A/ c
- LDX #$FF
7 `) Y+ ~* I8 X. `0 w( G" s: b - TXS
7 D, A) e, l A# s, _) E9 M, ?" R - & `% T6 V, n' o8 q) |" ~
- JSR Nametable_Clear;命名表清空5 f# F% V; P" X. Y, W8 ~; e
- JSR Palette_Init;初始化调色板缓冲6 O! u6 \: h2 K# K: Z1 M
- JSR Static_Text_Init;初始化静态文本; I! t: z7 q' y8 k! a: M
- & r' t1 v7 }2 Q3 V* c" o( K4 B
- LDA #MUSIC_ITEM_TOTAL - 1" A8 x; s9 T3 O9 @1 G
- STA FC_Music_Max_Index& \" |. _0 a; M8 Z O# r
- 6 x# P! a! G3 T
- LDA #$1F7 x' J5 v5 n) v6 Z# {9 ^
- STA APU_STATUS& w/ A/ T: B+ d" @8 O
- LDA #MUSIC_BGM - 16 S) v# a, H2 A* @% Y, @: S
- STA FC_Music_Index# Y e# U3 y3 h! h, p( q
- JSR Music_Init_Process;音乐播放
1 \5 _8 R- s- O -
: z# n- m4 p9 U8 ~ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)9 j1 O2 @: R9 @, c* i. F
- LDA #$1E3 _7 K/ S& U! c
- STA FC_PPU_Mask_Buf
3 ~% t; \! Z2 E9 u- ~ - 5 b/ O' d3 c, A
- ;启用NMI处理
+ O F0 b9 o; m3 c3 d - LDA #$800 p) R$ U, j$ K+ j9 _
- STA PPU_CTRL# _4 x$ G' r4 u; Z( `: L f! ]4 H
-
! R; {- m8 _% \8 F8 b) q - ;程序循环, 剩余工作交给 NMI 中断处理3 b3 \. f" v0 J# D+ n/ C
- .Loop
, o! J* @! ]$ i# N$ n# n - JMP .Loop% D m1 x; Y. ^. ~! l) Y5 s
$ }) M2 v& r( W9 Z" j( F/ Z" x" J1 E: d- ;======================================================================5 E, s7 \* _0 L4 K
- ;不可屏蔽中断处理
3 f1 V" `8 F' E: m" j - Nmi_Program2 b5 K2 i% t9 k8 z& P* E( s
- PHA9 R( k1 G! P4 x! ` M" x: `
- TXA
0 d4 T- B# I, X5 c: s$ A$ M - PHA% }( o, n2 V4 N
- TYA
4 T+ r0 d) U2 R" a% |! o; l - PHA
; c6 [$ U- j8 y5 z - ( p" [3 J7 h8 x
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位( g$ g& L7 ^' \
-
; E, {5 [# q9 H - JSR FC_PPU_Procrss;PPU处理9 @+ d5 r) M0 O
-
! i$ j4 u4 }, q6 a$ g - ;精灵内存更新
: I, w: l) M L5 ?/ ` - LDA #$00) k! r5 u5 I4 E9 w
- STA PPU_OAM_ADDR. L+ k$ s6 \+ p3 H% k2 n9 f
- LDA #OAM_DMA_Buffer / $0100
& c& e Y: U& O7 c% x# j/ y - STA OAM_DMA
" ^1 }. V$ R, k4 G - 5 }7 U, U0 O$ w$ y
- JSR FC_Gamepad_Process;手柄输入处理
1 ] G8 | K1 A - JSR Music_Select_Process;音乐选曲处理
' m5 Q) Q" \" [' y' f+ @ - JSR Music_Play_Process;音乐播放处理7 l: ], o& s0 q, ]6 }! G' S! }, l+ M3 E
-
5 V8 n* y$ e. W2 |) d - PLA# P/ p) J# I( X7 Z8 e) m) d7 R
- TAY
5 u# l" J* n8 E - PLA
1 S( R, T9 W$ f - TAX
1 v: \ \3 p/ x! k2 Q - PLA, y7 ?* B. o7 \. c+ d
- $ |7 r4 h+ L! l
- RTI
9 j5 g4 X8 p6 o4 }3 T+ c7 | - & d/ K2 D" |4 v
- ;======================================================================3 p- t/ p" P3 O( Q" d0 g O& j' s2 D
- ;请求中断处理; ]0 U0 w4 ?, z- v) X$ Y8 s% _) w
- Irq_Program* d3 K; [* d5 f; n1 F0 ]) c3 f
- RTI
' V9 x' d2 H+ n' B
7 T/ ~! s( H' a/ h" M T- b* ~, a- ;======================================================================
2 R% t4 a( F( a6 Z$ A - ;中断向量表4 y- V* H% R0 u. S9 f
- .ORG $FFFA
3 t+ n7 t7 B8 B/ H7 m - .DW Nmi_Program ;NMI触发时执行" y# f! W/ d6 D. `
- .DW Reset_Program ;载入ROM时最先执行4 w, q+ L0 p8 Y; `/ w% I( O) R
- .DW Irq_Program ;IRQ触发时执行
2 G" j' K5 L# H; ?% {* X
复制代码
; n( R* x4 m+ c$ Z s& ~
! H& z/ l8 ^% t+ o1 X; S. |- `$ v% a9 \5 b
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|