N64® Functions Menu

al - Audio Library Functions
gDP - DP GBI Macros
gdSP - General GBI Macros
gSP - SP GBI Macros
gt - Turbo Microcode RDP
gu - Graphics Utilities
Math - Math Functions
nuSys - NuSystem
os - N64 Operating System
sp - Sprite Library Functions
uh - Host to Target IO
64DD - N64 Disk Drive

Nintendo® Confidential

## osViSetMode

Syntax

    #include <ultra64.h> /* os.h
    */ void osViSetMode(OSViMode *mode);

Argument

- mode - VI mode

Return Value
None

Explanation
This function sets the display mode in the VI. The VI supports a total of 56 display modes. These break down into 14 NTSC modes, 14 PAL modes, 14 MPAL modes, and 14 full-screen display PAL (FPAL) modes. The attributes of each mode, such as interlace and non-interlace, 16-bit color pixels and 32-bit color pixels, low-resolution and high-resolution, etc., can be set. In addition, the resolution can be dropped or images can be rescaled in order to increase rendering speed.

The 56 modes are indicated by 5 switches, viz., high/low resolution, 16/32-bit color pixels, anti-aliasing/point sampling, filter/non-filter processing, and NTSC/PAL/MPAL/FPAL format. The defined symbol names for these modes are in <os.h>. For example, "OS_VI_NTSC_LPN1" indicates that low-resolution, point sampling, non-interlace, and 16-bit color pixels are supported, while "OS_VI_PAL_LPN1" indicates that the same content are supported in PAL format.

The last 4 characters of the symbol name (LPN1, etc.) comprise the following codes.

1st Character | H = High resolution
L = Low resolution
2nd Character | A = Anti-aliasing
P = Point sampling
3rd Character | Low resolution | N = Non-interlaced
F = Interlaced
High resolution | N = Normal interlaced
F = Deflickered interlaced
4th Character | 1 = 16-bit pixel size
2 = 32-bit pixel size

Of the possible combinations of the above codes, the following 14 modes are each supported in NTSC/PAL/FPAL/MPAL:

LPN1, LPF1, LAN1, LAF1, LPN2,
LPF2, LAN2, LAF2, HPN1, HPF1,
HAN1, HAF1, HPN2, HPF2

At low resolution (320 pixels x 240 lines in PAL/MPAL/NTSC modes, 320 pixels x 288 lines in FPAL mode), non-interlaced mode and interlaced mode can be selected. Non-interlaced mode repeats the same frame in each field (scan). In contrast, interlaced mode interpolates between adjacent lines. First, in the first field, the upper line is weighted 75% and the lower line is weighted 25%. Then, interpolation is performed in the next in the next field, by weighting the upper line 25% and weighting the lower line 75%. In this case, there is no flicker because there is not high blanking frequency.

At high resolution (640 pixels x 480 lines in PAL/MPAL/NTSC modes, 640 pixels x 576 lines in FPAL mode), normal interlaced mode and de-flickered interlaced mode can be selected.
In normal interlaced mode, only those data, which have been rendered for that field, are used in one field. While the current field is being displayed, the next field is being rendered, and since they have no effect on one another, there is no need to use a double-buffer. However, since it is high resolution, pixels, which are only displayed in one field, will flicker. On the other hand, in de-flickered interlaced mode, the lines are averaged and displayed to eliminate the high-frequency components. However, the data for both fields are required to display one field in this mode, double-buffer processing becomes necessary.

The register settings for these 56 modes are in the VI mode table osViModeTable, which is defined as an external variable. osViSetMode overwrites all VI registers with data referenced by mode (the pointer to osViModeTable) at the timing of the next vertical retrace. All previous settings (XY scale, gamma correction, etc.) will be reset.

The VI mode table is an array of 56 OSViMode structures, but each mode is individually defined in <os.h> as an external variable in the OS source file.

For instance, there are two ways, as shown below, to write it when registering NTSC, low-resolution, anti-aliasing, non-interlaced processing, and 16-bit mode in the VI.

osViSetMode(&osViModeNtscLan1);
or
osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);

Since the latter method is linked to data, which are not used, it uses a lot of memory. It is recommended that the former method be used.

