Update makefile, add overlay example

This commit is contained in:
ABelliqueux 2021-10-30 12:22:04 +02:00
parent 040e70aad9
commit b64ff6e656
18 changed files with 823 additions and 52 deletions

114
Makefile
View File

@ -1,55 +1,69 @@
hello_world:
$(MAKE) -C hello_world
hello_2pads:
$(MAKE) -C hello_2pads
hello_cube:
$(MAKE) -C hello_cube
hello_cubetex:
$(MAKE) -C hello_cubetex
hello_cubetex_stp:
$(MAKE) -C hello_cubetex_stp
hello_poly_fun:
$(MAKE) -C hello_poly_fun
hello_gte_opti:
$(MAKE) -C hello_gte_opti
hello_light:
$(MAKE) -C hello_light
hello_multi_vag:
$(MAKE) -C hello_multi_vag
hello_pad:
$(MAKE) -C hello_pad
hello_poly:
$(MAKE) -C hello_poly
hello_poly_stp:
$(MAKE) -C hello_poly_stp
hello_poly_ft:
$(MAKE) -C hello_poly_ft
hello_poly_gt:
$(MAKE) -C hello_poly_gt
hello_poly_gt_tw:
$(MAKE) -C hello_poly_gt_tw
hello_poly_inline:
$(MAKE) -C hello_poly_inline
hello_sio:
$(MAKE) -C hello_sio
hello_sprt:
$(MAKE) -C hello_sprt
hello_tile:
$(MAKE) -C hello_tile
hello_vag:
$(MAKE) -C hello_vag
hello_cd:
$(MAKE) -C hello_cd all
hello_cdda:
$(MAKE) -C hello_cdda all
hello_xa:
$(MAKE) -C hello_xa all
hello_bs:
$(MAKE) -C hello_bs all
$(MAKE) -C hello_bs
hello_cd:
$(MAKE) -C hello_cd
hello_cdda:
$(MAKE) -C hello_cdda
hello_cd_exec:
$(MAKE) -C hello_cd_exec
hello_cube:
$(MAKE) -C hello_cube
hello_cubetex:
$(MAKE) -C hello_cubetex
hello_cubetex_stp:
$(MAKE) -C hello_cubetex_stp
hello_font:
$(MAKE) -C hello_font
hello_fx:
$(MAKE) -C hello_fx
hello_gte_opti:
$(MAKE) -C hello_gte_opti
hello_light:
$(MAKE) -C hello_light
hello_mod:
$(MAKE) -C hello_mod
hello_multi_vag:
$(MAKE) -C hello_multi_vag
hello_multi_xa:
$(MAKE) -C hello_multi_xa
hello_ovl_exec:
$(MAKE) -C hello_ovl_exec
hello_pad:
$(MAKE) -C hello_pad
hello_poly:
$(MAKE) -C hello_poly
hello_poly_ft:
$(MAKE) -C hello_poly_ft
hello_poly_fun:
$(MAKE) -C hello_poly_fun
hello_poly_gt:
$(MAKE) -C hello_poly_gt
hello_poly_gt_tw:
$(MAKE) -C hello_poly_gt_tw
hello_poly_inline:
$(MAKE) -C hello_poly_inline
hello_poly_stp:
$(MAKE) -C hello_poly_stp
hello_sio:
$(MAKE) -C hello_sio
hello_sprt:
$(MAKE) -C hello_sprt
hello_str:
$(MAKE) -C hello_str all
$(MAKE) -C hello_str
hello_strplay:
$(MAKE) -C hello_strplay all
$(MAKE) -C hello_strplay
hello_tile:
$(MAKE) -C hello_tile
hello_vag:
$(MAKE) -C hello_vag
hello_world:
$(MAKE) -C hello_world
hello_xa:
$(MAKE) -C hello_xa
hello_xa_streaming:
$(MAKE) -C hello_xa_streaming
clean:
$(MAKE) -C hello_2pads clean
@ -108,9 +122,5 @@ all:
$(MAKE) -C hello_strplay all
# declare phony rules
.PHONY: hello_2pads hello_cube hello_cubetex hello_poly_fun hello_gte_opti \
hello_light hello_multi_vag hello_pad hello_poly hello_poly_ft hello_poly_gt \
hello_poly_gt_tw hello_poly_inline hello_sio hello_sprt hello_tile \
hello_vag hello_world hello_cdda hello_cd hello_xa hello_bs hello_str hello_strplay \
hello_poly_stp hello_cubetex_stp \
.PHONY: hello_2pads hello_bs hello_cd hello_cdda hello_cd_exec hello_cube hello_cubetex hello_cubetex_stp hello_font hello_fx hello_gte_opti hello_light hello_mod hello_multi_vag hello_multi_xa hello_ovl_exec hello_pad hello_poly hello_poly_ft hello_poly_fun hello_poly_gt hello_poly_gt_tw hello_poly_inline hello_poly_stp hello_sio hello_sprt hello_str hello_strplay hello_tile hello_vag hello_world hello_xa hello_xa_streaming \
clean all

