Далее идет кусок не относящийся конкретно к прошивке,

Далее идет кусок не относящийся конкретно к прошивке, но он имеет важное значение в определении самого "чипсетного набора", как практической функции идентификации неизвестных плат, потому несмотря на его объемность последовательно пройдемся по всем пунктам.

{Id chipset as a whole}
 CurrentChipset := '';

 if (NorthName='i82433LX') and ((SouthName='i82378ZB SIO') or (SouthName='i82379AB SIO.A'))
  then CurrentChipset:='Intel Mercury 430LX';
 if (NorthName='i82433NX') and ((SouthName='i82378ZB SIO') or (SouthName='i82379AB SIO.A'))
  then CurrentChipset:='Intel Neptune 430NX';
 if (NorthName='i82437FX') and (SouthName='i82371FB PIIX')
  then CurrentChipset:='Intel Triton 430FX';
 if (NorthName='i82437MX') and (SouthName='i82371MX MPIIX')
  then CurrentChipset:='Intel 430MX (mobile)';
 if (NorthName='i82441FX') and (SouthName='i82371SB PIIX3')
  then CurrentChipset:='Intel Natoma 440FX';
 if (NorthName='i82439HX') and (SouthName='i82371SB PIIX3')
  then CurrentChipset:='Intel Triton II 430HX';
 if (NorthName='i82437VX') and (SouthName='i82371SB PIIX3')
  then CurrentChipset:='Intel Triton II 430VX';
 if (NorthName='i82439TX') and (SouthName='i82371AB/EB PIIX4(E)')
  then CurrentChipset:='Intel Triton III 430TX';
 if (NorthName='i82443LX/EX') and (SouthName='i82371AB/EB PIIX4(E)')
  then CurrentChipset:='Intel AGPSet 440LX/EX';
 if (NorthName='i82443BX/ZX') and (SouthName='i82371AB/EB PIIX4(E)')
  then CurrentChipset:='Intel AGPSet 440BX/ZX';
 if (NorthName='i82443BX/ZX') and (SouthName='SMSC SLC90E66')
  then CurrentChipset:='SMSC VictoryBX-66';
 if (NorthName='i82443GX') and (SouthName='i82371AB/EB PIIX4(E)')
  then CurrentChipset:='Intel AGPSet 440GX';
 if (NorthName='i82454KX/GX') and ((SouthName='i82379AB SIO.A') or (SouthName='i82371FB PIIX') or (SouthName='i82371SB PIIX3'))
  then CurrentChipset:='Intel 450KX/GX';
 if (NorthName='i82810') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 810';
 if (NorthName='i82810-DC100') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 810-DC100';
 if (NorthName='i82810E') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 810E';
 if (NorthName='i82810E') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 810E2';
 if (NorthName='i82815') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 815(P/G)';
 if (NorthName='i82815') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 815E(P/G)';
 if (NorthName='i82815') and (SouthName='i82801BAM ICH2-M')
  then CurrentChipset:='Intel 815EM';
 if (NorthName='i82820') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 820';
 if (NorthName='i82820') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 820E';
 if (NorthName='i82830M') and (SouthName='i82801CAM ICH3-M')
  then CurrentChipset:='Intel 830M(P/G)';
 if (NorthName='i82840') and ((SouthName='i82801AA ICH') or (SouthName='i82801AB ICH0'))
  then CurrentChipset:='Intel 840';
 if (NorthName='i82845') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 845';
 if (NorthName='i82845') and (SouthName='i82801DB ICH4')
  then CurrentChipset:='Intel 845E'; {v1.31}
 if (NorthName='i82845G/P') and (SouthName='i82801DB ICH4')
  then CurrentChipset:='Intel 845G(E/L/V)/845PE'; {v1.31}
 if (NorthName='i82845') and (SouthName='i82801CAM ICH3-M')
  then CurrentChipset:='Intel 845MP/MZ'; {v1.31}
 if (NorthName='i82850') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 850(E)';
 if (NorthName='i8285xGM') and ((SouthName='i82801DBM ICH4-M') or (SouthName='i82801DB ICH4') or (SouthName='i6300ESB ICH'))
  then CurrentChipset:='Intel 852GM(E)/855GM(E)'; {v1.31}
 if (NorthName='i82855PM') and (SouthName='i82801DBM ICH4-M')
  then CurrentChipset:='Intel 855PM'; {v1.31}
 if (NorthName='i82860') and (SouthName='i82801BA ICH2')
  then CurrentChipset:='Intel 860';
 if (NorthName='i82865') and (SouthName='i82801EB ICH5(R)')
  then CurrentChipset:='Intel 865P(E)/G(V)/848P'; {v1.34}
 if (NorthName='i82875') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH'))
  then CurrentChipset:='Intel 875P'; {v1.31}
 if (NorthName='iE7205') and (SouthName='i82801DB ICH4')
  then CurrentChipset:='Intel E7205'; {v1.31}
 if (NorthName='iE7210') and (SouthName='i6300ESB ICH')
  then CurrentChipset:='Intel E7210'; {v1.39}
 if (NorthName='iE7221') and ((SouthName='i82801FB/R ICH6(R)') or (SouthName='i82801F(R)W ICH6(R)W'))
  then CurrentChipset:='Intel E7221'; {v1.39}
 if (NorthName='iE7500') and (SouthName='i82801CA ICH3-S')
  then CurrentChipset:='Intel E7500';
 if (NorthName='iE7320') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH'))
  then CurrentChipset:='Intel E7320'; {v1.39}
 if (NorthName='iE7501') and (SouthName='i82801CA ICH3-S')
  then CurrentChipset:='Intel E7501'; {v1.31}
 if (NorthName='iE7505') and (SouthName='i82801DB ICH4')
  then CurrentChipset:='Intel E7505'; {v1.31}
 if (NorthName='iE7520') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH'))
  then CurrentChipset:='Intel E7520'; {v1.39}
 if (NorthName='iE7525') and ((SouthName='i82801EB ICH5(R)') or (SouthName='i6300ESB ICH'))
  then CurrentChipset:='Intel E7525'; {v1.39}
 if (NorthName='iE8870') and (SouthName='i82801DB ICH4')
  then CurrentChipset:='Intel E8870'; {v1.39}
 if (NorthName='i829xxx') and ((SouthName='i82801FB/R ICH6(R)') or (SouthName='i82801F(R)W ICH6(R)W'))
  then CurrentChipset:='Intel 910/915/925 series'; {v1.37}
 if (NorthName='i829xxxM') and (SouthName='i82801FBM ICH6-M')
  then CurrentChipset:='Intel mobile 910/915 series'; {v1.39}

