Текст
                    ЛАЯ ПОЛЬЗОВАТЕЛЕЙ
И ПРОГРАММИСТОВ
ИПК «ИМПАКС». С.-Петербург, 1991


ZX Spectram для пользователей и программистов Ларченко Андрей Анатольевич, Родионов Николай Юрьевич Ответственный редактор Усманов В. В. Редактор Болдачев А. В., Художник Галичева Н. М. Оригинал-макет подготовлен при участии авторов. Приводятся описания архитектуры компьютера ZX Spectrum, системы команд процессора Z80, наиболее популярных пользовательских и системных программ. © МП «Питер» (Piter Ltd.), 1991. Все авторские права переданы МП «Питер». ISBN 5—87472—004—9 ИПК «ИМПАКО. 191028, С.-Петербург, наб. р. Фонтанки, д. 18. Подписано к печати 16.10.91. Формат 60><88 1/16. Печать офсетная. Бумага офсетная. Усл. п. л. 10. Тираж 100000. Заказ 1102. Цена договорная. С.-Петербургская типография № 4 Государственного комитета СССР по печати. 191126» С.-Петербург, Социалистическая ул., д. 14.
ПРЕДИСЛОВИЕ Каждый владелец компьютера Sinclair ZX Spectrum знает, как трудно найти качественную литературу на русском языке по программному и аппаратному обеспечению этой машины. Чаще всего попадаются ксерокопии с неважным переводом и массой опечаток. Книга, которую Вы держите в руках — попытка помочь многочисленным «синклеристам» хоть немного утолить информа- ционный голод. В нее вошли описания наиболее популярных пользовательских программ: графического редактора Art Studio, музыкального редактора Wham, электронной картотеки Masterfile. Для опытных программистов и всех желающих ими стать несомненно полезными будут подробные и точные сведения об архитектуре компьютера и системе команд процессора Z80, о системных переменных и подпрограммах ПЗУ ZX Spectrum, a также описания ассемблера GENS4 и монитора-отладчика MONS4. В книгу не включено руководство по работе с интерпре- татором языка Бейсик, поскольку оно наиболее распространено и обычно входит в комплект поставки компьютера. Кроме того, для детального описания Бейсика нужна отдельная брошюра, которую мы и рассчитываем вскоре выпустить в ряду других, посвященных ZX Spectrum. Книга подготовлена авторами на основе длительного опыта работы с этим компьютером, в ней затронуты многие вопросы, не освещенные в фирменных руководствах. Надеемся, что книга вызовет интерес как у любителей, так и у профессионалов.
НЕМНОГО ИСТОРИИ Всем нашим читателям — и тем, кто давно работает с ZX Spectrum, и тем, кто только подумывает о его приобретении — наверняка будет интересно узнать об истории создания этой замечательной машины, о ее триумфальном шествии по рынкам мира, о новом витке ее популярности, но уже в нашей стране, о взлетах и падениях, пережитых ее создателем сэром Клайвом Синклером. Клайв Марлз Синклер родился 30 июля 1940 г. Еще школьником он начал печатать неплохие статьи в популярных английских журналах для радиолюбителей. Окончив школу, Синклер не стал поступать в университет, а был принят в один из таких журналов в качестве помощника заместителя редактора и некоторое время работал в издательстве. В 1 961 г. Клайв решил заняться предпринимательством и зарегистрировал свою первую фирму — Sinclair Radionics. Уже тогда, наладив производство микроусилителей, а затем калькуляторов и миниатюрных телевизоров, Синклер ставил перед собой две сверхзадачи: минимальные размеры и минимальная цена. В 1979 году компания Commodore выпустила свой первый бытовой компьютер PET с самой низкой по тем временам стоимостью 700 фунтов стерлингов. Газеты тогда предсказывали, что цены на персональные ком- пьютеры опустятся ниже 100 фунтов стерлингов не ранее, чем через 5 лет. Однако уже через полгода фирма Sinclair Research Ltd. — новое детище Клайва Синклера — выпустила компьютер ZX-80 ценой 99 фунтов. Резкому снижению цены способствовала идея использовать в качестве дисплея теле- визор, а в качестве внешней памяти — бытовой магнитофон. ZX-80 сломил расхожее мнение об ЭВМ, как о чем-то, доступном лишь избранным — в первые 8 месяцев с начала производства было продано 20 тысяч компьютеров. В марте 1981 г. появилась новая модель — ZX-81 ценой уже 60 фунтов, а еще через несколько месяцев — принтер к ней. Правда, перечисление параметров этой машины вызовет у Вас, в лучшем случае, улыбку: черно-белый экран, ПЗУ объемом 8 килобайт, ОЗУ— 1 килобайт!!) (хотя и с возможностью расширения до 16К). Но для начала восьмидесятых это было настоящим открытием. В 1981 г. «за большие заслуги в деле компьютеризации страны» (как сказали бы у нас в те годы) Синклеру был пожалован дворянский титул. Наступил период взлета Синклера-предпринимателя: американская фирма Timex купила лицензию на производство всех его разработок; компания Mitsui приобрела исключительные права на распространение ZX-81 в Японии. Решительным рывком вперед стал договор о реализации компьютеров через британскую книготорговую сеть. За один год товарооборот фирмы Sinclair Research Ltd. вырос с 4.6 до 30 миллионов фунтов. А Клайв Синклер уже готовил новую модель — ZX Spectrum. Были разработаны две ее версии, отличающиеся друг от друга объемом оператив- ной памяти — ZX Spectrum 16K и ZX Spectrum 48K. Экран стал цветным, объем ПЗУ увеличился до 16К, что значительно расширило возможности
НЕМНОГО ИСТОРИИ встроенной операционной системы. Популярность ZX Spectrum превзошла нее ожидания — в неделю раскупалось до 15 тысяч компьютеров. Изначально Spectrum предполагалось использовать для обучения про- граммированию. Однако фирмы, специализирующиеся на разработке про- граммного обеспечения, быстро оценили возможности машины. Для нее стали выпускаться не только трансляторы языков программирования и учебные программы, но и отличные видеоигры. Получилась своего рода положительная обратная связь: чем лучше Spectrum раскупался, тем актив- нее для него писались программы, а чем больше появлялось высококачест- венных программ, тем выше становился спрос на компьютер. Ажиотаж вокруг детища Синклера охватил и фирмы, изготавливающие компьютерную периферию: для ZX Spectrum разрабатываются дисковые сис- темы, интерфейсы для подключения светового пера, джойстиков, принтеров. Не остались в стороне и издательства — выходят в свет специализированные журналы, такие как «Sinclair User», «Your Sinclair», «Your Spectrum». В одном из них ZX Spectrum впервые ласково назовут «Спекки» (Speccy). Хотя к 1984 г. компании Atari, Commodore и Amstrad стали произво- дить компьютеры, превосходящие по своим возможностям ZX Spectrum, рынок уже был смещен в пользу Sinclair Research Ltd. — Speccy покупали более чем в 30 странах мира. В том же 1984 г. Синклер выпустил ZX Spectrum+, отличавшийся усовершенствованной клавиатурой, а в самом конце 1985 г. — ZX Spectrum 128, имеющий 128К оперативной памяти, 32К ПЗУ, трехка- нальный звуковой процессор и при этом полностью совместимый с предыду- щими моделями. Новая машина была с восторгом встречена как поклонни- ками Speccy, так и разработчиками программного обеспечения. — Казалось, Синклер застрахован от неудач, но, неожиданно для многих, в 1986 г. фирма Sinclair Research Ltd. продает все права на производство Spectrum-совместимых компьютеров компании Amstrad. Причиной этому были финансовые и организационные трудности, возникшие при освоении новой модели — Sinclair QL. Эта модель задумывалась как дешевая альтер- натива американским IBM PC и обладала весьма высокими характеристи- ками: 32-разрядный процессор, ОЗУ емкостью 128К с возможностью рас- ширения до 4 мегабайт, хорошая графика и звук. Но при ее разработке был допущен ряд просчетов, например, использование в качестве внешней памяти микродрайвов (накопителей на кольцевой магнитной ленте), а не более удобных накопителей — дисководов. Бытовым компьютером эта маши- на не стала из-за относительно высокой цены, а профессиональным — из-за недостаточно развитых аппаратных средств. Более того, фирмы, выпускаю- щие программное обеспечение, не поддержали эту в общем-то неплохую модель. А жаль, ведь по своей концепции Sinclair QL как минимум на три года . опередил столь популярные сейчас на Западе компьютеры Commodore Amiga и Atari ST. Положение компании усугублялось и недостаточной практической хваткой Клайва Синклера. Будучи отличным инженером, он так и не сумел стать хорошим бизнесменом — ни в моменты взлета, ни даже в тяжелые времена он не допускал, чтобы прибыль фирмы от продажи одного компью- тера превышала 1 фунт стерлингов. Продав все права на производство и реализацию своих изделий, сэр Клайв Синклер ушел из фирмы Sinclair Research Ltd., оставив за собой исследовательскую лабораторию в Кембридже и знаменитое имя. Оно и сейчас часто встречается на страницах различных журналов в связи с новыми разработками Синклера, которые, однако, уже не имеют* отношения к Speccy.
НЕМНОГО ИСТОРИИ Последующие модели семейства Spectrum — ZX Spectrum+2 (1986 г.) со встроенным магнитофоном и ZX Spectrum+3 (1987 г.) со встроенным дисководом — выпускались уже фирмой Amstrad. Основным их преимуще- ством перед Spectrum 128 является полноценная клавиатура, в то время как встроенные магнитофон и дисковод некоторыми воспринимаются как «на- грузка». Тем более, что дискета имеет нестандартный размер (3 дюйма) и малую емкость (180К). Spectrum+З частично потерял совместимость со Speccy (примерно до уровня простейших советских самоделок). Но это не большая потеря, поскольку появившиеся для него дисковые версии систем- ных, прикладных и игровых программ значительно превосходят аналогич- ные, рассчитанные на работу с магнитофоном и микродрайвом. Однако недавно фирма Amstrad объявила о свертывании производства компьютеров Spectrum+3f мотивируя это тем, что потребители предпочитают покупать их, а не более дорогие собственные разработки фирмы. До настоящего времени Amstrad продолжает выпускать лишь Spectrum+2, поскольку эта машина не имеет аналогов у фирмы. В 1986 г. компания Timex на своих заводах в Португалии начала выпускать для Европы компьютер Timex-2048, практически полностью совме- стимый с ZX Spectrum и к тому же имеющий ряд преимуществ: улучшенную клавиатуру, встроенный порт джойстика, две экранных области памяти, режим расширенной цветной графики. Для продажи в США была разработана модель Timex-2068, с возможностью установки сменных картриджей. При подключе- нии одного из них компьютер становится Spectrum-совместимым, а при подключении другого — С Р/М-совместимым (американцы не представляют 8-разрядный компьютер без системы СР/М, так же, как и 16-разрядный — без MS-DOS). С 1987 г. фирма Timex планировала начать выпуск новой перспек- тивной модели — Super Spectrum. Она была разработана на базе микропро- цессора Z80H, работающего с тактовой частотой 7 МГц. При таком быстро- действии удалось организовать два банка памяти по 64К, экранное ОЗУ объемом около 50К, позволившее, при разрешающей способности экрана 256x192 точек, воспроизводить 64 цвета для каждой точки. Эта машина, программно совместимая с ZX Spectrum и стоившая менее 200 фунтов, могла бы стать серьезным конкурентом компьютеру Amiga. Но Super Spectrum постигла участь его предшественника Spectrum-1-З — компа- ния Amstrad, обеспокоенная судьбой собственных разработок, не дала раз- решения на его производство, и машины семейства Spectrum постепенно отошли на второй план в мировой торговле бытовыми компьютерами. Но на этом история маленького Speccy не закончилась. Волна его популярности, прокатившись по странам Восточной Европы, достигла, на- конец, берегов Союза. Как известно, первым компьютером, попавшим в руки советских самоделыциков, был «Радио-86РК». После опубликования его схемы и матобеспечения в журнале «Радио» тысячи радиолюбителей бросились ску- пать залежавшиеся радиодетали, имеющие хоть какое-то отношение к «РКашке» (в этом смысле схема была разработана мудро). Однако характе- ристики этого «шедевра», количество и качество программного обеспечения для него вскоре перестали удовлетворять даже непривередливого советского пользователя. Тогда нашлись толковые люди, которые рискнули повторить еще не слишком известный в Союзе ZX Spectrum. Есть как минимум две причины, по которым был выбран именно он, а, скажем, не Atari. Это, во-первых, простота исполнения оригинальной модели и возможность ее повторения на основе советских комплектующих (на долю контрабанды остался лишь центральный процессор Z80). И, во-вторых, наличие огромно- го количества высококачественных фирменных программ при отсутствии в нашей стране авторских прав на программные продукты.
НЕМНОГО ИСТОРИИ Так или иначе, первая копия ZX Spectrum, собранная, что называется, «на коленках», заработала- Когда это произошло, определить трудно, но с этого момента схемы советского «Спектрума» («Синклера», «Зет-икс» — как только его не называют) стали распространяться со скоростью слухов. Первые варианты схем перерисовывались порой карандашом на клочках бумаги в трясущемся вагоне трамвая. Однако и они оживали, у одних — благодаря знаниям, у других — благодаря интуиции, у прочих — благодаря природному упорству (после перебора всех возможных комбинаций соеди- нения нескольких десятков микросхем). А доморощенные гении от электроники разрабатывают все новые и новые схемы. Их количество на сегодняшний день подсчитать невозможно. Только перед нашими глазами прошло около двух десятков вполне приличных схем, таких как «Новосибирская», «Зоновская», «Краснодарская», «Пентагон», а упоминания о различных экзотических вариантах вообще несчетны. В процесс «синклеризации» страны кроме самоделыциков постепен- но включилась масса новоявленных бизнесменов: кооператоров, совместных предпринимателей и всевозможных НТТМщиков. А в последнее время потуги в этом направлении делают также дорвавшиеся до свободы госпред- приятия, но, как и следовало ожидать, их компьютерам далеко до фирменных. Достаточно сказать о варианте Минского приборостроительного завода им. В. И. Ленина — компьютере «Сантака», — типичном примере того, как можно испортить хорошую идею. Эту машину русифицировали, заменив в знакогенераторе строчные латинские буквы на прописные русские. Таким образом, почти все системные и многие игровые программы, использующие стандартный знакогенератор, выводят на экран «Сантаки» русско-латин- скую белиберду. Но бездонность нашего рынка пока еще поглощает все, что имеет клавиатуру и экран, независимо от качества. Сегодня Spectrum интересует всех — и любителей видеоигр, и про- фессиональных программистов и, что естественно, учителей и учеников. Относительно дешевый, простой в эксплуатации, со встроенным интерпре- татором Бейсика и отличными графическими возможностями Speccy — настоящая находка для школы. Улавливая конъюнктуру, в работу включи- лись и программисты — для ZX Spectrum стали появляться неплохие обуча- ющие программы на русском языке, автоматизированные обучающие сис- темы и учебные локальные сети. Правда, Госкомитет по народному образо- ванию дал установку на использование в школах IBM-совместимых машин, но не сообщил, где взять для этого средства. Трудно представить, что, скажем, через пару лет, в свете выполнения этого постановления, школьные парты будут ломиться от «писишек». К тому же, даже многие зарубежные специа- листы считают применение IBM-совместимой техники в начальной школе экономически нецелесообразным (это при их-то уровне развития!). Хотя ZX Spectrum уже начал свое триумфальное шествие по Союзу, думается, его звездный час еще впереди. Через некоторое время должны раскачаться и начать тысячами штамповать Speccy наши гиганты компью- теростроения. Они завалят рынок дешевыми и, возможно, качественными машинами, которые навсегда вытеснят никому не нужные «Микроши», «БКашки» и «Корветы». Заканчивая этот короткий экскурс в историю, хочется выразить глубокую признательность сэру Клайву Синклеру, который, сам того не подозревая, подарил советским людям замечательную машину. Будем наде- яться, что Speccy поможет нам сделать хотя бы шаг вослед уходящей от нас цивилизации.
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Одна из главных причин популярности в нашей стране Spectrum-совме- стимых машин — это обилие для них программного обеспечения. Его поток хлынул из-за границы с появлением первых Speccy и усиливается день ото дня. Большинство программ для ZX Spectrum пишутся на его родине — в Англии. Они снабжаются всевозможными защитами от изменения и копирова- ния и в таком виде продаются в цивилизованных странах за доллары или фунты стерлингов. Но только не у нас. К советским синклеристам программы попадают, в основном, через третьи руки — из стран бывшей народной демократии, преимущественно из Польши. В большинстве своем — это взломанные, переде- ланные, испорченные копии, часто смутно напоминающие оригиналы. Дело в том, что у наших бывших друзей, как и у нас, нет авторского права на программные продукты, но зато есть «виртуозы»-программисты, которым вели- чайшее удовольствие доставляет процесс снятия фирменных защит. Причем, если раньше для «взламывания» программы требовалась масса изобретательно- сти и таланта, то теперь, после появления так называемых мультифейсов {Multiface) и других устройств, позволяющих нажатием одной кнопки записать содержимое всей памяти на ленту или диск, снять защиту может и первоклассник. Последствия подобных вскрытий Вы, наверняка, видели: вместо красочной заставки — игровое меню, частично забитое какой-то дрянью; музыка и подгру- жаемые уровни отсутствуют; для управления игрушкой заранее выбран кемп- стон-джойстик (хотя, конечно, управление можно сменить с помощью того же кемпстон-джойстика, которого у Вас нет) и т. д. Однако эти программы работают и радуют наших непритязательных соотечественников. Существуют тысячи (по некоторым оценкам — до десяти тысяч) про- грамм и пакетов для ZX Spectrum, из которых более 90 процентов — игровые. Полностью этого изобилия, вероятно, нет ни у кого. Лишь некоторые советские синклеристы могут похвастать коллекцией в две-три тысячи программ. Правда, в последнее время быстро растет число фирм, за умеренную плату распрост- раняющих программное обеспечение для ZX Spectrum. Так что Вы, наверняка, сможете найти то, что Вас заинтересует, после прочтения этого обзора. Начнем его с относительно небольшой, но наиболее интересной для программистов группы — системных программ. В первую очередь расскажем о языках программирования. Для тех, кого не удовлетворяют возможности стандартного синклеровского Бейсика, разработаны разнообразные его расширения. Наиболее мощное из них — Beta-Basic фирмы Betasoft. Первые его версии 1.0 (1983 г.) и 1.8 (1984 г.) дополняют синклер-бей- сик более чем 20 новыми командами и функциями и занимают всего 5 К и 8 К соответственно. Следующие версии — Beta-Basic З.ОиЗ.1 (1985 г.), предоставляя пользователю более изощренные возможности, требуют по 19К каждая, что несколько сужает сферу их применения. Наконец, последняя версия 4.0 (1988 г.), уже другой фирмы Real Time, предназначена для ZX Spectrum 128, в чем и заключается ее основное достоинство.
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Из других расширений Бейсика Вас могут заинтересовать две мало отличающиеся друг от друга версии Mega-Basic 1.1 и 3.0 (1985 г.), занима- ющие каждая по 2ОК. Mega-Basic позволяет программировать с использова- нием процедур, имеет дополнительные средства редактирования и отладки программ, собственный монитор для просмотра и изменения содержимого памяти. Кроме того, он содержит два встроенных шрифта, любой из которых довольно легко заменяется русским. В среде синклеристов часто упоминается графический пакет Laser- Basic фирмы Oasis Software. Он состоит из трех самостоятельных частей: интерпретатора, компилятора и генератора спрайтов* (не считая трех демон- страционных программ). Интерес к Laser-Basic понятен — умело пользуясь пакетом, можно написать вполне приличную динамическую игрушку. Однако немало приверженцев остается и у стандартного спектрумовского Бейсика. Для них существует масса вспомогательных средств. Наиболее известны пакеты Supercode I, содержащий 100 функционально законченных подпрограмм в машинных кодах, и Supercode II (120 подпрограмм). Нужные подпрограммы извлекаются из пакета и используются совместно с бейсик-программой. Существуют вспомогательные программы, расширяющие возможности редактора синклеровскою Бейсика. С их помощью можно, например, автоматиче- ски нумеровать и перенумеровывать строки, перемещать и удалять блоки бей- сик-программы и т. п. Для этих целей весьма удобна программа Zxed фирмы Dk'tronics, занимающая верхние 4,5К памяти машины и несколько строк в конце бейсик-программы. Она предоставляет на выбор 12 вспомогательных функций. Следующая группа вспомогательных программ — это компиляторы Бей- сика. Они преобразуют программу, написанную на Бейсике, в машинный код, что предполагает повышение ее быстродействия. Самые ранние из компиляторов — Mcoder (1983 г.) и Ultrakit (Hisoft, 1984 г.). Наиболее мощный — Blast в пакете с утилитой Toolkit, приводящей бейсик-программу к виду, удобному для компи- ляции. Обратите внимание, что компилятор Laser-Basic способен обрабатывать программы, написанные не только на Laser-Basic, но и на стандартном синкле- ровском Бейсике. Правда, практическому применению компиляторов Бейсика препятствует их несовершенство — одни из них «не переваривают» дробных чисел, другие — не поддерживают массивы данных и т. д. Скомпилированные программы, как правило, не работают без присутствия в памяти самого компи- лятора или его части. Так что часто овчинка выделки не стоит. Конечно же, кроме разнообразных диалектов Бейсика, для Speccy разработаны версии и других языков высокого уровня. Так, в 1983-84 гг. фирмой Hisoft выпущено несколько вариантов Паскаля. Они встречаются и с доработками, к которым фирма не имеет никакого отношения. Паскалем на ZX Spectrum можно побаловаться, но не более. Написать приличную программу на нем довольно сложно — возникают трудности, связанные с малым быстродействием, нехваткой памяти и пр. Та же фирма Hisoft в* 1984 г. выпустила две версии компилятора языка Си — 1.0 и 1.1. На нем можно попытаться написать более или менее серьезную программу. Но для этого часто не хватает системных библиотек stdio.h и stdio.lib, которые по чьей-нибудь дурости часто исчезают из пакета. Вы можете встретить и другие, более экзотические языки программи- рования. Существуют, например, несколько различных версий языка Форт фирм Abersoft, Artie Computing и СР Software (последняя выпустила версию, поддерживающую операции с плавающей запятой); два-три варианта не- серьезного языка Лого разных фирм; по одной версии весьма специфиче- *) Спрайтами называются графические изображения, которые специаль- ными программами, например,^написанными на Laser-Basic, могут пе- редвигаться по экрану.
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ских языков Лисп (Serious Software, 1983 г.) и Микро-пролог. К последнему прилагаются дополнительные библиотеки, но, к сожалению, самую полезную из них, под названием Simple, в Союзе обнаружить не удалось. Непосредственно к языкам высокого уровня примыкают ассемблеры и дизассемблеры, позволяющие общаться с компьютером на языке команд процессора. Дизассемблеры зачастую выполняют также функции отладчи- ков программ. Программирование на языке низкого уровня — чрезвычайно трудоемкий, но, к сожалению, единственно возможный способ создания на ZX Spectrum программ высокого уровня. Как правило, ассемблер и дизассем- блер одной фирмы работают с файлами одинакового формата и составляют единый программный пакет. Первыми в 1982 г. были созданы ассемблер Editas и пакет Ultraviolet-Infrared, рассчитанные на ZX Spectrum с ОЗУ объемом не только 48К, но и 16К. Из разработанных позже многочисленных ассемблеров и дизассемблеров стоит упомянуть интересный пакет макроас- семблера с монитором Spectremac-Spectremon фирмы Oasis Software, для которого, к сожалению, пока не обнаружено подробного описания. Совер- шенно фантастический по своим возможностям пакет Laser Genius той же фирмы остался в тени также из-за отсутствия описания. Весьма интересен отладчик Моп2, но для него нет совместимого ассемблера. Непреходящей популярностью среди синклеристов пользуется пакет Gens-Mons фирмы Hisoft (оригинальное название пакета — Devpac). В Союзе наиболее часто встречаются его версии со 2-й по 4-ю в различных подвариантах. Исчерпы- вающее описание этого программного продукта приведено во втором разделе книги. Перейдем к описанию другой группы программ «для дела» — приклад- ных программ', текстовых, графических, музыкальных редакторов, электрон- ных картотек и пр. Типичнейшие представители прикладных программ — текстовые редакторы. Из них наиболее развито семейство редакторов Tasword фирмы Tasman Software. Первая версия Tasword сейчас практически не использу- ется, зато на основе Tasword 2 во многих странах, в том числе и у нас, созданы многочисленные модификации, приспособленные под национальные алфа- виты, разные принтеры и дисковые системы. Tasword 2 позволяет редакти- ровать строки длиной 64 символа, причем на экран их можно выводить как целиком (мелким шрифтом), так и фрагментами по 32 символа (в нормаль- ном синклеровском формате). Этот редактор выполняет все, на что способен любой более или менее приличный текстовый процессор: форматирует текст (с выключкой строк или с рваным краем), перемещает блоки текста, произ- водит поиск слова по образцу и многое другое. Tasword 2 имеет и сущест- венный недостаток — каждая строка текста, независимо от того, сколько в ней символов, дополняется пробелами до 64 знаков. При небольшой свобод- ной памяти (около 2 О К) это сильно ограничивает размер текста — в редак- торе можно обрабатывать лишь 320 строк. Существует много «национальных» вариантов Tasword 2, в том числе несколько русифицированных, например, Тасворд Авп (или RusTas), работа- ющий только с русским алфавитом, и Tasword RL, имеющий полные знаковые наборы русского и латинского алфавитов. Но, к сожалению, сделаны они крайне непрофессионально, и работать с ними практически невозможно. Последняя известная нам версия «тасворда» — Tasword 128 (1986 г.) рассчитана для работы на ZX Spectrum 128. Помимо увеличения максималь- ной ширины текста до 128 символов и устранения «холостых» пробелов в конце строки, серьезным преимуществом этой версии является расширение объема свободной памяти до 64К. Из других редакторов текста упомянем программу Spectral-writer (иногда фигурирующую под названием AMI-writer). Она разработана в 1984 г. фирмой 10
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Softek, явно под влиянием Tasword 2, но при этом обладает расширенной до 22К свободной памятью и некоторыми другими привлекательными ^особен- ностями. Особого внимания заслуживает текстовый редактор TLW (The Last Word) фирмы Myrmidon Software (1986 г.), превосходящий своих собратьев почти по всем параметрам. Наиболее распространена слегка доработанная фирмой вер- сия TLW 2. Одно из существенных достоинств редактора — большой объем свободной памяти (до 25.5К). Но размер создаваемого документа не ограничен этим объемом — TLW 2 при выводе на принтер может соединять в цепочку неограниченное число файлов. Примечательной особенностью TLW 2 является его способность выводить на экран текст в четырех различных форматах: от 40 до 80 символов в строке. Независимо от этого, при выводе на принтер длина строки может достигать 144 символов. Но разнообразие форматов вывода затрудняет русификацию редактора. Многими делались попытки «встроить» в TLW 2 русский алфавит, но обычно они заканчивались неудачей. В лучшем случае русификация достигалась замещением знакогенератора, без возможности одновременной работы с русскими и латинскими буквами. Одному из авторов этой книги все же удалось русифицировать TLW 2 с учетом всех пожеланий: в версии TLW 2M функции редактора поддерживают как латинский шрифт, так и кириллицу. Кроме того, в этой версии, в отличие от оригинальной, вставка текста не требует никаких ухищрений. Редактор дополнен и еще одним новым режимом — автонумерацией страниц при печати. Для составления каталога коллекции, учета всевозможной утвари и многих других дел просто незаменимы программы формирования баз данных (иногда называемые электронными картотеками). Первой из них появилась на рынке программа VU-File (Psion, 1982 г.). По Вашему желанию она может рассортировать в нужном порядке записи, сделать выборку по заданному образцу и выполнить многое другое, что требуется от программ подобного типа. Достоинство VU-File — небольшой объем занимаемой памяти, что позволяет создавать базу данных размером до 33К. Однако программа плохо поддается русификации и в Союзе не популярна. Наиболее часто используются разнообразные версии (от 06 до 09) программы Masterfile фирмы Campbell Systems. Версия 09 послужила осно- вой для различных национальных модификаций, в том числе и русскоязыч- ной. По сравнению с VU-File она обладает гораздо более широкими возмож- ностями, но сложнее в обращении. Значительным недостатком ее является то, что распечатать данные на принтере можно только в режиме копирования экрана. Описание Masterfile включено в эту книгу. Вас могут заинтересовать и более специализированные базы данных: электронная записная книжка Address Manager, программа для ведения дневниковых записей Diary System, электронный двуязычный словарь Dispel (его русифицированная версия называется Dictionar). Для ведения простых (в пределах четырех арифметических действий) расчетов, например, бухгалтерских, очень удобны программы типа Spreadsheet — электронные таблицы. Первая (и, надо сказать, неплохая) электронная таблица для Speccy создана фирмой Psion в 1982 г. Она называется VU-Calc и позволяет выполнять действия над числами, сведен- ными в таблицу размером до 60x60 (например, поделить все числа одного столбца на числа другого и занести результат в третий). Вторая известная электронная таблица — Omnicalc — по своим параметрам весьма похожа на VU-calc, но обладает большей свободной памятью. От программ, работающих с буквами и цифрами, перейдем в другую область — расскажем о графических редакторах. Разнообразие их довольно велико, причем постоянно появляются все более совершенные разработки. 11
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Мы не будет подробно описывать все возможности графических редакторов, тем более, что в этой книге Вы найдете детальное описание одного из них. Упомянем только, что различают три основных режима работы графических* редакторов: создание и редактирование на экране компьютера картинок, спрайтов и наборов символов. Наличие всех трех режимов не обязательно, но возможность редактирования всей картинки — отличительный признак графического редактора как такового. Итак, какие графические пакеты для Speccy Вы можете найти? Как уже повелось в этом обзоре, подойдем к вопросу исторически. Первый графиче- ский редактор, появившийся на рынке в 1983 г., и по своему качеству до сих пор не последний — это Melbourne Draw фирмы Melbourne House. Настоящей сенсацией для того времени была реализация в этой программе режима редактирования фрагментов рисунка с 4- и 16-кратным увеличением. В том же 1983 г. программист Джо Гиллеспи из фирмы Print'n'Plotter Products написал довольно-таки среднюю по нынешним временам програм- му Paintbox в комплекте с демонстрационной частью. Он же на следующий год произвел на свет пакет Screen Machine, а затем — пакет Paintplus, после чего, слава Богу, навсегда исчез со спектрумовского горизонта. Его програм- мы, учитывая их явные недостатки и даже ошибки, вряд ли можно рекомен- довать к использованию на фоне того изобилия графических редакторов, которое появилось позже. Это, во-первых, пакет Dynamic Graphics, ориенти- рованный, главным образом, на редактирование спрайтов с возможностью мультипликации. Далее, Icon Graphix — первый редактор, управляемый джойстиком — выбор функций в нем осуществляется наведением курсора на символизирующие их пиктограммы. Применение в редакторе Leonardo (1985 г., совместный продукт фирм Creative Sparks и Thorn EMI Video) традиционного способа управления (с помощью клавиш) при большом количестве функций привело к необходимости задействовать практически всю клавиатуру, что сильно усложняет работу с программой. Учитывая это, в достаточно мощном шведском редакторе The Artist (фирма Xcelent Software), также управляемом многочисленными клавишами, работа облег- чена наличием на экране подсказки. Но наибольшей популярностью сразу же после своего появления в 1985 г. стал пользоваться графический редактор Art Studio (фирма ОСР Software) и, в первую очередь, благодаря новому для редакторов того времени принципу управления. Многочисленные функции, режимы и подрежимы Art Studio выбираются в обширной системе меню с помощью курсора, управляемого несколькими клавишами или джойстиком. Подробное описа- ние этой программы смотрите в этой книге. Этот способ управления применен также и во второй версии редак- тора Artist — Artist II, которая, благодаря расширению возможностей, ус- пешно конкурирует с Art Studio. Тем более, что разработчики Artist II реа- лизовали в нем несколько уникальных функций, отсутствующих в Других графических редакторах для ZX Spectrum. Например, имеется возможность вставлять в картинку произвольный фрагмент другого экранного файла, а также редактировать изображение «под лупой» с одновременным просмот- ром его в реальном масштабе. Вам также могут пригодиться программы, позволяющие манипулиро- вать трехмерными графическими объектами. В этой немногочисленной группе наиболее известна программа VU-3D, выпущенная фирмой Psion в 1982 г. По заданным проекциям трехмерного объекта она позволяет строить и трансформировать на экране его изображение (например, вращать, при- ближать и удалять центр проекции и др.). К сожалению, программа работает только с отрезками прямых — криволинейные контуры приходится описы- вать ломанными линиями. Этого недостатка лишена программа CAD+3D Plot, представляющая некое подобие профессиональной системы CAD/САМ, раз- 12
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ работанной для «больших» машин. CAD+3D Plot ориентирована, главным образом, на построение ортогональных проекций объекта, то есть, по суще- ству, дает возможность получать его чертеж. Результаты работы другой группы прикладных программ увидеть нельзя — их можно услышать. В основном это музыкальные редакторы. С их помощью можно заставить ZX Spectrum исполнять достаточно сложные, в том числе и многоголосые, мелодии. Простейшие музыкальные программы, например, Menzer Synthetizer, делают из Speccy что-то вроде детской орга- нолы, в роли клавиатуры которой выступают клавиши компьютера. Про- граммы посложнее, скажем, Spectrum Musicmaker, позволяют не только исполнить мелодию, но и сохранить ее в памяти, отредактировать, после чего записать на магнитофон. Практический интерес представляет венгерская программа А.Е. Drums. Написанный на ней аккомпанемент ударной группы можно использовать совместно с обычными музыкальными инструментами и вокалом. Пожалуй, наиболее серьезный музыкальный редактор для ZX Spectrum — Wham The Music Box (Mark Soft, 1985 г.). С его возможно- стями Вы познакомитесь на страницах этой книги. Отметим только, что существует его версия для Spectrum 128, виртуозно использующая возмож- ности трехканального музыкального процессора этой машины. Рассчитаны на слуховое восприятие и программы из ряда Speak Easy. Они предназначены для записи в цифровом виде сигнала звуковой частоты (музыки, голоса), подаваемого в компьютер через магнитофонный вход. Эти программы различаются степенью дискретизации сигнала, пропорциональ- но которой улучшается качество воспроизведения и, соответственно, растет объем памяти, необходимый для записи. Обычно за 10—20 секунд не вполне внятного звучания «съедается» вся память компьютера, что делает програм- мы этого типа малопригодными для практического применения. Более чем занятна серия программ, благодаря которым Ваш Speccy начнет разговаривать человеческим языком. Компьютер будет произносить слова и выражения по буквам, набранным Вами на клавиатуре, причем эти речевые вставки можно использовать в других программах. Если для Вас «человеческим языком» является русский, то поболтать с Вами сможет программа Fongen (генератор фонем). Только не заставляйте ее коверкать русские слова, набирая их в соответствии с правилами грамматики. Пишите как слышите — «праграма», «кампйутер». Закончим обзор прикладного программного обеспечения сугубо при- кладными программами. Пакет Router занимается (хотя и с большой натугой) разводкой печатных плат. Несколько программ — анализаторов акустического спектра позволяют получать диаграммы распределения звукового сигнала по частотам. Например, Taper и Таре Diagnostics ориентированы на анализ спектра сигналов с частотой до 4 кГц. Есть и более совершенная программа — Lightshow, выпущенная в 1984 г. югославским программистом Жигой Турком. Она позволяет анализировать частоты до 16 кГц и, кроме того, для забавы, имеет цветомузыкальный режим, создающий на экране цветовые эффекты в такт музыке, подаваемой на магнитофонный вход компьютера. Для владельцев любительских радиостанций могут оказаться полезны- ми программы, облегчающие поддержание радиосвязи в телеграфном (морзе), телетайпном (RTTY) и телевизионном с медленной разверткой (SSTV) режимах. Таких программ совсем немного, и наиболее известна одна из них, разрабо- танная бельгийским радиолюбителем ON5KN. Эта программа воспроизводит на экране принимаемые радиосообщения и, наоборот, набранный на клави- атуре текст кодирует в морзянку или телетайпный код. 13
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Отдельный блок программного обеспечения для ZX Spectrum состав- ляют учебные программы. Их можно разделить на две группы: программы, обучающие компьютерной грамоте, и общеобразовательные. Из первой группы наиболее известны пакеты Horizons фирмы Psion, которые прилага- лись к Speccy 16K и 48К. Аналогичный пакет под названием ZX Spectnim+ обучает работе на одноименной с ним машине с расширенной относительно Speccy клавиатурой. Наиболее серьезный пакет для компьютерного ликбеза — это Machine Code Tutor (фирма New Generation Software). Он рассчитан на тех, кто хотел бы научиться программировать на ассемблере Z80. Западные общеобразовательные программы для ZX Spectrum если и интересны, то только для спецшкол с глубоким изучением английского. Правда, после появления Speccy в наших обычных школах эти программы начали переводиться на русский язык, хотя и не всегда удачно. Кроме того, уже и в Союзе написаны очень приличные учебные программы. Как пограничную между серьезными и игровыми программами мож- но рассматривать группу разнообразных тестов. Например, существует целая серия программ, вычисляющих биоритмы. Можно, конечно, упомя- нуть и очень интересный пакет Ask the Real You («Ваше истинное лицо»), но вряд ли кому придет в голову его русифицировать. Программа IQ Test вполне серьезна — она определяет коэффициент умственного развития (очень модное на Западе занятие). Нам бы тоже не вредно было определить, кто чего стоит, но русифицировать Ю Test практически невоз- можно — программа вся построена на синонимике английского языка. Наверняка многих заинтересуют астрологические программы. Их су- ществует по меньшей мере две: Astrologer («Астролог») и Stargazer Secrets («Секреты звездочета»), причем вторая, вероятно, списана с первой. Но для того, чтобы узнать, что пророчат Вам звезды на следующую неделю, кроме знания английского еще нужно довольно хорошо разбираться в астрологии. Ну и, наконец, когда Вы, наверное, уже порядком устали от специаль- ных и околоспециальных терминов, перейдем к обзору самой многочислен- ной группы программ для Speccy — к игрушкам. Но сделаем мы это достаточно кратко, ведь книга написана не для любителей развлечений (хотя для некоторых нет лучшего развлечения, чем программирование). Начнем с наименее популярного у нас жанра: так называемых игр-аван- тюр. Отличительный признак авантюры в том, что в ней ставится конечная цель, но путь ее достижения скрыт. Иногда игра бывает затруднена еще тем, что и о цели можно только догадываться. Правильный путь определяется методом проб и ошибок, и в авантюры можно упорно играть месяцами, изо дня в день продвигаясь все дальше и дальше, забредая в тупики, возвращаясь. Как правило, в таких играх предусматривается возможность сохранения про- межуточного результата на ленте, так как закончить игру «в один присест» практически невозможно. Авантюры бывают текстовые, графические и сме- шанные. В текстовые авантюры у нас почти не играют, так как общение с компьютером идет в них исключительно с помощью текста и в большинстве случаев — на английском языке. В смешанных авантюрах словесный поток иллюстрируется статичными картинками — игру это оживляет, но отнюдь не облегчает. Текстовые и смешанные авантюры можно порекомендовать изуча- ющим иностранный язык, как средство быстрого расширения словарного запаса. Классические примеры смешанных авантюр — Gremlins, The Hobbit, Sherlock. Типичная графическая авантюра — Hijack («Похищение»). Сюжет ее прост: пребывая на посту Президента США, Вы должны предпринять такие действия, которые приведут к освобождению заложников. Графические авантюры по оформлению и способу игры вплотную приближаются к наиболее распространенному типу компьютерных игр — аркадным. В основном это игры типа «беги и стреляй». Они требуют от 14
ОБЗОР ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ играющего быстроты и точности реакции. Главная их цель — набрать как можно больше очков, тогда как в авантюрах счет, как правило, не ведется, а мажен конечный результат. Аркадных игр существует великое множество, и нет смысла приводить примеры. Не менее увлекательны игры из класса имитаций. Наиболее распростра- нены самолетно-вертолетные (Tomahawk, Fighter Bomber) и автомобильно-мото- циклетные (Turbo Out Run, Super Hang-On) имитации. Однако встречаются и достаточно экзотические варианты, например, «паровоз» (Southern Belle) или «пост авиадиспетчера» (Heathrow Radar). Многие программы этого типа, по сути, являются псевдоимитациями и по своим качествам ближе к аркадным играм. Большой популярностью пользуется игры-единоборства (The Way of the Exploding Fist, Target: Renegade). Перед играющим стоит единственная задача — победить противника в рукопашной схватке, с оружием или без. В этих играх часто предусматривается возможность выбора «исполняющего обязанности» противника: им может быть либо компьютер, либо Ваш лучший друг, который только что захватил джойстик и, ухмыляясь, грозится Вас отдубасить. К единоборствам примыкают спортивные игры. Со Speccy можно сыграть в футбол (Match Day), теннис (Match Point) и биллиард (Pool), съехать с горы на санях (Bobsleight) и даже попинать мяч в космическом пространстве при полном отсутствии гравитации (Room Ten). Разумеется, можно поиграть и в более спокойные настольные игры, например, в шахматы. Шахматные программы для Speccy весьма разнообразны и изощрены, но, правда, не до такой степени, чтобы им уступил перворазрядник — сказывается недостаток памяти и быстродействия машины. Если Вы давненько не брали в руки шашки, то можеге сыграть в них, например, с Эйнштейном (Draughts Genius). Но не обольщайтесь, компьютерный двойник великого ученого играет довольно слабо. Азартным игрокам можно предложить перекинуться в покер на раздевание с самой Самантой Фокс (Samantha Fox Strip Poker)! Впрочем, если Вы проиграете и не разденетесь — она Вас простит. Есть и вполне серьезные карточные программы, например, обучающие бриджу (Bridge Master). Бывают и такие «настольные» игры, которых в жизни никогда не существовало, к примеру, трехмерные крестики-нолики (3D Strategy). Вообще, это очень интересное направление компьютерных игр — конструирование некой условной реальности. Мы не имеем в виду игры, изображающие, скажем, скачущего по Луне космонавта — с ними все понятно. Но когда требуется столкнуть с витающей в пространстве доски шарь! разной массы, стремящиеся скинуть тебя самого (Motos), или, как в Brainstorm, направить непрерывно движущийся шарик по оптимальной траектории, ус- танавливая подвижные перегородки — это как раз игры такого типа. Для полноты картины можно еще упомянуть довольно-таки немного- численные стратегические игры. Наиболее распространенный их сюжет: Вы, в качестве главнокомандующего, должны выиграть историческое или вы- мышленное сражение (Arnhem, Legions of Death). Другой распространенный вариант представляет игра Dictator (существует и русифицированная ее версия), которая ставит задачу: используя принцип кнута и пряника, как можно дольше удержаться у власти. Конец, впрочем, у всех диктаторов один. Говоря об играх, нелишне отметить, что многие из них не относятся к какому-нибудь одному из перечисленных жанров, а сочетают сразу не- сколько. Например, авантюра с аркадными элементами (Everyone's a Wally), стратегическая имитация (Advanced Tactical Fighter) или, скажем, стратеги- ческая аркадная авантюра в условной реальности (Sophistry). На этом позвольте завершить сей обзор, не охвативший и сотой доли всего разнообразия программного обеспечения, созданного программистами многих стран за почти десятилетнюю историю ZX Spectrum. 15
ART STUDIO ГРАФИЧЕСКИЙ РЕДАКТОР Art Studio — один их лучших на сегодняшний день графических редакторов для ZX Spectrum. Программа позволяет быстро и эффективно рисовать и редакти- ровать картинки, исправлять и создавать новые наборы символов. Огромным ее преимуществом по сравнению с другими графическими редакторами является удобный пользовательский интерфейс, основан- ный на системе окон, благодаря которому Art Studio управляется всего пятью клавишами или джойстиком. В программе предусмотрена возможность масштабирования, ко- пирования, удаления и изменения цвета объектов, ограниченных окна- ми произвольного размера; просматривания и редактирования картин- ки в различных масштабах. КАК ПОЛЬЗОВАТЬСЯ ПРОГРАММОЙ После загрузки Art Studio экран очистится, в его верхней части появится меню, а в центре — стрелка, которая и будет служить Вам штурвалом для управления программой. При выборе некоторых функ- ций стрелка будет превращаться в более понятные и удобные фигурки (крестик, кисточку и т. п.). Для начала попробуйте с помощью клавиатуры или джойстика подвигать стрелку в разные стороны. Клавиши Q, А, О и Р двигают стрелку соответственно вверх, вниз, влево и вправо. Комбинации кла- виш позволяют перемещать стрелку по диагонали. Функции редактора активизируются клавишей М или кнопкой «стрельба» джойстика. В разных версиях Art Studio управляющими могут быть другие клавиши или джойстики различных типов. Вся работа с Art Studio сводится к перемещению стрелки, а в результате может появиться картинка, которая превзойдет по качеству все заставки фирмы Dynamic Software вместе взятые (для этого, конечно, надо обладать некоторым талантом и терпением). Вы, вероятно, уже освоили управление стрелкой и хотите немед- ленно воспроизвести на экране одно из произведений французских импрессионистов. Гарантировать появление полотна Моне на Вашем мониторе мы не беремся, но «Черный квадрат» Малевича Вы в чем-то повторить сможете. Для этого наведите стрелку на надпись Shapes (при этом ее цвет изменится) и нажмите стрельбу (мы будем употреблять это 16
ART STUDIO Рис. 1. «Черный прямоугольник». словосочетание вместо выражения «нажмите клавишу активизации выбранной функции», так как его утомительно не только писать, но и читать). На экране появится довольно обширное меню, суть всех функ- ций которого мы объясним позже. А сейчас прицельтесь и «выстрелите» по слову Rectangles этого меню — меню исчезнет и вместо стрелки появится квадратик. Подведите его поближе к верхнему левому углу экрана (не затрагивайте только область основного меню) и на- жмите стрельбу, затем — к ниж- нему правому и снова «выстрели- те». В результате всех Ваших уси- лий на экране появится прямо- угольник. Теперь попробуйте его закрасить. Для этого выберите функцию Fill, а в меню, которое предстанет перед Вашим взором — функцию Solid fill. Появив- шийся на экране инструмент ма- ляра поместите внутрь прямо- угольника и нажмите стрельбу. Довольно быстро прямоугольник закрасится, и Вы увидите нечто такое, что, будь Вы известным абстракционистом, получило бы название «Черный прямоугольник» (рис. 1). Не исключено, что к Вашему произведению будут проявлять не меньший интерес, чем к «Черному квадрату». Итак, доступ ко всем функциям программы осуществляется через главное меню. При выборе функции в большинстве случаев открывается окно, в котором предлагается меню режимов работы. При выборе режима может открыться еще одно окно и т. д. Из общего правила выпадает только функция Undo (откат), исполняющаяся немедленно. Она отменяет последнюю выполненную операцию, помогая исправить допущенные ошибки. В правой части главного меню находятся две стрелки, о которых необходимо сказать отдельно. Главное меню Art Studio занимает 3 верхние из 24 строк экрана ZX Spectrum, и на первый взгляд может показаться, что эти 3 строки невозможно использовать. На самом же деле Вы имеете доступ ко всем 24 строкам — во время работы програм- мы в окно, предназначенное для редактирования, выводится только часть экрана, а «невидимые» строки находятся в памяти и могут вызы- ваться по Вашему требованию. Для этого и служат загадочные стрелки. С их помощью можно передвигать экран вверх или вниз, выводя «на чистую воду» либо верхние, либо нижние строки. Датчик левее стрелок указывает положение видимой части экрана. МЕНЮ И ФУНКЦИИ Открывать меню и выбирать в нем функции Вы уже научились. Если, по ошибке, Вы открыли не то меню, которое нужно, его можно закрыть, отведя стрелку в область, не занятую самим меню, и нажав стрельбу. Если Вы навели стрелку на желаемую функцию, но ее цвет не изменился, это означает, что выполнение данной функции запрещено (не установлены необходимые параметры и т. п.). 2-1102 17
FILE ART STUDIO При выборе в меню одного из нескольких режимов работы напротив выбранного режима ставится галочка. Если режим имеет два состояния — выбор/отмена, выбор отмечается галочкой, а отмена — крестиком. FILE Запись, чтение, проверка файла Пожалуй, это самое важное меню — без него работа с програм- мой не имела бы смысла. Благодаря функциям этого меню можно записать картинку на магнитную ленту или диск, загрузить и подправить заставку от игровой программы и пр. Запись картинки происходит в обычном формате, поэтому файлы, созданные в Art Studio, Вы можете загружать из Бейсика привычным способом — оператором LOAD ""SCREENS ИЛИ LOAD ""CODE 16384. Меню File выглядит по-разному для кассетной и дисковой версий Art Studio. Если какая-либо функция имеется только в одной из версий, это будет специально оговорено. Все операции с магнитофоном можно прервать нажатием клави- ши Break (Caps Shift/Space). Ввод пустой строки вместо имени файла приведет к отмене выбранной операции. Save file Запись экранного файла* После выбора функции на запрос Filename? (Имя файла?) введите имя, под которым будет записан файл. Для дисковой версии: Если файл с заданным именем уже существует на диске, на экран будет выведен запрос: Overwrite (Y/N)? (переписать (Да/Нет)?). Если Вы ответите «Да» (клавиша Y), то файл из памяти запишется на место существующего, в противном случае операция будет отменена. Load file Загрузка экранного файла. Введите имя загружаемого файла. Для кассетной версии: Заголовки файлов считываются до тех пор, пока не будет найден файл с введенным именем. Для дисковой версии: Если файл существует на диске, то он будет загружен, в противном случае на экране появится сообщение File not found (файл не найден) и операция отменится. Load file Загрузка первого встреченного на ленте экранного файла. (Только для кассетной версии.) Load current Загрузка экранного файла с последним введенным именем. [Только для дисковой версии.) Verify file... Verify file Проверка экранного файла, записанного на ленту. Выполняется аналогич- но Load file. {Только для кассетной версии.) 18
ART STUDIO PRINT Merge file... Merge file Merge current Наложение экранного файла с кассеты/диска на картинку. Выполняется аналогично Load file. Catalogue Просмотр каталога диска. Эту функцию рекомендуется выполнять также при смене дискеты в дисководе во избежание ошибок при чтении/записи. (Только для дисковой версии.) Erase file Удаление файла с диска. На подсказку введите имя удаляемого файла. (Только для дисковой версии.) PRINT Работа с принтером Art Studio предоставляет широкие возможности по распечатке изображений на принтере в вертикальном или горизонтальном формате в различных масштабах. 1 х 1 ... 5 х 5 dump! Печать экрана в различных масштабах. Если ширина каретки Вашего принтера не позволяет распечатать изображение в крупных масштабах, эти масштабы выбираться не будут. Grey scale dump Полутоновая печать. Цвета на бумаге выделяются различной плотностью точек (через одну, через две и т. д.), благодаря чему достигается подобие цветной картинки. Полутоновая печать производится в масштабе 3:1, поэтому для некоторых принтеров режим выбираться не будет; в этом случае попы- тайтесь распечатать картинку в вертикальном положении (см. Sideways). Single density Double density Выбор одинарной (single) или двойной (double) плотности печати. В режи- ме двойной плотности картинка сжимается по горизонтали в два раза. Sideways Выбор/отмена вертикального расположения картинки при печати. Позво- ляет использовать более крупный масштаб, что полезно при работе с узким принтером. Left justify Centre Right justify Выбор положения картинки на листе бумаги. Картинку можно распечатать посередине листа (Centre), либо прижатой к левой (Left justify) или к правой (Right Justify) стороне. 19
ATTRIBUTES ART STUDIO Line feed Выбор/отмена автоматического перевода строки при получении кода воз- врата каретки. Как правило, необходимость выбора (отмены) этой функ- ции определяется положением DIP-переключателей на принтере. ZX/Alphacom Вывод картинки на принтер типа ZX Printer или Alphacom. Принтеры данного типа не позволяют печатать картинки стандартным способом, поэтому для вывода на них используется специальная подпрограмма. Если Вы работаете с одним из этих принтеров, то функции 1x1 ... 5X5 dump выбираться не будут. ATTRIBUTES Выбор цветовой палитры Art Studio позволяет полностью использовать цветовые возможно- сти Вашего Speccy. Правда, для того, чтобы нарисовать картинку, играю- щую всеми цветами радуги, Вам придется довольно сильно попотеть. Дело в том, что в ZX Spectrum нельзя произвольно задавать цвета соседних точек — атрибуты (цвет тона, цвет фона, яркость и мерцание) в нем определяются одновременно для 6 4 точек (знакоместа 8x8). И, следовательно, знакоместо может быть раскрашено лишь в два цвета (цвет тона и цвет фона), а повышенная яркость и эффект мерцания установлены только для всех его точек одновременно. Поэтому, перед воплощением своей художественной идеи на экране Speccy, тщательно спланируйте рисунок. Set ink Выбор цвета тона. Для выбора одного из восьми цветов появившейся на экране палитры наведите на него стрелку и нажмите стрельбу. Можно установить пассивный цвет (Transparent), который не будет влиять на раскраску экрана во время изображения объектов. Set paper Выбор цвета фона. Аналогично Set ink. Set border Выбор цвета бордюра. Выбирается один из восьми цветов. Bright Выбор градации яркости. Можно установить низкую (Bright off), высокую (Bright on) либо пассивную (Transparent) градацию яркости. Flash Выбор эффекта мерцания. Выполняется аналогично функции Bright. Over Выбор/отмена режима инвертирования. Если режим выбран, то при наложении одного объекта на другой точки в местах наложения инвер- тируются — ранее отмеченные точки удаляются, а на «чистой» поверх- ности изображение объектов происходит обычным образом. 20
ART STUDIO PAINT Inverse Выбор/отмена режима удаления. При выбранном режиме изображение объекта осуществляется не нанесением точек, а их удалением. Transparent Установка всех цветовых атрибутов пассивными. Удобно использовать при редактировании готовых картинок. Standard Установка стандартных цветов (белый бордюр, белый фон, черный тон). После загрузки программы стандартные цвета устанавливаются автоматически. PAINT Рисование кистью, пером, распылителем Выбрав одну из функций этого меню, Вы сможете с помощью клавиатуры или джойстика рисовать на экране — при нажатой стрельбе выбранный инструмент (кисть, перо) оставляет за собой след. Реп Рисование пером. Вам предлагается выбрать одно из нескольких перьев, после чего привычная стрелка будет заменена карандашом. Spray can Рисование распылителем. Выбирая эту функцию, Вы получаете «в руки» баллончик с краской, изображение которого заменит на экране стрелку. Установите плотность распыления (одну из тех, что появятся на экране) и раскрашивайте Вашу картинку. Brush Работа кисточкой. Выберите одну из появившихся на экране кисточек и рисуйте так же, как пером. Edit brush Редактирование формы кисти. Выберите кисть, форма которой Вас не устра- ивает. На экране появится ее изображение в восьмикратном увеличении. Наводя стрелку на нужные точки и нажимая стрельбу, можно создать кисть любой формы — она заменит ту, которую Вы вызывали на редактирование. Inverse Выбор/отмена режима удаления. Повторяет Inverse в меню Attributes. MISCELLANEOUS Разное View screen Просмотр экрана. На время просмотра исчезает главное меню и картинка выводится на все 24 строки экрана. Когда Вы в полной мере налюбуетесь своим произведением, нажмите стрельбу. 21
WINDOWS ART STUDIO Clear screen Полная очистка экрана. В случае ошибочного выполнения данной опера- ции можно, конечно, воспользоваться функцией Undo, но, тем не менее, будьте осторожны и старайтесь не промахиваться. Bright grid I Нанесение яркостной сетки 1. Знакоместа отделяются друг от друга переменой градации яркости. Удобно использовать при планировании и раскраске картинки. Bright grid 2 Нанесение яркостной сетки 2. В отличие от предыдущего режима выде- ляется не каждое знакоместо, а квадраты из четырех знакомест. Remove grid Удаление яркостной сетки. Учтите, что после нанесения и удаления яркостных сеток результаты Ваших стараний по раскраске картинки с использованием различных градаций яркости уйдут в небытие. Change colour Изменение цвета в заданном окне. Перед тем, как выбрать эту функцию, в режиме Set ink (меню Attributes) установите цвет, который требуется изменить, и в режиме Set Paper (меню Attributes) — цвет, на который необходимо изменить. Цвет будет изменен на другой независимо от того, был ли это цвет фона или цвет тона. Функция не выберется, если не было задано окно (см. Windows). I Version number | На экран выводятся номер версии Art Studio и имена авторов программы. WINDOWS Работа с окнами Самое обширное и мощное меню. В нем можно задавать окна произ- вольного размера и вытворять с ними такое, что и во сне не часто приснится. Define window Задание окна произвольного размера. Стрелку заменяет фигурка, напоми- нающая прицел. Окно задается двумя нажатиями стрельбы и выделяется на экране пунктирной линией. Первым нажатием определите базовую точку, второе произведите в тот момент, когда Вы ограничили нужную область. В процессе выбора окна можно передвигать видимую часть экрана с помощью стрелок, расположенных в правой части главного меню. Last window Вызов последнего заданного окна. Информация о последнем заданном окне хранится в памяти компьютера, и оно может быть снова вызвано на экран. Whole screen Определение окна размером во весь экран. 22
ART STUDIO ' WINDOWS Clear window Полная очистка окна. Если окно не задано, то эта и последующие функции меню Windows (кроме Merge и Multiple) вызываться не будут. После очистки фон окна будет иметь цвет, установленный функцией Set paper (меню Attributes). Cut 6 paste window Копирование окна. Вместо стрелки Вам «в руки» будет выдано окно. Установив его на нужное место, нажмите стрельбу, и содержимое исход- ного окна будет повторено на указанном месте. Cut clear & paste Перенос окна. Применяется аналогично предыдущей функции, но окно, которое служило источником, очищается. Invert window Инвертирование содержимого окна. Re-scale window Копирование окна с изменением масштаба. Определите второе окно, после чего содержимое исходного будет повторено в нем независимо от разме- ров обоих. При выполнении данной функции возникают искажения, особенно когда изображение переносится в окно меньшего размера. Искажения отсутствуют при увеличении в 2, 4, 8 и т. д. раз. Clear & re-scale Перенос окна с изменением масштаба. Применяется аналогично предыду- щей функции, но окно, которое служило источником, очищается. [Flip horizontal Поворот окна вокруг горизонтальной оси симметрии. Flip vertical Поворот окна вокруг вертикальной оси симметрии. Rotate 1/4, 1/2, 3/4 Поворот окна по часовой стрелке на 90, 180 и 270 градусов. Повернуть можно только изображение, ограниченное квадратным окном. В случае прямоугольного окна будет повернута только та его часть, которая впи- сывается в квадрат. Merge Выбор/отмена режима наложения. Используется при операциях, связанных с перемещением окон (Cut & paste window, Clear & re-scale и т. п.). При вы- бранном режиме перемещаемое изображение накладывается на изображение, находящееся на экране. В противном случае старое изображение затирается. Multiple Выбор/отмена режима многократного повторения операций. Используется для многократного копирования или переноса одного и того же окна. Если данный режим установлен, то после выполнения какой-либо из указанных
FILL ART STUDIO функций программа автоматически выберет ее еще раз. Повторение копи- рования или переноса будет завершено после перехода к другой функции. FILL Закрашивание объектов Закрашивание областей, ограниченных замкнутой линией, весьма эффективно при построении изображений объектов, состоящих из многократно повторяющихся блоков (кирпичная стена, забор и пр.). Solid fill Полное закрашивание объекта. Поместите инструмент, на который будет заменена стрелка, внутрь закрашиваемого объекта, ограниченного про- извольной замкнутой линией, и нажмите стрельбу. Textured fill Заполнение объекта текстурой. Выберите один из нескольких представ- ленных на экране вариантов текстуры и заполните ею объект, действуя также, как и в предыдущем пункте. Wash texture Замена текстуры. Используется в том случае, когда после заполнения объекта текстурой Ваше отношение к ней резко изменилось, и появилось желание заменить ее на другую. Выберите функцию и укажите, какую текстуру Вы хотите видеть на месте предыдущей. Кроме замены можно также производить и наложение текстур одну на другую. Обратите внима- ние на то, что данная функция может выполняться только непосредственно после закраски объекта. Если позднее были произведены какие-либо опе- рации, функция может не работать. Edit texture Редактирование текстуры. Выбранная для редактирования текстура выводит- ся на экран в восьмикратном увеличении. Теперь спокойно и обстоятельно можно рисовать все, что придет в голову (хоть автопортрет). Новая текстура заменит ту, которая вызывалась на редактирование. MAGNIFY Редактирование в увеличенном масштабе Возможность просмотра и исправления мелких деталей изобра- жения в увеличенных масштабах — одна из самых замечательных особенностей Art Studio. Magnify х2, Х4, х8 Редактирование деталей изображения с увеличением в 2, 4 и 8 раз. После выбора одной из трех функций стрелка заменяется увеличительным стеклом. Подведите его к той части картинки, которую хотите редактиро- вать, и нажмите стрельбу — главное меню исчезнет, и на экране появится фрагмент картинки с заданным увеличением (рис. 2). Слева и сверху окна находятся датчики его положения по отношению к полному экрану, по краям этих датчиков — изображения стрелок, позволяющие передви- 24
ART STUDIO TEXT гать окно по экрану. Пиктограмма с двумя прямоугольниками дает возможность переместить окно в верхний левый угол экрана. Вверху экрана появляется новое меню: х2г Х4Г х8 Изменение масштаба изображения. Выбранный масштаб выделяется ин- версным цветом. Attributes | Установка цветовой палитры. Работа в этом режиме аналогична работе в разделе Attributes главного меню. Menu Возврат в главное меню. Режимы редактирования изображения. В этих режимах можно наносить (Set), удалять (Reset) и инвертировать (Toggle) точки. Выбранный режим выделяется инверсным цветом. Редактирование происходит обычным способом: наводите крестик на нужную точку и нажимайте стрельбу — точка изменяется в соответствии с выбранным ре- жимом. Когда Вы исправляете детали уже нарисованной картинки и не хотите, чтобы Ваши действия влияли на раскраску экрана, удобно использовать функцию Transparent (меню Attributes). Отметим, что после редактиро- вания в увеличенных масшта- бах функция Undo главного ме- ню не восстанавливает картин- ку, которая была до введения исправлений, поэтому старай- тесь избегать ошибок. Рис. 2. Редактирование в увеличенном масштабе. Grid Выбор/отмена сетки. Сетка используется для отделения точек друг от друга при восьмикратном увеличении фрагмента картинки. TEXT Работа с текстами Программа Art Studio позволяет выводить на экран текст в разных масштабах, вертикально или горизонтально расположенный, нормаль- ный или утолщенный. Можно использовать произвольные наборы сим- волов, которые подгружаются с магнитного носителя или создаются непосредственно в Art Studio. 25
TEXT ART STUDIO Left to right Печать текста слева направо. После выбора функции стрелка заменяется курсором, размер которого зависит от установленных ширины и высоты букв. Поместите курсор на начальную позицию для печати, нажмите стрельбу и набирайте текст (мы Вас немного обманули в начале описания, сказав, что для управления программой достаточно джойстика — для ввода текста все- таки придется прибегнуть к помощи клавиатуры). При вводе текста текущее положение курсора отмечается знаком подчеркивания, размер которого за- висит от ширины букв. Для редактирования текста используйте курсорные клавиши и клавишу Delete. Ввод текста завершается клавишей Enter, после чего можно помещать курсор на новое место печати. Downwards Печать текста сверху вниз. Аналогично предыдущему режиму. Normal height Double height Treble height Установка высоты букв. Можно выбрать нормальную (Normal), удвоенную (Double) и утроенную (Treble) высоту. Normal width Double width Treble width Установка ширины букв. Можно выбрать нормальную, удвоенную или утроенную ширину. Sideways Выбор/отмена печати букв, повернутых на 90 градусов. Используется, в основном, при вертикальной печати. Bold Печать утолщенным шрифтом. С помощью этой функции даже привыч- ный и надоевший «синклеровский» шрифт становится более привлека- тельным. Не рекомендуется выбирать этот режим при использовании шрифтов, символы в которых занимают все восемь точек по ширине. Caps lock Фиксация верхнего регистра. При выбранном режиме текст печатается заглазными буквами, для вызова строчных букв можно использовать клавишу Caps Shift. Клавиша Caps Lock в программе не задействована. Snap horizontal Выбор/отмена установки курсора на ближайшее знакоместо по горизон- тали. Art Studio позволяет располагать символ в произвольном месте экрана без привязки к знакоместу. Если Вы не хотите упражняться в ловкости при необходимости поместить символ точно в знакоместо, используйте эту и следующую функции. Snap vertical Выбор/отмена установки курсора на ближайшее знакоместо по вертикали. 26
ART STUDIO SHAPES Font editor Редактирование набора символов. Это не просто функция, а самостоятель- ная программа, которая сама по себе требует отдельного описания, поэтому ей будет посвящен специальный раздел. SHAPES Построение геометрических фигур Это меню позволяет без особых трудностей изображать различ- ные геометрические фигуры. Points Нанесение точек. Стрелка заменяется прицелом и, нажимая стрельбу, Вы можете изрешетить хоть весь экран. Lines Проведение прямых линий. Первое нажатие стрельбы определяет базовую точку, по второму нажатию проводится прямая от базовой точки к текущей позиции курсора. Continious lines Проведение ломаных линий. Первое нажатие стрельбы определяет базо- вую точку, второе и последующие — точки излома линии. Rectangles Построение прямоугольников. Первое нажатие стрельбы определяет ба- зовую точку, по второму — строится прямоугольник, диагональ которого задана базовой точкой и текущим положением курсора. Triangles Построение треугольников. После определения нажатием стрельбы трех точек они соединяются между собой. Circles Построение окружностей. Первое нажатие стрельбы определяет центр окружности, второе — ее радиус. Rays Построение отрезков с общим началом (лучей). Первое нажатие стрельбы определяет базовую точку, по последующим нажатиям строятся отрезки. Elastic Режим подсказки. При выбранном режиме фигуры, которые Вы рисуете, отображаются на экране пунктирной линией от базовой точки к текуще- му положению курсора еще в процессе выбора размеров и местоположе- ния фигуры. Изображение фиксируется нажатием стрельбы. 27
FONT EDITOR ART STUDIO Snap horizontal | Привязка точки к знакоместу по горизонтали. При выбранном режиме горизонтальная координата определяемой точки привязывается к бли- жайшей стороне знакоместа. Snap vertical Привязка точки к знакоместу по вертикали. FONT EDITOR ! "Я « X * ' С ) # +^- . /01234567 69: ; < = >?(1ЯВ С£,Е FOHIJKLMNO POR5TUVUXY2 C\ 3 t_£lbCdt fg h i JKlMnopqrStUVWXUZ-CI >"© Рис. З. Редактирование набора символов. Редактор наборов символов Font Editor (меню Text) по- зволяет создавать и редактировать наборы символов, которые можно использовать не только в Art Studio, но и в других программах. После перехода в редактор символов привычный глазу эк- ран пропадает и появляется но- вый (рис. 3). В нижней его части размещен полный набор симво- лов. Символ, отмеченный указа- телем, и два соседних с ним ото- бражаются в центре экрана в восьмикратном увеличении. Их можно изменять — наводите стрелку на точку, которую Вы хотите удалить или нанести, и нажимайте стрельбу. Выбрать символ для редактирования можно двумя способами: указывая стрелкой на один из символов полного набора или переходя к соседним символам с помощью стрелок, изображенных в левой и правой частях меню. Дополнительные возможности предоставляет меню в верхней части экрана, с помощью которого можно работать с кассетой или диском и производить различные действия над символами. FILE Запись, чтение, проверка файлов С помощью этого меню можно записывать на магнитный носи- тель отредактированные или созданные Вами наборы символов и загру- жать готовые. Длина файла с набором символов — 768 байт, и если Вы попытаетесь подсунуть для загрузки какую-нибудь бяку, то будете обруганы сообщением Too big (файл слишком большой). Использование функций меню File аналогично использованию одноименного меню из основного режима. Отличие состоит лишь в том, что в редакторе символов подгрузка файлов к существующему набору (Merge) не имеет смысла и поэтому в меню отсутствует. 28
ART STUDIO FONT EDITOR CHARACTER Операции над отдельным символом Меню служит для выполнения некоторых часто встречающихся операций над символом, отмеченным указателем. Clear Очистка символьного поля. Будьте осторожны с этой и всеми другими функциями редактора символов — сделав неверный шаг, Вы не всегда сможете исправить ошибку. Invert Инверсия символа. Flip horizontal Поворот символа вокруг горизонтальной оси. Flip vertical Поворот символа вокруг вертикальной оси. Rotate 1/4 Поворот символа на 90 градусов по часовой стрелке. Scroll right Сдвиг символа вправо на одну точку. Scroll down Сдвиг символа вниз на одну точку. FONT Операции над набором символов Это меню аналогично предыдущему, разница лишь в том, что действие его функций распространяется сразу на весь набор символов. MISCELLANEOUS Разное Capture font Копирование символов с экрана. Весьма удобная и приятная функция. Она позволяет «вытаскивать» изображения символов из загруженной в Art Studio картинки. Для этого в главном меню необходимо определить окно (функция Define window меню Windows), из которого графические изображения будут копироваться в область набора символов. Копирова- ние происходит следующим образом. Из левого верхнего угла окна выбирается квадрат 8x8 точек и помещается на место символа, отмечен- 29
FONT EDITOR ART STUDIO ного указателем. Следующий блок копируется в символ, находящийся после отмеченного, и т. д. до исчерпания окна либо набора символов. Copy ROM Загрузка из ПЗУ стандартного набора символов. Menu Возврат в главное меню.
WHAM МУЗЫКАЛЬНЫЙ РЕДАКТОР Wham The Music Box («музыкальная шкатулка») — пожалуй, самый богатый по возможностям музыкальный редактор для ZX Spectrum. Благодаря Wham'у клавиатура Вашего Speccy превратится в па- нель синтезатора, экран монитора — в нотный лист, а Вы сможете попробовать себя в роли композитора: записать мелодию на два голоса, используя ноты в пределах четырех октав, обогатить ее звучание удар- ником и шумовыми эффектами. Созданный музыкальный фрагмент можно сохранить на кассете или дискете и, при необходимости, загрузить его снова и внести изменения. Большим достоинством редактора является то, что мелодии, на- писанные с его помощью, можно использовать для музыкального офор- мления других программ. Конечно, не стоит ожидать, что программа превратит Ваш Spectrum в синтезатор фирмы Yamaha. Однако Wham докажет Вам, что с его помощью можно создать маленький музыкальный шедевр. После загрузки с ленты или дискеты Wham демонстрирует свои возможности, исполняя приятную мелодию, а на экране появляется главное .меню MAIN MENU. Для выбора режима нажмите соответствующую цифровую клавишу: 1. LOAD TUNE загрузка мелодии 2. SAVE TUNE сохранение, запись мелодии 3. HEAR TUNE прослушивание мелодии 4. WHAMPILER компиляция 5. SET TEMPO изменение темпа 6. EDIT MODE режим редактирования 7. HELP PAGE подсказка LOAD TUNE Загрузка мелодии Этот режим позволяет загрузить файл, содержащий мелодию (будем называть его редактируемым файлом), в буфер для дальнейшей работы с 31
SAVE TUNE WHAM ним. После перехода в режим (клавиша 1) программа спросит, с какого устройства Вы хотите загружать файл: SELECT PEREPHERIAL DEVICE ТАРЕ MEMORY DISK Выбор устройства осуществляется нажатием одной из клавиш: Т — кассета, М — оперативная память, D — дискета. При загрузке с кассеты или дискеты на запрос FILENAME? введите имя файла, в котором хранится мелодия. В случае дисковой версии Wham'a компьютер задаст дополнительный вопрос: PRINT CATALOGUE 'A:' (Y/N)? — распечатать каталог диска "А" (Да/Нет)? Если же Вы обратитесь к оперативной памяти (клавиша М), то на экране появится список мелодий, первые пять из которых созданы авторами программы, шестая позиция свободна и предназначена для новых произве- дений (см. SAVE TUNE). Для загрузки в буфер любой мелодии из этого списка нажмите соответствующую цифровую клавишу. Выход из режима LOAD TUNE осуществляется автоматически по окон- чании загрузки. SAVE TUNE Сохранение мелодии Благодаря функции сохранения мелодии в виде редактируемого фай- ла Ваш труд не пропадет даром, то есть созданный музыкальный фрагмент можно будет загрузить в Wham для прослушивания и изменения. Войти в режим SAVE TUNE можно из главного меню, нажав клавишу 2, после чего появится уже знакомый вопрос об устройстве, на которое Вы желаете записать свою музыкальную мысль: SELECT PEREPHERIAL DEVICE ТАРЕ MEMORY DISK После выбора устройства клавишами Т (кассета), М (память) или D (дискета) на подсказку FILENAME? введите имя файла, в котором будет сохранена мелодия. Редактируемый файл можно записать на место любой из мелодий в представленном на экране списке (клавиша М), но в памяти компьютера она будет храниться только до выключения питания. Выход из режима SAVE TUNE осуществляется автоматически по окон- чании записи. EDIT MODE Режим редактирования Режим редактирования — это основной инструмент, с помощью которого Вы сможете реализовать свои музыкальные идеи. Войти в режим можно из главного меню, нажав клавишу 6. При этом на экране появятся изображения клавиатуры фортепьяно и двух нотных станов (десять нотных линеек), а также указатель октавы OCTAVE, указатель редактируемого голоса (рабочего канала) CHANNEL 1(2) и счетчик шагов по каждому из каналов COUNTERS (CHN1, CHN2) (рис. 4). Для выбора функций используются два верхних ряда клавиш ком- пьютера. Ввод и изменение мелодии осуществляется клавишами двух ниж- 32
WHAM EDIT MODE J □DE CDUD в m m m~l Ш Ш • • » J If J "j H • J J J : -EDIT- DCTftUEd CH/MIDELH ТЕРЯ ; СНП1 □□ ПЧ: СНПН ООПЧ Ш1ШИМИМ111 них рядов: первый ряд снизу соответствует белым клавишам клавиатуры фортепиано, второй — черным (см. рис. 6). Итак, Вы хотите «набросать» какую-нибудь мелодию. Нажимая клавишу Т, выберите голос, с кото- рым собираетесь работать, клави- шами 1...4 — октаву, и попробуйте «наиграть» мелодию на «звуко- вых» клавишах. При этом на нот- ном стане появятся изображения нот, а цветные квадратики укажут соответствующие клавиши на кла- виатуре фортепиано (для первого голоса квадратик красный, для вто- рого — фиолетовый). Если Вы ошибочно нажали не ту клавишу, не расстраивайтесь, все поправи- мо: нажав клавишу 0, Вы откати- тесь на один шаг (одну ноту) назад. Если же нужно вернуться больше, Рис. 4. Режим редактирования, чем на шаг, нажмите 9. Проигрывание одной ноты с продвижением на один шаг вперед осуществляется клавишей Р. Мелодия будет проигрываться непрерывно при удержании клавиши О (прокрутка вперед). Вам наверняка захочется прослушать музыкальный фрагмент цели- ком, не выходя из режима редактирования. Нажмите R (возврат в начало мелодии), затем Q (проигрывание мелодии),— и зазвучит Ваше творение. Остановить прослушивание можно нажатием любой клавиши. Для написания второго голоса переключите клавишей Т канал и с помощью клавиш R, О, Р, 0, 9 перейдите к тому шагу, с которого Вы собираетесь его использовать. К сожалению, Wham не дает возможности записать мелодию нотами разной длительности. Необходимая длительность тона достигается либо ис- пользованием паузы (клавиша Enter), либо записью нужного количества одинаковых нот. Ваш музыкальный фрагмент зазвучит совсем по другому, если Вы используете для его аранжировки барабан (клавиша Е) и шумовые эффекты (клавиши Y, U, I). Барабан настроен на определенный тон, который нельзя изменить, а шумовые эффекты редактируются с помощью соответствующего режима, в который можно попасть из EDIT MODE, нажав клавишу 8. После этого на экране появится меню функций выбора частоты (WAVEFORM) и длительности (DURATION) шумовых эффектов (рис. 5). Выбрать один из предо- ставляемых программой 16 вариан- тов длительности и 8 вариантов ча- стоты (формы колебаний) шумовых эффектов можно с помощью следу- ющих клавиш: 5, 8 - выбор редактируемого шумового эффекта; 6 - переход к функции выбора частоты; 7 - переход к функции выбора длительности; 1ИНЯИЧДД Е в II Е .-EDkT- ПТЕРЯ :СНГН Я II III □ CTfWEJ □ОПЧ: !! ш СНПППЕк_а сипа аслпч !!! О - редактирование эффекта. Рис. 5. Режим выбора шумовых эффектов. 3-1102 33
1 Q ПРОИГ- РЫШ МЕЛОДИИ '4 1 ДО # ! CAPS SHIFT ДО 2 ВЫБОР 0 W МЕТКА ЦИКЛА i s ;«# z РЕ 3 МТАВЫ Е БАРАБАН D X МИ 4 R В НАЧАЛО МЕЛОДИИ F ФА# С ФА 5 БОРДЮР т КАНАЛ 0 соль# V соль 6 ГЛАВНОЕ МЕНЮ Y ШУМ< ; н ;»• в ЛЯ 7 УДАЛИТЬ МЕЛО- ДИЮ и ОВЫЕЭФФЕ J N СИ 1 : ТЕКУЩАЯ ОКТАВА L 8 ВЫБОР ЭФФЕКТА 1 кты м до 9 ПРОКРУТ- КА НАЗАД О ПРОКРУТ- КА ВПЕРЕД SYMBOL SHIFT РЕ 0 ШАГ НАЗАД Р ШАГ ВПЕРЕД ENTER ПАУЗА SPACE МИ СЛЕДУЮЩАЯ ОКТАВА ' Рис. 6. Функции клавиш в режиме редактирования мелодии.
WHAM HELP PAGE Получающиеся в процессе редактирования шумовые эффекты можно не только прослушивать (клавиша 9), но и наблюдать на картинке изменения их частоты и длительности. После настройки эффектов можно выйти обратно в режим редакти- рования мелодии (клавиша Enter) и использовать их в работе с помощью клавиш Y, U и I. Наличие барабана и шумовых эффектов в мелодии отражается на нотном стане в виде пробела. Учтите, что одновременно с барабаном и шумовыми эффектами не может звучать нота. Если Вы хотите, чтобы мелодия повторялась с какого-либо шага, то есть звучала непрерывно, клавишей W установите на выбранном шаге метку цикла. При этом компьютер запросит: SET LOOP HERE? (Y/N) - установить метку здесь? (Да/Нет) Расположение меток в первом и втором каналах может и не совпадать. Но для того, чтобы при циклическом проигрывании мелодии не нарушалась синхронность звучания голосов, количества шагов по каждому каналу дол- жны быть кратны друг другу. Для нормальной компиляции мелодии (см. ниже) установка метки в обоих каналах обязательна. Если Вы хотите очистить память от неудачного произведения, нажмите клавишу 7 и подтвердите запрос: ERASE CURRENT TUNE? (Y/N) - удалить мелодию? (Да/Нет) В режиме редактирования с помощью клавиши 5 можно изменять цвет бордюра. Для выхода в главное меню нажмите клавишу 6. HELP PAGE Подсказка В режиме редактирования Вам понадобится использовать немалое количество клавиш и сразу запомнить их функциональное назначение не так просто. Поэтому в качестве помощи Вам предлагается страница подсказ- ки — HELP PAGE, которую можно вызвать из главного меню, нажав клави- шу 7. На экране высветится список клавиш, используемых при редактирова- нии, и их функциональное назначение (кроме клавиш, обозначающих ноты). 1...4 SELECT OCTAVE 5 CHANGE BORDER 6 MAIN MENU 7 ERASE TUNE 8 NOISE MIXING 9 REPEAT BACK STEP 0 SINGLE BACK STEP Q REPLAY TUNE E DRUM EFFECT T CHANGE CHANNEL YfU & I NOISE EFFECT О FAST FORWARD P PLAY NEXT NOTE выбор октавы изменение цвета бордюра выход в главное меню удаление музыкального фрагмента выбор шумового эффекта возврат на несколько шагов назад возврат на один шаг проигрывание мелодии эффект барабана выбор канала шумовые эффекты прокрутка вперед проигрывание одной ноты 35
HEAR TUNE WHAM HEAR TUNE Прослушивание мелодии При прослушивании мелодии в режиме EDIT MODE, она звучит в несколько искаженном виде, так как процессор, кроме воспроизведения музыки, занят еще и выводом на экран нот, обслуживанием клавиатуры и т. д. Чтобы получить представление об истинном звучании мелодии, то есть услышать, как она будет исполняться после компиляции (см. ниже), восполь- зуйтесь функцией HEAR TUNE (клавиша 3 главного меню). После прослушивания, нажав любую клавишу, Вы попадете в режим EDIT MODE. SET TEMPO Изменение темпа Если после прослушивания мелодии Вы захотите изменить темп ее исполнения, воспользуйтесь режимом SET TEMPO (клавиша 5 главного ме- ню). Клавишей 8 можно ускорить темп исполнения мелодии до PRESTISIMO (предельно скоро), что наглядно сопровождается увеличением закрашенной области в прямоугольнике, высвеченном на экране. Замедлить темп до LARGO (очень медленно) позволяет клавиша 5 — закрашенная область в прямоугольнике будет уменьшаться. WHAMPILER Компиляция Музыкальный фрагмент, сохраненный в виде редактируемого файла в режиме SAVE TUNE, можно загрузить снова (LOAD TUNE) и продолжить работу с ним. Однако такой способ представления мелодии позволяет про- слушивать ее, только находясь в редакторе. Если же Вы хотите музыкально оформить программу, написанную на Бейсике или ассемблере, необходимо записать мелодию в виде подпрограм- мы, работающей независимо от редактора. Такая подпрограмма создается с помощью специального режима компиляции WHAMPILER. В результате компиляции на ленту или дискету записывается файл, который мы назовем исполняемым. Он представляет собой программу в кодах, которая запускается отдельно от Wham'a, но, в отличие от редактируемого файла, не поддается дальнейшему изменению. Перед компиляцией с помощью функции LOAD TUNE загрузите редак- тируемый файл, в котором записан нужный музыкальный фрагмент. Про- верьте, в обоих ли каналах выставлены метки конца цикла. В качестве примера предлагаем откомпилировать одну из 5 мелодий, загружаемых из памяти (см. LOAD TUNE — MEMORY ), допустим, тему под номером 1 — FREEDOM. Загрузите ее и, нажав клавишу 4, войдите в режим компиляции. На запрос TUNENAME? введите имя, под которым Вы хотите сохранить исполняемый файл, например, FREE.MUS (расширение MUS можно использовать для указания на то, что файл исполняемый, а не редактируе- мый). Далее программа попросит ввести адрес, с которого будет располагать- ся и запускаться исполняемый файл: ASSEMBLY ADDRESS? 36
WHAM WHAMPILER Укажите десятичный адрес не менее 32768, например, 60000, после чего компилятор выведет на экран следующую информацию: FREE.MUS 60000 KEYPRESS - NONE - 313 количество шагов в 1-м канале START 313 количество шагов во 2-м канале START TUNE NAME ASSEMBLY ADDRESS RETURN OPTION WHITE NOISE CHANNEL 1 LENGTH CHANNEL 1 LOOP CHANNEL 2 LENGTH CHANNEL 2 LOOP 1. KEYPRESS 2. ALWAYS 3. TUNEEND RETURN OPTION 1,2 OR 3 Цифрами 1, 2 и З обозначены условия компиляции. В зависимости от выбранного условия получается определенная модификация исполняемо- го файла: KEYPRESS проигрывание мелодии завершается при нажатии любой кла- виши; ALWAYS проигрывание мелодии осуществляется одновременно с рабо- той программы (подробно этот режим описан ниже); TUNEEND проигрывание завершается по окончании мелодии или при нажатии любой клавиши. Запуск компиляции произойдет сразу после выбора клавишами 1, 2 или 3 одного из перечисленных условий. Нажмите, к примеру, клавишу 1. По окончании компиляции на экран будет выведена длина исполня- емого файла в байтах и сообщение о нормальном завершении операции: CODE LENGTH: 893 ROUTINE COMPILATION COMPLETED OK Затем после надписи ADJUSTMENT POKES: появится информация, необ- ходимая для настройки исполняемого файла уже в процессе использования его в Вашей программе (напомним, что в нашем примере ASSEMBLY ADDRESS =60000): REPLAY SPEED 60035, (230 TO 255) - этой надписью программа сообщает, что, записывая в ячейку памяти с адресом 60035 (ASSEMBLY ADDRESS + 35) число от 230 до 255, можно изменять темп проигрывания мелодии; BORDER COLOR: 60026, (0 ТО 7) - это сообщение говорит о том, что, записывая в ячейку с адресом 60026 (ASSEMBLY ADDRESS 4- 26) числа от 0 до 7, Вы можете на время исполнения мелодии устанавливать требуемый цвет бордюра (по умолчанию — фиоле- товый); ТО RUN - RANDOMIZE USR 60000 - эта надпись напоминает, что для запуска исполняемого файла из Бейсика необходимо использовать команду RANDOMIZE USR 60000 (ASSEMBLY ADDRESS). После вывода этих сообщений производится запись исполняемого файла. В случае магнитофонной версии Wham'a на экране появится стан- дартное сообщение START TAPE, THEN PRESS ANY KEY, после чего нужно иключить магнитофон на запись и нажать любую клавишу. 37
WHAMPILER WHAM Если же Вы пользуетесь дисковой версией редактора, то исполняемый файл без дополнительных вопросов» будет записан на дискету. При этом сообщейия об адресах ячеек, используемых для настройки подпрограммы, появятся на очень короткое время. Теперь можно очистить память компьютера от Wham'a и загрузить в него полученную после компиляции программу в кодах. Если исполняемый файл сохранен на ленте, то для его ввода и запуска напишите следующую программу на Бейсике: 10 LOAD "FREE.MUS"CODE 20 POKE 60026,7: REM цвет бордюра - белый 30 RANDOMIZE USR 60000 Запустите ее, и Вы услышите щемящие звуки «Гимна Свободе», которые будут звучать, пока Вы не нажмете какую-нибудь клавишу. Поэкс- периментируйте с темпом исполнения мелодии, занося с помощью оператора РОКЕ различные числа в пределах от 230 до 255 в ячейку 60035. Для дисковой версии первую строку программы нужно заменить на 10 RANDOMIZE USR 15619: REM : LOAD "FREE.MUS"CODE Мы продемонстрировали работу в режиме компиляции для мелодии из памяти редактора. Для компиляции мелодий собственного сочинения выполните аналогичные действия. Если Вы были невнимательны при работе в редакторе, то при входе в режим компиляции программа может выдать на экран следующие сообщения об ошибках: TUNE NAME ASSEMBLY ADDRESS RETURN OPTION WHITE NOISE CHANNEL 1 LENGTH количество шагов в первом CHANNEL 1 LOOP CHANNEL 2 LENGTH количество шагов во втором канале не определено CHANNEL 2 LOOP KEYPRESS - NONE - NOT PRESENT канале не определено START NOT PRESENT START Tune compilation abandoded Компиляция не проведена No end markers defined. He установлена метка цикла. Use the W key to place В режиме редактирования, marker for the end используя клавишу W, установить current channel. метку в каждом канале. Если машина обругала Вас, отнеситесь к этому спокойно. Нажав кла- вишу Enter, выйдите из режима компиляции, устраните замеченные недостат- ки и, будьте уверены, что со второй, в крайнем случае с третьей попытки мелодия будет откомпилирована, и Вы сможете украсить ею свою программу. Не исключено, что Вы захотите, чтобы Ваша программа работала параллельно с проигрыванием мелодии. Подобного эффекта можно добить- ся, если при компиляции использовать режим ALWAYS. В исполняемом файле, скомпилированном в этом режиме, имеются две точки входа. Первая служит для инициализации мелодии и проигрывания первой ноты и распо- ложена по тому же адресу, что и в других режимах (ASSEMBLY ADDRESS), a вторая — для проигрывания второй и всех последующих нот (расположена по адресу ASSEMBLY ADDRESS +12). Таким образом, если в приведенном выше примере компиляции использовать режим ALWAYS, то для инициализации мелодии и проигрыва- ния первой ноты нужно выполнить оператор RANDOMIZE USR 60000 38
WHAM WHAMPILER a для проигрывания каждой последующей ноты — оператор RANDOMIZE USR 60012 Например, приведенная ниже программа будет исполнять мелодию одновременно с выводом текста на экран: 5 LOAD "FREE.MUS"CODE tO LET a$=nDemonstr»fing mode ALWAYS" 20 RANDOMIZE USR 60000 30 CLS : PRINT AT 10,0 40 FOR n=1 TO LEN i$ 50 PRINT a$(n); 60 RANDOMIZE USR 60012 70 NEXT n 80 GO TO 30 Аналогичным образом Вы можете оформлять и программы в машин- ных кодах.
MASTERFILE ЭЛЕКТРОННАЯ КАРТОТЕКА Электронная картотека Masterfile является наиболее мощной среди программ обработки баз данных, существующих для Speccy. Хотя скромный (по сравнению с профессиональными машинами) объем ОЗУ ZX Spectrum и ограничивает возможность обработки боль- шого количества информации, но, если речь идет, например, о каталоге домашней библиотеки или фонотеки, списке телефонов друзей и подруг (как бы много у Вас их ни было) — в этих случаях программа Masterfile может оказаться незаменимой. Она освободит Вас от необходимости вручную заполнять, сортировать, искать и производить множество дру- гих операций с сотнями карточек. Введенные в базу данные в любой момент в заданном порядке и с нужной степенью полноты могут быть представлены на экране ком- пьютера (причем с различным количеством символов в строке: 32, 42 и 51). Информацию можно вывести и на принтер. Masterfile обеспечит Вам не только хранение, но и обработку инфор- мации. Например, занеся в базу числовую таблицу, Вы сможете вычислить сумму и среднее арифметическое значение по каждому из ее столбцов. Предусмотрена также возможность создания дополнительных процедур обработки данных, что позволит Вам самостоятельно расши- рять функции Masterfile. Мы будем описывать версию программы, русифицированную одним из авторов специально для этой книги. Подробные сведения о русификации Masterfile приведены в конце описания. СТРУКТУРА MASTERFILE Masterfile состоит из двух частей: кодового блока и блока, написанного на Бейсике. Кодовый блок содержит основную программу обработки базы данных. В бейсик-части размещены подпрограммы загрузки и сохранения базы данных, распечатки данных на принтере, а также подпрограмма, обеспечивающая запуск Masterfile. Перечисленные подпрограммы можно модифицировать или заменять другими (для этого они написаны на языке, доступном и начинающим программистам). Дополнительные процедуры обработки базы данных также пишутся на Бейсике. В бейсик-части программы имеются специальные переменные, по- средством которых осуществляется связь между двумя блоками Masterfile (подробнее см. описание меню User Basic). 40
MASTERFILE ЗАГРУЗКА И ЗАПУСК MASTERFILE Masterfile позволяет записывать информацию на магнитный носитель в двух видах: отдельным массивом (файлом базы данных) и совместно с бейсик-программой, как ее переменную*. Запись базы данных вместе с бейсик-блоком дает возможность сохранить созданные Вами дополнительные процедуры. Такой персонализированный вариант Masterfile заменяет исход- ную беисик-часть программы. ЗАГРУЗКА И ЗАПУСК MASTERFILE Поскольку в компьютере одновременно работают бейсик-часть Masterfile и программа в кодах, то область памяти, в которую будет загружен кодовый блок, нужно «защитить» оператором CLEAR. Но сделать это можно только до загрузки бейсик-блока, так как выполнение оператора CLEAR обнуляет переменные Бейсика (что неизбежно приведет не только к исчезновению информации, сохраненной в базе данных, но и к разрушению самой програм- мы). Таким образом, загрузка Masterfile происходит следующим образом: 1. Выполняется оператор CLEAR XXXXX-1, где ХХХХХ — адрес загрузки кодовой части Masterfile. 2. Загружается бейсик-часть Masterfile. 3. Управление передается на строку 4036, начиная с которой размещена подпрограмма загрузки кодовой части Masterfile и запуска программы. Адрес ХХХХХ зависит от версии Masterfile. Для описываемой версии он равен 56981. Выполнение всех перечисленных операций разумно поручить специ- альному загрузчику, один из вариантов которого приведен в конце описания Masterfile. ПРИМЕР РАБОТЫ С MASTERFILE Masterfile имеет обширнейшую систему меню**, разобраться с которой методом «научного тыка» не так то просто. При работе с программой чрезвы- чайно важна последовательность действий, которую мы и хотим продемонст- рировать на примере составления каталога небольшой библиотеки. Подробное описание всех меню и функций Masterfile будет приведено позже. Начинать создание базы данных нужно с очистки Masterfile от предыдущих записей. Для этого, находясь в главном меню (оно появляется на экране сразу после загрузки программы, рис. 7), нажмем клавишу Р (Purge selected records — удаление всех выбранных записей), и подтвердим свое намерение клавишей Y (Yes — Да). После выполнения этой операции Masterfile будет готов к созданию новой базы данных. Прежде всего определим, какую информацию о книгах нам хотелось бы хранить в компьютере. Для самого простого каталога, наверное, будет достаточно карточки со следующими данными: 1. Автор книги 2. Название книги 3. Издательство и год издания 4. Автор перевода 5. Комментарии *) База данных в бейсик-блоке размещается в специальной переменной F$. **) Выбор функций в Masterfile осуществляется нажатием на указанную в меню клавишу. 41
ПРИМЕР РАБОТЫ С MASTERFILE MASTERFILE Каждое из этих данных про- грамма будет заносить в отдельный раздел, называемый полем. Следо- вательно, для организации нашей картотеки необходимо задать 5 по- лей. Сделать это можно в специаль- ном меню, для перехода в которое нажмем клавишу N (Name Data ref- erence — задать название поля). В этом меню выберем функцию А (Add item — добавить элемент), по- сле чего Masterfile выдаст запрос Give data reference, на который нуж- но ввести имя определяемого поля — одну из букв латинского алфа- вита (A...Z). Полю, кроме имени, ftdd a record. ......R Choose a report....С Display /Print О Edit format der....E Load a Г He L Name Data re f N Search the M Le. . ..5 invtrt itltctn I Reset s«ltction....R Purge sei reeds. ...P Tom/fivertgt т save Prog/Fi ie и Exec user Basic. . .u set =31012 Рис. 7. Главное меню Masterfile. присваивается также и словесное название типа «Автор», «Перевод» и т. д., необходимое только как комментарий. Название вводится после имени на запрос Enter text 1-128 characters (введите текст длиной не более 128 символов). Итак, зададим нужные нам 5 полей*: А А АВТОР J А N НАЗВАНИЕJ А I ИЗДАТЕЛЬ J А Р ПЕРЕВОД J А К КОММЕНТАРИЙ^ Теперь приступим к заполнению карточек нашего каталога. Нажав клавишу М (Main menu), выйдем в главное меню, далее перейдем в меню А (Add a record — добавить запись) и в нем выберем функцию Р (Prompt Items — заполнить поля). В верхней части экрана последовательно будут появлять- ся имена и названия полей, в нижней — запрос Enter text 1-128 characters, на который и будем вводить данные о первой книге: А АВТОР Enter text 1-128 chars ГЕРМАН ГЕССЕ J N НАЗВАНИЕ Enter text 1-128 chars ИГРА В БИСЕР J I ИЗДАТЕЛЬ Enter text 1-128 chars НОВОСИБИРСКОЕ КНИЖНОЕ ИЗДАТЕЛЬСТВО 1991J Р ПЕРЕВОД Enter text 1-128 chars C.AflTAJ К КОММЕНТАРИЙ Enter text 1-128 chars J текста. Поле комментария мы оставили незаполненным, нажав Enter без ввода *) В описании примеров используются следующие обозначения: J — кла- виша Enter, полужирным шрифтом выделяется текст, вводимый с клави- атуры, нормальным — текст, выводимый на экран, курсивом — поясне- ния. 42
MASTERFILE ПРИМЕР РАБОТЫ С MASTERFILE Еще раз нажав клавишу Р, заполним вторую карточку: А АВТОР Enter text 1-128 chars ФРИДРИХ НИЦШЕJ N НАЗВАНИЕ Enter text 1-128 chars ТАИ ГОВОРИЛ ЗАРАТУСТРА J I ИЗДАТЕЛЬ Enter text 1-128 chars МОСКВА, "ИНТЕРБУК", 1990J Р ПЕРЕВОД Enter text 1-128 chars B.PblHKEBH4AJ К КОММЕНТАРИЙ Enter text 1-128 chars СОВРЕМЕННЫЙ ПЕРЕВОД J Теперь в нашем каталоге заполнены уже две карточки, и пора поза- ботиться о формате их вывода, то есть определить, в каком виде будет представлена информация на экране. Начнем с самого простого формата — будем выводить только имя автора и название книги. Перед тем, как приступить к оформлению карточек, зададим общий вид экрана — цвет фона, бордюра, высоту карточек. Выйдем в главное меню (клавиша М), нажмем клавишу Е (Edit format definitions — редактировать формат вывода записей) и в появившемся меню выберем функцию A (Add new format — добавить новый формат). На запрос Give report reference (Введите имя форма- та) введем имя формата — один из символов A...Z или 0...9, например, О (обратите внимание на то, что имя формата никоим образом не связано с именами полей). В верхней части экрана появится красная надпись General (общий). Выберем функцию R (Replace element — редактирование существу- ющего элемента) и на запросы Рарег= и Border= введем номера цветов фона и бордюра, например, нажав в обоих случаях клавишу 5, зададим полностью голубой экран. На запрос Sequence^ ответим А (автор), определяя таким образом имя поля, по которому карточки будут сортироваться в алфавитном порядке (к сожалению в большинстве русифицированных версий Masterfile эта функция не выполняется*). И, наконец, зададим интервал (lnterval=), через который карточки будут выводиться на экран. К примеру, для того, чтобы каждой из них отвести одну строку, введем число 1. После этого мы снова окажемся в меню Edit format definitions и приступим к созданию формата вывода полей карточки: нажмем клавиши A (Add new element — добавить новый элемент), D (Data from record — элемент данных) и на запрос Give data ref введем имя первого поля — А (автор). Отвечая на последующие вопросы, определим местоположение и размеры поля: Line= 0J строка, начиная с которой будет выводиться имя автора Micro-Prt Y/N Y микропечать — да 42 Pitch Y/N N 42 символа в строке — нет. Текст поля карточки будет выводиться в 51-символьном режиме Column= О J номер столбца, начиная с которого будет размещаться текст Width= 20 J ширина окна поля в знакоместах Depth= I j высота окна в строках Рарег= 6 J цвет окна — желтый *) Страдает этим и описываемая версия. 43
ПРИМЕР РАБОТЫ С MASTERF1LE MASTERF1LE Bright Y/N Y текст выводить с повышенной яркостью Inverse Y/N N и без инверсии Далее на запрос Pad Y/N ответим Y, и заданное окно будет целиком закрашиваться установленными цветами (в противном случае атрибуты окна изменялись бы только в месте вывода текста). На запрос Null text= (текст, выводимый в случае, когда поле не содержит информации) ответим СБОРНИК. В результате всех этих операций мы сообщили программе, в каком виде она будет представлять на экране имя автора. Аналогично зададим формат вывода поля названия книги: A (Add new element) D (Data from record) N имя поля названия книги Line= 0 J Micro-Prt Y/N Y 42 Pitch Y/N N Column= 20J Width= 31J Depth= 1J Paper= 5 J Bright Y/N Y Inverse Y/N N Pad Y/N N Null text=J Самое время просмотреть результаты наших трудов. Нажмем клавишу D (Display /Print — перейти в режим просмотра карточек) — на экране появятся имена авторов и названия двух книг, на которые мы уже заполнили карточки. Теперь таким же образом можно занести в Masterfile данные о всех книгах Вашей библиотеки. Однако работать с полученным каталогом пока еще невозможно — в режиме Display/Print на экране компьютера представ- ляется только часть занесенной информации о книгах (автор и название). Попробуем создать новый формат, который в приятном для глаза виде выводил бы на экран все данные о книгах. С этой целью в меню Edit format definitions выберем функцию Add new format (добавить новый формат) и на запрос Give report reference введем имя нового формата, скажем, 1. Далее повторим уже знакомые действия по созданию формата, но с некоторыми вариациями. Определим общий вид экрана: General — R (Replace element — редактировать элемент) Paper=6 J желтый Border=6 J желтый Sequence=A J автор lnterval=22J Задав интервал, равный максимальному количеству строк (22), мы фактически установили, что каждая карточка будет занимать целый экран. Теперь приступим к описанию формата отдельных полей карточки. Начнем с поля АВТОР: A (Add new element) D (Data from record) А имя поля автора Line=1 Micro-Prt Y/N N Column=1 J 44
MASTERFILE ПРИМЕР РАБОТЫ С MASTERFILE Width=30J Depth=1J Paper=0J Bright Y/N Y Inverse Y/N N Flash Y/N N мерцание — нет Pad Y/N Y Null text=rPynriA АВТОРОВ J Попробуем имя автора обвести рамочкой: A (Add new element) В (Box — изобразить прямоугольник) X coord=5 J ^ координаты левого верхнего Y coord=170.J / угла рамки Depth=13J высота рамки Width=245 J длина рамки Приступим к оформлению поля названия книги: A (Add new element) D (Data from record) N имя поля названия книги * Line=5J Micro-Prt Y/N N Column=1J Width=30J Depth=4J Paper=6J Bright Y/N Y Inverse Y/N N Flash Y/N N Pad Y/N Y Null text=CBOPHMKJ Выделим рамочкой и название книги: A (Add new element) В (Box) X coord=3 J Y coord=141 J Depth=44J Width = 249 J Теперь отведем в карточке место издателю: A (Add new element) D (Data from record) I имя поля издателя Line=13J Micro-Prt Y/N Y 42 Pitch Y/N N Column=2.J Width=18J Depth=4J Paper=*J Bright Y/N N Inverse Y/N N 45
ПРИМЕР РАБОТЫ С MASTERFILE MASTERFILE Pad Y/N N Null text=J При оформлении поля автора перевода, чтобы потом ничего не напутать, впишем в него слово «перевод». A (Add new element) L (Literal text — символьный текст) Line=12J Micro-Prt Y/N Y 42 Pitch Y/N N Column=27J Paper=6J Bright Y/N N Inverse Y/N N ПЕРЕХОД J это не опечатка, а преднамеренно допущенная нами ошибка, исправление которой мы продемонстрируем позже A (Add new element) D (Data from record) P имя поля переводчика Line=13J Micro-Prt Y/N Y 42 Pitch Y/N N Column=27J Width=2«J Depth=4J Paper=4J Bright Y/N N Inverse Y/N N Pad Y/N N Null text= J И, наконец, комментарий: A (Add new element) D (Data from record) К имя поля комментария Line=18J Micro-Prt Y/N Y 42 Pitch Y/N Y Column=0J Width=42J Depth=4J Paper=$J Bright Y/N Y Inverse Y/N N Pad Y/N Y Null text=HET КОММЕНТАРИЯ J После размещения полей займемся внешним видом всей карточки — украсим ее несколькими линиями: A (Add new element) Н (Horizontal line — провести горизонтальную линию) X coord=0J ^ координаты Y coord=84J ) начала линии Length=2$5 J длина линии 46
MASTERFILE МЕНЮ И ФУНКЦИИ процесс; замок; новеллы и притчи; из дневников МОСКВЙ, -РАДУГА", Р. РАЙТ-КОМЛЕВОЙ, С.АПГА. Н.КАСАТКИНОЙ, В. СТЙНЕВИЧ И ДР. K.OMMEHTRPMEB НЕТ Report Re с s « Ошюепи 5е I Рис, 8. Рабочий экран Masterfile. A (Add new element) Н (Horizontal line) X coord=0 J Y coord=36 J Length=255J A (Add new element) Y (Vertical line — провести вертикальную линию) X coord=127J Y coord=84 J Length=48J Теперь можно и посмотреть, что же у нас получилось. Для этого войдем в режим просмотра Display /Print — на экране появится картинка, аналогичная рис. 8. Да, это уже неплохо, если бы не допущенная нами ошибка — вместо «перевод» написано «переход». Исправим ее: М выход в основное меню Е (Edit format definitions) R (Review format — отредактировать формат) Give report ref 1 N (Next element — перейти к следующему элементу) N (Next element) N (Next element) N (Next element) N (Next element) N (Next element) R (Replace element - отредактировать элемент) Line=12J Micro-Prt Y/N Y 42 Pitch Y/N N Column=27J Paper=6J Bright Y/N N Inverse Y/N N nEPEBOAJ Войдем в режим Display/Print и убедимся, что теперь уж все нормально. Мы рассмотрели только пример создания базы данных, но надеемся, что, прочитав полное описание меню и функций Masterfile, Вы без особого труда освоите и всевозможные операции над ней. МЕНЮ И ФУНКЦИИ На профессиональном языке то, что мы до сих пор именовали карточкой, называется записью. Запись, по сути, это совокупность лолей, условно связанных между собой. Каждое поле записи содержит данные объемом до 128 символов, которые могут быть как числовыми (например, «0.985»), так и текстовыми (например, «Клиффорд Саймак»). Текущей записью (полем) называется запись (поле), с которой Masterfile работает или будет работать в режиме редактирования. В режиме Display/Print текущая запись отображается на экран верхней. 47
МЕНЮ И ФУНКЦИИ MASTERFILE В процессе обработки данных записям присваивается специальный атрибут, по которому они делятся на выбранные и невыбранные. Если записи присвоен атрибут «выбранная», она становится доступной для всех опера- ций, производимых Masterfile. Невыбранная запись как бы пропадает для программы: ее нельзя ни просмотреть, ни отредактировать. Обработка дан- ных как раз и состоит в том, чтобы с помощью функций поиска найти и вывести на экран требуемые записи, присвоив им атрибут «выбранные». Система меню Masterfile имеет несколько уровней вложения. Для удобства работы с описанием программы функции, входящие в одно и тоже меню, помечены одинаковым количеством точек, соответствующим уровню вложения этого меню. Главное меню точкой не помечается. Add a record A Создать новую запись. Созданная запись автоматически становится выбранной и текущей. При этом считается, что во все ее поля занесен текст нулевой длины. •Add a item A Добавить поле в текущую запись. На запрос Give data ref задайте имя поля (одну из букв A...Z), затем, на подсказку Enter text 1-128 chars, введите данные — текст длиной не более 128 символов, после чего нажмите клавишу Enter. •Replace item R Редактировать данные поля. Изменения будут вноситься в поле, имя и название которого отображаются на экране — текущее поле. (Сменить текущее поле можно с помощью функций Next item или Get Item). На подсказку Enter text 1-128 chars введите новые данные. Ввод пустой строки не изменяет содержимого поля. •Erase item Е Очистить текущее поле. Удаляются данные из текущего поля текущей записи. Для подтверждения операции на запрос Y to confirm нажмите клавишу Y, для отмены — любую другую. •Next item N Вызвать следующее поле. Переход осуществляется только к заполненным полям. •Display /Print D Перейти в режим просмотра. Функция аналогична одноименной функции главного меню (см. ниже). •Get item G Вызвать поле по имени. На подсказку Give data ref введите имя поля (A...Z). Переход осуществляется только к заполненным полям. Для отмены опера- ции нажмите клавишу Enter. •Prompt items Р Заполнить поля. На экран последовательно выводятся имена и названия незаполненных полей, имеющих название (названия полям присваивают- ся с помощью функции Name data ref главного меню). Данные вводятся на запрос Enter iexi 1-128 chars. 48
MASTERFILE МЕНЮ И ФУНКЦИИ •Another record = Создать новую запись. Аналогична функции Add a record главного меню. Введена для удобства работы, чтобы избежать промежуточной операции — выхода в главное меню. •Main menu М Выйти в главное меню. Choose a report С Установить формат вывода записи. На запрос Give report ref введите имя формата (один из символов A...Z или 0...9). Если ранее ни один формат не был создан, управление будет передано функции Edit format def. Для отмены функции и возврата в главное меню нажмите клавишу Enter. Display/Print D Просмотреть выбранные записи в установленном формате. Если ни одна из записей не была выбрана, ноля формата не заполнятся. Вывод на экран перечня функций меню Display /Print осуществляется нажа- тием клавиши Q. Для выполнения какой-либо из них необходимо, повторно нажав Q, вернуться к просмотру записей и нажать клавишу, соответствую- щую требуемой функции. Операции в меню Display/Print производятся только над выбранными запися- чи. •Next page N Продолжить просмотр записей. Если в установленном формате на экране поместилась только часть записей, то с помощью этой функции можно продолжить вывод. •Back one record О Установить текущей предыдущую запись. •Back to 1st rec В Установить текущей первую запись. •Advance 1-9 rec 1...9 Перейти на 1...9 записей вперед. При нажатии цифровой клавиши проис- ходит переход вперед на соответствующее количество записей. Нажатие клавиши 1, например, установит текущей следующую запись. •Print Р Копировать экран на принтер (см. также описание меню Exec User Basic). •Update top rec U Изменить текущую запись. Вызывается меню, аналогичное Add a record главного меню. •Erase top rec Е Уничтожить текущую запись. После утвердительного ответа (Y) на запрос Y to confirm текущая запись удаляется из базы. •Omit top record О Отказаться от записи. Текущая запись исключается из числа выбранных. 4-1102 49
МЕНЮ И ФУНКЦИИ __^__^__ MASTERFILE •Copy top record С Дублировать текущую запись. Создается новая запись, аналогичная теку- щей. •Search the file S Выбрать запись. Аналогична одноименной функции главного меню. •Total /Average Т Подсчитать сумму и среднее арифметическое. Функция аналогична одно- именной функции главного меню (см. ниже). •Select report R Сменить формат вывода записей. На запрос Give report ref введите имя формата (A...Z или 0...9). Запрос будет повторяться до тех пор, пока не будет введено имя существующего формата, либо нажата клавиша Enter, которая отменит функцию. •Main menu М Выйти в главное меню. •Quit this menu Q Выйти из меню. Возврат к функции просмотра записей из режима отобра- жения меню Display/Print. Edit format def E Редактировать формат вывода записей. Меню предназначено для создания новых или редактирования уже существующих форматов. Каждому формату присваивается имя — буква (A...Z) или цифра (0...9). Таким образом, в одной базе может быть задано не более 36 форматов. Рекомендуется иметь несколько форматов вывода: форматы для просмотра одного-двух полей большого числа записей (под каждую запись на экране отводится лишь несколько строк) и формат для детального ознакомления со всеми полями записи (все пространство экрана используется для выкода одной записи). •Add new format А Создать новый формат. На запрос Give report ref введите имя нового формата. После этого на экране появится новое меню. ••Add new element А Ввести новый элемент формата. •••Data from reed D Установить формат вывода данных поля. На запрос Give data rec введите имя поля и ответами на последующие запросы задайте формат его вывода: Line — верхняя граница окна поля — номер строки от 0 до 2 1, начиная с которой будут выводиться данные. Micro-Prt Y/N — режим вывода текста на экран: N — установить режим печати по 32 символа в строке (стандартный формат ZX Spectrum); Y — режим микропечати. При выборе режима микропечати последует дополнительный запрос 42 Pitch Y/N: Y — установится режим печати по 42 символа в строке; 50
MASTERFILE МЕНЮ И ФУНКЦИИ N — по 5 1 символу. Column — левая граница окна поля — номер столбца, начиная с которого будут выводиться данные поля. Следует обратить внимание на то, что положение символа в строке зависит от выбранного режима печати, например, при 42-символьном режиме 21-я позиция соответ- ствует середине экрана. Width — ширина окна поля — количество столбцов, отводимых для вывода данных поля. Depth — высота окна поля — количество строк, отводимых для вывода данных поля. Параметры Line, Column, Width и Depth задают соответственно коорди- наты начала и размеры окна для вывода данных поля. Paper — цвет фона окна поля — номер цвета фона (0 - черный, 1 — синий, 2 - красный, 3 — фиолетовый, 4 - зеленый, 5 - голубой, 6 - желтый, 7 — белый). Цвет тона автоматически устанавливается наи- более контрастным к цвету фона. Bright Y/N — уровень яркости печати данных поля. Y — повышенная яркость, N — обычная. Inverse Y/N — инверсия (Y). N — без инверсии. Flash Y/N — мерцание (Y). N — без мерцания. При использовании микропечати запрос не выдается. Pad Y/N — окраска всего окна поля в соответствии с установленными атрибутами (Y). N — атрибуты будут выставляться только в позициях, в которые выводятся данные поля. Null text — текст, который необходимо вывести в окно при отсутствии данных в поле записи. •••Literal text L Задать пояснительный текст и установить формат его вывода. На запрос Enter text 1-128 chars введите пояснительный текст, который Вы хотите включить в формат представления записи. Формат поясни- тельного текста устанавливается аналогично формату вывода данных поля записи (Data from reed)*. •••Box В Построить прямоугольник. Для построения на экране прямоугольни- ка введите его параметры в ответ на следующие запросы: X coord — | координаты левого верхнего угла Y coord — ' прямоугольника Depth — i высота (вниз) и ширина (вправо) Width — ) прямоугольника. Верхняя левая точка экрана соответствует координате Х=0, Y=0. Раз- меры прямоугольника не должны быть больше, чем 255 точек (ши- рина) на 1 7 5 (высота), то есть не должны превышать размеры экрана. •••Horizontal line Н •••Vertical line V Провести горизонтальную и вертикальную линии соответственно. На последующие запросы введите параметры линии: X coord — "S координаты начала Y coord — ) линии Length — длина линии. Горизонтальная линия строится вправо отно- сительно начала, а вертикальная — вниз. Этот и последующие элементы формата служат исключительно для офор мления. 51
МЕНЮ И ФУНКЦИИ MASTERFILE •••Previous Menu М Возврат в предыдущее меню (Edit format def). ••Replace element R Редактировать текущий элемент формата. Название и значения пара- метров текущего элемента формата выводятся в верхней части экрана. На соответствующие запросы введите новые значения параметров текущего элемента. • • Erase element Е Удалить текущий элемент формата. После утвердительного ответа (Y) на запрос Y to confirm текущий элемент удаляется из формата. ••Next element N Перейти к следующему заданному элементу формата. Переход происхо- дит циклически. • *Сору format С Дублирование текущего формата. После ввода на запрос Give report ref имени (A...Z, 0...9) будет создан новый формат, аналогичный текущему. Если формат с таким именем уже существует, выдается сообщение Already defined и выполнение функции отменится. • •Delete format X Удаление текущего формата. После утвердительного ответа (Y) на запрос Y to confirm удаляется текущий формат. ••Display/Print D Перейти в режим просмотра. Функция аналогична одноименной функ- ции главного меню. • «Previous menu М Выйти в предыдущее меню (Add new format). •Review format R Редактирование существующего формата вывода записей. На запрос Give report ref введите имя ранее определенного формата. При вводе имени несуществующего формата будет выдано сообщение No such format defined и выполнение функции отменится. Формат редактируется в подменю, аналогичном Add new format (меню Edit format definitions). •Main menu M Выйти в главное меню. Load a file L Загрузить файл базы данных. На запрос Give file name введите имя файла, после чего он будет загружен с магнитного носителя. Находящаяся ранее в памяти база данных при этом уничтожается. В дисковой версии программы на экран предварительно выводится каталог диска. Name data ref N Определить поле. 52
MASTERFILE МЕНЮ И ФУНКЦИИ •Add a item A Задать имя и название поля. На запрос Give data ref введите имя поля (A...Z), затем, на запрос Enter text 1-128 chars его название — текст длиной не более 128-ми символов, после чего нажмите клавишу Enter. Если поле уже опреде- лено, то появится сообщение Item afready In record, и выполнение функции отменится. •Replace item R Редактировать название текущего поля. Имя и название текущего поля отображаются в верхней части экрана. •Erase item Е Удалить название текущего поля. После утвердительного ответа (Y) на запрос Y to confirm, удаляется название текущего поля (само поле остается). •Next item N Перейти к следующему полю. Переход осуществляется только к полям, имеющим название. •Display/Print D Выйти в режим просмотра. Функция аналогична одноименной функции главного меню. •Get item . . . ., G Вызвать поле по имени. На запрос Give data name введите имя поля (A...Z). Нажатие клавиши Enter отменит выполнение функции. Переход осущест- вляется только к полям, имеющим название. •Prompt items Р Присвоить полям названия. На запрос Enter text 1-128 chars введите название поля, имя которого отображается в верхней части экрана. Переход к следующему полю происходит по нажатию клавиши Enter. •Another record = Добавить новую запись. Аналогична функции главного меню Add a record и введена для удобства работы. •Main menu М Выйти в главное меню. Search the file S Выбрать записи. •Select from all A Сделать выборку из общего числа записей. По заданному аргументу найти записи среди ранее невыбранных и добавить их к числу выбранных (выбранные записи таковыми и остаются). •Select from sel L Сделать выборку из ранее выбранных записей. 53
МЕНЮ И ФУНКЦИИ MASTERFILE •Display/Print D Войти в режим просмотра. Функция аналогична одноименной функции главного меню. После выбора любого из режимов (Select from ill или Select from sel) на экране появится запрос Give data ref об имени поля, в котором будет произ- веден поиск. После его ввода нужно определить тип аргумента для поиска: • «Character С Искать символьную строку. ••Numeric N Искать численное значение* Далее задается одно из 5 условий выбора: • • «Equal to Е Выбрать запись при равенстве аргумента и содержимого поля. При поиске символьного аргумента выбор осуществляется, если строка аргумента совпадает с началом строки поля. • • «Unequal to U Выбрать запись при неравенстве аргумента и содержимого поля. • • «Less than L Выбрать запись, если аргумент меньше значения содержимого поля. При поиске символьного аргумента сравниваются ASCII-коды сим- волов. Запись будет выбрана, если при последовательном сравнении код каждого символа аргумента, начиная с первого, меньше соответ- ствующего кода символа строки поля. При сравнении строк заглав- ные и прописные буквы не различаются и считается, что А<В<С<... • • «Greater than G Выбрать запись, если аргумент больше значения содержимого поля. Срав- нение символьных строк происходит аналогично предыдущему режиму. •••String search S Выбрать запись при совпадении строки аргумента с фрагментом строки поля. Режим может быть выбран только при поиске символьной строки. После задания одного из перечисленных выше условий выбора записей на запрос Argument= введите значение аргумента для поиска. Если при задании поиска по численному аргументу на запрос введена символьная строка, появится сообщение Arg not numeric. Если в процессе поиска числового аргумента программа встретит поле, содержащее символьную строку, будет выдан запрос Non-numeric data: Skip Update. Возможны два варианта последующих действий: игнорировать за- пись — считать, что в поле записан ноль (клавиша S) либо перейти в режим редактирования записи (Update), где можно исправить ошибку (клавиша U). • • •Main menu М Выйти в главное меню. ••Previous menu М Выйти в предыдущее меню (Search the file). 54
MASTERFILE МЕНЮ И ФУНКЦИИ •Main menu М Выйти в главное меню. invert selection I Инвертировать выборку. Все выбранные записи становятся невыбранными и наоборот. Reset selection R Отменить выбранные записи. Все записи становятся невыбранными. Purge sel reeds Р Удалить все выбранные записи. Удаление подтвердите клавишей Y; нажатие любой другой клавиши отменит операцию. Total/Average Т Подсчитать сумму и среднее арифметическое. На запрос Give data item введите имя ноля (A...Z), над числовыми значениями которого необходимо произвести матема- тические действия. Сумма (Total) и среднее арифметическое значение (Average) будут подсчитаны для всех выбранных записей и результат выведен на экран. Если в какой-либо записи поле содержит нечисловое значение, выдается сообщение Non-numeric data: Skip Update. Возможны два варианта последующих действий: игнорировать запись — считать, что в поле записан ноль (клавиша S), и перейти в режим редактирования записи (Update), где можно исправить ошибку (клавиша U). Save Prog/File V Сохранить записи на магнитном носителе. Для отмены функции нажмите клавишу Enter. •Program+file Р Сохранить записи вместе с бейсик-программой. •File only F Сохранить только записи. База данных записывается на магнитный носи- тель в виде отдельного файла (массива данных). В последующем файл, содержащий данные записей, загружается в Masterfile с помощью функ- ции Load a ffle главного меню. Exec User Basic U Обработка выбранных записей бейсик-программой. После утвердительного ответа (Y) на запрос Y to confirm, управление будет передано бейсик-блоку Masterfile (нажатие любой другой клавиши отменит операцию). При выполнении программы на Бейсике будут последовательно вызываться подпрограммы, расположенные начиная со строк 4900, 5000, 6000, 7000 и 9000. Этих подпрограмм в исходном варианте Masterfile нет — Вы сами можете написать их, включив необходимые Вам дополнительные процедуры обработки базы данных. Для возврата из подпрограмм используется оператор GO TO USR R {бейсик-переменная R содержит адрес возврата в кодовый блок Masterfile). Ниже приведен алгоритм вызова бейсик-подпрограмм, поясняющий работу функции User Bask: 1. 4900. Подпрограмма инициализации глобальных переменных, под- грузки рабочих файлов и т. п. Управление на нее передается только один раз — сразу после выбора функции User Basic. 55
МЕНЮ И ФУНКЦИИ MASTERFILE 2. После выхода из подпрограммы (оператор GO TO USR R)r если в базе есть выбранные и еще не обработанные бейсик-программой записи, то осуществляется переход к п.З (вызывается подпрограмма, расположенная со строки 5000), в противном случае — к п.9. 3. 5000. Подпрограмма обработки записей. Вызывается каждый раз перед началом обработки очередной записи, предназначена для начальной установки рабочих переменных, подсчета общих сумм и т. п. 4. После выхода из подпрограммы, если в записи есть необработан- ные поля, происходит переход к п.5, в противном случае — к п.7. 5. 6000. Подпрограмма обработки полей записи. В ней можно сохра- нить данные различных полей для последующей совместной их обработки. Имя поля и сохраненная в нем информация содержатся в специальном символьном массиве С$: С$(1) имя поля (A...Z); С$(2 ТО ) данные поля. 6. После выхода из подпрограммы, если в записи есть еще необрабо- танные поля, происходит переход к п.5, в противном случае — к п.7. 7. 7000. Подпрограмма завершения обработки записи. Вызывается после обработки всех полей записи и обычно используется либо для моди- фикации и удаления существующих полей записи, либо для добавления нового поля. Осуществляется это изменением строкового массива С$: для модификации поля: С$(1) имя модифицируемого поля (A...Z); С$(2 ТО ) новые данные поля. для удаления поля: С$(1) имя удаляемого поля (A...Z) (удаление произойдет только из обрабатываемой записи); С$(2 ТО ) пустая строка (элементы массива обнулены). для добавления поля: С$(1) буква (в верхнем регистре) — имя добавляемого поля (A...Z) (поле будет создано без названия); С$(2 ТО ) данные поля. В этой подпрограмме можно изменить только одно тюле обрабатыва- емой записи. Если необходима более сложная модификация базы, функцию User Basic нужно вызвать несколько раз. 8. После выхода из подпрограммы, если в базе данных есть еще необработанные функцией User Basic записи, происходит переход к п.2, в противном случае — к п.9. 9. 9000. Подпрограмма Завершения обработки базы данных. В ней обычно проводятся какие-либо глобальные вычисления, подсчитываются ито- говые суммы, среднестатистические значения, производится печать или сохра- нение результатов. Возможна организация многопроходных вычислений. Подпрограмма печати экрана. Для распечатки копии экрана управле- ние передается на строку 4120 бейсик-программы. В оригинальной версии Masterfile в этой строке расположен оператор COPY. Его можно заменить оператором вызова любой другой процедуры, в том числе и процедуры вывода на принтер, работающий под управлением нестандартного драйвера. 56
MASTERFILE РУСИФИКАЦИЯ MASTERFILE РУСИФИКАЦИЯ MASTERFILE Описываемый способ русификации не является лучшим*, но он обладает существенным достоинством — при относительной простоте он практически не ограничивает возможности Masterfile**. Перед началом русификации очистите базу данных (функция Purge selected records главного меню) удалите также существующие имена полей (функция Erase item меню Name data ref) и форматы вывода (функция Delete format меню Edit format def). Сохраните Masterfile совместно с бейсик-про- граммой (функция Program+file меню Save Prog/File). Начинать обучение Masterfile русскому языку следует с бейсик-блока. Для этого, предварительно очистив память компьютера оператором NEW, загрузите исходный вариант бейсик-блока в память с помощью оператора MERGE (это позволит избежать автозапуска программы): для кассетной версии: MERGE "MF" для дисковой версии: RANDOMIZE USR 15619: REM : MERGE "MF" Внимание! В процессе модификации бейсик-блока ни в коем случае не выполняйте операторов CLEAR и RUN. В загруженной бейсик-программе измените строку с номером 1: 1 PRINT;: PAPER VAL "7": GO TO USR VAL "56981" Исли Вы работаете с дисковой версией, внесите в программу также и другие изменения и дополнения: 4000 GO SUB VAL "4085": INPUT PAPER VAL "7";(c$( TO VAL "32")); LINE c$: GO TO USR R 4020 LET e=USR VAL "15619": REM : SAVE c$( TO 8) DATA f$() 4021 GO TO VAL "4080" 4030 LET e=USR VAL "15619": REM : SAVE c$( TO 8) LINE 4036 4031 GO TO VAL "4080" 4036 LET e=USR VAL "15619": REM : LOAD "MFrmcode"CODE 4037 IF e=NOT PI THEN GO TO VAL "1" 4038 PRINT "Can't load file MF!": STOP 4040 LET c$=STR$ (VAL c$( TO VAL "14")/VAL c$(VAL "15" TO VAL "19")): GO TO USR R 4050 LET e=USR VAL "15619": REM : LOAD c$( TO 8) DATA f$() 4051 GO TO VAL "4080" 4080 IF e<> NOT PI THEN PRINT #0; INK VAL "5"; PAPER VAL "2"; "Error in file ";c$( TO VAL "8");"!": BEEP VAL ",5",VAL "1": PAUSE NOT PI 4082 GO TO USR R 4085 LET e=NOT PI: IF c$( TO PI)="SAV" OR c$(PI+PI TO PI*PI)="File " THEN LET e=USR VAL "15619": REM : CAT 4086 IF e=NOT PI THEN RETURN 4087 PRINT "Insert disk!": STOP Поело этого запишите модифицированную бейсик-часть на магнит- ный носитель, выполнив для этого операторы: для кассетной версии: SAVE "MF rus" LINE 4036 для дисковой версии: RANDOMIZE USR 15619: REM : SAVE "MF rus" LINE 4036 Более совершенные способы русификации привести здесь не представля- ется возможным из-за большого объема соответствующей информации. Подробнее о приведенном методе см. «Русификация ZX Spectrum. Ис- пользование символов, определяемых пользователем». 57
РУСИФИКАЦИЯ MASTERFILE MASTERFILE Теперь можно приступить к модификации кодовой части Masterfile. Для этого наберите и выполните приведенную ниже программу. Она дана в варианте, предназначенном для кассетной версии Masterfile; для дисковой версии измените строку с номером 100, она должна выглядеть следующим образом: 100 LET b$="YES". 10 CLEAR 56980 100 LET b$="NO" 110 IF b$O"YES" THEN GO TO 200 120 LET e=USR 15619: REM : LOAD "MF mcode"CODE 130 IF e<>0 THEN PRINT "File ""mcode <C>"" not found!": STOP 140 GO TO 300 200 PRINT "Insert source cassette" 210 LOAD "MF mcode"CODE 300 RESTORE 1000 305 LET c=0 310 FOR a=56981 TO 57319 320 READ d: POKE a,d: LET c=c+(a-56981)/(d+1) 330 NEXT a 340 RESTORE 2000 350 READ d$ 352 IF d$="END" THEN GO TO 395 355 LET s=VAL d$( TO 5): LET d=s+LEN d$(6 TO )-1 356 LET c=c+d/256 360 FOR a=s TO d 370 POKE a,CODE d$(a-s+6) 380 NEXT a 385 POKE a-1,128+PEEK (a-1) 390 GO TO 350 395 IF INT cOi 1763 THEN PRINT "Error in DATA": STOP 400 IF b$O"YES" THEN GO TO 500 410 LET e=USR 15619: REM : SAVE "MFrmcode"CODE 56981,8555 420 IF e<> 0 THEN PRINT "Can't write file MFrmcode!": STOP 430 GO TO 600 500 PRINT "Insert destination cassette" 510 SAVE "MFrmcode"CODE 56981,8555 600 PRINT "ok!" 1000 DATA 33,64,223,34,123,92,62,165,50,157 1010 DATA 227,33,198,222,62,195,50,165,227,34 1020 DATA 166,227,33,6,223,50,241,230,34,242 1030 DATA 230,33,228,222,50,38,250,34,39,250 1040 DATA 33,64,223,34,123,92,195,173,227,225 1050 DATA 193,197,229,65,126,254,128,56,10,214 1060 DATA 144,48,6,254,20,56,2,62,63,119 1070 DATA 35,16,237,225,193,9,195,168,227,254 1080 DATA 32,48,23,198,32,205,28,223,205,255 1090 DATA 222,229,33,0,60,34,54,92,33,144 1100 DATA 244,34,230,243,225,201,229,33,67,250 1110 DATA 195,42,250,230,127,254,32,48,12,198 1120 DATA 32,205,28,223,215,205,240,222,195,244 1130 DATA 230,215,195,244,230,229,33,64,222,34 1140 DATA 54,92,33,43,223,34,230,243,225,201 1150 DATA 25,49,49,137,25,148,7,25,37,148 1160 DATA 49,13,148,148,13,25,37,49,37,49 1170 DATA 37,0,62,66,66,62,34,66,0,0 1180 DATA 124,64,124,66,66,124,0,0,68,68 1190 DATA 68,68,68,126,2,0,28,36,36,36 1200 DATA 36,126,66,0,60,66,30,2,66,60 1210 DATA 0,0,62,73,73,73,62,8,0,0 1220 DATA 126,64,64,64,64,64,0,0,66,66 1230 DATA 66,62,2,2,0,0,66,70,74,82 1240 DATA 98,66,0,0,73,73,62,73,73,73 1250 DATA 0,0,68,72,112,72,68,66,0,0 58
MASTERFILE ПРОГРАММА-ЗАГРУЗЧИК 1260 DATA 30.34,34,34,34,98,0,0,65,73 1270 DATA 73,73,73,127,1,0,65,73,73,73 1280 DATA 73,127,0,0,66,66,36,24,16,96 1290 DATA 0,0,126,66,66,66,66,66,0,0 1300 DATA 66,66,114,74,74,114,0,0,64,64 1310 DATA 124,66,66,124,0,24,66,70,74,82 1320 DATA 98,66,0,0,192,64,124,66,66,124 1330 DATA 0,0,76,82,114,82,82,76,0,0 2000 DATA "62213lnvalid file" 2010 DATA "65227<S>kip <U>pdate" 2020 DATA "59322FILE FULL!" 2030 DATA "END " После запуска программы оператором RUN русифицированный кодо- вый блок дисковой версии Masterfile создается автоматически. Для модифи- кации кассетного варианта после появления запроса Insert source cassette за- пустите на воспроизведение кассету с исходной версией Masterfile и нажми- те любую клавишу. После создания в памяти компьютера кассетного вари- анта русифицированного кодового блока на экране появится запрос Insert destination cassette. Последующие действия тривиальны: включите магни- тофон на запись и нажмите любую клавишу. Если Вы недостаточно внимательно вводили информацию в операто- рах DATA, программа выдаст сообщение Error in DATA. Проверьте текст, исправьте ошибки и снова запустите программу. ПРОГРАММА-ЗАГРУЗЧИК Загрузчик предназначен для работы с русифицированным (указан- ным выше способом) вариантом Masterfile. Для дисковой версии он выгля- дит так: 1 STOP 10 CLEAR VAL "56980" 20 LET e=USR VAL "15619": REM : CAT 30 IF e<> NOT PI THEN CLS : PRINT "Fault in catalogue": GO SUB VAL "200": GO TO SGN PI 40 INPUT "Enter filename (or press Enter): "' LINE c$ 50 IF c$="" THEN LET c$="MF rus" 60 LET e=USR VAL "15619": REM : LOAD c$ 70 IF e=SGN PI THEN CLS : PRINT "File not found": GO SUB VAL "200": GO TO EXP PI-PI 80 CLS : PRINT "Can't load file!": GO SUB VAL "200": STOP 200 BEEP SQR PI/PI.PI: RETURN Для кассетной версии нужно удалить строки 20, 30, 70, 80, 200, а строку 60 заменить на 60 LOAD c$. Загрузчик записывается на магнитный носитель: для кассетной версии: SAVE "MF" LINE 10 для дисковой версии: RANDOMIZE USR 15619: REM : SAVE "MF" LINE 10 Работает загрузчик следующим образом. Сначала на экран выводится каталог диска (только для дисковой версии), затем на запрос Enter filename (or press Enter): нужно ввести имя персонализированного Masterfile, хранящего требуемую базу данных (если просто нажать Enter, то будет загружен файл MF rus — «чистая» программа Masterfile). 59
АРХИТЕКТУРА ZX SPECTRUM Решив заняться программированием, Вы рано или поздно пойме- те, что написать действительно серьезную программу для ZX Spectrum на Бейсике, Паскале и прочих языках «повышенного» уровня практиче- ски невозможно. Все удобства, предоставляемые этими языками, сво- дятся «на нет» низким быстродействием и большим объемом написан- ных на них программ. Только работая непосредственно с командами процессора, Вы сможете создавать программы, не уступающие фирмен- ным. Но для этого необходимо серьезно изучить архитектуру ZX Spectrum, систему команд процессора Z80, уметь пользоваться сред- ствами написания и отладки программ в кодах. Эта и последующие главы книги, в отличие от предыдущих, рассчитаны на более подготовленного читателя. Однако мы старались как можно доступнее излагать материал, кратко поясняя используемые термины и не употребляя малопонятных выражений. Надеемся, что даже неспециалисты, пользуясь сведениями, почерпнутыми из этого раздела книги, смогут начать программировать на ассемблере, а про- фессионалы получат в руки подробный справочник по ZX Spectrum. Внутренняя структура ZX Spectrum ничем существенно не отличается от строения других компьютеров (рис. 9). Работой всех устройств управляет центральный процессор (ЦП). Он связан с осталь- ными блоками компьютера через ши- ны адреса, данных и управления. Па- мять разделена на две области: ПЗУ {постоянное запоминающее устройст- во) объемом 16К и ОЗУ {оперативное запоминающее устройство) — 48К. В ПЗУ «зашита» операционная система ZX Spectrum. Блок управления внешни- ми устройствами обеспечивает связь процессора с клавиатурой, телевизо- ром, магнитофоном и т. д. |Магнигофон| | Телевизор] Рис. 9. Структурная схема ZX Spectrum. Речь пойдет только о компьютерах, выпущенных фирмой Sinclair Re- search Ltd. Архитектура остальных разновидностей Zx Spectrum, вклю- чая машины фирм Amstrad и Timex, может несколько отличаться от базовой модели. Кроме того, следует иметь ввиду, что на конфигурацию ZX Spectrum могут влиять подключаемые к компьютеру периферийные устройства. 60
АРХИТЕКТУРА ZX SPECTRUM ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР Одной из причин успеха, постигшего ZX Spectrum, было применение в качестве ЦП микропроцессора Z80 (полное название — Z80A CPU) амери- канской фирмы Zilog. В основе разработки этой микросхемы лежала идеология построения одного из самых распространенных в свое время 8-разрядных процессоров — 18080 (советский аналог — КР580ВМ80А). В Z80 увеличено число регистров, дополнена система прерываний и, самое главное, существен- но расширена система команд (в частности, за счет добавления команд, обрабатывающих блоки данных). Все это позволило повысить производитель- ность процессора при одновременном уменьшении размера программ. АЛУ А' Н' В' D' F' L# С Е' Блок регистров A F IX IY SP ттт PC Дешифратор команд и сигналов управления I Блок управления шиной данных Л_1\| Блок управления адресной шиной -V\ Сигналы управления Шина данных Шина адреса Рис. 10. Структурная схема микропроцессора Z80. Структурная схема Z80 (рис. 10) включает в себя: арифметико-логи- ческое устройство (АЛУ), блок управления шиной данных, блок регистров, блок управления адресной шиной, дешифратор команд и сигналов управления. Все узлы связаны внутренней шиной данных. Для обращения процессора к памяти и внешним устройствам слу- жит 16-разрядная шина адреса (ее разряды обозначаются от АО — млад- ший разряд до А15 — старший). Следовательно, процессор может непос- редственно обратиться (в зависимости от обрабатываемой команды) либо к 216 =65536 ячейкам памяти, либо к такому же количеству внешних устройств (портов). Обмен информацией Z80 с памятью и портами осуществляется через 8-разрядную шину данных (разряды обозначаются D0...D7). Для хранения и обработки чисел, больших 255 (2*— 1), используются две или более ячейки памяти, расположенные одна за другой. РЕГИСТРЫ Z80 Регистры данных и аккумулятор Микропроцессор Z80, в отличие от 18080, работает с двумя наборами регистров — основным и альтернативным. Оба набора состоят из семи 61
РЕГИСТРЫ Z80 АРХИТЕКТУРА ZX SPECTRUM 8-разрядных регистров данных и флагового регистра. Регистры основного набора обозначаются буквами Аг Вг С, D, E, H, L и F (флаговый). Регистры альтернативного набора соответственно — А\ В\ С, D\ Er, Н\ I/ и F\ Для пользователя эти наборы совершенно идентичны, и знак ' (апостроф) озна- чает лишь то, что в данный момент регистр не является активным. С помощью специальных команд можно переключать работу процессора с одного набора регистров на другой. Но выяснить, какой из наборов активен в данный момент, невозможно. Для выполнения многих команд обрабатываемые данные должны быть занесены в специальный регистр — аккумулятор А. Команды, обрабатывающие 16-разрядные числа, используют пары ре- гистров в следующих сочетаниях: ВС, DE, HL, AF и, соответственно, ВС, DE', HL', AF'. При этом в регистры В, D, Н, А, В', D', Нг, А' записывается старший байт числа, а в С, Е, L, F, С, Er, L' и F' — младший. Спаренные регистры можно использовать, например, для хранения и обработки адресов ячеек памяти. Счетчик команд Выполнив очередную команду, процессор должен знать, откуда ему взять следующую. За этим следит 16-разрядный регистр счетчика команд VC При последовательном выполнении программы после считывания из памяти каждого байта команды значение PC увеличивается на единицу. Если коман- да требует от процессора перейти не к следующей, а какой-либо другой ячейке памяти (например, команда вызова подпрограммы), в PC записыва- ется адрес этой ячейки. Индексные регистры Важной особенностью Z80 является возможность обращаться к ячей- кам памяти, указывая смещение их адреса относительно содержимого 16- разрядных индексных регистров IX и IY. Смещение может быть задано числом в пределах -128...+127. Указатель стека 16-разрядный регистр указателя стека SP содержит адрес вершины стека. Как известно, стек — это специальная область памяти, предназначен- ная для временного хранения данных. В Z80 он организован по принципу LIFO* — помещенные в стек одно за другим несколько чисел извлекаться из стека будут в обратной последовательности. Особенностью Z80 является то, что стек «растет» в сторону уменьшения адресов. При каждой записи в стек значение регистра SP уменьшается на 2, а при извлечении числа увеличи- вается на 2. «Общение» со стеком обычно происходит посредством регист- ровых пар. В стеке также автоматически сохраняется адрес возврата при вызове подпрограмм. Регистр флагов После выполнения ряда команд в соответствии с результатом опера- ции изменяется содержимое флагового регистра F (рис. 11). Флагом называется отдельный бит этого регистра. Флаг считается уста- _ши_^_11_11__вяивяш1__и_ новленным, если в соответствующем бите запи- | S | z [ х | Н [ х | P/V 1N [ С | сана единица, и сброшенным, если записан ноль. '_' Значимыми являются 6 из 8 битов регистра F: Рис. 11. Регистр флагов. *) Last In First Out — первым пришел — последним вышел {англ!). 62
АРХИТЕКТУРА ZX SPECTRUM ВНЕШНИЕ УСТРОЙСТВА Z (zero) — флаг нуля. Устанавливается, если результат операции равен нулю; P/V (parity/overflow) — флаг четности/переполнения. В логических опе- рациях устанавливается при получении четного результата, в ариф- метических — при переполнении (изменении знака) операнда; CY (carry) — флаг переноса. Устанавливается, если в итоге выполнения арифметических операций произошел перенос либо заем старшего бита; N (negative) — флаг отрицательного результата. Устанавливается при получении отрицательного результата арифметической операции; Н (half-carry) — флаг вспомогательною переноса. Устанавливается, если про- изошел перенос (заем) в 4-й бит аккумулятора. Используется при прове- дении двоично-десятичной коррекции при работе с BCD-арифметикой*; S (sing) — флаг вычитания. Устанавливается, если предыдущей коман- дой было вычитание. В BCD-арифметике помогает определить тип предыдущей операции. Другие регистры Регистр вектора прерываний I используется во 2-м режиме обработки прерываний. Подробно о нем будет рассказано в разделе, посвященном прерываниям. Регистр регенерации динамической памяти R обслуживает в основном сшпаратные потребности компьютера, однако он все же может использовать- ся и для программных целей, например, при написании процедур, генери- рующих случайные числа. Младшие семь разрядов этого регистра увеличи- ваются на единицу после выполнения очередной команды (точнее — очеред- ного цикла) микропроцессора, старший разряд аппаратно не используется. ВНЕШНИЕ УСТРОЙСТВА Работа программиста превратится в бессмысленные математические упражнения при отсутствии связи компьютера с внешним миром, осущест- вляемой через порты. Хотя Z80 имеет 16-разрядную шину адреса, в ZX Spectrum при обраще- нии к большинству внешних устройств значащими являются только 8 младших разрядов. Например, для изменения цвета бордюра необходимо записать соот- ветствующее значение в порт с адресом %0000000011111110 (254)**, но если Вы запишете это же значение в порт %0000000111111110 (510), то получите тот же эффект. Разряды, не влияющие на выбор устройства, обычно обозна- чаются знаком х, и, таким образом, полный адрес упомянутого выше внешнего устройства записывается как xxxxxxxxl 1111110. Для упрощения аппаратной части в Speccy выбор внешних устройств осуществляется сбросом в ноль одного из разрядов адреса. Порт 254, например, выбирается при А0=0, порт 239 — при А2=0 и т. д. При разработке ZX Spectrum были сделаны следующие назначения для разрядов шины адреса: АО — клавиатура, магнитофон, динамик; А1 — не используется (в ZX Spectrum 48K); А2 — ZX Printer; A3 и А4 — Interface 1 и микродрайв. *) BCD — Binary Coded Decimal — двоично-десятичный код (англ.). **) Ниже для обозначения шестнадцатиричных чисел использован сим- вол #, двоичных — символ %. 63
ВНЕШНИЕ УСТРОЙСТВА АРХИТЕКТУРА ZX SPECTRUM Если несколько разрядов будут сброшены в ноль, окажутся выбран- ными одновременно несколько устройств. Разряды А5, А6 и А7 оставлены разработчиками для специального применения, но, в принципе, могут быть использованы для подключения дополнительных внешних устройств, например, джойстика. Разряды с А8 по А15 используются для сканирования клавиатуры (только при сброшенном АО). Хотя в фирменном ZX Spectrum для выбора внешнего устройства и не используются все разряды младшего байта адреса, тем не менее, во избежание различных накладок, в программах рекомендуется всегда указы- вать точный 8-разрядный адрес порта. Ниже рассмотрены стандартные порты ZX Spectrum. Для каждого порта указаны его десятичный и, в скобках, шестнадцатиричный и двоичный адреса. Порт 255 t#FF, %ii111i1i) Внешнего устройства с таким адресом в ZX Spectrum нет, поэтому из порта 255 считывается состояние «пассивной» шины данных. Благодаря оригинальному схемотехническому решению, в ZX Spectrum шина данных используется одновременно для двух процессов: работы Z80 и вывода ин- формации на дисплей. В момент формирования изображения из порта 255 считываются случайные значения (опыт показывает, что преимущественно считываются атрибуты отображаемого в данный момент знакоместа), а во время, не занятое выводом — значение 255.* Чтение из порта 255 в некоторых фирменных программах использу- ется для синхронизации относительно вывода на экран, и поэтому они отказываются работать на многих самоделках.** Порт 254 (#FE, %11111110) ZX Spectrum управляет магнитофоном, клавиатурой, цветом бордюра и динамиком через один-единственный порт с адресом 254. При записи байта в порт: биты D0...D2 определяют цвет бордюра: 000 (0) — черный 100 (4) — зеленый 001 (1) — синий 101 (5) — голубой 010 (2) — красный 110(6)— желтый 011 (3) — фиолетовый 111 (7) — белый; бит D3 управляет выходом на магнитофон. Манипулируя этим битом, программы обслуживания магнитофона формируют сигнал записи; бит D4 управляет звуковым каналом. Например, для того чтобы получить звук частотой 1 кГц, необходимо устанавливать и сбрасывать этот бит 1000 раз в секунду; биты D5...D7 не используются. *) На самом деле, если Вы попытаетесь обратиться по другим незадейство- ванным адресам портов, то получите аналогичный результат. **) В ZX Spectrum +3 схема отображения выполнена более грамотно, чем в Speccy, однако это стало причиной неполной совместимости с базовой моделью. Ряд программ, например, Short Circuit, на Spectrum +3 не работают. 64
АРХИТЕКТУРА ZX SPECTRUM ВНЕШНИЕ УСТРОЙСТВА При чтении байта из порта: биты D0...D4 обслуживают клавиатуру. Стандартная клавиатура ZX Spectrum состоит из 40 клавиш, которые разбиты на восемь рядов по пять кнопок в каждом (рис. 12). Для того, чтобы п о р т #F7FE #FBFE #FDFE #FEFE All A10 A9 A8 DO 1 Q A CS D1 2 W S z D2 3 E D X сброшенный D3 4 R F С D4 5 T G V D4 6 Y H В бит D3 7 и J N D2 8 1 К M D1 9 О L SS DO 0 Р EN SP А12 А13 А14 А15 #EFFE #DFFE #BFFE #7FFE n о p T Рис. 12. Организация клавиатуры ZX Spectrum. узнать, какая из клавиш ряда нажата, нужно прочесть байт из порта, полный 16-разрядный адрес которого задается так: младший байт адреса равен 254 (#FE), а в старшем байте сброшен в ноль один из разрядов, соответствующий выбранному ряду. Биты D0...D4 считанного байта указывают, какая из кнопок в ряду нажата — соответствующий бит будет сброшен. Например, чтобы узнать, нажата ли клавиша Enter, нужно проверить состояние бита DO в байте, считанном из порта #BFFE. бит D6 отображает состояние магнитофонного входа. Для получения ин- формации с магнитной ленты программа должна постоянно опраши- вать этот бит. Некоторые внешние устройства могут «эмулировать» порт 254. При- мер такого устройства — Interface 2. Помимо других своих функций* Interface 2 обслуживает попу- лярный тип джойстика «для Таблица I. Назначение клавиш двоих» — Sinclair Joystick. Этот Sinclair-джойстика, джойстик «запараллелен» с цифровыми клавишами кла- виатуры, так что если у Вас нет Interface 2, Вы все-таки можете использовать Sinclair-джой- стик, либо аппаратно подклю- чив его к соответствующим клавишам, либо имитировать его, работая этими клавишами как джойстиком. В табл. 1 по- казано соответствие между цифровыми клавишами и фун- кциями Sinclair-джойстика. Номер джойстика Адрес порта Функция влево (left) вправо (right) вниз (down) вверх (up) стрельба (fire) 1 #EFFE бит D4 D3 D2 D1 DO клавиша 6 7 8 9 0 2 #F7FE бит DO D1 D2 D3 D4 клавиша 1 2 3 4 5 Обращение к описанным ниже портам имеет смысл только при подключении к ZX Spectrum соответствующего интерфейса внешнего уст- ройства, например, принтера или джойстика. Interface 2 позволяет также использовать картриджи с ПЗУ, в которое при изготовлении записываются готовые программы. 5-1102 65
СИСТЕМА ПРЕРЫВАНИЙ АРХИТЕКТУРА ZX SPECTRUM Порт 251 I#FB, %11111011) Порт обслуживает стандартный для ZX Spectrum принтер — ZX Printer, драйвер которого «зашит» в ПЗУ компьютера. Некоторые интер- фейсы принтеров в тот момент, когда на адресной шине появляется адрес 251, «перехватывают» управление. Например, интерфейс ZX Lprint III с помощью драйверов из его собственного ПЗУ может через порт 251 управ- лять различными типами принтеров. Порт 247 (#F7, %111101111 Порт 239 (#EF, %11101111) Порт 231 |#Е7, %11100111) Порты устройства Interface 1, которое позволяет: соединять компью- теры в локальную вычислительную сеть; использовать стандартный интер- фейс RS—232C; подключать до восьми микродрайвов (накопителей на «бес- конечной» магнитной ленте), работать с которыми несколько удобнее, чем с магнитофоном. Однако в Союзе Interface 1 по разным причинам не получил распространения. Порт 31 t#1F, %00011111) Порт 31 служит для свя- Таблица 2. Биты состояния зи с самым распространенным kempston-джойстика. типом джойстика — Kempston Joystick. Старшие три бита (D5...D7) этого порта всегда сброшены в ноль — именно по этому условию некоторые про- граммы определяют, что kempston-джойстик подключен. Младшие биты (D0...D4) инди- цируют состояние джойстика (см. табл. 2). Несколько битов может быть устанбвлено одновременно. Например, если установлены биты DO, D3 и D4, то это означает, что джойстик находится в положении «влево-вниз» и нажата «стрельба». При нейтральном положении kempston-джойстика из порта 31 должен считываться ноль. СИСТЕМА ПРЕРЫВАНИЙ Прерывания являются необходимым средством для программирова- ния параллельных процессов. С их помощью, например, в ZX Spectrum одновременно с выполнением программы на Бейсике осуществляется ска- нирование клавиатуры и отсчет времени системным таймером. В процессоре Z80 имеется два аппаратных входа инициализации прерываний: INT — для маскируемых прерываний и NMI — для немаски- руемых. Маскируемые прерывания получили свое название благодаря воз- можности программно запрещать или разрешать реакцию на сигнал преры- вания, тогда как для немаскируемых прерываний это невозможно. При поступлении сигнала прерывания микропроцессор завершает выполнение текущей команды, помещает в стек адрес следующей и присту- пает к выполнению специальной программы, обслуживающей данное пре- рывание (за исключением режима 0 маскируемых прерываний). После завершения обработки прерывания процессор извлекает из стека адрес следующей команды и возвращается к выполнению прерванной программы. 66 установленный бит DO D1 02 D3 D4 состояние джойстика влево (left) вправо (right) вверх (up) вниз (down) стрельба (fire)
АРХИТЕКТУРА ZX SPECTRUM СИСТЕМА ПРЕРЫВАНИЙ Необходимым условием правильного функционирования программ обслуживания прерываний является их сбалансированная работа со стеком: к моменту возврата из прерывания стек должен быть в том же состоянии, в котором он находился к моменту прихода прерывания. Другим условием является сохранение всех регистров, задействованных в программе обслу- живания прерываний, и восстановление их значений при возврате из прерывания. Маскируемые прерывания В ZX Spectrum на вход INT процессора постоянно подается полукад- ровый синхронизирующий сигнал с периодом 1/50 секунды. В операцион- ной системе это используется для организации опроса клавиатуры и нара- щивания значения системного счетчика одновременно с работой интерпре- татора Бейсика. Управлять прохождением маскируемых прерываний можно команда- ми DI и EI, которые изменяют состояние специального внутреннего триггера микропроцессора IFF. Команда DI сбрасывает этот триггер, запрещая пре- рывания, EI устанавливает его, разрешая прерывания. При вызове маскируемого прерывания триггер IFF автоматически сбрасывается, запрещая повторный вызов прерываний. После обработки прерывания процессор не устанавливает триггер вновь — для разрешения прохождения последующих прерываний программист должен включить в программу команду EI. Z80 имеет три режима обработки маскируемых прерываний, которые устанавливаются командами процессора IM 0, IM 1 и IM 2. К сожалению, программным путем практически невозможно определить, в каком режиме обработки прерываний находится процессор в конкретный момент времени. Режим О Режим устанавливается либо командой IM 0, либо аппаратным сбросом процессора, и ничем не отличается от режима обработки прерываний в микропроцессоре 18080. По приходу сигнала INT процессор считывает с шины данных код команды (предварительно выставленный на шину внешним пре- рывающим устройством) и выполняет ее. В принципе, это может быть любая команда (чаще всего используются команды RST N или CALLaddr). Но ZX Spectrum устроен таким образом, что при вызове прерывания в режиме 0 с шины данных всегда считывается значение 255 (#FF) — код команды RST 56. И, следовательно, для ZX Spectrum этот режим аналогичен режиму 1.* Режим 1 Устанавливается командой IM 1. По прерыванию процессор передает управление на ячейку с адресом 56 (выполняется команда CALL 56). Именно в этом режиме обрабатывает прерывания операционная система ZX Spectrum. Режим 2 Устанавливается командой IM 2. Режим дает возможность программи- сту самостоятельно обрабатывать прерывания, чем и интересен. При поступлении сигнала на прерывание, микропроцессор считыва- ет с шины данных байт, называемый вектором прерывания. ZX Spectrum устроен так, что вектор прерывания всегда равен 255 (#FF).** Он переда- ется в младший байт шины адреса, а в старший байт записывается *) Строго говоря, это не совсем так, см. примечание к режиму 2. **) Некоторые внешние устройства, например, AMX-mouse, могут генери- ровать вектор прерывания, отличный от 255. 5* 67
СИСТЕМА ПРЕРЫВАНИЙ АРХИТЕКТУРА ZX SPECTRUM содержимое регистра вектора прерываний I. По полученному таким образом адресу Z80 считывает из памяти два последовательно расположенных байта, которые интерпретируются процессором как адрес программы обработки прерывания (сначала считывается младший байт адреса, затем старший). Следовательно, выбрав режим прерываний 2 и задав значение регистра I, можно переопределить адрес процедуры обработки прерывания. Для задания адреса размещения программы обработки прерываний наиболее удобно использовать значения, считываемые из стандартного ПЗУ ZX Spectrum. При этом в регистр I нужно занести число в пределах от 0 до 63 (#00...#3F). Например, если в I содержится число 9, то адрес ячейки, из которой будет считан младший байт адреса программы обработки прерываний, равен 2559 (9x256+255). Старший байт, соответственно, будет считан по адресу 2560. В данном случае определить адрес, по которому необходимо разместить програм- му обработки прерываний, можно, выполнив строку на Бейсике: PRINT PEEK (2559)+256*РЕЕК (2560) Результат должен быть равен 65129. Это и есть адрес, по которому должна располагаться подпрограмма обработки прерываний. Определить все возможные считанные из ПЗУ адреса размещения процедур обработки прерываний можно с помощью следующей программы: 10 INPUT "Interrupt vector: ";l: REM вектор прерывания 20 PRINT I,PEEK (l*256+255)+256*PEEK (1*256+255+1) Уже рассчитанные адреса занесены в табл. 3. Возврат из маскируемых прерываний производится командой RETI. Она распознается специальными периферийными микросхемами*, что по- Таблица 3. Адреса процедур обработки прерываний. I 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 адрес 20430 52818 22269 39020 10419 02294 29149 16039 02088 65129 32802 58888 53183 52503 14367 27928 I 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 адрес 51984 08729 52481 49749 25705 51673 51568 12493 15582 23842 13824 07306 49947 02344 26573 03360 I 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 адрес 52513 33485 00544 49537 08527 23670 20444 00288 32348 58154 19754 23653 07117 55781 23713 04569 I 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 адрес 60208 57640 13627 13256 01560 57124 34307 41231 65535 65535 65535 65535 00255 00000 00255 00060 Фирмой Zilog были разработаны микросхемы, входящие совместно с Z80 CPU в комплект под общим названием Z80. 68
АРХИТЕКТУРА ZX SPECTRUM СИСТЕМА ПРЕРЫВАНИЙ зволяет организовать многоуровневую систему прерываний. Но, поскольку в ZX Spectrum эта система не используется, то вернуться из прерывания можно и по команде RET. Немаскируемые прерывания Немаскируемое прерывание вызывается при поступлении сигнала на вход NMI процессора. При этом выполнение основной программы приоста- навливается, и управление передается на ячейку с адресом 102 (#66) (выполняется команда CALL 102). В ZX Spectrum немаскируемое прерывание не задействовано, но оно может вызываться некоторыми внешними устройствами. При этом вместо стандартной «прошивки» подключается ПЗУ вызвавшего прерыва- ние устройства, в котором записана программа обработки прерывания. Этот принцип используется, например, в дисковой системе Beta Disk фирмы Technology Research и интерфейсе Multiface One фирмы Romantic Robot. При входе в немаскируемое прерывание сбрасывается триггер IFF, и, следовательно, запрещается вызов маскируемых прерываний. Возврат из немаскируемого прерывания и восстановление состояния регистра IFF происходит по команде процессора RETN. Следует отметить, что на самом деле Z80 имеет два триггера, участву- ющих в обработке прерываний: IFF1 и IFF2. Триггер IFF1 используется для управления разрешением маскируемых прерываний, a IFF2 хранит его состояние при обработке немаскируемых. Состояние триггера IFF2 отража- ется битом P/V флагового регистра после выполнения команд LD А,1 или LD A,R. Состояния триггеров IFF1 и IFF2 в различных режимах работы процессора приведены в табл. 4. Действие сигнал RESET команда DI команда EI сигнал INT команда RETI сигнал NMI команда RETN команда LD А, команда LD А, Таблица 4. Состояния триггеров 1 R 0- 0 -» 1 -» 0 -» IFF2 0 - IFF2 IFF1 IFF1 IFF1 IFF1 IFF1 -» IFF1 IFF1 -* IFF1 не изменяется не изменяется IFF2 0 -» IFF2 0 -» IFF2 1 - IFF2 0 -+ IFF2 не изменяется IFF1 - IFF2 не изменяется не изменяется не изменяется IFF1 и IFF2. Примечание устанавливает режим 0 запрещает прерывания разрешает прерывания маскируемое прерывание возврат из маскируемого прерывания немаскируемое прерыва- ние возврат из немаскируемо- го прерывания IFF2 -* P/V IFF2 -» P/V 69
ОРГАНИЗАЦИЯ ПАМЯТИ АРХИТЕКТУРА ZX SPECTRUM ОРГАНИЗАЦИЯ ПАМЯТИ Постоянное запоминающее устройство ZX Spectrum имеет объем 16К и занимает младшие адреса памяти #0000...#3FFF. В нем расположены: тест, проверяющий работоспособность компьютера при включении питания; интерпретатор языка Бейсик; знакогенератор; программы, обеспечивающие вывод на экран, связь процессора с клавиатурой и др. Некоторые внешние устройства могут отключать стандартное ПЗУ, заменяя его своей памятью. Остальные 48К адресного пространства занимает оперативное запо- минающее устройство (адреса #4000...#FFFF). Причем в большинстве слу- чаев для пользовательских программ не может быть отведено все простран- ство ОЗУ — часть его используется под экранную область и область систем- ных переменных Бейсика. В табл. 5 приведена карта распределения памяти ZX Spectrum. Спра- ва указаны физические адреса областей памяти, расположение которых жестко фиксировано. Адреса других областей могут меняться в зависимости от наличия внешних устройств и работающих в данный момент программ. Местоположение этих областей определяется системными переменными (см. «Системные переменные»), имена и адреса которых приведены в таб- лице слева. Области, наличие которых не обязательно для работы операци- онной системы ZX Spectrum, отмечены тонкими линиями. Экранная область памяти Размер экрана в ZX Spectrum составляет 256 точек по горизонтали и 192 по вертикали. Операционной системой вывод символов на экран осуществляется в стандартные знакоместа 8x8 точек. Таким образом, экран делится на 24 символьные строки по 32 знакоместа в каждой (см. рис. 13). Номер строки Рис. 13. Строение экрана ZX Spectrum. 70
АРХИТЕКТУРА ZX SPECTRUM ОРГАНИЗАЦИЯ ПАМЯТИ (23732) RAMP T (23675) UDG (23730) RAMTOP (23613) ERR_SP (23653) STKEND (23651) STKBOT (23649) WORKSP (23641) E_LINE (23627) VARS (23635) PROG (23631) CHANS Таблица 5. Распределение памяти ZX Spectrum. Область размещения символов, определяемых пользователем (User Defined Graphics) #FFFF Область, недоступная операционной системе. Обычно используется программистом для разме- щения программ в кодах Байт-разделитель (#ЗЕ) Стек оператора GO SUB. Используется исключи- тельно при организации подпрограмм Адрес программы обработки ошибки (2 байта) Стек операционной системы Стек калькулятора Рабочая область операционной системы Байт-разделитель (#80) Буфер строчного редактора интерпретатора Бей- сика. Строка, расположенная в буфере, заканчи- вается символом перевода строки (#0D) Байт-разделитель (#80) Имена и значения переменных бейсик-прогаммы Текст бейсик-программы Байт-разделитель (#80) Область размещения информации о каналах Область, используемая дисковой операционной системой TR-DOS Системные переменные Interface 1 Системные переменные операционной системы Буфер принтера (256 байт) Область атрибутов экрана (768 байт) Область экрана (6К) ПЗУ (16К) #5СВ6 #5С00 #5В00 #5800 #4000 #0000 Для вывода изображения используется экранная область памяти объ- емом 6К и область атрибутов — 768 байт. Каждый байт экранной области определяет состояние 8 расположенных горизонтально одна за другой точек (бит 7 соответствует левой точке, бит 0 — правой). Если какой-либо бит в байте установлен, то точка, определяемая этим битом, принимает цвет тона, если бит сброшен — цвет фона. Байты, соответствующие строкам экрана, расположены в памяти не последовательно. Первые 32 байта экранной области задают слева направо верхнюю строку, следующие 32 байта — 9-ю сверху, следующие — 17-ю и далее через 8 строк вплоть до 57-й. Затем расположены байты, соответствующие строкам 2-й, 10-й и т. д. до 58-й. Таким образом, со смещением на одну и шагом в 8 строк задаются верхние 64 строки, то есть треть экрана. Аналогично, начиная соответственно с 65-й и 129-й строк, определяются средняя и нижняя трети экрана. 71
ОРГАНИЗАЦИЯ ПАМЯТИ АРХИТЕКТУРА ZX SPECTRUM В ZX Spectrum атрибуты (цвет тона, цвет фона, яркость и мерцание) задаются не для отдельной точки, а для знакоместа. Каждому знакоместу в области атрибутов соответствует один байт, в котором: Биты D0...D2 определяют цвет тона; Биты D3...D5 определяют цвет фона; Бит D6 установлен в режиме повышенной яркости (задается одновремен- но и для тона, и для фона); Бит D7 установлен в режиме мерцания. Байты атрибутов расположены в памяти последовательно. Первые 32 байта атрибутов соответствуют верхней символьной строке, следующие 32 — второй символьной строке сверху и далее до конца экрана. Приведенные ниже программы помогут Вам разобраться со строени- ем экрана ZX Spectrum. Первая из них демонстрирует соответствие битов ячейки памяти экранной области точкам на экране: 10 BORDER 5: PAPER 7: INK 9: CLS : REM подготовка экрана 20 INPUT "bit numbers 0...7 ";b: REM ввод номера бита 30 LET n=2 f b: REM вычисление «веса» бита 40 POKE 16384,n: REM запись байта, содержащего установленный в единицу бит, в первую ячейку экранной области 50 GOTO 20 Следующая программа закрашивает экран, последовательно записы- вая в ячейки экранной области значение 255. Работу программы можно приостановить, нажав любую клавишу. 10 BORDER 5: PAPER 7: INK 9: CLS : REM подготовка экрана 20 FOR a= 16384 TO 22527: REM переменная а перебирает все адреса экранной области 30 PRINT AT 6,6;" ";АТ 6,6;а;: REM вывод адреса 40 РОКЕ а,255: REM запись в экранную область по адресу а 50 IF INKEY$<>"" THEN GO TO 50: REM пауза 60 NEXT a: REM завершение цикла Соответствие байтов атрибутов знакоместам на экране демонстрирует следующая программа: 10 BORDER 7: PAPER 7: INK 7: CLS : REM цвет экрана белый 20 LET n=703: LET c=1: GO SUB 110: REM заполнение основного экрана 30 LET n=63: LET c=0: GO SUB 110: REM заполнение служебного экрана 40 FOR a=22528 TO 23295: REM а указывает адреса атрибутов 50 LET b=INT(a/256): REM b присваивается значение 0...255 60 POKE a,b: REM запись очередного значения в область атрибутов 70 PRINT PAPER 7; INK 0; AT 5,5;b;: REM печать b 80 IF INKEY$<>"" THEN GO TO 50: REM пауза 90 NEXT a: REM завершение цикла * 100 STOP : REM останов программы 110 FOR a=0 TO n: REM подпрограмма заполнения экрана 120 PRINT #c;"*";: REM заполнение экрана символом ♦ 130 NEXT a: REM завершение цикла 140 RETURN : REM возврат из подпрограммы заполнения экрана Буфер принтера Стандартный ZX Printer имеет одну иголку, которая в процессе печати последовательно проходит 256 позиций по горизонтали. Таким образом, символьная строка печатается за 8 проходов. Подготовка символьной строки к печати происходит в буфере принтера. 72
АРХИТЕКТУРА ZX SPECTRUM ОРГАНИЗАЦИЯ ПАМЯТИ Очень часто буфер принтера используется не по назначению, а как дополнительные 256 байт памяти, например, при адаптации программ к дисковым системам или для размещения загрузчиков. Но, занимая буфер под свою программу, следует учитывать, что она не будет работать на Spectrum 128, в котором область буфера принтера используется для разме- щения дополнительных системных переменных.* Каналы и потоки Операторы языка Бейсик, такие как PRINT, INPUT и некоторые другие, работают несколько сложней, чем это может показаться на первый взгляд. Выполните, например, оператор: PRINT #0;"Test message": PAUSE 0 Сообщение будет выведено на служебный экран. Если заменить число после символа # на 2, то вывод осуществится на основной экран, если подставить 3 — сообщение будет напечатано на принтере. Для достижения большей гибкости при организации ввода/вывода в ZX Spectrum нет твердо установленного соответствия между операторами ввода/вывода и внешними устройствами. Связь между ними устанавлива- ется с помощью системы каналов и потоков — каждый канал связан с конкретным устройством ввода/вывода, поток же указывает на канал, через который будут передаваться данные. Внешнее устройство | Информация о существующих каналах хранится в области ОЗУ, на которую указывает системная переменная CHANS (23631/32). Каждый канал задается так называемым описателем канала — блоком памяти, состо- ящем не менее чем из пяти ячеек этой области. Первые два байта описателя составляют адрес программы вывода на связанное с каналом внешнее устройство, следующие два — адрес программы ввода, пятый байт — символьное имя канала. Здесь же может храниться и другая информация о канале, но операционная система использует только упомянутые пять байт. Системная переменная CURCHL (23633/34) содержит адрес первого байта описателя текущего канала (канала, через который осуществляется ввод/вывод в данный момент). Записав в эту переменную адрес первого байта описателя другого канала, можно установить его текущим. При запуске компьютера операционной системой задаются четыре стандартных канала, которые обеспечивают: "К" — вывод на вспомогательный экран и ввод с клавиатуры; "S"( — вывод на основной экран; 11R" — запись байта в рабочую область памяти, адресуемую переменной K_CUR (23643/44); "Р" — вывод байта на ZX Printer. Описатели стандартных каналов занимают первые 20 байт в области информации о каналах. Их порядок менять не следует. Каналы "S", "R" и 11Р" работают только на вывод (при попытке ввода управление передается на подпрограмму обработки 'ошибок (#15С4), выдающую при этом сообщение J Invalid I/O device). При написании собственных процедур ввода/вывода, которые впос- ледствии будут «подключены» к какому-нибудь каналу, следует учитывать *) Работа с принтером в Spectrum 128 организована иначе. 73
ОРГАНИЗАЦИЯ ПАМЯТИ АРХИТЕКТУРА ZX SPECTRUM требования, предъявляемые к ним операционной системой ZX Spectrum. Обмен байтами (передача/прием) между операционной системой и подпрог- раммами ввода/вывода осуществляется через аккумулятор. Программа вво- да, кроме того, использует некоторые флаги: при получении байта устанав- ливает флаг переноса CY; если байт на данный момент не введен, флаг CY сбрасывается и устанавливается флаг Z; при обнаружении конца файла или ошибки сбрасываются флаги CY и Z, после чего системой будет выведено сообщение 8 End of file. Заметим, что при ожидании ввода (флаг Z установлен) система не контролирует клавишу Break, об этом нужно позаботиться в программе ввода. Программы ввода/вывода являются подпрограммами от- носительно операционной системы ZX Spectrum. В Бейсике не существует операторов для задания новых каналов, для этого необходимо написать специальную программу в кодах (или на Бейсике, используя оператор РОКЕ). Не рекомендуется «подключать» программы вво- да/вывода к уже существующим каналам (то есть помещать в описатель канала адреса новых программ ввода/вывода), лучше задать новый канал. Количество каналов ограничено лишь свободным пространством ОЗУ. Для осуществления ввода/вывода недостаточно только задать канал, необходимо еще и связать его с конкретным потоком. Только после этого, указывая в бейсик-операторах ввода/вывода номер потока (число, записываемое после символа #), через канал можно будет передавать и принимать информацию. В операционной системе ZX Spectrum имеется 19 потоков, которым присвоены номера от —3 до 15. После запуска компьютера системой откры- ваются (связываются с одним из каналов) 7 потоков с номерами от —3 до 3 — эти потоки переназначать не рекомендуется. Потоки от —3 до —1 недоступ- ны из Бейсика (хотя поток —3 связан с тем же каналом, что и потоки 0 и 1, а поток —2 — с тем же каналом, что и поток 2). Текущий поток устанавливается с помощью подпрограммы, расположенной по адресу #1601 (см. «Исполь- зование подпрограмм ПЗУ»). Информация о связи потоков с каналами хранится в области систем- ных переменных STRMS, начиная с адреса 23568 (#5С10). Первые две ячейки этой области указывают на канал, связанный с потоком —3, следую- щие две — с потоком —2 и т. д. В этих ячейках хранятся увеличенные на единицу смещения первого байта описателя канала, с которым связывается поток, относительно начала области информации о каналах (системная переменная CHANS). Если поток не связан ни с одним из каналов, ячейки обнулены, и считается, что поток свободен {закрыт). На рис. 14 приведена диаграмма связи потоков и стандартных каналов после запуска компьютера. № потока STRMS -3 23568 (#5С10) — #01 ,#00 - -2 23570 (#5С12) — #06,#00 - -1 23572 (#5С14) —#0В,#00 - 0 23574 (#5С16) — #01 ,#00 —■• 1 23576 (#5С18)-+#01,#00 —' 2 23578 (#5С1А)—#06,#00 3 23580 (#5С1С)— #10,#00 —| 4 23582 (#5С1Е)~#00,#00 (CHANS) > #F4,#09 #А8,#10 #4В Имя канала "К" 15 23604 (#5С34) — #00,#00 f- #F4,#09 #C4,#15 #53 "S" #81,#0F #C4,#15 #52 "R" #F4,#09 #C4,#15 #50 "P" #80 Маркер конца Рис. 14. Связь потоков и каналов. 74
АРХИТЕКТУРА ZX SPECTRUM ОРГАНИЗАЦИЯ ПАМЯТИ Для открытия потока из Бейсика служит оператор OPEN #n,"t", где п — номер потока (0..Л5), at — имя канала, связываемого с потоком. Напри- мер, после выполнения оператора OPEN #7/'S" при выводе в поток 7 информация будет передаваться в канал "S", то есть на основной экран: PRINT #7;"Printing in 7th stream" Поток п закрывается оператором CLOSE #п, например: CLOSE #7 Если после закрытия потока Вы попытаетесь вывести в него инфор- мацию, то получите сообщение об ошибке О Invalid stream. К сожалению, с помощью операторов OPEN и CLOSE могут быть подключены только каналы "S", "К" и "Р". При попытке использовать другие имена каналов выдается сообщение об ошибке*. Ввод информации осуществляется оператором INPUT #n либо функ- цией INKEY$ #n. Используя INPUT, помните, что оператор работает точно также, как и при вводе с клавиатуры. Например, выполнение INPUT #4;a$ приведет к тому, что перед передачей информации из потока 4 в переменную а$ через этот поток будут выведены две кавычки. Операторы LIST и PRINT по умолчанию выводят информацию в поток 2 (на экран), a LLIST и LPRINT — в поток 3 (на принтер), хотя при явном указании номера потока и те и другие могут использоваться для вывода на любое устройство (например, оператор LLIST #2 будет выводить листинг программы на экран). Формат хранения текста программы на Бейсике Строки бейсик-программы размещаются в порядке возрастания но- меров в области памяти, адрес начала которой задается системной перемен- ной PROG (23635/36). Они хранятся в следующем формате: ст. байт мп.байт ст.байт |~Номер' строки | Длина| строки| Текст ^строки | Байт #0Р| Номер строки может принимать значения от 0 до 9999 (правда, из Бейсика редактировать строку с номером 0 невозможно). Обратите внима- ние также на то, что номер записан «наоборот», то есть сначала размещается старший байт, а затем младший. Длина текста бейсик-программы рассчиты- вается с учетом символа перевода строки (код #0D). Текст строки хранится в виде кодов ASCII-символов и токенов — кодов операторов Бейсика (см. «Таблица символов»). Непосредственно после сим- вольной записи числа размещается его образ во внутреннем формате: байт #0Е и 5 байт собственно числа (1 байт порядка и 4 байта мантиссы). При записи пользовательской функции DEF FN после каждого параметра резер- вируются 6 байт для записи чисел в аналогичном формате. Формат хранения переменных В именах переменных бейсик-программы допускается использовать буквы латинского алфавита A..-Z и a...z (в числовых переменных могут также *) Некоторые внешние устройстваг например, Interface 1, могут перехваты- вать это сообщение и заменять стандартное ПЗУ своим, существенно расширяя возможности работы с каналами. 75
ОРГАНИЗАЦИЯ ПАМЯТИ АРХИТЕКТУРА ZX SPECTRUM использоваться цифры от 0 до 9). Интерпретатор Бейсика не делает различий между строчными и прописными буквами. Кроме того, пробелы в именах числовых переменных игнорируются, например, имена «Label 12» и «LABEL12» в программе будут указывать на одну и ту же переменную. После определения переменной в бейсик-программе она помещается в специально отведенную область памяти, адрес начала которой задается системной переменной VARS (23627/28). Порядок расположения перемен- ных соответствует последовательности их определения в программе. При записи переменных их тип задается тремя старшими битами первого байта формата: 010 — символьная переменная; 011 — числовая переменная с одним символом в имени; 100 — числовой массив; 101 — числовая переменная с несколькими символами в имени; 110 — символьный массив; 111 — переменная цикла FOR...NEXT. В остальные биты первого байта записываются младшие 5 бит имени переменной (если переменная многосимвольная, то младшие 5 бит первой буквы ее имени): 7 6 5 4 3 2 1 0 | Тип переменной | Младшие 5 бит имени переменной] Составленный подобным образом байт называется идентификатором переменной Числовые переменные (numeric variables) Имена числовых переменных в бейсик-программе могут состоять из неограниченного числа символов (букв или цифр), но первым символом имени обязательно должна быть буква. Хранение в памяти переменных, имя которых задано одним символом, и переменных с многосимвольным именем осуществляется в различных форматах. Для записи числовых переменных с односимвольным именем исполь- зуется 6 байт: 1 байт идентификатора и 5 байт под численное значение переменной во внутреннем формате: I Идентификатор] 1 байт порядка | 4 байта мантиссы] Формат размещения переменной с многосимвольным именем: Имя переменной, символы: 7 первый второй последний ч 5 байт | Идентификатор] Код символа | <;> | Код символа с установленным 7-м битом] значение | Числовой массив (numeric array) Имя числового массива может состоять только из одной буквы. Эле- менты массива хранятся в памяти последовательно в сторону увеличения индекса. Например, элементы массива S(2,3,4) (количество измерений — 3; 2 байта 1 байт 2 байта по 2 байта 5 байт по 5 байт Иденти- фикатор Общая длина Количество измерений Первая размерность Последняя размерность Первое Последнее! значение | 76
АРХИТЕКТУРА ZX SPECTRUM ОРГАНИЗАЦИЯ ПАМЯТИ первая размерность — 2; вторая — 3; третья — 4) в памяти будут распола- гаться в такой последовательности: (1,1,1),' (1,1,2); (1,1,3); (1,1,4); (1,2,1); (1,2,2); (1,2,3); (1,2,4); (1,3,1); ...; (1,3,4); (2,1,1); (2,1,2); ...; (2,3,4). При определении массива оператором Бейсика DIM всем его элементам присваивается нулевое значение. Управляющая переменная цикла FOR...NEXT (index variable) Имя управляющей переменной цикла FOR...NEXT может состоять толь- ко из одной буквы. Кроме идентификатора, начального и конечного значе- ний, а также шага цикла, запись переменной содержит номер строки оператора FOR и номер в строке оператора, следующего за FOR. Обратите внимание, что номер строки в этом случае хранится «правильно» — сначала младший, а затем старший байт. Иденти- фикатор 5 байт Значение 5 байт Конечное значение 5 байт Шаг 2 байта Номер строки 1 байт Номер следующего! оператора | Параметры цикла Координаты перехода Символьная переменная (string) Имя символьной переменной задается одной буквой, за которой следует знак $. Количество байт, отводимых для записи символьной пере- менной, не ограничено и равно длине строки, хранящейся в переменной в данный момент, плюс 3 байта (идентификатор и 2 байта длины текста). Если переменная принимает значение «пустой строки», под нее отводится только три байта (байты длины равны нулю). 2 байта | Идентификатор] Длина строки | Символы ^ строки J Символьный массив (character array) Имя символьного массива может состоять только из одной буквы. Его элементы хранятся в таком же порядке, что и элементы численного массива. При определении массива оператором Бейсика DIM всем его элемен- там присваивается значение 32 (#20) — код символа «пробел». Иденти- фикатор 2 байта Общая длина Т 1 байт Количество измерении \ 2 байта Первая размерность по 2 байта Последняя размерность 1 байт Первое значение Стек по ][ 1 байту Последнее! значение | / калькулятора Для вычислений значения выражений интерпретатор Бейсика ис- пользует подпрограмму калькулятора из операционной системы ZX Spectrum, которая вызывается инструкцией RST #28. Калькулятор орга- низован по стековому принципу — исходные значения для вычислений сначала помещаются в стек, а затем с помощью специальных команд над ними производятся необходимые действия. В стеке калькулятора сохраняют- ся также промежуточные результаты вычислений. 77
ОРГАНИЗАЦИЯ ПАМЯТИ АРХИТЕКТУРА ZX SPECTRUM Стек операционной системы Стек операционной системы — это стек микропроцессора Z80. Обыч- но его величина вполне достаточна для работы как бейсик-программ, так и подпрограмм в кодах, вызываемых из Бейсика. Размер области памяти, отводимой под стек, не должен быть меньше 80 байт, в противном случае будет выдано сообщение 4 Out of memory. Если в своей программе Вы переназначили указатель стека, то при возврате в Бейсик его значение необходимо восстановить. Стек оператора GO SUB Этот стек используется для сохранения адресов возврата при вызове подпрограмм оператором GO SUB. При выполнении каждого оператора GO SUB в стек помещаются три байта: номер следующего за GO SUB оператора (1 байт) и номер строки, в которой он расположен (2 байта). Область символов, определяемых пользователем При запуске системы область определяемых пользователем символов размещается в самом конце ОЗУ. Изменив значения переменной UDG, можно переместить область в любое место памяти (см. «Русификация ZX Spectrum», «Системные переменные»).
МИКРОПРОЦЕССОР Z80 СИСТЕМА КОМАНД Помимо 78 команд своего предшественника — микропроцессора 18080, в Z80 реализовано 80 новых. В целом он обрабатывает 696 кодов операций (с учетом использования в командах различных регистров, способов адресации и т. п.). Для каждой команды приведено мнемоническое обозначение на языке ассемблера, схема, поясняющая ее работу, и состояние флагового регистра после выполнения команды. При записи команд приняты следующие обозначения: А — 8-разрядный регистр аккумулятора; В, С, D, Е, Н, L — 8-разрядные регистры данных; I — 8-разрядный регистр вектора прерываний; R — 8-разрядный регистр регенерации динамического ОЗУ; AF — 16-разрядный регистр, старший байт которого содержит значение аккумулятора, а младший байт — значение флагового регистра; ВС, Dfc, HL — 16-разрядные спаренные регистры; IX, IY— 16-разрядные индексные регистры; SP — 16-разрядный регистр указателя стека; PC — 16-разрядный регистр счетчика команд; п — 8-разрядный операнд, непосредственно указанный в команде; пп — 16-разрядный операнд, непосредственно указанный в команде; (HL), (ВС), (DE) — 8-разрядные значения ячеек памяти, адреса которых содержатся в соответствующих регистровых парах; (пп) — в командах, оперирующих байтами: 8-разрядное значение ячейки памяти, адрес которой задается двумя байтами пп непосредственно в команде; (пп) — в командах, оперирующих 16-разрядными значениями: 16-разрядное значение смежных ячеек памяти, адрес пп первой из кото- рых (младшего байта значения) указан непосредственно в команде, адрес второй ячейки (старшего байта значения) равен пп+1; (IX+d), (IY+d) — 8-разрядные значения ячеек памяти, адреса которых вычисляются сложением значения соответствующего индексного ре- гистра и 8-разрядного смещения d, указанного непосредственно в команде; Ь — номер участвующего в операции бита (0...7); СС — условие, при истинности которого выполняется команда; е — 8-разрядное смещение относительно текущего адреса; CY — значение флага переноса; 79
СИСТЕМА КОМАНД Z80 | — состояние флага изменяется в результате операции; • — состояние флага не изменяется в результате операции,- 0 — флаг сбрасывается в результате операции; 1 — флаг устанавливается в результате операции; X — состояние флага не определено; V — флаг P/V индицирует арифметическое переполнение в результате операции; Р — флаг P/V индицирует «четность» в результате операции. Операнд, из которого берется значение для выполнения опера- ции, называется источником, а операнд, в который помещается резуль- тат — приемником. В мнемониках команд, использующих два операнда, первым, как правило, записывается приемник, затем, через запятую, — источник. В процессе выполнения команды содержимое источника не меняется. Если команда содержит один операнд, то он одновременно может быть и источником, и приемником. МЕТОДЫ АДРЕСАЦИИ После описания каждого метода адресации приведено по два примера его использования. Безоперандные команды. Для их выполнения процессору не требуется дополнительных значений: HALT NOP Регистровая адресация. Операнд содержится в регистре, который непосредственно указан в команде: INC A ADD HL.BC Непосредственная адресация. Операнд расположен в ячейке памяти, непосредственно следующей за кодом команды. Если операнд двухбайтовый, то он занимает две ячейки за кодом команды (расширенная непосредствен- ная адресация): LD С.%1011 LD Н1_,#1234 Неявная адресация. Регистр, в котором содержится операнд, однознач- но определен данной командой: RLA LDIR Регистровая косвенная адресация. Операнд расположен в ячейке памяти, адрес которой содержится в регистровой паре: DEC (HL) LD A,(BC) Далее по тексту для обозначения этого типа адресации будет исполь- зоваться фраза: «операнд расположен в ячейке, адресуемой регистром». Индексная адресация. Адрес размещения в памяти операнда образу- ется сложением значения индексного регистра и некоторого смещения (—1 28...+1 27), явно указанного в команде: SLA (IX+2) LD A,(IY-25) 80
СИСТЕМА КОМАНД Z80 Команды пересылок Косвенная адресация. Адрес операнда содержится в ячейках памяти, расположенных непосредственно за кодом команды: LD А,(1234) LD (#C000),DE Побитовая адресация. Командой задается конкретный бит операнда, над которым будет проводиться операция: SET 4,(HL) BIT 7,A Относительная адресация. Адрес задается как однобайтовое смещение (-128...+ 127) относительно текущего значения регистра счетчика команд*: JR $+#23 DJNZ $-6 Расширенная адресация. Адрес задается двухбайтовым операндом: CALL 1234 JP NC,#1601 Различные методы адресации могут быть совмещены в командах, работающих с двумя операндами: LD (HL),12 КОМАНДЫ Z80 Команды пересылок CY Z P/V S N Н LD r,s s -♦ г где г - А, В, С, D, Е, H, L; s - А, В, С, D, Е, H, L или n, (HL), (IX+d), (IY+d). . ~ . , CY z p/v S N H LD d,r r -► d где r - А, В, С, D, E, H, L или n; d - A, B, C, D, E, H, L или (HL), (IX+d), (IY+d). . ^ . CY Z P/V S N H LD A,s s - A LD d,A A - d где s и d - (ВС), (DE) или (nn). . rv A CY Z P/V S N H LD A,s s -► A • t iff t о о LD d,A A -> d где s и d - I или R. Пересылка байта из источника в приемник без изменений. Содержимое флагового регистра F не меняется. Исключение составляют команды *) Необходимо учитывать, что код смещения, содержащийся в коде команды и записанный в тексте ассемблера, будет различным. Ассемблер отсчи- тывает смещения относительно счетчика адресов $, хранящего адрес команды, тогда как микропроцессор использует содержимое регистра PC, увеличивающееся каждый раз при выборе очередного байта команды из памяти. 6-1102 . 81
Команды информационного обмена СИСТЕМА КОМАНД Z80 LD А,1 и LD A,R, которые отображают состояние триггера разрешения прерываний в бите четности/переполнения P/V регистра флагов. CY Z P/V S N Н LD dd,nn nn -* dd LD ddjnn) (nn) -+ dd где dd - ВС, DE, HL, SP, IX, IY. CY Z P/V S N H LD (nnj,ss ss -* (nn) где ss - ВС, DE, HL, SP, IX, IY. CY Z P/V S N H LD SP,ss ss -> SP где ss - HL, IX или IY. Пересылка двух байтов из источника в приемник без изменений. CY Z P/V S N Н PUSH ss SP - 2 - SP; ss -* (SP) где ss - ВС, DE, HL, AF, IX, IY. Запись содержимого регистра в стек. Значение указателя стека уменьша- ется на 2. CY Z P/V S N Н POP ss (SP) - ss; SP + 2 -> SP где ss - ВС, DE, HL, AF, IX, IY. Запись значения из стека в регистр. Значение указателя стека увеличи- вается на 2. Команды информационного обмена CY Z P/V S N Н EX DE,HL DE ~ HL Обмен содержимого регистров. В DE помещается содержимое HL, а в HL — содержимое DE. EX (SP|,ss (SP)~ss ? где ss - HL# IX, IY. Обмен со стеком» Значение вершины стека меняется местами с содержи- мым регистра ss (значение указателя стека не изменяется). Команды переключения набора регистров EX AF,AF' AF-AF °.Y ГС ! ?» Переключение регистров А и F на альтернативные. После выполнения этой команды все действия будут осуществляться над альтернативными регистрами А' и F'. Возвратиться к основному набору можно, повторно выполнив команду EX AF,AF\ Процессор не фиксирует, какой из двух наборов активен в данный момент. 82
СИСТЕМА КОМАНД Z80 Команды пересылки блока и команды поиска CY Z P/V S N Н EXX DE ~ DEf; HL ~ HLf; ВС - ВС Переключения активного набора регистров. Если ранее активным являлся основной набор (HL, DE, ВС), то после выполнения команды — альтерна- тивный (HL1, DE', ВС), и наоборот. Команда аналогична команде EX AF,AF'. Команды пересылки блока и команды поиска IDI HL+1 (HL) -» (DE) ■* HL; DE+1 BC-1 -» ВС DE CY Z P/V S N H • • % • 0 0 Пересылка содержимого ячейки памяти с инкрементом. Байт из ячейки, адресуемой регистром HL, пересылается в ячейку, адресуемую регистром DE, содержимое регистров HL и DE увеличивается на единицу, а регистра ВС уменьшается на единицу. Если в результате выполнения команды ВС=0, то флаг P/V сбрасывается, в противном случае P/V=l. LDIR (HL) -* (DE) HL+1 -» HL; DE+1 -» DE BC-1 -* ВС CY Z P/V S N H • • 0 • 0 0 Пересылка блока памяти с инкрементом. Действие аналогично команде LDI, только пересылается группа байт, расположенных в сторону увели- чения адресов от ячейки, адресуемой регистром HL. Количество переда- ваемых байт определяется регистром ВС. Аналогичного результата можно добиться, выполнив фрагмент программы: LOOP LDI JP PE.LOOP LDD HL -> (DE) HL-1 -> HL; DE-1 BC-1 -»► ВС DE CY Z P/V S N H ..$•00 Пересылка содержимого ячейки памяти с декрементом. Байт из ячейки, адресуемой регистром HL, пересылается в ячейку, адресуемую регистром DE, содержимое регистров HL, DE и ВС уменьшается на единицу. Если в результате выполнения команды ВС=0, то флаг P/V сбрасывается, в противном случае P/V=l. LDDR I (HL) -> (DE) HL-1 - HL; DE-1 -* DE BC-1 -»► ВС CY Z P/V S N H • • 0 «00 Пересылка блока памяти с декрементом. Действие аналогично команде LDD, только пересылается группа байт, расположенных в сторону умень- шения адресов от ячейки, адресуемой регистром HL. Количество переда- 83
Команды пересылки блока и команды поиска СИСТЕМА КОМАНД Z80 ваемых байт определяется регистром ВС. Аналогичного результата можно добиться, выполнив фрагмент программы: LOOP LDD JP PE.LOOP CPI А - (HL) HL+1 -> HL ВС-1 -> ВС CY Z P/V S N Сравнение значения аккумулятора с содержимым ячейки памяти с инкрементом. Ячейка памяти адресуется HL. Если A=(HL), устанавлива- ется флаг Z, в противном случае Z=0. После сравнения содержимое регистра HL увеличивается на единицу, а ВС на единицу уменьшается. Если в результате выполнения команды ВС=0, то флаг P/V сбрасывается, в противном случае P/V=l. CPIR CY Z P/V S • t t t HL+1 -♦ HL HL+1 -♦ HL BC-1 ■* ВС BC-1 -♦ ВС Поиск значения аккумулятора в блоке памяти с инкрементом. Начальный адрес блока задается регистром HL, длина — регистром ВС. Поиск производится в сторону увеличения адресов. При совпадении значения аккумулятора с содержимым ячейки памяти устанавливается флаг Z (если байт не найден — Z=0), регистр HL будет содержать адрес последу- ющей ячейки в блоке, а ВС — ее обратный порядковый номер. CPD А - (HL) HL-1 -* HL ВС-1 -* ВС CY Z P/V S N Н • t г г 1 t Сравнение значения аккумулятора с содержимым ячейки памяти с декре- ментом. Ячейка памяти адресуется регистром HL. Если A=(HL), устанавли- вается флаг Z, в противном случае Z=0. После сравнения значения реги- стров HL и ВС уменьшаются на единицу. Если в результате выполнения команды ВС=0, то флаг P/V сбрасывается, в противном случае P/V=l. CPDR CY Z P/V S N H • t t t 1 t нет HL-1 - HL HL-1 -> HL BC-1 -> ВС BC-1 -* ВС 84 Поиск значения аккумулятора в блоке памяти с декрементом. Конечный адрес блока задается в регистре HL, длина — в регистре ВС. Поиск производится в сторону уменьшения адресов. При совпадении значения аккумулятора с содержимым ячейки памяти устанавливается флаг Z
СИСТЕМА КОМАНД Z80 Команды бинарных операций (если байт не найден — Z=0), регистр HL будет содержать адрес предыду- щей ячейки в блоке, а ВС — ее порядковый номер. Команды бинарных операций Арифметические и логические операции над 8-разрядными операндами В качестве приемника в этой группе команд всегда служит аккумуля- тор, а символом s обозначены операнды — А, В, С, D, E, H, L, n, (HL), (IX+d), (IY+d). ADD A,s A + s -> A Арифметическое сложение. ADC A,s A + s + CY -* A Арифметическое сложение с переносом. SUB s A - s -* A Арифметическое вычитание. SBC A,s A - s - CY -* A Арифметическое вычитание с переносом. AND s A AND s -> A Поразрядное логическое «И». OR s A OR s -» A Поразрядное логическое «ИЛИ». XOR s A XOR s -*A Поразрядное исключающее «ИЛИ». CP s A - s Сравнение. Выполняет- ся аналогично коман- де SUB s, но результат вычитания не запи- сывается, а только в соответствии с ним изменяются биты флагового регистра. В табл. 6 приведены со- стояния флагов, соот- ветствующие результа- там сравнения, а также мнемоники условий, при выполнении кото- рых будет осуществ- ляться переход в коман- дах условного перехода. CY Z P/V S CY Z P/V S CY Z P/V S Ф Ф V ф CY Z P/V S $ $ V $ CY Z P/V S О t Р t CY Z P/V S О | Р t CY Z P/V S О $ Р $ CY Z P/V S N Н о $ N H о г N Н 1 ф N Н 1 $ N Н О О N Н О О N Н 1 $ Таблица 6. Результаты сравнения операндов. Результат сравнения A=s A*s Состояние флагов Z=1 Z=0 Мнемоника условия перехода Z NZ Беззнаковое сравнение (диапазон представления чисел 0...255) A<s A>s CY=1 CY=0 С NC Сравнение с учетом знака (диапазон представления чисел -128...+ 127) A<s A>s S=1 S=0 P M 85
Команды унарных операций СИСТЕМА КОМАНД Z8Q CY 1 P/V S N Н ADD HL,ss HL -I- ss - HL $ • • • о х Арифметически* и логические действия над 16-разрядными операндами > HUs HL где ss - ВС, DE, HL, > IX,SS IX - где si - ВС, DE, IX, SP, ADD .X,«s IX + ss.lX ??'<*! 8 5 ADD «M IY + ss -> 1Y 7 ? "<V ? « Й где is - ВС, DE. IYf SP. Арифметическое сложение* ADC HL,ss HL + ss + CY -> HL ? f %V f 8 x где ss - ВС, DE, HL, SP. Арифметическое сложение с переносом. SBC HLf*s HL - ss ^ CY - HL 7 f %V f V x где si - ВС, DE, HL, SP. Арифметические вычитание с переносом. Команды унарных операций В fpeX следующих командах преобразования производятся над чис- лом, записанным в аккумулятор. DAA BCD (А) .А 71 Т f ? У Преобразование числа в упакованный двоично-десятичный формат. Исполь- зуется обычно После операций над двойчНо-десятичными числами*. Пусть, например, нужно сложить два двоично-десятичных числа 15 и 39 (00010101 и 00111001 соответственно). LD А,%00010101 Ld С»%МШ001 ADD A(C ; А=%01001110 DAA ; А=%01010100 Согласно правилам дёойчной арифметики в результате сложения в аккумулятор будет помещено число #4Е, однако операция DAA скоррек- тирует это значение, и конечный результат составит 54. ***** "Г д CY Z P/V S N Н cpl а -* а .... 1 1 Преобразование числа в обратный код (все биты инвертируются). *) В двоично-десятичных Числах цифры от 0 до 9 кодируются четырьмя битами» причем комбинации 1010... 1111 не используются. Таким обра- зом в одном байте может быть записано только две цифры. Это расточи- тельно с точки зрения экономии памяти, но гарантирует отсутствие Ошибки «Машинного» округления.
СИСТЕМА КОМАНД Z80 Команды сдвига CY Z P/V S N Н neg о - а - а г г v t i г Преобразование числа в дополнительный код. :f cy -* cy Инвертирование значения флага переноса CY. F 1 - CY Установка флага переноса CY. d d-h 1 -* d где d - А, В, С, D, E, H, L, (HL), (IX+d), (IY+d). CY Z P/V S N H CCF CY -* CY j ... о x CY Z P/V S N H SCF 1 -* CY i ... о о CY Z P/V S N H INC d d + 1 -* d • t v t о t CY Z P/V S N H INC dd dd + 1 - dd где dd - ВС, DE, HL, SP, IX, IY. Инкремент (прибавление к значению операнда единицы). CY Z P/V S N Н DEC d d - 1 -* d • t v t 1 | где d - А, В, С, D, E, H, L, (HL), (IX+d), (IY+d). CY Z P/V S N H DEC dd dd - 1 - dd где dd - ВС, DE, HL, SP, IX, IY. Декремент (вычитание из значения операнда единицы). Команды сдвига В следующих четырех командах операция сдвига осуществляется над числом, записанным в аккумулятор. ^ , , . , CY Z P/V S N Н RLCA [cTbj^T^T^oVi t • • • о о Циклический сдвиг влево на один разряд, значение старшего бита запи- сывается во флаг переноса CY. CY Z P/V S N Н J ... О О Циклический сдвиг влево через флаг переноса CY. , . . . CY Z P/V S N Н 7-*A-oh—Evi г • • • о о Циклический сдвиг вправо на один разряд, значение младшего бита записывается во флаг переноса CY. , . , , CY Z P/V S N Н RRA Hz- A^ol—fcvU t ... о о Циклический сдвиг вправо через флаг переноса CY. 87
Команды циклического переноса СИСТЕМА КОМАНД Z80 В следующих семи командах операция сдвига осуществляется над числом, записанным в одном из операндов — А, В, С, D, E, H, L, (HL), (IX+d), (IY+d), обозначенных символом s. , , , , CY Z P/V S N H RLC s EyV-Hz-s-oH * * p * ° ° Циклический сдвиг влево на один разряд, значение старшего бита запи- сывается во флаг переноса CY. , , , . CY Z P/V S N Н RL s p-JcYb-ГГГГ^П^ * t р t о о Циклический сдвиг влево через флаг переноса CY. ^ , , , . CY Z P/V S N Н RRC s plz^s^ol-plcYi t t р t о о Циклический сдвиг вправо на один разряд, значение младшего бита записывается во флаг переноса CY. . . . . CY Z P/V S N Н RR S p|7^s^0| ^CY^ t t Р t О О Циклический сдвиг вправо через флаг переноса CY. , , , , CY Z P/V S N Н SLA s [cy)—| 7 <- s ^- о h-o Ф Ф р Ф о о Сдвиг влево на один разряд, в младший бит записывается 0, старший бит переписывается во флаг переноса CY (умножение на 2). , , , , CY Z P/V S N Н SRA s p| 7-^s^o |—^cy] t t p t о о Сдвиг вправо на один разряд, содержимое старшего бита не изменяется, младший бит переписывается во флаг переноса CY (деление на 2 со знаком). , . . . CY Z P/V S N Н SRL s о Н 7 -> s -> о]—{cy] t t р t ° ° Сдвиг вправо на один разряд, в старший бит записывается 0, младший бит переписывается во флаг переноса CY (деление на 2). Команды циклического переноса £ , л , CY Z P/V S N Н RLD A F-Hrnr^l (HL) • I P * О О Левый арифметический циклический перенос тетрады из аккумулятора в ячейку памяти, адресуемую регистром HL. Старшая тетрада (биты 7...4) ячейки памяти переносится в младшую тетраду аккумулятора (биты 3...0), младшая тетрада аккумулятора переносится в младшую тетраду ячейки памяти, а младшая тетрада ячейки памяти — в старшую тетраду ячейки памяти. 88
СИСТЕМА КОМАНД Z80 Команды операций над отдельными битами , 1—E=jj* rt . CY Z P/V S N H RRD a \7 л\г o| у 4|з o| (hl) » \ p X о о Правый арифметический циклический перенос тетрады из аккумулятора в ячейку памяти, адресуемую регистром HL. Старшая тетрада (биты 7...4) ячейки памяти переносится в младшую (биты 3...0), младшая тетрада ячейки памяти переносится в младшую тетраду аккумулятора, а младшая тетрада аккумулятора — в старшую тетраду ячейки памяти. Команды операций над отдельными битами — CY Z P/V S N Н BIT b,d db - Z • t x x 0 1 где d - A, B, C, D, E, H, L, (HL), (IX+d), (lY+d). Проверка состояния бита, номер которого задается числом b в пределах от 0 (младший) до 7 (старший). Результат проверки помещается в бит Z регистра флагов (если проверяемый бит равен нулю, то Z=l). CY Z P/V S N H SET b,d 1 - db где d - A, B, C, D, E, H, Lr (HL), (IX+d), (lY+d). Установка бита. В бит с номером b записывается единица. RES b,d 0^db C.Y где d - А, В, С, D, E, H, L, (HL), (IX+d), (lY+d). Сброс бита. В бит с номером b записывается ноль. Команды управления процессором ^ CY Z P/V S N Н NOP Нет операции. Регистры и флаги не изменяются (за исключением реги- стров PC и R), процессор переходит к выполнению следующей за NOP команды. halt C.Y ? Останов процессора. Выполнение команды HALT эквивалентно бесконечному выполнению команды NOP, но без изменения значения регистра счетчика команд PC. Выход из состояния останова происходит либо при аппаратном сбросе процессора, либо с приходом сигнала маскируемого или немаскиру- емого прерывания. После выполнения программы обработки прерывания, управление будет передано на ячейку, следующую за командой HALT. В ZX Spectrum команда HALT обычно используется для синхронизации выполнения программы относительно полукадровых прерываний, про- исходящих каждые 1/50 секунды. 89
Команды для работы с подпрограммами СИСТЕМА КОМАНД Z80 CY Z P/V S N Н DI 0 -> IFF1; 0 -> IFF2 Запрет маскируемых прерываний*. Сбрасывается триггер разрешения прерываний IFF. CY Z P/V S N H El 1 -* IFF1; 1 - IFF2 Разрешение маскируемых прерываний. Устанавливается триггер разре- шения прерываний IFF.** CY Z P/V S N H IM О IM 1 IM 2 Установка режима обработки маскируемых прерываний. Устанавливают- ся, соответственно, режимы 0, 1 или 2. Команды для работы с подпрограммами CALL nn SP - 2 - SP; PC - (SP); nn - PC ^ • P-V • ? " Безусловный переход к подпрограмме, расположенной по адресу пп, адрес следующей за CALL команды записывается в стек. CALL ccnn SP - 2 - SP; PC - (SP); nn - PC C.Y ♦ *? • • • (при выполнении условия ее) где ее — NZ — не ноль (флаг Z=0); Z - ноль (флаг Z=1); НС — нет переноса (флаг CY*=0); С - перенос (флаг CY«1); РО - нечетность (флаг P/V=0); РЕ - четность (флаг P/V=1); Р — положительное (флаг S«0); АЛ - отрицательное (флаг 5=1). Условный переход к подпрограмме, расположенной по адресу nn. Переход осуществляется при выполнении условия ее, в противном случае команда игнорируется и управление передается следующей команде программы. RET (SP) . PC; SP + 2 . SP ? 5'^ i ? » Безусловный возврат из подпрограммы. Управление передается команде, расположенной по адресу, извлекаемому из стека. CY Z P/V S N Н RET ее (SP) - PC; SP + 2 - SP (при выполнении условия ее) где се - NZ, Z, NC, С, РО, РЕ, Р, М (см. CALL cc,im). Условный возврат из подпрограммы. Возврат из подпрограммы происходит при выполнении условия ее, в противном случае команда игнорируется. *) Более подробно о командах, обслуживающих прерывания, см. «Архитек- тура ZX Spectrum». **) Следует отметить, что при выполнении команды EI запрещаются маски- руемые прерывания на время между этой и следующей командами. 90
СИСТЕМА КОМАНД Z80 Команды условного и безусловного перехода CY Z P/V S N Н RETI IFF2 -> IFF1; (SP) -> PC; SP+2 - SP Возврат из маскируемого прерывания. CY Z P/V S N М RETN IFF2 -» IFF1; (SP) - PC; SP+2 -» SP Возврат из немаскируемого прерывания. CY Z P/V S N Н RST p SP - 2 -> SP; PC -» (SP); p - PC где р - 0, 8, 16, 24, 32, 40, 48 или 56. Командное прерывание. Безусловный переход к подпрограмме, расположен- ной по фиксированному адресу р; выполняется аналогично команде CALL p. Команды условного и безусловного перехода CY Z P/V S N Н JP пп nn -> PC Безусловный переход по абсолютному адресу. Управление передается команде, расположенной по адресу пп. .* г,,- CY Z P/V S N Н JP сс,пп пп -> PC ...... (при выполнении условия ее) где ее - N2, 1, NC, С, РО, РЕ, Р, М (см. CALL cc,nn). Условный Переход по абсолютному адресу. Передача управления проис- ходит только при выполнении условия ее, в противном случае выполня- ется следующая команда программы. JR е РС + е-РС ? УС \ ". ". где е — смещение относительно текущего адреса. Безусловный переход по относительному адресу. Управление передается команде, расположенной по адресу, полученному прибавлением смеще- ния е к текущему значению счетчика команд. JR сс,е РС + е^РС ™ У? \ н. *. (при выполнении условия ее) где е — смещение относительно текущего адреса; ее — NZ — не ноль (флаг Z=0); Z — ноль (флаг Z=1); NC - нет переноса (флаг CY=0); С — перенос (флаг CY=1). Условный переход по относительному адресу. Передача управления про- исходит только при выполнении условия ее, в противном случае выпол- няется следующая команда программы. IP Us) ss - PC C.Y где ss - HL, IX или IY. Безусловный переход но адресу, содержащемуся в регистре ss. 91
Команды ввода-вывода СИСТЕМА КОМАНД Z80 В-1 -* В CY Z P/V S N Н DJNZ е PC да Условный переход по относительному адресу при ненулевом счетчике. Значение регистра В уменьшается на единицу. Если при этом В*0, то осуществляется переход по адресу РС+е , в противном случае управление передается следующей команде программы. Команда удобна для органи- зации циклов, счетчиком повторения в которых служит регистр В. Команды ввода-вывода , % су г p/v s n н IN А,(п) (А - А15...А8; п - А7...А0) - А где п — номер порта. Ввод байта из порта и помещение его в аккумулятор. Полный 16-разряд- ный адрес порта составляется из значения п (младший байт) и значения аккумулятора (старший байт). IN г,(С) (В -> А15...А8; С - А7...А0) - г C«Y f PpV f о J где г - А, В, С, D, E, H, L. Ввод байта из порта и помещение его в регистр. Адрес порта содержится в регистре ВС (в С — младший байт адреса, В — старший). Далее вместо подобного словосочетания будет использоваться фраза «порт адресуется регистром ВС». IN (HL),(C) F (В -> А15...А8; С -> А7...А0) • t pV I 0 J Ввод байта из порта с выставлением флагов. Адрес порта задается реги- стром ВС. Команда аналогична команде IN гДС), но при ее выполнении принятый байт никуда не записывается, а только в зависимости от его значения изменяются биты флагового регистра. |N| (В -> А15...А8; С -> А7...А0) -> (HL) CXY t P^V х V х |Г" HL+1 -» HL; В-1 -* В х ; х х 1 х Ввод байта из порта в ячейку памяти с инкрементом. Байт считывается из порта, адресуемого регистром ВС, и записывается в ячейку памяти, адресуемую регистром HL. После выполнения команды содержимое HL увеличивается на единицу, значение В на единицу уменьшается. Если в результате выполнения команды регистр В обнуляется, то устанавлива- ется флаг Z, в противном случае Z=0. INIR (В -* А15...А8; С -» А7...А0) -» (HL) С? ? ?/У * У " HL+1 -» HL; В-1 -» В х 1 х х 1 х Ввод массива значений из портов в память с инкрементом. Адреса портов задаются регистром ВС, начальный адрес массива памяти — регистром HL, ввод осуществляется в сторону увеличения адресов, количество принима- емых байт равно значению регистра В. После приема очередного байта содержимое В уменьшается на единицу, HL увеличивается на единицу. 92
СИСТЕМА КОМАНД Z80 Команды ввода-вывода IND (В -+ А15...А8; С -* А7...А0) -* (HL) HL-1 -+ HL; B-1 -* В CY Z P/V S N X 1 X X 1 Ввод байта из порта в ячейку памяти с декрементом. Байт считывается с порта, адресуемого регистром ВС, и записывается в ячейку памяти, адресуемую регистром HL. После выполнения команды содержимое регистров HL и В уменьшается на единицу. Если в результате выполне- ния команды В обнуляется, то устанавливается флаг Z, в противном случае Z=0. INDR (В -+ А15...А8; С -+ А7...А0) -* (HL) HL-1 -+ HL; В-1 -* В CY Z P/V S N Н X 1 X X 1 X Ввод массива значений из портов в память с декрементом. Адреса портов задаются регистром ВС, начальный адрес массива памяти — регистром HL. Ввод осуществляется в сторону уменьшения адресов, количество принимаемых байт равняется значению регистра В. После приема оче- редного байта содержимое регистров В и HL уменьшается на единицу. OUT |п),А А -» (А - А15...А8; п - А7...А0) ^ • ?/* • ? • где п — номер порта. Вывод байта из аккумулятора в порт с номером п. Полный 16-разрядный адрес порта составляется из значения п (младший байт) и значения аккумулятора (старший байт). CY Z P/V S N Н OUT (С),г г -> (В -* А15...А8; С -* А7...А0) где г - А, В, С, D, E, H, L. Вывод байта из регистра г в порт, адресуемый регистром ВС (С — младший байт адреса, а В — старший). OUTI (В -* А15...А8; С -*• А7...А0) -* (HL) HL+1 -* HL; В-1 -* В CY Z P/V S N X $ X X 1 Вывод байта из ячейки памяти в порт с инкрементом. Байт считывается из ячейки памяти, адресуемой регистром HL, и пересылается в порт, адресуемый регистром ВС. После выполнения команды содержимое HL увеличивается на единицу, значение В уменьшается на единицу. Если в результате выполнения команды регистр В обнуляется, то устанавлива- ется флаг Z, в противном случае Z=0. OTIR (HL) -* (В- А15...А8;С HL+1 -* HL; В-1 - ► А7...А0) В CY Z P/V S N Н X 1 X X 1 X Вывод массива из памяти в порты с инкрементом. Адреса портов задаются регистром ВС, начальный адрес массива — регистром HL. Вывод осуществ- ляется в сторону увеличения адресов, количество передаваемых байт равно 93
Недокументированные команды СИСТЕМА КОМАНД Z80 значению регистра В. После передачи очередного байта содержимое регистра В уменьшается на единицу, регистра HL увеличивается на единицу. OUTD (В - А15...А8; С -* А7...А0) -* (HL) CXY ? Р{У * У UUTD HL-1 -* HL; B-1 -* В х I х х 1 Вывод байта из ячейки памяти в порт с декрементом. Байт считывается из ячейки памяти, адресуемой регистром HL, и пересылается в порт, адресуемый регистром ВС. После выполнения команды содержимое регистров HL и В уменьшается на единицу. Если в результате выполне- ния команды В обнуляется, то устанавливается флаг Z, в противном случае Z=0. OTDR (HL) - (В - А15...А8; С -* А7...А0) ^Y ? Р(У * V к HL-1 - HL; В-1 -* В X 1 х х 1 X Вывод массива из памяти в порты с декрементом. Адреса портов задаются регистром ВС, начальный адрес массива — регистром HL. Вывод осуще- ствляется в сторону уменьшения адресов, количество передаваемых байт равно значению регистра В. После передачи очередного байта содержи- мое регистров В и HL уменьшается на единицу. Недокументированные команды При использовании 8-разрядной шины данных непосредственно можно реализовать только 256 кодов команд (28=256). Остальные 440 (696—256) кодов команд Z80 являются двухбайтными — первым байтом кода в них стоит один из четырех префиксов: #СВ, #DD, #ED, #FD*. Следовательно, кроме описанных 696 кодов команд возможно составить еще много вариантов «не- учтенных» кодов. Выполнение некоторых из них может привести к вполне осмысленным результатам. Эти коды составляют так называемые недокумен- тированные команды. В фирменных описаниях процессора эти команды не приводятся, однако многие программисты пользуются ими: иногда для удобст- ва, иногда из соображений секретности (отладчики обычно «не берут» такие команды), иногда для позы, мол, посмотрите, какой я умный. Чаще всего применяются недокументированные команды, работаю- щие с частями индексных регистров как с 8-разрядными регистрами общего назначения, Эти регистры, верней, части регистров обозначаются IXh, 1X1 (старший и младший байты регистра IX) и IYh, IY1 (старший и младший байты регистра IY). Ниже приведены некоторые недокументированные команды Z80: CY Z P/V S N Н LD r,s s -» г где г - А, В, С, D, Е; s - IXh, IXI, IYh, IYI. Байты #DD и #FD содержатся в кодах команд, работающих с индексными регистрами (IX и IY соответственно); #СВ — в кодах команд, работающих с битами; #ED — в кодах остальных двухбайтных команд. 94
СИСТЕМА КОМАНД Z80 Недокументированные команды LD d,r - d CY Z P/V S N H где г — А, В, С, D, E или п; d - IXh, IXI, IYh, IYI. Этими командами удобно пользоваться, когда нужно загрузить индекс- ный регистр из какого-либо другого регистра. Например, вместо после- довательности команд PUSH DE ; запись в стеке содержимого регистра DE POP IX ; загрузка регистра IX значением из стека можно использовать LD IXh,D LD IXI#E Хотя вторая последовательность команд занимает в памяти на один байт больше, время ее выполнения меньше на 9 тактов процессора. Ниже приведены недокументированные команды, действие которых не отличается от действия «нормальных» команд байтовой арифметики. ADD A,s ADC A,s SUB s SBC A,s AND s OR s XOR s CP s INC s DEC s A + s -* A A + s + CY - A A - s - A A - s - CY - A A AND s - A A OR s - A A XOR s - A A - s s + Us s - 1 - s CY Z P/V S N t 1 t \ t i 0 : 0 ; 0 ! t ' : v ; ; V : : V ; : V : ; P : ; P ; ; P : : V ; I V : I V j t о : 0 ; 1 : 1 : 0 ; 0 : 0 ; 1 t о I 1 H t г t г i 0 0 t t где s - IXh, IXI, IYh, IYI Например, для увеличения значения регистра IX на 256 можно исполь- зовать недокументированную команду INC IXh, выполнение которой эк- вивалентно работе целой программы: сохранение содержимого регистра DE загрузка регистра DE значением 256 увеличение содержимого регистра IX восстановление значения регистра DE PUSH LD ADD POP DE DE,256 IX,DE DE Приведем еще одну недокументированную команду, дополняющую группу команд сдвига: SLI CY Z P/V S p t где s - А, В, С, D, E, H, L, (HI), (IX+d) или (lY+d). Сдвиг содержимого регистра s влево на один разряд, в младший бит записывается 1, старший бит переписывается во флаг переноса CY. Мы привели лишь несколько недокументированных команд микро- процессора Z80, надеемся, что они будут Вам полезны. Если же Вас заинте- ресовали неизвестные возможности Z80, ничто не мешает Вам поэкспери- ментировать самим.
GENS4 АССЕМБЛЕР Из множества ассемблеров и дизассемблеров, существующих для ZX Spectrum, в Союзе наиболее популярен пакет фирмы Hisoft — DEVPAC4 (ассемблер GENS4 и отладчик MONS4). Этому способствова- ли не только несомненные достоинства пакета, но и появление его версий, работающих с дисководом в среде TR-DOS. Ассемблер GENS4 отличают следующие положительные свойства: — относительно небольшой объем занимаемой самим транслятором памяти — около 10К; — перемещаемость; — наличие встроенного редактора; — возможность работы в 51 -символьном текстовом режиме; — наличие макрокоманд и директив условной трансляции; — возможность подгрузки исходных файлов с кассеты или диска в процессе трансляции, что позволяет обрабатывать файлы практи- чески неограниченного размера; — высокая скорость трансляции; — возможность записи на диск объектных файлов в процессе трансля- ции, что позволяет получать программы, занимающие всю доступную память. Мы предлагаем Вам описание исходной версии GENS4, а также версии, адаптированной одним из авторов этой книги для работы с дисководом в системе TR-DOS. Выяснить, с каким накопителем работает конкретная модификация GENS4, можно в процессе трансляции. Рас- сматриваемая версия выводит на экран следующее сообщение: 1990 МО A B-Disk version Различные варианты GENS4 отличаются также количеством сим- волов в экранной строке: существуют версии с 51-символьной строкой и с 32-символьной. Имена этих модификаций для работы с магнитофо- ном соответственно GENS4-51 и GENS4. Дисковая версия известна только 5 1-символьная, чаще всего она встречается с именем GENS4B. ЗАГРУЗКА GENS4 Ассемблер GENS4 является перемещаемой программой, то есть он может быть загружен и запущен с произвольного адреса. Как правило, 96
GENS4 ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 наиболее удобно располагать GENS4 с адреса около 25000 — в этом случае Вам предоставляется наибольший объем памяти для текста редактируемой программы и рабочих таблиц (текстовый файл и таблицы размещаются непосредственно за GENS4). Максимальный адрес, с которого может быть загружен GENS4 — около 54000. Для загрузки GENS4 с ленты выполните один из следующих опера- торов: LOAD ""CODE XXXXX LOAD "name"CODE XXXXX Здесь и ниже XXXXX — десятичный адрес, с которого Вы хотите загрузить GENS4, a name — имя версии. Для загрузки с диска войдите в TR-DOS (RANDOMIZE USR 15616) и выполните оператор LOAD "GENS4B"CODE XXXXX Чтобы предотвратить возможные коллизии с интерпретатором Бейси- ка, перед загрузкой GENS4 полезно выполнить оператор CLEAR XXXXX-1 Запускается GENS4 оператором RANDOMIZE USR XXXXX, который исполь- зуется также и для перезапуска ассемблера после выхода из него в Бейсик. Для загрузки и запуска часто применяют программу-загрузчик на Бей- сике. Один из ее вариантов приведен в конце описания GENS4. После запуска GENS4 на экране появляется список команд редактора и подсказка в виде символа >. ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 Текст рабочей программы на языке ассемблер вводится в GENS4 либо непосредственно с клавиатуры (команда редактора I), либо подгружается с магнитного носителя (команда G). Программа состоит из пронумерованных с произвольным шагом строк, в которые записаны инструкции (команды) языка, метки, комментарии. Кроме команд процессора Z80, представленных в стандартной мнемонике (см. «Система команд Z80»), при написании программ используются специальные инструкции GENS4: директивы ассем- блера, команды условной трансляции, макрокоманды, команды ассемблера. Набор, загрузка, редактирование, сохранение и другие операции над тек- стом ассемблерной программы осуществляются в строчном редакторе. Для получения объектного кода* ассемблерный текст необходимо оттранслировать (проассемблировать) с помощью команды редактора А. Во время трансляции GENS4 выдает сообщения о найденных ошибках, которые исправляются затем в строчном редакторе. После создания объектного кода его можно сохранить на магнитном носителе (команды ассемблера О или А), а также выполнить, не выходя из GENS4 (команда R). А теперь обо всем подробно. Формат строки ассемблера Строка исходного текста программы для GENS4 имеет следующий формат: номер метка мнемоника операнды комментарий 35 START LD HLfLABEL ;загрузка регистра *) На самом деле GENS4 производит не объектный, а непосредственно исполняемый код. 7-1102 97
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 GENS4 Номер строки определяет место расположения строки в тексте ассем- блерной программы и необходим только для работы строчного редактора. При наборе строки переход к следующему полю формата осуществ- ляется нажатием клавиш табуляции (Caps Shift/8) или пробела (Space). Строчный редактор автоматически заменяет пробел на табуляцию.. Коммен- тарии отделяются символом «точка с запятой» (;) и могут располагаться, начиная с любого поля. Длина строки программы не может превышать 80 символов. Метки Метка — это имя, присваиваемое строке текста программы. Она исполь- зуется для указания адреса передачи управления или для определения констант. Метка может содержать любое количество символов, но значащими являются только первые шесть, которые, во избежание конфликтных ситуа- ций, не должны совпадать с первыми шестью символами других меток. В качестве меток нельзя использовать зарезервированные слова (см. соответ- ствующий раздел в конце описания GENS4). Метка может быть составлена из символов 0...9, A...Z, a..,z, _, [, V ], #• Однако первым символом метки непременно должна быть буква. Некоторые примеры возможных меток: Label -^^ эти метки LABEL * различны Long_Label ♦^^ эти метки указывают Long__L *— на о^чо и то же значение Пример использования метки в программе: ;сложение 8-разрядного числа с 16-разрядным ADD A,L LD L,A JR NCSKIP возникло переполнение, то следующая инструкция будет пропущена, и управление передано ; строке с меткой SKIP INC H SKIP сложение младших разрядов запись результата, если в результате не Счетчик адресов В процессе трансляции счетчик адресов указывает адрес текущей команды и используется для присвоения значений меткам, операндам и т. п. Значение счетчика адресов обозначается символом $> С применением счетчика адресов предыдущий пример можно пере- писать без использования метки: ;сложение 8-разрядного числа с 16-разрядным ADD A,L LD LfA JR NC,$+3 ; инструкция JR занимает два байта, ; a INC H - один, т. о. 2+1=5 байта INC H Выражения В поле операндов могут записываться как отдельные операнды, так и выражения, которыми задается последовательность алгебраических и логических
GENS4 ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 операций над константами, метками, счетчиком адресов. В выражения, обрабатываемые GENS4, можно включать следующие константы (с примерами): десятичная константа (38); шестнадцатиричная константа (#26); двоичная константа (%10110); символьная константа ("$"); и операторы: + сложение; — вычитание; & логическое «И» (AND); @ логическое «ИЛИ» (OR) ; ^! логическое «исключающее ИЛИ» (XOR); * алгебраическое умножение; / алгебраическое деление; ? функция MOD: A?B=A-(INT(A/B))*B. В выражениях нельзя использовать скобки, так как они являются признаком метода адресации. Вычисление значения выражения произво- дится слева направо — приоритет операторов не соблюдается. При записи выражений допускается использование пробелов. Примеры выражений (при условии, что метка TWIN имеет значение 2): %0110010!%0100 результат %110110; #2BFF?#1040 результат #B7F; 1+2*3—4 результат 5; #12А2+%111?256 результат #А9; "А"—10+13 результат "D"; TWIN+12 результат 14. При вычислении значений выражений значащими являются только младшие 16 бит числа (числа от 0 до 65535), например, число 114688 (#1С000) будет интерпретироваться как 49152 (#С000). Если в результате умножения будет получено число больше 32767, GENS4 выдаст сообщение об ошибке ♦ ERROR* 15 (переполнение). При делении на ноль появится сообщение +ERROR* 14. В остальных случаях переполнение игнорируется. Директивы ассемблера Работая в GENS4, Вы получаете возможность, кроме стандартных команд микропроцессора Z80, использовать в программах и так называемые директивы ассемблера. Мнемоники директив ассемблера записываются в поле мнемоник, операнды директив соответственно в поле операндов. ORG <выражение> Присвоить значение выражения счетчику адресов*. Если предполагается сохранить созданный объектный код на магнитном носителе средствами GENS4, то директива ORG не должна встречаться в программе более одного раза. 99
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 GENS4 EQU <выражение> Присвоить значение выражения метке, которой обозначена данная стро- ка. Выражение не должно содержать не определенных ранее меток, в противном случае будет выдано сообщение об ошибке +ERROR* 13. DEFB <выражение>[,<выражение>.. .]* Последовательно разместить в памяти 8-разрядные значения выражений, начиная с адреса, указанного счетчиком адресов. DEFW <вы ражен ие>[,<вы ражен ие>...] Последовательно разместить в памяти 16-разрядные значения выражений, начиная с адреса, указанного счетчиком адресов. DEFS <выражение> Зарезервировать область памяти длиной, равной значению выражения, начи- ная с адреса, указанного счетчиком адресов. Содержимое выделенной области не определяется. DEFM "string" Записать символьную строку string в память, начиная с адреса, указанного счетчиком адресов. ENT <выражение> Установить адрес запуска программы равным значению выражения. Программа будет запускаться по этому адресу командой редактора R. Макроопределения Если в Вашей программе одна и та же последовательность инструкций ассемблера используется несколько раз, то нет необходимости каждый раз ее переписывать. Достаточно при первом появлении в тексте этой последо- вательности выделить ее соответствующими директивами и присвоить имя (метку), а в дальнейшем вместо других включений записывать в поле мнемоник эту метку. Такая последовательность инструкций называется макроопределением, метка — макрокомандой. Во время трансляции текст макроопределения заносится в специально предназначенный для этого буфер и в последующем вставляется в исходный текст программы на место строки с макрокомандой. Если текст макроопределения не помещается в буфер, то выдается сообщение No Macro Space. Изменить размер буфера макроопределений можно с помощью команды редактора С. В дисковой версии размер буфера по умолчанию установлен равным нулю. Макроопределение задается директивами ассемблера MAC и ENDM, первая из которых указывает на начало макроопределения, вторая — на конец, например: ;сложение 8-разрядного числа с 16-разрядным ADDNUM MAC ADD A,L -, LD L,A тело JR NC,$+3 макроопределения INC H J ENDM *) Аргументы в квадратных скобках являются необязательными. 100
GENS4 ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 После включения в текст программы этого макроопределения для сложения аккумулятора с регистровой парой HL можно применять макроко- манду ADDNUM. В макроопределение можно включать до 16 параметров, которым присваивается значение следующих за макрокомандой выражений: ИМЯ_МАКРООПРЕДЕЛЕНИЯ [параметР1[,...[,параметр16]]] В качестве параметров разрешается передавать только числовые зна- чения. В теле макроопределения параметр вызывается указанием его номера следования в макрокоманде, перед которым ставится знак =. При этом номер задается четырьмя младшими битами кода символа, расположенного сразу за знаком равенства. Например, ссылка на первый параметр может выгля- деть как =0, =@ или =Р; на второй — =1, =А или =а. Обратите внимание, что ссылка на шестнадцатый параметр будет выглядеть как =?, =О или =о, а не =16. Правда, из-за ограничения длины строки 80-ю символами использовать все 1 6 параметров довольно затруднительно. В следующем примере задано макроопределение, заполняющее об- ласть памяти некоторым значением и имеющее три параметра: адрес начала области, длину и значение байта-заполнителя: FILL MAC LD LD LD LD LDIR ENDM HL,=0 DE,=0 + 1 BC,=1 - 1 (HL),=2 Это макроопределение вызывается, например, такой макрокомандой: FILL 16384,22528-16384,%01011010 Учтите, что макроопределения не могут быть вложенными или рекур- сивными. Не пытайтесь также в текст макроопределения включать строки с метками — ассемблер размножит эти метки столько раз, сколько раз будет вызвано макроопределение, что приведет к неминуемым ошибкам трансля- ции. Если для Вас более значимым является минимизация объема програм- мы, а не удобства, предоставляемые макроопределениями, то вместо них лучше пользоваться подпрограммами. Однако обратите внимание, что ис- пользование макроопределений может несколько увеличить скорость работы программы. Разрешать или запрещать включение текста макроопределения в листинг ассемблирования можно командами ассемблера *М+ и *М— (см. ниже). Команды условной трансляции Иногда бывает необходимо, в зависимости от выполнения тех или иных условий, получать различные варианты объектного кода программы. Работая в GENS4, Вы сможете добиться этого, используя команды условной трансляции IF, ELSE и END . С их помощью можно устанавливать или сбрасывать флаг разрешения трансляции, чем соответственно разрешать или запрещать ассемблирование фрагментов текста программы. 101
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4 GENS4? IF <выражение> Сбросить флаг разрешения трансляции при нулевом значении выражения, — следующие за командой строки программы не ассемблировать*. Если значение выражения отлично от нуля, то ассемблирование продолжить нормально. ELSE Инвертировать флаг разрешения трансляции. Если перед появлением ELSE ассемблирование было разрешено, то запретить его, и наоборот. END Установить флаг разрешения трансляции. После этой команды ранее прерванное ассемблирование продолжается нормально. Вложенность команд условной трансляции не допускается. Обратите внимание, что флаг разрешения трансляции по заверше- нию первого прохода ассемблирования не восстанавливается, и если в конце программы он был сброшен, то на втором проходе могут возникнуть самые удивительные эффекты. Поэтому пользоваться условной трансляцией необ- ходимо с вниманием (полезно, например, завершать программу командой END). Команды ассемблера В исходный текст программы можно вставить так называемые коман- ды ассемблера, которые в ходе трансляции будут управлять выводом листинга ассемблирования. Команды ассемблера записываются в поле метки и не должны содер- жать разделителей (табуляций). В командах *Н и *F операнд необходимо отделить пробелом. *Е Вставить в листинг три пустые строки. Полезно использовать для разде- ления программных модулей. *Н string Напечатать заголовок. В листинг включается строка string. Она будет выводиться также после каждого выполнения команды *Е. *s Приостановить выдачу листинга ассемблирования. Продолжить трансля- цию можно, нажав любую клавишу. *L+ Разрешить выдачу листинга. *L- Запретить выдачу листинга. *D+ Выводить значение счетчика адресов в десятичном виде. *D- Выводить значение счетчика адресов в шестнадцатиричном виде. *) Обратите внимание, что проверка синтаксиса программы осуществляет- ся и при запрещенной трансляции. 102
GENS4 КОМАНДЫ РЕДАКТОРА *С- Выводить сокращенный листинг ассемблирования. Строки сокращенного листинга не содержат объектного кода. Таким образом, они укорачива- ются на 9 символов, что делает листинг более удобным для чтения. Команда используется преимущественно в 32-символьной версии GENS4. ♦С+ Выводить полный листинг ассемблирования. *М+ Разрешить распечатку текста макроопределений. ♦М- Запретить распечатку текста макроопределений. *F filename Включить в процесс трансляции фрагмент программы, записанный на ленте или диске. Из файла с указанным именем считываются и ассемблируются блоки текста. Использование команды *Р позволяет значительно сократить объем текстового файла, находящегося в памяти, и, следовательно, дает возможность создавать объектный код, занимающий почти всю доступ- ную память. При работе с магнитофоном файл необходимо предваритель- но записать на ленту с помощью команды редактора Т. СТРОЧНЫЙ РЕДАКТОР Встроенный в GENS4 строчный редактор позволяет вводить и редакти- ровать текст программы на языке ассемблера. Управление редактором осуще- ствляется с помощью команд редактора, которые вводятся на подсказку > и имеют следующий формат: C[N1],[N2],[S1],[S2] где С — собственно команда; N1, N2 — числа в пределах от 1 до 65535 включительно; S1, S2 — строки, состоящие не более чем из 20 символов. Команды редактора могут вводиться как в верхнем, так и в нижнем регистрах клавиатуры. Если в числовом параметре будет встречен нечисло- вой символ, не являющийся разделителем, то текст командной строки, начиная с этого места и до конца строки, будет проигнорирован. Редактор запоминает введенные параметры и может затем использо- вать их для некоторых команд в качестве значений, устанавливаемых по умолчанию. Если введена некорректная командная строка, например: РР1,20000,G.WINDOWS то команда выполнена не будет, а редактор сделает Вам замечание: Pardon?. Исправьте ошибку и введите команду правильно: Р1,20000,G.WINDOWS КОМАНДЫ РЕДАКТОРА Команды редактора вводятся нажатием клавиши с соответствующей ла- тинской буквой, которая в названии команды выделена полужирным шрифтом. 103
КОМАНДЫ РЕДАКТОРА GENS4 Вставка строк Insert [N][,M]* Автоматически генерировать строки, начиная со строки N и шагом М. После ввода команды Вы можете производить последовательный набор текста программы. Отказаться от генерации строк можно, нажав клавишу Edit (Caps Shift/1). Если в процессе ввода программы номер строки превысит 32767, то генерация строк прекратится. Строку также можно вставить в программу, введя на подсказку > ее номер и через пробел — текст. Вывод листинга программы List [N][,M] Вывести на экран листинг программы со строки N по строку М включи- тельно. По умолчанию N равно 1, М — 32767. Листинг выводится по страницам. Переход к следующей странице происходит по нажатию любой клавиши, кроме Edit, нажатие которой прервет выдачу листинга и вернет управление редактору. Konfigure list N Установить количество строк в странице листинга. Write text [N][,M] Распечатать на принтере текст программы со строки N по М включительно. Если N и М не указаны, то будет распечатана вся программа. Редактирование текста ассемблерной программы reNumber [N][,M] Перенумеровать строки программы, начиная с первой строки, которой присваивается номер N, с шагом М. Если в результате выполнения команды номер какой-либо строки может превысить 32767, то команда не выполняется. Delete N,M Удалить строки от N до М включительно. Если М меньше N, или определено менее двух аргументов, то команда игнорируется. Отдельная строка может быть удалена просто введением ее номера. Move [N][,M] Копировать строку с номером N в строку с номером М. Если строки с номером N не существует, то команда игнорируется. Если строка с номером М существует, ее содержимое заменяется содержимым строки N. Аккуратно используйте эту команду — старайтесь не вызывать ее без аргументов. Find [N][,M][,Fs][rSs] Найти стринг (строку текста) Fs в программе, начиная со строки N и до строки М. Если такая строка найдена, то она отображается на экране и GENS4 переходит в режим редактирования строки, причем курсор уста- *) Аргументы в квадратных скобках являются необязательными, при их пропуске, как правило, используется значение параметра по умолчанию. 104
GENS4 КОМАНДЫ РЕДАКТОРА навливается на начало найденного стринга. В режиме редактирования можно заменить стринг Fs на стринг Ss (см. команду редактора Е). Edit N Редактировать строку с номером N. Вызванная на редакцию строка копируется в буфер и отображается на экране вместе с номером. Редак- тирование происходит в буфере, поэтому исходная строка не изменяется и в любой момент может быть восстановлена. При отсутствии строки с номером N команда игнорируется. Редактирование осуществляется с помощью следующих подкоманд (клавиш): SPACE — переместить курсор на одну позицию вправо; CAPS SHIFT/0 — переместить курсор на одну позицию влево; CAPS SHIFT/8 — переместить курсор на следующую позицию табуляции; List - отобразить на экране текущее состояние строки; Kill — удалить символ в указанной курсором позиции; Zap — удалить все символы, начиная с указанного курсором и до конца строки; Find — найти следующее появление в тексте программы стринга, ранее определенного командой редактора F; Swap — заменить найденный стринг Fs на стринг Ss, ранее определенный командой редактора F, и искать следующее появление стринга Fs; Insert - перейти в режим «вставка». Выход из режима осуществляется нажатием Enter; eXpand — переместить курсор в конец строки и включить режим «вставка»; Change — перейти в режим «замена». Выход из режима осуществляется нажатием Enter; Quit — прервать редактирование строки: вызванную на редактирование стро- ку записать в программу в исходном виде, все изменения игнорировать; Reload — перезагрузить буфер редактирования: вызванную на редактиро- вание строку перезаписать в буфер в исходном виде, все измене- ния игнорировать; ENTER - завершить редактирование строки: поместить отредактирован- ную строку из буфера в текст программы. Работа с дисководом и магнитофоном Текст программы и объектный код можно сохранить как на магнитной ленте, так и на дискете. Тип накопителя задается форматом имени файла. При работе с дисководом вторым символом в имени должен стоять знак дво- еточия (:). Если знак двоеточия отсутствует в имени файла, то в качестве носителя будет использоваться магнитная лента. Формат имени файла для дисковых устройств: X:filename( где X — номер устройства (1 ...4, что соответствует дисководам "A".:."D"). Напомним, что имена файлов для магнитофона должны содержать не более 10 символов, для дисковода — не более 8. Get text [,,S] Загрузить с магнитного носителя программу из файла с именем S. Если стринг S пустой, с магнитофона будет считываться первый встреченный файл. Если в памяти уже находится программа, то загружаемый файл будет присоединен к ней. Строки полученной программы будут перенумерова- ны, начиная с номера 1 и с шагом 1. Put text [N][,M][,S] Записать на магнитный носитель программу со строки N до М включитель- но в файл с именем, заданным стрингом S. По умолчанию используются аргументы, установленаые предыдущей командой. 105
КОМАНДЫ РЕДАКТОРА GENS4 Примеры. Записать строки с номерами от 20 до 400 включительно на магнито- фон в файл с именем MAINPROG: P20,400,MAINPROG Записать всю программу на дисковод "В" в файл с именем MIRACLE: P1,32767,2:MIRACLE Если при записи на диск файл с указанным именем уже существует, то (в зависимости от версии GENS4) будет выведен запрос: Overwrite (Y/N)? (Переписать (Да/Нет)?) или File exists Delete (Y/N)? (Файл найден Удалить (Да/Нет)?) Для удаления существующего файла и записи нового нажмите Y; для отмены операции — любую другую клавишу. Таре for include [N][,M][,S] Записать программу в специальном формате. Записать на магнитную ленту в файл с именем S фрагмент программы со строки N по М в специальном формате для последующего включения в процесс трансляции по команде ассемблера *F . Файл разбивается на блоки, длина которых равна размеру входного буфера (см. команду редактора С). Object save [,,S] Записать на магнитный носитель объектный код в файл с именем S (записывается код, созданный после последней директивы ORG). Если объектный код не создан, команда будет проигнорирована. Другие команды Run program Запустить оттранслированную программу с адреса, определенного дирек- тивой ENT. Программа выполняется как подпрограмма относительно GENS4, возврат в редактор происходит по команде процессора RET. Bye Возвратить управление интерпретатору Бейсика. Для перезапуска GENS4 из Бейсика используйте оператор: RANDOMIZE USR ХХХХХ. Change buffers Изменить размер буферов (входного и макроопределений). Покоманде выводятсязапросы Include buffer? (Размер входного буфера?) Macro buffer? (Размер буфера макроопределений?) Размер входного буфера определяет скорость трансляции программы, запи- санной на магнитной ленте — чем больше буфер, тем больший фрагмент текста может быть считан и, следовательно, тем быстрее будет происходить трансляция. Необходимо учитывать, что при записи файла командой редак- тора Т и при последующем чтении его командой ассемблера *F размер входного буфера должен быть одинаковым. В дисковой версии размер буфера установлен равным 256 байт и не влияет на скорость ассембли- рования. Размер буферов рекомендуется задавать перед сеансом работы — сразу после загрузки GENS4. 106
GENS4 АССЕМБЛИРОВАНИЕ ПРОГРАММЫ Separator [,,D] Изменить символ разделителя аргументов в командной строке на первый символ стринга D. После загрузки GENS4 разделителем является запятая. Изменение разделителя обычно используется для поиска фрагментов текста, содержащих запятую. use RAM Until [H] Установить верхнюю границу используемой памяти равной Н. Если аргу- мент не указан, то на экран выводится текущая верхняя граница памяти. GENS4 не может размещать текст программ или объектный код в области памяти выше указанной границы. При ее достижении выдается сообще- ние об ошибке: Out of memory! current Values Выдать на экран служебную информацию: значение параметров N1, N2, S1, S2 по умолчанию, символ разделителя, адреса начала и конца текста. X catalogue [N] Вывести на экран каталог диска, номер которого определен аргументом N. По умолчанию выводится каталог диска "А". Zap text Удалить текст программы, находящейся в памяти. Выводится запрос: Delete iexi (Y/N) (Удалить текст (Да/Нет)) Для уничтожения текста нажмите Y, для отмены операции — любую другую клавишу. Help Вывести на экран перечень команд редактора. Assemble [O][,T][,F] Ассемблировать программу. Этой команде посвящен следующий раздел описания GENS4. АССЕМБЛИРОВАНИЕ ПРОГРАММЫ Ассемблирование (оно же — транслирование, оно же — генерация объектного кода) — это процесс перевода программы, написанной на ассем- блере, на единственно понятный для процессора язык — язык кодов команд. Как уже упоминалось, ассемблирование программы запускается ко- мандой строчного редактора А. Приведем еще раз ее формат: Assemble [O][,T][,F] где О — ключи ассемблирования (описаны ниже). Т — размер таблицы символов в байтах. По умолчанию размер таблицы устанавливается пропорционально размеру исходного текста программы. Как правило, этого достаточно, но в случае использования большого количества меток в короткой программе возникает необходимость увели- чить размер таблицы символов. Если размер таблицы мал, выдается сообщение: No Symbol Table space! 107
АССЕМБЛИРОВАНИЕ ПРОГРАММЫ GENS4 F — имя файла на диске, в который будет записан объектный код. Во время трансляции объектный код предварительно помещается в буфер, расположенный либо сразу за таблицей символов (ключ 16, см. ниже), либо начиная с адреса, заданного первой встреченной в программе директивой ORG. Конец буфера определяется верхней границей доступ- ной памяти, установленной командой редактора U. При заполнении буфера его содержимое переписывается на диск, и ассемблирование продолжается в буфер. Если имя файла не указано, объектный код будет помещен в память по адресам, заданным директивами ORG либо ключами ассемблирования. Режим записи объектного кода на кассету в процессе ассемблирова- ния не поддерживается. Ключи ассемблирования: 1 — выдать таблицу символов в конце листинга ассемблирования; 2 — отменить генерацию объектного кода (фактически, в процессе ассем- блирования производить только проверку синтаксиса программы); 4 — выводить листинг ассемблирования; 8 — переопределить вывод на принтер; 16 — размещать объектный код непосредственно после таблицы симво- лов; адрес, определенный директивой ENT, игнорировать. 32 — не производить проверку расположения объектного кода в памяти. Приводит к незначительному ускорению процесса ассемблирования. Для того, чтобы одновременно задать несколько условий трансляции, нужно сложить значения соответствующих ключей. Например, трансляция текста программы с выдачей листинга ассемблирования (ключ 4) на принтер (ключ 8) без генерации объектного кода (ключ 2) будет выполнена по команде редактора А14. При записи объектного кода на диск полезно пользоваться ключом 1 6, так как в этом случае под буфер ассемблера отводится максимальный размер памяти. Кроме того, ключ 16 незаменим, если необходимо разместить про- грамму в области, недоступной GENS4 при обычном режиме ассемблирова- ния (например, в видеопамяти). Полученный таким образом код может быть записан на магнитный носитель с помощью команды редактора О. Началь- ный адрес в заголовке файла указывает на реальное местоположение файла в памяти после трансляции. Ассемблирование происходит в два прохода: на первом проходе про- веряется синтаксис и формируется таблица символов, в которую заносятся имена и значения встреченных в программе меток; на втором — создается объектный код. Если обнаружена ошибка на первом проходе, трансляция приостанав- ливается, и на экран выдается сообщение об ошибке. В этой ситуации можно либо перейти в режим редактирования, нажав клавишу Е, либо продолжить трансляцию, нажав любую другую клавишу. В конце первого прохода выдается сообщение: Pass 1 errors: NN где NN — количество ошибок, найденных во время первого прохода. При обнаружении ошибок второй проход выполняться не будет. Во время второго прохода параллельно с генерацией объектного кода на экран выводится листинг ассемблирования (если, конечно, это разрешено соответствующими командами ассемблера). В строке листинга содержится информация как об исходном тексте программы, так и о результатах транс- ляции — последовательно выводятся значение счетчика адресов, объектные коды, номер транслируемой строки и ее текст. Не пугайтесь, если Вы 108
GENS4 СООБЩЕНИЯ ОБ ОШИБКАХ обнаружите «пропажу» части объектных кодов — в строке листинга ассемб- лирования выводятся только первые четыре байта оттранслированной про- граммы. Выдачу листинга ассемблирования, а вместе с ним и процесс трансляции, можно приостановить клавишей Space. После чего, нажав Е, Вы вернетесь в редактор, а нажатие любой другой клавиши продолжит процесс трансляции. При втором проходе могут быть обнаружены лишь две ошибки: ♦ ERROR* 10 и Bad ORG!. Ошибка ««ERROR* 10 не фатальная, поэтому после выдачи сообщения о ней ассемблирование можно продолжить нажатием на любую клавишу кроме Е (клавиша Е вернет Вас в редактор). При обнаруже- нии ошибки Bad ORG! управление сразу передается в редактор. Если в процессе трансляции не была обнаружена необходимая метка, последует предупреждение: ♦WARNING* Labeljslame absent где Label_Name — имя необнаруженной метки. В конце второго прохода на дисплей выводятся сообщения: Pass 2 errors NN Table used: AAAAA from BBBBB где NN — общее количество ошибок после второго прохода; ААААА — размер таблицы символов; ВВВВВ — максимальный размер таблицы символов. Если в тексте программы была встречена директива ENT, то выдается сообщение: Executes: CCCCC указывающее адрес запуска программы командой редактора R. СООБЩЕНИЯ ОБ ОШИБКАХ ♦ERROR* 1 — ошибка в константе; ♦ERROR* 2 — мнемоника не распознана; ♦ ERROR* 3 — утверждение сформировано неправильно; ♦ ERROR* 4 — символ (метка) определен более одного раза; ♦ERROR* 5 — строка содержит недопустимый символ; ♦ERROR* 6 — один из операндов в строке не определен; ♦ ERROR* 7 — метка является зарезервированным словом; ♦ ERROR* 8 — использование недопустимой для данной команды пары ре- гистров; ♦ ERROR* 9 — использование недопустимого для данной команды регистра; ♦ERROR* 10 — величина относительного смещения слишком велика; ♦ ERROR* 11 — инструкция не может быть оттранслирована; ♦ERROR* 12 — ошибка в директиве ассемблера; ♦ ERROR* 13 — метка, используемая в команде, не определена; ♦ ERROR* 14 — деление на ноль; ♦ ERROR* 15 — переполнение при операции умножения; ♦ERROR* 16 — вложенное макроопределение; ♦ ERROR* 17 — идентификатор не может являться именем макроопределения; ♦ERROR* 18 — рекурсивный вызов макроопределения; Bad ORG! — операндом директивы ORG является адрес, использование кото- рого может испортить ячейки GENS4, текстовый файл или таблицу символов. Управление возвращается в редактор; No Symbol Table space! — появляется во время первого прохода, если под таблицу символов выделено недостаточно памяти. Управле- ние возвращается в редактор; Out of memory! — нет места для текста программы. Рекомендуется записать текущий текстовый файл или его часть на магнитный носитель. 109
ПРИМЕР СЕАНСА РАБОТЫ GENS4 ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА Все зарезервированные слова состоят из заглавных букв. Приведен- ные ниже слова нельзя использовать как метки: А В С D Е Н L I R $ AF AF' ВС DE HL IX IY SP NC Z NZ М Р РЕ РО Далее ассемблера: ADC CCF CPIR DJNZ IM INI LDD NOP OUTD RET RLC RRC SCF SUB DEFB END MAC ♦ D ♦ C приводится ADD CP CPL El IN INIR LDDR OR OUTI RETI RLCA RRCA SET XOR DEFM ENT ENDM *E ♦ F список AND CPD DAA EX INC JP LDI OTDR POP RETN RLD RRD SLA DEFS EQU ♦ H ♦M мнемоник BIT CPDR DEC EXX IND JR LDIR OTIR PUSH RL RR RST SRA • DEFW IF ♦ L команд Z80, директив и команд CALL CPI Dl HALT INDR LD NEG OUT RES RLA RRA SBC SRL ELSE ORG ♦S ПРИМЕР СЕАНСА РАБОТЫ Задача: написать и отладить программу, выводящую на экран числа в пределах от 0 до 65535 в произвольной системе счисления. Проект: программа должна состоять из двух подпрограмм — подпрог- раммы, подготавливающей таблицу степеней, и собственно подпрограммы вывода числа на экран. Ввод программы: Полужирным шрифтом выделен текст, вводимый с клавиатуры, кур- сивом — пояснения. Использованы следующие обозначения клавиш: J - Enter; [SP] - Space; [SS/x] - одновременное нажатие клавиш Symbol Shift и х; [CS/x] - одновременное нажатие клавиш Caps Shift и х. Ввод строки программы заканчивается нажатием на клавишу Enter: >llie,iej автонумерация строк Pardon? ошибка в командной строке ;адрес размещения подпрограмм 10 «'отладочная часть* 20 ORG 46666 *) Пример вводился и обрабатывался без комментариев. 110
GENS4 ПРИМЕР СЕАНСА РАБОТЫ 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 ENT CALL LD CALL LD ; подпрограмма PRNUM LOOP__1 CONT__1 LOOP__2 PR_CHR CONT__2 PUSH PUSH LD DEC LD DEC LD LD OR JR POP POP LD RST RET EX XOR SBC JR INC JR ADD ADD CP JR ADD RST EX JR $ 3503 A,10 МАК ТВ HL,12345 печати числа, HL HL HL,(TB END) HL D,(HL) HL E,(HL) A,D E NZ,CONT 1 HK HL A,13 16 (SPhHL A HL,DE C,PR CHR A LOOP__2 HL,DE A,"D" "9"+1 CCONT 2 A,"A"—"9"— 16 (SP),HL LOOP 1 определение входной точки ;очистка экрана ;установка системы счисления ; с основанием 10 ;печать числа содержащегося в HL ;сохранение числа ;создание рабочей копии ;загрузка адреса конца таблицы ;загрузка в DE очередной ; степени числа, находящейся ; в таблице ;проверка на достижение конца ; таблицы продолжение, если не конец ;восстановление SP восстановление числа ;ASCII-код 13 — перевод строки ;печать символа из А ;возврат из подпрограммы ;восстановление числа ;очистка А и сброс бита CY ;расчет очередного разряда ; числа, результат помещается ; в А, а расчет заканчивается ; при переходе через ноль ;восстановл. полож. значения ;получение ASCII-кода ;если код меньше, чем "9" ; то переход на печать 1 ;коррекция кода ;печать очередной цифры числа ;восстан. адреса таблицы 400 ; подпрограмма подготовки таблицы степеней, основание 410 ; степени должно быть помещено в аккумулятор 420 МАК ТВ LD HL,TABLE+4 ;загрузка адреса таблицы 430 PUSH HL сохранение адреса 440 LD DEr1 ;инициал. счетчика степени ;загрузка счетчика цикла ;обнуление результата ;подсчет степени ;окончание счета (>65535) ;цикл подсчета ;загрузка результата в DE ;восстановление адреса таблицы ;запись адреса конца таблицы ;выход, при окончании счета ;запись очередного значения ; степени в таблицу сохранение адреса таблицы 450 LOOP 3 460 470 LOOP 4 480 490 500 510 READY 520 530 540 550 560 570 580 LD LD ADD JR DJNZ EX POP LD RET LD INC LD INC PUSH B,A HL,0 HL,DE C,READY LOOP 4 DE,HL HL (ТВ ENDjHL С (HLbE HL (HL),D HL HL 111
ПРИМЕР СЕАНСА РАБОТЫ GENS4 590 JR LOOP_3 продолжение цикла 600 ; область данных 610 TB_END DEFW TABLE+2 ;переменная, содержащая адрес 620 ; конца таблицы 630 TBLE DEFW 0 ;таблица степеней, первые два 640 DEFW 1 ;значения — константы 650 DEFS 30 ;область для таблицы • 660 670 END 680 [CS/1] >A2j вызов ассемблирования без построения кода HiSoft GEN Assembler ZX Spectrum 1990 MOA B-Disk version. Copyright (C) HiSoft 1987 V4.1 All rights reserved 9C58 190 POP HK ♦ ERROR* 01 J обнаружена ошибка — продолжаем процесс No Symbol Table space!размер таблицы символов мал >A2,30ej ассемблирование с большим размером таблицы символов HiSoft GEN Assembler ZX Spectrum 1990 MOA B-Disk version. Copyright (C) HiSoft 1987 V4.1 All rights reserved 9C58 190 POP HK ♦ ERROR* 01 J Pass 1 errors: 01 ♦WARNING^ HK absent ПРЕДУПРЕЖДЕНИЕ: метка не обнаружена ♦WARNING^ TABLE absent Table used: 187 from 300 >E190J вызов на редактирование ошибочной строки 190 POP HK 190 X[CS/Q]LJJ редактирование осуществляется 190 POP HL последовательным нажатием соответствующих клавиш >L600J просмотр части листинга 600 610 TB_END DEFW TA8LE+2 620 630 TBLE DEFW 0 640 DEFW 1 650 DEFS 30 660 670 END >E630J вызов на редактирование ошибочной строки 630 TBLE DEFW 0 630 [SP]IAJJ 630 TABLE DEFW 0 >A,300J ассемблирование с созданием кода HiSoft GEN Assembler ZX Spectrum 1990 MOA B-Disk version. 112
GENS4 ПРИМЕР СЕАНСА РАБОТЫ Copyright (С) HiSoft 1987 V4.1 All rights reserved Pass 1 errors: 00 Pass 2 errors: 00 Table used: 167 from 300 Executes: 40000 >RJ выполнение программы 12345 >D10,70J удаление отладочной части >N10,10J перенумерация строк >Р1,20000,1:UNINUMPRJ запись текста программы на диск ЗАБАВНЫЙ ПРИМЕР ИСПОЛЬЗОВАНИЯ КОМАНД УСЛОВНОЙ ТРАНСЛЯЦИИ В соответствующем разделе говорилось, что использование вложения команд условной трансляции недопустимо. Но, по сути, при последователь- ном использовании этих команд как такового вложения не происходит. Каждая из команд условной трансляции самостоятельно управляет одним и тем же флагом разрешения трансляции, и комбинации команд, которые на первый взгляд могут показаться вложенными, на самом деле являются последовательными. Использование конструкций с «лжевложениями» по- зволяет писать весьма элегантные программки: ON 16 ON 128 ON BETA ON_MDRV CONFIG 8-1102 EQU EQU EQU EQU IF DEFM ELSE IF DEFM END IF IF DEFM END DEFM DEFB IF IF DEFM ELSE IF DEFM END IF DEFM END 0 ; 1 — present, 1 1 0 ON 16 "16K" ON 128 "128K" ON 16 ! 1 ON 128 ! 1 "48K" " memory presented" 13 ON BETA ON_MDRV "Beta disk and Microdrive" ON BETA "Beta disk" ON_BETA ! 1 & ON_MDRV "Microdrive" 113
ПРОГРАММА-ЗАГРУЗЧИК GENS4 tF ON MDRV @ ON_BETA 1 1 DEFM "No"drive devices" END DEFM " attached" DEFB 13® #80 В результате трансляции данного примера в памяти будет построен текстовый файл, содержащий информацию о конфигурации внешних уст- ройств, определяемых в заголовке программы. ПРОГРАММА-ЗАГРУЗЧИК Если Вы часто пользуетесь GENS4, то полезно написать небольшой загрузчик на Бейсике, Для дисковой версии он может выглядеть следующим образом: 1 RANDOMIZE USR 0 10 LET A=VAL "25000" 20 IF tNKEY$<>"" THEN INPUT "New address: ";A 30 RANDOMIZE A; POKE VAL "23877",PEEK VAL "23670": POKE VAt "23678",PEEK VAL "23671": CLEAR A-SGN PI 40 LET A^PEEK VAL "23670"+VAL "256"*PEEK VAL "23671" 50 RANDOMIZE USR VAL "15619": REM : LOAD "GENS4B"CODE A 60 POKE VAL "23824",NOT PI 70 GO TO NOT PI После ввода текста программы с клавиатуры запишите ее на диск с помощью операторов; CUEAR : РОКЕ 23868,0 RANDOMIZE USR 15619; REM ; SAVE "GENS4B"L1NE 1 Приведенный загрузчик разместит GENS4 с адреса 25000, но если при запуске удерживается какая-либо клавиша, то на экране появится запрос New address:, на который можно ввести произвольный адрес. Перезапуск ассемблера после выхода в Бейсик осуществляется опе- ратором RUN. Для кассетной версии загрузчик будет выглядеть несколько иначе: 1 RANDOMIZE USR 0 10 LET A=VAL "25000" 20 IF INKEY$<>"" THEN INPUT "New address: ";A 30 RANDOMIZE A: POKE VAL "23765",PEEK VAL "23670": POKE VAL "23766",PEEK VAL "23671": CLEAR A-SGN PI 40 LET A=PEEK VAL "23670"+VAL "256"*PEEK VAL "23671" 50 LOAD "GENS4B"CODE A 60 GO TO NOT PI Для записи загрузчика на ленту выполните операторы: CLEAR : POKE 23756,0 SAVE "GENS4"LINE I
MONS4 МОНИТОР-ОТЛАДЧИК Монитор-отладчик MONS4, являясь составной частью пакета DEVPAC4, совместим с ассемблером GENS4. Программисты предпочи- тают его другим отладчикам, поскольку он обладает неплохими харак- теристиками: перемещаем, имеет эффективные средства трассировки программ и занимает относительно небольшой объем памяти. В предлагаемом описании рассматриваются кассетная версия MONS4 и версия, работающая с диском в среде TR-DOS. ЗАГРУЗКА MONS4 Поскольку MONS4 является перемещаемым, его можно загрузить с произвольного адреса. Первоначально для его размещения требуется около 7К памяти, однако при первом запуске MONS4, настроившись для работы по заданному адресу, освобождает примерно 1К. Загрузка с магнитофона: CLEAR YYYYY-1 LOAD "MONS4"CODE YYYYY здесь и ниже YYYYY — десятичный адрес загрузки. Загрузка с диска: CLEAR YYYYY-1 RANDOMIZE USR 15619: REM : LOAD "MONS4B"CODE YYYYY Запуск и перезапуск отладчика производится оператором RANDOMIZE USR YYYYY ФРОНТАЛЬНАЯ ПАНЕЛЬ После запуска MONS4 на экране появляется так называемая фрон- тальная панель (ФП), на которой отображается информация о состоянии памяти, регистров и флагов в процессе отладки программ (см. рис. 15). В верхней части ФП выводится адрес и содержимое текущей ячейки памяти (код и мнемоника команды), то есть ячейки, на которую установлен указатель адреса (УА). Он определяет точку приложения команд MONS4. Ниже на ФП отображается содержимое регистров Z80. В строках вслед за значениями регистровых пар PC, SP, IY, IX, HL, DE и ВС выводится содержимое семи последовательно расположенных ячеек памяти, первая из которых адресу ет- 8* 115
e о I I Of If "П"П"ПТ1"П"П"П"П ттппптп DO Ю ID CD %l СП СП * О ft .Q "ПР-ПО1ЭОГ0П1 QOQQQSQQ ONCOPQQT1IUFO z ОСР"ПЮОООО Zj ' р © (Л о й 1!
MONS4 КОМАНДЫ MONS4 ся соответствующей регистровой парой. Рядом с регистрами А и F индици- руются установленные флаги, а рядом с регистрами I и R — состояние триггера разрешения прерываний (ON — прерывания разрешены, OFF — запрещены*). В нижней части ФП в три столбца размещен дамп памяти — последовательность из 24 ячеек (адрес и содержимое). КОМАНДЫ MONS4 Управление отладчиком осуществляется с помощью команд, пользуясь которыми помните, что: — команды могут вводиться с клавиатуры как в верхнем, так и в нижнем регистре; — команды, не требующие числовых аргументов, выполняются при нажа- тии соответствующей клавиши, без подтверждения клавишей Enter; — значения числовых аргументов вводятся только в шестнадцатиричной форме и требуют подтверждения клавишей Enter; — неопознанные команды игнорируются; — отмена выполнения команд производится клавишами Caps Shift/1 (Edit) или Caps Shift/5; — если при выполнении команды произошло перемещение УА, то ФП обновляется. Перемещение указателя адреса Enter Переместить УА на следующую ячейку. Caps Shift/7 Переместить УА на предыдущую ячейку. Caps Shift/5 Переместить УА на 8 ячеек назад. Caps Shift/8 Переместить УА на 8 ячеек вперед. м Переместить УА на заданный адрес. На подсказку введите шестнадцати- ричный адрес ячейки памяти, на которую необходимо установить УА. Symbol Shift/N Перейти по стеку. УА устанавливается на ячейку памяти, адрес которой находится на вершине стека, при этом значение регистра указателя стека SP не изменяется. Команда используется для определения адреса возвра- та из подпрограммы. о Выполнить относительный переход. УА сдвигается относительно текущей ячейки памяти на величину содержимого этой ячейки, интерпретируе- мого как относительное смещение. Смещения более #7F (1 27) трактуют- ся как отрицательные. Триггер разрешения прерываний изменяет свое состояние только при выполнении команд отлаживаемой программы. Средствами MONS4 его состояние изменить невозможно. 117
КОМАНДЫ MONS4 MONS4 Пример: Предположим, что при отладке программы встретилась команда JR NZ,#5B12, расположенная по адресам #5B3F и #5В40, при этом по адресу #5B3F находится код #20 (JR NZ), а по адресу #5В40 — код #D1 (смещение). Если установить УА на ячейку #5В40 и ввести команду О, то УА переместится на адрес #5В1 2. и Вернуться к исходной ячейке после относительного перехода. Позволяет вернуться к адресу, в котором была выполнена команда О. X Выполнить прямой переход. УА устанавливается на ячейку памяти, адрес которой определяется двумя; байтами,, расположенными в текущей и следующей за ней ячейках памяти. Пример: Предположим, что при отладке программы по адресу #5BCF встретилась команда вызова подпрограммы CALL #9Е12. При этом по адресу #5BCF находится код #CD (CALL), а по адресам #5BD0 и #5BD1 — коды #12 и #9Е соответственно (адрес подпрограммы). Если установить УА на адрес #5BD0 и ввести команду X, то УА переместится на ячейку с адресом #9Е 12. V Вернуться к исходной ячейке после прямого перехода. Позволяет вернуть- ся к адресу, в котором была выполнена команда X. Поиск байт в памяти Найти последовательность байт в памяти. На подсказку последовательно введите однобайтовые шестнадцатиричные числа. Ввод любого нецифро- вого символа заканчивает последовательность и запускает поиск. Поиск начинается с текущей ячейки памяти и продолжается до тех пор, пока последовательность не будет найдена, после чего УА установится на адрес ее первого байта. Во время поиска MONS4 просматривает также область, занимаемую им самим, и, поскольку образец хранится в специальном буфере отладчика, находит последовательность и внутри себя. Пример: Предположим, Вы хотите исследовать память, начиная с адреса #5В00, на появление последовательности #CD #B5 #03. Для этого введите следующие команды: * M5B00J установка УА G:CDJ ввод первого байта :В5 J ввод второго байта :03 J ввод третьего байта : J завершение ввода После завершения ввода, MONS4 начинает поиск заданной последова- тельности с адреса #5В00. Когда она будет найдена, УА установится на ее первый байт. *) Здесь и ниже используются следующие обозначения: J — клавиша Enter, полужирным шрифтом выделяется текст, вводимый с клавиатуры, нор- мальным — текст, выводимый на экран, курсивом — пояснения. 118
MONS4 КОМАНДЫ MONS4 N Продолжить поиск последовательности байт, заданной командой G, начи- ная с ячейки, на которую указывает У А, Просмотр программы L Вывести на экран дамп памяти. Начиная, с текущего адреса, производятся постраничное отображение содержимого памяти, В конце каждой строки кодов выводятся соответствующие им символы. Для кодов от 32 {#20) до 127 (#7F) выводятся их А5С1Ьэквиваленты. Если код меньше 32 (#20), он обозначается точкой. Если код больше 12? (#7F), то он будет пред- ставлен ASCII-символом,, соответствующим этому коду ш сброшенным старшим битом. После вывода очередной страницы, нажав клавишу отмены команды (Edit или Caps Shift/5) г можно вернуться к ФП. Любая другая клавиша продолжит вывод листинга. Symbol Shift/P Распечатать дамп памяти на принтере. Аналогично команде L, Изменение содержимого ячеек памяти и регистров Для того, чтобы изменить содержимое ячейки памяти, установите на нее УА, введите нужное значение (х©>днобайт0йае шестнадцатиричное число) и нажмите любую нецйфровую клавишу, если эта клавиша вызывает выполнение какой-либо команды MOHS4, to она будет выполнена после записи числа. Для изменения содержимого ячейки памяти без выполнения команды подтвердите ввод клавишей Space или Enter; при записи no Space указатель адреса не меняет своего положения, по Enter — перемещается на следующую ячейку. Если нужно изменить содержимое регистра Z&0, то ввод числа завер- шите нажатием Symbol Shift/M — точкой. Число будет записано в регистр, на который установлен указатель регистра (см. рис. 15), Первоначально он указывает на PC. Для перемещения указателя регистра вводите точку без числаг при этом он будет циклически перемещаться вдоль регистров, минуя только Sf>, 1 и R, содержимое которых командами MONS4 изменить невоз- можно. Y Ввести в память символьную строку. Символ, вводимый с клавиатуры, отображаемся на экране, а его» код заносится: в текущую ячейку памяти, после чего значение УА увеличивается на единицу. Клавиша Delete (Caps Shift/O) используется для удаления последнего символа строки, при этом УА переме- щается на ячейку назад. Следует отметить, что хотя символ и исчезает с экрана, его код не удаляется из соответствующей ячейки памяти. Ввод строки завершается нажатием клавиши отмены команды (Edit или Caps Shift/5) I Копировать блок памяти. На соответствующие запросы введите началь- ный (First:): и конечный (Last:) адреса блока и адрес размещения его копии (Та:), Если начальный адрес больше конечного, то команда игнорируется. MONS4 позволяет копировать с перекрытием исходного блока, то есть копия блока может располагаться поверх оригинала. 119
КОМАНДЫ MONS4 MONS4 Заполнить область памяти заданным байтом. На запросы First:, Last:, With: введите, соответственно, значения начального и конечного адресов области памяти и байт-заполнитель. Если начальный адрес больше конечного, команда игнорируется. Например, введите: M:9B10J установка У А PJ First:9B00J Last:9B20J With:AAJ Результат Ваших действий сразу отразится на экране. Дизассемблирование программы Symbol Shift/4 Дизассемблировать программу, начиная с текущей ячейки памяти. Про- изводится постраничный вывод на экран текста дизассемблированной программы. После вывода очередной страницы, нажав клавишу Edit или Symbol Shift/4, можно вернуться к ФП, любую другую — продолжить дизассемблирование. Вывод текста приостанавливается клавишей Space. Т Дизассемблировать блок кодов. На запросы First: и Last: введите соответст- венно начальный и конечный адреса блока кодов. Для вывода дизассемб- лированной программы на принтер, на запрос Printer? ответьте Y (в верхнем регистре!), после чего на запрос Labels? укажите, включать ли метки в распечатку листинга (Y — Да). При отрицательном ответе на запрос Printer? листинг будет выводиться на экран. На запрос Text: введите адрес размещения в памяти текстового файла либо имя файла на диске, префиксированное номером устройства и двоеточием. Например: Text: F000 сохранить текст в памяти с адреса #F000; Text: 2:DCODE сохранить текст на дисководе "В" в файле DCODE. Если Вы хотите просмотреть дизассемблированную программу без созда- ния текстового файла, на запрос Text: нажмите Enter. На запрос Workspace: вводится начальный адрес рабочей области, предназ- наченной для временного хранения информации о метках. По умолчанию начальный адрес устанавливается равным адресу загрузки отладчика ми- нус 4096 (YYYYY-4096). Запрос Workspace: не возникнет, если выбрано дизассемблирование без создания меток. Далее задаются начальные (First:) и конечные (Last:) адреса областей (внутри заданного блока кодов), не требующие дизассемблирования (данные, таблицы, тексты). При обработке этих областей MONS4 гене- рирует инструкции DEFB. Если значение байта данных лежит в пределах от 32 до 127 (#20...#7F), то байт интерпретируется как код ASCII и представляется соответствующим символом. Адреса областей данных записываются в память непосредственно после MONS4. После завершения определения всех областей данных для запуска дизас- семблирования на запросы First: и Last: введите пустые строки. В процессе дизассемблирования генерируются метки формата LXXXX, где ХХХХ — абсолютный^ шестнадцатиричный адрес ячейки, на которую указывает метка. Если адрес не попадает внутрь обрабатываемого блока 120
MONS4 КОМАНДЫ MONS4 кодов, метка не создается, а в мнемонике команды указывается абсолют- ный адрес. Например, последовательность кодов #СЗ #00 #78 может быть дизассемблирована и как JP L7800, и как JP #7800, в зависимости от того, входит ли ячейка с адресом #7800 в дизассемблируемый блок. Если адрес ячейки памяти входит в дизассемблируемый блок, но является не первым байтом многобайтовой команды, то метка не создается, хотя ссылки на нее в тексте будут присутствовать. Байт N, следующий за инструкцией RST 8, дизассемблируется как DEFB N, так как обычно этот байт содержит данные (точнее, код сообщения для процедуры обработки ошибки). Неопознанный код дизассемблируется как команда NOP и в листинге отмечается символом *. Дизассемблирование может быть приостановлено клавишей Space. После чего, нажав клавишу Edit или Caps Shift/5, можно прекратить дизассем- блирование, либо, нажав любую другую, продолжить. Дизассемблирование прекратится, если при генерации текстового файла его граница достигнет области памяти, занятой MONS4. Если дизассемблирование сопровождалось созданием текстового файла в памяти, то по завершении процесса будет выдано сообщение: End of the text ZZZZZ где ZZZZZ — адрес последнего байта файла. Текстовый файл создается в формате ассемблера GENS4 и может быть загружен в него для редактирования. Для сохранения текстового файла запомните начальный (введенный на запрос Text:) и конечный адреса (ZZZZZ) его размещения в памяти, вернитесь в Бейсик и запишите текст на магнитный носитель как файл типа CODE. Если в процессе дизассемблирования текстовый файл сохраняется на диске, то листинг на экран не выдается. При объеме текста более 16К создается несколько файлов. Файл или файлы с диска могут быть загруже- ны в GENS4 обычным способом. В описываемой дисковой версии MONS4 поддержка дисковода реализо- вана в оверлейном файле MONSBETA*, который автоматически подгру- жается в память с текущего дисковода сразу после ввода имени текстового файла. Если оверлей не найден, управление передается интерпретатору Бейсика с сообщением 2 Variable not found. MONSBETA размещается вслед за областью информации о каналах, поэтому размер свободной памяти ниже RAMTOP должен быть не менее 5 1 2 байт. Запуск и отладка программы Symbol Shift/Z Выполнить команду в пошаговом режиме {трассировка программы). По нажатию клавиши выполняется команда, записанная в ячейке памяти, адресуемой счетчиком команд PC**. Обратите внимание, что УА при этом может быть установлен на другую ячейку. Чтобы увидеть мнемонику команды, с которой будет начато пошаговое выполнение программы, предварительно переместите УА на ячейку, адресуемую счетчиком ко- манд. После выполнения каждого шага ФП переписывается в соответст- *) Такое решение позволяет в других режимах работы оставить размер отладчика небольшим. **) При работе отладчик использует стандартный для операционной системы режим обработки прерываний (режим 1), изменение которого командами отлаживаемой программы может привести к «зависанию» компьютера. 121
КОМАНДЫ MONS4 MONS4 вии с новым состоянием регистров и памяти, УА устанавливается на ячейку, адресуемую PC. Symbol Shift/T Выполнить одну команду. Выполняется команда, размещенная по адресу, указанному счетчиком команд PC. Если при отладке программы в поша- говом режиме встретилась команда вызова подпрограммы, трассировать которую нет необходимости, то использование команды Symbol Shift/T дает возможность выполнить подпрограмму за один шаг. После этого PC устанавливается на ячейку, следующую за инструкцией CALL. Рекомендуется использовать только для выполнения инструкций вызова подпрограмм. W Установить точку останова по текущему адресу. Расставив точки остано- ва, Вы сможете анализировать ход выполнения программы, которая в нужных местах будет прерываться с передачей управления отладчику. На ФП отобразится состояние памяти и регистров на момент прерывания программы. При задании точки останова в память, начиная с текущей ячейки, записываются три байта инструкции CALL. Предыдущее содержимое этих ячеек переписывается в буфер, расположенный за MONS4. Команда CALL, помещенная в точку останова, прерывает выполнение программы и передает управление отладчику, при этом содержимое измененных ячеек памяти восстанавливается. Например, рассмотрим следующий фрагмент программы: (#FE),A AF ВС,#00ВЕ ВС А,В С NZ,#5B17 AF А #07 С,#5В11 (#FE),A A,#7F В пошаговом режиме процесс отладки этого фрагмента займет чрезвы- чайно много времени. Ускорить его можно, поставив точку останова после внешнего цикла (адрес #5В22). Для этого установите УА на адрес #5В22 и выполните команду W. На место OUT (#FE),A и LD A,#7F будет записана инструкция CALL, вызывающая подпрограмму обработки точек останова. Командой отладчика Symbol Shift/K (см. ниже) осуществляется запуск выполнения фрагмента программы с адреса, записанного в счетчике команд. После выполнения фрагмента, управление будет передано отлад- чику, который восстановит программу в точке останова, произведет короткий звуковой сигнал и будет ожидать нажатия любой клавиши, после чего вернет на экран ФП. Точки останова изменяют программу, поэтому пользоваться ими нужно с осторожностью. Если в отлаживаемой программе» есть обращения к ячейкам, занятым точками останова, то результат ее выполнения непред- сказуем. 5B0F 5В10 5В11 5В13 5В14 5В17 5В18 5В19 5В1А 5В1С 5B1D 5В1Е 5В20 5В22 5В24 76 AF D3FE F5 01ВЕ00 ОВ 78 В1 20FB F1 ЗС FE07 38EF D3FE 3E7F HALT XOR OUT PUSH LD DEC LD OR JR POP INC CP JR OUT LD 122
MONS4 КОМАНДЫ MONS4 Рассмотрим 9174 9175 9176 9177 9178 9179 917А 917В 917С АО ) 25 20 01 С9 2D 28 F9 18 FB пример: /становки DEC JR RET DEC JR JR H NZf#9178 конец цикла L Zf#9174 #9178 после установки 25 20 01 CD XX XX F9 18 FB DEC JR CALL LD JR H NZ,#9178 mons4 SP.HL #9178 вызов п/n обработки точек останова Пусть в этом фрагменте программы точка останова (CALL mons4) уста- новлена на конец цикла (адрес #917 7). Тогда при выполнении команды JR NZ,#9178 управление будет передано ячейке, содержимое которой из- менено, что неизбежно приведет к ошибке. В этом случае есть два выхода — либо использовать для отладки программы пошаговый режим, либо установить точку останова по адресу вершины стека, то есть туда, куда вернется управление по команде RET. Symbol Shift/К Продолжить выполнение программы. Выполнение программы с адреса, находящегося в счетчике команд PC. Команда применяется для отладки программ с использованием точек останова. J Запустить выполнение программы с заданного адреса. На подсказку введите адрес, с которого необходимо запустить выполнение программы. Для возврата в MONS4 можно использовать точки останова. При запуске программы этой командой, в регистры не заносятся значе- ния, отраженные на ФП, поэтому пользоваться ею имеет смысл только для глобального запуска программ (например, для запуска GENS4 без выхода в Бейсик). Другие команды Переключить набор регистров. При запуске отладчика на ФП отобража- ется основной набор регистров (AF, HL, DE, ВС). После выполнения этой команды будет отображаться альтернативный набор (AF', HL', DE', ВС) и все действия будут выполняться над ним. Для возврата к основному набору повторно выполните команду. Symbol Shift/3 Изменить систему счисления, в которой отображаются адреса, с шестнад- цатиричной на десятичную и обратно. Содержимое ячеек памяти всегда выводится в шестнадцатиричном виде. Н Перевести число из десятичной формы в шестнадцатиричную. Введите десятичное число в пределах от 0 до 65535, нажмите любую нецифровую клавишу, и на экране появится его шестнадцатиричный эквивалент. Symbol Shift/Л Возвратиться в Бейсик. 123
ПРИМЕР СЕАНСА РАБОТЫ MONS4 ПРИМЕР СЕАНСА РАБОТЫ Рассмотрим пример отладки программы вывода чисел, приведенной в описании сеанса работы на ассемблере GENS4. Предположим, что при наборе программы в GENS4 была допущена ошибка: в строке с номером 330 в инструкции ADD A,"0" вместо символа «ноль» был вписан символ «О». В процессе ассемблирования ошибка не будет найдена, и программа будет работать, но неправильно: вместо ожидаемого числа 12345 при ее запуске на экран будет выведено WXYZ[. В памяти ZX Spectrum должна находиться оттранслированная про- грамма и MONS4, загруженный с адреса 55000. H:40000[SP] = M:?C40J ?C40[SS/M] [SS/T] [ss/z] [SS/Z] [SS/Z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] J J J J J w [SS/K] [SP] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] M9C86 w [SS/K] [SP] [ss/z] [ss/z] 9C40[SP] установка У А установка начального значения PC выполнение CALL #0DAF — очистка экрана выполнение LD A,#0A выполнение CALL #9C74 выполнение LD HL,#9C97 выполнение PUSH HL выполнение LD DE,#0001 выполнение LD В,А выполнение ID HL,0 выполнение ADD HL,DE; HL=1, CY=0 выполнение JR C,#9C85 выполнение DJNZ #9C7F выполнение ADD HL,DE выполнение JR C,#9C85 пропуск команд — установка У А на #9С85 У А указывает на команду POP HL установка точки останова выполнение программы с адреса PC обновление ФП; DE=#000A выполнение POP HL (#9C91),HL (HL).E HL (HL),D HL выполнение LD выполнение RET выполнение LD выполнение INC выполнение LD выполнение INC выполнение PUSH HL выполнение JR #9C7B У А указывает на команду LD (#9C9i),HL установка точки останова выполнение программы с адреса PC обновление ФП; DE=#0064 выполнение LD (#9C91),HL выполнение RET С 124
MONS4 ПРИМЕР СЕАНСА РАБОТЫ [SS/N] W [SS/K] [SP] M:9C91J L 9С91 9F 9С95 01 9С99 64 9C9D 10 [CS/1] M:9C48J [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] [ss/z] 9C 00 00 . . 00 0A 00 . . 00 E8 03 d . 27 00 00 . ' h . установка У А на установка точки #9С48 останова выполнение подпрограммы обновление ФП установка У А просмотр дампа памяти — таблицы степеней 9C9F — конец таблицы #000А = 10, #0064 = 100 #03Е8 = 1000 #2710= 10000 обновление ФП установка У А выполнение LD HL,#3039 выполнение PUSH HL выполнение PUSH HL выполнение LD выполнение DEC выполнение LD выполнение DEC выполнение LD выполнение LD выполнение OR выполнение JR выполнение ЕХ выполнение XOR выполнение SBC выполнение JR выполнение INC выполнение JR выполнение SBC выполнение JR выполнение ADD HL,(#9C91) HL D,(HL) HL E,(HL); DE=#2710 A,D E NZ,#9C5E; PC=#9C5E (SP),HL A HL,DE Ct#9C67 A #9C60 HL,DE C,#9C67; PC=#9C67 HL,DE [ss/z] [CS/7] 30J [SS/M] [SS/M] [SS/M] [SS/M] [SS/M] [SS/M] 3100 [SS/M] [ss/z] [ss/z] [SS/T] [ss/z] [ss/z] [SS/4] 9C50 2B A=1, т. е. первая цифра числа 12345 выполнение ADD A,#4F A=#50 ("W"), а должен быть равен #31 ("1"), ошибка — в инструкции ADD A,#4F установка У А на байт #4F занесение кода #30 в память установка указателя на регистры AF занесение кода выполнение СР выполнение JR выполнение RST выполнение ЕХ выполнение JR просмотр части программы DEC HL 1" в аккумулятор #ЗА Cf#9C70; PC=#9C70 #10 — вывод символа " 1" (SP),HL #9С50; РС=#9С50 125
ПРИМЕР СЕАНСА РАБОТЫ MONS4 9С51 56 9С52 2В 9С53 5Е 9С54 7А 9С55 ВЗ 9С56 2006 9С58 Е1 9С59 Е1 9С5А 3E0D 9С5С 07 9C5D С9 9С5Е ЕЗ 9C5F AF 9С60 ED52 9С62 3803 [CS/1] M:9C$AJ W [ss/к] >+2345 [SP] [SS/A] LD D,(HL) DEC HL LD E,(HL) LD A,D OR E JR NZ,#9C5E POP HL POP HL LD Af#0D RST #10 RET EX (SP).HL XOR A SBC HL,DE JR C,#9C67 обновление ФП установка У А установка точки останова выполнение программы с адреса PC вывод результата работы программы обновление ФП выход в Бейсик
РУСИФИКАЦИЯ ZX SPECTRUM Один из первых вопросов, который задают наши соотечественники при покупке импортного компьютера: «А можно ли его приспособить для работы с русским шрифтом, попросту — русифицировать?». Вопрос резо- нен, ведь каждый желает общаться с машиной на своем родном языке. И если Вы остановили свой выбор на ZX Spectrum, то можете не волноваться — он легко обучаем любому языку. Использование символов, определяемых пользователем Самый простой способ русифицировать ZX Spectrum — это поместить русский шрифт в область графических символов, определяемых пользователем (UDG — User defined graphics). Эти символы вводятся с клавиатуры в режиме курсора G. Область UDG представляет собой блок в ОЗУ длиной 168 байт (см. «Архитектура ZX Spectrum»). Адрес начала области задается системной переменной UDG (23675/76). Его значение можно узнать, выполнив один из следующих операторов: PRINT USR "А" либо PRINT PEEK 23675+256*РЕЕК 23676 А изменить (конечно, в разумных пределах) операторами: POKE 23675,<aApec>-256*INT(<aApec>/256): POKE 23676,№Т(<адрес>/256) или RANDOMIZE <адрес>: POKE 23675.РЕЕК 23670: POKE 23676.РЕЕК 23671 Применение UDG позволяет создать до 22 символов произвольного начертания, в том числе буквы русского алфавита — кириллицу. Вы можете возразить, что для этого маловато будет 22 знаков, и будете правы. Но обойти проблему помогает использование латинских букв, схожих по начертанию с русскими (О, А, Е и др.). Напомним, что под каждый символ на экране ZX Spectrum выделяется знакоместо, размером 8x8 точек. Его можно представить в цифровом виде как последовательность из 8 байт, в которых каждой высвеченной на экране точке соответствует установленный в единицу бит. Например, изображение графического символа в виде буквы Я, можно задать байтами: 0, 62, 66, 66, 62, 34, 66, 0 127
РУСИФИКАЦИЯ ZX SPECTRUM Прокомментируем это: 00000000 00111110 01000010 01000010 00111110 00100010 01000010 00000000 0x128+ 0x128+ 0x128+ 0x128+ 0x128+ 0x128+ 0x128+ 0X128+ 0x64+ 0x64+ 1x64+ 1x64+ 0x64+ 0x64+ 1x64+ 0x64+ 0x32+ 1x32+ 0x32+ 0x32+ 1x32+ 1x32+ 0x32+ 0x32+ 0x16+ 1x16+ 0x16+ 0x16+ 1x16+ 0x16+ 0x16+ 0x16+ 0x8+ 1x8+ 0x8+ 0x8+ 1x8+ 0x8+ 0x8+ 0x8+ 0x4+ 1x4+ 0x4+ 0x4+ 1x4+ 0x4+ 0x4+ 0X4+ 0x2+ 1x2+ 1x2+ 1x2+ 1x2+ 1x2+ 1x2+ 0x2+ 0x1 0x1 0x1 0x1 0x1 0x1 0x1 0x1 = 0 = 62 = 66 = 66 = 62 = 34 = 66 = 0 Точно также можно сконструировать и остальные символы кирилли- цы, хотя это и очень утомительно. Поэтому для тех, кто хочет побыстрее увидеть на экране Speccy все 32 русские буквы, мы предлагаем небольшую готовую программу. Она создает один из вариантов русского шрифта и загружает его в область графических символов, определяемых пользовате- лем. После запуска программы на запрос Starting address: введите начальный адрес размещения 168-байтного блока графики. Если Вас устраивает стан- дартный адрес, устанавливаемый операционной системой (65368), нажмите клавишу Enter. 9900 INPUT "Starting address: ";a$ 9905 IF a$="" THEN LET a$="65368" 9910 LETs=VAL a$ 9915 RANDOMIZE s 9920 POKE 23675,PEEK 23670: POKE 23676,PEEK 23671 9925 FOR c=1 TO 20 9930 READ a$ 9935 FOR s=0 TO 7 9940 READ sx 9945 POKE USR a$+s,sx 9950 NEXT s 9955 NEXT с 9960 DATA "B",0,124,64,124,66,66,124,0 9961 DATA "G",0,126,64,64,64,64,64,0 9962 DATA "D",0,28,36,36f36,36,126,66 9963 DATA "Г.0,73,73.62,73,73,73,0 9964 DATA T',0,66,70,74,82,98,66,0 9965 DATA "L",0,30,34,34,34,34,98,0 9966 DATA "P",0,126,66.66,66,66,66,0 9967 DATA "O",0,66,66,36,24,16,96,0 9968 DATA "C",0,68,68,68,68,68,126,2 9969 DATA "H",0,66,66,66,62.2,2.0 9970 DATA "N",0.65,73,73,73,73,127,0 9971 DATA '^",0,65,73,73,73,73,127,1 9972 DATA "£",0,60,66,30,2,66,60,0 9973 DATA "U",0,76,82,114,82,82,76,0 9974 DATA "A",0,62,66,66,62,34,66,0 9975 DATA "S",24,66,70,74(82,98f66f0 9976 DATA "R",0,64,64,124,66,66,124,0 9977 DATA "T",0,192,64,124,66.66,124,0 9978 DATA "Fff,0,62,73,73,73,62,8,0 9979 DATA "Q",0.66,66,114,74,74,114,0 Если в эту программу вставить строку 9956 RETURN то ее можно использовать как подпрограмму, например: 10 LET s=23296: GO SUB 9915: REM s - адрес загрузки шрифта 20 PRINT "РУССКИЙ ЗНАКОГЕНЕРАТОР ЗАГРУЖВН С АДРЕСА ";s 128
РУСИФИКАЦИЯ ZX SPECTRUM После выполнения программы вместо латинских букв в режиме курсора G на экране будут печататься следующие русские: Q G 1 В Ы Г и Б Р т 1 А д ъ Л я Е н Q N Э ч У ш F и с м ф ю U R J Р S ь ж п й Вместо остальных русских символов используйте эквивалентные по написанию заглавные латинские буквы А, В, Е, К, М, Н, О, Р, С, Т, X и цифру 3. На самом деле, вовсе не обязательно приведенную программу загру- жать и выполнять каждый раз, когда Вам нужен русский шрифт. Достаточно сделать это один раз и записать сформированную область UDG-символов на магнитный носитель в виде кодового файла: SAVE "RUS"CODE USR "A", 168 После этого Вы сможете, вставив в любую программу команду LOAD "RUS"CODE загрузить эти 168 байт и пользоваться кириллицей. Если Вам не нравится начертание какой-либо русской буквы, можете самостоятельно ее нарисовать и вычислить значения соответствующих 8 байт. Хотя, конечно, можно и облегчить себе жизнь, воспользовавшись одной из множества специальных программ, с помощью которых символы конст- руируются быстро и наглядно. Несмотря на ряд преимуществ (быстрый доступ посредством режима Graphics, относительно небольшой объем занимаемой памяти), этот способ русификации Speccy обладает и очевидными недостатками: необходимость перехода из режима курсора G в режим С в процессе работы с русским текстом, невозможность одновременного определения заглавных и строчных букв (из-за малого размера области UDG), нестандартное расположение символов на клавиатуре. Использование дополнительных фонтов Другим, более гибким способом русификации является переключение работы компьютера с основного набора символов {фонта) на другой, подгру- жаемый в память. Полный набор символов ZX Spectrum состоит из 96 знаков — боль- шие и маленькие латинские буквы, цифры, знаки препинания и т. д. Он занимает в ПЗУ 96x8=768 байт и не может быть изменен. Однако существует системная переменная CHARS, указывающая местоположение набора сим- волов, с которым в данный момент работает компьютер (текущего фонта). Изменив значение этой переменной, можно назначить текущим фонт, рас- положенный по другому адресу, например, в ОЗУ. Переменная CHARS находится по адресам 23606/07 и при работе со стандартным набором указывает на адрес 15360 (число, на 256 меньшее адреса начала фонта в ПЗУ, см. «Системные переменные»). Для изменения адреса текущего фонта нужно выполнить следующие операторы: INPUT "address: ";a: REM адрес нового фонта POKE 23606,a-256*INT (a/256): POKE 23607.INT (а/256)-1 Русифицированный фонт может быть сформирован с помощью лю- бой из многочисленных графических программ, позволяющих манипулиро- 9-1102 129
РУСИФИКАЦИЯ ZX SPECTRUM вать шрифтами. Можно порекомендовать редактор Art Studio. При создании кириллицы встает вопрос, какому латинскому символу должна соответство- вать конкретная русская буква. Вопрос этот не слишком принципиальный, однако есть определенные стандарты, которыми стоит руководствоваться. Обычно устанавливают такое соответствие: А Б В Г д Е Ж 3 А В W G D Е V Z И и к Л м н о п 1 J к L м N О Р Р С т У ф X ц ч R S т и F Н С ш щ ъ ы ь э ю я г 1 7 Y X \ @ Q а 6 в г д е ж 3 а Ь w а d е V z и и к Л м н о п i k 1 m n о p p с T у Ф X u 4 r s t u f h с t Ш Ш ъ Ы b Э Ю я { } у X 1 f q Файл с полным набором символов, созданных в графическом редак- торе, записывается на магнитный носитель и обычно имеет длину 7 68 байт. Для загрузки фонта и назначения его текущим можно воспользоваться следующей подпрограммой: 9989 INPUT "Starting address: ";a: REM адрес загрузки шрифта 9990 IF a<25000 OR a>64768 THEN GO TO 9989 9991 CLEAR a-1: LET a=PEEK 23730+256*PEEK 23731 + 1 9992 LET RUS=9996: LET LAT=9998 9993 LOAD "RUS"CODE a: REM загрузка шрифта 9994 LET a2=INT (a/256)-1: LET a1=a-256*INT (a/256) 9995 STOP 9996 POKE 23606fa1: POKE 23oU7(a2: REM русский регистр 999Z_£ETURN 9998 POKE 23606,0: POKE 23607,60: REM латинский регистр 9999 RETURN Теперь для переключения на русский шрифт достаточно вызвать подпрограмму, расположенную со строки 9996, то есть выполнить оператор GO SUB RUSf а для возвращения к латинскому — оператор GO SUB LAT. Пере- ключения можно производить как в непосредственном режиме, так и встав- ляя операторы GO SUB в программу. В последнем случае можно получать на экране одновременно и латинский, и русский текст. Например, дописав в рассмотренную выше программу не совсем понятную строку 10 GO SUB LAT: PRINT "ZX Spectrum -";: GO SUB RUS: PRINT "moj drug" и запустив программу командой RUN, на экране получим вполне осмысленную фразу: ZX Spectrum — мой друг При пыводе листинга текст на экране может быть представлен только либо латинским, либо русским шрифтом. Адрес размещения подгружаемого' фонта рекомендуется выбирать в конце ОЗУ (например, 64768). Количество дополнительных фонтов, одно- временно находящихся в памяти, ограничено лишь ее обт>емом. Гили область, которую занимают фонты, защитить оператором CLEAR (кпк это сделано в приведенном примере), то они не будут удаляться из памяти даже после выполнения оператора NEW. Заметим, что этот способ русификации программ наиболее универ- сален — такие программы будут работать на любом Spectrum-совместимом компьютере, в отличие от других вариантов, когда, например, русский фонт «зашивается» и стандартное ПЗУ. Правда, размещение кириллицы в ПЗУ дает и определенные удобства, но, обычно, лишь ценой частичной, а иногда и полной потери совместимости с ZX Spectrum.
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ Для хранения и обработки служебной информации (значений коор- динат точек, адресов таблиц, текущих атрибутов и т. п.) операционная система ZX Spectrum использует так называемые системные переменные, под размещение которых отведена специальная область ОЗУ. При описании системной переменной вслед за именем указывается ее десятичный и шестнадцатиричный адрес. Адреса двух- и трехбайтовых переменных записываются через косую черту, например: 23563/64 (#5СФВ/вС) . В этих переменных младший байт числа, как принято в микропроцессоре Z80, хранится в ячейке с меньшим адресом. Для блока переменных указываются начальный и конечный адреса, разделенные мно- готочием, например, 23552...23559 (#5Ct0...#5C07) . Во время работы интерпретатора Бейсика индексный регистр IY содер- жит адрес переменной ERR_NR 236If (#5C3A), и, следовательно, для обращения к системным переменным удобно использовать индексный метод адресации. Поэтому для каждой переменной приведена величина смещения адреса ее первого байта относительно значения регистра IY, например, IY—50. Учитывая последнее, может возникнуть желание, изменив значение IY, переместить область системных переменных. Однако авторы операцион- ной системы, вероятно, не продумали этот вопрос и для обращения к системным переменным использовали их физические адреса, привязав, таким образом, область системных переменных к конкретному месту в памяти. KSTATE 23552...23559 (#5С00...#5С07) Восемь байт составляют два блока, которые используются программой обслу- живания клавиатуры (см. табл. 7). Для организации работы внешних про- грамм эти переменные практически не применяются. Таблица 7. Назначение байтов области KSTATE. Название KSTATE0 KSTATE4 KSTATE 1 KSTATE5 KSTATE2 KSTATE6 KSTATE3 KSTATE4 Адрес 23552 IY-58 (#5С00) 23556 IY-54 (#5С04) 23553 IY-57 (#5С01) 23557 IY-53 (#5С05) 23554 IY-56 (#5С02) 23558 IY-52 (#5С06) 23555 IY-55 (#5С03) 23559 IY-51 (#5С07) Назначение Значение 255, если блок свободен, либо код на- жатой клавиши (независимо от регистра) Счетчик, служащий для устранения «дребезга» клавиатуры Счетчик, определяющий период автоповтора при длительном нажатии на клавишу Код нажатой клавиши 131
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ LAST_K 23560 IY-50 (#5C08) Код последней нажатой клавиши. REPPEL 23561 IY-49 1#5С09) Величина задержки (в 1/50 с) между нажатием клавиши и началом автома- тического повторения нажатия {автоповтора). REPPER 23562 IY-48 (#5С0А) Период автоповтора (в 1/50 с) при длительном нажатии на клавишу. Изменяя системные переменные REPDEL и REPPER, можно настроить клавиа- туру под конкретного пользователя. DEFAPP 23563/64 IY-47 1#5С0В/0С) Адрес первого параметра пользовательской функции, определенной опера- тором DEF FN, в процессе ее обработки. Например: DEF FN n(a,b)=SIN a+COS b DEF FN n DEFADD K_PATA 23565 1Y-45 |#5C0P) Код цвета, заданный цифровой клавишей в режиме курсора Е. TVDATA 23566/67 IY-44 l#5C0E/0F) Первый байт - код управления, заданный цифровой клавишей в режиме курсора Е. Второй байт - первый параметр в AT или TAB. STRMS 23568...23605 IY-42 |#5С10...#5С35) Область хранения информации о потоках (более подробно см. «Архитектура ZX Spectrum. Каналы и потоки»). CHARS 23606/07 IY-4 (#5С36/37) Адрес размещения текущего набора символов. После запуска компьютера — адрес стандартного набора 15360. Поскольку символы с кодами от 0 до 3 1 являются управляющими и в фонте не определяются, то адрес действительного положения текущего набора на 256 (32x8) больше, чем указанный системной переменной CHARS. Напри- мер, для назначения текущим фонта, расположенного о адреса 64768, в переменную CHARS необходимо записать число 64512 (64768-256). RASP 23608 1Y-2 |#5С38) Число, пропорциональное длительности звукового сигнала, предупреждаю- щего о заполнении буфера редактора. PIP 23609 IY—1 |#5С39) Число, пропорциональное длительности звучания сигнала при нажатии на клавишу. 132
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ ERRNR 23610 1Y+0 |#5СЗА) Число, на единицу меньшее кода сообщения, выдаваемого при ошибке (включая сообщение о нормальном завершении выполнения программы 0 ОК). FLAGS 23611 IY+1 1#5СЗВ) Отдельные биты этой переменной используются операционной системой (см. также переменную FLAGS2). Бит 0 установлен, если не нужно выводить пробел перед бейсик-оператором. (При выводе на экран или печати большинства операторов Бейсика перед ними выводится пробел.) Бит 1 установлен, если для вывода используется поток #3 (обычно — принтер). Бит 2 установлен при вводе символа в режиме курсора L, сброшен при вводе в режиме курсора К. Бит 3 установлен при ожидании ввода символа в режиме курсора L, сброшен при ожидании ввода в режиме К. Бит 5 устанавливается при нажатии на любую символьную клавишу. Код клавиши можно прочитать из переменной LAST_K. Бит 6 установлен при обработке числового выражения, сброшен при обработке символьного. Бит 7 установлен при проверке синтаксиса введенной строки, сброшен при выполнении программы. TV_FLAG 23612 IY+2 (#5СЗС) Отдельные биты этой переменной используются для управления выводом на экран. Бит 0 установлен при выводе на служебный экран, сброшен при выводе на основной экран. Бит 3 установлен, если режим вывода на экран мог измениться и требуется проверка режима. Бит 4 установлен при выводе листинга программы. Бит 5 установлен при необходимости очистить служебный экран (напри- мер, перед выводом сообщения). ERR_SP 23613/14 IY+3 (#5C3D/3E) Адрес, на который устанавливается указатель стека при запуске программы обработки ошибок. Изменив значение переменной, можно подключить собствен- ные процедуры обработки ошибок (см. «Использование подпрограмм ПЗУ»). LIST_SP 23615/16 IY+S |#5C3F/40) Сохраняет адрес вершины стека в процессе вывода листинга программы. МОРЕ 23617 IY+7 (#5С41) Число, определяющее режим ввода с клавиатуры: 0 — очередной символ вводится в режимах курсора К, L или С; 1 — очередной символ вводится в режиме курсора Е; 2 и более — очередной и последующие символы вводятся в режиме кур- сора G. При значении, превышающем 2, меняется внешний вид курсора. NEWPPC 23618/19 1Y+8 (#5С42/43) Номер строки бейсик-программы, в которой расположен следующий выпол- няемый оператор. 133
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ NSPPS 23620 IY+10 1#5C44) Номер следующего выполняемого оператора в строке бейсик-программы. Переменные NEWPPC и NSPPS можно использовать для перехода к произволь- ному оператору в бейсик-программе. РРС 23621/22 IY+11 (#5С45/46) Номер строки бейсик-программы, в которой расположен выполняемый оператор. При выполнении оператора в непосредственном режиме в переменную записано число 65534 (#FFFE). SUBPPC 23623 IY+13 (#5С47) Номер выполняемого оператора в строке бейсик-программы. BORDCR 23624 IY+14 (#5С48) Атрибуты служебного экрана. Цветом фона служебного экрана определяется цвет бордюра. Е_РРС 23625/26 IY+15 |#5С49/4А) Номер строки бейсик-программы, отмеченной курсором. VARS 23627/28 IY+17 |#5С4В/4С) Адрес начала области переменных бейсик-программы. PEST 23629/30 IY+19 (#5С4Р/4Е) Адрес первого символа имени обрабатываемой в данный момент перемен- ной. CHANS 23631/32 IY+21 (#SC4F/50) Адрес начала области информации о каналах (см. «Архитектура ZX Spectrum»). CURCHL 23633/34 IY+23 |#5С51/52) Адрес первого байта описателя текущего канала в области информации о каналах (см. «Архитектура ZX Spectrum»). PROG 23635/36 IY+25 (#5C53/54) Адрес начала бейсик-программы. Вычитанием значения системной пере- менной VARS из значения PROG, вычисляется длина бейсик-программы. NXTLIN 23637/38 IY+27 (#5С55/56) Адрес начала следующей строки бейсик-программы. PATADP 23639/40 IY+29 (#SCS7/S8) Адрес последнего считанного оператором READ объекта данных в операторах DATA. E_LINE 23641/42 IY+31 (#5C59/5A) Адрес начала редактируемой строки. 134
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ K_CUR 23643/44 IY+33 |#5C5B/5C) Адрес символа редактируемой строки, на который установлен курсор. СН__АРР 23645/46 IY+35 (#5С5Р/5Е) Адрес следующего обрабатываемого символа в бейсик-программе. Переменная может быть полезна при использовании внешних процедур обработки синтаксиса. X__PTR 23647/48 IY+37 (#5C5F/60) Адрес символа бейсик-строки, вслед за которым установлен знак ? при обнаружении синтаксической ошибки. В операциях, не связанных с провер- кой синтаксиса, переменная может использоваться компьютером для времен- ного хранения другой служебной информации. WORKSP 23649/50 IY+39 |#5С61/62) Адрес начала рабочей области бейсик-программы. STKBOT 23651/52 IY+41 t#5C63/64) Адрес начала стека калькулятора. STKEND 23653/54 IY+43 |#5С65/6б) Адрес вершины стека калькулятора. BREG 23655 IY+45 |#5С67) Регистр В калькулятора. МЕМ 23656/57 IY+46 |#5С68/69) Адрес области памяти, используемой калькулятором. Как правило, для этих целей используется системная область МЕМВОТ. FLAGS2 23658 IY+48 (#5С6А) Отдельные биты этой переменной используются операционной системой (см. также переменную FLAGS). Бит 0 установлен при необходимости очистить основной экран после ввода строки. Бит 1 установлен, если буфер принтера уже использовался. Бит 2 установлен, если основной экран очищен. Бит 3 установлен при использовании режима курсора С, сброшен при использовании режима курсора L. Изменением состояния этого бита можно программно устанавливать режимы регистров клавиатуры С или L. Бит 4 установлен при использовании режима курсора К. PF__SZ 23659 IY+49 (#5С6В) Количество строк в служебном экране. Число строк в основном экране может быть увеличено до максимума (24 строки) выполнением оператора РОКЕ 23659,0. Однако, если количество сгрок в служебном экране меньше 2, то при попытке вывода на него любого сообщения, например, ОК или BREAK — CONT repeats, система будет вести себя самым неприличным образом. Запись в DF_SZ нуля — один из способов защиты бейсик-программ от останова. 135
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ S_TOP 23660/61 IY+50 t#5C6C/6D) Номер строки бейсик-программы, начиная с которой выводится автомати- ческий листинг (по нажатию клавиши Enter). OLDPPC 23662/63 IY+52 (#5C6E/6F) Номер строки бейсик-программы, начиная с которой будет продолжено выполнение программы после ввода оператора CONTINUE. OSPCC 23664 IY+54 |#5C70) Номер оператора в строке бейсик-программы, начиная с которого будет продолжено выполнение программы после ввода оператора CONTINUE. FLAGX 23665 IY+55 1#5С71) Используется при обработке оператора INPUT. Бит 1 установлен, если оператором INPUT вводится новая переменная. Бит 5 установлен при работе в режиме ввода оператором INPUT, сброшен — в режиме редактирования бейсик-строки. Бит 6 установлен при обработке строки, введенной оператором INPUT. Бит 7 установлен, если выполняется оператор INPUT LINE. STRLEN 23666/67 IY+56 (#5C72/73) Длина обрабатываемой символьной переменной (ранее определенной) либо идентификатор числовой или новой символьной переменной (младший байт). T_ADDR 23668/69 IY+58 (#5С74/75) Адрес следующего элемента в таблицах синтаксиса, расположенных в ПЗУ. SEED 23670/71 IY+60 (#5С76/77) Значение, используемое для вычисления псевдослучайного числа. После вы- полнения оператора RANDOMIZE, переменная SEED изменяется в соответствии со введенным параметром. Если RANDOMIZE использовался без параметров, то в переменную SEED копируются два младших байта из переменной FRAMES. FRAMES 23672/73/74 IY+62 |#5C78/79/7A) Системный счетчик. После запуска (сброса) компьютера обнуляется. При работе со стандартной процедурой обработки прерываний значение счетчи- ка каждые 1/50 секунды увеличивается на единицу. UDG 23675/76 IY+65 (#5С7В/7С) Адрес начала области, используемой для размещения определяемых пользо- вателем символов (см. «Русификация ZX Spectrum»). COORDS 23677/78 IY+66 (#5C7D/7E) Координаты X и Y последней изображенной на экране точки. P_POSN 23679 IY+69 (#5C7F) Содержит значение 33-п, где п — номер следующей позиции печати в буфере принтера. 136
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ PR_CC 23680 IY+70 |#5C80) Младший байт адреса области, используемой в текущий момент под буфер принтера. NOT_USED 23681 IY+71 (#5C8l) В большинстве описаний эта переменная характеризуется как неиспользуемая (о чем говорит ее название), но в действительности она содержит старший байт адреса области, используемой в текущий момент под буфер принтера. При выводе на ZX Printer операционная система подготавливает строку к печати в буфере, расположенном по адресу, указанному переменными PR_CC и NOTUSED ЕСНО_Е 23682/83 IY+72 (#5С82/84) Позиция (номер строки и колонка) следующего символа вводимой бейсик-строки. DF_CC 23684/85 IY+74 |#5С84/85) Адрес байта, соответствующего верхней линии точек знакоместа основного экрана, в которое будет осуществлен вывод следующего символа. DFCCL 23686/87 IY+76 (#5С86/87) Адрес байта, соответствующего верхней линии точек знакоместа служебного экрана, в которое будет осуществлен вывод следующего символа. S_POSN 23688/89 IY+78 (#5С88/89) Координаты следующей позиции вывода на основной экран. Координаты хранятся в виде: 24-пг, 33-пс где пг — номер строки, пс — номер столбца. SPONSL 23690/91 IY+80 |#5С8А/8В) Координаты следующей позиции вывода на служебный экран. SCR_CT 23692 IY+82 |#5С8С) Число, на единицу большее количества строк, передвигаемых по экрану вверх без запроса scroll?. Изменением содержимого этой ячейки можно добиться безостановочного скроллинга экрана при выводе текста. ATTR_P 23693 IY+83 I#5C8D) Постоянные атрибуты экрана, задаваемые операторами PAPER, INK, FLASH и BRIGHT*. MASK_P 23694 IY+84 I#5C8E) Маска для разделения постоянных (ATTR_T) и текущих атрибутов при выводе на экран. Если в MASK_P бит установлен, то соответствующий бит атрибута при выводе на экран не изменяется. *) Формат хранения атрибутов соответствует формату их записи в области атрибутов, см. «Архитектура ZX Spectrum». 137
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ ATTRJT 23695 IY+85 (#5C8F) Временные атрибуты, используемые при выводе на экран, например, опе- ратором PRINT INK 7; PAPER 1;"...". MASKJT 23696 IY+86 (#5C90) Маска для разделения временных (ATTR__P) и текущих атрибутов при выводе на экран. P__FLAG 23697 IY+87 1#5С91) Параметры вывода на экран. Четные биты используются для постоянных параметров, нечетные — для временных: Бит 0/1 установлен при использовании OVER 1; Бит 2/3 установлен при использовании INVERSE 1 ; Бит 4/5 установлен при использовании INK 9; Бит 6/7 установлен при использовании PAPER 9. МЕМВОТ 23698...23727 |#5C92...#5CAF) Область, используемая калькулятором для размещения значений, которые неудобно обрабатывать через стек калькулятора. NMIADD 23728/29 IY+118 (#5СВ0/В1) Не используется. Авторы системы, очевидно, предполагали задействовать эту системную переменную для обслуживания немаскируемых прерываний, но из-за допущенной неточности переменная действительно оказалась неис- пользуемой.* RAMTOP 23730/31 IY+120 (#5СВ2/В3) Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика. Устанавливается оператором CLEAR. P_RAMT 23732/33 IY+122 (#5CB4/B5) Адрес последнего байта физического ОЗУ. Устанавливается при инициали- зации компьютера после теста доступной памяти. В исправном компьютере с объемом оперативной памяти 48К переменная должна содержать значение 65535 (#FFFF). *) Интерфейсы некоторых внешних устройств задействуют эту перемен- ную. Например, интерфейс принтера ZX Lprint III хранит в ней значение скорости обмена по последовательному каналу.
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ Использование подпрограмм ПЗУ ZX Spectrum может значительно облегчить программирование на ассемблере. Например, почти полностью отпадает необходимость в самостоятельном написании процедур ввода/вы- вода (прибегать к этому приходится только в случаях, когда не удовлетворяет скорость или гибкость стандартных подпрограмм). Ниже описаны подпрограммы ПЗУ, наиболее часто используемые на практике. Перед вызовом большинства из них необходимо настроить регистро- вую пару HL1 на адрес 10082 (#2762), а в индексный регистр IY записать адрес системной переменной ERR_NR: 23610 (#5СЗА).* Ввод/вывод Установка текущего потока: CALL 5633 (#1601) Подпрограмма устанавливает текущим поток, номер которого указан в регистре А (см. «Архитектура ZX Spectrum»). Операционная система ZX Spectrum предоставляет пользователю 4 потока: поток 0 и 1 - ввод с клавиатуры, вывод на служебный экран; поток 2 - вывод на основной экран; поток 3 - вывод на принтер; Потоки с номерами от 4 до 15 открываются при подключении различ- ных внешних устройств (дисковых накопителей, контроллеров сети и т. п.). Вывод символа в поток: RST 16 (#0010) Подпрограмма выводит в текущий поток символ, код которого занесен в регистр А. Процедура может быть также использована для смены парамет- ров вывода на экран (аналогично выполнению операторов INK, PAPER, TAB, AT и др.). Для этого необходимо вывести в поток соответствующий управля- ющий код (см. «Контрольные коды ZX Spectrum») и сразу за ним — требу- емый аргумент (номер цвета, позицию печати и т. д.). Контроль нажатия клавиши BREAK: CALL 8020 (#1F54) Процедура сбрасывает флаг переноса CY, если в момент ее выполне- ния нажимается клавиша Break (Caps Shift/Space), в противном случае флаг устанавливается. *) Регистр IY должен настраиваться на ERR_NR также, когда в программе используется режим прерываний 1 и прерывания разрешены. 139
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ Очистка всего экрана: CALL 3435 (#0Р6В) Подпрограмма очищает основной и служебный экраны и, в соответ- ствии с системными переменными ATTR_P (23693) и BORDCR (23624), устанавливает атрибуты. После выполнения этой и следующей процедуры текущим устанав- ливается поток номер 2. Очистка служебного экрана: CALL 3438 |#0D6E) служебный экран, атрибуты для которого с системной переменной BORDCR (23624). Скроллинг экрана: CALL 3582 (#0DFE) Подпрограмма очищает служебный экран, атрибуты для которого устанавливаются в соответствии с системной переменной BORDCR (23624). Процедура перемещает содержимое основного экрана вверх на одну символьную строку. Изображение точки на экране: CALL 8933 (#22Е5) Координаты точки задаются содержимым регистровой пары ВС. В регистр В заносится значение координаты Y (0...175), в С — координаты X (0...255). Атрибуты знакоместа, в которое попадает точка, задаются систем- ной переменной ATTR_P (23693). Вывод числа в поток в десятичной форме Для вывода в текущий поток целых чисел последовательно вызовите две подпрограммы: CALL 11566 (#2D2E) CALL 11747 (#2DE3) Первая подпрограмма помещает число в стек калькулятора, вторая — выводит его в текущий поток. Число, предназначенное для вывода, должно находиться в регистровой паре ВС. Незначащие нули игнорируются. Ввод символа с клавиатуры Для опроса клавиатуры чаще всего используют системные перемен- ные LAST_K (23560) и FLAGS (2361 1). При установленном режиме преры- ваний 1 и разрешенных прерываниях, переменная LAST_K содержит код последней нажатой клавиши, а 5-й бит переменной FLAGS устанавливается при нажатии любой клавиши. Таким образом, ожидание нажатия произволь- ной клавиши можно организовать с помощью следующей подпрограммы: KEY El RES 5,(IY+1) LOOP BIT 5,(IY+1) JR Z.LOOP LD A,(IY-50) RET разрешение прерывании сброс 5-го бита системной переменной FLAGS клавиша нажата? переход на LOOP, если не нажата чтение кода нажатой клавиши из системной переменной LAST__K возврат из подпрограммы Приведенная подпрограмма ждет нажатия любой клавиши и возвра- щает ее код в аккумуляторе. Ожидание ввода: CALL 5598 (#15DE) Подпрограмма осуществляет ввод из текущего потока. По окончании ввода одного байта процедура проверяет флаг переноса CY. Если он уста- 140
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ новлен, происходит выход из подпрограммы, в противном случае проверя- ется флаг нуля Z. Если Z установлен, процедура ввода повторяется. При условии Z=0 управление передается операционной системе, которая выдает сообщение 8 End of file. Если текущим установлен поток 1 (обычно — канал "К"), подпрограм- ма осуществляет опрос клавиатуры, и после нажатия клавиши помещает ее код в аккумулятор. Однако существует сложность: если бит 3 системной переменной TVFLAG (23612) установлен, то параллельно вводу символов с клавиатуры на служебном экране будет отображаться содержимое буфера редактора. Звуковой сигнал: CALL 949 (#03В5) Перед вызовом подпрограммы в регистровые пары HL и DE помеща- ются числа (0...65535), пропорциональные, соответственно, частоте звуково- го сигнала и его длительности. При этом нужно учитывать линейную зависимость между частотой и длительностью — чем выше тон, тем короче звук. Необходимые значения рассчитываются следующим образом: HL = (437500/f)-30.125 DE = f * t где f — частота в Гц, t — время в сек. Например, для воспроизведения в течении 1 секунды ноты «ДО» первой октавы (частота примерно 261 Гц) в HL необходимо поместить число 1646, а в DE — число 261. Печать сообщений: CALL 3082 (#0С0А) Для выполнения этой подпрограммы в регистровую пару DE загру- жается начальный адрес таблицы сообщений, в регистр А — номер сообще- ния в ней. Первое сообщение имеет номер 0. Первым байтом в таблице должен стоять код 128 (#80). Для задания конца сообщения старший бит его последнего байта должен быть установлен в единицу. Пример: LD А,0 ; печать первого CALL PRIMES ; сообщения в таблице PR MES LD CALL RET DE.MESJTAB 3082 ; вывод сообщения на основной экран MES TAB DEFB #80 DEFM "ENTR" DEFB "Y"@#80 DEFM "ENTRY " DEFB "2"@#80 начало таблицы начало сообщения "ENTRY" конец сообщения второе сообщение "ENTRY 2" Изображение окружности: CALL 9005 (#232D) Параметры окружности предварительно помещаются в стек калькуля- тора в следующем порядке: X, Y (координаты центра окружности) и Z (радиус). Сделать это можно с помощью специальной подпрограммы, размещенной по адресу 11560 (#2D28), которая заносит в стек калькулятора содержимое аккумулятора. Следует учитывать, что процедура изображения окружности изменяет значение системной переменной COORDS (23677/78). 141
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ LD PUSH LD CALL LD CALL LD CALL CALL POP LD HL,(23677) HL A,X #2D28 A,Y #2D28 A,Z #2D28 #232D HL (23677),HL В качестве примера приведем следующую программу: запоминаем текущие координаты (COORDS) координата X (от 0 до 255) запись аккумулятора в стек координата Y (от 0 до 175) запись аккумулятора в стек Z - радиус запись аккумулятора в стек изображение окружности восстанавливаем координаты (COORDS) Изображение линии: CALL 9399 (#24В7), CALL 9146 (#23ВА) Для процедуры изображения линии, расположенной с адреса 9399 (# 24 В7),-параметры передаются так же, как и для процедуры изображения окружности — через стек калькулятора. На практике удобнее пользоваться подпрограммой по адресу 9146 (#23ВА), параметрами для которой являются значения регистровой пары ВС и системной переменной COORDS (23677/78). В регистры В и С записываются соответственно величины смещений относительно текущих координат Y (0...175) и X (0...255), содер- жащихся в системной переменной COORDS. Знаки смещений по Y и X задаются в регистрах D и Е соответственно записью в них следующих значений: +1 (#01) — положительное, —1 (#FF) — отрицательное. С использованием CALL 914& (#23ВА) можно легко реализовать ассем- блерный эквивалент команды Бейсика DRAW. Например, результат выпол- нения следующей программы аналогичен выполнению команды DRAW 0,20: LD ВС, #1400 ; 20,0 LD DE,#0101 ; знаки смещений CALL 9146 LD LD LD LD LD LD LD CALL L.127 H.87 (23677),HL C.20 E.-1 B,40 D,1 9146 Для изображения отрезка с координатами начала (127,87) и смеще- нием конца (—20,40) перед вызовом подпрограммы необходимо настроить системную переменную COORDS: ; стартовые координаты Х=127 и Y=87 записываются в COORDS : смещение по X задается равным —20 ; смещение по Y — равным +40 : изображение отрезка Очистка части экрана: CALL 3652 (#0Е44) Подпрограмма служит для очистки нижней части экрана. Количество строк, которые необходимо очистить, указывается в регистре В. Скроллинг части экрана: CALL 3584 (#0Е00) Подпрограмма перемещает вверх на одну символьную строку ниж- нюю часть экрана. В регистр В записывается число, на единицу меньшее количества строк, которые необходимо переместить. 142
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ Загрузка и запись файлов на магнитофон Как правило, файл, записанный на магнитной ленте, состоит из двух блоков, первый из которых называется заголовком и содержит информацию о файле (тип, длина и т. п.), второй — собственно данные. Подпрограмма ПЗУ загружает и обрабатывает заголовок и на основе полученной информа- ции загружает данные. Длина заголовка составляет 17 байт: байт 0 — тип файла: 0 — бейсик-программа; 1 — числовой массив; 2 — символьный массив ; 3 — двоичный (кодовый) файл, байты 1...10 — имя файла; байты 11, 12 — длина блока данных; байты 13, 14 — для типа 0: номер строки автозапуска; — для типа 3: начальный адрес загрузки; байт 14 — для типов 1 и 2 — имя и тип массива в следующей форме: биты 0...4 — имя массива (A...Z); бит 5 — 0, если массив числовой; бит 6 — 1, если массив символьный; бит 7 — всегда установлен; байты 15, 16 — длина бейсик-программы. Загрузка файла без заголовка: CALL 1366 (#0556) Процедура предназначена для загрузки с ленты блока кодов и про- верки записи. Она используется следующим образом: LD 1Х,<начальный адрес> LD ОЕ,<Дпина блока> LD А,<флаг> SCF CALL 1366 ; вызов процедуры загрузки RET В индексный регистр IX загружается адрес ячейки памяти, начиная с которой будет производиться проверка или загрузка блока кодов. В регистро- вую пару DE помещается длина загружаемого файла в байтах, а в регистр А — так называемый флаговый байт. Он равен нулю, если ожидается заголовок, и 255 — если тело файла (возможны и другие значения флагового байта). Загрузка кодового блока будет производиться, если перед выполнением про- цедуры был установлен флаг CY, проверка блока — если CY сброшен. По возврату из процедуры, если загрузка (проверка) произведена успешно, флаг CY устанавливается, в противном случае — сбрасывается. Прервать загрузку (проверку) блока можно, нажав клавишу Break, при этом на экран выдается сообщение BREAK - CONT repeats. Для запрещения преры- вания загрузки нужно несколько изменить программу вызова процедуры: LD 1Х,<начальный адрес> LD ОЕ,<длина блока> номер начального цвета бордюра + 8 LD SCF INC ЕХ DEC DI LD OUT CALL А,<фл« D AF,AF' D A,15 (254),A 1378 143
ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ ПЗУ LD А,7 ; восстановление цвета бордюра OUT (254),A EI RET Если при возврате из этой подпрограммы флаг переноса равен нулю, то это означает, что либо загрузка (проверка) произведена с ошибкой, либо во время загрузки была нажата клавиша Break. Более точно установить причину ошибочного завершения операции можно, опросив клавиатуру. Запись файла без заголовка: CALL 1218 (#04С2) Подпрограмма служит для записи данных на магнитофон и вызыва- ется аналогично процедуре загрузки: LD 1Х,<начальный адрес> LD ОЕ,<дпина блока в байтах> LD А,<флаг> CALL 1218 RET При нажатии клавиши Break выполнение процедуры будет прервано и выдано сообщение BREAK — CONT repeats, чего можно избежать, запустив процедуру не с адреса 1218, а с 1222. Написание собственных подпрограмм обработки ошибок бейсик-интерпретатора Процедура выхода по ошибке расположена в ПЗУ с адреса 8 и вызывается следующим образом: RST 8 DEFB <код соо6щения> При выполнении процедуры указанный код записывается в перемен- ную ERR NR (23610), затем с помощью системной переменной ERR_SP (23613/lT) восстанавливается стек и процессор переходит к выполнению процедуры обработки ошибок. Изменив адрес, хранящийся в переменной ERR_SP, можно подключить собственные подпрограммы обработки ошибок. Предположим, Вы поместили свою процедуру обработки ошибок с адреса 40000 (пусть, к примеру, она генерирует звуковой сигнал, после чего обработка ошибок продолжается обычным образом). Для подключения этой процедуры можно воспользоваться следующей программой: LD HL,(23613) LD BC.40000 LD E,(HL) LD (HL),C INC HL LD D,(HL) LD (HL),B LD (ERR RET),DE RET ERRJSET DEFW 0 ORG 40000 LD HL.1646 LD DE.261 CALL 949 LD HL,(ERR_RET) JP (HL) После выполнения этой программы при возникновении любых оши- бок будет выполняться процедура, расположенная по адресу 40000. Локаль- ная переменная ERR_RET используется для сохранения предыдущего адреса возврата по ошибке. 144
ТАБЛИЦА СИМВОЛОВ д 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 111 00 01 02 03 04 05 06 07 08 09 0А ОВ ОС 0D ОЕ OF 10 11 12 13 14 15 16 17 18 19 1А IB 1С ID IE IF 20 21 22 23 24 25 26 Символ ZX Spectrum \ / CM. l «Контрольные I KOflbl ZX Spectrum» space ! и # $ % & Мнемоника микропроцессора Z80 без префикса NOP LD BC.nn LD (BC),A INC ВС INC В DEC В LDB.n RLCA EX AF.AF' ADD HL.BC LD A,(BC) DEC ВС INC С DEC С LDC.n RRCA DJNZ $+e LD DEfnn LD (DE),A INC DE INCD DEC D LDD.n RLA JR $+e ADD HL.DE LD Ar(DE) DEC DE INC E DECE LDE.n RRA JR NZ,$+e LD HL.nn LD (nn)fHL INC HL INCH DEC H LDH.n с префиксом #СВ RLC В RLCC RLC D RLCE RLCH RLC L RLC (HL) RLCA RRC В RRC С RRCD RRCE RRCH RRCL RRC (HL) RRC A RL В RLC RLD RLE RLH RLL RL (HL) RLA RRB RRC RR D RRE RRH RR L RR (HL) RRA SLAB SLA С SLA D SLA E SLAH SLAL SLA (HL) с префиксом #ED 10-1102 145
ТАБЛИЦА СИМВОЛОВ д 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 111 LJJ 27 28 29 2А 2В 2С 2D 2Е 2F 30 31 32 33 34 35 36 37 38 39 ЗА ЗВ ЗС 3D ЗЕ 3F 40 41 42 43 44 45 46 47 48 49 4А 4В 4С 4D 4Е Символ ZX Spectrum ( ) ♦ + - / 0 1 2 3 4 5 6 7 8 9 ; < as > ? @ А В С D Е F G Н 1 J К L М N О Мнемоника микропроцессора Z80 без префикса DAA JR Z,$+e ADD HL,HL LD HL,(nn) DEC HL INCL DECL LDL.n CPL JR NC,$+e LD SP.nn LD (nn),A INCSP INC (HL) DEC (HL) LD (HL),n SCF JR C,$+e ADD HL.SP LD A,(nn) DECSP INC A DEC A LDA.n CCF LDB,B LDB.C LDB.D LDB.E LDB,H LDB,L LD Bf(HL) LDB.A LDC.B LDC.C LDC,D LDC,E LDC.H LDC,L LD C,(HL) LDC.A с префиксом #CB SLA A SRA В SRAC SRAD SRAE SRA H SRA L SRA (HL) SRA A [SLI B] [SLI C] [SLI D] [SLI EJ [SLI H] [SLI L] [SLI (HL)] [SLI A) SRLB SRLC SRLD SRLE SRLH SRLL SRL (HL) SRL A BIT 0,B BIT 0,C BIT 0,D BIT 0,E BIT 0,H BIT 0,L BIT 0,(HL) BIT 0,A BIT 1 (B BIT 1 ,C BIT 1 ,D BIT 1 ,E BIT 1,H BIT 1 ,L BIT 1,(HL) BIT 1.A с префиксом #ED IN Bf(C) OUT (C)#B SBC HLfBC LD (nn),BC NEG RETN IMO LDI,A IN C,(C) OUT (C),C ADC HLfBC LD BC,(nn) RETI LDR.A 146
ТАБЛИЦА СИМВОЛОВ д 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 111 UJ 50 51 52 53 54 55 56 57 58 59 5А 5В 5С 5D 5Е 5F 60 61 62 63 64 65 66 67 68 69 6А 6В 6С 6D 6Е 6F 70 71 72 73 74 75 76 77 78 Символ ZX Spectrum Р Q R S Т и V W X Y Z [ / ] ! Г а Ь с d е f 9 h i j к 1 m n о P q r s t u V w X Мнемоника микропроцессора Z80 без префикса LDD.B LDD.C LDDrD LDD,E LDD.H LDD.L LD D.(HL) LDD.A LDE,B LDE.C LDE.D LDE,E LDE.H LDE.L LD E.(HL) LDE.A LDH.B LDH.C LDH.D LDH.E LDH.H LDH.L LD Hf(HL) LDH.A LDL.B LDL.C LDL.D LDL.E LD L,H LDL,L LD L,(HL) LDL.A LD (HL).B LD (HL),C LD (HL),D LD (HL),E LD (HL),H LD (HL),L HALT LD (HL),A LD A,B с префиксом #СВ BIT 2,B BIT 2,C BIT 2,D BIT 2,E BIT 2,H BIT 2,L BIT 2,(HL) BIT 2,A BIT 3,B BIT 3,C BIT 3,D BIT 3,E BIT 3,H BIT 3,L BIT 3,(HL) BIT 3,A BIT 4,B BIT 4,C BIT 4,D BIT 4,E BIT 4,H BIT 4,L BIT 4,(HL) BIT 4,A BIT 5(B BIT 5,C BIT 5,D BIT 5,E BIT 5,H BIT 5,L BIT 5,(HL) BIT 5,A BIT 6,B BIT 6.C BIT6.D BIT 6.E BIT 6,H BIT6(L BIT 6,(HL) BIT 6,A BIT 7,B с префиксом #ED IN D,(C) OUT (C),D SBC HL.DE LD (nn),DE IM 1 LD A,l IN E.(C) OUT (C),E ADC HL.DE LD DE,(nn) IM 2 LDA.R IN H.(C) OUT (C),H SBC HL.HL LD (nn),HL RRD IN L.(C) OUT (C),L ADC HL.HL LD HL,(nn) RLD IN (HL).(C) SBC HL,SP LD (nn).SP IN A,(C) 10* 147
ТАБЛИЦА СИМВОЛОВ д 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 111 LJJ 79 7А 7В 7С 7D 7Е 7? 80 81 82 83 84 85 86 87 88 89 8А 8В 8С 8D 8Е 8F 90 91 92 93 94 95 96 97 98 99 9А 9В 9С 9D 9Е 9F АО А1 Символ ZX Spectrum У z < 1 } - □ Н Е В а я н я с S С И в а в ■ [АК [В] [С] [D] [Е] [F] [G] [Н] [1] [Л [К] [L] [М] [N] [О] [Р] [О] символы, ч определя- емые поль- зователем т; Мнемоника микропроцессора Z80 без префикса LD А,С LD A,D LD A,E LDA.H LD A,L LD A,(HL) LDA.A ADD A,B ADD A,C ADD A,D ADD A,E ADD AfH ADD A,L ADD A,(HL) ADD A,A ADC A,B ADC A,C ADC A,D ADC A,E ADC A,H ADC A,L ADC A,(HL) ADC A,A SUB В SUB С SUBD SUBE SUBH SUBL SUB (HL) SUB A SBC AfB SBC A,C SBC A,D SBC A,E SBC A,H SBC A,L SBC A,(HL) SBC A,A AND В AND С с префиксом #СВ BIT 7,C BIT 7,D BIT 7,E BIT 7,H BIT 7,L BIT 7,(HL) BIT 7,A RES 0,B RES 0,C RES 0,D RES 0,E RES 0,H RES 0,L RES 0,(HL) RES 0,A RES 1,B RES 1 ,C RES 1,D RES 1,E RES 1,H RES 1,L RES 1,(HL) RES 1 ,A RES 2,B RES 2,C RES 2,0 RES 2,E RES 2,H RES 2,L RES 2,(HL) RES 2,A RES 3,B RES 3,C RES 3,D RES 3,E RES 3,H RES 3,L RES 3,(HL) RES 3,A RES 4,B RES 4,C с префиксом #ED OUT (C),A ADC HL.SP LD SP.(nn) LDI CPI 148
ТАБЛИЦА СИМВОЛОВ д 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 111 LJJ А2 A3 А4 А5 А6 А7 А8 А9 АА АВ АС AD АЕ AF ВО В1 В2 ВЗ В4 В5 В6 В7 В8 В9 ВА ВВ ВС BD BE BF СО С1 С2 СЗ С4 С5 С6 С7 С8 С9 СА Символ ZX Spectrum [S] ч| символы, гт1 копределя- \ ЪЬЛЪ\Ъ ПОЛЬ*» [UJ ) зователем RND INKEY$ PI FN POINT SCREENS ATTR AT TAB VAL$ CODE VAL LEN SIN COS TAN ASN ACS ATN LN EXP INT SQR SGN ABS PEEK IN USR STR$ CHR$ NOT BIN OR AND <= >= <> LINE Мнемоника микропроцессора Z80 без префикса AND D AND E AND H ANDL AND (HL) AND A XORB XORC XORD XORE XOR H XORL XOR (HL) XOR A OR В OR С ORD ORE OR H ORL OR (HL) OR A СРВ CPC CPD" CPE CPH CPL CP (HL) CP A RET NZ POP ВС JP NZ.nn JPnn CALL NZ.nn PUSH ВС ADD Afn RSTO RETZ RET JP Z,nn с префиксом #СВ RES 4,D RES 4,E RES 4,H RES 4,L RES 4f(HL) RES 4,A RES 5,B RES 5,C RES 5,D RES 5,E RES 5,H RES 5,L RES 5,(HL) RES 5,A RES 6,B RES 6,C RES 6,D RES 6,E RES 6,H RES 6,L RES 6,(HL) RES 6,A RES 7,В RES 7fC RES 7fD RES 7,E RES 7,H RES 7fL RES 7f(HL) RES 7, A SET 0fB SET 0fC SET 0fD SET 0fE SET 0fH SET 0fL SET 0,(HL) SET 0, A SET 1fB SET 1 ,C SET 1 fD с префиксом #ED INI OUTI LDD CPD IND OUTD LDIR CPIR INIR OTIR LDDR CPDR INDR OTDR 149
ТАБЛИЦА СИМВОЛОВ д 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 111 LLJ св ее CD СЕ CF DO D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 El E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED ЕЕ EF FO F1 F2 F3 Символ ZX Specirum THEN TO STEP DEF FN CAT FORMAT MOVE ERASE OPEN # CLOSE # MERGE VERIFY BEEP CIRCLE INK PAPER FLASH BRIGHT INVERSE OVER OUT LPRINT LLIST STOP READ DATA RESTORE NEW BORDER CONTINUE DIM REM FOR GOTO GO SUB INPUT LOAD LIST LET PAUSE NEXT Мнемоника микропроцессора Z80 без префикса префикс #СВ CALL Z,nn CALL nn ADC A.n RST8 RETNC POP DE JP NC,nn OUT (N)f A CALL NC.nn PUSHDE SUBn RST 16 RET С EXX JP C,nn IN A,(N) CALL C,nn префикс для IX SBC A,n RST 24 RETPO POPHL JP PO,nn EX (SP)fHL CALL PO,nn PUSH HL ANDn RST 32 RETPE JP (HL) JP PEfnn EX DEfHL CALL PE,nn префикс #ED XOR n RST 40 RETP POP AF JP P.nn Dl с префиксом #СВ SET 1,E SET 1,H SET 1.L SET 1,(HL) SET 1, A SET 2,B SET 2,C SET 2fD SET 2,E SET 2fH SET 2,L SET 2,(HL) SET 2,A SET 3fB SET 3fC SET 3.D SET 3,E SET 3,H SET 3fL SET 3f(HL) SET 3.A SET 4,B SET 4,C SET 4fD SET 4fE SET 4fH SET 4fL SET 4f(HL) SET 4,A SET 5,B SET 5fC SET 5,D SET 5fE SET 5fH SET 5fL SET 5f(HL) SET 5fA SET 6,B SET 6fC SET 6fD SET 6,E с префиксом #ED 150
ТАБЛИЦА СИМВОЛОВ д 244 245 246 247 248 249 250 251 252 253 254 255 ill LXJ F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF Символ ZX Spectrum POKE PRINT PLOT RUN SAVE RANDOMIZE IF CLS DRAW CLEAR RETURN COPY Мнемоника микропроцессора Z80 без префикса CALL P,nn PUSH AF OR n RST48 RETM LD SP,HL JP M.nn El CALL M,nn префикс для IY CPn RST56 с префиксом #СВ SET 6,H SET 6,L SET 6,(HL) SET 6,A SET 7,B SET 7,C SET 7,0 SET 7,E SET 7,H SET 7,L SET 7,(HL) SET 7,A с префиксом #ED Пояснения к таблице символов В первом и втором столбцах таблицы приведены соответственно десятичный (Д) и шестнадцатиричный (Ш) коды. Относящиеся к ним сим- волы ZX Spectrum (токены) расположены в третьем столбце. В четвертом, пятом и шестом столбцах таблицы даны мнемоники команд микропроцессо- ра Z80 (см. «Система команд Z80»). При описании команд приняты следующие обозначения: п - один байт данных, непосредственно следующий за кодом команды, является всегда последним байтом команды; пп - 16-разрядный операнд, представляющий собой два байта данных, непосредственно следующих за кодом команды. Первым располагает- ся младший байт, затем — старший; (пп) - 16-разрядный адрес, указанный непосредственно за кодом коман- ды (сначала следует младший байт, затем старший); е — 8-разрядное смещение относительно адреса, находящегося в счетчике команд PC. Располагается непосредственно за кодом команды. Коротко о правилах построения кодов команд. Как уже говорилось раньше, 8-разрядная шина данных позволяет непосредственно реализовать не более 256 команд. Однако, для построения таких однобайтовых* команд (их мнемоники приведены в четвертом столбце таблицы) используются лишь 252 кода. Два байта #СВ и #ED префиксируют команды, мнемоники которых приведены в пятом и шестом столбцах таблицы соответственно. Так команда LD D,(HL) имеет код #56, команда BIT 2,(HL) — код #СВ #56, а команда IM 1 — код #ED #56. *) Имеется в виду только код операции — без учета байтов возможных данных. 151
ТАБЛИЦА СИМВОЛОВ Оставшиеся два байта #DD и #FD префиксируют команды, работа- ющие соответственно с индексными регистрами IX и IY. Коды команд, использующих в качестве операндов индексные реги- стры IX и IY, получаются добавлением префиксного байта к кодам команд, оперирующих с регистровой парой HL (но не префиксированных байтом #ED). Коды команд, использующих индексный метод адресации, образуются аналогично, только префиксируются команды, оперирующие с ячейкой памяти, адресуемой (HL). При этом код смещения d (см. «Система команд Z80») всегда является третьим байтом получающегося кода. Коды недокументированных команд, работающих с частями индекс- ных регистров, образуются из префикса #DD или #FD и кода команды, оперирующей с регистрами Н и L. Причем регистру Н соответствуют старшие байты индексных регистров (IXh и IYh), а регистру L — младшие (1X1 и IY1). В табл. 8 приведены примеры построения кодов команд, использую- щих индексные регистры. Слева приведена исходная команда, которую можно найти в таблице символов, справа — команда, получаемая в результа- те. Таблица 8. Пример Исходная команда Мнемоника ADD HL,BC JP (HL) LD B,(HL) BIT 0,/HL) LD AiH LDH.L LDL.1 XOR H Код #09 #Е9 #46 #СВ #46 #7С #65 #2Е #01 #АС построения кодов команд Z80. Получаемая команда Мнемоника ADD IX.BC JP (IY) LDB,(IX+1) BITO.(IY-I) LD A.IXh LD IXh.lXl LDIYI.1 XOR IXh Код #DD#09 #FD #E9 #DD #46 #01 #FD #CB #FF #46 #DD #7C #DD #65 #FD #2E #01 #DD #AC
КОНТРОЛЬНЫЕ КОДЫ ZX SPECTRUM д 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Ш 00 01 02 03 04 05 06 07 08 09 0А ОВ ОС 0D ОЕ OF 10 11 12 13 14 15 16 17 18 19 1А 1В 1С ID IE IF Коды, вводимые с клавиатуры CS/SS + CS/8 CS/SS + CS/9 CS/SS + 8 CS/SS + 9 CS/3 (True Video) CS/4 (Inverse Video) CS/2 (Caps Lock) CS/1 (Edit) CS/5 M CS/8 (-) CS/6(|) CS/7(t) CS/0 (Delete) Enter CS/SS (Extend Mode) CS/9 (Graphics Mode) CS/SS + 0 CS/SS + 1 CS/SS + 2 CS/SS + 3 CS/SS + 4 CS/SS + 5 CS/SS + 6 CS/SS + 7 CS/SS + CS/0 CS/SS + CS/1 CS/SS + CS/2 CS/SS + CS/3 CS/SS + CS/4 CS/SS + CS/5 CS/SS + CS/6 CS/SS + CS/7 Коды, выводимые на экран Не используется Не используется Не используется Не используется Не используется Не используется , Табуляция (аналогично использованию за- пятой в операторе Бейсика PRINT) Не используется Backspace (перемещение позиции печа- ти на одну влево) Не используется Не используется Не используется Не используется Carriage Return + Line Feed (возврат каретки + перевод строки) Не используется Не используется Код управления цветом тона (INK control) Код управления цветом фона (PAPER control) Код управления мерцанием (FLASHcontrol) Код управления яркостью (BRIGHT control) Код управления инверсией (INVERSE control) Код управления наложением (OVER control) Код управления позицией печати (AT control) Код управления табуляцией (TAB control) Не используется Не используется Не используется Не используется Не используется Не используется Не используется Не используется 153
ОГЛАВЛЕНИЕ Предисловие 3 Немного истории * 4 Обзор программного обеспечения 8 Графический редактор Art Studio 16 Как пользоваться программой 16 Меню и функции 17 Запись, чтение, проверка файла (File) 18 Работа с принтером (Print) 19 Выбор цветовой палитры (Attributes) 20 Рисование кистью, пером, распылителем (Paint) 21 Разное (Miscellaneous) 21 Работа с окнами (Windows) 22 Закрашивание объектов (Fill) 24 Редактирование в увеличенном масштабе (Magnify) 24 Работа с текстами (Text) 25 Построение геометрических фигур (Shapes) 27 Редактор наборов символов (Font Editor) 28 Музыкальный редактор Wham 31 Загрузка мелодии (Load Tune) 31 Сохранение мелодии (Save Tune) 32 Режим редактирования (Edit Mode) 32 Подсказка (Help Page) 35 Прослушивание мелодии (Hear Tune) 36 Изменение темпа (Set Tempo) 36 Компиляция (Whampiler) 36 Электронная картотека Masterfile 40 Структура Masterfile > . . 40 Загрузка и запуск Masterfile 41 Пример работы с Masterfile : 41 Меню и функции 47 Создание новой записи (Add a record) 48 Установка формата вывода записей (Choose a report) 49 Просмотр выбранных записей (Display/Print) 49 Редактирование формата вывода записей (Edit format def) .... 50 Загрузка базы данных (Load a file) 52 Определение поля (Name data ref) 52 Выбор записей (Search the file) 53 Смена выбранных записей (Invert selection) 55 Отказ от выбранных записей (Reset selection) 55 Удаление выбранных записей (Purge sel reeds) 55 Подсчет суммы и среднего арифметического (Total/Average) . . 55 Сохранение базы данных (Save Prog/File) 55 Обработка выбранных записей Бейсиком (Exec User Basic) ... 55 Русификация Masterfile 57 Программа-загрузчик 59 154
ОГЛАВЛЕНИЕ Архитектура ZX Spectrum 60 Центральный процессор 61 Регистры Z80 61 Регистры данных и аккумулятор 61 Счетчик комёнд 62 Индексные регистры '. 62 Указатель стека 62 Регистр флагов 62 Другие регистры , 63 Внешние устройства 63 Порт 255 (#FF) 64 Порт 254 (#FE). Клавиатура, магнитофон, динамик 64 Порт 251 (#FB). ZX Printer 66 Порты 247 (#F7), 239 (#EF), 231 (#E7). Interface 1 66 Порт 31 (#1F). Kempston-джойстик 66 Система прерываний 66 Маскируемые прерывания 67 Режим 0 67 Режим 1 67 Режим 2 67 Немаскируемые прерывания 69 Организация памяти 70 Экранная область памяти 70 Буфер принтера 72 Каналы и потоки 73 Формат хранения текста программы на Бейсике 75 Формат хранения переменных 75 Стек калькулятора 77 Стек операционной системы 78 Стек оператора GO SUB 78 Область символов, определяемых пользователем 78 Система команд микропроцессора Z80 79 Методы адресации 80 Команды Z80 81 Команды пересылок 81 Команды информационного обмена 82 Команды переключения набора регистров 82 Команды пересылки блока и команды поиска 83 Команды бинарных операций 85 Команды унарных операций 86 Команде^ сдвига 87 Команды циклического переноса 88 Команды операций над отдельными битами 89 Команды управления процессором 89 Команды для работы с подпрограммами 90 Команды условного и безусловного перехода 91 Команды ввода-вывода 92 Недокументированные команды 94 Ассемблер GENS4 96 Загрузка GENS4 96 Программирование на ассемблере GENS4 97 Формат строки ассемблера 97 Метки 98 Счетчик адресов 98 Выражения 98 Директивы ассемблера 99 Макроопределения 100 Команды условной трансляции 101 Команды ассемблера 102 155
ОГЛАВЛЕНИЕ Строчный редактор 103 Команды редактора 103 Вставка строк 104 Вывод листинга программы 104 Редактирование текста ассемблерной программы 104 Работа с дисководом и магнитофоном 105 Другие команды 106 Ассемблирование программы 107 Сообщения об ошибках 109 Зарезервированные слова 110 Пример сеанса работы 110 Забавный пример использования команд условной трансляции . 113 Программа-загрузчик 114 Монитор-отладчик MONS4 115 Загрузка MONS4 115 Фронтальная панель 115 Команды MONS4 117 Перемещение указателя адреса 117 Поиск байт в памяти 118 Просмотр программы 119 Изменение содержимого ячеек памяти и регистров 119 Дизассемблирование программы 120 Запуск и отладка программы 121 Другие команды 123 Пример сеанса работы 124 Русификация ZX Spectrum 127 Использование символов, определяемых пользователем 127 Использование дополнительных фонтов 129 Системные переменные 131 Использование подпрограмм ПЗУ 139 Ввод/вывод 139 Загрузка и запись файлов на магнитофон 143 Написание собственных подпрограмм обработки ошибок 144 Таблица символов 145 Контрольные коды ZX Spectrum 153
НАМ БЫЛО БЫ ИНТЕРЕСНО УЗНАТЬ, КАКОЕ ВПЕЧАТЛЕНИЕ ОСТАВИЛА У ВАС КНИГА «ZX Spectrum для пользователей и программистов» Точность изложенных сведений (1...5) Новизна информации (1...5) Стиль изложения (1...5) Удобство в пользовании (1...5) Оформление (1...5) Общая оценка (1...5) □ Ваш возраст, профессия Сколько лет работаете с ZX Spectrum Описание каких программ и аппаратных средств для ZX Spectrum Вы посоветуете включить в наши следующие публикации Куда. 196244, г. Санкт-Петербург, а/я 21 Кому. Фирма «Питер»
Хотите ли Вы стать подписчиком специального журнала для пользователей ZX Spectrum Ваше имя, адрес, телефон Если у Вас есть предложения и пожелания, можете изло- жить их
Уважаемые коллеги синклеристы! Вы можете стать проводниками Speccy в каждом уголке нашей страны и при этом помочь себе материально Фирма «Питер» предлагает Вам сотрудничество по распространению и обслуживанию учебных компьютерных комплексов на базе ZX Spectrum в составе: • рабочее место преподавателя с двумя встроенными НГМД, цветным монитором, принтером, кассетным магнитофоном и джойстиком; • до 16 мест учеников с цветными мониторами и джойстиками; • дискеты с программами, техническая документация. Компьютеры объединены в локальную сеть с большими возможно- стями (программная поддержка Н. Родионова). Помимо системного и игрового программного обеспечения с ком- плексами поставляются также оригинальные учебные программы по информатике, физике, математике, астрономии, ботанике и другим школьным предметам. Программы выполнены на высоком профессио- нальном уровне с использованием всех возможностей Speccy: цветной графики, мультипликации, звуковых эффектов. Особый интерес представляет программный пакет, позволяющий создать на базе комплекса систему для обучения и приема экзаменов по правилам дорожного движения. предлагаем также IBM-совместимые компьютерные комплексы для учебных и производственных целей Комплекс выполнен в виде высокоскоростной локальной сети (ско- рость обмена 400 Кбод) с поддержкой обращения со стороны перифе- рийных машин к винчестеру файл-сервера. • Файл-сервер — компьютер фирменной сборки класса IBM PC XT/AT. • Периферийные места — до 16 одноплатных компьютеров «Электро- ника МС1502» (i8088, 640K, CGA, встроенный контроллер НГМД, последовательный и параллельный порты). Главное достоинство этих машин — полная программная совместимость с IBM PC XT (чего не скажешь, например, о «Поиске»). Рабочие места по желанию заказ- чика комплектуются цветными или монохромными мониторами, принтерами, дисководами. Фирма «Питер» доставит комплексы в любой регион страны, сдаст заказчику «под ключ», обучит персонал, обеспечит гарантийное и после- гарантийное обслуживание.
Если у Вас есть проблемы с программами для ZX Spectrum, мы готовы предложить Вам кассеты и дискеты с их записью Цена импортной кассеты с системными программами — 85 руб., дискеты — 75 руб. (включая стоимость доставки). Для выполнения заказа необходимо переслать по почте (для частных лиц) или через банк (для организаций) на наш расчетный счет соответ- ствующую сумму. После этого нужно отправить в наш адрес копию платежного документа с указанием количества экземпляров и типа магнитного носителя (кассета, дискета). Не забудьте сообщить Ваш обратный адрес. Предлагаем также дискеты с программами, разработанными или адаптированными Н. Родионовым и А. Ларченко (DCU, Disk-Doctor, Pcopier, MOA-Service, TLW2M и др.). Цена дискеты с комплектом описаний — 90 руб. Программы будут высланы Вам сразу после получения заказа. Наш расчетный счет: 49100609294 в Парнасском отделении филиала Ленбанка г. Санкт-Петербурга, МФО 171337. Наш адрес: 196244, г. Санкт-Петербург, а/я 21, фирма «Питер». Наш телефон: (812)-235-37-49. Фирма «Питер» приглашает на временную и постоянную работу опытных програм- мистов и схемотехников; принимает оригинальные статьи для публикации, приобретает фир- менные руководства и книги по ZX Spectrum; предлагает многофункциональные телефонные аппараты с автомати- ческим определением номера (АОН) на базе Z80. Фирма «Питер» подготовила к выпуску книгу «Диалекты Бейсика для ZX Spectrum» В нее вошли подробные описания как стандартного гинклеровского Бейсика, так и его многочисленных расширений: Mega-Basic, Beta- Basic, Laser-Basic, PRO-DOS, Tobos и др. Кроме того, рассматриваются некоторые вспомогательные программы (Supercode, Zxed), приводятся способы защиты бейсик-программ, уменьшения их объема и другие полезные сведения.