Ход работы
Выполнение общего задания:
org $8000 ; Указываем адрес с которого начнет работу программа
Main: ; Главная функция.
mov #$7c,$30 ; Записать по адресу $30 код $7C
mov #$d4,$40 ; Записать по адресу $40 код $D4
mov #$3e,$41 ; Записать по адресу $41 код $3E
mov #$00,$43 ; Записать по адресу $43 код $00
lda $30 ; Записать в аккумулятор значение из ячейки с адресом $30
ldhx $40 ; Записать в HX два значения из ячеек начиная
; с адреса $40 (D4->H и 3E->X)
add $41 ; Складываем аккумулятор и значение из ячейки
; с адресом $41 (7C+3E=BA)
bmi L0 ; Если результат отрицательный (N=1),
; то переходит на метку L0
nega ; Если условие не выполнилось, то
; Изменение знака в аккумуляторе (0-A)
lda $43 ; Записать в аккумулятор значение из ячейки с адресом $43
L0:
brclr 5,$43,L1 ; Если 5-ый бит значения ячейки с адресом $43
; равен 0, то переходим на L1
mul ; иначе беззнаковое умножение A*X -> X:A
L1:
eor $30 ; А "исключающее ИЛИ" значение по адресу $30
; BA (+) 7С = С6
rorx ; Циклический сдвиг вправо 3E=0011 1110, C=0,
; X->0001 1111, C=0
Вопрос:
Какой код в результате окажется по адресу $30 и что будет во флагах N, V и Z?
Ответ:
В результате выполнения программы по адресу $30 хранится значение $7C. При этом в регистре CCR значения признака знака N, признака переполнения при обработке чисел со знаком V и признака нуля Z установлены в «0». Что можем наблюдать на рис. 2.
Рис. 2 Состояние регистров и памяти в режиме симуляции после выполнения задания
Задание на бригаду:
С использованием подпрограмм написать программу, которая вычисляет среднее арифметическое для тех элементов массива из 11 однобайтовых чисел без знака, у которых бит 4 равен 1.
Выполнение задания бригады:
org $8000
lda #$fe
psha ; Положили 11 значений в стек
lda #$f1
psha
lda #$38
psha
lda #$24
psha
lda #$ba
psha
lda #$ff
psha
lda #$e3
psha
lda #$a1
psha
lda #$02
psha
lda #$00
psha
lda #$57
psha
mov #$0B,$83 ; Кладем число 11 в ячейку $83
mov #$00,$81 ; 2 байта для результата суммирования
mov #$00,$82
mov #$00,$84 ; Счетчик чисел, подходящих по условию
N0: ; Метка для реализации цикла
jsr func_add ; Переход к подпрограмме func_add
dbnz $83,N0 ; Цикл. Уменьшаем значение в ячейке $83
; и если это значение не равно 0,то переходим к метке N0
ldhx $81 ; Загружаем делимое (H:A)
lda $82 ;
ldx $84 ; и делитель (X)
div ; H:A/X
bra Main_Loop ; Перейти на метку Main_loop
func_add:
pulh ; Выгружаем из стека 2 байта
; которые хранят адрес возврата из подпрограммы
pulx
pula ; Выгружаем число (одно из 11) и загружаем в аккумулятор
pshx ; Загружаем обратно адрес возврата
pshh
sta $80 ; Загружаем ту ячейку, которую хотим сложить
brset 4,$80,N1 ; Условие, если 4-ый бит числа, записанное в ячейке $80,
; равен единицы
rts ; Выход из подпрограммы, если условие не выполняется
N1:
inc $84 ; Увеличиваем счетчик чисел, подходящих условию
add $82 ; Складываем число с 2-ым байтом результата
sta $82 ; Сохраняем результат сложения в ячейку памяти по адресу $82
lda #$00 ; Обнуляем А
adc $81 ; Складываем бит переноса с первым байтом результата (А+$81+C)
sta $81 ; Сохраняем сумму в ячейку $81
rts ; Выход из подпрограммы
Main_Loop: ; Бесконечный цикл, обязателен.
nop
bra Main_Loop ; Перейти на метку Main_loop
Рис. 4. Блок-схема для задания на бригаду
Рис. 5. Содержание стека после загрузки массива
Рис. 6. Состояние регистров и памяти в режиме симуляции