summaryrefslogtreecommitdiff
path: root/examples/psxpaint
diff options
context:
space:
mode:
authorXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 10:32:23 +0100
committerXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 10:32:23 +0100
commit7c24e9a9b02b04dcaf9507acb94091ea70a2c02d (patch)
treec28d0748652ad4b4222309e46e6cfc82c0906220 /examples/psxpaint
parenta2b7b6bb1cc2f4a3258b7b2dbc92399d151f864d (diff)
downloadpsxsdk-7c24e9a9b02b04dcaf9507acb94091ea70a2c02d.tar.gz
Imported pristine psxsdk-20190410 from official repo
Diffstat (limited to 'examples/psxpaint')
-rw-r--r--examples/psxpaint/Makefile7
-rw-r--r--examples/psxpaint/cursor.h20
-rw-r--r--examples/psxpaint/psxpaint.c371
3 files changed, 398 insertions, 0 deletions
diff --git a/examples/psxpaint/Makefile b/examples/psxpaint/Makefile
new file mode 100644
index 0000000..d1d5698
--- /dev/null
+++ b/examples/psxpaint/Makefile
@@ -0,0 +1,7 @@
+PROJNAME = psxpaint
+
+include ../project.mk
+
+$(PROJNAME)_extra:
+
+$(PROJNAME)_clean_extra:
diff --git a/examples/psxpaint/cursor.h b/examples/psxpaint/cursor.h
new file mode 100644
index 0000000..4f1a9cf
--- /dev/null
+++ b/examples/psxpaint/cursor.h
@@ -0,0 +1,20 @@
+unsigned char cursor_tim[] =
+{
+16, 0, 0, 0, 8, 0, 0, 0, 44, 0, 0, 0, 128, 2, 224, 1,
+16, 0, 1, 0,
+0, 0, 0, 128, 255, 127, 0, 128, 0, 128, 0, 128,
+0, 128, 0, 128, 0, 128, 0, 128, 0, 8, 0, 128, 64, 16, 0, 128,
+64, 16, 0, 128, 204, 0, 0, 0, 128, 2, 0, 0, 4, 0, 24, 0,
+1, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+33, 1, 0, 0, 0, 0, 0, 0, 33, 18, 0, 0, 0, 0, 0, 0,
+33, 34, 1, 0, 0, 0, 0, 0, 33, 34, 18, 0, 0, 0, 0, 0,
+33, 34, 34, 1, 0, 0, 0, 0, 33, 34, 34, 18, 0, 0, 0, 0,
+33, 34, 34, 34, 1, 0, 0, 0, 33, 34, 34, 34, 18, 0, 0, 0,
+33, 34, 34, 34, 34, 1, 0, 0, 33, 34, 34, 18, 17, 17, 0, 0,
+33, 34, 33, 18, 0, 0, 0, 0, 33, 18, 33, 18, 0, 0, 0, 0,
+33, 1, 16, 34, 1, 0, 0, 0, 17, 0, 16, 34, 1, 0, 0, 0,
+1, 0, 0, 33, 18, 0, 0, 0, 0, 0, 0, 33, 18, 0, 0, 0,
+0, 0, 0, 16, 34, 1, 0, 0, 0, 0, 0, 16, 34, 1, 0, 0,
+0, 0, 0, 0, 17, 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/examples/psxpaint/psxpaint.c b/examples/psxpaint/psxpaint.c
new file mode 100644
index 0000000..726b13b
--- /dev/null
+++ b/examples/psxpaint/psxpaint.c
@@ -0,0 +1,371 @@
+/*
+ * PSXPaint
+ */
+
+/*
+ * Video memory layout:
+ *
+ * [0-639],[0-479] - Screen memory
+ * [640-895],[480-511] - Color Look Up Tables
+ * [640-643],[0-23] - Cursor Image (16x24) (4bpp - real width: 16)
+ * [992-1023],[0-31] - Cursor Dirty Rectangle (32x32)
+ */
+
+#include <stdio.h>
+#include <psx.h>
+#include <psxgpu.h>
+#include "cursor.h"
+
+int cursor_x = 0, cursor_y = 0, cursor_speed = 1;
+int old_cursor_x, old_cursor_y;
+volatile unsigned int speed_counter = 0;
+int brush_type = 0;
+
+unsigned int primitive_list[4000];
+
+int paint_colors[20][3] = {
+ { 0, 0, 0 }, // #0 Black
+ { 255, 255, 255 }, // #1 White
+ { 255, 0, 0 }, // #2 Red
+ { 0, 255, 0 }, // #3 Green
+ { 0, 0, 255 }, // #4 Blue
+ { 255, 255, 0}, // #5 Yellow
+ { 255, 0, 255}, // #6 Magenta (Fuchsia)
+ { 0, 255, 255}, // #7 Aqua Green
+ { 255, 128, 0}, // #8 Orange
+ { 128, 255,0}, // #9 Lime Green
+
+ { 192, 192,255},// #10 Sky Blue
+ { 128,128,128}, // #11 Grey
+ { 128, 0,0 }, // #12 Dark Red
+ { 0, 128, 0}, // #13 Dark Green
+ { 0, 0, 128}, // #14 Dark Blue
+ { 128, 128, 0}, // #15 Dark Yellow
+ { 128, 0, 128}, // #16 Purple
+ { 0, 128, 128}, // #17 Dark Aqua
+ { 128, 64, 0}, // #18 Brown
+ { 64, 128, 0}, // #19 Dark Lime Green
+
+ /*{ 128, 0, 255}, // #10 Violet
+ { 128,128,128}, // #11 Grey
+ { 128, 0,0 }, // #12 Dark Red
+ { 0, 128, 0}, // #13 Dark Green
+ { 0, 0, 128}, // #14 Dark Blue
+ { 192, 192,255},// #15 Sky Blue
+ { 128, 128, 0}, // #16 Dark Yellow
+ { 150, 75, 0}, // #17 Brown
+ { 64, 64, 64}, // #18 Dark Grey
+ { 128, 255,0}, // #19 Lime Green
+ */
+};
+
+int current_color[3];
+
+void sort_color_boxes()
+{
+ GsRectangle colorbox;
+ int x, y, c=0;
+
+ for(y = 384; y < (384+32); y+=16)
+ {
+ for(x = 0; x < 640; x+=64)
+ {
+ colorbox.x = x;
+ colorbox.y = y;
+ colorbox.w = 64;
+ colorbox.h = 16;
+ colorbox.r = paint_colors[c][0];
+ colorbox.g = paint_colors[c][1];
+ colorbox.b = paint_colors[c][2];
+ colorbox.attribute = 0;
+
+ GsSortRectangle(&colorbox);
+
+ c++;
+ }
+ }
+}
+
+void load_ui_graphics()
+{
+ GsImage my_image;
+
+ GsImageFromTim(&my_image, cursor_tim);
+ GsUploadImage(&my_image);
+}
+
+void my_vblank_handler();
+
+void my_vblank_handler()
+{
+ speed_counter++;
+}
+
+int main()
+{
+ GsDispEnv my_dispenv;
+ GsDrawEnv my_drawenv;
+ GsSprite my_sprite;
+ GsRectangle colorbox;
+ GsDot my_dot;
+ unsigned short pad1;
+ unsigned int WasL2=0, WasR2=0, WasL1=0, WasR1=0, WasSelect = 0;
+ int x, y;
+
+ PSX_InitEx(PSX_INIT_NOBIOS);
+ GsInit();
+ GsClearMem();
+ SetVBlankHandler(my_vblank_handler);
+
+ // This has to be interlaced
+ GsSetVideoModeEx(640, 480, EXAMPLES_VMODE, 0, 1, 0);
+
+ my_dispenv.x = 0;
+ my_dispenv.y = 0;
+
+ GsSetDispEnv(&my_dispenv);
+
+ my_drawenv.dither = 0;
+ my_drawenv.draw_on_display = 1;
+ my_drawenv.x = 0;
+ my_drawenv.y = 0;
+ my_drawenv.w = 640;
+ my_drawenv.h = 512;
+ my_drawenv.ignore_mask = 0;
+ my_drawenv.set_mask = 0;
+
+ GsSetDrawEnv(&my_drawenv);
+
+ GsSetList(primitive_list);
+
+ load_ui_graphics();
+ while(GsIsDrawing());
+
+ colorbox.x = 0;
+ colorbox.y = 0;
+ colorbox.w = 640;
+ colorbox.h = 511;
+ colorbox.r = 255;
+ colorbox.g = 255;
+ colorbox.b = 255;
+ colorbox.attribute = 0;
+
+ GsSortRectangle(&colorbox);
+
+ sort_color_boxes();
+
+
+ my_sprite.x = 0;
+ my_sprite.y = 0;
+ my_sprite.tpage = 10;
+ my_sprite.u = 0;
+ my_sprite.v = 0;
+ my_sprite.attribute = 0;
+ my_sprite.cx = 640;
+ my_sprite.cy = 480;
+ my_sprite.r = my_sprite.g = my_sprite.b = NORMAL_LUMINOSITY;
+ my_sprite.scalex = my_sprite.scaley = 0;
+ my_sprite.w = 16;
+ my_sprite.h = 24;
+
+ GsDrawList();
+ while(GsIsDrawing());
+
+ // Backup 32x32 area
+ MoveImage(cursor_x, cursor_y, 992, 0, 32, 32);
+
+ my_dot.attribute = 0;
+
+ while(1)
+ {
+ while(speed_counter)
+ {
+ old_cursor_x = cursor_x;
+ old_cursor_y = cursor_y;
+
+ // Restore 32x32 area
+ MoveImage(992, 0, old_cursor_x, old_cursor_y, 32, 32);
+ while(GsIsDrawing());
+
+ PSX_ReadPad(&pad1, NULL);
+
+ if(pad1 & PAD_LEFT)
+ cursor_x-=cursor_speed;
+
+ if(pad1 & PAD_RIGHT)
+ cursor_x+=cursor_speed;
+
+ if(pad1 & PAD_UP)
+ cursor_y-=cursor_speed;
+
+ if(pad1 & PAD_DOWN)
+ cursor_y+=cursor_speed;
+
+ if(cursor_x <= 0)
+ cursor_x = 0;
+
+ if(pad1 & PAD_CROSS)
+ {
+ if(cursor_y >= 384)
+ {
+ y = (cursor_y - 384) >> 4;
+ x = cursor_x >> 6;
+
+ current_color[0] = paint_colors[(y * 10)+x][0];
+ current_color[1] = paint_colors[(y * 10)+x][1];
+ current_color[2] = paint_colors[(y * 10)+x][2];
+ }
+ else
+ {
+
+ switch(brush_type)
+ {
+ case 0:
+ if(cursor_y >= 384)
+ {
+ break;
+ }
+
+ my_dot.r = current_color[0];
+ my_dot.g = current_color[1];
+ my_dot.b = current_color[2];
+ my_dot.x = cursor_x;
+ my_dot.y = cursor_y;
+
+ GsSortDot(&my_dot);
+ break;
+ case 1:
+ if(cursor_y >= 380)
+ {
+ break;
+ }
+
+ my_dot.r = current_color[0];
+ my_dot.g = current_color[1];
+ my_dot.b = current_color[2];
+ my_dot.x = cursor_x + 1;
+ my_dot.y = cursor_y;
+
+ GsSortDot(&my_dot);
+
+ my_dot.x++;
+
+ GsSortDot(&my_dot);
+
+ my_dot.y++;
+ my_dot.x-=2;
+
+ GsSortDot(&my_dot);
+
+ my_dot.x++;
+
+ GsSortDot(&my_dot);
+
+ my_dot.x++;
+
+ GsSortDot(&my_dot);
+
+ my_dot.x++;
+
+ GsSortDot(&my_dot);
+
+ my_dot.y++;
+ my_dot.x-=2;
+
+ GsSortDot(&my_dot);
+
+ my_dot.x++;
+
+ GsSortDot(&my_dot);
+ break;
+ }
+
+ }
+
+ GsDrawList();
+ while(GsIsDrawing());
+ }
+
+ if((pad1 & PAD_R2) && !WasR2)
+ {
+ cursor_speed++;
+ WasR2 = 1;
+ }
+
+ if((pad1 & PAD_L2) && !WasL2)
+ {
+ cursor_speed--;
+ WasL2 = 1;
+ }
+
+ if(!(pad1 & PAD_R2))
+ WasR2 = 0;
+
+ if(!(pad1 & PAD_L2))
+ WasL2 = 0;
+
+ if((pad1 & PAD_R1) && !WasR1)
+ {
+ brush_type++;
+ WasR1 = 1;
+ }
+
+ if((pad1 & PAD_L1) && !WasL1)
+ {
+ brush_type--;
+ WasL1 = 1;
+ }
+
+ if((pad1 & PAD_SELECT) && !WasSelect)
+ {
+ my_sprite.attribute ^= (ENABLE_TRANS | TRANS_MODE(0));
+ my_dot.attribute ^= (ENABLE_TRANS | TRANS_MODE(0));
+ WasSelect = 1;
+ }
+
+ if(!(pad1 & PAD_SELECT))
+ WasSelect = 0;
+
+ if(!(pad1 & PAD_R1))
+ WasR1 = 0;
+
+ if(!(pad1 & PAD_L1))
+ WasL1 = 0;
+
+ if(cursor_speed <= 0)
+ cursor_speed = 1;
+
+ if(cursor_speed >= 8)
+ cursor_speed = 7;
+
+ if(brush_type <= 0)
+ brush_type = 0;
+
+ if(brush_type > 1)
+ brush_type = 1;
+
+ // Backup 32x32 area
+ MoveImage(cursor_x, cursor_y, 992, 0, 32, 32);
+ while(GsIsDrawing());
+
+ // if(cursor_x != old_cursor_x || cursor_y != old_cursor_y)
+ // {
+ // printf("cx = %d, cy = %d, cursor_speed = %d, brush_type = %d\n",
+ // cursor_x, cursor_y, cursor_speed, brush_type);
+
+
+
+
+
+ my_sprite.x = cursor_x;
+ my_sprite.y = cursor_y;
+ GsSortSimpleSprite(&my_sprite);
+
+ GsDrawList();
+ while(GsIsDrawing());
+ // }
+
+ speed_counter--;
+ }
+ }
+}