diff --git a/Makefile b/Makefile index d1db7aea8..58ba56576 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,7 @@ $(B_DIR)/lib/ultra/io/dpctr.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/sp.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/spsetpc.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/sptaskyielded.o: OPT_LVL := -O1 +$(B_DIR)/lib/ultra/io/vi.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/vigetcurrframebuf.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/vigetnextframebuf.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/visetevent.o: OPT_LVL := -O1 diff --git a/src/game/data/data_003dc0.c b/src/game/data/data_003dc0.c index f68974efe..fbb4c424f 100644 --- a/src/game/data/data_003dc0.c +++ b/src/game/data/data_003dc0.c @@ -2278,10 +2278,9 @@ u32 __osTimerList = (u32) &var8009c760; u32 var800608a4 = 0x00000000; u32 var800608a8 = 0x00000000; u32 var800608ac = 0x00000000; -__OSViContext var800608b0 = {0}; -__OSViContext var800608e0 = {0}; -__OSViContext *__osViCurr = &var800608b0; -__OSViContext *__osViNext = &var800608e0; +__OSViContext var800608b0[2] = {0}; +__OSViContext *__osViCurr = &var800608b0[0]; +__OSViContext *__osViNext = &var800608b0[1]; u32 var80060918 = 0x00000000; u32 var8006091c = 0x00000000; u32 __osPiAccessQueueEnabled = 0x00000000; @@ -2868,66 +2867,106 @@ u32 var80061230 = 0x03030303; u32 var80061234 = 0x00000000; u32 var80061238 = 0x00000000; u32 var8006123c = 0x00000000; -u32 var80061240 = 0x10000000; -u32 var80061244 = 0x0000311e; -u32 var80061248 = 0x00000140; -u32 var8006124c = 0x04541e3a; -u32 var80061250 = 0x00000271; -u32 var80061254 = 0x00170c69; -u32 var80061258 = 0x0c6f0c6d; -u32 var8006125c = 0x00800300; -u32 var80061260 = 0x00000200; -u32 var80061264 = 0x00000000; -u32 var80061268 = 0x00000280; -u32 var8006126c = 0x00000400; -u32 var80061270 = 0x005f0239; -u32 var80061274 = 0x0009026b; -u32 var80061278 = 0x00000002; -u32 var8006127c = 0x00000280; -u32 var80061280 = 0x00000400; -u32 var80061284 = 0x005f0239; -u32 var80061288 = 0x0009026b; -u32 var8006128c = 0x00000002; -u32 var80061290 = 0x1e000000; -u32 var80061294 = 0x0000311e; -u32 var80061298 = 0x00000140; -u32 var8006129c = 0x04651e39; -u32 var800612a0 = 0x0000020d; -u32 var800612a4 = 0x00040c11; -u32 var800612a8 = 0x0c190c1a; -u32 var800612ac = 0x006c02ec; -u32 var800612b0 = 0x00000200; -u32 var800612b4 = 0x00000000; -u32 var800612b8 = 0x00000280; -u32 var800612bc = 0x00000400; -u32 var800612c0 = 0x002501ff; -u32 var800612c4 = 0x000e0204; -u32 var800612c8 = 0x00000002; -u32 var800612cc = 0x00000280; -u32 var800612d0 = 0x00000400; -u32 var800612d4 = 0x002501ff; -u32 var800612d8 = 0x000e0204; -u32 var800612dc = 0x00000002; -u32 var800612e0 = 0x02000000; -u32 var800612e4 = 0x0000311e; -u32 var800612e8 = 0x00000140; -u32 var800612ec = 0x03e52239; -u32 var800612f0 = 0x0000020d; -u32 var800612f4 = 0x00000c15; -u32 var800612f8 = 0x0c150c15; -u32 var800612fc = 0x006c02ec; -u32 var80061300 = 0x00000200; -u32 var80061304 = 0x00000000; -u32 var80061308 = 0x00000280; -u32 var8006130c = 0x00000400; -u32 var80061310 = 0x002501ff; -u32 var80061314 = 0x000e0204; -u32 var80061318 = 0x00000002; -u32 var8006131c = 0x00000280; -u32 var80061320 = 0x00000400; -u32 var80061324 = 0x002501ff; -u32 var80061328 = 0x000e0204; -u32 var8006132c = 0x00000002; + +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 + }}}; + +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 + }}}; + +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 + }}}; + u32 var80061330 = 0x30313233; u32 var80061334 = 0x34353637; u32 var80061338 = 0x38396162; diff --git a/src/include/PR/libultra.h b/src/include/PR/libultra.h index f0dab415f..f1730bde4 100644 --- a/src/include/PR/libultra.h +++ b/src/include/PR/libultra.h @@ -1,13 +1,13 @@ #ifndef _LIBULTRA_H #define _LIBULTRA_H -#define TV_TYPE_NTSC 1 -#define TV_TYPE_PAL 0 -#define TV_TYPE_MPAL 2 +#define OS_TV_TYPE_PAL 0 +#define OS_TV_TYPE_NTSC 1 +#define OS_TV_TYPE_MPAL 2 #define RESET_TYPE_COLD_RESET 0 -#define RESET_TYPE_NMI 1 -#define RESET_TYPE_BOOT_DISK 2 +#define RESET_TYPE_NMI 1 +#define RESET_TYPE_BOOT_DISK 2 extern u32 osTvType; extern u32 osRomBase; diff --git a/src/include/PR/os_vi.h b/src/include/PR/os_vi.h index b4e627a78..abfb9ce80 100644 --- a/src/include/PR/os_vi.h +++ b/src/include/PR/os_vi.h @@ -69,6 +69,8 @@ #define OS_VI_UNK200 0x200 #define OS_VI_UNK100 0x100 +#define VI_STATE_BLACK 0x20 + #define VI_CTRL_ANTIALIAS_MODE_3 0x00300 /* Bit [9:8] anti-alias mode */ #define VI_CTRL_ANTIALIAS_MODE_2 0x00200 /* Bit [9:8] anti-alias mode */ #define VI_CTRL_ANTIALIAS_MODE_1 0x00100 /* Bit [9:8] anti-alias mode */ diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index 4b8c1e263..f445356b0 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -178,7 +178,7 @@ extern u32 var80060190; extern u32 var800601b0; extern u32 var80060340; extern u32 var80060368; -extern __OSViContext var800608b0; +extern __OSViContext var800608b0[2]; extern __OSViContext *__osViCurr; extern __OSViContext *__osViNext; extern u32 __osThreadTail; @@ -189,9 +189,9 @@ extern u32 var80060970; extern u32 var800609a0; extern u32 var800609c4; extern u32 var800611f0; -extern u32 var80061240; -extern u32 var80061290; -extern u32 var800612e0; +extern OSViMode osViModePalLan1; +extern OSViMode osViModeMpalLan1; +extern OSViMode osViModeNtscLan1; extern u32 var80061330; extern u32 var80061344; extern u32 var80061360; diff --git a/src/lib/main.c b/src/lib/main.c index 6cf5061f8..54644afb5 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -702,7 +702,7 @@ const char var70053aa0[] = " -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"; // } // // // Copy the texture to the framebuffer -// if (osTvType != TV_TYPE_PAL) { +// if (osTvType != OS_TV_TYPE_PAL) { // s32 fby = 0; // // for (y = 0; y < 48 * 507; y += 507) { @@ -746,7 +746,7 @@ const char var70053aa0[] = " -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"; // // Design the program to either go into an infinite loop or display a // // message indicating a system error. // // -// if (osTvType == TV_TYPE_PAL) { +// if (osTvType == OS_TV_TYPE_PAL) { // while (1); // } // diff --git a/src/lib/ultra/io/vi.c b/src/lib/ultra/io/vi.c index cc3411c5c..8398eedf6 100644 --- a/src/lib/ultra/io/vi.c +++ b/src/lib/ultra/io/vi.c @@ -1,90 +1,31 @@ #include +#include "game/data/data_000000.h" -GLOBAL_ASM( -glabel __osViInit -/* 49640: 27bdffe8 */ addiu $sp,$sp,-24 -/* 49644: afbf0014 */ sw $ra,0x14($sp) -/* 49648: 3c048006 */ lui $a0,%hi(var800608b0) -/* 4964c: 248408b0 */ addiu $a0,$a0,%lo(var800608b0) -/* 49650: 0c012c30 */ jal bzero -/* 49654: 24050060 */ addiu $a1,$zero,0x60 -/* 49658: 3c0e8006 */ lui $t6,%hi(var800608b0) -/* 4965c: 25ce08b0 */ addiu $t6,$t6,%lo(var800608b0) -/* 49660: 3c018006 */ lui $at,%hi(__osViCurr) -/* 49664: ac2e0910 */ sw $t6,%lo(__osViCurr)($at) -/* 49668: 3c018006 */ lui $at,%hi(__osViNext) -/* 4966c: 25cf0030 */ addiu $t7,$t6,0x30 -/* 49670: ac2f0914 */ sw $t7,%lo(__osViNext)($at) -/* 49674: 24180001 */ addiu $t8,$zero,0x1 -/* 49678: a5d80032 */ sh $t8,0x32($t6) -/* 4967c: 3c088006 */ lui $t0,%hi(__osViCurr) -/* 49680: 8d080910 */ lw $t0,%lo(__osViCurr)($t0) -/* 49684: 24190001 */ addiu $t9,$zero,0x1 -/* 49688: 3c0a8006 */ lui $t2,%hi(__osViNext) -/* 4968c: a5190002 */ sh $t9,0x2($t0) -/* 49690: 8d4a0914 */ lw $t2,%lo(__osViNext)($t2) -/* 49694: 3c098000 */ lui $t1,0x8000 -/* 49698: 3c0c8006 */ lui $t4,%hi(__osViCurr) -/* 4969c: ad490004 */ sw $t1,0x4($t2) -/* 496a0: 8d8c0910 */ lw $t4,%lo(__osViCurr)($t4) -/* 496a4: 3c0b8000 */ lui $t3,0x8000 -/* 496a8: 3c0d8000 */ lui $t5,0x8000 -/* 496ac: ad8b0004 */ sw $t3,0x4($t4) -/* 496b0: 8dad0300 */ lw $t5,0x300($t5) -/* 496b4: 15a00007 */ bnez $t5,.L000496d4 -/* 496b8: 00000000 */ nop -/* 496bc: 3c188006 */ lui $t8,%hi(__osViNext) -/* 496c0: 8f180914 */ lw $t8,%lo(__osViNext)($t8) -/* 496c4: 3c0f8006 */ lui $t7,%hi(var80061240) -/* 496c8: 25ef1240 */ addiu $t7,$t7,%lo(var80061240) -/* 496cc: 10000011 */ b .L00049714 -/* 496d0: af0f0008 */ sw $t7,0x8($t8) -.L000496d4: -/* 496d4: 3c0e8000 */ lui $t6,0x8000 -/* 496d8: 8dce0300 */ lw $t6,0x300($t6) -/* 496dc: 24010002 */ addiu $at,$zero,0x2 -/* 496e0: 15c10007 */ bne $t6,$at,.L00049700 -/* 496e4: 00000000 */ nop -/* 496e8: 3c088006 */ lui $t0,%hi(__osViNext) -/* 496ec: 8d080914 */ lw $t0,%lo(__osViNext)($t0) -/* 496f0: 3c198006 */ lui $t9,%hi(var80061290) -/* 496f4: 27391290 */ addiu $t9,$t9,%lo(var80061290) -/* 496f8: 10000006 */ b .L00049714 -/* 496fc: ad190008 */ sw $t9,0x8($t0) -.L00049700: -/* 49700: 3c0a8006 */ lui $t2,%hi(__osViNext) -/* 49704: 8d4a0914 */ lw $t2,%lo(__osViNext)($t2) -/* 49708: 3c098006 */ lui $t1,%hi(var800612e0) -/* 4970c: 252912e0 */ addiu $t1,$t1,%lo(var800612e0) -/* 49710: ad490008 */ sw $t1,0x8($t2) -.L00049714: -/* 49714: 3c0c8006 */ lui $t4,%hi(__osViNext) -/* 49718: 8d8c0914 */ lw $t4,%lo(__osViNext)($t4) -/* 4971c: 240b0020 */ addiu $t3,$zero,0x20 -/* 49720: 3c0d8006 */ lui $t5,%hi(__osViNext) -/* 49724: a58b0000 */ sh $t3,0x0($t4) -/* 49728: 8dad0914 */ lw $t5,%lo(__osViNext)($t5) -/* 4972c: 3c0ea440 */ lui $t6,0xa440 -/* 49730: 8daf0008 */ lw $t7,0x8($t5) -/* 49734: 8df80004 */ lw $t8,0x4($t7) -/* 49738: adb8000c */ sw $t8,0xc($t5) -/* 4973c: 8dd90010 */ lw $t9,0x10($t6) -/* 49740: 2f21000b */ sltiu $at,$t9,0xb -/* 49744: 14200006 */ bnez $at,.L00049760 -/* 49748: 00000000 */ nop -.L0004974c: -/* 4974c: 3c08a440 */ lui $t0,0xa440 -/* 49750: 8d090010 */ lw $t1,0x10($t0) -/* 49754: 2d21000b */ sltiu $at,$t1,0xb -/* 49758: 1020fffc */ beqz $at,.L0004974c -/* 4975c: 00000000 */ nop -.L00049760: -/* 49760: 3c0aa440 */ lui $t2,0xa440 -/* 49764: 0c0125e4 */ jal __osViSwapContext -/* 49768: ad400000 */ sw $zero,0x0($t2) -/* 4976c: 8fbf0014 */ lw $ra,0x14($sp) -/* 49770: 27bd0018 */ addiu $sp,$sp,0x18 -/* 49774: 03e00008 */ jr $ra -/* 49778: 00000000 */ nop -/* 4977c: 00000000 */ nop -); +void __osViInit(void) +{ + bzero(&var800608b0, sizeof(var800608b0)); + + __osViCurr = &var800608b0[0]; + __osViNext = &var800608b0[1]; + __osViNext->retraceCount = 1; + __osViCurr->retraceCount = 1; + __osViNext->framep = (void*)K0BASE; + __osViCurr->framep = (void*)K0BASE; + + if (osTvType == OS_TV_TYPE_PAL) { + __osViNext->modep = &osViModePalLan1; + } else if (osTvType == OS_TV_TYPE_MPAL) { + __osViNext->modep = &osViModeMpalLan1; + } else { + __osViNext->modep = &osViModeNtscLan1; + } + + __osViNext->state = VI_STATE_BLACK; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + + while (IO_READ(VI_CURRENT_REG) > 10); + + IO_WRITE(VI_CONTROL_REG, 0); + + __osViSwapContext(); +}