Все достаточно понятно, опять же, уточнения приветствуются. И дополнения - по новым наборам, чтобы внести в нашу новую версию.
 if (NorthName='VT82C505') then CurrentChipset:='VIA 486 chipset with VT82C505'; {v1.37}
 if (NorthName='VT82C576M') then CurrentChipset:='VIA Apollo Master';
 if (NorthName='VT82C585VP/VPX') and (SouthName='VT82C586(A|B)/AMD-645')
  then CurrentChipset:='VIA Apollo VP/VPX';
 if (NorthName='VT82C595/AMD-640') and (SouthName='VT82C586(A|B)/AMD-645')
  then CurrentChipset:='VIA Apollo VP2/AMD 640';
 if (NorthName='VT82C597') and ((SouthName='VT82C586(A|B)/AMD-645') or (SouthName='VT82C596(A|B)'))
  then CurrentChipset:='VIA Apollo (M)VP3';
 if (NorthName='VT82C598(AT)') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)'))
  then CurrentChipset:='VIA Apollo MVP3';
 if (NorthName='VT82C685') then CurrentChipset:='VIA Apollo P6';
 if (NorthName='VT8501') and (SouthName='VT82C686(A|B)')
  then CurrentChipset:='VIA Apollo MVP4';
 if (NorthName='VT82C691/693(A)/694X/T') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)'))
  then CurrentChipset:='VIA Apollo Pro (Plus/133(A|T))';
 if (NorthName='VT82C693(A)') and ((SouthName='VT82C596(A|B)') or (SouthName='VT82C686(A|B)'))
  then CurrentChipset:='VIA Apollo Pro Plus/133(A)';
 if (NorthName='VT8601') and (SouthName='VT82C686(A|B)')
  then CurrentChipset:='VIA Apollo ProMedia';
 if (NorthName='VT8605') then CurrentChipset:='VIA Apollo Pro 133Z/PM133';
 if (NorthName='VT8371') and (SouthName='VT82C686(A|B)')
  then CurrentChipset:='VIA Apollo KX133';
 if (NorthName='VT8363(A)/8365') and (SouthName='VT82C686(A|B)')
  then CurrentChipset:='VIA Apollo KT133(A)';
 if (NorthName='VT8363(A)/8365') and (SouthName='VT8231')
  then CurrentChipset:='VIA ProSavage KM133(A)';
 if (NorthName='VT8366(A)') and ((SouthName='VT8233(A|C)') or (SouthName='VT8235'))
  then CurrentChipset:='VIA Apollo KT266(A)/KT333';
