|
|
- [code];[FC音乐][MMC3 IRQ]
/ D, ?; G: L$ u: o9 n - ;FlameCyclone 20230710
1 U) f) J8 H$ H* T* `
6 {- @' L2 x$ z h0 _- ;文件头# n. P7 A! g2 a: ]$ S' S
- ;======================================================================
6 x" j6 f4 O9 ~2 @- {& W9 q - .INESPRG 4 ;16KB PRG 数量% B6 [ W% ]% O4 I
- .INESCHR 1 ;8KB CHR 数量
0 ?: @& a L& N9 y4 R' o! z4 Q - .INESMAP 4 ;mapper 4
( k& }, y3 Y1 d/ T7 O - .INESMIR 1 ;命名表镜像 0水平 1垂直
8 @* U" x y" ~& A! ?: b
) u4 L5 h/ g' T1 C$ f- ;必要条件5 m3 K; g8 Q7 ]+ [* h! f
- ;1.持有CHR ROM X) u. y! _ Z( b/ j/ d- k
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
7 G+ _, I% H' c3 F) n - ;3.精灵内存(OAM)不为空1 K- }4 ]) V, E4 V& w0 J
- - K; i% b4 l7 [+ ^$ c* l
- ;==================================================
1 K/ O' {, y0 f% o+ J+ Q - ;NES端口常量' T! ?/ [8 ?: e0 ]. G
- PPU_CTRL = $2000 ;PPU控制寄存器( p' z8 d v3 @7 V& F, f8 @1 Q
- PPU_MASK = $2001 ;PPU掩码寄存器; h0 ^; d/ {, P! T1 n, x8 O4 D* e
- PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
' V# j$ o6 }+ b9 s: H - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
0 t1 o: z N/ X1 z0 r, ] - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加18 {; R E1 r2 t/ a
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
) \ _. ?6 n! ]* v0 l - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加8 y0 `/ T: [: V' E6 N5 O& ]
- PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
! _( C8 a, a& b+ i& c5 Y0 U - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存& W7 C- e$ B2 }- G! |* X" l% c
- APU_STATUS = $4015 ;声音通道切换
" D* |" I% j. ^$ j% S, \1 |) ~ - JOY1_FRAME = $4016 ;手柄1 + 选通& N; M9 H }/ u4 t Q( L9 M) l
- JOY2_FRAME = $4017 ;手柄2 + 选通. Y l5 o2 \$ ^2 R# D1 _
: H9 o2 C7 J, c( ?# ~/ P- ;==================================================
( x+ S8 e1 a* c% j - ;MMC3端口常量
, b( Q+ M _ ~: I) } a6 c - MMC3_BANK_CTRL = $8000
3 b; `; @3 r* y5 X - MMC3_BANK_DATA = $8001# w) v$ h# j/ W8 d2 \$ \5 G
- MMC3_MIRRORING = $A000
: W5 p! q0 O* i& v$ c' ^ - MMC3_PRG_RAM_PROTECT = $A001
+ D1 _1 p! g. E1 z - MMC3_IRQ_LATCH = $C0007 Q% G" w* l2 x2 M# `
- MMC3_IRQ_RELOAD = $C001
' k& k6 Z) c: \5 F3 E - MMC3_IRQ_DISABLE = $E000) l) j' z' E" ]3 r
- MMC3_IRQ_ENABLE = $E001
' u0 j' l' L5 k1 t/ [9 A4 b, Z
- I1 h; h4 v% f9 y- J: n' E- ;==================================================5 _( Z6 r4 F7 _' z
- ;程序块配置$ y: P5 |" a/ h9 ?
- BANK_DATA_MASK = $07
. [; C9 G2 _5 l. K/ L6 h* f5 C4 c - ;--------------------------------------------------1 l7 P1 A* M1 K" k
- RESET_BANK = $07
, J+ D, w# t5 T u: x - RESET_ADDR = $FC00
) k% \; B( X2 o3 N8 A* `0 Q
0 v) w5 M" x, x5 r8 O* k/ f7 B% u' ]- ;==================================================$ | v$ t$ [. q6 k4 }/ x9 `( y
- ;图像块配置( }. w4 D) k9 Z* f' `1 f! f9 n$ e
- CHR_DATA_BANK = $08
, P. D5 [ G& L5 [8 [
% h/ `5 k8 t' `3 Y; [) r- ;==================================================
6 u7 J) z: j! j7 b/ Q7 h& y0 o - ;零页内存地址配置
' n' q3 _. s, Q. k3 J' {# x - Use_Ram_Addr = $80! }! R0 X$ P0 ]2 T
- PPU_Ctrl_Buf = Use_Ram_Addr" E, g: x, E. s7 `
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01
9 E3 T# g2 R) g/ ~, z' \* w - PPU_Scroll_H = PPU_Msak_Buf + $01
4 _) O1 ?* j6 R/ a) U) n - PPU_Scroll_V = PPU_Scroll_H + $01
& D/ K, j% E2 T' s" X0 X2 s8 W F - FC_Data_L = PPU_Scroll_V + $01: ]& v- e5 U4 y! T7 e
- FC_Data_H = FC_Data_L + $01/ M0 k6 Y+ }" c Z& f1 X
- FC_Data_Buf = FC_Data_H + $012 u) N1 [; V+ @# j. k5 n
- ;==================================================2 E6 }7 Y: h1 \$ {' j
- 1 N3 ?) o- x$ E
- GAMEPAD_MERGE_FLAG = $04
5 X$ M* G( Q/ n7 F: } - # e' `" x g0 h$ {" Q
- Gamepad_Keep = FC_Data_Buf + 1/ w5 h* N$ t' C% ~3 j1 R
- Gamepad_Once = Gamepad_Keep + 2) K4 Y. _0 q& h$ E$ V
- Gamepad_Temp = Gamepad_Once + 2 v2 D$ g$ J2 g" x: Q% Y
- $ t& J4 l/ }5 y+ i5 w/ F5 l0 n, R
- Gamepad_0_State = Gamepad_Temp + 20 h; t. v. ?4 _/ o$ A, W
- Gamepad_1_State = Gamepad_0_State + 1# T/ p: ^( j( b
- Gamepad_0_Value = Gamepad_1_State + 1
" U/ D6 ?: M8 S& i- E - Gamepad_1_Value = Gamepad_0_Value + 1& q: I; K+ h1 G* t0 ^9 u" O
- Gamepad_Port_Value = Gamepad_1_Value + 1
6 h9 s% U7 n" F: ~6 R7 k& i' Y - Gamepad_Merge = Gamepad_Port_Value + 1
/ x' ~+ K5 C7 t7 c - / y8 ^5 ~6 E/ ?
- ;==================================================( s7 Y6 \ j, X6 p
- IRQ_Index = Gamepad_Merge + $01: x% K3 r/ p- F k- a4 `
- ;==================================================
) V# \5 P, v( A. h+ c - $ G- `* G0 q' R" P7 |
- ;CHR图形数据- } S7 X* E: X6 Z$ v+ ]+ h1 g
- ;==================================================
8 b3 L6 n' {' S+ Q - .BANK CHR_DATA_BANK# r1 \ v3 j5 S) [8 A k
- .INCBIN "chr_bank/chr_data.chr"
6 u! R' N6 [. l) H: D( T: V4 e -
( Q7 j/ @# a; A" F8 C, F5 \3 d1 t - .BANK RESET_BANK & BANK_DATA_MASK
0 j' n; v X: ^$ z- g" \# y) J - .ORG RESET_ADDR) S# R; m- _+ c% A' A
-
% k" W" a3 m3 x" a8 I - ;--------------------------------------------------2 }1 H, R E/ g
- Attributes_Data
* X4 r& E1 K( ]- }: l8 C - ;命名表属性
9 M) R6 w6 m; L4 N) X( ]; u - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00! P6 x! s* M }9 O- f* Y
- .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
5 Y+ d- f3 `9 X3 q - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
" v- X: R! Y! v$ O, w) c - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$555 q3 r* d& D! A0 m: d; s4 g: U( B: n
- ;--------------------------------------------------
1 v9 u) F; f4 W$ \# ^8 K - ;调色板数据7 c' o' V7 x. c$ |, h0 |
- Palette_Data& ` O5 z. x+ C& }/ w. r
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
& r |8 e+ S# A, N* \2 f+ ~5 V - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
, h& M( |" d2 x: w& O( P - : b: i% R! I/ a
- ;==================================================
6 F2 Q" p0 d. W D+ }1 r - ;命名表初始化
3 I, X- S% F( m4 n( ^ - Init_Name_Table
( I$ r* G4 D# f; I# [( _ N - LDA #$20" o |& W. |3 \4 ]9 ?7 J( u
- STA PPU_ADDRESS0 ^" G: `( ]9 c* ^& M4 O
- LDA #$00
% H4 P G$ R: \0 u. c3 a. R3 {6 D5 M - STA PPU_ADDRESS
! I3 B$ B( G$ Y - LDA #$00
: y- Y# ?" q. `5 a - LDY #$00% o& l9 A: X7 e9 J
- LDX #$102 k0 Q5 b+ w1 C8 A8 ]1 y
- Init_Name_Table_Write
# c. i' B7 ]9 I. |. L: h6 ] - STA PPU_DATA
4 u5 r: B- z" _2 `+ ]- I - INY3 @: S! [: i) N! ~* X7 v6 ]3 ~
- BNE Init_Name_Table_Write+ l8 S' k: i! I, c# x
- DEX/ w; w4 a& K3 m- Q5 s" |+ k8 I
- BNE Init_Name_Table_Write
' v6 l) s& D* @ - RTS
6 `* y2 _- E* ~5 Z - L+ B, a6 z E# D
- ;==================================================5 X- P4 K( S% M- K
- ;调色板初始化! {* [1 L1 ~. I+ B
- Init_Palette, q7 `2 G5 c/ z8 q, x5 `- s" g
- BIT PPU_STATUS
% g. b& U3 U, o! E3 z - LDA #$3F
1 n0 q* a$ Q; j8 Q7 v - STA PPU_ADDRESS v F( D3 K8 T1 E+ O0 Z8 a2 c
- LDA #$00
! k* R$ F( E4 q8 E; }( W0 j - STA PPU_ADDRESS
; {; l7 Q3 s) D) H - LDX #$00
2 ]' k: @) n" X+ w# K9 |* S - Init_Palette_Write6 u8 _& k: d5 y7 h
- LDA Palette_Data,X; P0 G6 P& S6 F5 q# Q, [' I4 K
- STA PPU_DATA u/ Q% \- e/ c) l( {5 ]
- INX
$ D6 D( [ D0 J2 R1 Q1 w - CPX #$20
8 P, D% r5 U+ V! Q6 a, N: Y - BCC Init_Palette_Write+ H# @& E7 B8 f6 T9 \7 d
- RTS) @4 _7 f; A, C2 J0 C
- 4 o: f! G {7 K
- ;==================================================
* U" Q& K* _* q0 h - ;设置命名表属性
, m0 P3 y2 [0 t' g: h/ p - Init_NameTable_Attributes
- b1 g( }$ R8 A5 K - BIT PPU_STATUS
2 |6 q. q" i5 Q# _: { - LDA #$23: s- @2 Q4 ]1 ?. g. I' V, M$ }
- STA PPU_ADDRESS
7 o/ Y, } ~; Y" J2 D( M - LDA #$C02 T& L$ ] R# n" |! w
- STA PPU_ADDRESS
2 }+ i! o0 P& T4 w' ?; R - LDX #$006 U& j( z/ z9 K; A" s
- Init_NameTable_Attributes_Write
9 C4 v2 O* ?4 C$ m - LDA Attributes_Data,X. g- V1 i& I8 X; D; I C2 M+ n/ P5 X
- STA PPU_DATA
* B- @1 @+ w: P# n: f4 i+ z - INX% E; _5 I2 w8 N9 |2 N
- CPX #$402 J1 Z: ~. g! ^6 x6 q" P
- BCC Init_NameTable_Attributes_Write
8 C# [2 b& Z2 P - RTS
4 r7 r4 {2 e& o/ m8 d( n; o% d - 3 `; ?' m6 F J7 [ i5 j
- ;==================================================
$ R* A/ s5 ~0 X5 w" { - ;初始化命名表文本4 v/ j2 ~6 Z* O7 N9 R, H: _
- Init_Name_Table_Text9 _2 p, Y7 x1 N7 ]1 R
- BIT PPU_STATUS3 @5 b# E3 a: }. v; f
- LDA #$20' j! B/ c( @3 o# Y0 ~7 ?: u
- STA PPU_ADDRESS5 y1 o' s" L) m8 q
- LDA #$00
1 d9 u; w# K/ ^. b( K - STA PPU_ADDRESS
6 k) ?6 N5 X% s) Q5 E: E4 c - LDA #$00: W' c$ B# d- w+ t2 R
- STA FC_Data_Buf# N p' i5 w! i
- LDY #30$ z% ]" @3 H3 F# }7 \4 k
- Init_Name_Table_Text_Write
( [" d ]+ f9 I& _4 b - LDX #32# Z8 @0 }0 m# e% d0 q
- Init_Name_Table_Text_Write_Char) ` O+ ]( r* [3 z+ @' O! G- l
- LDA #'0'
* l' } x0 [1 L" p* ?& i0 E3 T& {' S - CLC
5 b) b3 {1 w4 M- h - ADC FC_Data_Buf4 d* ~8 c# b9 G$ T P2 z
- STA PPU_DATA
, g D! H. F' v7 t# }' l. g" a7 Z - DEX8 r& U( W' E7 i- Y
- LDA #$14
+ |, ^. [6 X* k. R! t - STA PPU_DATA8 c) v& H/ e ^; X" M! x
- DEX1 q# D: x! |8 i! w
- BNE Init_Name_Table_Text_Write_Char
, j: H' X7 Z- [; O$ z! r" l# W' n8 u - INC FC_Data_Buf; f8 B8 O1 H& p. h5 a) M7 g t+ h$ _
- DEY
% q, s" G" Y# ` o) a! s, \ - BNE Init_Name_Table_Text_Write3 j/ `! F5 Q, N" g7 G, \
- RTS
& ~( {" @$ X% u) O d6 ~
$ C* v3 V& y# K" g- ;==============================
% V/ H2 E- E6 f" p) v0 T - Init_OAM_Ram;初始化精灵内存
+ t. f. c( |, D- S8 q4 s |3 S& U - LDX #$009 H5 O3 F* Q/ H' H( K2 t) ?
- LDA #$00
& s, T( M* P* u9 a5 M - STA PPU_OAM_ADDR
+ @' H& f0 }) q - LDA #$F8$ L% z' s* t4 S0 D+ y1 F
- Init_OAM_Ram_Write
& Q% }* @, [" W" N - STA PPU_OAM_DATA
4 h/ c# I1 l. N5 {) ] - INX1 w, n9 u0 ?0 ], j0 O: X" A
- BNE Init_OAM_Ram_Write
: O8 x; N T5 ~4 |. Q7 g+ Z - RTS
/ `' p" M0 o4 c) U/ M" m% w - 4 \1 _3 n, f% [0 K) o
- GamepadProcess;手柄处理. Y: ^8 O. W3 @
- JSR GamepadDatacan% f' v) r! t* U/ I' D! B/ g
- LDA <Gamepad_0_Value
b/ a' T! W" s( E - STA <Gamepad_0_State
4 H( g: m( n3 K - LDA <Gamepad_1_Value1 y! \- Z$ { K. Z0 m! V
- STA <Gamepad_1_State
0 ~$ {$ `7 g7 a0 W - JSR GamepadDatacan
+ P! L {0 S" J8 n$ a - LDX #$01
# Q& F5 W) {8 l. T8 N" C+ c: D - GamepadMergeCheck;合并手柄输入检查6 s( m3 @* N% s( c0 b6 {1 g
- LDA <Gamepad_0_Value,X
+ ?* l5 c6 V9 K& u, K2 ?' }) t - CMP <Gamepad_0_State,X
6 M' ~: D# S4 m1 |7 Q2 U3 U8 L: ` - BEQ GamepadMergeInput
8 V1 B5 [7 v# o - LDA <Gamepad_Temp,X. [; [6 P2 d5 R/ @2 d$ z
- STA <Gamepad_0_Value,X% _) ?. g% I+ q% G
- GamepadMergeInput;合并手柄输入
# x+ y" ?5 G9 Q/ h/ S0 e - DEX
% ]. w/ _) Y1 s2 l) k - BPL GamepadMergeCheck* T/ L8 V! W2 L5 P g D
- LDA <Gamepad_Merge- Z+ f* u) P' o2 ^- @( i1 m
- AND #GAMEPAD_MERGE_FLAG5 S( A' a9 B9 h5 c' T
- BNE GamepadStateProcess
9 {. J( Q% p3 y& c4 I4 |. w - LDA <Gamepad_0_Value% |+ R1 C) A8 d8 K3 ~6 n, O% Q
- ORA <Gamepad_1_Value
8 G" g. q; r- ~* o' ^/ O: s6 e# g' r - STA <Gamepad_0_Value
, H0 ~( T5 F1 o( f% Q7 B" Q0 o" O1 v - GamepadStateProcess;手柄状态处理
8 V& I3 E7 s3 f. V - LDX #$010 R+ a3 Q1 q# W/ P2 t/ B
- GamepadStateSave;手柄状态保存
7 i3 }: Y2 C( I0 P9 _2 C% [ - LDA <Gamepad_0_Value,X- v" y% O+ }2 k
- TAY
3 \) g" M7 ~+ V% Z0 U, F% t6 z! ~ - EOR <Gamepad_Temp,X( o8 q' T2 t7 R9 h1 @* H
- AND <Gamepad_0_Value,X4 J: Y& ^ w4 A: ]8 H' |! s& O- D
- STA <Gamepad_Once,X+ l$ L1 }, o0 W" Z0 b
- STY <Gamepad_Keep,X
8 P8 G4 r7 o( \) c - STY <Gamepad_Temp,X
0 \( D1 V5 R& s: q - DEX' _0 `. K; ?. R! M. X
- BPL GamepadStateSave
( l" I7 g6 D, S4 c - RTS
2 b3 R# T4 G0 \: s - ( W- q. b& `. V8 a" B
- GamepadDatacan;手柄数据扫描7 h3 I* i. F- o! R. b1 l
- LDX #$01 Q) W) L; m" J2 D+ R) `! o
- STX $4016
6 I1 U% `# ^9 Q6 j- c - DEX& M& @/ r- y6 n; O, i' E
- STX $4016: s' y; U1 K+ A3 C; a# d* X
- LDY #$08
& \1 D' n. c9 ?0 z! m% q - GamepadPortScan;手柄端口扫描
4 I0 i" b( p7 @% i4 ~) k% M0 O - LDA $4016
- p4 X2 g3 L# M. u4 A5 ` - STA <Gamepad_Port_Value4 L9 v! z/ C2 O4 \* d
- LSR A5 X+ N. w- R, \) C! ]; g# R
- ORA <Gamepad_Port_Value
( x+ H+ }/ \' F% j - LSR A9 {* C: v3 O; z4 b
- ROL <Gamepad_0_Value
1 u0 H$ C8 Z: U2 F4 w* u - LDA $40179 S/ T6 E/ W, @5 X/ d
- STA <Gamepad_Port_Value' G* \7 C* l" A- o$ e5 y
- LSR A
1 ?; m! x: L" U) V( | - ORA <Gamepad_Port_Value$ \3 J: c; S" a( I
- LSR A
& E9 N. z" x: J. o - ROL <Gamepad_1_Value
% T, A- @# ?/ v) V! u/ l! Q" l. v - DEY3 {. W, X0 k! q! L) `) _2 q% R; e
- BNE GamepadPortScan0 f; P' f; w# R" Y5 r$ c
- RTS
; l5 C( ?4 w" U4 _& X2 D$ V -
; j7 [" T: d6 _6 G4 K+ O$ | - ;==================================================) A. v2 G3 `9 z; k* Z. \% ^, p
- ;PPU处理
# p4 V% G$ ^2 J3 E - PPU_Process
; U) E |) D+ j3 M# z2 i# ~5 P - LDA #$00' W: S9 W' |7 ?) T+ ?
- STA PPU_MASK
8 G2 R" Y: p4 o8 K4 S: \, f - 1 P9 ~) a+ j5 t9 Y
- BIT PPU_STATUS1 T# w$ E. w8 h1 O4 \: H. S$ I
- LDA #$20
% @# P0 i2 q5 L5 S$ B4 J - STA PPU_ADDRESS
5 E9 _- f6 @! ?+ p( z0 O - LDA #$00* q+ G; K5 r v
- STA PPU_ADDRESS
1 j' I8 J: E! ^# c - 0 y7 h" ?0 ^7 w$ @
- STA PPU_SCROLL
' S9 z+ R- a4 J7 P: _& t - STA PPU_SCROLL3 E" _- {: z3 i3 x) t- ^& e
- # x; c* Z; Q5 P# }+ T. N: p3 ?: k
- LDA PPU_Msak_Buf7 |7 G# [2 [' U( f2 D2 k+ d
- STA PPU_MASK
& y& X: B- k: i - k' _/ m2 @/ ^# \& K
- RTS' |" C0 t8 M/ i+ n
- 1 I4 `$ {0 o' w# ~) P
- ;==============================: H0 b0 A; h2 n4 f0 o
- Time_For_Vblank;延时等待 r# v: Z; O3 m7 \
- LDA PPU_STATUS
4 f% k1 j7 \7 C/ |* Q - BPL Time_For_Vblank/ H5 ?! s8 n0 U% U- _$ A
- RTS4 O6 B& _" m9 V9 D: K4 g+ S
-
9 r4 h3 s t" u+ { - ;==================================================. q' c" b: |6 k
- ;初始化MMC30 h v5 k9 L3 N4 I5 {
- Init_MMC30 p$ C8 Q: Y' @" }% x' X
- STA MMC3_IRQ_DISABLE
& ]8 P5 _, j4 W0 M, A: ?3 t5 j - & V2 A0 A5 a/ r% w9 L5 |
- ;设置MMC3水平镜像
- i1 w6 U8 ~7 b' ?& b+ o - LDA #$01
7 c& K, I$ O S# M# S& z5 k# ] - STA MMC3_MIRRORING
* B* L6 C% y, h I% W -
/ r6 P0 I: G2 Y7 q" g& M% { j4 R - LDX #$05
* w! s# R+ J: W4 j' ^6 A - Init_MMC3_Chr_Bank_Write6 M$ l! h- D' \, u& V, ^7 A5 ]
- STX MMC3_BANK_CTRL( @7 k" N4 D: c% _6 e; I
- LDA MMC3_Chr_Bank_Data,X
% K2 Z) Z. q2 q: q2 q1 r - STA MMC3_BANK_DATA; d; H8 W& N( y }7 V g! e
- DEX& d) n& ~: A2 F% w% E
- BPL Init_MMC3_Chr_Bank_Write
! e( V4 n- h% | - RTS4 x2 g9 j7 @; w! ^- I, ~' O. u/ x
- ;--------------------------------------------------
0 X2 O+ ^ }! { - MMC3_Chr_Bank_Data
! s- s- T2 {% o# I8 ? - .DB $00,$02,$04,$05,$06,$073 a! b% P I" n& V, F# V. i
- Y# j4 Y& s$ t. \- ;==================================================
. ]- {% c$ E8 s: I# V - ;重置中断处理' }& Y7 I* y; t7 l3 a( q: E8 X: Y2 L
- ResetProgram
* \+ Z+ I9 s- C* S/ |: S - SEI
z' M: c9 N" X$ c - CLD' ]) m8 v! k1 @+ v8 x" }
- LDA #$009 R8 {) ^: D. Q
- STA PPU_CTRL4 Y7 v* |$ V# {* ]5 M
- STA PPU_MASK& V5 C0 E: g( X7 {5 T2 T( A
- STA PPU_STATUS
* @4 \: y. H+ C+ I" V! C - STA JOY2_FRAME
) e f+ G: o* K: d - STA APU_STATUS
* \' S2 l! o/ ^* ^# G -
, m. y7 W, S& \+ ?1 v1 ?- y - LDA #$C0
7 R4 u% g7 W" Z, D - STA JOY2_FRAME
4 j1 y( q! p+ D -
N' P1 G4 [! @2 h - ;等待vblank8 a) _6 @9 o! c
- LDX #$02. F; T# y; W5 L6 ^! O, X
- Vblank_Wait_1
3 \0 q' [ Q' s6 {/ d! T - BIT PPU_STATUS+ z8 W( G1 P7 X: V. O
- BPL Vblank_Wait_1
6 a& h Q7 J4 l& x/ |) f4 v# z2 x& U - Vblank_Wait_2
9 q7 ~; w3 X! _/ x2 }# ]! D$ @" U - BIT PPU_STATUS) _3 T! |' Z. g! |+ L' M% h
- BMI Vblank_Wait_2
% R: E4 \2 o; H' W - DEX* X5 V- W$ j3 B4 k2 v+ f
- BNE Vblank_Wait_1* K& F) J6 b8 l- \1 z& b
-
' Y6 Y& B0 |9 w( B7 q& f. s0 X& W - LDX #$FF* Y. y% z. w2 p( `$ l
- TXS
: y! z9 v* i# _; k, E: ` - ! S* T( J3 _& ` v+ u _
- ;初始化MMC3
5 D9 c3 J! y" ~ e! ` - JSR Init_MMC3' N# _3 R) q+ N6 A
-
0 ^5 n, z& ~6 ^ - ;==============================/ L- q. q+ H/ W
- ;RAM初始化
0 D5 {/ r. C4 F - Nes_Ram_Init
/ l8 M& R, Q. u: y - LDY #$00
d) f. K) Y8 Y' [4 s! `; J. M* o - LDX #$08
1 |4 h* V! g% \( c0 G - LDA #$004 t; j& N {6 a( P+ Z2 W4 O
- STA <$008 x; u8 k$ t% N+ o7 q
- STA <$01
0 o& j" n, E+ y - Nes_Ram_Init_Write9 }3 h9 u! e" Y5 ?
- STA [$00],Y" n6 Z$ B( n' s. Y
- INY
6 D5 q; Z- M/ |0 ^( p* x! H! ` - BNE Nes_Ram_Init_Write
3 V0 m8 k4 V- U! Q& g - INC <$01
9 _9 u2 ^$ x& f - DEX1 i& q/ m' z( n1 G
- BNE Nes_Ram_Init_Write
6 }7 K6 |# y6 c! k* | R - . n( M4 F3 @. a2 C
- ;初始化命名表 k) ^5 e8 m8 s& ?
- JSR Init_Name_Table
& [9 T H; L- v( G4 o - 9 `8 j4 W E$ ]: O d
- ;初始化调色板
- \* K$ k, ?, W0 M Q1 e/ Y - JSR Init_Palette# e. a3 S# E9 N2 A. f8 E0 H" \
- - R+ p% d9 @6 n) ?
- ;初始化命名表属性
+ { e) q' C# L/ ^ - JSR Init_NameTable_Attributes5 N- l0 t) r8 q1 ?" t
-
! ?/ ?# B- K( S+ G a ^ - ;初始化精灵内存2 j( j: ^( B; v
- JSR Init_OAM_Ram( g8 I+ `2 \# |& b. G4 m
-
( R- ?5 e$ m2 P2 O* U- m1 g - ;在屏幕上写点东西
2 Y! i# b6 |/ F' S3 N$ Q2 t - JSR Init_Name_Table_Text* ~( W% @3 `6 I, t! m( S% s7 U( d
- 7 U9 M- u7 ]' e& n
- JSR Time_For_Vblank
6 n2 Z+ m: t1 v3 j9 k* c s - ;开启PPU控制
9 W0 ^1 q3 K+ Z3 z) Y/ D" Q! X; H - LDA #$A8+ h& s7 S0 o5 H1 N3 s
- STA PPU_Ctrl_Buf8 R/ |! @. T' c$ K: J3 C: H
- STA PPU_CTRL
- G( l$ f# R+ t7 g7 t9 N - 3 }- ?4 Y3 Z8 X" [+ {5 `
- ;开启PPU显示' |0 J- D u$ e, A* z4 q
- LDA #$1E
; [, @) i- w- ^- T9 |" X* z6 H - STA PPU_Msak_Buf1 ], d6 e4 Q) W' ?. [
- 4 v) h" _+ q0 Z: j8 P( h1 T' ]# z
- CLI
! p8 z; l& w, t0 q - JMP Loop4 {8 ~# a( N9 o( {6 j! X. J. x
-
1 U' d' Q1 Q$ B! Y6 P0 V - ;==============================! y7 t* A9 E: ]' X
- ;死循环, 等待NMI中断
o3 K" S* K# |& [& _0 ?% g - Loop& @+ H8 A% G, q* Q5 L }
- JMP Loop
( Q h! G/ K# `$ D& j, ]5 m! ^ - # S5 O0 M# e. {) d. q4 @
- ;==================================================, Y) m( N0 X1 |" o7 e
- ;NMI中断处理
; H: c/ ~1 }' l+ l; P - NmiProgram; Y7 Z" H2 I) G1 A; |% S
- PHA8 T3 h/ O0 |% a
- TXA
( U0 U( U! K- Q. c% `+ F% r - PHA
' a) A% W# }2 O7 g- l5 A1 c - TYA
* A3 g( F! Z& A - PHA
/ \% M; `9 ?. H V# F4 f -
2 P) ^. c* q K2 O5 q3 u" E/ v4 z - BIT PPU_STATUS4 _4 Y" m) Q' {# |0 l
-
# A$ I3 a7 V& v$ G" r( R - ;关闭PPU控制. t! e, Z. h8 m* @( N1 @- R
- LDA #$00
4 ?# [2 ?* V- R- f9 o - STA PPU_CTRL
: p* O2 a/ ?. x" x- _ - 1 z. z y$ }8 a. K8 ?, V
- ;处理PPU$ P- ^% n U+ ^
- JSR PPU_Process( Y8 x! x; Y: I W
- / `' S# U/ o, r' p J
- ;开启PPU控制
" G8 Q+ v! P+ `+ G - LDA PPU_Ctrl_Buf( ^7 n" U8 P& }
- STA PPU_CTRL
8 `3 c7 |6 ]4 M+ @7 K# U# m. K - 3 m5 f- q) W# C2 n# T
- ;手柄处理4 I$ {; c {0 w7 z+ o
- JSR GamepadProcess/ `, G& U% ]" {$ `% O. D, A9 a
-
: D5 H/ `+ J( d/ q4 k" a - LDA #$00; F! h: M! F. d+ }# g6 y
- STA IRQ_Index: M* s+ V3 T+ b d* Q3 s& `
- & ^9 G$ u2 d. B2 H% ~& X/ e
- ;启动IRQ中断, 第15条扫描线触发
! D# s8 y3 k* g - LDA #15 + 1; f" e$ |: K2 b
- STA MMC3_IRQ_LATCH
6 I7 \" j9 |% S3 X6 ^ - STA MMC3_IRQ_RELOAD Z0 h1 d h: X: i+ w) b
- STA MMC3_IRQ_ENABLE% [2 B9 C* m7 l- ^; m) ]% d
- CLI! M1 ]4 L2 R8 h3 r0 R) @
- / [6 Q( Y9 K/ x
- PLA
4 S2 X |# D2 ^7 h$ ]! a; p0 s' y - TAY
9 E! w1 C+ L: t' ]' w - PLA
9 j* L) ^1 L* G" `# V5 O - TAX8 Q& N% S" v. \1 ~. m w8 C
- PLA2 \! D5 W% ]; r. B1 Z! n
- RTI" w$ W9 A8 F/ h; U. A1 I
- ! G* Y$ N" C9 r2 s6 h
- ;==================================================9 e P% V9 }* D& R1 ~- {
- ;IRQ中断处理; k) P# b3 b9 l k& s/ M
- IrqProgram h& ~7 \6 y* A: y
- PHA- T$ R' m0 n- u% f8 `' o
- TXA( t3 P& i: t! {5 K' S `0 x0 S
- PHA
1 _+ O6 h6 O6 g5 z - TYA
# I: d$ d6 q% f7 K5 o: o - PHA
* m* o0 _* x8 W: R -
' ^! x3 A6 J0 c. E, S - ;关闭IRQ/ I& `* }% Y3 c$ {
- STA MMC3_IRQ_DISABLE
. P3 M# K( V/ }! _+ s -
# O7 M5 N9 t, e% G6 T - ;允许下个IRQ触发
# V: ~1 `$ |0 z6 c - STA MMC3_IRQ_ENABLE5 _ }8 P* ?+ Q5 S$ F
- 8 t& ?( ?; Z3 @
- ;IRQ处理, 15线后继续触发
$ R! H$ d0 y- w* J! H! B$ J - LDA #15
. _% ?: c% V9 \: d2 u - STA MMC3_IRQ_LATCH4 w; b2 O& _' o0 s( T% p7 u
- ! G* O- {- Z" E3 u: \1 J
- LDA <IRQ_Index
. M* A0 o! o9 N# l! _) Q+ s - BNE * + 4& ?' l v* o) O3 Q+ v* m
- INC <PPU_Scroll_H, M7 ?2 S& i$ h" w
- : |# Z& A2 {7 G* O. v- y- H, n+ [: U
- ;设置屏幕滚动
h M/ \* G5 ~3 e j - LDA <IRQ_Index
. e' N& c8 x: B Z( y - AND #$01" m9 c5 }2 u. i7 b. j
- BEQ Irq_Scroll_Right
0 I7 q6 v2 {0 x5 d9 n' M" U: B - & J6 T7 V: ^- X5 o! }( P
- Irq_Scroll_Left- ] i' A$ N. u" s
- BIT PPU_STATUS
7 `7 o3 b+ P0 b' r9 M' M; f0 f* C" s( _ - LDA <PPU_Scroll_H) h, D6 m2 I4 W; L: T
- STA PPU_SCROLL0 e& n1 ~4 n+ P: q, |* {
- STA PPU_SCROLL1 l% H* o) T% b) a4 Q y7 n+ N
- JMP Irq_Scroll_Over
3 Z% i' _& B$ `2 `3 w8 Q/ f - ; s# M2 d, q/ {
- Irq_Scroll_Right
: m1 F! U! R4 { - SEC3 ?" a$ C$ @ W) }8 }
- SBC <PPU_Scroll_H
+ C% A' T% H1 M3 J9 o4 j# t - STA PPU_SCROLL
( Y) W) @ G* E+ n1 J% w9 T - STA PPU_SCROLL
; o5 C( V A% ~/ W1 C9 y, Y2 C! v - Irq_Scroll_Over- J4 H* _" C0 Z( `0 S$ K6 X! w. ^' i
-
3 M2 k% K' H. N: T& {% ^/ R! R - INC <IRQ_Index
5 o' a$ r$ n& S/ R4 D: P) ^ - * z9 v" R, b$ }0 ~* h" ]
- LDA <IRQ_Index3 \- Z0 n7 @; v; ?' U
- CMP #145 O$ Y1 a. v" X) L5 [
- BCC * + 5+ v; `: t0 d f4 |7 X. o. p
- ;关闭IRQ
w8 ]9 B. w4 ` - STA MMC3_IRQ_DISABLE- n# ~: B J8 V$ L4 T
- / o! N& G! m6 D/ e& f
- IrqProgramEnd
8 a' a, ?$ |0 x9 d9 s1 M7 a - PLA
! _; s* ?5 w" s+ r - TAY
9 o2 H, Y* n5 R' D% } - PLA
! x. {5 S: M1 j; ` - TAX
J, I) y0 w2 `# S* n - PLA
% u9 Q) N) z+ ] - RTI
6 R0 \$ `8 E9 Z0 u -
& N# }) z2 z! F0 @ q - ;==================================================
0 N8 F# G% Y, E9 |( A2 J - ;中断表, h% {3 y& O4 y0 P1 V& N, p
- .ORG $FFFA8 i1 _7 f: Y: ^5 l
- .WORD NmiProgram
# X% G2 @0 B2 Z4 T8 _! l- L - .WORD ResetProgram' v. ?2 e% M3 m
- .WORD IrqProgram
复制代码 [/code]8 k u% a1 l- P. K- F
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|