14. Программы на ассемблере Z80
Написание программ в кодах - занятие весьма кропотливое, ведь
вам приходиться помнить не только коды команд, но и их длину (1, 2,
3, 4 байта), внимательно следить за адресами, в которых размещается
программа и данные. При возникновении необходимости доработать,
улучшить, модифицировать программу возникают значительные
трудности. Кроме того, работать эта программа будет только в тех
адресах, для которых была написана.
Использование ассемблера позволяет получить столь же эффек-
тивные быстрые программы, как и при написании их в кодах, но с го-
раздо меньшими затратами сил и времени. Одновременно обеспечи-
вается возможность работы программы в любых адресах (при пере-
трансляции) и легкость ее модификации.
Принцип программирования на ассемблере состоит в том, что
вместо кодов машинных команд вы пишите их условные обозначения
мнемоники, а вместо адресов именные метки. Программа-ассемблер
превращает мнемоники в коды команд, а метки в конкретные адреса
этих команд. Такая операция называется ассемблированием, и в ре-
зультате ее получается программа в кодах, используемая так же, как и
обычные программы в кодах.
Ассемблеры очень сильно зависят от типа процессора машины. В
нашем случае необходим ассемблер для процессора Z80.
Если вы уже программировали на ассемблере для К580ВМ80, мнемо-
ники Z80 могут показаться вам странными и непривычными. Вот как
выглядят одни и те же команды на этих ассемблерах:
Простое сравнение показывает, что мнемоники Z80 при меньшем
их количестве более понятны и наглядны. Однако если вы привыкли
программировать на ассемблере К580ВМ80, можете на нем продол-
жать программировать, так как программы в кодах К580ВМ80 всегда
будут работать на процессоре Z80 (но не наоборот). Правда, при этом
вы не используете всех возможностей вашего процессора Z80 (на-
пример, не используете всех его регистров).
Итого имеется 21 программно-доступный регистр и еще не-
сколько недоступных, которые процессор использует для хранения
промежуточных результатов.
Как вы, наверное, заметили, большинство регистров процессора
или имеет размер 16 бит, или объединены в пары по 16 бит. Какова
же разрядность вашего процессора? 8 или 16 бит? Ответить на этот
вопрос очень сложно. Во всяком случае, у процессора имеется и на-
бор команд 8-битовой арифметики, и набор команд 16-битовой
арифметики. Наличие в составе процессора двойного АЛУ (арифме-
тико-логического устройства) и 16-разрядной схемы сумматора-
вычитателя, а также 16-разрядного инкрементора-декрементора по-
зволяет ему оперировать 16-битовыми данными столь же легко, как и
8 битовыми. Таким образом, можно сказать, что "внутри" ваш про-
цессор 16-разрядный, но "снаружи" выглядит как 8-разрядный (ведь
внешняя шина данных имеет 8 разрядов).
Именно эта особенность вашего процессора и обусловила нали-
чие у него огромного количества команд (около 680 разновидностей)
и регистров (21).
Но этого создателям процессора Z80 показалось мало! В до-
полнение к 16- и 8-битовым операциям они ввели еще и поразрядные
(1-битовые) операции, что на порядок упростило и приблизительно в
2 раза ускорило работу с внешними устройствами (например, с дис-
ководом). Это позволяет в целом раде случаев обойтись без соответ-
ствующих схем контроллеров внешних устройств.
Все эти возможности имеет только процессор Z80, и реализует их
только соответствующий ассемблер! Одним из наиболее мощных ас-
семблеров является программа макроассемблер GENS-4/51 из пакета
DEVPAC-4 (кроме макроассемблера GENS-4/51 в пакет входит от-
ладчик-дизассемблер MONS-4). Приставка макро- перед названием
ассемблер означает, что кроме нормальных команд микропроцессора
Z80 вы можете сами создавать и использовать макрокоманды. На-
пример, если вам захочется иметь команду умножения MUL (ее нет в
системе команд Z80), ее можно заменить программным эквивалентом
и использовать так же свободно, как если бы она всегда была в систе-
ме команд. Более подробно с возможностями и работой макроассемб-
лера GENS-4/51 можно познакомиться в специальном описании
"GENS-4".
Кроме ассемблера, превращающего программу на языке ас-
семблер в программу в кодах процессора, имеется и программа дизас-
семблер, делающая обратное превращение. Две эти программы вза-
имно дополняют друг друга, поэтому их обычно включают в один па-
кет, а для облегчения отладки придают им отладчик программ в ко-
дах. По такому принципу, например, построены все пакеты DEVPAC
фирмы HISOFT, в том числе, и последний - DEVPAC-4.
Этот пакет состоит из двух программ в кодах, полностью пере-
мещаемых и работающих в любых адресах. Загружают эти програм-
мы командой LOAD "" CODE..., где ... - адрес, начиная с которого
будет находиться программа. Затем программы запускают командой
RANDOMIZE USR ..., где ... - тот же адрес, что и в команде LOAD.
15. Загружаемые системные программы
С некоторыми из таких программ вы уже познакомились в разде-
лах синтезатор звуковых эффектов и программирование на ассембле-
ре. На самом деле таких программ очень много, как и возможностей
для их применения. Описывать их все невозможно, поэтому дадим
лишь названия некоторых программ с пояснениями по областям их
применения:
Языки программирования:
Бейсик-интерпретаторы: ВЕТА-В.48, BETA 3.1, LASER-BASIC, MEGA-BASIC
Бейсик-компиляторы: F-COMPILER, FP 48K V1.7, TOBOS-FP
Паскаль: PASCAL HP-80, НР-4ТМ8, НР-4ТМ16
Си: HISOFT C
Форт: FIG-FORTH, ED 50, EP 50
Лого: LOGO
Пролог: PROLOG
Ассемблер: GENS-4, ZEUS, ASSEMBLER, EDITAS
Отладчики кодов: MONS-4, MONITOR 48, MONITOR 16, IR 48K
Базы данных:
Картотеки: MASTERFILE V 09, TOOLKIT
Электронные таблицы: OMNYCALK
Текстовые экранные редакторы:
TASWORD TWO, TASWORD 3, TASWORD CS, TAS.RUS, FILES
Графические редакторы:
ART STUDIO, ARTIST, DYNAMIC-3, M.DRAW, LP MK 2.3
Все графические редакторы, кроме последнего, работают с кла-
виатурой, джойстиком или манипулятором "мышь". Последний гра-
фический редактор работает со световым пером.
Иммитаторы дисковой операционной системы:
RAM DOS 2
Тесты системы:
TEST PROG, TEST BAS, MEMORY TEST, TST 80.V3
Трассировщики печатных плат:
PLATA V.3, ТPACCA-3, LAYOUT-86/90
Спектроанализаторы и цифровые осциллографы:
OSCILLATOR, TAPE'R, DIAG, TAPE HEAD
Математические программы:
FUN F(X.Y), STATIST, FOURIER
Редакторы знакогенератора пользователя:
UDG DEFINER, PAINTBOX, UDG
Синтез речи:
FONGEN, LMOWA, STEAKER, SPEAKEASY
Пакеты для бейсика:
ZXED, COMPRESSOR, 64*32, RUS, RENUM, 64 COLUMNY
16. Компьютерные игры
Среди многих профессионалов-программистов бытует мнение о
некоей "несерьезности" игр на компьютере, что это не та сфера, в ко -
торой следует тратить свои силы и время. Однако сравнение серьез-
ных программных продуктов, созданных "серьезными" и "несерьез-
ными" программистами, показывает преимущество последних. Их
программы имеют более дружественный характер, написаны гораздо
изобретательнее (не в смысле невидимых всему миру выкрутас в ко-
дах, а в смысле подходов, методов, форм представления результатов
и т.д.) и продуманнее.
Более того! Сравнение компьютеров по критерию компьютерных
игр, на них реализованных, гораздо сильнее выявляет их возможно-
сти для "серьезного" использования, нежели само это использование.
И это не удивительно. Современные компьютерные игры явля-
ются сплавом новейших достижений в технике программирования,
разработке интерфейса человек-машина, компьютерной графике, сис-
темах искусственного интеллекта, экспертных системах, синтезе ре-
чи и музыки, помноженным на мастерство и фантазию программи-
стов. Здесь идет в ход все, даже то, что еще не решаются использо-
вать в больших "серьезных" системах, что еще существует лишь в
голове автора, и не прошло никаких проверок - все равно ведь "не-
серьезно"! А потом в результате серьезные люди смотрят на работу
таких программ и говорят: "Этого не может быть, процессор не успе-
ет (памяти не хватит, алгоритм не реализуем и т.д.)".
Однако программы от таких разговоров не начинают хуже рабо-
тать, а лишь демонстрируют, насколько велики резервы компьютера
при правильном их использовании.
Как же обстоит дело с компьютерными играми для вашего ком-
пьютера?
Радуйтесь!!! По итогам 1988 года (данные журнала "BYTE")
данный тип компьютеров занял второе место по количеству разрабо-
танных и проданных программ (более 11000 видов), львиную долю
из которых составляют компьютерные игры, уступив только компь-
ютеру "APPLE 2".
По качеству игр ваш компьютер оставил далеко позади такие
машины, как ATARI XL/XE, COMMODORE 16/64/128, YAMAHA
MSX-MSX2, не говоря уже об отечественных РК-86, Микроша, БК-
0010, ДВК-3, ДВК-4 и даже ЕС1840/1841. С появлением модели
SPECTRUM 3+, имеющей ОЗУ 128 К и дисковод качество игр данно-
го семейства компьютеров еще более поднялось и вплотную прибли-
зилось к таким системам, как IBM PC и COMMODORE AMIGA, не-
сравненно более сложным и дорогостоящим, чем ваша система.
Однако большинство игр так до сих пор и ориентируется на мо-
дель ZXSPECTRUM, и, следовательно, будет работать на вашей ма-
шине.
16.1. Структура компьютерной игры
С точки зрения пользователя, компьютерная игра представляет
собой несколько файлов, записанных на кассете для магнитофона.
Типы, размеры и количество файлов варьируется
от игры к игре, от фирмы к фирме, однако можно выделить три ос-
новных типа структур:
загрузчик на бейсике - блок (блоки) кодов;
загрузчик на бейсике - загрузчик в кодах - блок (блоки) кодов;
программа на бейсике со встроенными кодами.
Примером первой структуры может служить игра LUNA
CRABS, второй - SILENT SERVICE, третьей - игра WHEELIE 2.
Наиболее общим является второй тип структуры - его рас-
смотрим подробнее. Начнем с первого файла типа PROGRAMM. Если
его загрузить не командой LOAD "", а командой MERGE "", можно
увидеть примерно следующую программу - загрузчик на бейсике:
0 ... : LOAD "..." SCREEN$ : LOAD "..." CODE RANDOMIZE USR ...
Здесь команда LOAD "..." SCREENS загружает на экран кар-
тинку-заставку, рассматривая которую вам будет легче ждать конца
загрузки всего остального.
Следующая команда LOAD "..." CODE загружает загрузчик в ко-
дах, и последняя команда RANDOMIZE USR ... его запускает.
Как видите, достаточно загрузить такую программку (она, как
правило, имеет атрибут самозапуска и сама начинает работать), и все
остальные файлы будут загружены и запущены безо всякого вмеша-
тельства, аналогично тому, как на компьютере IBM PC при запуске
пакетного файла (.bat- файлы) он сам начинает загружать и запускать
нужные вам программы в нужном порядке.
Обратите внимание на номер строки. Набрать такую строку с
клавиатуры невозможно, как, впрочем, и отредактировать. "Нулевая"
строка формируется специальным программным образом и служит
для того, чтобы не дать вам забраться в программу. Обычно кроме
зануления строки применяются еще и специальные меры, чтобы вы
не увидели на экране текст программы. Например, дайте команды
INK 0 : PAPER 0 : CLS - и вы не увидите на экране ничего - он будет
черен, как ночь. Бороться с этими командами очень просто - дайте
команды INK 9 : PAPER 9, и видимость значительно улучшится.
Примечание: не всегда загрузчик на бейсике выглядит точно так.
Например, перед запуском загрузчика в кодах могут загружаться еще
несколько файлов в кодах. Или, наоборот, загрузчик в кодах будет
спрятан в картинке, и сразу после ее загрузки будет запущен. Или
даже загрузчик в кодах может быть загружен самым первым, и уже
он будет грузить заставку.
Загрузчики в кодах бывают трех видов:
- использующие стандартные подпрограммы загрузки из опе-
рационной системы;
- использующие собственные драйверы магнитофона, но сохра-
няющие стандартный или близкий к стандартному формат за-
писи;
- использующие собственные драйверы магнитофона и собст-
венный формат записи (или собственную структуру файла).
В последнем виде несколько особняком стоят так называемые
компонующие загрузчики. Это наиболее изощренный вид загрузчи-
ков, использующий специальную структуру файла блочно-адресную
структуру. Размер блока данных для такого загрузчика может значи-
тельно превышать размер ОЗУ компьютера (48 КБайт), что создает
большие трудности при копировании такого блока. Зато при работе
такого загрузчика может формироваться более качественная про-
грамма, выводиться несколько последовательных заставок или одна
заставка последовательно трансформироваться в другую, что развле-
чет вас, пока вы ждете конца загрузки программы (загрузка может
длиться от 2 до минут).