i8080: возможно ли реализовать прерывания без доп. обвязки?

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

i8080: возможно ли реализовать прерывания без доп. обвязки?

Post by vital72 »

Спаял небольшую схемку-тестер процессора 8080, портов 8255 и таймера 8253, для отображения информации используются 4 7-сегментных индикатора. Все уже работает, так вот хотелось бы вывод информации на этот индикатор реализовать по прерыванию.
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: i8080: возможно ли реализовать прерывания без доп. обвяз

Post by Lavr »

vital72 wrote:Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
Ну так и было сделано, в частности, в схеме "ЮТ-88". Трюк проверенный...
iLavr
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Чистое любопитство - на каком адресе "повесили" семисегментние ? :roll:
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Post by vital72 »

7-сегментные индикаторы управляются двумя регистрами, которые сидят в общем адресном пространстве с ОЗУ (а-ля РК-шка).
Так ли важно по каким адресам они находятся?
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Post by vital72 »

что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
для ясности как оно у меня устроено: программа на программаторе записывается в статическое ОЗУ с батарейкой, вставляю ОЗУ в свою платку, запускаю, вынимаю, смотрю, что записалось в память. для теста использую следующую простейшую подпрограмму прерывания: все регистры заносятся в стек и далее программа входит в бесконечный цикл. первым словом в стеке должен быть адрес возврата, далее регистры. регистры сохраняются как надо, а вот с адресом беда.
у кого-нибудь есть соображения по этому поводу?
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Смогут появиться при виде кода ( хоть в hex хоть в любых мнемониках ассемблера - что менее затруднит - ежели секретный код можно даже в лс. )
А за адрес спросил действительно только из любопытства.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

vital72 wrote:что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
А стек-то явно установлен в Вашей ОЗУ?
И есть ли по адресу прерывания RST7 - 0038h первая команда DI ?
А то прерывание простейшее - ничего не привязано к тактам ЦПУ - может там многократно
срабатывает прерывание?

Ну и если это чисто тестовый вариант - поставить после "регистров в стек" - команду HLT.
Переносить ОЗУ-шку на ней.

Такие вот мысли, хотя издалека очень трудно угадывать, и я бы еще посоветовал пройти всё
пошагово с помощью вот такой или аналогичной штуки:

Image

И проверить - нет ли чего-либо "нехорошего" на шинах?
iLavr
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Post by vital72 »

полуваттники - это круто :))
Про пошаговую схему я в курсе, использовать ее хотел в крайнем случае.
В процессе испытаний обнаружилась пара необъяснимых моментов.
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
и asm:

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 - нет ничего тут

фото девайса:
Image
Mixa64
Doomed
Posts: 480
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

vital72 wrote:
А команда EI где? INTE по ресету сбрасывается и запрещает прерывания.
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Да, EI обязатяльно нужно. :idea:

А вот в п.1 неверное утверждение ="так вот в стек (SP - 1) кладется код этой команды" :( -на самом деле в стек кладётся содержимое счётчика, то есть {адрес_последней_команды+её_длина} и это всегда ДВА байта ( ибо счётчик 16-битовый ).
Разъяснить ситуацию помогло бы явное " org **h" программы
( Вот у подпрограммы для RST7 есть же правильное "org 38h" :wink: )
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Post by vital72 »

то ли вы читаете по диагонали, то ли я не доходчиво объясняю.
как оно должно быть я знаю и не писал бы если бы оно было так.
а как оно у меня происходит на самом деле все изложено.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

vital72 wrote:то ли вы читаете по диагонали, то ли я не доходчиво объясняю.
Да нет - читаем-то мы нормально, просто если процессор, которому "в обед 100500 лет" работает не так, как это положено, то либо процессор дефектный, либо что-то спаяно не так...
vital72 wrote:Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
Если после сброса процессора нигде нет команды EI, то прерываний и вовсе происходить не должно, запрещены они по "ресету". Непонятно, после чего "сигнал INTE процессора сбрасывается", тогда как он не был взведен через EI?
vital72 wrote:На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.
Специально здесь выясняли этот момент, и выяснили даже экспериментально (VituZz проверял), что DI аппаратно не делается, хотя действительно, есть источники, где об этом прямо пишут.
Перед выходом из процедуры прерывания надо ставить команду EI обязательно, что очевидно.

На словах-то мы Вас отлично поняли, но на деле выходит, что «Если на клетке со львом написано «Осел» – не верь глазам своим!» (с)
Хотя, если Вы считаете, что для проверки работоспособности всего этого достатчно - не смеем навязываться, мы лишь высказали предположения на заданную тему:
vital72 wrote:у кого-нибудь есть соображения по этому поводу?


PS. Обсуждали мы "неувязочку" с прерыванием вот здесь. А вот здесь был разговор о другой "неувязочке".
Общий вывод - не все камни, обозначенные как i8080(А) и (K)580ВМ(ИК)80(А) ведут себя идентичным образом.
Возможно, у Вас как раз один из "артефактов".
iLavr
User avatar
Stan
Banned
Posts: 397
Joined: 04 Jan 2013 10:09
Location: 95.24.178.158

Re: i8080: возможно ли реализовать прерывания без доп. обвяз

Post by Stan »

vital72 wrote:вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?

А то, возможно, просто шина перегружена?
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: i8080: возможно ли реализовать прерывания без доп. обвяз

Post by vital72 »

Stan wrote:
vital72 wrote:вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?

А то, возможно, просто шина перегружена?
10k

Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: i8080: возможно ли реализовать прерывания без доп. обвяз

Post by Lavr »

vital72 wrote:Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.
Для меня бОльшая загадка, почему в принципе прерывания срабатывают, в то время, когда они не разрешены ни одной командой EI с момента старта процессора.
iLavr