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