┌──────────────────────────────┐ │ │ │ АВТОРСКАЯ РАЗРАБОТКА │ │ │ └──────────────────────────────┘ (c) С.Веремеенко ТРАМПЛИН Программный пакет Трамплин предназначен для программистов- любителей, освоивших программи- рование на ассемблере Z80 или I8080. Он позволяет сразу, толь- ко на основе тех знаний, которые приобретены практикой программи- рования для SPECTRUM'а (Ориона, Вектора, Специалиста и проч.) написать вполне полноценную про- грамму для IBM PC. Программист-любитель, даже в совершенстве освоивший програм- мирование для 8-разрядных машин, сталкивается со значительными трудностями при попытке перехо- да на более перспективную и со- вершенную платформу PC. Именно эти трудности вызвали у многих спектрумистов стойкое неприятие PC, иллюзию невероятной сложнос- ти и даже заумности этой в об- щем-то неплохой машины. Основные трудности, с которыми сталкива- ется "виртуоз 8-битной балалай- ки" при попытке освоения PC: 1. Сложная структура сегмен- тированой памяти и связанные с этим проблемы распределения и управления памятью. Не имеет аналога ни в одном из 8-разряд- ных компьютеров. 2. Необходимость достаточно полного изучения DOS "изнутри", на уровне векторов прерывания ДО ТОГО, как Вы напишете свою пер- вую программу, т.к. даже самая простая программка из 10-15 ко- манд уже обязана взаимодейство- вать с DOS. 3. Необычный и сложный син- таксис ассемблера процессора I86 (так я в дальнейшем буду назы- вать все семейство PC-шных про- цессоров). 4. Новая для спектрумиста система команд. Это самая ма- ленькая проблема, и ее можно бы- ло бы и не упоминать, т.к. I86 и Z80 довольно близкие родственни- ки, и для большинства команд Z80 есть полные аналоги в системе I86 (но не наоборот!) Трамлин позволяет растянуть во времени решение всех этих проблем. Свою первую программу на Трамплине Вы можете написать, даже используя мнемоники Z80, хотя этот этап лучше перешаг- нуть сразу. Использовать из бо- гатой и чрезвычайно удобной сис- темы команд I86 только те, кото- рые имеют аналоги в наборе Z80 - все равно, что есть суп пинце- том, игнорируя лежащую рядом ложку. Характерные особенности Трамплина Программа, написанная для ас- семблирования Трамплином, по своей структуре почти не отли- чается от программы, написанной для Spectrum. Она должна начи- наться заголовком типа: include "keyboard.lib" include "standard.fnt" include "disk.lib" include "s320_200.lib" PROGRAMM Z80 А дальше пишете так, как пи- сали бы на GENS-4. Заголовок оз- начает, что Вы планируете ис- пользовать клавиатуру, будете обращаться к дисководу, винчес- теру или электронному диску, что-то хотите выводить на экран в видеорежиме 13h и удовлетвори- тесь стандартным фонтом. Аргумент функции PROGRAMM сообщает Трамплину, что Вы еще не освоили систему команд I86, и он может напороться на мнемони- ку Z80. В этом режиме Трамплин будет подбирать для команд Z80 наиболее подходящую замену из арсенала I86, хотя использова- ние команд I86 приветствуется и в этом режиме. Вы можете произ- вольно перемешивать команды из обоих наборов, Трамплин разбе- рется. Когда использование мнемоник Z80 будет для Вас пройденным этапом, аргумент Z80 в функции PROGRAMM можете опустить, но са- му функцию выбрасывать нельзя. Кроме всего прочего, она распре- деляет память, настраивает аппа- ратуру машины, подготавливает информацию для последующего кор- ректного выхода из Вашей прог- раммы, короче говоря - делает всю черновую работу, которую должен сделать программист PC, но к которой непривычны спектру- мисты. Если совместить мнемоники из разных наборов команд удалось без особых сложностей, то сов- местить два синтаксиса, сами по- нимаете, невозможно. Поскольку использование Трамплина предпо- лагает постепенный переход от программирования в стиле Spectrum к программированию PC, предпочтение было отдано синтак- сису ассемблера I86. Самые большие отличия проявляются на этапе выбора модели памяти и инициализации, а это все Трам- плин делает сам, без Вашего участия, так что запомнить нуж- но совсем немного. 1. Там, где на ассемблере Z80 Вы ставили круглые скобки для обозначения косвенной адресации, Трамплин требует квадратных. Пример: gens-4 LD A,(HL) Трамплин LD A,[HL] или MOV AL,[BX] 2. Метки и имена переменных - различные объекты. Метка может ставиться только на исполняемую команду и должна заканчиваться двоеточием, а имя переменной может указывать только данные и двоеточием не заканчивается. Пример: gens-4 Трамплин CALL PROC1 CALL PROC1 ........... ............ PROC1 LD HL,(DATA) PROC1: LD HL,[DATA] RET RET DATA DW #4000 DATA DW 4000h Обратите внимание на различие в обозначении HEX-чисел. 3. Метки и имена переменных не являются константами и не мо- гут непосредственно использова- ться в выражениях. Для перевода метки или имени переменной в константу служит оператор off- set. Пример: gens-4 Трамплин LD HL,NAME LD HL,offset NAME NAME LD DE,DATA NAME: LD DE,offset DATA .............. ...................... DATA DW 15000 DATA DW 15000 4. Поскольку I86 является 16-разрядным (как минимум) про- цессором, иногда возникает неоп- ределенность, когда из контек- ста программы невозможно опреде- лить размер операнда. В таких случаях приходится его уточнять. Пример: неправильно INC [HL] ; что инкрементируем, байт или слово? правильно INC [BYTE HL] ; инкремент байта по адресу из HL INC [WORD HL] ; инкремент слова по адресу из HL Такие ситуации возникают не- часто и отслеживаются ассембле- ром, так что если Вас попросят уточнить тип операнда, не удив- ляйтесь очень сильно. Вот, собственно, и все отли- чия в синтаксисе, которые Вам нужно запомнить, чтобы начать работу в Трамплине. Существуют и другие, но с ними Вы столкнетесь уже тогда, когда Трамплин станет для Вас пройденным этапом. С точки зрения программиста, работающего в Трамплине, в его распоряжении компьютер с ОЗУ 65536 байт, очень простым диско- вым интерфейсом и координатным дисплеем среднего разрешения, работающим в режиме с доступны- ми 255 цветами из палитры в 262144 цвета. Стек вынесен за пределы доступного адресного пространства и автоматически инициализируется при запуске программы. Экранные прерывания реализованы так же, как в Spectrum, но устанавливать ре- гистр I и вектор прерывания в памяти нет необходимости. Доста- точно в любом месте программы разместить подпрограмму обработ- ки прерываний с зарезервирован- ным именем INTERRUPT, и по ко- манде IM2 прерывания включатся. Сохранять в стеке регистры в подпрограмме прерывания тоже не нужно. Трамплин о таких мелочах заботится сам. Подпрограмма пре- рываний должна завершаться ко- мандой RETF. Есть еще одна зарезервирован- ная метка BEGIN. Ей должна быть отмечена команда, с которой Ва- ша программа будет стартовать. Команда HALT, как обычно, де- лает паузу до наступления преры- вания независимо от того, какой режим прерываний (IM 0 или IM 2) установлен. Запрещать прерыва- ния нельзя. При попытке запрета прерываний Вы парализуете MSDOS, а она этого не потерпит. Коррек- тный выход в DOS осуществляется по команде EXIT. Библиотечные функции Обращение к внешним устрой- ствам в PC чаще всего осущест- вляется путем программных пре- рываний. BIOS и DOS предостав- ляют для этого большие возмож- ности, и Вы можете пользоваться ими почти без ограничений, но для начинающего это сложновато. Поэтому в "Трамплин" введены го- раздо более простые и удобные команды обращения к внешним ус- тройствам, реализуемые драйвера- ми, подключаемыми командами include в заголовке. Несмотря на значительный объем, эти драйве- ра не отнимают у Вас ни одного байта из доступного Вашей прог- рамме адресного пространства (65536 байт). Все они размещают- ся в другом сегменте памяти, как и стек. Рассмотрим некоторые до- полнительные команды, которыми Вы можете пользоваться, подклю- чив соответствующий драйвер. Клавиатура (keyboard.lib) keyboard.lib дополняет систему команд двумя командами: KEYBOARD <аргумент> KEY <аргумент> Команда KEYBOARD устанавливает режим работы клавиатуры. KEYBOARD 0 - ожидание нажатия клавиши. KEYBOARD 1 - чтение кода клавиши без ожидания. KEYBOARD 2 - джойстиковый режим. По команде KEY при работе в нулевом режиме программа оста- навливается и ждет нажатия кла- виши. При нажатии в аккумулятор передается ASCII. В первом режиме команда KEY не останавливает программу, а сразу выдает ASCII со сброшен- ным флагом Z, если какая-либо клавиша нажата, или 0FFh с уста- новленным Z, если в этот момент не нажата ни одна клавиша. Ана- логично функции INKEY BASIC'а. Во втором режиме команда KEY имеет аргумент, который может принимать значения от 0 до 13. Аргумент указывает группу анали- зируемых клавиш. Например, в ну- левую группу входят клавиши "стрелка влево", "стрелка впра- во", "стрелка вверх", "стрелка вниз", "левый CTRL", "левый SHIFT", "левый ALT" и "ПРОБЕЛ". Как видите, это аналогично раз- рядам Kempston-джойстика, и ко- манда KEY 0 во втором режиме полностью аналогична команде чтения порта джойстика в Spectrum. Нажатая клавиша уста- навливает 1 в соответствующем разряде аккумулятора. Одновре- менно могут быть нажаты нес- колько клавиш. бит 7 6 5 4 3 2 1 0 0 Space Alt l. Shift l. Ctrl l. Down Up Right Left 1 Enter Back Pg. DW. End Delete Pg.Up Home INSERT 2 7 6 5 4 3 2 1 ~ 3 Alt r. Ctrl r. Shift r. + - 0 9 8 4 U Y T R E W Q Tab 5 ничего Pr.Scr. \ ] [ P O I 6 J H G F D S A Caps Sh. 7 ничего ничего ничего ничего " : L K 8 < M N B V C X Z 9 ничего ничего ничего ничего ничего ничего ? > клав.цифр. 10 5 4 9 8 7 * / Num lock 11 + - . 0 3 2 1 6 12 F7 F6 F5 F4 F3 F2 F1 Esc 13 Pause EnterDig ScrLock F12 F11 F10 F9 F8 Экран (s320_200.lib и s256_240.lib) В принципе, Вы можете устано- вить любой видеорежим и рабо- тать с ним. Драйвер s320_256.lib устанавливает стандартный видео- режим 13h, имеющий разрешение 320*200 пикселов с 256 цветами, применяющийся в большинстве ви- деоигр PC. Драйвер s256_240.lib устанавливает нестандартный, но удобный для работы с 8-битовыми данными режим 256*240 с 256 цве- тами. Этот режим имеет квадрат- ные пикселы, т.е. окружность выглядит как окружность, а не вытянутый по горизонтали эллипс, и простое определение координат. В совокупности это позволяет по- высить быстродействие программы в 2-3 раза за счет исключения необходимости геометрической коррекции и расчетов координат пикселов. Это немаловажно, т.к. спектрумисты в массе своей на- род небогатый, и реально прихо- дится иметь в виду 386SX-33, ко- торая уже сейчас дешевле SCORPION или Профи, если не приобретать дорогой SVGA-мони- тор, а ограничиться TV-видеокар- той и работать с обычным телеви- зором или переделанным CGA-мони- тором. Драйверы s320_200.lib и s256_240.lib предоставляют прог- раммисту большие возможности. Рассмотрим систему графичес- ких команд. BORDER R,G,B Эта команда устанавливает цвет рамки вокруг экрана и имеет три параметра, каждый из кото- рых опреределяет интенсивность соответствующего первичного цве- та. Параметры могут принимать значения от 0 до 5, что в сово- купности дает 216 цветов. COLOR R,G,B Передает в аккумулятор код, соответствующий заказанному цве- ту. Смысл параметров тот же. Кроме того есть еще одна форма этой команды с одним параметром. Ее мы рассмотрим, когда дойдем до "палитры пользователя". PLOT Без параметра устанавливает на экране пиксел, цвет опреде- ляется содержимым аккумулятора. В драйвере s256*240.lib коорди- ната X определяется регистром L, координата Y - регистром H. В драйвере s320_200.lib вычисле- ние координат сложнее. Содержи- мое регистра HL(BX) определяется по формуле HL=X+320*Y, где X и Y - координаты пиксела. При вы- числении координат трудно обой- тись без относительно медленных команд умножения и деления, и в этом режиме быстродействие па- дает, хотя спектрумисту, привык- шему к черепашьей скорости своей любимой машины, даже в этом слу- чае быстродействие покажется фантастическим. Если в аккумуляторе код 0FFh, цвет пиксела не меняется. Это позволяет выводить спрайты на фон без его искажения. Те пиксе- лы спрайта, через которые должен просвечивать фон, нужно устано- вить в 0FFh. PLOT T Аналогично PLOT, но цвет из аккумулятора суммируется с цве- том пиксела. Команда выводит по- лупрозрачные объекты - привиде- ния, бутылки с напитками и про- чее. PLOT ? Чтение в аккумулятор кода цвета из указанного HL пиксела. AT X,Y Устанавливает позицию для вы- вода символа командами PRINT и PRINT T. X и Y могут быть зада- ны непосредственно, переменными в памяти или содержимым любых регистров из группы HL,BC,DE (BX,CX,DX). Для драйвера s320_200.lib параметры 16-раз- рядные, т.к. координата X в один байт не помещается, а для s256_240.lib - 8 разрядные. Мож- но, например, дать команду AT B,H. При этом содержимое регист- ра B определит координату X, а H - Y. INK R,G,B Цвет для последующего вывода символов. PRINT Выводит символ в позицию AT. ASCII символа в аккумуляторе, начертание и размер символа оп- ределяются активированным фон- том. После вывода символа пози- ция следующего сдвигается впра- во на величину, определяемую ши- риной символа, которая устанав- ливается при активизации фонта. Фон под символами и между симво- лами сохраняется (команды PAPER нет). PRINT T Вывод полупрозрачных симво- лов. Остальное аналогично PRINT. FONT <имя> Активизация фонта. После этой команды начертание и размер сим- волов определяются этим фонтом. Всего командами include Вы може- те ввести несколько фонтов, единственное ограничение - об- щий их объем не должен превы- шать 30 - 40 kB. Фонт 8*8 пиксе- лов занимает 2 kB, а 9*16 - око- ло 5kB. PALET <метка>, <количество перепрограммируемых цветов> Чрезвычайно мощная команда, позволяющая простыми средствами достигать удивительных результа- тов. Все команды, имеющие аргу- менты <R>,<G>,<B>, кроме BORDER, имеют еще одну форму. Если Вы дадите один аргумент от 0 до 38, то цвет данного пиксела будет определяться "палитрой пользова- теля", в которую входит всего 39 цветов, но они могут многократно переопределяться по ходу про- граммы. Чтобы воспользоваться палит- рой пользователя, нужно где-то создать структуру вида: TABCOLOR DB n,R0,G0,B0 DB m,R1,G1,B1 .................. DB z,Ri,Gi,Bi где n,m,....z - номер Вашего цвета, который фигурирует в ко- мандах INK, COLOR и прочих, а Ri,Gi,Bi - интенсивность цвето- вых составляющих данного цвета. Они могут принимать значения от 0 до 63. Нетрудно посчитать, что через палитру пользователя Вы получаете доступ к 262144 цве- там и оттенкам. Чтобы включить палитру поль- зователя, достаточно дать коман- ду PALET TABCOLOR,5, если Вы хо- тите, например, установить 5 цветов в Вашей палитре. Огромное количество доступных цветов - не самое главное достоинство коман- ды PALET. Представьте себе кар- тинку: ночной город, на фоне фа- сада ночного клуба стоит поли- цейская машина, на капот облоко- тился полицейский и курит. Мер- цают звезды, периодически ме- няет цвет неоновая реклама заве- дения, в окнах видны отблески цветомузыки, вертится мигалка машины, время от времени вспыхи- вает огонек сигареты. И при этом не перерисовывается на экране ни один бит! Просто в процедуре прерываний работает маленькая подпрограммка с использованием команды PALET. Как - Вы уже, ви- димо, поняли. Работа с дисками (disk.lib) MSDOS предоставляет очень большие возможности для работы с дисковыми накопителями. Однако использование функций MSDOS тре- бует определенной подготовки. Полное изучение дисковой службы MSDOS может занять много време- ни. Поэтому на первых порах луч- ше воспользоваться гораздо бо- лее простыми и понятными коман- дами драйвера disk.lib. Команды упрощены до возможно- го предела. Разумеется, disk.lib не использует и 10% потенциала MSDOS, но на того, кто еще вчера плевался, пытаясь выжать что-то из TR-DOS, его возможности про- изведут впечатление. Вначале перечислю ограниче- ния, присущие disk.lib по срав- нению с MSDOS. Вся работа произ- водится в одном каталоге, а именно в том, из которого была запущена Ваша программа. Если программа была запущена с диске- ты, из каталога винчестера C:\GAMES\DIZZY или электронного диска, то читать и записывать она будет только туда. Это впол- не естественное ограничение для игровых программ, электронных журналов и столь любимых прог- раммистами-любителями "DEMO". Одновременно допускается работа только с одним файлом. Это ха- рактерно и для TR-DOS, так что спектрумисты особых неудобств не почувствуют. Максимальный размер файла ог- раничен 16 MB. На дискету такой файл, конечно, не войдет, так что и это ограничение не столь страшно. Не поддерживается работа с аттрибутами файлов. Можно ис- пользовать только обычные файлы. Теперь рассмотрим команды disk.lib. FILE <имя файла> Этой командой мы указываем, с каким файлом собираемся рабо- тать. Если имя файла опущено, то в качестве имени используется строка, на которую указывает ре- гистровая пара DE (DX). DELETE <имя файла> Удаляет указанный файл. Усло- вие умолчания то же. CREATE <имя файла> Создает новый файл нулевой длины с указанным именем. Усло- вие умолчания то же. LOAD A,B,C,D Чтение из файла, указанного последней командой FILE. Параметры: A - адрес, куда будет произ- водиться чтение. Может быть мет- кой, именем переменной или самой переменной. Абсолютное задание адреса возможно, но не имеет смысла. Почему? Немного подумай- те и поймете. B - количество считываемых байт. Может быть задано абсолют- но, в виде разности меток или содержимым переменной. Макси- мум - 65535. C и D. Определяют смещение начала чтения относительно нача- ла файла. Если опущены, то файл читается с начала. Весь файл считается состоящим из некоторо- го количества страниц по 256 байт, аналогично секторам в TR-DOS. C - номер страницы (сло- во, диапазон 0-65535), D - сме- щение внутри страницы (байт, диапазон 0-255). Эти параметры могут быть заданы непосредствен- но или как имена переменных. Если заданное Вами смещение превышает величину реального файла, команда установит флаг C и выдаст в аккумуляторе код ошибки. Так поступают все коман- ды disk.lib при слишком фамиль- ярном обращении. SAVE A,B,C,D Запись в файл. Смысл парамет- ров тот же. Если вы записываете в файл, существующие там данные замещаются записываемыми. Если длина существующего файла не позволяет записать затребован- ное Вами количество байт или Вы установили смещение близко к его концу или даже на конец, длина файла автоматически увеличится до требуемой. Так что Вы спокой- но можете записать 60 kB в све- жесозданный файл с нулевой дли- ной. Работа в Трамплине Чтобы начать работу в Трам- плине, нужно прежде всего запус- тить его. Он имеет имя tramplin. com. После запуска Вы увидите на экране меню со следующими пун- ктами: 1. Редактор 2. Ассемблер без листинга 3. Ассемблер с листингом 4. Пробный пуск 5. Условия регистрации Выход в DOS осуществляется по ESC. Если Вы нажмете клавишу 1, у Вас попросят ввести имя файла, с которым Вы собираетесь работать. Имя файла запоминается на весь сеанс работы, и все программы пакета будут его использовать, пока Вы не введете новое. После ввода имени Вы попадете в редак- тор, где сможете начать работу с новым файлом или продолжить с существующим. После выхода из редактора Вы можете попробовать проассемблировать программу, выбрав пункт 2 или 3. Если Вы работаете с винчестером - проб- лем нет, а если винчестера нет, подумайте, прежде чем выбирать ассемблирование с листингом. Листинг большой программы может иметь размер 1.5-2 MB, а провер- ка на возможность размещения файла не производится, т.к. за- ранее этот размер не известен. Могут быть неприятности... Если Вы не допустили ошибок, можете после ассемблирования дать пробный пуск и посмотреть, что же Вы наваяли. Если Ваша программа не "подвесит" компью- тер, и Вы не забыли о необходи- мости заканчивать любую свою программу командой EXIT (обяза- тельно!), то после выхода из нее снова вернетесь в Трамплин и сможете продолжить работу. Ближайшие перспективы В настоящее время идет работа по созданию новых библиотечных модулей: драйверы мыши, принте- ра, звука, встроенного электрон- ного диска. Будет написан новый драйвер дисплея с буферизаци- ей экрана, работающий по методу "грязных квадратов". Приложение: примеры использо- вания библиотечных функций. KEYBOARD 0 ............... KEY CMP AL,27 JZ KEY_ESC ; нажата Esc ............... KEY_ESC: EXIT ──────────────────────────────────────────────────────────────── KEYBOARD 2 ............... KEY 0 CMP AL,00010110b JZ UP_RIGHT_FIRE ;если одновременно нажаты ;вверх, вправо, Ctrl-left ──────────────────────────────────────────────────────────────── COLOR 0,5,0 MOV BL,128 ; X-координата MOV BH,120 ; Y-координата PLOT ; яркозеленая точка ; в центре экрана INC BL PLOT ? ; AL=код цвета соседней ; по горизонтали ──────────────────────────────────────────────────────────────── BORDER 1,2,3 ; бордюр оливкового цвета FONT MICRO ; устанавливаем фонт ; (если он у Вас есть) ; INK 0,1,3 ; будем печатать цветом ; морской волны AT 30,52 ; левый верхний угол символа ; будет в коорд. X=30,Y=52 PRINT T ; печатаем прозрачным шрифтом ──────────────────────────────────────────────────────────────── PALET NIGHT,5 ; уст. 5 регистров палитры ; "Ночь" ............... NIGHT DB 0,0,10,22 ; 0 рег. голубая звезда DB 1,10,0,0 ; 1 рег. потухающая сигарета ; в зубах у хулигана DB 5,0,20,0 ; 5 рег. глаза кошки DB 11,17,17,17 ; 11 рег. серая кошка DB 4,0,47,0 ; 4 рег. зеленый светофор NIGHT1 DB 0 WPAL DW offset PFL3 ──────────────────────────────────────────────────────────────── CREATE 'NIGHT.PAL' ; создать файл SAVE NIGHT,NIGHT1-NIGHT ; записать туда палитру LOAD [WPAL],4,0,7 ; считать из этого файла ; в переменную PFL3 4 байта начиная с 8 от начала файла MOV DX, offset F_NAME DELETE ; удалить файл, имя которого в переменной F_NAME ......................... F_NAME DB "NIGHT.PAL",0 ──────────────────────────────────────────────────────────────── ВНИМАНИЕ: саму программу ТРАМПЛИН Вы найдете в Каталоге ZX РЕВЮ. * * *