nedoPC.org

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



Reply to topic  [ 33 posts ]  Go to page Previous  1, 2, 3  Next
Операционная система CP/M 
Author Message
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
SAA wrote:
В CP/M 2.2 при вызове функции bdos 0x0E (14) для диска не имеющегося в системе CP/M кидает сообщение об ошибке и по CR уходит в WarmBoot.
Для CP/M 3.3 есть функция bdos 45 которая меняет реакцию CP/M на ошибку и вылет можно запретить.
Как в CP/M 2.2 добиться того же?

Установить адреса обработчиков ошибок на свою программу:

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
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
aav8 wrote:
Установить адреса обработчиков ошибок на свою программу:

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.

-- наверное так ...


Спасибо. Может быть адрес fBase таким?

CPM base address: EC06

Вероятно это little endian и адрес 06EC на самом деле, но для Си 16-бит хранится как считано, все равно потом сунут в HL.

Code:
 *((short*) (*bdosbase + 5)) = (short) HookErrSelectDisk;


Транслируется HiTech C в такой вот подстрочник на асме:

Code:
ld   de,_HookErrSelectDisk
ld   hl,(_bdosbase)
ld   c,(hl)
inc   hl
ld   b,(hl)
ld   hl,5
add   hl,bc
ld   (hl),e
inc   hl
ld   (hl),d


Не перехватывается черт возьми, такое ощущение что прежде чем уйти в BDOS из Си CP/M восстанавливает эти вектора.


04 Feb 2021 23:42
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
SAA wrote:
Не перехватывается черт возьми, такое ощущение что прежде чем уйти в BDOS из Си CP/M восстанавливает эти вектора.


Си возвращает управление CP/M через холодный старт,
при этом восстанавливаются все вектора и точки входа.

Да и обработчики ошибок должны указывать на какое-то место в программе.
А если программа завершилась - куда-чего должно указывать?


04 Feb 2021 23:59
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
aav8 wrote:
SAA wrote:
Не перехватывается черт возьми, такое ощущение что прежде чем уйти в BDOS из Си CP/M восстанавливает эти вектора.


Си возвращает управление CP/M через холодный старт,
при этом восстанавливаются все вектора и точки входа.

Это в случае выхода из программы штатно, я же вываливаюсь из нее из процедуры сообщения об ошибке, которую пытаюсь перехватить. Вываливаюсь кстати в полном согласии с руководством, в котором написано что после нажатия CR получите WarmBoot! Не холодный старт! Да после этого с огромной вероятностью все перехваты будут восстановлены, я это понимаю. Но я то пытаюсь перехватится до получения сообщения об ошибке подменяя вектор входа в него. Я подразумевал, что у меня ощущения что CP/M как только Си производит выход в BDOS по функции selectdisk восстанавливает все вектора, которые я заменил. Я же до Вашей "наводки" пытался перехватить WarmBoot так же безуспешно!

aav8 wrote:
Да и обработчики ошибок должны указывать на какое-то место в программе.


Я же прям кусок кода на Си привел на то куда он указывает, вот еще развернутей

Quote:
*((short*) (*bdosbase + 5)) = (short) HookErrSelectDisk;
if(bdos(0x0E, Drive) != 0){


Я вижу на экране сообщение об ошибке, которого не должен видеть так как заменил только что вектор этого входа!

aav8 wrote:
А если программа завершилась - куда-чего должно указывать?


Программа то завершается только
а) не запланировано
б) при помощи WarmBoot


05 Feb 2021 01:09
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
А что делает HookErrSelectDisk ?

CP/M просто печатает сообщение и потом JMP 0 (wBoot)

PS: конечно-же я ранее имел в виду горячий старт


05 Feb 2021 02:46
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
Прочитал что в в векторе обработки ошибки лежало до того как его перехватить
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
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
aav8 wrote:
А что делает HookErrSelectDisk ?


Да это элементарно пока заглушка для проверки перехвата, а так по хорошему должен возвращать в ПО для продолжения работы. Надо понять какие физические диски установлены в CP/M, для этого перебираю их от A до P. Где то на каком то диске это все крашится, осталось вернутся обратно и продолжить дальше, пометив диск как несуществующий.

Quote:
void HookErrSelectDisk(void){
char key;
puts(SCI_ED);
puts("Hooked!!!");
getch(key);
}


