wonx/WWInterrupt.c
Hiroaki Sakai 5e1a9795b7 Create your own header file. It became compilable with only Wonx.
Since there is a possibility that the Error () function will collide with libwonx.a when linking,
It changed to Wonx_Error ().
Added bios_exit ().
sprite_set_char, sprite_get_char, palette number minus 8
Fixed bug that was not specified.
font_set_monodata (), font_set_colordata (), font_get_data (), disp.c,
The arguments of screen_set_char (), screen_get_char (), sprite_set_data ()
Changed from void * to appropriate type.
Sample program and attached SpeedMac.
I added a document.

Version 0.3 beta - from wonx-b03.tar.gz
2018-03-07 23:06:08 +00:00

354 lines
16 KiB
C

/*****************************************************************************/
/* ここから */
/*****************************************************************************/
#include "WWInterruptP.h"
#include "etc.h"
/*****************************************************************************/
/* メンバ関数の定義 */
/*****************************************************************************/
/*===========================================================================*/
/* WWInterruptVector クラスのもの */
/*===========================================================================*/
static int WWInterruptVector_GetNumber(WWInterruptVector v)
{ return (v->number); }
static WWInterruptCallback WWInterruptVector_GetCallback(WWInterruptVector v)
{ return (v->callback); }
static int WWInterruptVector_GetCS(WWInterruptVector v)
{ return (v->cs); }
static int WWInterruptVector_GetDS(WWInterruptVector v)
{ return (v->ds); }
static int WWInterruptVector_SetNumber(WWInterruptVector v, int number)
{ return (v->number = number); }
static WWInterruptCallback WWInterruptVector_SetCallback(WWInterruptVector v,
WWInterruptCallback cb)
{ return (v->callback = cb); }
static int WWInterruptVector_SetCS(WWInterruptVector v, int cs)
{ return (v->cs = cs); }
static int WWInterruptVector_SetDS(WWInterruptVector v, int ds)
{ return (v->ds = ds); }
static int WWInterruptVector_ExecuteCallback(WWInterruptVector vector)
{
if (vector->callback == NULL) return (1);
(*(vector->callback))();
return (0);
}
static WWInterruptVector WWInterruptVector_Create(int number)
{
WWInterruptVector vector;
vector = (WWInterruptVector)malloc(sizeof(_WWInterruptVector));
if (vector == NULL)
Wonx_Error("WWInterruptVector_Create", "Cannot allocate memory.");
WWInterruptVector_SetNumber(vector, number);
WWInterruptVector_SetCallback(vector, NULL);
WWInterruptVector_SetCS(vector, 0);
WWInterruptVector_SetDS(vector, 0);
return (vector);
}
static WWInterruptVector WWInterruptVector_Destroy(WWInterruptVector vector)
{
if (vector == NULL)
Wonx_Error("WWInterruptVector_Destroy", "Object is not created.");
free(vector);
return (NULL);
}
/*===========================================================================*/
/* WWInterrupt クラスのもの */
/*===========================================================================*/
static WWInterruptVector WWInterrupt_GetVector(WWInterrupt interrupt,
int number)
{
if ((number < 0) || (number > 7))
Wonx_Error("WWInterrupt_SetVector", "Invalid interrupt number.");
return (interrupt->vector[number]);
}
static WWInterruptVector WWInterrupt_SetVector(WWInterrupt interrupt,
int number,
WWInterruptVector vector)
{
if ((number < 0) || (number > 7))
Wonx_Error("WWInterrupt_SetVector", "Invalid interrupt number.");
return (interrupt->vector[number] = vector);
}
int WWInterrupt_GetNumber(WWInterrupt interrupt, int num)
{
return (WWInterruptVector_GetNumber(WWInterrupt_GetVector(interrupt, num)));
}
WWInterruptCallback WWInterrupt_GetCallback(WWInterrupt interrupt, int n)
{
return (WWInterruptVector_GetCallback(WWInterrupt_GetVector(interrupt, n)));
}
int WWInterrupt_GetCS(WWInterrupt interrupt, int number)
{
return (WWInterruptVector_GetCS(WWInterrupt_GetVector(interrupt, number)));
}
int WWInterrupt_GetDS(WWInterrupt interrupt, int number)
{
return (WWInterruptVector_GetDS(WWInterrupt_GetVector(interrupt, number)));
}
WWInterruptCallback WWInterrupt_SetCallback(WWInterrupt interrupt, int num,
WWInterruptCallback callback)
{
return (WWInterruptVector_SetCallback(WWInterrupt_GetVector(interrupt, num),
callback));
}
int WWInterrupt_SetCS(WWInterrupt interrupt, int num, int cs)
{
return (WWInterruptVector_SetCS(WWInterrupt_GetVector(interrupt, num), cs));
}
int WWInterrupt_SetDS(WWInterrupt interrupt, int num, int ds)
{
return (WWInterruptVector_SetDS(WWInterrupt_GetVector(interrupt, num), ds));
}
int WWInterrupt_ExecuteCallback(WWInterrupt i, int n)
{
return (WWInterruptVector_ExecuteCallback(WWInterrupt_GetVector(i, n)));
}
/*---------------------------------------------------------------------------*/
/* Number の取得 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_GetSendReadyNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_SENDREADY)); }
int WWInterrupt_GetKeyNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_KEY)); }
int WWInterrupt_GetCasetteNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_CASETTE)); }
int WWInterrupt_GetReceiveReadyNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_RECEIVEREADY)); }
int WWInterrupt_GetDisplineNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_DISPLINE)); }
int WWInterrupt_GetTimerCountUpNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_TIMER_COUNTUP)); }
int WWInterrupt_GetVBlankNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_VBLANK)); }
int WWInterrupt_GetHBlankCountUpNumber(WWInterrupt interrupt)
{ return (WWInterrupt_GetNumber(interrupt, SYS_INT_HBLANK_COUNTUP)); }
/*---------------------------------------------------------------------------*/
/* コールバック関数の取得 */
/*---------------------------------------------------------------------------*/
WWInterruptCallback WWInterrupt_GetSendReadyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_SENDREADY)); }
WWInterruptCallback WWInterrupt_GetKeyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_KEY)); }
WWInterruptCallback WWInterrupt_GetCasetteCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_CASETTE)); }
WWInterruptCallback WWInterrupt_GetReceiveReadyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_RECEIVEREADY)); }
WWInterruptCallback WWInterrupt_GetDisplineCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_DISPLINE)); }
WWInterruptCallback WWInterrupt_GetTimerCountUpCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_TIMER_COUNTUP)); }
WWInterruptCallback WWInterrupt_GetVBlankCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_VBLANK)); }
WWInterruptCallback WWInterrupt_GetHBlankCountUpCallback(WWInterrupt interrupt)
{ return (WWInterrupt_GetCallback(interrupt, SYS_INT_HBLANK_COUNTUP)); }
/*---------------------------------------------------------------------------*/
/* CS の取得 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_GetSendReadyCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_SENDREADY)); }
int WWInterrupt_GetKeyCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_KEY)); }
int WWInterrupt_GetCasetteCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_CASETTE)); }
int WWInterrupt_GetReceiveReadyCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_RECEIVEREADY)); }
int WWInterrupt_GetDisplineCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_DISPLINE)); }
int WWInterrupt_GetTimerCountUpCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_TIMER_COUNTUP)); }
int WWInterrupt_GetVBlankCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_VBLANK)); }
int WWInterrupt_GetHBlankCountUpCS(WWInterrupt interrupt)
{ return (WWInterrupt_GetCS(interrupt, SYS_INT_HBLANK_COUNTUP)); }
/*---------------------------------------------------------------------------*/
/* DS の取得 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_GetSendReadyDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_SENDREADY)); }
int WWInterrupt_GetKeyDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_KEY)); }
int WWInterrupt_GetCasetteDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_CASETTE)); }
int WWInterrupt_GetReceiveReadyDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_RECEIVEREADY)); }
int WWInterrupt_GetDisplineDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_DISPLINE)); }
int WWInterrupt_GetTimerCountUpDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_TIMER_COUNTUP)); }
int WWInterrupt_GetVBlankDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_VBLANK)); }
int WWInterrupt_GetHBlankCountUpDS(WWInterrupt interrupt)
{ return (WWInterrupt_GetDS(interrupt, SYS_INT_HBLANK_COUNTUP)); }
/*---------------------------------------------------------------------------*/
/* コールバック関数の設定 */
/*---------------------------------------------------------------------------*/
WWInterruptCallback WWInterrupt_SetSendReadyCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_SENDREADY, f)); }
WWInterruptCallback WWInterrupt_SetKeyCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_KEY, f)); }
WWInterruptCallback WWInterrupt_SetCasetteCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_CASETTE, f)); }
WWInterruptCallback WWInterrupt_SetReceiveReadyCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_RECEIVEREADY, f)); }
WWInterruptCallback WWInterrupt_SetDisplineCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_DISPLINE, f)); }
WWInterruptCallback WWInterrupt_SetTimerCountUpCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_TIMER_COUNTUP, f)); }
WWInterruptCallback WWInterrupt_SetVBlankCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_VBLANK, f)); }
WWInterruptCallback WWInterrupt_SetHBlankCountUpCallback(WWInterrupt interrupt,
WWInterruptCallback f)
{ return (WWInterrupt_SetCallback(interrupt, SYS_INT_HBLANK_COUNTUP, f)); }
/*---------------------------------------------------------------------------*/
/* CS の設定 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_SetSendReadyCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_SENDREADY, cs)); }
int WWInterrupt_SetKeyCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_KEY, cs)); }
int WWInterrupt_SetCasetteCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_CASETTE, cs)); }
int WWInterrupt_SetReceiveReadyCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_RECEIVEREADY, cs)); }
int WWInterrupt_SetDisplineCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_DISPLINE, cs)); }
int WWInterrupt_SetTimerCountUpCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_TIMER_COUNTUP, cs)); }
int WWInterrupt_SetVBlankCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_VBLANK, cs)); }
int WWInterrupt_SetHBlankCountUpCS(WWInterrupt interrupt, int cs)
{ return (WWInterrupt_SetCS(interrupt, SYS_INT_HBLANK_COUNTUP, cs)); }
/*---------------------------------------------------------------------------*/
/* DS の設定 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_SetSendReadyDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_SENDREADY, ds)); }
int WWInterrupt_SetKeyDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_KEY, ds)); }
int WWInterrupt_SetCasetteDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_CASETTE, ds)); }
int WWInterrupt_SetReceiveReadyDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_RECEIVEREADY, ds)); }
int WWInterrupt_SetDisplineDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_DISPLINE, ds)); }
int WWInterrupt_SetTimerCountUpDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_TIMER_COUNTUP, ds)); }
int WWInterrupt_SetVBlankDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_VBLANK, ds)); }
int WWInterrupt_SetHBlankCountUpDS(WWInterrupt interrupt, int ds)
{ return (WWInterrupt_SetDS(interrupt, SYS_INT_HBLANK_COUNTUP, ds)); }
/*---------------------------------------------------------------------------*/
/* コールバック関数の実行 */
/*---------------------------------------------------------------------------*/
int WWInterrupt_ExecuteSendReadyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_SENDREADY)); }
int WWInterrupt_ExecuteKeyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_KEY)); }
int WWInterrupt_ExecuteCasetteCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_CASETTE)); }
int WWInterrupt_ExecuteReceiveReadyCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_RECEIVEREADY)); }
int WWInterrupt_ExecuteDisplineCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_DISPLINE)); }
int WWInterrupt_ExecuteTimerCountUpCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_TIMER_COUNTUP)); }
int WWInterrupt_ExecuteVBlankCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_VBLANK)); }
int WWInterrupt_ExecuteHBlankCountUpCallback(WWInterrupt interrupt)
{ return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_HBLANK_COUNTUP)); }
/*---------------------------------------------------------------------------*/
/* オブジェクトの作成 */
/*---------------------------------------------------------------------------*/
WWInterrupt WWInterrupt_Create()
{
WWInterrupt interrupt;
int i;
interrupt = (WWInterrupt)malloc(sizeof(_WWInterrupt));
if (interrupt == NULL)
Wonx_Error("WWInterrupt_Create", "Cannot allocate memory.");
for (i = 0; i < 8; i++)
WWInterrupt_SetVector(interrupt, i, WWInterruptVector_Create(i));
return (interrupt);
}
/*---------------------------------------------------------------------------*/
/* オブジェクトの削除 */
/*---------------------------------------------------------------------------*/
WWInterrupt WWInterrupt_Destroy(WWInterrupt interrupt)
{
int i;
WWInterruptVector vector;
if (interrupt == NULL)
Wonx_Error("WWInterrupt_Destroy", "Object is not created.");
for (i = 0; i < 8; i++) {
vector = WWInterrupt_GetVector(interrupt, i);
if (vector != NULL)
WWInterrupt_SetVector(interrupt, i, WWInterruptVector_Destroy(vector));
}
free(interrupt);
return (NULL);
}
/*****************************************************************************/
/* ここまで */
/*****************************************************************************/
/*****************************************************************************/
/* End of File. */
/*****************************************************************************/