diff --git a/libpsx/include/psxgpu.h b/libpsx/include/psxgpu.h index 53c53d9..1eaa676 100644 --- a/libpsx/include/psxgpu.h +++ b/libpsx/include/psxgpu.h @@ -679,84 +679,84 @@ typedef struct * @param poly3 Pointer to structure for monochrome 3 point polygon */ -void GsSortPoly3(GsPoly3 *poly3); +void GsSortPoly3(const GsPoly3 *poly3); /** * Adds a monochrome 4 point polygon to the packet list * @param poly4 Pointer to structure for monochrome 4 point polygon */ -void GsSortPoly4(GsPoly4 *poly4); +void GsSortPoly4(const GsPoly4 *poly4); /** * Adds a textured 3 point polygon to the packet list * @param tpoly3 Pointer to structure for textured 3 point polygon */ -void GsSortTPoly3(GsTPoly3 *tpoly3); +void GsSortTPoly3(const GsTPoly3 *tpoly3); /** * Adds a textured 4 point polygon to the packet list * @param tpoly4 Pointer to structure for textured 4 point polygon */ -void GsSortTPoly4(GsTPoly4 *tpoly4); +void GsSortTPoly4(const GsTPoly4 *tpoly4); /** * Adds a gradated 3 point polygon to the packet list * @param poly3 Pointer to structure for gradated 3 point polygon */ -void GsSortGPoly3(GsGPoly3 *poly3); +void GsSortGPoly3(const GsGPoly3 *poly3); /** * Adds a gradated 4 point polygon to the packet list * @param poly4 Pointer to structure for gradated 4 point polygon */ -void GsSortGPoly4(GsGPoly4 *poly4); +void GsSortGPoly4(const GsGPoly4 *poly4); /** * Adds a gradated textured 3 point polygon to the packet list * @param tpoly3 Pointer to structure for textured 3 point polygon */ -void GsSortGTPoly3(GsGTPoly3 *tpoly3); +void GsSortGTPoly3(const GsGTPoly3 *tpoly3); /** * Adds a gradated 4 point polygon to the packet list * @param tpoly4 Pointer to structure for textured 4 point polygon */ -void GsSortGTPoly4(GsGTPoly4 *tpoly4); +void GsSortGTPoly4(const GsGTPoly4 *tpoly4); /** * Adds a monochrome line to the packet list * @param line Pointer to structure for monochrome line */ -void GsSortLine(GsLine *line); +void GsSortLine(const GsLine *line); /** * Adds a gradated line to the packet list * @param line Pointer to structure for gradated line */ -void GsSortGLine(GsGLine *line); +void GsSortGLine(const GsGLine *line); /** * Adds a dot (pixel) to the packet list * @param dot Pointer to structure for dot */ -void GsSortDot(GsDot *dot); +void GsSortDot(const GsDot *dot); /** * Adds a sprite to the packet list * @param sprite Pointer to structure for sprite */ -void GsSortSprite(GsSprite *sprite); +void GsSortSprite(const GsSprite *sprite); /** * Always adds a REAL sprite to the packet list @@ -770,14 +770,14 @@ void GsSortSprite(GsSprite *sprite); * @param sprite Pointer to structure for sprite */ -void GsSortSimpleSprite(GsSprite *sprite); +void GsSortSimpleSprite(const GsSprite *sprite); /** * Adds a rectangle to the packet list * @param rectangle Pointer to structure for rectangle */ -void GsSortRectangle(GsRectangle *rectangle); +void GsSortRectangle(const GsRectangle *rectangle); /** * Moves image data from a part of the framebuffer to another. @@ -822,14 +822,20 @@ void DrawFBRect(int x, int y, int w, int h, int r, int g, int b); * @param drawenv Pointer to drawing environment structure */ -void GsSetDrawEnv(GsDrawEnv *drawenv); +void GsSetDrawEnv(const GsDrawEnv *drawenv); + +/** + * Set drawing environment via DMA commands. + * @param drawenv Pointer to drawing environment structure + */ +void GsSetDrawEnv_DMA(const GsDrawEnv* drawenv); /** * Set display environment * @param dispenv Pointer to display environment structure */ -void GsSetDispEnv(GsDispEnv *dispenv); +void GsSetDispEnv(const GsDispEnv *dispenv); @@ -870,7 +876,12 @@ int GsImageFromTim(GsImage *image, const void *timdata); * Uploads an image described by a GsImage structure to video memory. */ -void GsUploadImage(GsImage *image); +void GsUploadImage(const GsImage *image); + +/** + * Upload a CLUT described by a GsImage structure to video memory. + */ +void GsUploadCLUT(const GsImage *image); /** * Fills a GsSprite structure with information from an image described @@ -878,7 +889,7 @@ void GsUploadImage(GsImage *image); * Sprite coordinates are set to 0. */ -int GsSpriteFromImage(GsSprite *sprite, GsImage *image, int do_upload); +int GsSpriteFromImage(GsSprite *sprite, const GsImage *image, int do_upload); /** * Checks if the GPU is drawing @@ -1135,14 +1146,14 @@ void GsRotateVector(int x_a, int y_a, int z_a, double *v, double *n); * @param line Pointer to structure for monochrome polyline */ -void GsSortPolyLine(GsPolyLine *line); +void GsSortPolyLine(const GsPolyLine *line); /** * Adds a gradated polyline to the packet list * @param line Pointer to structure for monochrome line */ -void GsSortGPolyLine(GsGPolyLine *line); +void GsSortGPolyLine(const GsGPolyLine *line); #ifdef __cplusplus } diff --git a/libpsx/include/psxpad.h b/libpsx/include/psxpad.h index ae73d7e..b39ed26 100644 --- a/libpsx/include/psxpad.h +++ b/libpsx/include/psxpad.h @@ -176,7 +176,7 @@ typedef struct }extra; }psx_pad_state; -void QueryPAD(int pad_n, unsigned char *in, unsigned char *out, int len); +void QueryPAD(int pad_n, const unsigned char *in, unsigned char *out, int len); void pad_read_raw(int pad_n, unsigned char *arr); void pad_escape_mode(int pad_n, int enable); void pad_enable_vibration(int pad_n); diff --git a/libpsx/src/font.h b/libpsx/src/font.h index b1c71cb..2ff635e 100644 --- a/libpsx/src/font.h +++ b/libpsx/src/font.h @@ -4,7 +4,7 @@ // The font was created by John Reeves Hall -unsigned char psxsdk_font_data[] = +const unsigned char psxsdk_font_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/libpsx/src/gpu.c b/libpsx/src/gpu.c index beb6560..d7d8e41 100644 --- a/libpsx/src/gpu.c +++ b/libpsx/src/gpu.c @@ -158,7 +158,7 @@ void GsDrawListPIO() while(GsIsDrawing()); } -void GsSortPoly3(GsPoly3 *poly3) +void GsSortPoly3(const GsPoly3 *poly3) { int orig_pos = linked_list_pos; int x; @@ -177,7 +177,7 @@ void GsSortPoly3(GsPoly3 *poly3) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortPoly4(GsPoly4 *poly4) +void GsSortPoly4(const GsPoly4 *poly4) { int orig_pos = linked_list_pos; int x; @@ -196,7 +196,7 @@ void GsSortPoly4(GsPoly4 *poly4) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortGPoly3(GsGPoly3 *poly3) +void GsSortGPoly3(const GsGPoly3 *poly3) { // PKT 0x30 @@ -219,7 +219,7 @@ void GsSortGPoly3(GsGPoly3 *poly3) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortGPoly4(GsGPoly4 *poly4) +void GsSortGPoly4(const GsGPoly4 *poly4) { // PKT 0x38 @@ -242,7 +242,7 @@ void GsSortGPoly4(GsGPoly4 *poly4) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortLine(GsLine *line) +void GsSortLine(const GsLine *line) { // PKT 0x40 @@ -263,7 +263,7 @@ void GsSortLine(GsLine *line) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortGLine(GsGLine *line) +void GsSortGLine(const GsGLine *line) { // PKT 0x50 @@ -286,7 +286,7 @@ void GsSortGLine(GsGLine *line) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortDot(GsDot *dot) +void GsSortDot(const GsDot *dot) { // PKT 0x68 @@ -304,7 +304,7 @@ void GsSortDot(GsDot *dot) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortSprite(GsSprite *sprite) +void GsSortSprite(const GsSprite *sprite) { GsTPoly4 tpoly4; int x, y; @@ -447,7 +447,7 @@ void GsSortSprite(GsSprite *sprite) } } -void GsSortSimpleSprite(GsSprite *sprite) +void GsSortSimpleSprite(const GsSprite *sprite) { unsigned int orig_pos = linked_list_pos; unsigned char pkt = 0x64; @@ -465,7 +465,7 @@ void GsSortSimpleSprite(GsSprite *sprite) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortRectangle(GsRectangle *rectangle) +void GsSortRectangle(const GsRectangle *rectangle) { unsigned int orig_pos = linked_list_pos; unsigned char pkt = 0x60; @@ -482,7 +482,7 @@ void GsSortRectangle(GsRectangle *rectangle) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortTPoly4(GsTPoly4 *tpoly4) +void GsSortTPoly4(const GsTPoly4 *tpoly4) { unsigned int orig_pos = linked_list_pos; unsigned char pkt = 0x2c; @@ -515,7 +515,7 @@ void GsSortTPoly4(GsTPoly4 *tpoly4) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortTPoly3(GsTPoly3 *tpoly3) +void GsSortTPoly3(const GsTPoly3 *tpoly3) { int orig_pos = linked_list_pos; int x; @@ -604,6 +604,12 @@ void LoadImage(const void *img, int x, int y, int w, int h) // while(!(GPU_CONTROL_PORT & (1<<0x1c))); } +void GsUploadCLUT(const GsImage * image) +{ + LoadImage( image->clut_data, image->clut_x, image->clut_y, + image->clut_w, image->clut_h ); +} + /*void LoadImage(void *img, int x, int y, int w, int h) { GPU_dw(x, y, w, h, img); @@ -628,7 +634,7 @@ void LoadImage(const void *img, int x, int y, int w, int h) while(D2_CHCR & (1<<0x18)); //}*/ -void GsSetDrawEnv(GsDrawEnv *drawenv) +void GsSetDrawEnv(const GsDrawEnv *drawenv) { int end_y, end_x; int mf; @@ -665,7 +671,25 @@ void GsSetDrawEnv(GsDrawEnv *drawenv) GsCurDrawEnvH = drawenv->h; } -void GsSetDispEnv(GsDispEnv *dispenv) +void GsSetDrawEnv_DMA(const GsDrawEnv* drawenv) +{ + unsigned int orig_pos = linked_list_pos; + + linked_list[linked_list_pos++] = 0x05000000; + + linked_list[linked_list_pos++] = (0xE1 << 24) |(drawenv->draw_on_display>=1)<<10|(drawenv->dither>=1)<<9; + linked_list[linked_list_pos++] = (0xE2 << 24); + linked_list[linked_list_pos++] = ((0xE3 << 24) | (drawenv->x & 0x7FF) | ((drawenv->y & 0x3FF) << 10)); + linked_list[linked_list_pos++] = ((0xE4 << 24) | ((drawenv->x + drawenv->w - 1) & 0x3FF) | (((drawenv->y + drawenv->h - 1) & 0x3FF) << 10)); + linked_list[linked_list_pos++] = ((0xE5 << 24) | ((drawenv->x) & 0x7FF) | (((drawenv->y ) & 0x7FF) << 11)); + + linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; + + GsCurDrawEnvW = drawenv->w; + GsCurDrawEnvH = drawenv->h; +} + +void GsSetDispEnv(const GsDispEnv *dispenv) { gpu_ctrl(5, (dispenv->y<<10)|dispenv->x); // Display offset } @@ -938,7 +962,7 @@ int GsImageFromTim(GsImage *image, const void *timdata) return 1; } -void GsUploadImage(GsImage *image) +void GsUploadImage(const GsImage *image) { if(image->has_clut) LoadImage(image->clut_data, image->clut_x, image->clut_y, @@ -947,7 +971,7 @@ void GsUploadImage(GsImage *image) LoadImage(image->data, image->x, image->y, image->w, image->h); } -int GsSpriteFromImage(GsSprite *sprite, GsImage *image, int do_upload) +int GsSpriteFromImage(GsSprite *sprite, const GsImage *image, int do_upload) { if(do_upload) GsUploadImage(image); @@ -1386,7 +1410,7 @@ void GsSetListEx(unsigned int *listptr, unsigned int listpos) linked_list_pos = listpos; } -void GsSortPolyLine(GsPolyLine *line) +void GsSortPolyLine(const GsPolyLine *line) { // PKT 0x48 @@ -1409,7 +1433,7 @@ void GsSortPolyLine(GsPolyLine *line) linked_list[orig_pos] = ((line->npoints+3) << 24) | (((unsigned int)&linked_list[linked_list_pos]) & 0xffffff); } -void GsSortGPolyLine(GsGPolyLine *line) +void GsSortGPolyLine(const GsGPolyLine *line) { // PKT 0x58 @@ -1434,7 +1458,7 @@ void GsSortGPolyLine(GsGPolyLine *line) linked_list[orig_pos] = (((line->npoints*2)+2) << 24) | (((unsigned int)&linked_list[linked_list_pos]) & 0xffffff); } -void GsSortGTPoly4(GsGTPoly4 *tpoly4) +void GsSortGTPoly4(const GsGTPoly4 *tpoly4) { unsigned int orig_pos = linked_list_pos; unsigned char pkt = 0x3c; @@ -1470,7 +1494,7 @@ void GsSortGTPoly4(GsGTPoly4 *tpoly4) linked_list[orig_pos] |= ((unsigned int)&linked_list[linked_list_pos]) & 0xffffff; } -void GsSortGTPoly3(GsGTPoly3 *tpoly3) +void GsSortGTPoly3(const GsGTPoly3 *tpoly3) { int orig_pos = linked_list_pos; int x; diff --git a/libpsx/src/pad.c b/libpsx/src/pad.c index 284b9f4..d7293d8 100644 --- a/libpsx/src/pad.c +++ b/libpsx/src/pad.c @@ -46,7 +46,7 @@ unsigned char readpad_vibrations[4][2]; int querypad_rxrdy = 1; -void QueryPAD(int pad_n, unsigned char *in, unsigned char *out, int len) +void QueryPAD(int pad_n, const unsigned char *in, unsigned char *out, int len) { volatile int x; volatile int y; // specified as volatile to not make busy loops get optimized out @@ -160,4 +160,3 @@ void pad_set_analog(int pad_n, int lock) QueryPAD(pad_n, pad_cmd2, NULL, sizeof(pad_cmd)); pad_escape_mode(pad_n, 0); }*/ -