Skip to content
Permalink
Browse files

Updated Amiga port by Gabriele Greco

  • Loading branch information
slouken committed Dec 16, 2001
1 parent 652d310 commit 0c4eb44a77b41bd5af2744dfb3c85c1c9bd4ed25
@@ -29,10 +29,6 @@ static char rcsid =

/* Allow access to a raw mixing buffer (for AmigaOS) */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "SDL_endian.h"
#include "SDL_audio.h"
#include "SDL_audiomem.h"
@@ -35,6 +35,8 @@ static char rcsid =
#else
#include <inline/exec.h>
#endif
#include <stdlib.h>
#include <string.h>

#include <devices/ahi.h>
#include "mydebug.h"
@@ -47,7 +49,7 @@ struct SDL_PrivateAudioData {
/* The handle for the audio device */
struct AHIRequest *audio_req[2];
struct MsgPort *audio_port;
Sint32 freq,type,bytespersample;
Sint32 freq,type,bytespersample,size;
Uint8 *mixbuf[2]; /* The app mixing buffer */
int current_buffer;
Uint32 playing;
@@ -31,7 +31,7 @@ static char rcsid =
#include <stdio.h> /* For the definition of NULL */

#include <libraries/lowlevel.h>
#ifdef __SASC
#if defined(__SASC) || defined(STORMC4_WOS)
#include <proto/exec.h>
#include <proto/lowlevel.h>
#include <proto/graphics.h>
@@ -72,7 +72,7 @@ ULONG joybut[]=
JPF_BUTTON_REVERSE,
};

struct joystick_hwdata
struct joystick_hwdata
{
ULONG joystate;
};
@@ -128,7 +128,7 @@ int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)

for(i=0;i<20;i++)
{
temp=ReadJoyPort(joystick->index);
temp=ReadJoyPort(joystick->index^1); // fix to invert amiga joyports
WaitTOF();
}

@@ -152,7 +152,7 @@ int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
*/
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
{
ULONG data;
ULONG data;
int i;

if(joystick->index<2)
@@ -61,7 +61,7 @@ SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
memset(sem,0,sizeof(*sem));

InitSemaphore(&sem->Sem);

return(sem);
}

