162 lines
3.9 KiB
Plaintext
Executable File
162 lines
3.9 KiB
Plaintext
Executable File
{$I HM2ID.pas}
|
|
|
|
procedure FillHM2Array;
|
|
var
|
|
data,index : longint;
|
|
connector,pin : byte;
|
|
begin
|
|
data := Read32(HM2CookieOffset);
|
|
if data <> HM2Cookie then
|
|
begin
|
|
Writeln('No HM2 Hardware Found');
|
|
halt(2);
|
|
end;
|
|
data := Read32(IDROMPointer);
|
|
IDROMOffset := data;
|
|
for index := 0 to IDROMSize-1 do
|
|
begin
|
|
data := Read32(IDROMOffset+index*4);
|
|
IDROMAsArray[index] := data
|
|
end;
|
|
for index := 0 to IDROMHeaderSize-1 do
|
|
begin
|
|
IDROMHeaderAsArray[index] := IDROMAsArray[index];
|
|
end;
|
|
IDROMHeader := IDROMHeaderType(IDROMHeaderAsArray);
|
|
ModuleOffset := IDROMHeader.ModulePointer div 4;
|
|
PinDescOffset := IDROMHeader.PinDescPointer div 4;
|
|
end;
|
|
|
|
procedure MakeOutputMasks(ourgtag : byte;ourchan : byte);
|
|
var
|
|
index : word;
|
|
mask : longint;
|
|
maskptr : word;
|
|
begin
|
|
for index := 0 to MaxPins-1 do
|
|
begin
|
|
PinDescsAsArray[index] := IDROMAsArray[index+PinDescOffset];
|
|
end;
|
|
PinDescs := PinDescType(PinDescsAsArray);
|
|
for index := 1 to IDROMHeader.IOWidth do
|
|
begin
|
|
with PinDescs[index] do
|
|
begin
|
|
{writeln(Gtag,' ',Pnumber);}
|
|
if ((index-1) mod IDROMHeader.PortWidth) = 0 then mask := 1;
|
|
if (GTag = ourgtag) and (Chan = ourchan) and (Pnumber and byte(OutputMarker) <> 0) then
|
|
begin
|
|
maskptr := (index-1) div IDROMHeader.PortWidth;
|
|
OutputMasks[maskptr] := OutputMasks[maskptr] or mask;
|
|
end;
|
|
end;
|
|
mask := mask shl 1;
|
|
end;
|
|
end;
|
|
|
|
procedure SetAllHM2OutputMasks;
|
|
var
|
|
index : word;
|
|
mask : longint;
|
|
maskptr : word;
|
|
begin
|
|
for index := 0 to MaxPins-1 do
|
|
begin
|
|
PinDescsAsArray[index] := IDROMAsArray[index+PinDescOffset];
|
|
end;
|
|
PinDescs := PinDescType(PinDescsAsArray);
|
|
for index := 1 to IDROMHeader.IOWidth do
|
|
begin
|
|
with PinDescs[index] do
|
|
begin
|
|
if ((index-1) mod IDROMHeader.PortWidth) = 0 then mask := 1;
|
|
if (Pnumber and byte(OutputMarker) <> 0) then
|
|
begin
|
|
maskptr := (index-1) div IDROMHeader.PortWidth;
|
|
OutputMasks[maskptr] := OutputMasks[maskptr] or mask;
|
|
end;
|
|
end;
|
|
mask := mask shl 1;
|
|
end;
|
|
end;
|
|
|
|
procedure UpdateAllHM2OutputMasks;
|
|
var
|
|
index : word;
|
|
begin
|
|
for index := 0 to MaxConns -1 do
|
|
begin
|
|
if OutputMasks[index] <> 0 then
|
|
begin
|
|
Write32($1100+index*4,OutputMasks[index]); { ddr }
|
|
Write32($1200+index*4,OutputMasks[index]); { altsource }
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure ZeroMasks;
|
|
var index : word;
|
|
begin
|
|
for index := 0 to MaxConns -1 do OutputMasks[index] := 0;
|
|
end;
|
|
|
|
function GetModuleInfo(module : byte; var base : word; var numregs : byte) : boolean;
|
|
var
|
|
foundit : boolean;
|
|
index : word;
|
|
begin
|
|
foundit := false;
|
|
base := 0;
|
|
numregs := 0;
|
|
for index := 0 to MaxModules*3 -1 do
|
|
begin
|
|
ModulesAsArray[index] := IDROMAsArray[index+ModuleOffset];
|
|
end;
|
|
Modules := ModuleType(ModulesAsArray);
|
|
for index := 0 to MaxModules -1 do
|
|
begin
|
|
if Modules[index].GTag = module then
|
|
begin
|
|
foundit := true;
|
|
base := Modules[index].BaseAddr;
|
|
numregs := Modules[index].NumRegisters;
|
|
end;
|
|
end;
|
|
GetModuleInfo := foundit;
|
|
end;
|
|
|
|
function GetModuleStrides(module : byte; var regstride : word; var inststride : word) : boolean;
|
|
var
|
|
foundit : boolean;
|
|
mstrides : byte;
|
|
index : word;
|
|
begin
|
|
foundit := false;
|
|
inststride := 0;
|
|
regstride := 0;
|
|
for index := 0 to MaxModules*3 -1 do
|
|
begin
|
|
ModulesAsArray[index] := IDROMAsArray[index+ModuleOffset];
|
|
end;
|
|
Modules := ModuleType(ModulesAsArray);
|
|
for index := 0 to MaxModules -1 do
|
|
begin
|
|
if Modules[index].GTag = module then
|
|
begin
|
|
foundit := true;
|
|
mstrides := Modules[index].Strides;
|
|
end;
|
|
end;
|
|
if (mstrides and $0F) = 0 then
|
|
regstride := IDROMHeader.RegStride0
|
|
else
|
|
regstride := IDROMHeader.RegStride1;
|
|
if (mstrides and $F0) = 0 then
|
|
inststride := IDROMHeader.InstStride0
|
|
else
|
|
inststride := IDROMHeader.InstStride1;
|
|
|
|
GetModuleStrides := foundit;
|
|
end;
|
|
|