aboutsummaryrefslogtreecommitdiff
path: root/examples/childexec
diff options
context:
space:
mode:
authorJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-04-24 19:01:28 +0800
committerJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-04-24 19:01:28 +0800
commit1aa0e17df7c325a41de8cf8a57f52ed853f08bf3 (patch)
tree5ec7f69ca0104f2b0a41e2ee7d3cb0cf0c9c54c5 /examples/childexec
parente82da2abe4c264d4b48a48d79cf9b8e4c4fb8ab6 (diff)
downloadpsn00bsdk-1aa0e17df7c325a41de8cf8a57f52ed853f08bf3.tar.gz
Refined toolchain instructions, organized examples, added automatic retry for CdRead(), added FIOCSCAN ioctl in psxsio TTY driver, added tty and console examples.
Diffstat (limited to 'examples/childexec')
-rw-r--r--examples/childexec/ball16c.h16
-rw-r--r--examples/childexec/child.c319
-rw-r--r--examples/childexec/child_exe.s6
-rw-r--r--examples/childexec/makefile38
-rw-r--r--examples/childexec/parent.c305
5 files changed, 0 insertions, 684 deletions
diff --git a/examples/childexec/ball16c.h b/examples/childexec/ball16c.h
deleted file mode 100644
index c79f273..0000000
--- a/examples/childexec/ball16c.h
+++ /dev/null
@@ -1,16 +0,0 @@
-unsigned int ball16c_size=192;
-unsigned char ball16c[] = {
-0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0xc0,0x03,0x10,
-0x01,0x10,0x00,0x01,0x00,0x00,0x00,0x31,0xc6,0x73,0xce,0x94,0xd2,0x07,0x9d,
-0xd6,0xda,0x38,0xe3,0xef,0xbd,0x9b,0xef,0x8c,0xb1,0xc6,0x98,0xde,0xfb,0x4a,
-0xa9,0xa4,0x90,0xad,0xb5,0x00,0x00,0x8c,0x00,0x00,0x00,0xc0,0x03,0x00,0x01,
-0x04,0x00,0x10,0x00,0x00,0x00,0x10,0x22,0x12,0x02,0x00,0x00,0x00,0x10,0x32,
-0x33,0x23,0x11,0x04,0x00,0x00,0x23,0x55,0x66,0x35,0x72,0x47,0x00,0x20,0x52,
-0x86,0x68,0x36,0x12,0x97,0x0a,0x20,0x65,0xbb,0x8b,0x36,0x12,0x91,0x04,0x31,
-0x85,0xbb,0x68,0x35,0x12,0x97,0xdc,0x32,0x86,0x8b,0x56,0x35,0x73,0x97,0xa4,
-0x32,0x66,0x68,0x55,0x23,0x71,0x9e,0xac,0x32,0x65,0x56,0x33,0x13,0x71,0xce,
-0xa4,0x21,0x33,0x33,0x23,0x11,0xe7,0xc9,0xd4,0x12,0x22,0x22,0x13,0x71,0xe7,
-0xc9,0xda,0x10,0x17,0x11,0x77,0x77,0x9e,0x4c,0x0d,0x40,0x77,0x71,0xe7,0x9e,
-0xc9,0xd4,0x0d,0x00,0x94,0x99,0x99,0xcc,0x4c,0xda,0x00,0x00,0xa0,0xc4,0xc4,
-0x44,0xda,0x0d,0x00,0x00,0x00,0xd0,0xaa,0xda,0x0d,0x00,0x00
-};
diff --git a/examples/childexec/child.c b/examples/childexec/child.c
deleted file mode 100644
index fb38b63..0000000
--- a/examples/childexec/child.c
+++ /dev/null
@@ -1,319 +0,0 @@
-#include <stdio.h>
-#include <psxapi.h>
-#include <psxgpu.h>
-#include <psxgte.h>
-#include <psxpad.h>
-#include <inline_c.h>
-
-/* OT and Packet Buffer sizes */
-#define OT_LEN 256
-#define PACKET_LEN 1024
-
-/* Screen resolution */
-#define SCREEN_XRES 320
-#define SCREEN_YRES 240
-
-/* Screen center position */
-#define CENTERX SCREEN_XRES>>1
-#define CENTERY SCREEN_YRES>>1
-
-
-/* Double buffer structure */
-typedef struct {
- DISPENV disp; /* Display environment */
- DRAWENV draw; /* Drawing environment */
- int ot[OT_LEN]; /* Ordering table */
- char p[PACKET_LEN]; /* Packet buffer */
-} DB;
-
-/* Double buffer variables */
-DB db[2];
-int db_active = 0;
-char *db_nextpri;
-
-
-/* For easier handling of vertex indices */
-typedef struct {
- short v0,v1,v2,v3;
-} INDEX;
-
-/* Cube vertices */
-SVECTOR cube_verts[] = {
- { -100, -100, -100, 0 },
- { 100, -100, -100, 0 },
- { -100, 100, -100, 0 },
- { 100, 100, -100, 0 },
- { 100, -100, 100, 0 },
- { -100, -100, 100, 0 },
- { 100, 100, 100, 0 },
- { -100, 100, 100, 0 }
-};
-
-/* Cube face normals */
-SVECTOR cube_norms[] = {
- { 0, 0, -ONE, 0 },
- { 0, 0, ONE, 0 },
- { 0, -ONE, 0, 0 },
- { 0, ONE, 0, 0 },
- { -ONE, 0, 0, 0 },
- { ONE, 0, 0, 0 }
-};
-
-/* Cube vertex indices */
-INDEX cube_indices[] = {
- { 0, 1, 2, 3 },
- { 4, 5, 6, 7 },
- { 5, 4, 0, 1 },
- { 6, 7, 3, 2 },
- { 0, 2, 5, 7 },
- { 3, 1, 6, 4 }
-};
-
-/* Number of faces of cube */
-#define CUBE_FACES 6
-
-
-/* Light color matrix */
-/* Each column represents the color matrix of each light source and is */
-/* used as material color when using gte_ncs() or multiplied by a */
-/* source color when using gte_nccs(). 4096 is 1.0 in this matrix */
-/* A column of zeroes disables the light source. */
-MATRIX color_mtx = {
- ONE, 0, 0, /* Red */
- ONE, 0, 0, /* Green */
- ONE, 0, 0 /* Blue */
-};
-
-/* Light matrix */
-/* Each row represents a vector direction of each light source. */
-/* An entire row of zeroes disables the light source. */
-MATRIX light_mtx = {
- /* X, Y, Z */
- -2048 , -2048 , -2048,
- 0 , 0 , 0,
- 0 , 0 , 0
-};
-
-char pad_buff[2][34];
-
-/* Function declarations */
-void init();
-void display();
-
-
-/* Main function */
-int main() {
-
- int i,p,xy_temp;
-
- SVECTOR rot = { 0 }; /* Rotation vector for Rotmatrix */
- VECTOR pos = { 0, 0, 400 }; /* Translation vector for TransMatrix */
- MATRIX mtx,lmtx; /* Rotation matrices for geometry and lighting */
-
- POLY_F4 *pol4; /* Flat shaded quad primitive pointer */
-
-
- /* Init graphics and GTE */
- init();
-
-
- /* Main loop */
- while( 1 ) {
-
- PADTYPE *pad = (PADTYPE*)pad_buff[0];
-
- if( pad->stat == 0 ) {
-
- // For digital pad, dual-analog and dual-shock
- if( ( pad->type == 0x4 ) || ( pad->type == 0x5 ) || ( pad->type == 0x7 ) ) {
-
- if( !(pad->btn&PAD_SELECT) ) {
- break;
- }
-
- }
-
- }
-
- /* Set rotation and translation to the matrix */
- RotMatrix( &rot, &mtx );
- TransMatrix( &mtx, &pos );
-
- /* Multiply light matrix by rotation matrix so light source */
- /* won't appear relative to the model's rotation */
- MulMatrix0( &light_mtx, &mtx, &lmtx );
-
- /* Set rotation and translation matrix */
- gte_SetRotMatrix( &mtx );
- gte_SetTransMatrix( &mtx );
-
- /* Set light matrix */
- gte_SetLightMatrix( &lmtx );
-
- /* Make the cube SPEEN */
- rot.vx += 16;
- rot.vz += 16;
-
-
- /* Draw the cube */
- pol4 = (POLY_F4*)db_nextpri;
-
- for( i=0; i<CUBE_FACES; i++ ) {
-
- /* Load the first 3 vertices of a quad to the GTE */
- gte_ldv3(
- &cube_verts[cube_indices[i].v0],
- &cube_verts[cube_indices[i].v1],
- &cube_verts[cube_indices[i].v2] );
-
- /* Rotation, Translation and Perspective Triple */
- gte_rtpt();
-
- /* Compute normal clip for backface culling */
- gte_nclip();
-
- /* Get result*/
- gte_stopz( &p );
-
- /* Skip this face if backfaced */
- if( p < 0 )
- continue;
-
- /* Calculate average Z for depth sorting */
- gte_avsz4();
- gte_stotz( &p );
-
- /* Skip if clipping off */
- /* (the shift right operator is to scale the depth precision) */
- if( (p>>2) > OT_LEN )
- continue;
-
- /* Initialize a quad primitive */
- setPolyF4( pol4 );
-
- /* Set the projected vertices to the primitive */
- gte_stsxy0( &pol4->x0 );
- gte_stsxy1( &pol4->x1 );
- gte_stsxy2( &pol4->x2 );
-
- /* Compute the last vertex and set the result */
- gte_ldv0( &cube_verts[cube_indices[i].v3] );
- gte_rtps();
- gte_stsxy( &pol4->x3 );
-
- /* Load primitive color even though gte_ncs() doesn't use it. */
- /* This is so the GTE will output a color result with the */
- /* correct primitive code. */
- gte_ldrgb( &pol4->r0 );
-
- /* Load the face normal */
- gte_ldv0( &cube_norms[i] );
-
- /* Normal Color Single */
- gte_ncs();
-
- /* Store result to the primitive */
- gte_strgb( &pol4->r0 );
-
- /* Sort primitive to the ordering table */
- addPrim( db[db_active].ot+(p>>2), pol4 );
-
- /* Advance to make another primitive */
- pol4++;
-
- }
-
- /* Update nextpri variable */
- /* (IMPORTANT if you plan to sort more primitives after this) */
- db_nextpri = (char*)pol4;
-
- /* Swap buffers and draw the primitives */
- display();
-
- }
-
- StopPAD();
-
- return 0;
-
-}
-
-void init() {
-
- /* Reset the GPU, also installs a VSync event handler */
- ResetGraph( 0 );
-
- /* Set display and draw environment areas */
- /* (display and draw areas must be separate, otherwise hello flicker) */
- SetDefDispEnv( &db[0].disp, 0, 0, SCREEN_XRES, SCREEN_YRES );
- SetDefDrawEnv( &db[0].draw, SCREEN_XRES, 0, SCREEN_XRES, SCREEN_YRES );
-
- /* Enable draw area clear and dither processing */
- setRGB0( &db[0].draw, 63, 0, 127 );
- db[0].draw.isbg = 1;
- db[0].draw.dtd = 1;
-
-
- /* Define the second set of display/draw environments */
- SetDefDispEnv( &db[1].disp, SCREEN_XRES, 0, SCREEN_XRES, SCREEN_YRES );
- SetDefDrawEnv( &db[1].draw, 0, 0, SCREEN_XRES, SCREEN_YRES );
-
- setRGB0( &db[1].draw, 63, 0, 127 );
- db[1].draw.isbg = 1;
- db[1].draw.dtd = 1;
-
-
- /* Apply the drawing environment of the first double buffer */
- PutDrawEnv( &db[0].draw );
-
-
- /* Clear both ordering tables to make sure they are clean at the start */
- ClearOTagR( db[0].ot, OT_LEN );
- ClearOTagR( db[1].ot, OT_LEN );
-
- /* Set primitive pointer address */
- db_nextpri = db[0].p;
-
- /* Initialize the GTE */
- InitGeom();
-
- /* Set GTE offset (recommended method of centering) */
- gte_SetGeomOffset( CENTERX, CENTERY );
-
- /* Set screen depth (basically FOV control, W/2 works best) */
- gte_SetGeomScreen( CENTERX );
-
- /* Set light ambient color and light color matrix */
- gte_SetBackColor( 63, 63, 63 );
- gte_SetColorMatrix( &color_mtx );
-
- InitPAD(pad_buff[0], 34, pad_buff[1], 34);
- StartPAD();
- ChangeClearPAD(0);
-
-}
-
-void display() {
-
- /* Wait for GPU to finish drawing and vertical retrace */
- DrawSync( 0 );
- VSync( 0 );
-
- /* Swap buffers */
- db_active ^= 1;
- db_nextpri = db[db_active].p;
-
- /* Clear the OT of the next frame */
- ClearOTagR( db[db_active].ot, OT_LEN );
-
- /* Apply display/drawing environments */
- PutDrawEnv( &db[db_active].draw );
- PutDispEnv( &db[db_active].disp );
-
- /* Enable display */
- SetDispMask( 1 );
-
- /* Start drawing the OT of the last buffer */
- DrawOTag( db[1-db_active].ot+(OT_LEN-1) );
-
-} \ No newline at end of file
diff --git a/examples/childexec/child_exe.s b/examples/childexec/child_exe.s
deleted file mode 100644
index 842ac88..0000000
--- a/examples/childexec/child_exe.s
+++ /dev/null
@@ -1,6 +0,0 @@
-.section .data
-
-.global child_exe # Insert spoopypasta
-.type child_exe, @object
-child_exe:
- .incbin "child.exe" \ No newline at end of file
diff --git a/examples/childexec/makefile b/examples/childexec/makefile
deleted file mode 100644
index 9cf7218..0000000
--- a/examples/childexec/makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-include ../sdk-common.mk
-
-INCLUDE +=
-LIBDIRS +=
-
-LIBS = -lpsxetc -lpsxgpu -lpsxgte -lpsxspu -lc -lpsxapi
-
-CFLAGS = -g -O2 -fno-builtin -fdata-sections -ffunction-sections
-CPPFLAGS = $(CFLAGS) -fno-exceptions
-AFLAGS = -g -msoft-float
-LDFLAGS = -g -gc-sections -T $(GCC_BASE)/mipsel-unknown-elf/lib/ldscripts/elf32elmip.x
-
-LDFLAGS_P = $(LDFLAGS) -Ttext=0x80010000
-LDFLAGS_C = $(LDFLAGS) -Ttext=0x80030000
-
-CC = $(PREFIX)gcc
-LD = $(PREFIX)ld
-
-all: child parent
-
-child: build/child.o
- $(LD) $(LDFLAGS_C) $(LIBDIRS) build/child.o $(LIBS) -o child.elf
- elf2x child.elf
-
-parent: build/parent.o build/child_exe.o
- $(LD) $(LDFLAGS_P) $(LIBDIRS) build/parent.o build/child_exe.o $(LIBS) -o parent.elf
- elf2x parent.elf
-
-build/%.o: %.c
- @mkdir -p $(dir $@)
- $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
-
-build/%.o: %.s
- @mkdir -p $(dir $@)
- $(CC) $(AFLAGS) $(INCLUDE) -c $< -o $@
-
-clean:
- rm -rf build parent.elf parent.exe child.elf child.exe
diff --git a/examples/childexec/parent.c b/examples/childexec/parent.c
deleted file mode 100644
index 7f577e4..0000000
--- a/examples/childexec/parent.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * LibPSn00b Example Programs
- *
- * Child Program Execution Example
- * 2019 Meido-Tek Productions / PSn00bSDK Project
- *
- * This is a modification of the balls example, modified to execute
- * a child program for this example.
- *
- * Example by Lameguy64
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <psxetc.h>
-#include <psxapi.h>
-#include <psxgte.h>
-#include <psxgpu.h>
-#include <psxpad.h>
-#include "ball16c.h"
-
-
-#define MAX_BALLS 1024
-
-#define OT_LEN 8
-
-#define SCREEN_XRES 640
-#define SCREEN_YRES 480
-
-#define CENTER_X SCREEN_XRES/2
-#define CENTER_Y SCREEN_YRES/2
-
-
-/* Display and drawing environments */
-DISPENV disp;
-DRAWENV draw;
-
-char pribuff[2][65536]; /* Primitive packet buffers */
-unsigned int ot[2][OT_LEN]; /* Ordering tables */
-char *nextpri; /* Pointer to next packet buffer offset */
-int db = 0; /* Double buffer index */
-
-
-/* Ball struct and array */
-typedef struct {
- short x,y;
- short xdir,ydir;
- unsigned char r,g,b,p;
-} BALL_TYPE;
-
-BALL_TYPE balls[MAX_BALLS];
-
-
-/* TIM image parameters for loading the ball texture and drawing sprites */
-TIM_IMAGE tim;
-
-
-void run_child();
-
-char pad_buff[2][34];
-
-
-void init() {
-
- int i;
-
- /* Reset GPU (also installs event handler for VSync) */
- printf("Init GPU... ");
- ResetGraph( 0 );
- printf("Done.\n");
-
-
- printf("Set video mode... ");
-
- /* Set display and draw environment parameters */
- SetDefDispEnv( &disp, 0, 0, SCREEN_XRES, SCREEN_YRES );
- SetDefDrawEnv( &draw, 0, 0, SCREEN_XRES, SCREEN_YRES );
- disp.isinter = 1; /* Enable interlace (required for hires) */
-
- /* Set clear color, area clear and dither processing */
- setRGB0( &draw, 63, 0, 127 );
- draw.isbg = 1;
- draw.dtd = 1;
-
- /* Apply the display and drawing environments */
- PutDispEnv( &disp );
- PutDrawEnv( &draw );
-
- /* Enable video output */
- SetDispMask( 1 );
-
- printf("Done.\n");
-
-
- /* Upload the ball texture */
- printf("Upload texture... ");
- GetTimInfo( (unsigned int*)ball16c, &tim ); /* Get TIM parameters */
-
- LoadImage( tim.prect, tim.paddr ); /* Upload texture to VRAM */
- if( tim.mode & 0x8 ) {
- LoadImage( tim.crect, tim.caddr ); /* Upload CLUT if present */
- }
-
- printf("Done.\n");
-
-
- /* Calculate ball positions */
- printf("Calculating balls... ");
-
- for(i=0; i<MAX_BALLS; i++) {
-
- balls[i].x = (rand()%624);
- balls[i].y = (rand()%464);
- balls[i].xdir = 1-(rand()%3);
- balls[i].ydir = 1-(rand()%3);
- if( !balls[i].xdir ) balls[i].xdir = 1;
- if( !balls[i].ydir ) balls[i].ydir = 1;
- balls[i].xdir *= 2;
- balls[i].ydir *= 2;
- balls[i].r = (rand()%256);
- balls[i].g = (rand()%256);
- balls[i].b = (rand()%256);
-
- }
-
- printf("Done.\n");
-
- InitPAD(pad_buff[0], 34, pad_buff[1], 34);
- StartPAD();
- ChangeClearPAD(0);
-
-}
-
-int main(int argc, const char* argv[]) {
-
- SPRT_16 *sprt;
- DR_TPAGE *tpri;
-
- int i,counter=0;
-
-
- /* Init graphics and stuff before doing anything else */
- init();
-
-
- /* Main loop */
- printf("Entering loop...\n");
-
- while(1) {
-
- PADTYPE *pad = (PADTYPE*)pad_buff[0];
-
- if( pad->stat == 0 ) {
-
- // For digital pad, dual-analog and dual-shock
- if( ( pad->type == 0x4 ) || ( pad->type == 0x5 ) || ( pad->type == 0x7 ) ) {
-
- if( !(pad->btn&PAD_START) ) {
- DrawSync(0);
- run_child();
- }
-
- }
-
- }
-
- /* Clear ordering table and set start address of primitive */
- /* buffer for next frame */
- ClearOTagR( ot[db], OT_LEN );
- nextpri = pribuff[db];
-
- /* Sort a balls snake */
- sprt = (SPRT_16*)nextpri;
- srand( 64 );
- for( i=0; i<32; i++ ) {
-
- setSprt16( sprt );
- setXY0( sprt,
- (CENTER_X-8)+(isin((counter-(i<<4))<<3)>>5),
- (CENTER_Y-8)-(icos((counter-(i<<2))<<3)>>5) );
- setRGB0( sprt, rand()%256, rand()%256, rand()%256 );
- setUV0( sprt, 0, 0 );
- setClut( sprt, tim.crect->x, tim.crect->y );
-
- addPrim( ot[db]+(OT_LEN-1), sprt );
- sprt++;
-
- }
-
- /* Sort the balls */
- for( i=0; i<MAX_BALLS; i++ ) {
-
- setSprt16( sprt );
- setXY0( sprt, balls[i].x, balls[i].y );
- setRGB0( sprt, balls[i].r, balls[i].g, balls[i].b );
- setUV0( sprt, 0, 0 );
- setClut( sprt, tim.crect->x, tim.crect->y );
-
- addPrim( ot[db]+(OT_LEN-1), sprt );
- sprt++;
-
- balls[i].x += balls[i].xdir;
- balls[i].y += balls[i].ydir;
-
- if( ( balls[i].x+16 ) > 640 ) {
- balls[i].xdir = -2;
- } else if( balls[i].x < 0 ) {
- balls[i].xdir = 2;
- }
-
- if( ( balls[i].y+16 ) > 480 ) {
- balls[i].ydir = -2;
- } else if( balls[i].y < 0 ) {
- balls[i].ydir = 2;
- }
-
- }
- nextpri = (char*)sprt;
-
-
- /* Sort a TPage primitive so the sprites will draw pixels from */
- /* the correct texture page in VRAM */
- tpri = (DR_TPAGE*)nextpri;
- setDrawTPage( tpri, 0, 0,
- getTPage( 0, 0, tim.prect->x, tim.prect->y ) );
- addPrim( ot[db]+(OT_LEN-1), tpri );
- nextpri += sizeof(DR_TPAGE);
-
- /* Wait for GPU and VSync */
- DrawSync( 0 );
- VSync( 0 );
-
- /* Since draw.isbg is non-zero this clears the screen */
- PutDrawEnv( &draw );
-
- /* Begin drawing the new frame */
- DrawOTag( ot[db]+(OT_LEN-1) );
-
- /* Alternate to the next buffer */
- db = !db;
-
- /* Increment counter for the snake animation */
- counter++;
-
- }
-
- return 0;
-
-}
-
-// PS-EXE header structure
-typedef struct {
- char id[16];
- struct EXEC param;
- char pad[1972];
-} EXE_HEAD;
-
-// Child program address
-extern char child_exe[];
-
-// Manually defined as its not defined in psxapi by default
-void SetDefaultExitFromException();
-
-void run_child() {
-
- // So child header is readable
- EXE_HEAD *exe = (EXE_HEAD*)child_exe;
-
- // Copy child executable to its intended adddress
- memcpy((void*)exe->param.t_addr, child_exe+2048, exe->param.t_size);
-
- // Enter critical section to prepare for program execution
- EnterCriticalSection();
-
- // Stop pads, enable auto acknowledge
- StopPAD();
- ChangeClearPAD(1);
- ChangeClearRCnt(3, 1);
-
- // Set default exception handler just in case
- //SetDefaultExitFromException();
-
- // Last three function calls could be relegated to
- // a StopCallback() function in the future.
-
- // Execute child
- printf("Child exec!\n");
- Exec(&exe->param, 0, 0);
-
- // Reset previous handler
- EnterCriticalSection();
- RestartCallback();
- ExitCriticalSection();
-
- // Re-init and re-enable pads
- InitPAD(pad_buff[0], 34, pad_buff[1], 34);
- StartPAD();
- ChangeClearPAD(0);
-
- // Set this program's display mode
- PutDispEnv(&disp);
-
-}