Операционная система CP/M

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Re: Операционная система CP/M

Post by aav8 »

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.

-- наверное так ...
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

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: Select all

 *((short*) (*bdosbase + 5)) = (short) HookErrSelectDisk;
Транслируется HiTech C в такой вот подстрочник на асме:

Code: Select all

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 восстанавливает эти вектора.
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Re: Операционная система CP/M

Post by aav8 »

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

Да и обработчики ошибок должны указывать на какое-то место в программе.
А если программа завершилась - куда-чего должно указывать?
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

aav8 wrote:
SAA wrote: Не перехватывается черт возьми, такое ощущение что прежде чем уйти в BDOS из Си CP/M восстанавливает эти вектора.
Си возвращает управление CP/M через холодный старт,
при этом восстанавливаются все вектора и точки входа.
Это в случае выхода из программы штатно, я же вываливаюсь из нее из процедуры сообщения об ошибке, которую пытаюсь перехватить. Вываливаюсь кстати в полном согласии с руководством, в котором написано что после нажатия CR получите WarmBoot! Не холодный старт! Да после этого с огромной вероятностью все перехваты будут восстановлены, я это понимаю. Но я то пытаюсь перехватится до получения сообщения об ошибке подменяя вектор входа в него. Я подразумевал, что у меня ощущения что CP/M как только Си производит выход в BDOS по функции selectdisk восстанавливает все вектора, которые я заменил. Я же до Вашей "наводки" пытался перехватить WarmBoot так же безуспешно!
aav8 wrote: Да и обработчики ошибок должны указывать на какое-то место в программе.
Я же прям кусок кода на Си привел на то куда он указывает, вот еще развернутей
*((short*) (*bdosbase + 5)) = (short) HookErrSelectDisk;
if(bdos(0x0E, Drive) != 0){

Я вижу на экране сообщение об ошибке, которого не должен видеть так как заменил только что вектор этого входа!
aav8 wrote:А если программа завершилась - куда-чего должно указывать?
Программа то завершается только
а) не запланировано
б) при помощи WarmBoot
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Re: Операционная система CP/M

Post by aav8 »

А что делает HookErrSelectDisk ?

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

PS: конечно-же я ранее имел в виду горячий старт
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

Прочитал что в в векторе обработки ошибки лежало до того как его перехватить
CPM base address: EC06
CPM error select disk message address: 00
Hook error select disk message address: A38

Как такое может быть? Вектор на холодный старт указывает. При чем пока симулятор CP/M (RunCPM) работает вектор это больше не меняется, до повторного входа в RunCPM остается A38!
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

aav8 wrote:А что делает HookErrSelectDisk ?
Да это элементарно пока заглушка для проверки перехвата, а так по хорошему должен возвращать в ПО для продолжения работы. Надо понять какие физические диски установлены в CP/M, для этого перебираю их от A до P. Где то на каком то диске это все крашится, осталось вернутся обратно и продолжить дальше, пометив диск как несуществующий.
void HookErrSelectDisk(void){
char key;
puts(SCI_ED);
puts("Hooked!!!");
getch(key);
}
Но как видно до заглушки дело не доходит, так как системное сообщение я продолжаю получать в том же виде что и до смены вектора.
aav8 wrote: CP/M просто печатает сообщение и потом JMP 0 (wBoot)
Еще ждет нажатия - для осуществления вылета в CP/M.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Операционная система CP/M

Post by Alekcandr »

Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года.

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

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

По Хай Течь Си все там сделано стандартно и универсально касаемого CP/M. Не нужно менять стандартные вектора в CP/M (BDOS). Смена векторов это как вирус, нарушает работу ОС. Вектора лежат не просто так в ОЗУ (так получилось) , могут быть и в ПЗУ :mrgreen:
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

Alekcandr wrote:Тут (CP/M) все очень просто. На аппаратном уровне нет детекта смены дискеты. Поэтому очень логично перезагрузить ОС по горячему старту по смене буквы диска, что почти мгновенно на период 197X года.

Если нужно глубже. Велком в 1980г.
Далековато посылаете - BDOS FUNCTION 45: SET BDOS ERROR MODE это уже в CP/M 3.0 Этого кстати вполне достаточно.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Операционная система CP/M

Post by Alekcandr »

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
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

Alekcandr wrote:А чем механизм CCP в CP/M 2.Х определения отсутствия / наличия диска не подходит?
Нащупали выход из положения. Конечно хотелось бы исключительно CPM-ный для совместимости с чем угодно, но тем ни менее есть такая функция bios(9) практически аналогичная по функциональности BDOS, за исключением выбрасывания каких либо сообщений вообще. На RunCPM теперь она работает (до этого была там заглушена).

А что за механизм определения/отсутствия диска у CCP, разве он не BDOS использует для этого?
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Операционная система CP/M

Post by Alekcandr »

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

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

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

Code: Select all

;	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
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Re: Операционная система CP/M

Post by aav8 »

а такая функция не чем не подходит?
Функция 24: получить вектор установленных дисков.
Входные параметры: регистр С: 18h.
Выходные параметры: регистр HL: вектор действующих дисковых уст¬ройств.
Вектор установленных дисков представляет собой 16 битную величину и возвращается в регистрах HL. Первый значащий бит регистра L соответствует диску А, второй бит - диску В. Нулевое значение бита означает, что соответству¬ющий диск не установлен, единица означает, что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска.
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

aav8 wrote:что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска.
А вот этим и не подходит, то есть вектор содержит только те диски которые либо уже были активизированы (либо чтением, либо bdos(0x0E, DRIVE)). Я проверил - действительно так, то есть для того что бы получить установленные диски через данную функцию, нужно к ним обратится. Ну и если обращаешься к несуществующему диску - получаешь сообщение об ошибке и по нажатию CR вылет в горячий старт.
SAA
Senior
Posts: 136
Joined: 12 Jul 2016 21:30

Re: Операционная система CP/M

Post by SAA »

Alekcandr wrote:Не могу понять о каких выбрасываемых исключениях идет речь у функции 14 BDOS (Return: None) в CP/M 2.X.

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