aboutsummaryrefslogtreecommitdiff
path: root/examples/system/timer
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/system/timer
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/system/timer')
-rw-r--r--examples/system/timer/main.c154
-rw-r--r--examples/system/timer/makefile39
2 files changed, 193 insertions, 0 deletions
diff --git a/examples/system/timer/main.c b/examples/system/timer/main.c
new file mode 100644
index 0000000..7d9f7b3
--- /dev/null
+++ b/examples/system/timer/main.c
@@ -0,0 +1,154 @@
+#include <stdio.h>
+#include <psxgpu.h>
+#include <psxapi.h>
+#include <psxetc.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 */
+} DB;
+
+/* Double buffer variables */
+DB db[2];
+int db_active = 0;
+
+
+/* Function declarations */
+void init();
+void display();
+
+
+volatile int timer_calls = 0;
+volatile short *timer2_ctrl = (short*)0x1F801124;
+void timer_func()
+{
+ timer_calls++;
+}
+
+volatile int vsync_count = 0;
+volatile int tick_count = 0;
+volatile int tick_value = 0;
+
+void vsync_func()
+{
+ vsync_count++;
+ if( vsync_count > 60 )
+ {
+ tick_value = timer_calls-tick_count;
+ tick_count = timer_calls;
+ vsync_count = 0;
+ }
+}
+
+/* Main function */
+int main() {
+
+ int counter;
+
+ /* Init graphics and GTE */
+ init();
+
+
+ EnterCriticalSection();
+ //SetRCnt(RCntCNT2, 0xF040, RCntMdINTR);
+
+ // NTSC clock base
+ counter = 4304000/560;
+
+ // PAL clock base
+ //counter = 5163000/560;
+
+ SetRCnt(RCntCNT2, counter, RCntMdINTR);
+ *timer2_ctrl = 0x1E58;
+ InterruptCallback(6, timer_func);
+ StartRCnt(RCntCNT2);
+ ChangeClearRCnt(2, 0);
+ ExitCriticalSection();
+
+ VSyncCallback(vsync_func);
+
+ /* Main loop */
+ while( 1 ) {
+
+ FntPrint(-1, "TIMER COUNT=%d\n", timer_calls);
+ FntPrint(-1, "TICKS/SEC=%d\n", tick_value);
+
+ /* Swap buffers and draw text */
+ display();
+
+ }
+
+ return 0;
+
+}
+
+void init() {
+
+ /* Reset the GPU, also installs a VSync event handler */
+ ResetGraph( 0 );
+ //SetVideoMode(MODE_PAL);
+
+ /* 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 );
+
+ //db[0].disp.screen.y = 24;
+ //db[1].disp.screen.y = 24;
+
+ 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 );
+
+ FntLoad(960, 0);
+ FntOpen(0, 8, 320, 216, 0, 100);
+
+}
+
+void display() {
+
+ FntFlush(-1);
+
+ /* Wait for GPU to finish drawing and vertical retrace */
+ DrawSync( 0 );
+ VSync( 0 );
+
+ /* Swap buffers */
+ db_active ^= 1;
+
+ /* Apply display/drawing environments */
+ PutDrawEnv( &db[db_active].draw );
+ PutDispEnv( &db[db_active].disp );
+
+ /* Enable display */
+ SetDispMask( 1 );
+
+} \ No newline at end of file
diff --git a/examples/system/timer/makefile b/examples/system/timer/makefile
new file mode 100644
index 0000000..c35c445
--- /dev/null
+++ b/examples/system/timer/makefile
@@ -0,0 +1,39 @@
+include ../../sdk-common.mk
+
+TARGET = timer.elf
+
+CFILES = $(notdir $(wildcard *.c))
+CPPFILES = $(notdir $(wildcard *.cpp))
+AFILES = $(notdir $(wildcard *.s))
+
+OFILES = $(addprefix build/,$(CFILES:.c=.o) $(CPPFILES:.cpp=.o) $(AFILES:.s=.o))
+
+INCLUDE +=
+LIBDIRS +=
+
+LIBS = -lpsxetc -lpsxgpu -lpsxgte -lpsxspu -lpsxapi -lc
+
+CFLAGS = -g -O2 -fno-builtin -fdata-sections -ffunction-sections
+CPPFLAGS = $(CFLAGS) -fno-exceptions
+AFLAGS = -g -msoft-float
+LDFLAGS = -g -Ttext=0x80010000 -gc-sections -T $(GCC_BASE)/mipsel-unknown-elf/lib/ldscripts/elf32elmip.x
+
+CC = $(PREFIX)gcc
+CXX = $(PREFIX)g++
+AS = $(PREFIX)as
+LD = $(PREFIX)ld
+
+all: $(OFILES)
+ $(LD) $(LDFLAGS) $(LIBDIRS) $(OFILES) $(LIBS) -o $(TARGET)
+ elf2x -q $(TARGET)
+
+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 $(TARGET) $(TARGET:.elf=.exe)