|
|
- ;[FC音乐][MMC5 IRQ]
% v! }1 z9 v, H# x* p: z; L - ;FlameCyclone 20230710! U. R0 w3 }- J4 [
& q! c! g! D* B# A- ;文件头
- S! X) k6 e6 Z- p. w - ;======================================================================
, o, v5 Q) }4 T) R3 z3 Z - .INESPRG 4 ;16KB PRG 数量
) r6 U% f5 o# y$ ?- w - .INESCHR 1 ;8KB CHR 数量0 V& a- N% M6 ~3 A/ U$ |) r9 u
- .INESMAP 5 ;mapper 5
f Q _" l$ U - .INESMIR 1 ;命名表镜像 0水平 1垂直8 f1 _" Q" ^7 `+ P7 G
3 v: ~0 | J& q; D+ H0 I- ;必要条件& W/ h) ]3 F' a; i1 K
- ;1.持有CHR ROM; f% s4 k* ~! a. S3 x
- ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
; W0 c' z' q; O6 \4 U4 l0 ~7 ?- u - ;3.精灵内存(OAM)不为空2 p! ?/ Z. X/ T3 C% T8 [
0 e @/ l |0 Y# p& i+ o o4 A- c- ;==================================================& X/ R+ B. n8 P$ t% a s
- ;NES端口常量
2 `* F( I, e' Z& P; k# g! y1 ? - PPU_CTRL = $2000 ;PPU控制寄存器
5 {: \' S1 {4 w0 }! m' S - PPU_MASK = $2001 ;PPU掩码寄存器
# v. S' I# z5 d R m$ Z - PPU_STATUS = $2002 ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位5 {) z$ z; `; ]: L# a
- PPU_OAM_ADDR = $2003 ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
1 x, |! |1 @" x6 t - PPU_OAM_DATA = $2004 ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1
3 ?5 t: ~! N# \8 c' F4 a i3 \ - PPU_SCROLL = $2005 ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 $ ]4 S6 v) p1 x4 C- A1 V3 |/ _
- PPU_ADDRESS = $2006 ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
+ J X+ g9 U, f' f9 s# r - PPU_DATA = $2007 ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
4 d- e3 Y, ], j7 r d - OAM_DMA = $4014 ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
$ `" Q: ` f. l% ~! F - APU_STATUS = $4015 ;声音通道切换
+ s" ?; f1 B% l1 ] - JOY1_FRAME = $4016 ;手柄1 + 选通8 p& U- s9 J0 l. N a3 a6 j5 r2 c
- JOY2_FRAME = $4017 ;手柄2 + 选通
5 n1 q& _6 t3 W j' E - & c: ~3 N0 c% T/ q
- ;==================================================
# I' `+ ^) I( a' ~& l# M - ;MMC5端口常量
Z8 y8 h$ d% O& S/ Y - MMC5_PRG_MODE = $5100; 0: 32KB 1: 16KB * 2 2: 16KB + 8 * 2 3: 8*4$ m/ W% u3 R0 }2 r
- MMC5_CHR_MODE = $5101; 0: 8KB 1: 4KB * 2 2: 2KB * 4 3: 1KB * 8* U, @3 E" X1 [2 k
- MMC5_PRG_RAM_PROTECT_1 = $5102;) z& O1 D8 D0 v, Y: k; T
- MMC5_PRG_RAM_PROTECT_2 = $5103;+ O n7 A1 ~! N, C9 E* Q
- MMC5_EX_RAM_MODE = $5104; 0: Write Only 1: Write Only 2: RW 3:R
* t2 ^7 V8 h: J( ~3 ?. i0 \7 y - MMC5_NT_MAPPING = $5105;
" N. T- N. I4 \5 r/ |, o - MMC5_FILL_MODE_TILE = $5106
2 z( S E8 Y+ C1 X- S* Y - MMC5_FILL_MODE_COLOR = $5107
* w- x) R9 B, s$ y# c) ?2 f. ^# C - 8 `4 }8 U0 B) i3 A9 T% Y
- MMC5_PRG_BANK_6000 = $5113, M- f& B( n" U* I* _
- MMC5_PRG_BANK_8000 = $5114
( W6 o. d) v$ |- H- {0 ?1 K4 g - MMC5_PRG_BANK_A000 = $5115
% [2 ~! @8 A* Q - MMC5_PRG_BANK_C000 = $5116
8 a/ r, J% Z1 \% z - MMC5_PRG_BANK_E000 = $5117
2 U- m( ^5 J* x4 A* i0 g - ! i8 _! A% U$ R1 _
- MMC5_CHR_BANK_0000 = $51201 y6 r6 c# x+ j: t" h0 x- [9 S
- MMC5_CHR_BANK_0400 = $5121
. V4 }* ]+ T6 s! Y) U2 j - MMC5_CHR_BANK_0800 = $5122
3 A, s' I+ F3 g- z5 H: } - MMC5_CHR_BANK_0C00 = $51238 x! L, U! ?$ z: d0 v; L
- MMC5_CHR_BANK_1000 = $5124
7 j6 h3 z4 m( o/ M - MMC5_CHR_BANK_1400 = $5125
& O7 F' S; U# O- ]" @+ y: U5 U! K$ d - MMC5_CHR_BANK_1800 = $5126' M @! ^, h8 R5 _# o8 I- Q5 }
- MMC5_CHR_BANK_1C00 = $5127# _2 k- O8 k; d" R/ K
9 ?& F2 q& d2 J& r- MMC5_CHR_BANK_0000_1000 = $5128
, G7 d! y; s6 S. ?* x - MMC5_CHR_BANK_0400_1400 = $51295 c) x" v# u( _- }
- MMC5_CHR_BANK_0800_1800 = $512A
5 s* H- U- Y' Y% D: f - MMC5_CHR_BANK_0C00_1C00 = $512B
2 b! f. {' i' g - % G% {3 k: K. ?9 x0 u
- MMC5_CHR_BANK_UPPER = $5130
( a. S. d" D+ w! o* w& ]- P" F - MMC5_V_SPLIT_MODE = $5200: z3 `) G2 ~# L# i
- MMC5_V_SPLIT_SCROLL = $5201: K9 Y1 h5 [0 I& m) C+ X
- MMC5_V_SPLIT_BANK = $5202
8 r8 [3 t( a6 O9 q# A - 5 ]1 Q1 |$ v; u- m
- MMC5_IRQ_SCAN_CMP = $5203
: b3 K! j! @" _, C+ { - MMC5_IRQ_STATUS = $52048 u5 f, } T4 n3 \: y
- MMC5_MULTIPLIER_A = $5205
7 y' E0 x1 V( G& ]8 r" W) o" M$ l' O+ P; c - MMC5_MULTIPLIER_B = $5206$ c% S9 {' P$ k' q
- 9 u& |6 x) H* l# q3 x
- MMC5A_CL3_SL3_DATA = $52077 ^% c2 K( y! N! |, T& X
- MMC5A_CL3_SL3_STATUS = $5208
2 n) y7 w5 u6 g - MMC5A_IRQ_TIMER_LSB = $5209
4 j m4 L M+ x: U( P - MMC5A_IRQ_TIMER_MSB = $520A
1 {3 V! @4 Q. f5 \ - ' O, r4 d ~% M' A/ n
- ;==================================================
, h6 _" J4 K; s: z; u7 N" ] - ;程序块配置( ^* p) W* E6 f# v9 u/ H8 c
- BANK_DATA_MASK = $07( P* L7 R$ J$ C3 R' u
- ;--------------------------------------------------+ H1 [, W+ R# l4 e
- RESET_BANK = $077 F4 A' b; m2 x% x8 X) {6 n
- RESET_ADDR = $FC008 I5 l; `$ S, |5 A
9 f Y" L( O% X/ p8 S- ;==================================================
3 D j, Z2 J4 U7 J! B! S - ;图像块配置0 b6 M1 x* g9 H
- CHR_DATA_BANK = $08
6 D1 x# k# w7 N - 0 ?4 F% t" i2 B8 b( N/ F4 _( Y
- ;==================================================; j/ J7 i) ^- Z# X, `
- ;零页内存地址配置
; r9 a% f& g x - Use_Ram_Addr = $80
5 ?% D |6 \8 s, e* M9 C0 X - PPU_Ctrl_Buf = Use_Ram_Addr
& R6 w$ V8 n. Y - PPU_Msak_Buf = PPU_Ctrl_Buf + $01
, y: |/ A- m. k* Z5 x: o+ O Q4 y0 d8 V - PPU_Scroll_H = PPU_Msak_Buf + $01
: t2 f9 \$ a; h( z& Q) Q - PPU_Scroll_V = PPU_Scroll_H + $01
% y) Y: b! X; k4 n - FC_Data_L = PPU_Scroll_V + $01
2 ~" K% F* f9 T* Q - FC_Data_H = FC_Data_L + $01$ E6 D* E, Y4 _. e1 H9 K* H+ S: w
- FC_Data_Buf = FC_Data_H + $01" H' t, E/ u7 i, T/ `. q* O& _
- ;==================================================4 \5 e$ Y4 ^# p) b
, F/ i1 }1 I. F4 c- GAMEPAD_MERGE_FLAG = $047 N, A& u9 C J0 E' m
- " a# r+ a: G2 t5 K! b
- Gamepad_Keep = FC_Data_Buf + 1
: X7 i: P) I8 o - Gamepad_Once = Gamepad_Keep + 2
; f! I) N5 g! F: b+ ] - Gamepad_Temp = Gamepad_Once + 2" O5 d1 S5 \& b: [: J
-
" j4 Y8 n+ N1 t& Z, c7 m8 I - Gamepad_0_State = Gamepad_Temp + 2
' F8 l* o( v- _7 R) F - Gamepad_1_State = Gamepad_0_State + 15 t% j( V+ q# y# V% j
- Gamepad_0_Value = Gamepad_1_State + 1) b6 `8 |& s' q! u1 ^
- Gamepad_1_Value = Gamepad_0_Value + 17 f" x& X7 ~6 u# Q8 S
- Gamepad_Port_Value = Gamepad_1_Value + 1
/ p9 k% O+ q0 U9 U) J - Gamepad_Merge = Gamepad_Port_Value + 1
8 @" V2 l/ Y# M3 H- A0 i9 I# u
# N* u; U( r2 d, t- ;==================================================! I; y6 w/ q# Y# }5 o3 R! E" G x
- IRQ_Index = Gamepad_Merge + $01
& K4 G* H# X4 h - ;==================================================1 J: V! Z. I% `: q* `5 [
- * A A% }* {) l. I/ O5 G. D: c4 N
- ;CHR图形数据
4 i" f+ s1 G% N9 Z - ;==================================================" G6 D8 o, K- T6 t7 e
- .BANK CHR_DATA_BANK
% G2 l" x# Q7 d - .INCBIN "chr_bank/chr_data.chr"7 b3 ?) R/ B8 R& a7 I
-
- _6 a. x2 Q6 `" W9 Q( o' W3 \ - .BANK RESET_BANK & BANK_DATA_MASK: @3 r# q4 ]; X q" s
- .ORG RESET_ADDR
- k5 Q% z* l) i: r, `( r; u -
5 f7 M) g9 `9 j% D - ;--------------------------------------------------
$ B; R2 s- }5 J( t - Attributes_Data
" g; X. Y2 ~3 s2 S0 A# W - ;命名表属性
0 B! W& I/ _5 W0 \% z4 C - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
! k, e. C* v7 b u# A - .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA* t6 H, o A" x3 m! M/ T
- .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA7 r: h6 O" |0 s( W& V- t {
- .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55
6 b* i. p) a" F- J5 N! c - ;--------------------------------------------------- R9 i$ d t3 A5 A8 H6 Q" m: F
- ;调色板数据/ T1 k( y: L+ L4 Z2 [
- Palette_Data- y2 O( p- g5 p$ _
- .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
y" Z. N1 t) I' g$ A - .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F" `4 o' k0 B5 {- Z0 K
- ; E# g6 y( q. r2 R/ ]
- ;==================================================
! ^( b2 H# Q6 s1 e$ n# y - ;命名表初始化
8 |# C: @* R* T) r6 b# E - Init_Name_Table
4 U: B8 b! |/ o: o2 e! O. O, j - LDA #$20- j/ J. [- v! [5 L
- STA PPU_ADDRESS6 v+ r. w& [8 @ z/ x, F; [
- LDA #$00
5 i- k7 E" O1 {# A9 v1 w - STA PPU_ADDRESS
+ l% ]7 U/ x( ?7 a - LDA #$00
# c; a( V0 N9 `7 Q# j - LDY #$00
6 \( S( s- T' Y8 J2 a! q4 b; M - LDX #$10
, E0 P; E. ~7 r. U4 G; K - Init_Name_Table_Write
6 a; i( f9 ?6 s% r - STA PPU_DATA
. b2 N7 ?5 d/ L4 R: \ - INY8 H+ h$ u: J8 }/ W9 z# w0 K
- BNE Init_Name_Table_Write
0 b6 j' `" b/ K, z. G2 ^ - DEX
7 F3 p7 a! Y9 ]! b# h - BNE Init_Name_Table_Write
9 ~6 Y1 D! A' x g* N - RTS% I7 [$ l" {5 R& b' _
- 3 M* U |, b! m2 k g, X9 Z/ Z
- ;==================================================$ Z/ ^5 y7 ?; ~0 J$ h
- ;调色板初始化3 Z/ r Q! q- k5 |8 p* p8 A
- Init_Palette4 o. e! {4 J+ [
- BIT PPU_STATUS
1 r# r" _- {; P9 ^0 E - LDA #$3F
, n3 W0 Z4 e7 g5 o: Z - STA PPU_ADDRESS
6 F% V9 z, u" u; R T - LDA #$00
. y) W, H6 `# M A& B: _* c - STA PPU_ADDRESS
5 _4 R+ m& K& g" `0 [ - LDX #$00
+ f' b; y1 e4 w; V' V! h - Init_Palette_Write
" A# R. y1 n' o0 k7 z - LDA Palette_Data,X$ d9 U/ d+ T c
- STA PPU_DATA0 v5 Q2 I' K4 b
- INX
0 q* c4 G H6 D& @ - CPX #$20- G" n% g: B$ Q
- BCC Init_Palette_Write
$ d6 B) n6 A( C9 Q# M. M8 S - RTS/ H1 v$ S1 W2 N( M3 c5 l9 o. Z
-
( q2 Y! X# v. ^$ o& f* B - ;==================================================
% O% ]/ O7 U+ A5 r+ Z% L! b1 M - ;设置命名表属性* I! i8 s# y- T( Q4 D- }
- Init_NameTable_Attributes& h: |" b: C. P! D" V
- BIT PPU_STATUS" @8 H( W& z. U3 V" V1 a* d5 d
- LDA #$23& }+ Z" d; u3 P6 n7 Q2 w. L+ O
- STA PPU_ADDRESS; w. o2 o+ A3 V3 O, B3 x
- LDA #$C0
0 p& ?% V: m; u6 F+ J @ - STA PPU_ADDRESS
6 ]5 t' g4 S( G/ `6 G% B/ X+ a - LDX #$00+ T4 O) d- V) R; q4 X7 ?& s2 Z: F
- Init_NameTable_Attributes_Write4 I) u9 e F- c
- LDA Attributes_Data,X G/ w' T+ k- i; l& g' [
- STA PPU_DATA9 j. P4 ^ p( R) U7 q7 @
- INX
- X$ S0 h' b+ L% C - CPX #$40
; w; {& [3 b% Q. X, `# d - BCC Init_NameTable_Attributes_Write( z% Q7 @$ v" e
- RTS
( t* t* C- p9 S! P; p
) Y L- ?* T3 \- ;==================================================. Z2 D% g, Y* A8 x( _
- ;初始化命名表文本
0 y# m; b) M# l k, T - Init_Name_Table_Text
) ~5 \8 E6 v. X) O% Z - BIT PPU_STATUS2 z, o/ s+ L$ W5 g
- LDA #$20) R4 P- P( C5 C2 K. x, R4 i
- STA PPU_ADDRESS
: H/ c( s' P, e - LDA #$00+ L* U' P# f0 j! u; A
- STA PPU_ADDRESS/ w$ R' P; U# U6 y" r- v
- LDA #$00! a5 \6 r. t6 ^( [, l) \. A- i
- STA FC_Data_Buf# S& \) N: F; J; P9 I; V
- LDY #30" E/ q1 A: e# F1 B5 L+ I6 j9 J
- Init_Name_Table_Text_Write6 T, @ |3 b/ e4 _% R
- LDX #32
3 y# k0 G7 K3 j- _! x* G$ R$ x1 w - Init_Name_Table_Text_Write_Char! N0 k! A$ k8 e6 |
- LDA #'0'7 g' f* i( t2 G6 w1 a8 d: _
- CLC" X" a- U5 t/ D. K( q2 s% S
- ADC FC_Data_Buf$ a! w \% Z7 R
- STA PPU_DATA# G6 B* x/ g1 P7 N# g ^+ U
- DEX
3 b' x G4 i% j' T8 H - LDA #$14
/ r% e0 [' L0 S9 z% P - STA PPU_DATA; R- T5 x8 n3 P b) N. W; {
- DEX
& j9 W& W8 U. |: Q' E) N* o - BNE Init_Name_Table_Text_Write_Char
. A$ Z' a( D: @) G - INC FC_Data_Buf4 M# Y+ u, T; e5 u5 `$ N7 V5 j
- DEY; k8 z/ [6 `0 X6 J0 {! i
- BNE Init_Name_Table_Text_Write
; x: l0 S% ]& I0 M" R6 j; \' | - RTS+ u ]7 t% W/ ]8 q. ~
1 l5 v, M( c+ m- Q$ e, s! c- ;==============================' F" G$ J5 x. E2 }; @
- Init_OAM_Ram;初始化精灵内存# [9 z9 n! k7 ?% {# j$ }1 a3 A
- LDX #$00
& f5 y" H3 e$ O/ X: h C' S9 p* F - LDA #$005 i* I7 J# k" M1 b |7 i, h
- STA PPU_OAM_ADDR
Q, s3 \$ @+ |, H( e; Q0 a2 x - LDA #$F8
7 T: ^, s( m( D( k$ q3 p - Init_OAM_Ram_Write- s) j( j) ^/ @, W. R7 i g
- STA PPU_OAM_DATA
& f. j( n' d; ] - INX% b+ \, C) l9 }) g2 i
- BNE Init_OAM_Ram_Write/ {, Q, C$ \1 W$ e, Z9 f3 R m+ H0 w
- RTS y& D# B* v2 _
- $ K0 T5 [1 Z1 H/ \) e+ V
- GamepadProcess;手柄处理* d3 e2 G8 A4 a/ y1 y
- JSR GamepadDatacan% `4 t. T* R8 g' }& v2 F
- LDA <Gamepad_0_Value- Q- N' A3 C" H2 U
- STA <Gamepad_0_State' q j+ r! n6 B
- LDA <Gamepad_1_Value
' b3 J2 k3 g% t( Q$ c - STA <Gamepad_1_State
7 _' ~0 m5 L1 s/ q' a - JSR GamepadDatacan* e" S2 o' f W
- LDX #$01
. A2 n A' f, O" G9 a# _ - GamepadMergeCheck;合并手柄输入检查+ M) F3 _9 q$ B+ ?) t
- LDA <Gamepad_0_Value,X- j& p! t6 G/ z8 E: G
- CMP <Gamepad_0_State,X
; i5 G$ [0 O, ~8 \" p4 p - BEQ GamepadMergeInput
: e9 a" t5 I) h6 Z8 U. j5 E - LDA <Gamepad_Temp,X
8 @) O; S5 z$ P( C- {4 @ - STA <Gamepad_0_Value,X
/ k' l4 y; L& n8 Z0 \/ g& s - GamepadMergeInput;合并手柄输入/ T2 J! x7 ` B
- DEX6 u0 N2 f: L, V) I
- BPL GamepadMergeCheck( x2 K/ U5 ?! X2 z
- LDA <Gamepad_Merge, T# Y1 w: Q' A1 Y7 V; z
- AND #GAMEPAD_MERGE_FLAG, f T% a- H4 V% Z; V
- BNE GamepadStateProcess& X8 J8 |! v# D2 c
- LDA <Gamepad_0_Value% P; f. i T" b# x, x
- ORA <Gamepad_1_Value" B% Y! b- S4 R; K
- STA <Gamepad_0_Value
; s6 ]: ]. S% ?& N7 `* i' f$ Q9 { - GamepadStateProcess;手柄状态处理# ]1 I4 K" t, A( Y
- LDX #$01; h3 ~8 Z' m/ h' j9 A$ Q* @9 I
- GamepadStateSave;手柄状态保存0 ~0 ^' B$ k+ f: _/ J/ J/ X9 S% Z* O
- LDA <Gamepad_0_Value,X
8 U& r7 e9 p# s# } - TAY
, u. _: V: c9 c# E' |7 Z0 X - EOR <Gamepad_Temp,X- m3 A2 U% H$ B5 C |5 r, m* @
- AND <Gamepad_0_Value,X
5 Z9 j0 P3 X, e1 ?/ S - STA <Gamepad_Once,X6 \2 }8 S: A/ [4 f; @) S
- STY <Gamepad_Keep,X
1 p9 I0 P" u, g. r% n# H v - STY <Gamepad_Temp,X' t& O4 z8 K; C
- DEX# R/ s( U, n! O3 X z
- BPL GamepadStateSave; G: i' k4 q$ m5 w
- RTS
7 N y! z% c3 l- }! q ?: |
+ k1 b1 v# \0 O& @ ^% g; b* M- GamepadDatacan;手柄数据扫描$ N8 j6 V1 e8 C
- LDX #$01
0 w/ I8 X8 H1 C% `! } - STX $4016
1 l. t( e6 ?7 @$ Q0 y+ ^- m9 g - DEX) \2 l, G6 q& V9 m% F, S' p: n
- STX $4016+ I/ O& k" c: V
- LDY #$08% S2 E' a) v$ U' f
- GamepadPortScan;手柄端口扫描
6 T6 E- X1 h% h7 f! r - LDA $4016" b+ I7 l% C/ c& C8 L2 t1 H) C
- STA <Gamepad_Port_Value4 o: z! n$ Z0 b) V
- LSR A
/ R4 @' j9 w8 E8 m: l - ORA <Gamepad_Port_Value( d# Z ]# B# |; H
- LSR A
5 a7 H% d) F" Z' ?- D - ROL <Gamepad_0_Value( Q2 H3 d' I! ^. B& O4 j
- LDA $4017
/ y3 f J0 R' ^9 ?- K6 c4 E - STA <Gamepad_Port_Value, p. o. S" p. P
- LSR A
8 r. e9 v# K3 C! f; i$ Q - ORA <Gamepad_Port_Value
0 ]& c+ ?2 ]; \/ ?9 _ - LSR A& |1 F* l' [( g* g( f0 o
- ROL <Gamepad_1_Value
) V/ R6 y) ~0 p3 v* _ - DEY* z. x3 ]6 X& E) F# Y! p; G% }
- BNE GamepadPortScan
# k) S' N1 Z v9 I8 { - RTS! \0 _5 u. O g# ]5 M' v: U
- ; M- F- l7 j$ w4 f/ V* }% d
- ;==================================================
6 o5 m8 l% ^4 e - ;PPU处理
0 V4 m- D4 ~( @ - PPU_Process
' F$ a0 ?$ x* P( E/ b - LDA #$00: k, b5 l$ p) l% f( y6 v& h
- STA PPU_MASK
8 B& | T9 v% q$ s2 w -
8 |! a. U) o% A, i+ B9 T. V5 Q, x - BIT PPU_STATUS
& h( J5 j$ [; M( L$ G) m* X7 A/ y - LDA #$200 M8 [$ ^, ?" X4 D
- STA PPU_ADDRESS9 G# Z f! l- M9 r
- LDA #$007 x) k( U. A- v- P( K
- STA PPU_ADDRESS. ]4 Q5 r# b+ j& k& n- ]. V1 @
- 3 y2 C5 b/ e/ V4 A0 h, A, N
- STA PPU_SCROLL& h( A+ J0 o. |6 ^, O2 A6 C2 x
- STA PPU_SCROLL
2 u# k9 @( |2 U0 x2 \# N - + U% N' _, F8 ]6 L- ?
- LDA PPU_Msak_Buf
1 h2 \- k0 \; d$ }$ d - STA PPU_MASK7 A* H! I7 C" ~! w0 c
- % r* T, D: Y. C; c
- RTS
+ _5 V S3 t0 o8 ~9 {( C7 v. N - & g, L$ l c+ u7 w0 j* t# q9 O3 l
- ;==============================
$ H$ t/ O5 {9 M% r: D/ S$ f - Time_For_Vblank;延时等待
4 H' g+ a6 ]: [1 S - LDA PPU_STATUS' j/ R6 c' L# P8 Z
- BPL Time_For_Vblank
4 A0 @7 k: Q J4 | u [ - RTS$ V2 Y) C& e# c+ t! o
- $ S/ m5 l7 x6 g+ e( I0 v9 o* U
- ;==================================================
3 G2 ^; } D! {7 o8 g* T6 j' p - ;初始化MMC57 j- f/ o. ~. S
- Init_MMC5
) K, @/ C9 ]- X( w0 Z
; A2 l8 z2 m E7 o8 ^0 I1 i* o- ;设置一下6000-7FFF的RAM
5 b% b( |# H6 x J4 B - LDA #$00
2 a9 Z& o; p3 U1 Z# ` - STA MMC5_PRG_BANK_60003 _$ I# b8 r, F ?/ x$ b
- , i/ t. {! }5 ]3 _1 X% T' \+ g
- ;开启 PRG RAM 写入
- [" e3 _! l, h& {0 F - LDA #$02. c' a9 t& d! s1 X: O4 L, g3 Y* ] R
- STA MMC5_PRG_RAM_PROTECT_1/ V" f8 w/ n* [0 J% c
- LDA #$01
7 ]) q9 n( g0 m6 R- t$ g% I& z% M - STA MMC5_PRG_RAM_PROTECT_2$ E9 C' f1 U( P: ?
-
* R/ @4 p0 r9 B- E, V: I9 ]: S0 ] - ;启用 1KB 扩展RAM ($5C00-$5FFF)
& i$ ` X, D- c3 @ - LDA #$02% A0 y: ^7 T7 n2 M1 Z
- STA MMC5_EX_RAM_MODE
- Y" o4 z; M: _8 i -
0 A4 a9 g ~' ^) q9 R: F } - ;设置 CHR
9 |) j3 f5 p2 U( c7 n7 O - LDA #$00; Z5 N0 Q) z) Y0 c7 u5 H/ F5 i* s
- STA MMC5_CHR_BANK_0000 [- B! O1 S! w! M! Y
- LDA #$01
2 j% L4 y; f5 b) N v/ a - STA MMC5_CHR_BANK_0400
( P2 o" A; I6 j# q7 {! S& F" V- Q - LDA #$02
: x& A, {- [ J! ~- C! B2 g, N- u - STA MMC5_CHR_BANK_0800
: p( u9 ?0 A4 U5 b - LDA #$03/ F6 G9 F( U& B
- STA MMC5_CHR_BANK_0C007 S2 k) z1 @: v7 }
- LDA #$04
" @- _. l9 f) {/ X) G0 N - STA MMC5_CHR_BANK_1000
9 }" T4 o+ D ?/ O8 V0 } - LDA #$05
( x P0 I$ c1 N6 K" q& \ - STA MMC5_CHR_BANK_1400
% N3 ^4 `# `/ Q - LDA #$06
% n; \& b0 S& _# p - STA MMC5_CHR_BANK_1800! X" N: ^1 s3 x+ M
- LDA #$07
1 f' ?. `+ F J2 Q/ u - STA MMC5_CHR_BANK_1C00
/ I/ g% g# l$ N5 Z/ `( q( | -
% ?+ Q+ v; F2 O) d& r - ;设置屏幕镜像
) M. A9 W6 D5 z - LDA #$50
& X- _/ w$ i% t& L& m: a7 q - STA MMC5_NT_MAPPING& [2 W0 |- r4 U1 d8 I9 z
-
4 D% B$ ~/ q! D - ;禁用IRQ
% l) }: J6 s9 U+ G7 p - LDA #$00
; [% K! A' J2 E- I1 T- z0 h - STA MMC5_IRQ_SCAN_CMP8 i$ O b& ?6 {" v S9 I
- STA MMC5_IRQ_STATUS: b( p6 G$ C- \8 D, ], |! v. f
- 4 E0 s1 {3 r% G: u
- RTS9 b& s$ k: Y0 }. l f* A; O( X! N
- # b8 j* }% p) w( W: @- Y
- ;==================================================
9 X8 p% R# s0 X8 y2 _: A/ B ] - ;重置中断处理$ L w5 W, q) G* B# d& ~ K3 e
- ResetProgram3 S, z) u' p5 J. x) t: \
- SEI6 h# Z# l4 R' X1 ~
- CLD
7 c6 q2 u/ Z- @! P1 ]0 T0 I0 w1 @ - LDA #$001 `5 u# k# H! h
- STA PPU_CTRL
* Y1 K2 O+ L3 z7 Y - STA PPU_MASK! D$ s6 T9 k' Y' k- V3 C. a' j
- STA PPU_STATUS
5 y8 X6 c, f4 ` - STA JOY2_FRAME
5 z" B/ u- T$ X P* E( j - STA APU_STATUS
% o( z: T- t7 f. v4 Z - e+ m% q& B' Z9 p, ]9 k
- LDA #$C0- W% u9 C% h2 t9 k
- STA JOY2_FRAME& S$ |- H; t* F, c, A# A- C* o
-
I: D) U2 R" E0 _ M4 Z - ;等待vblank& |" i4 S9 J0 L: l4 S2 O
- LDX #$02" I* p- I6 a6 |0 B$ R: G7 b8 s% Z
- Vblank_Wait_1
8 C& D% J$ s7 ^0 V ]' P* K. s - BIT PPU_STATUS! E: g( G+ @+ x# I$ M) ^
- BPL Vblank_Wait_1
0 t. X E/ Q* a8 B* `, ~/ t - Vblank_Wait_20 u" e; d7 y7 v! q. K
- BIT PPU_STATUS$ J6 x- A; B- y& z) N7 \. ^( t
- BMI Vblank_Wait_2
9 t) y7 t* i$ D - DEX
3 x0 x: ^; [- t. F8 x - BNE Vblank_Wait_1$ C6 D- K# s& x4 ~1 L4 ^' k
-
( m1 I" U% J. C& H8 q q* W1 c - LDX #$FF
6 J3 Z( D4 |2 e' p9 i; x& ? - TXS+ a* \7 T# K, Z2 @7 y* s. E
-
8 M# |+ T4 U: n7 c' T; |4 f - ;初始化MMC5
7 f( `9 V! w. r4 w5 R4 Z: I - JSR Init_MMC5+ h: E: Q S4 j
- 1 g/ z/ }2 v# N* U- G& Y! u& F% u
- ;==============================6 t! w& Q% \; @# T( ~8 F
- ;RAM初始化/ Z7 P) _) i3 L
- Nes_Ram_Init
. O( t5 |) Q- B6 S. ~ - LDY #$00
/ \; p( w5 S& k" Y* n% B. [ - LDX #$08
0 l: g1 P7 E4 T9 o, g - LDA #$00 S8 N e f1 L3 J' {# ^/ {
- STA <$00: v7 S/ T$ o' C5 S5 Z# K
- STA <$01
: B& f) B* [% l2 Y - Nes_Ram_Init_Write
; u9 ^' C& }, o8 H$ A' z - STA [$00],Y
5 [& W+ e/ ^, R/ r, E5 t - INY
. F% P2 {3 w" |& _+ m/ V - BNE Nes_Ram_Init_Write% b0 g' P5 _( S# `8 y( I. b+ C) Q
- INC <$01& @5 }* n: y# ]9 A! w( p% V
- DEX' E7 C6 h; h, ~
- BNE Nes_Ram_Init_Write
- t; p* Z7 z. p" U; G: b3 q2 S - % U: |8 j" h1 L" Q9 ^2 I& @
- ;初始化命名表
" ~* Y) R3 w4 V2 q% l9 C - JSR Init_Name_Table
" K) ~5 T8 m/ F K& `! \6 H - 3 {, J5 t7 m; \$ F9 G/ ^1 h
- ;初始化调色板- |; r3 C- N: {+ s3 k
- JSR Init_Palette
( L* l5 b6 ^9 z7 q* Y: g4 } -
, Z: ~$ Y4 L6 Q) y& Q - ;初始化命名表属性2 N" \) R( j0 W. P- u- W6 L
- JSR Init_NameTable_Attributes, d& Q$ t; z( i. @9 k1 j7 ?( R7 i
- : {6 J# f9 D# D! G
- ;初始化精灵内存; H! F/ j& `+ s
- JSR Init_OAM_Ram4 s( N# i: g% w/ p
- ; n7 k+ r1 `* o# o8 q
- ;在屏幕上写点东西
' G, ~; U8 c& j& a8 `! h - JSR Init_Name_Table_Text
0 B$ V8 z: h. x" v - $ m9 E1 R. E9 C# q
- JSR Time_For_Vblank
! Z% B; H. M! `2 a - ;开启PPU控制7 s" v) e! R8 D( L
- LDA #$88, Y* M" S" s- x& T3 b; d; w
- STA PPU_Ctrl_Buf
4 Z/ K l$ m; b1 n4 V7 n) ` - STA PPU_CTRL
# p2 X; H& U# O7 b - / ^/ m8 ], |$ X4 B A; v
- ;开启PPU显示
: I9 u1 t' w+ X6 \ - LDA #$1E
" N, j- H. H* P L0 \( M - STA PPU_Msak_Buf# O3 T( R# I1 b' b8 z
-
5 M1 a6 B! J$ S# U4 a$ Y! k1 Z - CLI8 {0 S: o9 Q \! g; Z
- JMP Loop, a, v9 A, _. G/ ?7 V5 s
-
' Y; i4 d& }' q+ s7 b' _3 [ - ;==============================. g: v( X+ e$ ?9 P
- ;死循环, 等待NMI中断5 i6 {/ O$ w/ P0 k" p9 \# g
- Loop3 l$ T4 v! Z" G7 M' [. S
- JMP Loop8 a6 O7 K" s1 e4 S5 z; Z* b3 }, n9 Y& n
3 T- J& q: j, W" C1 A8 }- ;==================================================
0 i. `5 a$ ] {4 ~+ S1 e/ k/ s - ;NMI中断处理" y) h, R7 ]9 a3 D! _2 q1 ~
- NmiProgram* M7 Q; E4 \! I9 p4 F" h( {" [: O: N
- PHA
2 b. h! K- V$ n _1 i* P - TXA
. S& y0 j. p$ P# Z - PHA$ ]6 {# J6 k% {; _9 @" [/ D7 n
- TYA
4 L$ _) d/ Y W$ a2 f - PHA, U' n6 t( N& k7 Q4 D: [6 a+ a
-
+ T/ r# V$ `9 E6 `. s$ t - BIT PPU_STATUS3 U+ K5 y( }" r
-
6 E' U: a* F0 |5 ^- E- t* C - ;启动IRQ中断, 第16条扫描线触发7 x9 W2 I- ^2 ?5 t+ g" f
- LDA #16
$ z) g6 R1 ?+ F7 w B" ` - STA MMC5_IRQ_SCAN_CMP" a! c: A6 x- c
- LDA #$80
9 {$ B) V: v! b! b* ^+ r$ ? - STA MMC5_IRQ_STATUS* |; h! M* e! W7 w9 }
- CLI
1 b7 U& I% i' ]9 l -
) d% _! T& L+ ~1 ?/ G$ E - ;关闭PPU控制
+ d5 F" {1 y% t: I# } M/ k/ ] - LDA #$003 h. {/ C) i. d: s
- STA PPU_CTRL, A8 y3 s3 W# X3 P3 ?! i8 R1 N! L
-
6 x7 K+ I* d9 s4 l' y s - ;处理PPU7 u0 w$ w5 S; K/ I2 q
- JSR PPU_Process+ }3 ^8 q7 v2 P! E3 J0 w0 D
- 7 @& y4 t! q8 e, ~6 u
- ;开启PPU控制6 |1 N+ C& s. L5 J9 C( z
- LDA PPU_Ctrl_Buf* R% K' O0 m* \- I
- STA PPU_CTRL
& F; q% z; O& h" g. ^, w& N1 }! t - - R2 [% K8 ~7 m& [3 Z7 l
- ;手柄处理6 T1 N6 n6 }- t* J9 X
- JSR GamepadProcess* N1 w" {- @ m; E; u/ b
- 2 r5 b- H- O/ ?2 O7 h
- LDA #$002 S. @% T- {* x/ h
- STA IRQ_Index
- ?+ g, [( }/ R+ w% j -
6 | [, G5 `3 X4 E8 O6 u$ z& i* i - PLA
$ e: n" e5 ^ J- D* f7 E - TAY
- q; \0 v8 ]6 F; ? - PLA; Y0 ]7 h6 C l; W
- TAX0 }3 x# d+ w. v* W- B
- PLA
, a l. E$ p6 Q' K/ E, o- A, ^) ?5 Z, L - RTI. |/ v4 K' ]4 l
) c9 B$ f7 W: i- \3 c- ;==================================================" O4 @+ q. \) s5 R& i
- ;IRQ中断处理
3 U) j9 o/ D) Y1 F. ~; a - IrqProgram: m! ~9 Z) N/ R9 [- X8 }
- PHA
- u; m1 K) { s: T% F5 ~! C: k - TXA. @1 A W1 x2 K3 R/ |2 u
- PHA+ H: z, s! {+ ]* R" u2 A
- TYA
5 Q+ d, ^# R4 F, i1 \0 g' ^ - PHA1 ?8 z7 H6 W) W/ X* @( Y2 u2 J
- B- ^* U# t. W& u' `& K; R4 g% L
- ;确认IRQ
. z6 p/ G h9 c - LDA MMC5_IRQ_STATUS
& N( o5 ?; ?, p/ m4 G$ D - $ V0 D7 p; w2 R R$ \: D7 V
- ;允许下个IRQ触发
) n6 n# h' t8 a4 N3 h9 G$ J - LDA #$80
9 E! [# G# u' l; e - STA MMC5_IRQ_STATUS
- F% @* n5 _( w6 m1 _ - " }# H1 G: ]) i9 q$ f# p$ O5 u
- ;IRQ处理, 每隔16条扫描线触发
+ N! m7 E2 E7 O' v - LDA <IRQ_Index8 }2 G2 g. X. h6 w
- CLC- m" Q- p* ]# J- Q4 {
- ADC #$02
) O; r1 Y8 g" J7 b. C' F; u - ASL A: W/ J/ S. d! e. T$ w
- ASL A
2 ?% x* X$ ]$ J# g5 A8 F - ASL A$ h; L- }; x4 l& Q+ f' }
- ASL A8 j, |7 Z4 p3 z! l% N: o5 q$ e
- STA MMC5_IRQ_SCAN_CMP
2 A9 y& l0 J! q6 D) W -
$ l, Y& f6 ? S- i: J - LDA <IRQ_Index9 v( }% u& P# Z/ v
- BNE * + 4 l( Y) }/ d' O2 I$ {! w# z
- INC <PPU_Scroll_H
0 L8 d. \; |% h7 { -
5 H& k$ P t: m4 {) y' `) x - ;设置屏幕滚动
5 T9 ~8 Z( u( u0 b0 X( \) v& i - LDA <IRQ_Index
5 N! Y' C8 U) @- \, I' T# y3 c+ J7 J$ \ - AND #$01
! o# `4 n# o% l - BEQ Irq_Scroll_Right( y! V$ C/ K1 j) l
- % n- \: ~+ j. P# w8 F
- Irq_Scroll_Left
* `: _$ j" q) [+ }" X; E! O* Q: i - BIT PPU_STATUS
& t; X# b& a1 d+ v- P - LDA <PPU_Scroll_H0 w5 H, K/ F" u, t4 C
- STA PPU_SCROLL
4 N8 i" u$ e- i! d6 G8 ^4 e - STA PPU_SCROLL# e# O6 V3 O1 R" W
- JMP Irq_Scroll_Over" f# S8 A" \2 G C+ Z
-
) n5 r; K9 ?0 t( o3 t c# m# K - Irq_Scroll_Right* d! ]7 s8 \" [. \, h
- SEC, N0 Z6 _: v) E: M$ }. i
- SBC <PPU_Scroll_H) A9 f# q. Q6 ]" A8 {& t( T
- STA PPU_SCROLL& ? g% U3 B% B
- STA PPU_SCROLL- O# t% H1 q3 @! U
- Irq_Scroll_Over
5 M1 i" e: Y! x! m1 }3 d( g n3 O -
8 }( U+ f; ^9 F - INC <IRQ_Index k0 s M L: L- ~3 V* Z1 d L
-
! `) U. f7 u0 |4 U - LDA <IRQ_Index
% A3 b8 D* E( u - CMP #14! N L5 B b6 f8 g4 f0 K# |
- BCC * + 5: p( _. A4 r1 v2 X
- ;关闭IRQ, j1 I7 n! j7 ^( [. z! f
- LDA #$00
& I+ i$ z0 m) B7 N- X% q - STA MMC5_IRQ_STATUS
6 @" @( g* E2 P' B -
+ t3 O/ w" g0 P( e* a/ {) p4 D - IrqProgramEnd* h. e, g$ H8 |, }2 w$ s% m3 _5 C9 S
- PLA1 V& L' ^1 k1 f6 \7 n) q+ z) e
- TAY
6 U+ V, p! L' ^( y# i& K - PLA" b; x, o: L' X- l! j2 V3 O
- TAX. V% i) |1 u* p$ j3 V& J" f# @8 j( A
- PLA: p& y' ^9 l/ J, V) S0 T6 d
- RTI
, e2 X2 X/ s8 S) M" \: Y - / ~5 q* K- @( l# n. ^& Z' p
- ;==================================================" T3 t, |7 T$ P9 L! O; x
- ;中断表+ u9 u$ ~8 b' [
- .ORG $FFFA
' N5 F) R- C/ U$ F) E6 b2 ~ - .WORD NmiProgram# `: [' N& C9 X
- .WORD ResetProgram) t+ \* I7 o3 M9 E; f5 E& p" W+ E
- .WORD IrqProgram
复制代码
1 r. ?; j: R" ?, n2 d( a, S1 L; W |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|