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