设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 265|回复: 0

[原创] [FC][精灵碰撞学习源码]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-16 20:17:53 | 显示全部楼层 |阅读模式
  1. ;[FC][MMC3 精灵碰撞]3 s3 B9 V1 G2 B% f
  2. ;FlameCyclone 20230710
    # L/ I  a& g' I: `

  3. 8 K! u: \9 J, e( e* q7 e/ R: t) P
  4. ;文件头1 d# W4 d4 w* R0 i8 F
  5. ;======================================================================5 _( w+ [* F! ^
  6. .INESPRG 4                                              ;16KB PRG 数量
    - S0 I, @6 {$ E0 B6 x, B+ |
  7. .INESCHR 1                                               ;8KB CHR 数量
    . C" u( t1 D6 {8 I# f5 N% b
  8. .INESMAP 4                                                   ;mapper 4
    # [8 X: T, ^7 }( {
  9. .INESMIR 1                                     ;命名表镜像 0水平 1垂直5 p  U( ^! H5 a
  10. 6 J# y" j- K4 A2 J2 ?6 [' k
  11. ;必要条件' n; T" u$ _3 z
  12. ;1.持有CHR ROM
    - A( ]  b4 P) W5 |; E) l: @( f( ^0 b
  13. ;2.背景Tile和精灵Tile必须使用不同的图案表, 如背景图案$0000, 精灵图案$1000
    " w; d2 \% R' h1 K
  14. ;3.精灵内存(OAM)不为空9 a* z! S' O0 N" w

  15. ; x) f6 @5 h! d  q3 U" C
  16. ;==================================================
    5 }4 _2 c  ]) ^
  17. ;NES端口常量1 Q+ j% Z7 W( J' @3 E
  18. PPU_CTRL                =   $2000   ;PPU控制寄存器
    1 P+ m2 a' E( Q9 p! r3 u
  19. PPU_MASK                =   $2001   ;PPU掩码寄存器* R; Q  R. V2 {0 N
  20. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位7 Q. S' k6 |) @$ C. L
  21. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    ; O7 K" W6 C$ e: J9 u
  22. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加15 P$ i1 i$ b+ m( s
  23. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 5 C0 z& V# E( |+ O
  24. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加; J# B$ l2 h- g6 Y9 ?
  25. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 5 `% {7 W  g4 ~' i, K
  26. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    ! y7 Z, Q+ t; W+ |) X, C. r
  27. APU_STATUS              =   $4015   ;声音通道切换- B- ]! M% S/ V0 Z6 d( L! Z$ L' \9 H
  28. JOY1_FRAME              =   $4016   ;手柄1 + 选通! a& ^- O9 m/ ?- W( q
  29. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ) F% Z) W, X0 G7 z6 i' l& a
  30. / p1 m  ~4 Q, ~- ~+ v4 E( X
  31. ;==================================================; _9 B" z  @. G
  32. ;MMC3端口常量7 [* Q' `3 [( V( g  N
  33. MMC3_BANK_CTRL          =   $8000" g9 u3 g( V( v! x+ y# M* J
  34. MMC3_BANK_DATA          =   $8001
    - b! v, G! @- W+ R
  35. MMC3_MIRRORING          =   $A000
    : I, D4 ~* ?" N' u5 U% a* S
  36. MMC3_PRG_RAM_PROTECT    =   $A001
    7 ]5 J; D( F( d% v7 V; y9 W
  37. MMC3_IRQ_LATCH          =   $C000% I# ^0 x5 _$ m& F7 g! z9 v
  38. MMC3_IRQ_RELOAD         =   $C001
    2 c8 o: {$ h% g
  39. MMC3_IRQ_DISABLE        =   $E000, G6 a# ]" G7 y2 H. q9 g
  40. MMC3_IRQ_ENABLE         =   $E0018 i! f' `$ r. N% \
  41. . b' J, C( @. K9 X
  42. ;==================================================
    + a- R( p$ v8 L) I9 a
  43. ;程序块配置
    2 s- _7 C* O2 `$ W
  44. BANK_DATA_MASK          = $07
    $ g+ U% z# U9 c# d. @
  45. ;--------------------------------------------------: _; h0 _3 A/ i/ ?$ B
  46. RESET_BANK              = $078 I5 ?+ l$ r1 M$ k* h  H
  47. RESET_ADDR              = $FC00
    * ~8 ^" K7 F7 I) U

  48. ! }* c0 ~. v$ h0 D
  49. ;==================================================
      R$ i; R8 }7 }6 ?4 g, E
  50. ;图像块配置
    ; x6 i7 @/ e( P) L% s/ B
  51. CHR_DATA_BANK           = $08. s& Z) E2 ]) Z7 T1 g

  52. 0 J4 f( G9 A4 n
  53. ;==================================================
    ( q9 L  f7 a  L* J
  54. ;零页内存地址配置
    - p6 |9 B7 Q% \8 @) h; C
  55. Use_Ram_Addr            = $802 {4 v; s3 ?- n1 K8 N1 W* j" s0 H- \
  56. PPU_Ctrl_Buf            = Use_Ram_Addr& N9 Z2 B) Y  C# {
  57. PPU_Msak_Buf            = PPU_Ctrl_Buf + $01' e, c! a$ m- t1 ?) z) r9 q) q, r, e
  58. PPU_Scroll_H            = PPU_Msak_Buf + $01  L: k+ _" O2 A: I% B. K0 H0 ^+ v
  59. PPU_Scroll_V            = PPU_Scroll_H + $01
    8 M  Z3 a# s3 ~! e
  60. FC_Data_L               = PPU_Scroll_V + $01
      t( I& ]: j2 n- N
  61. FC_Data_H               = FC_Data_L + $018 P) X/ h7 p5 @. o! U
  62. FC_Data_Buf             = FC_Data_H + $01' A  W# ^+ I2 |/ n  A& ?1 E& X
  63. ;==================================================
    " H- Y6 v7 }( b) S, G3 o( e

  64. / N1 A' q2 C: t' h" k5 Z
  65. GAMEPAD_MERGE_FLAG = $04
    4 `) @2 X( g& Q7 W7 u& w0 a$ U: T
  66. " n- m5 _4 O3 r! G0 R. U3 k4 x
  67. Gamepad_Keep            =       FC_Data_Buf + 1
    . D9 E$ J4 j4 C, h1 p* F
  68. Gamepad_Once            =       Gamepad_Keep + 27 `9 y6 ?( l0 M$ Y& m1 X
  69. Gamepad_Temp            =       Gamepad_Once + 2! X. ]8 Y' _1 F6 D
  70.                                 
    & V+ f- I. ?: a6 Y$ j% K
  71. Gamepad_0_State         =       Gamepad_Temp + 2
    8 X% }% d' O' |8 p$ D
  72. Gamepad_1_State         =       Gamepad_0_State + 1+ P) K$ j0 t9 m* D# S' |
  73. Gamepad_0_Value         =       Gamepad_1_State + 1! i3 e+ |& y) N6 U  d
  74. Gamepad_1_Value         =       Gamepad_0_Value + 1, t. p9 \- ]7 N3 U5 ]
  75. Gamepad_Port_Value      =       Gamepad_1_Value + 1
    ) {. N& s8 Q: h) m: d
  76. Gamepad_Merge           =       Gamepad_Port_Value + 1
    9 Z" x* a) K1 V

  77. 7 j  f( V9 W3 w" x4 E/ ^
  78. ;==================================================/ x$ n6 A2 i, }6 B
  79. IRQ_Index               =       Gamepad_Merge + $013 C8 x- }! e5 P+ h
  80. Sprite_0_Y              =       IRQ_Index + $01
    7 j6 q4 Q& {- q  }+ @
  81. Sprite_0_Tile           =       Sprite_0_Y + $01* o; q: O, C- r' z, L0 {3 w
  82. Sprite_0_Mode           =       Sprite_0_Tile + $01
    * q. a5 e; H3 r$ A
  83. Sprite_0_X              =       Sprite_0_Mode + $01
    , E. Q3 M4 s; B) {, s5 W- M& v
  84. Sprite_0_Hit_Move_Direction           =       Sprite_0_X + $01" D4 ?6 y( \& B+ O" N9 b5 s
  85. ;==================================================
    $ {2 y( H+ q  l" O3 m

  86. : K8 F* n2 O& M: c
  87. ;CHR图形数据. ?% M- M- g2 p- N0 J+ N) O
  88. ;==================================================
    5 d- I, T4 }' D! N3 e! a# r* k. S
  89. .BANK CHR_DATA_BANK
    " O, I+ z& E1 h
  90. .INCBIN "chr_bank/chr_data.chr"7 n( g0 V( z+ L1 W: Y

  91. , f$ z$ k, D! t1 a0 ]4 P
  92. .BANK RESET_BANK & BANK_DATA_MASK8 t0 y, T" `7 h2 G
  93. .ORG RESET_ADDR
    ' W' P. A: r! \  |
  94. $ A  P. Z" T- ?& q, w- O
  95. ;--------------------------------------------------7 M8 {9 H) S  b0 h9 W* d8 }6 A
  96. Attributes_Data, z. K% Y0 ]6 ~* ?; H/ V$ o4 U7 B& B; l8 E
  97. ;命名表属性0 R4 h6 V! }; o+ {2 g2 @4 t
  98. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    1 ]' P5 w/ |# f8 x, {7 n
  99. .DB $50,$50,$50,$50,$50,$50,$50,$50,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA6 L# C8 ~- H9 E
  100. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
    ! a# C6 T: |6 C) E
  101. .DB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$55,$55,$55,$55,$55,$55,$55,$55,$55! t. J% H; ]& \, r! r( e% ?) z
  102. ;--------------------------------------------------
    ; P1 q) l6 u; ~. A. q
  103. ;调色板数据
    & A; h" m, U- W
  104. Palette_Data
    % V, a9 T0 Z& @7 R' o  J3 O: }
  105. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F& I- y& \6 @! _4 b
  106. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    ; r/ C  ]: K: f7 u+ z" o
  107. 2 z- D* x; p4 K9 @7 [4 b* G
  108. ;==================================================7 U: R) A( Q3 D7 H: @5 W
  109. ;命名表初始化* C. O: t. Y1 Y) ~2 C" }  V% D
  110. Init_Name_Table+ i3 p; A. g  X
  111. LDA #$202 T2 r8 S( M: I- z* D! ~
  112. STA PPU_ADDRESS; n1 q/ L/ a- y, J) Z
  113. LDA #$006 P6 d3 r2 a* c+ w$ q" @; K
  114. STA PPU_ADDRESS9 `) Q! P$ l2 E  v( q
  115. LDA #$00( z, t) A' T; L) d2 U8 v
  116. LDY #$006 L# A8 K, Z* Z: Z! I+ U
  117. LDX #$10
    8 M  o2 _% W; `( b- O6 T+ ^
  118. Init_Name_Table_Write- y: v/ _- o2 T1 F- R/ }( O+ |
  119. STA PPU_DATA
    - S" k. t7 q. t. Z, `
  120. INY+ r& V' K# G, J5 F
  121. BNE Init_Name_Table_Write6 b  F' ]; ]: v7 @
  122. DEX6 V) {% o* g: s& S
  123. BNE Init_Name_Table_Write
    : o! Z- N& v+ G) b# @, a
  124. RTS. a1 ^7 {$ P5 [" P

  125. ) M% z, q, i+ g4 p
  126. ;==================================================
    3 U! m- r: `6 t+ ?6 `3 D, z1 m; [4 u
  127. ;调色板初始化
    . j/ t9 \7 V/ m6 {! F( R# B5 w
  128. Init_Palette
      N$ }4 q! h- i* l% v7 `
  129. BIT PPU_STATUS# e9 T: s/ l* @6 w6 c3 b. o" \
  130. LDA #$3F( H& C' L8 O" s" P& s" D  D) f: z
  131. STA PPU_ADDRESS3 k4 d9 I' X. r
  132. LDA #$00: S0 |' Y9 ^& V9 f- ^! Z
  133. STA PPU_ADDRESS
    " w% ]" H! ^8 C! k0 m, ~  l
  134. LDX #$00( _4 {2 _# d5 v* X; z, y
  135. Init_Palette_Write
    # z+ l& Z$ h2 G/ `" x
  136. LDA Palette_Data,X4 a/ N7 Z% v1 W  ?, a' k8 m4 Z
  137. STA PPU_DATA) _& l. L! x. d) R) {3 w
  138. INX( b- v1 v7 K! U8 M0 i, J
  139. CPX #$20
    6 ]% i& u; p9 y" m
  140. BCC Init_Palette_Write
    % q6 c. T/ n6 y6 P1 Y, P& r' I1 i
  141. RTS7 f% [" g% G% e& o

  142. & z/ k! ]/ h9 W" R# Q+ H
  143. ;==================================================; @" r$ D2 M* i! V$ ?8 \- q3 z
  144. ;设置命名表属性: U  ?: D# c0 b3 x/ f- C
  145. Init_NameTable_Attributes/ u) {' j& p2 R7 _, r
  146. BIT PPU_STATUS
    ! C: b# z' _  G
  147. LDA #$23
    # E5 S: e0 m; I4 P  p$ K
  148. STA PPU_ADDRESS
    8 T% h5 J  B! {( C, l! Q
  149. LDA #$C09 {6 [- k* Q$ c1 V: x; H+ U2 h
  150. STA PPU_ADDRESS6 [+ _! m) X( ^, r' O' t
  151. LDX #$00
    + J6 j$ G; w5 r3 N0 }6 [
  152. Init_NameTable_Attributes_Write
    $ j- y) N! b  D5 }: X2 k
  153. LDA Attributes_Data,X
    " e( ~4 g8 B# |' R9 y* o1 ^" o4 f
  154. STA PPU_DATA
    , \" S& I/ a9 w- H: ^
  155. INX
    2 v9 h+ n& B& |
  156. CPX #$405 W9 C5 R" [& t; u- q1 V* A& W( \
  157. BCC Init_NameTable_Attributes_Write
    3 E- Z! g; N: {, ~: }4 D# f+ q0 Z* O
  158. RTS
    0 Q) |( _3 J) R
  159. 2 I2 }, h. k; k; O
  160. ;==================================================
    / E& n9 v( m/ F2 s9 R2 }
  161. ;初始化命名表文本
    % V$ p) N' Q1 Y: Q1 T7 y
  162. Init_Name_Table_Text
    : q0 P  r6 _) [: ^
  163. BIT PPU_STATUS
    : a! a: m, ?, D& o) m
  164. LDA #$20
    ! l9 e% g) n- _1 C% g
  165. STA PPU_ADDRESS
    ( @% D9 |! a! {3 R7 g
  166. LDA #$001 L4 d- [' ?' O" l- Y  m
  167. STA PPU_ADDRESS- t8 t: S  g3 E- p7 j" U
  168. LDA #$00
    & k7 ^2 M! [6 r9 E! U+ Y
  169. STA FC_Data_Buf
      g- T+ a% n# i/ ~# E
  170. LDY #30
    / w( T$ ^% p! X8 b  d
  171. Init_Name_Table_Text_Write
    ' z( r! u% i$ i7 v& i1 u0 s: t
  172. LDX #32$ ~- Z! q6 k2 d9 \8 e+ f9 J9 }( O
  173. Init_Name_Table_Text_Write_Char
    " z8 Q2 G/ S" U; ]: E9 b
  174. LDA #'0'
    , m2 l" _+ Z( q& r2 h- {
  175. CLC
    7 S2 u' F1 O0 O! \; M+ e: g
  176. ADC FC_Data_Buf0 @4 ?9 z- A, P) r- N' V! ?
  177. STA PPU_DATA# [) F1 U) r. h& B* V2 b* ?) u2 F
  178. DEX
    / v! R+ B- \( h4 f
  179. LDA #$14& I/ x7 N0 _9 V# x- r& E( F
  180. STA PPU_DATA
    ( C2 C6 e  r9 @2 |) E# z
  181. DEX( Q# w' P4 {! Y
  182. BNE Init_Name_Table_Text_Write_Char
    # P. E" U! C( j3 m' J2 K
  183. INC FC_Data_Buf' s3 ^" F& v8 n" q7 O
  184. DEY
    1 G5 B( v5 D: `. Y% [
  185. BNE Init_Name_Table_Text_Write2 T7 l  |) z; W
  186. RTS
    ( I, \% Z1 Y& M) v* _3 B
  187.   y& U: P' k: u/ n6 q
  188. ;==============================9 K. O+ D3 ]3 P' E6 |
  189. Init_OAM_Ram;初始化精灵内存
    9 {; {9 z. k$ ?) C% N  [% r
  190. LDX #$00' s9 A2 u: x# t6 Q. b
  191. LDA #$00
    1 r. U8 C- Z7 A: N6 v
  192. STA PPU_OAM_ADDR, I# t0 i1 i% ^$ T6 t5 X
  193. LDA #$F8- @- l5 R; Z$ P5 G4 O) U) S; N: g: ^
  194. Init_OAM_Ram_Write) T* N2 I% E! u* L# _( Y
  195. STA PPU_OAM_DATA
    ; m. t( a+ z" y" N# l$ z9 c
  196. INX. ~& ]6 {' ?- v& I! u
  197. BNE Init_OAM_Ram_Write
    : u- J5 a: _3 D8 j7 S/ j4 O- o
  198. RTS
    / X! H2 p& X; j0 K1 H

  199. ! u, A- C6 \% H8 m1 r
  200. GamepadProcess;手柄处理: `: Z3 L& u6 U7 ^/ |! y- }
  201. JSR GamepadDatacan
    1 y) f/ h/ _. f& T- Z2 ]
  202. LDA <Gamepad_0_Value) P; e; s  V' w  @# X+ r
  203. STA <Gamepad_0_State- B0 T4 e" e- q
  204. LDA <Gamepad_1_Value
    ( _# ?0 S0 K% y3 a
  205. STA <Gamepad_1_State0 V$ \$ J: h& h8 W
  206. JSR GamepadDatacan+ g3 ^+ I4 d3 E3 O1 Q
  207. LDX #$01
    ) w# r$ ^7 s( |  d9 i) x# H
  208. GamepadMergeCheck;合并手柄输入检查3 N! h4 k0 m, F0 O3 r2 o! o# R
  209. LDA <Gamepad_0_Value,X
    / t# i: S; H# t
  210. CMP <Gamepad_0_State,X" I, e5 s6 I9 _- i2 o
  211. BEQ GamepadMergeInput
    6 B" o. n- i+ r  i
  212. LDA <Gamepad_Temp,X
    5 M" F; j8 z; B' e0 ^
  213. STA <Gamepad_0_Value,X; b6 j/ V6 U+ f4 H, C" z
  214. GamepadMergeInput;合并手柄输入5 B- o$ O5 K5 }' }+ @( ^8 Y
  215. DEX
    + r' u0 F$ J0 N5 q4 }4 Q  K4 N
  216. BPL GamepadMergeCheck
    8 \5 N- x, g% s4 U2 V9 l8 C  o3 p
  217. LDA <Gamepad_Merge9 s5 ?* p/ t) v+ g
  218. AND #GAMEPAD_MERGE_FLAG
    4 i; l. _) f6 |) @
  219. BNE GamepadStateProcess% x# [( m2 ^9 O/ [- a
  220. LDA <Gamepad_0_Value7 z! y( M. a3 a0 c8 w; w
  221. ORA <Gamepad_1_Value
    & e( y' \& f5 z! L; U( H  n6 r6 K  o3 f
  222. STA <Gamepad_0_Value: W0 D4 f3 o/ m: ]7 X$ Z3 {4 Y
  223. GamepadStateProcess;手柄状态处理
    6 F0 z6 q; N8 _* O
  224. LDX #$01" U* B; H; B  F# o; z
  225. GamepadStateSave;手柄状态保存
    - x3 i, ]! s9 W5 f1 f
  226. LDA <Gamepad_0_Value,X
    6 L8 i  f3 k; k# I3 {
  227. TAY
    5 c% r5 b, P- ~' X3 N4 I8 }
  228. EOR <Gamepad_Temp,X. a$ r4 J9 R0 J- K
  229. AND <Gamepad_0_Value,X2 }# ~2 f8 u- I4 S0 g: k
  230. STA <Gamepad_Once,X! ~4 ^$ u5 n, o( w5 ]+ k/ w( [5 l9 q
  231. STY <Gamepad_Keep,X
    ! q: y' J) I- y
  232. STY <Gamepad_Temp,X4 E/ F2 J( _1 T# G* m' J
  233. DEX1 K2 b2 t( \" T, H, L" ~) _* F2 ~& q
  234. BPL GamepadStateSave& t) x  n! G* U$ j# F/ l2 K4 g$ I
  235. RTS" v, D7 i8 d! R
  236. # Y+ r. H" @7 I
  237. GamepadDatacan;手柄数据扫描5 I5 f% z2 n0 d
  238. LDX #$017 g! y* E' T# a% L* X
  239. STX $4016
    8 f/ }# N+ F. x. z5 w
  240. DEX7 a. i: L. _6 D( d2 L2 m' _6 J
  241. STX $4016
    4 g" o8 V2 Y/ q8 z9 S
  242. LDY #$08! b" |; a5 f) H) E# c7 g: o- ?1 y) T4 p
  243. GamepadPortScan;手柄端口扫描
    ! i4 I" @' V0 Q$ t) L# _
  244. LDA $4016
    $ M2 n3 ^3 {) }. `
  245. STA <Gamepad_Port_Value
    + `9 z6 E- K6 X2 I# F0 B
  246. LSR A& u! M; x8 D& {( k2 h2 H& J
  247. ORA <Gamepad_Port_Value
      R3 _  S& f' F
  248. LSR A8 M8 J+ k% N7 r4 t  n
  249. ROL <Gamepad_0_Value
    ' H: w1 d4 G6 v+ J
  250. LDA $4017; @) C. D" h" Q) D
  251. STA <Gamepad_Port_Value
    1 U; u* \0 ?: v  y- Q! n( |
  252. LSR A* n: t0 |, N3 B7 G% P( _
  253. ORA <Gamepad_Port_Value5 u; ?6 z& r# S7 ?5 I9 l
  254. LSR A
    $ a7 c" C. u3 L( g5 D3 O- |
  255. ROL <Gamepad_1_Value: e" T8 _+ Q5 f3 r2 \& ~
  256. DEY7 }2 w0 E+ T# o$ T0 I
  257. BNE GamepadPortScan
    $ R1 W, u: s7 ^. z& y& o4 s& k( v
  258. RTS
    ; L* g: ]; e% ], Q$ f

  259.   w; b# _) m& c0 F3 u9 v
  260. ;==================================================
    . G* L# e: x' U& b
  261. ;PPU处理) o6 y8 n3 G0 H/ Q
  262. PPU_Process
    4 Y$ Q) {6 @+ s( U3 h" I
  263. LDA #$00" d7 s7 l2 A! ?# F8 m% `' Y; z
  264. STA PPU_MASK
    8 \% m; c! h# N. `6 \/ _
  265. % M0 Z; I* F+ K* ?/ h6 l) H, p. x) r1 S
  266. BIT PPU_STATUS
    / [2 S" T1 d* f% a- ]( `1 Y* m. F8 i
  267. LDA #$200 D) S1 j" R" u' G
  268. STA PPU_ADDRESS0 v% E# ?3 d1 ]' r, q6 T
  269. LDA #$00
    ; d( I3 ~7 `  y- b, _
  270. STA PPU_ADDRESS; b, K/ h7 b5 @$ O4 z5 X
  271. 3 Z2 z' M, Y' S
  272. STA PPU_SCROLL
    . f" h9 [* P/ |5 H3 y8 P
  273. STA PPU_SCROLL" r" ~8 O5 s! c6 s, f

  274. ) n1 i  n0 i: d; w4 L
  275. LDA PPU_Msak_Buf
    * j+ R" d; [4 f/ O" d* `  z; a) s8 c
  276. STA PPU_MASK; U- `/ w: Y* B+ k1 d

  277. 1 n* L  T9 z, A1 s) ^
  278. RTS
    3 _5 H3 e& x+ S% v+ F, l

  279. 8 o8 D) `$ O& x5 H
  280. ;==============================1 ^  u8 f7 X2 x2 q. E6 [) V
  281. Time_For_Vblank;延时等待! u5 ?$ k" B. |( {: ]) e
  282. LDA PPU_STATUS
    # A$ n; H3 D) W1 V0 t$ J
  283. BPL Time_For_Vblank: q$ Q3 k1 ?. s. G. v% I1 S' Q! e! e. r
  284. RTS/ D) g& S$ J+ a2 K7 _1 `8 a, w
  285. 2 B, R8 Z: T+ c, B. W* r* y: ^" R
  286. ;==================================================
    6 o5 S9 u- S3 x; t( l+ G- q6 }/ r
  287. ;初始化MMC3
    " @9 u' C2 I7 R3 K" H) p! {
  288. Init_MMC3, d3 ~0 G/ ^2 J: j/ |+ s  w. f$ I
  289. STA MMC3_IRQ_DISABLE
    ( A& t7 Q8 d# x7 _; t

  290. 8 c3 \' ^2 W1 e: h0 V- h- a
  291. ;设置MMC3水平镜像  X/ p( L& o' V; A9 ]8 d% A. S
  292. LDA #$01; m  h: {0 a+ A, B% P
  293. STA MMC3_MIRRORING
    5 e7 _1 q  |) C: E' E

  294. ; }/ n1 s4 Y' j* G1 b7 ?
  295. LDX #$05
    * l+ X2 L- X& }$ `: Q( R( z% M
  296. Init_MMC3_Chr_Bank_Write( }! G  q  F" W' p( |  F; _! R, E
  297. STX MMC3_BANK_CTRL
    ' B9 H% ^, c1 ]  T, x' `. e: q
  298. LDA MMC3_Chr_Bank_Data,X
    1 d: ~2 ~' i( b; G7 ]
  299. STA MMC3_BANK_DATA
    2 C! v  e+ w; N+ S! T  v
  300. DEX/ s2 ^' M0 Q+ y3 L2 V3 D$ f' v8 n: m
  301. BPL Init_MMC3_Chr_Bank_Write
    : T+ F; Y8 a( k% c! n, X
  302. RTS
    . V. s* r/ e$ \" X9 _) d
  303. ;--------------------------------------------------
    ! @% ~/ n3 g7 X5 o
  304. MMC3_Chr_Bank_Data* ?8 X- P) M3 I: A$ D8 l  m. a8 \
  305. .DB $00,$02,$04,$05,$06,$073 t( X4 g7 G4 X9 m9 H, q
  306. ) q7 q: j5 h: t7 i
  307. ;==================================================% l* r' a; @, n6 x' b4 ?  e
  308. ;重置中断处理
    3 r8 I" e$ S6 c. @" a( D' r
  309. ResetProgram
    , S, @6 u. W* I2 F& b
  310. SEI
    ! `% |& B$ U7 C8 y% f
  311. CLD
    - q4 A# \# D' a. L$ y; X
  312. LDA #$007 z8 H  Z* r) \
  313. STA PPU_CTRL
    0 h' [8 _* f: o: @+ ]# y
  314. STA PPU_MASK
    " c6 w# H% l, ?, B
  315. STA PPU_STATUS
    6 G+ l1 o- k! x+ o4 b* W  m
  316. STA JOY2_FRAME) z# ?* |4 R2 q8 q% j* S2 s* Q
  317. STA APU_STATUS0 n' n" B8 D0 @0 ~) G# a

  318. ; g4 x' {- l. a$ D
  319. LDA #$C0
    5 `) Z" V1 B" G$ z- F6 w4 n
  320. STA JOY2_FRAME3 h" {  S, u$ l/ n

  321. 7 r4 }2 x1 n+ v' x0 c
  322. ;等待vblank. Q% ~: }9 A4 s7 M. q4 d" j6 r
  323. LDX #$027 y) ?- t. b1 |3 z. }+ D
  324. Vblank_Wait_1
    , J7 j" |6 n( f! P- ]& i3 K
  325. BIT PPU_STATUS" x8 C: \: F9 Q  s5 h% R1 g
  326. BPL Vblank_Wait_16 ~# C& Z" D' U
  327. Vblank_Wait_2
    4 E2 I: {+ V- a2 \5 R, N
  328. BIT PPU_STATUS8 V4 Y8 f+ Z4 D
  329. BMI Vblank_Wait_2
    8 s7 ~' s0 ~" P; |$ O0 y4 J
  330. DEX% j6 G5 f, Y' R0 R* I! Q2 \4 Q
  331. BNE Vblank_Wait_1
    0 g" k$ N+ o2 f" a

  332. / [: L3 w2 g, O/ U9 A; H
  333. LDX #$FF( r# q$ x, R1 z( S% k9 X$ F! S
  334. TXS! W! ~3 J! m+ B4 a
  335. * r5 C5 h0 O" m
  336. ;初始化MMC32 a3 X, z: T( s6 i' M
  337. JSR Init_MMC3
    8 ?& o* F  J7 W9 V; C
  338. ! T# ], }; M: Z& Q" H
  339. ;==============================
    3 L0 J% N, w' @9 B. L6 S
  340. ;RAM初始化
    3 y) y) f  ~3 k. C
  341. Nes_Ram_Init: x% i2 _0 q5 P2 |) P( T0 a
  342. LDY #$00% f! n. C7 Z& L
  343. LDX #$082 L' Z& H& E) V, g3 H
  344. LDA #$00" B" g9 R7 V2 g9 V
  345. STA <$009 k3 t. C. f* U8 d
  346. STA <$01
    ) ?: g% P! p: a$ x: E8 \
  347. Nes_Ram_Init_Write
    % {0 T) u  R& Y9 y
  348. STA [$00],Y7 y- h# V$ _) a9 Z+ i1 y
  349. INY
    . n. t. j4 ]' d( k4 X1 `+ C/ E" q1 ~% H
  350. BNE Nes_Ram_Init_Write0 X) S) S8 @/ o7 a4 i
  351. INC <$01
    6 S+ C+ H! C2 D9 s8 t, C
  352. DEX) V" C* L% ?" p
  353. BNE Nes_Ram_Init_Write
    " o* G  ~2 b! i: h9 k1 y5 S2 B

  354. : @+ O% v4 ?) Z3 S! b1 ?; z: \
  355. ;初始化命名表/ Z$ }! e* G: F; T& K# F  T) B8 y
  356. JSR Init_Name_Table
    # |) U/ o# H. w  s3 [( A4 @
  357. " d# y$ z4 B' V- m8 ^  Z6 ~5 Y% ?: @% g
  358. ;初始化调色板
    0 X) C+ c+ M# j6 W( L
  359. JSR Init_Palette
    7 E  B9 D3 x0 v$ \+ X8 D5 ~% a

  360. + k( C$ y! F% f8 E) n( E$ U
  361. ;初始化命名表属性
    3 k- m3 E  g6 o9 s* K/ G- T
  362. JSR Init_NameTable_Attributes! u* D' @* m9 \$ A# u6 I1 j  ]
  363. " ^5 f& L2 z" r) @* D
  364. ;初始化精灵内存
    ( T5 S4 g# }8 }# D) z: e" F: X& a/ w
  365. JSR Init_OAM_Ram
    : l. c# {7 n1 K: Y4 Z8 E. f! S6 `

  366. 4 g8 i3 y' `, Q: l: I: B, r
  367. ;在屏幕上写点东西
    ! B& [& |+ {0 {0 A7 M, |
  368. JSR Init_Name_Table_Text0 C% g/ \8 F6 }& ~/ V1 J' l

  369. 3 ]6 k. W# g. \( Y
  370. JSR Time_For_Vblank- n' e0 z. m; Y
  371. ;开启PPU控制
    & n0 ]6 P# B0 S; h0 e4 {' Q$ j
  372. LDA #$80: @: L6 O4 |" ~. n% Q
  373. STA PPU_Ctrl_Buf
    & _, ~1 H5 r- w; F. u
  374. STA PPU_CTRL
    % s$ m. E% Z3 f! k, l" ?
  375. 4 `% H& B5 |- b  n3 Z9 Q7 V
  376. ;开启PPU显示& z1 T; ~  D% V# i
  377. LDA #$1E
    ) \& [% r  t7 B, k
  378. STA PPU_Msak_Buf
    3 E0 W. s4 X9 s& x
  379. $ g; y+ s# P# a( B% p6 }
  380. LDA #77
    6 C' }3 u/ I& z( E+ _
  381. STA Sprite_0_Y6 p# d: v  X5 f
  382. LDA #$1E- K- s: d) A) n+ V1 ?" m1 v
  383. STA Sprite_0_Tile
    ) b9 C, P6 t+ @1 a' y' r
  384. LDA #$20
    ( I4 M8 [7 B4 B: i
  385. STA Sprite_0_Mode7 C$ w6 h* t1 Z* D
  386. LDA #$00
    5 T6 `5 T* w# ^+ K; T5 C
  387. STA Sprite_0_X
    $ N+ d8 Z6 H" v# A4 W3 K
  388. 8 ~# [; ]" Y7 f( e( A) i
  389. CLI. x! ]8 s0 k+ F) K
  390. JMP Loop
    ' P4 `  J/ U! k2 c, `) v

  391. - C; j$ v6 I: [9 @  D
  392. ;==============================. }- B2 E$ R! N: g
  393. ;死循环, 等待NMI中断0 K2 I* N- v0 j2 S
  394. Loop! u0 @+ n1 u4 Z. B
  395. JMP Loop
    ; }  m; u( _/ O# H  _- n

  396. ) u0 d- ~  f3 r& n7 K; X
  397. ;==================================================
    ' V$ T" R- F, H- }+ W) k
  398. ;NMI中断处理
      C  H- F/ H" |/ Y0 G8 a
  399. NmiProgram% r8 [+ z( Y4 K' |# S  x+ q; F6 ~
  400. PHA
    9 q3 A5 p7 K* r9 V) ^! j& k
  401. TXA8 W+ {# \5 @* d. O
  402. PHA
    " {. `$ U1 M7 d# h/ I' m1 G
  403. TYA
    4 T( p$ l& I, @( ^9 S! d1 N2 O
  404. PHA# P" G( w1 L8 i4 Z
  405. 5 }, R" \% J6 ?8 F) X! P$ P9 J! {
  406. BIT PPU_STATUS
    % [2 H) o6 s5 [& a, @
  407. , V: ^2 [: ]% h, @, q- y% V
  408. ;关闭PPU控制
    / U& B/ W  H" n3 v
  409. LDA #$00) ?. p  ~! G. k2 n
  410. STA PPU_CTRL
    $ H) m1 K5 ?8 ~" s4 |$ g
  411. - H$ C/ l" A6 Z% P" z
  412. ;处理PPU
    9 a. c" Y# z8 @* M, L( }3 z& y- V
  413. JSR PPU_Process
    - B8 u9 E6 i6 d' `

  414. 1 B  A& ~' D* P& |& u/ s8 j
  415. LDA #$00  l, d* [) X1 q+ K
  416. STA PPU_OAM_ADDR  o/ I4 `& u+ _0 S  _# x
  417. LDA <Sprite_0_Y
    ! t8 C* n6 l; r1 E/ Y! u
  418. STA PPU_OAM_DATA: l; N! O! t% Y/ ^3 \5 ^
  419. LDA <Sprite_0_Tile- y" s9 f$ V% e9 D" f1 {) E0 n4 j
  420. STA PPU_OAM_DATA) r2 D% [0 b5 n0 l
  421. LDA <Sprite_0_Mode3 m" D* Z2 R; E9 Y
  422. STA PPU_OAM_DATA
    ) s( G0 J# e. o8 V8 w* D
  423. LDA <Sprite_0_X
    ' g# j+ J0 A" y2 I% D4 x. Y; x6 ?
  424. STA PPU_OAM_DATA' X' f* A3 a+ ~# L# s+ ~+ u, ?; `/ \

  425. : {" y. C8 K  k* i
  426. ;开启PPU控制# ~4 Q$ T4 o7 ^$ K5 {
  427. LDA PPU_Ctrl_Buf
    ; C  n4 E, k7 V* Z' f/ X
  428. STA PPU_CTRL4 c9 t0 ~' T  k! b- ]; X+ W0 z
  429. ; s, t( Z4 s7 C, N' q
  430. ;屏幕滚动7 ^6 ?& v8 D' b$ n
  431. LDA <PPU_Scroll_H
    & b  g3 {7 p. H! A0 f( k9 M. ~% k) L
  432. STA PPU_SCROLL
    1 w' @: |! f0 }! r& o" h/ ]+ B
  433. LDA #$00
    1 c& c- a) F# \1 n' D9 {  C) U
  434. STA PPU_SCROLL' r- K( e3 x( g
  435. . w0 F" B" B! v
  436. ;手柄处理
    , V1 ]3 b% a2 Q; y
  437. JSR GamepadProcess  P/ K( C. D! \5 l& J
  438. 9 ]7 m( [3 |* s. G4 R
  439. INC <PPU_Scroll_H
    0 O( c& M* u) L$ K" ]0 u

  440. 8 l+ i# o5 H8 l# n9 S
  441. ;启动0号精灵碰撞检测- T( ]' C+ k4 k: a" P
  442. LDA #$01
    * a: E8 E9 H5 C. q
  443. STA Sprite_0_Hit_Move_Direction: n( ?& ~' G( o) X# K
  444. JSR Sprite_Hit_Test
    1 H+ K: K, ~# \8 n9 s3 F

  445. % j6 r* x; h$ L$ M1 z0 N
  446. PLA" R: E' Z- R0 W; K+ |" b
  447. TAY; k6 E+ s9 m+ Z& C
  448. PLA
    : |# m' K7 o2 [
  449. TAX
    5 y7 f; k( Q9 e( J
  450. PLA* k- c6 h/ @0 {0 N0 t' {# p
  451. RTI
    7 G$ W/ ~" R# n/ I0 L4 m- H7 {

  452. 6 k+ e& }* r) u  K( S# V
  453. ;==============================
    1 q% y  F& A2 X
  454. ;0号精灵碰撞测试
    * H! \) }$ R, w. N
  455. Sprite_Hit_Test  k) z& c' z) d9 V

  456. 1 A% E  B( F% r3 s' {  C# ]. l
  457. ;------------------------------" S2 \$ O9 e7 ]# q* g0 _
  458. ;等待0号精灵碰撞状态取消
    : f5 R" G5 f* g7 }9 |' L9 P* M& L
  459. LDA PPU_STATUS* W. g; l) B5 t4 O
  460. ASL A
    . K% R0 D! C3 ~9 v7 ~( s6 w7 ?
  461. BMI * - 48 D5 c7 A8 E- T$ f# @+ ]4 C
  462. ( [6 x( u9 V' @( o
  463. ;------------------------------' j, E# k4 g6 B9 v# J, N
  464. ;等待0号精灵碰撞发生
    6 H1 z9 V1 K7 d% j, y
  465. LDA PPU_STATUS3 k( @! ]0 W7 l. P& [- C; O7 T0 ^
  466. ASl A
    * R' T/ M) n: Q9 V3 m
  467. BPL * - 4
    # B2 z: f5 n3 [8 q) E8 B$ m3 O

  468. , ^3 s, |9 A2 }+ l, i/ C: ]) L, I
  469. ;------------------------------8 P/ F- L/ ?) {  ~- H# o; g% a
  470. ;行消隐等待
    + S# R! X; h2 P" k. F% j5 p' P
  471. Sprite_Hit_Scroll_Wait
    # q2 t5 A! x5 y+ Z6 E
  472. LDX #$28! T) f# e( b* n7 N2 o  O: B
  473. DEX
    & a4 u/ f* m9 k8 B
  474. BNE * - 18 z; A( a( f) F! [0 V
  475. . N! @; N% ~8 E6 q1 o3 y  {! @
  476. LDA Sprite_0_Hit_Move_Direction5 Z- m  E3 b# R( q
  477. AND #$01
    6 T/ r2 x* L) V& l; O/ W
  478. BNE Sprite_Hit_Scroll_Set_Right* V1 ?. |/ ?- }3 k0 ^' g

  479. . x: O7 h: |/ F% f- v; r" v' S
  480. ;------------------------------
    ( k; D* D0 }- v$ e& Z) s2 j- X
  481. ;分割画面向左滚动
    3 ]3 ^+ c& y3 D3 O$ }0 \1 q2 Z9 C
  482. Sprite_Hit_Scroll_Set_Left
    , P# A6 W. v7 ~! X. V
  483. LDA PPU_STATUS$ H: g( K! Q: `  B
  484. LDA <PPU_Scroll_H" I; R- J& @0 k4 ?' g2 c/ d
  485. STA PPU_SCROLL8 V$ Y. Q. m; Z+ _) H
  486. LDA #$005 J! y7 z. |" X" i# X
  487. STA PPU_SCROLL
    5 J" M" Q9 d) {6 z% k( f4 t1 h. P
  488. RTS
    . N* E1 A) t! c* [2 u, g/ K' [

  489. ' i, i" P9 B" z
  490. ;------------------------------7 E" [9 Z! k: i9 O% p
  491. ;分割画面向右滚动+ z' V  q3 M. q1 M  l0 v- U
  492. Sprite_Hit_Scroll_Set_Right
    / e5 S+ v0 g1 x4 }$ e
  493. LDA PPU_STATUS6 X$ r( D- {- Y" h( R: K, L6 \
  494. LDA #$00/ l: r1 p  Y0 a; [0 t! k- {
  495. SEC7 d0 L9 I* T$ B) B& {- Z
  496. SBC <PPU_Scroll_H
    % q8 l0 x, b3 o5 K! f
  497. STA PPU_SCROLL
    1 [1 B: m, U/ E/ e% g3 Y
  498. LDA #$007 I* ^- c5 u* ]: G6 y
  499. STA PPU_SCROLL7 Q$ l3 z  b; Z/ v. Z
  500. RTS
    ! W9 C! d) I2 J8 E5 f
  501. ! W6 Q. F, c5 n  P
  502. ;==================================================
    $ K2 h  J; ~9 x: h; y- s' P
  503. ;IRQ中断处理
    & v! ]7 c# N# x
  504. IrqProgram
    7 P8 |4 h; A2 l! x: s9 s: i6 F0 `
  505. PHA
    % R  Z% z7 q) X# R+ o1 }! F
  506. TXA
    6 N$ B& [; y3 L  o9 ~/ E
  507. PHA2 @* ?0 E! Z. z- d0 p/ g( G
  508. TYA( b8 p( }- ~0 _" o: V( f
  509. PHA: m5 r: ^+ }3 ]% ^  P5 `
  510. , g3 ]% s+ Y) Z# a1 x  x( u! K. k
  511. ;关闭IRQ
    & n2 G  A) I( r- E! u8 [
  512. STA MMC3_IRQ_DISABLE9 H. n0 u; w3 H8 c8 b7 t
  513. 1 C' H: K) j5 Y: c, l
  514. ;允许下个IRQ触发1 j( s7 N7 \5 F  C
  515. STA MMC3_IRQ_ENABLE
    * X" o6 h( p; b! @* f; |
  516. 2 e; e2 H1 V+ r6 W" \$ {5 \
  517. ;IRQ处理, 15线后继续触发+ M& ?4 G2 H# g  v" [/ v/ B
  518. LDA #153 |; Z/ T, X: F" T4 X# w  T
  519. STA MMC3_IRQ_LATCH
      K5 P' K  a2 D2 T" d/ X& A; `3 c

  520. ! p* N5 D* }: b/ l9 S; B
  521. LDA <IRQ_Index
    ! x. K$ n) W/ i, Q
  522. BNE * + 4& ]" B$ ^# }! b- I: @
  523. INC <PPU_Scroll_H
    0 u8 R# S, |/ ?+ ~$ |

  524. . `7 h8 h$ ^' z6 }9 B
  525. ;设置屏幕滚动
    # r) H% J4 @( C- j) N4 t
  526. LDA <IRQ_Index
    , b# C! x' `& s5 l* E. c9 k
  527. AND #$01
    ) h! N4 ~8 T. j! [7 L/ e1 O
  528. BEQ Irq_Scroll_Right
    * C1 ^+ d3 G0 \  l0 |* ]/ p

  529. 0 N3 [( U& N+ t
  530. Irq_Scroll_Left2 e8 e1 U. x$ ?3 T/ y7 p
  531. BIT PPU_STATUS
    " }% J! `  Y( Z; Y. t
  532. LDA <PPU_Scroll_H
    : i+ T7 R; J9 ^: ?
  533. STA PPU_SCROLL5 ]3 w& h* ?: @0 Q3 z8 A
  534. STA PPU_SCROLL
    ) k  ^$ D3 F5 ?( F" o; {5 a2 C0 V
  535. JMP Irq_Scroll_Over
    ) \9 Y1 l3 f( \' ?. I' N
  536. , O5 U1 l7 W# f) `7 D) Z7 n! \
  537. Irq_Scroll_Right; M7 g' L- w) X( r0 _8 @7 Y7 ?" Z
  538. SEC
    $ ?6 T, J* {6 |2 S9 `
  539. SBC <PPU_Scroll_H4 Z1 U8 s# B7 n4 k3 M
  540. STA PPU_SCROLL2 q3 q1 S- R; v: B
  541. STA PPU_SCROLL
    0 M5 s9 N. z0 |$ r! {
  542. Irq_Scroll_Over
    , v. Y6 W6 j- I/ Y
  543. , S, f/ @$ S0 z( D
  544. INC <IRQ_Index1 a1 Y4 |2 |( Q* l$ U
  545. 5 F' W# i4 ~0 P+ r1 c
  546. LDA <IRQ_Index
    " t$ V8 y% P* a9 v( j( j
  547. CMP #14
    ( j! X- F6 {+ @  z. M1 @! f$ {0 ?
  548. BCC * + 56 X/ a. ?, o( X) S
  549. ;关闭IRQ
    ! w" N5 `, ]* o6 a
  550. STA MMC3_IRQ_DISABLE4 C; Y$ U9 G& M: A/ o% y

  551. 6 P8 I- q2 {. ]' {7 [7 X
  552. IrqProgramEnd) E% g  k0 n4 J2 _5 @/ I( F3 _% T
  553. PLA% k1 c- F. Y5 c/ P5 x$ ]5 B
  554. TAY. Q) @* y  {2 N2 H
  555. PLA. ?0 X  Y, d% I( Z4 \9 s9 M
  556. TAX; @7 R- i$ _; ]4 Y
  557. PLA
    9 H1 v' e; u7 u3 Z
  558. RTI& Y) t8 K' S; v  ?- v) X. N
  559. , ?5 k1 v4 `* I# v: O4 b
  560. ;==================================================
    $ q$ L' _8 o/ G2 v4 B0 u
  561. ;中断表! _8 q* p1 i) _8 i; M+ n; K' ^
  562. .ORG $FFFA! b* @( R& ?' D, f
  563. .WORD NmiProgram
    7 ~; t) y" ?+ G. Z3 c% U; Q
  564. .WORD ResetProgram# W" Q/ z4 E2 a) f0 X
  565. .WORD IrqProgram
复制代码
: v4 t6 H/ a3 i+ r

评分

1

查看全部评分

[发帖际遇]: yandagui 在论坛发帖时没有注意,被小偷偷去了 3 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-4-26 19:17

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表