2. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
КОМПЬЮТЕРА
Компьютер "СПЕКТРУМ" может выполнять программы как написанные на БЕЙ-
СИКЕ, так и в машинных кодах микропроцессора Z80. Оба типа программ нашли
широкое применение. Программы написанные в машинных кодах непосредственно
оперируют с адресами, данными, регистрами микропроцессора, поэтому они работа-
юте весьма высокой скоростью, выполняя 875000 операций в секунду. Например, для
пересылки 6000 байт из экранной области в другую и обратно требуются доли секун-
ды. В электронных играх этот прие^*1ШКШЛуется для создания движущихся изобра-
жений. ,/ '
Программа принимает сШй&тл и данные от клавиатуры и входных портов и затем
генерирует выходные сшШлы для данных и выходиых портов.
2.1. МЛШИтЩЁ КОДЫ ИЛИ БЕЙСИК ?
Для выполнения программы вЦ&шинных кодах необходимы некоторые операторы
БЕЙСИК, например: --J-. 4 ;
10 LET L - USR 62000 y ; .
В тех случаях коща скорость выполнения программ недостаточна используются
подпрограммы написанныёв машинных кодах. К^мё того команды БЕЙСИКА сами
являются подпрограммами в' мштднных кодах которые выполняются одна после дру-
гой. Например программа на ВВЙШС^вь^^Щая точку на экран:
10 PLOT 50,100 "
состоит из профамм в машинных кодах:
10 - Интерпретатор БЕЙСИКА "зашитый" в ПЗУ преобразует номер строки в два
байта в соответствующей области памяти. В этой области содержится информация о
последовательности выполнения команд.
PLOT - Интерпретатор БЕЙСИКА вызывает программу MONITOR, состоящую из
большого количества машинных команд, хранящихся в памяти в виде 8 и 16-разряд-
ных слов.
50 - Этот номер преобразуется подпрограммой PLOT в х-координату соответству-
ющей тощи HaJV дисплее (см^разд^л 2*2jL^.^ --•—- =,. :
, - ПоЩрмусимво^г определяютсйгзко^вц числа 50*1 началочисла 1 ООв программе
МОК1ТОЙШспольз6вгшие в качестве разделителя любого яруфпр символа приводит
к ошибке - попробуйте/ Ц- : I
100 - ВтфЮй ндмер П1>еобра^^ётся программойР®Т в^координат^Шответству-
ющей точки на TV дисплее.
ENTER - При вводе программы эта последняя команда идентифицируется как
конец числа 100.
RUN - Запускает выполнение программы.
В результате выполнения программы в соответствующую ячейку экранной области
памяти записывается двоичная "1" и на экране засвечивается точка с координатами
50,100 <см. раздел 1.3). Конец программы определяется по отсутствию следующих
номеров строк и компьютер переходит в режим ожидания (ОК).
Для работы с описанными в этой книге схемами используются программы на
БЕЙСИКЕ и в машинных кодах. Предполагается, что с БЕЙСИКОМ Вы уже знакомы,
а. с программированием в машинных кодах рекомендуем познакомиться.
2.2. ПРОГРАММИРОВАНИЕ В МАШИННЫХ
КОДАХ ДЛЯ НАЧИНАЮЩИХ
Не стоит пугаться программирования в машинных кодах. Обычные пользователи
знакомые с БЕЙСИКОМ считают программирование в машинных кодах сложным и
запутанным делом. Однако для повышения скорости работы программ, например,
программирование в машинных кодах - основной способ. Понятно, что перенести
картинку из одной области памяти в другую лучше за 1 /30 секунды, чем за 30 секунд.
Использование SCREEN $ наглядно демонстрирует это.
Программы написанные в машинных кодах отличаются от программ на БЕЙСИКЕ
тем, в частности, что отсутствуют номера строк. Для размещения программы можно
использовать любую область памяти имеющую адреса от 24000 до верхней границы
памяти (RAMTOP); для 16 К "СПЕКТРУМА" это 32767, а для 48 К версии - 65535.
Разумно оставлять достаточно памяти для программ на БЕЙСИКЕ, начинающихся с
адреса 23760. Размещение программы в машинных кодах сразу за верхней границей
БЕЙСИКА приводит к нарушению работы системы. Подходящими начальными ад-
ресами для размещения программ в машинных кодах будут 32000 (7D00 в шестнад-
цатиричном коде) для 16 К "СПЕКТРУМА" и 64000 (FA00 в шестнадцатиричном
коде) для 48 К модели.
При загрузке программ в машинных кодах разумно сначала очистить соответству-
ющую область памяти. Например, CLEAR 32000 очищает область памяти с адреса
32000 и предупреждает использование этой области интерпретатором БЕЙСИКА.
Вот несколько методов загрузки программ в машинных кодах:
1. Использование 16-ричного загрузчика:
10 LET D-32000
20 DEF FN А <А$,В) - CODE А$(В)-48
-7+(CODE А$(В)>57)
30 DEF FN C(A$)-16*FN A(A$,1)+FN А(А$2)
40 READ A$:IF A$oH**"THEN
POKE D,FN C(A$):LET D-D+l : 60 TO 40
50 DATA "00V0r,,,0FV....V**"
Строка 50 содержит шестнадцатиричные коды в десятиричном виде, которые
будут расположены в памяти начиная с адреса 32000.
2. Использование оператора REM для резервирования
области под программу в машинных кодах
в начале программы на БЕЙСИКЕ:
1 REM.... любые 50 символов...
10 DATA 6,192,17,10,0,33... (всего 50 чисел)
20 FOR X - 23760 ТО 23810
30 READ V : POKE X,V
40 NEXT X
Этот пример требует ввода 50 чисел до ввода основной программы, которая вызы-
вает программу в машинных кодах
LETL-USR 23760
Строки 10-40 могут быть уничтожены до ввода основной программы, коща машин-
ные коды будут уже загружены в облать памяти, зарезервированную оператором REM
в 1 строке. Загружая программу с листинга можно встретить странную последователь-
ностъ символов в строке 1. Не нужно ее изменять - это программа в машинных кодах
в символическом виде. Важно отметить, что всегда в таких случаях используется
начальный адрес 23760. Одно из достоинств указанного метода в том, что программа
в машинных кодах содержится внутри программы на БЕЙСИКЕ и возможность ее
испортить при выполнении меньше.
3. Загрузка программы в машинных кодах в процессе
загрузки программы на БЕЙСИКЕ, требует
только одной операции загрузки:
10 FOR Х-32000ТО 32050
20 READ М; POKE Х,М ^_; - : ,
30 NEXT X ^ Ш''^" ' '
40 DATA 1,99,0,33*^2 й т.д. всего 51 число.
100 .... далее текстфиовной программын* БЕЙШКЕ.
Количество чисел *зШераторе^ФАТА должно точнб^оответствовать количеству
зарезервированных в строке 10 ячве&^амяти; в нашем примере 51, в противном случае
появится сообщение об ошибкейОЙТ OF DATA ERROp^ При запуске программы
(вводом команды RU^^camnHHbiejIdAH будут загружен^^основная программа будет
вызывать эту прюграмму' как и раньше: Н
LET L - USR 32000 :4 ^ V
Мы выберем 3-ий метдалзд следующим причинам! > :
1. Он прост, только 4 стоишь >
2. В нем не используется Шр^ 1, что затруднительно для
непрофессиональных программистов;^- :
3. Загрузка происходит быстро (около секунды) и не происходит остановки для
удаления лишних строк (как в методе 2).
Взамен
LET L-USR 32000
может быть использована альтернативная команда БЕЙСИКА,
RANDOMIZE USR 32000
Вводить данные нужно внимательно, так как ошибка может привести к разруше-
нию всей программы. Поэтому разумно сохранить (SAVE) программу до ее запуска
(RUN). ;= ^ ............................... ...........................................
ПрогрШлма машинных коЩ*, поЩто^йЗ, сохраняема впамяти
даже есл*Щудёт загр^ена новайцроП>г фатБЕЙСИКЕ тц лмашинйых кодах (
в другую Щйсгъ гйяй|| конечЙф7 Прогр£ммана БЕЙСИКЕ мфкет бъщ сохранена
обычным способов*: _,"-:* .У'
SAVE "Имя" когда нужен автозапуск программы.
SAVE "Имя" LINE 1 или
SAVE "Имя" CODE, если в памяти только программа в машинных кодах, или
SAVE "Имя" CODE стартового адреса, длина программы (если нужно сохранить
только часть памяти).
Программирование в машинных кодах заключает в себе следующие основные
элементы:
1. Загрузка констант в регистры HL, ВС, DE.
2. Преобразование, сравнение, перемещение данных путем выполнения различ-
ных операций (увеличение/уменьшение на 1, сложение и т.д.).
3. Ввод и вывод данных из различных регистров, особенно это относится к регистру
А (аккумулятору). Многие программы производят загрузку данных в ячейки экранной
области памяти, начинающейся с ячейки 16384.
4. Вызов программ из ПЗУ "СПЕКТРУМА", например CALL-DRAW.
5. В конце программы в машинных кодах обезателен оператор RET без которого
работа системы нарушается. Этот оператор возвращает управление БЕЙСИКУ.
В Приложении 1 приведены все машинные коды микропроцессора 280 в 16-рич-
ном виде, когда используются шестнадцатиричные загрузчики. В десятичном виде
(для загрузки с помощью оператора DATA) их можно представить с помощью табли-
цы из Приложения 2. Указано также и количество байт в команде. Простая команда
пересылки может быть однобайтной; если используется в команде однобайтовое чис-
ло, то команда двухбайтная; если используется двухбайтное число (например адрес),
то команда состоит из 3-х байт. Вместе с мнемоническим сокращением дано краткое
описание команды.
Регистр HL часто используется для задания адреса ячейки памяти и для изменения
содержимого ячейки:
ld(hl),NN
По этой команде в ячейку памяти загружается шестнадцатиричные число. Адрес
ячейки соответствует числу содержащемуся в регистре HL.
Id hl,00FF
По этой команде в регистр Н загружается число 00, а в регистр L загружается
FF(255).
ld(EE00),hl
По этой команде в ячейку с адресом EE00 (60 928) загружается число 255.
Когда вводится число состоящее из двух байт, то младший байт вводится первым
(в ячейку с минимальным номером), а старший вторым, так что приведенный пример
будет выглядеть:
Мнемоника Шестнадцатиричный Десятичный
команд код команд код команд
Id hl,00FF 21 33
FF 255
00 0
ld(EE00),hl 22 34
00 0
ЕЕ 238
На рис.2.1 показаны правила выполнения перехода по относительному адресу при
выполнении операции увеличения или уменьшения на 1. (Например jr nz, х). Для
перехода вперёд значение х лежит в интервале 0 - 127(дес.), для перехода назад это
значение лежит в интервале 128 - 254, (значение 255 - переход на следующий адрес,
254 - переход на адрес ячейки где хранится значение х и т.д.) Кроме перехода по
относительному адресу, возможен переход по абсолютному адресу, например JP NN.