Обновил программу MOUNT для работы с разными картами памяти.
Обновил программу MOUNT для работы с разными картами памяти.
похоже mount надо серьёзно переделывать
собственно проблеммы - 2
микродос - там нет таблички с битмаской, там прямо в коде сравнивают и выбирают нужную таблицу
по этому надо вводить некое на уровне доса где будет карта маппинга
cp/m если нет диска в дисководе - замаунтить его невозможно
при seldsk возвращается 0
т.е. предлагаю ввести таки апи внутри биоса
например при тот-же seldsk при c=0xff
дополнительно верунть de=табличка маппинга, bc=0x55aa как флаг
Последний раз редактировалось esl; 29.07.2014 в 15:51.
Давай уточним, чтобы я понял. Значит, в микродосе в DPB нет поля DRVMASK, а маска для записи в регистр вычилсяется прямо в коде исходя из номера дисковода? Это плохо. Очень плохо.
Может, тогда вообще забить на работу с реальными дисководами в микродосе, и оставить только эмуляцию для всех 4 дисков? Не так уж и нужны дисководы при наличии EXTROM.
Или, действительно, придется где-то в биосе выделить место, положить туда карту отображения дисков, и как-то сообщить программе mount адрес этой таблицы. Ну и сам биос научить определять тип диска по этой таблице. Задачка еще та
Я на это уже нарывался. Поэтому для своего дефлотного биоса просто вбил в mount абсолютные адреса блоков DPB. С этим биосом все работает без вопросов.cp/m если нет диска в дисководе - заманутить его невозможно
при seldsk возвращается 0
Придурки разработчики CР/M не могли, блин, предусмотреть способ передать программе адрес DPB не трогая диска.
Это ты про CP/M или микродос? Не знаю как в микродосе, но в CP/M SELDSK при C=FF штатно отдает адрес таблицы векторов прерываний. Нам же нужен способ получить адрес DPB нужного диска, не трогая его, то есть не вызывая процедуру GETINFO (которая при невставленной дискете начинает сыпать ошибки).т.е. предлагаю ввести таки апи внутри биоса
например при тот-же seldsk при c=0xff
дополнительно верунть de=табличка маппинга, bc=0x55aa как флаг
Я уже думал над расширением функции SELDSK, уже даже хотел выносить на обсуждение, а вот теперь и ты нарвался на то же самое. SELDSK в существующем виде не подходит для получения адреса DPB.
То есть в С придется оставить номер диска, для которого мы хотим получить адрес DPB. А в качестве флага того, что мы хотим просто получить адрес DPB, можно установить B=AA. AA я предлагаю потому, что FF или 00 могут оказаться в B чисто случайно, ведь по стандарту этот регистр параметров не содержит, и при вызове в нем может оказаться любой мусор.
Итак, вызов SELDSK:
C= #диска
B=AA - отдать DPB
не AA - вызвать GETINFO, а потом уже отдать DPB
Проверочный образец 55AA в данном случае не нужен, поскольку адрес DPB отдается в любом случае.
А вот что делать с микродосом... имхо проще плюнуть на физические диски. Ну а если нет - давай договариваться о формате таблицы дисков и об интерфейсе получения ее адреса. Хотя бы почти как ты предлагал, только C не FF, а что-нибудь другое, например AA или 55.
Я смотрю, биосы уже прямо распухают от патчей. Также твой загрузчик и программа MOUNT толстеют на глазах. Вот она, цена совместимости...
Why ?
и dpb/dph там ровно на 2 диска (+E)
---------- Post added at 14:26 ---------- Previous post was at 14:25 ----------
Я как раз про этот вариант и говорил
---------- Post added at 14:28 ---------- Previous post was at 14:26 ----------
Вопрос филосовский.
Зачем вообще нужен DPH/DPB если диск неинициилизирован?
Кром таких извращенцев как мы оно и не надо то.
Кроме того, в 1980 году про это был повод думать ?
---------- Post added at 14:35 ---------- Previous post was at 14:28 ----------
Нет, при C=FF в HL - таблица векторов
я думал добавть в остальные регистры флаг и адрес таблички DPB
но можно и при C=0xFE сделать
на неподдерживаемых будет HL=0
а поддерживаемые будут возвращать адрес таблички DPB
---------- Post added at 14:38 ---------- Previous post was at 14:35 ----------
в моем варианте просто возврщаем адрес таблики как в твоём MOUNT
там для диска или адресс DPB или например 0 как признак блокировки диска.
---------- Post added at 14:40 ---------- Previous post was at 14:38 ----------
При табличке - пофиг микродос это или нет
Я в микродосе сделаю fake dpb, который для mount будет как настоящий.
А 0 в табличке - информация что дисков нет.
---------- Post added at 14:45 ---------- Previous post was at 14:40 ----------
Не забивай себе голову
В основном это моя головная боль.
Я это ожидал, и всё в пределах ожидания.
Вообще идея патчера это головная боль, но интересно
p.s. сегодня немного копался в SFERA (эт та что сетевая с вторым диском под ученичесские)
там SELDSK забавный, содержит 16 копий ALV,
таблику 4x16 там смещения дисков и размер (копирует из нее значения в DPB.OFS и еще что-то)
---------- Post added at 14:48 ---------- Previous post was at 14:45 ----------
Сегодня родилась мысль еще
что можно mount&co монитровать в диск E по комбинации клавиш
или точнее спрашивать проинитить E или монитровать на диск.
На всех машинах точно 48к есть, и он работает.
в cp/m он есть везде, а в микродос - сделать поддержку только в последнем.
нажали кнопку - и на диск E скопировался посекторно образ диска с mount
там то копировать понты, и можно прям биосом и копировать посекторно![]()
Последний раз редактировалось esl; 29.07.2014 в 15:50.
Итак, давай еще раз определимся.
Программе mount не нужен DPB как таковой. Ему нужно всего одно поле - DRVMASK, по которому определяется - является ли диск эмулируемым (если 0) или реальным (если не 0). И если диск реальный, то он по маске определяется номер физического дисковода, связанного с данным DPB. Ну и, изменяя это поле, mount переотображает логическую букву диска на один из реальных дисководов или эмулируемый диск.
Значит, для CP/M таблица должна состоять из 4 двухбайтовых слов, хранящих адрес поля DRVMASK каждого из 4 DPB. То есть то самое, что я вбил намертво в mount для своего биоса. А вызов SELDSK с C=0FEh должен в HL возвращать адрес этой таблицы. Сама тблица будет расположена где-то внутри BIOS.
Вроде бы к этому и сводится твое предложение. Все логично, я полностью согласен и готов внести все изменения с свой BIOS и программу mount.
Теперь микродос. Тут, как я понимаю, только 2 DPB, и нет поля DRVMASK. Причем DPB#0 всегда должен отображаться на эмулируемый диск - отображать A: на реальную дискету бессмысленно и чревато зависанием системы.
Поэтому здесь мы можем играться только с назначением диска B: - или эмулируемый, или реальный дисковод 0. На дисковод 1 вполне можно плюнуть. Здесь SELDSK с C=0FEh должен вернуть в HL адрес однобайтового поля, хранящего тип диска B - эмулируемый (0) или реальный (не 0). Диски C и D в этой системе mount не отображает и не принимает в качестве аргументов команд.
Вроде бы все логично. Только скажи - как mount может отличить, запущен ли он в CP/M или микродосе? Можно добавить еще один признак при возврате из нашего варианта функции SELDSK C=0FEh: например в регистре A вернуть 0 для CP/M или не 0 для микродоса. Но, может быть, есть еще более простой путь определить тип ОС? Ты ковырял микродос, может знаешь какие-нибудь его отличительные признаки?
О, идея супер. Правда, при этом портится содержимое ГЗУ, но это фигня.
Только один момент: как биос получит образ маленького диска с mount от контроллера?
Давай сделаем не так. Давай в контроллер добавим еще один открытый файл, и при вызове READ с DRV=4 будут сразу возвращаться сектора намертво примонтированного к DRV4 диска c программой mount. А в биосе обращение к диску E будем заворачивать на драйвер EXTROM, как и остальные диски A-C.
Таким образом, в системе всегда будет доступен диск E, только для чтения, содержащий программу mount. А рамдиск - ну его нафиг. Кому он нужен-то в наше время? Но если уж так хочется, можно ввести в mount команду, отключающую от диска E эмулятор и подключающую обратно рамдиск. Хотя по мне так это явно излишне.
А разве для Корветовских МикроДОСов это не так-же?
Для Векторовских посмотрел свой старый код сюсинфы, нашёл следующее:
STDskParm.Info - не подойдёт как флаг успешного маунта диска с системой? Может, ошибаюсьКод:/* Перед соответствующей таблицей параметров диска DPB, располагается */ /* Таблица физических параметров дисковода размером в 7 байт: */ struct STDskParm { char HeadSpeed; /* 0-6мс, 1-12мс, 2-20мс, 3-30мс, 80H-3мс */ char SecPerTrack; /* Число физических секторов на дорожке */ char InSec; /* 0-single sided, 1-double sided */ char SecSize; /* Размер физич. сектора 0-128,...3-1024 */ char Track; /* Hомер текущей дорожки */ char Drive; /* Позиционный номер устр-ва 00000100 */ char Info; /* Флаг успешного считывания информ. сектора */ }; /* При вызове BIOS SELDSK в <HL> возвращается 0 для несуществующего привода */ /* или адрес Заголовка Дискетных Параметров: Diskette Parameter Header */
На всяк случай, приаттачу весь header. А если надо, могу весь код сюсинфы выложить и .com файл
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если бы все так было просто...
Дело в том, что программе mount нужно иметь информацию о типе логического диска - физический он или эмулируемый. Для этого мы используем поле DRVMASK (в твоей структуре - Drive). 0 - эмулируемый диск, не 0 - физический. Проблема в том, что для того, чтобы получить доступ к этому полю, надо знать адрес DPB. А хитрый вызов SELDSK не отдает этот адрес, если, например, в дисководе нет дискеты. Вот в это все и уперлось - пришлось дополнять вызов SELDSK своей функцией FE. Заодно таким образом можно программно определить, под микродосом мы сидим, или под CP/M.
Собственно, я уже написал весь необходимый код, и в эмуляторе его отладил. Но коварное начальство отправило меня на неделю в командировку в далекий Белгород. Я только что оттуда вернулся, сейчас проверю код на реальном железе (в Белгороде корвета у меня не было, и ближе к вечеру выложу сюда на обсуждение.
вот кусочек где происходит выбор маски у некоторых версий
в B тут маска выбора дискаКод:RAM:ED82 7E ld a, (hl) ; drive RAM:ED83 B7 or a RAM:ED84 06 01 ld b, 1 RAM:ED86 CA 8B ED jp z, loc_ED8B RAM:ED89 06 02 ld b, 2 RAM:ED8B RAM:ED8B loc_ED8B: ; CODE XREF: FDD_Setup+9j
Очень похоже что идею с блоком информации придумали в ОФП НИИЯФ МГУ
т.е. разработчики Корвета.
И CP/M адаптировали они, т.е. поддержкасразу.
А микродос адаптировали уже в НИИСЧЁТМАШ ...
И обработку этого блока сделали ну не сразу, а оно им надо было ?
А на векторе как понимаю - адаптировли люди заинтересованные.
в первых версиях микродоса - параметры диска вообще гвоздями прибиты.
---------- Post added at 09:20 ---------- Previous post was at 09:15 ----------
вот кусочек описания биоса cp/m про диски![]()
https://dl.dropboxusercontent.com/u/...ORVET-DISK.pdf
---------- Post added at 09:28 ---------- Previous post was at 09:20 ----------
Всё просто.
Вызов BDOS GetVER - врзвращает 0x26
---------- Post added at 09:34 ---------- Previous post was at 09:28 ----------
Имхо для микродоса тоже вернуть такую-же табличку как и в cp/m
Формально она фейковая, но какая разница.
А данные из неё я уже буду в резеденте брать.
Т.о для MOUNT они одинаковые.
Можно конечно для простоты в SELDSK возвращать флаг микродоса, но зачем?
Еще идея, возвращать табличку наличия физ дисков MOUNTу.
Чтобы он и не пытался монтировать при их отсутствии.
---------- Post added at 09:39 ---------- Previous post was at 09:34 ----------
Это совсем не страшно, ибо 0я страница всё равно отведена под графику
по дефолту она не видна (LUT)
и при нахождении в ДОС ее точно можно портить
Так и просится в API чтение произвольного файла ....
---------- Post added at 09:41 ---------- Previous post was at 09:39 ----------
не, там же параметры диска (DPH) под фиксированный диск сделаны
подменить его так нельзя.
---------- Post added at 09:42 ---------- Previous post was at 09:41 ----------
Выкладывай!!
Я тоже опять подключусь.
Поглядел как я в сюсинфе достаю DPB логического диска. Следующим кодом:
Собсно приаттачу сырки (866 кодировка) и si.comКод:int logon(disk) int disk; { char *cp,csum; int i; /*-------HARDWARE TROUBLES---------------------------------------*/ NonCPMDisk=FALSE; if (!(dph=bios(SELDSK,disk,0))) { printf("Can't log on [%c].\nLogin to drive only.\n",disk+'A'); return(FALSE); } bios(SETDMA,isp,0); bios(SETTRK,0,0); bios(SETSEC,1,0); if (bios(READ,0,0)) { puts("Can't read disk information sector in boot record.\n"); return(FALSE); } dparms=dph-sizeof(STDskParm); dpb=dph->DPBV; if (dpb->OFS) Bootable=TRUE; else Bootable=FALSE; if (dpb->CKS) Removable=TRUE; else Removable=FALSE; drive=disk; /*--------SOFTWARE TROUBLES--------------------------------------*/ for ( cp=isp,i=0,csum=0 ; i < 31 ; i++ ) csum+=*cp++; csum+=0x66; if ( csum != isp->_CheckSum ) { NonCPMDisk=TRUE; } return(TRUE); }
Интересно её на корвете запустить
Насчёт выбора диска без конверта, это вроде и в векторе на МикроДОСе висло. ЕМНИП на ВГ93 можно определять, вставлен-ли конверт по индексному маркеру и закрытому драйву, но сейчас уже и не припомню как, биос лет 20 назад писал.
PS.
Получается, что и правда, других нормальных вариантов достать DPB нету. Проранил si.com только-что на Векторе под MicroDOS 3.1 со своим биосом. DPB для логического диска (RAM drive) через SELDSK нашлась. Хотя это вряд-ли поможет если на Корвете не все биосы возвращают DPH.
Последний раз редактировалось PPC; 04.08.2014 в 13:07. Причина: Упс, с кодировкой сырков ошибся (векторовскую выложил). Теперь 866
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)