(* if (NorthName='VT8366(A)') and (SouthName='VT8235')
  then CurrentChipset:='VIA Apollo KT333'; {v1.31}*)
 if (NorthName='VT8377') and (SouthName='VT8235')
  then CurrentChipset:='VIA Apollo KT400(A)'; {v1.31}
 if (NorthName='VT8378') and ((SouthName='VT8233(A|C)') or (SouthName='VT8235') or (SouthName='VT8237'))
  then CurrentChipset:='VIA UniChrome KM400(A)'; {v1.39}
 if (NorthName='VT8633') and (SouthName='VT8233(A|C)')
  then CurrentChipset:='VIA Apollo Pro 266';
 if (NorthName='VT8653') and (SouthName='VT8233(A|C)')
  then CurrentChipset:='VIA Apollo Pro 266T'; {v1.31}
 if (NorthName='VT8751') and (SouthName='VT8233(A|C)')
  then CurrentChipset:='VIA ProSavage P4M266';
 if (NorthName='VT8753(A)/8754') and (SouthName='VT8233(A|C)')
  then CurrentChipset:='VIA P4X266(A)/P4X333/P4X400';
Аналогично - ищем новое, уточняем старое.
 if (NorthName='M1451') and (SouthName='M1449')
  then CurrentChipset:='ALi Aladdin';
 if (NorthName='M1489') then CurrentChipset:='ALi FinALi 486';
 if (NorthName='M1521') and (SouthName='M1523(B)')
  then CurrentChipset:='ALi Aladdin III';
 if (NorthName='M1531(B)') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin IV/IV+';
 if (NorthName='M1541/1542') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin V';
 if (NorthName='M1561') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin 7'; {v1.31}
 if (NorthName='M1621') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin Pro/Pro II';
 if (NorthName='M1631') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin Pro III (TNT2)'; {v1.31}
 if (NorthName='M1632M') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi CyberBLADE Aladdin i1'; {v1.31}
 if (NorthName='M1641') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin Pro IV';
 if (NorthName='M1647') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi ALiMAGiK/MobileMAGiK 1';
 if (NorthName='M1651') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin Pro 5(T/M)'; {v1.31}
 if (NorthName='M1671') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi Aladdin-P4'; {v1.31}
 if (NorthName='M1672') and (SouthName='M1533/1543/1535')
  then CurrentChipset:='ALi CyberAladdin-P4'; {v1.31}
Тут - только уточняем старое, в виду отсутствия нового.:)
 if (NorthName='AMD-751') and (SouthName='AMD-756')
  then CurrentChipset:='AMD 750';
 if (NorthName='AMD-761') and (SouthName='VT82C686(A|B)')
  then CurrentChipset:='AMD 760 (VIA South)';
 if (NorthName='AMD-761') and (SouthName='AMD-766')
  then CurrentChipset:='AMD 760 (AMD South)';
 if (NorthName='AMD-762') and (SouthName='AMD-766')
  then CurrentChipset:='AMD 760MP';
 if (NorthName='AMD-762') and (SouthName='AMD-768')
  then CurrentChipset:='AMD 760MPX';
 if (NorthName='AMD-8151') and (SouthName='AMD-8111')
  then CurrentChipset:='AMD 8000'; {v1.36}