Но как видно до заглушки дело не доходит, так как системное сообщение я продолжаю получать в том же виде что и до смены вектора.

aav8 wrote:
CP/M просто печатает сообщение и потом JMP 0 (wBoot)


Еще ждет нажатия - для осуществления вылета в CP/M.


05 Feb 2021 03:08
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года.

Если нужно глубже. Велком в 1980г.

Да, MS-DOS (копипаста CP/M) в первых своих версиях тоже требовала ребута от оператора ЭВМ.

По Хай Течь Си все там сделано стандартно и универсально касаемого CP/M. Не нужно менять стандартные вектора в CP/M (BDOS). Смена векторов это как вирус, нарушает работу ОС. Вектора лежат не просто так в ОЗУ (так получилось) , могут быть и в ПЗУ :mrgreen:

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


05 Feb 2021 03:51
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
Alekcandr wrote:
Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года.

Если нужно глубже. Велком в 1980г.

Далековато посылаете - BDOS FUNCTION 45: SET BDOS ERROR MODE это уже в CP/M 3.0 Этого кстати вполне достаточно.


05 Feb 2021 10:21
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
SAA wrote:
Alekcandr wrote:
Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года.

Если нужно глубже. Велком в 1980г.

Далековато посылаете - BDOS FUNCTION 45: SET BDOS ERROR MODE это уже в CP/M 3.0 Этого кстати вполне достаточно.
Так нет у 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
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
Alekcandr wrote:
А чем механизм CCP в CP/M 2.Х определения отсутствия / наличия диска не подходит?


Нащупали выход из положения. Конечно хотелось бы исключительно CPM-ный для совместимости с чем угодно, но тем ни менее есть такая функция bios(9) практически аналогичная по функциональности BDOS, за исключением выбрасывания каких либо сообщений вообще. На RunCPM теперь она работает (до этого была там заглушена).

А что за механизм определения/отсутствия диска у CCP, разве он не BDOS использует для этого?


07 Feb 2021 22:42
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
SAA wrote:
А что за механизм определения/отсутствия диска у CCP, разве он не BDOS использует для этого?
Как помню, да - BDOS.

Не могу понять о каких выбрасываемых исключениях идет речь у функции 14 BDOS (Return: None) в CP/M 2.X. Это HI-TECH Z80 C Compiler делает?

Вызов bdos в HI-TECH C из коробки.

Code:
;   char bdos(func, arg)

   global   csv,cret

entry   equ   5      ; CP/M entry point

arg   equ   8      ;argument to call
func   equ   6      ;desired function

   global   _bdos

   psect   text
_bdos:
   call   csv
   ld   e,(ix+arg)
   ld   d,(ix+arg+1)
   ld   c,(ix+func)
   push   ix
   push   iy
   call   entry
   pop   iy
   pop   ix
   ld   l,a
   rla
   sbc   a,a
   ld   h,a
   jp   cret
   end

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


08 Feb 2021 08:50
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
а такая функция не чем не подходит?
Функция 24: получить вектор установленных дисков.
Входные параметры: регистр С: 18h.
Выходные параметры: регистр HL: вектор действующих дисковых уст¬ройств.
Вектор установленных дисков представляет собой 16 битную величину и возвращается в регистрах HL. Первый значащий бит регистра L соответствует диску А, второй бит - диску В. Нулевое значение бита означает, что соответству¬ющий диск не установлен, единица означает, что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска.


08 Feb 2021 19:27
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
aav8 wrote:
что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска.


А вот этим и не подходит, то есть вектор содержит только те диски которые либо уже были активизированы (либо чтением, либо bdos(0x0E, DRIVE)). Я проверил - действительно так, то есть для того что бы получить установленные диски через данную функцию, нужно к ним обратится. Ну и если обращаешься к несуществующему диску - получаешь сообщение об ошибке и по нажатию CR вылет в горячий старт.


08 Feb 2021 20:32
Profile
Senior

Joined: 12 Jul 2016 21:30
Posts: 136
Reply with quote
Alekcandr wrote:
Не могу понять о каких выбрасываемых исключениях идет речь у функции 14 BDOS (Return: None) в CP/M 2.X.


Если диск физически отсутствует CP/M выбрасывеат сообщение и ожидает нажатия, CR - приводит к WarmBoot.


09 Feb 2021 04:19
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 33 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

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