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