diff --git a/.github/workflows/build_saturn.yml b/.github/workflows/build_saturn.yml index dba9c85b2..55e287f59 100644 --- a/.github/workflows/build_saturn.yml +++ b/.github/workflows/build_saturn.yml @@ -21,6 +21,8 @@ jobs: - uses: actions/checkout@v4 - name: Install prerequisites run: | + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6ED0E7B82643E131 + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 78DBA3BC47EF2265 apt-get update apt-get -y install curl diff --git a/misc/32x/32x.h b/misc/32x/32x.h index 1d45a3f3d..faad402cd 100644 --- a/misc/32x/32x.h +++ b/misc/32x/32x.h @@ -122,7 +122,6 @@ extern "C" { extern void fast_memcpy(void *dst, void *src, int len); extern void CacheControl(int mode); extern void CacheClearLine(void* ptr); -extern void ScreenStretch(int src, int width, int height, int interp); #ifdef __cplusplus } diff --git a/misc/32x/sh2_crt0.s b/misc/32x/sh2_crt0.s index 020718f72..45a1d141f 100644 --- a/misc/32x/sh2_crt0.s +++ b/misc/32x/sh2_crt0.s @@ -29,19 +29,19 @@ ! Master Vector Base Table at 0x06000000 - .long mstart /* Cold Start PC */ - .long 0x0603FC00 /* Cold Start SP */ - .long mstart /* Manual Reset PC */ - .long 0x0603FC00 /* Manual Reset SP */ - .long main_err /* Illegal instruction */ - .long 0x00000000 /* reserved */ - .long main_err /* Invalid slot instruction */ - .long 0x20100400 /* reserved */ - .long 0x20100420 /* reserved */ - .long main_err /* CPU address error */ - .long main_err /* DMA address error */ - .long main_err /* NMI vector */ - .long main_err /* User break vector */ + .long mstart /* 0, Cold Start PC */ + .long 0x0603FC00 /* 1, Cold Start SP */ + .long mstart /* 2, Manual Reset PC */ + .long 0x0603FC00 /* 3, Manual Reset SP */ + .long main_err /* 4, Illegal instruction */ + .long _wdt_handler/* 5, reserved - repurposed for WDT */ + .long main_err /* 6, Invalid slot instruction */ + .long 0x20100400 /* 7, reserved */ + .long 0x20100420 /* 8, reserved */ + .long main_err /* 9, CPU address error */ + .long main_err /* 10, DMA address error */ + .long main_err /* 11, NMI vector */ + .long main_err /* 12, User break vector */ .space 76 /* reserved */ .long main_err /* TRAPA #32 */ .long main_err /* TRAPA #33 */ @@ -637,81 +637,6 @@ _CacheControl: _sh2_cctl: .long 0xFFFFFE92 -! void ScreenStretch(int src, int width, int height, int interp); -! On entry: r4 = src pointer, r5 = width, r6 = height, r7 = interpolate - - .align 4 - .global _ScreenStretch -_ScreenStretch: - cmp/pl r7 - bt ss_interp - -! stretch screen without interpolation - -0: - mov r5,r3 - shll r3 - mov r3,r2 - shll r2 - add r4,r3 - add r4,r2 -1: - add #-2,r3 - mov.w @r3,r0 - extu.w r0,r1 - shll16 r0 - or r1,r0 - mov.l r0,@-r2 - cmp/eq r3,r4 - bf 1b - - /* next line */ - mov.w ss_pitch,r0 - dt r6 - bf/s 0b - add r0,r4 - rts - nop - -ss_interp: - -! stretch screen with interpolation - -0: - mov r5,r3 - shll r3 - mov r3,r2 - shll r2 - add r4,r3 - add r4,r2 - mov #0,r7 -1: - add #-2,r3 - mov.w @r3,r0 - mov.w ss_mask,r1 - and r0,r1 /* masked curr pixel */ - shll16 r0 - add r1,r7 /* add to masked prev pixel */ - shlr r7 /* blended pixel */ - or r7,r0 /* curr pixel << 16 | blended pixel */ - mov r1,r7 /* masked prev pixel = masked curr pixel */ - mov.l r0,@-r2 - cmp/eq r3,r4 - bf 1b - - /* next line */ - mov.w ss_pitch,r0 - dt r6 - bf/s 0b - add r0,r4 - rts - nop - -ss_mask: - .word 0x7BDE -ss_pitch: - .word 640 - .align 2 .text diff --git a/src/32x/Platform_32x.c b/src/32x/Platform_32x.c index 530d0be51..8e23fe818 100644 --- a/src/32x/Platform_32x.c +++ b/src/32x/Platform_32x.c @@ -95,13 +95,30 @@ void Process_Abort2(cc_result result, const char* raw_msg) { /*########################################################################################################################* *--------------------------------------------------------Stopwatch--------------------------------------------------------* *#########################################################################################################################*/ -cc_uint64 Stopwatch_Measure(void) { - return 0; +#include "../saturn/sh2_wdt.h" + +static void Stopwatch_Init(void) { + wdt_stop(); + + wdt_set_irq_number(5); // hardcoded in sh2_crt0.s + wdt_set_irq_priority(15); + + wdt_enable(); } +cc_uint64 Stopwatch_Measure(void) { + return wdt_total_ticks(); +} + +#define US_PER_SEC 1000000 +#define NTSC_CPU_CLOCK 23011360 // TODO + cc_uint64 Stopwatch_ElapsedMicroseconds(cc_uint64 beg, cc_uint64 end) { if (end < beg) return 0; - return 1000 * 1000; + cc_uint64 delta = end - beg; + + // TODO still completely wrong?? PAL detection ??? + return (delta * US_PER_SEC) / (NTSC_CPU_CLOCK / 1024); } @@ -259,6 +276,8 @@ void Platform_Init(void) { int size = (int)(heap_end - heap_beg); Platform_Log3("HEAP SIZE: %i bytes (%x -> %x)", &size, &heap_beg, &heap_end); + + Stopwatch_Init(); } void Platform_Free(void) { } diff --git a/src/saturn/sh2_wdt.h b/src/saturn/sh2_wdt.h index ed792bb30..c1c0e4a51 100644 --- a/src/saturn/sh2_wdt.h +++ b/src/saturn/sh2_wdt.h @@ -48,7 +48,7 @@ static CC_INLINE void wdt_set_irq_priority(uint8_t pri) { } -static void __interrupt_handler wdt_handler(void) { +void __attribute__((interrupt_handler)) wdt_handler(void) { uint8_t wtcr = *SH2_REG_WTCSR_R & ~SH2_WTCSR_OVF_FLG; *SH2_REG_WTCSR_W = SH2_CMD_WTCSR(wtcr);