mirror of
https://github.com/n64decomp/sm64
synced 2026-07-10 14:04:50 -04:00
Refresh 3
This commit is contained in:
+203
-2
@@ -269,6 +269,56 @@ typedef short ENVMIX_STATE[40];
|
||||
* Macros to assemble the audio command list
|
||||
*/
|
||||
|
||||
/*
|
||||
* Info about parameters:
|
||||
*
|
||||
* A "count" in the following macros is always measured in bytes.
|
||||
*
|
||||
* All volumes/gains are in Q1.15 signed fixed point numbers:
|
||||
* 0x8000 is the minimum volume (-100%), negating the audio curve.
|
||||
* 0x0000 is silent.
|
||||
* 0x7fff is maximum volume (99.997%).
|
||||
*
|
||||
* All DRAM addresses refer to segmented addresses. A segment table shall
|
||||
* first be set up by calling aSegment for each segment. When a DRAM
|
||||
* address is later used as parameter, the 8 high bits will be an index
|
||||
* to the segment table and the lower 24 bits are added to the base address
|
||||
* stored in the segment table for this entry. The result is the physical address.
|
||||
*
|
||||
* Transfers to/from DRAM are executed using DMA and hence follow these restrictions:
|
||||
* All DRAM addresses should be aligned by 8 bytes, or they will be
|
||||
* rounded down to the nearest multiple of 8 bytes.
|
||||
* All DRAM lengths should be aligned by 8 bytes, or they will be
|
||||
* rounded up to the nearest multiple of 8 bytes.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Decompresses ADPCM data.
|
||||
* Possible flags: A_INIT and A_LOOP.
|
||||
*
|
||||
* First set up internal data in DMEM:
|
||||
* aLoadADPCM(cmd++, nEntries * 16, physicalAddressOfBook)
|
||||
* aSetLoop(cmd++, physicalAddressOfLoopState) (if A_LOOP is set)
|
||||
*
|
||||
* Then before this command, call:
|
||||
* aSetBuffer(cmd++, 0, in, out, count)
|
||||
*
|
||||
* Note: count will be rounded up to the nearest multiple of 32 bytes.
|
||||
*
|
||||
* ADPCM decompression works on a block of 16 (uncompressed) samples.
|
||||
* The previous 2 samples and 9 bytes of input are decompressed to
|
||||
* 16 new samples using the code book previously loaded.
|
||||
*
|
||||
* Before the algorithm starts, the previous 16 samples are loaded according to flag:
|
||||
* A_INIT: all zeros
|
||||
* A_LOOP: the address set by aSetLoop
|
||||
* no flags: the DRAM address in the s parameter
|
||||
* These 16 samples are immediately copied to the destination address.
|
||||
*
|
||||
* The result of "count" bytes will be written after these 16 initial samples.
|
||||
* The last 16 samples written to the destination will also be written to
|
||||
* the state address in DRAM.
|
||||
*/
|
||||
#define aADPCMdec(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -277,6 +327,9 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Not used in SM64.
|
||||
*/
|
||||
#define aPoleFilter(pkt, f, g, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -286,6 +339,11 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Clears DMEM data, where d is address and c is count, by writing zeros.
|
||||
*
|
||||
* Note: c is rounded up to the nearest multiple of 16 bytes.
|
||||
*/
|
||||
#define aClearBuffer(pkt, d, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -294,6 +352,31 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(c); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Mixes an envelope with mono sound into 2 or 4 channels.
|
||||
* Possible flags: A_INIT, A_AUX (indicates that 4 channels should be used).
|
||||
*
|
||||
* Before this command, call:
|
||||
* aSetBuffer(cmd++, 0, inBuf, dryLeft, count)
|
||||
* aSetBuffer(cmd++, A_AUX, dryRight, wetLeft, wetRight)
|
||||
*
|
||||
* The first time (A_INIT is set), volume also needs to be set:
|
||||
* aSetVolume(cmd++, A_VOL | A_LEFT, initialVolumeLeft, 0, 0)
|
||||
* aSetVolume(cmd++, A_VOL | A_RIGHT, initialVolumeRight, 0, 0)
|
||||
* aSetVolume32(cmd++, A_RATE | A_LEFT, targetVolumeLeft, rampLeft)
|
||||
* aSetVolume32(cmd++, A_RATE | A_RIGHT, targetVolumeRight, rampRight)
|
||||
* aSetVolume(cmd++, A_AUX, dryVolume, 0, wetVolume)
|
||||
*
|
||||
* This command will now mix samples in inBuf into the destination buffers (dry and wet),
|
||||
* but with the volume increased (or decreased) from initial volumes to target volumes,
|
||||
* with the specified ramp rate. Once the target volume is reached, the volume stays
|
||||
* at that level. Before the samples are finally mixed (added) into the destination
|
||||
* buffers (dry and wet), the volume is changed according to dryVolume and wetVolume.
|
||||
*
|
||||
* Note: count will be rounded up to the nearest multiple of 16 bytes.
|
||||
* Note: the wet channels are used for reverb.
|
||||
*
|
||||
*/
|
||||
#define aEnvMixer(pkt, f, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -302,6 +385,17 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Interleaves two mono channels into stereo.
|
||||
*
|
||||
* First call:
|
||||
* aSetBuffer(cmd++, 0, 0, output, count)
|
||||
*
|
||||
* The count refers to the size of the output.
|
||||
* A left sample will be placed before the right sample.
|
||||
*
|
||||
* Note: count will be rounded up to the nearest multiple of 16 bytes.
|
||||
*/
|
||||
#define aInterleave(pkt, l, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -310,6 +404,15 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Loads a buffer from DRAM to DMEM.
|
||||
*
|
||||
* First call:
|
||||
* aSetBuffer(cmd++, 0, in, 0, count)
|
||||
*
|
||||
* The in parameter to aSetBuffer is the destination in DMEM and the
|
||||
* s parameter to this command is the source in DRAM.
|
||||
*/
|
||||
#define aLoadBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -318,6 +421,20 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Mixes audio.
|
||||
* Possible flags: no flags used, although parameter present.
|
||||
*
|
||||
* First call:
|
||||
* aSetBuffer(cmd++, 0, 0, 0, count)
|
||||
*
|
||||
* Input and output addresses are taken from the i and o parameters.
|
||||
* The volume with which the input is changed is taken from the g parameter.
|
||||
* After the volume of the input samples have been changed, the result
|
||||
* is added to the output.
|
||||
*
|
||||
* Note: count will be rounded up to the nearest multiple of 32 bytes.
|
||||
*/
|
||||
#define aMix(pkt, f, g, i, o) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -327,6 +444,7 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(i,16, 16) | _SHIFTL(o, 0, 16); \
|
||||
}
|
||||
|
||||
// Not present in the audio microcode.
|
||||
#define aPan(pkt, f, d, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -336,6 +454,39 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Resamples audio.
|
||||
* Possible flags: A_INIT, A_OUT? (not used in SM64).
|
||||
*
|
||||
* First call:
|
||||
* aSetBuffer(cmd++, 0, in, out, count)
|
||||
*
|
||||
* This command resamples the audio using the given frequency ratio (pitch)
|
||||
* using a filter that uses a window of 4 source samples. This can be used
|
||||
* either for just resampling audio to be able to be played back at a different
|
||||
* sample rate, or to change the pitch if the result is played back at
|
||||
* the same sample rate as the input.
|
||||
*
|
||||
* The frequency ratio is given in UQ1.15 fixed point format.
|
||||
* For no change in frequency, use pitch 0x8000.
|
||||
* For 1 octave up or downsampling to (roughly) half number of samples, use pitch 0xffff.
|
||||
* For 1 octave down or upsampling to double as many samples, use pitch 0x4000.
|
||||
*
|
||||
* Note: count represents the number of output samples and is rounded up to
|
||||
* the nearest multiple of 16 bytes.
|
||||
*
|
||||
* The state consists of the four following source samples when the algorithm stopped as
|
||||
* well as a fractional position, and is initialized to all zeros if A_INIT is given.
|
||||
* Otherwise it is loaded from DRAM at address s.
|
||||
*
|
||||
* The algorithm starts by writing the four source samples from the state (or zero)
|
||||
* to just before the input address given. It then creates one output sample by examining
|
||||
* the four next source samples and then moving the source position zero or more
|
||||
* samples forward. The first output sample (when A_INIT is given) is always 0.
|
||||
*
|
||||
* When "count" samples have been written, the following four source samples
|
||||
* are written to the state in DRAM as well as a fractional position.
|
||||
*/
|
||||
#define aResample(pkt, f, p, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -345,6 +496,15 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Stores a buffer in DMEM to DRAM.
|
||||
*
|
||||
* First call:
|
||||
* aSetBuffer(cmd++, 0, 0, out, count)
|
||||
*
|
||||
* The out parameter to aSetBuffer is the source in DMEM and the
|
||||
* s parameter to this command is the destination in DRAM.
|
||||
*/
|
||||
#define aSaveBuffer(pkt, s) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -353,6 +513,12 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = (uintptr_t)(s); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets up an entry in the segment table.
|
||||
*
|
||||
* The s parameter is a segment index, 0 to 15.
|
||||
* The b parameter is the base offset.
|
||||
*/
|
||||
#define aSegment(pkt, s, b) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -361,6 +527,10 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets internal DMEM buffer addresses used for later commands.
|
||||
* See each command for how to use aSetBuffer.
|
||||
*/
|
||||
#define aSetBuffer(pkt, f, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -370,6 +540,10 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets internal volume parameters.
|
||||
* See aEnvMixer for more info.
|
||||
*/
|
||||
#define aSetVolume(pkt, f, v, t, r) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -379,13 +553,29 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets the address to ADPCM loop state.
|
||||
*
|
||||
* The a parameter is a DRAM address.
|
||||
* See aADPCMdec for more info.
|
||||
*/
|
||||
#define aSetLoop(pkt, a) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
_a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \
|
||||
_a->words.w1 = (uintptr_t)(a); \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Copies memory in DMEM.
|
||||
*
|
||||
* Copies c bytes from address i to address o.
|
||||
*
|
||||
* Note: count is rounded up to the nearest multiple of 16 bytes.
|
||||
*
|
||||
* Note: This acts as memcpy where 16 bytes are moved at a time, therefore
|
||||
* if input and output overlap, output address should be less than input address.
|
||||
*/
|
||||
#define aDMEMMove(pkt, i, o, c) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -394,6 +584,14 @@ typedef short ENVMIX_STATE[40];
|
||||
_a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \
|
||||
}
|
||||
|
||||
/*
|
||||
* Loads ADPCM book from DRAM into DMEM.
|
||||
*
|
||||
* This command loads ADPCM table entries from DRAM to DMEM.
|
||||
*
|
||||
* The count parameter c should be a multiple of 16 bytes.
|
||||
* The d parameter is a DRAM address.
|
||||
*/
|
||||
#define aLoadADPCM(pkt, c, d) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
@@ -406,7 +604,10 @@ typedef short ENVMIX_STATE[40];
|
||||
// instead of two 16-bit ones. According to AziAudio, it is used to set
|
||||
// ramping values when neither bit 4 nor bit 8 is set in the flags parameter.
|
||||
// It does not appear in the official abi.h header.
|
||||
|
||||
/*
|
||||
* Sets internal volume parameters.
|
||||
* See aEnvMixer for more info.
|
||||
*/
|
||||
#define aSetVolume32(pkt, f, v, tr) \
|
||||
{ \
|
||||
Acmd *_a = (Acmd *)pkt; \
|
||||
|
||||
+241
-101
@@ -441,118 +441,147 @@
|
||||
* G_SETCOMBINE: color combine modes
|
||||
*/
|
||||
/* Color combiner constants: */
|
||||
#define G_CCMUX_COMBINED 0
|
||||
#define G_CCMUX_TEXEL0 1
|
||||
#define G_CCMUX_TEXEL1 2
|
||||
#define G_CCMUX_PRIMITIVE 3
|
||||
#define G_CCMUX_SHADE 4
|
||||
#define G_CCMUX_ENVIRONMENT 5
|
||||
#define G_CCMUX_CENTER 6
|
||||
#define G_CCMUX_SCALE 6
|
||||
#define G_CCMUX_COMBINED_ALPHA 7
|
||||
#define G_CCMUX_TEXEL0_ALPHA 8
|
||||
#define G_CCMUX_TEXEL1_ALPHA 9
|
||||
#define G_CCMUX_PRIMITIVE_ALPHA 10
|
||||
#define G_CCMUX_SHADE_ALPHA 11
|
||||
#define G_CCMUX_ENV_ALPHA 12
|
||||
#define G_CCMUX_LOD_FRACTION 13
|
||||
#define G_CCMUX_PRIM_LOD_FRAC 14
|
||||
#define G_CCMUX_NOISE 7
|
||||
#define G_CCMUX_K4 7
|
||||
#define G_CCMUX_K5 15
|
||||
#define G_CCMUX_1 6
|
||||
#define G_CCMUX_0 31
|
||||
#define G_CCMUX_COMBINED 0
|
||||
#define G_CCMUX_TEXEL0 1
|
||||
#define G_CCMUX_TEXEL1 2
|
||||
#define G_CCMUX_PRIMITIVE 3
|
||||
#define G_CCMUX_SHADE 4
|
||||
#define G_CCMUX_ENVIRONMENT 5
|
||||
#define G_CCMUX_CENTER 6
|
||||
#define G_CCMUX_SCALE 6
|
||||
#define G_CCMUX_COMBINED_ALPHA 7
|
||||
#define G_CCMUX_TEXEL0_ALPHA 8
|
||||
#define G_CCMUX_TEXEL1_ALPHA 9
|
||||
#define G_CCMUX_PRIMITIVE_ALPHA 10
|
||||
#define G_CCMUX_SHADE_ALPHA 11
|
||||
#define G_CCMUX_ENV_ALPHA 12
|
||||
#define G_CCMUX_LOD_FRACTION 13
|
||||
#define G_CCMUX_PRIM_LOD_FRAC 14
|
||||
#define G_CCMUX_NOISE 7
|
||||
#define G_CCMUX_K4 7
|
||||
#define G_CCMUX_K5 15
|
||||
#define G_CCMUX_1 6
|
||||
#define G_CCMUX_0 31
|
||||
|
||||
/* Alpha combiner constants: */
|
||||
#define G_ACMUX_COMBINED 0
|
||||
#define G_ACMUX_TEXEL0 1
|
||||
#define G_ACMUX_TEXEL1 2
|
||||
#define G_ACMUX_PRIMITIVE 3
|
||||
#define G_ACMUX_SHADE 4
|
||||
#define G_ACMUX_ENVIRONMENT 5
|
||||
#define G_ACMUX_COMBINED 0
|
||||
#define G_ACMUX_TEXEL0 1
|
||||
#define G_ACMUX_TEXEL1 2
|
||||
#define G_ACMUX_PRIMITIVE 3
|
||||
#define G_ACMUX_SHADE 4
|
||||
#define G_ACMUX_ENVIRONMENT 5
|
||||
#define G_ACMUX_LOD_FRACTION 0
|
||||
#define G_ACMUX_PRIM_LOD_FRAC 6
|
||||
#define G_ACMUX_1 6
|
||||
#define G_ACMUX_0 7
|
||||
#define G_ACMUX_1 6
|
||||
#define G_ACMUX_0 7
|
||||
|
||||
/* typical CC cycle 1 modes */
|
||||
#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE
|
||||
#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0
|
||||
#define G_CC_MODULATERGB G_CC_MODULATEI
|
||||
#define G_CC_MODULATERGBA G_CC_MODULATEIA
|
||||
#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA
|
||||
#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0
|
||||
#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0
|
||||
#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM
|
||||
#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM
|
||||
#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM
|
||||
#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE
|
||||
#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0
|
||||
#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_ADDRGB 1, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_ADDRGBDECALA 1, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE
|
||||
#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0
|
||||
#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE
|
||||
|
||||
#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE
|
||||
#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0
|
||||
#define G_CC_MODULATEIFADE TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT
|
||||
|
||||
#define G_CC_MODULATERGB G_CC_MODULATEI
|
||||
#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA
|
||||
#define G_CC_MODULATERGBFADE G_CC_MODULATEIFADE
|
||||
|
||||
#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_MODULATEIFADEA TEXEL0, 0, SHADE, 0, TEXEL0, 0, ENVIRONMENT, 0
|
||||
|
||||
#define G_CC_MODULATEFADE TEXEL0, 0, SHADE, 0, ENVIRONMENT, 0, TEXEL0, 0
|
||||
|
||||
#define G_CC_MODULATERGBA G_CC_MODULATEIA
|
||||
#define G_CC_MODULATERGBFADEA G_CC_MODULATEIFADEA
|
||||
|
||||
#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0
|
||||
#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0
|
||||
|
||||
#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM
|
||||
#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM
|
||||
#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM
|
||||
|
||||
#define G_CC_FADE SHADE, 0, ENVIRONMENT, 0, SHADE, 0, ENVIRONMENT, 0
|
||||
#define G_CC_FADEA TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, ENVIRONMENT, 0
|
||||
|
||||
#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE
|
||||
#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0
|
||||
#define G_CC_DECALFADE 0, 0, 0, TEXEL0, 0, 0, 0, ENVIRONMENT
|
||||
|
||||
#define G_CC_DECALFADEA 0, 0, 0, TEXEL0, TEXEL0, 0, ENVIRONMENT, 0
|
||||
|
||||
#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
|
||||
#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_BLENDRGBFADEA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, ENVIRONMENT
|
||||
|
||||
#define G_CC_ADDRGB TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_ADDRGBDECALA TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_ADDRGBFADE TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, ENVIRONMENT
|
||||
|
||||
#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
|
||||
#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE
|
||||
#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
|
||||
|
||||
#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0
|
||||
#define G_CC_SHADEFADEA 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT
|
||||
|
||||
#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0
|
||||
#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0
|
||||
|
||||
/* oddball modes */
|
||||
#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0
|
||||
#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0
|
||||
#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0
|
||||
#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0
|
||||
#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
|
||||
/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */
|
||||
#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0
|
||||
#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0
|
||||
#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0
|
||||
#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0
|
||||
|
||||
/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */
|
||||
#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0
|
||||
#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0
|
||||
#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0
|
||||
#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0
|
||||
|
||||
/*
|
||||
* One-cycle color convert operation
|
||||
*/
|
||||
#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
|
||||
#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
|
||||
|
||||
/*
|
||||
* NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock.
|
||||
* Therefore, CC looks for step1 results in TEXEL1
|
||||
*/
|
||||
#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
|
||||
#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
|
||||
|
||||
/* typical CC cycle 2 modes */
|
||||
#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED
|
||||
#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE
|
||||
#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0
|
||||
#define G_CC_MODULATERGB2 G_CC_MODULATEI2
|
||||
#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2
|
||||
#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0
|
||||
#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2
|
||||
#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2
|
||||
#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE
|
||||
#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED
|
||||
#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE
|
||||
#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0
|
||||
#define G_CC_MODULATERGB2 G_CC_MODULATEI2
|
||||
#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2
|
||||
#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
|
||||
#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0
|
||||
#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2
|
||||
#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2
|
||||
#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE
|
||||
/*
|
||||
* ?
|
||||
#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE
|
||||
*/
|
||||
#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0
|
||||
#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0
|
||||
#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE
|
||||
#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED
|
||||
#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0
|
||||
#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED
|
||||
#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE
|
||||
#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0
|
||||
#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0
|
||||
#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE
|
||||
#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED
|
||||
#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0
|
||||
#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED
|
||||
|
||||
/*
|
||||
* G_SETOTHERMODE_L sft: shift count
|
||||
@@ -902,6 +931,9 @@
|
||||
CVG_DST_CLAMP | ZMODE_OPA | \
|
||||
GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
|
||||
|
||||
/* Custom version of RM_AA_ZB_XLU_SURF with Z_UPD */
|
||||
#define RM_CUSTOM_AA_ZB_XLU_SURF(clk) \
|
||||
RM_AA_ZB_XLU_SURF(clk) | Z_UPD
|
||||
|
||||
|
||||
#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1)
|
||||
@@ -1000,6 +1032,9 @@
|
||||
#define G_RM_OPA_CI RM_OPA_CI(1)
|
||||
#define G_RM_OPA_CI2 RM_OPA_CI(2)
|
||||
|
||||
#define G_RM_CUSTOM_AA_ZB_XLU_SURF RM_CUSTOM_AA_ZB_XLU_SURF(1)
|
||||
#define G_RM_CUSTOM_AA_ZB_XLU_SURF2 RM_CUSTOM_AA_ZB_XLU_SURF(2)
|
||||
|
||||
|
||||
#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
|
||||
#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
|
||||
@@ -1132,7 +1167,7 @@ typedef struct {
|
||||
* First 8 words are integer portion of the 4x4 matrix
|
||||
* Last 8 words are the fraction portion of the 4x4 matrix
|
||||
*/
|
||||
typedef long Mtx_t[4][4];
|
||||
typedef s32 Mtx_t[4][4];
|
||||
|
||||
typedef union {
|
||||
Mtx_t m;
|
||||
@@ -1478,6 +1513,8 @@ typedef union {
|
||||
{ {{ {{0,0,0},0,{0,0,0},0,{rightx,righty,rightz},0}}, \
|
||||
{ {{0,0x80,0},0,{0,0x80,0},0,{upx,upy,upz},0}}} }
|
||||
|
||||
/* Don't declare these for F3D_OLD to avoid bss reordering */
|
||||
#ifndef F3D_OLD
|
||||
/*
|
||||
* Graphics DMA Packet
|
||||
*/
|
||||
@@ -1650,9 +1687,6 @@ typedef struct {
|
||||
unsigned int dtdy:16;/* Change in T per change in Y */
|
||||
} Gtexrect;
|
||||
|
||||
#define MakeTexRect(xh,yh,flip,tile,xl,yl,s,t,dsdx,dtdy) \
|
||||
G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy
|
||||
|
||||
/*
|
||||
* Textured rectangles are 128 bits not 64 bits
|
||||
*/
|
||||
@@ -1662,6 +1696,10 @@ typedef struct {
|
||||
unsigned long w2;
|
||||
unsigned long w3;
|
||||
} TexRect;
|
||||
#endif
|
||||
|
||||
#define MakeTexRect(xh,yh,flip,tile,xl,yl,s,t,dsdx,dtdy) \
|
||||
G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy
|
||||
|
||||
/*
|
||||
* Generic Gfx Packet
|
||||
@@ -1681,7 +1719,7 @@ typedef struct {
|
||||
*/
|
||||
typedef union {
|
||||
Gwords words;
|
||||
#if !defined(__x86_64__) && !defined(__i386__)
|
||||
#if !defined(F3D_OLD) && !defined(__x86_64__) && !defined(__i386__)
|
||||
Gdma dma;
|
||||
Gtri tri;
|
||||
Gline3D line;
|
||||
@@ -2159,7 +2197,15 @@ typedef union {
|
||||
__gsSP1Triangle_w1f(v00, v01, v02, flag0)), \
|
||||
__gsSP1Triangle_w1f(v10, v11, v12, flag1) \
|
||||
}}
|
||||
|
||||
#else
|
||||
#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
|
||||
{ \
|
||||
gSP1Triangle(pkt, v00, v01, v02, flag0); \
|
||||
gSP1Triangle(pkt, v10, v11, v12, flag1); \
|
||||
}
|
||||
#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
|
||||
gsSP1Triangle(v00, v01, v02, flag0), \
|
||||
gsSP1Triangle(v10, v11, v12, flag1)
|
||||
#endif /* F3DEX_GBI/F3DLP_GBI */
|
||||
|
||||
#if (defined(F3DEX_GBI)||defined(F3DLP_GBI))
|
||||
@@ -2797,8 +2843,23 @@ typedef union {
|
||||
}}
|
||||
#endif
|
||||
|
||||
#define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s))
|
||||
#define gsSPPerspNormalize(s) gsMoveWd( G_MW_PERSPNORM, 0, (s))
|
||||
#ifndef F3D_OLD
|
||||
# define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s))
|
||||
# define gsSPPerspNormalize(s) gsMoveWd( G_MW_PERSPNORM, 0, (s))
|
||||
#else
|
||||
# define gSPPerspNormalize(pkt, s) \
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
_g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
|
||||
_g->words.w1 = (s); \
|
||||
}
|
||||
# define gsSPPerspNormalize(s) \
|
||||
{{ \
|
||||
_SHIFTL(G_RDPHALF_1, 24, 8), \
|
||||
(s) \
|
||||
}}
|
||||
#endif
|
||||
|
||||
#ifdef F3DEX_GBI_2
|
||||
# define gSPPopMatrixN(pkt, n, num) gDma2p((pkt),G_POPMTX,(num)*64,64,2,0)
|
||||
@@ -2849,7 +2910,7 @@ typedef union {
|
||||
#define gsSPClearGeometryMode(word) gsSPGeometryMode((word),0)
|
||||
#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt),-1,(word))
|
||||
#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1,(word))
|
||||
|
||||
#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s)
|
||||
#else /* F3DEX_GBI_2 */
|
||||
#define gSPSetGeometryMode(pkt, word) \
|
||||
{ \
|
||||
@@ -2876,6 +2937,18 @@ typedef union {
|
||||
{{ \
|
||||
_SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int)(word) \
|
||||
}}
|
||||
|
||||
/*
|
||||
* gsSPGeometryMode
|
||||
* In Fast3DEX2 it is better to use this, as the RSP geometry mode
|
||||
* is able to be set and cleared in a single command.
|
||||
*/
|
||||
#define gsSPGeometryMode(c, s) \
|
||||
gsSPClearGeometryMode(c), \
|
||||
gsSPSetGeometryMode(s)
|
||||
#define gsSPGeometryModeSetFirst(c, s) \
|
||||
gsSPSetGeometryMode(s), \
|
||||
gsSPClearGeometryMode(c)
|
||||
#endif /* F3DEX_GBI_2 */
|
||||
|
||||
#ifdef F3DEX_GBI_2
|
||||
@@ -4482,13 +4555,73 @@ typedef union {
|
||||
_g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \
|
||||
}
|
||||
|
||||
#ifdef F3D_OLD
|
||||
# define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
_g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | \
|
||||
_SHIFTL(yh, 0, 12)); \
|
||||
_g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \
|
||||
_SHIFTL(yl, 0, 12)); \
|
||||
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
|
||||
gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\
|
||||
}
|
||||
|
||||
#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\
|
||||
(_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \
|
||||
gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
|
||||
gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
|
||||
gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
|
||||
gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
|
||||
|
||||
#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\
|
||||
/* like gSPTextureRectangle but accepts negative position arguments */
|
||||
# define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
_g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
|
||||
_SHIFTL(MAX((s16)(xh),0), 12, 12) | \
|
||||
_SHIFTL(MAX((s16)(yh),0), 0, 12)); \
|
||||
_g->words.w1 = (_SHIFTL((tile), 24, 3) | \
|
||||
_SHIFTL(MAX((s16)(xl),0), 12, 12) | \
|
||||
_SHIFTL(MAX((s16)(yl),0), 0, 12)); \
|
||||
gImmp1(pkt, G_RDPHALF_2, \
|
||||
(_SHIFTL(((s) - \
|
||||
(((s16)(xl) < 0) ? \
|
||||
(((s16)(dsdx) < 0) ? \
|
||||
(MAX((((s16)(xl)*(s16)(dsdx))>>7),0)) : \
|
||||
(MIN((((s16)(xl)*(s16)(dsdx))>>7),0))) : 0)), \
|
||||
16, 16) | \
|
||||
_SHIFTL(((t) - \
|
||||
(((yl) < 0) ? \
|
||||
(((s16)(dtdy) < 0) ? \
|
||||
(MAX((((s16)(yl)*(s16)(dtdy))>>7),0)) : \
|
||||
(MIN((((s16)(yl)*(s16)(dtdy))>>7),0))) : 0)), \
|
||||
0, 16))); \
|
||||
gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL((dsdx), 16, 16) | \
|
||||
_SHIFTL((dtdy), 0, 16))); \
|
||||
}
|
||||
|
||||
# define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \
|
||||
_SHIFTL(yh, 0, 12)), \
|
||||
(_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \
|
||||
gsImmp1(G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
|
||||
gsImmp1(G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
|
||||
|
||||
# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
_g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) |\
|
||||
_SHIFTL(yh, 0, 12)); \
|
||||
_g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | \
|
||||
_SHIFTL(yl, 0, 12)); \
|
||||
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
|
||||
gImmp1(pkt, G_RDPHALF_CONT, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
|
||||
}
|
||||
#else
|
||||
# define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy)\
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
@@ -4500,8 +4633,14 @@ typedef union {
|
||||
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)));\
|
||||
}
|
||||
|
||||
#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{{(_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)),\
|
||||
(_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \
|
||||
gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
|
||||
gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
|
||||
|
||||
/* like gSPTextureRectangle but accepts negative position arguments */
|
||||
#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
# define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
@@ -4528,14 +4667,14 @@ typedef union {
|
||||
_SHIFTL((dtdy), 0, 16))); \
|
||||
}
|
||||
|
||||
#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
# define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{{(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \
|
||||
_SHIFTL(yh, 0, 12)), \
|
||||
(_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12))}}, \
|
||||
gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \
|
||||
gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)))
|
||||
|
||||
#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
# define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
|
||||
{ \
|
||||
Gfx *_g = (Gfx *)(pkt); \
|
||||
\
|
||||
@@ -4546,6 +4685,7 @@ typedef union {
|
||||
gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \
|
||||
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define gsDPWord(wordhi, wordlo) \
|
||||
gsImmp1(G_RDPHALF_1, (uintptr_t)(wordhi)), \
|
||||
|
||||
@@ -1,977 +0,0 @@
|
||||
/*
|
||||
* Graphics Binary Interface
|
||||
* This supports Fast3D, Fast3DEX, and Fast3DEX2.
|
||||
*/
|
||||
|
||||
/* Fast3DZEX support */
|
||||
.ifdef F3DZEX_GBI
|
||||
.set F3DEX_GBI_2, 1
|
||||
.endif
|
||||
|
||||
/* Macros */
|
||||
|
||||
.macro bytes4 byte1, byte2, byte3, byte4
|
||||
.word ((\byte1 & 0xFF) << 24) | ((\byte2 & 0xFF) << 16) | ((\byte3 & 0xFF) << 8) | (\byte4 & 0xFF)
|
||||
.endm
|
||||
|
||||
/* commands with no parameters */
|
||||
.macro f3d_noparam cmd
|
||||
.word (\cmd << 24)
|
||||
.word 0
|
||||
.endm
|
||||
|
||||
.macro gsImmp1 cmd, param
|
||||
.word (\cmd << 24)
|
||||
.word \param
|
||||
.endm
|
||||
|
||||
/* DMA helper */
|
||||
.macro gsDma1p cmd, segAddr, length, params
|
||||
.word (\cmd << 24) | ((\params & 0xFFFF) << 16) | (\length & 0xFFFF)
|
||||
.word \segAddr
|
||||
.endm
|
||||
|
||||
/* DMA helper 3*/
|
||||
.macro gsDma3p cmd, byte2, byte3, byte4, segAddr
|
||||
bytes4 \cmd, \byte2, \byte3, \byte4
|
||||
.word \segAddr
|
||||
.endm
|
||||
|
||||
/* Helper for RGBA colors. */
|
||||
.macro sDPRGBColor cmd r, g, b, a
|
||||
.word \cmd << 24
|
||||
bytes4 \r, \g, \b, \a
|
||||
.endm
|
||||
|
||||
/* Opcodes */
|
||||
|
||||
.ifdef F3DEX_GBI_2
|
||||
.set G_MTX, 0xDA
|
||||
.set G_MOVEMEM, 0xDC
|
||||
.set G_VTX, 0x01
|
||||
.set G_DL, 0xDE
|
||||
.set G_TRI2, 0x06
|
||||
.set G_RDPHALF_1, 0xE1
|
||||
.set G_RDPHALF_2, 0xF1
|
||||
.set G_GEOMETRYMODE, 0xD9 /* Fast3DEX2 uses one GeometryMode opcode. */
|
||||
.set G_ENDDL, 0xDF
|
||||
.set G_SETOTHERMODE_L, 0xE2
|
||||
.set G_SETOTHERMODE_H, 0xE3
|
||||
.set G_TEXTURE, 0xD7
|
||||
.set G_MOVEWORD, 0xDB
|
||||
.set G_TRI1, 0x05
|
||||
.set G_NOOP, 0xC0
|
||||
.set G_RDPLOADSYNC, 0xE6
|
||||
.set G_RDPPIPESYNC, 0xE7
|
||||
.set G_RDPTILESYNC, 0xE8
|
||||
.set G_RDPFULLSYNC, 0xE9
|
||||
.set G_LOADTLUT, 0xF0
|
||||
.set G_SETTILESIZE, 0xF2
|
||||
.set G_LOADBLOCK, 0xF3
|
||||
.set G_SETTILE, 0xF5
|
||||
.set G_SETFILLCOLOR, 0xF7
|
||||
.set G_SETFOGCOLOR, 0xF8
|
||||
.set G_SETBLENDCOLOR, 0xF9
|
||||
.set G_SETPRIMCOLOR, 0xFA
|
||||
.set G_SETENVCOLOR, 0xFB
|
||||
.set G_SETCOMBINE, 0xFC
|
||||
.set G_SETTIMG, 0xFD
|
||||
.set G_TEXRECT, 0xE4
|
||||
|
||||
.else /* F3D and F3DEX */
|
||||
.set G_MTX, 0x01
|
||||
.set G_MOVEMEM, 0x03
|
||||
.set G_VTX, 0x04
|
||||
.set G_DL, 0x06
|
||||
.set G_TRI2, 0xB1
|
||||
.set G_RDPHALF_CONT, 0xB2
|
||||
.set G_RDPHALF_2, 0xB3
|
||||
.set G_RDPHALF_1, 0xB4
|
||||
.set G_CLEARGEOMETRYMODE, 0xB6
|
||||
.set G_SETGEOMETRYMODE, 0xB7
|
||||
.set G_ENDDL, 0xB8
|
||||
.set G_SETOTHERMODE_L, 0xB9
|
||||
.set G_SETOTHERMODE_H, 0xBA
|
||||
.set G_TEXTURE, 0xBB
|
||||
.set G_MOVEWORD, 0xBC
|
||||
.set G_TRI1, 0xBF
|
||||
.set G_NOOP, 0xC0
|
||||
.set G_TEXRECT, 0xE4
|
||||
.set G_RDPLOADSYNC, 0xE6
|
||||
.set G_RDPPIPESYNC, 0xE7
|
||||
.set G_RDPTILESYNC, 0xE8
|
||||
.set G_RDPFULLSYNC, 0xE9
|
||||
.set G_LOADTLUT, 0xF0
|
||||
.set G_SETTILESIZE, 0xF2
|
||||
.set G_LOADBLOCK, 0xF3
|
||||
.set G_SETTILE, 0xF5
|
||||
.set G_FILLRECT, 0xF6
|
||||
.set G_SETFILLCOLOR, 0xF7
|
||||
.set G_SETFOGCOLOR, 0xF8
|
||||
.set G_SETBLENDCOLOR, 0xF9
|
||||
.set G_SETPRIMCOLOR, 0xFA
|
||||
.set G_SETENVCOLOR, 0xFB
|
||||
.set G_SETCOMBINE, 0xFC
|
||||
.set G_SETTIMG, 0xFD
|
||||
.endif
|
||||
|
||||
/* Arguments */
|
||||
|
||||
/* gSPMatrix */
|
||||
.ifdef F3DEX_GBI_2
|
||||
.set G_MTX_MODELVIEW, 0x00
|
||||
.set G_MTX_PROJECTION, 0x04
|
||||
.set G_MTX_MUL, 0x00
|
||||
.set G_MTX_LOAD, 0x02
|
||||
.set G_MTX_NOPUSH, 0x00
|
||||
.set G_MTX_PUSH, 0x01
|
||||
|
||||
.else /* F3D and F3DEX */
|
||||
.set G_MTX_MODELVIEW, 0x00
|
||||
.set G_MTX_PROJECTION, 0x01
|
||||
.set G_MTX_MUL, 0x00
|
||||
.set G_MTX_LOAD, 0x02
|
||||
.set G_MTX_NOPUSH, 0x00
|
||||
.set G_MTX_PUSH, 0x04
|
||||
.endif
|
||||
|
||||
/* gSPLight */
|
||||
.ifdef F3DEX_GBI_2
|
||||
.set G_MVO_L0, (2*24)
|
||||
.else
|
||||
.set G_MV_L0, 0x86
|
||||
.endif
|
||||
|
||||
/* gSPDisplayList / gSPBranchDisplayList */
|
||||
.set G_DL_PUSH, 0x00
|
||||
.set G_DL_NOPUSH, 0x01
|
||||
|
||||
/* gSPXGeometryMode */
|
||||
.ifdef F3DEX_GBI_2
|
||||
.set G_ZBUFFER, 0x00000001
|
||||
.set G_SHADE, 0x00000004
|
||||
.set G_SHADING_SMOOTH, 0x00200000
|
||||
.set G_CULL_FRONT, 0x00000200
|
||||
.set G_CULL_BACK, 0x00000400
|
||||
.set G_FOG, 0x00010000
|
||||
.set G_LIGHTING, 0x00020000
|
||||
.set G_TEXTURE_GEN, 0x00040000
|
||||
.set G_TEXTURE_GEN_LINEAR, 0x00080000
|
||||
|
||||
.else /* F3D and F3DEX */
|
||||
.set G_ZBUFFER, 0x00000001
|
||||
.set G_SHADE, 0x00000004
|
||||
.set G_SHADING_SMOOTH, 0x00000200
|
||||
.set G_CULL_FRONT, 0x00001000
|
||||
.set G_CULL_BACK, 0x00002000
|
||||
.set G_FOG, 0x00010000
|
||||
.set G_LIGHTING, 0x00020000
|
||||
.set G_TEXTURE_GEN, 0x00040000
|
||||
.set G_TEXTURE_GEN_LINEAR, 0x00080000
|
||||
.endif
|
||||
|
||||
/*
|
||||
* Used for matching F3DEX2-style geometry mode usage.
|
||||
* Ignored when building with Fast3DEX2.
|
||||
*/
|
||||
.set G_ORDER_SFIRST, 0
|
||||
.set G_ORDER_CFIRST, 1
|
||||
|
||||
/* gSPSetOtherMode (L) */
|
||||
.set G_MDSFT_ALPHACOMPARE, 0
|
||||
.set G_MDSFT_ZSRCSEL, 2
|
||||
.set G_MDSFT_RENDERMODE, 3
|
||||
.set G_MDSFT_BLENDER, 16
|
||||
|
||||
.set G_AC_NONE, (0 << G_MDSFT_ALPHACOMPARE)
|
||||
.set G_AC_THRESHOLD, (1 << G_MDSFT_ALPHACOMPARE)
|
||||
.set G_AC_DITHER, (3 << G_MDSFT_ALPHACOMPARE)
|
||||
|
||||
.set G_ZS_PIXEL, (0 << G_MDSFT_ZSRCSEL)
|
||||
.set G_ZS_PRIM, (1 << G_MDSFT_ZSRCSEL)
|
||||
|
||||
/************************* Set Render Mode *************************/
|
||||
|
||||
/* Cycle-Independent Blender Settings */
|
||||
|
||||
.set AA_EN, 0x8
|
||||
.set Z_CMP, 0x10
|
||||
.set Z_UPD, 0x20
|
||||
.set IM_RD, 0x40
|
||||
.set CLR_ON_CVG, 0x80
|
||||
.set CVG_DST_CLAMP, 0
|
||||
.set CVG_DST_WRAP, 0x100
|
||||
.set CVG_DST_FULL, 0x200
|
||||
.set CVG_DST_SAVE, 0x300
|
||||
.set ZMODE_OPA, 0
|
||||
.set ZMODE_INTER, 0x400
|
||||
.set ZMODE_XLU, 0x800
|
||||
.set ZMODE_DEC, 0xc00
|
||||
.set CVG_X_ALPHA, 0x1000
|
||||
.set ALPHA_CVG_SEL, 0x2000
|
||||
.set FORCE_BL, 0x4000
|
||||
.set TEX_EDGE, 0x0000 /* used to be 0x8000 */
|
||||
|
||||
/* Cycle-Dependent Blender Settings */
|
||||
/* Blender runs the formula: (P * A + M - B) / (A + B) */
|
||||
/* P and M values */
|
||||
.set G_BL_CLR_IN, 0 /* 1st cycle: get color from input pixel.
|
||||
2nd cycle: param is the numerator of the formula as computed for the first cycle. */
|
||||
.set G_BL_CLR_MEM, 1 /* Takes color from the framebuffer */
|
||||
.set G_BL_CLR_BL, 2 /* Takes color from the blend color register */
|
||||
.set G_BL_CLR_FOG, 3 /* Takes color from the fog color register */
|
||||
/* A values */
|
||||
.set G_BL_A_IN, 0 /* Parameter is alpha value of input pixel */
|
||||
.set G_BL_A_FOG, 1 /* Alpha value from the fog color register */
|
||||
.set G_BL_A_SHADE, 2 /* Calculated alpha value for the pixel, presumably */
|
||||
/* B values */
|
||||
.set G_BL_1MA, 0 /* 1.0 - source alpha */
|
||||
.set G_BL_A_MEM, 1 /* Framebuffer alpha value */
|
||||
.set G_BL_1, 2 /* Constant 1.0 */
|
||||
/* A and B values */
|
||||
.set G_BL_0, 3 /* Constant 0.0 */
|
||||
|
||||
.macro .BL_DEPENDENT_SETTING label, p, a, m, b
|
||||
.set \label\()_CYCLE1, ((\p << 30) | (\a << 26) | (\m << 22) | (\b << 18))
|
||||
.set \label\()_CYCLE2, ((\p << 28) | (\a << 24) | (\m << 20) | (\b << 16))
|
||||
.endm
|
||||
|
||||
.macro .BL_DEPENDENT_SETTING_CYCLE1_ONLY label, p, a, m, b
|
||||
.set \label, ((\p << 30) | (\a << 26) | (\m << 22) | (\b << 18))
|
||||
.endm
|
||||
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_ZERO, G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_IN, G_BL_1MA /* Basically (0, 0, 0 ,0) */
|
||||
|
||||
/* Properly label these later! */
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_1, G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_2, G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_3, G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_4, G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1
|
||||
.BL_DEPENDENT_SETTING BL_DEP_SETTING_5, G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM
|
||||
|
||||
.BL_DEPENDENT_SETTING_CYCLE1_ONLY BL_DEP_SETTING_FOG_SHADE_A, G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA
|
||||
.BL_DEPENDENT_SETTING_CYCLE1_ONLY BL_DEP_SETTING_FOG_PRIM_A, G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA
|
||||
.BL_DEPENDENT_SETTING_CYCLE1_ONLY BL_DEP_SETTING_PASS, G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1
|
||||
|
||||
.macro .SET_RENDER_MODE label, indeptSettings, deptSettings
|
||||
.set \label , (\indeptSettings | \deptSettings\()_CYCLE1)
|
||||
.set \label\()2 , (\indeptSettings | \deptSettings\()_CYCLE2)
|
||||
.endm
|
||||
|
||||
/* TODO: Make these more readable */
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_OPA_SURF, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_RA_ZB_OPA_SURF, (AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_XLU_SURF, (AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_XLU), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_OPA_DECAL, (AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_RA_ZB_OPA_DECAL, (AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_XLU_DECAL, (AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_DEC), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_OPA_INTER, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_RA_ZB_OPA_INTER, (AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_XLU_INTER, (AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_INTER), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_XLU_LINE, (AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_DEC_LINE, (AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_TEX_EDGE, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_TEX_INTER, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_SUB_SURF, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_PCL_SURF, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_OPA_TERR, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_TEX_TERR, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_ZB_SUB_TERR, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_OPA_SURF, (AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_RA_OPA_SURF, (AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_XLU_SURF, (AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_XLU_LINE, (AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_DEC_LINE, (AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_TEX_EDGE, (AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_SUB_SURF, (AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_AA_PCL_SURF, (AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_OPA_TERR, (AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_TEX_TERR, (AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_AA_SUB_TERR, (AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_ZB_OPA_SURF, (Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_OPA), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_ZB_XLU_SURF, (Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_ZB_OPA_DECAL, (Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC), BL_DEP_SETTING_1
|
||||
.SET_RENDER_MODE G_RM_ZB_XLU_DECAL, (Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_ZB_CLD_SURF, (Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_ZB_OVL_SURF, (Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_ZB_PCL_SURF, (Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | G_AC_DITHER), BL_DEP_SETTING_3
|
||||
.SET_RENDER_MODE G_RM_OPA_SURF, (CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_3
|
||||
.SET_RENDER_MODE G_RM_XLU_SURF, (IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_TEX_EDGE, (CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | TEX_EDGE | AA_EN), BL_DEP_SETTING_3
|
||||
.SET_RENDER_MODE G_RM_CLD_SURF, (IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_2
|
||||
.SET_RENDER_MODE G_RM_PCL_SURF, (CVG_DST_FULL | FORCE_BL | ZMODE_OPA | G_AC_DITHER), BL_DEP_SETTING_3
|
||||
.SET_RENDER_MODE G_RM_ADD, (IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA), BL_DEP_SETTING_4
|
||||
.SET_RENDER_MODE G_RM_NOOP, (0), BL_DEP_SETTING_ZERO
|
||||
.SET_RENDER_MODE G_RM_VISCVG, (IM_RD | FORCE_BL), BL_DEP_SETTING_5
|
||||
.SET_RENDER_MODE G_RM_OPA_CI, (CVG_DST_CLAMP | ZMODE_OPA), BL_DEP_SETTING_3
|
||||
|
||||
/* Custom version of G_RM_AA_ZB_XLU_SURF with Z_UPD */
|
||||
.SET_RENDER_MODE G_RM_CUSTOM_AA_ZB_XLU_SURF, (AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_XLU), BL_DEP_SETTING_2
|
||||
|
||||
/* Special mode types only for mode 1 */
|
||||
.set G_RM_FOG_SHADE_A, BL_DEP_SETTING_FOG_SHADE_A
|
||||
.set G_RM_FOG_PRIM_A, BL_DEP_SETTING_FOG_PRIM_A
|
||||
.set G_RM_PASS, BL_DEP_SETTING_PASS
|
||||
|
||||
/*******************************************************************/
|
||||
|
||||
/* gSPSetOtherMode (H) */
|
||||
.set G_MDSFT_ALPHADITHER, 4
|
||||
.set G_MDSFT_RGBDITHER, 6
|
||||
.set G_MDSFT_COMBKEY, 8
|
||||
.set G_MDSFT_TEXTCONV, 9
|
||||
.set G_MDSFT_TEXTFILT, 12
|
||||
.set G_MDSFT_TEXTLUT, 14
|
||||
.set G_MDSFT_TEXTLOD, 16
|
||||
.set G_MDSFT_TEXTDETAIL, 17
|
||||
.set G_MDSFT_TEXTPERSP, 19
|
||||
.set G_MDSFT_CYCLETYPE, 20
|
||||
.set G_MDSFT_PIPELINE, 23
|
||||
|
||||
.set G_CYC_1CYCLE, (0 << G_MDSFT_CYCLETYPE)
|
||||
.set G_CYC_2CYCLE, (1 << G_MDSFT_CYCLETYPE)
|
||||
.set G_CYC_COPY, (2 << G_MDSFT_CYCLETYPE)
|
||||
.set G_CYC_FILL, (3 << G_MDSFT_CYCLETYPE)
|
||||
|
||||
.set G_TP_NONE, (0 << G_MDSFT_TEXTPERSP)
|
||||
.set G_TP_PERSP, (1 << G_MDSFT_TEXTPERSP)
|
||||
|
||||
.set G_TD_CLAMP, (0 << G_MDSFT_TEXTDETAIL)
|
||||
.set G_TD_SHARPEN, (1 << G_MDSFT_TEXTDETAIL)
|
||||
.set G_TD_DETAIL, (2 << G_MDSFT_TEXTDETAIL)
|
||||
|
||||
.set G_TL_TILE, (0 << G_MDSFT_TEXTLOD)
|
||||
.set G_TL_LOD, (1 << G_MDSFT_TEXTLOD)
|
||||
|
||||
.set G_TT_NONE, (0 << G_MDSFT_TEXTLUT)
|
||||
.set G_TT_RGBA16, (2 << G_MDSFT_TEXTLUT)
|
||||
.set G_TT_IA16, (3 << G_MDSFT_TEXTLUT)
|
||||
|
||||
.set G_TF_POINT, (0 << G_MDSFT_TEXTFILT)
|
||||
.set G_TF_AVERAGE, (3 << G_MDSFT_TEXTFILT)
|
||||
.set G_TF_BILERP, (2 << G_MDSFT_TEXTFILT)
|
||||
|
||||
.set G_TC_CONV, (0 << G_MDSFT_TEXTCONV)
|
||||
.set G_TC_FILTCONV, (5 << G_MDSFT_TEXTCONV)
|
||||
.set G_TC_FILT, (6 << G_MDSFT_TEXTCONV)
|
||||
|
||||
.set G_CK_NONE, (0 << G_MDSFT_COMBKEY)
|
||||
.set G_CK_KEY, (1 << G_MDSFT_COMBKEY)
|
||||
|
||||
.set G_CD_MAGICSQ, (0 << G_MDSFT_RGBDITHER)
|
||||
.set G_CD_BAYER, (1 << G_MDSFT_RGBDITHER)
|
||||
.set G_CD_NOISE, (2 << G_MDSFT_RGBDITHER)
|
||||
|
||||
/* gDPSetTile */
|
||||
.set G_TX_LOADTILE, 0x7
|
||||
.set G_TX_RENDERTILE, 0x0
|
||||
|
||||
/* axis clamp and mirror flags */
|
||||
.set G_TX_NOMIRROR, 0x0
|
||||
.set G_TX_WRAP, 0x0
|
||||
.set G_TX_MIRROR, 0x1
|
||||
.set G_TX_CLAMP, 0x2
|
||||
|
||||
/* mask flags */
|
||||
.set G_TX_NOMASK, 0x0
|
||||
|
||||
/* shift flags */
|
||||
.set G_TX_NOLOD, 0x0
|
||||
|
||||
/* gDPSetCombine */
|
||||
.set G_CCMUX_COMBINED, 0
|
||||
.set G_CCMUX_TEXEL0, 1
|
||||
.set G_CCMUX_TEXEL1, 2
|
||||
.set G_CCMUX_PRIMITIVE, 3
|
||||
.set G_CCMUX_SHADE, 4
|
||||
.set G_CCMUX_ENVIRONMENT, 5
|
||||
.set G_CCMUX_CENTER, 6
|
||||
.set G_CCMUX_SCALE, 6
|
||||
.set G_CCMUX_COMBINED_ALPHA, 7
|
||||
.set G_CCMUX_TEXEL0_ALPHA, 8
|
||||
.set G_CCMUX_TEXEL1_ALPHA, 9
|
||||
.set G_CCMUX_PRIMITIVE_ALPHA, 10
|
||||
.set G_CCMUX_SHADE_ALPHA, 11
|
||||
.set G_CCMUX_ENV_ALPHA, 12
|
||||
.set G_CCMUX_LOD_FRACTION, 13
|
||||
.set G_CCMUX_PRIM_LOD_FRAC, 14
|
||||
.set G_CCMUX_NOISE, 7
|
||||
.set G_CCMUX_K4, 7
|
||||
.set G_CCMUX_K5, 15
|
||||
.set G_CCMUX_1, 6
|
||||
.set G_CCMUX_0, 31
|
||||
|
||||
/* alpha combiner */
|
||||
.set G_ACMUX_COMBINED, 0
|
||||
.set G_ACMUX_TEXEL0, 1
|
||||
.set G_ACMUX_TEXEL1, 2
|
||||
.set G_ACMUX_PRIMITIVE, 3
|
||||
.set G_ACMUX_SHADE, 4
|
||||
.set G_ACMUX_ENVIRONMENT, 5
|
||||
.set G_ACMUX_LOD_FRACTION, 0
|
||||
.set G_ACMUX_PRIM_LOD_FRAC, 6
|
||||
.set G_ACMUX_1, 6
|
||||
.set G_ACMUX_0, 7
|
||||
|
||||
/* gDPSetTextureImage */
|
||||
/* fmt */
|
||||
.set G_IM_FMT_RGBA, 0x00
|
||||
.set G_IM_FMT_YUV, 0x01
|
||||
.set G_IM_FMT_CI, 0x02
|
||||
.set G_IM_FMT_IA, 0x03
|
||||
.set G_IM_FMT_I, 0x04
|
||||
|
||||
/* size */
|
||||
.set G_IM_SIZ_4b, 0x00
|
||||
.set G_IM_SIZ_8b, 0x01
|
||||
.set G_IM_SIZ_16b, 0x02
|
||||
.set G_IM_SIZ_32b, 0x03
|
||||
|
||||
.set G_TX_DXT_FRAC, 11
|
||||
.set G_TEXTURE_IMAGE_FRAC, 2
|
||||
|
||||
/* gDPLoadBlock*/
|
||||
.set G_TX_DXT_FRAC, 11
|
||||
.set G_TEXTURE_IMAGE_FRAC, 2
|
||||
|
||||
/* gSPNumLights / gSPFogFactor */
|
||||
|
||||
/* Index in DMEM table */
|
||||
.set G_MW_NUMLIGHT, 0x02
|
||||
.set G_MW_FOG, 0x08
|
||||
.set G_MW_PERSPNORM, 0x0E
|
||||
|
||||
/* Offsets in DMEM table */
|
||||
.set G_MWO_NUMLIGHT, 0x00
|
||||
.set G_MWO_FOG, 0x00
|
||||
|
||||
/* Parameter for gsSPNumLights; not really needed but is good for formality. */
|
||||
.set NUMLIGHTS_0, 1
|
||||
.set NUMLIGHTS_1, 1
|
||||
.set NUMLIGHTS_2, 2
|
||||
.set NUMLIGHTS_3, 3
|
||||
.set NUMLIGHTS_4, 4
|
||||
.set NUMLIGHTS_5, 5
|
||||
.set NUMLIGHTS_6, 6
|
||||
.set NUMLIGHTS_7, 7
|
||||
|
||||
/* GBI macros */
|
||||
|
||||
/* gsMoveWd */
|
||||
.macro gsMoveWd index, offset, data
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word G_MOVEWORD << 24 | ((\index & 0xFF) << 16) | (\offset & 0xFFFF)
|
||||
.else
|
||||
.word G_MOVEWORD << 24 | ((\offset & 0xFFFF) << 8) | (\index & 0xFF)
|
||||
.endif
|
||||
.word \data
|
||||
.endm
|
||||
|
||||
.set G_MWO_NUMLIGHT, 0x00
|
||||
/*
|
||||
* gSPNumLights
|
||||
* Parameter:
|
||||
* n = NUMLIGHTS_* (ranges from 0 to 7)
|
||||
*/
|
||||
.macro gsSPNumLights n
|
||||
.ifdef F3DEX_GBI_2
|
||||
gsMoveWd G_MW_NUMLIGHT, G_MWO_NUMLIGHT, (\n * 24)
|
||||
.else
|
||||
gsMoveWd G_MW_NUMLIGHT, G_MWO_NUMLIGHT, ((\n + 1) * 32 + 0x80000000)
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPMatrix */
|
||||
.macro gsSPMatrix matrix, params
|
||||
.ifdef F3DEX_GBI_2
|
||||
gsDma3p G_MTX, 0x38, 0, (\params ^ G_MTX_PUSH), \matrix
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
gsDma1p G_MTX, \matrix, 64, \params
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPLight */
|
||||
.macro gsSPLight light, num
|
||||
.ifdef F3DEX_GBI_2
|
||||
gsDma3p G_MOVEMEM, 8, ((G_MVO_L0+((\num-1)*24))/8), 10, \light
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
gsDma1p G_MOVEMEM, \light, 16, ((\num)-1)*2+G_MV_L0
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPVertex */
|
||||
.macro gsSPVertex verts, num, index
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word (G_VTX << 24) | ((\num & 0xFF) << 12) | (((\index+\num) & 0x7F) << 1)
|
||||
.word \verts
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
.ifdef F3DEX_GBI
|
||||
gsDma1p G_VTX, \verts, (\num)<<10|(16*(\num)-1), (2*\index)
|
||||
.else /* Fast3D */
|
||||
gsDma1p G_VTX, \verts, 16*\num, ((\num)-1)<<4|(\index)
|
||||
.endif
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gSPGeometryMode
|
||||
* In Fast3DEX2 it is better to use this, as the RSP geometry mode
|
||||
* is able to be set and cleared in a single command.
|
||||
*/
|
||||
.macro gsSPGeometryMode cc, ff, order
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word (G_GEOMETRYMODE << 24) | ((~(\cc)) & 0x00FFFFFF)
|
||||
.word \ff
|
||||
.else
|
||||
.if \order == 0
|
||||
gsSPSetGeometryMode \ff
|
||||
gsSPClearGeometryMode \cc
|
||||
.else
|
||||
gsSPClearGeometryMode \cc
|
||||
gsSPSetGeometryMode \ff
|
||||
.endif
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPSetGeometryMode */
|
||||
.macro gsSPSetGeometryMode, flags
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word (G_GEOMETRYMODE << 24) | 0x00FFFFFF
|
||||
.word \flags
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
.word G_SETGEOMETRYMODE << 24
|
||||
.word \flags
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPClearGeometryMode */
|
||||
.macro gsSPClearGeometryMode, flags
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word (G_GEOMETRYMODE << 24) | ((~(\flags)) & 0x00FFFFFF)
|
||||
.word 0
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
.word G_CLEARGEOMETRYMODE << 24
|
||||
.word \flags
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPPerspNormalize */
|
||||
.macro gsSPPerspNormalize, perspNorm
|
||||
.ifndef F3D_OLD
|
||||
gsMoveWd G_MW_PERSPNORM, 0, \perspNorm
|
||||
.else
|
||||
gsImmp1 G_RDPHALF_1, \perspNorm
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPEndDisplayList */
|
||||
.macro gsSPEndDisplayList
|
||||
f3d_noparam G_ENDDL
|
||||
.endm
|
||||
|
||||
/* gSPSetOtherMode */
|
||||
.macro gsSPSetOtherMode cmd, sft, len, data
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word ((\cmd & 0xFF) << 24) | ((32 - (\sft & 0xFF) - (\len & 0xFF)) << 8) | ((\len-1) & 0xFF)
|
||||
.word \data
|
||||
.else /* Fast3D and Fast3DEX2 */
|
||||
.word ((\cmd & 0xFF) << 24) | ((\sft & 0xFF) << 8) | (\len & 0xFF)
|
||||
.word \data
|
||||
.endif
|
||||
.endm
|
||||
|
||||
.macro gsSPTexture scaleS, scaleT, level, tile, enable
|
||||
.ifdef F3DEX_GBI_2
|
||||
.word (G_TEXTURE << 24) | ((\level & 0x7) << 11) | ((\tile & 0x7) << 8) | (\enable*2)
|
||||
.word ((\scaleS & 0xFFFF) << 16) | (\scaleT & 0xFFFF)
|
||||
.else /* Fast3D and Fast3DEX */
|
||||
.word (G_TEXTURE << 24) | ((\level & 0x7) << 11) | ((\tile & 0x7) << 8) | \enable
|
||||
.word ((\scaleS & 0xFFFF) << 16) | (\scaleT & 0xFFFF)
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gSPSetRenderMode */
|
||||
.macro gsDPSetRenderMode cycle1Mode, cycle2Mode
|
||||
gsSPSetOtherMode G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, \cycle1Mode | \cycle2Mode
|
||||
.endm
|
||||
|
||||
/* gDPSetTexturePersp */
|
||||
.macro gsDPSetTexturePersp type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetCycleType */
|
||||
.macro gsDPSetCycleType type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureDetail */
|
||||
.macro gsDPSetTextureDetail type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureLOD*/
|
||||
.macro gsDPSetTextureLOD type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureTLUT */
|
||||
.macro gsDPSetTextureLUT type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureFilter */
|
||||
.macro gsDPSetTextureFilter type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureConvert */
|
||||
.macro gsDPSetTextureConvert type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetCombineKey */
|
||||
.macro gsDPSetCombineKey type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetColorDither */
|
||||
.macro gsDPSetColorDither mode
|
||||
gsSPSetOtherMode G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, \mode
|
||||
.endm
|
||||
|
||||
/* gsDPSetAlphaCompare */
|
||||
.macro gsDPSetAlphaCompare type
|
||||
gsSPSetOtherMode G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, \type
|
||||
.endm
|
||||
|
||||
/* gDPSetDepthSource */
|
||||
.macro gsDPSetDepthSource src
|
||||
gsSPSetOtherMode G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, \src
|
||||
.endm
|
||||
|
||||
/* gSPDisplayList */
|
||||
.macro gsSPDisplayList dl
|
||||
gsDma1p G_DL, \dl, 0, G_DL_PUSH
|
||||
.endm
|
||||
|
||||
/* gSPBranchDisplayList */
|
||||
.macro gsSPBranchList dl
|
||||
gsDma1p G_DL, \dl, 0, G_DL_NOPUSH
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gSP1Triangle
|
||||
* Note: flag has no effect on this implementation of gSP1Triangle.
|
||||
*/
|
||||
.macro gsSP1Triangle v0, v1, v2, flag
|
||||
.ifndef F3DEX_GBI_2
|
||||
.word G_TRI1 << 24
|
||||
.ifdef F3DEX_GBI /* Fast3DEX */
|
||||
.word (\v0*2 << 16) | (\v1*2 << 8) | \v2*2
|
||||
.else /* Fast3D */
|
||||
.word (\v0*10 << 16) | (\v1*10 << 8) | \v2*10
|
||||
.endif
|
||||
.else /* Fast3DEX2 */
|
||||
bytes4 G_TRI1, \v0*2, \v1*2, \v2*2
|
||||
.word 0
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gSP2Triangles
|
||||
* Note: flag has no effect on this implementation of gSP2Triangles.
|
||||
*/
|
||||
.macro gsSP2Triangles v0, v1, v2, flag0, v3, v4, v5, flag1
|
||||
.ifdef F3DEX_GBI_SHARED /* Fast3DEX and Fast3DEX2 have the same G_TRI2 syntax. */
|
||||
.word (G_TRI2 << 24) | (\v0*2 << 16) | (\v1*2 << 8) | \v2*2
|
||||
.word (0x00 << 24) | (\v3*2 << 16) | (\v4*2 << 8) | \v5*2
|
||||
.else /* Backwards compatibility with Fast3D. */
|
||||
gsSP1Triangle \v0, \v1, \v2, \flag0
|
||||
gsSP1Triangle \v3, \v4, \v5, \flag1
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* gDPNoOp */
|
||||
.macro gsDPNoOp
|
||||
f3d_noparam G_NOOP
|
||||
.endm
|
||||
|
||||
/* gSPTextureRectangle */
|
||||
.macro gsSPTextureRectangle xl, yl, xh, yh, tile, s, t, dsdx, dtdy
|
||||
.word (G_TEXRECT << 24) | (\xh << 12) | \yh
|
||||
.word (\tile << 24) | (\xl << 12) | \yl
|
||||
.ifdef F3D_OLD
|
||||
.word (G_RDPHALF_2 << 24)
|
||||
.else
|
||||
.word (G_RDPHALF_1 << 24)
|
||||
.endif
|
||||
.word (\s << 16) | \t
|
||||
.ifdef F3D_OLD
|
||||
.word (G_RDPHALF_CONT << 24)
|
||||
.else
|
||||
.word (G_RDPHALF_2 << 24)
|
||||
.endif
|
||||
.word (\dsdx << 16) | \dtdy
|
||||
.endm
|
||||
|
||||
/* gDPLoadSync */
|
||||
.macro gsDPLoadSync
|
||||
f3d_noparam G_RDPLOADSYNC
|
||||
.endm
|
||||
|
||||
/* gDPPipeSync*/
|
||||
.macro gsDPPipeSync
|
||||
f3d_noparam G_RDPPIPESYNC
|
||||
.endm
|
||||
|
||||
/* gDPFullSync*/
|
||||
.macro gsDPFullSync
|
||||
f3d_noparam G_RDPFULLSYNC
|
||||
.endm
|
||||
|
||||
/* gDPLoadTLUTCmd */
|
||||
.macro gsDPLoadTLUTCmd tile, count
|
||||
.word G_LOADTLUT << 24
|
||||
.word ((\tile & 0x7) << 24) | ((\count - 1) & 0x3FF) << 14
|
||||
.endm
|
||||
|
||||
/* gDPTileSync */
|
||||
.macro gsDPTileSync
|
||||
f3d_noparam G_RDPTILESYNC
|
||||
.endm
|
||||
|
||||
/* gDPSetTileSize */
|
||||
.macro gsDPSetTileSize tile, uls, ult, lrs, lrt
|
||||
.word (G_SETTILESIZE << 24) | ((\uls & 0x0FFF) << 12) | (\ult & 0x0FFF)
|
||||
.word ((\tile & 0x7) << 24) | ((\lrs & 0x0FFF) << 12) | (\lrt & 0x0FFF)
|
||||
.endm
|
||||
|
||||
/* gsDPLoadBlock */
|
||||
.macro gsDPLoadBlock tile, uls, ult, lrs, dxt
|
||||
.word (G_LOADBLOCK << 24) | ((\uls & 0x0FFF) << 12) | (\ult & 0x0FFF)
|
||||
.word ((\tile & 0x7) << 24) | ((\lrs & 0x0FFF) << 12) | (\dxt & 0x0FFF)
|
||||
.endm
|
||||
|
||||
/* gDPSetTile */
|
||||
.macro gsDPSetTile fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts
|
||||
.word (G_SETTILE << 24) | ((\fmt & 0x7) << 21) | ((\siz & 0x3) << 19) | ((\line & 0x1FF) << 9) | (\tmem & 0x1FF)
|
||||
.word ((\tile & 0x7) << 24) | ((\palette & 0xF) << 20) | ((\cmt & 0x3) << 18) | ((\maskt & 0xF) << 14) | ((\shiftt & 0xF) << 10) | ((\cms & 0x3) << 8) | ((\masks & 0xF) << 4) | (\shifts & 0xF)
|
||||
.endm
|
||||
|
||||
/* gDPFillRectangle */
|
||||
.macro gsDPFillRectangle ulx, uly, lrx, lry
|
||||
.word (G_FILLRECT << 24) | ((\lrx & 0x3FF) << 14) | ((\lry & 0x3FF) << 2)
|
||||
.word ((\ulx & 0x3FF) << 14) | ((\uly & 0x3FF) << 2)
|
||||
.endm
|
||||
|
||||
/* gDPSetFillColor */
|
||||
.macro gsDPSetFillColor fillValue
|
||||
.word G_SETFILLCOLOR << 24
|
||||
.word \fillValue
|
||||
.endm
|
||||
|
||||
/* gDPSetFogColor */
|
||||
.macro gsDPSetFogColor r, g, b, a
|
||||
sDPRGBColor G_SETFOGCOLOR, \r, \g, \b, \a
|
||||
.endm
|
||||
|
||||
/* gDPSetBlendColor */
|
||||
.macro gsDPSetBlendColor r, g, b, a
|
||||
sDPRGBColor G_SETBLENDCOLOR, \r, \g, \b, \a
|
||||
.endm
|
||||
|
||||
/* gDPSetPrimColor */
|
||||
.macro gsDPSetPrimColor m, l, r, g, b, a
|
||||
.word (G_SETPRIMCOLOR << 24) | ((\m & 0xFF) << 8) | (\l & 0xFF)
|
||||
.word (\r << 24) | (\g << 16) | (\b << 8) | \a
|
||||
.endm
|
||||
|
||||
/* gDPSetEnvColor */
|
||||
.macro gsDPSetEnvColor r, g, b, a
|
||||
sDPRGBColor G_SETENVCOLOR, \r, \g, \b, \a
|
||||
.endm
|
||||
|
||||
/* gDPSetCombine */
|
||||
.macro gsDPSetCombine muxs0, muxs1
|
||||
.word (G_SETCOMBINE << 24) | (\muxs0 & 0x00FFFFFF)
|
||||
.word \muxs1
|
||||
.endm
|
||||
|
||||
/* gDPSetCombineMode */
|
||||
.macro gsDPSetCombineModeLERP a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1
|
||||
.word (G_SETCOMBINE << 24) | ((\a0 & 0xF) << 20) | ((\c0 & 0x1F) << 15) | ((\Aa0 & 0x7) << 12) | ((\Ac0 & 0x7) << 9) | ((\a1 & 0xF) << 5) | (\c1 & 0x1F)
|
||||
.word ((\b0 & 0xF) << 28) | ((\b1 & 0xF) << 24) | ((\Aa1 & 0x7) << 21) | ((\Ac1 & 0x7) << 18) | ((\d0 & 0x7) << 15) | ((\Ab0 & 0x7) << 12) | ((\Ad0 & 0x7) << 9) | ((\d1 & 0x7) << 6) | ((\Ab1 & 0x7) << 3) | (\Ad1 & 0x7)
|
||||
.endm
|
||||
|
||||
/* gDPSetCombineMode1Cycle */
|
||||
.macro gsDPSetCombineModeLERP1Cycle a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0
|
||||
gsDPSetCombineModeLERP \a0, \b0, \c0, \d0, \Aa0, \Ab0, \Ac0, \Ad0, \a0, \b0, \c0, \d0, \Aa0, \Ab0, \Ac0, \Ad0
|
||||
.endm
|
||||
|
||||
/* gDPSetTextureImage */
|
||||
.macro gsDPSetTextureImage fmt, size, width, segAddr
|
||||
.word (G_SETTIMG << 24) | ((\fmt & 0x7) << 21) | ((\size & 0x3) << 19) | ((\width-1) & 0x0FFF)
|
||||
.word \segAddr
|
||||
.endm
|
||||
|
||||
/* gDPLoadTextureBlock */
|
||||
/* Calculate gDPLoadBlock for 8, 16, and 32 bit textures */
|
||||
.macro _calc_gsDPLoadBlockNot4b width, height, shift, incr, byteSize
|
||||
.if (((\width * \byteSize) / 8) > 1) /* result of TXL2WORDS is greater than 1 */
|
||||
gsDPLoadBlock G_TX_LOADTILE, 0, 0, (((\width * \height) + \incr) >> \shift) - 1, (((1 << G_TX_DXT_FRAC) + ((\width * \byteSize) / 8) - 1) / ((\width * \byteSize) / 8))
|
||||
.else /* result of TXL2WORDS is 1 */
|
||||
gsDPLoadBlock G_TX_LOADTILE, 0, 0, (((\width * \height) + \incr) >> \shift) - 1, (1 << G_TX_DXT_FRAC)
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* Calculate gDPLoadBlock for 4-bit textures */
|
||||
.macro _calc_gsDPLoadBlock4b width, height
|
||||
.if ((\width / 16) > 1) /* result of TXL2WORDS_4b is greater than 1 */
|
||||
gsDPLoadBlock G_TX_LOADTILE, 0, 0, (((\width * \height) + 3) >> 2) - 1, (((1 << G_TX_DXT_FRAC) + (\width / 16) - 1) / (\width / 16))
|
||||
.else /* result of TXL2WORDS_4b is 1 */
|
||||
gsDPLoadBlock G_TX_LOADTILE, 0, 0, (((\width * \height) + 3) >> 2) - 1, (1 << G_TX_DXT_FRAC)
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* Calculate gDPLoadBlock using texture bit size, width, and height */
|
||||
.macro _calc_gsDPLoadBlock siz, width, height
|
||||
.if (\siz == G_IM_SIZ_4b)
|
||||
_calc_gsDPLoadBlock4b \width, \height
|
||||
.elseif (\siz == G_IM_SIZ_8b)
|
||||
_calc_gsDPLoadBlockNot4b \width, \height, 1, 1, 1
|
||||
.elseif (\siz == G_IM_SIZ_16b)
|
||||
_calc_gsDPLoadBlockNot4b \width, \height, 0, 0, 2
|
||||
.elseif (\siz == G_IM_SIZ_32b)
|
||||
_calc_gsDPLoadBlockNot4b \width, \height, 0, 0, 4
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gDPLoadTextureBlock is a macro that allows you to easily load a texture in the f3d family of ucodes
|
||||
* Parameters:
|
||||
* timg = label to the texture data
|
||||
* fmt = image format (G_IM_FMT_RGBA, G_IM_FMT_CI, G_IM_FMT_IA, G_IM_FMT_I, or G_IM_FMT_YUV)
|
||||
* siz = bits per pixel (G_IM_SIZ_4b, G_IM_SIZ_8b, G_IM_SIZ_16b, or G_IM_SIZ_32b)
|
||||
* width = width of the texture in pixels
|
||||
* height = height of the texture in pixels
|
||||
* pal = palette id to use if using G_IM_FMT_CI, otherwise it should be 0.
|
||||
* cms = Clamp & Mirror flags for the S axis
|
||||
* cmt = Clamp & Mirror flags for the T axis
|
||||
* masks = Sets how much of the S axis is shown before clamping. This is usually just log2(width).
|
||||
* maskt = Sets how much of the T axis is shown before clamping. This is usually just log2(height).
|
||||
* shifts = Sets the amount to shift S axis values after perspective division. This is usually G_TX_NOLOD.
|
||||
* shiftt = Sets the amount to shift T axis values after perspective division. This is usually G_TX_NOLOD.
|
||||
*/
|
||||
.macro gsDPLoadTextureBlock timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt
|
||||
.if (\siz == G_IM_SIZ_32b)
|
||||
gsDPSetTextureImage \fmt, \siz, 1, \timg
|
||||
gsDPSetTile \fmt, \siz, 0, 0, G_TX_LOADTILE, 0, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
.else
|
||||
gsDPSetTextureImage \fmt, G_IM_SIZ_16b, 1, \timg
|
||||
gsDPSetTile \fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
.endif
|
||||
|
||||
gsDPLoadSync
|
||||
_calc_gsDPLoadBlock \siz, \width, \height
|
||||
gsDPPipeSync
|
||||
|
||||
.if (\siz == G_IM_SIZ_4b)
|
||||
gsDPSetTile \fmt, \siz, (7 >> 3), 0, G_TX_RENDERTILE, \pal, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
.elseif (\siz == G_IM_SIZ_8b)
|
||||
gsDPSetTile \fmt, \siz, ((\width + 7) >> 3), 0, G_TX_RENDERTILE, \pal, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
.else
|
||||
gsDPSetTile \fmt, \siz, (((\width * 2) + 7) >> 3), 0, G_TX_RENDERTILE, \pal, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
.endif
|
||||
|
||||
gsDPSetTileSize G_TX_RENDERTILE, 0, 0, ((\width - 1) << G_TEXTURE_IMAGE_FRAC), ((\height - 1) << G_TEXTURE_IMAGE_FRAC)
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gDPLoadTLUT_pal16, loads 16 colors into the TLUT
|
||||
* Parameters:
|
||||
* pal = palette number to use.
|
||||
* timg_pal = label to palette data
|
||||
*/
|
||||
.macro gsDPLoadTLUT_pal16 pal, timg_pal
|
||||
gsDPSetTextureImage G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, \timg_pal
|
||||
gsDPTileSync
|
||||
gsDPSetTile 0, 0, 0, (256+(((\pal)&0xf)*16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0
|
||||
gsDPLoadSync
|
||||
gsDPLoadTLUTCmd G_TX_LOADTILE, 16
|
||||
gsDPPipeSync
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gDPLoadTLUT_pal256, loads 256 colors into the TLUT
|
||||
* Parameters:
|
||||
* timg_pal = label to palette data
|
||||
*/
|
||||
.macro gsDPLoadTLUT_pal256 timg_pal
|
||||
gsDPSetTextureImage G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, \timg_pal
|
||||
gsDPTileSync
|
||||
gsDPSetTile 0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0
|
||||
gsDPLoadSync
|
||||
gsDPLoadTLUTCmd G_TX_LOADTILE, 256
|
||||
gsDPPipeSync
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gDPLoadTextureBlock_4b is a macro that allows you to easily load a 4-bit texture in the Fast3D family of ucodes.
|
||||
* Parameters:
|
||||
* timg = label to the texture data
|
||||
* fmt = image format (G_IM_FMT_RGBA, G_IM_FMT_CI, G_IM_FMT_IA, G_IM_FMT_I, or G_IM_FMT_YUV)
|
||||
* width = width of the texture in pixels
|
||||
* height = height of the texture in pixels
|
||||
* pal = palette id to use if using G_IM_FMT_CI, otherwise it should be 0.
|
||||
* cms = Clamp & Mirror flags for the S axis
|
||||
* cmt = Clamp & Mirror flags for the T axis
|
||||
* masks = Sets how much of the S axis is shown before clamping. This is usually just log2(width).
|
||||
* maskt = Sets how much of the T axis is shown before clamping. This is usually just log2(height).
|
||||
* shifts = Sets the amount to shift S axis values after perspective division. This is usually G_TX_NOLOD.
|
||||
* shiftt = Sets the amount to shift T axis values after perspective division. This is usually G_TX_NOLOD.
|
||||
*/
|
||||
|
||||
.macro gsDPLoadTextureBlock_4b timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt
|
||||
gsDPSetTextureImage \fmt, G_IM_SIZ_16b, 1, \timg
|
||||
gsDPSetTile \fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
gsDPLoadSync
|
||||
_calc_gsDPLoadBlock4b \width, \height
|
||||
gsDPPipeSync
|
||||
gsDPSetTile \fmt, G_IM_SIZ_4b, ((((\width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, \pal, \cmt, \maskt, \shiftt, \cms, \masks, \shifts
|
||||
gsDPSetTileSize G_TX_RENDERTILE, 0, 0, ((\width) - 1) << G_TEXTURE_IMAGE_FRAC, ((\height) - 1) << G_TEXTURE_IMAGE_FRAC
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gSPFogFactor
|
||||
* Parameters:
|
||||
* fm = z multiplier
|
||||
* fo = z offset
|
||||
*
|
||||
* FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo (CLAMPED 0 to 255)
|
||||
* note: (eyespace z) ranges [-1, 1]
|
||||
*/
|
||||
.macro gsSPFogFactor fm, fo
|
||||
gsMoveWd G_MW_FOG, G_MWO_FOG, ((\fm & 0xFFFF) << 16) | (\fo & 0xFFFF)
|
||||
.endm
|
||||
|
||||
/*
|
||||
* gSPFogPosition
|
||||
* Parameters:
|
||||
* min = Place where fog starts (0 at the near plane, and 1000 at the far plane)
|
||||
* max = Place where fog saturates (0 at the near plane, and 1000 at the far plane)
|
||||
*
|
||||
* This macro will throw an error if min or max is outside the range [0, 1000]
|
||||
*
|
||||
* Note: The min can be larger than max, as that just makes objects fade when they
|
||||
* get closer to the camera.
|
||||
*/
|
||||
.macro gsSPFogPosition min, max
|
||||
.if (\min >= 0 && \min <= 1000 && \max >= 0 && \max <= 1000)
|
||||
gsMoveWd G_MW_FOG, G_MWO_FOG, (((128000 / (\max - \min)) & 0xFFFF) << 16) | ((((500 - \min) * 256) / (\max - \min)) & 0xFFFF)
|
||||
.elseif \min < 0 || \min > 1000
|
||||
.error "[gsSPFogPosition]: min should be in the range [0, 1000]"
|
||||
.elseif \max < 0 || \max > 1000
|
||||
.error "[gsSPFogPosition]: max should be in the range [0, 1000]"
|
||||
.endif
|
||||
.endm
|
||||
File diff suppressed because it is too large
Load Diff
@@ -60,11 +60,7 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifdef F3D_OLD
|
||||
#include <PR/gbi_old.h>
|
||||
#else
|
||||
#include <PR/gbi.h>
|
||||
#endif
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
|
||||
+5
-93
@@ -1,98 +1,10 @@
|
||||
|
||||
/*====================================================================
|
||||
* os_libc.h
|
||||
*
|
||||
* Copyright 1995, Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
|
||||
* Inc.; the contents of this file may not be disclosed to third
|
||||
* parties, copied or duplicated in any form, in whole or in part,
|
||||
* without the prior written permission of Silicon Graphics, Inc.
|
||||
*
|
||||
* RESTRICTED RIGHTS LEGEND:
|
||||
* Use, duplication or disclosure by the Government is subject to
|
||||
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
|
||||
* in Technical Data and Computer Software clause at DFARS
|
||||
* 252.227-7013, and/or in similar or successor clauses in the FAR,
|
||||
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
|
||||
* Copyright Laws of the United States.
|
||||
*====================================================================*/
|
||||
|
||||
/*---------------------------------------------------------------------*
|
||||
Copyright (C) 1998 Nintendo. (Originated by SGI)
|
||||
|
||||
$RCSfile: os_libc.h,v $
|
||||
$Revision: 1.3 $
|
||||
$Date: 1999/07/13 01:43:47 $
|
||||
*---------------------------------------------------------------------*/
|
||||
|
||||
#ifndef _OS_LIBC_H_
|
||||
#define _OS_LIBC_H_
|
||||
#define _OS_LIBC_H_
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "ultratypes.h"
|
||||
|
||||
#include <PR/ultratypes.h>
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Type definitions
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Global definitions
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Macro definitions
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Extern variables
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Function prototypes
|
||||
*
|
||||
*/
|
||||
|
||||
/* byte string operations */
|
||||
|
||||
|
||||
extern void bcopy(const void *, void *, int);
|
||||
extern int bcmp(const void *, const void *, int);
|
||||
extern void bzero(void *, int);
|
||||
|
||||
/* Printf */
|
||||
|
||||
extern int sprintf(char *s, const char *fmt, ...);
|
||||
extern void osSyncPrintf(const char *fmt, ...);
|
||||
|
||||
|
||||
#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
|
||||
|
||||
#ifdef _LANGUAGE_C_PLUS_PLUS
|
||||
}
|
||||
#endif
|
||||
// Old deprecated functions from strings.h, replaced by memcpy/memset.
|
||||
extern void bcopy(const void *, void *, size_t);
|
||||
extern void bzero(void *, size_t);
|
||||
|
||||
#endif /* !_OS_LIBC_H_ */
|
||||
|
||||
Reference in New Issue
Block a user