@@ -143,10 +143,14 @@ int SDL_SemWait(SDL_sem *sem)
Uint32 SDL_SemValue(SDL_sem *sem)
{
Uint32 value;

value = 0;
if ( sem ) {
#ifdef STORMC4_WOS
value = sem->Sem.ssppc_SS.ss_NestCount;
#else
value = sem->Sem.ss_NestCount;
#endif
// SDL_UnlockMutex(sem->count_lock);
}
return value;
@@ -32,6 +32,7 @@ static char rcsid =
#include "SDL_thread.h"
#include "SDL_thread_c.h"
#include "SDL_systhread.h"
#include "mydebug.h"

typedef struct {
int (*func)(void *);
@@ -47,10 +48,15 @@ __saveds __asm Uint32 RunThread(register __a0 char *args )
#elif defined(__PPC__)
Uint32 RunThread(char *args)
#else
Uint32 RunThread(char *args __asm("a0") )
Uint32 __saveds RunThread(char *args __asm("a0") )
#endif
{
#ifdef STORMC4_WOS
thread_args *data=(thread_args *)args;
#else
thread_args *data=(thread_args *)atol(args);
#endif

struct Task *Father;

D(bug("Received data: %lx\n",data));
@@ -59,6 +65,7 @@ Uint32 RunThread(char *args __asm("a0") )
SDL_RunThread(data);

Signal(Father,SIGBREAKF_CTRL_F);
D(bug("Thread with data %lx ended\n",data));
return(0);
}

@@ -68,7 +75,7 @@ Uint32 RunThread(char *args __asm("a0") )

Uint32 RunTheThread(void)
{
thread_args *data=(thread_args *)atol(REG_A0);
thread_args *data=(thread_args *)atol((char *)REG_A0);
struct Task *Father;

D(bug("Received data: %lx\n",data));
@@ -77,16 +84,18 @@ Uint32 RunTheThread(void)
SDL_RunThread(data);

Signal(Father,SIGBREAKF_CTRL_F);
D(bug("Thread with data %lx ended\n",data));
return(0);
}

struct EmulLibEntry RunThread=
struct EmulLibEntry RunThreadStruct=
{
TRAP_LIB,
0,
RunTheThread
(ULONG)RunTheThread
};

void *RunThread=&RunThreadStruct;
#endif


@@ -100,14 +109,23 @@ int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
if(args)
sprintf(buffer,"%ld",args);


#ifdef STORMC4_WOS
thread->handle=CreateTaskPPCTags(TASKATTR_CODE, RunThread,
TASKATTR_NAME, "SDL subtask",
TASKATTR_STACKSIZE, 100000,
(args ? TASKATTR_R3 : TAG_IGNORE), args,
TASKATTR_INHERITR2, TRUE,
TAG_DONE);
#else
thread->handle=(struct Task *)CreateNewProcTags(NP_Output,Output(),
NP_Name,(ULONG)"SDL subtask",
NP_CloseOutput, FALSE,
NP_StackSize,20000,
NP_Entry,(ULONG)RunThread,
args ? NP_Arguments : TAG_IGNORE,(ULONG)buffer,
TAG_DONE);
#endif

if(!thread->handle)
{
SDL_SetError("Not enough resources to create thread");
@@ -28,7 +28,7 @@ static char rcsid =
#include <exec/exec.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#ifdef __SASC
#if defined (__SASC) || defined(STORMC4_WOS)
#include <proto/dos.h>
#include <proto/exec.h>
#else
@@ -44,5 +44,25 @@ static char rcsid =
extern struct ExecBase *SysBase;
extern struct DosLibrary *DOSBase;

#ifdef STORMC4_WOS
#include <proto/powerpc.h>

/* use powerpc.library functions instead og exec */
#define SYS_ThreadHandle struct TaskPPC *
#define Signal SignalPPC
#define Wait WaitPPC
#define Task TaskPPC
#define FindTask FindTaskPPC
#define SetSignal SetSignalPPC

#define InitSemaphore InitSemaphorePPC
#define ObtainSemaphore ObtainSemaphorePPC
#define AttemptSemaphore AttemptSemaphorePPC
#define ReleaseSemaphore ReleaseSemaphorePPC
#define SignalSemaphore SignalSemaphorePPC

#else

#define SYS_ThreadHandle struct Task *
#endif /*STORMC4_WOS*/

@@ -38,6 +38,10 @@ static char rcsid =
#include <pragmas/graphics.h>
#include <clib/exec_protos.h>
#include <pragmas/exec.h>
#elif defined(STORMC4_WOS)
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#else
#include <inline/dos.h>
#include <inline/exec.h>
@@ -59,7 +63,7 @@ static struct GfxBase *GfxBase;

/* The first ticks value of the application */

#ifndef __PPC__
#if !defined(__PPC__) || defined(STORMC4_WOS) || defined(MORPHOS)
static clock_t start;

void SDL_StartTicks(void)
@@ -120,7 +124,7 @@ void SDL_StartTicks(void)
/* Set first ticks value */
if(!MyTimer)
PPC_TimerInit();

PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,start);
start[1]>>=10;
start[1]|=((result[0]&0x3ff)<<22);
@@ -134,7 +138,7 @@ Uint32 SDL_GetTicks (void)

// PPCAsr64p(result,10);
// Non va, la emulo:

result[1]>>=10;
result[1]|=((result[0]&0x3ff)<<22);

@@ -200,7 +204,7 @@ void PPC_TimerInit(void)
else
{
D(bug("Errore nell'inizializzazione del timer!\n"));
}
}
}

#endif
@@ -234,7 +238,7 @@ static int RunTimer(void *unused)
/* This is only called if the event thread is not running */
int SDL_SYS_TimerInit(void)
{
D(bug("Creo il thread per il timer (NOITMER)...\n"));
D(bug("Creating thread for the timer (NOITIMER)...\n"));

timer_alive = 1;
timer_thread = SDL_CreateThread(RunTimer, NULL);
@@ -148,7 +148,7 @@ static int amiga_DispatchEvent(_THIS,struct IntuiMessage *msg)
break;
#if 0
/* Gaining input focus? */
case IDCMP_ACTIVEWINDOW:
case IDCMP_ACTIVEWINDOW:
posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);

