From 065f413ea7f8e64789dd7ba1c9f6d93c2f250bd3 Mon Sep 17 00:00:00 2001 From: Adam Greenwood-Byrne Date: Wed, 10 Mar 2021 18:35:08 +0000 Subject: [PATCH] Added wticker.c and wgt03.c which exercises it - SMP required --- part12-wgt/examples/wgt03.c | 147 ++++++++++++++++++++++++++++++++++++ part12-wgt/examples/wgt08.c | 2 +- part12-wgt/lib/mem.c | 2 +- part12-wgt/wgt.h | 5 ++ part12-wgt/wticker.c | 67 ++++++++++++++++ 5 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 part12-wgt/examples/wgt03.c create mode 100644 part12-wgt/wticker.c diff --git a/part12-wgt/examples/wgt03.c b/part12-wgt/examples/wgt03.c new file mode 100644 index 0000000..53b4904 --- /dev/null +++ b/part12-wgt/examples/wgt03.c @@ -0,0 +1,147 @@ +#include "wgt.h" + +// ######## REQUIRED FUNCTIONS ######## + +unsigned long state0 = 1000; +unsigned long state1 = 2000; + +unsigned long rand(void) +{ + unsigned long s1 = state0; + unsigned long s0 = state1; + + state0 = s0; + s1 ^= s1 << 23; + s1 ^= s1 >> 17; + s1 ^= s0; + s1 ^= s0 >> 26; + state1 = s1; + + return state0 + state1; +} + +void wait_msec(unsigned int n) +{ + register unsigned long f, t, r; + + // Get the current counter frequency + asm volatile ("mrs %0, cntfrq_el0" : "=r"(f)); + // Read the current counter + asm volatile ("mrs %0, cntpct_el0" : "=r"(t)); + // Calculate expire value for counter + t+=((f/1000)*n)/1000; + do{asm volatile ("mrs %0, cntpct_el0" : "=r"(r));}while(r= 1920) { + curx = 0; cury += 8; + } + if (cury + 8 >= 1080) { + cury = 0; + } + wtextcolor(vgapal[15]); + wouttextxy (curx, cury, NULL, str); + + curx += (strlen(str) * 8); +} + +void debugcrlf(void) { + curx = 0; cury += 8; +} + +void debugch(unsigned char b) { + unsigned int n; + int c; + for(c=4;c>=0;c-=4) { + n=(b>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} + +void debughex(unsigned int d) { + unsigned int n; + int c; + for(c=28;c>=0;c-=4) { + n=(d>>c)&0xF; + n+=n>9?0x37:0x30; + debugstr((char *)&n); + } + debugstr(" "); +} + +void timer_routine (void) +{ + timer++; +} + +void wgt03() +{ + vga256 (); /* Initialize WGT system */ + + debugstr ("WGT Example #3"); debugcrlf(); debugcrlf(); + debugstr ("This program will use the wcls routine to clear the screen"); debugcrlf(); + debugstr ("using random colors as fast as it can until you press a key."); debugcrlf(); + debugstr ("It will then report the highest frame rate possible on your computer."); debugcrlf(); debugcrlf(); debugcrlf(); + debugstr ("Press any key to continue."); debugcrlf(); + getch (); + + clearcount = 0; + timer = 0; + + winittimer (); + wstarttimer (timer_routine, TIMERSPEED); + + curx = 0; + cury = 0; + + while (!kbhit ()) + { + wcls(vgapal[rand() % 256]); /* Clear with random color out of 256 */ + clearcount++; + } + + wstoptimer (); + wdonetimer (); + + getch (); + + wcls(vgapal[0]); + + unsigned int fps = clearcount / (timer / TIMERSPEED); + debughex(fps); debugstr("frames per second"); debugcrlf(); + debugstr ("This is the highest frame rate your computer can produce for full screen\n"); debugcrlf(); + debugstr ("animation."); debugcrlf(); +} + +void main() +{ + wgt03(); + while (1); +} diff --git a/part12-wgt/examples/wgt08.c b/part12-wgt/examples/wgt08.c index 2061710..802e10d 100644 --- a/part12-wgt/examples/wgt08.c +++ b/part12-wgt/examples/wgt08.c @@ -69,7 +69,7 @@ void wgt08() getch (); - wcls (0); + wcls (vgapal[0]); for (x = 1; x < 10000; x++) /* try filling 10,000 random pixels */ { wsetcolor (vgapal[rand() % 255]); diff --git a/part12-wgt/lib/mem.c b/part12-wgt/lib/mem.c index 1190709..4e772db 100644 --- a/part12-wgt/lib/mem.c +++ b/part12-wgt/lib/mem.c @@ -3,7 +3,7 @@ extern unsigned char _end[]; // Define the heap unsigned char *HEAP_START = &_end[0]; -unsigned int HEAP_SIZE = 0x40000000; // Max heap size is 1Gb +unsigned int HEAP_SIZE = 0x30000000; // Max heap size is 768Mb unsigned char *HEAP_END; // Set up some globals diff --git a/part12-wgt/wgt.h b/part12-wgt/wgt.h index 1b55e4f..a550572 100644 --- a/part12-wgt/wgt.h +++ b/part12-wgt/wgt.h @@ -86,3 +86,8 @@ short wgetblockwidth (block ptr); short wgetblockheight (block ptr); block wnewblock (short x, short y, short x2, short y2); block wallocblock (short width, short height); +void wdonetimer (void); +void winittimer (void); +void wsettimerspeed (int speed); +void wstarttimer (void (*rout)(), int speed); +void wstoptimer (void); diff --git a/part12-wgt/wticker.c b/part12-wgt/wticker.c new file mode 100644 index 0000000..daaff53 --- /dev/null +++ b/part12-wgt/wticker.c @@ -0,0 +1,67 @@ +#include "wgt.h" +#include "include/multicore.h" + +short ticker_speed, ticker_running; +unsigned int ticker_interval; +void (*ticker_routine)(); + +void twait(unsigned int n) +{ + register unsigned long f, t, r; + + // Get the current counter frequency + asm volatile ("mrs %0, cntfrq_el0" : "=r"(f)); + // Read the current counter + asm volatile ("mrs %0, cntpct_el0" : "=r"(t)); + // Calculate expire value for counter + t+=((f/1000)*n)/1000; + do{asm volatile ("mrs %0, cntpct_el0" : "=r"(r));}while(r