Проблемы и их решения
1) Напишите программу на языке ассемблера, которая начинается с $0200 для 6502 µP и добавляет беззнаковые числа 2A94. ЧАС (добавить) к 2ABF ЧАС (авгенд). Пусть входы и выход находятся в памяти. Кроме того, вручную создайте собранный программный документ.
Решение:
ЦЛК
ЛДА $0213
АЦП $0215
СТА $0217
ЛДА $0214
АЦП $0216
СТА $0218
Собранная программа:
2) Напишите программу на языке ассемблера, которая начинается с $0200 для 6502 мкП и вычитает беззнаковые числа, 1569. ЧАС (вычесть) из 2ABF ЧАС (уменьшаемое). Пусть входы и выход находятся в памяти. Также вручную создайте собранный программный документ.
Решение:
SEC
ЛДА $0213
СБК $0215
СТА $0217
ЛДА $0214
СБК $0216
СТА $0218
Собранная программа:
3) Напишите программу на языке ассемблера для 6502 µP, которая считает с помощью цикла от $00 до $09. Программа должна начинаться с $0200. Кроме того, вручную создайте собранный программный документ.
Решение:
LDA #$09
СТА $0220 ; для сравнения X и $09
ЛДКС #$00
цикл INX
CPX $0220
Петля БНЕ
Собранная программа:
4) Напишите программу на ассемблере стоимостью от 0200 долларов США для 6502 µP. Программа имеет две подпрограммы. Первая подпрограмма добавляет беззнаковые числа 0203. ЧАС (дополнение) и 0102 ЧАС (добавить). Вторая подпрограмма добавляет сумму из первой подпрограммы, которая равна 0305. ЧАС до 0006 ЧАС (авгенд). Конечный результат сохраняется в памяти. Вызовите первую подпрограмму FSTSUB и вторую подпрограмму SECSUB. Пусть входы и выходы будут в памяти. Кроме того, вручную создайте собранный программный документ для всей программы.
Решение:
SECSUB CLC
ЛДА $021А
АЦП $0234
СТА $0236
LDA $021 млрд.
АЦП $0235
СТА $0237
РТС
ФСТСУБ ЦЛК
LDA $0216
АЦП $0218
СТА $021A
ЛДА $0217
АЦП $0219
СТА $021 млрд.
РТС
JSR ФСТСУБ
Собранная программа:
5) Учитывая, что ¯IRQ обработчик добавляет от $02 до $01 в аккумуляторе в качестве основной обработки, в то время как ¯НМИ выдается, и основная обработка для ¯НМИ добавляет от $05 до $04 в аккумуляторе, напишите ассемблер для обоих обработчиков, включая их вызовы. Звонок в ¯IRQ обработчик должен находиться по адресу $0200. ¯IRQ обработчик должен начинаться с адреса $0300. ¯НМИ обработчик должен начинаться с адреса $0400. Результат ¯IRQ обработчик должен быть помещен по адресу $0500, а результат ¯НМИ обработчик должен быть помещен по адресу $0501.
Решение:
НМИСР ФГА; Процедура NMI начинается здесь, по адресу $0400.
ПХХ
ФИЗИЧЕСКИЙ
;
LDA #$04
АЦП #$05
СТА $0501
;
ПЛИ
ПЛХ
НОАК
РТИ
ИСР ФА; эта инструкция находится по адресу $0300
ПХХ
ФИЗИЧЕСКИЙ
;
LDA #$01
АЦП #$02
; JMP NMISR: закомментировано, поскольку это не является частью процедуры.
СТА $0500; пойдет в стопку
;
ПЛИ
ПЛХ
НОАК
РТИ
;
JMP ISR ; эта инструкция находится по адресу $0200
6) Кратко объясните, как инструкция BRK используется для создания программного прерывания в компьютере 65C02.
Решение:
Основным способом создания программного прерывания для 65C02 µP является использование команды подразумеваемого адреса BRK. Предположим, что основная программа работает и встречает инструкцию BRK. С этого момента адрес следующей инструкции на ПК должен быть отправлен в стек по мере завершения текущей инструкции. Следующей должна быть вызвана подпрограмма для обработки инструкций программного обеспечения. Эта подпрограмма прерывания должна поместить содержимое регистров A, X и Y в стек. После выполнения ядра подпрограммы содержимое регистров A, X и Y должно быть возвращено из стека в свои регистры завершающей подпрограммой. Последний оператор в программе — RTI. Содержимое ПК также автоматически возвращается из стека на ПК из-за RTI.
7) Создайте таблицу, в которой сравниваются и противопоставляются обычная подпрограмма и процедура обработки прерывания.
Решение:
8) Кратко объясните основные режимы адресации 65C02 µP на примерах инструкций на языке ассемблера.
Решение:
Каждая инструкция для 6502 состоит из одного байта, за которым следует ноль или более операндов.
Режим немедленной адресации
В режиме непосредственной адресации после операнда указывается значение, а не адрес памяти. Перед значением должен стоять #. Если значение шестнадцатеричное, то за «#» должен следовать «$». Инструкции непосредственной адресации для 65C02: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Читателю следует обратиться к документации по 65C02 µP, чтобы узнать, как использовать перечисленные здесь инструкции, которые не были объяснены в этой главе. Пример инструкции:
LDA #$77
Режим абсолютной адресации
В режиме абсолютной адресации имеется один операнд. Этот операнд представляет собой адрес значения в памяти (обычно в шестнадцатеричном формате или в виде метки). Для 6502 мкП имеется 64K10 = 65,53610 адресов памяти. Обычно однобайтовое значение находится по одному из этих адресов. Инструкции абсолютной адресации для 65C02: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA. , СТХ, СТЙ, СТЗ, ТРБ, БСЭ. Читателю следует обратиться к документации 65C02 µP, чтобы узнать, как использовать инструкции, перечисленные здесь, а также остальные режимы адресации, которые не были объяснены в этой главе. Пример инструкции:
ОНИ СТОЯТ $1234
Неявный режим адресации
В подразумеваемом режиме адресации операнд отсутствует. Любой задействованный регистр µP подразумевается инструкцией. Подразумеваемые инструкции адресации для 65C02: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC. , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Пример инструкции:
DEX: Уменьшите регистр X на одну единицу.
Режим относительной адресации
Режим относительной адресации касается только инструкций перехода. В режиме относительной адресации имеется только один операнд. Это значение от -12810 до +12710. Это значение называется смещением. В зависимости от знака это значение добавляется или вычитается из следующей инструкции счетчика программ к результату по адресу предполагаемой следующей инструкции. Инструкции режима относительного адреса: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Примеры инструкций:
BNE $7F : (перейти, если Z = 0 в регистре состояния, P)
который добавляет 127 к текущему счетчику программы (адресу для выполнения) и начинает выполнение инструкции по этому адресу. Сходным образом:
BEQ $F9 : (перейти, если Z = : в регистре состояния, P)
который добавляет -7 к счетчику текущей программы и запускает выполнение по новому адресу счетчика программы. Операнд представляет собой число, дополняемое до двух.
Абсолютная индексная адресация
При абсолютной индексной адресации содержимое регистра X или Y добавляется к заданному абсолютному адресу (от $0000 до $FFFF, т.е. от 010 до 6553610), чтобы получить реальный адрес. Этот заданный абсолютный адрес называется базовым адресом. Если используется регистр X, инструкция ассемблера выглядит примерно так:
ЛДА $C453,X
Если используется регистр Y, это будет примерно так:
ЛДА $C453,Y
Значение регистра X или Y называется значением счетчика или индекса и может находиться в диапазоне от $00 (010) до $FF (25010). Это не называется смещением.
Инструкции абсолютной индексной адресации: ADC, AND, ASL (только X), BIT (с аккумулятором и памятью, только с X), CMP, DEC (только память и X), EOR, INC (только память и X), LDA. , LDX, LDY, LSR (только X), ORA, ROL (только X), ROR (только X), SBC, STA, STZ (только X).
Абсолютная косвенная адресация
Используется только с инструкцией перехода. При этом данный абсолютный адрес имеет адрес указателя. Адрес указателя состоит из двух байтов. Двухбайтовый указатель указывает (является адресом) значения байта назначения в памяти. Итак, инструкция на языке ассемблера выглядит следующим образом:
JMP (3456 долларов США)
Если использовать круглые скобки и $13 в адресе $3456, а $EB — в адресе $3457 (= $3456 + 1), то адрес назначения будет равен $13EB, а $13EB — это указатель. В скобках в инструкции указано абсолютные $3456.
9) а) Напишите программу на машинном языке 6502, которая будет выражать фразу «Я люблю тебя!» строка кодов ASCII в памяти, начиная с адреса $0300 и длины строки. Программа должна запускаться по адресу $0200. Получите каждый символ из аккумулятора, предполагая, что они отправляются туда по одному некоторой подпрограммой. Также соберите программу вручную. (Если вам нужно знать ASCII-коды фразы «Я люблю тебя!», вот они: «I»: 4916, пробел: 2016, «l»: 6C16, «o»: 6F16, «v»: 7616, ' e':65, 'y':7916, 'u':7516 и '!':2116. Примечание: каждый код занимает 1 байт).
б) Напишите программу на машинном языке 6502, которая бы выводила фразу «Я люблю тебя!» строка кодов ASCII в памяти, начинающаяся с адреса $0300 без указания длины строки, но заканчивающаяся на 0016. Программа должна начинаться с адреса $0200. Получите каждый символ из аккумулятора, предполагая, что они отправляются туда один за другим некоторой подпрограммой. Также соберите программу вручную.
Решение:
а) Стратегия: для строки предусмотрено 12 байтов: 1 байт для длины строки и 11 байтов для строкового литерала. Итак, должно быть 12 итераций (циклов), считая с 0. То есть: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Это 12 чисел.
Целое число 0 помещается в регистр X, а число 1110 = 1210 – 110 = B16 = $0B помещается в адресную ячейку памяти, скажем, адрес $0250. Для каждой итерации значение регистра X увеличивается, а результат сравнивается с $0B в адресной ячейке $0250. Как только значение X станет равным значению $0B, итерация останавливается. На этом этапе длина (количество байтов) строки и строковый литерал занимают адреса от $0300 до $030B (включительно). Для увеличения адресов памяти, начиная с $0300, используется регистр Y. Код:
LDA #$0 млрд.
ОНИ СТОЯТ 0250$
ЛДКС #$00
ЛДИ #$00
СТА $0300; длина 11 помещается в A некоторой подпрограммой и переходит в $0300.
цикл INX
ТАМ
0250 киенских долларов США
петля BEQ
б) Стратегия: для строки предусмотрено 12 байтов: 1 байт для нулевого терминатора $00 и 11 байтов для строкового литерала. Итак, должно быть 12 итераций (циклов), считая с 0. То есть: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Это 12 чисел.
Целое число 0 помещается в регистр X, а число 1110 = 1210 – 110 = B16 = $0B помещается в адресную ячейку памяти, скажем, адрес $0250. Для каждой итерации значение регистра X увеличивается, а результат сравнивается с $0B в адресной ячейке $0250. Как только значение X станет равным значению $0B, итерация останавливается. На этом этапе количество байтов строкового литерала плюс нулевой символ занимают адреса от $0300 до $030B (включительно). Для увеличения адресов памяти начиная с $0300 используется регистр Y. Код:
LDA #$0 млрд.
ОНИ СТОЯТ 0250$
ЛДКС #$00
LDY#$00
СТА $0300; «Я» помещается в A какой-то подпрограммой и переходит в $0300.
цикл INX
ТАМ
0250 киенских долларов США
петля BEQ