/* Queue entry into fullscreen mode */
@@ -166,7 +166,7 @@ static int amiga_DispatchEvent(_THIS,struct IntuiMessage *msg)
break;
#endif
/* Mouse motion? */
case IDCMP_MOUSEMOVE:
case IDCMP_MOUSEMOVE:
if ( SDL_VideoSurface ) {
posted = SDL_PrivateMouseMotion(0, 0,
msg->MouseX-SDL_Window->BorderLeft,
@@ -179,14 +179,14 @@ static int amiga_DispatchEvent(_THIS,struct IntuiMessage *msg)

if(!(code&IECODE_UP_PREFIX))
{
posted = SDL_PrivateMouseButton(SDL_PRESSED,
posted = SDL_PrivateMouseButton(SDL_PRESSED,
amiga_GetButton(code), 0, 0);
}
/* Mouse button release? */
else
{
code&=~IECODE_UP_PREFIX;
posted = SDL_PrivateMouseButton(SDL_RELEASED,
posted = SDL_PrivateMouseButton(SDL_RELEASED,
amiga_GetButton(code), 0, 0);
}
break;
@@ -211,7 +211,7 @@ static int amiga_DispatchEvent(_THIS,struct IntuiMessage *msg)
/* Check to see if this is a repeated key */
/* if ( ! X11_KeyRepeat(SDL_Display, &xevent) ) */

posted = SDL_PrivateKeyboard(SDL_RELEASED,
posted = SDL_PrivateKeyboard(SDL_RELEASED,
amiga_TranslateKey(code, &keysym));
}
break;
@@ -235,7 +235,7 @@ printf("MapNotify!\n");
posted = SDL_PrivateAppActive(1, SDL_APPACTIVE);

if ( SDL_VideoSurface &&
(SDL_VideoSurface->flags & SDL_FULLSCREEN) )
(SDL_VideoSurface->flags & SDL_FULLSCREEN) )
{
CGX_EnterFullScreen(this);
} else {
@@ -254,9 +254,10 @@ printf("MapNotify!\n");
#endif

/* Have we been resized? */
case IDCMP_NEWSIZE:
case IDCMP_NEWSIZE:
SDL_PrivateResize(SDL_Window->Width-SDL_Window->BorderLeft-SDL_Window->BorderRight,
SDL_Window->Height-SDL_Window->BorderTop-SDL_Window->BorderBottom);

break;

/* Have we been requested to quit? */
@@ -428,7 +429,11 @@ void amiga_InitKeymap(void)

SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym)
{
#ifdef STORMC4_WOS
static struct Library *KeymapBase=NULL; /* Linking failed in WOS version if ConsoleDevice was used */
#else
static struct Library *ConsoleDevice=NULL;
#endif

/* Get the raw keyboard scancode */
keysym->scancode = code;
@@ -438,10 +443,17 @@ SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym)
fprintf(stderr, "Translating key 0x%.4x (%d)\n", xsym, xkey->keycode);
#endif
/* Get the translated SDL virtual keysym */
if ( keysym->sym==SDLK_UNKNOWN )
if ( keysym->sym==SDLK_UNKNOWN )
{
#ifdef STORMC4_WOS
if(!KeymapBase)
#else
if(!ConsoleDevice)
#endif
{
#ifdef STORMC4_WOS
KeymapBase=OpenLibrary("keymap.library", 0L);
#else
if(ConPort=CreateMsgPort())
{
if(ConReq=CreateIORequest(ConPort,sizeof(struct IOStdReq)))
@@ -460,9 +472,14 @@ SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym)
ConPort=NULL;
}
}
#endif
}

#ifdef STORMC4_WOS
if(KeymapBase)
#else
if(ConsoleDevice)
#endif
{
struct InputEvent event;
long actual;
@@ -477,7 +494,11 @@ SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym)
event.ie_NextEvent=NULL;
event.ie_Prev1DownCode=event.ie_Prev1DownQual=event.ie_Prev2DownCode=event.ie_Prev2DownQual=0;

#ifdef STORMC4_WOS
if( (actual=MapRawKey(&event,buffer,5,NULL))>=0)
#else
if( (actual=RawKeyConvert(&event,buffer,5,NULL))>=0)
#endif
{
if(actual>1)
{

0 comments on commit 0c4eb44

Please sign in to comment.