Снова - аналогично.
 if (NorthName='SiS 85C496+497') then CurrentChipset:='SiS 85C496+497';
 if (NorthName='SiS 501/5101/5501') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 501/5101/5501';
 if (NorthName='SiS 5511') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 5511+5513';
 if (NorthName='SiS 5571') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 5571';
 if (NorthName='SiS 5591/5592') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 5591/5592+5595';
 if (NorthName='SiS 5596') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 5596+5595';
 if (NorthName='SiS 5597/5598/5581/5120') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 5597/5598/5581/5120';
 if (NorthName='SiS 530') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 530';
 if (NorthName='SiS 540') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 540';
 if (NorthName='SiS 600') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 600';
 if (NorthName='SiS 620') and (SouthName='SiS South Bridge')
  then CurrentChipset:='SiS 620';
 if (NorthName='SiS 630') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 630';
 if (NorthName='SiS 635') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 635';
 if (NorthName='SiS 640') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 640';
 if (NorthName='SiS 645') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 645';
 if (NorthName='SiS 645DX') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 645DX';
 if (NorthName='SiS 648') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 648'; {v1.31}
 if (NorthName='SiS 650') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 650';
 if (NorthName='SiS 651') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 651'; {v1.31}
 if (NorthName='SiS 655') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 655'; {v1.31}
 if (NorthName='SiS 730') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 730';
 if (NorthName='SiS 733') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 733'; {v1.31}
 if (NorthName='SiS 735') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 735';
 if (NorthName='SiS 740') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 740';
 if (NorthName='SiS 745') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 745'; {v1.31}
 if (NorthName='SiS 746') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 746'; {v1.31}
 if (NorthName='SiS 748') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 748'; {v1.31}
 if (NorthName='SiS 755') and ((SouthName='SiS South Bridge') or (SouthName='SiS 950'))
  then CurrentChipset:='SiS 755'; {v1.31}
Сис - он и в африке сис. Простой как шланг - при желании можно даже написать одну общую процедуру для всех названий, теперешних и будущих.:)
 if (NorthName='Reliance NB6635') and (SouthName='Reliance OSB4')
  then CurrentChipset:='ServerWorks ServerSet III LE';
 if (NorthName='Reliance NB6536') and (SouthName='Reliance OSB4')
  then CurrentChipset:='ServerWorks ServerSet III HE';

 if (NorthName='Vesuvius V1-LS') and (SouthName='Vesuvius V3-LS')
  then CurrentChipset:='National PicoPower Vesuvius-LS';

 if (NorthName='MediaGX') and (SouthName='Cyrix Cx5510')
  then CurrentChipset:='Cyrix MediaGX + Cx5510'; {v1.36}
 if (NorthName='MediaGX') and (SouthName='Cyrix Cx5520')
  then CurrentChipset:='Cyrix MediaGX + Cx5520'; {v1.36}
 if (NorthName='MediaGX') and (SouthName='Cyrix Cx5530(A)')
  then CurrentChipset:='National Geode GX1 + CS5530(A)';
 if (NorthName='MediaGX') and (SouthName='Geode SC1100')
  then CurrentChipset:='AMD Geode SC1100'; {v1.36}
 if (NorthName='MediaGX') and (SouthName='Geode SCx200')
  then CurrentChipset:='AMD Geode SC1200/2200/3200'; {v1.36}

 if (NorthName='OPTi 82C557(M)') and (SouthName='OPTi 82C558(M)')
  then CurrentChipset:='OPTi Viper M/N/NK/N+/DP';
 if (NorthName='OPTi 82C567') and (SouthName='OPTi 82C568')
  then CurrentChipset:='OPTi Viper Max/Vendetta 82C750';

 if (NorthName='HiNT VXPro-II North') and (SouthName='HiNT VXPro-II South')
  then CurrentChipset:='HiNT VXPro-II (Utron UT85C50x)';

 if (NorthName='UMC UM8881F') and (SouthName='UMC UM8886BF')
  then CurrentChipset:='UMC UM8881F + UM8886BF';

 if (NorthName='Micron MT8LLN21PADF') and (SouthName='Micron MT7LLN22NCNE')
  then CurrentChipset:='Micron Copperhead+Coppertail';

 if (NorthName='CY82C599') then CurrentChipset:='Cypress 386/486 chipset';
 if (NorthName='CY82C691') and (SouthName='CY82C693(U/UB)')
  then CurrentChipset:='Cypress hyperCache';
Одним словом - экзотика и артефакты.
 if (NorthName='nVidia IGP') and (SouthName='nVidia MCP/MCP-D')
  then CurrentChipset:='nVidia nForce';
 if (NorthName='nVidia IGP2') and (SouthName='nVidia MCP2')
  then CurrentChipset:='nVidia nForce2';
