Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;============================================================================================
- ; НАЧАЛЬНЫЕ БЛОКИ ИНИЦИАЛИЗАЦИИ КОП, НОМЕРА РЕГИСТРА И СПОСОБА АДРЕСАЦИИ |
- ;============================================================================================
- ; Прогонка: адрес R1 (0B02h,0B03h), адрес, лежащий в R1[0D01h], следующая ячейка ) 0D02h
- ; по адресам [0D01h,0D02h] лежит адрес [0E01h] = 0AFE
- ; 0AF0h, 0AF1h - КОП команды NEG
- ; 0AF2h - 00NNNссс (N_регистра и Cпособ_адресации)
- $ADR 0000h
- LXI SP, 00FFh ; устанавливаем указатель стека
- LXI H, 0AF0h
- MVI B, 61h
- MOV M, B ; в адр 0AF0 лежит 61h
- INX H
- MVI B, 0DDh
- MOV M, B ; в адр 0AF1 лежит DDh
- ;---------------------------------------------------------------------------------------------
- ; Формируем №_регистра и способ адресации |
- ; |
- ; 0AF2h - N регисра, Сп.адр (00 NNN CCC) |
- ;---------------------------------------------------------------------------------------------
- LXI H, 0AF2h
- IN 20h
- RLC
- RLC
- RLC
- MOV B, A
- IN 20h
- ADD B
- MOV B, A
- MOV M, B;
- ;--------------------------------------------------------------------------------------------
- ;--------------------------------------------------------------------------------------------
- ; определение номера регистра |
- ; |
- ; в стеке лежат СВЕРХУ старший байт регистра, СНИЗУ младший байт регистра |
- ;--------------------------------------------------------------------------------------------
- LXI H, 0AF2h ; адрес значения N_регистра и C_адресации (00 NNN ССС)
- LXI B, 0B00h ; адрес начала регистровой памяти (старшая часть R0)
- MOV A, M ; значение по 0AF2h
- ANI 00111000b ; парсим № регистра
- RAR
- RAR ; А <- 0000 NNN 0 - адрес регистра старшего
- ADI 00000001b ; A >> 2 + 1-> 0000 NNN 1, где xxx1 - смещение от 0B00h
- ADD C ; младший байт адреса + 2*(N_reg)+1
- MOV C, A ; ADR + 2(№_регистра)+1 -> в А адрес регистра младший байт
- PUSH B ; в СТЕКЕ лежит адрес начала регистра младший байт
- DCX B ; переходим к старшему байту
- PUSH B ; в стек записываем старший байт
- ;--------------------------------------------------------------------------------------------
- ;--------------------------------------------------------------------------------------------
- ; определение способа адресации |
- ;--------------------------------------------------------------------------------------------
- LXI H, 0AF2h ; адрес значения N_регистра и C_адресации (00 №№№ ССС)
- MOV A, M ; значение по 0AF2h
- MVI B, 00000010b; B <- 0000 0010
- ANI 00000111b ; вытаскиваем способ адресации (00 000 ССС)
- CMP B
- JZ AUTO_FORW ; 010 - прямая
- MVI B, 011b ; B <- 0000 0011
- CMP B
- JZ AUTO_COSV ; 011 - автоинкрементная косвенная
- JMP ERRORR ; не тот тип адресации
- ;--------------------------------------------------------------------------------------------
- ;=============================================================================================
- ; ОСНОВНАЯ ПРОГРАММА |
- ;=============================================================================================
- ;=============================================================================
- ; ПРЯМАЯ АВТОИНКРЕМЕНТНАЯ |
- ;=============================================================================
- AUTO_FORW: POP B ; вытаскиваем адрес регистра [старший]
- LDAX B ; кладем значение по адресу регистра [старший] в акк.
- ; A <- R[i] [старший]
- MOV H, A ; Записываем в H значение адреса, лежащего в старшем байте регистра
- POP D ; вытаскиваем адрес регистра [младший]
- LDAX D ; кладем значение по адресу регистра [младший] в акк.
- MOV L, A ; Записываем в L значение адреса, лежащего а младшем байте регистра (HL = 0D01)
- INX H ; %%%
- INX H ;%%% HL + 2 (инкрементируем адрес, лежащий в регистре = 0D03)
- MOV A, H ; %%%
- STAX B ; %%% Кладем инкрементированное значение адреса в ту же ячейку регистра [старший байт регистра]
- MOV A, L ;%%%
- STAX D ;%%% Кладем инкрементированное значение адреса в ту же ячейку регистра [младший байт регистра]
- DCX H ;%%%
- DCX H ;%%% возвращаемся обратно к текущему адресу
- MOV D, M ; Записываем в D старшую часть данных (х8), лежашую по адресу HL
- INX H ; Инкрементируем адрес ячейки памяти HL++
- MOV E, M ; Записываем в E младшую часть данных (x8), лежащую в по адресу [HL+1]
- ; Таким образом в DE лежат данные (х16)
- DCX H ; %%% Возвращаемся к старшему байту [HL--]
- MOV A, D ; Записываем в акк. старший байт данных
- XRI 11111111b ; ~A [старший]
- MOV D, A ; Записываем сдвинутый старший байт обратно в D
- MOV A, E ; Записываем в акк. младший байт данных
- XRI 11111111b ; ~A [младший]
- ADI 00000001b ; +1
- MOV E, A ; Возвращаем в E сдвинутый младший байт
- MVI B, 0h
- MOV A, D ; записываем в акк. старший байт данных, чтобы учесть перенос
- ADC B ; записываю в А <- A + 0 + CY
- MOV D, A ; записываем сдвинутый старший байт обратно в D
- JMP SET_INC
- ;============================================================================
- ; КОСВЕННАЯ АВТОИНКРЕМЕНТНАЯ |
- ;============================================================================
- AUTO_COSV: POP B ; вытаскиваем адрес регистра [старший]
- LDAX B ; кладем значение по адресу регистра [старший] в акк.
- ; A <- R[i] [старший]
- MOV H, A ; Записываем в H значение адреса, лежащего в старшем байте регистра
- POP D ; вытаскиваем адрес регистра [младший]
- LDAX D ; кладем значение по адресу регистра [младший] в акк.
- MOV L, A ; Записываем в L значение адреса, лежащего а младшем байте регистра
- INX H ; увеличиваем адрес HL++, лежащий в регистре
- INX H
- MOV A, H
- STAX B ; Кладем инкрементированное значение адреса в ту же ячейку регистра [старший байт регистра]
- MOV A, L
- STAX D ; Кладем инкрементированное значение адреса в ту же ячейку регистра [младший байт регистра]
- DCX H
- DCX H ; возвращаемся обратно к текущему адресу
- MOV B, H
- MOV C, L ; В BC лежит HL (старший адрес в регистре)
- PUSH B ; в стеке лежит адрес в регистре
- MOV D, M ; Записываем в D старшую часть адресса данных (х8), лежашую по адресу HL
- INX H ; Инкрементируем адрес ячейки памяти HL++
- MOV E, M ; Записываем в E младшую часть адресса данных (x8), лежащую в по адресу [HL+1]
- ; Таким образом в DE лежит аддрес с данными (х16)
- MOV B, D
- MOV C, E
- LDAX D ; запишим в акк. старший байт данных
- MOV H, A ; в H лежит старший байт данных
- INX D ; увеличиваем адрес данных DE++
- LDAX D ; записываем младший байт данных в акк.
- MOV E, A
- MOV D, H ; В DE лежат данные
- MOV A, D ; Записываем в акк. старший байт данных
- XRI 11111111b ; ~A [старший]
- MOV D, A ; Записываем старший байт обратно в D
- MOV A, E ; Записываем в акк. младший байт данных
- XRI 11111111b ; ~A [младший]
- ADI 00000001b ; +1
- MOV E, A ; %%% кладем ~[E+1] обратно в E
- MOV A, D ; Записываем в акк. старший байт данных
- PUSH B ; запишем данные В в стек, чтобы обнулить регистр
- MVI B, 0h
- MOV A, D ; записываем в акк. старший байт данных, чтобы учесть перенос
- ADC B ; записываю в А <- A + 0 + CY
- MOV D, A ; записываем сдвинутый старший байт обратно в D
- ;%%% delete %%% MOV E, A - вот здесь и была ошибка, ты то, что лежало в D положил и в Е
- POP B ; достаем данные В из стека
- MOV H, B
- MOV L, C ; В HL старший адрес
- JMP SET_INC
- ;=============================================================================
- ; ВЫХОД |
- ;=============================================================================
- SET_INC:
- MOV M, A ; Кладем старший байт данных по адресу HL
- MOV A, E
- INX H ; HL++
- MOV M, A ; Кладем младший байт данных по адресу HL++
- JMP END
- ;=============================================================================================
- ; ЗАВЕРШЕНИЕ |
- ; при корректном задании действия в конце программы загорятся все лампочки 30 порта |
- ;=============================================================================================
- ERRORR: MVI A, 10101010b
- OUT 30h
- END: MVI A, 11111111b
- OUT 30h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement