From 0056860f6511544938234007d1fdafa82764e9a2 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Thu, 21 Oct 2021 20:08:32 -0400 Subject: [PATCH] Decomp some OSViMode structs --- include/PR/os_vi.h | 41 ++++++++----- lib/src/os/vitbl.c | 146 ++++++++++++++++++++++++++++++++++----------- src/video.c | 20 +++---- src/video.h | 2 +- 4 files changed, 147 insertions(+), 62 deletions(-) diff --git a/include/PR/os_vi.h b/include/PR/os_vi.h index a579248d..77d5e756 100644 --- a/include/PR/os_vi.h +++ b/include/PR/os_vi.h @@ -4,22 +4,33 @@ /* Ultra64 Video Interface */ -/* Special Features */ -#define OS_VI_GAMMA_ON 0x0001 -#define OS_VI_GAMMA_OFF 0x0002 -#define OS_VI_GAMMA_DITHER_ON 0x0004 -#define OS_VI_GAMMA_DITHER_OFF 0x0008 -#define OS_VI_DIVOT_ON 0x0010 -#define OS_VI_DIVOT_OFF 0x0020 -#define OS_VI_DITHER_FILTER_ON 0x0040 -#define OS_VI_DITHER_FILTER_OFF 0x0080 +/* + * Video Interface (VI) special features + */ +#define OS_VI_GAMMA_ON 0x0001 +#define OS_VI_GAMMA_OFF 0x0002 +#define OS_VI_GAMMA_DITHER_ON 0x0004 +#define OS_VI_GAMMA_DITHER_OFF 0x0008 +#define OS_VI_DIVOT_ON 0x0010 +#define OS_VI_DIVOT_OFF 0x0020 +#define OS_VI_DITHER_FILTER_ON 0x0040 +#define OS_VI_DITHER_FILTER_OFF 0x0080 -#define OS_VI_GAMMA 0x08 -#define OS_VI_GAMMA_DITHER 0x04 -#define OS_VI_DIVOT 0x10 -#define OS_VI_DITHER_FILTER 0x10000 -#define OS_VI_UNK200 0x200 -#define OS_VI_UNK100 0x100 +/* + * Video Interface (VI) mode attribute bit + */ +#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ +#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ +#define OS_VI_BIT_NORMALINTERLACE 0x0004 /* hi-res */ +#define OS_VI_BIT_DEFLICKINTERLACE 0x0008 /* hi-res */ +#define OS_VI_BIT_ANTIALIAS 0x0010 +#define OS_VI_BIT_POINTSAMPLE 0x0020 +#define OS_VI_BIT_16PIXEL 0x0040 +#define OS_VI_BIT_32PIXEL 0x0080 +#define OS_VI_BIT_LORES 0x0100 +#define OS_VI_BIT_HIRES 0x0200 +#define OS_VI_BIT_NTSC 0x0400 +#define OS_VI_BIT_PAL 0x0800 /* Types */ diff --git a/lib/src/os/vitbl.c b/lib/src/os/vitbl.c index 6b639fda..115c4f63 100644 --- a/lib/src/os/vitbl.c +++ b/lib/src/os/vitbl.c @@ -57,30 +57,30 @@ /* * Video Interface (VI) special features */ -#define OS_VI_GAMMA_ON 0x0001 -#define OS_VI_GAMMA_OFF 0x0002 +#define OS_VI_GAMMA_ON 0x0001 +#define OS_VI_GAMMA_OFF 0x0002 #define OS_VI_GAMMA_DITHER_ON 0x0004 #define OS_VI_GAMMA_DITHER_OFF 0x0008 -#define OS_VI_DIVOT_ON 0x0010 -#define OS_VI_DIVOT_OFF 0x0020 +#define OS_VI_DIVOT_ON 0x0010 +#define OS_VI_DIVOT_OFF 0x0020 #define OS_VI_DITHER_FILTER_ON 0x0040 #define OS_VI_DITHER_FILTER_OFF 0x0080 /* * Video Interface (VI) mode attribute bit */ -#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ -#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ +#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ +#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ #define OS_VI_BIT_NORMALINTERLACE 0x0004 /* hi-res */ #define OS_VI_BIT_DEFLICKINTERLACE 0x0008 /* hi-res */ -#define OS_VI_BIT_ANTIALIAS 0x0010 -#define OS_VI_BIT_POINTSAMPLE 0x0020 -#define OS_VI_BIT_16PIXEL 0x0040 -#define OS_VI_BIT_32PIXEL 0x0080 -#define OS_VI_BIT_LORES 0x0100 -#define OS_VI_BIT_HIRES 0x0200 -#define OS_VI_BIT_NTSC 0x0400 -#define OS_VI_BIT_PAL 0x0800 +#define OS_VI_BIT_ANTIALIAS 0x0010 +#define OS_VI_BIT_POINTSAMPLE 0x0020 +#define OS_VI_BIT_16PIXEL 0x0040 +#define OS_VI_BIT_32PIXEL 0x0080 +#define OS_VI_BIT_LORES 0x0100 +#define OS_VI_BIT_HIRES 0x0200 +#define OS_VI_BIT_NTSC 0x0400 +#define OS_VI_BIT_PAL 0x0800 OSViMode osViModeTable[42] = { {OS_VI_NTSC_LPN1, //type @@ -1546,30 +1546,104 @@ OSViMode osViModeTable[42] = { }}}, }; -// TODO: Convert the following arrays into OSViMode structs. -s32 D_800E4620[20] = { - 0x00000000, 0x0000320E, 0x00000140, 0x03E52239, - 0x0000020D, 0x00000C15, 0x0C150C15, 0x006C02EC, - 0x00000200, 0x00000000, 0x00000280, 0x00000400, - 0x002501FF, 0x000E0204, 0x00000002, 0x00000280, - 0x00000400, 0x002501FF, 0x000E0204, 0x00000002 -}; +OSViMode osViModeNtscLpn1 = { + OS_VI_NTSC_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_ANTIALIAS_MODE_2 | 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_800E4670[20] = { - 0x0E000000, 0x0000320E, 0x00000140, 0x0404233A, - 0x00000271, 0x00150C69, 0x0C6F0C6E, 0x00800300, - 0x00000200, 0x00000000, 0x00000280, 0x00000400, - 0x005F0239, 0x0009026B, 0x00000002, 0x00000280, - 0x00000400, 0x005F0239, 0x0009026B, 0x00000002 -}; +OSViMode osViModePalLpn1 = { + OS_VI_PAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_ANTIALIAS_MODE_2 | 0x3000, // ctrl + WIDTH(320), // width + BURST(58, 35, 4, 64), // burst + VSYNC(625), // vSync + HSYNC(3177, 21), // hSync + LEAP(3183, 3182), // 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_800E46C0[20] = { - 0x1C000000, 0x0000320E, 0x00000140, 0x04651E39, - 0x0000020D, 0x00040C11, 0x0C190C1A, 0x006C02EC, - 0x00000200, 0x00000000, 0x00000280, 0x00000400, - 0x002501FF, 0x000E0204, 0x00000002, 0x00000280, - 0x00000400, 0x002501FF, 0x000E0204, 0x00000002 -}; +OSViMode osViModeMpalLpn1 = { + OS_VI_MPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | + VI_CTRL_ANTIALIAS_MODE_2 | 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 diff --git a/src/video.c b/src/video.c index 2fc74ffa..4eb3c8d6 100644 --- a/src/video.c +++ b/src/video.c @@ -128,28 +128,28 @@ void init_vi_settings(void) { break; case 1: stubbed_printf("320 by 240 Anti-aliased, Non interlaced.\n"); - tvViMode = &D_800E4620; + tvViMode = &osViModeNtscLpn1; if (osTvType == TV_TYPE_PAL) { - tvViMode = &D_800E4670; + tvViMode = &osViModePalLpn1; } else if (osTvType == TV_TYPE_MPAL) { - tvViMode = &D_800E46C0; + tvViMode = &osViModeMpalLpn1; } memory_copy(tvViMode, &D_80126260, sizeof(OSViMode)); if (osTvType == TV_TYPE_PAL) { - D_80126260.fldRegs[0].vStart -= 0x180000; - D_80126260.fldRegs[1].vStart -= 0x180000; - D_80126260.fldRegs[0].vStart += 24; - D_80126260.fldRegs[1].vStart += 24; + D_80126260.fldRegs[0].vStart -= 0x180000; //0x18 << 16 + D_80126260.fldRegs[1].vStart -= 0x180000; //0x18 << 16 + D_80126260.fldRegs[0].vStart += 0x18; + D_80126260.fldRegs[1].vStart += 0x18; } osViSetMode(&D_80126260); break; case 2: stubbed_printf("640 by 240 Point sampled, Non interlaced.\n"); - tvViMode = &D_800E4620; + tvViMode = &osViModeNtscLpn1; if (osTvType == TV_TYPE_PAL) { - tvViMode = &D_800E4670; + tvViMode = &osViModePalLpn1; } else if (osTvType == TV_TYPE_MPAL) { - tvViMode = &D_800E46C0; + tvViMode = &osViModeMpalLpn1; } memory_copy(tvViMode, &D_80126260, sizeof(OSViMode)); diff --git a/src/video.h b/src/video.h index 1dbe52d2..d184cdbd 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, osViModePalLan1, osViModeNtscLan1, osViModeMpalLan1; +extern OSViMode osViModeNtscLpn1, osViModePalLpn1, osViModeMpalLpn1, osViModePalLan1, osViModeNtscLan1, osViModeMpalLan1; /* Size: 0x08 bytes */ typedef struct VideoModeResolution {