А вот эту часть нужно дописать.
И написать - для атишек.
 ChipsetFound := ( NorthName<>'' ) or ( SouthName<>'' ); {One of 'm might be enough}

 {If chipset ID failed then show north & south bridge name or ID}
 If CurrentChipset = '' then
  Begin
   If NorthName<>'' then
    CurrentChipset := NorthName + ' + '
   else
    CurrentChipset := '(' + Hw( NorthMan ) + ',' + Hw( NorthId ) +
                      ',' + Hb( NorthRev ) + ') + ';
   If SouthName<>'' then
    CurrentChipset := CurrentChipset + SouthName
   else
    CurrentChipset := CurrentChipset +
                      '(' + Hw( SouthMan ) + ',' + Hw( SouthId ) +
                      ',' + Hb( SouthRev ) + ')';
  End;
 if LPCName<>'' then CurrentChipset:=CurrentChipset+' + '+LPCName; {v1.27}
Просто для отображения названия чипсетной логики - если иденцифицирован хотя бы один из мостов - выводим его название, иначе - выводим их айдишники. Плюс вывод названия мультика в случае его наличия-определения.
 If PhoenixCheckFor then {v1.43re}
  Begin
   PhoenixUsed := True;
   ChipsetFound := True;
   CurrentChipset := CurrentChipset + ' [Phoenix BIOS]';
   LogWrite('Phoenix flash interface enabled');
   EXIT;
  End;
 If AwardCheckFor then {v1.42re}
  Begin
   AwardUsed := True;
   ChipsetFound := True;
   CurrentChipset := CurrentChipset + ' [AWARD BIOS]';
   LogWrite('AWARD flash interface enabled');
  End;
 If AMICheckFor then {v1.42re}
  Begin
   AMIUsed := True;
   ChipsetFound := True;
   CurrentChipset := CurrentChipset + ' [AMI BIOS]';
   LogWrite('AMI flash interface enabled');
  End;
{ If WantToUseAsus and AsusCheckFor then} {v1.39}
 If AsusCheckFor then {v1.42re}
  Begin
   AsusUsed := True;
   ChipsetFound := True;
   CurrentChipset := CurrentChipset + ' [ASUS FLASH]';
   LogWrite('Asus flash interface enabled');
  End;
end;
Определения типа биоса, что в будущем позволяет выбрать способ "размапливания" - "классический" (универсальный), который мы здесь и рассматриваем. Или специальная процедура из конкретного биоса под свою плату. Чтобы не уходить от темы пока опустим "неклассический" вариант, подразумевая именно универсальный способ.

procedure GetBIOSID;
var Buf: array[1..80] of Char;
    b,e: Byte;
begin
  MoveLinBlockB($FFFFFFE8,LongInt(Seg(BIOSID)) shl 4+LongInt(Ofs(BIOSID)),8); {v1.34}
  if (BIOSID=#0#0#0#0#0#0#0#0) or (BIOSID=#$FF#$FF#$FF#$FF#$FF#$FF#$FF#$FF) then {v1.39}
   begin
     BIOSID:=#0#0#0#0#0#0#0#0;
     MoveLinBlockB($FEC71,LongInt(Seg(Buf)) shl 4+LongInt(Ofs(Buf)),SizeOf(Buf));
     e:=Pos(#0,Buf)-1;
     b := e;
     while ((Buf[b]<>'-') or (e-b<3)) and (b>1) do Dec(b);
     if e-b>8 then e:=b+8;
     Move(Buf[b+1],BIOSID,e-b);
   end;
  GotoXY(73,23);
  Write(BIOSID); {v1.38}
  LogWrite('Detected Award BIOS ID: '+BIOSID);
end;
Для знающих аварбиос все просто - получаем его BIOSID.
Var
PIIXReg, PIIXReg2, PIIXReg3, PIIXReg4, PIIXReg5 : LongInt;

{Generic Intel chipset low ROM enable & ROM write access enable}
Procedure ROMEnable( Map : Boolean );

Var
Mask : LongInt;
Pos_: Byte;

Begin
 if ROMEnabled=Map then Exit; {v1.22}

 if PhoenixUsed then                          {1.43re}
 begin
   if Map then PhoenixEnable else PhoenixDisable;
   ROMEnabled:=Map;
   Exit;
 end;

 if AwardUsed then                            {1.42re}
 begin
   if Map then AwardEnable else AwardDisable;
   ROMEnabled:=Map;
   Exit;
 end;

 if AMIUsed then
  begin
   if Map then AMIEnable else AMIDisable;
   ROMEnabled:=Map;
   Exit;
  end;

 if AsusUsed then
  begin
   if Map then AsusEnable else AsusDisable;
   ROMEnabled:=Map;
   Exit;
  end;
Запуск самой процедуры "размапливания". Ну и, как видно, "замапливания" перед выходом.
Возможности и варианты для "биос-специфичных" вариантов (неуниверсальных) пока по-прежнему не рассматриваем.

Далее идет наш главный код по размапливанию.

Добавлено спустя 7 минут 54 секунды:

Gordon01 и др.
Интересуют "реально" новые платы.:) Для интелов, это "минимум" с ICH6 (а лучше 7), для nVidia - от nForce4, АТИшки интересуют все, сисы от 76х и т.п. - смотреть самые последние строчки в соответствующих вашему железу разделах (которые здесь в сообщениях я писал), если ваше железо там есть, интересно лишь, ежели ваши данные отличаются от указанных в юнифлеше.

Добавлено спустя 53 минуты 22 секунды:

Сначала идет код, "специфичный" для северников.
Здесь, видимо, стоит уточнить. В реальном коде (как это сделано в биосе) нет "отдельных" процедур - для северника, южника и т.д. Ибо это и бессмысленно делить в коде и даже некорректно где-то по определению. Но для написания именно _универсального_ прошивальщика нужно было "стандартизировать" подход размапливания и "классифицировать" его для всего многообразия "защиты от записи". Потому авторы юнифлеша, думаю, совершенно оправданно его так поделили (NB/SB/SIO/GPIO). И, в частности, именно поддержка совсем древнего железа потребовала "специфичных" для северника процедур размапливания. Потому и указанную "северную" часть стоит рассматривать лишь с точки зрения "было же время"...:)

 {Chipset northbridge stuff}
 Case Hi( NorthFunc ) of
  $01 : begin {older VIA chipsets}
         if Map then
          begin
           Port[$A8]:=$11;
           PIIXReg:=Port[$A9];
           LogWrite('VIA old method: internal reg $11 = '+Hl(PIIXReg)); {v1.28}
           Port[$A8]:=$11;
           Port[$A9]:=PIIXReg or $40; {ROM Write enable}
           Port[$A8]:=$11;
           LogWrite('VIA old method: internal reg $11 changed to '+Hl(Port[$A9])); {v1.28}
          end else
 

Итак, первая функция для северника - для артефактных виашек. Если сейчас размапливаем (Map = TRUE), то в порт 0A8h закидываем 11h, после чего считываем байт управления (скорей всего - если захотите убедиться - сами поищите и почитайте эти древние папирусы по инициализиции подобного железа:) ) и после устанавливаем в нем бит, ответственный за ROM_WE (Write Enable).
иначе (процедура замапливания - Map = TRUE):
          begin
           Port[$A8]:=$11;
           LogWrite('VIA old method: restoring internal reg $11 from '+Hl(Port[$A9])); {v1.28}
           Port[$A8]:=$11;
           Port[$A9]:=PIIXReg;
          end;
        End;

