diff --git a/include/PR/os.h b/include/PR/os.h index 1b39d79a17..8b55f5bcb7 100644 --- a/include/PR/os.h +++ b/include/PR/os.h @@ -24,4 +24,15 @@ #include "os_vi.h" #include "os_voice.h" +/* + * Stack size for I/O device managers: PIM (PI Manager), VIM (VI Manager), + * SIM (SI Manager) + * + */ +#define OS_PIM_STACKSIZE 4096 +#define OS_VIM_STACKSIZE 4096 +#define OS_SIM_STACKSIZE 4096 + +#define OS_MIN_STACKSIZE 72 + #endif diff --git a/include/PR/os_internal.h b/include/PR/os_internal.h index 916e82d7c6..f2c5bfa177 100644 --- a/include/PR/os_internal.h +++ b/include/PR/os_internal.h @@ -4,6 +4,7 @@ #include "ultratypes.h" #include "os_message.h" #include "os_pi.h" +#include "os_internal_rsp.h" typedef struct __osHwInt { /* 0x00 */ s32 (*handler)(void); diff --git a/include/PR/os_internal_rsp.h b/include/PR/os_internal_rsp.h new file mode 100644 index 0000000000..58c734f935 --- /dev/null +++ b/include/PR/os_internal_rsp.h @@ -0,0 +1,14 @@ +#ifndef PR_RSP_H +#define PR_RSP_H + +#include "ultratypes.h" +#include "libc/stddef.h" + + +u32 __osSpGetStatus(void); +void __osSpSetStatus(u32 data); +s32 __osSpSetPc(u32 pc); +s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, size_t size); + + +#endif diff --git a/include/PR/rcp.h b/include/PR/rcp.h index 18a2379418..919e6e90a1 100644 --- a/include/PR/rcp.h +++ b/include/PR/rcp.h @@ -108,6 +108,73 @@ #define SP_IMEM_START 0x04001000 #define SP_IMEM_END 0x04001FFF +/** + * SP_STATUS_REG: write bits + */ +#define SP_CLR_HALT (1 << 0) +#define SP_SET_HALT (1 << 1) +#define SP_CLR_BROKE (1 << 2) +#define SP_CLR_INTR (1 << 3) +#define SP_SET_INTR (1 << 4) +#define SP_CLR_SSTEP (1 << 5) +#define SP_SET_SSTEP (1 << 6) +#define SP_CLR_INTR_BREAK (1 << 7) +#define SP_SET_INTR_BREAK (1 << 8) +#define SP_CLR_SIG0 (1 << 9) +#define SP_SET_SIG0 (1 << 10) +#define SP_CLR_SIG1 (1 << 11) +#define SP_SET_SIG1 (1 << 12) +#define SP_CLR_SIG2 (1 << 13) +#define SP_SET_SIG2 (1 << 14) +#define SP_CLR_SIG3 (1 << 15) +#define SP_SET_SIG3 (1 << 16) +#define SP_CLR_SIG4 (1 << 17) +#define SP_SET_SIG4 (1 << 18) +#define SP_CLR_SIG5 (1 << 19) +#define SP_SET_SIG5 (1 << 20) +#define SP_CLR_SIG6 (1 << 21) +#define SP_SET_SIG6 (1 << 22) +#define SP_CLR_SIG7 (1 << 23) +#define SP_SET_SIG7 (1 << 24) + +/* + * SP_STATUS_REG: read bits + */ +#define SP_STATUS_HALT (1 << 0) +#define SP_STATUS_BROKE (1 << 1) +#define SP_STATUS_DMA_BUSY (1 << 2) +#define SP_STATUS_DMA_FULL (1 << 3) +#define SP_STATUS_IO_FULL (1 << 4) +#define SP_STATUS_SSTEP (1 << 5) +#define SP_STATUS_INTR_BREAK (1 << 6) +#define SP_STATUS_SIG0 (1 << 7) +#define SP_STATUS_SIG1 (1 << 8) +#define SP_STATUS_SIG2 (1 << 9) +#define SP_STATUS_SIG3 (1 << 10) +#define SP_STATUS_SIG4 (1 << 11) +#define SP_STATUS_SIG5 (1 << 12) +#define SP_STATUS_SIG6 (1 << 13) +#define SP_STATUS_SIG7 (1 << 14) + +/** + * SP_STATUS_REG: use of SIG bits + */ +#define SP_CLR_YIELD SP_CLR_SIG0 +#define SP_SET_YIELD SP_SET_SIG0 +#define SP_STATUS_YIELD SP_STATUS_SIG0 +#define SP_CLR_YIELDED SP_CLR_SIG1 +#define SP_SET_YIELDED SP_SET_SIG1 +#define SP_STATUS_YIELDED SP_STATUS_SIG1 +#define SP_CLR_TASKDONE SP_CLR_SIG2 +#define SP_SET_TASKDONE SP_SET_SIG2 +#define SP_STATUS_TASKDONE SP_STATUS_SIG2 +#define SP_CLR_RSPSIGNAL SP_CLR_SIG3 +#define SP_SET_RSPSIGNAL SP_SET_SIG3 +#define SP_STATUS_RSPSIGNAL SP_STATUS_SIG3 +#define SP_CLR_CPUSIGNAL SP_CLR_SIG4 +#define SP_SET_CPUSIGNAL SP_SET_SIG4 +#define SP_STATUS_CPUSIGNAL SP_STATUS_SIG4 + #define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */ #define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */ #define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */ diff --git a/include/PR/rsp.h b/include/PR/rsp.h deleted file mode 100644 index 4ac58cf650..0000000000 --- a/include/PR/rsp.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef PR_RSP_H -#define PR_RSP_H - -#include "ultratypes.h" -#include "libc/stddef.h" - - -/* SP Status Flags */ -#define SP_STATUS_HALT (1 << 0) -#define SP_STATUS_BROKE (1 << 1) -#define SP_STATUS_DMA_BUSY (1 << 2) -#define SP_STATUS_DMA_FULL (1 << 3) -#define SP_STATUS_IO_FULL (1 << 4) -#define SP_STATUS_SSTEP (1 << 5) -#define SP_STATUS_INTR_BREAK (1 << 6) -#define SP_STATUS_YIELD (1 << 7) // SIG0 -#define SP_STATUS_YIELDED (1 << 8) // SIG1 -#define SP_STATUS_TASKDONE (1 << 9) // SIG2 -#define SP_STATUS_SIG3 (1 << 10) -#define SP_STATUS_SIG4 (1 << 11) -#define SP_STATUS_SIG5 (1 << 12) -#define SP_STATUS_SIG6 (1 << 13) -#define SP_STATUS_SIG7 (1 << 14) - -#define SP_CLR_HALT (1 << 0) -#define SP_SET_HALT (1 << 1) -#define SP_CLR_BROKE (1 << 2) -#define SP_CLR_INTR (1 << 3) -#define SP_SET_INTR (1 << 4) -#define SP_CLR_SSTEP (1 << 5) -#define SP_SET_SSTEP (1 << 6) -#define SP_CLR_INTR_BREAK (1 << 7) -#define SP_SET_INTR_BREAK (1 << 8) -#define SP_CLR_SIG0 (1 << 9) -#define SP_SET_SIG0 (1 << 10) -#define SP_CLR_SIG1 (1 << 11) -#define SP_SET_SIG1 (1 << 12) -#define SP_CLR_SIG2 (1 << 13) -#define SP_SET_SIG2 (1 << 14) -#define SP_CLR_SIG3 (1 << 15) -#define SP_SET_SIG3 (1 << 16) -#define SP_CLR_SIG4 (1 << 17) -#define SP_SET_SIG4 (1 << 18) -#define SP_CLR_SIG5 (1 << 19) -#define SP_SET_SIG5 (1 << 20) -#define SP_CLR_SIG6 (1 << 21) -#define SP_SET_SIG6 (1 << 22) -#define SP_CLR_SIG7 (1 << 23) -#define SP_SET_SIG7 (1 << 24) - - -u32 __osSpGetStatus(void); -void __osSpSetStatus(u32 data); -s32 __osSpSetPc(u32 pc); -s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, size_t size); - - -#endif diff --git a/include/ultra64.h b/include/ultra64.h index 0264c844a5..e6be91641d 100644 --- a/include/ultra64.h +++ b/include/ultra64.h @@ -15,7 +15,6 @@ #include "PR/sptask.h" #include "PR/rcp.h" #include "PR/rdp.h" -#include "PR/rsp.h" #include "PR/R4300.h" #include "PR/ucode.h" #include "PR/viint.h" diff --git a/src/libultra/io/sirawread.c b/src/libultra/io/sirawread.c index 7e3537603c..aca70e11b0 100644 --- a/src/libultra/io/sirawread.c +++ b/src/libultra/io/sirawread.c @@ -1,9 +1,9 @@ -#include "global.h" +#include "ultra64.h" s32 __osSiRawReadIo(uintptr_t devAddr, u32* data) { if (__osSiDeviceBusy()) { return -1; } - *data = *(u32*)(devAddr | 0xA0000000); + *data = IO_READ(devAddr); return 0; } diff --git a/src/libultra/io/sirawwrite.c b/src/libultra/io/sirawwrite.c index 0f98b08c52..37749918bf 100644 --- a/src/libultra/io/sirawwrite.c +++ b/src/libultra/io/sirawwrite.c @@ -1,11 +1,11 @@ -#include "global.h" +#include "ultra64.h" s32 __osSiRawWriteIo(uintptr_t devAddr, u32 data) { if (__osSiDeviceBusy() != 0) { return -1; } - *(u32*)(devAddr | 0xA0000000) = data; + IO_WRITE(devAddr, data); return 0; } diff --git a/src/libultra/io/sp.c b/src/libultra/io/sp.c index 3f7af40fa9..e1d95eeb88 100644 --- a/src/libultra/io/sp.c +++ b/src/libultra/io/sp.c @@ -1,4 +1,5 @@ -#include "global.h" +#include "ultra64.h" +#include "libc/stdbool.h" s32 __osSpDeviceBusy(void) { register u32 status = IO_READ(SP_STATUS_REG); diff --git a/src/libultra/io/spgetstat.c b/src/libultra/io/spgetstat.c index f448db4fb5..641261cf70 100644 --- a/src/libultra/io/spgetstat.c +++ b/src/libultra/io/spgetstat.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" u32 __osSpGetStatus() { return IO_READ(SP_STATUS_REG); diff --git a/src/libultra/io/sprawdma.c b/src/libultra/io/sprawdma.c index 1e186af8f4..b09eff34dd 100644 --- a/src/libultra/io/sprawdma.c +++ b/src/libultra/io/sprawdma.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, size_t size) { if (__osSpDeviceBusy()) { diff --git a/src/libultra/io/spsetpc.c b/src/libultra/io/spsetpc.c index 7582b5537f..2789428db8 100644 --- a/src/libultra/io/spsetpc.c +++ b/src/libultra/io/spsetpc.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" s32 __osSpSetPc(u32 pc) { register u32 spStatus = IO_READ(SP_STATUS_REG); diff --git a/src/libultra/io/spsetstat.c b/src/libultra/io/spsetstat.c index 8ab21265f0..558b88fcf9 100644 --- a/src/libultra/io/spsetstat.c +++ b/src/libultra/io/spsetstat.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void __osSpSetStatus(u32 data) { IO_WRITE(SP_STATUS_REG, data); diff --git a/src/libultra/io/sptask.c b/src/libultra/io/sptask.c index c44da8fe7a..35ddeaf612 100644 --- a/src/libultra/io/sptask.c +++ b/src/libultra/io/sptask.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" #define _osVirtualToPhysical(ptr) \ if (ptr != NULL) { \ diff --git a/src/libultra/io/sptaskyield.c b/src/libultra/io/sptaskyield.c index ce0819b349..0d3285d819 100644 --- a/src/libultra/io/sptaskyield.c +++ b/src/libultra/io/sptaskyield.c @@ -1,5 +1,5 @@ -#include "global.h" +#include "ultra64.h" void osSpTaskYield(void) { - __osSpSetStatus(0x400); + __osSpSetStatus(SP_SET_YIELD); } diff --git a/src/libultra/io/sptaskyielded.c b/src/libultra/io/sptaskyielded.c index 66b541921a..88c112305c 100644 --- a/src/libultra/io/sptaskyielded.c +++ b/src/libultra/io/sptaskyielded.c @@ -1,17 +1,17 @@ -#include "global.h" +#include "ultra64.h" OSYieldResult osSpTaskYielded(OSTask* task) { - s32 status; + s32 status = __osSpGetStatus(); OSYieldResult result; - status = __osSpGetStatus(); - if (status & 0x100) { - result = 1; + + if (status & SP_STATUS_YIELDED) { + result = OS_TASK_YIELDED; } else { result = 0; } - if (status & 0x80) { + if (status & SP_STATUS_YIELD) { task->t.flags |= result; - task->t.flags &= ~(2); + task->t.flags &= ~OS_TASK_DP_WAIT; } return result; } diff --git a/src/libultra/io/vi.c b/src/libultra/io/vi.c index cdcba49db9..117a2d70e1 100644 --- a/src/libultra/io/vi.c +++ b/src/libultra/io/vi.c @@ -1,6 +1,7 @@ -#include "global.h" +#include "ultra64.h" +#include "alignment.h" -__OSViContext vi[2] = { 0 }; +__OSViContext vi[2] ALIGNED(8) = { 0 }; __OSViContext* __osViCurr = &vi[0]; __OSViContext* __osViNext = &vi[1]; diff --git a/src/libultra/io/viblack.c b/src/libultra/io/viblack.c index 6b8fec9536..8b780d5389 100644 --- a/src/libultra/io/viblack.c +++ b/src/libultra/io/viblack.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViBlack(u8 active) { register u32 saveMask; @@ -6,9 +6,9 @@ void osViBlack(u8 active) { saveMask = __osDisableInt(); if (active) { - __osViNext->state |= 0x20; + __osViNext->state |= VI_STATE_BLACK; } else { - __osViNext->state &= ~0x20; + __osViNext->state &= ~VI_STATE_BLACK; } __osRestoreInt(saveMask); diff --git a/src/libultra/io/viextendvstart.c b/src/libultra/io/viextendvstart.c index ce9f718d01..b187f1418d 100644 --- a/src/libultra/io/viextendvstart.c +++ b/src/libultra/io/viextendvstart.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViExtendVStart(u32 a0) { __additional_scanline = a0; diff --git a/src/libultra/io/vigetcurrcontext.c b/src/libultra/io/vigetcurrcontext.c index 2b7de83417..3bb95fb4f7 100644 --- a/src/libultra/io/vigetcurrcontext.c +++ b/src/libultra/io/vigetcurrcontext.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" __OSViContext* __osViGetCurrentContext(void) { return __osViCurr; diff --git a/src/libultra/io/vigetcurrframebuf.c b/src/libultra/io/vigetcurrframebuf.c index 8127a3f63a..f0caeb7b15 100644 --- a/src/libultra/io/vigetcurrframebuf.c +++ b/src/libultra/io/vigetcurrframebuf.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void* osViGetCurrentFramebuffer(void) { register u32 prevInt = __osDisableInt(); diff --git a/src/libultra/io/vigetnextframebuf.c b/src/libultra/io/vigetnextframebuf.c index 21fd8ece7a..7e87c5f33d 100644 --- a/src/libultra/io/vigetnextframebuf.c +++ b/src/libultra/io/vigetnextframebuf.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void* osViGetNextFramebuffer(void) { register u32 saveMask; diff --git a/src/libultra/io/vimgr.c b/src/libultra/io/vimgr.c index ffeaec6305..f74d3d3adc 100644 --- a/src/libultra/io/vimgr.c +++ b/src/libultra/io/vimgr.c @@ -1,14 +1,16 @@ -#include "global.h" +#include "ultra64.h" #include "PR/osint.h" #include "stack.h" #include "PR/osint.h" +#include "libc/stdbool.h" +#include "macros.h" OSThread viThread; -STACK(sViStack, 0x1000); -OSMesgQueue viEventQueue; -OSMesg viEventBuf[6]; -OSIoMesg viRetraceMsg; -OSIoMesg viCounterMsg; +STACK(sViStack, OS_VIM_STACKSIZE) ALIGNED(16); +OSMesgQueue viEventQueue ALIGNED(8); +OSMesg viEventBuf[6] ALIGNED(8); +OSIoMesg viRetraceMsg ALIGNED(8); +OSIoMesg viCounterMsg ALIGNED(8); OSDevMgr __osViDevMgr = { 0 }; u32 __additional_scanline = 0; diff --git a/src/libultra/io/visetevent.c b/src/libultra/io/visetevent.c index 3a14ccbc1b..701f41863d 100644 --- a/src/libultra/io/visetevent.c +++ b/src/libultra/io/visetevent.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViSetEvent(OSMesgQueue* mq, OSMesg m, u32 retraceCount) { register u32 saveMask = __osDisableInt(); diff --git a/src/libultra/io/visetmode.c b/src/libultra/io/visetmode.c index 6953bf63b8..0e21f9a94a 100644 --- a/src/libultra/io/visetmode.c +++ b/src/libultra/io/visetmode.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViSetMode(OSViMode* modep) { register u32 saveMask; @@ -6,7 +6,7 @@ void osViSetMode(OSViMode* modep) { saveMask = __osDisableInt(); __osViNext->modep = modep; - __osViNext->state = 1; + __osViNext->state = VI_STATE_MODE_UPDATED; __osViNext->features = __osViNext->modep->comRegs.ctrl; __osRestoreInt(saveMask); diff --git a/src/libultra/io/visetspecial.c b/src/libultra/io/visetspecial.c index a5ef1220a4..758807b1bf 100644 --- a/src/libultra/io/visetspecial.c +++ b/src/libultra/io/visetspecial.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViSetSpecialFeatures(u32 func) { register u32 saveMask = __osDisableInt(); diff --git a/src/libultra/io/visetxscale.c b/src/libultra/io/visetxscale.c index 0e2cf762d9..2a403cffd7 100644 --- a/src/libultra/io/visetxscale.c +++ b/src/libultra/io/visetxscale.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViSetXScale(f32 value) { register u32 nomValue; @@ -8,10 +8,10 @@ void osViSetXScale(f32 value) { __osViNext->x.factor = value; - __osViNext->state |= 0x2; + __osViNext->state |= VI_STATE_XSCALE_UPDATED; - nomValue = __osViNext->modep->comRegs.xScale & 0xFFF; - __osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & 0xFFF; + nomValue = __osViNext->modep->comRegs.xScale & VI_SCALE_MASK; + __osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & VI_SCALE_MASK; __osRestoreInt(saveMask); } diff --git a/src/libultra/io/visetyscale.c b/src/libultra/io/visetyscale.c index 6ef85963df..0c4b734ba8 100644 --- a/src/libultra/io/visetyscale.c +++ b/src/libultra/io/visetyscale.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void osViSetYScale(f32 value) { register u32 saveMask; @@ -7,7 +7,7 @@ void osViSetYScale(f32 value) { __osViNext->y.factor = value; - __osViNext->state |= 0x4; + __osViNext->state |= VI_STATE_YSCALE_UPDATED; __osRestoreInt(saveMask); } diff --git a/src/libultra/io/viswapbuf.c b/src/libultra/io/viswapbuf.c index c60918092a..dafce36f37 100644 --- a/src/libultra/io/viswapbuf.c +++ b/src/libultra/io/viswapbuf.c @@ -1,11 +1,11 @@ -#include "global.h" +#include "ultra64.h" void osViSwapBuffer(void* frameBufPtr) { u32 saveMask = __osDisableInt(); __osViNext->buffer = frameBufPtr; - __osViNext->state |= 0x10; + __osViNext->state |= VI_STATE_BUFFER_UPDATED; __osRestoreInt(saveMask); } diff --git a/src/libultra/io/viswapcontext.c b/src/libultra/io/viswapcontext.c index f6bf562e3c..528f04bea3 100644 --- a/src/libultra/io/viswapcontext.c +++ b/src/libultra/io/viswapcontext.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "ultra64.h" void __osViSwapContext(void) { register OSViMode* viMode;