nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 01:36



Reply to topic  [ 40 posts ]  Go to page Previous  1, 2, 3  Next
Как получить CP/M для своего железа 
Author Message
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Запрет создания листинга делает псевдокоманда M80 .xlist в начале конкретного исходника. Достаточно закомментировать эту строку и в командной строке CCP для M80 до знака "равно" указать два целевых файла. Команда .list наоборот включает создание исходника для последующих строк, что полезно, если весь исходник не интересует, а лишь крошечный фрагмент.
PVV wrote:
Если... всю систему переводить в ПЗУ, то модуля-А не будет.
Почему не будет, ведь кроме привода на микро-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), записывает системные треки.

 
Image

Image

Image

Image

Image

Image

Image


Last edited by barsik on 19 Nov 2019 10:30, edited 1 time in total.



19 Nov 2019 05:26
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
Post Re:
barsik wrote:
Запрет создания листинга делает псевдокоманда M80 .xlist в начале конкретного исходника...

Вот, спасибо! Не знал. Теперь есть весь листинг.

Если будет SD, то, к примеру, для обычного Специалиста с 48КБ ОЗУ, рамдиск будет же это ОЗУ отъедать, зачем он там нужен? Для других ПК с доп ОЗУ это другое дело.

Уменьшил размер рамдиска до 8КБ. Попробовал добавить строку
include sd_proc.inc в BIOS.ASM после строки include RKFLOP.INC, так сборщик ругается, BIOSIZ over ! ... и без RKFLOP.INC ошибки, не найдены ссылки... что там можно выкосить?


Attachments:
sd_proc.zip [1.2 KiB]
Downloaded 341 times
19 Nov 2019 06:42
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
PVV wrote:
Попробовал добавить строку include sd_proc.inc в BIOS.ASM... так сборщик ругается, BIOSIZ over ! ... и без RKFLOP.INC ошибки, не найдены ссылки... что там можно выкосить?
Сейчас (через ~час) сделаю простую версию с упрощённым стартовым модулем 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
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
Attachment:
cpm_sd.PNG
cpm_sd.PNG [ 16.5 KiB | Viewed 7811 times ]

Во вложении мои правки и конфиг для emu.


Attachments:
24K CPM Spec РК-КНГМД_VD_8K.zip [75.59 KiB]
Downloaded 356 times
19 Nov 2019 11:59
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
Теперь бы ещё схему контроллера 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К надо экономить). И на скорости это никак не отразилось, потому нет смысла делать буфер равным размеру блока.


Attachments:
CPM FILES.rar [237.58 KiB]
Downloaded 361 times


Last edited by barsik on 19 Nov 2019 21:19, edited 1 time in total.

19 Nov 2019 13:35
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
Post Re:
barsik wrote:
Теперь бы ещё схему контроллера microSD попроще без дефицитных преобразователей 5 Вольт в 3 Вольта.

можно проще все сделать, резисторные делители все решают, проверено, работает тока так.
Как вариант, схема Галаксии. Но такая схема проще, а можно и вот так, на клавиатурной ВВ55 на ножках магнитофон вход, выход, светодиод рус-лат и одной свободной, что есть на порту С...
barsik wrote:
Для надёжных носителей контрольные суммы секторов не нужны (думаю, что КС есть у физических секторов microSD и она сама их контролирует).

для варианта подключения SD по SPI, который мы используем, crc нет.
barsik wrote:
Образы файлов ODI конечно есть, но они для дискеты и КНГМД на ВГ93

вот именно они и нужны, для начала представим, что SD на много ГБ :), это одна дискетка на 1МБ...
barsik wrote:
Кстати зачем Вы переделали формат ввода по I на формат ввода по R. Формат по R вообще никто на Специалисте не использовал. Неудобно ориентироваться на МГ-ленте если файлы без имени.

Я и забыл, что так можно. В SDOS я RKS файлы читаю только в эмуляторном формате и emu так хочет...


19 Nov 2019 16:12
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
rw6hrm wrote:
Всего 4 дополнительных корпуса, преобразование уровней резисторами.

вот здесь еще проще, можно даже на 2х корпусах сделать, если выбросить 74ls244. И ОК можно не диодом, а вторым элементом 74ls244 сделать, но на трех корпусах тогда получится.
Вот со скоростью и раздуванием кода, это да...тут надо выбирать или затратить время на сборку SD интерфейса на корпусах и получить максимально возможную для ВМ80 (z80) скорость, или сделать быстро простую схему, но всегда потом тратить время в эксплуатации...


20 Nov 2019 05:42
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Тоже хочу приделать SD карточку к Партнер 01.01.
Насколько я понял emu умеет это симулировать
контроллер который на ИР24?
CP/M будет размещаться в ROM (вместо BASIC-а) c адреса 0A000h
т.е. получится немного меньше 40К свободной RAM.
За ROM-ом (8К) еще RAM около 6К - там экран и всякие
рабочие буфера/ячейки/данные...
Кривоватость получилась из-за того, часть данных осталась в ПЗУ,
а часть перенесена в ОЗУ, но без всякой инициализвции.
Но меня больше интересовала возможность работать
с файловой системой через COM порт - это в принципе получилось.
Сейчас надо будет перенести точки входа BDOS в ОЗУ.
Данные и стек CCP тоже в ОЗУ.
Тогда может даже заработает SUBMIT. Я так понял, что
он (SUBMIT) на основании SP находит данные CCP?
Карта памяти получится примерно такая:
Code:
FFFFh МОНИТОР
????  УВВ
????  экран, данные BDOS BIOS CCP ???
C000h экран, данные BDOS BIOS CCP
????  ???
????  CCP
????  BDOS
A000h BIOS
????  точки входа в BDOS
????  данные и стек CCP
????  программа
0100  программа
0000  как обычно в CP/M

