Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IRR и ISR ведомого и ведущего ПКП  (Прочитано 10459 раз)
0 Пользователей и 1 Гость смотрят эту тему.
smileman
Гость
« : 14-11-2008 23:15 » 

Создал 2 программы чтения регистров irr и isr ведомого и ведущего ПКП.Программы работают,выводится значения регистров.Соединил эти программы в одну,программа "виснет",не возвращается в DOS.Помогите,пож-та;в чем ошибка?

Ведущий
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b
out 20h,ax   ;isr
in ax,20h
call main

call NEWSTR

call clean
or ax,01b
out 20h,ax   ;irr
in ax,20h
call main

int 20h




  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp

  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin
ведомый
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b
out 0A0h,ax   ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax   ;irr
in ax,0A0h
call main

int 20h




  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp

  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin


 

собственно "зависающая программа"
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:
;**************************
call clean
or ax,10b
out 20h,ax   ;isr
in ax,20h
call main

call NEWSTR

call clean
or ax,01b
out 20h,ax   ;irr
in ax,20h
call main


;***************************

call NEWSTR
call clean
or ax,10b
out 0A0h,ax   ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax   ;irr
in ax,0A0h
call main

int 20h
;***************************



  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp

  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 15-11-2008 06:30 » 

smileman, а ты бы хоть комментарии написал, блок-схему показал...
Записан

smileman
Гость
« Ответ #2 : 15-11-2008 13:58 » 

Ведущий ПКП имеет два программно доступных регистра с адресами 20h и 21h. Ведомый ПКП имеет два программно доступных регистра с адресами А0h и А1h. Назначение обоих регистров в ведущем и ведомом ПКП аналогично.
Листинги с коментариями:

Ведущий
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b    ;устанавливаем 2 бит, чтобы
out 20h,ax   ; открыть доступ для чтения регистра isr
in ax,20h    ; считываем содержимое регистра isr
call main

call NEWSTR

call clean
or ax,01b    ;тоже самое, только для регистра irr
out 20h,ax   ;
in ax,20h
call main

int 20h


;*******************процедуры**********************

;переход на новую строку
  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp


;процедура перевода в двоичную систему содержимого регистров и вывода на экран
  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1 ;сдвиг,если CF=1,то переход на метку m2(печатаем "1"),иначе m3 (печатаем "0")

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

;процедура очистки регистров
clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin


ведомый ПКП,тоже самое, только порт уже 160(0Ah)
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b
out 0A0h,ax   ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax   ;irr
in ax,0A0h
call main

int 20h




  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp

  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin


 

собственно "зависающая программа" с теми же процедурами,все тоже самое
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:
;************************** ведущий ****************************
call clean
or ax,10b
out 20h,ax   ;isr
in ax,20h
call main

call NEWSTR

call clean
or ax,01b
out 20h,ax   ;irr
in ax,20h
call main


;************************** ведомый ****************************

call NEWSTR
call clean
or ax,10b
out 0A0h,ax   ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax   ;irr
in ax,0A0h
call main

int 20h
;*************************** процедуры**************************



  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
   mov dl,13
   int 21h
   mov dl,10
   int 21h
   ret
  NEWSTR endp

  main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin


Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-11-2008 17:24 » 

smileman, посмотри clean proc - у тебя там нет ret.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
smileman
Гость
« Ответ #4 : 15-11-2008 17:36 » 

ммда..стыд и позор,какая глупая ошибка.
Спасибо,RXL,заработало.
 
Записан
smileman
Гость
« Ответ #5 : 15-11-2008 17:57 » 

Так,теперь у меня вопрос о регистре масок прерываний.
здесь я вроде бы замаскировал IRQ14-контроллер накопителя на гибких дисках-что должно происходить не знаю,происходит следующее:при первом запуске ничего не происходит,при повторном запуске,после запуска вышеуказанных программ,выводит почему-то(!) на экран содержимое регистров IRR и ISR,те то,что только что выводили приведенные выше программы.
Вот сама программа:
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

xor ax,ax

in al,0A1h
or al,01000000b

out 0A1h,al


cseg ends

end begin

