rem: uint16 ram_tab = init1 - 0x0010;
add: uint16 ram_tab = rom[offset + 24] + (rom[offset + 25] * 256);
context: static status_t pins3_5_read(uint8 *rom, uint32 offset){	uint16 init1 = rom[offset + 18] + (rom[offset + 19] * 256);	uint16 init2 = rom[offset + 20] + (rom[offset + 21] * 256);	uint16 init_size = rom[offset + 22] + (rom[offset + 23] * 256) + 1;	/* still confirm!! */	uint16 ram_tab = init1 - 0x0010;	/* fixme: PPC BIOSes (might) return NULL pointers for messages here */	char* signon_msg   = &(rom[(rom[offset + 30] + (rom[offset + 31] * 256))]);	char* vendor_name  = &(rom[(rom[offset + 46] + (rom[offset + 47] * 256))]);	char* product_name = &(rom[(rom[offset + 48] + (rom[offset + 49] * 256))]);	char* product_rev  = &(rom[(rom[offset + 50] + (rom[offset + 51] * 256))]);	LOG(8,("INFO: pre PINS 5.16 cmdlist 1: $%04x, 2: $%04x, max. size $%04x\n", init1, init2, init_size));	LOG(8,("INFO: signon msg:\n%s\n", signon_msg));	LOG(8,("INFO: vendor name: %s\n", vendor_name));	LOG(8,("INFO: product name: %s\n", product_name));	LOG(8,("INFO: product rev: %s\n", product_rev));	/* pins 5.06 and higher has VCO range info */	if (((rom[offset + 5]) == 5) && ((rom[offset + 6]) >= 0x06))	{		/* get PLL VCO range info */		uint32 fvco_max = *((uint32*)(&(rom[offset + 67])));		uint32 fvco_min = *((uint32*)(&(rom[offset + 71])));		LOG(8,("INFO: PLL VCO range is %dkHz - %dkHz\n", fvco_min, fvco_max));		/* modify presets to reflect card capability */		si->ps.min_system_vco = fvco_min / 1000;		si->ps.max_system_vco = fvco_max / 1000;		//fixme: enable and modify PLL code...		//si->ps.min_pixel_vco = fvco_min / 1000;		//si->ps.max_pixel_vco = fvco_max / 1000;		//si->ps.min_video_vco = fvco_min / 1000;		//si->ps.max_video_vco = fvco_max / 1000;	}	//fixme: add 'parsing scripts while not actually executing' as warmstart method,	//       instead of not parsing at all: this will update the driver's speeds	//       as below, while logging the scripts as well (for our learning pleasure :)	/* pins 5.16 and higher is more extensive, and works differently from before */	if (((rom[offset + 5]) == 5) && ((rom[offset + 6]) >= 0x10))	{		/* pins 5.16 and up have a more extensive command list table, and have more		 * commands to choose from as well. */		PinsTables tabs;		tabs.InitScriptTablePtr = rom[offset + 75] + (rom[offset + 76] * 256);		tabs.MacroIndexTablePtr = rom[offset + 77] + (rom[offset + 78] * 256);		tabs.MacroTablePtr = rom[offset + 79] + (rom[offset + 80] * 256);		tabs.ConditionTablePtr = rom[offset + 81] + (rom[offset + 82] * 256);		tabs.IOConditionTablePtr = rom[offset + 83] + (rom[offset + 84] * 256);		tabs.IOFlagConditionTablePtr = rom[offset + 85] + (rom[offset + 86] * 256);		tabs.InitFunctionTablePtr = rom[offset + 87] + (rom[offset + 88] * 256);		LOG(8,("INFO: PINS 5.16 and later cmdlist pointers:\n"));		LOG(8,("INFO: InitScriptTablePtr: $%04x\n", tabs.InitScriptTablePtr));		LOG(8,("INFO: MacroIndexTablePtr: $%04x\n", tabs.MacroIndexTablePtr));		LOG(8,("INFO: MacroTablePtr: $%04x\n", tabs.MacroTablePtr));		LOG(8,("INFO: ConditionTablePtr: $%04x\n", tabs.ConditionTablePtr));		LOG(8,("INFO: IOConditionTablePtr: $%04x\n", tabs.IOConditionTablePtr));		LOG(8,("INFO: IOFlagConditionTablePtr: $%04x\n", tabs.IOFlagConditionTablePtr));		LOG(8,("INFO: InitFunctionTablePtr: $%04x\n", tabs.InitFunctionTablePtr));		return coldstart_card_516_up(rom, tabs, ram_tab);	}	else	{		/* pre 'pins 5.16' still uses the 'old' method in which the command list		 * table always has two entries. */		return coldstart_card(rom, init1, init2, init_size, ram_tab);	}}