В байт управления загоняем ранее предварительно сохраненное в PIIXReg предыдущее состояние (что было до размапливания).
Думая понятно, но замечу - здесь и далее PIIXReg (и аналогичные) - просто банальные переменные для временного хранения.
  $02 : Begin {SiS 85C496+497 chipset} {v1.21}
         If Map then
          Begin
           PIIXReg := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0 );
           LogWrite('SiS old method: reg $D0 = '+Hl(PIIXReg)); {v1.28}
           {write enable, 384K enable}
           SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0, PIIXReg or $F8 );
           LogWrite('SiS old method: reg $D0 changed to '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0 )));
          End else
          Begin
           LogWrite('SiS old method: restoring reg $D0 from '+Hl(GetPCIRegD( $00, NorthPos shr 3,
            NorthPos and $7, $D0 ))); {v1.28}
           SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $D0, PIIXReg );
          End;
        End;

Теперь для артефактных сисов.

***************************************************************
Здесь стоит подробней остановится на постоянно используемых функциях GetPCIRegD/SetPCIRegD.

{Read PCI configuration reg}
Function GetPCIRegD( Bus, Dev, Func, Reg : Byte ) : LongInt;
Begin
 OPortD( PCICfIdx, $80000000 or
                   ( LongInt( Bus ) shl 16 ) or
                   ( ( LongInt( Dev ) and $1F ) shl 11 ) or
                   ( ( LongInt( Func ) and $7 ) shl 8 ) or
                   ( Reg and $FC ) );
 GetPCIRegD := IPortD( PCICfData );
