|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
+ @+ k d/ m' p6 O+ X
- _+ {% C+ D+ Z以下是主框架代码:( ?5 Q2 b3 E/ @. P# D8 [) h" v# q& f
- ;======================================================================
5 t8 d* X$ I* P: w5 K - ;文件头
, E# V- U; d. j' _* f/ d1 i - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
9 k8 V& Y7 m# K: E$ A5 f - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 a) H0 s8 r$ W9 s3 {& U# |5 s1 S - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
. G f/ X4 p- q* f% U, \ L - ;======================================================================
" p6 N7 @* q) d0 ?7 e1 \8 @0 l - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
% {$ ~' N- A/ O, Q: a. P - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# n9 Y, {( L2 V2 G1 ]4 k2 N# @
- ;======================================================================; ?$ y1 W- F2 \+ D. B/ U
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" O3 L! `0 d& a
- RESET_ADDR = $E000 ;主程序起始地址
9 X) o2 A. R8 q5 L* h3 g - ;======================================================================
+ u9 s9 n7 U, i, Z8 j' l& q! j - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
( R( e% U9 q0 u* `# s* w! J - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
: u; w6 I9 _ z4 `) b- K. Z - .INESMAP 4 ;Mapper号 (0-4095)
# @' k% T0 o0 x# i - .INESSUBMAP 0 ;子Mapper号 (0-15)* e7 Z* L; b0 o! Y
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
! r8 y3 x `* a7 H) R$ y - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
2 t7 m {- L M' S6 q1 P& E - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
$ G# y$ F( \, s& t4 F - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)* e* V) s {5 U/ j# C5 ?' ]: t9 ~5 X
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
' Y* |5 q4 }! x8 q - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); O) _$ E- b& H; M
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
/ O8 D4 a* U* J# b3 p& h - ;======================================================================( U! h6 e: b, X! y) X7 c/ g
- .INCLUDE "fc_demo_config.asm" ;全局配置
6 _( F. t7 H2 _" I! L3 N3 x0 @ - .INCLUDE "fc_demo_constant.asm" ;NES常量
6 I5 B0 u5 I* k. Q2 B3 c - ;======================================================================
! w! V* l) N! h! _2 A; s" V - ;音乐配置: q1 O! Y6 ]9 B/ d
- .IF 0 = MUSIC_THEME 2 L* E. b4 t: w0 n1 R& h7 F
- .INCLUDE "data/music/Gremlin 2/config.asm"( D8 h$ F( ~! _* y7 @$ g! J
- .ENDIF5 o: p' i' w ]9 C# L' f
-
& }- T4 ^' K, B! R7 J% R0 ~4 G - .IF 1 = MUSIC_THEME$ k; F/ j2 P$ j( U5 `/ B8 X
- .INCLUDE "data/music/Raf World/config.asm"
2 Y; w2 R" z" F* t: k$ i - .ENDIF+ C% @8 j( q6 I5 R% T
- # j2 H3 d- r% Y, n
- .IF 2 = MUSIC_THEME : P5 {& i# |( ~9 Z8 F
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"7 ~/ b: b3 m2 a7 F
- .ENDIF) G! j2 O+ M6 y# U" N) _) t
5 l) I9 D1 U- _1 @% f4 z" x- ;======================================================================
2 x+ d1 ^ W) p' [/ h+ D0 Z - ;引用CHR图像数据
$ M1 g, R* z: j - .BANK NES_16KB_PRG_SIZE * 28 F& r% w ]9 ^5 ^
- .ORG $0000
9 u% j* \- j" {& O" R; v* d - .INCBIN "data/bkg.chr"
, V# H9 @, i, ^0 ]+ P: q - .INCBIN "data/sp.chr"
% b9 g, B7 L% f- V7 H - 1 o" V4 V% ^5 \8 I- B
- ;======================================================================
: \. q% a- C4 ^- M! X( ? - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, S! O6 G4 m. D& l - .ORG RESET_ADDR
5 |+ u$ s0 |+ u z - ;======================================================================
U8 U7 e: ?" K) U1 _8 l4 W7 b' T - ;引用其他源文件 c8 ]) _/ R+ Q
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
* B1 ~- B1 M3 T) M3 ~ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 i- ]7 Q. h P+ t6 f2 z: p& x# q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理+ w: d. W' ]2 Y; K7 z: B
- ;======================================================================- \; ]& ?6 F' R, b% G- S
- & q. b+ ]7 b m/ D1 s1 q& J+ u
- ;======================================================================
2 X" [; }& P# r - ;等待VBlank到来
2 C; i6 o) U7 }0 ~2 q - Wait_For_VBlank
/ J% Z. j- T0 r: G1 ? - LDA PPU_STATUS4 o( Y" H# e, W. q( E" @. _" ?( K
- BPL Wait_For_VBlank
$ Z6 r! V- V7 K0 \3 ?% { - RTS( {2 g/ G& U2 _8 k) c
- 8 B$ b' d/ z3 m9 x! O) |* l3 z
- ;======================================================================$ X5 B, ^6 o0 y x
- ;调色板初始化
' d1 o3 K4 K# j& m - Palette_Init
! v' M9 X3 Z5 T8 s* y% ~ - LDA #$3F% ~+ `- K1 {/ p4 P: n4 b- w2 w
- STA PPU_ADDRESS" o; c' o, N& W1 C
- LDA #$00
& _6 b0 p$ c& ^! ^$ {" K5 W - STA PPU_ADDRESS' ?- Y/ S( {. V# l- S' v8 \+ e
- LDX #$00
5 m3 D/ `, i T) _# K - LDY #$20
( n* a' ^! P9 ?' O8 i2 p - .Write_Data9 F5 M+ N- ^% @ P
- LDA Palette_Data,X; k+ `7 A* m3 ~8 p8 ^& u
- STA FC_PPU_Pal_Addr,X
; O) V2 o7 K5 {* R - INX
0 g6 C7 W3 n& y6 m - DEY
) x1 `+ ?5 F+ T9 i7 C - BNE .Write_Data8 @5 c6 c2 W; E7 `' L
- .End, e3 d- B+ Y3 ?4 u7 g% Q u* r
- RTS8 n0 y t$ H6 W5 E" K8 I
( v- ?7 N% b- X, E- ;----------------------------------------8 V( l4 Y- E2 t! k* B
- ;调色板数据
{" \* ^# i. i4 _- w: E9 F/ y - Palette_Data
3 N3 f9 f$ {, q( N* j# x- @4 h" \. n - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
, y1 [+ g) o+ C0 k - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
5 g9 V9 }( N/ `8 G -
/ Q( V% p2 q: X; h: w - ;======================================================================$ n' e, S6 J" s k5 W. ^# s$ \5 F
- ;命名表清空4 O% v) h( l6 {, G6 I
- Nametable_Clear
6 `& B; _3 w' d% j; r5 u" | - LDA #$20
7 n" w: I' Z9 E+ W5 Y; ? h; F - STA PPU_ADDRESS
2 R2 ]- F8 K, Q! v; G% G1 K/ Q - LDA #$00$ ~& C9 P8 O! c0 X
- STA PPU_ADDRESS
! `* }* b( J; w' d% E - LDA #$00" v% \, b3 t8 }3 r7 {" s1 L
- LDX #$00
1 A& w! l* t5 d1 t - LDY #$08
2 z' t9 C! H$ ]! t8 f - .Write_Data8 n6 R4 }4 R- z8 Z$ K
- STA PPU_DATA
( [, x' Q" R9 h/ D - INX
8 _; ^2 }9 M# w3 A% S5 |1 V4 z0 K - BNE .Write_Data, @2 K3 }. h" ?- s3 I
- DEY7 H& C5 k- u' G; @
- BNE .Write_Data' S' S* t4 M/ y2 d- Q1 E
- .End
4 [9 D* S5 J* l; s# [) I - RTS
3 S+ k. [# z4 N& Z a" y" F - + J- e# M8 f( Q' h
- ;======================================================================
+ w! M6 D( g2 U5 m - ;音乐曲目切换, @3 f6 \8 v- E4 A! c" X3 T
- Music_Select_Process
) Z: `& X' v: j! T' R - ' G2 n% _& m e6 @1 s
- .Pre_Music;上一曲& ^+ N* l. k# D" C+ H) H
- LDA FC_Gamepad_Once
4 U/ P9 J% B, n - CMP #JOY_KEY_LEFT
" g8 ~, }3 ?( }: ?' E - BNE .Next_Music* v% f0 d$ P1 t D) m3 _
- JSR Music_Play_Pre
6 j6 A9 z, c2 f: b - .Next_Music;下一曲: X$ i6 {$ w6 L1 m/ v4 V( T# [
- LDA FC_Gamepad_Once6 B) P5 z5 f3 t, l' k
- CMP #JOY_KEY_RIGHT
' }- o) F) Z% E( o2 j- N# l - BNE .Next_10_Music! O9 K% y/ N( s/ c0 X" K% d9 |
- JSR Music_Play_Next
. G/ [/ h3 s* E7 [2 [! E. Y- s - .Next_10_Music;上10曲* G$ q8 p" u! f+ q2 }
- LDA FC_Gamepad_Once
, W4 v$ Z2 Q% C5 a - CMP #JOY_KEY_UP
' Q! T) P: z. E4 r& u - BNE .Pre_10_Music" c$ r' @( S! t% y- C
- JSR Music_Play_Next_10
$ G T! G8 v- _9 Y% q' |* W - .Pre_10_Music;下10曲* T$ B, A6 k0 P( g( s: u
- LDA FC_Gamepad_Once
/ M+ e% k% A5 p9 g5 i2 a4 b0 t - CMP #JOY_KEY_DOWN! M0 u: [4 s6 }% {
- BNE .Reset
* V1 M2 E" ^5 w4 u7 F. Q4 d8 c - JSR Music_Play_Pre_10
4 A- q" ^9 l( b/ b; c% R; | - .Reset;重播当前曲目
6 h3 [% K, e& w% M9 W; M. N - LDA FC_Gamepad_Once. z' |- ^- [! I, O6 j
- CMP #JOY_KEY_START; S% P# n6 d5 U
- BNE .End g7 G* e- n$ e) X; D: l: j# v# ~1 h
- LDA FC_Music_Index
# P8 }* f1 J% E0 J' ~# [ - JSR Music_Init_Process
; B* a4 B- B2 w# l - .End
, t; e0 |2 k5 L* {$ e8 E - RTS
: H; b4 Q3 d7 q. v
$ J& O. C( a( q: R. I' ^5 B- ;----------------------------------------------------------------------1 u0 P$ _$ f$ S6 ~" R$ `; N
- ;播放上一曲9 o1 n2 c2 M/ y: v/ @9 \2 e1 n: I! `0 g
- Music_Play_Pre2 W2 @2 x, |5 [0 B4 o8 H4 f
- LDA FC_Music_Index
8 q3 \# x8 A3 d9 K+ d& A7 N - BEQ .End3 q+ ^1 {( M- m' e- x
- DEC FC_Music_Index
* K1 @8 }: Z. s- v' i( t0 { - LDA FC_Music_Index- p6 ]+ Z7 u5 J& T, O9 Y0 c2 A' F
- JSR Music_Init_Process! G" j5 X7 i4 N
- .End
' @% G/ |' X" D8 w3 w8 e5 y - RTS0 Q q! C. x8 `% u
- ;----------------------------------------------------------------------8 ]- K# ]1 @, i4 q* B" M& \
- ;播放下一曲
" q. E/ {( Z! X0 |( s - Music_Play_Next
. `4 U# ]: D1 A" _ - LDA FC_Music_Index; n& |5 \7 I' g! t+ b9 f; z
- CMP FC_Music_Max_Index
9 w+ ~5 j. v3 w, b7 E6 f - BCS .End
- i# X$ K/ _* \/ X3 j% | - INC FC_Music_Index o' W$ d; \" S" ^" _) ]" G% {! a
- LDA FC_Music_Index1 @" h# u$ l( Y# w( h6 E
- JSR Music_Init_Process, i. F* ]. f5 _% }$ C8 s% c
- .End, J, c; N5 \( H5 u/ X) I
- RTS
# p- z5 W7 `- N8 G$ |/ T
! I; \) l! a4 n: t- ;----------------------------------------------------------------------
" h g1 g9 K* d, f9 d* Y/ ~- b - ;播放上10曲: {2 `6 \( Q" c, p* R
- Music_Play_Pre_10. R- X& N4 [' n" l3 v
- LDA FC_Music_Index
: z8 m5 M2 ]9 N; [' A& p) T, w - BEQ .End9 f& v1 u$ L4 V2 u- [) u
- SEC0 p: d9 U. A/ K( F
- SBC #10
# m! _+ V, f7 t# b' H0 C3 g" d0 C - BCS .Pre_10
" {4 {' X, S+ K. P3 w( d, Y. L - LDA #$00, m3 X( A: G& s% j- O* f& o: ?
- .Pre_10, r2 d8 A6 ~$ N1 `$ {" x8 _$ N
- STA FC_Music_Index
- k5 D$ D( e7 p+ D& T/ B - JSR Music_Init_Process, q0 W" u O( H/ R% K$ u
- .End
/ @1 @5 \0 ?5 c0 n2 h - RTS
& y4 R2 Z7 v9 P - ;----------------------------------------------------------------------+ o" r" {# Y; s g3 ?
- ;播放下10曲% I: }* h. Y+ [; c( @4 f9 N
- Music_Play_Next_102 P0 W: R d" a/ z- \7 s0 c
- LDA FC_Music_Index. S( K4 o4 c% Q+ l9 s
- CMP FC_Music_Max_Index$ ^ G l$ D) ]1 |
- BCS .End
/ H* i: l, e! F6 |# G; J - CLC$ A6 E9 E+ n5 q4 ~
- ADC #10
1 O6 |2 I) H0 F5 {3 W' e - CMP FC_Music_Max_Index
6 E7 @% h% K, a! h N* _) ~, E - BCC .Next_10
: L' y* [7 m; l - LDA FC_Music_Max_Index8 N% D% O; L, Z. `2 ?* A1 ^5 G6 v9 l
- .Next_107 U7 x; X. C. P5 x& m8 ^ f
- STA FC_Music_Index% c$ v2 H0 J% J; H, l& l( N
- JSR Music_Init_Process& [5 w: U6 ^6 D( p6 z
- .End) k6 G/ u5 I8 I1 U( c
- RTS9 r4 T2 m& N( N: {7 H
) ?+ @3 O* n6 N- ;----------------------------------------------------------------------% G% i0 i+ s4 k3 v$ K8 F0 I
- ;8位十六进制转3位十进制制9 m1 Z Z! f2 Y' J& h. F' R
- Hex8ToDec
$ `. [! L/ I% g$ L: x4 K - STA FC_Dec_Data_1
) v/ P# {( @, a a( }& q. @ - LDA #$00( {; t; H2 ] p, Y8 d- w
- STA FC_Dec_Data_100+ ~7 ]' J- T1 x4 {
- STA FC_Dec_Data_10) ~' y: @& t& X. T$ ^
- LDA FC_Dec_Data_1
$ t' Q: Y8 R9 t% l6 |" ^ - .Convert_100: E) }1 \1 I" x, D# e' u# E
- CMP #100. N0 b' _5 z+ t
- BCC .Convert_10
& N( q$ i) z7 H; w% E0 ], c* q - SEC
, f8 m; w4 ^1 Q3 G! u6 m - SBC #100
0 V( V$ B' \. b, t9 t0 f* Q0 Q - INC FC_Dec_Data_100& L: Z1 }$ l( _: z0 L
- BNE .Convert_100: S B9 y) ]1 ~4 K2 [* U5 }
- .Convert_10
: A- f; m5 q0 X+ p3 T" _% ?! h - CMP #10
a$ A6 {# j* {: M - BCC .End4 [2 X* {* V6 e l6 A: Y% Y$ x# a
- SEC, Y. g9 H7 v+ k4 B' Y* V
- SBC #106 J5 r, A, Z# [1 M2 s
- INC FC_Dec_Data_10
" i% I5 R: Z$ Q- U8 x: b& Q* K0 ?3 W - BNE .Convert_10
0 }9 s6 `3 y2 y" v2 w; K+ n' x - .End
/ ?2 p& `' t8 X" L8 G2 W& r - STA FC_Dec_Data_1
9 Z$ ^2 s: [6 H. Q" o - RTS4 N4 F$ u, s+ \: R" n/ ?; Q
5 M4 z' \7 F$ V3 n: F- ;----------------------------------------------------------------------
1 a/ Q: t$ S1 ]* G1 S( U! u/ A* | - ;显示曲目信息; m2 b, O! G" U1 t( M- t# l
- Music_Info_Display
* Z: s1 b0 H- d/ ]) j - LDX FC_PPU_Buf_Count: q' E6 u4 w6 d4 D! i
- LDA #PPU_WRITE_MODE_CNT_LINE
* d7 {! I; M2 _ ^# N& u - STA Use_PPU_Buffer,X9 [1 F4 N8 ~* b9 y- t. X0 F
- INX
# [' X9 A: p) Q2 J0 f -
3 j* M& L. R2 ]" ?! ^- p - LDA #>MUSIC_INFO_POS% M' E/ ]; m/ a6 {# N$ e" G
- STA Use_PPU_Buffer,X! _( ]/ `: M; u% K3 ?% {
- INX0 W2 \: q; s6 ~0 d8 Y
- + ]; _, y8 r) m1 x; T+ J
- ;居中
7 s: Z" g! {& e, i+ P0 R" S - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
% Q9 y6 w9 K% v9 V" W - STA Use_PPU_Buffer,X
; u2 j( _& a7 E/ r4 d8 b - INX, m6 }' j7 C2 D. G$ r7 U
-
" i y+ U4 a* f- _ - LDA #$05
! l& [/ y2 T5 P* [; O: { - STA Use_PPU_Buffer,X
- Y( N8 p$ f) ~ o# ~! k - INX
]# r$ H4 e" q/ b; e9 [8 J -
( E' h1 |( z( u! O, ^, i8 p4 v - LDA FC_Music_Index
: ?( p9 F: J1 _* n - CLC! x; N( |9 [" ?$ t. e
- ADC #$01
" Z: I* J& a$ T K$ } - JSR Hex8ToDec" [( R! d1 A/ |7 c5 Q
-
1 \: ^2 G: `! n: P: Z) z5 ` - LDA FC_Dec_Data_10
3 F% {( ^* P r" f. d* C; v& A - CLC5 Y9 k3 f8 Q" D& O1 R# g* d
- ADC #'0'6 v: G- n/ Z; Y/ u2 ]/ p
- STA Use_PPU_Buffer,X
' s4 m+ g# z, X - INX z9 | x" k1 D5 w- e$ |4 Z
- 2 D9 ^) M# i* a4 N* L
- LDA FC_Dec_Data_13 A, a* u' C: S s
- CLC2 p+ V% m5 K6 `' P) Y- x
- ADC #'0'' R7 W8 X, X% q& O, z
- STA Use_PPU_Buffer,X
! q# O/ h9 @8 w C+ l' l - INX7 r, W% A* a7 C r& Y& E
-
7 O6 Y8 s4 c5 L+ C) J l - LDA #'/'1 e) ^* N5 w- y+ L) h, z
- STA Use_PPU_Buffer,X
9 O t7 D4 I0 q* X - INX& R" l+ q9 Y7 {6 g! y! e5 ^( [
- , A j' I$ a8 E8 ~0 k' b( Q% B5 S
- LDA FC_Music_Max_Index8 g. V; [" q3 l. |, L c6 j
- CLC# [, o, b7 {( r! X& b
- ADC #$01
. n, h" y3 l! A+ c% u" O - JSR Hex8ToDec9 u+ f/ v- a2 l& I* p, Z1 U
- % \) p g. Y2 g- h% j. a
- LDA FC_Dec_Data_10
# Y$ L- Z R* ~& Q! B - CLC2 ~/ f" }5 `5 |1 m1 g$ [( o' ]# _
- ADC #'0'2 A# c' _0 _, C& `- D" R
- STA Use_PPU_Buffer,X
+ m# U0 \5 M4 ~) d6 O - INX4 s" q" J: D! ~2 c& {6 n
- ' S' H8 k4 P! ]; n. P- y( o
- LDA FC_Dec_Data_16 e ?( d/ b( p: H9 p4 S, J
- CLC
& g, G- w& I N6 I - ADC #'0', B. n$ z+ _: y) ]" E( E+ T
- STA Use_PPU_Buffer,X/ \/ ^* } { r7 t: _5 V* |
- INX R# z$ L S% T+ h) K9 A( M7 Z" _
- . Z7 |3 k4 V- ?
- .End
+ N) L" H( j. l% X5 I1 h5 D5 N" w - STX FC_PPU_Buf_Count
( v: y5 T0 l' L. G$ Z: _ - RTS
" Y& H! Y9 L6 w - ) m4 S6 V9 B7 x- _" Q
- ;----------------------------------------------------------------------
: X# ^" Y2 F3 t4 M/ t - ;音乐曲目初始化处理 B e- N* o; {" _$ m! ]
- Music_Init_Process
* a) E) w2 H5 s4 z- J, J% J - PHA0 M. Q2 F9 a: H
- JSR Music_Clear_Process2 Q: Z4 ?, N3 a( [! U6 t# x
- LDA #$1F
! E0 ~1 D: Q) { E9 [4 E/ g; C7 } - STA $4015
2 Z6 I& x7 K4 s7 {; ?$ K" e8 l - PLA7 ^. f4 D: n* p2 ^) {/ g
- JSR Music_Init_Addr# F5 o3 |2 x {& j4 M1 v1 f0 _; b3 {
- JSR Music_Info_Display0 X; e6 Z( }4 c) N8 H6 ~
- RTS7 \! d# f" N7 |9 J: r: Q
- " r% ], {8 X( D
- ;----------------------------------------------------------------------$ q& \: q3 y* X. K: |
- ;音乐播放处理
* O! O$ [! P8 @6 Q& W N% n$ M$ h1 f - Music_Play_Process( F w5 s! W$ a5 V; C
- JSR Music_Play_Addr* W1 J9 V8 \9 J2 S d# P4 T1 w
- RTS7 h, e3 C; p1 I% F
- 5 l4 L' I p3 o2 }: T& y" q
- ;----------------------------------------------------------------------3 E1 D8 ]% x- x# j# B
- ;音乐播放处理
8 Z9 ~! E- ~# [1 f - Music_Clear_Process
% c! H8 V! {* _1 ?+ E - .IF Music_Clear_Addr
% i, ?% L1 C, v% r; Z: F$ E - JSR Music_Clear_Addr! z7 _" h* ] E- B. e& H# d4 T; [6 V
- RTS
$ D% g# e* r1 R8 ]( M- t - .ELSE
# E' l4 d s( `+ o5 p" m6 v - LDA #$1F
5 U* O( f3 c/ W/ a( e! f - STA $4015
( X/ ?5 _. m4 B8 N6 w - LDA #$00. G; Q% G! ~* P2 d: O. u
- STA $4010
1 P4 H4 N1 L5 O6 I' d9 l - LDX #$007 S0 X8 o2 o9 n/ F/ f6 E
- LDA #$00/ }( |/ ]& m" |0 N. W
- 9 Y2 s9 \) z: X$ D ?
- .Music_Clear_Zreo_Page_0, l- \8 I! w1 O
- STA $00,X
2 S$ H* c f& z4 P0 }6 @# ` - INX X+ o, V( G9 d; @, B" Q
- CPX #Use_Zero_Page_Begin- N7 J! K% }8 n+ T# f1 w
- BCC .Music_Clear_Zreo_Page_0, T/ ]2 ]( Q, j9 p$ H
-
8 |3 r7 n; V7 F9 C1 Y$ f/ G5 W- ? - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
$ f' P8 y R( ?& ?7 Z* y# {4 B - .Music_Clear_Zreo_Page_1
( o5 x7 S. ^* ~+ }: q - STA $00,X
% K! P! R# z. @% h2 k+ v w* [ - INX
& j- b! a! R2 K3 [% u) d3 t - BNE .Music_Clear_Zreo_Page_1
) u9 ]; ]" u \9 i- t' ?0 B1 Z& Q4 q - 7 r# T f) ] h* L/ X: g( a5 S
- Music_Clear_Process_1
. o+ r. V/ T' ?- U - STA $0600,X" r+ h/ V8 g' I6 t' z' r
- STA $0700,X
0 S7 y* U$ m( W% S; [# }& [- f - INX
; Y: s$ `% _/ O. Q! G - BNE Music_Clear_Process_1
9 ^. W& f: v* ^( J* E6 C c - LDA #$10
, Y) ]4 X" A( A& j - STA $4000
L; \* @$ [" D - STA $4004
. I' Z7 q2 J- W r7 ]9 ^- k - STA $400C( ^! P# \3 k' {; N3 C
- LDA #$00
! z6 d* ~+ U% N; q) W k - STA $40086 H7 r+ v' X; ?( Y
- LDA #$0F# m e3 t) ~. `$ J/ l5 n; T
- STA $40157 r! X( s* W% f9 M
- .ENDIF" x8 O2 {# Q: c# K
- 0 z I+ y' ^ o; {# Q
- RTS
1 I" g1 `0 }) J3 s& z0 ~ - ' s7 K: _% W. m; B y
- ;======================================================================
" }1 W! K$ c" F4 @ - ;重启处理
7 j6 ~" z# A2 c- u' G - Reset_Program; F# U' B" h- S2 {; O$ O1 I
- SEI
5 k. K7 N9 k7 A& L' h# q - CLD4 ^& ^1 l- R5 y, @& A% Q4 _
- LDA #$00
6 T9 v6 H9 `' F: ^' u7 m {8 S - STA PPU_CTRL: J' n1 l6 M7 u* z- K5 w$ _
- STA PPU_MASK
. I6 Q4 X; s& p! f( e5 x - STA JOY2_FRAME- q) g5 v6 g( U% J- x( }( L
- STA APU_STATUS
8 e& b5 J, O9 s& v - % @* }! Z F' _. q
- ;等待屏幕准备完毕
! ^$ {! s: I& Z4 ^3 B9 u - LDX #$02) r4 A3 u6 k# y2 E, v4 T. M% p
- .Wait_For_Screen_Ready
8 Z; u" y( f1 a! O - LDA PPU_STATUS
7 O' L. M+ B5 l! |7 @% b - BPL .Wait_For_Screen_Ready% v+ \& l# C. D: Q5 N! R) C j
- DEX! b G, W: ~9 g! T+ _6 n! A6 k
- BNE .Wait_For_Screen_Ready7 m% q5 H1 f3 b5 C) B
-
9 ]: `3 Y }3 {) z" y# V* W) G4 r$ y - ;清空调色板4 w: u1 S, T/ F- f0 {9 V+ R
- Palette_Clear
; o- D7 ]) W; v) K$ \ - LDA #$3F
7 W$ @- T+ x; L ?0 K9 t' V, F - STA PPU_ADDRESS* O3 f0 f( I, D+ c/ r, A2 \! C
- LDA #$00
- s a' n: B; W/ }, d* ` - STA PPU_ADDRESS
4 w" ^, N$ G5 I# D6 R - LDX #$20
, f. _2 b Z( p% ^* B - LDA #$0F$ h$ Y8 K0 x6 z: z/ E2 ~' Q# A
- .Write_Data
1 r# z r2 h; W. R2 i' d - STA PPU_DATA
9 s, C2 c) u$ M0 [+ z4 B& n - DEX @$ B4 s2 b0 L0 e) i1 z7 i3 s9 L
- BNE .Write_Data
% c0 O- j$ U3 P - ) p M& E6 H5 [
- ;清除声音 $4000-4013
8 Q0 B% }: `% I' N$ f - LDY #$14
. d: ~9 D1 N5 h - LDX #$00
* Y! a5 p; ?1 W) ^# G1 x0 } - .Sound_Clear. H( C5 v( _" a
- STA $4000,X9 T* b% [3 M. s9 M4 U! X
- INX" t9 X7 _9 V: f+ K1 i1 Y( V
- DEY
% n2 n3 n, G+ _/ X' | - BNE .Sound_Clear0 _0 B5 S4 x1 [
- ' k. O% X$ M2 S' }: B
- ;清除 RAM $0000-07FF
! M1 h: B3 C- v# a) {" T/ K - LDA #$009 K1 @1 s% Q& {, C( r1 P
- STA $00
* w3 K3 u' Y. C - STA $01/ a- z: ?/ }* R4 g% ]6 V
- TAY
8 C& K/ f M i0 y v* y - LDX #$089 ]) e1 {6 T4 v# h( k' W8 L1 n. x
- .Memory_Clear W8 l( w. J( {4 Z8 w2 A/ p
- STA [$00],Y
/ m% I6 c" K& S# Y- P1 v) y - INY; y E9 v( B& c0 [. O1 L
- BNE .Memory_Clear* F" _3 b0 [/ _7 a% Y4 A
- INC $01
6 \; `4 Q) Y2 b* @! t' n - DEX0 d4 m" M% X8 |) @# W8 C, ?0 \
- BNE .Memory_Clear0 z6 O! w5 t- {. l( x4 n8 P
-
+ o9 ~+ c/ ]8 ~) V4 w' m - ;精灵缓冲初始化1 s( U( W5 V' k) V1 @9 G! R
- LDX #$00
" K" l+ Z2 {) T - LDA #$F85 `' a% g! H8 Q
- .OAM_Clear3 F. z' _2 y, ^5 b. K
- STA OAM_DMA_Buffer,X" N0 B q$ [2 ~8 m8 K
- INX! ?2 k) s- O9 a% V3 ]
- BNE .OAM_Clear
; e9 g# f- V+ k, l S) C - - {8 V! h) C$ F
- ;栈指针初始化
3 b, b4 c/ A9 e6 v3 \" ~ - LDX #$FF6 ?6 F/ u: V& f
- TXS
- ~; `1 F( i# n. N9 d -
( W4 |$ a B4 h - JSR Nametable_Clear;命名表清空
i- }- ? h/ W+ G& Q& F$ u5 ? - JSR Palette_Init;初始化调色板缓冲 A% j8 }" w+ r9 `) J7 i6 L4 X
- JSR Static_Text_Init;初始化静态文本5 o0 O8 r" h3 h- p9 }
- $ C4 g1 N$ b3 z7 c) {& H* p. J3 ~
- LDA #MUSIC_ITEM_TOTAL - 1
( R7 c, O' {2 ^2 o' C% z7 q' V - STA FC_Music_Max_Index
- w% }/ m+ \8 `. D -
( c) O9 o" |3 f - LDA #$1F
/ J7 ]& a# q( K! J1 P& G( C: r% I - STA APU_STATUS% l8 y4 H: Y, X) y; D& U7 Q
- LDA #MUSIC_BGM - 11 J4 h+ y) Y" h( Z* {
- STA FC_Music_Index
8 _) S, o5 I- x$ ~1 ^ - JSR Music_Init_Process;音乐播放# s7 U( D1 S( c7 J+ i
- # v/ |- p [- _2 |: l
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
q' h% Y5 v8 L8 F6 _ - LDA #$1E" R, a4 z4 S. |& h& a
- STA FC_PPU_Mask_Buf
" A$ V. m5 R# L9 {3 H5 f -
) V o4 M2 ^7 e, H" x! D5 h0 ^, c1 n2 w - ;启用NMI处理8 d3 U( P! g( _
- LDA #$80
+ N( j( ? T k: g) g J% L - STA PPU_CTRL" q- I0 B$ X# k
-
0 v* v3 F( c: I$ v - ;程序循环, 剩余工作交给 NMI 中断处理" m3 ?5 [0 ? u [9 \* F4 w
- .Loop
, O ^2 V( w, Q - JMP .Loop& T3 d7 S- C4 m/ b1 ?6 a2 @; ~
5 {, V7 F, A2 x- ;======================================================================
; L5 R* ~! m" s( Y9 d - ;不可屏蔽中断处理
+ k2 D4 L' t# Y* Z9 ]) F2 c/ w - Nmi_Program
% V' ~7 g# W3 p% L" G - PHA$ l2 e7 u* G/ {
- TXA/ Z: m- N! Y+ j
- PHA
; z# x O# U R+ k - TYA
6 Y9 Q) k) y D) j - PHA
- Y% m$ R% \" a. R5 C -
) j0 m* R' M ?# m% a F - LDA PPU_STATUS;读取使得 PPU状态寄存器复位( U3 a; s5 W+ P, \) ~* K; @
-
" e' J& p# n& n8 g - JSR FC_PPU_Procrss;PPU处理
/ f2 f- X/ ~0 b! w -
7 q$ A; y9 B6 Z6 p7 d - ;精灵内存更新
' @! J# j( i8 h |7 f4 F9 | - LDA #$007 E: ^! _9 D$ B# [: F
- STA PPU_OAM_ADDR
- i2 E) n) b: a - LDA #OAM_DMA_Buffer / $0100
/ ^1 j' N6 q+ c, ]$ h* D - STA OAM_DMA3 @: c7 s6 {6 i
- 3 i( W7 L' C$ K: g& H9 k, e
- JSR FC_Gamepad_Process;手柄输入处理
: u: ~" \% }8 `8 }/ a - JSR Music_Select_Process;音乐选曲处理
7 e- P7 p4 c/ J7 q# w - JSR Music_Play_Process;音乐播放处理
% o; s& j$ Z7 w" H - 3 b# n2 [4 I( @2 u" A
- PLA
8 u+ ~3 |% Y% b7 ~9 f4 R: d. e - TAY
+ Q% T" h5 }8 z" z - PLA3 f! c5 [+ \) N* d/ j
- TAX
' _2 @, K( W% X; e1 z - PLA
" X9 K# z5 e7 r - + J/ K* H" O" _, o3 \
- RTI
. I2 T9 w7 y$ G- X0 T - - O' C$ \ A$ z- t
- ;======================================================================
* w6 i- }( {6 X1 m" { - ;请求中断处理
4 E0 G& \, s" g0 W* T - Irq_Program
) a( n- |) {- s' u, u7 _ f - RTI. C% a# ~6 r2 Q+ C
: w! L5 ]4 i; u8 U* L# k- ;======================================================================5 h( w( b# i& V! _& J' Y
- ;中断向量表' f4 v$ u, L3 P/ T/ I/ p
- .ORG $FFFA' W2 s7 d1 j* n
- .DW Nmi_Program ;NMI触发时执行
! z6 `1 K+ r7 \% V* T( ? - .DW Reset_Program ;载入ROM时最先执行
' t4 t9 [. l7 D- T. ^ - .DW Irq_Program ;IRQ触发时执行; h+ Y, ]/ W6 {& ?# c( ~! z# J
复制代码
% {/ ^/ H; o, k
& B- o: K' z# X; y, `$ t' n# @* G; n: B: O+ X5 R! z7 A
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|