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