i8080: возможно ли реализовать прерывания без доп. обвязки?
Moderator: Shaos
-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
i8080: возможно ли реализовать прерывания без доп. обвязки?
Спаял небольшую схемку-тестер процессора 8080, портов 8255 и таймера 8253, для отображения информации используются 4 7-сегментных индикатора. Все уже работает, так вот хотелось бы вывод информации на этот индикатор реализовать по прерыванию.
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
-
- Supreme God
- Posts: 16680
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: i8080: возможно ли реализовать прерывания без доп. обвяз
Ну так и было сделано, в частности, в схеме "ЮТ-88". Трюк проверенный...vital72 wrote:Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
iLavr
-
- Doomed
- Posts: 598
- Joined: 10 Mar 2012 16:21
- Location: РФ
-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
для ясности как оно у меня устроено: программа на программаторе записывается в статическое ОЗУ с батарейкой, вставляю ОЗУ в свою платку, запускаю, вынимаю, смотрю, что записалось в память. для теста использую следующую простейшую подпрограмму прерывания: все регистры заносятся в стек и далее программа входит в бесконечный цикл. первым словом в стеке должен быть адрес возврата, далее регистры. регистры сохраняются как надо, а вот с адресом беда.
у кого-нибудь есть соображения по этому поводу?
для ясности как оно у меня устроено: программа на программаторе записывается в статическое ОЗУ с батарейкой, вставляю ОЗУ в свою платку, запускаю, вынимаю, смотрю, что записалось в память. для теста использую следующую простейшую подпрограмму прерывания: все регистры заносятся в стек и далее программа входит в бесконечный цикл. первым словом в стеке должен быть адрес возврата, далее регистры. регистры сохраняются как надо, а вот с адресом беда.
у кого-нибудь есть соображения по этому поводу?
-
- Doomed
- Posts: 598
- Joined: 10 Mar 2012 16:21
- Location: РФ
-
- Supreme God
- Posts: 16680
- Joined: 21 Oct 2009 08:08
- Location: Россия
А стек-то явно установлен в Вашей ОЗУ?vital72 wrote:что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
И есть ли по адресу прерывания RST7 - 0038h первая команда DI ?
А то прерывание простейшее - ничего не привязано к тактам ЦПУ - может там многократно
срабатывает прерывание?
Ну и если это чисто тестовый вариант - поставить после "регистров в стек" - команду HLT.
Переносить ОЗУ-шку на ней.
Такие вот мысли, хотя издалека очень трудно угадывать, и я бы еще посоветовал пройти всё
пошагово с помощью вот такой или аналогичной штуки:

И проверить - нет ли чего-либо "нехорошего" на шинах?
iLavr
-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
полуваттники - это круто
)
Про пошаговую схему я в курсе, использовать ее хотел в крайнем случае.
В процессе испытаний обнаружилась пара необъяснимых моментов.
1. Как я писал, при прерывании в стек записывается какая-то хрень, так вот я выяснил что это за хрень. Основную программу я ввожу в бесконечный цикл командой JMP, так вот в стек (SP - 1) кладется код этой команды C3, а следом (SP - 2) идет код на единицу больше - C4. Если команду безусловного перехода поменять на команду условного - в стек запишет ее код, а следом на 1 больше.
2. Если программу не зацикливать, а останавливать командой HLT, то в стек вообще ничего не кладется О_О.
3. Сложилось такое ощущение, что прерывание срабатывает только при выполнении команды перехода (и останова). Что привело меня к такому выводу. Решил сделать переход команды не на саму себя, а добавил в цикле однобайтовых команд (можно нопы). Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.
Секрета в коде никакого нет, просто он на столько прост, что думал описания достаточно.
и asm:
И вот что в стеке в результате:
Ну в общем, проверялка свою функцию выполнила - проверила процы и порты, а прерывания - это я так, решил выпендриться.
Распределение памяти моего девайса:
0000-7FFF - ОЗУ (хотя реально стоит ОЗУ на 2к)
8000 - регистр сегментов индикаторов
9000 - регистр разрядов индикаторов
A000 - нет ничего тут
B000 - нет ничего тут
C000 - первый порт
D000 - второй порт
E000 - таймер
F000 - нет ничего тут
фото девайса:


