Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions iop/sound/libsd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# ____| | ____| | | |____|
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
#-----------------------------------------------------------------------
# Copyright ps2dev - http://www.ps2dev.org
# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
# Licenced under Academic Free License version 2.0
# Review ps2sdk README & LICENSE files for further details.

Expand All @@ -13,10 +13,9 @@ IOP_IMPORT_INCS += \
system/loadcore \
system/sifman \
system/stdio \
system/sysclib \
system/threadman
system/sysclib

IOP_OBJS = libsd.o imports.o exports.o
IOP_OBJS = freesd.o batch.o block.o effect.o voice.o exports.o imports.o

include $(PS2SDKSRC)/Defs.make
include $(PS2SDKSRC)/iop/Rules.bin.make
Expand Down
17 changes: 17 additions & 0 deletions iop/sound/libsd/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FREESD v1.0
Copyright (c) 2004 TyRaNiD <tiraniddo@hotmail.com>
Copyright (c) 2004 Lukasz Bruun <ps2@lukasz.dk>
Licensed under the Academic Free License version 2.0.
--

FREESD is a LIBSD compatible sound driver for PS2.

Some early Japanse PS2 models came without LIBSD
in the BIOS, this will work as a free replacement.

Credits:
Neill Corlett <neill@neillcorlett.com> for very valuable information on sound registers.
[RO]man <roman_ps2dev@hotmail.com> for register information.
adresd <adresd_ps2dev@yahoo.com>, Nicholas Van Veen <nickvv@xtra.co.nz>, Vzzrzzn,
MrHTFord <mrhtford_ps2dev@hotmail.com> for their work with libsd and thereby providing test data.

24 changes: 0 additions & 24 deletions iop/sound/libsd/README.md

This file was deleted.

243 changes: 243 additions & 0 deletions iop/sound/libsd/src/batch.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
/*
* Copyright (c) 2004 TyRaNiD <tiraniddo@hotmail.com>
* Copyright (c) 2004,2007 Lukasz Bruun <mail@lukasz.dk>
*
* See the file LICENSE included with this distribution for licensing terms.
*/

/**
* @file
* Part of the IOP Sound Driver
*/

#include "types.h"
#include "sifman.h"
#include "intrman.h"
#include "libsd.h"
#include "spu2regs.h"

u32 BatchData __attribute__((aligned(16)));

s32 SifDmaBatch(u32 ee_addr, void *iop_addr, u32 size)
{
SifDmaTransfer_t dma;
s32 intr_stat;
s32 dma_id;

dma.src = iop_addr;
dma.dest = (void *)ee_addr;
dma.size = size;
dma.attr = 0;

CpuSuspendIntr((int *)&intr_stat);
dma_id = SifSetDma(&dma, SIF_DMA_TO_EE);
CpuResumeIntr(intr_stat);

while(SifDmaStat(dma_id) >= 0);

if(dma_id == 0) return -1;

return 0;
}

int sceSdProcBatch(const sceSdBatch *batch, u32 *rets, u32 num)
{
s32 loop;
s32 ret;

for(loop = 0; (u32)loop < num; loop++)
{
ret = 0;

switch(batch[loop].func)
{
case SD_BATCH_SETPARAM:
sceSdSetParam(batch[loop].entry, batch[loop].value);
break;
case SD_BATCH_GETPARAM:
ret = sceSdGetParam(batch[loop].entry);
break;
case SD_BATCH_SETSWITCH:
sceSdSetSwitch(batch[loop].entry, batch[loop].value);
break;
case SD_BATCH_GETSWITCH:
ret = sceSdGetSwitch(batch[loop].entry);
break;
case SD_BATCH_SETADDR:
sceSdSetAddr(batch[loop].entry, batch[loop].value);
break;
case SD_BATCH_GETADDR:
ret = sceSdGetAddr(batch[loop].entry);
break;
case SD_BATCH_SETCORE:
sceSdSetCoreAttr(batch[loop].entry, batch[loop].value);
break;
case SD_BATCH_GETCORE:
ret = sceSdGetCoreAttr(batch[loop].entry);
break;
case SD_BATCH_WRITEIOP:
*((u32 *) batch[loop].value) = batch[loop].entry;
break;
case SD_BATCH_WRITEEE:
BatchData = batch[loop].entry;
SifDmaBatch(batch[loop].value, &BatchData, 4);
break;
case SD_BATCH_EERETURN:
SifDmaBatch(batch[loop].value, rets, batch[loop].entry);
break;
default:
return -1 - loop;
}

if(rets) rets[loop] = ret;
}

return loop;
}