В новом компе нет 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?


Attachments:
partner.rar [1.37 KiB]
Downloaded 344 times
26 Nov 2019 23:14
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
aav8 wrote:
Тоже хочу приделать SD карточку к Партнер 01.01.
Насколько я понял emu умеет это симулировать контроллер который на ИР24?

и не только на ИР24, но сейчас остановимся на ней.
aav8 wrote:
1.Настроить emu (партнер) для SD. И какая схема в нем работает,
посмотреть в proteus-е. Примеры из FatFs для SD
запустить получилось. Примерчики работы с SD на ASM 8080

Вот тут есть файлы, можно посмотреть и конфиг emu и схему в протеусе со всеми dll, с поддержкой SD. Примеры для работа с SD в исходниках SDOS.
aav8 wrote:
1.Как сделать образ SD карты для CP/M?

нумерация пунктов вопросов сбилась :)...
для начала можно просто взять дискетный образ в 800КБ и записать его на SD... ну и что, что SD на много мегабайт или вообще гигабайт...
дальше же надо такие образы записывать на обычный fat16 раздел, используя, к примеру, описанный мною ранее механизм 'косвенного монтирования'.
aav8 wrote:
2.wBoot

деже не понимаю о чем речь.


27 Nov 2019 02:59
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
rw6hrm wrote:
... В связи с простотой обнаружилось два недостатка - раздулся биос (пришлось выкинуть обработчик ANSI-последовательностей) и скорость работы...

Собрал два варианта SDOS с быстрым SD интерфейсом и медленным, так вот разница в размере кода ~150байт. Может имеет смысл пересмотреть код работы с картой? Да, получится еще медленней, ~10%, по моим прикидкам, свернуть код в цикл надо, но на общем фоне, это уже не столь важно.
barsik wrote:
Сейчас (через ~час) сделаю простую версию с упрощённым стартовым модулем A (только формат ЭД и титры) и с подготовкой для вставки нового кода в BIOS второго привода...

что то не получается, а то я в ожидании...?


28 Nov 2019 08:41
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
PVV wrote:
barsik wrote:
Сейчас (через ~час) сделаю простую версию... и с подготовкой для вставки нового кода в BIOS второго привода...

что то не получается, а то я в ожидании...?
Извиняюсь за паузу. Я не забыл. Просто не думал, что это кому-то надо и сейчас. Т.к чтобы поиметь простую классическую версию достаточно всего лишь иметь исходники оригиналов 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 этого нет):
Code:
        LD      HL,BUFFER       ; в буфере загружен BOOT-сектор
        LD      A,66H           ; было надо для совместимости с КОРВЕТОМ
        LD      B,31            ; считаем арифм.сумму 31-го байта ИНФО-блока
LOOP:   ADD     A,(HL)          ; т.о и 8 байтов в начале сектора считаются
        INC     HL
        DJNZ    LOOP
        CP      (HL)
        JR      Z,NODISK

Таким образом, байт с оффсетом в $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, вот так:
Code:
DISKRES:
 . . . . . . . . . . . .

        LD      HL,0080H
        LD      (ADRDMA),HL
       
        CALL    DSKNEW                  ; добавлено

        CALL    DMARET
;       JP      DSELCT                  ; вот на этой команде и выиграны 3 байта

DSELCT: LD      HL,(LOGVECT)
        LD      A,(CDISK)
        LD      C,A
        CALL    RRIGHT
        PUSH    HL
 . . . . . . . . . . . .

После этого, стало возможно менять дискеты на дискеты любого формата. Я использовал дискеты без системных треков и с числом физич.треков 83 вместо 80, а также произвольное число секторов в треке. Это позволяло на HD-диске 3.5" иметь форматную ёмкость в 1660 кб при 10-ти секторах по 1 кб на каждом треке. При сокращении размера физ.сектора до 512 байт на тот же диск влезает всего 1440 кб. Формат с секторами по 512 байт выгоднее для CP/M-48К ОРИОНА в банке 0 и для Специалиста, т.к размер дискового буфера сокращается с 1 кб до 512 байт и на столько же можно поднять уровень TPA.


Attachments:
оригиналы CCP & BDOS.rar [12.86 KiB]
Downloaded 347 times
28 Nov 2019 12:38
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Подключил к Партнер 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
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Получился вот такой примерно драйвер SD карточки для CP/M


Attachments:
sdCard.rar [5.62 KiB]
Downloaded 346 times
10 Dec 2019 02:28
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Ну вот кой-чего получилось (для Партнер 01.01):
Пока все в emu.
Работает в ПЗУ (вместо BASIC, запуск - B).
Образ карточки сделал в SteinBlum (правда всего 260К).
Накидал туда немного файлов.
Почему-то не заработал M80 и SUBMIT.
Но зато есть MAS и LINK от microdos-а.
Исходников пока нет - надо будет их
привести в более приличный вид.
И переделать драйвер консоли и карточки.
Для карточки надо определиться с форматом.

В архиве конфигурация для emu, образы
для системы и SD карты, инишник для SteinBlum.


Attachments:
partner.rar [52.17 KiB]
Downloaded 338 times
13 Dec 2019 02:04
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Примерно вот такая 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 байт в буфер,
Данные переносятся в этот буфер и он записывается.
Надо будет анализировать доп. флаг:
если обычный сектор - загрузить (если надо) с карточки.
если каталог - сразу записать буфер на карточку.
если новый сектор - с карточки читать ничего не надо.


Attachments:
partner.rar [148.03 KiB]
Downloaded 319 times
08 Jun 2020 01:36
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 40 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 3 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.