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