Про пошаговую схему я в курсе, использовать ее хотел в крайнем случае.
В процессе испытаний обнаружилась пара необъяснимых моментов.
1. Как я писал, при прерывании в стек записывается какая-то хрень, так вот я выяснил что это за хрень. Основную программу я ввожу в бесконечный цикл командой JMP, так вот в стек (SP - 1) кладется код этой команды C3, а следом (SP - 2) идет код на единицу больше - C4. Если команду безусловного перехода поменять на команду условного - в стек запишет ее код, а следом на 1 больше.
2. Если программу не зацикливать, а останавливать командой HLT, то в стек вообще ничего не кладется О_О.
3. Сложилось такое ощущение, что прерывание срабатывает только при выполнении команды перехода (и останова). Что привело меня к такому выводу. Решил сделать переход команды не на саму себя, а добавил в цикле однобайтовых команд (можно нопы). Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.
Секрета в коде никакого нет, просто он на столько прост, что думал описания достаточно.
Code: Select all
0000: 31 00 05 3E 30 32 03 E0 3E FF 32 00 E0 3E 00 32
0010: 00 E0 FB 01 12 34 11 56 78 21 9A BC C3 1C 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 00 00 00 00 00 00 00 00 F5 C5 D5 E5 3E F7 32 00
0040: 90 3E C9 32 00 80 C3 46 00 00 00 00 00 00 00 00
Code: Select all
lxi sp,0500h ; указатель стека
mvi a,30h ; нулевой канал таймера в нулевой режим
sta 0e0003h
mvi a,00h ; максимальный счет (тут это неважно)
sta 0e0000h
mvi a,00h
sta 0e0000h
lxi b,3412h ; просто какие то числа
lxi d,7856h
lxi h,0bc9ah
l1:
jmp l1 ; вечный цикл
org 38h
rst7:
push psw ; чтобы глянуть стек
push b
push d
push h
mvi a,0f7h ; просто что то зажжем на индикаторе, чтобы
sta 9000h ; понять, что прерывание сработало
mvi a,c9h
sta 8000h
l2:
jmp l2 ; вечный цикл
Code: Select all
04F0: 00 00 00 00 00 00 9A BC 56 78 12 34 02 00 C4 C3
Распределение памяти моего девайса:
0000-7FFF - ОЗУ (хотя реально стоит ОЗУ на 2к)
8000 - регистр сегментов индикаторов
9000 - регистр разрядов индикаторов
A000 - нет ничего тут
B000 - нет ничего тут
C000 - первый порт
D000 - второй порт
E000 - таймер
F000 - нет ничего тут
фото девайса:

-
- Doomed
- Posts: 480
- Joined: 25 Aug 2009 07:02
- Location: Москва
А команда EI где? INTE по ресету сбрасывается и запрещает прерывания.vital72 wrote:Code: Select all
-
- Doomed
- Posts: 598
- Joined: 10 Mar 2012 16:21
- Location: РФ
Да, EI обязатяльно нужно.
А вот в п.1 неверное утверждение ="так вот в стек (SP - 1) кладется код этой команды"
-на самом деле в стек кладётся содержимое счётчика, то есть {адрес_последней_команды+её_длина} и это всегда ДВА байта ( ибо счётчик 16-битовый ).
Разъяснить ситуацию помогло бы явное " org **h" программы
( Вот у подпрограммы для RST7 есть же правильное "org 38h"
)

А вот в п.1 неверное утверждение ="так вот в стек (SP - 1) кладется код этой команды"

Разъяснить ситуацию помогло бы явное " org **h" программы
( Вот у подпрограммы для RST7 есть же правильное "org 38h"

-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
-
- Supreme God
- Posts: 16680
- Joined: 21 Oct 2009 08:08
- Location: Россия
Да нет - читаем-то мы нормально, просто если процессор, которому "в обед 100500 лет" работает не так, как это положено, то либо процессор дефектный, либо что-то спаяно не так...vital72 wrote:то ли вы читаете по диагонали, то ли я не доходчиво объясняю.
Если после сброса процессора нигде нет команды EI, то прерываний и вовсе происходить не должно, запрещены они по "ресету". Непонятно, после чего "сигнал INTE процессора сбрасывается", тогда как он не был взведен через EI?vital72 wrote:Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
Специально здесь выясняли этот момент, и выяснили даже экспериментально (VituZz проверял), что DI аппаратно не делается, хотя действительно, есть источники, где об этом прямо пишут.vital72 wrote:На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.
Перед выходом из процедуры прерывания надо ставить команду EI обязательно, что очевидно.
На словах-то мы Вас отлично поняли, но на деле выходит, что «Если на клетке со львом написано «Осел» – не верь глазам своим!» (с)
Хотя, если Вы считаете, что для проверки работоспособности всего этого достатчно - не смеем навязываться, мы лишь высказали предположения на заданную тему:
vital72 wrote:у кого-нибудь есть соображения по этому поводу?
PS. Обсуждали мы "неувязочку" с прерыванием вот здесь. А вот здесь был разговор о другой "неувязочке".
Общий вывод - не все камни, обозначенные как i8080(А) и (K)580ВМ(ИК)80(А) ведут себя идентичным образом.
Возможно, у Вас как раз один из "артефактов".
iLavr
-
- Banned
- Posts: 397
- Joined: 04 Jan 2013 10:09
- Location: 95.24.178.158
Re: i8080: возможно ли реализовать прерывания без доп. обвяз
А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?vital72 wrote:вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
А то, возможно, просто шина перегружена?
-
- Senior
- Posts: 181
- Joined: 17 Jun 2014 04:29
- Location: 93.80.157.217
Re: i8080: возможно ли реализовать прерывания без доп. обвяз
10kStan wrote:А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?vital72 wrote:вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
А то, возможно, просто шина перегружена?
Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.
-
- Supreme God
- Posts: 16680
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: i8080: возможно ли реализовать прерывания без доп. обвяз
Для меня бОльшая загадка, почему в принципе прерывания срабатывают, в то время, когда они не разрешены ни одной командой EI с момента старта процессора.vital72 wrote:Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.
iLavr