01 ноября 1998 |
|
ПРОГРАММНАЯ ОБОЛОЧКА WINDOWS`98.------------------------------------------ Лохи плодятся каждый день. Такой эпиграф мною выбран не случайно. Обзор новинок софта, а СМИ особенно, среди всего прочего паталога выявил еще один ин- тересный момент: сколько софтмейкеров, столько и попыток сделать более-менее по- хожее подобие Windows`а на ПиСи. Каждый считает себя академиком, поэтому тратит уйму времени и сил для подражания. В неко- торых случаях это удается, но в большинстве своем подражание превращается в пародию. Пока небыло времени (желания) посмотреть на все эти извраты изнутри, но внешне - ерунда. В некоторых случаях, что особенно примечательно, сразу возникает вопрос - какой контроллер кемпстон мышки имеется у ребят, написавших тот или иной стрелочный драйвер? Дело в том, что софт довольно интересно поддерживает данный до- весок - стрелка движется только тогда, когда держишь нажатым клавишу "пробел". Огневые кнопки не работают вовсе или сра- батывают опять-таки при нажатом пробеле. Маразм крепчает... Особенно когда для пе- ремещения стрелки по экрану из одного края к другому при помощи мышки (!) надо 83 (!!!!!!) сантиметра! Следующий изврат - оконный интерфейс. Собственно, окно и в Африке окно, но не каждый его использует логично и красиво. Иногда открыв окно, те- ряешься в догадках - как его отменить, да так, чтобы ничего не выбирая и не запус- кая. Некоторые программисты пытались боле- е-менее дышащую паталогию предложить для широкого применения всеми остальными, при этом нявязывая целую стопку неотъемлемых требований и условий работы и т.д. Я тоже в свое время прошел этот путь, но постоян- ное усовершенствование не привело к еще большим требованиям к программисту, а нао- борот - развязало ему руки. Теперь решил подарить всем желающим свой MiniWindows. Данная версия не имеет физических адресов подпрограмм. Доступ через единую точку входа. Итак, всем дебилам посвящается... 1.ВВЕДЕНИЕ Данный программный продукт представляет собой законченный объектный модуль для ор- ганизации удобного интерфейса. Оболочка состоит из комплекта функций, совокупность которых позволяет получить современный ди- зайн программы. Завязывать функции следует согласно данной инструкции по программиро- ванию. Для удобства работы осуществлен ме- тод нумерации функций после команды ее вы- зова. Отныне пользователь понятия не имеет о местонахождении всех подпрограмм оболоч- ки. Доступ к ним только через единую точку входа: CALL #6000;вызов оболочки. DEFB #41 ;печать окна. или же: RST #10 DEFB #41 В первом случае все регистры сохраняют- ся, а во втором из-за особенностей работы RST 16 в ПЗУ 48`го бейсика убивается альтернативный DE. Обращение через RST 16 возможно, если после инсталляции (#40) "привязать" процедуру SUPERVISOR, идущую в комплекте с оболочкой и являющейся ее сос- тавной частью. Для привязки надо регистро- вую пару ВС занести по адресу #5С51. Номера функций начинаются не с нуля, а с #40. Это сделано для того, чтобы можно было применять команды типа CALL NZ,OS без риска уйти в медитацию при несовпадении условий, т.к. следующий байт является но- мером функции. Если условие вызова не сов- пало, то номер функции превращается в бо- лее-менее безобидную комаду... Учитывая пожелания программеров, имев- ших уже дело с моей версией windows`а, я после инсталляции в регистровой паре HL даю адрес начала таблицы функций, т.е. двухбайтовые физические адреса функций. Это сделано для того, чтобы можно было привязаться к некоторым (или всем) функци- ям оболочки и не тратить лишние такты для их понумерного вызова. Для привязки следу- ет взять порядковый номер функции, затем дать поправку к нулю, а потом расчитав на- хождение адреса в таблице взять его и подставить под JP adr. В регистровой паре DE находится адрес начала второго шрифта или, если его нет, адрес конца оболочки. Первый шрифт для 42`символьной печати, второй - какой хотите, такой и привязывай- те. Но по высоте ВОСЕМЬ бит! Третий "вы- ходной" параметр - адрес для привязки RST 16. Просто занесите значение регистровой пары ВС по адресу #5С51 и все. Естествен- но, если надо, тогда предварительно сохра- ните старое значение этой системной. 2.ТЕХНИЧЕСКИЕ ОСОБЕННОСТИ Оболочка компилирована под адрес #6000 (24576) и расчитана для работы на 48-кило- байтных и более компьютерах. Неплохо иметь минимум 128 Кб. ОЗУ, т.к. для сохранений экрана под окнами необходимо отводить не- которое количество памяти компьютера, что в 48 Кб. проблематично. Подпрограмма печа- ти окон предусматривает сохранение фраг- ментов экрана под окнами на отведеную программистом страницу ОЗУ. Размер оболочки равен 8 килобайт. Если нет второго шрифта, тогда 6 килобайт. В этом файле имеется все для интерфейса пользователя: печать и удаление окон, пе- чать текстов меню, селекция меню стрелоч- ным курсором, печать стандартного размера (3 на 3) пиктограмм, процедура одновремен- ного опроса кемпстон-мыши и клавиатуры + джойстики, полноценный шрифт на 256 симво- лов, программируемый размер букв от 32 до 64 символов в строке и мелкие функции для разных случаев применения оболочки. В комплект оболочки входят 4 вида шриф- та (32,42,51,64 символа в строке), файл пиктограмм, утилитный файл для ассемблера "ALASM", предназначенный для инсталяции номеров функций и оболочки, экранный файл-заставка (обои), листинг программы создания пиктограмм. Оболочка при работе использует текущий набор регистров процессора плюс регистро- вую пару IX. Альтернативный набор не тро- гается, включая AF`. Режим прерывания мо- жет быть любым, даже запрещенным. Но сле- дить за ним следует, т.к. для торможения курсора применяется команда HALT. Оболочка сама следит за разрешением или запретом прерываний за исключением функций дисковых операций (установка DI) и input`а (уста- новка EI). Для input необходимо иметь зна- чение IY,23610. Это для экономии памяти и простоты извлечения кода нажатия клавиши по адресу IY-50. ВНИМАНИЕ! Функции дисковых операций и ввода символов используют системные пере- менные бейсика и TR-Dos! Будьте внима- тельны при написании программ. Если такие ограничения вам не подходят, тогда пишите себе сами дисковые операции, вводы строк и так далее... Программисту предлагается самому уста- навливать страницу для сохранений экранной области под окнами. На эту же страницу я рекомендую заносить файл с пиктограммами. Естественно, не следует увлекаться больши- ми окнами в большом количестве одновремен- но на экране, т.к. ограничения в памяти возникнут сразу же. Программа печати окон в целях экономии памяти и машинного време- ни не делает проверок достижения конца па- мяти при сохранении экрана. Кстати, о эк- ране: оболочка использует основной экран компьютера с адреса #4000 (16384), второй экран отдан программисту на его цели. Функция PAGE включит любой экран! Принцип сохранений экрана аналогичен работе со стеком процессора: последним за- шел, первым вышел. Информация о сохранени- ях экрана автоматически закладывается в специальный буфер, размер которого равен количеству одновременно открытых окон. На одно сохранение надо отводить шесть байт, где хранится информация о размере окна, его месте на экране, цветовых аспектах и адресе в буфере сохранений. Также имеется системная переменная о количестве сохра- ненных экранов, которая устанавливается тоже автоматически. Если она в нулю, тогда программа удаления окна игнорируется. 3.ПРИНЦИП РАБОТЫ С ОБОЛОЧКОЙ Инсталляция системы описана далее, а здесь вкратце о технологии написания ин- терфейса. Первым делом надо заказать век- тор окна (см. ниже), открыть окно, напеча- тать меню, создать системные для опций, активировать курсорный селектор опций, удалить курсор, окно, сделать переход по созданной таблице адресов далее по алго- ритму. Звучит не определенно... Но на са- мом деле все очень просто и доступно. 4.ПРОГРАММИРОВАНИЕ ВЕКТОРА ОКНА Для задания параметров окна следует создавать специальный набор байт, называе- мых далее вектором окна. На этот вектор всегда указывает регистровая пара IX. Практически все подпрограммы оболочки ра- ботают с вектором, поэтому программист должен следить за его сохранностью и сво- евременностью подстановки, если была необ- ходимость использовать IX регистр. Вектор окна включает в себя следующие значения: +0 колонка печати окна в знакоместах. +1 строка печати окна в знакоместах. +2 длина окна в знакоместах. +3 высота окна в знакоместах. +4 цвет окна. +5 флаг номер один. +6 тек. колонка печати текста в пикс. +7 тек. строка печати текста в знаком. +8 текущий цвет печати текста. +9 флаг номер два. +10 адрес вектора материнского окна. +11 +12 адрес системных параметров на меню. +13 +14 адрес таблицы адресов перехода +15 согласно выбранного меню. +16 признак наличия заголовка окна (ноль - нет заголовка). Параметры со смещением 6,7,8,10,11 ус- танавливаются оболочкой автоматически. По смещению +16 установка нуля означает от- сутствие заголовка окна, но если заголовок нужен, тогда этот байт является первым в заголовке. А теперь о каждом смещении в векторе окна по порядку. Программа печати окна не следит за корректностью введенных параметров, поэтому фуфло задавать не сле- дует. По смещению плюс четыре указывается цвет окна и текста, который там будет на- печатан. Биты значений ink, paper, bright и flash аналогичны Бейсику. Байты со смещением 6,7,8 устанавливают- ся программой печати окна автоматически и означают текущие значения колонки в пиксе- лях от края экрана ТВ, значение строки пе- чати в знакоместах от верха экрана ТВ, значение текущего цвета печати текста со- ответственно. По смещению плюс 10 программа печати окна устанавливает адрес вектора предиду- щего (материнского) окна, из которого выз- валось новое окно. Значение текущего окна хранится в специальной системной перемен- ной (REGWIN). Чтобы организовать возврат к материнскому окну, функция RESTOR берет отсюда адрес предидущего окна, делает его текущим и удаляет последнее окно. Таким образом при помощи вектора окна можно вер- нуться на предидущее разветвление алгорит- ма user soft. По смещению плюс 12 программист обязан указать начало системных параметров для селекции опций менюшки. На одно меню надо указать четыре координаты: позиция колонки от края экрана, позиция стоки от верха эк- рана, размер в длину и высоту полоски ме- ню. Все значения задаются в знакоместах. Конец системных переменных код #FF. Коли- чество четырехзначных системных зависит от количества опций меню в окне. Если в про- цессе работы программы необходимо исклю- чить какой-нибудь режим из опроса, надо "занулить" параметр длины полоски. Тогда выбор невозможен, но при подсчете порядко- вого номера селекцированого меню исключен- ный тоже считается! Для осуществления переходов по подпрог- раммам вне оболочки я предлагаю использо- вать табличный метод движения, т.к. он на- иболее удобен при работе с моим "WINDOWS". Адрес начала таблицы адресов надо помещать по смещению +14. Принцип перехода JP (HL). По смещению плюс 16: ноль - нет заго- ловка. Конец заголовка, как и других текстов в оболочке, всегда ноль. Печать заголовка выделена инверсией. Теперь о флагах по смещению 5 и 9. Так как они используются совместно, здесь рас- писаны вместе. Итак, список номеров бит и реакция оболочки на их значения: BIT 0,(IX+5) - указатель границ окна при печати текста. 0 -печать на границах. 1 -печать с отступлением в одно знакоместо BIT 1,(IX+5) - указатель копирования экра- на под окном. 0 -копию экрана делать. 1 -копию не делать. BIT 2,(IX+5) - указатель разрешения печати тени окна. 0 -тень не делать. 1 -тень делать. BIT 3,(IX+5) - разрешение на инверсию по- лосы меню. 0 -полоса инвертируется. 1 -запрет инверсии полосы меню. BIT 4,(IX+5) - реакция полосы меню на вы- бор опции. Работает в паре со значением BIT 3,(IX+5). 00 -полоса есть : удалить. 01 -полосы нет : оставить, как есть. 10 -полоса есть : оставить, как есть. 11 -полосы нет : установить. BIT 5,(IX+5) - указатель размера буквы в пикселях. 0 -размер буквы произвольный. 1 -размер буквы восемь пикселей. BIT 6,(IX+5) - указатель инверсии печати текста. 0 -инверсия выключена. 1 -инверсия включена. BIT 7,(IX+5) - указатель разрешения пода- чи звукового щелчка. 0 -щелчек разрешен. 1 -щелчек запрещен. BIT 0,(IX+9) - действие с ведущими нулями при печати чисел. 0 -пропуск ведущего нуля. 1 -печать пробела вместо ведущего нуля. BIT 1,(IX+9) - коррекция цвета пиктограммы 0 -цвет пиктограммы не менять. 1 -окрасить пиктограмму цветом из (IX+8). BIT 2,(IX+9) - разрешение обводить рамкой пиктограмму. 0 -не обводить рамкой. 1 -обвести пиктограмму рамкой. BIT 3,(IX+9) - разрешение печати иконок закрытия и откладки окна в заголовке. 0 -иконки не печатать. 1 -иконки печатать. BIT 4,(IX+9) - способ печати пиктограмм. 0 -печатать по принципу наложения OR. 1 -обычная печать. BIT 5,(IX+9) - действие защиты от дребез- га при нажатии "огонь". 0 -защита от дребезга включена. 1 -защита снята (можно рисовать курсором). BIT 6,(IX+9) - резерв для программиста. BIT 7,(IX+9) - разрешение/запрет ввода нерусских букв в INPUT. 0 -запрещено. 1 -разрешено. 5.ИНСТАЛЛЯЦИЯ ОБОЛОЧКИ. Программа пользователя должна сделать настройку системных и некоторых функций оболочки для дальнейшей совместной работы. Для этого необходимо создать специальную последовательность байт, которые использу- ет функция INSTALL. Ваши действия: 1. Загрузить в память компьютера файл пиктограмм и указать в инсталляционном блоке переменных его начало и номер стра- ницы, где он находится. 2. Зарезервировать буфер сохранений эк- ранной области, накрываемой печатаемыми окнами. Размер буфера можно расчитать, ис- ходя из максимального количества окон, открытых одновременно. Формула для опреде- ления количества ОЗУ для одного окна: а=длина окна, b=высота окна, с=длина с тенью, d=высота с тенью, r=(а*b)*8+(с*d). Для правильного нахождения информации в буфере сохранений следует резервировать своеобразный дискриптор по шесть байт на каждое окно. Проще всего это делать на од- ной странице: сначала дискриптор 6*nn, а затем буфер сохранений. nn равен макси- мальному числу одновременно открытых окон в программе, например пять. Начало того и другого указать в инсталляционном блоке. 3. Загрузить экранный файл фона (обои). 4. Программа опроса мыши ассемблирована для трехкнопочной мыши. Если контроллер мыши отсутствует (из порта #FADF (64223) читается ноль), тогда опрос игнорируется, а при инсталляции драйвер мыши обрезается и более недоступен. Первая нажатая кнопка (левая или правая) считается огневой, центральная кнопка не может быть "fire" и нет к ней доступа, пока драйвер не опреде- лился с огневой кнопкой. При инсталляции проверяется наличие кемпстон джойстика (чтение с порта #1F первых пяти бит) и при его отсутствии он исключается из опроса. 5. Для работы на компьютерах с объемом ОЗУ более 48 Кб появляется необходимость указывать номер текущей страницы. Эти ус- тановки необходимо делать каждый раз, ког- да, например, работает IM 2 с проигрывани- ем музыки на другой странице. Системная STRAN указывает последнее значение, зас- ланное в порт #7FFD функцией PAGE. Вектор окна может быть в любом месте памяти: программа открытия окна сама перебрасывает его себе в спецбуфер и работает с ним от- дельно. После открытия окна он возвращает- ся на место с откорректированными данными по цвету, печати и т.д.. Страница тоже за- поминается и восстанавливается. Внешний вид инсталляционного блока: +О DEFB О ;BORDER цвет бордера при целчках на beeper. +1 DEFB О ;PICPAG номер страницы, где лежат пиктограммы. +2 DEFB О ;COXP номер страницы сохранений под окнами. +З DEFW О ;TABSOHR начало таблицы системных o сoхранениях. +5 DEFW О ;TABSPR непосредственно буфер сохранений. +7 DEFW О ;TABPIC адрес нахождения файла пиктограмм. +9 DEFW О ;P_KUR1 позиция курсора на экране в пикселях. +11 DEFB О ;DRIVE номер текyцегo дисковода О,1,2,З. +12 DEFB О ;LD_MIU номер первого физического сектора диска +1З DEFB О ;LD_MAX номер последнего физического номера. +14 DEFB О ;SV_MIU аналог двух предидyцих, но для функции +15 DEFB О ;SV_MAX записи группы секторов. +16 DEFW О ;STACK стандартное положение стэка (рег. SP). +18 DEFB О ;И_KURS номер курсора оболочки О,1,2. Значения +12/+15 указывают оболочке на первый и последний номера секторов, кото- рые физически присутствуют на диске. Пер- вые два значения для загрузки, следующие - для записи на диск. Провалов в нумерации быть не должно! Размер сектора не имеет значения - будет считано столько байт, сколько есть согласно размеру сектора на диске. Драйвер написан таким образом, что сам следит за адресами загрузки. Позиция курсора указывается в пикселях от верхнего и левого края ТВ-экрана и представленя в порядке: младшее значение равно колонке, старшее значение равно строке. Как и положенно оболочке "WINDOWS", внешний вид можно заменить на свой собственный. При этом следует учиты- вать, что курсор имеет размер всего четыре знакоместа. При написании автор руко- водствовался здравым смыслом, поэтому не предусматривал размерность курсора в поло- вину экрана... Системной переменной, ука- зывающей на адрес курсора, который активи- рован на данный момент, является FORMA. В оболочке имеется три вида курсора: ма- ленькая стрелка как в Art-Studio, большая стрелка и пальчик. Курсор имеет приблизи- тельно такой вид в битовом раскладе: КУРСОР МАСКА 00000000 00000000 00011111 11111111 01100000 00000000 00001111 11111111 01010000 00000000 00000111 11111111 01001000 00000000 00000011 11111111 01000100 00000000 00000001 11111111 01010010 00000000 00000000 11111111 01011001 00000000 00000000 01111111 01011100 10000000 00000000 00111111 01011110 01000000 00000000 00011111 01010000 00100000 00000000 00001111 01000111 11110000 00000000 00000111 01001000 00000000 00000000 00000111 01010000 00000000 00000111 11111111 01100000 00000000 00001111 11111111 01000000 00000000 00011111 11111111 00000000 00000000 00111111 11111111 Закладка формы курсора производится следующим образом - сначала два столбика "курсор" по-порядку слева направо, а затем "маска" таким же образом. Всего 64 байта на один вид. 5. ПЕЧАТЬ txt Позиция печати окна указывается в зна- коместах от верхнего и левого края экрана и представлена в порядке, описаном в век- торе окна. Позиция печати текста указывается нао- борот от позиции печати окна: младшее зна- чение - строка, старшее - колонка. Немного напутано получилось, но "имеем то, что имеем" (Л.М. Кравчук). Такой-же стандарт позиции и для печати пиктограмм. Оболочка изначально ассемблирована с 42-символьным шрифтом. ВНИМАНИЕ! ВВИДУ НАСТУПИВШИX ОГРАНИЧЕНИЙ ПАМЯТИ В ОСНОВНОМ ШРИФТЕ ОБОЛОЧКИ ПЕРВЫЕ 256 БАЙТ ИСПОЛЬЗУ- ЮТСЯ ДЛЯ ДРУГИХ ЦЕЛЕЙ, ПОЭТОМУ ПЕРВЫЕ 32 СИМВОЛА С НУЛЯ ДО #1F ПЕЧАТАТЬ НЕ РЕКОМЕН- ДУЕТСЯ, Т.К. НА ЭКРАНЕ БУДЕТ "МУСОР", НО АДРЕС НАХОЖДЕНИЯ ШРИФТА УКАЗЫВАЕТСЯ С УЧЕ- ТОМ ЭТИХ СИМВОЛОВ! Просьба это помнить! После инсталляции в переменной SHRIFT ле- жит его начало. Длина шрифта 2048 байт. На выходе после INSTALL в регистрах DE будет адрес для второго шрифта, размером не бо- лее 2048 байт. Для печати используется маска, которая имеет двухбайтовый вид: 32 #0800 42 #0603 51 #0507 64 #040F где старший байт означает размер буквы в пикселях, а младший в битах маски при пе- чати. Если догружен альтернативный (допол- нительный) шрифт, то для перехода на него надо перезаказать системные размерности PIKSEL (если он отличен от основного) и адреса начала шрифта в системной SHRIFT. Естественно, делать надо установки от- дельно от INSTALL, если это не первый раз. 7.ОПИСАНИЕ ФУНКЦИЙ ОБОЛОЧКИ При написании оболочки автор не придер- живался синтаксиса на английском языке, поэтому названия меток и подпрограмм могут звучать абсурдно. Sorry... По соображениям понимания того, о чем пишешь, я оставил все, как в оригинальном листинге програм- мы. Сначала идет номер функции, а затем ее имя. #40 _INSTAL - инсталляция оболочки. in -HL,инсталляционный блок. ### -HL,DE,ВС,AF out -HL,адрес таблицы функций. DE,начало второго шрифта или конец оболочки. ВС,для подключения RST 16. push-нет. #41 _RAMKA - функция открытия окна. in -IX,вектор окна. ### -IX,HL,DE,ВС,AF. out -*** push-нет. Функция открывает окно согласно пара- метров, указанных вектором окна. Написан алгоритм так, что цикл печати и сохранений работают синхронно, поэтому если нет ко- манды на сохранение экранной области, подставляется адрес #0000. Это следует учесть тем, у кого в адресном пространстве ПЗУ может его и не оказаться... #42 _RESTOR - закрытие текущего окна. in -нет. ### -all out -IX,материнское окно. push-DE,ВС,AF. sys -(REGWIN)-уст. Из текущего вектора окна берется адрес материнского окна, заносится в системную REGWIN и регистр IX. Затем переходит в удаление окна. #43 _KURSOR - печать курсора. in -ВС,позиция курсора в пикселях. ### -IX,HL,DE,ВС,AF. out -*** push-нет. sys -(IX+12) -исп. (P_KUR1) -уст. (FORMA) -исп. (REGWIN) -исп. 5,(IX+9) -исп. для "REPER" оп/off. Очень важная и серьезная программа в оболочке. Она устанавливает позицию курсо- ра в пикселях, читает порты мышки (канал А и Б) и устанавливает исходное значение для поправок движения. Из вектора окна берется адрес нахождения системной цепочки и по ним происходит определение "наезда" на оп- цию. #44 _DELKUR - удаление курсора. in -нет. ### -IX,HL,DE,ВС,AF. out -*** push-HL,DE,ВС,AF,(IX+5). sys -(REGWIN)-исп. 3+4,7,(IX+5)-исп. Обычное удаление курсора с реакцией, согласно значению бит 3+4,7,(IX+5). #45 _SELECT - селекция меню. in -нет. ### -IX,HL,DE,ВС,AF. out -С,(ОТВЕТ)-результат опроса менюшек B,(KOMAND)-результат опроса клавиш и мыши. AF,(ОТВЕТ) -результат опроса меню. CF-реакция на действие пользоват. push-нет. sys -(KOMAND)-исп.+ уст. (АТ_KUR)-уст.+ исп. (ADRKUR)-уст.+ исп. (P_KUR1)-уст.+ исп. Самая крутая программа оболочки. После опроса клавиатуры она смотрит на тип за- действованного интерфейса и если это была мыша, то производится коррекция позиции курсора без торможения Если не мышь, тогда задействуется цикл разгона курсора от 1 до 4 пикселей. Если бит 5,(IX+9) установлен, тогда смещение всегда будет 1 и можно ри- совать без паузы для отжатия клавиш. На выходе в А будет ответ селекции меню. Но ответ зависит от состояния флага CF. Если флаг сброшен, значит нажатия огневых кла- виш не происходило или произошло внутри окна, но не на меню! При этом регистр А не равен #FF - огонь не нажат, обычное движе- ние курсора или молчание. Если флаг уста- новлен - нажат "fire". Регистр А равен #FF - нажатие произошло за пределами окна; не равен #FF - номер выбранного меню! Нумера- ция начинается с нуля. Следует помнить, что нажатие средней или не огневой кнопки на мышке отражается на ответе, как будто ничего не происходит, поэтому необходимо смотреть содержимое ячейки KOMAND, а конкретно - биты, отвечающие за кнопки. Расклад бит смотри в описании функции INKEY. #46 _REPER - защита от дребезга. in -нет. ### -HL,DE,ВС,AF. out -in push-all. sys -см. "INKEY". Программа проверяет все кнопки (мышки и "fire") на нажатие и не отпустит алгоритм до тех пор, пока что-то нажато. #47 _SOUND - щелчек на порт #FE. in -нет. ### -HL,ВС,AF. out -*** push-all sys -(BORDER)-исп. #48 _STOP_M - проверка нажатия "отменной" кнопки на мышке. in -нет. ### -IX,HL,DE,ВС,AF out -AF,результат push-IX,HL,DE,ВС sys -см. "K_MOUSE". Проверяет бит 5 порта кнопок на мышке и если нет нажатия, тогда флаг будет Z. В регистре AF результат этого опроса. #49 _PRI_SP - печать пиктограмм. in -Е,строка D,колонка в знакоместах А,номер пиктограммы. ### -IX,HL,DE,ВС,AF. out -DE,колонка +3 (размер пикты) push-нет. sys -(PICPAG)-исп. (IX+8,9)-исп. Печатает пиктограмму по указанному но- меру и позиции в знакоместах. Окрас берет из вектора окна (IX+8). Нумерация пиктог- рамм начинается с нуля. Размер пиктограммы стандартный: 72 байта, т.е. три на три знакоместа. Так проще и вообще... #4A _PRHEX - 16-ричная печать чисел. in -HL,число от 0 до #FFFF. ### -HL,DE,ВС,AF. out -*** push-HL,DE,ВС. sys -см. "PRINT". Печатает в указанном формате. Перед числом ставится "#". #4B _PRDES - 10-чная печать чисел. аналог "PRHEX". #4С _PRINT - печать одного символа. in -A,символ от #00 до #FF. ### -IX,HL,DE,ВС,AF. out -*** push-HL,DE,ВС. sys -(IX+5,6,7,8)-исп. (SHRIFT)-исп. (PIKSEL)-исп. Главная процедура печати символов в те- кущем окне. За пределами печать не возмож- на (если не извращаться с установкой пози- ции печати...). При достижении правого края окна автоматически переводится строка на следующую, но если это последняя стро- ка, тогда на ее начало. Окрас буквы из вектора окна (IX+8). Размер буквы и маска берутся из системной пары PIKSEL. Это единственная подпрограмма, которая печата- ет коды символов менее #20 (32). #4D _ENTER - перевод строки печати в окне in -нет. ### -HL,AF. out -HL push-нет. sys -(IX+6,7). #4Е _PRI_С - цикл печати текстов. in -HL,начало текста. ### -см. "PRINT". out -HL,конец текста+1 push-нет. sys -см. "PRINT". Цикл печати текстов меню. Конец текста всегда ноль. Для сервиса предисмотрен ряд токкенов, которые можно вставить в текст. Конец текста - ноль, все коды меньше #14 - перевод строки. ...,#14,... - включает бит инверсной печа- ти в векторе окна. ...,#15,... - выключает бит инверсии печа- ти. ...,#16,... - перевод на режим свободной размерности букв. При этом нет конкретной коррекции системных! Только бит 5,(IX+5) сбрасывается. ...,#17,n1,n2,n3,n4,... - переключение на альтернативный шрифт пользователя с кор- рекцией размерности букв, где n1 младший, n2 старший байт физического адреса начала шрифта; n3 маска для печати символа, n4 - размер символа в пикселях. ...,#18,... - размер букв 8 бит. ...,#19,... - устанавливает в системной SHRIFT адрес стандартного шрифта оболочки. ...,#1A,n1,n2,... печать числа в 16-ричной системе. ...,#1B,... - автотабуляция текста относи- тельно границ окна. При работе любой байт, за исключением токкена замены цвета текста, меньший за код пробела, считается концом операции подсчета букв. На выходе корректирует значения текущей позиции пе- чати текста. ...,#1С,n1,n2,... - декомпрессия текста. Байт n1 содержит значение количества пов- торений, n2 - код символа. ...,#1D,n1,n2,... - 10-чная печать, где n1, n2 -число для печати. ...,#1Е,n1,n2,... - новая позиция печати текста. Байт n1 указывает на строку печати в пикселях, n2 - колонка в знакоместах. Все параметры от края текущего окна! ...,#1F,n1,... - замена текущего цвета на значение n1. #4F _NEW_АТ - новая позиция печати текста in -Е,строка в знакоместах. D,колонка в пикселях. ### -DE,AF. out -DE push-нет. sys -(IX+6,7). #50 _TABUL - центровка текста в окне. in -HL,начало текста. ### -HL,ВС,AF. out -HL-1. push-нет. sys -(PIKSEL+1)-исп. (IX+6) -уст. #51 _CHWIND - подключение основного шриф- та оболочки. in -нет. ### -HL out -нет. push-all sys -(SHRIFT)-set (PIKSEL)-set #52 _PAGE - переключение страниц ОЗУ. in -A,номер страницы. ### -ВС,AF. out -AF,что послано в порт #7FFD. push-ВС. sys -(STRAN)-устанавливает. Переключает страницы ОЗУ. В номере ус- танавливается бит ПЗУ 48 бейсика и полная адресация порта #7FFD. #53 _SCRADR - получение экранного адреса. in -Е,строка D,колонка в знакоместах. ### -HL,DE,AF. out -HL,экранный адрес. push-нет. sys -нет. #54 _ATRADR - получение адреса атрибутики ... - аналогично предидущей процедуре. #55 _INKEY - опрос мыши, клавиш и джойст. in -нет. ### -HL,DE,ВС,AF. out -С,A - результат. -HL -если работала мышь,тогда но- вая позиция курсора. push-нет. sys -нет. Главная процедура опроса внешних факто- ров воздействия на курсор или оболочку. Приоритет отдан мышке, как самой "шустрой" в системе. Проверяется порт кнопок и если там ноль, переход далее на опрос других устройств. Первая нажатая (кроме центральной) кнопка считается "fire". Да- лее проверяются порты направлений движения и сравниваются со значением системных, за- ложенных функцией KURSOR. Если есть разли- чия (мышь двигалась), тогда корректируется значение из системной P_KUR1, но не закла- дывается, а выходит в HL. Направления в битах движения не указываются, но 7 бит установлен как признак работы мышки. Ответ находится в регистрах А и С. Признаком ра- боты мышки является установка CF. Ос- тальные девайсы не проверяются! Если не трогалась мышь, тогда опрашивается клавиа- тура и джойстики (Sinclair right & Kempston) плюс курсорные и ENTER. Для раз- деления "сферы влияния" курсорных клавиш и синклер-джойстика сначала опрашивается на- жатие CAPS SHIFT и если не нажато, значит это синклер. Задействованы клавиши: О-left P-right Q-ир A-down SPACE/ENTER-fire. Для определения направлений движения курсора использованы следующие биты: БИТ КОМАНДА БИТ КОМАНДА 0 - fire 4 - left 1 - down 5 - 2 key mouse 2 - ир 6 - 3 key mouse 3 - right 7 - mouse 1-оп 0-off #56 _K_MOUSE - опрос кемпстон мышки. in -нет ### -HL,ВС,AF out -HL,новая позиция курсора. -С,A-результат опроса. push-ВС sys -(KOMAND)-уст., если есть работа. Опрос самонастраиваемого драйвера мыши. Если нет контроллера мыши, тогда выход по Z. В регистрах ответа отображаются только нажатия на кнопки и устанавливается седьмой бит как признак работы на мышке. #57 _LOADER - загрузка группы секторов. in:HL,адрес загрузки. D,трек Е,сектор B,количество секторов. ### -IX,IY,HL,DE,ВС,AF out -см. объяснение. push-IX,IY sys -DRIVE,L23796,ADR_LD. Функция производит чтение секторов по указанному адресу. Принудительно запрещает прерывания и НЕ ВОССТАНАВЛИВАЕТ! На выходе флаг ZF имеет результат работы с диском: Z - ок, NZ - еггог. При ошибке в AF будет ее код: 0 - ок. 1 - disk еггог. 2 - read only. 3 - disk пот present. 4 - track пот formatted. 5 - break in program. Значения HL,DE при "ок" имеют следующие параметры, при "еггог" - где произошел об- лом. В регистре B будет остаток недорабо- танных секторов. Функции безразличен набор размеров секторов на диске. Главное - не нарушать последовательность нумерации. #58 _SAVER - запись группы секторов. см. LOADER #59 _MOTOR - останов мотора дисковода. сохраняет все, режим INT не трогает. #5A _INPUT - ввод символьной строки. in -DE,адрес буфера ввода. С,максимальная длина строки. (IX+6),(IX+7)-уже должна быть. IY,23610 ### -all out -AF,код клавиши выхода. push-HL,DE,ВС sys -(INP_KOD)-уст. Устанавливает EI. В системной INP_KOD будет код последней нажатой (не путать с введенной) клавиши, по которой произведен выход из функции. Выход возможен только по кодам, менее 32, а именно: enter (13), cursor down (10), break (5), extend и т.д. Функция имеет вид полуфабриката. Изна- чально компилирована под русский регистр и прописные буквы. #5B _STAND1 - стандартный опрос менюшки. Вводных нет. Работает в текущим векто- ром окна. Производит переход по алгоритму согласно таблице адресов перехода. При от- мене (за пределами окна нажат "fire" или кнопка "отмена" на мыше) удаляет текущее окно и устанавливает основной шрифт обо- лочки. При выборе опции меню текущее окно не удаляется. #5С _STAND2 - стандартный опрос менюшек. Полный аналог предидущей функции за исключением того, что текущее окно при вы- боре опции удаляется. #5D _SETKUR - выбор курсора оболочки. in -A,номер курсора В системную FORMA заносит адрес вида курсора. Оболочка имеет три вида курсора, различаемых по номерам - 0,1,2. Для зада- ния своего вида, находящегося вне оболоч- ки, надо в системную FORMA подставить свое значение. #5Е _BREAK - опрос этой клавиши. in - нет. ### -AF push-нет. out -AF,результат. Если есть нажатие клавиши break, тогда в AF будет #05 и NZ. В противном случае ноль и Z. #5F _IN_1F - опрос регистра #1F на ВГ-93. Устанавливает DI. Сохраняет все ре- гистры. На выходе в AF имеет значение из регистра ВэГэшки. Использовать при ошибоч- ных ситуациях с дисковыми функциями обо- лочки бессмысленно из-за особенностей на- писания этих самых функций. #60 _SBIT - вычисление активного бита. Функция сделана для определения бита, на который в момент нажатия "fire" указы- вал курсор. Полезно знать, если вдруг ре- шишь потушить защиту от дребезга во флаге и рисовать курсором. Ответ находится в AF. 8. ПРИМЕР РАБОТЫ С ОБОЛОЧКОЙ ╔═══════════════════════════════════╗ ║ I N S Т A L L W I N D О W S ║# ╚═══════════════════════════════════╝# ##################################### ORG #6000 INCBIN "WINDOWS8";объектный код OS EQU #6000;точка входа STRAN EQU OS+3 ;номер текущей страницы REGWIN EQU OS+4 ;текущий вектор окна STACK EQU OS+6 ;стандартное полож. SP SHRIFT EQU OS+8 ;адрес текущего шрифта PIKSEL EQU OS+10;размер буквы в пикс. FORMA EQU OS+12;адрес формы курсора K_SPR EQU OS+14;кол-во сохранений ADRKUR EQU OS+15;scr. адрес курс. АТ_KUR EQU OS+17;АТ курсора в знакоместах P_KUR1 EQU OS+19;^ колонка в пикс. P_KUR2 EQU OS+20;^ строка в пикс. SETBIT EQU OS+21;активный бит BORDER EQU OS+22;цвет INP_KOD EQU OS+23;код выхода из INPUT`а ОТВЕТ EQU OS+24;номер select меню KOMAND EQU OS+25;результат опроса клавиш DRIVE EQU OS+27;drive 0,1,2,3 L23796 EQU OS+28;аналог 23796 ADR_LD EQU OS+30;next adr. if ОК operat. B32 EQU #0800;маска на 8 бит буква B42 EQU #0603;на 6 бит буква B52 EQU #0507;на 5 бит буква B64 EQU #040F;на 4 бита буква Список номеров функций windows`98 _INSTAL EQU #40;инсталляция _RAMKA EQU #41;печать окна _RESTOR EQU #42;удаление окна _KURSOR EQU #43;печать курсора _DELKUR EQU #44;удаление курсора _SELECT EQU #45;селектор опций меню _REPER EQU #46;защита от дребезга _SOUND EQU #47;щелчек _STOP_M EQU #48;проверка отмены мышкой _PRI_SP EQU #49;печать пиктограммы _PRHEX EQU #4A;hex печать HL _PRDES EQU #4B;dec печать HL _PRINT EQU #4С;печать одного символа _ENTER EQU #4D;перевод строки печати _PRI_С EQU #4Е;печать строки текста _NEW_АТ EQU #4F;новая позиция печати _TABUL EQU #50;центровка строки текста _CHWIND EQU #51;основной шрифт windows _PAGE EQU #52;переключение страниц ОЗУ _SCRADR EQU #53;экранный адрес _ATRADR EQU #54;атрибутный адрес _INKEY EQU #55;полный опрос управления _K_MOUSE EQU #56;опрос кемпстон мышки _LOADER EQU #57;загрузка группы секторов _SAVER EQU #58;запись группы секторов _MOTOR EQU #59;выключение мотора дис-да _INPUT EQU #5A;ввод строки символов _STAND1 EQU #5B;селектор. Окно остается _STAND2 EQU #5С;селектор. Окно удаляется _SETKUR EQU #5D;set cursor (0,1,2) _BREAK EQU #5Е;опрос нажатия break _IN_1F EQU #5F;опрос порта #1F на ВГ93 _SBIT EQU #60;активный бит после SELECT ╔═══════════════════════════════════╗ ║ D Е M О V I S I О N ║# ╚═══════════════════════════════════╝# ##################################### ORG #8000 ;user soft LD HL,(#5С51) ;сохранить теку- LD (L5C51),HL ;щий поток rst LD HL,TABINST ;блок install LD (TABINST+16),SP;стандарт CALL OS ;вызов оболочки DEFB _INSTAL ;номер функции ;out:HL,начало таблицы адресов функций ; DE,начало альтернативного шрифта ; ВС,адрес подключения RST 16 LD (#5С51),ВС ;подключ. rst 16 JR CONTI ;и так далее... ;````````````````````````````````````````` ;------ ИНСТАЛЛЯЦИОННЫЙ БЛОК WINDOWS ----- TABINST DEFB 0 ;BORDER 0 DEFB 0 ;PICPAG 1 DEFB 0 ;page сохранений 2 DEFW TABSOHR ;сист. сохранений 3 DEFW TABSPR ;буфер сохранений 5 DEFW TABPIC ;где пиктограммы 7 DEFW #1010 ;P_KUR1 9 DEFB 0 ;DRIVE 11 DEFB #01 ;LD_MIN 12 DEFB #10 ;LD_MAX TR-DOS 13 DEFB #01 ;SV_MIN 14 DEFB #10 ;SV_MAX TR-DOS 15 DEFW 0 ;STACK 16 DEFB 1 ;N_KURS 0,1,2 18 L5C51 DEFS 2 ;сохранение потока RST 16 ;------ Буфер и системные сохранений ----- ;Предполагаемые размеры: ;TABSOHR:30 байт для 5 окон. 5*6=30 ;TABPIC :1440 байт для 20 пикт. 72*20=1440 ;TABSPR :вся оставшаяся память страницы TABSOHR EQU #С000 ;5 окон 30 TABPIC EQU TABSOHR+30 ;20 pick 1440 TABSPR EQU TABPIC+1440 ;сюда сохранять... ;````````````````````````````````````````` CONTI LD IX,R_DEMO;вектор окна LD (REGWIN),IX;заносить толь- CALL OS ;ко первый раз!!! DEFB _RAMKA ;open window LD HL,Т_DEMO;текст в окне RST 16 ;после install DEFB _PRI_С ;можно rst 16 CONTI1 LD ВС,(P_KUR1);позиция курс. CALL OS ;print cursor DEFB _KURSOR DEMKA1 CALL OS ;вызов селектора DEFB _SELECT ;меню JR NC,DEMKA1;нет выбора OR A ;за пределами JP M,OTMENA ;окна? CALL OS ;удалить курсор DEFB _DELKUR CALL OS ;защита от дре- DEFB _REPER ;безга LD L,(IX+14);адрес таблицы LD Н,(IX+15);переходов по JP ADD A,A ;из номера меню LD Е,A LD D,0 ADD HL,DE LD Е,(HL) ;адрес перехода INC HL ;на user подпрог- LD D,(HL) ;рамму PUSH DE ;run program RET OTMENA CALL OS ;защита дребезга DEFB _REPER CALL OS ;удалить курсор DEFB _DELKUR CALL OS ;удалить окно DEFB _RESTOR LD SP,(STACK);станд. значение ;здесь надо возврат в цикл селекции для ;нормального беганья по окнам... ; JR CONTI1 _RET LD HL,(L5C51);восстановить LD (#5С51),HL;поток rst 16 EI ;и выход из RET ;программы ;пример ввода строки текста INP_TXT LD DE,#0006;позиция печати RST 16 ;вводимой строки DEFB _NEW_АТ RST 16 ;защита от сраба- DEFB _REPER ;тывания выхода RST 16 ;по enter, т.к. DEFB _REPER ;он есть "fife"! LD DE,BUFTXT;буфер ввода LD С,22 ;макс.размер line RST 16 ;вызов input`а DEFB _INPUT RST 16 ;возврат в селек- DEFB _REPER ;тор текущего ок- JR CONTI1 ;на ;------ Пример окна ------- R_DEMO DEFB 6,8,20,9,114,1,0,0,0,#9С DEFW R_DEMO,S_UPR,J_UPR DEFB #1B,"Управление",0 Т_DEMO DEFB 13,#1B,"Kempston mouse",13 DEFB #1B,"Kempston joy",13 DEFB #1B,"Sinclair joy II",13 DEFB #1B,"Cursor key",13 DEFB #1B,"QAOP Space, Enter",13,0 S_UPR DEFB 6,10,20,1,6,15,20,1,#FF J_UPR DEFW _RET,INP_TXT BUFTXT DEFS 41 ;for input buffer ПРИМЕЧАНИЯ. Исходя из того, как посто- ронние программисты пытались работать с оболочкой, я решил отдельно комментировать некоторые ньюансы. Для селекции менюшек вовсе не обязательно каждый раз набирать последовательность функций _KURSOR,_SELECT и так далее. Прелесть оболочки состоит в том, что разветвление алгоритма на каждое открытое окно привязано к вектору окна. Таким образом можно один раз набрать выше- указанную последовательность (в примере это от метки CONTI1 до OTMENA включи- тельно) и затем селекцию производить имен- но этим фрагментом! Внимательно рассмотри- те пример работы с оболочкой и вы поймете все без проблем! ФИРМА ГАРАНТИРУЕТ. Еще один немаловажный ньюанс для люби- телей делать перехват выхода в 48`Кб ПЗУ через RET по адресу 23746. Функции диско- вых операций и чтения регистра #1F также делают такой перехват, чем забивают три байта по вышеуказанному адресу. Поэтому следите за их своевременной установкой, если так нужно. 9. ЗАКЛЮЧЕНИЕ Вот такая штучка получилась. Как вы уже догадались - происхождение оболочки из многими горячо любимой программы некогда известного на Спектруме хаккера Николая Родионова "DCU 2.xx". Данная версия явля- ется восьмой по счету переделкой того wind`а. На этом этапе работа по усовер- шенствованию свернута, так как дальнейшие навороты требуют дополнительных ресурсов памяти, что в данном случае уже неприемле- мо. Кто желает развиваться далее в этом направлении - STS вам в руки...
Other articles:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 21 November