|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Как получить CP/M для своего железа
Author |
Message |
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 584 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Запрет создания листинга делает псевдокоманда M80 .xlist в начале конкретного исходника. Достаточно закомментировать эту строку и в командной строке CCP для M80 до знака "равно" указать два целевых файла. Команда .list наоборот включает создание исходника для последующих строк, что полезно, если весь исходник не интересует, а лишь крошечный фрагмент. Почему не будет, ведь кроме привода на микро-SD, полезно иметь и VDISK из ОЗУ? Хотя бы потому, что ОЗУ быстрее и у флэш-памятей ограниченный ресурс перезаписей. Хотя для версии в ПЗУ, где его вдвое больше, чем надо, экономить незачем, но для любой, даже для версии без эл.диска, модуль-A полезен (можно считать, что это просто код для инициализации железа, при нужде его можно включить в холодный загрузчик, хотя это погубит его универсальность). И даже не только потому, что иметь стартовый AUTOEXEC.SUB удобно, а потому что под код инициализации драйвера (т.е его подключения к векторам ПЗУ), под вывод титров, под загрузку мелких латинских букв (выводимых вместо русских в КОИ-Н2) глупо тратить место в CP/M-BIOS, опуская тем самым уровень TPA. Я как раз не использую загрузку с системных треков, мои DOS грузятся из ROM-диска, оформленные в виде файлов ORDOS. Обычно в ROM-диске я имел одну CP/M для ВГ93, вторую для РК-КНГМД и MS-COMAN$ С.коровкина для чтения/записи MSDOS-дискет (это для обмена файлами с моей 386-той PC). Вот (на картинке) только малая часть CP/M в виде файлов для ROM-диска и инсталляторы тех же версий под дискету. Для банки ОРИОНА N2 я тоже несколько лет делал DOS, например Турбо-DOS, CP/M-Plus, и OD, т.е общая DOS (но на ПРО она так и не заработала у В.Пушкова). В версиях для инсталляторов DOS (файлов типа SG.COM) добавляются ещё два модуля - TR0.ASM и SG.ASM. Первый это содержимое BOOT-сектора, вторичный загрузчик раскручивающий загрузку CP/M с системных дорожек дискеты, а второй это сам инсталлятор, простая программа, что запрашивает на какой дискетный привод писать, запрашивает установку дискеты, а затем считав BOOT-сектор дискеты (чтобы узнать сколько секторов в треке, сколько сторон и какой низкоуровневый формат FM или MFM), записывает системные треки.
Last edited by barsik on 19 Nov 2019 10:30, edited 1 time in total.
|
19 Nov 2019 05:26 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
Вот, спасибо! Не знал. Теперь есть весь листинг. Если будет SD, то, к примеру, для обычного Специалиста с 48КБ ОЗУ, рамдиск будет же это ОЗУ отъедать, зачем он там нужен? Для других ПК с доп ОЗУ это другое дело. Уменьшил размер рамдиска до 8КБ. Попробовал добавить строку include sd_proc.inc в BIOS.ASM после строки include RKFLOP.INC, так сборщик ругается, BIOSIZ over ! ... и без RKFLOP.INC ошибки, не найдены ссылки... что там можно выкосить?
|
19 Nov 2019 06:42 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 584 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Сейчас (через ~час) сделаю простую версию с упрощённым стартовым модулем A (только формат ЭД и титры) и с подготовкой для вставки нового кода в BIOS второго привода. RKFLOP.INC Вам не нужен, тем более, что поддержка РК-КНГМД есть только в EMU, зато в нём кажется нет поддержки контроллера microSD (но это я не знаю, я пользуюсь старой версией из февраля 2018). У меня есть версия EMU80, что поддерживает кучу банок ОЗУ (банка 0 - 48К, остальные банки по 62К)отключение ПЗУ в банке 0 (тогда и в банке 0 62К), РК-КНГМД и КНГМД на ВГ93, а также ROM-диск от ОРИОНА. В EMU80 чуть сложнее, чем в EMU менять конфиг, но в принципе можно также получить архитектуру, когда есть доп.сегмент в 16К и он закрывает окно 8000...BFFF, и при этом синхронно переключаются и две страницы ПЗУ (на 27256) в 14К. При изменениях в BIOS смотрите в листинге, сколько байтов @OVER или сколько байтов @FREE и соответственно меняете адрес в EQU для BIOS в файле PARAMS.INC. Адрес BIOS обычно есть сам как параметр, но в данной версии чуть иначе, - надо менять параметр BIOSIZ (это место зарезервированное по код BIOS, т.е это максимальный размер BIOS, что ещё без конфликтов ячеек). BIOSIZ ставите таким, чтобы реальный код BIOS был немного меньше, т.е чтобы в BIOS оставались бы байты FREE и сообщения о том, что размер превышен не было бы. Желательно подогнать адреса так, чтобы байтов FREE было менее 10H (можно сделать и 0 свободных, но лучше, чтобы адрес BIOS был выровнен на параграф, т.е младший нибл адреса BIOS д.быть =0). Например, если @OVER= 65H, то увеличиваете BIOSIZ на 70H. Аналогично и для модуля A, там тоже стараетесь изменяя адрес BOOT, чтобы свободных байтов было не более 16 (тогда обычно у меня пишет, что размер модуля нормальный). Весь слинкованный блок считанный из ROM-диска (или дискеты) грузится на адрес PLACE. Начальный загрузчик (это LDIR в самом начале модуля A) перекидывает весь блок A+CCP+BDOS+BIOS на адрес BOOT, в итоге все 4 блока оказываются на своих адресах, где они должны работать. Такой перекидыш это наследство от ОРИОНА, т.к там ORDOS не может загрузить файл сама в себя, а впустую тратить 2 кб, тоже не дело. Потому там сначала блок грузится на PLACE ниже ORDOS, а потом командой LDIR перекидывается вверх затирая ORDOS. Для Специалиста стартовый LDIR можно убрать, сделав стартовый адрес - BOOT. В версии для ПЗУ или грузящейся из ROM-диска не надо тратить целых $1600 для хранения копии CCP+BDOS. Можно даже забить подкачку по WBT в BIOS. Но это плохо, в определённых условиях будут улёты, если не заменить подкачку обнулением служ.ячеек BDOS. Но не меняя дисков и не нажимая лишний раз ^C можно даже не перезакачивать коды CCP+BDOS (но тогда затирать CCP нельзя, т.е нельзя запускать программы которые его затирают).
Last edited by barsik on 19 Nov 2019 12:12, edited 1 time in total.
|
19 Nov 2019 10:39 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
Во вложении мои правки и конфиг для emu.
|
19 Nov 2019 11:59 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 584 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Теперь бы ещё схему контроллера microSD попроще без дефицитных преобразователей 5 Вольт в 3 Вольта. Для надёжных носителей контрольные суммы секторов не нужны (думаю, что КС есть у физических секторов microSD и она сама их контролирует). Но на случай порчи данных другими "пользователями", т.е при доступе на PC или в телефоне, КС позволят обнаружить повреждение. Хотя КС иметь и невыгодно. Т.к на каждый сектор тратится не 128 байт, а 129, то в 8 кб, влезет не 64 сектора, а лишь 63, что неприятно для расчётов. Образы файлов 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К надо экономить). И на скорости это никак не отразилось, потому нет смысла делать буфер равным размеру блока.
Last edited by barsik on 19 Nov 2019 21:19, edited 1 time in total.
|
19 Nov 2019 13:35 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
можно проще все сделать, резисторные делители все решают, проверено, работает тока так. Как вариант, схема Галаксии. Но такая схема проще, а можно и вот так, на клавиатурной ВВ55 на ножках магнитофон вход, выход, светодиод рус-лат и одной свободной, что есть на порту С... для варианта подключения SD по SPI, который мы используем, crc нет. вот именно они и нужны, для начала представим, что SD на много ГБ , это одна дискетка на 1МБ... Я и забыл, что так можно. В SDOS я RKS файлы читаю только в эмуляторном формате и emu так хочет...
|
19 Nov 2019 16:12 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
вот здесь еще проще, можно даже на 2х корпусах сделать, если выбросить 74ls244. И ОК можно не диодом, а вторым элементом 74ls244 сделать, но на трех корпусах тогда получится. Вот со скоростью и раздуванием кода, это да...тут надо выбирать или затратить время на сборку SD интерфейса на 5и корпусах и получить максимально возможную для ВМ80 (z80) скорость, или сделать быстро простую схему, но всегда потом тратить время в эксплуатации...
|
20 Nov 2019 05:42 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Тоже хочу приделать SD карточку к Партнер 01.01. Насколько я понял emu умеет это симулировать контроллер который на ИР24? CP/M будет размещаться в ROM (вместо BASIC-а) c адреса 0A000h т.е. получится немного меньше 40К свободной RAM. За ROM-ом (8К) еще RAM около 6К - там экран и всякие рабочие буфера/ячейки/данные... Кривоватость получилась из-за того, часть данных осталась в ПЗУ, а часть перенесена в ОЗУ, но без всякой инициализвции. Но меня больше интересовала возможность работать с файловой системой через COM порт - это в принципе получилось. Сейчас надо будет перенести точки входа BDOS в ОЗУ. Данные и стек CCP тоже в ОЗУ. Тогда может даже заработает SUBMIT. Я так понял, что он (SUBMIT) на основании SP находит данные CCP? Карта памяти получится примерно такая: В новом компе нет COM портов. Поэтому пока все в emu. Чисто через COM порт получается довольно медленно. вопросики и советики: 1.Настроить emu (партнер) для SD. И какая схема в нем работает, посмотреть в proteus-е. Примеры из FatFs для SD запустить получилось. Примерчики работы с SD на ASM 8080 (в мнемонику z80 не сразу въезжаю). Во вложении мой конфиг. Туда я добавил 2 шт ВВ51. Может не совсем правильно. Кстати прерывания от ВВ51 срабатывают только на прием символа и не всегда (много не проверял). 1.Как сделать образ SD карты для CP/M? Или достаточно будет, для начала, весь файл прописать 0E5h. Что прописывать в DPT для этого образа? 2.wBoot будет указывать не на BOIS+3 а на BIOS+7/8/9 - нужно переключать карту памяти. Где-то читал, что некоторые программы ставят свой стек на wBoot-3?
|
26 Nov 2019 23:14 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
и не только на ИР24, но сейчас остановимся на ней. Вот тут есть файлы, можно посмотреть и конфиг emu и схему в протеусе со всеми dll, с поддержкой SD. Примеры для работа с SD в исходниках SDOS. нумерация пунктов вопросов сбилась ... для начала можно просто взять дискетный образ в 800КБ и записать его на SD... ну и что, что SD на много мегабайт или вообще гигабайт... дальше же надо такие образы записывать на обычный fat16 раздел, используя, к примеру, описанный мною ранее механизм 'косвенного монтирования'. деже не понимаю о чем речь.
|
27 Nov 2019 02:59 |
|
|
PVV
Doomed
Joined: 12 Feb 2016 13:39 Posts: 463
|
Собрал два варианта SDOS с быстрым SD интерфейсом и медленным, так вот разница в размере кода ~150байт. Может имеет смысл пересмотреть код работы с картой? Да, получится еще медленней, ~10%, по моим прикидкам, свернуть код в цикл надо, но на общем фоне, это уже не столь важно. что то не получается, а то я в ожидании...?
|
28 Nov 2019 08:41 |
|
|
barsik
Doomed
Joined: 19 Feb 2017 03:46 Posts: 584 Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
|
Извиняюсь за паузу. Я не забыл. Просто не думал, что это кому-то надо и сейчас. Т.к чтобы поиметь простую классическую версию достаточно всего лишь иметь исходники оригиналов CCP, BDOS и простейший BIOS в котором в качестве CONIN/CONOUT используются п/п-ммы ПЗУ. Тут весь труд заключается в написании процедуры WBT, горячего старта с подкачкой CCP+BDOS с дискового привода и процедуры старта, что просто делает JMP на начало BIOS, т.е на Cold Boot. Я собирался сделать такую простую версию для реала, т.е для реального дисковода. Для чего эмулятор очень удобен. Но потратил много времени пока разобрался с идеосинкразиями эмулятора и нашёл и странслировал своё ПО для ОРИОНА 20-25 летней давности. Т.к кое-что забыл, пришлось разбираться, отлаживать, тестировать в эмуляторе. В моём варианте в WBT подкачка CCP+BDOS делается из ОЗУ или ROM-диска, а в классическом варианте это делается процедурой которая средствами BIOS читает 44 лог.сектора на адрес CCP. Я завтра странслирую, в смысле отлажу в эмуляторе простую версию для Специалиста, вариант из 1990 года, а также улучшенную версию. Вот пока информация. Обычно в промышленных ЭВМ CP/M BIOS в ПЗУ, а CCP+BDOS подкачивают с дискеты. В любительских, BIOS обычно тоже грузится с дискеты загрузчиком. Загрузчик в ПЗУ м.быть один, это когда для одной единственной версии DOS и загрузчик заранее знает куда и сколько грузить код CP/M-BIOS. А для более грамотных систем первичный загрузчик из ПЗУ машины читает с BOOT-сектора дискеты вторичный загрузчик (обычно на адрес 0 в нужной банке) и передаёт ему управление. Вторичный загрузчик сам знает куда ему грузить код BIOS (в моих версиях грузятся сразу CCP,BDOS,BIOS и все другие блоки одним сплошным массивом, это быстрее), а в классическом варианте вторичный загрузчик грузит только BIOS (это обычно всего ~3 кб). Вот как выглядит классический Warm Boot, может это подскажет Вам как считать 44 лог.сектора из вашего привода. | | | | Code: CURDEV EQU 0004H ; ТЕКУЩИЙ ПРИВОД IOBYTE EQU 0003H ; БАЙТ НАЗНАЧЕНИЯ УСТРОЙСТВ
DOSLEN aset 44 ; стандартный размер CCP + BDOS DOSSEC EQU 21 ; сектор начала CCP DOSTRK EQU 0 ; трек начала CCP
OFFS EQU 60H ; отступ до начала CCP ; в секторе CCP на дискете if OFFS ne 0 DOSLEN aset DOSLEN+1 ; длина CCP + BDOS с учетом OFFS endif
; ----------------------------------------------
CHECK: LD C,0 CALL SELDSK LD C,DOSTRK ; трек начала CCP CALL SETTRK LD C,DOSSEC ; сектор начала CCP CALL SETSEC LD BC,CCP-OFFS ; куда грузить CALL SETDMA CALL READ OR A RET Z BADTR0: CALL BADLY WBT: LD SP,0080H CALL RESET
CALL LOADCCP
XOR A LD (C_MODE),A ; моно цветного драйвера LD (LOCK),A ; верхний регистр (CAPS LOCK) LD (RUSLAT),A ; русский регистр LD (INVERS),A ; безинверсно
LD A,(CURDEV) LD C,A JP CCP
; ----------------------------------------------
BADLY: RST 18H defb 13,10,'BAD TRK ',0 LD A,(TRACK) ADD A,'0' RST 10H JP CONIN
; ----------------------------------------------
ERROR: POP AF ; вернем стек POP AF POP AF CALL BADLY LOADCCP: CALL CHECK ; Проверка, что системный диск наш LD C,0 CALL SELDSK CALL HOME
LD B,DOSLEN ; СКОЛЬКО ГРУЗИТЬ LD C,DOSTRK ; ТРЕК НАЧАЛА LD D,DOSSEC ; СЕКТОР НАЧАЛА LD HL,CCP-OFFS LDLOOP: PUSH BC PUSH DE PUSH HL CALL SETTRK LD C,D CALL SETSEC POP BC PUSH BC CALL SETDMA CALL READ OR A JR NZ,ERROR POP HL LD DE,0080H ADD HL,DE POP DE POP BC DEC B JR Z,LDDONE INC D LD A,(DPB00) ; число логических секторов 128 б. в треке CP D JR NC,LDLOOP ; переходим на следующий трек LD D,1 ; первый сектор трека = 1 INC C ; на следующий трек CALL SETTRK JR LDLOOP
; ----------------------------------------------
LDDONE: LD HL,(CCP) ; в начале стандартного CCP JMP xx35H LD DE,035C3H XOR A SBC HL,DE RET Z NOSYST: RST 18H defb 13,10 defb 'NO SYSTEM! REPLACE',0 CALL ERRTON RST 30H JR WBT
; ----------------------------------------------
DSKNEW: CALL FLUSH RESET: XOR A LD (FLAG_A),A LD (FLAG_B),A
LD A,95H ; байт назначения (бутафория, но надо) LD (IOBYTE),A LD HL,BEGRST ; Восстановим RST-CALLS LD DE,8 LD BC,KONRST-BEGRST LDIR ZLOAD: LD A,0C3H LD (0),A LD HL,BIOS+3 LD (1),HL LD (5),A LD HL,BDOS LD (6),HL RET
| | | | |
OFFS нужен потому что у меня все блоки на дискете идут сплошным массивом, в данном случае предыдущий блок (А) заполнил последний лог.сектор в котором его код до $60. CCP+BDOS примыкают, потому в этом лог.секторе уместится $80-$60= $20 байтов из начала CCP. Если блоки идут не впритык и грузятся многоэтапно, то начало CCP на дискете можно выровнять на начало лог.сектора и оффсет не нужен. Во вложении исходники оригиналов CCP и BDOS. Если надо, то есть и исходник BDOS с комментариями. А в Интеренет можно скачать иностранный исходник BDOS с комментариями, что в начале 80-тых дизассемблировал и снабдил комментариями кто-то из американских любителей. Но нет смысла разбираться в работе BDOS, это низачем не надо, даже, если его надо модифицировать. Ведь основные функции всё-равно менять не будешь, надо лишь дополнять (я в 1997, заметив, что в MSDOS есть даты у файлов и они полезны, решил поиметь даты и в CP/M, - и даже тогда не понадобилось менять ни бита в стандартном BDOS-е). На дискетах есть служ.информация. В принципе, она нужна лишь для дискет. Для несменяемых носителей типа microSD она не нужна. При условии, что все виртуальнве дискеты на microSD будут одного размера и формата. Вообще-то даже на microSD дискеты д.быть сменяемыми (не одна же виртуальная дискета 800К на весь microSD в 4 Гб). Чтобы не менять DPB для каждой виртуальной дискеты, они все должны иметь одинаковые параметры (т.е размер диска, размер каталога и число сист.треков, указанное в DPB). В этом случае параметры диска в начале дискеты не нужны. Но, если на microSD предполагается эмулировать дискеты разного размера, например 720, 800, 1440, 1600 кб (и их много разных) или разные партиции винчестера по 4...8 мб, то блок параметров диска в первом секторе диска надо иметь. А даже если все виртуальные дискеты на microSD имеют одинаковые параметры, то все-равно иметь BOOT-сектор полезно, т.к тут хранится имя дискеты, а в развитых версиях имена 15-ти подкаталогов (роль которых играют юзеры). служ.блок boot-сектора CP/M дискеты Содержимое ИНФО-блока (первых 32 байтов BOOT-сектора). | | | | Code: SPT EQU 5 ; sectors pro track SIDES EQU 2 ; число плоскостей (только 1 или 2) SSIZE EQU 1024 ; размер сектора (только 1024 или 512) TRKS EQU 80 ; число треков формата (35,40,42,80,82,83)
if SSIZE eq 1024 SPARM EQU 3 ; параметр размера. При MFM: 3 (1024) else SPARM EQU 2 ; параметр размера. При FM: 2 (512) endif
A0000: rept 8 defb 0 ; не используется 8 байтов (здесь код загрузчика) endm
A0008: defb 1 ; не используется A0009: defb 1 ; не используется A000A: defb SPARM ; при SD =2 (512), при DD =3 (1024) A000B: defb SIDES-1 ; при SS =0, при DS =1 A000C: defb SPT ; sectors pro track (1...11) A000D: defb 0 ; не используется A000E: defb TRKS ; число треков формата (35,40,42,80,82,83) A000F: defb 0 ; не используется
DPB: DW SPT*SSIZE/128 ; кол-во лог.секторов по 128 байт на треке defb 4 ; размер блока (3-1K, 4-2K, 5-4K, 6-8K) defb 15 ; размер блока (7-1К, 15-2K, 31-4K, 63-8K) defb 1 ; параметр экстента (0-1K, 0-2K, 1-4K, 3-8K) DW SPT*TRKS*SIDES/2-1 ; размер дискового пространства в блоках минус 1 DW 128-1 ; количество записей в каталоге минус 1 defb 11000000B,0 ; маска занятых каталогом блоков DW 128/4 ; количество контролируемых секторов каталога DW 4 ; количество резервных дорожек
A001F: defb KS ; здесь КС ИНФО-блока байтов 0...1E (= арифм.сумма +66)
A0020: rept 15 ; 15 байтов имени дискеты defb 20H endm A002F: defb 0 ; стоп-байт для вывода имени п/п-мой MSSG
| | | | |
Следующие за ИНФО-блоком 15 байтов с офсетом 20...2E содержат имя диска, а байт со смещением 2F это стоп-байт для п/п-ммы MSSG равный 0. Число треков в большинстве реализаций не используется (некоторые реализации CP/M, зная, что дисковод на 80 треков, а дискета на 40, начинают читать 40-ка дорожечные дискеты на 80-ти дорожечном флопе, делая два шага на дорожку). КС блока параметров в КОРВЕТЕ и ОРИОНЕ считаются по разному (байт 66H добавлялся, чтобы КС в байте 1F была такой-же как в КОРВЕТЕ). В Корвете TPA больше, чем в ОРИОНЕ на 4 кб и на 21 кб больше, чем в Специалисте с верхним ОЗУ. Чтобы избежать зависа при установке чужой дискеты и на случай дохлоты, целостность ИНФО-блока контроллируется подсчётом КС первых 31 байтов BOOT-сектора. Эта КС просто арифметическая сумма и читается из байта с офсетом 1F - т.е из 32-го байта. Вот каким кодом проверяется эта КС во всех версиях CP/M для ОРИОНА и Специалиста (в CP/M Специалиста MX этого нет): Таким образом, байт с оффсетом в $1F содержит КС, арифметическую сумму первых 31-го байта дискеты плюс число $66. Если КС не совпала, значит чужой или дохлый диск. Если первый байт BOOT-сектора равен $C3, то дискета считается системной. Ранее я использовал стандартный BDOS, а с 1994 года, после появления HD-дисководов, пришлось применять уже чуть доработанный (он есть в первом посте). Его отличие в одной команде, там добавлен CALL BIOS+33H в BDOS функции Disk Reset. В спойлере объяснение для чего это надо. Для недискетных, дискетных одноформатных и несменяемых приводов это не надо, достаточно стандартного BDOS. В CP/M Корвета была одна, хотя и не критичная ошибка. Хотя CP/M-BIOS поддерживает многоформатность дискет (что достигается хранением DPB конкретной дискеты в её BOOT-секторе), но процедура BDOS стандартной CP/M для сброса дисковой системы не делает настройку на формат диска. В CP/M-BIOS есть процедура настройки на формат дискеты DSKNEW. По этой процедуре с дискеты считывается DPB и далее он начинает использоваться во всех дальнейших процедурах с диском. И эта процедура в CP/M-BIOS Корвета делается только по Warm Boot. SELDSK BIOS это не делает (и это правильно, т.к иначе возник бы сильный тормоз). Это приводит к тому, что нельзя сменить дискету в программе. Это фатально тем, что инсталлировать CP/M на диск другого формата можно только при двух дисководах и в программах, например в нортонах, нельзя вставить в дисковод диск другого формата (для смены дискеты на дискету другого формата надо выйти из нортона в CCP, ввести там ^C и снова запустить нортон). Чтобы это исправить, в набор процедур CP/M-BIOS я добавил ещё один вход к имеющимся - DSKNEW по адресу BIOS+$33. А в BDOS в функцию RESET вставил CALL DSKNEW. Чтобы выиграть 3 байта я просто переставил одну подпрограмму в коде BDOS, вот так: После этого, стало возможно менять дискеты на дискеты любого формата. Я использовал дискеты без системных треков и с числом физич.треков 83 вместо 80, а также произвольное число секторов в треке. Это позволяло на HD-диске 3.5" иметь форматную ёмкость в 1660 кб при 10-ти секторах по 1 кб на каждом треке. При сокращении размера физ.сектора до 512 байт на тот же диск влезает всего 1440 кб. Формат с секторами по 512 байт выгоднее для CP/M-48К ОРИОНА в банке 0 и для Специалиста, т.к размер дискового буфера сокращается с 1 кб до 512 байт и на столько же можно поднять уровень TPA.
|
28 Nov 2019 12:38 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Подключил к Партнер 01.01 SD карточку. На основе примеров от PVV доработал конфиг. для emu и BIOS CP/M. И почти все взлетело...
После команды SAVE 1 FILE в файле образа SD появились какие-то данные. DIR показал наличие файла.
Образ для SD прописал кодом 0E5h. DPT настроил от фонаря. Из 512 байт сектора SD используются первые 128. Код занимает примерно 7К. Данные (включая экран) около 5К. Т.е. есть хорошие предпосылки все это запихать в ПЗУ. Исходники CP/M в мнемониках i8080 взял с сайта (не совсем ориентируюсь в Z80). Пришлось доработать в области переноса данных в ОЗУ (но еще не до конца).
... вопросики/советики:
1.Чего-то нужно правильно прописать в DPT? 2.Какие параметры передаются в функции SDREAD/SDWRITE (в смысле адресации секторов SD)? Их надо как-то согласовывать с п.1 для уменьшения вычислений (дорожка/сектор).
Свой DPT и конфиг для emu выложу завтра. Исходников пока нет - они не просто в сыром виде, они даже еще не сконденсировались (или PM).
|
05 Dec 2019 08:40 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Получился вот такой примерно драйвер SD карточки для CP/M
|
10 Dec 2019 02:28 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Ну вот кой-чего получилось (для Партнер 01.01): Пока все в emu. Работает в ПЗУ (вместо BASIC, запуск - B). Образ карточки сделал в SteinBlum (правда всего 260К). Накидал туда немного файлов. Почему-то не заработал M80 и SUBMIT. Но зато есть MAS и LINK от microdos-а. Исходников пока нет - надо будет их привести в более приличный вид. И переделать драйвер консоли и карточки. Для карточки надо определиться с форматом.
В архиве конфигурация для emu, образы для системы и SD карты, инишник для SteinBlum.
|
13 Dec 2019 02:04 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Примерно вот такая CP/M получилась...
ассемблер Avocet make от Borland компьютер партнер 01.01
Может работать в ПЗУ (вместо BASIC партнера). Проверялось в emu (конфигурация Partner8.cfg). В железе не пробовал. Запускается os.rkp. В нем система и какая-то программа от CP/M. При старте загрузчик переключает карту памяти и переносит систему с адреса 0A000h (где BASIC). Я после старта системы выполнял SAVE <файл> <сколько блоков> и получал этот файл на карточке. Так и накидал на карточку файлов (sd.img). SUBMIT так и не заработал. Похоже он лезет в саму систему и что-то там правит. Добавил в систему модули для ВВ51. Но пока почти не используются. Да и сервер на Win не до конца доработан. Планирую сделать диск B: через ВВ51.
Драйвер карточки читает 512 байт в буфер и выдает нужный сектор из этого буфера. Если следующий сектор уже есть в этом буфере, он сразу выдается. При записи читаются нужные 512 байт в буфер, Данные переносятся в этот буфер и он записывается. Надо будет анализировать доп. флаг: если обычный сектор - загрузить (если надо) с карточки. если каталог - сразу записать буфер на карточку. если новый сектор - с карточки читать ничего не надо.
|
08 Jun 2020 01:36 |
|
|
Who is online |
Users browsing this forum: No registered users and 14 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|