final io chunk

This commit is contained in:
angie 2023-09-03 19:07:13 -03:00
parent 17e3264c3c
commit db60759a48
30 changed files with 144 additions and 106 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
u32 __osSpGetStatus() {
return IO_READ(SP_STATUS_REG);

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, size_t size) {
if (__osSpDeviceBusy()) {

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
s32 __osSpSetPc(u32 pc) {
register u32 spStatus = IO_READ(SP_STATUS_REG);

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void __osSpSetStatus(u32 data) {
IO_WRITE(SP_STATUS_REG, data);

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
#define _osVirtualToPhysical(ptr) \
if (ptr != NULL) { \

View File

@ -1,5 +1,5 @@
#include "global.h"
#include "ultra64.h"
void osSpTaskYield(void) {
__osSpSetStatus(0x400);
__osSpSetStatus(SP_SET_YIELD);
}

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void osViExtendVStart(u32 a0) {
__additional_scanline = a0;

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
__OSViContext* __osViGetCurrentContext(void) {
return __osViCurr;

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void* osViGetCurrentFramebuffer(void) {
register u32 prevInt = __osDisableInt();

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void* osViGetNextFramebuffer(void) {
register u32 saveMask;

View File

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

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void osViSetEvent(OSMesgQueue* mq, OSMesg m, u32 retraceCount) {
register u32 saveMask = __osDisableInt();

View File

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

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void osViSetSpecialFeatures(u32 func) {
register u32 saveMask = __osDisableInt();

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
#include "global.h"
#include "ultra64.h"
void __osViSwapContext(void) {
register OSViMode* viMode;