-=RUS=- | Дата: Пятница, 17.10.2014, 18:47 | Сообщение # 1 |
 Генералиссимус
Группа: Администраторы
Сообщений: 352
Статус: Offline
| (Warning)
W A R N I N G
от Magic Bytes Software
Сей файл предназначен для программистов на БК11М. Поэтому уважаемые пользователи могут со спокойной душой нажать <КТ>.
Я хочу предложить несколько способов делать свои программы так, чтобы они работали в любой операционной системе. Допустим, Вы решили написать программу, в ходе работы которой необходимо использовать дополнительные страницы. Как быть? Использовать 1-ю страницу? Но там находится и работает система DOSB. Использовать 4-ю стра- ницу? Но там ANDOS. Использование любой группы "свободных" страниц влечет за собой невозможность работы вашей программы в какой-либо системе. Я вижу два наиболее приемлемых решения. Первое в том, чтобы при запуске программа определяла, какая станица подключена в данный момент со 100000, т.е. какая страница является сис- темной. Это могут быть страницы с 1 по 4. Затем происходит копирование этой страницы в какую-либо другую определенную страницу. Например, в 4-ю. т.е. в какой бы странице не распо- лагалась система она будет всегда переписываться в 4-ю. Дальше программа на протяжении всей своей работы использует свободные с 1 по 3 страницы. Если потребуется обратиться к монитору или к EMT 36, то 4-я страница подключается со 100000 на необходимое время (например, на время работы с диском). Перед выходом из программы система возвращается в родную страницу, а из 4-ой удаляется (это необходимо). К недостаткам данного способа можно отнести: во время обработки EMT 36 система не должна переключать страницы, иначе произойдет зависание; при некорректном выходе из программы (например, по RESETу) система окажется не в родной странице. В связи с этим гораздо лучшим является второй спо- соб, более сложный, но и обладающий более высокой надежностью. При запуске программы происходит так же, как и в первом случае, определение подключенной со 100000 (системной) страницы. Затем устанавливается соответствие между восемью физическими и восемью логическими номерами страниц. Об этом стоит сказать подробнее. У БК11М - восемь физических страниц с номерами от 0 до 7. Все программы, которым необходимы для работы дополнительные страницы (т.е. кроме 0 и 5), переключают их непосредственной записью чисел в системный регистр. Т.е. работают с физическими номерами страниц. Суть моей идеи в том, чтобы ввести логические номера:0, 1, 2, 3, SYS, 5, 6, 7. Причем, логические номера 0, 5, 6, 7 всегда соответствую своим физичес- ким. А конфигурация 1, 2, 3 и SYS страниц зависит от того, где расположена система. Т.е. страница SYS соответствует той физической, где расположена система, а 1, 2, 3 - трем оставшим- ся свободным страницам. Приведу два примера.
Система расположена в 4-ой странице, тогда
Логические номера │ Физические номера ───────────────────┼─────────────────── 0 │ 0
1 │ 1 2 │ 2 3 │ 3 SYS │ 4
5 │ 5 6 │ 6 7 │ 7
Система расположена в 1-ой странице, тогда
Логические номера │ Физические номера ───────────────────┼─────────────────── 0 │ 0
SYS │ 1 1 │ 2 2 │ 3 3 │ 4
5 │ 5 6 │ 6 7 │ 7
Таким образом "универсальная" программа будет выглядеть так. В самом начале (по крайней мере до первого переключения стра- ниц) должна быть вызвана подпрограмма PAGE_TEST, которая определяет системную страницу и инициализирует необходимые переменные. Теперь, когда программе потребуется переключить страницы, вместо записи непосредственно в регистр 177716, необходимо, указав пару (для нулевого и первого окна) логичес- ких номеров нужных страниц, вызвать подпрограмму SERVER, которая с учетом проведенного тестирования и указанных логических номеров, выдаст в R0 число для записи его в 177716. Что даёт такой способ, понять не трудно. Вместо того чтобы использовать страницы с 1 по 4, не ведая где находится система (т.е. практически подгоняя свою программу под данную ОС) вы будете указывать логические номера от 1 до 3, будучи уверен- ными, что комбинация физических страниц, выданная подпрограм- мой SERVER, будет свободна от системы. А если вам нужно обратиться к диску, то достаточно указать логический номер SYS. И будет подключена нужная физическая страница. Преимущество данного метода: ОС остается в своей странице. Недостаток: низкая скорость работы (по сравнению с одной командой MOV, конечно). Надо сказать, что в большинстве случаев скорость переключения страниц неважна. Если же это существенно, то можно, вызвав подпрограмму SERVER с нужными параметрами запомнить значение R0 и потом по мере надобности записывать его непосредственно в 177716. Далее я привожу тексты двух вышеописанных подпрограмм. Первую из них, PAGE_TEST, необходимо вызвать один раз в самом начале. Для текущей работы со страницами используется PAGE_SERVER. Входные данные для него в R0. Формат следующий: Если необходимо подключить сразу пару страниц, то R0= < n1+n2*400 >, где n1 - номер логической страницы, подключаемой с 40000, n2 - со 100000. Если нужно сменить, лишь одну страницу, а вторую оставить как прежде, то R0 = или соответственно R0 = <377+n2*400>. Выходные данные тоже в R0 - число для занесения в 177716. В самой подпрограмме оно не заносится в 177716 для того, чтобы была возможность его отдельного использования. Как уже было сказано, логические номера 0, 5, 6, 7 - соответ- ствуют своим физическим. 1, 2, 3 - свободные страницы, 4 (SYS) - страница с ОС. В случае использования комбинации, выданной PAGE SERVERом, без него самого (т.е. не непосредственно после его вызова) необходимо заносить ее не только в 177716, но и в переменную DOUBLE.
Текст приведен в формате ассемблера ED. Некоторые пояснения:
.B: - список байтов .+n - резервирование n байтов .E - резервирование слова PUT R0 = MOV R0,-(SP) GET R0 = MOV (SP)+,R0
BMS1: .B:150,10,50,70,110,30,170,130 BMS2: .B:16,10,12,13,14,11,17,15 BSS: .+4 DOUBLE: .E
PAGE_TEST: MOV @#137776,R5 MOV #107514,@#137776 MOV #BMS2+1,R1 CLR R0 1: INC R0 MOVB (R1)+,R2 SWAB R2 BIS #10000,R2 MOV R2,@#177716 CMP @#137776,#107514 BNE 1 MOV R5,@#137776 MOVB R0,BSS+3 CLR R1 MOV #BSS,R2 MOV #3,R3 2: INC R1 CMP R0,R1 BEQ 2 MOVB R1,(R2)+ SOB R3,2 RET
PAGE_SERVER: PUT R1 PUT R2 MOV #DOUBLE,R2 MOV R0,R1 TSTB R0 BMI 1 BIC #177400,R0 BEQ 2 CMP R0,#4 BHI 2 MOVB BSS-1(R0),R0 2: BIC #70000,(R2) BISB BMS1(R0),1(R2) 1: TST R1 BMI 3 CLRB R1 SWAB R1 BEQ 4 CMP R1,#4 BHI 4 MOVB BSS-1(R1),R1 4: BIC #3400,(R2) BISB BMS2(R1),1(R2) 3: MOV (R2),R0 GET R2 GET R1 RET
Теперь несколько слов разработчикам ОС. Их усилия, по всей видимости, должны быть направлены на благо пользователей. Ведь в идеале любая программа (кроме, разумеется, системных утилит) должна работать в каждой системе. Тогда пользователь получит возможность свободного выбора - в какой системе ему работать, ориентируясь лишь на качество данной системы и удобство работы в ней. Если не считать того, что системы расположены в разных страницах (как было показано выше, это нетрудно учесть), разнобой наблюдается в обработке EMT 36. Приведу перечень основных свойств, реализация которых в каждой ОС позволит избавиться от множества проблем и облегчит жизнь как программистам, так и пользователям.
а) Перехват вектора 4 во время обработки EMT 36 осуществля- ется "прозрачно". Т.е. при возникновении прерывания по этому вектору происходит его восстановление и выход из обработки с передачей программе пользователя кода ошибки. На экран (или подключенную с 40000 страницу) ничего не выводится.
б) Передача информации о каталоге диска программе пользо- вателя осуществляется следующим образом. Резервируются два значения байта (например, 300 и 301), использование которых в первом байте блока параметров EMT 36 обрабаты- вается так. Если первый байт блока параметров - 300, то во втором слове блока параметров вместо адреса чтения- записи - адрес текстовой строки в памяти, содержащей маршрут, причем любой длины, а не только 16 символов, и если нужно, маска имени файла. Система читает каталог диска, переходит по указанному маршруту и, начиная с 26 байта блока параметров, EMT 36 записывает информацию о первом файле подкаталога: 16 байтов имя, 2 байта адрес, 2 байта - длина файла. Признак ошибки на любом этапе - бит С при выходе из обработки. Байт 301 в блоке параметров - выдать информацию о следующем файле каталога. Установленный бит С - файлы исчерпаны.
При наличии последнего свойства программа пользователя сможет принимать каталог любой системы через унифицированный интерфейс, и выдавать его при заданной комбинации страниц, в нужном месте экрана, своим шрифтом, в стиле, соответствующем самой программе.
Надеюсь, авторы ОС оценят это предложение и реализуют его, заботясь о поклонниках своих ОС и повышая их популярность.
Дмитрий Тюрев
11.11.94
|
|
| |