Разработка микропроцессорной системы для управления объектом. Составление карты распределения адресного пространства, страница 23

Mov       A, @R0                                              ; в аккумулятор заносим регистры, начиная с регистра В

Movx    @R1, A                                              ; заносим регистр из аккумулятора во внешнее

; энергонезависимое ОЗУ данных по тому же адресу

dec         R0                                                      ; уменьшаем адрес внешнего ОЗУ

dec         R1                                                      ; уменьшаем адрес копируемого регистра

cjne       R1, #7Fh              , SAVE_SFR        ; проверка: все ли SFR сохранены            

; сохраняем четыре банка регистров R0 - R7

mov       R0, 1Fh                                              ; адрес регистра R7 из 3 банка регистров

mov       R1, 1Fh                                              ; адрес во внешнем ОЗУ

SAVE_Rx:         

Mov       A, @R0                                              ; в аккумулятор заносим регистры, начиная с R7 (банк 3)

Movx    @R1, A                                              ; заносим регистр из аккумулятора во внешнее

; энергонезависимое ОЗУ данных по тому же адресу

dec         R0                                                      ; уменьшаем адрес внешнего ОЗУ

djnz       R1, SAVE_Rx                                  ; уменьшаем адрес копируемого регистра

; сохраняем аккумулятор, а также R0 и R1 (банк 0)

; в ОЗУ сохранены не те значения A, R0 и R1, т.к. они менялись в подпрограмме

push      DPTR   

pop        R1                                                      ; извлекаем R1 из стека

mov       A, R1                                                  ; помещаем R1 в аккумулятор

mov       DPTR, #1                                          ; задаем в DPTR адрес R1 во внешней памяти данных

movx     @ DPTR, A                                       ; сохраняем R1

pop        R0                                                      ; извлекаем R0 из стека

mov       A, R0                                                  ; помещаем R0 в аккумулятор

mov       DPTR, #0                                          ; задаем в DPTR адрес R0 во внешней памяти данных

movx     @DPTR, A                                        ; сохраняем R0

pop        ACC                                                   ; извлекаем аккумулятор из стека

mov       DPTR, #0E0h                                   ; задаем адрес аккумулятора во внешней памяти

movx     @R1, A                                              ; сохраняем аккумулятор во внешнее ОЗУ

pop        DPTR                                                 ; значения всех регистров во внутреннем ОЗУ остались прежними

RETI                                                                

;--------------------------------------------------------------------------------------------------------------------END

Листинг программы для ОМЭВМ AT89C2051:

PROG             SEGMENT     CODE

CONST           SEGMENT     CODE

VAR               SEGMENT     DATA

BITVAR         SEGMENT     BIT

STACK           SEGMENT     IDATA

EXDAT          SEGMENT     XDATA

RSEG  STACK

DS                   10H

CSEG  AT       0

USING            0

JMP    INIT

RSEG  PROG

ORG    40H

INIT:

setb     P3.5                            ;линия формирования прерывания INT3 для AT89S8252

mov     P3,#8H

SCAN:

mov     A,P3                           ;читаем содержимое порта P3

anl       A,#00111000b            ;получаем номер линии возврата - 1-ца

;в соответствующем разряде

rr         A                                 ;сдвиг на 3 разряда

rr         A

rr         A

anl       A,#00011111b            ;обнуляем старшие 3 разряда

cjne     A,#0,READ_KEY      ;если на линии возврата все нули,

;то нажатых клавиш на линии нет

jmp     NEXT_SCAN

READ_KEY:                                     ;чтение кода клавиши

jnb       ACC.0,LINE1             ;если нажатая клавиша на линии 1