VOGONS


Reply 20 of 24, by Rav

User metadata
Rank Member
Rank
Member
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 Name
memcpy(chip_name, "ALI 1489/FINALi 486\0", sizeof("ALI 1489/FINALi 486\0"));

// Ports
index_port = 0x0022;
data_port = 0x0023;

// Chipset Unlock
unlock_reg = 0x03;
unlock_value = 0xC5;

// Hidden Refresh
hr_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 time
hrtime_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 Point
ccp_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-Through
wt_reg = 0x16;
wt_mask = 0xFB;
wt_opt[0] = 0x00;
// Change cache mode to Write-Back
wb_reg = 0x16;
wb_mask = 0xFB;
wb_opt[0] = 0x04;

// L2 8bit tag
Show last 136 lines
    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 states
l2r_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 states
l2w_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;

// hitmj
hitmj_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 timing
edo2111_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 Timing
ramr_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 Timing
ramw_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 Divider
atbus_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 time
isa16com_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 Recovery
iore_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 Time
ioretime_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 Refresh
sl_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 Name
memcpy(chip_name, "ALI 1429/G\0", sizeof("ALI 1429/G\0"));

// Ports
index_port = 0x0022;
data_port = 0x0023;

// Chipset Unlock
unlock_reg = 0x03;
unlock_value = 0xC5;

// Memory Read Timing
memcpy(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 Timing
memcpy(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 states
memcpy(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;
Show last 263 lines

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 states
memcpy(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 Refresh
memcpy(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++;

// hitmj
memcpy(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 Point
memcpy(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 delay
memcpy(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 ADSJ
memcpy(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 Read
memcpy(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 Write
memcpy(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 Divider
memcpy(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 Clock
memcpy(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 Cycle
memcpy(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 Recovery
memcpy(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 Recovery
memcpy(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 Time
memcpy(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 Time
memcpy(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 time
memcpy(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 Refresh
memcpy(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-Through
wt_reg = 0x19;
wt_mask = 0xF7;
wt_opt[0] = 0x00;
// Change cache mode to Write-Back
wb_reg = 0x19;
wb_mask = 0xF7;
wb_opt[0] = 0x08;
}

Reply 21 of 24, by Rav

User metadata
Rank Member
Rank
Member
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!

I have just updated the first post of the thread with the final release of the 1.x real mode branch, including source code.
It should now work properly with Ali 1489. As for the supported functions, you can see the screenshot.

The attachment ali1489.jpg is no longer available

Reply 22 of 24, by aVd

User metadata
Rank Member
Rank
Member

Ok, I got it. Seems like very handy tool for fine tuning of RAM, Cache and ISA settings.

Thank you very much for sharing the new real mode version with ALi M1489/87 chipset support and its source code, @Rav! I'll try to compile UCP 1.1.2 with Borland C++ 3.1.

DOS fan :: artificial "intelligence" - not a fan... not a fan at all :: is freeware a lie, when human freedom is a fundamental lie?

Reply 23 of 24, by Rav

User metadata
Rank Member
Rank
Member
aVd wrote on 2026-03-24, 20:16:

Ok, I got it. Seems like very handy tool for fine tuning of RAM, Cache and ISA settings.

Thank you very much for sharing the new real mode version with ALi M1489/87 chipset support and its source code, @Rav! I'll try to compile UCP 1.1.2 with Borland C++ 3.1.

Good luck!

Note : I did begin the project using Borland C++ 4.5 And compiled it successfully with 5.02 (That include the last build, but it should still compile on 4.5). I never tested with 3.1.

Reply 24 of 24, by aVd

User metadata
Rank Member
Rank
Member
Rav wrote on 2026-03-24, 22:23:

Good luck!

Note : I did begin the project using Borland C++ 4.5 And compiled it successfully with 5.02 (That include the last build, but it should still compile on 4.5). I never tested with 3.1.

Hi,
There's no problem to be compiled with Borland C++ version 3.1, except that I still get some #define-mess linker errors. So far more than 25+ linker errors like "Linker Error: _readctc defined in module UCP.C is duplicated in module CACHETST.C".

Also, "doCacheTest" function in "chipset.c" is left empty. Seems like it's unused in the rest of the code. There's a problem with "print_done" function (from "utils.c") usage in "ucp.c". Plus some minor redundant code lines here and there.

Is far as I know Borland C++ versions 4.5 and 5.02 are win 3.1+ and win 95 based, so I can't use them.

DOS fan :: artificial "intelligence" - not a fan... not a fan at all :: is freeware a lie, when human freedom is a fundamental lie?