|
- [code];[FC音乐][MMC3 IRQ]
) Q) ~0 i% m( ?/ q8 U2 O5 Y7 k2 g - ;FlameCyclone 20230710! n& g& K( `, m. W* k
- 9 Z! Y& `$ U& @
- ;文件头" J* d% J6 |1 f4 l+ G; R( t
- ;======================================================================* @+ Y% v' l$ W/ T
- .INESPRG 4 ;16KB PRG 数量, V" W" k, F. e, `( }. y
- .INESCHR 1 ;8KB CHR 数量( V9 c4 C" K$ O$ i
- .INESMAP 4 ;mapper 4
6 d! y8 I$ _6 |6 D7 t - .INESMIR 1 ;命名表镜像 0水平 1垂直' r/ Q# \: A. d
1 J, p+ ~5 M0 T% R; W- ;必要条件9 @4 u E! |9 \9 w# o3 Y* |& |1 W
- ;1.持有CHR ROM
7 B" m1 V9 d4 g - ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
- f3 {( p$ p) R. c - ;3.精灵内存(OAM)不为空
" l8 a3 ]2 O) d& D8 f3 D. m) h- V! y - + |5 n- O* y9 R- T* {' [( M* }8 l& p. {
- ;==================================================
4 r. k2 c/ a& ]8 B( M, v* U+ @ - ;NES端口常量# r" A8 O" j* g: Y
- PPU_CTRL = $2000 ;PPU控制寄存器! p) y+ o( R+ `9 d
- PPU_MASK = $2001 ;PPU掩码寄存器
# l3 b. r' \6 Q/ s - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位, h$ `8 C/ E! T) S: R& p6 u
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加12 U3 m+ n% I6 X( b" g+ ~0 v5 A1 C
- PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1; a5 p5 a) s5 u* w
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器
: ?' h6 S+ u7 _: |. o - PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
5 M( a! f/ Z/ _+ c( w* w) I - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
/ v# ]: | r5 w4 y# ?, h5 h - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存1 R: Y/ F$ d8 Z0 ]$ M
- APU_STATUS = $4015 ;声音通道切换
( Y q* B# U* ~ - JOY1_FRAME = $4016 ;手柄1 + 选通; J* [9 t( E- U ~ J% h
- JOY2_FRAME = $4017 ;手柄2 + 选通! o, N# x! c. ]3 |) e, |
: \2 P* s5 b9 w! P- ;==================================================
8 k, _8 Z% a1 ?8 u! l. | \5 d - ;MMC3端口常量4 Z ]% K* B0 Y6 G
- MMC3_BANK_CTRL = $8000
9 A d$ b% l- @5 I( k! H - MMC3_BANK_DATA = $8001& ~# T5 j( j8 O3 ?
- MMC3_MIRRORING = $A0006 U: ]" ] _! `1 Q2 _4 ]$ Y4 \
- MMC3_PRG_RAM_PROTECT = $A001
9 U* Y3 b& K6 o, S6 y4 j - MMC3_IRQ_LATCH = $C000( N u4 M6 F g9 e, d# y& e' s
- MMC3_IRQ_RELOAD = $C001
% O* w5 u9 S, h) M* M# |) W) o% y - MMC3_IRQ_DISABLE = $E000
. U c+ X2 H& g - MMC3_IRQ_ENABLE = $E001
' _; `/ J- \$ i$ M$ s" ?
! ]! g* [/ S" ?) U }- ;==================================================
" a- j! U( ?' Z' j - ;程序块配置9 Q5 W: L* a4 c. k# {% m, q
- BANK_DATA_MASK = $071 M9 j/ v8 p+ F# x9 h: ?
- ;--------------------------------------------------
! f: ]0 T o4 y) E& i - RESET_BANK = $07. P/ ?! z/ K& a' W. F8 O
- RESET_ADDR = $FC001 R/ C) ]! @8 I, \7 m, x- w' E
- " t4 W/ M2 s' w# ^0 }
- ;==================================================$ \5 [' ^; V' @1 U- U X W
- ;图像块配置1 D/ ~7 q+ r/ P2 a; j: J
- CHR_DATA_BANK = $08
1 J+ u6 B7 A# t/ Z% r - / w# x R" m" X9 H1 P" A) R( F
- ;==================================================
; E: }% H$ p2 `1 z3 p - ;零页内存地址配置
5 J/ g: |7 f0 s- y - Use_Ram_Addr = $80. h7 A+ t$ O1 q1 S. a1 f. R+ D5 J
- PPU_Ctrl_Buf = Use_Ram_Addr
* L/ f) L9 Y( _) n# M+ S* W! \ - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
# p) U/ R' f- ^7 b - PPU_Scroll_H = PPU_Msak_Buf + $01
& ~+ d6 X1 ~- r1 q$ ]* h5 \7 k - PPU_Scroll_V = PPU_Scroll_H + $01
, a' y& f; N) E/ I5 c' E- t( v( j3 U! v - FC_Data_L = PPU_Scroll_V + $01" Z9 N8 R$ o+ B5 N, @1 F4 |( D
- FC_Data_H = FC_Data_L + $01
0 E5 Z7 t& L2 W+ d - FC_Data_Buf = FC_Data_H + $01& q1 B: i+ p) Q G$ ^8 v
- ;==================================================6 r5 t$ F0 B( C$ P3 L& y- C# H
/ F* @6 g. m! x: B- GAMEPAD_MERGE_FLAG = $04
$ o. h& I1 ~' K1 m! p6 c, k
k5 j* @) J; x5 C$ Z$ c5 d- Gamepad_Keep = FC_Data_Buf + 1
+ P) _$ N& u0 F) `8 Y" N - Gamepad_Once = Gamepad_Keep + 2( X1 S5 [( `# b( x* d: f6 H
- Gamepad_Temp = Gamepad_Once + 2
$ a, r. F. E% g; A -
. b u+ R# o1 A# ?( o9 K* G - Gamepad_0_State = Gamepad_Temp + 29 B$ J W# Y' u/ l7 [. H n) a
- Gamepad_1_State = Gamepad_0_State + 1
1 w# i) x( H7 A. t( \$ ~ s - Gamepad_0_Value = Gamepad_1_State + 12 f* |8 S! b- q' [* S
- Gamepad_1_Value = Gamepad_0_Value + 1
2 n n/ y/ a9 a9 X - Gamepad_Port_Value = Gamepad_1_Value + 14 K1 O& f" ~2 d. {" I
- Gamepad_Merge = Gamepad_Port_Value + 1
; N9 U" c& T$ N
+ v8 R* Q) V' } ?5 N3 i- ;==================================================& d" m( U3 t$ a
- IRQ_Index = Gamepad_Merge + $019 K8 Q: K: s) R
- ;==================================================
R3 j7 ~2 Z q5 ?& |1 R
( D" C3 g+ Z; d* [- ;CHR图形数据
# T* w% S& M* r& s. ] - ;==================================================
+ N- y% G9 m0 p7 g$ r+ Z1 m - .BANK CHR_DATA_BANK6 q0 p; ~; o) U1 V; d
- .INCBIN "chr_bank/chr_data.chr"
& j! H q& ~: J$ R: ? -
! I& B! D) w, r2 h& A* f - .BANK RESET_BANK & BANK_DATA_MASK
- u( q+ c& o' [8 Q; Y2 U* F - .ORG RESET_ADDR# n. Y0 r* p* v0 V: z5 @
- % J2 i' U) i3 w& {% ]
- ;--------------------------------------------------
% B+ V6 L& n. `9 C @- Y) M - Attributes_Data
& _$ G6 ?4 v0 I" y' k - ;命名表属性' v' Z! x& ]1 o' f8 S
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
. P& K/ ~$ U$ V1 r l6 D - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA. i$ h# s0 O# T- S) ~4 X
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
2 r! a8 `# h: K* H6 I8 I9 E - .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$550 D0 \5 l1 ~5 Y
- ;--------------------------------------------------
8 n* ]) }1 a0 \ - ;调色板数据5 n ^' d* G X: w8 d/ Z. U
- Palette_Data
- S$ o+ [: a# s3 H- z$ `2 p - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
% j! T/ r3 I1 o - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
: \- _( Y" _6 q7 C/ m. ?8 Q - . X( m; e% k. l
- ;==================================================: F8 ?6 }7 K F
- ;命名表初始化
* P8 p$ T; |; }- r+ H* g% J - Init_Name_Table
# t% q2 N: b8 N+ _7 } - LDA #$20! A# D- D# h- T
- STA PPU_ADDRESS9 {* v" v6 ]; q) u5 ~
- LDA #$00
! ~1 s( I/ T1 J6 Q$ @9 U - STA PPU_ADDRESS4 v0 I2 R1 F: N( m1 J4 }
- LDA #$00# B Z. @4 j$ c3 D s' \% s
- LDY #$00) l: I- |/ e. U3 F$ u6 Q1 j
- LDX #$10
8 K* Z$ N/ Q& g: L& d! k1 X, p1 g - Init_Name_Table_Write* P. r! b& ~! W
- STA PPU_DATA. @& B8 q( B, A, I H/ i
- INY, E& T/ E* ?! V) h$ ~
- BNE Init_Name_Table_Write
. d8 j o# S/ t: f; U8 r - DEX' |. b. Y4 G. i L4 u5 r
- BNE Init_Name_Table_Write
+ T/ } C! T o6 ` - RTS5 r& u, Z/ J! A# n; c/ O
- 8 i) O6 `$ ~; J& P2 H
- ;==================================================
7 ^$ c! L9 ]4 Q+ o" b+ J* ~9 N4 C - ;调色板初始化
# ^& b1 r4 v$ ?2 ?' R - Init_Palette
. U' i2 ], Z S) Q - BIT PPU_STATUS
# o0 ?9 s' W( `& ~! e - LDA #$3F7 t0 }+ T) d) b/ L5 T
- STA PPU_ADDRESS5 E1 [. Y' l; }2 x" i$ ?" I
- LDA #$00) a6 Z8 u N$ U7 ^% i' m) v
- STA PPU_ADDRESS
U: ]& w: w/ C Q7 y& r, K - LDX #$00) H0 b. O& n! }( S- L+ E" s
- Init_Palette_Write, n4 O1 V- ~4 C5 T& c: `8 y/ F
- LDA Palette_Data,X, W: x. }6 s/ R1 l
- STA PPU_DATA2 C$ U- P! T; Q$ P
- INX W3 b$ u1 R6 l, Z7 B$ P
- CPX #$20; c/ g c. ~. }3 T) {" r
- BCC Init_Palette_Write
8 G$ |9 X; T, {+ d - RTS
' z. M/ Q- S R3 q% n -
: M+ J; @0 l- x3 T - ;==================================================! J& q: W* j: @9 B$ [
- ;设置命名表属性2 `0 x9 |8 |( ]& i5 T' n
- Init_NameTable_Attributes
- {0 [: a' j9 R1 S2 C - BIT PPU_STATUS
& ?( i+ E. u& P8 U5 U - LDA #$23
+ n7 N% Q8 z9 c* R - STA PPU_ADDRESS
6 L0 t8 v& N8 j# e7 R% p1 I - LDA #$C03 i9 _- D3 i+ P
- STA PPU_ADDRESS
$ @6 d+ A; S' L7 n - LDX #$002 L* Q* J) c8 c. a$ O/ x) m6 l' t
- Init_NameTable_Attributes_Write6 J% h$ w; U7 T0 ~
- LDA Attributes_Data,X
& a; R- O) C' W* U - STA PPU_DATA
6 o. P3 i% h1 O3 o* \, P2 S0 j - INX& B& O: H. `: \6 X: A ^' e
- CPX #$40
* J. ?6 h4 C1 Q - BCC Init_NameTable_Attributes_Write8 @9 B7 O0 g/ G- @
- RTS) r( C) H. A' O: T
- , z( I+ ^$ r9 V, ^8 F
- ;==================================================
`1 {( K' t: v - ;初始化命名表文本/ k, O! b2 v# z/ {. r
- Init_Name_Table_Text6 k- t! _, i( M9 i
- BIT PPU_STATUS. |7 g1 Z- s2 [8 d+ J- Q+ }
- LDA #$20
. G, v7 e1 O, S! n0 ]" M - STA PPU_ADDRESS
5 ], `. ^- a8 F% g; z* L - LDA #$001 z3 o' K- z$ A9 w! `! U* R
- STA PPU_ADDRESS
6 s" f; s; b* w: O - LDA #$00
. V6 G, [+ v& n4 ~# j$ j C - STA FC_Data_Buf
; h* y/ j1 S, M2 G* j# o - LDY #30% F7 |% k f0 u& Z, ~8 t& G$ ~- {
- Init_Name_Table_Text_Write X4 A A7 R' S1 F; a0 }0 x
- LDX #32: D$ U* n, u# a) k9 E8 a4 U. Q; [9 Y
- Init_Name_Table_Text_Write_Char. t0 {* {: [$ C7 N$ {& d
- LDA #'0'1 B/ n+ G, J, A+ _- m
- CLC
3 s3 t* ^; X5 n# T P - ADC FC_Data_Buf1 P! i* ~2 H# ~! v
- STA PPU_DATA0 v, t. C" O- Q* D4 N5 x
- DEX
/ a$ j5 G3 @& v; i - LDA #$145 P. A# q9 w0 C4 ~; P6 Y( ^: |* t
- STA PPU_DATA! c5 T5 a' X0 c) N. D' m6 B( n
- DEX. c* X. S/ v) f
- BNE Init_Name_Table_Text_Write_Char
1 K5 S& `& S6 z6 G$ @6 r - INC FC_Data_Buf
- _, `; U+ ]4 s& {0 Q- I - DEY! i# C/ ]! t$ H: h" y! c
- BNE Init_Name_Table_Text_Write
5 I0 s& x5 a1 b6 G' u - RTS7 [: h+ U; P% G! Z% G5 h: ]
8 e5 P, l! l# f6 t3 p8 B) \- ;==============================
% `6 b5 y. Y" h7 K; p5 b - Init_OAM_Ram;初始化精灵内存
O8 ~; E$ m2 L; g& K - LDX #$00
9 i5 W4 H( m# v* B; A: x C - LDA #$008 {' V( y+ }; i( Y) K G/ O
- STA PPU_OAM_ADDR ~/ b# ?6 t8 B; u; z7 N; y
- LDA #$F8# r5 \% X' P5 c, O
- Init_OAM_Ram_Write3 ^7 q6 m8 q, ]! n3 W
- STA PPU_OAM_DATA
; a0 @/ }( _% ]* q& B - INX C! B* y. B5 _+ S, } O. G
- BNE Init_OAM_Ram_Write
' e. S! \2 }& y4 A - RTS% `# Q& T" d, r9 [: x9 {4 Q
-
( i' o0 C5 O9 } - GamepadProcess;手柄处理
) ~# Q, n: i, h- V - JSR GamepadDatacan
1 m9 f# t+ e7 Z: f9 j; d; @ - LDA <Gamepad_0_Value
$ V+ {/ W" W/ I7 j- \7 F - STA <Gamepad_0_State5 E* C0 d! F# k% v( O# b8 e
- LDA <Gamepad_1_Value
+ y8 l7 t. H: ~' q9 q - STA <Gamepad_1_State
+ D4 p& `9 P1 j7 R* V+ {$ E$ X3 { - JSR GamepadDatacan
9 |2 a' H# u6 H* h/ H - LDX #$011 s, Q3 y" F/ y
- GamepadMergeCheck;合并手柄输入检查
2 B4 I; O2 z, _ - LDA <Gamepad_0_Value,X
9 p. g9 |+ T! J, K/ T' e+ P) v - CMP <Gamepad_0_State,X
+ C( z( j: H! O - BEQ GamepadMergeInput
1 O3 ~3 {; w: O) |: P( `/ P - LDA <Gamepad_Temp,X
$ J8 m9 `$ N- U. U- C, l# i - STA <Gamepad_0_Value,X
- ?* T1 u+ i, ^' f% V - GamepadMergeInput;合并手柄输入; q3 i3 n+ a: ]6 \
- DEX. `% Q; d2 X2 s, R+ Z+ m! `% L
- BPL GamepadMergeCheck. Y, ^8 @' K; S/ O7 c; @- Q ^# i
- LDA <Gamepad_Merge- q, Z# p l: O: v7 V1 b$ I
- AND #GAMEPAD_MERGE_FLAG% D! v a" c# J, @. H; w
- BNE GamepadStateProcess
' d) R. x" y. w" u3 Q2 N - LDA <Gamepad_0_Value
) \& O; R! Q" K2 A! F - ORA <Gamepad_1_Value
/ s/ s- k3 ?+ F R - STA <Gamepad_0_Value
) r# n* H5 E4 y, ]4 H3 |2 \ - GamepadStateProcess;手柄状态处理, E/ ^( s+ V9 s+ d% x1 l/ t$ s
- LDX #$01
# \$ i6 t) ~6 d u4 {( M - GamepadStateSave;手柄状态保存' k) q$ I* V7 D6 r
- LDA <Gamepad_0_Value,X K) L' E1 r$ Z' i+ [6 v: v) h9 Q
- TAY0 `- O C- e2 P& X8 O5 z+ ~
- EOR <Gamepad_Temp,X5 s' N. ^" B! ?1 R
- AND <Gamepad_0_Value,X
: i# ~0 L* _) K1 W5 j - STA <Gamepad_Once,X
0 R+ `: o; J5 e2 M: ` - STY <Gamepad_Keep,X
% {- M. D; G5 U - STY <Gamepad_Temp,X
" N' {- @6 D! p - DEX
+ I9 |0 {: ?6 Z3 v. U# k& I - BPL GamepadStateSave
/ Z4 D& d$ Y9 y" W! G1 t4 U2 F - RTS1 V: i- H- I! K$ ]4 K8 i! P
- ' x! T9 V# D* `# l( q
- GamepadDatacan;手柄数据扫描
1 f5 [& g1 x d1 u( V - LDX #$01
6 d, f T& i& c, R5 x0 q - STX $4016; C" o& b- ]$ r% H! N
- DEX
4 q: _3 D, L/ m4 V5 K - STX $4016; [. H- P% M/ [' y# h
- LDY #$08
2 h6 L3 p; ?) J( N" s: { - GamepadPortScan;手柄端口扫描
0 \( u8 J$ C: |0 z: N - LDA $4016
/ ? }( K" e* h- O6 z - STA <Gamepad_Port_Value" L, |( e6 [1 ]6 F3 R R
- LSR A: f1 I" w& ?3 A2 M% D5 ~5 h
- ORA <Gamepad_Port_Value3 \/ @5 `8 Y" H, _! K+ m# }. P$ j. i
- LSR A1 U/ g6 `; j- X0 a
- ROL <Gamepad_0_Value3 {- m F$ {2 ]- s9 v
- LDA $4017
4 |& p) W- W& Y3 {1 |- [5 O - STA <Gamepad_Port_Value
! u$ Z' B) A7 T% L" H - LSR A1 m2 T' j R) l5 [0 I1 a q4 C) h
- ORA <Gamepad_Port_Value
, ^0 f3 }2 a( [: o" L% j' C4 y - LSR A
$ T6 M! R7 y l) V - ROL <Gamepad_1_Value
; S1 B& r7 E. Y- m7 u: [' G - DEY
7 k6 v# F# I* ]* q - BNE GamepadPortScan0 e2 ~* L; [9 w* p
- RTS' U' J; y# W' u4 T. q
- 7 A! w% Z) a+ G
- ;==================================================! a/ X. O' R" A# w
- ;PPU处理
. D4 c/ Z2 n: a0 \ - PPU_Process4 z% G/ H9 m% R
- LDA #$00; ~+ t( |, {# Z. [
- STA PPU_MASK' u4 J7 u( x) }# x! R
- ! ? n% V, n) f, Y: @2 T. T8 K
- BIT PPU_STATUS. p0 ]% _1 w3 z$ W, J
- LDA #$20. b# T. A" y1 q, g- r
- STA PPU_ADDRESS
: y- D, {! L) |" [; ]: o8 c9 o - LDA #$002 A; g% D8 n" A, Q
- STA PPU_ADDRESS
7 F7 H, t e& @* J -
4 \ V- ]% ~- h/ _ - STA PPU_SCROLL4 P0 h6 E# y7 F( q" n# q8 N
- STA PPU_SCROLL. |! ^9 B2 i; @ \, V! |
-
6 P5 W% o6 R/ X; Q) Y% U! J - LDA PPU_Msak_Buf; a- `, q( Q, C9 D* L! \2 ]1 n9 [# z
- STA PPU_MASK3 \7 R u) q- `9 D6 C: p5 h( p
7 }9 R3 l6 Y0 l, W" b* ?3 |- RTS1 p' R9 N/ o: q9 x) t; f1 S8 g$ y
- # H: N7 p5 c* ^- o' c0 _
- ;============================== E, I8 c- g, h- }; B& ~, U
- Time_For_Vblank;延时等待
% ~0 O0 o) s% I2 g - LDA PPU_STATUS7 v) _9 P; V9 T3 \
- BPL Time_For_Vblank
& i& W# d+ p7 L' r5 h2 t0 J8 m - RTS# Q0 z* }" a5 g) E4 I8 u! {
-
- b6 ]% h7 ^6 P" T% j- N - ;==================================================0 o# c2 Q; l3 I& z9 a: T
- ;初始化MMC3
/ g9 s6 T" ]# U - Init_MMC3
# y$ `/ n4 A! [6 F/ w - STA MMC3_IRQ_DISABLE
K" X6 G7 b- H8 T -
5 w! Y- s; c- C - ;设置MMC3水平镜像
+ M+ @: I. Q: v! i0 O1 _ - LDA #$011 a! x0 @* @/ e4 H2 ]5 M, d- Y$ R
- STA MMC3_MIRRORING
8 t, N) U+ r3 k4 J - . p8 ]- ^; Y. Y& N, A6 x
- LDX #$05
0 ~" W% ~7 i; }( Z! X: @* J T - Init_MMC3_Chr_Bank_Write
' s4 j+ z( _. R - STX MMC3_BANK_CTRL
9 L6 f+ z2 t) \ - LDA MMC3_Chr_Bank_Data,X4 M# x# I% M' Z" Y
- STA MMC3_BANK_DATA( X3 h6 _2 m; A
- DEX
$ P: E% s @, Q' ?$ ?* B3 \ - BPL Init_MMC3_Chr_Bank_Write
5 m0 Q6 n) R9 j9 c) m - RTS Q. X+ b+ s7 z7 ^5 B. a
- ;--------------------------------------------------0 p9 N/ H& Z5 h( ]! \
- MMC3_Chr_Bank_Data9 R; c2 F* D0 u1 b( p1 J' e" j, z
- .DB $00,$02,$04,$05,$06,$07
& o( T' }! W3 H% r
9 ]. c w4 L8 k- ;==================================================
9 o3 A% x4 m9 n2 P6 \ h5 B - ;重置中断处理
8 I: a% U1 |9 s9 U - ResetProgram
7 G4 R9 d5 D0 m1 i# H% w - SEI
1 J3 Q E6 G5 c4 W7 z/ q - CLD! }( k; R& W2 u! i9 g0 S4 J: \- K2 `
- LDA #$008 N' H9 g! J2 I- I$ w$ N
- STA PPU_CTRL
' T V) E% s* x7 g6 ]4 Z - STA PPU_MASK; p# T; j2 ]* o
- STA PPU_STATUS
" A9 _, a* D/ `9 ~, } - STA JOY2_FRAME/ _9 f+ Z: f, z7 D. N e2 h
- STA APU_STATUS
; X: q3 e' x" i" T# W* \ - ; H* {* M3 w, S" w
- LDA #$C0
! w2 s+ ^3 { |. q: p - STA JOY2_FRAME) w, g: h2 X( J- A
- * w# @5 G( F/ c/ a
- ;等待vblank
( T$ f, Q" W$ B; |6 X - LDX #$02
. Z4 H/ a2 E+ s5 g- S) {* L - Vblank_Wait_1+ `9 X& v9 D& c5 H
- BIT PPU_STATUS
a( y1 n' ` h4 P/ P5 }' G( G* B - BPL Vblank_Wait_1
4 \0 \. B7 V0 V* \) Z - Vblank_Wait_2) @! u" W% E9 k0 x9 T% o. }
- BIT PPU_STATUS3 Z5 f5 |/ D: T: Z. @9 ?1 A
- BMI Vblank_Wait_2
, o* s: v# X s$ v - DEX
7 U5 F& i: g& T# }) Z; L' n - BNE Vblank_Wait_1
I% `; A5 `! f. k* y -
0 H' H. Z$ {5 e0 k, o - LDX #$FF- L! v' d& G k+ ~' A" C! k8 z
- TXS
/ B% ]/ i: G4 ~7 X -
, G$ ?4 u, v$ p0 S1 H8 J - ;初始化MMC3
# d$ L. U4 j" ?8 O: q' m - JSR Init_MMC3
. Y$ U8 Q2 v+ v C - A: e( ` K1 z( ^
- ;==============================
- X" P- S2 H. B# u0 x2 u4 }3 u+ _- h - ;RAM初始化, b3 `% q3 [4 u5 N+ q% {* m- e, v
- Nes_Ram_Init
# O! `* y0 Q" R# ?3 @ - LDY #$00% n$ a( `! g5 R# b+ i
- LDX #$081 M7 \8 J' c l2 e! @
- LDA #$006 h8 Q3 Z$ u9 {2 ^5 @ j
- STA <$00
4 d5 j [+ k% v6 M% p3 A - STA <$01- i z; P# }+ X; |8 w" T7 n, M
- Nes_Ram_Init_Write
: j; J5 f( a. u8 j - STA [$00],Y+ `" H" {" _4 L7 E$ x8 y2 t( d
- INY
" e. \! O3 f3 x% t7 d! e! [7 |% i5 S I - BNE Nes_Ram_Init_Write
, `0 g& O2 _/ b. R' l - INC <$01
6 p6 O5 l( c( l - DEX
% ^6 o) ~, p) W7 _: i6 G( p& e - BNE Nes_Ram_Init_Write
4 H( x' J4 ?: E5 [% _8 ~" s& E - ' ^1 }5 M! b5 y8 t
- ;初始化命名表) j9 `5 `8 L( G9 F4 A0 z
- JSR Init_Name_Table
& D* ?, Z: m$ e$ x2 X( F - ) ~; Z7 K% n" V8 @# D; L$ j
- ;初始化调色板$ _# A S' R5 u& I
- JSR Init_Palette* S( i- z' a$ g, b2 v- N
-
- ~' A6 E0 L/ N1 M - ;初始化命名表属性9 \/ f6 F' w+ M* \' P
- JSR Init_NameTable_Attributes
! F; f0 f2 x! M7 Z* X -
+ `/ m8 [% k' v) ?+ u, `- f( W - ;初始化精灵内存4 _( C, v. L" I# U& U- {
- JSR Init_OAM_Ram
+ U: O2 Y' _& n! z0 O -
: a" j1 S9 L+ d. x \8 [- { - ;在屏幕上写点东西
' `5 Z( T! a! W+ x* T0 l - JSR Init_Name_Table_Text" u! @! M- h0 l2 A9 j# k5 b
- 3 \( d2 @, l2 L) Z+ I" K, p# H
- JSR Time_For_Vblank
5 w* f# ?" D% k - ;开启PPU控制& L) k0 c' c& B& |
- LDA #$A8
* Y2 n! t+ O+ q; W4 J& f0 ]6 d - STA PPU_Ctrl_Buf. o/ W( b4 z9 g
- STA PPU_CTRL
5 w, V; d; T$ F, M6 c% S -
8 t$ x, w- y* }. i% @! L - ;开启PPU显示. o Z/ L& t* r- X* N5 f$ D3 c
- LDA #$1E) b& U- I; }( q0 d$ X
- STA PPU_Msak_Buf
. S! \' l+ X, H1 e) y8 x% m - y2 r2 K4 w, ?5 g6 \- ?7 ]
- CLI2 B1 S, L1 f( Y9 V' v! Q
- JMP Loop
# ?- |# S# u5 p- t9 \4 _$ p1 c - - H5 T1 S- r% r: o! z; o' r, i
- ;==============================
* P6 k% T( ?. q; b" E - ;死循环, 等待NMI中断2 O/ t& e# F* `+ q8 P) M
- Loop4 c! F8 c, d1 r/ L9 s" V: f
- JMP Loop8 }5 @" z0 ?: E; ?- }2 q# R! T
1 w6 H9 `+ K/ r4 @$ T- ;==================================================' U j2 p, G# {/ j+ J* f& W
- ;NMI中断处理; @/ |/ n" [; N
- NmiProgram
B! Y# F- Z9 U( c3 F- N& k - PHA
' j! z z% @& q2 ^- R& [ - TXA* p* W& _1 O. I! y
- PHA6 l* L: k( [1 D
- TYA: ~. `" P/ j e) ^
- PHA
, P# Y, V( q+ M% d) \ -
) R& Z/ S1 t0 M T% n4 i: h1 } - BIT PPU_STATUS6 o2 J; M) J1 l c4 m
- ! ]/ I$ {0 _/ q% E1 h6 s' `
- ;关闭PPU控制1 I: q. a' k2 ]9 x7 l/ G+ C
- LDA #$008 C8 W+ _9 Q9 @; ^2 i# `) N, P
- STA PPU_CTRL+ \# T! U$ b3 W6 ?; b3 v g$ V
-
7 z! v" k a P' L6 T - ;处理PPU
6 u' |1 } @* F, n% \2 A; W - JSR PPU_Process; O1 ?# f0 v# U
- , D/ ?$ h* l Z0 c- S$ r
- ;开启PPU控制
3 d0 |" o7 @1 \5 t/ O" e& c) S - LDA PPU_Ctrl_Buf9 {+ i! M2 @4 I
- STA PPU_CTRL; r3 C+ F0 c1 n, \
-
" e# R# j2 u$ O# Y - ;手柄处理
# A+ B( z% _' H4 Y! _7 { - JSR GamepadProcess
2 O$ j1 U, ?* Q. S0 k - ; M4 X& r& O% z( O* r( L3 P, f& H" F
- LDA #$00
4 y1 j6 F9 A* m' N - STA IRQ_Index
7 i8 u& }5 Y: \ -
. c0 n2 o0 }) Q - ;启动IRQ中断, 第15条扫描线触发
i7 Z D- E7 L8 B9 a2 K - LDA #15 + 11 p0 C2 m; a4 Z. }! o o4 P( l
- STA MMC3_IRQ_LATCH
A$ j& e/ O% l, I5 } - STA MMC3_IRQ_RELOAD o! l' V' i5 l1 r- g$ L7 r
- STA MMC3_IRQ_ENABLE. w1 e! [% _" ?& i
- CLI
* T2 \6 g- H) i2 W! ]* } - j8 c' Z% L. v3 y* @: t7 L
- PLA9 k K$ D9 Y0 H$ l3 [! V" H8 R
- TAY0 a L3 _7 j" i+ ?
- PLA
5 ] O" b( D! E% F) r - TAX
3 c- R+ u$ Y7 @: k2 W8 v& j. d - PLA
! o' w% V( l W - RTI
' D9 n0 t7 A' X( @+ p. b - , V8 x2 h* M4 m. W0 s4 q1 W, V
- ;==================================================
/ A' b' ]" o$ l( E1 Z - ;IRQ中断处理7 q7 p/ v. r0 Z* n" n
- IrqProgram5 O4 ?& N2 c5 U5 G
- PHA
3 | g( Y$ j# F6 ^: n - TXA5 U* W, O% S) L, t
- PHA2 E6 y- s. X$ {
- TYA1 u0 r( z3 [. o9 R
- PHA; l$ t; m F" w
- / F9 y* S$ Y, f4 ^3 G$ r y
- ;关闭IRQ. y. B+ s4 S. x2 ?' }
- STA MMC3_IRQ_DISABLE
. P, K: J6 I3 | - ' d( p; A/ x( ~' s# @$ w
- ;允许下个IRQ触发( G/ T( t1 h+ o, M' S
- STA MMC3_IRQ_ENABLE
9 x& Q7 b1 `& B% w - ! O, x* i4 `8 _
- ;IRQ处理, 15线后继续触发7 e8 d, D" E4 A+ H0 E; A
- LDA #15
) s7 [% [! S- r+ W. B - STA MMC3_IRQ_LATCH/ I* U9 d. K+ T% ]8 |0 L
-
& T' W. X( _8 [- U% D0 F - LDA <IRQ_Index/ ]; K7 p5 D$ E$ h
- BNE * + 4
4 N- @- {: n! @, t. ] - INC <PPU_Scroll_H
9 x+ p" ?- U$ x3 Z -
6 G m* n t( e' x" D - ;设置屏幕滚动
7 \ P7 A/ q e t5 s - LDA <IRQ_Index1 S4 W* h$ ^ X! g R. A' G
- AND #$01" B6 G7 O |* x% E3 p5 K4 a: Y
- BEQ Irq_Scroll_Right: x) x) {+ G& E3 m2 T5 t5 u
- # V" G. u! \2 s; z- R
- Irq_Scroll_Left& V1 V! d' [, K# A
- BIT PPU_STATUS
3 v6 y6 I; w& C2 T7 U - LDA <PPU_Scroll_H
% T7 W V$ |$ o- D$ @' D; E - STA PPU_SCROLL0 {1 z0 D4 x; t& w
- STA PPU_SCROLL
+ T6 d) ^7 c- c - JMP Irq_Scroll_Over& C8 b% R9 L. J6 F. l2 l5 w
-
7 F G$ t1 n) ~ - Irq_Scroll_Right& U# @4 M! y0 v8 z1 a; O
- SEC
$ [& R) ~1 Z8 I |& `2 S3 ^( a - SBC <PPU_Scroll_H
# O9 I( ]/ ^" D) ` - STA PPU_SCROLL/ y* F8 w4 c* n! H( |7 E
- STA PPU_SCROLL7 A9 y n, C# Q8 n% j2 l
- Irq_Scroll_Over! x4 O, G, a5 f
- ) F" j: b; l9 ~5 C
- INC <IRQ_Index% O$ I- U* C. |- v
-
8 `- V |" S8 b( ]9 J, M - LDA <IRQ_Index
# Y! w9 r ^! ~6 D+ i i$ { - CMP #14
. ?4 I% j Y0 c/ W# |6 @ - BCC * + 5( `) U( N& Q" [5 ^
- ;关闭IRQ
3 ?# F# A- k( z - STA MMC3_IRQ_DISABLE
1 Z: M. D4 ~" ~5 A -
# x% {, j9 Q" u+ }; R: Y4 i5 u - IrqProgramEnd. n, \9 X! ^4 z+ f
- PLA5 y5 [* e- U3 v" P4 s! e
- TAY
) x" E8 L$ }; }& i& n: J - PLA
/ c" v% J+ G x0 z* x0 v5 A - TAX/ O3 w3 g8 x2 d0 p5 V% i0 o; e
- PLA0 o3 t e D: S$ ]6 }4 _1 D
- RTI
! ]8 A; Q+ C+ ~+ f+ e/ H+ Q -
5 T( ?+ b$ [. @ - ;==================================================
( j2 ^0 {# Y' x - ;中断表! ^6 L$ Y Y- ^1 }1 v/ P
- .ORG $FFFA* @3 j' [& L/ w+ q. b7 @: z
- .WORD NmiProgram
" x- }0 y" [! W4 { - .WORD ResetProgram
F ^* T9 c; J, z ~0 Q - .WORD IrqProgram
复制代码 [/code]* k* a0 \' B2 L( \
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|