Что происходит,и что должно вообще происходить?помогите пожалуйста
« Последнее редактирование: 16-11-2008 07:34 от smileman » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-11-2008 18:43 » 

smileman, опять концовки программы нет... Где ret?

Вообще, начинай пользоваться отладчиком - масса вопросов станет яснее.

Может пригодится...
Код:
^8259  Programmable Interrupt Controller  (PIC)

% Initialization Command Word 1 at Port 20h and A0h

і7і6і5і4і3і2і1і0і  ICW1
і і і і і і і АДДДД 1=ICW4 is needed, 0=no ICW4 needed
і і і і і і АДДДДД 1=single 8259, 0=cascading 8259's
і і і і і АДДДДДД 1=4 byte interrupt vectors, 0=8 byte int vectors
і і і і АДДДДДДД 1=level triggered mode, 0=edge triggered mode
і і і АДДДДДДДД must be 1 for ICW1 (port must also be 20h or A0h)
АДБДБДДДДДДДДД must be zero for PC systems

% Initialization Command Word 2 at Port 21h and A1h

і7і6і5і4і3і2і1і0і  ICW2
і і і і і АДБДБДДДД 000= on 80x86 systems
АДБДБДБДБДДДДДДДДД A7-A3 of 80x86 interrupt vector

% Initialization Command Word 3 at Port 21h and A1h

і7і6і5і4і3і2і1і0і  ICW3 for Master Device
і і і і і і і АДДДД 1=interrupt request 0 has slave, 0=no slave
і і і і і і АДДДДД 1=interrupt request 1 has slave, 0=no slave
і і і і і АДДДДДД 1=interrupt request 2 has slave, 0=no slave
і і і і АДДДДДДД 1=interrupt request 3 has slave, 0=no slave
і і і АДДДДДДДД 1=interrupt request 4 has slave, 0=no slave
і і АДДДДДДДДД 1=interrupt request 5 has slave, 0=no slave
і АДДДДДДДДДД 1=interrupt request 6 has slave, 0=no slave
АДДДДДДДДДДД 1=interrupt request 7 has slave, 0=no slave

і7і6і5і4і3і2і1і0і  ICW3 for Slave Device
і і і і і АДБДБДДДД master interrupt request slave is attached to
АДБДБДБДБДДДДДДДДД must be zero

% Initialization Command Word 4 at Port 21h and A1h

і7і6і5і4і3і2і1і0і  ICW4
і і і і і і і АДДДД 1 for 80x86 mode, 0 = MCS 80/85 mode
і і і і і і АДДДДД 1 = auto EOI, 0=normal EOI
і і і і АДБДДДДДД slave/master buffered mode (see below)
і і і АДДДДДДДДД 1 = special fully nested mode (SFNM), 0=sequential
АДБДБДДДДДДДДДД unused (set to zero)

% Bits
% 32 Buffering Mode
00 not buffered
01 not buffered
10 buffered mode slave (PC mode)
11 buffered mode master (PC mode)

% Operation Control Word 1 / Interrupt Mask Reg. (Ports 21h & A1h)

і7і6і5і4і3і2і1і0і  OCW1 - IMR Interrupt Mask Register
і і і і і і і АДДДД 0 = service IRQ0, 1 = mask off
і і і і і і АДДДДД 0 = service IRQ1, 1 = mask off
і і і і і АДДДДДД 0 = service IRQ2, 1 = mask off
і і і і АДДДДДДД 0 = service IRQ3, 1 = mask off
і і і АДДДДДДДД 0 = service IRQ4, 1 = mask off
і і АДДДДДДДДД 0 = service IRQ5, 1 = mask off
і АДДДДДДДДДД 0 = service IRQ6, 1 = mask off
АДДДДДДДДДДД 0 = service IRQ7, 1 = mask off

% Operation Control Word 2 / Interrupt Command Reg. (Ports 20h & A0h)

і7і6і5і4і3і2і1і0і  OCW2 - ICR Interrupt Command Register
і і і і і АДБДБДДДД interrupt request level to act upon
і і і і АДДДДДДДДД must be 0 for OCW2
і і і АДДДДДДДДДД must be 0 for OCW2
АДБДБДДДДДДДДДДД EOI type (see table)

