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