32x: Non working WDT timer for measuring elapsed time

This commit is contained in:
UnknownShadow200 2025-08-15 07:45:45 +10:00
parent 9c9626b502
commit ef1decc6ad
5 changed files with 38 additions and 93 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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) { }

View File

@ -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);