Files
linuxcnc/5i24/utils/dos/source/HM2LOW.PAS
Thaddeus-Maximus f3953d66ae ?
2026-04-03 15:58:58 -05:00

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;