int sceSdProcBatchEx(const sceSdBatch *batch, u32 *rets, u32 num, u32 voice)
{
s32 loop;
s32 ret;
s32 voice_loop;
s32 cmd_count;

cmd_count = 0;

for(loop = 0; (u32)loop < num; loop++)
{
ret = 0;
switch(batch[loop].func)
{
case SD_BATCH_SETPARAM:
{
if((batch[loop].entry & 0x3E) != 0x3E)
{
sceSdSetParam(batch[loop].entry, batch[loop].value);
}
else
{
for(voice_loop = 0; voice_loop < 24; voice_loop++)
{
if(voice & (1 << voice_loop))
{
sceSdSetParam((batch[loop].entry & 0xFFC1) | (1 << (voice_loop + 1)), batch[loop].value);
cmd_count++;
}
}
cmd_count--;
}
} break;

case SD_BATCH_GETPARAM:
{
if((batch[loop].entry & 0x3E) != 0x3E)
{
ret = sceSdGetParam(batch[loop].entry);
}
else
{
for(voice_loop = 0; voice_loop < 24; voice_loop++)
{
if(voice & (1 << voice_loop))
{
ret = sceSdGetParam((batch[loop].entry & 0xFFC1) | (1 << (voice_loop + 1)));
cmd_count++;
}

if(rets)
{
rets[cmd_count] = ret;
}
}

cmd_count--;
}
} break;

case SD_BATCH_SETSWITCH:
sceSdSetSwitch(batch[loop].entry, batch[loop].value);
break;

case SD_BATCH_GETSWITCH:
ret = sceSdGetSwitch(batch[loop].entry);
break;

case SD_BATCH_SETADDR:
{
if((batch[loop].entry & 0x3E) != 0x3E)
{
sceSdSetAddr(batch[loop].entry, batch[loop].value);
}
else
{
for(voice_loop = 0; voice_loop < 24; voice_loop++)
{
if(voice & (1 << voice_loop))
{
sceSdSetAddr((batch[loop].entry & 0xFFC1) | (1 << (voice_loop + 1)), batch[loop].value);
cmd_count++;
}
}
}
cmd_count--;
} break;

case SD_BATCH_GETADDR:
{
if((batch[loop].entry & 0x3E) != 0x3E)
{
ret = sceSdGetAddr(batch[loop].entry);
}
else
{
for(voice_loop = 0; voice_loop < 24; voice_loop++)
{
if(voice & (1 << voice_loop))
{
ret = sceSdGetAddr((batch[loop].entry & 0xFFC1) | (1 << (voice_loop + 1)));
cmd_count++;
}

if(rets)
{
rets[cmd_count] = ret;
}
}
}
cmd_count--;
} break;

case SD_BATCH_SETCORE:
sceSdSetCoreAttr(batch[loop].entry, batch[loop].value);
break;

case SD_BATCH_GETCORE:
ret = sceSdGetCoreAttr(batch[loop].entry);
break;

case SD_BATCH_WRITEIOP:
*((u32 *) batch[loop].value) = batch[loop].entry;
break;

case SD_BATCH_WRITEEE:
BatchData = batch[loop].entry;
SifDmaBatch(batch[loop].value, &BatchData, 4);
break;

case SD_BATCH_EERETURN:
SifDmaBatch(batch[loop].value, rets, batch[loop].entry);
break;
default:
return -1 - cmd_count;
}

if(rets)
{
rets[cmd_count] = ret;
}
cmd_count++;
}

return cmd_count;
}
Loading