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