diff --git a/lib/asm/non_matchings/unknown_0D3160/__osViInit.s b/lib/asm/non_matchings/unknown_0D3160/__osViInit.s deleted file mode 100644 index e2a221a7..00000000 --- a/lib/asm/non_matchings/unknown_0D3160/__osViInit.s +++ /dev/null @@ -1,91 +0,0 @@ -glabel __osViInit -/* 0D3710 800D2B10 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0D3714 800D2B14 AFBF0014 */ sw $ra, 0x14($sp) -/* 0D3718 800D2B18 3C04800E */ lui $a0, %hi(vi) # $a0, 0x800e -/* 0D371C 800D2B1C 24844810 */ addiu $a0, %lo(vi) # addiu $a0, $a0, 0x4810 -/* 0D3720 800D2B20 0C034138 */ jal bzero -/* 0D3724 800D2B24 24050060 */ li $a1, 96 -/* 0D3728 800D2B28 3C0E800E */ lui $t6, %hi(vi) # $t6, 0x800e -/* 0D372C 800D2B2C 25CE4810 */ addiu $t6, %lo(vi) # addiu $t6, $t6, 0x4810 -/* 0D3730 800D2B30 3C01800E */ lui $at, %hi(__osViCurr) # $at, 0x800e -/* 0D3734 800D2B34 AC2E4870 */ sw $t6, %lo(__osViCurr)($at) -/* 0D3738 800D2B38 3C01800E */ lui $at, %hi(__osViNext) # $at, 0x800e -/* 0D373C 800D2B3C 25CF0030 */ addiu $t7, $t6, 0x30 -/* 0D3740 800D2B40 AC2F4874 */ sw $t7, %lo(__osViNext)($at) -/* 0D3744 800D2B44 24180001 */ li $t8, 1 -/* 0D3748 800D2B48 A5D80032 */ sh $t8, 0x32($t6) -/* 0D374C 800D2B4C 3C08800E */ lui $t0, %hi(__osViCurr) # $t0, 0x800e -/* 0D3750 800D2B50 8D084870 */ lw $t0, %lo(__osViCurr)($t0) -/* 0D3754 800D2B54 24190001 */ li $t9, 1 -/* 0D3758 800D2B58 3C098000 */ lui $t1, %hi(osTvType) # $t1, 0x8000 -/* 0D375C 800D2B5C A5190002 */ sh $t9, 2($t0) -/* 0D3760 800D2B60 8D290300 */ lw $t1, %lo(osTvType)($t1) -/* 0D3764 800D2B64 1520000B */ bnez $t1, .L800D2B94 -/* 0D3768 800D2B68 00000000 */ nop -/* 0D376C 800D2B6C 3C0B800E */ lui $t3, %hi(__osViNext) # $t3, 0x800e -/* 0D3770 800D2B70 8D6B4874 */ lw $t3, %lo(__osViNext)($t3) -/* 0D3774 800D2B74 3C0A800E */ lui $t2, %hi(D_800E4760) # $t2, 0x800e -/* 0D3778 800D2B78 254A4760 */ addiu $t2, %lo(D_800E4760) # addiu $t2, $t2, 0x4760 -/* 0D377C 800D2B7C 3C0C02F5 */ lui $t4, (0x02F5B2D2 >> 16) # lui $t4, 0x2f5 -/* 0D3780 800D2B80 358CB2D2 */ ori $t4, (0x02F5B2D2 & 0xFFFF) # ori $t4, $t4, 0xb2d2 -/* 0D3784 800D2B84 3C01800E */ lui $at, %hi(osViClock) # $at, 0x800e -/* 0D3788 800D2B88 AD6A0008 */ sw $t2, 8($t3) -/* 0D378C 800D2B8C 10000019 */ b .L800D2BF4 -/* 0D3790 800D2B90 AC2C4878 */ sw $t4, %lo(osViClock)($at) -.L800D2B94: -/* 0D3794 800D2B94 3C0D8000 */ lui $t5, %hi(osTvType) # $t5, 0x8000 -/* 0D3798 800D2B98 8DAD0300 */ lw $t5, %lo(osTvType)($t5) -/* 0D379C 800D2B9C 24010002 */ li $at, 2 -/* 0D37A0 800D2BA0 15A1000B */ bne $t5, $at, .L800D2BD0 -/* 0D37A4 800D2BA4 00000000 */ nop -/* 0D37A8 800D2BA8 3C18800E */ lui $t8, %hi(__osViNext) # $t8, 0x800e -/* 0D37AC 800D2BAC 8F184874 */ lw $t8, %lo(__osViNext)($t8) -/* 0D37B0 800D2BB0 3C0F800E */ lui $t7, %hi(D_800E47B0) # $t7, 0x800e -/* 0D37B4 800D2BB4 25EF47B0 */ addiu $t7, %lo(D_800E47B0) # addiu $t7, $t7, 0x47b0 -/* 0D37B8 800D2BB8 3C0E02E6 */ lui $t6, (0x02E6025C >> 16) # lui $t6, 0x2e6 -/* 0D37BC 800D2BBC 35CE025C */ ori $t6, (0x02E6025C & 0xFFFF) # ori $t6, $t6, 0x25c -/* 0D37C0 800D2BC0 3C01800E */ lui $at, %hi(osViClock) # $at, 0x800e -/* 0D37C4 800D2BC4 AF0F0008 */ sw $t7, 8($t8) -/* 0D37C8 800D2BC8 1000000A */ b .L800D2BF4 -/* 0D37CC 800D2BCC AC2E4878 */ sw $t6, %lo(osViClock)($at) -.L800D2BD0: -/* 0D37D0 800D2BD0 3C08800E */ lui $t0, %hi(__osViNext) # $t0, 0x800e -/* 0D37D4 800D2BD4 8D084874 */ lw $t0, %lo(__osViNext)($t0) -/* 0D37D8 800D2BD8 3C19800E */ lui $t9, %hi(D_800E4710) # $t9, 0x800e -/* 0D37DC 800D2BDC 27394710 */ addiu $t9, %lo(D_800E4710) # addiu $t9, $t9, 0x4710 -/* 0D37E0 800D2BE0 3C0902E6 */ lui $t1, (0x02E6D354 >> 16) # lui $t1, 0x2e6 -/* 0D37E4 800D2BE4 3529D354 */ ori $t1, (0x02E6D354 & 0xFFFF) # ori $t1, $t1, 0xd354 -/* 0D37E8 800D2BE8 3C01800E */ lui $at, %hi(osViClock) # $at, 0x800e -/* 0D37EC 800D2BEC AD190008 */ sw $t9, 8($t0) -/* 0D37F0 800D2BF0 AC294878 */ sw $t1, %lo(osViClock)($at) -.L800D2BF4: -/* 0D37F4 800D2BF4 3C0B800E */ lui $t3, %hi(__osViNext) # $t3, 0x800e -/* 0D37F8 800D2BF8 8D6B4874 */ lw $t3, %lo(__osViNext)($t3) -/* 0D37FC 800D2BFC 240A0020 */ li $t2, 32 -/* 0D3800 800D2C00 3C0C800E */ lui $t4, %hi(__osViNext) # $t4, 0x800e -/* 0D3804 800D2C04 A56A0000 */ sh $t2, ($t3) -/* 0D3808 800D2C08 8D8C4874 */ lw $t4, %lo(__osViNext)($t4) -/* 0D380C 800D2C0C 3C18A440 */ lui $t8, %hi(VI_CURRENT_REG) # $t8, 0xa440 -/* 0D3810 800D2C10 8D8D0008 */ lw $t5, 8($t4) -/* 0D3814 800D2C14 8DAF0004 */ lw $t7, 4($t5) -/* 0D3818 800D2C18 AD8F000C */ sw $t7, 0xc($t4) -/* 0D381C 800D2C1C 8F0E0010 */ lw $t6, %lo(VI_CURRENT_REG)($t8) -/* 0D3820 800D2C20 2DC1000B */ sltiu $at, $t6, 0xb -/* 0D3824 800D2C24 14200006 */ bnez $at, .L800D2C40 -/* 0D3828 800D2C28 00000000 */ nop -.L800D2C2C: -/* 0D382C 800D2C2C 3C19A440 */ lui $t9, %hi(VI_CURRENT_REG) # $t9, 0xa440 -/* 0D3830 800D2C30 8F280010 */ lw $t0, %lo(VI_CURRENT_REG)($t9) -/* 0D3834 800D2C34 2D01000B */ sltiu $at, $t0, 0xb -/* 0D3838 800D2C38 1020FFFC */ beqz $at, .L800D2C2C -/* 0D383C 800D2C3C 00000000 */ nop -.L800D2C40: -/* 0D3840 800D2C40 3C09A440 */ lui $t1, 0xa440 -/* 0D3844 800D2C44 0C035824 */ jal __osViSwapContext -/* 0D3848 800D2C48 AD200000 */ sw $zero, ($t1) -/* 0D384C 800D2C4C 8FBF0014 */ lw $ra, 0x14($sp) -/* 0D3850 800D2C50 27BD0018 */ addiu $sp, $sp, 0x18 -/* 0D3854 800D2C54 03E00008 */ jr $ra -/* 0D3858 800D2C58 00000000 */ nop - -/* 0D385C 800D2C5C 00000000 */ nop diff --git a/lib/src/os/osInitialize.c b/lib/src/os/osInitialize.c index a3d330ec..3dc39e5c 100644 --- a/lib/src/os/osInitialize.c +++ b/lib/src/os/osInitialize.c @@ -46,7 +46,7 @@ void osInitialize() { osMapTLBRdb(); osPiRawReadIo(4, &clock); //TODO: remove magic constant; clock &= ~0xf; //clear lower 4 bits - if (clock != 0) { + if (clock) { osClockRate = clock; } osClockRate = osClockRate * 3 / 4; diff --git a/lib/src/os/osPiStartDma.c b/lib/src/os/osPiStartDma.c index 63c354c4..7d13adcb 100644 --- a/lib/src/os/osPiStartDma.c +++ b/lib/src/os/osPiStartDma.c @@ -3,7 +3,7 @@ #include "libultra_internal.h" -extern OSDevMgr __osPiDevMgr; //__osPiDevMgr; +extern OSDevMgr __osPiDevMgr; s32 osPiStartDma(OSIoMesg *mb, s32 priority, s32 direction, u32 devAddr, void *dramAddr, u32 size, OSMesgQueue *mq) { register s32 ret; diff --git a/lib/src/os/osTimer.c b/lib/src/os/osTimer.c index 77d6e70d..7eaa0272 100644 --- a/lib/src/os/osTimer.c +++ b/lib/src/os/osTimer.c @@ -4,8 +4,8 @@ #include "macros.h" #include "libultra_internal.h" -extern OSTimer D_8012D200; -OSTimer *__osTimerList = &D_8012D200; +extern OSTimer __osBaseTimer; +OSTimer *__osTimerList = &__osBaseTimer; extern OSTime __osCurrentTime; extern u32 __osBaseCounter; @@ -16,7 +16,7 @@ extern u32 __osTimerCounter; OSTime __osInsertTimer(OSTimer *t); #ifdef NON_MATCHING -//Seems to be a mistmatch based on where __osCurrentTime is defined. +//Seems to be a mismatch based on where __osCurrentTime is defined. //Scratch proving that: https://decomp.me/scratch/OB3iP void __osTimerServicesInit(void) { __osCurrentTime = 0; diff --git a/lib/src/os/siacs.c b/lib/src/os/siacs.c index 0f71a037..407e1f6a 100644 --- a/lib/src/os/siacs.c +++ b/lib/src/os/siacs.c @@ -26,7 +26,7 @@ OSTask tmp_task; //Supposed to be statically declared in sptask.c #define PI_Q_BUF_LEN 1 OSMesg piAccessBuf[PI_Q_BUF_LEN]; //Should be static, but this works for now s32 __osPiAccessQueue[6]; -OSTimer D_8012D200; +OSTimer __osBaseTimer; OSTime __osCurrentTime; s32 __osBaseCounter; s32 __osViIntrCount; diff --git a/lib/src/os/vi.c b/lib/src/os/vi.c index 6f0f1550..8210ab19 100644 --- a/lib/src/os/vi.c +++ b/lib/src/os/vi.c @@ -1,8 +1,37 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x800D2B10 */ -#include "types.h" -#include "macros.h" #include "libultra_internal.h" +#include "viint.h" +#include "video.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0D3160/__osViInit.s") +extern OSViMode osViModeNtscLan1; +extern OSViMode osViModePalLan1; +extern OSViMode osViModeMpalLan1; +extern __OSViContext vi[2]; +extern __OSViContext *__osViCurr; +extern __OSViContext *__osViNext; +extern s32 osViClock; + +void __osViInit(void) { + bzero(vi, sizeof(vi)); + __osViCurr = &vi[0]; + __osViNext = &vi[1]; + __osViNext->retraceCount = 1; + __osViCurr->retraceCount = 1; + if (osTvType == OS_TV_TYPE_PAL) { + __osViNext->modep = &osViModePalLan1; + osViClock = VI_PAL_CLOCK; + } else if (osTvType == OS_TV_TYPE_MPAL) { + __osViNext->modep = &osViModeMpalLan1; + osViClock = VI_MPAL_CLOCK; + } else { + __osViNext->modep = &osViModeNtscLan1; + osViClock = VI_NTSC_CLOCK; + } + __osViNext->state = VI_STATE_BLACK; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + while (IO_READ(VI_CURRENT_REG) > 10); //wait for vsync? + IO_WRITE(VI_CONTROL_REG, 0); //pixel size blank (no data, no sync) + __osViSwapContext(); +} diff --git a/lib/src/os/vitbl.c b/lib/src/os/vitbl.c index a21a3f0c..421c33df 100644 --- a/lib/src/os/vitbl.c +++ b/lib/src/os/vitbl.c @@ -1571,29 +1571,114 @@ s32 D_800E46C0[20] = { 0x00000400, 0x002501FF, 0x000E0204, 0x00000002 }; -s32 D_800E4710[20] = { - 0x02000000, 0x0000311E, 0x00000140, 0x03E52239, - 0x0000020D, 0x00000C15, 0x0C150C15, 0x006C02EC, - 0x00000200, 0x00000000, 0x00000280, 0x00000400, - 0x002501FF, 0x000E0204, 0x00000002, 0x00000280, - 0x00000400, 0x002501FF, 0x000E0204, 0x00000002 -}; +OSViMode osViModeNtscLan1 = { + OS_VI_NTSC_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | 0x3000, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + {// fldRegs + { + //[0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }}}; -s32 D_800E4760[20] = { +s32 osViModePalLan1[20] = { 0x10000000, 0x0000311E, 0x00000140, 0x0404233A, 0x00000271, 0x00150C69, 0x0C6F0C6E, 0x00800300, 0x00000200, 0x00000000, 0x00000280, 0x00000400, 0x005F0239, 0x0009026B, 0x00000002, 0x00000280, 0x00000400, 0x005F0239, 0x0009026B, 0x00000002 }; +/* +//TODO: Figure out why this doesn't match from libreultra +OSViMode osViModePalLan1 = { + OS_VI_PAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | 0x3000, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + {// fldRegs + { + //[0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }}}; +*/ -s32 D_800E47B0[20] = { - 0x1E000000, 0x0000311E, 0x00000140, 0x04651E39, - 0x0000020D, 0x00040C11, 0x0C190C1A, 0x006C02EC, - 0x00000200, 0x00000000, 0x00000280, 0x00000400, - 0x002501FF, 0x000E0204, 0x00000002, 0x00000280, - 0x00000400, 0x002501FF, 0x000E0204, 0x00000002 -}; +OSViMode osViModeMpalLan1 = { + OS_VI_MPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | 0x3000, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + {// fldRegs + { + //[0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }}}; // This needs to be moved. u32 __osPiAccessQueueEnabled = 0; diff --git a/src/video.c b/src/video.c index 177b8bd4..2fc74ffa 100644 --- a/src/video.c +++ b/src/video.c @@ -161,11 +161,11 @@ void init_vi_settings(void) { break; case 3: stubbed_printf("640 by 240 Anti-aliased, Non interlaced.\n"); - tvViMode = &D_800E4710; + tvViMode = &osViModeNtscLan1; if (osTvType == TV_TYPE_PAL) { - tvViMode = &D_800E4760; + tvViMode = &osViModePalLan1; } else if (osTvType == TV_TYPE_MPAL) { - tvViMode = &D_800E47B0; + tvViMode = &osViModeMpalLan1; } memory_copy(tvViMode, &D_80126260, sizeof(OSViMode)); D_80126260.comRegs.width = 0x280; diff --git a/src/video.h b/src/video.h index 0d0dbcd8..1dbe52d2 100644 --- a/src/video.h +++ b/src/video.h @@ -38,7 +38,7 @@ extern u16 *gVideoDepthBuffer; extern s32 D_800DE774; extern s8 D_800DE778; -extern OSViMode D_800E4620, D_800E4670, D_800E46C0, D_800E4760, D_800E4710, D_800E47B0; +extern OSViMode D_800E4620, D_800E4670, D_800E46C0, osViModePalLan1, osViModeNtscLan1, osViModeMpalLan1; /* Size: 0x08 bytes */ typedef struct VideoModeResolution {