from dataclasses import dataclass import struct @dataclass class triangle_strip: mask: int shadow: int skip: int triangle_strip_start: int def __init__(self, value): assert (value >> 31) & 1 == 0, value self.mask = (value >> 25) & 0b111111 self.shadow = (value >> 24) & 0b1 self.skip = (value >> 21) & 0b111 self.triangle_strip_start = (value & 0x1fffff) << 2 @dataclass class triangle_array: number_of_triangles: int shadow: int skip: int triangle_array_start: int def __init__(self, value): assert (value >> 29) & 0b111 == 0b100, value self.number_of_triangles = (value >> 25) & 0b1111 self.shadow = (value >> 24) & 0b1 self.skip = (value >> 21) & 0b111 self.triangle_array_start = (value & 0x1fffff) << 2 @dataclass class quad_array: number_of_quads: int shadow: int skip: int quad_array_start: int def __init__(self, value): assert (value >> 29) & 0b111 == 0b101, value self.number_of_quads = (value >> 25) & 0b1111 self.shadow = (value >> 24) & 0b1 self.skip = (value >> 21) & 0b111 self.quad_array_start = (value & 0x1fffff) << 2 @dataclass class object_pointer_block_link: end_of_list: int next_pointer_block: int def __init__(self, value): assert (value >> 29) & 0b111 == 0b111, value assert (value >> 0) & 0b11 == 0b00, value self.end_of_list = (value >> 28) & 1 self.next_pointer_block = value & 0xffffff def decode_ol_entry(mem, offset): value, = struct.unpack("> 29) & 0b111 if selector == 0b111: return object_pointer_block_link(value) elif selector == 0b101: return quad_array(value) elif selector == 0b100: return triangle_array(value) elif (value >> 31) & 1 == 0: return triangle_strip(value) else: assert False, value