Речь идёт о выборе наиболее удобного аппаратного диспетчера памяти.Сообщение от Xrust
В чистом виде цельнобанковая коммутация по 64 кб невозможна, даже если для переключения использовать команду OUT. Потому что тогда нет никакого способа как программе или данным попасть из основной банки в дополнительные. Коммутацию можно делать только если дополнительные банки имеют хоть немного ПЗУ или некоммутируемый фрагмент ОЗУ (или хотя-бы имитацию некоммутируемости участка ОЗУ, путём загрузки в банки одинаковых кодов).
Чтобы всё-же получить диспетчер с коммутацией в 64К, необходимо разбить 64К на несколько коммутируемых окон, что позволяет одновременно включить в адресное пространство фрагмент основной банки памяти и фрагмент дополнительной банки. После загрузки в дополнительные банки подпрограммы для коммутации (для имитации некоммутируемого участа) в дальнейшем можно коммутировать ОЗУ уже не в окне, а целыми банками по 64К. Кстати, первый в СССР диспетчер памяти был применён в ИРИШЕ (1984) и он был именно такого типа. В нём коммутировалось всё адресное пространство в 64К, но оно было разбито на 4 независимо коммутируемых окна по 16К, что позволяет осуществить начальную произвольную загрузку доп.банок, и после загрузки в доп.банку небольшого куска кода (программы коммутации) можно использовать и цельнобанковую коммутацию по 64К.
Таким образом без некоммутируемого ПЗУ (или имитацией этого в ОЗУ) невозможно переключать банки целиком. В то же время наличие некоммутируемого фрагмента ОЗУ, как это сделано в ОРИОНЕ, совершенно не является обязательным, хотя и упрощает жизнь программисту (освобождает от необходимости переставлять стек при включении очередной банки). Исходя из этого, а также установившихся в бытовых ЭВМ стандартов на входы в ПЗУ и по принципу, что "чем проще, тем лучше", самой удобной будет коммутация с окном в 62 кб, оставляя окно F800...FFFF некоммутируемым в виде ПЗУ. Особенно это справедливо, если доп.банки используются только как VDISK, а не как полноценное ОЗУ для хранения программ или данных.
Что касается того, чтобы установить границу окна коммутации на уровне C400, CC00 или D000 (т.е на уровне BDOS CP/M), чтобы при переключениях памяти сам код CP/M не изменялся, отчего вызов функций CP/M был бы возможен из любой банки, то это также совершенно не требуется. Во-первых, уровень BDOS в разных версиях ДОС меняется, а во-вторых, даже если это и требуется, то легко скопировать в доп.банки весь код CP/M BDOS+BIOS, с'имитировав тем самым некоммутируемость.
Ещё одной идеей для коммутируемости может быть некоммутируемость ZERO-page CP/M, т.е 256 байт ОЗУ 0000...00FF. Это позволяет получить, как максимально высокий TPA до FF00 (перегрузив исполняемый код CP/M 2.2 в доп.банки), так и позволяет использовать в каждой банке максимум, а именно - 63.75 килобайт памяти.




Ответить с цитированием