* Please See "Reference (VI Mode Type List)" for the VI mode types.

Cautions
osViSetMode will return all of the settings for functions that are set by X/Y scale processing or osViSetSpecialFeatures (e.g., gamma correction) to their default values as defined in the VI mode table.

References VI Mode Type List

NTSC | OS_VI_NTSC_LPN1 | 0
OS_VI_NTSC_LPF1 | 1
OS_VI_NTSC_LAN1 | 2
OS_VI_NTSC_LAF1 | 3
OS_VI_NTSC_LPN2 | 4
OS_VI_NTSC_LPF2 | 5
OS_VI_NTSC_LAN2 | 6
OS_VI_NTSC_LAF2 | 7
OS_VI_NTSC_HPN1 | 8
OS_VI_NTSC_HPF1 | 9
OS_VI_NTSC_HAN1 | 10
OS_VI_NTSC_HAF1 | 11
OS_VI_NTSC_HPN2 | 12
OS_VI_NTSC_HPF2 | 13
PAL | OS_VI_PAL_LPN1 | 14
OS_VI_PAL_LPF1 | 15
OS_VI_PAL_LAN1 | 16
OS_VI_PAL_LAF1 | 17
OS_VI_PAL_LPN2 | 18
OS_VI_PAL_LPF2 | 19
OS_VI_PAL_LAN2 | 20
OS_VI_PAL_LAF2 | 21
OS_VI_PAL_HPN1 | 22
OS_VI_PAL_HPF1 | 23
OS_VI_PAL_HAN1 | 24
OS_VI_PAL_HAF1 | 25
OS_VI_PAL_HPN2 | 26
OS_VI_PAL_HPF2 | 27
MPAL (Mainly Brazil) | OS_VI_MPAL_LPN1 | 28
OS_VI_MPAL_LPF1 | 29
OS_VI_MPAL_LAN1 | 30
OS_VI_MPAL_LAF1 | 31
OS_VI_MPAL_LPN2 | 32
OS_VI_MPAL_LPF2 | 33
OS_VI_MPAL_LAN2 | 34
OS_VI_MPAL_LAF2 | 35
OS_VI_MPAL_HPN1 | 36
OS_VI_MPAL_HPF1 | 37
OS_VI_MPAL_HAN1 | 38
OS_VI_MPAL_HAF1 | 39
OS_VI_MPAL_HPN2 | 40
OS_VI_MPAL_HPF2 | 41
FPAL (Full-screen PAL) | OS_VI_FPAL_LPN1 | 42
OS_VI_FPAL_LPF1 | 43
OS_VI_FPAL_LAN1 | 44
OS_VI_FPAL_LAF1 | 45
OS_VI_FPAL_LPN2 | 46
OS_VI_FPAL_LPF2 | 47
OS_VI_FPAL_LAN2 | 48
OS_VI_FPAL_LAF2 | 49
OS_VI_FPAL_HPN1 | 50
OS_VI_FPAL_HPF1 | 51
OS_VI_FPAL_HAN1 | 52
OS_VI_FPAL_HAF1 | 53
OS_VI_FPAL_HPN2 | 54
OS_VI_FPAL_HPF2 | 55

Example

    //      Start VI manager & blackout
            osCreateViManager(OS_PRIORITY_VIMGR);
    #if (SCREEN_WD==320)&&(SCREEN_HT==240)     // Settings for low resolution
            osViSetMode(&osViModeNtscLan1);
    #elif (SCREEN_WD==640)&&(SCREEN_HT==480)   // Settings for high resolution
            osViSetMode(&osViModeNtscHaf1);
    #else
    #error  "Illegal Screen size"
    #endif
            osViBlack(TRUE);

See Also
osViGetCurrentMode
osViSetSpecialFeatures

Revision History
2/1/1999 Completely rewritten

Nintendo® Confidential Warning: all information in this document is confidential and covered by a non-disclosure agreement. You are responsible for keeping this information confidential and protected. Nintendo will vigorously enforce this responsibility.
Copyright © 1998
Nintendo of America Inc. All rights reserved
Nintendo and N64 are registered trademarks of Nintendo
Last updated March 1998