27
hello_ovl_exec/Makefile Normal file
View File

@ -0,0 +1,27 @@
.PHONY: all cleansub
all:
$(MAKE) -C hello_poly clean all
$(MAKE) -C hello_ovl_world clean all
$(MAKE) -C hello_tile clean all
mkpsxiso -y ./isoconfig.xml
cleansub:
$(MAKE) -C hello_poly clean
$(MAKE) -C hello_tile clean
$(MAKE) -C hello_ovl_world clean
$(MAKE) clean
rm -f hello_ovl_exec.cue hello_ovl_exec.bin
rm -f *.mcd *.frag *.lua *.vert
rm -f */*.mcd */*.frag */*.lua */*.vert */*.elf
#~ rm -f */*.mcd */*.frag */*.lua */*.vert */*.elf */*.map */*.ps-exe */*.o */*.dep
TARGET = hello_ovl_exec
OVERLAYSCRIPT ?= overlay.ld
OVERLAYSECTION ?= .ovly0 .ovly1 .ovly2
SRCS = hello_ovl_exec.c \
hello_ovl_world/hello_ovl_world.c \
hello_tile/hello_ovl_tile.c \
hello_poly/hello_ovl_poly.c \
include ../common.mk

35
hello_ovl_exec/README.md Normal file
View File

