hardware.asm
上传用户:sdjqgc
上传日期:2022-08-06
资源大小:2404k
文件大小:28k
开发平台:

Asm

  1. //========================================================================================
  2. // Progarm: Standard function definition
  3. // Writen by: Andy
  4. // Modifiyed: by Arthur Shieh
  5. //
  6. // Lastest modified date: 
  7. //  2000/06/23: first version
  8. // 2000/07/15: modified
  9. // 2000/07/24: modified for sacmv25.lib
  10. // 2001/10/03: Add more public about queue for sacmv25f.lib
  11. //  2001/11/05: Independent Queue for A2000/S480/MS01 Manual Mode - sacmv25h.lib
  12. // 2001/11/06: Fix volume parameter problem - sacmv25i.lib
  13. //      2002/05/26: Modified the length of C_QueueSize to 144 for DVR usage
  14. //      2005/10/20: Modified for SACMV26e.lib    by Xinqiang Zhang
  15. //
  16. // For: sacmV26e.lib
  17. //
  18. // Note: 
  19. //  1. Don't change this file if possible.
  20. //  2. Update hardware.inc with hardware.asm synchorously
  21. // 3. Provide Open code for sacmV26e.lib
  22. //
  23. //========================================================================================
  24. .PUBLIC F_SP_RampUpDAC1
  25. .PUBLIC F_SP_RampDnDAC1
  26. .PUBLIC F_SP_RampUpDAC2
  27. .PUBLIC F_SP_RampDnDAC2
  28. .PUBLIC _SP_RampUpDAC1 
  29. .PUBLIC _SP_RampDnDAC1 
  30. .PUBLIC _SP_RampUpDAC2 
  31. .PUBLIC _SP_RampDnDAC2 
  32. .PUBLIC _SP_InitQueue
  33. .PUBLIC _SP_InitQueue_A2000
  34. .PUBLIC _SP_InitQueue_S480
  35. .PUBLIC _SP_InitQueue_S240
  36. .PUBLIC _SP_InitQueue_MS01
  37. .PUBLIC _SP_InitQueue_DVR
  38. .PUBLIC F_SP_InitQueue
  39. .PUBLIC F_SP_InitQueue_A2000
  40. .PUBLIC F_SP_InitQueue_S480
  41. .PUBLIC F_SP_InitQueue_S240
  42. .PUBLIC F_SP_InitQueue_MS01
  43. .PUBLIC F_SP_InitQueue_DVR
  44. .PUBLIC F_SP_ReadQueue
  45. .PUBLIC F_SP_ReadQueue_A2000
  46. .PUBLIC F_SP_ReadQueue_S480
  47. .PUBLIC F_SP_ReadQueue_S240
  48. .PUBLIC F_SP_ReadQueue_MS01
  49. .PUBLIC F_SP_ReadQueue_DVR
  50. .PUBLIC F_SP_ReadQueue_NIC // Read Queue with no index change
  51. .PUBLIC F_SP_ReadQueue_NIC_A2000
  52. .PUBLIC F_SP_ReadQueue_NIC_S480
  53. .PUBLIC F_SP_ReadQueue_NIC_S240
  54. .PUBLIC F_SP_ReadQueue_NIC_MS01
  55. .PUBLIC F_SP_ReadQueue_NIC_DVR
  56. .PUBLIC F_SP_WriteQueue
  57. .PUBLIC F_SP_WriteQueue_A2000
  58. .PUBLIC F_SP_WriteQueue_S480
  59. .PUBLIC F_SP_WriteQueue_S240
  60. .PUBLIC F_SP_WriteQueue_MS01
  61. .PUBLIC F_SP_WriteQueue_DVR
  62. .PUBLIC F_SP_TestQueue
  63. .PUBLIC F_SP_TestQueue_A2000
  64. .PUBLIC F_SP_TestQueue_S480
  65. .PUBLIC F_SP_TestQueue_S240
  66. .PUBLIC F_SP_TestQueue_MS01
  67. .PUBLIC F_SP_TestQueue_DVR
  68. .PUBLIC _SP_Export  
  69. .PUBLIC _SP_Import 
  70. .PUBLIC _SP_Init_IOB 
  71. .PUBLIC _SP_Init_IOA 
  72. .PUBLIC _SP_GetResource
  73. .PUBLIC F_SP_GetResource
  74. .PUBLIC F_SP_SACM_A2000_Init_
  75. .PUBLIC F_SP_SACM_S480_Init_
  76. .PUBLIC F_SP_SACM_S240_Init_
  77. .PUBLIC F_SP_SACM_MS01_Init_
  78. .PUBLIC F_SP_PlayMode0_
  79. .PUBLIC F_SP_PlayMode1_    
  80. .PUBLIC F_SP_PlayMode2_  
  81. .PUBLIC F_SP_PlayMode3_   
  82. .PUBLIC F_SP_SACM_DVR_Init_
  83. .PUBLIC F_SP_SACM_DVR_Rec_Init_
  84. .PUBLIC F_SP_SACM_DVR_Play_Init_
  85. //////////////////////////////////////////////////////////////////
  86. // Definitions for I/O Port
  87. //////////////////////////////////////////////////////////////////
  88. .DEFINE P_IOA_Data    0x7000         // Write Data into data register and read from IOA pad
  89. .DEFINE P_IOA_Buffer        0x7001         // Write Data into buffer register and read from buffer register
  90. .DEFINE P_IOA_Dir           0x7002         // Direction vector for IOA
  91. .DEFINE P_IOA_Attrib        0x7003         // Attribute vector for IOA
  92. .DEFINE P_IOA_Latch         0x7004         // Latch PortA data for key change wake-up
  93. .DEFINE P_IOB_Data          0x7005         // Write Data into the data register and read from IOB pad
  94. .DEFINE P_IOB_Buffer        0x7006         // Write Data into buffer register and read from buffer register
  95. .DEFINE P_IOB_Dir           0x7007         // Direction vector for IOB
  96. .DEFINE P_IOB_Attrib        0x7008         // Attribute vector for IOB
  97. .DEFINE P_FeedBack          0x7009         // Clock form external R,C
  98. .DEFINE P_TimerA_Data       0x700A         // Data port for TimerA 
  99. .DEFINE P_TimerA_Ctrl       0x700B         // Control Port for TimerA
  100. .DEFINE P_TimerB_Data       0x700C         // Data port for TimerB
  101. .DEFINE P_TimerB_Ctrl       0x700D         // Control Port for TimerB
  102. .DEFINE P_TimeBase_Setup    0x700E         // TimerBase Freq. Set
  103. .DEFINE P_TimeBase_Clear 0x700F     // Reset Timerbase counter
  104. .DEFINE P_INT_Ctrl          0x7010         // Control port for interrupt source
  105. .DEFINE P_INT_Clear         0x7011         // Clear interrupt source
  106. .DEFINE P_Watchdog_Clear    0x7012         // Watchdog Reset
  107. .DEFINE P_SystemClock       0x7013         // Change system clock frequency(include go to standby mode)
  108. //... PA6442 New version MC52A (For EC-03)....
  109. .DEFINE P_ADC           0x7014          // Data Port for AD
  110. .DEFINE P_ADC_Ctrl          0x7015          // Control Port for AD control
  111. .DEFINE P_ADC_Status        0x7015          // AD Port Status
  112. .DEFINE P_DAC2              0x7016          // Data Port for DAC2
  113. .DEFINE P_PWM               0x7016          // Data Port for PWM
  114. .DEFINE P_DAC1          0x7017          // Data Port for DAC1
  115. .DEFINE P_DAC_Ctrl 0x702A  // Control Port for two DAC and audio output mode
  116. //............................................
  117. .DEFINE P_IR_Ctrl 0x7018  // Control Port for IR
  118. .DEFINE P_LVD_Ctrl          0x7019          // Control Port for LVD
  119. .DEFINE P_SIO_Data 0x701A  // Data port for serial IO
  120. .DEFINE P_SIO_Addr_Low 0x701B  // Address Port low
  121. .DEFINE P_SIO_Addr_Mid 0x701C  // Address Port middle
  122. .DEFINE P_SIO_Addr_High   0x701D  // Address Port high
  123. .DEFINE P_SIO_Ctrl 0x701E  // Control Port
  124. .DEFINE P_SIO_Start 0x701F  // Start port for serial interface
  125. .DEFINE P_SIO_Stop 0x7020  // Stop port for serial interface
  126. .DEFINE P_UART_Command1  0x7021  // Command1 Port for UART
  127. .DEFINE P_UART_Command2  0x7022  // Command2 Port for UART
  128. .DEFINE P_UART_Data  0x7023   // Data Port for UART
  129. .DEFINE P_UART_BaudScalarLow 0x7024  // Set Baud Rate scalar low
  130. .DEFINE P_UART_BaudScalarHigh 0x7025  // Set Baud Rate scalar high
  131. //... Definitions for P_INT_Ctrl ..............
  132. .DEFINE C_IRQ6_TMB2             0x0001          // Timer B IRQ6
  133. .DEFINE C_IRQ6_TMB1             0x0002          // Timer A IRQ6
  134. .DEFINE C_IRQ5_2Hz              0x0004          // 2Hz IRQ5
  135. .DEFINE C_IRQ5_4Hz              0x0008          // 4Hz IRQ5
  136. .DEFINE C_IRQ4_1KHz             0x0010          // 1024Hz IRQ4
  137. .DEFINE C_IRQ4_2KHz             0x0020          // 2048Hz IRQ4
  138. .DEFINE C_IRQ4_4KHz             0x0040          // 4096Hz IRQ4
  139. .DEFINE C_IRQ3_KEY              0x0080          // Key Change IRQ3
  140. .DEFINE C_IRQ3_EXT1             0x0100          // Ext1 IRQ3
  141. .DEFINE C_IRQ3_EXT2             0x0200          // Ext2 IRQ3
  142. .DEFINE C_IRQ2_TMB              0x0400          // Timer B IRQ2
  143. .DEFINE C_FIQ_TMB               0x0800          // Timer B FIQ
  144. .DEFINE C_IRQ1_TMA              0x1000          // Timer A IRQ1
  145. .DEFINE C_FIQ_TMA               0x2000          // Timer A FIQ
  146. .DEFINE C_IRQ0_PWM              0x4000          // PWM IRQ0
  147. .DEFINE C_FIQ_PWM               0x8000          // PWM FIQ
  148. // Definitions for P_TimerA/B_Ctrl ............                               
  149. .DEFINE C_Fosc_2 0x0000  // 
  150. .DEFINE C_Fosc_256      0x0001  //
  151. .DEFINE C_32768Hz 0x0002  //
  152. .DEFINE C_8192Hz 0x0003  //
  153. .DEFINE C_4096Hz 0x0004  //
  154. .DEFINE C_A1 0x0005  //
  155. .DEFINE C_A0 0x0006  //
  156. .DEFINE C_Ext1 0x0007  //
  157. .DEFINE C_2048Hz 0x0000  //
  158. .DEFINE C_1024Hz 0x0008  //
  159. .DEFINE C_256Hz 0x0010  //
  160. .DEFINE C_TMB1Hz 0x0018  //
  161. .DEFINE C_4Hz 0x0020  //
  162. .DEFINE C_2Hz 0x0028  //
  163. .DEFINE C_B1 0x0030  //
  164. .DEFINE C_Ext2 0x0038  //
  165. .DEFINE C_Off 0x0000  //
  166. .DEFINE C_D1 0x0040  //
  167. .DEFINE C_D2 0x0080  //
  168. .DEFINE C_D3 0x00C0  //
  169. .DEFINE C_D4 0x0100  //
  170. .DEFINE C_D5 0x0140  //
  171. .DEFINE C_D6 0x0180  //
  172. .DEFINE C_D7 0x01C0  //
  173. .DEFINE C_D8 0x0200  //
  174. .DEFINE C_D9 0x0240  //
  175. .DEFINE C_D10 0x0280  //
  176. .DEFINE C_D11 0x02C0  //
  177. .DEFINE C_D12 0x0300  //
  178. .DEFINE C_D13 0x0340  //
  179. .DEFINE C_D14 0x0380  //
  180. .DEFINE C_TA_Div_2 0x03C0  // Timer A
  181. .DEFINE C_TB_Div_2 0x03C0  // Timer B
  182. //... Definition for P_SystemClock ............
  183. .DEFINE C_Fosc 0x0000  // b3..b0
  184. .DEFINE C_Fosc_Div_2 0x0001  //
  185. .DEFINE C_Fosc_Div_4 0x0002  //
  186. .DEFINE C_Fosc_Div_8 0x0003  // (default)
  187. .DEFINE C_Fosc_Div_16 0x0004  //
  188. .DEFINE C_Fosc_Div_32 0x0005  //
  189. .DEFINE C_Fosc_Div_64 0x0006  //
  190. .DEFINE C_Sleep 0x0007    //
  191. .DEFINE C_32K_Work 0x0000  // b4
  192. .DEFINE C_32K_Off 0x0000  // 
  193. .DEFINE C_StrongMode 0x0000  // b5
  194. .DEFINE C_AutoMode 0x0000  //
  195. //... Define for P_AD_Ctrl ....................
  196. .DEFINE C_AD 0x0001  //
  197. .DEFINE C_DA 0x0000  //
  198. .DEFINE C_MIC 0x0000  //
  199. .DEFINE C_LINE 0x0002  //
  200. //... Define for P_DA_Ctrl ....................
  201. .DEFINE C_PushPull 0x0000  // b0, (default) 
  202. .DEFINE C_DoubleEnd 0x0001  // b0
  203. .DEFINE C_DAC_Mode 0x0000  // b1, (default)
  204. .DEFINE C_PWM_Mode 0x0002  // b1
  205. .DEFINE C_D1_Direct 0x0000  // DAC1 latch
  206. .DEFINE C_D1_LatchA 0x0008  // 
  207. .DEFINE C_D1_LatchB 0x0010  //
  208. .DEFINE C_D1_LatchAB 0x0018  //
  209. .DEFINE C_D2_Direct 0x0000  // DAC2 latch
  210. .DEFINE C_D2_LatchA 0x0020  // 
  211. .DEFINE C_D2_LatchB 0x0040  //
  212. .DEFINE C_D2_LatchAB 0x00C0  //
  213. //... Define for P_LVD_Ctrl ...................
  214. .DEFINE C_LVD24V 0x0000  // LVD = 2.4V 
  215. .DEFINE C_LVD28V 0x0001  // LVD = 2.8V
  216. .DEFINE C_LVD32V 0x0002  // LVD = 3.2V
  217. .DEFINE C_LVD36V 0x0003  // LVD = 3.6V
  218. /////////////////////////////////////////////////////////////////
  219. // Note: This register map to the P_INT_Ctrl(0x7010)
  220. //  User's interrupt setting have to combine with this register 
  221. // while co-work with SACM library.
  222. //
  223. //  See. following function for example:
  224. // F_SP_SACM_A2000_Init_:
  225. // F_SP_SACM_S480_Init_:
  226. // F_SP_SACM_S240_Init_:
  227. // F_SP_SACM_MS01_Init_:
  228. // F_SP_SACM_DVR_Init_: 
  229. //////////////////////////////////////////////////
  230. .IRAM
  231. .PUBLIC R_InterruptStatus 
  232. .VAR R_InterruptStatus = 0  // 
  233. //////////////////////////////////////////////////
  234. .DEFINE C_RampDelayTime 32
  235. .DEFINE C_QueueSize 144
  236. .VAR  R_Queue 
  237. .DW C_QueueSize-1 DUP(0) 
  238. .VAR R_ReadIndex 
  239. .VAR R_WriteIndex 
  240. .CODE
  241. ///////////////////////////////////////////
  242. // Function: Initial Queue
  243. // Destory: R1,r2
  244. ///////////////////////////////////////////
  245. _SP_InitQueue: .PROC
  246. _SP_InitQueue_A2000:
  247. _SP_InitQueue_S480:
  248. _SP_InitQueue_S240:
  249. _SP_InitQueue_MS01:
  250. _SP_InitQueue_DVR:
  251. F_SP_InitQueue_A2000:
  252. F_SP_InitQueue_S480:
  253. F_SP_InitQueue_S240:
  254. F_SP_InitQueue_MS01:
  255. F_SP_InitQueue_DVR:
  256. F_SP_InitQueue:
  257. r1 = R_Queue
  258. r2 = 0 
  259. L_ClearQueueLoop?:
  260. [r1++] = r2
  261. cmp r1, R_Queue+C_QueueSize
  262. jne L_ClearQueueLoop?
  263. r1 = 0
  264. [R_ReadIndex] = r1
  265. [R_WriteIndex] = r1
  266. RETF
  267. .ENDP
  268. ///////////////////////////////////////////
  269. // Function: Get a data form Queue
  270. // Output:  R1: Data
  271. // R2: return value
  272. // Destory: R1,R2
  273. ///////////////////////////////////////////
  274. F_SP_ReadQueue_A2000:
  275. F_SP_ReadQueue_S480:
  276. F_SP_ReadQueue_S240:
  277. F_SP_ReadQueue_MS01:
  278. F_SP_ReadQueue_DVR:
  279. F_SP_ReadQueue:
  280. r2 = [R_ReadIndex]
  281. cmp r2,[R_WriteIndex]
  282. je L_RQ_QueueEmpty
  283. r2 += R_Queue // get queue data address
  284. r1 = [r2]
  285. r2 = [R_ReadIndex]
  286. r2 += 1
  287. cmp r2, C_QueueSize
  288. jne L_RQ_NotQueueBottom
  289. r2 = 0
  290. L_RQ_NotQueueBottom:
  291. [R_ReadIndex] = r2
  292. //r2 = 0x0000  // get queue data
  293. retf 
  294. L_RQ_QueueEmpty:
  295. //r2 = 0x8000  // queue empty
  296. retf 
  297. ///////////////////////////////////////////
  298. // Function: Get a data from Queue but do 
  299. // not change queue index
  300. // R1: output
  301. // Destory: R1,R2
  302. ///////////////////////////////////////////
  303. F_SP_ReadQueue_NIC:
  304. F_SP_ReadQueue_NIC_A2000:
  305. F_SP_ReadQueue_NIC_S480:
  306. F_SP_ReadQueue_NIC_S240:
  307. F_SP_ReadQueue_NIC_MS01:
  308. F_SP_ReadQueue_NIC_DVR:
  309. r2 = [R_ReadIndex]
  310. cmp r2,[R_WriteIndex]
  311. je L_RQ_QueueEmpty?
  312. r2 += R_Queue // get queue data index
  313. r1 = [r2]
  314. L_RQ_QueueEmpty?:
  315. RETF
  316. ///////////////////////////////////////////
  317. // Function: Put a data to Queue
  318. // R1: Input
  319. // Destory: R1,R2
  320. ///////////////////////////////////////////
  321. F_SP_WriteQueue_A2000:
  322. F_SP_WriteQueue_S480:
  323. F_SP_WriteQueue_S240:
  324. F_SP_WriteQueue_MS01:
  325. F_SP_WriteQueue_DVR:
  326. F_SP_WriteQueue:
  327. r2 = [R_WriteIndex]  // put data to queue
  328. r2 += R_Queue
  329. [r2] = r1
  330. r2 = [R_WriteIndex]
  331. r2 += 1
  332. cmp r2, C_QueueSize
  333. jne L_WQ_NotQueueBottom
  334. r2 = 0
  335. L_WQ_NotQueueBottom:
  336. [R_WriteIndex] = r2
  337. RETF
  338. ///////////////////////////////////////////
  339. // Function: Test Queue Status
  340. // o/p: R1
  341. // Destory: R1
  342. ///////////////////////////////////////////
  343. F_SP_TestQueue_A2000:
  344. F_SP_TestQueue_S480:
  345. F_SP_TestQueue_S240:
  346. F_SP_TestQueue_MS01:
  347. F_SP_TestQueue_DVR:
  348. F_SP_TestQueue:
  349. //... Test Queue Empty ...
  350. r1 = [R_ReadIndex] 
  351. cmp r1,[R_WriteIndex] 
  352. je L_TQ_QueueEmpty 
  353. //... Test Queue Full ...
  354. r1 = [R_ReadIndex]  // For N Queue Full: 1.R=0 and W=N-1 2. R<>0 and W=R-1 
  355. jnz L_TQ_JudgeCond2 
  356. r1 = [R_WriteIndex] 
  357. cmp r1, C_QueueSize-1  // Cond1
  358. je L_TQ_QueueFull 
  359. L_TQ_JudgeCond2:
  360. r1 = [R_ReadIndex] 
  361. r1 -=1 
  362. cmp r1,[R_WriteIndex] 
  363. je L_TQ_QueueFull 
  364. r1 = 0  // not Full, not empty
  365. retf 
  366. L_TQ_QueueFull:
  367. r1 = 1  // full
  368. retf 
  369. L_TQ_QueueEmpty:
  370. r1 = 2  // empty
  371. retf 
  372. ///////////////////////////////////////////////////////////////////////////////
  373. // Function: The partial code of hardware setting of SACM_A2000_Initial() 
  374. // or F_SACM_A2000_Initial:
  375. // Note: The following functions are the partial code of original
  376. // initial subroutine. (H/W setting part) 
  377. //
  378. // Ex: F_SACM_A2000_Initial:
  379. // ...
  380. // call F_SP_SACM_A2000_Init_ : S480/S240/MS01 is same
  381. // ...
  382. // retf
  383. ////////////////////////////////////////////////////////////////////////////////
  384. F_SP_SACM_A2000_Init_:
  385. r1=0x0000;                      // 24MHz, Fcpu=Fosc
  386.         [P_SystemClock]=r1            //  Frequency 20MHz
  387.         r1 = 0x0030                     // TimerA CKA=Fosc/2 CKB=1 Tout:off
  388.         [P_TimerA_Ctrl] = r1 // Initial Timer A
  389.         r1 = 0xfd00                   // 16K
  390.         [P_TimerA_Data] = r1 
  391.         r1 = 0x00A8                     // Set the DAC Ctrl
  392.         [P_DAC_Ctrl] = r1
  393.         r1 = 0xffff
  394.         
  395.         [P_INT_Clear] = r1           // Clear interrupt occuiped events
  396.         r1 =0x0000 // 
  397.         
  398.         
  399.         r1 = [R_InterruptStatus] //
  400.         r1 |= C_FIQ_TMA // Enable Timer A FIQ
  401.         //R1 |= C_IRQ4_1KHz
  402.         [R_InterruptStatus] = r1 //
  403.         [P_INT_Ctrl] = r1 //
  404. RETF
  405. //////////////////////////////////////////////////////////////////
  406. // Function: The partial code of hardware setting of SACM_S480_Initial() 
  407. // or F_SACM_S480_Initial:
  408. //////////////////////////////////////////////////////////////////
  409. F_SP_SACM_S480_Init_:
  410.         r1 = 0x0000 // 24MHz Fosc
  411.         [P_SystemClock]=r1           // Initial System Clock
  412.         r1=0x0030                       // TimerA CKA=Fosc/2 CKB=1 Tout:off
  413.         [P_TimerA_Ctrl]=r1 // Initial Timer A
  414.         //R1 = 0xfd00                   // 16K
  415.         r1 = 0xfced // 15.625K
  416.         [P_TimerA_Data]=r1
  417.         r1 = 0x00A8 // 
  418.         [P_DAC_Ctrl] = r1 //
  419.         
  420.         r1 = 0xffff
  421.         [P_INT_Clear] = r1           // Clear interrupt occuiped events
  422.         R1 = [R_InterruptStatus] //
  423.         r1 |= C_FIQ_TMA // Enable Timer A FIQ
  424.         //R1 |= C_IRQ4_1KHz // Enable 1KHz IRQ4 for S480 decoder
  425.         [R_InterruptStatus] = r1 //
  426.         [P_INT_Ctrl] = r1 //
  427.         
  428.         RETF
  429. //////////////////////////////////////////////////////////////////
  430. // Function: The partial code of hardware setting of SACM_S240_Initial() 
  431. // or F_SACM_S240_Initial:
  432. //////////////////////////////////////////////////////////////////
  433. F_SP_SACM_S240_Init_:
  434. r1=0x0020;
  435. [P_SystemClock]=r1
  436. r1 = 0x00A8; // 
  437. [P_DAC_Ctrl]= r1
  438. r1 = 0x0030;                // TimerA CKA=Fosc/2 CKB=1 Tout:off
  439.         [P_TimerA_Ctrl] = r1;
  440. r1 = 0xfe00;                    // 24K
  441.      [P_TimerA_Data] = r1;
  442.         r1 = 0xffff
  443.         [P_INT_Clear] = r1           // Clear interrupt occuiped events
  444.         r1 = [R_InterruptStatus] //
  445.         r1 |= C_FIQ_TMA // Enable Timer A FIQ
  446.         [R_InterruptStatus] = r1 //
  447.         [P_INT_Ctrl] = r1 //
  448.         RETF
  449. //////////////////////////////////////////////////////////////////
  450. // Function: The partial code of hardware setting of SACM_MS01_Initial() 
  451. // or F_SACM_MS01_Initial:
  452. //
  453. // Ex: F_SACM_MS01_Initial:
  454. // ...
  455. // call F_SP_SACM_MS01_Init_
  456. // call F_SP_Play_Mode0/1/2/3 ->0,1,2,3 depending on the para1
  457. // ...
  458. // retf
  459. //////////////////////////////////////////////////////////////////
  460. F_SP_SACM_MS01_Init_:
  461. r1 = 0x0000;                    // 24MHz, Fcpu=Fosc
  462.         [P_SystemClock] = r1;         // Initial System Clock
  463.         r1 = 0x0030;                    // TimerA CKA=Fosc/2 CKB=1 Tout:off
  464.         [P_TimerA_Ctrl] = r1 // Initial Timer A
  465.         
  466.         //R1 = 0x0003 // 8K
  467.         r1 = 0x0000 // Fosc/2
  468.         [P_TimerB_Ctrl] = r1; // Initial Timer B -> 8192
  469.         
  470.         //R1 = 0xFFFF        
  471.         r1 = 0xFA00 // Any time for ADPCM channel 0,1
  472.         [P_TimerB_Data] = r1 // 8K sample rate
  473.         
  474. r1 = 0xffff
  475.         [P_INT_Clear] = r1           // Clear interrupt occuiped events
  476.         RETF
  477. //........................................
  478. F_SP_PlayMode0_: // with F_SP_SACM_MS01_Initial
  479. r1 = 0x0006
  480.         [P_DAC_Ctrl] = r1
  481.         r1 = 0xFE00
  482.         [P_TimerA_Data] = r1  //
  483.         r1 = [R_InterruptStatus]  //
  484.         r1 |= C_FIQ_PWM+C_IRQ2_TMB+C_IRQ4_1KHz
  485.         [R_InterruptStatus] = r1  //
  486.         [P_INT_Ctrl] = r1 //
  487.         RETF
  488. F_SP_PlayMode1_: // with F_SP_SACM_MS01_Initial
  489. r1 = 0x00A8
  490.         [P_DAC_Ctrl] = r1
  491.         r1 = 0xFE00
  492.         [P_TimerA_Data] = r1  //
  493.         r1 = [R_InterruptStatus]  //
  494.         r1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
  495.         [R_InterruptStatus] = r1  //
  496.         [P_INT_Ctrl] = r1 //
  497.         RETF
  498. F_SP_PlayMode2_:   // with F_SP_SACM_MS01_Initial
  499. r1 = 0x00A8
  500.         [P_DAC_Ctrl] = r1
  501.         r1 = 0xFD9A
  502.         [P_TimerA_Data] = r1  //
  503.         r1 = [R_InterruptStatus]  //
  504.         r1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
  505.         [R_InterruptStatus] = r1  //
  506.         [P_INT_Ctrl] = r1 //
  507.         RETF
  508.       
  509. F_SP_PlayMode3_: // with F_SP_SACM_MS01_Initial
  510. r1 = 0x00A8
  511.         [P_DAC_Ctrl] = r1
  512.         r1 = 0xFD00
  513.         [P_TimerA_Data] = r1  //
  514.         r1 = [R_InterruptStatus]  //
  515.         r1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
  516.     [R_InterruptStatus] = r1  //
  517.         [P_INT_Ctrl] = r1 //
  518.         RETF
  519.         
  520. ///////////////////////////////////////////////////////////////////////////////
  521. // Function: The partial code of hardware setting of SACM_MS01_Initial() 
  522. // or F_SACM_MS01_Initial:
  523. //
  524. // Ex: F_SACM_DVR_Initial:
  525. // ...
  526. // call F_SP_SACM_DVR_Init_
  527. // call F_SP_Play_Mode0/1/2/3 ->0,1,2,3 depending on the para1
  528. // ...
  529. // retf
  530. // Ex1:
  531. // F_SACM_DVR_Record: (or F_SACM_DVR_InitEncoder)
  532. // ...
  533. // call F_SP_SACM_DVR_Rec_Init
  534. // ...
  535. // retf
  536. // Ex2:
  537. // F_SACM_DVR_Play: (or F_SACM_DVR_InitDecoder)
  538. // ...
  539. // call F_SP_SACM_DVR_Play_Init_
  540. // ...
  541. // retf
  542. ///////////////////////////////////////////////////////////////////////////////
  543. F_SP_SACM_DVR_Init_:
  544.         r1 = 0x0000;                    // 24MHz, Fcpu=Fosc
  545.         [P_SystemClock] = r1;           //  Frequency 20MHz
  546.         r1 = 0x0030;                    // TimerA CKA=Fosc/2 CKB=1 Tout:off
  547.         [P_TimerA_Ctrl] = r1;
  548.         r1 = 0xfa00;                    // 8K @ 24.576MHz
  549.         //r1 = 0xfb1d;                  // 8K @ 20MHz
  550.         [P_TimerA_Data] = r1;
  551.         r1 = 0x0035;                    // ADINI should be open (107)
  552.         [P_ADC_Ctrl] = r1;
  553.         r1 = 0x00A8;                    // Set the DA Ctrl
  554.         [P_DAC_Ctrl] = r1;
  555.         
  556.         r1 = 0xffff;
  557.         [P_INT_Clear] = r1;           // Clear interrupt occuiped events
  558.         
  559.         r1 = [R_InterruptStatus] //
  560.         r1 |= C_FIQ_TMA // Enable Timer A FIQ
  561.         [R_InterruptStatus] = r1 //
  562.         [P_INT_Ctrl] = r1 //
  563.         
  564.         RETF
  565. F_SP_SACM_DVR_Rec_Init_: // call by SACM_DVR_Record / SACM_DVR_InitEncoder
  566. r1 = 0x0035;   //mic input
  567.         //r1 = 0x0037 //line_in input
  568.         [P_ADC_Ctrl] = r1;        //enable ADC
  569.         
  570.         r1=0xfe00;                      //24K @ 24.576MHz
  571.         [P_TimerA_Data] = r1 
  572. RETF
  573. F_SP_SACM_DVR_Play_Init_:
  574.     r1 = 0x0000 // call by SACM_DVR_Stop / SACM_DVR_Play
  575.         [P_ADC_Ctrl] = r1;        // Disable ADC
  576.         
  577.         r1 = 0xfd00;                 // 16K @ 24.576MHz
  578.         [P_TimerA_Data] = r1;
  579.         RETF
  580. /////////////////////////////////////////////////////////////////////////////// 
  581. // Function: Extra Functions provided by Sunplus
  582. // Type:
  583. // 1. DAC Ramp up/down
  584. // 2. IO config/import/export
  585. // 3. Get resource data
  586. //
  587. //
  588. ///////////////////////////////////////////////////////////////////////////////
  589. ////////////////////////////////////////////////////////
  590. // Function: Ramp Up/Down to avoid speaker "pow" noise
  591. // Destory: R1,R2
  592. ////////////////////////////////////////////////////////
  593. _SP_RampUpDAC1: .PROC
  594. F_SP_RampUpDAC1:
  595. push r1,r2 to [sp] 
  596.         r1=[P_DAC1] 
  597.         r1 &= ~0x003f 
  598.         cmp     r1,0x8000
  599.         jb      L_RU_NormalUp
  600.         je      L_RU_End
  601.                 
  602. L_RU_DownLoop:
  603.         call    F_Delay         
  604.         r2 = 0x0001 
  605.         [P_Watchdog_Clear] = r2 
  606.         r1 -= 0x40 
  607.         [P_DAC1] = r1 
  608.         cmp     r1,0x8000 
  609.         jne     L_RU_DownLoop   
  610. L_RD_DownEnd:
  611.         jmp     L_RU_End 
  612. L_RU_NormalUp:
  613. L_RU_Loop:
  614.         call    F_Delay 
  615.         r2 = 0x0001 
  616.         [P_Watchdog_Clear] = r2 
  617.         r1 += 0x40 
  618.         [P_DAC1] = r1 
  619.         cmp     r1, 0x8000 
  620.         jne     L_RU_Loop 
  621. L_RU_End:
  622. pop     r1,r2 from [sp] 
  623.    retf 
  624.      .ENDP
  625.     
  626. //............................................................
  627. _SP_RampDnDAC1: .PROC
  628. F_SP_RampDnDAC1:
  629. push r1,r2 to [sp] 
  630.    //int off 
  631.      r1 = [P_DAC1] 
  632.       r1 &= ~0x003F 
  633.        jz      L_RD_End 
  634. L_RD_Loop:                
  635.         call    F_Delay         
  636.         r2 = 0x0001 
  637.         [P_Watchdog_Clear] = r2 
  638.         r1 -= 0x40 
  639.         [P_DAC1] = r1   
  640.         jnz     L_RD_Loop 
  641. L_RD_End:       
  642. //int fiq,irq
  643.         pop     r1,r2 from [sp] 
  644.         retf 
  645. .ENDP
  646. //..............................................................
  647. _SP_RampUpDAC2: .PROC
  648. F_SP_RampUpDAC2:
  649. push r1,r2 to [sp] 
  650.    r1=[P_DAC2] 
  651.      r1 &= ~0x003f 
  652.       cmp     r1,0x8000
  653.        jb      L_RU_NormalUp_   
  654.         je      L_RU_End 
  655.                 
  656. L_RU_DownLoop_:
  657.         call    F_Delay         
  658.         r2 = 0x0001 
  659.         [P_Watchdog_Clear] = r2 
  660.         r1 -= 0x40 
  661.         [P_DAC2] = r1 
  662.         cmp     r1,0x8000 
  663.         jne     L_RU_DownLoop_   
  664. L_RD_DownEnd_:
  665.         jmp     L_RU_End_ 
  666. L_RU_NormalUp_:
  667. L_RU_Loop_:
  668. call    F_Delay 
  669.    r2 = 0x0001 
  670.      [P_Watchdog_Clear] = r2 
  671.         r1 += 0x40 
  672.         [P_DAC2] = r1 
  673.         cmp     r1, 0x8000 
  674.         jne     L_RU_Loop_ 
  675. L_RU_End_:
  676.     pop     r1,r2 from [sp] 
  677.       retf 
  678.        .ENDP
  679. //.............................................................
  680. _SP_RampDnDAC2: .PROC
  681. F_SP_RampDnDAC2:
  682. //int off 
  683. push r1,r2 to [sp] 
  684.                 
  685.         r1 = [P_DAC2] 
  686.         r1 &= ~0x003F 
  687.         jz      L_RD_End_ 
  688. L_RD_Loop_:                
  689.         call    F_Delay         
  690.         r2 = 0x0001 
  691.         [P_Watchdog_Clear] = r2 
  692.         r1 -= 0x40 
  693.         [P_DAC2] = r1   
  694.         jnz     L_RD_Loop_ 
  695. L_RD_End_:       
  696.         pop     r1,r2 from [sp] 
  697.         retf 
  698. .ENDP
  699. //..................................................................
  700. F_Delay:
  701.         push r1 to [sp] 
  702.         r1 = C_RampDelayTime // Ramp Up/Dn delay per step
  703. L_D_Loop:
  704.         r1 -= 1 
  705.         jnz     L_D_Loop  
  706.         pop     r1 from [sp] 
  707.         RETF  
  708. ////////////////////////////////////////////////////////////////
  709. // Function: I/O Port A configuration
  710. //  void SP_Inti_IOA(int Dir, int Data, int Attrib)
  711. ////////////////////////////////////////////////////////////////
  712. _SP_Init_IOA: .PROC
  713. PUSH bp TO [sp] 
  714.         bp = sp + 1 
  715. PUSH r1 TO [sp] 
  716. r1 = [bp+3]  // Port direction
  717. [P_IOA_Dir] = r1 
  718. r1 = [bp+4] 
  719. [P_IOA_Data] = r1 
  720. r1 = [bp+5] 
  721. [P_IOA_Attrib] = r1 
  722. POP r1 FROM [sp] 
  723.         POP bp FROM [sp] 
  724.         RETF 
  725. .ENDP
  726. ////////////////////////////////////////////////////////////////// 
  727. // Function: I/O Port B configuration
  728. //  void SP_Inti_IOB(int Dir, int Data, int Attrib)
  729. //////////////////////////////////////////////////////////////////    
  730. _SP_Init_IOB: .PROC
  731. PUSH bp TO [sp] 
  732.         bp = sp + 1 
  733. PUSH r1 TO [sp] 
  734. r1 = [bp+3]  // Port direction
  735. [P_IOB_Dir] = r1 
  736. r1 = [bp+4] 
  737. [P_IOB_Data] = r1 
  738. r1 = [bp+5] 
  739. [P_IOB_Attrib] = r1 
  740. POP r1 FROM [sp] 
  741.         POP bp FROM [sp] 
  742.         RETF 
  743. .ENDP
  744. ////////////////////////////////////////////////////////////////// 
  745. // Function: Get data from port
  746. //  int SP_Import(unsigned int Port)
  747. //////////////////////////////////////////////////////////////////  
  748. _SP_Import: .PROC
  749.         PUSH bp TO [sp] 
  750.         bp = sp + 1 
  751.         
  752. r1 = [bp+3]   // Port Number
  753. r1 = [r1]  
  754.         POP bp FROM [sp] 
  755.         RETF 
  756. .ENDP
  757. _SP_Export: .PROC
  758.         PUSH bp,bp TO [sp] 
  759.         sp = sp + 1 
  760. PUSH r1,r2 TO [sp] 
  761. r1 = [bp+3]   // Port Number
  762. r2 = [bp+4]   // Value
  763. [r1] = r2  
  764. POP r1,r2 FROM [sp] 
  765.         POP bp,bp FROM [sp] 
  766.         RETF         
  767.   .ENDP
  768. ////////////////////////////////////////////////////////////////// 
  769. // Function: Get data from resource(ROM area)
  770. //  int SP_GetResource(int Addr, int Page)
  771. //////////////////////////////////////////////////////////////////  
  772. _SP_GetResource: .PROC
  773. push bp to [sp] 
  774. bp = sp + 1 
  775. r1 = [bp+3]  // Address
  776. r2 = [bp+4]  // Page
  777. r2 = r2 lsl 4  // Prepare Page for SR
  778. r2 = r2 lsl 4 
  779. r2 = r2 lsl 2 
  780. sr &= 0x03f  // Change Page
  781.         r2 |=sr  //
  782.         sr = r2  //
  783.   
  784.    r1 = D:[r1]  // Get data
  785.        
  786. pop  bp from [sp] 
  787. retf 
  788. .ENDP 
  789. //........................................
  790. F_SP_GetResource:
  791. r2 = r2 lsl 4  // Prepare Page for SR
  792. r2 = r2 lsl 4 
  793. r2 = r2 lsl 2 
  794. sr &= 0x03f  // Change Page
  795.         r2 |=sr  //
  796.         sr = r2  //
  797.   
  798.    r1 = D:[r1]  // Get data
  799.    retf
  800. //////////////////////////////////////////////////////////////////
  801. // Functions: Reserve old defintion
  802. // Note:  1. Some user who use old library may use the old name
  803. // 2. Have to be put at the end of this file
  804. //////////////////////////////////////////////////////////////////
  805. .PUBLIC F_RampUpDAC1 
  806. .PUBLIC F_RampDnDAC1 
  807. .PUBLIC F_RampUpDAC2 
  808. .PUBLIC F_RampDnDAC2 
  809. .PUBLIC _STD_RampUpDAC1 
  810. .PUBLIC _STD_RampDnDAC1 
  811. .PUBLIC _STD_RampUpDAC2 
  812. .PUBLIC _STD_RampDnDAC2 
  813. .DEFINE F_RampUpDAC1 F_SP_RampUpDAC1
  814. .DEFINE F_RampDnDAC1 F_SP_RampDnDAC1
  815. .DEFINE F_RampUpDAC2 F_SP_RampUpDAC2
  816. .DEFINE F_RampDnDAC2 F_SP_RampDnDAC2
  817. .DEFINE _STD_RampUpDAC1 _SP_RampUpDAC1
  818. .DEFINE _STD_RampDnDAC1 _SP_RampDnDAC1
  819. .DEFINE _STD_RampUpDAC2 _SP_RampUpDAC2
  820. .DEFINE _STD_RampDnDAC2 _SP_RampDnDAC2
  821. ///////////////////////////////////////////////////////////////////
  822.                 
  823. //========================================================================================        
  824. // End of hardware.asm
  825. //========================================================================================
  826.         
  827.         
  828.