Не понимаю как можно применить процедуры чтения/записи целого файла при адаптации CP/M на другое железо
Адаптация CP/M под конкретное железо заключается в основном в написании всего двух подпрограмм низкого уровня в CP/M-BIOS. Это считать и записать логический блок размером в 128 байт. В случае сетевой DOS даже не требуется писать так называемую процедуру деблокирования (чтение в дисковый буфер физического сектора или целого CP/M-блока, поиск в буфере и пересылка на DMA участка в 128 байт), а достаточно написать только подпрограмму запроса и приёма из линии прямо на DMA нужного логического блока в 128 байт и передачу в линию из DMA такого же логического блока.
Со стороны сетевого сервера Вам не надо иметь BDOS, а надо иметь доступ к массиву секторов по 128 байт любой природы. Это может быть как ОЗУ, так и физический носитель, - файл размером в размер диска (образ диска). Можно сразу использовать формат образа диска CP/M ОРИОНА.
А я делал образ состоящий из множества файлов, каждый из которых представляет CP/M-трек. CP/M допускает до 255 лог.секторов в треке (т.е до 31 кб в треке). Это удобнее тем, что размер диска можно держать минимальным и при нужде очень просто увеличить размер диска. Большие диски не выгодны, т.к растёт размер требуемых буферов, отчего сокращается уровень TPA и быстро падает скорость работы, особенно если скорость чтения/записи секторов невелика.
Работа с фрагментированным на файлы-треки образом диска происходит быстрее, чем с одним гигантским файлом. Еще одним плюсом разбиения образа диска на файлы-треки является возможность буквально за полчаса написать сервер обслуживания сетевой DOS на бейсике-компиляторе (Power Basic, Quick Basic и т.п). Бейсик не работает с данными больше, чем в 64 кб, потому файл с размером в 31 кб удобно читается в массив целых. Вот так:
Code: Select all
DIM DAT%(31 * 512)
. . . .
OPEN "R", #2, FILNAME$
FIELD #2, 128 AS BUFFER$:
FOR S = 0 TO 31 * 4 - 1
GET #2, S + 1
FOR I = 0 TO 127
Y$ = MID$(BUFFER$, I + 1, 1)
DAT%(S * 128 + I) = ASC(Y$)
NEXT I
IF EOF(2) <> 0 GOTO LOADED
NEXT S
LOADED:
А на Паскале и Си, где нет никаких ограничений на размер массива и тип его компонент, написать сервер выполняющий чтение (запись) с винчестера фрагментов по 128 байт и их передачу (и приём) с линии ещё проще.