@ -0,0 +1,35 @@
## Creating the disk image
After compiling, you need to generate a disk image with [mkpsxiso](https://github.com/Lameguy64/mkpsxiso):
```bash
mkpsxiso -y isoconfig.xml
```
## Using ffmpeg to generate a CDDA compliant Wav file
Needed Specification : `RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz`
### Conversion
```bash
ffmpeg -i input.mp3 -acodec pcm_s16le -ac 2 -ar 44100 output.wav
```
### Merging two mono audio channels into one stereo channel
```bash
ffmpeg -i herb.wav.new -filter_complex "[0:a][0:a]amerge=inputs=2[a]" -map "[a]" herbi.wav
```
## Music credits
Track 1 :
Beach Party by Kevin MacLeod
Link: https://incompetech.filmmusic.io/song/3429-beach-party
License: https://filmmusic.io/standard-license
Track 2:
Funk Game Loop by Kevin MacLeod
Link: https://incompetech.filmmusic.io/song/3787-funk-game-loop
License: https://filmmusic.io/standard-license

44
hello_ovl_exec/common.h Normal file
View File

@ -0,0 +1,44 @@
#pragma once
#include <sys/types.h>
#include <stdio.h>
#include <stdint.h>
#include <libgte.h>
#include <libetc.h>
#include <libgpu.h>
#include <libapi.h>
#include <malloc.h>
#include <kernel.h>
// CD library
#include <libcd.h>
#define setRGB(p, r0, g0, b0) \
(p)->r = r0, (p)->g = g0, (p)->b = b0
#define VMODE 0
//~ #define VMODE 0 // Video Mode : 0 : NTSC, 1: PAL
#define SCREENXRES 320 // Screen width
#define SCREENYRES (240 + (VMODE << 4)) // Screen height : If VMODE is 0 = 240, if VMODE is 1 = 256
#define CENTERX SCREENXRES/2 // Center of screen on x
#define CENTERY SCREENYRES/2 // Center of screen on y
#define MARGINX 0 // margins for text display
#define MARGINY 32
#define FONTSIZE 18 * 7 // Text Field Height
#define OTLEN 8 // Ordering Table Length
extern DRAWENV draw[2];
extern char primbuff[2][32768];
extern char *nextpri;
extern u_long ot[2][OTLEN];
extern uint8_t db;
extern CVECTOR BGcolor;
enum OverlayNumber {
MOTHERSHIP = -1,
OVERLAY_HELLO = 0,
OVERLAY_TILE = 1,
OVERLAY_POLY = 2,
};
extern enum OverlayNumber next_overlay;
extern void init(void);
extern void display(void);

View File

@ -0,0 +1,137 @@
// Load overlay files from CD and execute them
// Schnappy 10-2021
// With the help of Nicolas Noble and impiaa
// https://discord.com/channels/642647820683444236/663664210525290507/894624082367229952
#include "common.h"
DISPENV disp[2]; // Double buffered DISPENV and DRAWENV
DRAWENV draw[2];
char primbuff[2][32768]; // double primitive buffer of length 32768 * 8 = 262.144 bits / 32,768 Kbytes
u_long ot[2][OTLEN];
char *nextpri = primbuff[0];
uint8_t db = 0;
CVECTOR BGcolor = { 0, 150, 255 };
extern u_long load_all_overlays_here;
typedef struct Overlay {
char filename[0x7c];
int (*main)();
char commandline[0x180];
} Overlay;
int ovl_main_hello();
int ovl_main_tile();
int ovl_main_poly();
Overlay g_chainload[] = {
{"\\HELLO.OVL;1", ovl_main_hello, ""},
{"\\TILE.OVL;1", ovl_main_tile, ""},
{"\\POLY.OVL;1", ovl_main_poly, ""},
//~ { "\\POLY.OVL;1" , 0 },
};
enum OverlayNumber next_overlay = MOTHERSHIP;
enum OverlayNumber prev_overlay = MOTHERSHIP;
int main(void);
int loadOverlayAndStart(Overlay *);
void EmptyOTag(u_long ot[2][OTLEN], char primbuff[2][32768], char * nextpri );
void (*dispp) (void);
int CDreadOK = 0;
void init(void)
{
ResetCallback();
ResetGraph(0); // Initialize drawing engine with a complete reset (0)
// Initialize and setup the GTE
InitGeom();
SetGeomOffset(CENTERX,CENTERY);
SetGeomScreen(CENTERX);
SetDefDispEnv(&disp[0], 0, 0 , SCREENXRES, SCREENYRES); // Set display area for both &disp[0] and &disp[1]
SetDefDispEnv(&disp[1], 0, SCREENYRES, SCREENXRES, SCREENYRES); // &disp[0] is on top of &disp[1]
SetDefDrawEnv(&draw[0], 0, SCREENYRES, SCREENXRES, SCREENYRES); // Set draw for both &draw[0] and &draw[1]
SetDefDrawEnv(&draw[1], 0, 0 , SCREENXRES, SCREENYRES); // &draw[0] is below &draw[1]
// Set video mode
if (VMODE){ SetVideoMode(MODE_PAL);}
SetDispMask(1); // Display on screen
setRGB0(&draw[0], BGcolor.r, BGcolor.g, BGcolor.b); // set color for first draw area
setRGB0(&draw[1], BGcolor.r, BGcolor.g, BGcolor.b); // set color for second draw area
draw[0].isbg = 1; // set mask for draw areas. 1 means repainting the area with the RGB color each frame
draw[1].isbg = 1;
PutDispEnv(&disp[db]); // set the disp and draw environnments
PutDrawEnv(&draw[db]);
FntLoad(960, 0); // Load font to vram at 960,0(+128)
FntOpen(MARGINX, SCREENYRES - MARGINY - FONTSIZE, SCREENXRES - MARGINX * 2, FONTSIZE, 0, 280 ); // FntOpen(x, y, width, height, black_bg, max. nbr. chars
}
void display(void)
{
DrawSync(0); // Wait for all drawing to terminate
VSync(0); // Wait for the next vertical blank
PutDispEnv(&disp[db]); // set alternate disp and draw environnments
PutDrawEnv(&draw[db]);
DrawOTag(&ot[db][OTLEN - 1]);
db = !db; // flip db value (0 or 1)
nextpri = primbuff[db];
}
int loadOverlayAndStart(Overlay * overlay)
{
int CDreadResult = 0;
int next_ovl = -1;
// Load overlay file
CDreadResult = CdReadFile(overlay->filename, &load_all_overlays_here, 0);
CdReadSync(0, 0);
printf( "CD read: %d", CDreadResult);
// If file loaded sucessfully
if (CDreadResult)
{
//~ StopCallback();
ResetGraph(3);
// Execute
next_ovl = overlay->main();
EmptyOTag(&ot[db], &primbuff[db], nextpri);
setRGB(&BGcolor, 0, 150, 255);
init();
}
return next_ovl;
}
void EmptyOTag(u_long ot[2][OTLEN], char primbuff[2][32768], char * nextpri )
{
for (uint16_t p; p < OTLEN; p++)
{
ot[0][p] = 0;
ot[1][p] = 0;
}
nextpri = primbuff[!db];
}
int main(void)
{
int t = 0;
// init() display
init();
// Init CD system
CdInit();
prev_overlay = next_overlay;
while(1){
if (t == 100){
next_overlay = OVERLAY_HELLO;
}
if (next_overlay != -1 && next_overlay != prev_overlay){
prev_overlay = next_overlay;
next_overlay = loadOverlayAndStart(&g_chainload[next_overlay]);
t = 0;
}
t++;
FntPrint("Mothership: %d\nOvl: %d %d", t, prev_overlay, next_overlay);
FntFlush(-1);
display();
}
//
return 0;
}

View File

@ -0,0 +1,7 @@
TARGET = hello_world
SRCS = hello_world.c \
CPPFLAGS+=-DSTANDALONE
include ../../common.mk

View File

@ -0,0 +1,25 @@
#include "../common.h"
int ovl_main_hello(void)
{
setRGB(&BGcolor, 0, 255, 100);
init();
int i = 0;
while(1)
{
i++;
#ifndef STANDALONE
if (i==100){
next_overlay = OVERLAY_TILE;
break;
}
FntPrint("Hello world ! %d\n", i);
#else
FntPrint("Hello standalone ! %d\n", i);
#endif
FntFlush(-1);
display();
}
return next_overlay;
};

View File

@ -0,0 +1,52 @@
#include "../common.h"
DISPENV disp[2]; // Double buffered DISPENV and DRAWENV
DRAWENV draw[2];
u_long ot[2][OTLEN]; // double ordering table of length 8 * 32 = 256 bits / 32 bytes
char primbuff[2][32768];// double primitive buffer of length 32768 * 8 = 262.144 bits / 32,768 Kbytes
char *nextpri = primbuff[0]; // pointer to the next primitive in primbuff. Initially, points to the first bit of primbuff[0]
uint8_t db = 0; // index of which buffer is used, values 0, 1
CVECTOR BGcolor = { 0, 255, 100 };
//~ int next_overlay;
void init(void)
{
ResetGraph(0);
SetDefDispEnv(&disp[0], 0, 0, SCREENXRES, SCREENYRES);
SetDefDispEnv(&disp[1], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[0], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[1], 0, 0, SCREENXRES, SCREENYRES);
if (VMODE)
{
SetVideoMode(MODE_PAL);
disp[0].screen.y += 8;
disp[1].screen.y += 8;
}
SetDispMask(1); // Display on screen
setRGB0(&draw[0], BGcolor.r, BGcolor.g, BGcolor.b); // set color for first draw area
setRGB0(&draw[1], BGcolor.r, BGcolor.g, BGcolor.b); // set color for second draw area
draw[0].isbg = 1;
draw[1].isbg = 1;
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
FntLoad(960, 0);
FntOpen(MARGINX, SCREENYRES - MARGINY - FONTSIZE, SCREENXRES - MARGINX * 2, FONTSIZE, 0, 280 );
}
void display(void)
{
DrawSync(0);
VSync(0);
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
DrawOTag(&ot[db][OTLEN - 1]);
db = !db;
nextpri = primbuff[db];
}
#include "hello_ovl_world.c"
int main(void)
{
ovl_main_hello();
};

View File

@ -0,0 +1,7 @@
TARGET = hello_poly
SRCS = hello_poly.c \
CPPFLAGS+=-DSTANDALONE
include ../../common.mk

View File

@ -0,0 +1,72 @@
#include "../common.h"
int ovl_main_poly(void)
{
setRGB(&BGcolor, 250, 0, 250);
init();
uint16_t timer = 0;
uint16_t timeout = 100;
MATRIX IDMATRIX = {0};
POLY_F4 *poly = {0};
SVECTOR RotVector = {0, 0, 0};
VECTOR MovVector = {0, 0, CENTERX, 0};
SVECTOR VertPos[4] = {
{-32, -32, 1 },
{-32, 32, 1 },
{ 32, -32, 1 },
{ 32, 32, 1 }
};
MATRIX PolyMatrix = IDMATRIX;
long polydepth;
long polyflag;
long OTz;
init();
while (1)
{
ClearOTagR(ot[db], OTLEN);
poly = (POLY_F4 *)nextpri; // Set poly to point to the address of the next primitiv in the buffer
// Set transform matrices for this polygon
RotMatrix(&RotVector, &PolyMatrix); // Apply rotation matrix
TransMatrix(&PolyMatrix, &MovVector);
SetRotMatrix(&PolyMatrix); // Set default rotation matrix
SetTransMatrix(&PolyMatrix); // Set default transformation matrix
setPolyF4(poly); // Initialize poly as a POLY_F4
setRGB0(poly, 255, 255, 0); // Set poly color
// RotTransPers
OTz = RotTransPers4(
&VertPos[0], &VertPos[1], &VertPos[2], &VertPos[3],
(long*)&poly->x0, (long*)&poly->x1, (long*)&poly->x2, (long*)&poly->x3,
&polydepth,
&polyflag
); // Perform coordinate and perspective transformation for 4 vertices
RotVector.vy += 4;
RotVector.vz += 4; // Apply rotation on Z-axis. On PSX, the Z-axis is pointing away from the screen.
//~ addPrim(ot[db], poly); // add poly to the Ordering table
addPrim(ot[db][OTLEN-1], poly); // add poly to the Ordering table
nextpri += sizeof(POLY_F4); // increment nextpri address with size of a POLY_F4 struct
timer++;
FntPrint("Hello Poly ! %d", timer);
#ifndef STANDALONE
if (timer == timeout){
next_overlay = MOTHERSHIP;
break;
}
#endif
FntFlush(-1);
display();
}
return next_overlay;
};

View File

@ -0,0 +1,58 @@
#include "../common.h"
DISPENV disp[2]; // Double buffered DISPENV and DRAWENV
DRAWENV draw[2];
u_long ot[2][OTLEN]; // double ordering table of length 8 * 32 = 256 bits / 32 bytes
char primbuff[2][32768]; // double primitive buffer of length 32768 * 8 = 262.144 bits / 32,768 Kbytes
char *nextpri = primbuff[0]; // pointer to the next primitive in primbuff. Initially, points to the first bit of primbuff[0]
uint8_t db = 0; // index of which buffer is used, values 0, 1
CVECTOR BGcolor = { 50, 255, 150 };
void init(void)
{
ResetCallback();
ResetGraph(3);
// Initialize and setup the GTE
InitGeom();
SetGeomOffset(CENTERX,CENTERY);
SetGeomScreen(CENTERX);
SetDefDispEnv(&disp[0], 0, 0, SCREENXRES, SCREENYRES);
SetDefDispEnv(&disp[1], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[0], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[1], 0, 0, SCREENXRES, SCREENYRES);
if (VMODE)
{
SetVideoMode(MODE_PAL);
disp[0].screen.y += 8;
disp[1].screen.y += 8;
}
setRGB0(&draw[0], BGcolor.r, BGcolor.g, BGcolor.b); // set color for first draw area
setRGB0(&draw[1], BGcolor.r, BGcolor.g, BGcolor.b); // set color for second draw area
SetDispMask(1);
draw[0].isbg = 1;
draw[1].isbg = 1;
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
FntLoad(960, 0);
FntOpen(MARGINX, SCREENYRES - MARGINY - FONTSIZE, SCREENXRES - MARGINX * 2, FONTSIZE, 0, 280 );
}
void display(void)
{
DrawSync(0);
VSync(0);
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
DrawOTag(&ot[db][OTLEN - 1]);
db = !db;
nextpri = primbuff[db];
}
#include "hello_ovl_poly.c"
int main(void)
{
ovl_main_poly();
}

View File

@ -0,0 +1,3 @@
TLOAD_ADDR = 0x8001E8480;
__heap_base = 0x8001E8480;

View File

@ -0,0 +1,7 @@
TARGET = hello_tile
SRCS = hello_tile.c \
CPPFLAGS+=-DSTANDALONE
include ../../common.mk

View File

@ -0,0 +1,69 @@
#include "../common.h"
int ovl_main_tile(void)
{
setRGB(&BGcolor, 150, 0, 50);
init();
uint16_t timer = 0;
uint16_t timeout = 100;
TILE * blue_tile;
TILE * pink_tile;
// This one is added at a different OT index
TILE * yellow_tile;
while(1)
{
// Initialize the reversed ordering table. This means the elements at index OTLEN - 1 is drawn first.
ClearOTagR(ot[db], OTLEN);
// yellow_tile
yellow_tile = (TILE * ) nextpri; // yellow_tile is a pointer to primbuf content at adress nextpri, that's cast (type converted) to a TILE struc.
setTile(yellow_tile); // initialize the TILE structure ( fill the length and tag(?) value )
setXY0(yellow_tile, CENTERX - 32 , CENTERY - 48); // Set X,Y
setWH(yellow_tile, 128, 40); // Set Width, Height
setRGB0(yellow_tile, 255, 255, 0); // Set color
addPrim(ot[db][OTLEN - 1], yellow_tile); // Add primitive to ordering table
nextpri += sizeof(TILE);
// blue_tile
blue_tile = (TILE * ) nextpri; // blue_tile is a pointer to primbuf content at adress nextpri, that's cast (type converted) to a blue_tile struc.
setTile(blue_tile); // initialize the blue_tile structure ( fill the length and tag(?) value )
setXY0(blue_tile, CENTERX - 16, CENTERY - 32); // Set X,Y
setWH(blue_tile, 32, 64); // Set Width, Height
setRGB0(blue_tile, 60, 180, 255); // Set color
addPrim(ot[db][OTLEN - 2], blue_tile); // Add primitive to ordering table
nextpri += sizeof(TILE); // Increment the adress nextpri points to by the size of TILE struct
// pink_tile
pink_tile = (TILE * ) nextpri; // pink_tile is a pointer to primbuf content at adress nextpri, that's cast (type converted) to a TILE struc.
setTile(pink_tile); // initialize the TILE structure ( fill the length and tag(?) value )
setXY0(pink_tile, CENTERX, CENTERY - 64); // Set X,Y
setWH(pink_tile, 64, 64); // Set Width, Height
setRGB0(pink_tile, 255, 32, 255); // Set color
addPrim(ot[db][OTLEN - 2], pink_tile); // Add primitive to ordering table
nextpri += sizeof(TILE);
timer ++;
FntPrint("Hello tile ! %d\n", timer);
#ifndef STANDALONE
if (timer == timeout){
next_overlay = OVERLAY_POLY;
// Empty ordering table
//~ EmptyOTag(&ot[db], &primbuff[db], nextpri);
break;
}
#endif
FntFlush(-1);
display();
}
return next_overlay;
};

View File

@ -0,0 +1,52 @@
#include "../common.h"
DISPENV disp[2]; // Double buffered DISPENV and DRAWENV
DRAWENV draw[2];
u_long ot[2][OTLEN]; // double ordering table of length 8 * 32 = 256 bits / 32 bytes
char primbuff[2][32768]; // double primitive buffer of length 32768 * 8 = 262.144 bits / 32,768 Kbytes
char *nextpri = primbuff[0]; // pointer to the next primitive in primbuff. Initially, points to the first bit of primbuff[0]
uint8_t db = 0; // index of which buffer is used, values 0, 1
CVECTOR BGcolor = { 50, 255, 150 };
void init(void)
{
ResetGraph(0);
SetDefDispEnv(&disp[0], 0, 0, SCREENXRES, SCREENYRES);
SetDefDispEnv(&disp[1], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[0], 0, SCREENYRES, SCREENXRES, SCREENYRES);
SetDefDrawEnv(&draw[1], 0, 0, SCREENXRES, SCREENYRES);
if (VMODE)
{
SetVideoMode(MODE_PAL);
disp[0].screen.y += 8;
disp[1].screen.y += 8;
}
SetDispMask(1); // Display on screen
setRGB0(&draw[0], BGcolor.r, BGcolor.g, BGcolor.b); // set color for first draw area
setRGB0(&draw[1], BGcolor.r, BGcolor.g, BGcolor.b); // set color for second draw area
draw[0].isbg = 1;
draw[1].isbg = 1;
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
FntLoad(960, 0);
FntOpen(MARGINX, SCREENYRES - MARGINY - FONTSIZE, SCREENXRES - MARGINX * 2, FONTSIZE, 0, 280 );
}
void display(void)
{
DrawSync(0);
VSync(0);
PutDispEnv(&disp[db]);
PutDrawEnv(&draw[db]);
// We're using a reverse OT, so we want to display the last item first. See PsyQ's LibRef47.pdf, p.277
DrawOTag(&ot[db][OTLEN - 1]);
// Comment above line, and uncomment the following line to use a regular oredered OT. Comment l.71 and Uncomment l.73 accordingly
db = !db;
nextpri = primbuff[db];
}
#include "hello_ovl_tile.c"
int main(void)
{
ovl_main_tile();
};

View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- MKPSXISO example XML script -->
<!-- <iso_project>
Starts an ISO image project to build. Multiple <iso_project> elements may be
specified within the same xml script which useful for multi-disc projects.
<iso_project> elements must contain at least one <track> element.
Attributes:
image_name - File name of the ISO image file to generate.
cue_sheet - Optional, file name of the cue sheet for the image file
(required if more than one track is specified).
-->
<iso_project image_name="hello_ovl_exec.bin" cue_sheet="hello_ovl_exec.cue">
<!-- <track>
Specifies a track to the ISO project. This example element creates a data
track for storing data files and CD-XA/STR streams.
Only one data track is allowed and data tracks must only be specified as the
first track in the ISO image and cannot be specified after an audio track.
Attributes:
type - Track type (either data or audio).
source - For audio tracks only, specifies the file name of a wav audio
file to use for the audio track.
-->
<track type="data">
<!-- <identifiers>
Optional, Specifies the identifier strings to use for the data track.
Attributes:
system - Optional, specifies the system identifier (PLAYSTATION if unspecified).
application - Optional, specifies the application identifier (PLAYSTATION if unspecified).
volume - Optional, specifies the volume identifier.
volume_set - Optional, specifies the volume set identifier.
publisher - Optional, specifies the publisher identifier.
data_preparer - Optional, specifies the data preparer identifier. If unspecified, MKPSXISO
will fill it with lengthy text telling that the image file was generated
using MKPSXISO.
-->
<identifiers
system ="PLAYSTATION"
application ="PLAYSTATION"
volume ="HELOCD"
volume_set ="HELOCD"
publisher ="SCHNAPPY"
data_preparer ="MKPSXISO"
/>
<!-- <license>
Optional, specifies the license file to use, the format of the license file must be in
raw 2336 byte sector format, like the ones included with the PsyQ SDK in psyq\cdgen\LCNSFILE.
License data is not included within the MKPSXISO program to avoid possible legal problems
in the open source environment... Better be safe than sorry.
Attributes:
file - Specifies the license file to inject into the ISO image.
-->
<!--
<license file="LICENSEA.DAT"/>
-->
<!-- <directory_tree>
Specifies and contains the directory structure for the data track.
Attributes:
None.
-->
<directory_tree>
<!-- <file>
Specifies a file in the directory tree.
Attributes:
name - File name to use in the directory tree (can be used for renaming).
type - Optional, type of file (data for regular files and is the default, xa for
XA audio and str for MDEC video).
source - File name of the source file.
-->
<!-- Stores system.txt as system.cnf -->
<file name="system.cnf" type="data" source="system.cnf"/>
<file name="SCES_313.37" type="data" source="hello_ovl_exec.ps-exe"/>
<file name="POLY.OVL" type="data" source="Overlay.ovly0"/>
<file name="TILE.OVL" type="data" source="Overlay.ovly1"/>
<file name="HELLO.OVL" type="data" source="Overlay.ovly2"/>
<dummy sectors="1024"/>
<!-- <dir>
Specifies a directory in the directory tree. <file> and <dir> elements inside the element
will be inside the specified directory.
-->
</directory_tree>
</track>
</iso_project>

60
hello_ovl_exec/overlay.ld Normal file
View File

@ -0,0 +1,60 @@
__heap_base = MAX(__ovly0_end, __ovly2_end);
SECTIONS {
OVERLAY __bss_end : NOCROSSREFS SUBALIGN(4)
{
.ovlyload
{
load_all_overlays_here = .;
}
.ovly0
{
KEEP(hello_poly/*.o(.text))
__ovly0_ctor = .;
KEEP(hello_poly/*.o(.text.startup._GLOBAL__*))
KEEP(hello_poly/*.o(.text.*))
KEEP(hello_poly/*.o(.rodata*))
KEEP(hello_poly/*.o(.sdata*))
KEEP(hello_poly/*.o(.data*))
KEEP(hello_poly/*.o(.sbss*))
KEEP(hello_poly/*.o(.bss*))
KEEP(hello_poly/*.o(.ctors))
. = ALIGN(4);
__ovly0_end = .;
}
.ovly1
{
KEEP(hello_tile/*.o(.text))
__ovly1_ctor = .;
KEEP(hello_tile/*.o(.text.startup._GLOBAL__*))
KEEP(hello_tile/*.o(.text.*))
KEEP(hello_tile/*.o(.rodata*))
KEEP(hello_tile/*.o(.sdata*))
KEEP(hello_tile/*.o(.data*))
KEEP(hello_tile/*.o(.sbss*))
KEEP(hello_tile/*.o(.bss*))
KEEP(hello_tile/*.o(.ctors))
. = ALIGN(4);
__ovly1_end = .;
}
.ovly2
{
KEEP(hello_ovl_world/*.o(.text))
__ovly2_ctor = .;
KEEP(hello_ovl_world/*.o(.text.startup._GLOBAL__*))
KEEP(hello_ovl_world/*.o(.text.*))
KEEP(hello_ovl_world/*.o(.rodata*))
KEEP(hello_ovl_world/*.o(.sdata*))
KEEP(hello_ovl_world/*.o(.data*))
KEEP(hello_ovl_world/*.o(.sbss*))
KEEP(hello_ovl_world/*.o(.bss*))
KEEP(hello_ovl_world/*.o(.ctors))
. = ALIGN(4);
__ovly2_end = .;
}
}
}

View File

@ -0,0 +1,4 @@
BOOT=cdrom:\SCES_313.37;1
TCB=4
EVENT=10
STACK=801FFFF0