Reply 20 of 24, by Rav
aVd wrote on 2026-03-24, 13:06:Hi, @Rav,
I just found, that I have a motherboard with ALi M1489/87 (FinALi-486) chipset - DataExpert EXP8449 rev. 1.2. What can I do with your Universal Chipset Patcher?Thank you!
Well, I am not sure the current linked version of UCP work with 1489, as I look in the code and the version I have is pre-refactor.
That been said, I will refactor it so it compile with 1489 uncommented and post it here as the final release of UCP 1.x branch along with the source code.
As for what it can do, look at that code in this post (the // comments for each block).
I should have the final release in 24-48hr. Time to refactor that and also purge the crust that I added when I tried to do PCI Management Mode (it's 16 bits code and could not get it working using mixing with 32 bits asm code)...
As for UCP 2.0, it not a refactor, it's a full rebuild, in the form of a 32 bits dos application that is mainly menu driven ("slightly" inspired from Award bios). Chip maintenance in the new code is also a lot simpler
This is 1489 code I have to refactor
#include "chipsets/chipset.h"#include <stdio.h>#include <stdlib.h>void init_ali1489(void);void init_ali1489(void){// Chipset Namememcpy(chip_name, "ALI 1489/FINALi 486\0", sizeof("ALI 1489/FINALi 486\0"));// Portsindex_port = 0x0022;data_port = 0x0023;// Chipset Unlockunlock_reg = 0x03;unlock_value = 0xC5;// Hidden Refreshhr_reg = 0x12;hr_mask = 0x7F;memcpy(hr_text[0], "disabled\0", sizeof("disabled\0"));hr_opt[0] = 0x00;memcpy(hr_text[1], "enabled\0", sizeof("enabled\0"));hr_opt[1] = 0x80;// Hidden Refresh timehrtime_reg = 0x1A;hrtime_mask = 0x3F;memcpy(hrtime_text[0], "15us\0", sizeof("15us\0"));hrtime_opt[0] = 0x00;memcpy(hrtime_text[1], "30us\0", sizeof("30us\0"));hrtime_opt[1] = 0x40;memcpy(hrtime_text[2], "60us\0", sizeof("60us\0"));hrtime_opt[2] = 0x80;memcpy(hrtime_text[3], "120us\0", sizeof("120us\0"));hrtime_opt[3] = 0xC0;// Cycle Check Pointccp_reg = 0x15;ccp_mask = 0xCF;memcpy(ccp_text[1], "fast\0", sizeof("fast\0"));ccp_opt[1] = 0x00;memcpy(ccp_text[2], "normal\0", sizeof("normal\0"));ccp_opt[2] = 0x10;memcpy(ccp_text[3], "slow\0", sizeof("slow\0"));ccp_opt[3] = 0x20;// TODO: Add Master Cycle Check Point// Change cache mode to Write-Throughwt_reg = 0x16;wt_mask = 0xFB;wt_opt[0] = 0x00;// Change cache mode to Write-Backwb_reg = 0x16;wb_mask = 0xFB;wb_opt[0] = 0x04;// L2 8bit tag
l2tag_reg = 0x16;l2tag_mask = 0xF7;memcpy(l2tag_text[0], "7bit\0", sizeof("7bit\0"));l2tag_opt[0] = 0x00;memcpy(l2tag_text[1], "8bit(Force Dirty)\0", sizeof("8bit(Force Dirty)\0"));l2tag_opt[2] = 0x08;// L2 cache read wait statesl2r_reg = 0x16;l2r_mask = 0xDF;memcpy(l2r_text[0], "Fast\0", sizeof("Fast\0"));l2r_opt[0] = 0x00;memcpy(l2r_text[1], "Normal\0", sizeof("Normal\0"));l2r_opt[1] = 0x20;// L2 cache write wait statesl2w_reg = 0x19;l2w_mask = 0xEF;memcpy(l2w_text[0], "Fast\0", sizeof("Fast\0"));l2w_opt[0] = 0x00;memcpy(l2w_text[1], "Normal\0", sizeof("Normal\0"));l2w_opt[1] = 0x10;// hitmjhitmj_reg = 0x19;hitmj_mask = 0xFB;memcpy(hitmj_text[2], "2t\0", sizeof("2t\0"));hitmj_opt[2] = 0x00;memcpy(hitmj_text[3], "3t\0", sizeof("3t\0"));hitmj_opt[3] = 0x4;// EDO 2-1-1-1 timingedo2111_reg = 0x1A;edo2111_mask = 0xEF;memcpy(edo2111_text[0], "Disabled\0", sizeof("Disabled\0"));edo2111_opt[0] = 0x00;memcpy(edo2111_text[1], "Enabled\0", sizeof("Enabled\0"));edo2111_opt[1] = 0x10;// Memory Read Timingramr_reg = 0x1B;ramr_mask = 0xFC;memcpy(ramr_text[1], "fastest\0", sizeof("fastest\0"));ramr_opt[1] = 0x03;memcpy(ramr_text[2], "fast\0", sizeof("fast\0"));ramr_opt[2] = 0x02;memcpy(ramr_text[3], "slow\0", sizeof("slow\0"));ramr_opt[3] = 0x01;memcpy(ramr_text[4], "slowest\0", sizeof("slowest\0"));ramr_opt[4] = 0x00;// Memory Write Timingramw_reg = 0x1B;ramw_mask = 0xF3;memcpy(ramw_text[1], "fastest\0", sizeof("fastest\0"));ramw_opt[1] = 0x0C;memcpy(ramw_text[2], "fast\0", sizeof("fast\0"));ramw_opt[2] = 0x08;memcpy(ramw_text[3], "slow\0", sizeof("slow\0"));ramw_opt[3] = 0x04;memcpy(ramw_text[4], "slowest\0", sizeof("slowest\0"));ramw_opt[4] = 0x00;// ATBUS Divideratbus_reg = 0x29;atbus_mask = 0xF8;memcpy(atbus_text[0], "7.16Mhz\0", sizeof("7.16Mhz\0"));atbus_opt[0] = 0x00;memcpy(atbus_text[1], "CLK/3\0", sizeof("CLK/3\0"));atbus_opt[1] = 0x01;memcpy(atbus_text[2], "CLK/4\0", sizeof("CLK/4\0"));atbus_opt[2] = 0x02;memcpy(atbus_text[3], "CLK/5\0", sizeof("CLK/5\0"));atbus_opt[3] = 0x03;memcpy(atbus_text[4], "CLK/6\0", sizeof("CLK/6\0"));atbus_opt[4] = 0x04;memcpy(atbus_text[5], "CLK/8\0", sizeof("CLK/8\0"));atbus_opt[5] = 0x05;// ISA Command Wait timeisa16com_reg = 0x29;isa16com_mask = 0x9F;memcpy(isa16com_text[0], "0WS\0", sizeof("0WS\0"));isa16com_opt[0] = 0x00;memcpy(isa16com_text[1], "1WS\0", sizeof("1WS\0"));isa16com_opt[1] = 0x20;memcpy(isa16com_text[2], "2WS\0", sizeof("2WS\0"));isa16com_opt[2] = 0x40;memcpy(isa16com_text[3], "3WS\0", sizeof("3WS\0"));isa16com_opt[3] = 0x60;// IO Recoveryiore_reg = 0x2A;iore_mask = 0xFE;memcpy(iore_text[0], "Disabled\0", sizeof("Disabled\0"));iore_opt[0] = 0x00;memcpy(iore_text[1], "Enabled\0", sizeof("Enabled\0"));iore_opt[1] = 0x01;// IO Recovery Timeioretime_reg = 0x2A;ioretime_mask = 0xF1;memcpy(ioretime_text[0], "0us\0", sizeof("0us\0"));ioretime_opt[0] = 0x00;memcpy(ioretime_text[1], "0.5us\0", sizeof("0.5us\0"));ioretime_opt[1] = 0x02;memcpy(ioretime_text[2], "1us\0", sizeof("1us\0"));ioretime_opt[2] = 0x04;memcpy(ioretime_text[3], "1.5us\0", sizeof("1.5us\0"));ioretime_opt[3] = 0x06;memcpy(ioretime_text[4], "2us\0", sizeof("2us\0"));ioretime_opt[4] = 0x08;memcpy(ioretime_text[5], "2.5us\0", sizeof("2.5us\0"));ioretime_opt[5] = 0x0A;memcpy(ioretime_text[6], "3us\0", sizeof("3us\0"));ioretime_opt[6] = 0x0C;memcpy(ioretime_text[7], "3.5us\0", sizeof("3.5us\0"));ioretime_opt[7] = 0x0E;// Slow Refreshsl_reg = 0x2A;sl_mask = 0x9F;memcpy(sl_text[0], "15us\0", sizeof("15us\0"));sl_opt[0] = 0x00;memcpy(sl_text[1], "30us\0", sizeof("30us\0"));sl_opt[1] = 0x20;memcpy(sl_text[2], "60us\0", sizeof("60us\0"));sl_opt[2] = 0x40;memcpy(sl_text[3], "120us\0", sizeof("120us\0"));sl_opt[3] = 0x60;}
This is 1429 code that is current in the available build
#include "chipsets/chipset.h"#include "chipsets/ali1429.h"#include <stdio.h>#include <stdlib.h>void init_ali1429(void){int z = 0;// Chipset Namememcpy(chip_name, "ALI 1429/G\0", sizeof("ALI 1429/G\0"));// Portsindex_port = 0x0022;data_port = 0x0023;// Chipset Unlockunlock_reg = 0x03;unlock_value = 0xC5;// Memory Read Timingmemcpy(fnt_text[z], "Memory Read Timing\0", sizeof("Memory Read Timing\0"));memcpy(fnt_switch[z], "/ramr\0", sizeof("/ramr\0"));reg[z] = 0x16;mask[z] = 0xFC;memcpy(opt_text[z][1], "fastest\0", sizeof("fastest\0"));opt[z][1] = 0x03;memcpy(opt_text[z][2], "fast\0", sizeof("fast\0"));opt[z][2] = 0x02;memcpy(opt_text[z][3], "slow\0", sizeof("slow\0"));opt[z][3] = 0x01;memcpy(opt_text[z][4], "slowest\0", sizeof("slowest\0"));opt[z][4] = 0x00;z++;// Memory Write Timingmemcpy(fnt_text[z], "Memory Write Timing\0", sizeof("Memory Write Timing\0"));memcpy(fnt_switch[z], "/ramw\0", sizeof("/ramw\0"));reg[1] = 0x16;mask[1] = 0xF3;memcpy(opt_text[z][1], "fastest\0", sizeof("fastest\0"));opt[z][1] = 0x0C;memcpy(opt_text[z][2], "fast\0", sizeof("fast\0"));opt[z][2] = 0x08;memcpy(opt_text[z][3], "slow\0", sizeof("slow\0"));opt[z][3] = 0x04;memcpy(opt_text[z][4], "slowest\0", sizeof("slowest\0"));opt[z][4] = 0x00;z++;// L2 cache read wait statesmemcpy(fnt_text[z], "L2 cache read wait states\0", sizeof("L2 cache read wait states\0"));memcpy(fnt_switch[z], "/l2r\0", sizeof("/l2r\0"));reg[z] = 0x19;mask[z] = 0xBF;
memcpy(opt_text[z][0], "0 WS\0", sizeof("0 WS\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "1 WS\0", sizeof("1 WS\0"));opt[z][1] = 0x40;z++;// L2 cache write wait statesmemcpy(fnt_text[z], "L2 cache write wait states\0", sizeof("L2 cache write wait states\0"));memcpy(fnt_switch[z], "/l2w\0", sizeof("/l2w\0"));reg[z] = 0x19;mask[z] = 0xDF;memcpy(opt_text[z][0], "0 WS\0", sizeof("0 WS\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "1 WS\0", sizeof("1 WS\0"));opt[z][1] = 0x20;z++;// Hidden Refreshmemcpy(fnt_text[z], "Hidden Refresh\0", sizeof("Hidden Refresh\0"));memcpy(fnt_switch[z], "/hr\0", sizeof("/hr\0"));reg[z] = 0x12;mask[z] = 0xEF;memcpy(opt_text[z][0], "disabled\0", sizeof("disabled\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "enabled\0", sizeof("enabled\0"));opt[z][1] = 0x10;z++;// hitmjmemcpy(fnt_text[z], "HITMJ sampling rate\0", sizeof("HITMJ sampling rate\0"));memcpy(fnt_switch[z], "/hitmj\0", sizeof("/hitmj\0"));reg[z] = 0x17;mask[z] = 0xCF;memcpy(opt_text[z][2], "2t\0", sizeof("2t\0"));opt[z][2] = 0x00;memcpy(opt_text[z][3], "3t\0", sizeof("3t\0"));opt[z][3] = 0x10;memcpy(opt_text[z][4], "4t\0", sizeof("4t\0"));opt[z][4] = 0x20;memcpy(opt_text[z][5], "5t\0", sizeof("5t\0"));opt[z][5] = 0x30;z++;// Cycle Check Pointmemcpy(fnt_text[z], "Cycle Check Point\0", sizeof("Cycle Check Point\0"));memcpy(fnt_switch[z], "/ccp\0", sizeof("/ccp\0"));reg[z] = 0x17;mask[z] = 0xFC;memcpy(opt_text[z][1], "fast\0", sizeof("fast\0"));opt[z][1] = 0x01;memcpy(opt_text[z][2], "normal\0", sizeof("normal\0"));opt[z][2] = 0x02;memcpy(opt_text[z][3], "slow\0", sizeof("slow\0"));opt[z][3] = 0x03;z++;// RAS to CAS delaymemcpy(fnt_text[z], "RAS to CAS delay\0", sizeof("RAS to CAS delay\0"));memcpy(fnt_switch[z], "/rtc\0", sizeof("/rtc\0"));reg[z] = 0x1A;mask[z] = 0x3F;memcpy(opt_text[z][2], "2t\0", sizeof("2t\0"));opt[z][2] = 0x00;memcpy(opt_text[z][4], "4t\0", sizeof("4t\0"));opt[z][4] = 0x40;memcpy(opt_text[z][6], "6t\0", sizeof("6t\0"));opt[z][6] = 0x80;z++;// VESA Master Cycle ADSJmemcpy(fnt_text[z], "VESA Master Cycle ADSJ\0", sizeof("VESA Master Cycle ADSJ\0"));memcpy(fnt_switch[z], "/vesamcadsj\0", sizeof("/vesamcadsj\0"));reg[z] = 0x1E;mask[z] = 0xEF;memcpy(opt_text[z][0], "normal\0", sizeof("normal\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "delay\0", sizeof("delay\0"));opt[z][1] = 0x10;z++;// VESA L2 Cache Readmemcpy(fnt_text[z], "VESA L2 Cache Read wait\0", sizeof("VESA L2 Cache Read wait\0"));memcpy(fnt_switch[z], "/vesal2r\0", sizeof("/vesal2r\0"));reg[z] = 0x1E;mask[z] = 0xF7;memcpy(opt_text[z][0], "normal\0", sizeof("normal\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "long\0", sizeof("long\0"));opt[z][1] = 0x08;z++;// VESA L2 Cache Writememcpy(fnt_text[z], "VESA L2 Cache Write wait\0", sizeof("VESA L2 Cache Write wait\0"));memcpy(fnt_switch[z], "/vesal2w\0", sizeof("/vesal2w\0"));reg[z] = 0x1E;mask[z] = 0xFB;memcpy(opt_text[z][0], "normal\0", sizeof("normal\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "long\0", sizeof("long\0"));opt[z][1] = 0x04;z++;// ATBUS Dividermemcpy(fnt_text[z], "ATBUS Divider\0", sizeof("ATBUS Divider\0"));memcpy(fnt_switch[z], "/atbus\0", sizeof("/atbus\0"));reg[z] = 0x20;mask[z] = 0xF8;memcpy(opt_text[z][0], "7.19Mhz\0", sizeof("7.19Mhz\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "CLK/4\0", sizeof("CLK/4\0"));opt[z][1] = 0x01;memcpy(opt_text[z][2], "CLK/5\0", sizeof("CLK/5\0"));opt[z][2] = 0x02;memcpy(opt_text[z][3], "CLK/6\0", sizeof("CLK/6\0"));opt[z][3] = 0x03;memcpy(opt_text[z][4], "CLK/8\0", sizeof("CLK/8\0"));opt[z][4] = 0x04;memcpy(opt_text[z][5], "CLK/10\0", sizeof("CLK/10\0"));opt[z][5] = 0x05;memcpy(opt_text[z][6], "CLK/12\0", sizeof("CLK/12\0"));opt[z][6] = 0x06;z++;// Pooling Clockmemcpy(fnt_text[z], "Pooling Clock\0", sizeof("Pooling Clock\0"));memcpy(fnt_switch[z], "/pollclock\0", sizeof("/pollclock\0"));reg[z] = 0x20;mask[z] = 0x8F;memcpy(opt_text[z][0], "14.318Mhz\0", sizeof("14.318Mhz\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "CLK\0", sizeof("CLK\0"));opt[z][1] = 0x10;memcpy(opt_text[z][2], "CLK/2\0", sizeof("CLK/2\0"));opt[z][2] = 0x20;memcpy(opt_text[z][3], "CLK/3\0", sizeof("CLK/3\0"));opt[z][3] = 0x30;memcpy(opt_text[z][4], "CLK/4\0", sizeof("CLK/4\0"));opt[z][4] = 0x40;memcpy(opt_text[z][5], "28.636Mhz\0", sizeof("28.636Mhz\0"));opt[z][5] = 0x50;z++;// ISA Write Cyclememcpy(fnt_text[z], "ISA write cycle\0", sizeof("ISA write cycle\0"));memcpy(fnt_switch[z], "/isaws\0", sizeof("/isaws\0"));reg[z] = 0x22;mask[z] = 0xFB;memcpy(opt_text[z][0], "0 WS\0", sizeof("0 WS\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "1 WS\0", sizeof("1 WS\0"));opt[z][1] = 0x04;z++;// Onboard IO Recoverymemcpy(fnt_text[z], "Onboard IO Recovery\0", sizeof("Onboard IO Recovery\0"));memcpy(fnt_switch[z], "/oiore\0", sizeof("/oiore\0"));reg[z] = 0x22;mask[z] = 0xFD;memcpy(opt_text[z][0], "Disabled\0", sizeof("Disabled\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "Enabled\0", sizeof("Enabled\0"));opt[z][1] = 0x02;z++;// IO Recoverymemcpy(fnt_text[z], "IO Recovery\0", sizeof("IO Recovery\0"));memcpy(fnt_switch[z], "/iore\0", sizeof("/iore\0"));reg[z] = 0x22;mask[z] = 0xFE;memcpy(opt_text[z][0], "Disabled\0", sizeof("Disabled\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "Enabled\0", sizeof("Enabled\0"));opt[z][1] = 0x01;z++;// 32Bits ISA Wait Timememcpy(fnt_text[z], "32Bits ISA Wait Time\0", sizeof("32Bits ISA Wait Time\0"));memcpy(fnt_switch[z], "/isa32wt\0", sizeof("/isa32wt\0"));reg[z] = 0x25;mask[z] = 0x3F;memcpy(opt_text[z][2], "2t\0", sizeof("2t\0"));opt[z][2] = 0x00;memcpy(opt_text[z][4], "4t\0", sizeof("4t\0"));opt[z][4] = 0x40;memcpy(opt_text[z][6], "6t\0", sizeof("6t\0"));opt[z][6] = 0x80;memcpy(opt_text[z][8], "8t\0", sizeof("8t\0"));opt[z][8] = 0xC0;z++;// ISA Mem Command Wait Timememcpy(fnt_text[z], "16 bits ISA Memory Command Wait Time\0", sizeof("16 bits ISA memory Command Wait Time\0"));memcpy(fnt_switch[z], "/isa16wt\0", sizeof("/isa16wt\0"));reg[z] = 0x25;mask[z] = 0xF3;memcpy(opt_text[z][0], "0WS\0", sizeof("0WS\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "1WS\0", sizeof("1WS\0"));opt[z][1] = 0x04;memcpy(opt_text[z][2], "2WS\0", sizeof("2WS\0"));opt[z][2] = 0x08;memcpy(opt_text[z][3], "3WS\0", sizeof("3WS\0"));opt[z][3] = 0x0C;z++;// ISA Command Wait timememcpy(fnt_text[z], "16 bits ISA Command Wait time\0", sizeof("16 bits ISA Command Wait time\0"));memcpy(fnt_switch[z], "/isa16com\0", sizeof("/isa16com\0"));reg[z] = 0x25;mask[z] = 0xFC;memcpy(opt_text[z][0], "0WS\0", sizeof("0WS\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "1WS\0", sizeof("1WS\0"));opt[z][1] = 0x01;memcpy(opt_text[z][2], "2WS\0", sizeof("2WS\0"));opt[z][2] = 0x02;memcpy(opt_text[z][3], "3WS\0", sizeof("3WS\0"));opt[z][3] = 0x03;z++;// Slow Refreshmemcpy(fnt_text[z], "Slow Refresh\0", sizeof("Slow Refresh\0"));memcpy(fnt_switch[z], "/sl\0", sizeof("/sl\0"));reg[z] = 0x25;mask[z] = 0xCF;memcpy(opt_text[z][0], "Disabled\0", sizeof("Disabled\0"));opt[z][0] = 0x00;memcpy(opt_text[z][1], "30us\0", sizeof("30us\0"));opt[z][1] = 0x10;memcpy(opt_text[z][2], "60us\0", sizeof("60us\0"));opt[z][2] = 0x20;memcpy(opt_text[z][3], "120us\0", sizeof("120us\0"));opt[z][3] = 0x30;z++;// Change cache mode to Write-Throughwt_reg = 0x19;wt_mask = 0xF7;wt_opt[0] = 0x00;// Change cache mode to Write-Backwb_reg = 0x19;wb_mask = 0xF7;wb_opt[0] = 0x08;}