mirror of https://github.com/zeldaret/mm.git
final io chunk
This commit is contained in:
parent
17e3264c3c
commit
db60759a48
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
u32 __osSpGetStatus() {
|
||||
return IO_READ(SP_STATUS_REG);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, size_t size) {
|
||||
if (__osSpDeviceBusy()) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
s32 __osSpSetPc(u32 pc) {
|
||||
register u32 spStatus = IO_READ(SP_STATUS_REG);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void __osSpSetStatus(u32 data) {
|
||||
IO_WRITE(SP_STATUS_REG, data);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
#define _osVirtualToPhysical(ptr) \
|
||||
if (ptr != NULL) { \
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void osSpTaskYield(void) {
|
||||
__osSpSetStatus(0x400);
|
||||
__osSpSetStatus(SP_SET_YIELD);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void osViExtendVStart(u32 a0) {
|
||||
__additional_scanline = a0;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
__OSViContext* __osViGetCurrentContext(void) {
|
||||
return __osViCurr;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void* osViGetCurrentFramebuffer(void) {
|
||||
register u32 prevInt = __osDisableInt();
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void* osViGetNextFramebuffer(void) {
|
||||
register u32 saveMask;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void osViSetEvent(OSMesgQueue* mq, OSMesg m, u32 retraceCount) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void osViSetSpecialFeatures(u32 func) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#include "global.h"
|
||||
#include "ultra64.h"
|
||||
|
||||
void __osViSwapContext(void) {
|
||||
register OSViMode* viMode;
|
||||
|
|
|
|||
Loading…
Reference in New Issue