End;

{Write PCI configuration reg}
Procedure SetPCIRegD( Bus, Dev, Func, Reg : Byte; Value : LongInt );
Begin
 OPortD( PCICfIdx, $80000000 or
                   ( LongInt( Bus ) shl 16 ) or
                   ( ( LongInt( Dev ) and $1F ) shl 11 ) or
                   ( ( LongInt( Func ) and $7 ) shl 8 ) or
                   ( Reg and $FC ) );
 OPortD( PCICfData, Value );
End;

Без четкого понимания механизма программирования PCI понять это невозможно. Сам алгоритм несложный, описание можно найти, например, здесь:
support.mdl.ru/PC_COMPL/doc/IndespPC.Bok/chapt24/chapt24.6.html
support.mdl.ru/PC_COMPL/doc/IndespPC.Bok/chapt24/chapt24.7.html
***************************************************************

Так вот, для сисов нужно установить разрешающие биты в RxD0 (что читается как регистр PCI по смещению 0D0h в конфигурационном пространстве северного моста в нашем случае). При "замапливании" - их (биты) нужно сбросить (установить в 0).

  $03 : begin {ALi Aladdin and FinALi}
         if Map then
          begin
            if Lo(NorthFunc)=0 then
             begin {ALi Aladdin M1451/1449} {v1.31}
               ROMBase:=$E0000;
               ShadowDisable:=ShadowDisable_Aladdin;
               ShadowRestore:=ShadowRestore_Aladdin;
               Flash_Read:=FIMemB_Flash_Low;
               Flash_ReadBlock:=MoveLinBlock_From_Flash_D_Low;
               Flash_Compare:=CompLinBlocks_Flash_Low;
               PIIXReg := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C );
               LogWrite('ALi old method: reg $4C = '+Hl(PIIXReg));
               {E and F segment write shadow disable}
               SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C, PIIXReg and $00FFFFFF );
                LogWrite('ALi old method: reg $4C changed to '+Hl(GetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C)));
             end
            else
             begin {ALi FinALi 486 M1489/1487} {v1.28}
               ROMBase:=$FFFF0000;
               Flash_Read:=FIMemB_Flash_FinALi;
               Flash_Write:=FOMemB_Flash_FinALi;
               Flash_ReadBlock:=MoveLinBlock_From_Flash_D_FinALi;
               Flash_WriteBlock:=MoveLinBlock_To_Flash_B_FinALi;
               Flash_Compare:=CompLinBlocks_Flash_FinALi;
               Port[$22]:=$03;
               Port[$23]:=$C5;

               Port[$22]:=$12;
               PIIXReg:=Port[$23];
               LogWrite('ALi old method: internal reg $12 = '+Hl(PIIXReg));
               Port[$22]:=$12;
               Port[$23]:=PIIXReg or $11;
               Port[$22]:=$12;
               LogWrite('ALi old method: internal reg $12 changed to '+Hl(Port[$23]));

               Port[$22]:=$21;
               PIIXReg2:=Port[$23];
               LogWrite('ALi old method: internal reg $21 = '+Hl(PIIXReg2));
               Port[$22]:=$21;
               Port[$23]:=PIIXReg2 or $20;
               Port[$22]:=$21;
               LogWrite('ALi old method: internal reg $21 changed to '+Hl(Port[$23]));

               Port[$22]:=$2B;
               PIIXReg3:=Port[$23];
               LogWrite('ALi old method: internal reg $2B = '+Hl(PIIXReg3));
               Port[$22]:=$2B;
               Port[$23]:=PIIXReg3 or $20;
               Port[$22]:=$2B;
               LogWrite('ALi old method: internal reg $2B changed to '+Hl(Port[$23]));

               Port[$22]:=$03;
               Port[$23]:=$00;
             end;
          end
         else
          begin
            if Lo(NorthFunc)=0 then
             begin {ALi Aladdin M1451/1449} {v1.31}
               LogWrite('ALi old method: restoring reg $4C from '+Hl(GetPCIRegD( $00, NorthPos shr 3,
                NorthPos and $7, $4C )));
               SetPCIRegD( $00, NorthPos shr 3, NorthPos and $7, $4C, PIIXReg );
             end
            else
             begin
               Port[$22]:=$03;
               Port[$23]:=$C5;

               Port[$22]:=$12;
               LogWrite('ALi old method: restoring internal reg $12 from '+Hl(Port[$23]));
               Port[$22]:=$12;
               Port[$23]:=PIIXReg;

               Port[$22]:=$21;
               LogWrite('ALi old method: restoring internal reg $21 from '+Hl(Port[$23]));
               Port[$22]:=$21;
               Port[$23]:=PIIXReg2;

               Port[$22]:=$2B;
               LogWrite('ALi old method: restoring internal reg $2B from '+Hl(Port[$23]));
               Port[$22]:=$2B;
               Port[$23]:=PIIXReg3;

               Port[$22]:=$03;
               Port[$23]:=$00;
             end;
          end;
        end;
