mirror of
https://github.com/Oibaf66/uae-wii.git
synced 2025-02-19 20:12:43 +01:00
417 lines
9.7 KiB
C
417 lines
9.7 KiB
C
/*
|
|
* A collection of ugly and random junk brought in from Win32
|
|
* which desparately needs to be tidied up
|
|
*/
|
|
|
|
#include "sysconfig.h"
|
|
#include "sysdeps.h"
|
|
|
|
#include "options.h"
|
|
#include "memory.h"
|
|
#include "custom.h"
|
|
#include "newcpu.h"
|
|
#include "events.h"
|
|
#include "uae.h"
|
|
#include "autoconf.h"
|
|
#include "traps.h"
|
|
#include "enforcer.h"
|
|
#include "picasso96.h"
|
|
|
|
static uae_u32 REGPARAM2 misc_demux (TrapContext *context)
|
|
{
|
|
//use the extern int (6 #13)
|
|
// d0 0=opensound d1=unit d2=samplerate d3=blksize ret: sound frequency
|
|
// d0 1=closesound d1=unit
|
|
// d0 2=writesamples d1=unit a0=addr write blksize samples to card
|
|
// d0 3=readsamples d1=unit a0=addr read samples from card ret: d0=samples read
|
|
// make sure you have from amigaside blksize*4 mem alloced
|
|
// d0=-1 no data available d0=-2 no recording open
|
|
// d0 > 0 there are more blksize Data in the que
|
|
// do the loop until d0 get 0
|
|
// if d0 is greater than 200 bring a message
|
|
// that show the user that data is lost
|
|
// maximum blocksbuffered are 250 (8,5 sec)
|
|
// d0 4=writeinterrupt d1=unit d0=0 no interrupt happen for this unit
|
|
// d0=-2 no playing open
|
|
|
|
//note units for now not support use only unit 0
|
|
|
|
// d0=10 get clipboard size d0=size in bytes
|
|
// d0=11 get clipboard data a0=clipboarddata
|
|
//Note: a get clipboard size must do before
|
|
// d0=12 write clipboard data a0=clipboarddata
|
|
// d0=13 setp96mouserate d1=hz value
|
|
// d0=100 open dll d1=dll name in windows name conventions
|
|
// d0=101 get dll function addr d1=dllhandle a0 function/var name
|
|
// d0=102 exec dllcode a0=addr of function (see 101)
|
|
// d0=103 close dll
|
|
// d0=104 screenlost
|
|
// d0=105 mem offset
|
|
// d0=106 16Bit byteswap
|
|
// d0=107 32Bit byteswap
|
|
// d0=108 free swap array
|
|
// d0=200 ahitweak d1=offset for dsound position pointer
|
|
|
|
int opcode = m68k_dreg (&context->regs, 0);
|
|
|
|
switch (opcode) {
|
|
int i, slen, t, todo, byte1, byte2;
|
|
uae_u32 src, num_vars;
|
|
static int cap_pos, clipsize;
|
|
#if 0
|
|
LPTSTR p, p2, pos1, pos2;
|
|
static LPTSTR clipdat;
|
|
#endif
|
|
int cur_pos;
|
|
|
|
/*
|
|
* AHI emulation support
|
|
*/
|
|
#ifdef AHI
|
|
case 0:
|
|
cap_pos = 0;
|
|
sound_freq_ahi = m68k_dreg (&context->regs, 2);
|
|
amigablksize = m68k_dreg (&context->regs, 3);
|
|
sound_freq_ahi = ahi_open_sound();
|
|
uaevar.changenum--;
|
|
return sound_freq_ahi;
|
|
case 1:
|
|
ahi_close_sound();
|
|
sound_freq_ahi = 0;
|
|
return 0;
|
|
case 2:
|
|
addr=(char *)m68k_areg (&context->regs, 0);
|
|
for (i = 0; i < (amigablksize*4); i += 4) {
|
|
ahisndbufpt[0] = get_long((unsigned int)addr + i);
|
|
ahisndbufpt+=1;
|
|
/*ahisndbufpt[0]=chipmem_bget((unsigned int)addr+i+2);
|
|
ahisndbufpt+=1;
|
|
ahisndbufpt[0]=chipmem_bget((unsigned int)addr+i+1);
|
|
ahisndbufpt+=1;
|
|
ahisndbufpt[0]=chipmem_bget((unsigned int)addr+i);
|
|
ahisndbufpt+=1;*/
|
|
}
|
|
ahi_finish_sound_buffer();
|
|
return amigablksize;
|
|
case 3:
|
|
if (norec)
|
|
return -1;
|
|
if (!ahi_on)
|
|
return -2;
|
|
i = IDirectSoundCaptureBuffer_GetCurrentPosition (lpDSB2r, &t, &cur_pos);
|
|
t = amigablksize*4;
|
|
|
|
if (cap_pos <= cur_pos)
|
|
todo = cur_pos - cap_pos;
|
|
else
|
|
todo = cur_pos + (RECORDBUFFER * t) - cap_pos;
|
|
if (todo < t) {
|
|
//if no complete buffer ready exit
|
|
return -1;
|
|
}
|
|
i = IDirectSoundCaptureBuffer_Lock (lpDSB2r, cap_pos, t, &pos1, &byte1, &pos2, &byte2, 0);
|
|
|
|
if ((cap_pos + t) < (t * RECORDBUFFER)) {
|
|
cap_pos=cap_pos+t;
|
|
} else {
|
|
cap_pos = 0;
|
|
}
|
|
addr= (char *) m68k_areg (&context->regs, 0);
|
|
sndbufrecpt= (unsigned int*) pos1;
|
|
t = t / 4;
|
|
for (i=0; i < t; i++) {
|
|
put_long ((uae_u32) addr, sndbufrecpt[0]);
|
|
addr += 4;
|
|
sndbufrecpt += 1;
|
|
}
|
|
t = t * 4;
|
|
i = IDirectSoundCaptureBuffer_Unlock (lpDSB2r, pos1, byte1, pos2, byte2);
|
|
return (todo - t) / t;
|
|
case 4:
|
|
if (!ahi_on)
|
|
return -2;
|
|
i = intcount;
|
|
intcount = 0;
|
|
return i;
|
|
case 5:
|
|
if (!ahi_on)
|
|
return 0;
|
|
ahi_updatesound (1);
|
|
return 1;
|
|
#endif
|
|
|
|
#if 0
|
|
/*
|
|
* Support for clipboard hack
|
|
*/
|
|
case 10:
|
|
i = OpenClipboard (0);
|
|
clipdat = GetClipboardData (CF_TEXT);
|
|
if (clipdat) {
|
|
clipsize=strlen(clipdat);
|
|
clipsize++;
|
|
return clipsize;
|
|
} else {
|
|
return 0;
|
|
}
|
|
case 11:
|
|
addr = (char *) m68k_areg (&context->regs, 0);
|
|
for (i=0; i < clipsize; i++) {
|
|
put_byte ((uae_u32) addr, clipdat[0]);
|
|
addr++;
|
|
clipdat++;
|
|
}
|
|
CloseClipboard ();
|
|
return 0;
|
|
case 12:
|
|
addr = (char *) m68k_areg (&context->regs, 0);
|
|
addr = (char *) get_real_address ((uae_u32)addr);
|
|
i = OpenClipboard (0);
|
|
EmptyClipboard ();
|
|
slen = strlen (addr);
|
|
p = GlobalAlloc (GMEM_DDESHARE, slen + 2);
|
|
p2 = GlobalLock (p);
|
|
memcpy (p2, addr, slen);
|
|
p2[slen] = 0;
|
|
GlobalUnlock (p);
|
|
i = (int) SetClipboardData (CF_TEXT, p2);
|
|
CloseClipboard ();
|
|
GlobalFree (p);
|
|
return 0;
|
|
#endif
|
|
|
|
/*
|
|
* Hack for higher P96 mouse draw rate
|
|
*/
|
|
#ifdef PICASSO96
|
|
case 13: {
|
|
extern int p96hack_vpos2;
|
|
extern int hack_vpos;
|
|
extern int p96refresh_active;
|
|
extern uae_u16 vtotal;
|
|
extern unsigned int new_beamcon0;
|
|
p96hack_vpos2 = 15625 / m68k_dreg (&context->regs, 1);
|
|
p96refresh_active = 1;
|
|
if (!picasso_on)
|
|
return 0;
|
|
vtotal = p96hack_vpos2; // only do below if P96 screen is visible
|
|
new_beamcon0 |= 0x80;
|
|
hack_vpos = vtotal;
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Support for enforcer emulation
|
|
*/
|
|
#ifdef ENFORCER
|
|
case 20:
|
|
return enforcer_enable ();
|
|
|
|
case 21:
|
|
return enforcer_disable ();
|
|
#endif
|
|
|
|
#if 0
|
|
case 25:
|
|
flushprinter ();
|
|
return 0;
|
|
#endif
|
|
|
|
|
|
#if 0
|
|
case 100: { // open dll
|
|
char *dllname;
|
|
uae_u32 result;
|
|
dllname = (char *) m68k_areg (&context->regs, 0);
|
|
dllname = (char *) get_real_address ((uae_u32)dllname);
|
|
result = (uae_u32) LoadLibrary (dllname);
|
|
write_log ("%s windows dll/alib loaded at %d (0 mean failure)\n", dllname, result);
|
|
return result;
|
|
}
|
|
case 101: { //get dll label
|
|
HMODULE m;
|
|
char *funcname;
|
|
m = (HMODULE) m68k_dreg (&context->regs, 1);
|
|
funcname = (char *) m68k_areg (&context->regs, 0);
|
|
funcname = (char *) get_real_address ((uae_u32)funcname);
|
|
return (uae_u32) GetProcAddress (m, funcname);
|
|
}
|
|
case 102: //execute native code
|
|
return emulib_ExecuteNativeCode2 ();
|
|
|
|
case 103: { //close dll
|
|
HMODULE libaddr;
|
|
libaddr = (HMODULE) m68k_dreg (&context->regs, 1);
|
|
FreeLibrary (libaddr);
|
|
return 0;
|
|
}
|
|
case 104: { //screenlost
|
|
static int oldnum=0;
|
|
if (uaevar.changenum == oldnum)
|
|
return 0;
|
|
oldnum = uaevar.changenum;
|
|
return 1;
|
|
}
|
|
case 105: //returns memory offset
|
|
return (uae_u32) get_real_address (0);
|
|
case 106: //byteswap 16bit vars
|
|
//a0 = start address
|
|
//d1 = number of 16bit vars
|
|
//returns address of new array
|
|
src = m68k_areg (&context->regs, 0);
|
|
num_vars = m68k_dreg (&context->regs, 1);
|
|
|
|
if (bswap_buffer_size < num_vars * 2) {
|
|
bswap_buffer_size = (num_vars + 1024) * 2;
|
|
free (bswap_buffer);
|
|
bswap_buffer = (void*) malloc (bswap_buffer_size);
|
|
}
|
|
__asm {
|
|
mov esi, dword ptr [src]
|
|
mov edi, dword ptr [bswap_buffer]
|
|
mov ecx, num_vars
|
|
|
|
mov ebx, ecx
|
|
and ecx, 3
|
|
je BSWAP_WORD_4X
|
|
|
|
BSWAP_WORD_LOOP:
|
|
mov ax, [esi]
|
|
mov ax, [esi]
|
|
mov dl, al
|
|
mov al, ah
|
|
mov ah, dl
|
|
mov [edi], ax
|
|
add esi, 2
|
|
add edi, 2
|
|
loopne BSWAP_WORD_LOOP
|
|
|
|
BSWAP_WORD_4X:
|
|
mov ecx, ebx
|
|
shr ecx, 2
|
|
je BSWAP_WORD_END
|
|
BSWAP_WORD_4X_LOOP:
|
|
mov ax, [esi]
|
|
mov dl, al
|
|
mov al, ah
|
|
mov ah, dl
|
|
mov [edi], ax
|
|
mov ax, [esi+2]
|
|
mov dl, al
|
|
mov al, ah
|
|
mov ah, dl
|
|
mov [edi+2], ax
|
|
mov ax, [esi+4]
|
|
mov dl, al
|
|
mov al, ah
|
|
mov ah, dl
|
|
mov [edi+4], ax
|
|
mov ax, [esi+6]
|
|
mov dl, al
|
|
mov al, ah
|
|
mov ah, dl
|
|
mov [edi+6], ax
|
|
add esi, 8
|
|
add edi, 8
|
|
loopne BSWAP_WORD_4X_LOOP
|
|
|
|
BSWAP_WORD_END:
|
|
}
|
|
return (uae_u32) bswap_buffer;
|
|
case 107: //byteswap 32bit vars - see case 106
|
|
//a0 = start address
|
|
//d1 = number of 32bit vars
|
|
//returns address of new array
|
|
src = m68k_areg (&context->regs, 0);
|
|
num_vars = m68k_dreg (&context->regs, 1);
|
|
if (bswap_buffer_size < num_vars * 4) {
|
|
bswap_buffer_size = (num_vars + 16384) * 4;
|
|
free (bswap_buffer);
|
|
bswap_buffer = (void*) malloc (bswap_buffer_size);
|
|
}
|
|
__asm {
|
|
mov esi, dword ptr [src]
|
|
mov edi, dword ptr [bswap_buffer]
|
|
mov ecx, num_vars
|
|
|
|
mov ebx, ecx
|
|
and ecx, 3
|
|
je BSWAP_DWORD_4X
|
|
|
|
BSWAP_DWORD_LOOP:
|
|
mov eax, [esi]
|
|
bswap eax
|
|
mov [edi], eax
|
|
add esi, 4
|
|
add edi, 4
|
|
loopne BSWAP_DWORD_LOOP
|
|
|
|
BSWAP_DWORD_4X:
|
|
mov ecx, ebx
|
|
shr ecx, 2
|
|
je BSWAP_DWORD_END
|
|
BSWAP_DWORD_4X_LOOP:
|
|
mov eax, [esi]
|
|
bswap eax
|
|
mov [edi], eax
|
|
mov eax, [esi+4]
|
|
bswap eax
|
|
mov [edi+4], eax
|
|
mov eax, [esi+8]
|
|
bswap eax
|
|
mov [edi+8], eax
|
|
mov [edi+8], eax
|
|
mov eax, [esi+12]
|
|
bswap eax
|
|
mov [edi+12], eax
|
|
add esi, 16
|
|
add edi, 16
|
|
loopne BSWAP_DWORD_4X_LOOP
|
|
|
|
BSWAP_DWORD_END:
|
|
}
|
|
return (uae_u32) bswap_buffer;
|
|
case 108: //frees swap array
|
|
bswap_buffer_size = 0;
|
|
free (bswap_buffer);
|
|
bswap_buffer = NULL;
|
|
return 0;
|
|
case 200:
|
|
ahitweak = m68k_dreg (&context->regs, 1);
|
|
return 1;
|
|
#endif
|
|
default:
|
|
return 0x12345678; // Code for not supported function
|
|
}
|
|
}
|
|
|
|
|
|
void misc_hsync_stuff (void)
|
|
{
|
|
static int misc_demux_installed;
|
|
|
|
#ifdef AHI
|
|
{
|
|
static int count;
|
|
if (ahi_on) {
|
|
count++;
|
|
//15625/count freebuffer check
|
|
if (count > 20) {
|
|
ahi_updatesound (1);
|
|
count = 0;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (!misc_demux_installed) {
|
|
uaecptr a = here ();
|
|
org (RTAREA_BASE + 0xFFC0);
|
|
calltrap (deftrap (misc_demux));
|
|
dw (0x4e75);// rts
|
|
org (a);
|
|
misc_demux_installed = 1;
|
|
}
|
|
}
|