Optron #04
21 ноября 1997

Программирование - о неизвестном (внутреннем) регистре Z80.

<b>Программирование</b> - о неизвестном (внутреннем) регистре Z80.
        ╔════────                         
                               
 Так сколько же              
             регистров в Z80?          
      
                         ────════╝        
                                          
(C) Тятин Сергей                          
                                          
  Речь  пойдет  о неизвестном регистре Z80
(Рашпиль:  я  бы  назвал его не просто ре-
гистром, а внутренним регистром, поскольку
работа   с   ним   напрямую   программными
средствами  не возможна). Неизвестным нас-
только,  что на его существование нет даже
намека  ни в одной известной мне литерату-
ре.  И  в  этом  нет ничего удивительного,
поскольку используется он только при вызо-
ве  немаскируемых  прерыванй. Как известно
Z80 имеет три режима обработки маскируемых
прерыванй,  которые устанавливаются коман-
дами IM 0, IM 1, IM 2. Можно предположить,
что  внутри Z80 находится регистр, который
хранит  номер  текущего режима маскируемых
прерыванй,  назовем  этот  регистр IMR. Из
документации по Z80, на IMR влияют:       
                                          
   - сигнал /RESET ;IMR=0;                
   - команды IM 0, IM 1, IM 2             
                                          
  И! Кроме этого на IMR влияют сигнал /NMI
и  команда  RETN! Дело в том ,что на самом
деле  в  Z80  два  регистра хранящих режим
маскируемых  прерыванй  IMR1  и IMR2. IMR1
действительно   хранит  режим  маскируемых
прерыванй, а IMR2 используется для времен-
ного  хранения IMR1 при обработке немаски-
руемых прерыванй. Так вот, о регистре IMR2
нигде,  до сих пор не упоминалось. A рабо-
тает  он следующим образом (далее идут мои
соображения  по  этому поводу). По приходу
сигнала  /NMI в IMR1 записывается то ли 0,
то ли 1 (все-же скорее 0) что впрочем одно
и  тоже  при стабильной шине данных. A ре-
гистр  IMR2  хранит  значение IMR1 пока не
закончится выполнение процедуры немаскиру-
емого  прерываня.  При  выполнении команды
RETN  IMR1  восстанавливается  из  IMR2,  
прерванная  прога  продолжает работать как
ни в чем не бывало.                       
  Все  вышесказанное  можно свести к одной
табличке:                                 
                                          
 ┌────────────────────────┬──────┬──────┐ 
 │       Действие         │ IMR1 │ IMR2 │ 
 ├────────────────────────┼──────┼──────┤ 
 │ Сигнал /RESET          │  0   │   0  │ 
 │ Команда IM х           │  х   │   х  │ 
 │ Сигнал /NMI            │  0   │ IMR1 │ 
 │ Команда RETN           │ IMR2 │   -  │ 
 └────────────────────────┴──────┴──────┘ 
                                          
  Все  это очень похоже на триггер IFF и у
меня  есть  глубокое подозрение, что IFF и
IMR  хранятся где-то рядом, но это уже ли-
рика...  Мне  пришлось  столкнуться с этим
феноменом (то есть IMR), когда я писал те-
невой  монитор.  Внутри монитора я пытался
определить режим немаскируемого прерываня,
но   к   моему  величайшему  удивлению  (и
сколько  же  я намучился пока разобрался в
чем дело) не определялся второй тип преры-
ваний. Корректно определить режим прерыва-
ния можно таким образом:                  
                                          
NMI_SR            ; Точка входа в п/п     
                  ; обработки NMI         
                                          
       PUSH    AF ; Стандартное начало    
       PUSH    ВС                         
       ...........                        
       DI                                 
       LD      HL,IRUPT  ; Установка      
       LD      (#ЧOFF),HL; вектора        
; (Пример довольно грубый :-)             
       LD      A,#40                      
       LD      I,A                        
       LD      A,#56    ; По умолчанию    
       LD      (ТУРЕ),A ; IM 1            
; Установка настоящего режима             
       LD      HL,TMP1                    
       PUSH    HL                         
       RETN                               
TMP1                                      
; Теперь можно определять режим           
       EI                                 
       HALT    ;Если было IM 2,           
               ;выполнится IRUPT          
       ...........                        
; Востановление режима                    
       IM      1  ; здесь хранится        
ТУРЕ   EQU     $-1; режим                 
       ............                       
; Выход                                   
       РОР    AF                          
       RETN       ;можно просто RET       
                                          
IRUPT  LD      A,#5E   ; IM 2             
       LD      (ТУРЕ),A                   
       RET                                
                                          
  Мне  интересно было бы узнать, как спра-
вились  с  этой  проблемой авторы монитора
для SCORPION (если они не знали о IMR ?). 
  Вообще при использовании NMI открываются
заманчивые возможности. Например написание
'надежных'  MAGIC, теневых мониторов, мно-
гозадачных  операционных систем. Например,
я  написал теневой монитор, который распо-
лагается в верхней памяти и по приходу NMI
лагается в верхней памяти и по приходу NMI
эта страничка отворачивается на место ПЗУ.
Затем  монитор  распихивает  все  128К  по
верхней  памяти,  сохраняет  все регистры,
режимы,   в   общем   полностью  состояние
компьютера,   так   что   даже  перегрузив
компьютер  можно  вернутся  на  прерванное
место. A далее в #17 странчку закидывается
Stalker  monitor и можно работать с полным
комфортом.   Единственный  глюк  возникает
когда прерываемая програма выполняет пере-
мещение  блоков данных стеком, но от этого
просто так не избавиться. Но это все к де-
лу  не относится... если будут вопросы пи-
шите,  звоните.  Еще  меня  можно найти на
irc.funet.fi   на  канале  #Z80  под  nick
Z8OST.                                    
                                          
  21:39:29  7-10-97           Тятин Сергей
                                          
Email: s9415519@polynet.lviv.иа           
Phone: (0322) 679210                      
                                          
              ──══════════──              



Другие статьи номера:

4 килобайта от главного редактора - Мы работаем не для себя - газета и реклама в ней бесплатная.

О модемах и не только - обзор современного софта для ZX модемов.

Программирование - о неизвестном (внутреннем) регистре Z80.

Письмо издалека - письмо от Jоhn Ciеmgаls.

Ночная смена - Cтивен Кинг.

Реклама - Молодая симпатичная синклеристка (у меня ZS SCОRРIОN) ищет умного и высокого (не ниже 180см.) владельца Реntаgоnа.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Программирование - Быстрое преобразование координат.
В паутине - о создании общебелорусской ZX-Net
Введение - Об управлении интерфейсом газеты.
Интервью - Интервью с CC'000. MADCAT/THE MAD MAILMEN LEAGUE.
Глас божий - ААА требуются кодеры, музыканты и художники для создания мегадемо.

В этот день...   23 апреля