New(Psh[4, 1]);
Переводим на C#. Правда, тут есть одна загвоздка. Массивы в c# начинаются только с 0, и надо смотреть: либо заводить холостой 0-й элемент, либо корректировать индексы. Так что перед нами два варианта.
Psh[4][1] = new short[393];
Psh[3][0] = new short[392];
(для примера работаю со вторым)
function OpenA(FileName: ShortString; Mode: LongWord): integer;
Stream OpenA(string FileName, FileAccess access);
Как перевести ReadA? Это не так просто. Дело в том, что языки со стандартным промежуточным кодом (к ним относятся в первую очередь языки семейства Java и .NET) обычно пишут в порядке байтов Motorola. На Delphi файл писался в порядке Intel. Так что мы считываем 392 word’а, а затем смотрим, что делать: либо обернуть байты, либо сказать: теперь у нас новый стандарт — Motorola!
if (!ReadA(Df[3][0], Psh[3][0], 392) {
CloseA(Df[3, 0]);
Psh[3][0] = null;
return;
}
И последний рывок.
Pkts[4, 1]:= @Psh[4, 1]^[9];
Из-за отсутствия указателей (точнее, есть они, но мы же не хотим unsafe-кода) придётся Pkts разбивать на две части: ссылку на массив и смещение в массиве.
Pkts[3][0].array = Psh[3][0];
Pkts[3][0].offset = 8;