Много непонятного и сложного для восприятия в случае старых алишек. Пропускаю этот момент, ибо, честно говоря - нет никакого желания разбираться. Хоть и буду признателен, ежели кто объяснит смысл такой "хитровывернутой" инициализации.
  $04 : Begin {Contaq/Cypress CY82C599} {v1.29}
         If Map then
          Begin
            Port[$22]:=$12;
            PIIXReg:=Port[$23];
            LogWrite('Cypress old method: internal reg $12 = '+Hl(PIIXReg));
            Port[$22]:=$12;
            Port[$23]:=PIIXReg and $EF;
            Port[$22]:=$12;
            LogWrite('Cypress old method: internal reg $12 changed to '+Hl(Port[$23]));
          End else
          Begin
            Port[$22]:=$12;
            LogWrite('Cypress old method: restoring internal reg $12 from '+Hl(Port[$23]));
            Port[$22]:=$12;
            Port[$23]:=PIIXReg;
          End;
        End;
 End;
Сходное с виашной раз северников у экзотичного "контака".

Далее идет "специфичные" процедуры для южников - основной смысл нашего разбора, потому на каждой будем останавливаться максимально подробно.

runiflash
  • "Массивчик" данных SPD находится в ЕПРОМ на модуле
  • Привет всем runiflash `ерам! Тема интересная, но
  • 2 Cyrix. Вот темка Выручает:)
  • Господа, подскажите почему Uniflash не хочет нормально шить
  • Root да, в реале.
  • обнаружил серьезную багу в Uniflash 1.40&URE1.41/1.42: на MSI K7D
  • Тема интереснейшая...
  • savely_s Скинул...
  • Кстати - у ivp есть KT7A.
  • То есть снимать лучше самим UniFlash? Тестить уже
  • Uniflash не пашет на KT7A & Co
  • Все понял, модели напишу/анкноун уберу (едит)
  • Мои выкладки были не совсем правильно
  • В копилку (если надо): Материнская плата ASUS A8N-E (чипсет
  • Можно внести посильный вклад в общее дело?
  • ECS RS482-M RS482 (CPU-PCI от ATI, остальные -
  • Просьба не воспринимать етот пост как "понт сцылками"
  • VIA c3m266-l: VT8623 Rev. 00 VEN_1106 DEV_3123 SUBSYS_00000000
  • вспомнил что же за матери Uniflash - не
  • Подсоединил тут Jetway K8T8AS (K8T800Pro/VT8237). U1.40 опознает чипсет
  • и про MSI не забудьте
  • apple_rom там надо будет в специфических типах
  • >Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)" Отлично,
  • А подружите с 6100, плз! :) Имеется Foxconn
  • rd480 интересен? :)
  • Все эти ссылки (точней - много больше) у
  • по поводу PCI ID: http://pciids.sourceforge.net/ http://members.datafast.net.au/~dft0802/downloads/pcidevs.txt в этих ресурсах уже есть
  • Далее идет кусок не относящийся конкретно к прошивке,
  • apple_rom, к сожалению, виндовс уже давно не пользуюсь. Гм.
  • Продолжим. Дальше идет детект южников. Смысл последовательности понятен
  • По сему поводу имеется такое: HiNT HB1 Zero-Clock-Latency
  • Смотреть можно чем угодно, даже в свойствах винды
  • P.S. apple_rom , спасибо что начал эту
  • За название респект :) run I flash -
  • apple_rom - Подскажи пожалуйста, "поделиться айдишниками вашего железа"