Advertisement
Guest User

Untitled

a guest
May 30th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;============================================================================================
  2. ;       НАЧАЛЬНЫЕ БЛОКИ ИНИЦИАЛИЗАЦИИ КОП, НОМЕРА РЕГИСТРА И  СПОСОБА АДРЕСАЦИИ             |
  3. ;============================================================================================
  4.  
  5. ; Прогонка: адрес R1 (0B02h,0B03h), адрес, лежащий в R1[0D01h], следующая ячейка ) 0D02h
  6. ; по адресам [0D01h,0D02h] лежит адрес [0E01h] = 0AFE
  7.  
  8. ;   0AF0h, 0AF1h - КОП команды NEG
  9. ;   0AF2h        - 00NNNссс (N_регистра и Cпособ_адресации)
  10. $ADR 0000h
  11.     LXI SP, 00FFh            ; устанавливаем указатель стека
  12.     LXI H, 0AF0h
  13.     MVI B, 61h
  14.     MOV M, B                ;   в адр 0AF0 лежит 61h
  15.     INX H
  16.     MVI B, 0DDh
  17.     MOV M, B                ;   в адр 0AF1 лежит DDh
  18.  
  19. ;---------------------------------------------------------------------------------------------
  20. ;                       Формируем №_регистра и способ адресации                              |
  21. ;                                                                                            |
  22. ;                       0AF2h - N регисра, Сп.адр (00 NNN CCC)                               |
  23. ;---------------------------------------------------------------------------------------------
  24.     LXI H, 0AF2h
  25.     IN 20h
  26.     RLC
  27.     RLC
  28.     RLC
  29.     MOV B, A
  30.     IN 20h
  31.     ADD B
  32.     MOV B, A
  33.     MOV M, B;
  34.    
  35. ;--------------------------------------------------------------------------------------------
  36.  
  37.                
  38. ;--------------------------------------------------------------------------------------------
  39. ;                               определение номера регистра                                 |
  40. ;                                                                                           |
  41. ;           в стеке лежат СВЕРХУ старший байт регистра, СНИЗУ младший байт регистра         |
  42. ;--------------------------------------------------------------------------------------------
  43.                 LXI H, 0AF2h    ; адрес значения N_регистра и C_адресации (00 NNN ССС)
  44.                 LXI B, 0B00h    ; адрес начала регистровой памяти (старшая часть R0)
  45.                 MOV A, M        ; значение по 0AF2h
  46.                 ANI 00111000b   ; парсим № регистра
  47.                 RAR
  48.                 RAR             ; А <- 0000 NNN 0 - адрес регистра старшего
  49.                 ADI 00000001b   ; A >> 2 + 1-> 0000 NNN 1, где xxx1 - смещение от 0B00h
  50.                 ADD C           ; младший байт адреса + 2*(N_reg)+1
  51.                 MOV C, A        ; ADR + 2(№_регистра)+1 -> в А адрес регистра младший байт
  52.                 PUSH B          ; в СТЕКЕ лежит адрес начала регистра младший байт
  53.                 DCX B           ; переходим к старшему байту
  54.                 PUSH B          ; в стек записываем старший байт
  55. ;--------------------------------------------------------------------------------------------
  56.  
  57.                
  58. ;--------------------------------------------------------------------------------------------
  59. ;                               определение способа адресации                               |
  60. ;--------------------------------------------------------------------------------------------
  61.                 LXI H, 0AF2h    ; адрес значения N_регистра и C_адресации (00 №№№ ССС)
  62.                 MOV A, M        ; значение по 0AF2h
  63.                 MVI B, 00000010b; B <- 0000 0010
  64.                 ANI 00000111b   ; вытаскиваем способ адресации (00 000 ССС)
  65.                 CMP B
  66.                
  67.                 JZ AUTO_FORW    ; 010 - прямая
  68.                 MVI B, 011b     ; B <- 0000 0011
  69.                 CMP B
  70.                 JZ AUTO_COSV    ; 011 - автоинкрементная косвенная
  71.                 JMP ERRORR      ; не тот тип адресации
  72. ;--------------------------------------------------------------------------------------------
  73.  
  74.  
  75. ;=============================================================================================
  76. ;                                  ОСНОВНАЯ ПРОГРАММА                                        |
  77. ;=============================================================================================                
  78.  
  79.                 ;=============================================================================
  80.                 ;                         ПРЯМАЯ АВТОИНКРЕМЕНТНАЯ                            |
  81.                 ;=============================================================================
  82.    
  83.     AUTO_FORW:  POP B           ; вытаскиваем адрес регистра [старший]
  84.                 LDAX B          ; кладем значение по адресу регистра [старший] в акк.
  85.                                 ; A <- R[i] [старший]
  86.                 MOV H, A        ; Записываем в H значение адреса, лежащего в старшем байте регистра
  87.                 POP D           ; вытаскиваем адрес регистра [младший]
  88.                 LDAX D          ; кладем значение по адресу регистра [младший] в акк.
  89.                 MOV L, A        ; Записываем в L значение адреса, лежащего а младшем байте регистра (HL = 0D01)
  90.                 INX H            ; %%%
  91.                 INX H           ;%%%  HL + 2 (инкрементируем адрес, лежащий в регистре = 0D03)
  92.                 MOV A, H       ; %%%
  93.                 STAX B          ; %%% Кладем инкрементированное значение адреса в ту же ячейку регистра [старший байт регистра]
  94.                 MOV A, L        ;%%%
  95.                 STAX D          ;%%% Кладем инкрементированное значение адреса в ту же ячейку регистра [младший байт регистра]
  96.                 DCX H           ;%%%
  97.                 DCX H           ;%%%  возвращаемся обратно к текущему адресу      
  98.                 MOV D, M        ; Записываем в D старшую часть данных (х8), лежашую по адресу HL
  99.                 INX H           ; Инкрементируем адрес ячейки памяти HL++
  100.                 MOV E, M        ; Записываем в E младшую часть данных (x8), лежащую в по адресу [HL+1]
  101.                                 ; Таким образом в DE лежат данные (х16)
  102.                 DCX H           ; %%% Возвращаемся к старшему байту [HL--]  
  103.                 MOV A, D        ; Записываем в акк. старший байт данных
  104.                 XRI 11111111b   ; ~A [старший]
  105.                 MOV D, A        ; Записываем сдвинутый старший байт обратно в D
  106.                 MOV A, E        ; Записываем в акк. младший байт данных
  107.                 XRI 11111111b   ; ~A [младший]
  108.                 ADI 00000001b   ; +1
  109.                 MOV E, A        ; Возвращаем в E сдвинутый младший байт
  110.                 MVI B, 0h
  111.                 MOV A, D        ; записываем в акк. старший байт данных, чтобы учесть перенос
  112.                 ADC B           ; записываю в А <- A + 0 + CY
  113.                 MOV D, A        ; записываем сдвинутый старший байт обратно в D
  114.                 JMP SET_INC
  115.                
  116.                 ;============================================================================
  117.                 ;                         КОСВЕННАЯ АВТОИНКРЕМЕНТНАЯ                        |
  118.                 ;============================================================================            
  119.                
  120.     AUTO_COSV:  POP B           ; вытаскиваем адрес регистра [старший]
  121.                 LDAX B          ; кладем значение по адресу регистра [старший] в акк.
  122.                                 ; A <- R[i] [старший]
  123.                 MOV H, A        ; Записываем в H значение адреса, лежащего в старшем байте регистра
  124.                 POP D           ; вытаскиваем адрес регистра [младший]
  125.                 LDAX D          ; кладем значение по адресу регистра [младший] в акк.
  126.                 MOV L, A        ; Записываем в L значение адреса, лежащего а младшем байте регистра
  127.                 INX H           ; увеличиваем адрес HL++, лежащий в регистре
  128.                 INX H
  129.                 MOV A, H
  130.                 STAX B          ; Кладем инкрементированное значение адреса в ту же ячейку регистра [старший байт регистра]
  131.                 MOV A, L
  132.                 STAX D          ; Кладем инкрементированное значение адреса в ту же ячейку регистра [младший байт регистра]
  133.                 DCX H
  134.                 DCX H           ; возвращаемся обратно к текущему адресу
  135.                 MOV B, H
  136.                 MOV C, L        ; В BC лежит HL (старший адрес в регистре)
  137.                 PUSH B          ; в стеке лежит адрес в регистре
  138.                 MOV D, M        ; Записываем в D старшую часть адресса данных (х8), лежашую по адресу HL
  139.                 INX H           ; Инкрементируем адрес ячейки памяти HL++
  140.                 MOV E, M        ; Записываем в E младшую часть адресса данных (x8), лежащую в по адресу [HL+1]
  141.                                 ; Таким образом в DE лежит аддрес с данными (х16)
  142.                 MOV B, D
  143.                 MOV C, E
  144.                 LDAX D          ; запишим в акк. старший байт данных
  145.                 MOV H, A        ; в H лежит старший байт данных
  146.                 INX D           ; увеличиваем адрес данных DE++
  147.                 LDAX D          ; записываем младший байт данных в акк.
  148.                 MOV E, A
  149.                 MOV D, H        ; В DE лежат данные
  150.                 MOV A, D        ; Записываем в акк. старший байт данных
  151.                 XRI 11111111b   ; ~A [старший]
  152.                 MOV D, A        ; Записываем старший байт обратно в D
  153.                 MOV A, E        ; Записываем в акк. младший байт данных
  154.                 XRI 11111111b   ; ~A [младший]
  155.                 ADI 00000001b   ; +1
  156.                 MOV E, A         ; %%% кладем ~[E+1] обратно в E
  157.                 MOV A, D        ; Записываем в акк. старший байт данных
  158.                 PUSH B          ; запишем данные В в стек, чтобы обнулить регистр
  159.                 MVI B, 0h
  160.                 MOV A, D        ; записываем в акк. старший байт данных, чтобы учесть перенос
  161.                 ADC B           ; записываю в А <- A + 0 + CY
  162.                 MOV D, A        ; записываем сдвинутый старший байт обратно в D
  163.                 ;%%% delete %%% MOV E, A - вот здесь и была ошибка, ты то, что лежало в D положил и в Е
  164.                 POP B           ; достаем данные В из стека
  165.                 MOV H, B
  166.                 MOV L, C        ; В HL старший адрес
  167.                 JMP SET_INC
  168.                
  169.                 ;=============================================================================
  170.                 ;                                     ВЫХОД                                  |
  171.                 ;=============================================================================
  172.  
  173.                
  174.     SET_INC:      
  175.                 MOV M, A        ; Кладем старший байт данных по адресу HL
  176.                 MOV A, E
  177.                 INX H           ; HL++
  178.                 MOV M, A        ; Кладем младший байт данных по адресу HL++
  179.                
  180.                 JMP END
  181.                
  182.                
  183. ;=============================================================================================
  184. ;                                        ЗАВЕРШЕНИЕ                                          |
  185. ;    при корректном задании действия в конце программы загорятся все лампочки 30 порта       |
  186. ;=============================================================================================
  187.     ERRORR:     MVI A, 10101010b
  188.                 OUT 30h
  189.                
  190.     END:        MVI A, 11111111b
  191.                 OUT 30h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement