Author |
Message |
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Установить адреса обработчиков ошибок на свою программу: fBase+3 - bad sector on read or write. fBase+5 - bad disk select. fBase+7 - disk is read only. fBase+9 - file is read only. на fBase указывают ячейки 00006h и 00007h - точка входа в BDOS. -- наверное так ...
|
04 Feb 2021 18:19 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Спасибо. Может быть адрес fBase таким? CPM base address: EC06 Вероятно это little endian и адрес 06EC на самом деле, но для Си 16-бит хранится как считано, все равно потом сунут в HL. Транслируется HiTech C в такой вот подстрочник на асме: Не перехватывается черт возьми, такое ощущение что прежде чем уйти в BDOS из Си CP/M восстанавливает эти вектора.
|
04 Feb 2021 23:42 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Си возвращает управление CP/M через холодный старт, при этом восстанавливаются все вектора и точки входа. Да и обработчики ошибок должны указывать на какое-то место в программе. А если программа завершилась - куда-чего должно указывать?
|
04 Feb 2021 23:59 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Это в случае выхода из программы штатно, я же вываливаюсь из нее из процедуры сообщения об ошибке, которую пытаюсь перехватить. Вываливаюсь кстати в полном согласии с руководством, в котором написано что после нажатия CR получите WarmBoot! Не холодный старт! Да после этого с огромной вероятностью все перехваты будут восстановлены, я это понимаю. Но я то пытаюсь перехватится до получения сообщения об ошибке подменяя вектор входа в него. Я подразумевал, что у меня ощущения что CP/M как только Си производит выход в BDOS по функции selectdisk восстанавливает все вектора, которые я заменил. Я же до Вашей "наводки" пытался перехватить WarmBoot так же безуспешно! Я же прям кусок кода на Си привел на то куда он указывает, вот еще развернутей Я вижу на экране сообщение об ошибке, которого не должен видеть так как заменил только что вектор этого входа! Программа то завершается только а) не запланировано б) при помощи WarmBoot
|
05 Feb 2021 01:09 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
А что делает HookErrSelectDisk ?
CP/M просто печатает сообщение и потом JMP 0 (wBoot)
PS: конечно-же я ранее имел в виду горячий старт
|
05 Feb 2021 02:46 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Прочитал что в в векторе обработки ошибки лежало до того как его перехватить CPM base address: EC06 CPM error select disk message address: 00 Hook error select disk message address: A38
Как такое может быть? Вектор на холодный старт указывает. При чем пока симулятор CP/M (RunCPM) работает вектор это больше не меняется, до повторного входа в RunCPM остается A38!
|
05 Feb 2021 03:03 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Да это элементарно пока заглушка для проверки перехвата, а так по хорошему должен возвращать в ПО для продолжения работы. Надо понять какие физические диски установлены в CP/M, для этого перебираю их от A до P. Где то на каком то диске это все крашится, осталось вернутся обратно и продолжить дальше, пометив диск как несуществующий. Но как видно до заглушки дело не доходит, так как системное сообщение я продолжаю получать в том же виде что и до смены вектора. Еще ждет нажатия - для осуществления вылета в CP/M.
|
05 Feb 2021 03:08 |
|
|
Alekcandr
Doomed
Joined: 01 Oct 2007 10:30 Posts: 665 Location: Ukraine
|
Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года. Если нужно глубже. Велком в 1980г. Да, MS-DOS (копипаста CP/M) в первых своих версиях тоже требовала ребута от оператора ЭВМ. По Хай Течь Си все там сделано стандартно и универсально касаемого CP/M. Не нужно менять стандартные вектора в CP/M (BDOS). Смена векторов это как вирус, нарушает работу ОС. Вектора лежат не просто так в ОЗУ (так получилось) , могут быть и в ПЗУ
_________________Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
|
05 Feb 2021 03:51 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Далековато посылаете - BDOS FUNCTION 45: SET BDOS ERROR MODE это уже в CP/M 3.0 Этого кстати вполне достаточно.
|
05 Feb 2021 10:21 |
|
|
Alekcandr
Doomed
Joined: 01 Oct 2007 10:30 Posts: 665 Location: Ukraine
|
Так нет у CP/M 2 или CP/M 3 такого. И HI-TECH C рассчитан на работу в CP/M 2. p.s. Ага. Был категоричен, касательно CP/M 3. Есть в некоторых реализация (Personal CP/M, MP/M II and later, CP/Net redirector) поддержка функции 45. Хотя не понятно, почему они называются аппаратными ошибками, они все программные. А чем механизм CCP в CP/M 2.Х определения отсутствия / наличия диска не подходит?
_________________Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
|
06 Feb 2021 02:23 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Нащупали выход из положения. Конечно хотелось бы исключительно CPM-ный для совместимости с чем угодно, но тем ни менее есть такая функция bios(9) практически аналогичная по функциональности BDOS, за исключением выбрасывания каких либо сообщений вообще. На RunCPM теперь она работает (до этого была там заглушена). А что за механизм определения/отсутствия диска у CCP, разве он не BDOS использует для этого?
|
07 Feb 2021 22:42 |
|
|
Alekcandr
Doomed
Joined: 01 Oct 2007 10:30 Posts: 665 Location: Ukraine
|
Как помню, да - BDOS. Не могу понять о каких выбрасываемых исключениях идет речь у функции 14 BDOS (Return: None) в CP/M 2.X. Это HI-TECH Z80 C Compiler делает? Вызов bdos в HI-TECH C из коробки.
_________________Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
|
08 Feb 2021 08:50 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
а такая функция не чем не подходит? Функция 24: получить вектор установленных дисков. Входные параметры: регистр С: 18h. Выходные параметры: регистр HL: вектор действующих дисковых уст¬ройств. Вектор установленных дисков представляет собой 16 битную величину и возвращается в регистрах HL. Первый значащий бит регистра L соответствует диску А, второй бит - диску В. Нулевое значение бита означает, что соответству¬ющий диск не установлен, единица означает, что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска.
|
08 Feb 2021 19:27 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
А вот этим и не подходит, то есть вектор содержит только те диски которые либо уже были активизированы (либо чтением, либо bdos(0x0E, DRIVE)). Я проверил - действительно так, то есть для того что бы получить установленные диски через данную функцию, нужно к ним обратится. Ну и если обращаешься к несуществующему диску - получаешь сообщение об ошибке и по нажатию CR вылет в горячий старт.
|
08 Feb 2021 20:32 |
|
|
SAA
Senior
Joined: 12 Jul 2016 21:30 Posts: 136
|
Если диск физически отсутствует CP/M выбрасывеат сообщение и ожидает нажатия, CR - приводит к WarmBoot.
|
09 Feb 2021 04:19 |
|
|