программирование в машинных кодах книга
От авторов
Книга, которую Вы держите в руках, уже получила широкую известность, как самый доступный самоучитель для тех, кто хочет преодолеть психологический барьер и перейти от программирования на БЕЙСИКе к программированию в машинном коде или просто хочет понимать машинный код фирменных программ.
Первое издание этой книги мы выпустили два года назад, в 1990 году, и сейчас в стране уже есть тысячи любителей бытовых персональных компьютеров типа ZX-Spectrum самостоятельно освоивших тонкости машинного программирования по этой книге. Первое издание было выпущено в трех томах. Сейчас мы объединили все три тома (учебник, практикум и справочник) в рамках единой книги, несколько подкорректировали и значительно (примерно на 20%) дополнили содержание. Основным дополнением стали разделы, посвященные описанию системы прерываний компьютера, разбору концепции потоков и каналов, понятию о директивах Ассемблера и вопросам, связанным со стандартизацией русификации компьютеров. Как показал первый опыт, именно эти вопросы нуждались в усиленном освещении.
«ИНФОРКОМ» продолжает работу над книгами, посвященными компьютерам «ZX-Spectrum» и совместимым с ними. В настоящий момент начат выпуск многотомного издания, посвященного работе с графикой «ZX-Spectrum`а». Несмотря на то, что каждый из этих томов является самостоятельной учебной единицей и может быть использован независимо от прочих, их можно считать логическим продолжением данного издания уже хотя бы потому, что «Первые шаги в машинном коде Z-80» в силу естественных причин стали базовой книгой для наших последующих разработок.
«ИНФОРКОМ» благодарит всех читателей первого издания, приславших свои отзывы, пожелания и рекомендации и особо выражает персональную признательность своим корреспондентам Баянову К.Н. за подготовку разделов I.5.18, II.4.4.7, III.5 и Пашорину В.И. за подготовку раздела II.5.5.
Москва, август 1992.
Введение.
Проведенное в начале 1990 года анкетирование наших заказчиков показало их глубокую заинтересованность в освоении программирования в машинных кодах для Синклер-совместимых компьютеров, получивших в нашей стране наибольшее распространение среди ПЭВМ бытового класса.
Процессор Z-80, на базе которого собраны компьютеры этой системы, приобрел широкую популярность в мире благодаря своей универсальности, наличию обширной системы команд и технологичности производства, обеспечившей ему большие объемы выпуска при сравнительно невысокой цене.
Этот процессор применяется не только в многочисленных компьютерах, входящих в систему «ZX-Spectrum», но и в компьютерах других систем. Среди них компьютеры семейства MSX (« Yamaha », « Spectravideo », « Toshiba », « Panasonic » и др.), компьютеры систем « Enterprise », « Sharp », многие компьютеры фирмы « Amstrad » и пр. В принципе, материалы этой книги могут быть на 90% использованы и теми, кто работает с компьютерами этих систем.
Эти очень хорошие книги, к сожалению, весьма объемны (по 500-600 стр.) и не переведены на русский язык, что делает сомнительной возможность их широкого распространения у нас в ближайшие годы.
В своей книге, предлагаемой Вашему вниманию, мы постарались, как сумели, сочетать популярность, систематичность и информативность изложения. Те, кто не нуждаются в элементарном освоении программирования в машинных кодах, могут сразу обратиться ко второй части «Практикум…». Чтобы не дублировать справочный материал, который необходим как тем, кто работает с первой частью, так и тем, кто работает со второй, мы вынесли его отдельно, в третью часть.
Мы очень рекомендуем сопровождать чтение этой книги самостоятельным просмотром кода фирменных программ с помощью какой-либо дисассемблирующей программы, например MONITOR 16/48, MONS 3, ULTIMON и т.п.
Программирование в машинных кодах книга
Многие любители не испытывают серьезных трудностей в овладении БЕЙСИКом. Для этого достаточно немного практики. Но рано или поздно они приходят к барьеру «машинного кода». Как это ни печально, но некоторые так перед ним и останавливаются. Это ни в коей мере не связано с отсутствием желания или способностей, просто многие не знают, с чего начать. Если в БЕЙСИКе можно начинать с чего угодно (при ошибке компьютер сам Вас поправит), то здесь Вы оказываетесь с процессором один на один, и такой метод проб и ошибок не срабатывает.
Итак, давайте напишем первую программу в машинном коде. Прежде всего, выделим для нее область памяти. Если Вы читали нашу книгу «Большие возможности Вашего «ZX-Spectrum`а», то знаете, что для БЕЙСИКа в оперативной памяти компьютера отведена область памяти, начинающаяся с адреса, на который указывает системная переменная PROG и заканчивается адресом, на который указывает системная переменная RAMTOP. Предположим, что Вы хотите записать программу в машинных кодах, начиная с адреса 30000. Дайте команду CLEAR 29999. Эта команда установит RAMTOP в 29999 и Ваша программа будет защищена от возможной порчи из БЕЙСИКа. Даже если Вы дадите команду NEW, области памяти, находящиеся выше RAMTOP, не будут поражены.
Теперь дайте две прямые команды одну за другой:
Если все, что Вы здесь прочитали, Вам понятно, то Вы уже поняли, как составляются программы в машинных кодах. Можно, конечно, возразить, что пользы от такой программы не очень много, но сейчас не в этом суть. Важно, чтобы Вы поняли, что некая последовательность чисел может быть последовательностью команд для процессора Z-80.
Теперь давайте вернемся к нашей первой программе и попробуем ее несколько развить, чтобы она все же что-то делала. Процессор Z-80 имеет несколько регистров, у которых есть имена – «А», «В», «С» и т.д. Каждый из них может содержать одно какое-либо целое число от 0 до 255 (т.е. один байт).
Существуют десятки команд процессора, которые позволяют копировать содержимое регистров из одного в другой, а также выполнять связь с внешним миром, в т.ч. и с оперативной памятью.
Итак, мы уже готовы к тому, чтобы написать программу, которая будет перебрасывать какое-либо число из одного регистра процессора в другой.
Программирование в машинных кодах книга
Интерпретатор переводит Вашу программу с языка высокого уровня (например, БЕЙСИКа) в машинный код последовательно строку за строкой. Он работает примерно так: прочитал строку, проверил, нет ли в ней ошибок, перевел ее в машинный код, выполнил команды машинного кода, запомнил, где нужно результат и перешел к следующей строке. Чтобы сделать, например, операцию
интерпретатор обращается к процессору несколько сот раз. Вам этого не видно, все равно результат появится на экране через доли секунды, но это так.
Если же Вам позже придется вернуться к этой строке (например, с помощью GO TO 10), то все эти действия будут повторены.
А ведь многие операции выполняются в циклах.
Таким образом, интерпретатор работает крайне медленно. Зато имеется возможность работы в диалоговом режиме. Так, на Бейсике, когда Вы набираете программу, каждая строка сразу же и проверяется на правильность синтаксиса и, если Вы сделаете ошибку, то строка не будет введена в программу нажатием клавиши ENTER до тех пор, пока Вы эту ошибку не устраните. Вы всегда можете прервать работу программы, внести изменения и стартовать опять, причем с той строки, с какой хотите. Работать с интерпретатором БЕЙСИКа настолько удобно для начинающих, что на многих моделях персональных ЭВМ, в том числе и на «ZX-Spectrum`е», он уже «зашит» в постоянное запоминающее устройство (ПЗУ) и служит не только языком программирования, но и выполняет функции операционной системы компьютера. При включении компьютера в сеть он сразу готов к выполнению команд БЕЙСИКа.
В отличие от интерпретатора, компилятор переводит Вашу программу с языка высокого уровня (например, Паскаля или Фортрана) в машинные коды всю целиком. После того, как программа написана, она компилируется в машинный код. Программа, написанная Вами на языке, называется исходным текстом (исходным модулем, исходным блоком, исходным файлом). То, что Вы получаете в результате компиляции, называется объектным кодом (модулем). Вы можете выгрузить объектный код на ленту, а потом снова загрузить. Можете запустить его на исполнение, но здесь у Вас уже нет возможности во время работы программы ее остановить, внести изменения и снова запустить с произвольно взятого места. Если такая необходимость возникает, надо заново загрузить исходный текст программы, внести изменения, а потом опять откомпилировать его в машинный код.
Поскольку здесь компиляция выполняется для каждой строки только один раз, а потом полученный машинный код можно использовать хоть всю жизнь, то здесь скорость работы программы гораздо выше и лишь немного уступает скорости программ, сразу написанных на Ассемблере. Те все же быстрее, т.к. как бы хорош компилятор ни был, он все же не в состоянии сделать объектный код оптимальным по быстродействию и по объему занимаемой памяти.
Итак, программирование в машинном коде (на Ассемблере) позволяет повысить скорость работы программы по сравнению с работой через интерпретатор в 50…200 раз и в 1,5…3 раза по сравнению с кодом, прошедшим компиляцию. Это бывает чрезвычайно важно, если в программе есть многочисленные вложенные друг в друга циклы, если многократно выполняются поиск и выбор данных из обширных областей памяти. Много времени занимают операции, связанные с обработкой графических изображений на экране. Эффект плавного и быстрого перемещения (и изменения формы) объектов в компьютерных видеоиграх практически всегда создается программированием в машинном коде.
Сравним расход памяти при работе на БЕЙСИКе и в машинных кодах. Программа на БЕЙСИКе размером в 30 строк занимает примерно 1К памяти.
Аналогичная ей, выполняющая те же задачи, программа в машинных кодах будет иметь примерно 150 строк (команд), но занимают они всего 200…250 байтов оперативной памяти.
В нашей стране есть еще две объективные причины, вызывающие повышенный интерес к программированию в машинных кодах.
Дело в том, что наибольшее число пользователей этого класса компьютеров у нас составляют радиолюбители и специалисты по электронике, самостоятельно собравшие компьютер. Обычно они не останавливаются на достигнутом результате. А развивают свое хобби дальше, ищут пути усовершенствования машины, пути подключения дополнительных устройств: интерфейсов принтера, дисковода, джойстика, светового пера, программатора, контроллеров бытовой аппаратуры, бытовых систем, систем управления различными моделями и т.д. Вплоть до систем управления технологическими процессами промышленных предприятий. В конце 80-х годов в Душанбе на базе этого компьютера была сделана система голосования республиканского парламента. Работают под управлением «Спектрума» и очень интересные системы управления сельскохозяйственными предприятиями (фермами и птицефермами). Интересны автоматизированные системы диагностирования автомобиля, системы контроля состояния спортсменов и многое другое. Поскольку процедуры, управляющие работой всех этих устройств (их называют драйверами), обычно пишутся в машинных кодах, то их надо знать и уметь с ними работать.
Другая особенность состоит в том, что основная масса программ для Синклер-компьютеров написана в Англии на английском языке. Желание адаптировать эти программы на русский язык во многих случаях упирается в необходимость понимания структуры программы, а большинство лучших программ написано именно в машинных кодах.
«ИНФОРКОМ» получает множество писем с вопросами по поводу переделки системы загрузки фирменных программ. Мы так понимаем, что многие уже обзавелись дисководом с Бета-диск интерфейсом, и теперь перед ними стоит задача переписывания программ на диск. При этом пользоваться «магической кнопкой» они не хотят, т.к. при этом любая, даже самая короткая программа будет занимать на диске 48К, а хотят ее переписать на диск блок за блоком и сопроводить загрузчиком с диска. На все эти вопросы ответ может быть только один. Поскольку разные фирмы в своих программах применяют разные системы загрузки, универсального решения здесь не существует. К каждой программе нужен индивидуальный подход. Надо прочитать загрузчик программы, понять куда какой блок загружается и в каком порядке они стартуют, а затем, если надо, внести в него свои изменения. Поскольку лучшие программы имеют при себе загрузчик в машинных кодах (обычно он следует после БЕЙСИК-загрузчика или организован внутри него в строке после оператора REM), то умение работать с машинным кодом Вам пригодится и здесь. Вот в основном те причины, которые могут побудить Вас к освоению программирования в машинных кодах или хотя бы их пониманию (что достигается гораздо быстрее, чем способность активного программирования, но имеет не меньше значения), хотя хотелось бы отметить еще два важных, на наш взгляд, обстоятельства.
Во-первых, «Спектрум» имеет ПЗУ объемом 16К. Эта память буквально насыщена множеством очень полезных системных процедур. Все они записаны в машинных кодах. Их можно смело применять в собственных программах, обращаясь к ним по мере необходимости. Это дает колоссальный выигрыш в расходе памяти и вообще очень упрощает программирование. Поскольку все содержимое ПЗУ записано в машинном коде, умение разбираться в нем является необходимым. Для использования системных программ, содержащихся в ПЗУ, Вам необходимо ознакомиться с основами программирования в машинных кодах.
Что же касается особой трудоемкости работ по программированию в машинных кодах, то и здесь есть ряд возражений.
· Нет необходимости сразу программировать. На первом этапе Вы уже сможете многого достичь, если будете просто разбираться в программах, а дальше все придет с набором опыта.
· Существуют ассемблирующие программы, которые имеют достаточный набор средств, чтобы освободить Вас от самой рутинной работы и снизить трудоемкость программирования.
· Как правило, нет никакой необходимости всю программу писать в машинных кодах. Всегда в ней можно выделить блок, который решающим образом влияет на быстродействие. Он может быть очень маленьким по размеру. Вот его-то и надо записать в машинных кодах, а остальную часть программы оставить, например, на БЕЙСИКе. Если Вы создаете программу «русско-английский словарь», то она вполне может быть написана на БЕЙСИКе и только процедура поиска перевода слова, занимающая много времени, должна быть записана в машинных кодах. Если же Вы создаете русско-китайский словарь, то еще одним узким местом станет рисование на экране иероглифов. Вам придется записать несколько процедур, которые смогут делать это быстро. Диалог с пользователем программа может вести и из БЕЙСИКа.
· И, наконец, последнее. Ни один программист, работающий в машинных кодах, не пишет большую программу от начала и до конца с чистого листа. Программа представляет хитроумное сплетение больших и малых подпрограмм (процедур), из которых до 80% стали для этого программиста стандартными, т.е. он применяет их регулярно во всех своих программах без особых перемен, а Вы никогда об этом и не догадаетесь. Это могут быть арифметических и логических вычислений, обработки изображений, опроса внешних устройств (например, джойстика), вывода текста на экран, звуковых эффектов и т.д. и т.п.
Конечно, если Вы делаете только первые шаги в машинных кодах, то у Вас нет еще такой библиотеки, но прочитав эту книгу, Вы уже можете покопаться в машинном коде некрупных фирменных программ. Там Вы найдете множество открытий. В этом Вам очень поможет какая-либо дисассемблирующая программа, например MONITOR 16/48. Для Вас открыты и другие книги «ИНФОРКОМа» и, самое главное, наши выпуски «ZX-РЕВЮ».
Программирование в машинных кодах книга
Для того, чтобы выполнить печать, надо предварительно решить три вопроса:
— что печатать (какой символ, найти его код) ;
— как печатать (каким цветом, на каком фоне);
Все эти вопросы решаются помещением в аккумулятор нужного кода и вызовом RST 010.
Рассмотрим конкретный пример. Допустим, Вы хотите напечатать в центре экрана фразу «ZX-Spectrum», причем выполнить ее желтым цветом по синему фону.
Но прежде, чем начинать печать на экране, надо открыть канал экрана и очистить экран.
Канал открывается вызовом системной процедуры ПЗУ
Количество очищаемых строк (2 4DEC) Очистка 24-х строк
В акк-р помещаем управл. код AT за которым пойдут координаты позиции печати
Установка номера строки (11)
Ввод номера строки
Установка номера столбца
Ввод номера столбца
Установка кода PAPER
Установка цвета фона
Ввод цвета фона (синий = 1)
Установка кода INK
Установка цвета символов
Ввод цвета символов (желтый = 6)
Установка кода буквы Z
Установка кода буквы «X»
Установка кода знака «-«
Установка кода буквы «s»
Установка кода буквы «p»
Установка кода буквы «e»
Установка кода буквы «с»
Установка кода буквы «t»
КОММЕНТАРИЙ печать буквы «t» Установка кода буквы «r» Печать буквы «r» Установка кода буквы «u» Печать буквы «u» Установка кода буквы «m» Печать буквы «m» Возврат
Запускается данная процедура RANDOMIZE USR 2 6000.
Теперь мы можем поэкспериментировать с кодами управления печатью. Вы, конечно, знаете, какую роль играет разделитель (ЗАПЯТАЯ) в оператре БЕЙСИКа PRINT. Она вызывает печать того, что за ней стоит на другой половине экрана. Код этого управляющего символа 06. Попробуйте заменить по адресу 65B6 код 2D (знак минус) на код 06 и снова запустить процедуру RANDOMIZE USR 26000.
Для справки мы даем здесь текст этой процедуры.
АДРЕС МАШ.КОД МНЕМОНИКА КОММЕНТАРИЙ
2 03С 78 LD A, B Это проверка BC на 0, т. е. напе-
203D B1 OR C чатана вс строка или нет
DEC BC Уменьшение счетчика на единицу.
RET Z Если в счетчике был 0, т.е. вся
строка напечатана, то выход. LD A, (DE) Загрузка в акк-р очередного
символа из Вашей строки. INC DE Переход к очередному символу.
Программирование в машинных кодах книга
6. ДЕМОНСТРАЦИОННЫЕ ПРИМЕРЫ ПРОГРАММ В КОДАХ
A. Выбор области RAM.
Программист должен определить требуемый объём памяти. В SP имеется несколько областей памяти, которые могут использоваться, но демонстрация программ в этой главе будет представлена в области RAM с адреса 32000 и дальше. Программа в кодах в этой области, если требуется, может сохраняться на ленте (SAVE) или загружаться с ленты (LOAD) как блок данных.
Б. Ввод кодов программы.
В SP можно вводить коды только по команде POKE. Однако операнд этой команды может быть задан как 10-ное или 2-ное число или как выражение. Поэтому следующие строки все равносильны: 10 POKE 32000,201 10 POKE 32000,BIN 1100 1001 10 LET A=201: POKE 32000,A
Каждая может оказаться полезной в определенном случае. Рекомендуемый метод заключается в описании команд машинного кода в их соответствующих 16-ных символах. Следующий 16-ный загрузчик будет использоваться во всей главе.
10 D=32000: REM HEX LOADER
20 DEF FN A(A$,B)=CODE A$ (В)-48-7* (CODE A$(B)-57) 30 DEF FN C(A$)=16*FN A (A$,1)+FN A(A$,2)
40 READ A$: IF A$<>«**» THEN POKE D,FN С(А$): LET D=D+1: GO TO 40
Загрузчик будет считывать данные из DATA, в котором каждая пара 16-ных символов заключена в кавычки и отделена от других пар запятыми. Пара символов «**» используется как символ конца. Пример:
50 DATA «00»,»01″,»02″,»**» RUN
Это приведет к тому, что адрес 32000 содержит 0, адрес 32001 содержит 1, адрес 32002 содержит 2.
B. Выполнение программы.
Команда Бейсика «USR число» позволяет остановить выполнение программы монитора в SP и начать выполнять программу в кодах. Важно убедиться, что операнд «USR» установлен на требуемую команду, что программа пользователя кончается командой «RETURN», если необходимо, вернуться в Бейсик, и что величина возвращенной командой «USR» обработана соответствующим образом. Примеры USR:
Каждая из этих форм полезна при определенных условиях. Следующие программы представлены в формате ассемблера, и оператор DATA используется совместно с 16-ным загрузчиком. Команды представлены в том же порядке, как и в главе 5.
Команда «нет операции» (NOP) (см. стр. 33). Эта команда очень простая, и программа машинного кода, содержащая одну или более строк «нет операции», заканчивается «RET».
Следующая программа ассемблера показывает простое использование команды NOP.
Адрес Код Обозначение Комментарии
7D01 С9 RET возврат
Следующая программа Бейсик показывает, как изменить вышеприведенную программу на ассемблере (ASM)
Программа 1. «NOPE» 50 DATA «00»,»C9″,»**» 60 LET A=USR 32000
70 PRINT «нормальное завершение NOP»
Программы для непосредственной загрузки регистров (см. стр. 33). Команда «USR число» возвращает
_ Демонстрационные примеры программ в кодах _
значение регистра BC как абсолютное 16-битовое число, и команда PRINT отображает в 10-ном виде от 0 до 65535. В следующем примере B и C регистры загружаются постоянными, используя команды из этой группы, и программа 2 Бейсик использует программу кода.
7D00 06 00 LD В,00 регистр B=0
7D02 0Е 00 LD С,+ХХ пользователь вводит различные значения
В программе 2 команды ‘LD B,+ADD’ И LD C+ADD’ обе используются. Пользователь может задавать различные значения в качестве входных операндов.
60 INPUT «введите значения для регистра С (только 0-255) «;N 70 CLS
90 PRINT AT 10,0; «регистр С теперь содержит «; CHR$ 32; USR 32000 100 GO TO 60
Следующая программа показывает команду LD BC,+DDDD 7D00 01 00 00 LD BC,+DDDD пользователь вводит
7D03 С9 RET различные значения
В программе 3 можно задавать различные величины «LD BC,+DDDD». Введенная величина должна быть разбита на младший и старший байты прежде, чем она может быть заслана по POKE. Программа 3. «LD BC,+DDDD»
60 INPUT «введите значение для регистра пары BC (только 0-255)»; CHR$ 32;N 70 CLS
80 POKE 32001,N-256*INT(N/256): POKE 32002,INT(N/256)
90 PRINT AT 10,0, «Регистр BC теперь содержат»; CHR$ 32; USR 32000
Команды копирования и обмена регистров (см. стр. 33).
Команды копирования регистр-регистр могут быть показаны загрузкой регистров, отличных от регистров B и C, постоянными, которые затем копируются в B и C регистры для возврата их пользователю. 7D00 06 00 LD B,+00 регистр В=0
7D02 2Е 00 ID L,+00 вводится значение
7D04 4D LD C,L регистр С = регистр L
В программе 4 переменная заводится в регистр B и пересылается в регистр C. Программа 4. «LD C,L»
60 INPUT «введите значения для регистра L (только 0-255)»; CHR$ 32; N 70 CLS
90 PRINT AT 10,0; «С регистр теперь содержит»; CHR$ 32; USR 32000 100 GO TO 50
Нижеследующие программы воодушевят читателя.
Команда ‘EX DE,HL’ может также быть включена в программу 4. Пример.
7D00 26 00 LD H,+00 регистр H=0
7D02 2Е00 LD L,+00 вводятся значения
7D04 ЕВ EX DE,HL пересылается в DE
7D05 42 LD B,D регистр B = регистр D
7D06 4В LD C, E регистр С = регистр E
Это задается следующим оператором DATA.
и может использоваться с программой 4.
Последние две программы этой группы посвящены командам ‘EX AF.’F» и ‘ЕХХ’. Пользователю можно
_ Демонстрационные примеры программ в кодах _
использовать альтернативные регистры, кроме Н’ и L’, содержащие адрес возврата в Бейсик. Читатель может включить эти команды в программу 4. Пример.
Строка 51 переключает все основные регистры, а потом переключает их обратно, не изменяя.
Команды загрузки регистров из адресов памяти (см. стр. 35). Команды в этой группе позволяют пользователю загрузить регистр содержимым памяти. Эта адресация может быть абсолютной, косвенной и индексной.
Первая программа показывает абсолютную индексацию. Задается адрес 31999, имеющий имя STORE, и команда LD A,(ADDR) используется для выборки содержимого STORE по следующей программе. STORE в строке 1 присваивается значение 31999 (16-ное 7CFF). 7D00 06 00 LD В,+00 регистр В
7D02 3A FF 7С LD A,(STORE) выборка текущего значения
В программе 5 пользователь может вводить различные значения, сохраняемые в STORE, и вышеприведенная программа на ASM возвращает их пользователю. Программа 5. «LD A,(ADDR)»
60 INPUT «INTER A VALUE FOR LOCATION STORE(0-255 ONLY)»; CHR$ 32; N 70 CLS
90 PRINT AT 10,0; «THE LOCATION STORE NOW HOLDS»; CHR$ 32; USR 32000 100 GO TO 60
Вторая программа показывает косвенную адресацию. В ней адрес STORE загружается в регистр HL до использования команды «LD C,(HL)» STORE=7CFF. 7D00 06 00 LD B,+00 регистр B=0
7D02 21 FF 7С LD HL,+STORE HL указывает на STORE
7D05 4E LD ^(HL) выборка текущего значения
В программе 6 пользователь может вводить различные величины, сохраняемые в STORE. Программа 6. «LD C,(HL)»
52 DATA «4E»,»C9″,»**» строки 60-100 как в программе 5.
7D02 DD 21 С0 6С LD IX,+BASE установка IX 7D06 DD 4E 3E LD ^(BASE+3F) выборка текущего значения
В программе 7 пользователь опять вводит различные значения, которые помещаются в STORE. Программа 7.
53 DATA «C9″,»**» строки 60-100 как в программе 5.
В программе используется регистр IX, но вполне возможно использование регистр IY, но при этом байты машинного кода надо заменить DD на FD. Заметьте, что маскируемое прерывание потребует блокирования, в то время, пока IY содержит новую величину.
Команды загрузки памяти константами или данными, хранящимися в регистрах (см. стр. 35). Команды этой группы позволяют пользователю загрузить адреса памяти константами или данными из регистров. Опять возможны абсолютная, косвенная и индексная адресация.
Первая программа показывает абсолютную адресацию. В программе абсолютный адрес для команды 31999, 16-ной 7CFF, названной ‘STORE’, используется команда ‘LD (ADDR),A’.
7D00 3E 00 LD A,+XX ввод различных значений
7D02 32 FF 7С LD (STORE), А ввод текущего значения в STORE
В программе 8 пользователь опять вводит различные значения в STORE. Программа в машинных кодах выполняется использованием через RANDOMIZE USR 32000, и величина STORE задается использованием РЕЕК 31999.
Программа 8. «LD (ADDR),A».
60 INPUT «INTER A VALUE FOR LOCATION STORE (0-255 ONLY) «;N 70 CLS
80 POKE 32001,N: RANDOMIZE USR 32000
90 PRINT AT 10,0;»THE LOCATION STORE NOW HOLDS»; CHR$32; PEEK 31999 100 GO TO 50
Вторая программа показывает косвенную адресацию. В этой программе регистровая пара HL указывает на STORE, а команда ‘LD (HD),E’ используется для передачи.
7D00 1E 00 LD E,+XX вводится значение
7D02 21 FF 7C LD HL,STORE HL-указывает на STORE
7D05 73 LD (HL),E пересылка
В программе 9 пользователь опять вводит величину, которая должна передаваться в STORE и обратно считываться с помощью PEEK 31999. Программа 9. «LD (HL),E»
52 DATA «73»,»C9″,»**» Строки 60-100 как в программе 8.
В 3-ей программе используется индексная адресация. В этом случае адрес 32061 (7D3D) называется BASE, и STORE поэтому рассматривается как (‘BASE-3E’). BASE=7D3D STORE=BASE-3E
7D00 3E 00 LD A,+XX вводится значение
7D02 DD 21 3D 7D LD IX,+BASE IX указывает на BASE
7D06 DD 77 C2 LD (IX-3E),A IX-3E рассматривается как IX+CR
В программе 10 пользователь опять вводит величины, которые должны быть переданы в STORE, и считывает обратно с помощью PEEK 31999.
Программа 10. «LD (IX+D),A»
Программы 5-10 все использовали 1-байтовые числа и соответствующие команды регистров.
Команды сложения (см. стр. 36). Команды этой группы позволяют складывать величины вместе (ADD) и увеличивать значение (INC) и складывать с битом переноса.
Первая программа показывает использование команды ‘ADD A,B’.
7D00 00 NOP будет использоваться позже
7D01 3E 00 LD A,+XX вводятся значения
7D05 8 0 ADD A,B суммирование
7D06 06 00 LD B,+00 регистр B=0
7D08 4F LD C,A пересылка результата
В программе 11 пользователь вводит 2 числа. Эти числа передаются в регистры А и В и складываются вместе в двоичной арифметике. Результат возвращается функцией USR. Программа 11. «ADDA.B».
60 INPUT «INTER A FIRST VALUE (0-255) «;CHR$ 32,F 70 INPUT «INTER A SECOND VALUE (0-255)»;CHR$ 32;S 80 CLS
90 POKE 32000,F: POKE 32004,S
100 PRINT AT 10,5;F;CHR$ 32;»ADD»;CHR$ 32;S;CHR$ 32;»=»;CHR$ 32;U SR 32000 110 GO TO 60
Вторая программа для этой группы использует команду INC BC. 7D00 01 00 00 LD B^+ХХХХ вводятся значения
7D03 03 INC BC значение увеличивается
В программе 12 пользователь вводит число в диапазоне 0-65535. Это число затем делится на старшую и младшую части и помещается командой POKE в адреса 7D01 и 7D02. Регистровая пара BC затем увеличивается, и значение возвращается функцией USR. Заметьте эффект ввода значения 65535. Программа 12. «INC BC».
60 INPUT «ENTER A VALUE (0-65535)»; CHR$ 32; N 70 POKE 32002,INT(N/256) 80 POKE 32001,N-256*INT(N/256) 90 CLS
100 PRINT AT 10,0; CHR$ 32;»IN CREMENTS TO GIVE»; CHR$ 32; USR 32000 110 GO TO 60
Третья программа показывает использование команды. Это та же программа, которая используется в программе 11, но изменена для включения команды ADC А,В, а не ADD A,C.
7D00 37 SCF установка флага переноса
7D01 3E 00 LD A,+XX вводятся значения
7D05 8 8 ADC А, В суммирование с переносом
7D06 06 00 LD B,+00 регистр B=0
Эта программа используется в программе 13, в которой пользователь складывает 2 числа вместе с битом переноса. Флаг переноса всегда устанавливается.
Используйте эффект замены команды SCF на AND А (16-ное А7), которая даёт сброс флага переноса. Программа 13. «ADC A,B».
60 INPUT «ENTER A FIRST VALUE (0-255) «; CHR$ 32;F 70 INPUT «ENTER A SECOND VALUE (0-255)»; CHR$ 32;S 80 CLS
90 POKE 32002,F: POKE 32004,S
100 PRINT AT 10,0;»WITH GARRY SET»; CHR$ 32;F; CHR$ 32;»ADC»; CHR$ 32;S; CHR$ 32;»=»; CHR$ 32; USR 32000
Группа 7. Команды вычитания.
Команды в этой группе позволяют вычесть одну величину из другой (SUB), декрементировать значение (DEC) и вычесть бит переноса (SBC).
Первая программа для этой группы команд использует команду ‘SUB В’. Состояние флага переноса определяется после вычитания, и величины 0 или 1 сохраняются в STORE.
будет использоваться дальше вводятся значения
вычитание регистр B=0 пересылка результата регистр A=0 сложение с переносом
передать значение флага переноса в STORE
В программе 14 вышеприведенная программа вызывается после того, как пользователь вводит значения для регистров A и B. Значение флага переноса получено использованием PEEK 31999.