Ход работы
Выполнение общего задания:
org $8000 ; Указываем адрес с которого начнет работу программа
Main: ; Главная функция.
mov #$7c,$30 ; Записать по адресу $30 код $7C
mov #$d4,$40 ; Записать по адресу $40 код $D4
mov #$3e,$41 ; Записать по адресу $41 код $3E
lda $30 ; Загрузить в А содержимое ячейки по адресу 0x30
ldhx $40 ; Загрузить в H:X два значения начиная с адреса 0x40
; (D4->H и 3E->X)
add $41 ; Сложить А и значение ячейки по адресу $41 (7C+3E=BA)
nsa ; Переставляем тетрады в А
; (биты с 7-4) <-> (биты с 3-0) -> (AB)
sbc $40 ; Вычитание с заёмом.
; Из А вычитаем значение по адресу $40
; и вычитаем значение флага С. Результат кладем в А
; (AB-D4-0=D7 и флаг С=1)
mul ; Беззнаковое умножение A*X = X:A
; (D7*3E = 3412) (34->X и 12->A) (C->0)
sthx $50 ; Запись двух значений из H:X в ячейки памяти
; начиная с адреса 0x50 (D4->$50 и 34->$51)
eor $30 ; Исключающее ИЛИ.
; Выполняется между А и значение по адресу $30
; (12 (+) 7C = 6E)
rolx ; Циклический сдвиг влево регистра Х.
; ($34=00110100 C=0)->(01101000->68 C=0)
stx $31 ; Запись содержимое X в память по адресу 0x31 (68)
ror $31 ; Циклический сдвиг вправо ячейки памяти по адресу $31.
; (01101000->68 C=0) -> (00110100->34 C=0)
Main_Loop: ; Бесконечный цикл, обязателен в микроконтроллере
nop
bra Main_Loop ; Перейти на метку Main_loop
Вопрос:
Какой код в результате окажется по адресу $31 и что будет во флагах N и Z?
Ответ:
В результате выполнения программы по адресу $31 хранится значение $34. При этом в регистре CCR значения признака знака и признака нуля установлены в «0». Что можем наблюдать на рис. 2.
Рис. 2 Состояние регистров и памяти в режиме симуляции после выполнения задания
Задание на бригаду:
Написать программу, которая меняет местами тетрады в частном при нахождении среднего арифметического для массива из 7 однобайтовых чисел без знака.
Выполнение задания бригады:
org $8000
mov #$19,$60 ; Кладем в 7 ячеек памяти разные значения начиная с адреса $60
mov #$2c,$61
mov #$3e,$62
mov #$4b,$63
mov #$55,$64
mov #$1a,$65
mov #$2f,$66
ldhx #$0000 ; Записываем в HX ноль
mov #$00,$67
lda $60 ; Загружаем первое число массива в А
add $61 ; Складываем первое число со вторым и результат кладем в А
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
lda $68 ; Кладем в А значение ячейки по адресу $68
add $62 ; Складываем с третьим числом массива
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
lda $68 ; Кладем в А значение ячейки по адресу $68
add $63 ; Складываем с четвертым числом массива
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
lda $68 ; Кладем в А значение ячейки по адресу $68
add $64 ; Складываем с пятым числом массива
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
lda $68 ; Кладем в А значение ячейки по адресу $68
add $65 ; Складываем с шестым числом массива
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
lda $68 ; Кладем в А значение ячейки по адресу $68
add $66 ; Складываем с седьмым числом массива
sta $68 ; Сохраняем результат сложения в ячейку памяти по адресу $68
lda #$00 ; Обнуляем А
adc $67 ; Складываем бит переноса (А+$67+C)
sta $67 ; Сохраняем сумму в ячейку $67
ldhx $67 ; Кладем в HX два значения начиная с адреса $67
; Так как в H должны сохранить сумму переносов (ячейка $67)
lda $68 ; Кладем в А значение ячейки $68 (сумма чисел без переносов)
ldx #$07 ; В X кладем 7 (так как массив из 7 чисел)
div ; Делим. Находим среднее арифметическое.
; H:A/X = результат->А, остаток->H
nsa ; Меняем местами тетрады в А
Main_Loop: ; Бесконечный цикл, обязателен.
nop
bra Main_Loop ; Перейти на метку Main_loop
Рис. 3 Состояние регистров и памяти в режиме симуляции