% Bits
% 765  EOI - End Of Interrupt code (PC specific)
001  non-specific EOI command
010  NOP
011  specific EOI command
100  rotate in automatic EOI mode
101  rotate on non-specific EOI command
110  set priority command  (uses bits 2-0)
111  rotate on specific EOI command

% Operation Control Word 3   (Ports 20h & A0h)

і7і6і5і4і3і2і1і0і  OCW3
і і і і і і і АДДД 1=read IRR on next read, 0=read ISR on next read
і і і і і і АДДДД 1=act on value of bit 0, 0=no action if bit 0 set
і і і і і АДДДДД 1=poll command issued, 0=no poll command issued
і і і і АДДДДДД must be 1 for OCW3
і і і АДДДДДДД must be 0 for OCW3
і і АДДДДДДДД 1=set special mask, 0=reset special mask
і АДДДДДДДДД 1=act on value of bit 5, 0=no action if bit 5 set
АДДДДДДДДДД not used (zero)

% Other Registers

IRR - Interrupt Request Register, maintains a bit vector indicating
      which IRQ hardware events are awaiting service. Highest
      level interrupt is reset when the CPU acknowledges interrupt.
ISR - In Service Register, tracks IRQ line currently being serviced.
      Updated by EOI command.


^Hardware Interrupt Sequence of Events:

1. 8259 ~IRQ~ signal is raised high by hardware setting the
   corresponding IRR bits true.

2. PIC evaluates the interrupt requests and signals the CPU
   where appropriate.

3. CPU acknowledges the INT by pulsing INTA (inverted)

4. INTA signal from CPU is received by the PIC, which then sets the
   highest priority ISR bit, and clears the corresponding IRR bit

5. CPU sends a second INTA pulse which causes the PIC to send the
   interrupt ID byte onto the bus.  CPU begins interrupt processing.

6. Interrupts of lower and equal priority are blocked until a
   Non-Specific EOI (20h) is sent to the command port.


^Initialization Procedure

% Initialization
1. write ICW1 to port 20h
2. write ICW2 to port 21h
3. if ICW1 bit D1=1  do nothing
    if ICW1 bit D1=0  write ICW3 to port 20h
4. write ICW4 to port 21h
5. OCW's can follow in any order


^8259 Programmable Interrupt Controller Notes

- Operation Command Word (OCW), commands that set the 8259 in
  various interrupt modes.  These can be written to the 8259
  anytime after initialization.
- The 8259 differentiates between the OCW1, OCW2 and OCW3 by the
  port address and the value of the data bits D4 and D3.  ICW2
  through ICW4 are order related and must follow ICW1. ICW1 is
  identified by an even port number and data bit D4 set to 1.
- PCs operate in fully nested mode, where a Non-Specific EOI resets
  the interrupt identified by the highest bit value in the ISR
- 8259s can be chained together where the INT pin (output) of a
  slave 8259 can be used as the input to an IRQ line allowing up
  to 64 priority vectored interrupts.  AT level machines use two
  8259's for a total of 16 hardware interrupt levels
- the first 8259 ports are located at 20h and 21h
- the second 8259 ports are located at A0h and A1h
- PC and AT interrupts are Edge Triggered while PS/2's are Level
  Triggered
- some ASIC chips designed for Tandy 1000 Systems malfunction if
  specific and non-specific EOIs are mixed
- for a more in-depth discussion of the 8259, see Intel's "Micro-
  processor and Peripherals Handbook, Volume I"
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
smileman
Гость
« Ответ #7 : 15-11-2008 19:08 » 

^_^ сам уже обнаружил..ret то я поставил,но все равно ничего не происходит.Вопрос остался,что вообще должно происходить-ничегонеделание это и есть "реакция"?
код посмотрел,но насколько я понял,ответ этот код не дает на мой вопрос..  Жаль
« Последнее редактирование: 15-11-2008 19:13 от smileman » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 15-11-2008 19:39 » new

Это не код - это дока. Просто подходящего тега не нашлось для обрамления.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines