11#include "acmeme_internal.h"
16static meme_ops_t ops_48[3] = {NULL, &meme_op_init, &meme_op_xfer};
19static int meme_jv_read(acMemAddr addr,
void *buf,
int size)
21 return acJvRead(addr, buf, size);
24static int meme_jv_write(acMemAddr addr,
void *buf,
int size)
26 return acJvWrite(addr, buf, size);
29static void meme_ram_done(
acRamT ram,
struct meme_ram *arg,
int result)
38 arg->mr_result = result;
44static int meme_ram_read(acMemAddr addr,
void *buf,
int size)
51 mram_data.mr_thid = GetThreadId();
52 mram_data.mr_result = 0;
53 ret = acRamSetup(&mram_data.mr_ram, (acRamDone)meme_ram_done, &mram_data, 1000000);
54 ret_v1 = acRamRead(ret, addr, buf, size);
60 while ( thid == mram_data.mr_thid )
62 return mram_data.mr_result;
65static int meme_ram_write(acMemAddr addr,
void *buf,
int size)
71 mram_data.mr_thid = GetThreadId();
72 mram_data.mr_result = 0;
73 ret_v1 = acRamWrite(acRamSetup(&mram_data.mr_ram, (acRamDone)meme_ram_done, &mram_data, 1000000), addr, buf, size);
79 while ( thid == mram_data.mr_thid )
81 return mram_data.mr_result;
84int meme_sram_read(acMemAddr addr,
void *buf,
int size)
86 return acSramRead(addr, buf, size);
89int meme_sram_write(acMemAddr addr,
void *buf,
int size)
91 return acSramWrite(addr, buf, size);
105 mv_size = mvec->mv_size;
107 dst = mvec->mv_dst & 0xFFFFFFE;
108 src = mvec->mv_src & 0xFFFFFFE;
109 acMemSetup(&mem_data, buf, memec->size);
110 for ( ; mv_size > 0; dst += v11 )
114 v10 = acMemReceive(&mem_data, src, mv_size);
119 v5 = xfer(dst, buf, v10);
125 mvec->mv_result = mvec->mv_size - mv_size;
139 mv_size = mvec->mv_size;
140 dst = mvec->mv_dst & 0xFFFFFFE;
141 for ( src = (acUint8 *)(mvec->mv_src & 0xFFFFFFE); mv_size > 0; src += v9 )
144 if ( mv_size <= 0x20000 )
146 ret = xfer(dst, src, v9);
152 mvec->mv_result = mvec->mv_size - mv_size;
162 meme_xfer_t xfer_src;
164 meme_xfer_t xfer_dst;
198 acMemSetup(&mem_data, memec->mvec, 256);
210 v6 = acMemReceive(&mem_data, (acMemEEaddr)addr, 16 * v5);
215 buf_vectors = v6 >> 4;
216 while ( pos_v35 < buf_vectors )
218 mvec = &memec->mvec[pos_v35];
219 v8 = memec->mvec[pos_v35].mv_src & 0xF0000000;
220 if ( v8 == 1342177280 )
222 xfer_src = meme_sram_read;
224 else if ( v8 > 0x50000000 )
227 if ( v8 == 0x60000000 )
228 xfer_src = meme_jv_read;
233 if ( v8 == 0x40000000 )
234 xfer_src = meme_ram_read;
236 v10 = memec->mvec[pos_v35].mv_dst & 0xF0000000;
237 if ( v10 == 0x50000000 )
239 xfer_dst = meme_sram_write;
241 else if ( v10 > 0x50000000 )
244 if ( v10 == 0x60000000 )
245 xfer_dst = meme_jv_write;
250 if ( v10 == 0x40000000 )
251 xfer_dst = meme_ram_write;
259 mvec->mv_result = -134;
268 mvec->mv_result = -134;
274 if ( !memec->mvec[pos_v35].mv_size )
282 mv_dst = memec->mvec[pos_v35].mv_dst;
284 if ( (mv_dst & 1) != 0 )
286 dst = (acUint8 *)(mv_dst & v40);
287 mv_size = memec->mvec[pos_v35].mv_size;
288 for ( src = memec->mvec[pos_v35].mv_src & v40; mv_size > 0; src += ret_v14 )
291 if ( mv_size <= 0x20000 )
293 v14 = xfer_src(src, dst, ret_v14);
300 mvec->mv_result = mvec->mv_size - mv_size;
304 dst_v15 = mv_dst & v40;
305 src_v16 = memec->mvec[pos_v35].mv_src & v40;
307 buf = (acUint8 *)memec->buf;
308 bsize = (memec->size / 2) & 0xFFFFFFFC;
309 acMemSetup(mem_data_v29, buf, bsize);
310 acMemSetup(&mem_data_v29[1], &buf[bsize], bsize);
312 for ( ret = 0; v23 > 0; dst_v15 += v27 )
317 ret = xfer_src(src_v16, &buf[pos], xlen);
322 v25 = &mem_data_v29[1];
323 ret = acMemWait(v25, 100, 110);
326 size_v22 = mem_data_v29;
328 size_v22 = &mem_data_v29[1];
329 v27 = acMemSend(size_v22, dst_v15, xlen, 10);
337 size_v24 = mem_data_v29;
339 size_v24 = &mem_data_v29[1];
340 acMemWait(size_v24, 100, 110);
341 mvec->mv_result = mvec->mv_size - v23;
346 if ( (memec->mvec[pos_v35].mv_src & 1) != 0 )
348 ret = meme_xfer_ioptodev(memec, &memec->mvec[pos_v35], xfer_dst);
352 v12 = meme_xfer_eetodev(memec, &memec->mvec[pos_v35], xfer_dst);
365 reply = acMemSend(&mem_data, (acMemEEaddr)addr, 16 * pos_v35, 10);
376 acMemWait(&mem_data, 100, 110);
401 if ( argt->start == 0 )
408 FreeSysMemory(buf_v1);
413 if ( memec->buf == 0 )
417 buf_v3 = AllocSysMemory(0, argt->size, 0);
425 FreeSysMemory(oldbuf);
430static void *meme_request(
unsigned int fno,
struct meme_softc *data,
int size)
436 data->pkt.rpl.error = 0;
443 if ( fno >= 3 || (op = ops_48[fno]) == 0 )
446 v5 = op(data, &data->pkt.rpl, data, 16);
450 data->pkt.rpl.error = -v5;
452 data->pkt.rpl.result = v5;
457static void meme_thread(
void *arg)
465 thid = GetThreadId();
466 sceSifSetRpcQueue(&queue_data, thid);
467 sceSifRegisterRpc(&serv_data, 0x76500001, (SifRpcFunc_t)meme_request, argt, 0, 0, &queue_data);
473 s = sceSifGetNextRequest(&queue_data);
476 sceSifExecRequest(s);
481 if ( thid != argt->thid )
487static int meme_thread_init(
struct meme_softc *memec,
int prio)
492 param.attr = 0x2000000;
493 param.thread = meme_thread;
494 param.priority = prio;
495 param.stacksize = 4096;
497 th = CreateThread(¶m);
499 StartThread(th, memec);
503int acMemeModuleStatus()
508int acMemeModuleStart(
int argc,
char **argv)
521 if ( acMemeModuleStatus() == 0 )
528 while ( index < argc )
537 value = strtol(opt_v7, &next, 0);
538 if ( next != opt_v7 )
545 memset(&Memec, 0,
sizeof(Memec));
546 ret = meme_thread_init(&Memec, prio);
559int acMemeModuleStop()
564 if ( acMemeModuleStatus() == 0 )
569 if ( Memec.thid > 0 )
577 for ( retry = 9; retry >= 0; --retry )
579 ret = DeleteThread(thid);
582 DelayThread(1000000);
585 printf(
"acmeme:thread:term: TIMEDOUT %d\n", ret);
596int acMemeModuleRestart(
int argc,
char **argv)