From b67d3f1be6f026a7f6facbfcc55495fc39b55b34 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 14 Sep 2025 18:43:37 -0500 Subject: [PATCH] add voodoo2_bits --- .gitignore | 2 + Makefile | 2 + render_voodoo2_csv.py | 122 ++++ voodoo2_bits.h | 461 +++++++++++++++ voodoo2_bits.ods | Bin 0 -> 37292 bytes voodoo2_bits.txt | 1314 +++++++++++++++++++++++++++++++++++++++++ voodoo2_bits_csv.py | 67 +++ 7 files changed, 1968 insertions(+) create mode 100644 Makefile create mode 100644 render_voodoo2_csv.py create mode 100644 voodoo2_bits.h create mode 100644 voodoo2_bits.ods create mode 100644 voodoo2_bits.txt create mode 100644 voodoo2_bits_csv.py diff --git a/.gitignore b/.gitignore index f8a518d..ac215f6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.~* +*.csv *.pyc __pycache__ *.gch diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6693a37 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +%.csv: %.ods + libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76,,,,true --outdir $(dir $@) $< diff --git a/render_voodoo2_csv.py b/render_voodoo2_csv.py new file mode 100644 index 0000000..63c759f --- /dev/null +++ b/render_voodoo2_csv.py @@ -0,0 +1,122 @@ +import csv +import sys +from dataclasses import dataclass +from generate import renderer + +@dataclass +class RegisterBitDef: + name: str + bits: tuple[int, int] + bit_prefix: str + bit_name: str + enum_name: str + enum_value: str + description: str + +def parse_bit(s): + if ':' in s: + a, b = s.split(':') + return int(a, 10), int(b, 10) + else: + return int(s, 10), int(s, 10) + +last_def = None + +def parse_value(s): + if not s: + return None + elif s.startswith("0x"): + return int(s.removeprefix("0x"), 16) + else: + return int(s.removeprefix("0x"), 10) + +def parse_csv_row(row): + global last_def + name, bits, bit_prefix, bit_name, enum_name, enum_value, description = row + if not name: + assert last_def is not None + assert not bits + assert not bit_prefix + assert not bit_name + assert enum_name + assert enum_value != '' + assert not description + + assert last_def.enum_name + assert last_def.enum_value is not None + + name = last_def.name + bits = last_def.bits + bit_prefix = last_def.bit_prefix + bit_name = last_def.bit_name + description = last_def.description + else: + bits = parse_bit(bits) + + assert name, name + assert bit_name, bit_name + if enum_name: + assert enum_value, (enum_name, enum_value) + assert description, description + + bit_def = RegisterBitDef( + name, + bits, + bit_prefix or None, + bit_name, + enum_name or None, + parse_value(enum_value), + description + ) + last_def = bit_def + return bit_def + +def filter_row(row): + if row == ['', '', '', '', '', '', '']: + return False + name, bits, bit_prefix, bit_name, enum_name, enum_value, description = row + return description != 'reserved' and (bit_name or enum_name) + +def bit_mask(d): + high, low = d.bits + return (1 << ((high - low) + 1)) - 1 + +def format_value(d): + if d.enum_name is not None: + assert d.enum_value is not None + assert d.enum_value <= bit_mask(d) + return f"({d.enum_value} << {d.bits[1]})" + elif bit_mask(d) == 1: + return f"(1 << {d.bits[1]})" + else: + return f"(((n) & {hex(bit_mask(d))}) << {d.bits[1]})" + +def format_macro(d): + macro = f"{d.name.upper()}" + if d.bit_prefix is not None: + macro += f"__{d.bit_prefix.upper()}" + macro += f"__{d.bit_name.upper()}" + if d.enum_name is not None: + macro += f"__{d.enum_name.upper()}" + elif bit_mask(d) != 1: + macro += "(n)" + return macro + +def format_def(d): + return f"#define {format_macro(d)} {format_value(d)}" + +def render_defs(defs): + last_name = None + for d in defs: + if last_name is not None and d.name != last_name: + yield "" + yield format_def(d) + last_name = d.name + +with open(sys.argv[1], 'r') as f: + reader = csv.reader(f) + defs = list(map(parse_csv_row, filter(filter_row, reader))) + +render, out = renderer() +render(render_defs(defs)) +sys.stdout.write(out.getvalue()) diff --git a/voodoo2_bits.h b/voodoo2_bits.h new file mode 100644 index 0000000..35fb075 --- /dev/null +++ b/voodoo2_bits.h @@ -0,0 +1,461 @@ +#define STATUS__PCI_FIFO_FREESPACE(n) (((n) & 0x3f) << 0) +#define STATUS__VERTICAL_RETRACE (1 << 6) +#define STATUS__CHUCK_BUSY (1 << 7) +#define STATUS__BRUCE_BUSY (1 << 8) +#define STATUS__GRAPHICS_BUSY (1 << 9) +#define STATUS__DISPLAYED_BUFFER(n) (((n) & 0x3) << 10) +#define STATUS__MEMORY_FIFO_FREESPACE(n) (((n) & 0xffff) << 12) +#define STATUS__SWAP_BUFFERS_PENDING(n) (((n) & 0x7) << 28) + +#define INTRCTRL__INTERRUPT_ENABLE__HORIZONTAL_SYNC_RISING_EDGE (1 << 0) +#define INTRCTRL__INTERRUPT_ENABLE__HORIZONTAL_SYNC_FALLING_EDGE (1 << 1) +#define INTRCTRL__INTERRUPT_ENABLE__VERTICAL_SYNC_RISING_EDGE (1 << 2) +#define INTRCTRL__INTERRUPT_ENABLE__VERTICAL_SYNC_FALLING_EDGE (1 << 3) +#define INTRCTRL__INTERRUPT_ENABLE__PCI_FIFO_FULL (1 << 4) +#define INTRCTRL__INTERRUPT_ENABLE__USER_INTERRUPT_COMMAND (1 << 5) +#define INTRCTRL__INTERRUPT_GENERATED__HORIZONTAL_SYNC_RISING_EDGE (1 << 6) +#define INTRCTRL__INTERRUPT_GENERATED__HORIZONTAL_SYNC_FALLING_EDGE (1 << 7) +#define INTRCTRL__INTERRUPT_GENERATED__VERTICAL_SYNC_RISING_EDGE (1 << 8) +#define INTRCTRL__INTERRUPT_GENERATED__VERTICAL_SYNC_FALLING_EDGE (1 << 9) +#define INTRCTRL__INTERRUPT_GENERATED__PCI_FIFO_FULL (1 << 10) +#define INTRCTRL__INTERRUPT_GENERATED__USER_INTERRUPT_COMMAND (1 << 11) +#define INTRCTRL__USER_INTERRUPT_COMMAND_TAG(n) (((n) & 0xff) << 12) +#define INTRCTRL__EXTERNAL_PIN_PCI_INTA (1 << 31) + +#define FBZCOLORPATH__RGB_SELECT__ITERATED_RGB (0 << 0) +#define FBZCOLORPATH__RGB_SELECT__BRUCE_COLOR_OUTPUT (1 << 0) +#define FBZCOLORPATH__RGB_SELECT__COLOR1_RGB (2 << 0) +#define FBZCOLORPATH__ALPHA_SELECT__ITERATED_A (0 << 2) +#define FBZCOLORPATH__ALPHA_SELECT__BRUCE_ALPHA_OUTPUT (1 << 2) +#define FBZCOLORPATH__ALPHA_SELECT__COLOR1_ALPHA (2 << 2) +#define FBZCOLORPATH__CC_LOCALSELECT__ITERATED_RGB (0 << 4) +#define FBZCOLORPATH__CC_LOCALSELECT__COLOR0_RGB (1 << 4) +#define FBZCOLORPATH__CCA_LOCALSELECT__ITERATED_ALPHA (0 << 5) +#define FBZCOLORPATH__CCA_LOCALSELECT__COLOR0_ALPHA (1 << 5) +#define FBZCOLORPATH__CCA_LOCALSELECT__CLAMPED_ITERATED (2 << 5) +#define FBZCOLORPATH__CCA_LOCALSELECT__CLAMPED_ITERATED_W (3 << 5) +#define FBZCOLORPATH__CC_LOCALSELECT_OVERRIDE (1 << 7) +#define FBZCOLORPATH__CC_ZERO_OTHER (1 << 8) +#define FBZCOLORPATH__CC_SUB_CLOCAL (1 << 9) +#define FBZCOLORPATH__CC_MSELECT__ZERO (0 << 10) +#define FBZCOLORPATH__CC_MSELECT__C_LOCAL (1 << 10) +#define FBZCOLORPATH__CC_MSELECT__A_OTHER (2 << 10) +#define FBZCOLORPATH__CC_MSELECT__A_LOCAL (3 << 10) +#define FBZCOLORPATH__CC_MSELECT__TEXTURE_ALPHA (4 << 10) +#define FBZCOLORPATH__CC_MSELECT__TEXTURE_RGB (5 << 10) +#define FBZCOLORPATH__CC_REVERSE_BLEND (1 << 13) +#define FBZCOLORPATH__CC_ADD_CLOCAL (1 << 14) +#define FBZCOLORPATH__CC_ADD_ALOCAL (1 << 15) +#define FBZCOLORPATH__CC_INVERT_OUTPUT (1 << 16) +#define FBZCOLORPATH__CCA_ZERO_OTHER (1 << 17) +#define FBZCOLORPATH__CCA_SUB_CLOCAL (1 << 18) +#define FBZCOLORPATH__CCA_MSELECT__ZERO (0 << 19) +#define FBZCOLORPATH__CCA_MSELECT__A_LOCAL (1 << 19) +#define FBZCOLORPATH__CCA_MSELECT__A_OTHER (2 << 19) +#define FBZCOLORPATH__CCA_MSELECT__TEXTURE_ALPHA (4 << 19) +#define FBZCOLORPATH__CCA_REVERSE_BLEND (1 << 22) +#define FBZCOLORPATH__CCA_ADD_CLOCAL (1 << 23) +#define FBZCOLORPATH__CCA_ADD_ALOCAL (1 << 24) +#define FBZCOLORPATH__CCA_INVERT_OUTPUT (1 << 25) +#define FBZCOLORPATH__PARAMETER_ADJUST (1 << 26) +#define FBZCOLORPATH__ENABLE_TEXTURE_MAPPING (1 << 27) +#define FBZCOLORPATH__ENABLE_RGBA_Z_W_CLAMPING (1 << 28) +#define FBZCOLORPATH__ENABLE_ANTI_ALIASING (1 << 29) + +#define FOGMODE__ENABLE_FOG (1 << 0) +#define FOGMODE__FOGADD (1 << 1) +#define FOGMODE__FOGMULT (1 << 2) +#define FOGMODE__FOGALPHA (1 << 3) +#define FOGMODE__FOGZ (1 << 4) +#define FOGMODE__FOGCONSTANT (1 << 5) +#define FOGMODE__FOGDITHER (1 << 6) +#define FOGMODE__FOGZONES (1 << 7) + +#define ALPHAMODE__ENABLE_ALPHA_FUNCTION (1 << 0) +#define ALPHAMODE__ALPHA_FUNCTION__NEVER (0 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__LESS_THAN (1 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__EQUAL (2 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__LESS_THAN_OR_EQUAL (3 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__GREATER_THAN (4 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__NOT_EQUAL (5 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__GREATER_THAN_OR_EQUAL (6 << 1) +#define ALPHAMODE__ALPHA_FUNCTION__ALWAYS (7 << 1) +#define ALPHAMODE__ENABLE_ALPHA_BLENDING (1 << 4) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__AZERO (0 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__ASRC_ALPHA (1 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__A_COLOR (2 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__ADST_ALPHA (3 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__AONE (4 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__AOMSRC_ALPHA (5 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__AOM_COLOR (6 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__AOMDST_ALPHA (7 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_RGB__ASATURATE (15 << 8) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__AZERO (0 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__ASRC_ALPHA (1 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__A_COLOR (2 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__ADST_ALPHA (3 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__AONE (4 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__AOMSRC_ALPHA (5 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__AOM_COLOR (6 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__AOMDST_ALPHA (7 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_RGB__ACOLORBEFOREFOG (15 << 12) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_ALPHA__AZERO (0 << 16) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__SOURCE_ALPHA__AONE (4 << 16) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_ALPHA__AZERO (0 << 20) +#define ALPHAMODE__ALPHA_BLENDING_FACTOR__DESTINATION_ALPHA__AONE (4 << 20) +#define ALPHAMODE__ALPHA_REFERENCE_VALUE(n) (((n) & 0xff) << 24) + +#define FBZMODE__ENABLE_CLIPPING_RECTANGLE (1 << 0) +#define FBZMODE__ENABLE_CHROMA_KEYING (1 << 1) +#define FBZMODE__ENABLE_STIPPLE_REGISTER_MASKING (1 << 2) +#define FBZMODE__FLOATING_POINT_DEPTH_BUFFER (1 << 3) +#define FBZMODE__ENABLE_DEPTH_BUFFERING (1 << 4) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__NEVER (0 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__LESS_THAN (1 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__EQUAL (2 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__LESS_THAN_OR_EQUAL (3 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__GREATER_THAN (4 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__NOT_EQUAL (5 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__GREATER_THAN_OR_EQUAL (6 << 5) +#define FBZMODE__DEPTH_BUFFER_FUNCTION__ALWAYS (7 << 5) +#define FBZMODE__ENABLE_DITHERING (1 << 8) +#define FBZMODE__RGB_BUFFER_WRITE_MASK (1 << 9) +#define FBZMODE__DEPTH_ALPHA_BUFFER_WRITE_MASK (1 << 10) +#define FBZMODE__DITHER_ALGORITHM (1 << 11) +#define FBZMODE__ENABLE_STIPPLE_PATTERN_MASKING (1 << 12) +#define FBZMODE__ENABLE_ALPHA_CHANNEL_MASK (1 << 13) +#define FBZMODE__DRAW_BUFFER__FRONT_BUFFER (0 << 14) +#define FBZMODE__DRAW_BUFFER__BACK_BUFFER (1 << 14) +#define FBZMODE__ENABLE_DEPTH_BIASING (1 << 16) +#define FBZMODE__RENDERING_COMMANDS_Y_ORIGIN (1 << 17) +#define FBZMODE__ENABLE_ALPHA_PLANES (1 << 18) +#define FBZMODE__ENABLE_ALPHA_BLENDING_DITHER_SUBTRACTION (1 << 19) +#define FBZMODE__DEPTH_BUFFER_SOURCE_COMPARE_SELECT (1 << 20) +#define FBZMODE__DEPTH_FLOAT_SELECT (1 << 21) + +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_FORMAT__RGB565 (0 << 0) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_FORMAT__XRGB1555 (1 << 0) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_FORMAT__ARGB1555 (2 << 0) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_FORMAT__RGB888 (4 << 0) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_FORMAT__ARGB8888 (5 << 0) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_BUFFER_SELECT__FRONT_BUFFER (0 << 4) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_BUFFER_SELECT__BACK_BUFFER (1 << 4) +#define LFBMODE__LINEAR_FRAME_BUFFER__READ_BUFFER_SELECT__FRONT_BUFFER (0 << 6) +#define LFBMODE__LINEAR_FRAME_BUFFER__READ_BUFFER_SELECT__BACK_BUFFER (1 << 6) +#define LFBMODE__LINEAR_FRAME_BUFFER__ENABLE_PIXEL_PIPELINE_WRITES (1 << 8) +#define LFBMODE__LINEAR_FRAME_BUFFER__RGBA_LANES__ARGB (0 << 9) +#define LFBMODE__LINEAR_FRAME_BUFFER__RGBA_LANES__ABGR (1 << 9) +#define LFBMODE__LINEAR_FRAME_BUFFER__RGBA_LANES__RGBA (2 << 9) +#define LFBMODE__LINEAR_FRAME_BUFFER__RGBA_LANES__BGRA (3 << 9) +#define LFBMODE__LINEAR_FRAME_BUFFER__WORD_SWAP_WRITES (1 << 11) +#define LFBMODE__LINEAR_FRAME_BUFFER__BYTE_SWIZZLE_WRITES (1 << 12) +#define LFBMODE__LINEAR_FRAME_BUFFER__Y_ORIGIN (1 << 13) +#define LFBMODE__LINEAR_FRAME_BUFFER__WRITE_ACCESS_W_SELECT (1 << 14) +#define LFBMODE__LINEAR_FRAME_BUFFER__WORD_SWAP_READS (1 << 15) +#define LFBMODE__LINEAR_FRAME_BUFFER__BYTE_SWIZZLE_READS (1 << 16) + +#define CLIPLEFTRIGHT__RIGHT(n) (((n) & 0xfff) << 0) +#define CLIPLEFTRIGHT__LEFT(n) (((n) & 0xfff) << 16) + +#define CLIPLOWYHIGHY__HIGH_Y(n) (((n) & 0xfff) << 0) +#define CLIPLOWYHIGHY__LOW_Y(n) (((n) & 0xfff) << 16) + +#define NOPCMD__CLEAR_REGISTERS (1 << 0) +#define NOPCMD__CLEAR_FBI_TRIANGLES_OUT (1 << 1) + +#define SWAPBUFFERCMD__SYNCHRONIZE_FRAME_BUFFER_SWAPPING_TO_VERTICAL_RETRACE (1 << 0) +#define SWAPBUFFERCMD__SWAP_BUFFER_INTERVAL(n) (((n) & 0xff) << 1) +#define SWAPBUFFERCMD__DISABLE_BUFFER_SWAPPING (1 << 9) + +#define FOGCOLOR__BLUE(n) (((n) & 0xff) << 0) +#define FOGCOLOR__GREEN(n) (((n) & 0xff) << 8) +#define FOGCOLOR__RED(n) (((n) & 0xff) << 16) + +#define ZACOLOR__DEPTH(n) (((n) & 0xffff) << 0) +#define ZACOLOR__ALPHA(n) (((n) & 0xff) << 24) + +#define CHROMAKEY__BLUE(n) (((n) & 0xff) << 0) +#define CHROMAKEY__GREEN(n) (((n) & 0xff) << 8) +#define CHROMAKEY__RED(n) (((n) & 0xff) << 16) + +#define CHROMARANGE__BLUE(n) (((n) & 0xff) << 0) +#define CHROMARANGE__GREEN(n) (((n) & 0xff) << 8) +#define CHROMARANGE__RED(n) (((n) & 0xff) << 16) +#define CHROMARANGE__BLUE_MODE__INCLUSIVE (0 << 24) +#define CHROMARANGE__BLUE_MODE__EXCLUSIVE (1 << 24) +#define CHROMARANGE__GREEN_MODE__INCLUSIVE (0 << 25) +#define CHROMARANGE__GREEN_MODE__EXCLUSIVE (1 << 25) +#define CHROMARANGE__RED_MODE__INCLUSIVE (0 << 26) +#define CHROMARANGE__RED_MODE__EXCLUSIVE (1 << 26) +#define CHROMARANGE__BLOCK_MODE__INTERSECTION (0 << 27) +#define CHROMARANGE__BLOCK_MODE__UNION (1 << 27) +#define CHROMARANGE__ENABLE (1 << 28) + +#define USERINTRCMD__GENERATE_USER_INTERRUPT (1 << 0) +#define USERINTRCMD__WAIT_FOR_INTERRUPT_GENERATED_BY_USER_INTERRUPT (1 << 1) +#define USERINTRCMD__USER_INTERRUPT_TAG(n) (((n) & 0xff) << 2) + +#define COLOR0__BLUE(n) (((n) & 0xff) << 0) +#define COLOR0__GREEN(n) (((n) & 0xff) << 8) +#define COLOR0__RED(n) (((n) & 0xff) << 16) +#define COLOR0__ALPHA(n) (((n) & 0xff) << 24) + +#define COLOR1__BLUE(n) (((n) & 0xff) << 0) +#define COLOR1__GREEN(n) (((n) & 0xff) << 8) +#define COLOR1__RED(n) (((n) & 0xff) << 16) +#define COLOR1__ALPHA(n) (((n) & 0xff) << 24) + +#define FBISWAPHISTORY__NUMBER_OF_VERTICAL_SYNCS(n) (((n) & 0xf) << 0) +#define FBISWAPHISTORY__FRAME_N_1(n) (((n) & 0xf) << 4) +#define FBISWAPHISTORY__FRAME_N_2(n) (((n) & 0xf) << 8) +#define FBISWAPHISTORY__FRAME_N_3(n) (((n) & 0xf) << 12) +#define FBISWAPHISTORY__FRAME_N_4(n) (((n) & 0xf) << 16) +#define FBISWAPHISTORY__FRAME_N_5(n) (((n) & 0xf) << 20) +#define FBISWAPHISTORY__FRAME_N_6(n) (((n) & 0xf) << 24) +#define FBISWAPHISTORY__FRAME_N_7(n) (((n) & 0xf) << 28) + +#define FOGTABLE__DELTA_FOG_BLENDING_FACTOR_2N(n) (((n) & 0xff) << 0) +#define FOGTABLE__FOG_BLENDING_FACTOR_2N(n) (((n) & 0xff) << 8) +#define FOGTABLE__DELTA_FOG_BLENDING_FACTOR_2N1(n) (((n) & 0xff) << 16) +#define FOGTABLE__FOG_BLENDING_FACTOR_2N1(n) (((n) & 0xff) << 24) + +#define VRETRACE__V_SYNC_OFF_COUNTER(n) (((n) & 0x1fff) << 0) + +#define HVRETRACE__V_SYNC_OFF_COUNTER(n) (((n) & 0x1fff) << 0) +#define HVRETRACE__H_RETRACE_COUNTER(n) (((n) & 0x7ff) << 16) + +#define HSYNC__H_SYNC_ON(n) (((n) & 0x1ff) << 0) +#define HSYNC__H_SYNC_OFF(n) (((n) & 0x7ff) << 16) + +#define VSYNC__V_SYNC_ON(n) (((n) & 0x1fff) << 0) +#define VSYNC__V_SYNC_OFF(n) (((n) & 0x1fff) << 16) + +#define VIDEODIMENSIONS__X_WIDTH(n) (((n) & 0x7ff) << 0) +#define VIDEODIMENSIONS__Y_HEIGHT(n) (((n) & 0x7ff) << 16) + +#define MAXRGBDELTA__BLUE(n) (((n) & 0xff) << 0) +#define MAXRGBDELTA__GREEN(n) (((n) & 0xff) << 8) +#define MAXRGBDELTA__RED(n) (((n) & 0xff) << 16) + +#define HBORDER__H_BACK_COLOR(n) (((n) & 0x1ff) << 0) +#define HBORDER__H_FRONT_COLOR(n) (((n) & 0x1ff) << 16) + +#define VBORDER__V_BACK_COLOR(n) (((n) & 0x1ff) << 0) +#define VBORDER__V_FRONT_COLOR(n) (((n) & 0x1ff) << 16) + +#define BORDERCOLOR__BLUE(n) (((n) & 0xff) << 0) +#define BORDERCOLOR__GREEN(n) (((n) & 0xff) << 8) +#define BORDERCOLOR__RED(n) (((n) & 0xff) << 16) + +#define FBIINIT0__VGA_PASSTHROUGH (1 << 0) +#define FBIINIT0__CHUCK_GRAPHICS_RESET (1 << 1) +#define FBIINIT0__CHUCK_FIFO_RESET (1 << 2) +#define FBIINIT0__BYTE_SWIZZLE_INCOMING_REGISTER_WRITES (1 << 3) +#define FBIINIT0__STALL_PCI_ENABLE_FOR_HIGH_WATER_MARK (1 << 4) +#define FBIINIT0__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(n) (((n) & 0x1f) << 6) +#define FBIINIT0__LINEAR_FRAME_BUFFER_ACCESSES_STORED_IN_MEMORY_FIFO (1 << 11) +#define FBIINIT0__TEXTURE_MEMORY_ACCESSES_STORED_IN_MEMORY_FIFO (1 << 12) +#define FBIINIT0__MEMORY_FIFO_ENABLE (1 << 13) +#define FBIINIT0__MEMORY_FIFO_HIGH_WATER_MARK(n) (((n) & 0x7ff) << 14) +#define FBIINIT0__MEMORY_FIFO_WRITE_BURST_HIGH_WATER_MARK(n) (((n) & 0x3f) << 25) + +#define FBIINIT1__PCI_DEVICE_FUNCTION_NUMBER (1 << 0) +#define FBIINIT1__WAIT_STATE_CYCLES_FOR_PCI_WRITE_ACCESSES (1 << 1) +#define FBIINIT1__ENABLE_LINEAR_FRAME_BUFFER_READS (1 << 3) +#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION(n) (((n) & 0xf) << 4) +#define FBIINIT1__VIDEO_TIMING_RESET (1 << 8) +#define FBIINIT1__SOFTWARE_OVERRIDE_OF_HSYNC_VSYNC (1 << 9) +#define FBIINIT1__SOFTWARE_OVERRIDE_HSYNC_VALUE (1 << 10) +#define FBIINIT1__SOFTWARE_OVERRIDE_VSYNC_VALUE (1 << 11) +#define FBIINIT1__SOFTWARE_BLANKING_ENABLE (1 << 12) +#define FBIINIT1__DRIVE_VIDEO_TIMING_DATA_OUTPUTS (1 << 13) +#define FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS (1 << 14) +#define FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS (1 << 15) +#define FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT (1 << 16) +#define FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT (1 << 17) +#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__NO_DELAY (0 << 18) +#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__4NS (1 << 18) +#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__6NS (2 << 18) +#define FBIINIT1__VID_CLK_2X_DELAY_SELECT__8NS (3 << 18) +#define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_SLAVE (0 << 20) +#define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X (1 << 20) +#define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL (2 << 20) +#define FBIINIT1__ENABLE_24_BITS_PER_PIXEL_VIDEO_OUTPUT (1 << 22) +#define FBIINIT1__ENABLE_SCAN_LINE_INTERLEAVING (1 << 23) +#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5 (1 << 24) +#define FBIINIT1__ENABLE_VIDEO_EDGE_DETECTION_FILTERING (1 << 25) +#define FBIINIT1__INVERT_VID_CLK_2X (1 << 26) +#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__NO_DELAY (0 << 27) +#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__4NS (1 << 27) +#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__6NS (2 << 27) +#define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__8NS (3 << 27) +#define FBIINIT1__VID_CLK_DELAY_SELECT__NO_DELAY (0 << 29) +#define FBIINIT1__VID_CLK_DELAY_SELECT__4NS (1 << 29) +#define FBIINIT1__VID_CLK_DELAY_SELECT__6NS (2 << 29) +#define FBIINIT1__VID_CLK_DELAY_SELECT__8NS (3 << 29) +#define FBIINIT1__DISABLE_FAST_READ_AHEAD_WRITE_TO_READ_AHEAD_READ_TURNAROUND (1 << 31) + +#define FBIINIT2__DISABLE_VIDEO_DITHER_SUBTRACTION (1 << 0) +#define FBIINIT2__DRAM_BANKING_CONFIGURATION (1 << 1) +#define FBIINIT2__TRIPLE_BUFFERING_ENABLE (1 << 4) +#define FBIINIT2__ENABLE_FAST_RAS_READ_CYCLES (1 << 5) +#define FBIINIT2__ENABLE_GENERATED_DRAM_OE_SIGNAL (1 << 6) +#define FBIINIT2__ENABLE_FAST_READ_AHEAD_WRITE_TURNAROUND (1 << 7) +#define FBIINIT2__ENABLE_PASS_THROUGH_DITHER_MODE (1 << 8) +#define FBIINIT2__SWAP_BUFFER_ALGORITHM__DAC_VSYNC (0 << 9) +#define FBIINIT2__SWAP_BUFFER_ALGORITHM__DAC_DATA (1 << 9) +#define FBIINIT2__SWAP_BUFFER_ALGORITHM__PCI_FIFO_STALL (2 << 9) +#define FBIINIT2__SWAP_BUFFER_ALGORITHM__SLI_SYNCIN_SYNCOUT (3 << 9) +#define FBIINIT2__VIDEO_BUFFER_OFFSET(n) (((n) & 0x1ff) << 11) +#define FBIINIT2__ENABLE_DRAM_BANKING (1 << 20) +#define FBIINIT2__ENABLE_DRAM_READ_AHEAD_FIFO (1 << 21) +#define FBIINIT2__REFRESH_ENABLE (1 << 22) +#define FBIINIT2__REFRESH_LOAD_VALUE(n) (((n) & 0x1ff) << 23) + +#define FBIINIT3__TRIANGLE_REGISTER_ADDRESS_REMAPPING (1 << 0) +#define FBIINIT3__VIDEO_FIFO_THRESHOLD(n) (((n) & 0x1f) << 1) +#define FBIINIT3__DISABLE_TEXTURE_MAPPING (1 << 6) +#define FBIINIT3__GENERIC_POWER_ON_STRAPPING_PINS(n) (((n) & 0x7) << 8) +#define FBIINIT3__VGA_PASS_RESET_VALUE (1 << 11) +#define FBIINIT3__HARDCODE_PCI_BASE_ADDRESS (1 << 12) +#define FBIINIT3__FBI_TO_TREX_BUS_CLOCK_DELAY_SELECTIONS(n) (((n) & 0xf) << 13) +#define FBIINIT3__TREX_TO_FBI_BUS_FIFO_THRESHOLD(n) (((n) & 0x1f) << 17) +#define FBIINIT3__Y_ORIGIN_SWAP_SUBTRACTION_VALUE(n) (((n) & 0x3ff) << 22) + +#define FBIINIT4__WAIT_STATE_CYCLES_FOR_PCI_READ_ACCESSES (1 << 0) +#define FBIINIT4__ENABLE_READ_AHEAD_LOGIC_FOR_LINEAR_FRAME_BUFFER_READS (1 << 1) +#define FBIINIT4__MEMORY_FIFO_LOW_WATER_MARK_FOR_PCI_FIFO(n) (((n) & 0x3f) << 2) +#define FBIINIT4__MEMORY_FIFO_ROW_START(n) (((n) & 0x3ff) << 8) +#define FBIINIT4__MEMORY_FIFO_ROW_ROLLOVER(n) (((n) & 0x3ff) << 18) +#define FBIINIT4__VIDEO_CLOCKING_DELAY_CONTROL(n) (((n) & 0x7) << 29) + +#define FBIINIT5__DISABLE_PCI_STOP_FUNCTIONALITY (1 << 0) +#define FBIINIT5__PCI_SLAVE_DEVICE_IS_66MHZ_CAPABLE (1 << 1) +#define FBIINIT5__DAC_DATA_OUTPUT_WIDTH (1 << 2) +#define FBIINIT5__DAC_DATA_OUTPUT_VALUE_GPIO_0 (1 << 3) +#define FBIINIT5__DAC_DATA_CONTROL_4 (1 << 4) +#define FBIINIT5__GENERIC_POWER_ON_STRAPPING_PINS(n) (((n) & 0xf) << 5) +#define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__2_COLOR_BUFFERS_1_AUX_BUFFER (0 << 9) +#define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__3_COLOR_BUFFERS_0_AUX_BUFFERS (1 << 9) +#define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__3_COLOR_BUFFERS_1_AUX_BUFFER (2 << 9) +#define FBIINIT5__DRIVE_VID_CLK_SLAVE_OUTPUT (1 << 11) +#define FBIINIT5__DRIVE_DAC_DATA_OUTPUT (1 << 12) +#define FBIINIT5__VIDEO_TIMING_VCLK_INPUT_SELECT (1 << 13) +#define FBIINIT5__MULTI_CVG_CONFIGURATION_DETECT (1 << 14) +#define FBIINIT5__SYNCHRONIZE_READS_FROM_HRETRACE_AND_VRETRACE (1 << 15) +#define FBIINIT5__HORIZONTAL_BORDER_COLOR_ENABLE_RIGHT_EDGE (1 << 16) +#define FBIINIT5__HORIZONTAL_BORDER_COLOR_ENABLE_LEFT_EDGE (1 << 17) +#define FBIINIT5__VERTICAL_BORDER_COLOR_ENABLE_BOTTOM_EDGE (1 << 18) +#define FBIINIT5__VERTICAL_BORDER_COLOR_ENABLE_TOP_EDGE (1 << 19) +#define FBIINIT5__SCAN_DOUBLE_VIDEO_OUT_IN_HORIZONTAL_DIMENSION (1 << 20) +#define FBIINIT5__SCAN_DOUBLE_VIDEO_OUT_IN_VERTICAL_DIMENSION (1 << 21) +#define FBIINIT5__ENABLE_GAMMA_CORRECTION_FOR_16_BIT_VIDEO_OUTPUT (1 << 22) +#define FBIINIT5__INVERT_DAC_HSYNC_OUTPUT_TO_DAC (1 << 23) +#define FBIINIT5__INVERT_DAC_VSYNC_OUTPUT_TO_DAC (1 << 24) +#define FBIINIT5__ENABLE_FULL_24_BIT_DAC_DATA_OUTPUT (1 << 25) +#define FBIINIT5__INTERLACED_VIDEO_OUTPUT (1 << 26) +#define FBIINIT5__DAC_DATA_CONTROL_27 (1 << 27) +#define FBIINIT5__TRIANGLE_RASTERIZATION_UNIT_MODE(n) (((n) & 0x3) << 30) + +#define FBIINIT6__VIDEO_WINDOW_ACTIVE_COUNTER(n) (((n) & 0x7) << 0) +#define FBIINIT6__VIDEO_WINDOW_DRAG_COUNTER(n) (((n) & 0x1f) << 3) +#define FBIINIT6__SCANLINE_INTERLEAVE_SYNC_MASTER (1 << 8) +#define FBIINIT6__DAC_DATA_OUTPUT_VALUE_GPIO_2(n) (((n) & 0x3) << 9) +#define FBIINIT6__DAC_DATA_OUTPUT_VALUE_GPIO_3(n) (((n) & 0x3) << 11) +#define FBIINIT6__SLI_SYNCIN_OUTPUT_VALUE(n) (((n) & 0x3) << 13) +#define FBIINIT6__SLI_SYNCOUT_OUTPUT_VALUE(n) (((n) & 0x3) << 15) +#define FBIINIT6__DAC_RD_OUTPUT_VALUE(n) (((n) & 0x3) << 17) +#define FBIINIT6__DAC_WR_OUTPUT_VALUE(n) (((n) & 0x3) << 19) +#define FBIINIT6__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(n) (((n) & 0x7f) << 21) +#define FBIINIT6__VGA_PASS_N_OUTPUT_VALUE(n) (((n) & 0x3) << 28) +#define FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION (1 << 30) + +#define FBIINIT7__CMDFIFO_ENABLE (1 << 8) +#define FBIINIT7__CMDFIFO_OFFSCREEN_MEMORY_STORE (1 << 9) +#define FBIINIT7__DISABLE_INTERNAL_CMDFIFO_HOLE_COUNTING_LOGIC (1 << 10) +#define FBIINIT7__CMDFIFO_READ_FETCH_THRESHOLD(n) (((n) & 0x1f) << 11) +#define FBIINIT7__SYNCHRONIZE_WRITES_TO_CMDFIFO_REGISTERS (1 << 16) +#define FBIINIT7__SYNCHRONIZE_READS_TO_CMDFIFO_REGISTERS (1 << 17) +#define FBIINIT7__RESET_PCI_PACKER (1 << 18) +#define FBIINIT7__ENABLE_CHROMAKEY_AND_CHROMARANGE_WRITES (1 << 19) +#define FBIINIT7__CMDFIFO_PCI_TIMEOUT_COUNTER_VALUE(n) (((n) & 0x7f) << 20) +#define FBIINIT7__ENABLE_BURSTING_OF_CONSECUTIVE_TEXTURE_MEMORY_WRITES (1 << 27) + +#define CMDFIFOBASEADDR__CMDFIFO_BASE_ADDRESS(n) (((n) & 0x3ff) << 0) +#define CMDFIFOBASEADDR__CMDFIFO_END_ADDRESS(n) (((n) & 0x3ff) << 16) + +#define CLUTDATA__BLUE(n) (((n) & 0xff) << 0) +#define CLUTDATA__GREEN(n) (((n) & 0xff) << 8) +#define CLUTDATA__RED(n) (((n) & 0xff) << 16) +#define CLUTDATA__INDEX(n) (((n) & 0x3f) << 24) + +#define DACDATA__WRITE_DATA(n) (((n) & 0xff) << 0) +#define DACDATA__ADDRESS_2_0(n) (((n) & 0x7) << 8) +#define DACDATA__READ_COMMAND (1 << 11) +#define DACDATA__ADDRESS_4_3(n) (((n) & 0x3) << 12) + +#define SSETUPMODE__SETUP_RED_GREEN_BLUE (1 << 0) +#define SSETUPMODE__SETUP_ALPHA (1 << 1) +#define SSETUPMODE__SETUP_Z (1 << 2) +#define SSETUPMODE__SETUP_WB (1 << 3) +#define SSETUPMODE__SETUP_W0 (1 << 4) +#define SSETUPMODE__SETUP_S0_AND_T0 (1 << 5) +#define SSETUPMODE__SETUP_W1 (1 << 6) +#define SSETUPMODE__SETUP_S1_AND_T1 (1 << 7) +#define SSETUPMODE__STRIP_MODE (1 << 16) +#define SSETUPMODE__ENABLE_CULLING (1 << 17) +#define SSETUPMODE__CULLING_SIGN (1 << 18) +#define SSETUPMODE__DISABLE_PING_PONG_SIGN_CORRECTION (1 << 19) + +#define SARGB__ALPHA(n) (((n) & 0xff) << 24) +#define SARGB__RED(n) (((n) & 0xff) << 16) +#define SARGB__GREEN(n) (((n) & 0xff) << 8) +#define SARGB__BLUE(n) (((n) & 0xff) << 0) + +#define TEXTUREMODE__ENABLE_PERSPECTIVE_CORRECTION_FOR_S_AND_T (1 << 0) +#define TEXTUREMODE__TEXTURE_MINIFICATION_FILTER (1 << 1) +#define TEXTUREMODE__TEXTURE_MAGNIFICATION_FILTER (1 << 2) +#define TEXTUREMODE__CLAMP_WHEN_W_IS_NEGATIVE (1 << 3) +#define TEXTUREMODE__ENABLE_LEVEL_OF_DETAIL_DITHERING (1 << 4) +#define TEXTUREMODE__NARROW_CHANNEL_COMPRESSED (1 << 5) +#define TEXTUREMODE__CLAMP_S_ITERATOR (1 << 6) +#define TEXTUREMODE__CLAMP_T_ITERATOR (1 << 7) +#define TEXTUREMODE__TEXTURE_FORMAT(n) (((n) & 0xf) << 8) +#define TEXTUREMODE__TEXTURE_COLOR__ZERO_OTHER (1 << 12) +#define TEXTUREMODE__TEXTURE_COLOR__SUBTRACT_COLOR_LOCAL (1 << 13) +#define TEXTUREMODE__TEXTURE_COLOR__MUX_SELECT(n) (((n) & 0x7) << 14) +#define TEXTUREMODE__TEXTURE_COLOR__REVERSE_BLEND (1 << 17) +#define TEXTUREMODE__TEXTURE_COLOR__ADD_COLOR_LOCAL (1 << 18) +#define TEXTUREMODE__TEXTURE_COLOR__ADD_ALPHA_LOCAL (1 << 19) +#define TEXTUREMODE__TEXTURE_COLOR__INVERT_OUTPUT (1 << 20) +#define TEXTUREMODE__TEXTURE_ALPHA__ZERO_OTHER (1 << 21) +#define TEXTUREMODE__TEXTURE_ALPHA__SUBTRACT_COLOR_LOCAL (1 << 22) +#define TEXTUREMODE__TEXTURE_ALPHA__MUX_SELECT(n) (((n) & 0x7) << 23) +#define TEXTUREMODE__TEXTURE_ALPHA__REVERSE_BLEND (1 << 26) +#define TEXTUREMODE__TEXTURE_ALPHA__ADD_COLOR_LOCAL (1 << 27) +#define TEXTUREMODE__TEXTURE_ALPHA__ADD_ALPHA_LOCAL (1 << 28) +#define TEXTUREMODE__TEXTURE_ALPHA__INVERT_OUTPUT (1 << 29) +#define TEXTUREMODE__ENABLE_TRILINEAR_TEXTURE_MAPPING (1 << 30) +#define TEXTUREMODE__SEQUENTIAL_8_BIT_DOWNLOAD (1 << 31) + +#define TLOD__MINIMUM_LOD(n) (((n) & 0x3f) << 0) +#define TLOD__MAXIMUM_LOD(n) (((n) & 0x3f) << 6) +#define TLOD__LOD_BIAS(n) (((n) & 0x3f) << 12) +#define TLOD__LOD_ODD (1 << 18) +#define TLOD__TEXTURE_IS_SPLIT (1 << 19) +#define TLOD__S_DIMENSION_IS_WIDER (1 << 20) +#define TLOD__ASPECT_RATIO(n) (((n) & 0x3) << 21) +#define TLOD__LOD_ZERO_FRAC (1 << 23) +#define TLOD__USE_MULTIPLE_TEXBASEADDR_REGISTERS (1 << 24) +#define TLOD__BYTE_SWAP_INCOMING_TEXTURE_DATA (1 << 25) +#define TLOD__SHORT_SWAP_INCOMING_TEXTURE_DATA (1 << 26) +#define TLOD__ENABLE_RAW_DIRECT_TEXTURE_MEMORY_WRITES (1 << 27) + +#define TDETAIL__DETAIL_TEXTURE_LOD_CLAMP(n) (((n) & 0xff) << 0) +#define TDETAIL__DETAIL_TEXTURE_BIAS(n) (((n) & 0x3f) << 8) +#define TDETAIL__DETAIL_TEXTURE_SCALE_SHIFT_LEFT(n) (((n) & 0x7) << 14) +#define TDETAIL__RGB_TEXTURE_MINIFICATION_FILTER (1 << 17) +#define TDETAIL__RGB_TEXTURE_MAGNIFICATION_FILTER (1 << 18) +#define TDETAIL__ALPHA_TEXTURE_MINIFICATION_FILTER (1 << 19) +#define TDETAIL__ALPHA_TEXTURE_MAGNIFICATION_FILTER (1 << 20) +#define TDETAIL__TMINFILTER_AND_TMAGFILTER (1 << 21) diff --git a/voodoo2_bits.ods b/voodoo2_bits.ods new file mode 100644 index 0000000000000000000000000000000000000000..91f7abebb7c6ce946a0fa0c849ff9f0a50bb8503 GIT binary patch literal 37292 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 R+dDad50V)Kl8f8!{RMktG;RO@ literal 0 HcmV?d00001 diff --git a/voodoo2_bits.txt b/voodoo2_bits.txt new file mode 100644 index 0000000..3799159 --- /dev/null +++ b/voodoo2_bits.txt @@ -0,0 +1,1314 @@ +status +Bit +5:0 +6 +7 +8 +9 +11:10 +27:12 +30:28 +31 +Description +PCI FIFO freespace (0x3f=FIFO empty). Default is 0x3f. +Vertical retrace (0=Vertical retrace active, 1=Vertical retrace inactive). Default is 1. +Chuck graphics engine busy (0=engine idle, 1=engine busy). Default is 0. +Bruce busy (0=engine idle, 1=engine busy). Default is 0. +Voodoo2 Graphics busy (0=idle, 1=busy). Default is 0. +Displayed buffer (0=buffer 0, 1=buffer 1, 2=auxiliary buffer, 3=reserved). Default is 0. +Memory FIFO freespace (0xffff=FIFO empty). Default is 0xffff. +Swap Buffers Pending. Default is 0x0. +reserved + +intrCtrl +Bit +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +19:12 +30:20 +31 +Description +Horizontal Sync (rising edge) interrupts enable (1=enable). Default is 0. +Horizontal Sync (falling edge) interrupts enable (1=enable). Default is 0. +Vertical Sync (rising edge) interrupts enable (1=enable). Default is 0. +Vertical Sync (falling edge) interrupts enable (1=enable). Default is 0. +PCI FIFO Full interrupts enable (1=enable). Default is 0. +User Interrupt Command interrupts enable (1=enable). Default is 0. +Horizontal Sync (rising edge) interrupt generated (1=interrupt generated). +Horizontal Sync (falling edge) interrupt generated (1=interrupt generated). +Vertical Sync (rising edge) interrupt generated (1=interrupt generated). +Vertical Sync (falling edge) interrupt generated (1=interrupt generated). +PCI FIFO Full interrupt generated (1=interrupt generated). +User Interrupt Command interrupt generated (1=interrupt generated). +User Interrupt Command Tag. Read only. +reserved +External pin pci_inta value, active low (0=PCI interrupt is active, 1=PCI interrupt is inactive) + +vertexAx, vertexAy, vertexBx, vertexBy, vertexCx, vertexCy +Bit +15:0 +Description +Vertex coordinate information (fixed point two’s complement 12.4 format) + +fvertexAx, fvertexAy, fvertexBx, fvertexBy, fvertexCx, fvertexCy +Bit +31:0 +Description +Vertex coordinate information (IEEE 32-bit single-precision floating point format) + +startR, startG, startB, startA +Bit +23:0 +Description +Starting Vertex-A Color information (fixed point two’s complement 12.12 format) + +fstartR, fstartG, fstartB, fstartA +Bit +31:0 +Description +Starting Vertex-A Color information (IEEE 32-bit single-precision floating point format) + +startZ +Bit +31:0 +Description +Starting Vertex-A Z information (fixed point two’s complement 20.12 format) + +fstartZ +Bit +31:0 +Description +Starting Vertex-A Z information (IEEE 32-bit single-precision floating point format) + +startS, startT +Bit +31:0 +Description +Starting Vertex-A Texture coordinates (fixed point two’s complement 14.18 format) + +fstartS, fstartT +Bit +31:0 +Description +Starting Vertex-A Texture coordinates (IEEE 32-bit single-precision floating point format) + +startW +Bit +31:0 +Description +Starting Vertex-A W information (fixed point two’s complement 2.30 format) + +fstartW +Bit +31:0 +Description +Starting Vertex-A W information (IEEE 32-bit single-precision floating point format) + +dRdX, dGdX, dBdX, dAdX +Bit +23:0 +Description +Change in color with respect to X (fixed point two’s complement 12.12 format) + +fdRdX, fdGdX, fdBdX, fdAdX +Bit +31:0 +Description +Change in color with respect to X (IEEE 32-bit single-precision floating point format) + +dZdX +Bit +31:0 +Description +Change in Z with respect to X (fixed point two’s complement 20.12 format) + +fdZdX +Bit +31:0 +Description +Change in Z with respect to X (IEEE 32-bit single-precision floating point format) + +dSdX, dTdX +Bit +31:0 +Description +Change in S and T with respect to X (fixed point two’s complement 14.18 format) + +fdSdX, fdTdX +Bit +31:0 +Description +Change in Z with respect to X (IEEE 32-bit single-precision floating point format) + +dWdX +Bit +31:0 +Description +Change in W with respect to X (fixed point two’s complement 2.30 format) + +fdWdX +Bit +31:0 +Description +Change in W with respect to X (IEEE 32-bit single-precision floating point format) + +dRdY, dGdY, dBdY, dAdY +Bit +23:0 +Description +Change in color with respect to Y (fixed point two’s complement 12.12 format) + +fdRdY, fdGdY, fdBdY, fdAdY +Bit +31:0 +Description +Change in color with respect to Y (IEEE 32-bit single-precision floating point format) + +dZdY +Bit +31:0 +Description +Change in Z with respect to Y (fixed point two’s complement 20.12 format) + +fdZdY +Bit +31:0 +Description +Change in Z with respect to Y (IEEE 32-bit single-precision floating point format) + +dSdY, dTdY +Bit +31:0 +Description +Change in S and T with respect to Y (fixed point two’s complement 14.18 format) + +fdSdY, fdTdY +Bit +31:0 +Description +Change in Z with respect to Y (IEEE 32-bit single-precision floating point format) + +dWdY +Bit +31:0 +Description +Change in W with respect to Y (fixed point two’s complement 2.30 format) + +fdWdY +Bit +31:0 +Description +Change in W with respect to Y (IEEE 32-bit single-precision floating point format) + +triangleCMD +Bit +31 +Description +Sign of the area of the triangle to be rendered + +ftriangleCMD +Bit +31 +Description +Sign of the area of the triangle to be rendered (IEEE 32-bit single-precision floating point format) + +fbzColorPath +Bit +1:0 +3:2 +4 +6:5 +7 +8 +9 +12:10 +13 +14 +15 +16 +17 +18 +21:19 +22 +23 +24 +25 +26 +27 +28 +29 +Description +RGB Select (0=Iterated RGB, 1=Bruce Color Output, 2=Color1 RGB, 3=Reserved) +Alpha Select (0=Iterated A, 1=Bruce Alpha Output, 2=Color1 Alpha, 3=Reserved) +Color Combine Unit control (cc_localselect mux control: 0=iterated RGB, 1=Color0 RGB) +Alpha Combine Unit control (cca_localselect mux control: 0=iterated alpha, 1=Color0 alpha, 2=clamped iterated Z, 3=clamped iterated W) +Color Combine Unit control (cc_localselect_override mux control: 0=cc_localselect, 1=Texture alpha bit(7)) +Color Combine Unit control (cc_zero_other mux control: 0=c_other, 1=zero) +Color Combine Unit control (cc_sub_clocal mux control: 0=zero, 1=c_local) +Color Combine Unit control (cc_mselect mux control: 0=zero, 1=c_local, 2=a_other, 3=a_local, 4=texture alpha, 5=texture RGB, 6-7=reserved) +Color Combine Unit control (cc_reverse_blend control) +Color Combine Unit control (cc_add_clocal control) +Color Combine Unit control (cc_add_alocal control) +Color Combine Unit control (cc_invert_output control) +Alpha Combine Unit control (cca_zero_other mux control: 0=a_other, 1=zero) +Alpha Combine Unit control (cca_sub_clocal mux control: 0=zero, 1=a_local) +Alpha Combine Unit control (cca_mselect mux control: 0=zero, 1=a_local, 2=a_other, 3=a_local, 4=texture alpha, 5-7=reserved) +Alpha Combine Unit control (cca_reverse_blend control) +Alpha Combine Unit control (cca_add_clocal control) +Alpha Combine Unit control (cca_add_alocal control) +Alpha Combine Unit control (cca_invert_output control) +Parameter Adjust (1=adjust parameters for subpixel correction) +Enable Texture Mapping (1=enable) +Enable RGBA, Z, and W parameter clamping (1=enable) +Enable anti-aliasing (1=enable)* (not implemented in Alpha version) + +fogMode +Bit +0 +1 +2 +3 +4 +5 +6 +7 +Description +Enable fog (1=enable) +Fog Unit control (fogadd control: 0=fogColor, 1=zero) +Fog Unit control (fogmult control: 0=Color Combine Unit RGB, 1=zero) +Fog Unit control (fogalpha control) +Fog Unit control (fogz control) +Fog Unit control (fogconstant control: 0=fog multiplier output, 1=fogColor) +Fog Unit control (fogdither control, dither the fog blending component) +Fog Unit control (fogzones control, enable signed fog delta) + +alphaMode +Bit +0 +3:1 +4 +7:5 +11:8 +15:12 +19:16 +23:20 +31:24 +Description +Enable alpha function (1=enable) +Alpha function (see table below) +Enable alpha blending (1=enable) +reserved +Source RGB alpha blending factor (see table below) +Destination RGB alpha blending factor (see table below) +Source alpha-channel alpha blending factor (see table below) +Destination alpha-channel alpha blending factor (see table below) +Alpha reference value + +fbzMode +Bit +0 +1 +2 +3 +4 +7:5 +8 +9 +10 +11 +12 +13 +15:14 +16 +17 +18 +19 +20 +21 +Description +Enable clipping rectangle (1=enable) +Enable chroma-keying (1=enable) +Enable stipple register masking (1=enable) +Floating point depth buffer Select (0=Use integer Z-value for depth buffering, 1=Use floating point value for depth buffering [either Z or W, controlled by fbzMode bit(21)]) +Enable depth-buffering (1=enable) +Depth-buffer function (see table below) +Enable dithering (1=enable) +RGB buffer write mask (0=disable writes to RGB buffer) +Depth/alpha buffer write mask (0=disable writes to depth/alpha buffer) +Dither algorithm (0=4x4 ordered dither, 1=2x2 ordered dither) +Enable Stipple pattern masking (1=enable) +Enable Alpha-channel mask (1=enable alpha-channel masking) +Draw buffer (0=Front Buffer, 1=Back Buffer, 2-3=Reserved) +Enable depth-biasing (1=enable) +Rendering commands Y origin (0=top of screen is origin, 1=bottom of screen is origin) +Enable alpha planes (1=enable) +Enable alpha-blending dither subtraction (1=enable) +Depth buffer source compare select (0=normal operation, 1=zaColor[15:0]) +Depth float select (0=iterated W is used for floating point depth buffering, 1=iterated Z is used for floating point depth buffering) + +lfbMode +Bit +3:0 +5:4 +7:6 +8 +10:9 +11 +12 +13 +14 +15 +16 +Description +Linear frame buffer write format (see table below) +Linear frame buffer write buffer select (0=front buffer, 1=back buffer, 2-3=reserved). +Linear frame buffer read buffer select (0=front buffer, 1=back buffer, 2=depth/alpha buffer, 3=reserved). +Enable Voodoo2 Graphics pixel pipeline-processed linear frame buffer writes (1=enable) +Linear frame buffer RGBA lanes (see tables below) +16-bit word swap linear frame buffer writes (1=enable) +Byte swizzle linear frame buffer writes (1=enable) +LFB access Y origin (0=top of screen is origin, 1=bottom of screen is origin) +Linear frame buffer write access W select (0=LFB selected, 1=zacolor[15:0]). +16-bit word Swap linear frame buffer reads (1=enable) +Byte swizzle linear frame buffer reads (1=enable) + +clipLeftRight +Bit +11:0 +15:12 +27:16 +31:28 +Description +Unsigned integer specifying right clipping rectangle edge +reserved +Unsigned integer specifying left clipping rectangle edge +reserved + +clipLowYHighY Register +Bit +11:0 +15:12 +27:16 +31:28 +Description +Unsigned integer specifying high Y clipping rectangle edge +reserved +Unsigned integer specifying low Y clipping rectangle edge +reserved + +nopCMD +Bit +0 +1 +Description +Clear fbiPixelsIn, fbiChromaFail, fbiZfuncFail, fbiAfuncFail, and fbiPixelsOut registers (1=clear registers) +Clear fbiTrianglesOut register (1=clear register) + +swapbufferCMD +Bit +0 +8:1 +9 +Description +Synchronize frame buffer swapping to vertical retrace (1=enable) +Swap buffer interval +Disable buffer swapping (1=do not swap buffers) + +fogColor +Bit +7:0 +15:8 +23:16 +31:24 +Description +Fog Color Blue +Fog Color Green +Fog Color Red +reserved + +zaColor +Bit +15:0 +23:16 +31:24 +Description +Constant Depth +reserved +Constant Alpha + +chromaKey +Bit +7:0 +15:8 +23:16 +31:24 +Description +Chroma-key Blue +Chroma-key Green +Chroma-key Red +reserved + +chromaRange +Bit +7:0 +15:8 +23:16 +24 +25 +26 +27 +28 +31:29 +Description +Chroma-Range Blue Upper Limit +Chroma-Range Green Upper Limit +Chroma-Range Red Upper Limit +Chroma-Range Blue Mode (0=inclusive; 1=exclusive) +Chroma-Range Green Mode (0=inclusive; 1=exclusive) +Chroma-Range Red Mode (0=inclusive; 1=exclusive) +Chroma-Range Block Mode (0=intersection; 1=union) +Chroma-Range Enable (0=disable; 1=enable) +reserved + +userIntrCMD +Bit +0 +1 +9:2 +Description +Generate USERINTERRUPT interrupt (1=generate interrupt) +Wait for interrupt generated by USERINTERRUPT (visible in intrCtrl bit(11)) to be cleared before continuing (1=stall graphics engine until interrupt is cleared) +User interrupt Tag + +stipple +Bit +31:0 +Description +stipple value + +color0 +Bit +7:0 +15:8 +23:16 +31:24 +Description +Constant Color Blue +Constant Color Green +Constant Color Red +Constant Color Alpha + +color1 +Bit +7:0 +15:8 +23:16 +31:24 +Description +Constant Color Blue +Constant Color Green +Constant Color Red +Constant Color Alpha + +fbiTrianglesOut +Bit +23:0 +Description +Rendered triangles (total number of triangles rendered by the Voodoo2 Graphics triangle rendering engine) + +fbiPixelsIn +Bit +23:0 +Description +Pixel Counter (number of pixels processed by Voodoo2 Graphics triangle engine) + +fbiChromaFail +Bit +23:0 +Description +Pixel Counter (number of pixels failed chroma-key test) + +fbiZfuncFail +Bit +23:0 +Description +Pixel Counter (number of pixels failed Z test) + +fbiAfuncFail +Bit +23:0 +Description +Pixel Counter (number of pixels failed Alpha test) + +fbiPixelsOut +Bit +23:0 +Description +Pixel Counter (number of pixels drawn to color buffer) + +fbiSwapHistory +Bit +3:0 +7:4 +11:8 +15:12 +19:16 +23:20 +27:24 +31:28 +Description +Number of vertical syncs between the second most recently completed swap command and the most recently completed swap command, or the value 0xf, whichever is less for Frame N. +Vertical sync swapbuffer history for Frame N-1 +Vertical sync swapbuffer history for Frame N-2 +Vertical sync swapbuffer history for Frame N-3 +Vertical sync swapbuffer history for Frame N-4 +Vertical sync swapbuffer history for Frame N-5 +Vertical sync swapbuffer history for Frame N-6 +Vertical sync swapbuffer history for Frame N-7 + +fogTable +Bit +7:0 +15:8 +23:16 +31:24 +Description +FogTable[2n] ∆Fog blending factor +FogTable[2n] Fog blending factor +FogTable[2n+1] ∆Fog blending factor +FogTable[2n+1] Fog blending factor + +vRetrace +Bit +12:0 +Description +internal vSyncOff counter value (read only) + +hvRetrace +Bit +12:0 +15:13 +26:16 +Description +internal vSyncOff counter value (read only) +reserved +internal hRetrace counter value (read only) + +hSync +Bit +8:0 +15:7 +26:16 +Description +Horizontal sync on (internal hSyncOn register) +reserved +Horizontal sync off (internal hSyncOff register) + +vSync +Bit +12:0 +15:12 +28:16 +Description +Vertical sync on (internal vSyncOn register) +reserved +Vertical sync off (internal vSyncOff register) + +videoDimensions +Bit +10:0 +15:10 +26:16 +Description +X (width) dimension (internal xWidth register) +reserved +Y (height) dimension (internal yHeight register) + +maxRgbDelta +Bit +7:0 +15:8 +23:16 +Description +Maximum blue delta for video filtering +Maximum green delta for video filtering +Maximum red delta for video filtering + +hBorder +Bit +8:0 +15:7 +24:16 +Description +Horizontal backporch border color (internal hBackColor register) +reserved +Horizontal frontporch border color (internal hFrontColor register) + +vBorder +Bit +8:0 +15:7 +24:16 +Description +Vertical backporch border color (internal vBackColor register) +reserved +Vertical frontporch border color (internal vFrontColor register) + +borderColor +Bit +7:0 +15:8 +23:16 +Description +Video border color (blue) +Video border color (green) +Video border color (red) + +fbiInit0 +Bit +0 +1 +2 +3 +4 +5 +10:6 +11 +12 +13 +24:14 +30:25 +31 +Description +VGA passthrough (controls external pins vga_pass and vga_pass_n). Default value is the value of fb_addr_a[4] at the deassertion of pci_rst +Chuck Graphics Reset (0=run, 1=reset). Default is 0. +Chuck FIFO Reset (0=run, 1=reset). Default is 0. [resets PCI FIFO and the PCI data packer] +Byte swizzle incoming register writes (1=enable). [Register byte data is swizzled if fbiInit0[3]=1 and pci_address[20]=1]. Default is 0. +Stall PCI enable for High Water Mark (0=disable, 1=enable). Default is 1. +reserved +PCI FIFO Empty Entries Low Water Mark. Valid values are 0-31. Default is 0x10. +Linear frame buffer accesses stored in memory FIFO (1=enable). Default is 0. +Texture memory accesses stored in memory FIFO (1=enable). Default is 0. +Memory FIFO enable (0=disable, 1=enable). Default is 0. +Memory FIFO High Water Mark (bits [15:5]). Default is 0x0. +Memory FIFO Write Burst High Water Mark (Range 0-63 -- must be greater than fbiinit4[7:2]). Default is 0x0. +reserved + +fbiInit1 +Bit +0 +1 +2 +3 +7:4 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +19:18 +21:20 +22 +23 +24 +25 +26 +28:27 +30:29 +31 +Description +PCI Device Function Number (0=pass-thru Voodoo2 Graphics only, 1=combo board with VGA dev #0 and Voodoo2 Graphics dev#1). Default value is the value of fb_addr_a[3] at the deassertion of pci_rst. Read only. +Wait state cycles for PCI write accesses (0=no ws, 1=one ws). Default is 1. +Reserved. Hardwired to 0. Read only. (old multi-CVG configuration detect) +Enable linear frame buffer reads (1=enable). Default is 0. This bit is included so that Voodoo2 Graphics potentially won’t hang the system during random reads during powerup. +Number of 32x32 video tiles in X/Horizontal dimension (bits 4:1). Default is 0x0. The 6-bit number of tiles in the X dimension is formed by {fbiInit1[24], fbiInit1[7:4], fbiInit6[30]}. +Video Timing Reset (0=run, 1=reset). Default is 1. +Software override of HSYNC/VSYNC (0=normal operation, 1=software override). Default is 0. +Software override HSYNC value. Default is 0. +Software override VSYNC value. Default is 0. +Software blanking enable (0=normal operation, 1=Always blank monitor). Default is 1. +Drive video timing data outputs (0=tristate, 1=drive outputs). Default is 0. +Drive video timing blank output (0=tristate, 1=drive output). Default is 0. +Drive video timing hsync/vsync outputs (0=tristate, 1=drive outputs). Default is 0. +Drive video timing dclk output (0=tristate, 1=drive output). Default is 0. +Video timing vclk input select (0=vid_clk_2x, 1=vid_clk_slave, 2=dac_data[16]). Input select is {fbiInit5[13], fbiInit1[17]}. Default is 0. +Vid_clk_2x delay select (0=no delay, 1=4 ns, 2=6 ns, 3=8 ns). Default is 0. +Video timing vclk source select (0=vid_clk_slave, 1=vid_clk_2x [divided by 2], 2,3=vid_clk_2x_sel). Default is 2. +Enable 24 Bits-per-pixel video output (1=enable). Default is 0. +Enable scan-line interleaving (1=enable). Default is 0. +Number of 32x32 video tiles in X/Horizontal dimension (bit 5). Default is 0x0. The 6-bit number of tiles in the X dimension is formed by {fbiInit1[24], fbiInit1[7:4], fbiInit6[30]}. +Enable video edge detection filtering (1=enable). Default is 0. +Invert vid_clk_2x (0=pass-thru vid_clk_2x, 1=invert vid_clk_2x). Default is 0. +Vid_clk_2x_sel delay select (0=no delay, 1=4 ns, 2=6 ns, 3=8 ns). Default is 0. +Vid_clk delay select (0=no delay, 1=4 ns, 2=6 ns, 3=8 ns). Default is 0. +Disable fast Read-Ahead-Write to Read-Ahead-Read turnaround (1=disable). Default is 0. + +fbiInit2 +Bit +0 +1 +3:2 +4 +5 +6 +7 +8 +10:9 +19:11 +20 +21 +22 +31:23 +Description +Disable video dither subtraction (1=disable). Default is 0x0. +DRAM banking configuration (0=128Kx16 banking, 1=256Kx16 banking) +reserved +Triple Buffering Enable (1=enable). Default is 0x0. Bit included for binary compatibility with Voodoo Graphics only. Use fbiInit5[10:9] for buffer memory allocation. +Enable fast RAS read cycles [bring RAS high early on reads] (1=enable). Default is 0x0. +Enable generated dram OE signal (1=enable). Default is 0x1. +Enable fast Read-Ahead -Write turnaround [bit(6) must be set]. (1=enable). Default is 0x0. +Enable pass-through dither mode [For 8 BPP apps only] (1=enable). Default is 0x0. +Swap buffer algorithm (0=based on dac_vsync, 1=based on dac_data[0], 2=based on pci_fifo_stall, 3=based on sli_syncin/sli_syncout). Default is 0x0. +Video Buffer Offset (=150 for 640x480, =247 for 832x608). Default is 0x0. +Enable DRAM banking (1=enable). Default is 0. +Enable DRAM Read Ahead FIFO (1=enable). Default is 0x0. +Refresh Enable (0=disable, 1=enable). Default is 0. +Refresh_Load Value. (Internal 14-bit counter 5 LSBs are 0x0). Default is 0x100. + +fbiInit3 +Bit +0 +5:1 +6 +7 +10:8 +11 +12 +16:13 +21:17 +31:22 +Description +Triangle register address remapping (0=use normal register mapping, 1=use aliased register mapping). [Alternate register mapping is used when fbiInit3(0)=1 and pci_address[21]=1]. Default is 0x0. +Video FIFO threshold. Default is 0x0. +Disable Texture Mapping (0=normal, 1=disable Trex-to-Chuck Interface). Default is 0x0. +reserved +Generic power-on strapping pins. Default value is the value of fb_addr_a[2:0] at the deassertion of pci_rst. Read only +VGA_PASS reset value. Default value is the value of fb_addr_a[4] at the deassertion of pci_rst. Read only +Hardcode PCI base address 0x10000000 (1=enable, 0=normal operation). Default value is the value of fb_addr_a[5] at the deassertion of pci_rst +fbi-to-trex bus clock delay selections (0-15). Default is 0x2. +trex-to-fbi bus FIFO full threshold (0-31). Default is 0xf. +Y Origin Swap subtraction value (10 bits). Default is 0x0. + +fbiInit4 +Bit +0 +1 +7:2 +17:8 +27:18 +29 +31:29 +Description +Wait state cycles for PCI read accesses (0=1 ws, 1=2 ws). Default is 1. +Enable Read-ahead logic for linear frame buffer reads (1=enable). Default is 0. +Memory FIFO low water mark for PCI FIFO. [Dump PCI FIFO contents to memory if PCI FIFO freespace falls below this level]. Default is 0. +Memory FIFO row start (base row address for beginning of memory FIFO). Default is 0. +Memory FIFO row rollover (row value when FIFO counters rollover). Default is 0. +reserved +Video clocking delay control (Chuck revision 5 only). Default is 0. + +fbiInit5 +Bit +0 +1 +2 +3 +4 +8:5 +10:9 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +29:28 +31:30 +Description +Disable pci_stop functionality (0=normal operation, 1=disable pci_stop). Default value is the value of fb_addr_b[0] at the deassertion of pci_rst. +PCI Slave device is 66 MHz capable (0=33 MHz capable, 1=66 MHz capable). Default value is the value of fb_addr_b[1] at the deassertion of pci_rst. Read only. +dac_data output width (0=16-bit, 1=24-bit). Default value is the value of fb_addr_b[2] at the deassertion of pci_rst. Read only. +dac_data[17]/GPIO_0 output value (dac_data[17] is only driven when fb_addr_b[2]=0 at the deassertion of pci_rst). Default value is the value of fb_addr_b[3] at the deassertion of pci_rst. +dac_data[18]/GPIO_1 control. (dac_data[18] is only driven when fb_addr_b[2]=0 at the deassertion of pci_rst). GPIO_1 is controlled by fbiInit5[4] and fbiInit5[27]. When fbiInit5[27]=0, then GPIO_1 is driven with the input value of dac_data[23]/GPIO_3. When fbiInit5[27]=1, then GPIO_1 is driven with the value specified by fbiInit5[4]. Default value of fbiInit5[4] is the value of fb_addr_b[4] at the deassertion of pci_rst. +Generic power-on strapping pins. Default value is the value of fb_addr_b[8:5] at the deassertion of pci_rst. Read only +Color/Aux buffer memory allocation (0=2 color buffers/1 aux buffer, 1=3 color buffers/0 aux buffers, 2=3 color buffers/1 aux buffer, 3=reserved). Default is 0x0. +Drive vid_clk_slave output (0=tristate, 1=drive output). Default is 0. +Drive dac_data[16] output (0=tristate, 1=drive output). Do not set to 1 when 24-bit dac data output is enabled (fbiInit5[25]=1). +Video timing vclk input select (0=vid_clk_2x, 1=vid_clk_slave, 2=dac_data[16]). Input select is {fbiInit5[13], fbiInit1[17]}. Default is 0. +Multi-CVG configuration detect (0=one Voodoo2 Graphics configuration, 1=two Voodoo2 Graphics configuration). Default value is the value of sli_syncin at the deassertion of pci_rst. Read only. +Synchronize reads from hRetrace and vRetrace registers across video clock boundry (1=enable). Default is 0. +Horizontal border color enable, right edge (1=enable). Default is 0. +Horizontal border color enable, left edge (1=enable). Default is 0. +Vertical border color enable, bottom edge (1=enable). Default is 0. +Vertical border color enable, top edge (1=enable). Default is 0. +Scan double video out in horizontal dimension (1=enable). Default is 0. +Scan double video out in vertical dimension (1=enable). Default is 0. +Enable gamma correction for 16-bit video output (1=enable). Default is 0. +Invert dac_hsync output to dac (0= hsync is active low, 1=hsync is active high). Default is 0. +Invert dac_vsync output to dac (0= vsync is active low, 1=vsync is active high). Default is 0. +Enable full 24-bit dac_data[23:0] output (1=enable, 0=double-pump 24-bit data on dac_data[15:0]). Default is 0. +Interlaced video output (1=enable). Default is 0. +dac_data[18]/GPIO_1 control. (dac_data[18] is only driven when fb_addr_b[2]=0 at the deassertion of pci_rst). GPIO_1 is controlled by fbiInit5[4] and fbiInit5[27]. When fbiInit5[27]=0, then GPIO_1 is driven with the input value of dac_data[23]/GPIO_3. When fbiInit5[27]=1, then GPIO_1 is driven with the value specified by fbiInit5[4]. The default value of fbiInit5[27] is 0. +reserved. Default is 0x0. +Triangle rasterization unit mode control. Default is 0x0. + +fbiInit6 +Bit +2:0 +7:3 +8 +10:9 +12:11 +14:13 +16:15 +18:17 +20:19 +27:21 +29:28 +30 +31 +Description +Video window active counter. Used when swap algorithm is 0x1 or 0x2 (fbiInit2[10:9]=0x1 or 0x2). Default is 0x0. +Video window drag counter. Used when swap algorithm is 0x1 or 0x2 (fbiInit2[10:9]=0x1 or 0x2). Default is 0x0. +Scanline Interleave sync master (0=Slave, 1=Master). Used when swap algorithm is 0x3 (fbiInit2[10:9]=0x3). Default is 0x0. +dac_data[22]/GPIO_2 output value (0,1=tristate, 2=drive 0, 3=drive 1). dac_data[22] is only controlled by fbiInit6[10:9] when fb_addr_b[2]=0 at the deassertion of pci_rst. Default value is 0x0. Reading fbiInit6[10] or fbiInit6[9] returns the logic value present on the dac_data[22] signal pin. +dac_data[23]/GPIO_3 output value (0,1=tristate, 2=drive 0, 3=drive 1). dac_data[23] is only controlled by fbiInit6[12:11] when fb_addr_b[2]=0 at the deassertion of pci_rst. Default value is 0x0. Reading fbiInit6[12] or fbiInit6[11] returns the logic value present on the dac_data[23] signal pin. +sli_syncin output value (0,1=tristate, 2=drive 0, 3=drive 1). Default is 0x0. Reading fbiInit6[15] or fbiInit6[14] returns the logic value present on the sli_syncin signal pin. +sli_syncout output value (0=internal sli_syncout signal, 1=tristate, 2=drive 0, 3=drive 1). Default is 0x0. Reading fbiInit6[16] or fbiInit6[15] returns the logic value present on the sli_syncout signal pin. +dac_rd output value (0=internal dac_rd signal, 1=tristate, 2=drive 0, 3=drive 1). Default is 0x0. Reading fbiInit6[18] or fbiInit6[17] returns the logic value present on the dac_rd signal pin. +dac_wr output value (0=internal dac_wr signal, 1=tristate, 2=drive 0, 3=drive 1). Default is 0x0. Reading fbiInit6[20] or fbiInit6[19] returns the logic value present on the dac_wr signal pin. +PCI FIFO Empty Entries Low Water Mark used to generate pci_fifo_rdy_n (output on dac_data[21]). Valid values are 0-64. Default is 0x0. +vga_pass_n output value (0,1=internal vga_pass_n signal, 2=drive 0, 3=drive 1). Default is 0x0. vga_pass_n is only driven when fb_addr_b[2]=0 at the deassertion of pci_rst). +Number of 32x32 video tiles in the X/Horizontal dimension (bit 0). Default is 0x0. The 6-bit number of tiles in the X dimension is formed by {fbiInit1[24], fbiInit1[7:4], fbiInit6[30]}. +reserved + +fbiInit7 +Bit +7:0 +8 +9 +10 +15:11 +16 +17 +18 +19 +26:20 +27 +Description +Generic power-on strapping pins. Default value is the value of fb_data[63:56] at the deassertion of pci_rst. Read only +CMDFIFO enable (1=enable). Default is 0. Note: fbiinit7 bit(8) is mutually exclusive with fbiinit0 bit(13) (memory FIFO enable). +CMDFIFO offscreen memory store (0=execute CMDFIFO stream out of internal FIFOs only, 1=execute CMDFIFO using offscreen memory). Default is 0. +Disable internal CMDFIFO hole counting logic (1=disable). Default is 0. If set, requires software to manually “bump” the CMDFIFO depth with writes to the cmdFifoDepth register +CMDFIFO read fetch threshold (range 0-31). Default is 0. +Synchronize writes to CMDFIFO registers across graphics clock boundry (1=enable). Default is 0. +Synchronize reads from CMDFIFO registers across graphics clock boundry (1=enable). Default is 0. +Reset PCI packer (0=normal operation, 1=reset PCI packer). Default is 0. +Enable chromaKey and chromaRange writes to Bruce (1=enable). Default is 0. +CMDFIFO PCI timeout counter value (range 0-127). Default is 0x0. +Enable bursting of consecutive texture memory writes across FT Bus (1=enable). Default is 0. + +cmdFifoBaseAddr +Bit +9:0 +15:10 +25:16 +Description +CMDFIFO base address, specified in pages (row address). Default is 0x0. +reserved +CMDFIFO end address, specified in pages (row address). Default is 0x0. + +cmdFifoBump +Bit +15:0 +Description +Internal CMDFIFO bump register + +cmdFifoRdPtr +Bit +31:0 +Description +Internal CMDFIFO read pointer + +cmdFifoAMin +Bit +31:0 +Description +Internal CMDFIFO minimum address register + +cmdFifoAMax +Bit +31:0 +Description +Internal CMDFIFO maximum address register + +cmdFifoDepth +Bit +15:0 +Description +Internal CMDFIFO depth register + +cmdFifoHoles +Bit +15:0 +Description +Internal CMDFIFO number of holes register + +clutData +Bit +7:0 +15:8 +23:16 +29:24 +Description +Blue color component to be written to video Color Lookup Table +Green color component to be written to video Color Lookup Table +Red color component to be written to video Color Lookup Table +Index of video Color Lookup Table to be written (Range 0-32 only). + +dacData +Bit +7:0 +10:8 +11 +13:12 +Description +External DAC register write data +External DAC register address, bits(2:0) +External DAC read command (1=read external DAC, 0=write external DAC) +External DAC register address, bits(4:3) + +sSetupMode +Bit +0 +1 +2 +3 +4 +5 +6 +7 +15:8 +16 +17 +18 +19 +Description +Setup Red, Green, and Blue +Setup Alpha +Setup Z +Setup Wb +Setup W0 +Setup S0 and T0 +Setup W1 +Setup S1 and T1 +reserved +Strip mode (0=strip, 1=fan) +Enable Culling (0=disable, 1=enable) +Culling Sign (0=positive sign, 1=negative sign) +Disable ping pong sign correction during triangle strips (0=normal, 1=disable) + +sVx +Bit +31:0 +Description +Vertex coordinate information (IEEE 32 bit single-precision floating point format) + +sVy +Bit +31:0 +Description +Vertex coordinate information (IEEE 32 bit single-precision floating point format) + +sARGB +Bit +31:24 +23:16 +15:8 +7:0 +Description +Alpha Color +Red Color +Green Color +Blue Color + +sS/W0 +Bit +31:0 +Description +Texture S coordinate (IEEE 32 bit single-precision floating point format) + +sT/W0 +Bit +31:0 +Description +Texture T coordinate (IEEE 32 bit single-precision floating point format) + +sVz +Bit +31:0 +Description +Vertex coordinate information (IEEE 32 bit single-precision floating point format) + +sWtmu0 +Bit +31:0 +Description +Texture local 1/W. (IEEE 32 bit single-precision floating point format) + +sWtmu1 +Bit +31:0 +Description +Texture local 1/W. (IEEE 32 bit single-precision floating point format) + +sS/Wtmu1 +Bit +31:0 +Description +Texture local 1/W. (IEEE 32 bit single-precision floating point format) + +sT/Wtmu1 +Bit +31:0 +Description +Texture local 1/W. (IEEE 32 bit single-precision floating point format) + +sAlpha +Bit +31:0 +Description +Alpha value at vertex (0.0 - 255.0). (IEEE 32 bit single-precision floating point format) + +sRed +Bit +31:0 +Description +Red value at vertex (0.0 - 255.0). (IEEE 32 bit single-precision floating point format) + +sGreen +Bit +31:0 +Description +Green value at vertex (0.0 - 255.0). (IEEE 32 bit single-precision floating point format) + +sBlue +Bit +31:0 +Description +Blue value at vertex (0.0 - 255.0). (IEEE 32 bit single-precision floating point format) + +sDrawTriCMD +Bit +0 +Description +Draw triangle + +sBeginTriCMD +Bit +0 +Description +Begin New triangle + +textureMode +Bit +0 +1 +2 +3 +4 +5 +6 +7 +11:8 +12 +13 +16:14 +17 +18 +19 +20 +21 +22 +25:23 +26 +27 +28 +29 +30 +31 +Name +tpersp_st +tminfilter +tmagfilter +tclampw +tloddither +tnccselect +tclamps +tclampt +tformat +tc_zero_other +tc_sub_clocal +tc_mselect +tc_reverse_blend +tc_add_clocal +tc_add_alocal +tc_invert_output +tca_zero_other +tca_sub_clocal +tca_mselect +tca_reverse_blend +tca_add_clocal +tca_add_alocal +tca_invert_output +trilinear +seq_8_downld +Description +Enable perspective correction for S and T iterators (0=linear interploation of S,T, force W to 1.0, 1=perspective correct, S/W, T/W) +Texture minification filter (0=point-sampled, 1=bilinear) +Texture magnification filter (0=point-sampled, 1=bilinear) +Clamp when W is negative (0=disabled, 1=force S=0, T=0 when W is negative) +Enable Level-of-Detail dithering (0=no dither, 1=dither) +Narrow Channel Compressed (NCC) Table Select (0=table 0, 1=table 1) +Clamp S Iterator (0=wrap, 1=clamp) +Clamp T Iterator (0=wrap, 1=clamp) +Texture format (see table below) +Zero Other (0=c_other, 1=zero) +Subtract Color Local (0=zero, 1=c_local) +Mux Select (0=zero, 1=c_local, 2=a_other, 3=a_local, 4=LOD, 5=LOD_frac, 6-7=reserved) +Reverse Blend (0=normal blend, 1=reverse blend) +Add Color Local +Add Alpha Local +Invert Output +Zero Other (0=c_other, 1=zero) +Subtract Color Local (0=zero, 1=c_local) +Mux Select (0=zero, 1=c_local, 2=a_other, 3=a_local, 4=LOD, 5=LOD_frac, 6-7=reserved) +Reverse Blend (0=normal blend, 1=reverse blend) +Add Color Local +Add Alpha Local +Invert Output +Enable trilinear texture mapping (0=point-sampled/bilinear, 1=trilinear) +Sequential 8-bit download (0=even 32-bit word addresses, 1=sequential addresses) + +tLOD +Bit +5:0 +11:6 +17:12 +18 +19 +20 +22:21 +23 +24 +25 +26 +27 +Name +lodmin +lodmax +lodbias +lod_odd +lod_tsplit +lod_s_is_wider +lod_aspect +lod_zerofrac +tmultibaseaddr +tdata_swizzle +tdata_swap +tdirect_write +Description +Minimum LOD. (4.2 unsigned) +Maximum LOD. (4.2 unsigned) +LOD Bias. (4.2 signed) +LOD odd (0=even, 1=odd) +Texture is Split. (0=texture contains all LOD levels, 1=odd or even levels only, as controlled by lod_odd) +S dimension is wider, for rectilinear texture maps. This is a don’t care for square textures. (1=S is wider than T). +Aspect ratio. Equal to 2^n. (00 is square texture, others are rectilinear: 01 is 2x1/1x2, 10 is 4x1/1x4, 10 is 8x1/1x8) +LOD zero frac, useful for bilinear when even and odd levels are split across two Bruces (0=normal LOD frac, 1=force fraction to 0) +Use multiple texbaseAddr registers +Byte swap incoming texture data (bytes 0<->3, 1<->2). +Short swap incoming texture data (shorts 0<->1). +Enable raw direct texture memory writes (1=enable). seq_8_downld must equal 0. + +tDetail +Bit +7:0 +13:8 +16:14 +17 +18 +19 +20 +21 +Name +detail _max +detail_bias +detail_scale +rgb_tminfilter +rgb_tmagfilter +a_tminfilter +a_tmagfilter +rgb_a_separate_filter +Description +Detail texture LOD clamp (8.0 unsigned) +Detail texture bias (6.0 signed) +Detail texture scale shift left +RGB texture minification filter (0=point-sampled, 1=bilinear) +RGB texture magnification filter (0=point-sampled, 1=bilinear) +Alpha texture minification filter (0=point-sampled, 1=bilinear) +Alpha texture magnification filter (0=point-sampled, 1=bilinear) +0=tminfilter and tmagfilter (in textureMode) define the filter for RGBA 1=rgb_tminfilter/rgb_tmagfilter define the filter for RGB and a_tminfilter/a_tmagfilter define the filter for Alpha + +texBaseAddr, texBaseAddr1, texBaseAddr2, and texBaseAddr38 +Bit +18:0 +18:0 +18:0 +18:0 +Name +texbaseaddr +texbaseaddr1 +texbaseaddr2 +texbaseaddr38 +Description +Texture Memory Base Address, tmultibaseaddr==0 or LODBI==0 +Texture Memory Base Address, tmultibaseaddr==1 and LODBI==1 +Texture Memory Base Address, tmultibaseaddr==1 and LODBI==2 +Texture Memory Base Address, tmultibaseaddr==1 and LODBI>=3 diff --git a/voodoo2_bits_csv.py b/voodoo2_bits_csv.py new file mode 100644 index 0000000..fee296d --- /dev/null +++ b/voodoo2_bits_csv.py @@ -0,0 +1,67 @@ +import sys +import csv + +def next_l(it): + n = next(it) + while not n.strip(): + n = next(it) + return n.strip() + +def next_s(it): + n = next(it) + return n.strip() + +def parse_bit(s): + if ':' in s: + a, b = s.split(':') + return int(a, 10), int(b, 10) + else: + return int(s, 10) + +def parse(lines): + it = iter(lines) + + while True: + try: + name = next_l(it) + assert name not in {'Bit', 'Description'} + except StopIteration: + return + n = next_l(it) + assert n == 'Bit', n + bits = [] + n = next_s(it) + while n != 'Description' and n != 'Name': + bits.append(parse_bit(n)) + n = next_s(it) + names = [] + if n == 'Name': + n = next_s(it) + while n != 'Description': + names.append(n) + n = next_s(it) + assert n == 'Description' + descriptions = [] + n = next_s(it) + while n != '': + descriptions.append(n) + n = next_s(it) + assert len(descriptions) == len(bits), (descriptions, bits) + if names: + assert len(names) == len(bits), (names, bits) + yield name, bits, names, descriptions + +def generate_csv(parsed): + with open(sys.argv[2], 'w', newline='') as f: + writer = csv.writer(f) + for name, bits, _, descriptions in parsed: + for bit, description in zip(bits, descriptions): + bits = str(bit) if type(bit) is int else ':'.join(map(str, bit)) + writer.writerow([name, bits, description]) + writer.writerow([]) + +with open(sys.argv[1], 'r') as f: + buf = f.read() +lines = buf.split('\n') +#list(parse(lines)) +generate_csv(parse(lines))