Сделать данный клон более ламповым, т.е близким к оригиналу, позволит введение RK-DOS. Для чего достаточно предусмотреть ПЗУ в области E000...EFFF, где в реале располагается ПЗУ RK-DOS и встроить в эмулятор два вызова функций эмулятора - чтение и запись сектора в 512 байт. А в коде RK-DOS вместо подпрограмм чтения/записи сектора работающих по железу встроить вызов процедур эмулятора. Тогда DOS сможет работать в эмуляторе как в реале, что не только обеспечит ламповость, но и запуск программ будет не за счёт имитации работы с магнитофоном, а из нортона ДОС, что намного удобнее.
Авторы эмуляторов EMU и EMU80 полностью эмулировали работу КНГМД путём отлавливания команд записываемых в регистр команд ВГ93, а для РК-КНГМД вообще эмулировали работу с дискетой на самом низком уровне в реальном времени. Но это совершенно не требуется, т.к с регистрами ВГ93 или с железом РК-КНГМД работает только сама DOS (не считая форматёра дискет). Потому достаточно написать эмуляцию чтения/записи сектора на абсолютно любом носителе и в эмуляторе, причём с затратой труда на два порядка меньшей, получается поддержка дисковода. Это ничуть не хуже, т.к при перехвате команд для ВГ93 точно также не работают форматёры дискет. Да и кому сейчас надо отлаживать форматёры дискет в эмуляторе?
В EMU и EMU80 нет функций эмулятора доступных из программ КР580, написанных специально для эмулятора. Потому и приходится делать полную эмуляцию контроллера дисковода. А в моих древних эмуляторах для MSDOS принцип поддержки дисковода иной. Там слегка переделывается код DOS. И кстати, не требуются образы дискет (что неудобны), вместо них используется каталог, из которого файлы при старте эмулятора перегружаются в эмулируемую дискету. Программам всё-равно как физически устроен дисковый носитель, с ним они общаются только функциями DOS и не лезут напрямую в железо.
Нужны лишь две функции эмулятора доступные из программ КР580. В своих эмуляторах я использовал для этого команду INIR (Z80), передавая в регистре А номер функции, а в других регистрах - параметры. Для процедур чтения/записи сектора надо передавать три параметра - номер трека, номер сектора и адрес DMA. Можно применить лишь 2 параметра, используя LBA принцип адресации секторов. Если Вы введёте в эмулятор две такие процедуры, то истратив 2 минуты, на замену п/п-рамм чтения/записи сектора на вызов функций эмулятора, я странслирую Вам RK-DOS для данной конструкции.
Если для вызова функции эмулятора сложно отлавливать код команды, можно отлавливать адрес. Например, ввести перехват адреса FFFF как входа в подпрограмму (т.е вход в функцию по CALL FFFF). Тогда в коде DOS подпрограммы чтения и записи сектора будут состоять всего из 3-х команд загрузки регистров и JMP FFFF.
[свернуть]