PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
memi.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "acmem_internal.h"
12
13acMemT acMemSetup(acMemData *mem, void *buf, int size)
14{
15 if ( mem )
16 {
17 mem->m_buf = buf;
18 mem->m_size = size;
19 mem->m_id = 0;
20 mem->m_attr = 0;
21 }
22 return mem;
23}
24
25int acMemSend(acMemT mem, acMemEEaddr addr, int size, int retry)
26{
27 int m_size;
28 SifDmaTransfer_t dma_data;
29 acSpl state;
30
31 m_size = size;
32 if ( !mem )
33 return -22;
34 if ( mem->m_buf == 0 )
35 {
36 return -14;
37 }
38 if ( mem->m_size < (acUint32)size )
39 m_size = mem->m_size;
40 if ( m_size > 0 )
41 {
42 dma_data.src = mem->m_buf;
43 dma_data.dest = (void *)addr;
44 dma_data.size = m_size;
45 dma_data.attr = 0;
46 while ( 1 )
47 {
48 unsigned int id;
49
50 CpuSuspendIntr(&state);
51 id = sceSifSetDma(&dma_data, 1);
52 CpuResumeIntr(state);
53 if ( id )
54 {
55 mem->m_id = id;
56 return m_size;
57 }
58 DelayThread(100);
59 --retry;
60 if ( retry < 0 )
61 return -116;
62 }
63 }
64 return 0;
65}
66
67int acMemWait(acMemT mem, int threshold, int retry)
68{
69 unsigned int id;
70 int v7;
71 int count;
72 int v9;
73
74 if ( !mem )
75 return -22;
76 id = mem->m_id;
77 v7 = retry + 1;
78 if ( !id )
79 return 0;
80 count = 0;
81 if ( v7 <= 0 )
82 return -116;
83 v9 = v7;
84 while ( sceSifDmaStat(id) >= 0 )
85 {
86 if ( threshold <= 0 )
87 DelayThread(100);
88 else
89 --threshold;
90 if ( ++count >= v9 )
91 return -116;
92 }
93 mem->m_id = 0;
94 return count;
95}
96
97int acMemReceive(acMemT mem, acMemEEaddr addr, int size)
98{
99 void *m_buf;
100 SifRpcReceiveData_t recv_data;
101
102 if ( !mem )
103 return -22;
104 m_buf = mem->m_buf;
105 if ( mem->m_buf == 0 )
106 {
107 return -14;
108 }
109 if ( mem->m_size < (acUint32)size )
110 size = mem->m_size;
111 if ( size > 0 )
112 {
113 mem->m_id = 0;
114 if ( sceSifGetOtherData(&recv_data, (void *)addr, m_buf, size, 0) < 0 )
115 return -5;
116 return size;
117 }
118 return 0;
119}
120
121int acMemModuleStatus()
122{
123 return 0;
124}
125
126int acMemModuleStart(int argc, char **argv)
127{
128 (void)argc;
129 (void)argv;
130
131 return 0;
132}
133
134int acMemModuleStop()
135{
136 return 0;
137}
138
139int acMemModuleRestart(int argc, char **argv)
140{
141 (void)argc;
142 (void)argv;
143
144 return -88;
145}
int CpuResumeIntr(int state)
Definition intrman.c:227
int CpuSuspendIntr(int *state)
Definition intrman.c:205
Definition acmem.h:17
u32 count
start sector of fragmented bd/file