After the Hello World
After writing a simple hello world, 2 things are needed before proceeding :
- Get the execution time, (and in turn, frame times) in order to properly write time based animations
- How to get simple primitives drawn on the screen
Getting execution time
libyaul supplies following function
static uint16_t cpu_frt_count_get(void);
However the return type is a problem : it quickly overflows.
After some digging on discord, as well as examples provided with libyaul:
#include <yaul.h> #include <stdio.h> #include <stdlib.h> uint32_t elapsed_time = 0; static void _frt_ovi_handler(void); static uint16_t _frt_overflow_count = 0; void main(void) { //initialize dbgio dbgio_dev_default_init(DBGIO_DEV_VDP2_SIMPLE); dbgio_dev_font_load(); dbgio_dev_font_load_wait(); vdp2_tvmd_display_set(); cpu_frt_init(CPU_FRT_CLOCK_DIV_32); uint32_t frame_time = 0 ; uint32_t frame_start = 0 ; uint32_t frame_end = 0 ; //init cpu_frt_ovi_set(_frt_ovi_handler); cpu_frt_count_set(0); /* Reset overflow counter after setting the FRT count to zero in case * there's an FRT overflow interrupt */ _frt_overflow_count = 0; while(1) { elapsed_time += frame_time; frame_start = ((65536 * _frt_overflow_count) + (uint32_t) cpu_frt_count_get()) / CPU_FRT_PAL_320_32_COUNT_1MS; dbgio_printf("\x1b[H\x1b[2J"); dbgio_printf("Elapsed time :\t %u \nFrame_time :\t %u \nFrame Start :\t %u \nFrame End :\t %u \noverflow cnt :\t %u\n", (unsigned int) elapsed_time, (unsigned int) frame_time, (unsigned int) frame_start, (unsigned int) frame_end, (unsigned int) _frt_overflow_count); dbgio_flush(); vdp_sync(); frame_end = ((65536 * _frt_overflow_count) + (uint32_t) cpu_frt_count_get()) / CPU_FRT_PAL_320_32_COUNT_1MS; frame_time = (frame_end - frame_start) ; // get tick count at start } } static void _frt_ovi_handler(void) { _frt_overflow_count++; }
Now I’m able to measure the render time and also have the elapsed time.