|
|
- ;[FC][MMC3 精灵碰撞]
( C5 Z( r. |3 I6 C- J - ;FlameCyclone 20230710
$ z. Z0 m) G) l+ R2 J8 J3 Z
9 w; f# q, _( r S" i, O0 S) Z- ;文件头
7 a, {1 E8 ]7 D8 w - ;====================================================================== g2 L y+ {$ Q2 X
- .INESPRG 4 ;16KB PRG 数量
$ n9 @' x( E* ^2 j - .INESCHR 1 ;8KB CHR 数量% K% \0 P4 h' F4 p X
- .INESMAP 4 ;mapper 4
" P2 L7 h% V2 }& h9 Z/ H& R: T) W* Y - .INESMIR 1 ;命名表镜像 0水平 1垂直
5 c! t: W: D1 p8 Y( K# p - 8 w$ g1 ^' k( Z
- ;必要条件4 l( X+ a0 V$ Q* V9 ]& Q3 z+ Y
- ;1.持有CHR ROM+ b+ T/ ]4 w% E: e! f9 V
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
8 P$ @$ W. b D2 I. }. U' h - ;3.精灵内存(OAM)不为空' d+ s6 P) N+ R5 A2 P# |$ d3 Q
5 k. ?% a7 ~$ o! N% F0 F! m' d- ;==================================================
" l3 D8 G X9 x; ?, W+ e$ P - ;NES端口常量9 R' t ^4 y9 J0 |% ]
- PPU_CTRL = $2000 ;PPU控制寄存器
( w9 `& \) T8 X2 K: K - PPU_MASK = $2001 ;PPU掩码寄存器
8 u2 i) G# q# p - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
) {" ~" Q, T3 ^& { - PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
6 d& I; k! Q3 e0 [: F9 I- y! ] - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1# x( |, ]9 s$ e! j3 U/ D
- PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 2 W8 U. ~- ]7 U: h& A7 r
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
5 S- E# G/ o" Q/ ] - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
/ j6 X2 T$ \, a) W* |& G$ Q& l - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
+ s) R' _3 r+ o1 u# ` - APU_STATUS = $4015 ;声音通道切换4 T! Y4 S* ]( O7 A/ y5 I T
- JOY1_FRAME = $4016 ;手柄1 + 选通4 [2 a+ w/ L/ w" s- n; \
- JOY2_FRAME = $4017 ;手柄2 + 选通
" c$ Q3 ^# _2 N- Z/ d E7 f - , N! Y" q9 a* L$ l2 s6 p4 q* ~
- ;==================================================
: T$ w8 `- v( m$ ?5 H - ;MMC3端口常量
9 p* d( c% {2 E$ _. o& ?4 T - MMC3_BANK_CTRL = $80000 G( z7 A5 E2 j- Q! L) `
- MMC3_BANK_DATA = $8001
% O7 Z; g& e% |& b - MMC3_MIRRORING = $A000
* c( A, {; X" a' e - MMC3_PRG_RAM_PROTECT = $A001
- {; a% J3 R+ m2 b' l - MMC3_IRQ_LATCH = $C000, V% f$ T- m% g- j" m. n
- MMC3_IRQ_RELOAD = $C001 e$ ~; R7 r% ^* S+ P5 k S7 P
- MMC3_IRQ_DISABLE = $E000
6 m% q1 j; E1 p# C; z! l1 H5 s - MMC3_IRQ_ENABLE = $E001: }1 u( V0 Z" T3 O/ n7 E
- n8 O2 l. l6 e1 N2 ]
- ;==================================================
3 k$ I& c! j0 o% [ - ;程序块配置
\5 g( b1 Z$ l0 b0 g) s - BANK_DATA_MASK = $070 F% B0 d* z; {
- ;--------------------------------------------------/ _) p# S) |3 B- M1 t( o
- RESET_BANK = $07% N& @+ O( S/ `+ V! U. J
- RESET_ADDR = $FC00! k3 j1 v% g( t% I8 c. j" T) N/ O
# `$ E% N) l$ W N8 J, |- ;==================================================
, U& c, r- Z1 g/ _ - ;图像块配置
2 G* }: f! m2 ~ - CHR_DATA_BANK = $086 C5 A4 i# ~5 D2 J
- ( p# z4 _- R: x+ W7 R0 `8 M2 B; D
- ;==================================================# K; m) h" y+ \
- ;零页内存地址配置
6 D! }; F! e4 w8 r4 r& b8 L - Use_Ram_Addr = $80/ C9 X( l0 v5 Y) F
- PPU_Ctrl_Buf = Use_Ram_Addr. }' y3 z- o, l& {& h2 w
- PPU_Msak_Buf = PPU_Ctrl_Buf + $01% }3 _# @9 o4 K2 g) K
- PPU_Scroll_H = PPU_Msak_Buf + $01
' ?, t( U1 n: W/ \# O! ^ - PPU_Scroll_V = PPU_Scroll_H + $01
' h X6 t4 k- S/ |; w+ _ - FC_Data_L = PPU_Scroll_V + $01( ^: a: m3 d7 H! T6 F5 J# M
- FC_Data_H = FC_Data_L + $015 r5 y+ _: }: e2 V- k, ]
- FC_Data_Buf = FC_Data_H + $01
1 t1 j" ? ^" E7 H - ;==================================================
, X% s# ^0 w6 k - , F, f! ^: J/ _' P5 {- `
- GAMEPAD_MERGE_FLAG = $04
- Y( s( x7 ?3 M6 H2 b( R m
{$ K: A" w; |6 @0 K J+ ?! S- Gamepad_Keep = FC_Data_Buf + 1
/ U, K( d2 f* Z; j) V# r6 v3 d - Gamepad_Once = Gamepad_Keep + 29 L) }9 {0 H& y5 y o/ U
- Gamepad_Temp = Gamepad_Once + 2
& ]& _* U! h9 a' a+ d - : m8 C% v g% H6 t3 |: N: I& }4 \
- Gamepad_0_State = Gamepad_Temp + 23 D1 }& k2 F" C4 {( h' ^* O
- Gamepad_1_State = Gamepad_0_State + 1, Z4 j0 M5 B0 \& B0 h. b/ ^+ b; l
- Gamepad_0_Value = Gamepad_1_State + 1 O0 p3 m" Y( |
- Gamepad_1_Value = Gamepad_0_Value + 1+ `; f$ W7 N3 Q9 F0 [ j# C' V2 L
- Gamepad_Port_Value = Gamepad_1_Value + 1/ S) {/ @; O5 D7 o6 w4 z- @
- Gamepad_Merge = Gamepad_Port_Value + 1
: L$ k- `+ q% R% _
/ C9 Q1 q/ j; U; F+ a2 C6 J- ;==================================================9 b- A; ]- u7 I" D# n
- IRQ_Index = Gamepad_Merge + $01
; W) h' P4 R) K+ X - Sprite_0_Y = IRQ_Index + $017 d5 A0 n* X# }6 m6 A% K( |
- Sprite_0_Tile = Sprite_0_Y + $01
, G9 v7 }! z0 s; ^0 _5 z - Sprite_0_Mode = Sprite_0_Tile + $015 x; v& |$ A+ c, N6 g: s
- Sprite_0_X = Sprite_0_Mode + $01
3 w( x# s2 z3 y6 _! h$ \ - Sprite_0_Hit_Move_Direction = Sprite_0_X + $01" N3 y+ I/ I. S1 F8 p* b
- ;==================================================7 k5 l4 k( X- ^, d. n
1 }8 J' J* ]: i. F' U- ;CHR图形数据
$ s+ }% U6 U1 ~0 z3 f$ U+ y - ;==================================================: \1 v6 `( a/ v9 }( @
- .BANK CHR_DATA_BANK
4 T: b' Z: R2 ? - .INCBIN "chr_bank/chr_data.chr"
! ~% z5 N* y2 ]0 z2 @2 z( |. g3 `3 ~ - * z4 [4 K/ b$ B
- .BANK RESET_BANK & BANK_DATA_MASK
& q. B; ]) y! R# _# G5 | - .ORG RESET_ADDR* t8 k8 B6 T( y4 H6 e- G" H
- / t9 \" O$ I( u$ }! P: C
- ;--------------------------------------------------) J4 ^+ [0 \& w5 z/ q! C
- Attributes_Data0 u {! P# e* u# ? V" [ Q1 b9 [6 t
- ;命名表属性# d' T* f7 U B8 ^0 J' E
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
& `0 x! E& q0 y4 B6 m7 B1 J: Y2 {* z - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA
' I' I; e( M" ] - .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA0 G) t0 r6 i9 S+ k! D6 \
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55+ |/ J0 J8 P/ T# a3 P
- ;--------------------------------------------------
, S' d0 V' W W) ]& b& y - ;调色板数据
/ H$ c# z- U8 c. M - Palette_Data
. y; b# L8 g$ {. ?6 p( R - .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F. y9 K& C& r: ~$ X2 i
- .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F2 }4 v2 i& L* p: `
# t/ V! s9 }3 ]5 t- R6 i) U- ;==================================================
+ p I M/ R% B5 i8 R1 @" n - ;命名表初始化/ W4 P7 y- C1 j! ~/ ~+ Z" U( r. q3 }
- Init_Name_Table
: X) f/ B& g5 R% Q - LDA #$20
; j; m2 h2 ~5 n# y) G3 h) x - STA PPU_ADDRESS, l4 z2 E- W! o% a9 z. Y' Z
- LDA #$00, F7 S& m) `7 Z# |/ |
- STA PPU_ADDRESS
1 _. G; W. e; g8 V( } - LDA #$00
5 @: z+ F) G) Q/ x" @+ \ - LDY #$00
7 J% f9 h5 L; D - LDX #$105 [. O3 g# n/ D: x6 U6 W9 H
- Init_Name_Table_Write7 Y7 q( G! ~ ~+ ~3 c/ t, k
- STA PPU_DATA
4 h# R. b/ @4 g+ ]) v! X1 n8 O - INY
" u- X; ]. t' W p. N - BNE Init_Name_Table_Write
$ x* w* b/ M. [0 Z/ P - DEX; w5 |" N6 A3 S* ~
- BNE Init_Name_Table_Write9 c3 }# a: C% e# f! K5 j
- RTS a" H- x0 ~. j$ g/ K
- # ?" p1 k- @# O% n5 G7 x" w- ~/ b
- ;==================================================" q4 m3 P5 C" L9 S3 o0 Z
- ;调色板初始化6 z5 l; a4 o& J+ ]0 f
- Init_Palette
" J! B% \9 z. ?3 ?; R1 _% G. @ - BIT PPU_STATUS+ ^2 |: L+ P8 l5 g) @8 A
- LDA #$3F7 ^) V9 Y- s4 n5 r. x
- STA PPU_ADDRESS
% O( c, n+ s) f5 ] |, F - LDA #$006 V2 g" y5 b' p' Z- x* B
- STA PPU_ADDRESS" S9 u% ]) t% g' z
- LDX #$006 n1 M v3 Y7 D: Q# P* X+ G
- Init_Palette_Write& Q" W4 |) H9 [& u4 ]) |( A
- LDA Palette_Data,X* B$ {7 G6 C8 X* `, e$ N) [5 E( }
- STA PPU_DATA$ ~7 f/ H8 U# v0 a! J
- INX$ m5 Q4 P0 W5 `
- CPX #$20: ?1 Z+ S- F/ I+ K
- BCC Init_Palette_Write# A# O+ ~* U- d
- RTS
5 P! z: ], h+ N0 v; Q - ; x& c8 }" G) n9 s$ P- m
- ;==================================================. _+ U' x/ Y: ~; s- w) C3 m' T
- ;设置命名表属性( j- L( B8 |( j
- Init_NameTable_Attributes
# }+ l# [1 F0 b4 `% A - BIT PPU_STATUS
2 \; @5 ]: l& B- ]; R( y - LDA #$237 y) e/ z4 C/ ]
- STA PPU_ADDRESS5 Y% F7 K- I& e$ j/ R; P- F5 d$ {
- LDA #$C02 Y0 d) Z" ^+ H2 I$ _: Z
- STA PPU_ADDRESS" A: M# Y7 L( }+ Y; p
- LDX #$00
3 h7 T1 v% u2 o) B5 i: Z3 _ - Init_NameTable_Attributes_Write; X2 ?- O2 P2 r9 r
- LDA Attributes_Data,X$ X m5 _% c0 Z! s* T9 z9 P$ z; c) H
- STA PPU_DATA
2 `( Z$ C- {9 E- ]- ] - INX# u5 y) h: Q: i( t' j
- CPX #$40# Q2 Q; p; Y4 O, Z# E5 j& _. v& e
- BCC Init_NameTable_Attributes_Write/ Z' V& P* C! d
- RTS
5 G, G+ c; J% N9 j/ C
, |$ s- C3 B1 ~( T V- ;==================================================8 k: f& i1 u) a7 m+ e, S
- ;初始化命名表文本
8 t8 B, m. V; A& k( i2 m O - Init_Name_Table_Text
/ ~! V& l9 _/ F4 f$ u+ R - BIT PPU_STATUS
9 z+ A9 v& Q) R* T9 l - LDA #$20
9 i3 Q8 _- h7 _9 B2 P( P - STA PPU_ADDRESS9 o* n# j# Y. E# u. \4 m
- LDA #$00% f- u1 r: D3 u" Q# `5 u
- STA PPU_ADDRESS
8 k5 s8 O" \8 S e8 J; ~4 m - LDA #$008 M. O: H4 Q8 |0 a; {+ F( ~
- STA FC_Data_Buf
" N) @2 y ^/ Q5 d - LDY #30
: Y) u( ?4 X7 n! j) n r - Init_Name_Table_Text_Write6 o/ N. d9 D }- V. {
- LDX #32
7 L6 r4 \: h! H5 _ - Init_Name_Table_Text_Write_Char
; G. E5 r6 Z% n* b - LDA #'0'
/ }8 K1 q( m4 A+ b - CLC" f7 G# ?' N+ C; v
- ADC FC_Data_Buf
$ m* C% y2 ? H. V1 M" F - STA PPU_DATA
, M- k( n0 B! \5 D! ]# ]3 J - DEX& j6 {2 }6 q- f$ `5 r( Q
- LDA #$14
) d; W! @- ]: o - STA PPU_DATA& [- t, k' A" E; K7 K
- DEX& z; t, f4 f! i ^$ Z
- BNE Init_Name_Table_Text_Write_Char
! a0 d1 `0 e; H& X+ b: w. C* e8 l - INC FC_Data_Buf
3 X c' ~7 ^6 u - DEY1 k3 v) s* x. M2 G3 G
- BNE Init_Name_Table_Text_Write
- z7 l% q9 I: J0 {3 ^8 i, a1 @0 u - RTS, m z: W: u I, x% G N
4 v' O0 @- h6 [( G+ v9 J+ _- ;==============================
. W, Z- x# s8 c" W& h9 i - Init_OAM_Ram;初始化精灵内存
0 Q5 b4 n2 m# c' _6 B1 Q - LDX #$007 B) |7 U, b6 i1 g/ b @
- LDA #$00
. y$ |: U9 F( ]4 ?8 c - STA PPU_OAM_ADDR" M) Q: Y. |' {2 d. o! B/ k
- LDA #$F8% Q' B$ n- }( a Q9 h2 v- c
- Init_OAM_Ram_Write5 p a1 d# U& p4 `
- STA PPU_OAM_DATA0 v; U/ }4 }& q c' y8 w G
- INX* D& K7 s9 V6 C
- BNE Init_OAM_Ram_Write0 e# m# h5 I% o2 G* q5 z: n7 I
- RTS
$ P8 J, X' d* x: k- ] - 4 B F4 i. K: v. L9 p0 u g1 ?
- GamepadProcess;手柄处理
( r/ q, }' q# T. H5 y9 [ - JSR GamepadDatacan$ q. A$ q' j/ M3 ]
- LDA <Gamepad_0_Value
& [# `4 y$ u; S. x% y - STA <Gamepad_0_State
) E6 K9 h$ W! V# b2 Y1 b3 g" ^* b) @ - LDA <Gamepad_1_Value2 W: L. h8 B5 _. S% i2 q
- STA <Gamepad_1_State
3 t- t8 i& X0 r8 j/ U9 Q! V$ { - JSR GamepadDatacan# E5 `* K! E& _4 ^& `7 N" m
- LDX #$01
5 ~. i& @- c3 _ ` - GamepadMergeCheck;合并手柄输入检查$ O3 P: }' R7 _3 I% @
- LDA <Gamepad_0_Value,X
+ K8 U" h0 T: X2 l$ G- T - CMP <Gamepad_0_State,X
9 W) ]) q- b" V9 c0 Z! q. g* o" s - BEQ GamepadMergeInput
& s5 u0 \5 O$ `, _6 v2 c9 C \ - LDA <Gamepad_Temp,X
% q, j. e5 G* m* P& y9 w9 b - STA <Gamepad_0_Value,X# T4 i2 R. M) A! V7 r
- GamepadMergeInput;合并手柄输入2 i- w( J e/ q; [& o' A1 _- C* n
- DEX% |5 ]! t6 I* |! ~: a6 f+ J8 O- K
- BPL GamepadMergeCheck4 u$ E. C Z" N6 C3 O
- LDA <Gamepad_Merge/ r( U/ p0 a0 x$ ^
- AND #GAMEPAD_MERGE_FLAG
2 J! X5 m9 f) V3 f2 R/ h5 z7 i - BNE GamepadStateProcess
|7 @' f: K4 }1 N6 t - LDA <Gamepad_0_Value3 r% I$ k$ V5 ]
- ORA <Gamepad_1_Value4 ^( V# X5 L) X+ O {1 ~: S
- STA <Gamepad_0_Value3 X9 a7 M% [+ e) S- W1 q
- GamepadStateProcess;手柄状态处理7 _7 d/ F" z! f% r# {1 L
- LDX #$01
3 M0 M' e7 S) [' B* N4 ?- a" ?9 {4 s - GamepadStateSave;手柄状态保存
1 g3 U# R9 @8 _ - LDA <Gamepad_0_Value,X& h' D" C, E9 |) e( ?' R( x
- TAY) K) l0 |8 G* P# n& M0 k
- EOR <Gamepad_Temp,X! q7 ?0 b6 Z, x3 E& N# B- u
- AND <Gamepad_0_Value,X
0 H5 z7 a3 _3 E/ e, e* G - STA <Gamepad_Once,X) ^! G" I* D) {
- STY <Gamepad_Keep,X7 x1 Y. Z2 K; y$ ^7 ^6 D
- STY <Gamepad_Temp,X
# l8 Z6 y% V# |9 I! H' e! x$ ^% o) Z - DEX; x3 [) T( c8 j3 X0 C+ t( G& _9 ]
- BPL GamepadStateSave
6 @/ x2 v$ V* x% L" a - RTS# l. V3 q$ v9 r% y4 t9 V" y
- 2 }$ s: n. x3 b4 d" z$ O7 l {
- GamepadDatacan;手柄数据扫描
2 U% P7 @- w7 b4 N+ i - LDX #$01& V i7 U/ W8 Q3 _: u# L5 d9 {
- STX $4016
" e" E, O9 c! s8 d2 P2 i8 @* |: e% M - DEX
- C. P+ ^; X3 }0 e$ V/ I( {$ _, p8 N - STX $40167 n/ z, H. R' \2 n. |2 ]8 S" O
- LDY #$08
6 k* q& [) P# y4 U+ h - GamepadPortScan;手柄端口扫描
% r# d. l2 Z. O - LDA $4016, S5 G1 f0 ?* ~
- STA <Gamepad_Port_Value
% h, _- r4 P3 V8 U: W - LSR A" c+ ]7 I7 @4 U
- ORA <Gamepad_Port_Value2 k" w' h3 s" ] @
- LSR A
9 @$ [" z4 @( S. M/ ?# n7 X4 E - ROL <Gamepad_0_Value
! _" \0 j9 j8 D# y& f; s9 m, O5 Q% c - LDA $4017
) H1 O: l" j9 J7 x2 ] V, Q( X - STA <Gamepad_Port_Value- F& f9 X( N/ A( D. k$ Y
- LSR A; m% s" W3 i" [; V& o
- ORA <Gamepad_Port_Value
# `$ I- e) U; [; ]7 l) J; W$ w - LSR A& v: T7 ~9 W* ^8 d
- ROL <Gamepad_1_Value
8 L1 B& l+ f' f: c9 E# `# {. p - DEY' V7 O7 T6 k9 v; c
- BNE GamepadPortScan7 q" E" W7 C! ?1 L0 Q
- RTS" K! o6 x+ i! B! J
- / o' O8 Z4 L* t" T
- ;==================================================
6 r. S# S+ f! B" z b+ f - ;PPU处理
2 V& C5 M* S, x) [" |% b' G - PPU_Process
* ^# E0 H; d" d1 Z& [. `0 x' H - LDA #$00
: W! S8 V Z9 _* n - STA PPU_MASK7 b) T9 W( w4 N$ W
- @4 ?) f3 A- Q; u2 U6 F$ [1 @- a
- BIT PPU_STATUS
" R% C6 r& K- u - LDA #$20
5 e6 \8 k4 @* J8 C. z - STA PPU_ADDRESS2 B3 S3 E- m0 H
- LDA #$008 L( x4 q- z; {( U. g7 F+ l6 l( V. m
- STA PPU_ADDRESS
+ q; ~/ w! _* ~+ h0 L: @ -
5 ?8 _0 i6 [ T5 a8 ]" l- T7 H - STA PPU_SCROLL S2 M) e2 O# S& r1 _
- STA PPU_SCROLL, X X# O0 d1 w, d# S" J1 g
-
* d/ K/ d; T6 b$ G# z - LDA PPU_Msak_Buf
( a, t V( A g) \7 K- `* O4 r2 t0 ~ - STA PPU_MASK( f# N. ?$ j5 {1 M+ k! E* D: b, t) R
- ; \$ R$ x- L; h1 f4 a' O5 \
- RTS
7 d" S; o8 Q$ M -
" Q0 M" V% O# N - ;==============================( @' L8 \0 a- z9 s% H( r$ P
- Time_For_Vblank;延时等待
9 m/ p% ~6 I, g5 N* u' C$ P" ^ - LDA PPU_STATUS" c7 ^) G. R3 Y! i @
- BPL Time_For_Vblank! T4 P3 p# K* Q) K& K3 \' [
- RTS
3 ~" E# z8 `( x- ~1 U4 p5 X$ F - 0 y8 D* L5 N( W( b5 @ O" X6 y% W. D
- ;==================================================
+ C7 k" T# Z6 c- O+ S - ;初始化MMC33 G5 k, J# b) F
- Init_MMC3
, F1 I1 T m& Q* N$ e8 C/ O, F - STA MMC3_IRQ_DISABLE' Z; H# b1 F/ {4 B" i4 T
-
2 Y3 X. d. F8 l. Q% Y - ;设置MMC3水平镜像' J, P% x4 l* {: N( C9 L6 H
- LDA #$01
/ j& A. F' {% \$ R9 }% j6 {. x) z - STA MMC3_MIRRORING7 [8 _: [3 n9 P* Y% a4 l
- H! c5 g/ ^% s: t
- LDX #$057 }' U" g$ i6 M% i6 ]: ~& n* ]* T
- Init_MMC3_Chr_Bank_Write
. v9 U9 X' w* h2 A' O8 } - STX MMC3_BANK_CTRL5 u) l! ]6 ?5 b" w0 w: a
- LDA MMC3_Chr_Bank_Data,X
/ x3 O1 u, C* g8 I$ A( a6 R - STA MMC3_BANK_DATA+ k; J4 c: [5 Q7 W* [4 c
- DEX3 r0 J& A P& z0 F) @$ o
- BPL Init_MMC3_Chr_Bank_Write) l' N+ z" D- D6 M: ~
- RTS- W; X! l/ H0 Y9 [
- ;-------------------------------------------------- P# @) t$ y, A8 _. l* E
- MMC3_Chr_Bank_Data
# C' N) }3 G! r) D4 U. j- l: t - .DB $00,$02,$04,$05,$06,$070 j' G- ^& \+ F# C
; P9 X, I8 l, |% y. Y# t- ;==================================================
1 t+ M9 {! v4 i" E! G- M) t$ \ - ;重置中断处理- Y$ ?+ I7 C6 w& s
- ResetProgram$ U# x0 @' t( |) ]+ c
- SEI, w4 u8 |# `+ x, e$ S. ~
- CLD
1 N2 k) Z/ y% E - LDA #$00( X$ ^, o0 K! U; T$ W" o2 S
- STA PPU_CTRL
$ B4 D1 o) q3 Z - STA PPU_MASK8 e, c1 X& M/ ]0 L
- STA PPU_STATUS
( q4 c) R6 l( j# o. A( x) Z - STA JOY2_FRAME3 E' @ R8 m3 P3 t
- STA APU_STATUS
8 \6 C# ?, r9 d/ a -
, p+ N& F+ R* O: ?$ q4 ?) f0 { - LDA #$C00 Z2 \$ i/ x1 q& O6 l* P7 q
- STA JOY2_FRAME
1 S+ {5 e4 u+ U: ~5 D4 P s4 y -
/ x+ K3 ?4 L* v2 d/ [7 O - ;等待vblank: J+ m3 u2 S; x6 C2 K
- LDX #$02) i" X: P0 U9 n) C S" }5 ~
- Vblank_Wait_1+ _. C# Z1 ^; y {
- BIT PPU_STATUS* i5 Z% o- v0 Y
- BPL Vblank_Wait_10 l" V! x* L7 S( y" K- q/ x6 [
- Vblank_Wait_2
! H S. _; J9 d: H! f - BIT PPU_STATUS9 N+ j/ X% m3 n3 f4 t
- BMI Vblank_Wait_2
' g- p( Y6 L' u. ?! y - DEX7 A1 b2 X4 h& r" m7 O
- BNE Vblank_Wait_1
2 d" S# n* B! O( j1 b0 b4 S - 1 U0 \5 g# N9 G# S1 K# G
- LDX #$FF) D- a0 d% ^6 S! f
- TXS
2 e+ ~3 y0 t8 S `( C' h3 d -
! L% I) f$ R5 t {+ t - ;初始化MMC3
- ~0 a/ _+ ?0 A+ `& z - JSR Init_MMC37 J8 x8 B0 m* g2 x: @
-
0 y, ~# C; H* r - ;==============================5 u( i& F S3 `# I! F2 r
- ;RAM初始化
8 u/ w( w( @6 J - Nes_Ram_Init
# i( m( S5 L9 y3 P; f2 w - LDY #$00
; f* Q' ^# r- _/ R+ q$ v - LDX #$08
. q$ q6 }2 q* R; t1 g - LDA #$00
. B/ {; X4 v5 c) m$ z- @ - STA <$00% w- B6 X; V# S; o8 v+ B
- STA <$01' [) b+ D2 N Y3 H7 T/ K o
- Nes_Ram_Init_Write
* {, b( Q' M, w - STA [$00],Y; {$ M6 x) ^9 @0 x
- INY/ g& b4 i; P( E5 z7 a
- BNE Nes_Ram_Init_Write
+ V M% P0 r. h9 n% G - INC <$01) M: j( A4 A3 u0 x8 _2 |( u
- DEX
8 r0 [/ O9 Z5 \/ O+ m; i4 V, } - BNE Nes_Ram_Init_Write
2 L( c: A! t ]: Y4 {3 Q. [ -
Q; [% g5 c9 a - ;初始化命名表$ U0 S6 @# S( |6 S4 M9 _
- JSR Init_Name_Table
8 l* U0 X/ z1 j/ [5 c! s, E -
6 N, G6 Y* J/ V0 ~" d% I - ;初始化调色板
) ?; u3 @8 R' K( q* w. G0 W - JSR Init_Palette% ~7 d4 q) B; }; J/ E
-
- F" d- z9 U. y: E8 y, _ k& ? - ;初始化命名表属性
; z" d( X/ e) N6 ?$ H! } - JSR Init_NameTable_Attributes" x- A$ y+ g( y! q: T0 ]7 g% l2 L
-
% n5 M" d" q9 g% j( Z4 B( | - ;初始化精灵内存% j: ~8 Q$ D7 Q3 o! K+ d5 j
- JSR Init_OAM_Ram
9 q& e6 N X9 {9 J -
9 O5 Q @7 U6 e" [. [ - ;在屏幕上写点东西1 `9 q0 I; @' p/ K; R
- JSR Init_Name_Table_Text
2 x' y k% M+ O: }. w( U -
+ \/ t' Y8 o; U% X2 t1 G2 C - JSR Time_For_Vblank
3 v9 c6 b3 f9 ?* I. s; _! ~! q - ;开启PPU控制
. g' D X& O% E. g - LDA #$80
' g! N7 P( G4 |9 d/ Q7 S" i - STA PPU_Ctrl_Buf
7 a- A: g* L* i' m0 |1 D9 S; q - STA PPU_CTRL) c1 x4 r/ R8 Z' F
-
( H- _2 h6 i& N - ;开启PPU显示
1 G! C8 K. S% i, R; p P - LDA #$1E
7 y( C2 X8 `) _% ^9 f - STA PPU_Msak_Buf8 r3 Q4 b3 d" s5 C' ]
- R3 h0 Z' b+ m. `3 F& o s2 \
- LDA #772 L2 h# i$ @: l* J6 Q6 ~3 j( K
- STA Sprite_0_Y& A0 W( ^$ p( z: v
- LDA #$1E
+ T. V+ _; l! B1 P Z - STA Sprite_0_Tile ^/ u9 J! [# j; v0 q
- LDA #$20
9 f7 e- b, U* J E5 X1 D' ~2 k I - STA Sprite_0_Mode/ o* Q$ b {$ g, x: K8 q5 U3 C
- LDA #$00
7 P9 y' d# F* Q& w# D. g* p - STA Sprite_0_X
7 u- l. D7 y. G! C: y# g - ' ]8 i$ w4 e1 b
- CLI
3 o) ^/ O' K2 w: I, x - JMP Loop9 b: b5 M* x7 {0 c* N6 |
-
! c9 } c" N7 V - ;==============================
* G1 s( Y R: `, D" @: e7 x - ;死循环, 等待NMI中断
- @( i/ _6 q; x3 Q K/ l4 } - Loop: V; c/ c) S0 `1 P0 i
- JMP Loop
+ X0 D/ V) Y- u P+ ~
2 D3 }1 Y6 F* g' k8 U: n0 X+ ?$ q- ;==================================================6 L5 }( ^& f& G$ Z. S# C
- ;NMI中断处理* \5 u4 x( N0 r1 `! \- q/ u3 G
- NmiProgram
1 e" l+ e& k$ g - PHA
6 d+ x5 _5 ? V# K" Z. }: w/ U, t - TXA
' P _' \' t5 N6 g - PHA
! ^% S& ?; T4 p5 g/ [) O7 n0 ` - TYA: o E& H& Z" w
- PHA6 k+ Y) s. C0 i. m, [
-
0 H: S9 y( M# Z+ W# P - BIT PPU_STATUS7 F% {/ K3 z) g% ?7 s# e# l
-
% b7 v4 B/ w+ \* _- o8 e9 f - ;关闭PPU控制4 S0 \) g6 m) G# x) l# D
- LDA #$00' e* H7 q" M% U3 x/ J
- STA PPU_CTRL
$ o. n3 u1 O; b% G; t7 ^3 `7 ^4 \7 N -
/ k% Y, i9 Z8 p4 S# A O: k - ;处理PPU
E. \+ i6 ^8 T - JSR PPU_Process
+ I# M, a/ w0 j5 t4 Y9 u - ! a3 j) M' l& g0 Y2 I$ w
- LDA #$00
& {) J$ ?- x* c: @+ E! ~ - STA PPU_OAM_ADDR
0 F) T5 W: |2 I# @! V - LDA <Sprite_0_Y, g1 C( V& Z5 R! i5 @; j
- STA PPU_OAM_DATA1 `, w4 H# M3 y a
- LDA <Sprite_0_Tile+ S8 s4 U: j4 g, V% r" L* X' K
- STA PPU_OAM_DATA
$ ?* ^/ t: l ^ M7 A - LDA <Sprite_0_Mode# O! L7 N( {. R) ]% u0 G
- STA PPU_OAM_DATA1 F4 s' M0 x( \
- LDA <Sprite_0_X0 i& R1 f: R! O/ C' k" t( S: J
- STA PPU_OAM_DATA8 l) z7 Y8 L9 F8 J2 S; n
- 0 F" w7 } `" r* D7 N
- ;开启PPU控制( t2 |) W+ C$ y+ ]
- LDA PPU_Ctrl_Buf
3 }: B1 T. i* j( _6 U; ` - STA PPU_CTRL
' s1 t# P1 D" v1 p( b - # U5 l; F( G' ]( e8 l+ r* `
- ;屏幕滚动& R* M9 i6 r: X( M# R
- LDA <PPU_Scroll_H
j; J3 w) B/ Y7 t; y - STA PPU_SCROLL) t; D1 P2 g2 Z! R2 O8 T x
- LDA #$00# d1 m/ c9 ]4 ?" x) _% Y! ^
- STA PPU_SCROLL* ]$ r4 m0 G5 a2 S: N
- : `1 r# q( T9 q
- ;手柄处理
o/ _% u; K+ W, O1 x - JSR GamepadProcess7 \- ^+ Q7 B9 m7 Z: d m
- 9 Y. j; d# \8 t2 \
- INC <PPU_Scroll_H5 k. b7 f' }# ?; y; y6 `& z
-
5 N% K- _- ?1 x4 H - ;启动0号精灵碰撞检测
% O5 c6 M% R+ c) r - LDA #$01
5 ?1 b' Y, L5 H# [ - STA Sprite_0_Hit_Move_Direction
8 T! I' F3 B1 m ~; X6 P8 @ - JSR Sprite_Hit_Test
7 d9 Y. }- x( a8 Q( o' P& D - ( j1 N" I$ v' G8 |& s) O- C, E5 \ ?' c
- PLA
% Z: Q" W' X/ U# _, |# c4 p7 i - TAY% ^% A( W/ m8 ?; H
- PLA, H. ~5 R H5 n
- TAX
: d; o W$ c4 l- W) V4 z7 A - PLA* E- g: H8 e7 Z5 @# p
- RTI8 q4 D( L& Q1 U T; X; u# ?: ~7 `
- + \* D/ ^, b6 E- C( W6 ^
- ;==============================4 V9 Q6 G% ^" r7 r# ^. u& s
- ;0号精灵碰撞测试
5 H5 i' K2 n+ j9 f. M - Sprite_Hit_Test
' d' S+ \5 s) e2 m0 g, U - ' |, }# {6 q3 e) @% e3 ? J0 N" u$ {
- ;------------------------------
8 E3 ~9 r1 l" W2 j5 l) u K! v% V - ;等待0号精灵碰撞状态取消
% G2 g% h8 B; T; i - LDA PPU_STATUS
/ S* h3 Z; |$ d0 w - ASL A. q% _. R3 J3 T
- BMI * - 4
4 y$ M. T; X) K$ q3 M -
% E7 O* t/ L* J6 x2 ]2 x' u - ;------------------------------
5 g. R: B8 e; z0 @5 E9 { - ;等待0号精灵碰撞发生
* {9 x% ^& O: ?! p& }, K - LDA PPU_STATUS7 _9 C/ c( K Q: p7 }, z
- ASl A
/ v3 c' s* ^# E. O% ` z5 J% ^ - BPL * - 4! {: h; V4 L0 F- K
- 4 ]& Y1 e3 ]5 \7 ~4 k4 I' Y' o+ @
- ;------------------------------
/ \1 r8 A2 C' H& t - ;行消隐等待8 R: n) |0 s) `4 M& `; _
- Sprite_Hit_Scroll_Wait! R6 r1 s' O" ]6 {9 H N9 `% Y+ p( t
- LDX #$28
/ x: }9 }2 g9 X& n0 F6 f5 l. p - DEX x z! L* u4 K4 N i) f
- BNE * - 17 c: F9 J3 m# \# P
- 4 x8 O( S* A( P7 R- H, z) g
- LDA Sprite_0_Hit_Move_Direction
5 o- w! ]# z/ Z6 I& c0 G - AND #$01
4 H5 F$ ~) G3 [) M2 X* K - BNE Sprite_Hit_Scroll_Set_Right8 ?' A! ^( E% j0 V5 J
* I! G9 `& e* A6 ]- ;------------------------------
( ]) Y& N- K% p9 }9 }+ Z. |; v8 p - ;分割画面向左滚动, L/ W2 f! a, K
- Sprite_Hit_Scroll_Set_Left
% C" E4 U$ `5 C" }8 b - LDA PPU_STATUS
+ q, o7 S( A* n/ F5 L# a7 S; M) o - LDA <PPU_Scroll_H
0 ]5 P' ]7 ~! B/ L; K% g - STA PPU_SCROLL
! h8 C! o, c$ t* B9 u# _- f - LDA #$00( Z$ ^$ ]1 A" ?' w" F( z
- STA PPU_SCROLL) M. f7 @/ e8 C# N
- RTS
" G8 q' ]6 W9 c$ ~' @
+ G @3 B2 J% t1 V. h& i: h( z( A/ N9 ]- ;------------------------------
5 R" z* w0 t( C - ;分割画面向右滚动$ {) a' U% D, T% _
- Sprite_Hit_Scroll_Set_Right$ O. G6 d. i7 h& a7 e& t& L. N
- LDA PPU_STATUS2 R) N) ?2 j* S5 ~- K
- LDA #$00% u) ]: X6 t. l" s1 y
- SEC( K* D5 x0 f' O' K* e5 d
- SBC <PPU_Scroll_H
" ~6 J1 g5 u; _ - STA PPU_SCROLL
8 L7 s: t4 f; y6 s - LDA #$00* S% V! f8 ~" D! F+ W6 {! j0 ^* z
- STA PPU_SCROLL8 T+ `1 ]$ g9 c7 a
- RTS
5 m: H+ ~4 j' o$ @% w
, @9 ]" G* | P" g- ;==================================================! ~) @, i$ G. F, D
- ;IRQ中断处理
. [0 y, [8 y7 o8 v" K - IrqProgram$ C) z* U/ _7 D/ z2 {
- PHA. B0 j. Y! A ~. O, e
- TXA
% t% S* h% p2 O/ W - PHA0 G# V6 y- W" R/ i' F7 ?
- TYA/ X% M4 w2 |: }. ]5 l0 {( e
- PHA
) H) z0 X: O/ R0 `+ h - + u4 |% T% B/ N" c9 g2 j3 k
- ;关闭IRQ* d* i6 ~8 B/ I/ r: j/ v. _" u2 I
- STA MMC3_IRQ_DISABLE) D! _ U! ^. l! b* k
- + X- ? r6 C- h: Q; u! ^4 O
- ;允许下个IRQ触发6 K9 i0 S5 a% _
- STA MMC3_IRQ_ENABLE( u# t0 T) ?7 D: A# `, P
-
3 y) G. p" f8 @ - ;IRQ处理, 15线后继续触发
2 M% s3 X4 G8 s9 ~" B0 l3 R* W - LDA #15
, |4 _4 P$ e( c6 v5 ^3 m w4 ] - STA MMC3_IRQ_LATCH
8 F8 o3 n. D1 U- S -
6 P+ Q4 Z7 i0 K. } - LDA <IRQ_Index6 l( P' D |2 _$ \" g( m. A. k6 N
- BNE * + 4
3 V5 O9 [9 L2 K4 L& M - INC <PPU_Scroll_H
. Z+ n3 x2 ?6 ^! a$ z -
) ^8 [3 Q% T- d7 N3 T) G - ;设置屏幕滚动6 v1 X7 a9 D+ U8 L7 [
- LDA <IRQ_Index/ u% r( a* [1 i, i: ?1 }# I
- AND #$01
3 N! M( [% T# |9 `& v' J9 s! @ - BEQ Irq_Scroll_Right
. @8 K% @, a2 Q( ^7 L
( U$ P9 ^- z$ P: C" T9 [$ ?- Irq_Scroll_Left5 ^. c+ v! L* a% ~6 @, t
- BIT PPU_STATUS" z- }" [% n7 R. ~5 V
- LDA <PPU_Scroll_H a: Q1 b; D! Q7 F" ^
- STA PPU_SCROLL, w! B' Y: j3 B) F) m
- STA PPU_SCROLL
3 ?0 T6 x% z, t1 T$ n' x - JMP Irq_Scroll_Over) C8 g# r4 d( F, s# M# @/ R
- : a' B" S9 c2 Z! j v* R& q5 P$ f
- Irq_Scroll_Right
" E, i C0 E8 H0 j8 _! p8 r - SEC, O2 i* D9 ^" _) N+ ~+ {+ T& f
- SBC <PPU_Scroll_H$ u/ D& s6 g8 f+ O
- STA PPU_SCROLL# Y# M$ r& D3 D; @) a
- STA PPU_SCROLL
0 U! z' d: P5 r* v% v - Irq_Scroll_Over
% R6 _# g0 s+ x* t8 g$ u/ Q - X. O2 I7 h% X6 c, C
- INC <IRQ_Index
3 k; ?. `' }1 _6 J* f - 2 `, p, ~7 b( {) z' h$ P( o$ V
- LDA <IRQ_Index& k1 t7 L# g& U! t# ^* w C3 x
- CMP #14
1 c3 S/ S( E6 g% l2 } - BCC * + 54 C1 c1 V# Y$ J8 z. U
- ;关闭IRQ, Y8 t, x( {1 g. |9 J1 m
- STA MMC3_IRQ_DISABLE
" ^% r- v5 ?# E. V3 } i( R$ q - % f5 m, R( T$ l1 \: J
- IrqProgramEnd
( K' Y: I: b) p3 W( I" {! f4 x - PLA
" D9 v. v' U T B- A; Y5 { - TAY
0 g0 ?! a$ `) u2 }. { - PLA2 z8 _" N' f1 `" g
- TAX" l- \/ }, i3 J: G6 Y9 K
- PLA
/ _: `4 w6 \3 m8 l3 J( d/ O/ r* B - RTI
% I7 x7 s5 K3 v# s/ r0 T; ~2 t' s! R -
0 k' E; c8 Z- K - ;==================================================
) V0 _- ?: I8 q0 F# H: _! Q6 u - ;中断表
& c% p$ P5 o- { - .ORG $FFFA9 G$ p) W1 k B* u
- .WORD NmiProgram
# l2 o& Q4 c a- E1 w8 H - .WORD ResetProgram1 s' o( i! `9 {# E# m n& `9 m; T
- .WORD IrqProgram
复制代码 ' f9 Z7 k4 A' z) P1 c
|
评分
-
1
查看全部评分
-
|