PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
s_w0.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 "libspu2_internal.h"
12
13unsigned int SpuWrite0(unsigned int size)
14{
15 u32 old_tmode;
16 int ck_1;
17 int ck_2;
18 u32 tsa;
19 unsigned int written;
20 void (*bk)(void);
21
22 old_tmode = _spu_transMode;
23 bk = 0;
24 ck_1 = 0;
25 if ( _spu_transMode == 1 )
26 {
27 _spu_transMode = 0;
28 ck_1 = 1;
29 }
30 ck_2 = 1;
31 tsa = _spu_tsa[1];
32 written = 0;
33 if ( _spu_transferCallback )
34 {
35 bk = _spu_transferCallback;
36 _spu_transferCallback = 0;
37 written = 0;
38 }
39 while ( ck_2 )
40 {
41 unsigned int bsize_1;
42 int bsize_2;
43
44 bsize_1 = size >> 6;
45 if ( size < 0x401 )
46 {
47 bsize_2 = bsize_1 << 6;
48 ck_2 = 0;
49 if ( (unsigned int)bsize_2 < size )
50 bsize_2 += 64;
51 }
52 else
53 {
54 bsize_2 = 1024;
55 }
56 _spu_t(2, tsa);
57 _spu_t(1);
58 FlushDcache();
59 _spu_t(3, _spu_zerobuf, bsize_2);
60 while ( !gDMADeliverEvent )
61 ;
62 gDMADeliverEvent = 0;
63 size -= 1024;
64 tsa += 512;
65 written += bsize_2;
66 }
67 if ( ck_1 )
68 _spu_transMode = old_tmode;
69 if ( bk )
70 {
71 _spu_transferCallback = bk;
72 }
73 return written;
74}