mirror of
https://github.com/Rainchus/mp1.git
synced 2024-11-26 22:40:24 +00:00
cache, set, and some gu funcs migrated
This commit is contained in:
parent
03e569d22d
commit
28e0ee52cf
818
include/PR/abi.h
818
include/PR/abi.h
@ -1,411 +1,407 @@
|
||||
#ifndef _ABI_H_
|
||||
#define _ABI_H_
|
||||
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.32 $
|
||||
* $Date: 1997/02/11 08:16:37 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/abi.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Header file for the Audio Binary Interface.
|
||||
* This is included in the Media Binary Interface file
|
||||
* mbi.h.
|
||||
*
|
||||
* This file follows the framework used for graphics.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Audio commands: */
|
||||
#define A_SPNOOP 0
|
||||
#define A_ADPCM 1
|
||||
#define A_CLEARBUFF 2
|
||||
#define A_ENVMIXER 3
|
||||
#define A_LOADBUFF 4
|
||||
#define A_RESAMPLE 5
|
||||
#define A_SAVEBUFF 6
|
||||
#define A_SEGMENT 7
|
||||
#define A_SETBUFF 8
|
||||
#define A_SETVOL 9
|
||||
#define A_DMEMMOVE 10
|
||||
#define A_LOADADPCM 11
|
||||
#define A_MIXER 12
|
||||
#define A_INTERLEAVE 13
|
||||
#define A_POLEF 14
|
||||
#define A_SETLOOP 15
|
||||
|
||||
#define ACMD_SIZE 32
|
||||
/*
|
||||
* Audio flags
|
||||
*/
|
||||
|
||||
#define A_INIT 0x01
|
||||
#define A_CONTINUE 0x00
|
||||
#define A_LOOP 0x02
|
||||
#define A_OUT 0x02
|
||||
#define A_LEFT 0x02
|
||||
#define A_RIGHT 0x00
|
||||
#define A_VOL 0x04
|
||||
#define A_RATE 0x00
|
||||
#define A_AUX 0x08
|
||||
#define A_NOAUX 0x00
|
||||
#define A_MAIN 0x00
|
||||
#define A_MIX 0x10
|
||||
|
||||
/*
|
||||
* BEGIN C-specific section: (typedef's)
|
||||
*/
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/*
|
||||
* Data Structures.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int addr;
|
||||
} Aadpcm;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int addr;
|
||||
} Apolef;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Aenvelope;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int dmem:16;
|
||||
unsigned int pad2:16;
|
||||
unsigned int count:16;
|
||||
} Aclearbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int pad2:16;
|
||||
unsigned int inL:16;
|
||||
unsigned int inR:16;
|
||||
} Ainterleave;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int addr;
|
||||
} Aloadbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Aenvmixer;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int dmemi:16;
|
||||
unsigned int dmemo:16;
|
||||
} Amixer;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int dmem2:16;
|
||||
unsigned int addr;
|
||||
} Apan;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pitch:16;
|
||||
unsigned int addr;
|
||||
} Aresample;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Areverb;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int addr;
|
||||
} Asavebuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int pad2:2;
|
||||
unsigned int number:4;
|
||||
unsigned int base:24;
|
||||
} Asegment;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int dmemin:16;
|
||||
unsigned int dmemout:16;
|
||||
unsigned int count:16;
|
||||
} Asetbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int vol:16;
|
||||
unsigned int voltgt:16;
|
||||
unsigned int volrate:16;
|
||||
} Asetvol;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int dmemin:16;
|
||||
unsigned int dmemout:16;
|
||||
unsigned int count:16;
|
||||
} Admemmove;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int count:16;
|
||||
unsigned int addr;
|
||||
} Aloadadpcm;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int pad2:16;
|
||||
unsigned int addr;
|
||||
} Asetloop;
|
||||
|
||||
/*
|
||||
* Generic Acmd Packet
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned int w0;
|
||||
unsigned int w1;
|
||||
} Awords;
|
||||
|
||||
typedef union {
|
||||
Awords words;
|
||||
Aadpcm adpcm;
|
||||
Apolef polef;
|
||||
Aclearbuff clearbuff;
|
||||
Aenvelope envelope;
|
||||
Ainterleave interleave;
|
||||
Aloadbuff loadbuff;
|
||||
Aenvmixer envmixer;
|
||||
Aresample resample;
|
||||
Areverb reverb;
|
||||
Asavebuff savebuff;
|
||||
Asegment segment;
|
||||
Asetbuff setbuff;
|
||||
Asetvol setvol;
|
||||
Admemmove dmemmove;
|
||||
Aloadadpcm loadadpcm;
|
||||
Amixer mixer;
|
||||
Asetloop setloop;
|
||||
long long int force_union_align; /* dummy, force alignment */
|
||||
} Acmd;
|
||||
|
||||
/*
|
||||
* ADPCM State
|
||||
*/
|
||||
#define ADPCMVSIZE 8
|
||||
#define ADPCMFSIZE 16
|
||||
typedef short ADPCM_STATE[ADPCMFSIZE];
|
||||
|
||||
/*
|
||||
* Pole filter state
|
||||
*/
|
||||
typedef short POLEF_STATE[4];
|
||||
|
||||
/*
|
||||
* Resampler state
|
||||
*/
|
||||
typedef short RESAMPLE_STATE[16];
|
||||
|
||||
/*
|
||||
* Resampler constants
|
||||
*/
|
||||
#define UNITY_PITCH 0x8000
|
||||
#define MAX_RATIO 1.99996 /* within .03 cents of +1 octave */
|
||||
|
||||
/*
|
||||
* Enveloper/Mixer state
|
||||
*/
|
||||
typedef short ENVMIX_STATE[40];
|
||||
|
||||
/*
|
||||
* Macros to assemble the audio command list
|
||||
*/
|
||||
|
||||
#define aADPCMdec(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(f, 16, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aPoleFilter(pkt, f, g, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(g, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aClearBuffer(pkt, d, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_CLEARBUFF, 24, 8) | _SHIFTL(d, 0, 24); \
|
||||
_a->words.w1 = (unsigned int)(c); \
|
||||
}
|
||||
|
||||
#define aEnvMixer(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aInterleave(pkt, l, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \
|
||||
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
#define aLoadBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aMix(pkt, f, g, i, o) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(g, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(i,16, 16) | _SHIFTL(o, 0, 16); \
|
||||
}
|
||||
|
||||
#define aPan(pkt, f, d, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_PAN, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(d, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aResample(pkt, f, p, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(f, 16, 8) |\
|
||||
_SHIFTL(p, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aSaveBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aSegment(pkt, s, b) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_SEGMENT, 24, 8); \
|
||||
_a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \
|
||||
}
|
||||
|
||||
#define aSetBuffer(pkt, f, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(i, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
#define aSetVolume(pkt, f, v, t, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | \
|
||||
_SHIFTL(v, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
#define aSetLoop(pkt, a) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
_a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(a); \
|
||||
}
|
||||
|
||||
#define aDMEMMove(pkt, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_DMEMMOVE, 24, 8) | _SHIFTL(i, 0, 24); \
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
#define aLoadADPCM(pkt, c, d) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \
|
||||
_a->words.w1 = (unsigned int) d; \
|
||||
}
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#endif /* !_ABI_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _ABI_H_
|
||||
#define _ABI_H_
|
||||
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.32 $
|
||||
* $Date: 1997/02/11 08:16:37 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/abi.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Header file for the Audio Binary Interface.
|
||||
* This is included in the Media Binary Interface file
|
||||
* mbi.h.
|
||||
*
|
||||
* This file follows the framework used for graphics.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Audio commands: */
|
||||
#define A_SPNOOP 0
|
||||
#define A_ADPCM 1
|
||||
#define A_CLEARBUFF 2
|
||||
#define A_ENVMIXER 3
|
||||
#define A_LOADBUFF 4
|
||||
#define A_RESAMPLE 5
|
||||
#define A_SAVEBUFF 6
|
||||
#define A_SEGMENT 7
|
||||
#define A_SETBUFF 8
|
||||
#define A_SETVOL 9
|
||||
#define A_DMEMMOVE 10
|
||||
#define A_LOADADPCM 11
|
||||
#define A_MIXER 12
|
||||
#define A_INTERLEAVE 13
|
||||
#define A_POLEF 14
|
||||
#define A_SETLOOP 15
|
||||
|
||||
#define ACMD_SIZE 32
|
||||
/*
|
||||
* Audio flags
|
||||
*/
|
||||
|
||||
#define A_INIT 0x01
|
||||
#define A_CONTINUE 0x00
|
||||
#define A_LOOP 0x02
|
||||
#define A_OUT 0x02
|
||||
#define A_LEFT 0x02
|
||||
#define A_RIGHT 0x00
|
||||
#define A_VOL 0x04
|
||||
#define A_RATE 0x00
|
||||
#define A_AUX 0x08
|
||||
#define A_NOAUX 0x00
|
||||
#define A_MAIN 0x00
|
||||
#define A_MIX 0x10
|
||||
|
||||
/*
|
||||
* BEGIN C-specific section: (typedef's)
|
||||
*/
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/*
|
||||
* Data Structures.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int addr;
|
||||
} Aadpcm;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int addr;
|
||||
} Apolef;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Aenvelope;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int dmem:16;
|
||||
unsigned int pad2:16;
|
||||
unsigned int count:16;
|
||||
} Aclearbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int pad2:16;
|
||||
unsigned int inL:16;
|
||||
unsigned int inR:16;
|
||||
} Ainterleave;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int addr;
|
||||
} Aloadbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Aenvmixer;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int gain:16;
|
||||
unsigned int dmemi:16;
|
||||
unsigned int dmemo:16;
|
||||
} Amixer;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int dmem2:16;
|
||||
unsigned int addr;
|
||||
} Apan;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pitch:16;
|
||||
unsigned int addr;
|
||||
} Aresample;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int pad1:16;
|
||||
unsigned int addr;
|
||||
} Areverb;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int addr;
|
||||
} Asavebuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:24;
|
||||
unsigned int pad2:2;
|
||||
unsigned int number:4;
|
||||
unsigned int base:24;
|
||||
} Asegment;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int dmemin:16;
|
||||
unsigned int dmemout:16;
|
||||
unsigned int count:16;
|
||||
} Asetbuff;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int flags:8;
|
||||
unsigned int vol:16;
|
||||
unsigned int voltgt:16;
|
||||
unsigned int volrate:16;
|
||||
} Asetvol;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int dmemin:16;
|
||||
unsigned int dmemout:16;
|
||||
unsigned int count:16;
|
||||
} Admemmove;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int count:16;
|
||||
unsigned int addr;
|
||||
} Aloadadpcm;
|
||||
|
||||
typedef struct {
|
||||
unsigned int cmd:8;
|
||||
unsigned int pad1:8;
|
||||
unsigned int pad2:16;
|
||||
unsigned int addr;
|
||||
} Asetloop;
|
||||
|
||||
/*
|
||||
* Generic Acmd Packet
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned int w0;
|
||||
unsigned int w1;
|
||||
} Awords;
|
||||
|
||||
typedef union {
|
||||
Awords words;
|
||||
Aadpcm adpcm;
|
||||
Apolef polef;
|
||||
Aclearbuff clearbuff;
|
||||
Aenvelope envelope;
|
||||
Ainterleave interleave;
|
||||
Aloadbuff loadbuff;
|
||||
Aenvmixer envmixer;
|
||||
Aresample resample;
|
||||
Areverb reverb;
|
||||
Asavebuff savebuff;
|
||||
Asegment segment;
|
||||
Asetbuff setbuff;
|
||||
Asetvol setvol;
|
||||
Admemmove dmemmove;
|
||||
Aloadadpcm loadadpcm;
|
||||
Amixer mixer;
|
||||
Asetloop setloop;
|
||||
long long int force_union_align; /* dummy, force alignment */
|
||||
} Acmd;
|
||||
|
||||
/*
|
||||
* ADPCM State
|
||||
*/
|
||||
#define ADPCMVSIZE 8
|
||||
#define ADPCMFSIZE 16
|
||||
typedef short ADPCM_STATE[ADPCMFSIZE];
|
||||
|
||||
/*
|
||||
* Pole filter state
|
||||
*/
|
||||
typedef short POLEF_STATE[4];
|
||||
|
||||
/*
|
||||
* Resampler state
|
||||
*/
|
||||
typedef short RESAMPLE_STATE[16];
|
||||
|
||||
/*
|
||||
* Resampler constants
|
||||
*/
|
||||
#define UNITY_PITCH 0x8000
|
||||
#define MAX_RATIO 1.99996 /* within .03 cents of +1 octave */
|
||||
|
||||
/*
|
||||
* Enveloper/Mixer state
|
||||
*/
|
||||
typedef short ENVMIX_STATE[40];
|
||||
|
||||
/*
|
||||
* Macros to assemble the audio command list
|
||||
*/
|
||||
|
||||
#define aADPCMdec(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(f, 16, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aPoleFilter(pkt, f, g, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(g, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aClearBuffer(pkt, d, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_CLEARBUFF, 24, 8) | _SHIFTL(d, 0, 24); \
|
||||
_a->words.w1 = (unsigned int)(c); \
|
||||
}
|
||||
|
||||
#define aEnvMixer(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aInterleave(pkt, l, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \
|
||||
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
#define aLoadBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aMix(pkt, f, g, i, o) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(g, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(i,16, 16) | _SHIFTL(o, 0, 16); \
|
||||
}
|
||||
|
||||
#define aPan(pkt, f, d, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_PAN, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(d, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aResample(pkt, f, p, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(f, 16, 8) |\
|
||||
_SHIFTL(p, 0, 16)); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aSaveBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(s); \
|
||||
}
|
||||
|
||||
#define aSegment(pkt, s, b) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_SEGMENT, 24, 8); \
|
||||
_a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \
|
||||
}
|
||||
|
||||
#define aSetBuffer(pkt, f, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | \
|
||||
_SHIFTL(i, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
#define aSetVolume(pkt, f, v, t, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | \
|
||||
_SHIFTL(v, 0, 16)); \
|
||||
_a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
#define aSetLoop(pkt, a) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
_a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \
|
||||
_a->words.w1 = (unsigned int)(a); \
|
||||
}
|
||||
|
||||
#define aDMEMMove(pkt, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_DMEMMOVE, 24, 8) | _SHIFTL(i, 0, 24); \
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
#define aLoadADPCM(pkt, c, d) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
\
|
||||
_a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \
|
||||
_a->words.w1 = (unsigned int) d; \
|
||||
}
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#endif /* !_ABI_H_ */
|
||||
|
8757
include/PR/gbi.h
8757
include/PR/gbi.h
File diff suppressed because it is too large
Load Diff
@ -263,5 +263,4 @@ void guSprite2DInit(uSprite *SpritePointer,
|
||||
int SourceImageOffsetS,
|
||||
int SourceImageOffsetT);
|
||||
|
||||
#endif /* !_GU_H_ */
|
||||
|
||||
#endif /* !_GU_H_ */
|
197
include/PR/mbi.h
197
include/PR/mbi.h
@ -1,99 +1,98 @@
|
||||
#ifndef _MBI_H_
|
||||
#define _MBI_H_
|
||||
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.135 $
|
||||
* $Date: 1997/11/26 00:30:54 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/mbi.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Header file for the Media Binary Interface
|
||||
*
|
||||
* NOTE: This file is included by the RSP microcode, so any C-specific
|
||||
* constructs must be bracketed by #ifdef _LANGUAGE_C
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* the SHIFT macros are used to build display list commands, inserting
|
||||
* bit-fields into a 32-bit word. They take a value, a shift amount,
|
||||
* and a width.
|
||||
*
|
||||
* For the left shift, the lower bits of the value are masked,
|
||||
* then shifted left.
|
||||
*
|
||||
* For the right shift, the value is shifted right, then the lower bits
|
||||
* are masked.
|
||||
*
|
||||
* (NOTE: _SHIFTL(v, 0, 32) won't work, just use an assignment)
|
||||
*
|
||||
*/
|
||||
#define _SHIFTL(v, s, w) \
|
||||
((unsigned int) (((unsigned int)(v) & ((0x01 << (w)) - 1)) << (s)))
|
||||
#define _SHIFTR(v, s, w) \
|
||||
((unsigned int)(((unsigned int)(v) >> (s)) & ((0x01 << (w)) - 1)))
|
||||
|
||||
#define _SHIFT _SHIFTL /* old, for compatibility only */
|
||||
|
||||
#define G_ON (1)
|
||||
#define G_OFF (0)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Graphics Binary Interface
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include <PR/gbi.h>
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Audio Binary Interface
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include <PR/abi.h>
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Task list
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#define M_GFXTASK 1
|
||||
#define M_AUDTASK 2
|
||||
#define M_VIDTASK 3
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Segment macros and definitions
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#define NUM_SEGMENTS (16)
|
||||
#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff)
|
||||
#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28)
|
||||
#define SEGMENT_ADDR(num, off) (((num) << 24) + (off))
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#endif /* !_MBI_H_ */
|
||||
|
||||
#ifndef _MBI_H_
|
||||
#define _MBI_H_
|
||||
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.135 $
|
||||
* $Date: 1997/11/26 00:30:54 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/mbi.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Header file for the Media Binary Interface
|
||||
*
|
||||
* NOTE: This file is included by the RSP microcode, so any C-specific
|
||||
* constructs must be bracketed by #ifdef _LANGUAGE_C
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* the SHIFT macros are used to build display list commands, inserting
|
||||
* bit-fields into a 32-bit word. They take a value, a shift amount,
|
||||
* and a width.
|
||||
*
|
||||
* For the left shift, the lower bits of the value are masked,
|
||||
* then shifted left.
|
||||
*
|
||||
* For the right shift, the value is shifted right, then the lower bits
|
||||
* are masked.
|
||||
*
|
||||
* (NOTE: _SHIFTL(v, 0, 32) won't work, just use an assignment)
|
||||
*
|
||||
*/
|
||||
#define _SHIFTL(v, s, w) \
|
||||
((unsigned int) (((unsigned int)(v) & ((0x01 << (w)) - 1)) << (s)))
|
||||
#define _SHIFTR(v, s, w) \
|
||||
((unsigned int)(((unsigned int)(v) >> (s)) & ((0x01 << (w)) - 1)))
|
||||
|
||||
#define _SHIFT _SHIFTL /* old, for compatibility only */
|
||||
|
||||
#define G_ON (1)
|
||||
#define G_OFF (0)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Graphics Binary Interface
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include <PR/gbi.h>
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Audio Binary Interface
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include <PR/abi.h>
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Task list
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#define M_GFXTASK 1
|
||||
#define M_AUDTASK 2
|
||||
#define M_VIDTASK 3
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Segment macros and definitions
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#define NUM_SEGMENTS (16)
|
||||
#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff)
|
||||
#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28)
|
||||
#define SEGMENT_ADDR(num, off) (((num) << 24) + (off))
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#endif /* !_MBI_H_ */
|
@ -1,201 +1,201 @@
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1995, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.8 $
|
||||
* $Date: 1997/11/10 10:48:35 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/sptask.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef _SPTASK_H_
|
||||
#define _SPTASK_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <PR/ultratypes.h>
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Type definitions
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Task List Structure.
|
||||
*
|
||||
* Things an app might pass to the SP via the task list.
|
||||
* Not every task ucode would need/use every field, but
|
||||
*
|
||||
* - type (audio, gfx, video, ...)
|
||||
* - flags
|
||||
* - wait for DP to drain before running new task
|
||||
* - SEE BIT DEFINITIONS UNDER "Task Flags field"
|
||||
* - pointer to boot ucode
|
||||
* - size of boot ucode
|
||||
* - pointer to ucode
|
||||
* - size of ucode
|
||||
* - pointer to initial DMEM data
|
||||
* - size of initial DMEM data
|
||||
* - pointer to DRAM stack
|
||||
* - size of DRAM stack (max)
|
||||
* - pointer to output buffer
|
||||
* - pointer to store output buffer length
|
||||
* - generic data pointer (for display list, etc.)
|
||||
* - generic data length (for display list, etc.)
|
||||
* - pointer to buffer where to store saved DMEM (in yield case)
|
||||
* - size of buffer to store saved DMEM.
|
||||
*
|
||||
* IMPORTANT!!! Watch alignment issues.
|
||||
*
|
||||
* IMPORTANT!!! Watch data cache issues. The RCP may write data into the
|
||||
* dram_stack, output_buff, output_buff_size, and the yield_data_ptr areas.
|
||||
* These buffers should be cache aligned and use the entire line (16 bytes) to
|
||||
* avoid corruption by writebacks by the CPU (cache tearing).
|
||||
*
|
||||
* IMPORTANT!!! all addresses are virtual addresses. Library does
|
||||
* any necessary translation.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 flags;
|
||||
|
||||
u64 *ucode_boot;
|
||||
u32 ucode_boot_size;
|
||||
|
||||
u64 *ucode;
|
||||
u32 ucode_size;
|
||||
|
||||
u64 *ucode_data;
|
||||
u32 ucode_data_size;
|
||||
|
||||
u64 *dram_stack;
|
||||
u32 dram_stack_size;
|
||||
|
||||
u64 *output_buff;
|
||||
u64 *output_buff_size;
|
||||
|
||||
u64 *data_ptr;
|
||||
u32 data_size;
|
||||
|
||||
u64 *yield_data_ptr;
|
||||
u32 yield_data_size;
|
||||
|
||||
} OSTask_t;
|
||||
|
||||
typedef union {
|
||||
OSTask_t t;
|
||||
long long int force_structure_alignment;
|
||||
} OSTask;
|
||||
|
||||
typedef u32 OSYieldResult;
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#ifdef _LANGUAGE_ASSEMBLY
|
||||
|
||||
/*
|
||||
* For the RSP ucode:
|
||||
* offsets into the task structure
|
||||
*/
|
||||
|
||||
#include <PR/sptaskoff.h>
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Task Flags field
|
||||
*/
|
||||
#define OS_TASK_YIELDED 0x0001
|
||||
#define OS_TASK_DP_WAIT 0x0002
|
||||
#define OS_TASK_LOADABLE 0x0004
|
||||
#define OS_TASK_SP_ONLY 0x0008
|
||||
#define OS_TASK_USR0 0x0010
|
||||
#define OS_TASK_USR1 0x0020
|
||||
#define OS_TASK_USR2 0x0040
|
||||
#define OS_TASK_USR3 0x0080
|
||||
|
||||
/*
|
||||
* Size of Yield buffer. The taskHdrPtr->t.yield_data_ptr must point to a
|
||||
* buffer of this size. (The size is in bytes). ONLY If the task will NEVER
|
||||
* yield it may be a null pointer. The buffer must be aligned to a 64 bit
|
||||
* boundary. The taskHdrPtr->t.yield_data_ptr must be set to point to the
|
||||
* buffer BEFORE the task is started.
|
||||
*/
|
||||
#if (defined(F3DEX_GBI)||defined(F3DLP_GBI))
|
||||
#define OS_YIELD_DATA_SIZE 0xc00
|
||||
#else
|
||||
#define OS_YIELD_DATA_SIZE 0x900
|
||||
#endif
|
||||
#define OS_YIELD_AUDIO_SIZE 0x400
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Global definitions
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Macro definitions
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* this macro simulates atomic action.
|
||||
*/
|
||||
#define osSpTaskStart(tp) \
|
||||
{ \
|
||||
osSpTaskLoad((tp)); \
|
||||
osSpTaskStartGo((tp)); \
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Extern variables
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Function prototypes
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* break this up into two steps for debugging.
|
||||
*/
|
||||
extern void osSpTaskLoad(OSTask *tp);
|
||||
extern void osSpTaskStartGo(OSTask *tp);
|
||||
|
||||
extern void osSpTaskYield(void);
|
||||
extern OSYieldResult osSpTaskYielded(OSTask *tp);
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_SPTASK_H */
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1995, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* $Revision: 1.8 $
|
||||
* $Date: 1997/11/10 10:48:35 $
|
||||
* $Source: /hosts/liberte/disk6/Master/cvsmdev2/PR/include/sptask.h,v $
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef _SPTASK_H_
|
||||
#define _SPTASK_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <PR/ultratypes.h>
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Type definitions
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Task List Structure.
|
||||
*
|
||||
* Things an app might pass to the SP via the task list.
|
||||
* Not every task ucode would need/use every field, but
|
||||
*
|
||||
* - type (audio, gfx, video, ...)
|
||||
* - flags
|
||||
* - wait for DP to drain before running new task
|
||||
* - SEE BIT DEFINITIONS UNDER "Task Flags field"
|
||||
* - pointer to boot ucode
|
||||
* - size of boot ucode
|
||||
* - pointer to ucode
|
||||
* - size of ucode
|
||||
* - pointer to initial DMEM data
|
||||
* - size of initial DMEM data
|
||||
* - pointer to DRAM stack
|
||||
* - size of DRAM stack (max)
|
||||
* - pointer to output buffer
|
||||
* - pointer to store output buffer length
|
||||
* - generic data pointer (for display list, etc.)
|
||||
* - generic data length (for display list, etc.)
|
||||
* - pointer to buffer where to store saved DMEM (in yield case)
|
||||
* - size of buffer to store saved DMEM.
|
||||
*
|
||||
* IMPORTANT!!! Watch alignment issues.
|
||||
*
|
||||
* IMPORTANT!!! Watch data cache issues. The RCP may write data into the
|
||||
* dram_stack, output_buff, output_buff_size, and the yield_data_ptr areas.
|
||||
* These buffers should be cache aligned and use the entire line (16 bytes) to
|
||||
* avoid corruption by writebacks by the CPU (cache tearing).
|
||||
*
|
||||
* IMPORTANT!!! all addresses are virtual addresses. Library does
|
||||
* any necessary translation.
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 flags;
|
||||
|
||||
u64 *ucode_boot;
|
||||
u32 ucode_boot_size;
|
||||
|
||||
u64 *ucode;
|
||||
u32 ucode_size;
|
||||
|
||||
u64 *ucode_data;
|
||||
u32 ucode_data_size;
|
||||
|
||||
u64 *dram_stack;
|
||||
u32 dram_stack_size;
|
||||
|
||||
u64 *output_buff;
|
||||
u64 *output_buff_size;
|
||||
|
||||
u64 *data_ptr;
|
||||
u32 data_size;
|
||||
|
||||
u64 *yield_data_ptr;
|
||||
u32 yield_data_size;
|
||||
|
||||
} OSTask_t;
|
||||
|
||||
typedef union {
|
||||
OSTask_t t;
|
||||
long long int force_structure_alignment;
|
||||
} OSTask;
|
||||
|
||||
typedef u32 OSYieldResult;
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#ifdef _LANGUAGE_ASSEMBLY
|
||||
|
||||
/*
|
||||
* For the RSP ucode:
|
||||
* offsets into the task structure
|
||||
*/
|
||||
|
||||
#include <PR/sptaskoff.h>
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Task Flags field
|
||||
*/
|
||||
#define OS_TASK_YIELDED 0x0001
|
||||
#define OS_TASK_DP_WAIT 0x0002
|
||||
#define OS_TASK_LOADABLE 0x0004
|
||||
#define OS_TASK_SP_ONLY 0x0008
|
||||
#define OS_TASK_USR0 0x0010
|
||||
#define OS_TASK_USR1 0x0020
|
||||
#define OS_TASK_USR2 0x0040
|
||||
#define OS_TASK_USR3 0x0080
|
||||
|
||||
/*
|
||||
* Size of Yield buffer. The taskHdrPtr->t.yield_data_ptr must point to a
|
||||
* buffer of this size. (The size is in bytes). ONLY If the task will NEVER
|
||||
* yield it may be a null pointer. The buffer must be aligned to a 64 bit
|
||||
* boundary. The taskHdrPtr->t.yield_data_ptr must be set to point to the
|
||||
* buffer BEFORE the task is started.
|
||||
*/
|
||||
#if (defined(F3DEX_GBI)||defined(F3DLP_GBI))
|
||||
#define OS_YIELD_DATA_SIZE 0xc00
|
||||
#else
|
||||
#define OS_YIELD_DATA_SIZE 0x900
|
||||
#endif
|
||||
#define OS_YIELD_AUDIO_SIZE 0x400
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Global definitions
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Macro definitions
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* this macro simulates atomic action.
|
||||
*/
|
||||
#define osSpTaskStart(tp) \
|
||||
{ \
|
||||
osSpTaskLoad((tp)); \
|
||||
osSpTaskStartGo((tp)); \
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Extern variables
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Function prototypes
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* break this up into two steps for debugging.
|
||||
*/
|
||||
extern void osSpTaskLoad(OSTask *tp);
|
||||
extern void osSpTaskStartGo(OSTask *tp);
|
||||
|
||||
extern void osSpTaskYield(void);
|
||||
extern OSYieldResult osSpTaskYielded(OSTask *tp);
|
||||
|
||||
#endif /* _LANGUAGE_C */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_SPTASK_H */
|
||||
|
@ -316,7 +316,7 @@ void func_8006E070(s16, s32);
|
||||
u16 func_800174F4(s32, s32);
|
||||
void func_8001775C(unkObjectStruct*, s32, s32);
|
||||
void func_800264F8(s16, s16, f32, char*, char*, s32);
|
||||
f32 func_80088060(f32);
|
||||
f32 __sinf(f32);
|
||||
void func_8001D420(s32, void*, void*, void*);
|
||||
void func_8001D57C(s32);
|
||||
f32 func_800B1750(f32);
|
||||
|
72
include/sys/asm.h
Normal file
72
include/sys/asm.h
Normal file
@ -0,0 +1,72 @@
|
||||
/************************************************************************
|
||||
Copyright (C) 1998,1999 NINTENDO Co,Ltd,
|
||||
Copyright (C) 1998,1999 MONEGI CORPORATION,
|
||||
All Rights Reserved
|
||||
This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp.
|
||||
and it is not to be reproduced, published, disclosed to others, copied,
|
||||
adapted, distributed, or displayed without the prior authorization of
|
||||
NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed
|
||||
this Notice on all copies of the program, including partial copies or
|
||||
modified versions thereof.
|
||||
*************************************************************************/
|
||||
/************************************************************************
|
||||
$Date: 1999/07/06 13:21:13 $
|
||||
$Revision: 1.1 $
|
||||
$Author: doseki $
|
||||
************************************************************************/
|
||||
|
||||
#ifndef __ASM_H__
|
||||
#define __ASM_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define _MIPS_ISA_MIPS1 1 /* R2/3K */
|
||||
#define _MIPS_ISA_MIPS2 2 /* R4K/6K */
|
||||
#define _MIPS_ISA_MIPS3 3 /* R4K */
|
||||
#define _MIPS_ISA_MIPS4 4 /* TFP */
|
||||
|
||||
#define _MIPS_SIM_ABI32 1 /* MIPS MSIG calling convention */
|
||||
#define _MIPS_SIM_NABI32 2 /* MIPS new 32-bit abi */
|
||||
/* NABI32 is 64bit calling convention but 32bit type sizes) */
|
||||
#define _MIPS_SIM_ABI64 3 /* MIPS 64 calling convention */
|
||||
|
||||
#define LEAF(x) \
|
||||
.globl x; \
|
||||
.ent x,0; \
|
||||
x:; \
|
||||
.frame sp,0,ra
|
||||
|
||||
#define XLEAF(x) \
|
||||
.global x;
|
||||
|
||||
#define END(proc) \
|
||||
.end proc
|
||||
|
||||
#define ABS(x, y) \
|
||||
.globl x; \
|
||||
x = y
|
||||
|
||||
#define EXPORT(x) \
|
||||
.globl x; \
|
||||
x:
|
||||
/*
|
||||
#define WEAK(x, y) \
|
||||
.weak x; \
|
||||
.set x,y;
|
||||
*/
|
||||
|
||||
#define WEAK(x, y)
|
||||
|
||||
#define STAY1(stmnt) .set noreorder; stmnt; .set reorder;
|
||||
#define STAY2(stmnt, arg1) .set noreorder; stmnt, arg1; .set reorder;
|
||||
#define STAY3(stmnt, arg1, arg2) .set noreorder; stmnt, arg1, arg2; .set reorder;
|
||||
#define NOP .set noreorder; nop; .set reorder;
|
||||
#define CACHE(op, reg) .set noreorder; cache op, reg; .set reorder;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !__ASM_H__ */
|
187
include/sys/regdef.h
Normal file
187
include/sys/regdef.h
Normal file
@ -0,0 +1,187 @@
|
||||
/************************************************************************
|
||||
Copyright (C) 1998,1999 NINTENDO Co,Ltd,
|
||||
Copyright (C) 1998,1999 MONEGI CORPORATION,
|
||||
All Rights Reserved
|
||||
This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp.
|
||||
and it is not to be reproduced, published, disclosed to others, copied,
|
||||
adapted, distributed, or displayed without the prior authorization of
|
||||
NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed
|
||||
this Notice on all copies of the program, including partial copies or
|
||||
modified versions thereof.
|
||||
*************************************************************************/
|
||||
/************************************************************************
|
||||
$Date: 1999/07/06 13:21:13 $
|
||||
$Revision: 1.1 $
|
||||
$Author: doseki $
|
||||
************************************************************************/
|
||||
|
||||
#ifndef __REGDEF_H__
|
||||
#define __REGDEF_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef mips
|
||||
|
||||
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
|
||||
#define zero $0
|
||||
#define AT $at
|
||||
#define v0 $2
|
||||
#define v1 $3
|
||||
#define a0 $4
|
||||
#define a1 $5
|
||||
#define a2 $6
|
||||
#define a3 $7
|
||||
#define t0 $8
|
||||
#define t1 $9
|
||||
#define t2 $10
|
||||
#define t3 $11
|
||||
#define t4 $12
|
||||
#define ta0 $12
|
||||
#define t5 $13
|
||||
#define ta1 $13
|
||||
#define t6 $14
|
||||
#define ta2 $14
|
||||
#define t7 $15
|
||||
#define ta3 $15
|
||||
#define s0 $16
|
||||
#define s1 $17
|
||||
#define s2 $18
|
||||
#define s3 $19
|
||||
#define s4 $20
|
||||
#define s5 $21
|
||||
#define s6 $22
|
||||
#define s7 $23
|
||||
#define t8 $24
|
||||
#define t9 $25
|
||||
#define jp $25
|
||||
#define k0 $26
|
||||
#define k1 $27
|
||||
#define gp $28
|
||||
#define sp $29
|
||||
#define fp $30
|
||||
#define s8 $30
|
||||
#define ra $31
|
||||
#endif
|
||||
|
||||
#if (_MIPS_SIM == _MIPS_SIM_ABI64)
|
||||
#define zero $0
|
||||
#define AT $at
|
||||
#define v0 $2
|
||||
#define v1 $3
|
||||
#define a0 $4
|
||||
#define a1 $5
|
||||
#define a2 $6
|
||||
#define a3 $7
|
||||
#define a4 $8
|
||||
#define ta0 $8
|
||||
#define a5 $9
|
||||
#define ta1 $9
|
||||
#define a6 $10
|
||||
#define ta2 $10
|
||||
#define a7 $11
|
||||
#define ta3 $11
|
||||
#define t0 $12
|
||||
#define t1 $13
|
||||
#define t2 $14
|
||||
#define t3 $15
|
||||
#define s0 $16
|
||||
#define s1 $17
|
||||
#define s2 $18
|
||||
#define s3 $19
|
||||
#define s4 $20
|
||||
#define s5 $21
|
||||
#define s6 $22
|
||||
#define s7 $23
|
||||
#define t8 $24
|
||||
#define t9 $25
|
||||
#define jp $25
|
||||
#define k0 $26
|
||||
#define k1 $27
|
||||
#define gp $28
|
||||
#define sp $29
|
||||
#define fp $30
|
||||
#define s8 $30
|
||||
#define ra $31
|
||||
#endif
|
||||
|
||||
#if (_MIPS_SIM == _MIPS_SIM_ABI32)
|
||||
#define fv0 $f0
|
||||
#define fv0f $f1
|
||||
#define fv1 $f2
|
||||
#define fv1f $f3
|
||||
#define fa0 $f12
|
||||
#define fa0f $f13
|
||||
#define fa1 $f14
|
||||
#define fa1f $f15
|
||||
#define ft0 $f4
|
||||
#define ft0f $f5
|
||||
#define ft1 $f6
|
||||
#define ft1f $f7
|
||||
#define ft2 $f8
|
||||
#define ft2f $f9
|
||||
#define ft3 $f10
|
||||
#define ft3f $f11
|
||||
#define ft4 $f16
|
||||
#define ft4f $f17
|
||||
#define ft5 $f18
|
||||
#define ft5f $f19
|
||||
#define fs0 $f20
|
||||
#define fs0f $f21
|
||||
#define fs1 $f22
|
||||
#define fs1f $f23
|
||||
#define fs2 $f24
|
||||
#define fs2f $f25
|
||||
#define fs3 $f26
|
||||
#define fs3f $f27
|
||||
#define fs4 $f28
|
||||
#define fs4f $f29
|
||||
#define fs5 $f30
|
||||
#define fs5f $f31
|
||||
#endif
|
||||
|
||||
#if (_MIPS_SIM == _MIPS_SIM_ABI64)
|
||||
#define fv0 $f0
|
||||
#define fv1 $f2
|
||||
#define fa0 $f12
|
||||
#define fa1 $f13
|
||||
#define fa2 $f14
|
||||
#define fa3 $f15
|
||||
#define fa4 $f16
|
||||
#define fa5 $f17
|
||||
#define fa6 $f18
|
||||
#define fa7 $f19
|
||||
#define ft0 $f4
|
||||
#define ft1 $f5
|
||||
#define ft2 $f6
|
||||
#define ft3 $f7
|
||||
#define ft4 $f8
|
||||
#define ft5 $f9
|
||||
#define ft6 $f10
|
||||
#define ft7 $f11
|
||||
#define ft8 $f20
|
||||
#define ft9 $f21
|
||||
#define ft10 $f22
|
||||
#define ft11 $f23
|
||||
#define ft12 $f1
|
||||
#define ft13 $f3
|
||||
#define fs0 $f24
|
||||
#define fs1 $f25
|
||||
#define fs2 $f26
|
||||
#define fs3 $f27
|
||||
#define fs4 $f28
|
||||
#define fs5 $f29
|
||||
#define fs6 $f30
|
||||
#define fs7 $f31
|
||||
#endif
|
||||
|
||||
#define fcr31 $31
|
||||
|
||||
#endif /* mips */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !__REGDEF_H__ */
|
@ -115,6 +115,17 @@ segments:
|
||||
- [0x83490, bin]
|
||||
#- [0x83490, c] #has some code, weird to split?
|
||||
- [0x83960, c]
|
||||
- [0x88E00, c, "../src/lib/2.0I/gu/translate"]
|
||||
- [0x88ED0, c, "../src/lib/2.0I/gu/random"]
|
||||
- [0x88F00, hasm, "lib/2.0I/os/invaldcache"]
|
||||
- [0x88FB0, hasm, "lib/2.0I/os/invalicache"]
|
||||
- [0x89090, hasm, "lib/2.0I/os/setintmask"]
|
||||
- [0x89130, hasm, "lib/2.0I/os/setcause"]
|
||||
- [0x89140, hasm, "lib/2.0I/os/setcompare"]
|
||||
- [0x89150, hasm, "lib/2.0I/os/setcount"]
|
||||
- [0x89160, hasm, "lib/2.0I/os/setsr"]
|
||||
- [0x89170, hasm, "lib/2.0I/os/osWritebackDCache"]
|
||||
- [0x891F0, hasm, "lib/2.0I/os/writebackdcacheall"]
|
||||
- [0x89220, c, "../src/lib/2.0I/os/createmesgqueue"]
|
||||
- [0x89250, c, "../src/lib/2.0I/os/createthread"]
|
||||
- [0x89320, c, "../src/lib/2.0I/os/destroythread"]
|
||||
|
@ -41,7 +41,7 @@ void func_80046828(unkObjectStruct* arg0) {
|
||||
switch (arg0->unk_4C) {
|
||||
case 0:
|
||||
arg0->unk_24 = arg0->unk_24 + 30.0f;
|
||||
arg0->unk_30 = func_80088060(arg0->unk_24 * D_800CAFF0) * 0.5f + 1.0f;
|
||||
arg0->unk_30 = __sinf(arg0->unk_24 * D_800CAFF0) * 0.5f + 1.0f;
|
||||
|
||||
for (i = 1; (((D_800D6658 + 1) / 10) + 1) >= i; i++) {
|
||||
func_80067354(D_800D65FC[D_800D6654], i, arg0->unk_30, arg0->unk_30);
|
||||
@ -89,7 +89,7 @@ void func_800471FC(void) {
|
||||
}
|
||||
|
||||
void func_8004720C(unkObjectStruct* arg0) {
|
||||
arg0->unk_1C = 74.0f - (func_80088060((f32) ((f64) arg0->unk_28 * D_800CB008)) * 5.0f);
|
||||
arg0->unk_1C = 74.0f - (__sinf((f32) ((f64) arg0->unk_28 * D_800CB008)) * 5.0f);
|
||||
arg0->unk_28 += 8.0f;
|
||||
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
|
@ -251,7 +251,7 @@ void func_8004F044(Object* arg0) {
|
||||
void func_8004F084(unkObjectStruct* arg0) {
|
||||
f32 temp_f0;
|
||||
|
||||
func_800264F8(arg0->unk_3C, arg0->unk_44, (func_80088060((f32) (arg0->unk_18 * D_800CB128)) / 2.0f) + 0.5f, D_800CB110, D_800CB11C, 0);
|
||||
func_800264F8(arg0->unk_3C, arg0->unk_44, (__sinf((f32) (arg0->unk_18 * D_800CB128)) / 2.0f) + 0.5f, D_800CB110, D_800CB11C, 0);
|
||||
arg0->unk_18 += 20.0f;
|
||||
if (arg0->unk_18 >= 360.0f) {
|
||||
arg0->unk_18 -= 360.0f;
|
||||
|
56
src/83960.c
56
src/83960.c
@ -66,11 +66,11 @@ INCLUDE_ASM(s32, "83960", func_80086410);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80086D94);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80086E70);
|
||||
INCLUDE_ASM(s32, "83960", guMtxF2L);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80086F08);
|
||||
INCLUDE_ASM(s32, "83960", guMtxL2F);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80086FB0);
|
||||
INCLUDE_ASM(s32, "83960", guMtxIdentF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087000);
|
||||
|
||||
@ -78,52 +78,28 @@ INCLUDE_ASM(s32, "83960", func_800870F0);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800871CC);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087280);
|
||||
INCLUDE_ASM(s32, "83960", guMtxCatL);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800872F4);
|
||||
INCLUDE_ASM(s32, "83960", guMtxXFML);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087380);
|
||||
INCLUDE_ASM(s32, "83960", guOrthoF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800874B0);
|
||||
INCLUDE_ASM(s32, "83960", guOrtho);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087600);
|
||||
INCLUDE_ASM(s32, "83960", guPerspectiveF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800877B0);
|
||||
INCLUDE_ASM(s32, "83960", guPerspective);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087980);
|
||||
INCLUDE_ASM(s32, "83960", guRotateF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087ADC);
|
||||
INCLUDE_ASM(s32, "83960", guRotate);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087C60);
|
||||
INCLUDE_ASM(s32, "83960", guRotateRPYF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087DE8);
|
||||
INCLUDE_ASM(s32, "83960", guRotateRPY);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087F80);
|
||||
INCLUDE_ASM(s32, "83960", guScaleF);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80087FE0);
|
||||
INCLUDE_ASM(s32, "83960", guScale);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088060);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088200);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088254);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800882D0);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088300);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800883B0);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088490);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088530);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", __osSetCompare);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088550);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088560);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_80088570);
|
||||
|
||||
INCLUDE_ASM(s32, "83960", func_800885F0);
|
||||
INCLUDE_ASM(s32, "83960", __sinf);
|
||||
|
42
src/lib/2.0I/gu/guint.h
Normal file
42
src/lib/2.0I/gu/guint.h
Normal file
@ -0,0 +1,42 @@
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
#include "mbi.h"
|
||||
#include "gu.h"
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
unsigned int hi;
|
||||
unsigned int lo;
|
||||
} word;
|
||||
|
||||
double d;
|
||||
} du;
|
||||
|
||||
typedef union
|
||||
{
|
||||
unsigned int i;
|
||||
float f;
|
||||
} fu;
|
||||
|
||||
#ifndef __GL_GL_H__
|
||||
|
||||
typedef float Matrix[4][4];
|
||||
|
||||
#endif
|
||||
|
||||
#define ROUND(d) (int)(((d) >= 0.0) ? ((d) + 0.5) : ((d) - 0.5))
|
||||
#define ABS(d) ((d) > 0) ? (d) : -(d)
|
||||
|
||||
extern float __libm_qnan_f;
|
34
src/lib/2.0I/gu/random.c
Normal file
34
src/lib/2.0I/gu/random.c
Normal file
@ -0,0 +1,34 @@
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1995, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
#include "guint.h"
|
||||
|
||||
/*
|
||||
* Return a pseudorandom 32 bit number
|
||||
* try the RAND macro too
|
||||
*
|
||||
*/
|
||||
extern unsigned int xseed;
|
||||
int guRandom(void)
|
||||
{
|
||||
// static unsigned int xseed = 174823885; TODO: Add this to data section?
|
||||
unsigned int x;
|
||||
|
||||
x = (xseed<<2) + 2;
|
||||
|
||||
x *= (x+1);
|
||||
x = x >> 2;
|
||||
|
||||
xseed = x;
|
||||
|
||||
return( x );
|
||||
}
|
31
src/lib/2.0I/gu/translate.c
Normal file
31
src/lib/2.0I/gu/translate.c
Normal file
@ -0,0 +1,31 @@
|
||||
/**************************************************************************
|
||||
* *
|
||||
* Copyright (C) 1994, Silicon Graphics, Inc. *
|
||||
* *
|
||||
* These coded instructions, statements, and computer programs contain *
|
||||
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
||||
* are protected by Federal copyright law. They may not be disclosed *
|
||||
* to third parties or copied or duplicated in any form, in whole or *
|
||||
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
||||
* *
|
||||
**************************************************************************/
|
||||
|
||||
#include "guint.h"
|
||||
|
||||
void guTranslateF(float mf[4][4], float x, float y, float z)
|
||||
{
|
||||
guMtxIdentF(mf);
|
||||
|
||||
mf[3][0] = x;
|
||||
mf[3][1] = y;
|
||||
mf[3][2] = z;
|
||||
}
|
||||
|
||||
void guTranslate(Mtx *m, float x, float y, float z)
|
||||
{
|
||||
Matrix mf;
|
||||
|
||||
guTranslateF(mf, x, y, z);
|
||||
|
||||
guMtxF2L(mf, m);
|
||||
}
|
@ -85,7 +85,7 @@ INCLUDE_ASM(s32, "ovl_01_ChanceTime/D51E0", func_800F87CC_D73CC);
|
||||
INCLUDE_ASM(s32, "ovl_01_ChanceTime/D51E0", func_800F8A6C_D766C);
|
||||
|
||||
void func_800F988C_D848C(unkObjectStruct* arg0) {
|
||||
func_800264F8(arg0->unk_3C, arg0->unk_44, (func_80088060(arg0->unk_18 * D_80101478) / 2.0f) + 0.5f, D_80101464, D_80101470, 0);
|
||||
func_800264F8(arg0->unk_3C, arg0->unk_44, (__sinf(arg0->unk_18 * D_80101478) / 2.0f) + 0.5f, D_80101464, D_80101470, 0);
|
||||
arg0->unk_18 += 20.0f;
|
||||
if (arg0->unk_18 >= 360.0f) {
|
||||
arg0->unk_18 -= 360.0f;
|
||||
|
@ -149,7 +149,7 @@ void func_800F6C14_2861A4(unkObjectStruct* arg0) {
|
||||
Object* temp_s0_3;
|
||||
|
||||
temp_s0 = D_800F7178_ovl48;
|
||||
temp_s0->unk_18.x = func_80088060(arg0->unk_24 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0->unk_24 * 0.017453292519943295);
|
||||
temp_s0_2 = D_800F7178_ovl48;
|
||||
temp_s0_2->unk_18.z = func_800855C0(arg0->unk_24 * 0.017453292519943295);
|
||||
if ((arg0->unk_4C == 0) || !(arg0->unk_24 < -310.0f)) {
|
||||
@ -159,7 +159,7 @@ void func_800F6C14_2861A4(unkObjectStruct* arg0) {
|
||||
}
|
||||
} else {
|
||||
temp_s0_3 = D_800F7178_ovl48;
|
||||
temp_s0_3->unk_30 = ((func_80088060(arg0->unk_28 * 0.017453292519943295)) * 4.0f) + D_800F70CC_28665C[1].y;
|
||||
temp_s0_3->unk_30 = ((__sinf(arg0->unk_28 * 0.017453292519943295)) * 4.0f) + D_800F70CC_28665C[1].y;
|
||||
arg0->unk_28 = arg0->unk_28 + 5.0f;
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
arg0->unk_28 -= 360.0f;
|
||||
|
@ -137,7 +137,7 @@ void func_800F6C10_286D30(unkObjectStruct* arg0) {
|
||||
Object* temp_s0_3;
|
||||
|
||||
temp_s0 = D_800F7188;
|
||||
temp_s0->unk_18.x = func_80088060(arg0->unk_24 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0->unk_24 * 0.017453292519943295);
|
||||
temp_s0_2 = D_800F7188;
|
||||
temp_s0_2->unk_18.z = func_800855C0(arg0->unk_24 * 0.017453292519943295);
|
||||
if ((arg0->unk_4C == 0) || !(arg0->unk_24 < -310.0f)) {
|
||||
@ -147,7 +147,7 @@ void func_800F6C10_286D30(unkObjectStruct* arg0) {
|
||||
}
|
||||
} else {
|
||||
temp_s0_3 = D_800F7188;
|
||||
temp_s0_3->unk_30 = ((func_80088060(arg0->unk_28 * 0.017453292519943295)) * 4.0f) + D_800F70DC[1].y;
|
||||
temp_s0_3->unk_30 = ((__sinf(arg0->unk_28 * 0.017453292519943295)) * 4.0f) + D_800F70DC[1].y;
|
||||
arg0->unk_28 = arg0->unk_28 + 5.0f;
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
arg0->unk_28 -= 360.0f;
|
||||
|
@ -148,9 +148,9 @@ void func_800F66B4_289C74(void) {
|
||||
for(i = 0; i < 0x15F; i += 5) {
|
||||
|
||||
temp_s0_2 = D_800F74FC;
|
||||
//temp_s0_2->coords.x = D_800F752C.x + (func_80088060((i * 5) * 0.017453292519943295) * var_f24) ;
|
||||
//temp_s0_2->coords.x = D_800F752C.x + (__sinf((i * 5) * 0.017453292519943295) * var_f24) ;
|
||||
new_var3 = &D_800F752C.x;
|
||||
temp_s0_2->coords.x = (*new_var3) + (func_80088060((i * 5) * 0.017453292519943295) * var_f24);
|
||||
temp_s0_2->coords.x = (*new_var3) + (__sinf((i * 5) * 0.017453292519943295) * var_f24);
|
||||
|
||||
temp_s0_2 = D_800F74FC;
|
||||
temp_s0_2->coords.y = D_800F752C.y + 200.0f + (i / 2);
|
||||
@ -158,7 +158,7 @@ void func_800F66B4_289C74(void) {
|
||||
temp_s0_2->coords.z = D_800F752C.z + (func_800855C0((i * 5) * 0.017453292519943295) * var_f24);
|
||||
temp_s0_2 = D_800F74FC;
|
||||
|
||||
temp_s0_2->unk_18.x = func_80088060(var_f22 * 0.017453292519943295);
|
||||
temp_s0_2->unk_18.x = __sinf(var_f22 * 0.017453292519943295);
|
||||
temp_s0_2 = D_800F74FC;
|
||||
|
||||
temp_s0_2->unk_18.z = func_800855C0(var_f22 * 0.017453292519943295);
|
||||
@ -202,7 +202,7 @@ void func_800F66B4_289C74(void) {
|
||||
temp_s0_2->coords.y = D_800F752C.y + 200.0f + (i / 2);
|
||||
temp_s0_2->coords.z = D_800F752C.z;
|
||||
var_f22 += 10.0f;
|
||||
temp_s0_2->unk_18.x = func_80088060(var_f22 * 0.017453292519943295);
|
||||
temp_s0_2->unk_18.x = __sinf(var_f22 * 0.017453292519943295);
|
||||
temp_s0_2 = D_800F74FC;
|
||||
temp_s0_2->unk_18.z = func_800855C0(var_f22 * 0.017453292519943295);
|
||||
SleepVProcess();
|
||||
|
@ -49,7 +49,7 @@ void func_800F6708_28BD98(unkObjectStruct* arg0) {
|
||||
Object* temp_s0;
|
||||
|
||||
temp_s0 = D_800F7858_28CEE8;
|
||||
temp_s0->unk_18.x = func_80088060(arg0->unk_18 * (0.017453292519943295));
|
||||
temp_s0->unk_18.x = __sinf(arg0->unk_18 * (0.017453292519943295));
|
||||
temp_s0 = D_800F7858_28CEE8;
|
||||
temp_s0->unk_18.z = func_800855C0(arg0->unk_18 * (0.017453292519943295));
|
||||
arg0->unk_18 += 5.0f;
|
||||
@ -82,7 +82,7 @@ void func_800F67BC_28BE4C(void) {
|
||||
|
||||
for (i = 0; i < 0x37; i++) {
|
||||
temp_s0 = D_800F7848_28CED8->unk_3C;
|
||||
temp_s0->unk_24 = -func_80088060( ((i * 6) + 0x1E) * (0.017453292519943295)) * 30.0f;
|
||||
temp_s0->unk_24 = -__sinf( ((i * 6) + 0x1E) * (0.017453292519943295)) * 30.0f;
|
||||
if (i == 10) {
|
||||
func_8004EE14(0, &D_800F7878_28CF08, 0x14, D_800F7840_28CED0);
|
||||
}
|
||||
@ -109,9 +109,9 @@ void func_800F67BC_28BE4C(void) {
|
||||
|
||||
for (i = 0, var_s2 = 0; i < 3;) { //strange for loop that only increments if i is 0?
|
||||
temp_s0_2 = D_800F7848_28CED8->unk_3C;
|
||||
temp_s0_2->unk_24 = -func_80088060((var_s2 * (0.017453292519943295))) * 20.0f;
|
||||
temp_s0_2->unk_24 = -__sinf((var_s2 * (0.017453292519943295))) * 20.0f;
|
||||
temp_s0 = D_800F7840_28CED0->unk_3C;
|
||||
temp_s0->unk_24 = -func_80088060((var_s2 * (0.017453292519943295))) * 20.0f;
|
||||
temp_s0->unk_24 = -__sinf((var_s2 * (0.017453292519943295))) * 20.0f;
|
||||
|
||||
if (func_8004F018(D_800F7848_28CED8) == 0) {
|
||||
if (i != 2) {
|
||||
|
@ -34,7 +34,7 @@ INCLUDE_ASM(s32, "ovl_52_FlyGuyWarioBoard/28ECA0", func_800F7070_28F730);
|
||||
void func_800F72DC_28F99C(unkObjectStruct* arg0) {
|
||||
Object* temp_s0 = D_800F8234;
|
||||
|
||||
temp_s0->unk_30 = ((func_80088060((arg0->unk_28 * D_800F8210)) * arg0->unk_4C) + arg0->unk_1C);
|
||||
temp_s0->unk_30 = ((__sinf((arg0->unk_28 * D_800F8210)) * arg0->unk_4C) + arg0->unk_1C);
|
||||
arg0->unk_28 += 10.0f;
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
arg0->unk_28 -= 360.0f;
|
||||
@ -44,7 +44,7 @@ void func_800F72DC_28F99C(unkObjectStruct* arg0) {
|
||||
void func_800F7384_28FA44(unkObjectStruct* arg0) {
|
||||
Object* temp_s0 = D_800F8070;
|
||||
|
||||
temp_s0->unk_30 = ((func_80088060((arg0->unk_28 * D_800F8218)) * arg0->unk_4C) + arg0->unk_1C);
|
||||
temp_s0->unk_30 = ((__sinf((arg0->unk_28 * D_800F8218)) * arg0->unk_4C) + arg0->unk_1C);
|
||||
arg0->unk_28 += 10.0f;
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
arg0->unk_28 -= 360.0f;
|
||||
|
@ -31,45 +31,45 @@ void func_800F66AC_29332C(f32 arg0) {
|
||||
if (D_800ED154.unk_00 != 0) {
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp = &D_800F6DBC_293A3C;
|
||||
temp_s0->coords.x = temp->x + (func_80088060(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0->coords.x = temp->x + (__sinf(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->coords.z = (func_800855C0(arg0 * 0.017453292519943295) * 200.0f) + D_800F6DBC_293A3C.z;
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->unk_18.x = func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->unk_18.z = func_800855C0(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DFC;
|
||||
temp_s0->unk_18.x = func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DFC;
|
||||
temp_s0->unk_18.z = func_800855C0(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->coords.x = temp->x - (func_80088060(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0->coords.x = temp->x - (__sinf(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->coords.z = temp->z - (func_800855C0(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->unk_18.x = -func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = -__sinf(arg0 * 0.017453292519943295);
|
||||
var_s0 = D_800F6DF8;
|
||||
var_s0->unk_18.z = -func_800855C0(arg0 * 0.017453292519943295);
|
||||
} else {
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp = &D_800F6DBC_293A3C;
|
||||
temp_s0->coords.x = (func_80088060(arg0 * 0.017453292519943295) * 200.0f) + temp->x;
|
||||
temp_s0->coords.x = (__sinf(arg0 * 0.017453292519943295) * 200.0f) + temp->x;
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->coords.z = (func_800855C0(arg0 * 0.017453292519943295) * 200.0f) + D_800F6DBC_293A3C.z;
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->unk_18.x = func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DF8;
|
||||
temp_s0->unk_18.z = func_800855C0(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DFC;
|
||||
temp_s0->unk_18.x = func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = __sinf(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DFC;
|
||||
temp_s0->unk_18.z = func_800855C0(arg0 * 0.017453292519943295);
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->coords.x = temp->x - (func_80088060(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0->coords.x = temp->x - (__sinf(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->coords.z = D_800F6DBC_293A3C.z - (func_800855C0(arg0 * 0.017453292519943295) * 200.0f);
|
||||
temp_s0 = D_800F6DF4;
|
||||
temp_s0->unk_18.x = -func_80088060(arg0 * 0.017453292519943295);
|
||||
temp_s0->unk_18.x = -__sinf(arg0 * 0.017453292519943295);
|
||||
var_s0 = D_800F6DF4;
|
||||
var_s0->unk_18.z = -func_800855C0(arg0 * 0.017453292519943295);
|
||||
}
|
||||
|
@ -92,12 +92,12 @@ void func_800F66C4_296C54(void) { //fix me: remove gotos
|
||||
temp_s0_4 = D_800F7590;
|
||||
temp_s0_4->coords.y = D_800F75B8_297B48.y + 200.0f + (f32) (var_s1_3 / 2);
|
||||
temp_f20 = var_s1_3 * 5 * 0.017453292519943295;
|
||||
temp_s0_4->coords.x = (func_80088060(temp_f20) * var_f22) + D_800F75B8_297B48.x;
|
||||
temp_s0_4->coords.x = (__sinf(temp_f20) * var_f22) + D_800F75B8_297B48.x;
|
||||
temp_s0_4 = D_800F7590;
|
||||
temp_s0_4->coords.z = (func_800855C0(temp_f20) * var_f22) + D_800F75B8_297B48.z;
|
||||
temp_s0_4 = D_800F7590;
|
||||
temp_f20_2 = var_f24 * 0.017453292519943295;
|
||||
temp_s0_4->unk_18.x = func_80088060(temp_f20_2);
|
||||
temp_s0_4->unk_18.x = __sinf(temp_f20_2);
|
||||
temp_s0_4 = D_800F7590;
|
||||
temp_s0_4->unk_18.z = func_800855C0(temp_f20_2);
|
||||
SleepVProcess();
|
||||
@ -260,7 +260,7 @@ void func_800F7120_2976B0(void) {
|
||||
D_800F7654->xScale = D_800F7654->yScale = D_800F7654->zScale = 1.5f;
|
||||
func_80025F60(*D_800F7654->unk_3C->unk_40, 0);
|
||||
temp_s0 = D_800F7654;
|
||||
temp_s0->unk_18.x = func_80088060(0.10471976f);
|
||||
temp_s0->unk_18.x = __sinf(0.10471976f);
|
||||
temp_s0_2 = D_800F7654;
|
||||
temp_s0_2->unk_18.z = func_800855C0(0.10471976f);
|
||||
D_800F7658 = CreateObject(6U, &D_800F75C4_297B54);
|
||||
|
@ -100,12 +100,12 @@ void func_800F66BC_29808C(void) {
|
||||
temp_s0_4 = D_800F7060_298A30;
|
||||
temp_s0_4->coords.y = D_800F707C_298A4C.y + 200.0f + (f32) (var_s1_3 / 2);
|
||||
temp_f20 = var_s1_3 * 5 * 0.017453292519943295;
|
||||
temp_s0_4->coords.x = (func_80088060(temp_f20) * var_f22) + D_800F707C_298A4C.x;
|
||||
temp_s0_4->coords.x = (__sinf(temp_f20) * var_f22) + D_800F707C_298A4C.x;
|
||||
temp_s0_4 = D_800F7060_298A30;
|
||||
temp_s0_4->coords.z = (func_800855C0(temp_f20) * var_f22) + D_800F707C_298A4C.z;
|
||||
temp_s0_4 = D_800F7060_298A30;
|
||||
temp_f20_2 = var_f24 * 0.017453292519943295;
|
||||
temp_s0_4->unk_18.x = func_80088060(temp_f20_2);
|
||||
temp_s0_4->unk_18.x = __sinf(temp_f20_2);
|
||||
temp_s0_4 = D_800F7060_298A30;
|
||||
temp_s0_4->unk_18.z = func_800855C0(temp_f20_2);
|
||||
SleepVProcess();
|
||||
|
@ -71,7 +71,7 @@ void func_800F8F78_2B9E38(unkObjectStruct* arg0) {
|
||||
Object* temp_s0;
|
||||
|
||||
temp_s0 = D_800F9604;
|
||||
temp_s0->unk_30 = func_80088060(arg0->unk_28 * D_800F95C8)* 20.0f + 150.0f;
|
||||
temp_s0->unk_30 = __sinf(arg0->unk_28 * D_800F95C8)* 20.0f + 150.0f;
|
||||
arg0->unk_28 += 2.0f;
|
||||
if (arg0->unk_28 >= 360.0f) {
|
||||
arg0->unk_28 -= 360.0f;
|
||||
|
@ -134,6 +134,8 @@ osGetMemSize = 0x800931A0;
|
||||
osGetCount = 0x80093780;
|
||||
osGetTime = 0x80088810;
|
||||
osVirtualToPhysical = 0x80089230;
|
||||
osWritebackDCache = 0x80088570;
|
||||
osWritebackDCacheAll = 0x800885F0;
|
||||
|
||||
__osProbeTLB = 0x800937A0;
|
||||
__osDisableInt = 0x80093520;
|
||||
@ -161,4 +163,34 @@ __osTimerList = 0x800C64C0;
|
||||
__osCurrentTime = 0x800F0A30;
|
||||
__osBaseCounter = 0x800ECB18;
|
||||
|
||||
__osSetCompare = 0x80088540;
|
||||
osInvalDCache = 0x80088300;
|
||||
osInvalICache = 0x800883B0;
|
||||
osSetIntMask = 0x80088490;
|
||||
|
||||
__osSetCause = 0x80088530;
|
||||
__osSetCompare = 0x80088540;
|
||||
__osSetCount = 0x80088550;
|
||||
__osSetSR = 0x80088560;
|
||||
|
||||
guRandom = 0x800882D0;
|
||||
xseed = 0x800C6490;
|
||||
guTranslateF = 0x80088200;
|
||||
guTranslate = 0x80088254;
|
||||
guMtxF2L = 0x80086E70;
|
||||
guMtxL2F = 0x80086F08;
|
||||
guMtxIdentF = 0x80086FB0;
|
||||
|
||||
guMtxCatL = 0x80087280;
|
||||
guMtxXFML = 0x800872F4;
|
||||
guOrthoF = 0x80087380;
|
||||
guOrtho = 0x800874B0;
|
||||
guPerspectiveF = 0x80087600;
|
||||
guPerspective = 0x800877B0;
|
||||
guRotateF = 0x80087980;
|
||||
guRotate = 0x80087ADC;
|
||||
guRotateRPYF = 0x80087C60;
|
||||
guRotateRPY = 0x80087DE8;
|
||||
guScaleF = 0x80087F80;
|
||||
guScale = 0x80087FE0;
|
||||
|
||||
__sinf = 0x80088060;
|
Loading…
Reference in New Issue
Block a user