Advertisement
Bond697

PM_GoSleepMode

Feb 23rd, 2012
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.47 KB | None | 0 0
  1. RAM_ARM9:0208C16C             @ =============== S U B R O U T I N E =======================================
  2. RAM_ARM9:0208C16C
  3. RAM_ARM9:0208C16C
  4. RAM_ARM9:0208C16C             @ void __fastcall PM_GoSleepMode__(struct PMWakeUpTrigger *trigger, struct PMLogic *logic, unsigned __int16 keyPattern)
  5. RAM_ARM9:0208C16C             PM_GoSleepMode__:                       @ CODE XREF: sub_2035474+48p
  6. RAM_ARM9:0208C16C
  7. RAM_ARM9:0208C16C             var_40          = -0x40
  8. RAM_ARM9:0208C16C             var_3C          = -0x3C
  9. RAM_ARM9:0208C16C             var_38          = -0x38
  10. RAM_ARM9:0208C16C             var_34          = -0x34
  11. RAM_ARM9:0208C16C             var_30          = -0x30
  12. RAM_ARM9:0208C16C             var_2C          = -0x2C
  13. RAM_ARM9:0208C16C             var_28          = -0x28
  14. RAM_ARM9:0208C16C
  15. RAM_ARM9:0208C16C F0 4F 2D E9                 STMFD   SP!, {R4-R11,LR}
  16. RAM_ARM9:0208C170 1C D0 4D E2                 SUB     SP, SP, #0x1C
  17. RAM_ARM9:0208C174 D8 32 9F E5                 LDR     R3, =0x2153020
  18. RAM_ARM9:0208C178 00 70 A0 E1                 MOV     R7, R0
  19. RAM_ARM9:0208C17C 1C 00 93 E5                 LDR     R0, [R3,#0x1C]  @ listp
  20. RAM_ARM9:0208C180 00 10 8D E5                 STR     R1, [SP]
  21. RAM_ARM9:0208C184 04 20 8D E5                 STR     R2, [SP,#4]
  22. RAM_ARM9:0208C188 01 50 A0 E3                 MOV     R5, #1
  23. RAM_ARM9:0208C18C 00 40 A0 E3                 MOV     R4, #0
  24. RAM_ARM9:0208C190 98 01 00 EB                 BL      PMi_ExecuteList__
  25. RAM_ARM9:0208C194 BC 02 9F E5                 LDR     R0, =0x4000208
  26. RAM_ARM9:0208C198 B0 60 D0 E1                 LDRH    R6, [R0]
  27. RAM_ARM9:0208C19C B0 40 C0 E1                 STRH    R4, [R0]
  28. RAM_ARM9:0208C1A0 FE ED FF EB                 BL      OS_DisableInterrupts__
  29. RAM_ARM9:0208C1A4 10 00 8D E5                 STR     R0, [SP,#0x10]
  30. RAM_ARM9:0208C1A8 01 00 44 E2                 SUB     R0, R4, #1      @ intr
  31. RAM_ARM9:0208C1AC FF E1 FF EB                 BL      OS_DisableIrqMask__
  32. RAM_ARM9:0208C1B0 0C 00 8D E5                 STR     R0, [SP,#0xC]
  33. RAM_ARM9:0208C1B4 AD EB FF EB                 BL      OS_IsTickAvailable__
  34. RAM_ARM9:0208C1B8 00 00 50 E3                 CMP     R0, #0
  35. RAM_ARM9:0208C1BC 08 00 A0 13                 MOVNE   R0, #8
  36. RAM_ARM9:0208C1C0 04 00 A0 01                 MOVEQ   R0, R4
  37. RAM_ARM9:0208C1C4 01 07 80 E3                 ORR     R0, R0, #0x40000 @ intr
  38. RAM_ARM9:0208C1C8 E1 E1 FF EB                 BL      OS_SetIrqMask__
  39. RAM_ARM9:0208C1CC 10 00 9D E5                 LDR     R0, [SP,#0x10]
  40. RAM_ARM9:0208C1D0 F7 ED FF EB                 BL      OS_RestoreInterrupts__
  41. RAM_ARM9:0208C1D4 7C 12 9F E5                 LDR     R1, =0x4000208
  42. RAM_ARM9:0208C1D8 08 00 17 E3                 TST     R7, #8
  43. RAM_ARM9:0208C1DC B0 00 D1 E1                 LDRH    R0, [R1]
  44. RAM_ARM9:0208C1E0 B0 50 C1 E1                 STRH    R5, [R1]
  45. RAM_ARM9:0208C1E4 06 00 00 0A                 BEQ     loc_208C204
  46. RAM_ARM9:0208C1E8 4B EE FF EB                 BL      MB_IsMultiBootChild__
  47. RAM_ARM9:0208C1EC FE 00 80 E2                 ADD     R0, R0, #0xFE
  48. RAM_ARM9:0208C1F0 FF 0C 80 E2                 ADD     R0, R0, #0xFF00
  49. RAM_ARM9:0208C1F4 00 08 A0 E1                 MOV     R0, R0,LSL#16
  50. RAM_ARM9:0208C1F8 20 08 A0 E1                 MOV     R0, R0,LSR#16
  51. RAM_ARM9:0208C1FC 01 00 50 E3                 CMP     R0, #1
  52. RAM_ARM9:0208C200 08 70 C7 93                 BICLS   R7, R7, #8
  53. RAM_ARM9:0208C204
  54. RAM_ARM9:0208C204             loc_208C204:                            @ CODE XREF: PM_GoSleepMode__+78j
  55. RAM_ARM9:0208C204 10 00 17 E3                 TST     R7, #0x10
  56. RAM_ARM9:0208C208 06 00 00 0A                 BEQ     loc_208C228
  57. RAM_ARM9:0208C20C D0 E6 FF EB                 BL      DSi.Check__
  58. RAM_ARM9:0208C210 00 00 50 E3                 CMP     R0, #0
  59. RAM_ARM9:0208C214 02 00 00 1A                 BNE     loc_208C224
  60. RAM_ARM9:0208C218 52 13 00 EB                 BL      CTRDG_IsExisting__
  61. RAM_ARM9:0208C21C 00 00 50 E3                 CMP     R0, #0
  62. RAM_ARM9:0208C220 00 00 00 1A                 BNE     loc_208C228
  63. RAM_ARM9:0208C224
  64. RAM_ARM9:0208C224             loc_208C224:                            @ CODE XREF: PM_GoSleepMode__+A8j
  65. RAM_ARM9:0208C224 10 70 C7 E3                 BIC     R7, R7, #0x10
  66. RAM_ARM9:0208C228
  67. RAM_ARM9:0208C228             loc_208C228:                            @ CODE XREF: PM_GoSleepMode__+9Cj
  68. RAM_ARM9:0208C228                                                     @ PM_GoSleepMode__+B4j
  69. RAM_ARM9:0208C228 01 13 A0 E3                 MOV     R1, #0x4000000
  70. RAM_ARM9:0208C22C 01 0A 81 E2                 ADD     R0, R1, #0x1000
  71. RAM_ARM9:0208C230 00 B0 91 E5                 LDR     R11, [R1]
  72. RAM_ARM9:0208C234 00 50 90 E5                 LDR     R5, [R0]
  73. RAM_ARM9:0208C238 18 01 00 EB                 BL      PM_GetLCDPower__
  74. RAM_ARM9:0208C23C 14 90 8D E2                 ADD     R9, SP, #0x14
  75. RAM_ARM9:0208C240 18 A0 8D E2                 ADD     R10, SP, #0x18
  76. RAM_ARM9:0208C244 08 00 8D E5                 STR     R0, [SP,#8]
  77. RAM_ARM9:0208C248 0A 00 A0 E1                 MOV     R0, R10         @ top
  78. RAM_ARM9:0208C24C 09 10 A0 E1                 MOV     R1, R9          @ bottom
  79. RAM_ARM9:0208C250 64 FF FF EB                 BL      PM_GetBackLight__
  80. RAM_ARM9:0208C254 00 00 50 E3                 CMP     R0, #0
  81. RAM_ARM9:0208C258 07 00 00 0A                 BEQ     loc_208C27C
  82. RAM_ARM9:0208C25C F8 81 9F E5                 LDR     R8, =0x51D23
  83. RAM_ARM9:0208C260
  84. RAM_ARM9:0208C260             loc_208C260:                            @ CODE XREF: PM_GoSleepMode__+10Cj
  85. RAM_ARM9:0208C260 08 00 A0 E1                 MOV     R0, R8
  86. RAM_ARM9:0208C264 EC ED FF EB                 BL      DSi_regUnk__
  87. RAM_ARM9:0208C268 0A 00 A0 E1                 MOV     R0, R10         @ top
  88. RAM_ARM9:0208C26C 09 10 A0 E1                 MOV     R1, R9          @ bottom
  89. RAM_ARM9:0208C270 5C FF FF EB                 BL      PM_GetBackLight__
  90. RAM_ARM9:0208C274 00 00 50 E3                 CMP     R0, #0
  91. RAM_ARM9:0208C278 F8 FF FF 1A                 BNE     loc_208C260
  92. RAM_ARM9:0208C27C
  93. RAM_ARM9:0208C27C             loc_208C27C:                            @ CODE XREF: PM_GoSleepMode__+ECj
  94. RAM_ARM9:0208C27C 02 00 A0 E3                 MOV     R0, #2          @ target
  95. RAM_ARM9:0208C280 00 10 A0 E3                 MOV     R1, #0          @ sw
  96. RAM_ARM9:0208C284 D9 FE FF EB                 BL      PM_SetBackLight__
  97. RAM_ARM9:0208C288 00 00 50 E3                 CMP     R0, #0
  98. RAM_ARM9:0208C28C 09 00 00 0A                 BEQ     loc_208C2B8
  99. RAM_ARM9:0208C290 C4 A1 9F E5                 LDR     R10, =0x51D23
  100. RAM_ARM9:0208C294 02 90 A0 E3                 MOV     R9, #2
  101. RAM_ARM9:0208C298 00 80 A0 E3                 MOV     R8, #0
  102. RAM_ARM9:0208C29C
  103. RAM_ARM9:0208C29C             loc_208C29C:                            @ CODE XREF: PM_GoSleepMode__+148j
  104. RAM_ARM9:0208C29C 0A 00 A0 E1                 MOV     R0, R10
  105. RAM_ARM9:0208C2A0 DD ED FF EB                 BL      DSi_regUnk__
  106. RAM_ARM9:0208C2A4 09 00 A0 E1                 MOV     R0, R9          @ target
  107. RAM_ARM9:0208C2A8 08 10 A0 E1                 MOV     R1, R8          @ sw
  108. RAM_ARM9:0208C2AC CF FE FF EB                 BL      PM_SetBackLight__
  109. RAM_ARM9:0208C2B0 00 00 50 E3                 CMP     R0, #0
  110. RAM_ARM9:0208C2B4 F8 FF FF 1A                 BNE     loc_208C29C
  111. RAM_ARM9:0208C2B8
  112. RAM_ARM9:0208C2B8             loc_208C2B8:                            @ CODE XREF: PM_GoSleepMode__+120j
  113. RAM_ARM9:0208C2B8 75 FD FF EB                 BL      waitForNextVFrame__ @ //---- wait a few frames after backlight off for avoiding appearance of afterimage
  114. RAM_ARM9:0208C2BC 01 23 A0 E3                 MOV     R2, #0x4000000
  115. RAM_ARM9:0208C2C0 00 00 92 E5                 LDR     R0, [R2]
  116. RAM_ARM9:0208C2C4 01 1A 82 E2                 ADD     R1, R2, #0x1000
  117. RAM_ARM9:0208C2C8 03 08 C0 E3                 BIC     R0, R0, #0x30000
  118. RAM_ARM9:0208C2CC 00 00 82 E5                 STR     R0, [R2]
  119. RAM_ARM9:0208C2D0 00 00 91 E5                 LDR     R0, [R1]
  120. RAM_ARM9:0208C2D4 01 08 C0 E3                 BIC     R0, R0, #0x10000
  121. RAM_ARM9:0208C2D8 00 00 81 E5                 STR     R0, [R1]
  122. RAM_ARM9:0208C2DC 6C FD FF EB                 BL      waitForNextVFrame__
  123. RAM_ARM9:0208C2E0 6B FD FF EB                 BL      waitForNextVFrame__
  124. RAM_ARM9:0208C2E4 76 FF FF EB                 BL      readFSToDMA__
  125. RAM_ARM9:0208C2E8 14 10 9D E5                 LDR     R1, [SP,#0x14]
  126. RAM_ARM9:0208C2EC 60 01 9F E5                 LDR     R0, =0x2153020
  127. RAM_ARM9:0208C2F0 00 80 A0 E3                 MOV     R8, #0
  128. RAM_ARM9:0208C2F4 08 80 80 E5                 STR     R8, [R0,#8]
  129. RAM_ARM9:0208C2F8 00 00 51 E3                 CMP     R1, #0
  130. RAM_ARM9:0208C2FC 18 00 9D E5                 LDR     R0, [SP,#0x18]
  131. RAM_ARM9:0208C300 80 80 A0 13                 MOVNE   R8, #0x80 @ 'Ç'
  132. RAM_ARM9:0208C304 00 00 50 E3                 CMP     R0, #0
  133. RAM_ARM9:0208C308 40 90 A0 E3                 MOV     R9, #0x40 @ '@'
  134. RAM_ARM9:0208C30C 01 07 A0 E3                 MOV     R0, #0x40000    @ intr
  135. RAM_ARM9:0208C310 00 90 A0 03                 MOVEQ   R9, #0
  136. RAM_ARM9:0208C314 8E E1 FF EB                 BL      OS_SetIrqMask__
  137. RAM_ARM9:0208C318 00 10 9D E5                 LDR     R1, [SP]
  138. RAM_ARM9:0208C31C 04 00 9D E5                 LDR     R0, [SP,#4]
  139. RAM_ARM9:0208C320 00 10 81 E1                 ORR     R1, R1, R0
  140. RAM_ARM9:0208C324 09 00 87 E1                 ORR     R0, R7, R9
  141. RAM_ARM9:0208C328 08 00 80 E1                 ORR     R0, R0, R8
  142. RAM_ARM9:0208C32C 00 08 A0 E1                 MOV     R0, R0,LSL#16
  143. RAM_ARM9:0208C330 01 18 A0 E1                 MOV     R1, R1,LSL#16
  144. RAM_ARM9:0208C334 20 08 A0 E1                 MOV     R0, R0,LSR#16   @ trigger
  145. RAM_ARM9:0208C338 21 18 A0 E1                 MOV     R1, R1,LSR#16   @ keyIntrData
  146. RAM_ARM9:0208C33C 23 FE FF EB                 BL      PMi_SendSleepStart__
  147. RAM_ARM9:0208C340 0C 81 9F E5                 LDR     R8, =0x2153020
  148. RAM_ARM9:0208C344 08 00 98 E5                 LDR     R0, [R8,#8]
  149. RAM_ARM9:0208C348 00 00 50 E3                 CMP     R0, #0
  150. RAM_ARM9:0208C34C 03 00 00 1A                 BNE     loc_208C360
  151. RAM_ARM9:0208C350
  152. RAM_ARM9:0208C350             loc_208C350:                            @ CODE XREF: PM_GoSleepMode__+1F0j
  153. RAM_ARM9:0208C350 E4 EF FF EB                 BL      OS_Halt__
  154. RAM_ARM9:0208C354 08 00 98 E5                 LDR     R0, [R8,#8]
  155. RAM_ARM9:0208C358 00 00 50 E3                 CMP     R0, #0
  156. RAM_ARM9:0208C35C FB FF FF 0A                 BEQ     loc_208C350
  157. RAM_ARM9:0208C360
  158. RAM_ARM9:0208C360             loc_208C360:                            @ CODE XREF: PM_GoSleepMode__+1E0j
  159. RAM_ARM9:0208C360 00 80 A0 E3                 MOV     R8, #0
  160. RAM_ARM9:0208C364 41 EB FF EB                 BL      OS_IsTickAvailable__
  161. RAM_ARM9:0208C368 00 00 50 E3                 CMP     R0, #0
  162. RAM_ARM9:0208C36C 08 00 A0 13                 MOVNE   R0, #8
  163. RAM_ARM9:0208C370 08 00 A0 01                 MOVEQ   R0, R8
  164. RAM_ARM9:0208C374 01 07 80 E3                 ORR     R0, R0, #0x40000 @ intr
  165. RAM_ARM9:0208C378 75 E1 FF EB                 BL      OS_SetIrqMask__
  166. RAM_ARM9:0208C37C 08 00 17 E3                 TST     R7, #8
  167. RAM_ARM9:0208C380 03 00 00 0A                 BEQ     loc_208C394
  168. RAM_ARM9:0208C384 D4 00 9F E5                 LDR     R0, =0x4000214
  169. RAM_ARM9:0208C388 00 00 90 E5                 LDR     R0, [R0]
  170. RAM_ARM9:0208C38C 01 06 10 E3                 TST     R0, #0x100000
  171. RAM_ARM9:0208C390 01 40 A0 13                 MOVNE   R4, #1
  172. RAM_ARM9:0208C394
  173. RAM_ARM9:0208C394             loc_208C394:                            @ CODE XREF: PM_GoSleepMode__+214j
  174. RAM_ARM9:0208C394 00 00 54 E3                 CMP     R4, #0
  175. RAM_ARM9:0208C398 01 70 A0 E3                 MOV     R7, #1
  176. RAM_ARM9:0208C39C 19 00 00 1A                 BNE     loc_208C408
  177. RAM_ARM9:0208C3A0 08 00 9D E5                 LDR     R0, [SP,#8]
  178. RAM_ARM9:0208C3A4 01 00 50 E3                 CMP     R0, #1
  179. RAM_ARM9:0208C3A8 07 00 00 1A                 BNE     loc_208C3CC
  180. RAM_ARM9:0208C3AC
  181. RAM_ARM9:0208C3AC             loc_208C3AC:                            @ CODE XREF: PM_GoSleepMode__+258j
  182. RAM_ARM9:0208C3AC 07 00 A0 E1                 MOV     R0, R7          @ sw
  183. RAM_ARM9:0208C3B0 07 10 A0 E1                 MOV     R1, R7          @ led
  184. RAM_ARM9:0208C3B4 07 20 A0 E1                 MOV     R2, R7          @ skip
  185. RAM_ARM9:0208C3B8 07 30 A0 E1                 MOV     R3, R7          @ isSync
  186. RAM_ARM9:0208C3BC 28 00 00 EB                 BL      PMi_SetLCDPower__
  187. RAM_ARM9:0208C3C0 01 00 50 E3                 CMP     R0, #1
  188. RAM_ARM9:0208C3C4 F8 FF FF 1A                 BNE     loc_208C3AC
  189. RAM_ARM9:0208C3C8 0A 00 00 EA                 B       loc_208C3F8
  190. RAM_ARM9:0208C3CC             @ ---------------------------------------------------------------------------
  191. RAM_ARM9:0208C3CC
  192. RAM_ARM9:0208C3CC             loc_208C3CC:                            @ CODE XREF: PM_GoSleepMode__+23Cj
  193. RAM_ARM9:0208C3CC 07 00 A0 E1                 MOV     R0, R7          @ status
  194. RAM_ARM9:0208C3D0 5A FE FF EB                 BL      PMi_SetLED__
  195. RAM_ARM9:0208C3D4 00 00 50 E3                 CMP     R0, #0
  196. RAM_ARM9:0208C3D8 06 00 00 0A                 BEQ     loc_208C3F8
  197. RAM_ARM9:0208C3DC 78 90 9F E5                 LDR     R9, =0x51D23
  198. RAM_ARM9:0208C3E0
  199. RAM_ARM9:0208C3E0             loc_208C3E0:                            @ CODE XREF: PM_GoSleepMode__+288j
  200. RAM_ARM9:0208C3E0 09 00 A0 E1                 MOV     R0, R9
  201. RAM_ARM9:0208C3E4 8C ED FF EB                 BL      DSi_regUnk__
  202. RAM_ARM9:0208C3E8 07 00 A0 E1                 MOV     R0, R7          @ status
  203. RAM_ARM9:0208C3EC 53 FE FF EB                 BL      PMi_SetLED__
  204. RAM_ARM9:0208C3F0 00 00 50 E3                 CMP     R0, #0
  205. RAM_ARM9:0208C3F4 F9 FF FF 1A                 BNE     loc_208C3E0
  206. RAM_ARM9:0208C3F8
  207. RAM_ARM9:0208C3F8             loc_208C3F8:                            @ CODE XREF: PM_GoSleepMode__+25Cj
  208. RAM_ARM9:0208C3F8                                                     @ PM_GoSleepMode__+26Cj
  209. RAM_ARM9:0208C3F8 01 03 A0 E3                 MOV     R0, #0x4000000
  210. RAM_ARM9:0208C3FC 00 B0 80 E5                 STR     R11, [R0]
  211. RAM_ARM9:0208C400 01 0A 80 E2                 ADD     R0, R0, #0x1000
  212. RAM_ARM9:0208C404 00 50 80 E5                 STR     R5, [R0]
  213. RAM_ARM9:0208C408
  214. RAM_ARM9:0208C408             loc_208C408:                            @ CODE XREF: PM_GoSleepMode__+230j
  215. RAM_ARM9:0208C408 36 08 A0 E3                 MOV     R0, #0x360000
  216. RAM_ARM9:0208C40C 82 ED FF EB                 BL      DSi_regUnk__
  217. RAM_ARM9:0208C410 40 50 9F E5                 LDR     R5, =0x4000208
  218. RAM_ARM9:0208C414 B0 00 D5 E1                 LDRH    R0, [R5]
  219. RAM_ARM9:0208C418 0C 00 9D E5                 LDR     R0, [SP,#0xC]   @ intr
  220. RAM_ARM9:0208C41C B0 80 C5 E1                 STRH    R8, [R5]
  221. RAM_ARM9:0208C420 4B E1 FF EB                 BL      OS_SetIrqMask__
  222. RAM_ARM9:0208C424 10 00 9D E5                 LDR     R0, [SP,#0x10]
  223. RAM_ARM9:0208C428 61 ED FF EB                 BL      OS_RestoreInterrupts__
  224. RAM_ARM9:0208C42C B0 00 D5 E1                 LDRH    R0, [R5]
  225. RAM_ARM9:0208C430 00 00 54 E3                 CMP     R4, #0
  226. RAM_ARM9:0208C434 B0 60 C5 E1                 STRH    R6, [R5]
  227. RAM_ARM9:0208C438 00 00 00 0A                 BEQ     loc_208C440
  228. RAM_ARM9:0208C43C 9E FE FF EB                 BL      sub_208BEBC
  229. RAM_ARM9:0208C440             @ ---------------------------------------------------------------------------
  230. RAM_ARM9:0208C440
  231. RAM_ARM9:0208C440             loc_208C440:                            @ CODE XREF: PM_GoSleepMode__+2CCj
  232. RAM_ARM9:0208C440 0C 00 9F E5                 LDR     R0, =0x2153020
  233. RAM_ARM9:0208C444 04 00 90 E5                 LDR     R0, [R0,#4]     @ listp
  234. RAM_ARM9:0208C448 EA 00 00 EB                 BL      PMi_ExecuteList__
  235. RAM_ARM9:0208C44C 1C D0 8D E2                 ADD     SP, SP, #0x1C
  236. RAM_ARM9:0208C450 F0 8F BD E8                 LDMFD   SP!, {R4-R11,PC}
  237. RAM_ARM9:0208C450             @ End of function PM_GoSleepMode__
  238. RAM_ARM9:0208C450
  239. RAM_ARM9:0208C450             @ ---------------------------------------------------------------------------
  240. RAM_ARM9:0208C454 20 30 15 02 dword_208C454:  .long 0x2153020         @ DATA XREF: PM_GoSleepMode__+8r
  241. RAM_ARM9:0208C454                                                     @ PM_GoSleepMode__+180r ...
  242. RAM_ARM9:0208C458 08 02 00 04 dword_208C458:  .long 0x4000208         @ DATA XREF: PM_GoSleepMode__+28r
  243. RAM_ARM9:0208C458                                                     @ PM_GoSleepMode__+68r ...
  244. RAM_ARM9:0208C45C 23 1D 05 00 dword_208C45C:  .long 0x51D23           @ DATA XREF: PM_GoSleepMode__+F0r
  245. RAM_ARM9:0208C45C                                                     @ PM_GoSleepMode__+124r ...
  246. RAM_ARM9:0208C460 14 02 00 04 dword_208C460:  .long 0x4000214         @ DATA XREF: PM_GoSleepMode__+218r
  247.  
  248. -----------------------------------------------------------------------------------------------------------------------
  249.  
  250. void PM_GoSleepMode(PMWakeUpTrigger trigger, PMLogic logic, u16 keyPattern)
  251. {
  252.     BOOL    prepIrq;                   // IME
  253.     OSIntrMode prepIntrMode;           // CPSR-IRQ
  254.     OSIrqMask prepIntrMask;            // IE
  255.     BOOL    powerOffFlag = FALSE;
  256.  
  257.     PMBackLightSwitch preTop;
  258.     PMBackLightSwitch preBottom;
  259.  
  260.     u32     preGX;
  261.     u32     preGXS;
  262.     PMLCDPower preLCDPower;
  263.  
  264.     //---- call pre-callbacks
  265.     PMi_ExecuteList(PMi_PreSleepCallbackList);
  266.  
  267.     //---- disable all interrupt
  268.     prepIrq = OS_DisableIrq();         // IME       D
  269.     prepIntrMode = OS_DisableInterrupts();      // CPSR-IRQ  D
  270.     prepIntrMask = OS_DisableIrqMask((1 << OS_IRQ_TABLE_MAX) - 1);      // IE        D
  271.  
  272.     //---- interrupt setting
  273.     (void)OS_SetIrqMask(OS_IE_FIFO_RECV);       // enable PXI from ARM7
  274.     (void)OS_RestoreInterrupts(prepIntrMode);   // CPSR-IRQ  E
  275.     (void)OS_EnableIrq();              // IME       E
  276.  
  277.     //---- check card trigger
  278.     if (trigger & PM_TRIGGER_CARD)
  279.     {
  280.         //---- if multi boot child, ignore card check flag
  281.         if (MB_IsMultiBootChild())
  282.         {
  283.             trigger &= ~PM_TRIGGER_CARD;
  284.         }
  285.     }
  286.  
  287.     //---- check cartridge trigger
  288.     if (trigger & PM_TRIGGER_CARTRIDGE)
  289.     {
  290.         //---- if cartridge not exist, ignore cartridge check flag
  291.         if (!CTRDG_IsExisting())
  292.         {
  293.             trigger &= ~PM_TRIGGER_CARTRIDGE;
  294.         }
  295.     }
  296.  
  297.     //---- remember gx state
  298.     preGX = reg_GX_DISPCNT;
  299.     preGXS = reg_GXS_DB_DISPCNT;
  300.     preLCDPower = PM_GetLCDPower();
  301.  
  302.     //---- set backlight off
  303.     (void)PM_GetBackLight(&preTop, &preBottom);
  304.     (void)PM_SetBackLight(PM_LCD_ALL, PM_BACKLIGHT_OFF);
  305.  
  306.     //---- wait a few frames after backlight off for avoiding appearance of afterimage
  307.     {
  308.         vu32    vcount = OS_GetVBlankCount();
  309.         while (vcount == OS_GetVBlankCount())
  310.         {
  311.         }
  312.         vcount = OS_GetVBlankCount();
  313.  
  314.         reg_GX_DISPCNT = reg_GX_DISPCNT & ~REG_GX_DISPCNT_MODE_MASK;    // main screen off
  315.         GXS_DispOff();
  316.  
  317.         while (vcount == OS_GetVBlankCount())
  318.         {
  319.         }
  320.         vcount = OS_GetVBlankCount();
  321.         while (vcount == OS_GetVBlankCount())
  322.         {
  323.         }
  324.     }
  325.  
  326.     //---- send SLEEP_START command to ARM7
  327.     {
  328.         u16     param;
  329.         param = (u16)(trigger
  330.                       | preTop << PM_BACKLIGHT_RECOVER_TOP_SHIFT
  331.                       | preBottom << PM_BACKLIGHT_RECOVER_BOTTOM_SHIFT);
  332.         while (PMi_SendSleepStart(param, (u16)(logic | keyPattern)) != PM_SUCCESS)
  333.         {
  334.         }
  335.     }
  336.  
  337.     //==== Halt ================
  338.     OS_Halt();
  339.     //==========================
  340.  
  341.     //---- wait 100ms
  342.     OS_SpinWait(PMi_LCD_POWER_WAIT_TICK);
  343.  
  344.     //---- check card remove
  345.     if ((trigger & PM_TRIGGER_CARD) && (OS_GetRequestIrqMask() & OS_IE_CARD_IREQ))
  346.     {
  347.         powerOffFlag = TRUE;
  348.     }
  349.  
  350.     //---- turn LCD on, and restore gx state
  351.     if (!powerOffFlag)
  352.     {
  353.         if (preLCDPower == PM_LCD_POWER_ON)
  354.         {
  355.             (void)PMi_SetLCDPower(PM_LCD_POWER_ON, PM_LED_ON, TRUE, FALSE);
  356.         }
  357.         else
  358.         {
  359.             (void)PMi_SetLED(PM_LED_ON);
  360.         }
  361.  
  362.         reg_GX_DISPCNT = preGX;
  363.         reg_GXS_DB_DISPCNT = preGXS;
  364.     }
  365.  
  366.     //---- restore all interrupt
  367.     (void)OS_DisableInterrupts();      // CPSR-IRQ  D (IME D in it)
  368.     (void)OS_SetIrqMask(prepIntrMask); // IE        R
  369.     (void)OS_RestoreInterrupts(prepIntrMode);   // CPSR-IRQ  R
  370.     (void)OS_RestoreIrq(prepIrq);      // IME       R
  371.  
  372.     //---- power off if need
  373.     if (powerOffFlag)
  374.     {
  375.         (void)PM_ForceToPowerOff();
  376.     }
  377.  
  378.     //---- call post-callbacks
  379.     PMi_ExecuteList(PMi_PostSleepCallbackList);
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement