Далее идет кусок не относящийся конкретно к прошивке, но он имеет важное значение в определении самого "чипсетного набора", как практической функции идентификации неизвестных плат, потому несмотря на его объемность последовательно пройдемся по всем пунктам.
{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;
Так вот, для сисов нужно установить разрешающие биты в 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;
Сходное с виашной раз северников у экзотичного "контака".
Далее идет "специфичные" процедуры для южников - основной смысл нашего разбора, потому на каждой будем останавливаться максимально подробно.
Далее идет кусок не относящийся конкретно к прошивке, но он имеет важное значение в определении самого "чипсетного набора", как практической функции идентификации неизвестных плат, потому несмотря на его объемность последовательно пройдемся по всем пунктам.
Все достаточно понятно, опять же, уточнения приветствуются. И дополнения - по новым наборам, чтобы внести в нашу новую версию.
Аналогично - ищем новое, уточняем старое.
Тут - только уточняем старое, в виду отсутствия нового.
Снова - аналогично.
Сис - он и в африке сис. Простой как шланг - при желании можно даже написать одну общую процедуру для всех названий, теперешних и будущих.
Одним словом - экзотика и артефакты.
А вот эту часть нужно дописать.
И написать - для атишек.
Просто для отображения названия чипсетной логики - если иденцифицирован хотя бы один из мостов - выводим его название, иначе - выводим их айдишники. Плюс вывод названия мультика в случае его наличия-определения.
Определения типа биоса, что в будущем позволяет выбрать способ "размапливания" - "классический" (универсальный), который мы здесь и рассматриваем. Или специальная процедура из конкретного биоса под свою плату. Чтобы не уходить от темы пока опустим "неклассический" вариант, подразумевая именно универсальный способ.
Для знающих аварбиос все просто - получаем его BIOSID.
Запуск самой процедуры "размапливания". Ну и, как видно, "замапливания" перед выходом.
Возможности и варианты для "биос-специфичных" вариантов (неуниверсальных) пока по-прежнему не рассматриваем.
Далее идет наш главный код по размапливанию.
Добавлено спустя 7 минут 54 секунды:
Gordon01 и др.
Интересуют "реально" новые платы. Для интелов, это "минимум" с ICH6 (а лучше 7), для nVidia - от nForce4, АТИшки интересуют все, сисы от 76х и т.п. - смотреть самые последние строчки в соответствующих вашему железу разделах (которые здесь в сообщениях я писал), если ваше железо там есть, интересно лишь, ежели ваши данные отличаются от указанных в юнифлеше.
Добавлено спустя 53 минуты 22 секунды:
Сначала идет код, "специфичный" для северников.
Здесь, видимо, стоит уточнить. В реальном коде (как это сделано в биосе) нет "отдельных" процедур - для северника, южника и т.д. Ибо это и бессмысленно делить в коде и даже некорректно где-то по определению. Но для написания именно _универсального_ прошивальщика нужно было "стандартизировать" подход размапливания и "классифицировать" его для всего многообразия "защиты от записи". Потому авторы юнифлеша, думаю, совершенно оправданно его так поделили (NB/SB/SIO/GPIO). И, в частности, именно поддержка совсем древнего железа потребовала "специфичных" для северника процедур размапливания. Потому и указанную "северную" часть стоит рассматривать лишь с точки зрения "было же время"...
Итак, первая функция для северника - для артефактных виашек. Если сейчас размапливаем (Map = TRUE), то в порт 0A8h закидываем 11h, после чего считываем байт управления (скорей всего - если захотите убедиться - сами поищите и почитайте эти древние папирусы по инициализиции подобного железа ) и после устанавливаем в нем бит, ответственный за ROM_WE (Write Enable).
иначе (процедура замапливания - Map = TRUE):
В байт управления загоняем ранее предварительно сохраненное в PIIXReg предыдущее состояние (что было до размапливания).
Думая понятно, но замечу - здесь и далее PIIXReg (и аналогичные) - просто банальные переменные для временного хранения.
Теперь для артефактных сисов.
***************************************************************
Здесь стоит подробней остановится на постоянно используемых функциях GetPCIRegD/SetPCIRegD.
Без четкого понимания механизма программирования 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).
Много непонятного и сложного для восприятия в случае старых алишек. Пропускаю этот момент, ибо, честно говоря - нет никакого желания разбираться. Хоть и буду признателен, ежели кто объяснит смысл такой "хитровывернутой" инициализации.Сходное с виашной раз северников у экзотичного "контака".
Далее идет "специфичные" процедуры для южников - основной смысл нашего разбора, потому на каждой будем останавливаться максимально подробно.