Теперь бы ещё схему контроллера microSD попроще без дефицитных преобразователей 5 Вольт в 3 Вольта.
PVV wrote:Еще, я с CRC не понял, для SD она нужна?
Для надёжных носителей контрольные суммы секторов не нужны (думаю, что КС есть у физических секторов microSD и она сама их контролирует). Но на случай порчи данных другими "пользователями", т.е при доступе на PC или в телефоне, КС позволят обнаружить повреждение. Хотя КС иметь и невыгодно. Т.к на каждый сектор тратится не 128 байт, а 129, то в 8 кб, влезет не 64 сектора, а лишь 63, что неприятно для расчётов.
PVV wrote:Есть вообще образ дискеты с программами? Что бы его сразу же в эмуляторе подключить?
Образы файлов ODI конечно есть, но они для дискеты и КНГМД на ВГ93, есть и образы дискет для РК-КНГМД, но для них нет версии SteinBlume, копировать на них и с них файлы нечем. Образов для microSD конечно нет. Их можно потом получить, но каждый файл надо записывать отдельно, т.е все файлы по одному. И не командой SAVE, т.к она пишет с кратностью в 2 лог.сектора из-за чего размеры некоторых файлов увеличиваются на 128 байт. Делать SAVE надо POWER-ом.
Удобнее файлы заносить (только на диск A:) программкой TAPE (во вложении). Она читает файлы с МГ-ленты в формате по I. Кстати зачем Вы переделали формат ввода по I на формат ввода по R. Формат по R вообще никто на Специалисте не использовал. Неудобно ориентироваться на МГ-ленте если файлы без имени.
А авторы эмуляторов от лени (чтобы было проще взять процедуры от РК86) сделали стандартным формат по R и в таком формате наплодили кучу файлов с расширением RKS. Файлы грузящиеся по I тоже с расширением RKS. Чтобы не путаться у меня в файлах с форматом без имени расширение rks маленькими буквами, а в формате с именем (т.е для ввода по I) - заглавными буквами RKS.
Если же в системе есть другие дисковые приводы, то можно заполнить их файлами и например POWER-ом или PIP-ом скопировать на флэш-диск. Нортона для Специалиста у меня пока нет, и сомневаюсь, что нортон от Специалиста-MX корректный и подойдёт.
Пока не забыл, поясню некоторые моменты в данном BIOS. CHKSYS это подпрограмма нужная лишь при РК-КНГМД. ВГ93 сам выключает мотор спустя несколько секунд после последнего в него обращения. А в РК-КНГМД такого нет. РК-ДОС это знает и сама выключает мотор, а CP/M нет.
Потому организуется счётчик STOPCNT. В него записывается 255 при старте мотора и каждом вызове подпрограмм чтения/записи сектора, а вызов подпрограммы CHKSYS уменьшает байт STOPCNT на 1. Как только счётчик достигнет 0, мотор будет остановлен процедурой OSTANOV. CALL CHKSYS стоит на входе подпрограммы STATUS консоли. После последнего доступа к диску мотор будет работать до тех пор пока программа или CCP 256 раз не вызовет STATUS консоли. Тогда мотор (примерно через несколько секунд) остановится.
FLSHFL это флаг о том, что данные в дисковом буфере были изменены. Буфер не пишется на дискету после записи каждого лог.сектора в 128 байт (только при записи последнего лог.сектора физического сектора). Потому, если размер файла не кратен размеру физического сектора, то данные записи относящиеся к последнему физ.сектору файла остаются в ОЗУ, на дискету ещё не переписаны. Если после этого CP/M будет читать/писать другой (не следующий) сектор или, если будет Disk Reset, то надо скинуть буфер на дискету, иначе конец файла утратится.
Для этого служит подпрограмма FLUSH. Она проверяет по флагу FLSHFL менялись ли данные в дисковом буфере, и если да то, то физ.сектор записывается на диск и система готова читать/писать другой физ.сектор. Если сектора имеют размер точно в 128 байт, то они сразу пишутся на диск и флаг FLUSH не нужен.
В данном BIOS есть параметр SEC_N0. Если он не 0, то считается, что физические сектора нумеруются с 0. В РК-КНГМД сектора нумеруются с 0 и так же поддерживает РК-НГМД эмулятор EMU80. В CP/M обычно и физические и логические сектора нумеруются с 1. Для эмулятора и в реале в начале, когда ещё нет дискет с нумерацией секторов с 1, надо использовать дискету от РК-ДОС, где сектора нумеруются с 0. Загрузившись можно запустить форматёр CP/M в котором сектора нумеруются с 1. А в эмуляторе EMU80 надо менять обслугу РК-КНГМД для CP/M.
FLAGA, FLAGB... это флаги показывающие была или нет уже сделана настройка на формат диска для этого привода. В версии DOS, в которой поддерживается мультиформатность дискет (за счёт считывания параметров формата из BOOT-сектора) выставленность флага означает, что была прогнана процедура настройки на формат диска и имя дискеты было считано из BOOT-сектора с оффсетом в $20. В моих версиях CP/M имя диска до 15 байтов, в OS-DOS - меньше, кажется 8 (да и вообще надо посмотреть это у них имя дискеты или имя ОС на системных треках, т.к это имя записывает форматёр и при перестановке диска в B: это имя никак не менялось), а в версиях CP/M от ОРИОН-СЕРВИС имени у дискеты нет.
А в версиях, где всего один формат и в BOOT-секторе дискеты в начале нет никакой служебной информации (точнее может быть, но не влияет), там в WBT нет CALL NASTR, хотя по SELDSK имя дискеты считывается. Жалею, что не сделал КС у имени дискеты, с чужих дискет читается мусорное имя дискеты. В некоторых версиях CP/M в BOOT-секторе располагался ещё блок имён юзеров (по 11 байтов на юзер, всего 11*16=176), был даже такой нортон, где имена активных юзеров (т.е в которых есть файлы) выводились как подкаталоги. И даже была вложенность подкаталогов (первый нибл - номер юзера, второй - в какой юзер он вложен).
Тимплет это программируемый буфер CONIN. На входе CONIN стоит простенькая процедура его обслуживания. Она проверяет есть ли байты в буфере и, если есть, то символ берётся не с клавиатуры, а из буфера и весь буфер LDIR-ом сдвигается к началу. Если же первый байт буфера равен 0 (что значит, что буфер пуст), то происходит переход на ввод с клавиатуры. Буфер тимплета называется NNBUF, его размер задаётся параметром BUFLEN (им я обычно подгоняю размер BIOS, чтобы не пропадало ни байта до кратности параграфа). В NNBUF первым байтом стоит или 0 или число показывающее сколько символов ещё осталось в буфере. А перед буфером стоит число BUFLEN, информирующее программы о размере тимплета.
что даёт буфер ввода CONINЛюбая программа может занести в тимплет одну или много строк. Например, так в простых версиях без использования $$$.SUB обслуживается файл AUTOEXEC.SUB/.BAT. В CP/M-BIOS ОРИОНА до хрена свободного свободного места в BIOS, в ACPM это место и его размер указан в блоке параметров (DC90). Драйвер программирования функц.клавиш грузится в своб.место в BIOS и на вход BIOS, где JMP CONIN, ставит JMP на себя. Этот драйвер контроллирует, что считалось с CONIN и, если считался запрограммированный код функц.клавиши (он же кОнтрол-код: 0...4), то проверяется нажатие клавиши Control. Если она не нажата, значит код получен от <F1>....<F5>, а не по сочетанию Control+(@/A/B/C/D). Тогда заданная при программиронии функциональной клавиши строка просто копируется в буфер NNBUF и делается JMP CONIN. И по считыванию клавиатуры в программу уходит заданная строка: (например, по нажатию <F1> выводится строка 'DIR A:', по <F2> - 'DIR B:'. Удачно, что и в матрице MS7007 и в РК-матрице клавиша <Control> стоит на той же линии ППА (отчего контроль нажатия <Control> общий). Ценой в десяток строк кода добавляется удобный сервис (так же в Роботроне-1715).
В BIOS Корвета дисковый буфер имеет размер 2 кб (2 физ.сектора по 1 кб), чтобы быть равным блоку CP/M. Якобы это ускоряет. Для CP/M-48К я использовал дисковый буфер в один сектор (для ОЗУ в 48К надо экономить). И на скорости это никак не отразилось, потому нет смысла делать буфер равным размеру блока.
You do not have the required permissions to view the files attached to this post.