Программная модель Intel 8080/КР580ВМ80А

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

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
Shaos wrote:Хм, а тут кстати в моих знаниях пробел - а что будет если она таки вернётся по RET?
Пойдёт на следующую команду после HLT?
Именно так.
Но из ваших исходников мне с HLT нифига непонятно... :(

А сказки и трололо я при случае рассказывать тоже - ой как умею!
Ну в наших исходниках HLT не эмулируется из-за ненадобности
P.S. В моих исходниках была попытка поддержать HLT, но она оказалась не совсем правильная :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 908
Joined: 26 May 2003 06:57

Post by b2m »

Shaos wrote:Хм, а тут кстати в моих знаниях пробел - а что будет если она таки вернётся по RET? Пойдёт на следующую команду после HLT?
Восполняю пробел. Когда встречается команда HLT, процессор переходит в режим останова, а в этом режиме РС не увеличивается. Если прерывания разрешены и приходит запрос на прерывание, то режим останова выключится, при этом РС увеличится на еденицу, а затем произойдёт обычный процесс обработки прерывания.

Для меня всегда была загадка, как реализован режим останова: читается ли код HLT каждый раз, или выполняя цикл останова процессор ничего не считывает из памяти? Т.е. вопрос в том, что произойдёт, если карта памяти вдруг изменится, и вместо HLT в том месте будет другая команда?
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

HALT SEQUENCES
When a halt instruction (H LT) is executed, the CPU enters the ha It state (TWH) after state T2 of the next machine cycle, as shown in Figure 2-11. There are only three ways in which the 8080 can exit the halt state:
• A high on the RESET line will always reset the 8080 to state T 1; RESET also clears the program counter.
• A HOLD input will cause the 8080 to enter the hold state, as previously described. When the HOLD line goes low, the 8080 re-enters the halt
state on the rising edge of the next ¢1 clock pulse.
• An interrupt (Le., INT goes high while INTE is enabled) will cause the 8080 to exit the Halt state and enter state T 1 on the rising edge of the next ¢1 clock pulse. NOTE: The interrupt enable (INTE) flag must be set when the halt state is entered;
otherwise, the 8080 will only be able to exit via a RESET signal.
Figure 2-12 illustrates halt sequencing in flow chart form.







20. The processor will remain idle in the halt state until an interrupt, a reset or a hold is accepted. When a hold request is accepted, the CPU enters the hold mode; after the hold mode is terminated, the processor returns to the halt state. After a reset is accepted, the processor begins execution at memory location zero. After an interrupt is accepted, the processor executes the instruction forced onto the data bus (usually a restart instruction).
Т.е., проц находится в идле, реагирует на HOLD (это BUSREQ), INT и RESET. Шинку не дергает.
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:Для меня всегда была загадка, как реализован режим останова: читается ли код HLT каждый раз, или выполняя цикл останова процессор ничего не считывает из памяти? Т.е. вопрос в том, что произойдёт, если карта памяти вдруг изменится, и вместо HLT в том месте будет другая команда?
Наверное - это можно проверить. И проще всего - VituZz-у, у него простенький
оперативный макет под руками есть.
"Шарицца" ли проц по шинам во время HLT ? :wink:

Моё мнение - что не "шарицца": скушал HLT и тупо ждёт прерывания
или Ресета...
Я по-молодости этого HLT-а как-то боялся даже... А ну - как не среагирует на
прерывание - тогда что же - Ресет всей программы?
Но поюзав - привык.

Если HLT подменить в памяти - ничего не будет особого (ну, скажем, мы
переключили страницы) - а в другой HLT-а здесь просто нет.

Обычно, когда работают через HLT, после обработки прерывания
по типу CALL или RST N - возвращаются на 1-ю команду за HLT-ом, а там
должно быть: JMP на адрес HLT-а...


PS. Хардыч, ты б поджал свои "труъ" картинки хотя бы до 800 ?
Ну разносит ведь форму форума...
:(
Last edited by Lavr on 20 Sep 2012 10:13, edited 1 time in total.
iLavr
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

b2m wrote:Т.е. вопрос в том, что произойдёт, если карта памяти вдруг изменится, и вместо HLT в том месте будет другая команда?
ничего не произойдет, пока не возникнет одно из событий - HOLD(BUSRQ) RESET INT(IRQ). можно проверить на железке. ставлю на то, что на ША будет адрес останова, на ШД код команды останова в момент, когда память доступна процессору
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Lavr wrote:Наверное - это можно проверить. И проще всего - VituZz-у, у него простенький
оперативный макет под руками есть.
Моя железочка переживает очередную перепайку по очередной версии схемы :-). Но в принципе через пару дней можно и попробовать. Я как раз хотел испытать что-то вроде пульта для ручного ввода команд. И кстати, эта тема мне подсказала, что ввод команд нужно делать не только для /MR, но и для /IOR, и для INTA. Для общности.
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Я как раз хотел испытать что-то вроде пульта для ручного ввода команд.
То есть - помимо процессора - в память? Я правильно понял?
Процессор - в HOLD, а мы с клавиатурки вводим адрес и КОП-ы прямо в память?
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Нет, это как в самых древних схемах. Проц читает КОП из пульта, хотя думает, что из ОЗУ или порта. У железочки ещё нет никакого "Монитора", поэтому пульт достаточно удобен для разных экспериментов. Вот только он сам уже длительное время жертва экспериментов... :-)

П.С. Подумал, что сделать так, как ты говоришь, тоже вроде бы неплохо...
Блин, мой пульт уже превысил по размерам саму "железочку", а количество израсходованного на него МГТФа заставляет вспомнить потроха ЕС-1022.
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:Подумал, что сделать так, как ты говоришь, тоже вроде бы неплохо...
Я просто делал такой. Это раньше так принято было. А сейчас все смотрят в
справочник Шахнова - а там на общей схеме пририсован этот пульт.
И никто не знает - а что это такое? :o

Я тоже поначалу смущался, мне друг с завода говорил, - "ну ты не можешь что-ли
вогнать пару команд с пульта
"?
А потом я пришел к выводу, что эта штука порой полезная весьма... :wink:
iLavr
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

begoon wrote:Выложил в виде проекта исходники эмулятора I8080, которые являются сердцем моих эмуляторов РК.
Меня очень озадачил вот какой вопрос, джентльмены, специалисты по С/С++.

Вы свои эмуляторы пишете как EXE-шники, или исполняемые файлы.
Мы же сейчас пытаемся написать эмуляцию I8080 в виде DLL-библиотеки.

Если я ничего не путаю, динамическая DLL-библиотека, будучи единожды загружена,
разделяется всеми процессами, которым она нужна.

Так если мы в своей DLL-модели I8080 объявляем регистры I8080 и др. в виде переменных
ну, скажем, как-то так:

Code: Select all

//--------------------------------------------
   LONGLONG prev_time;    // Предыдущее время
   IDEBUGPOPUP *dbPopup;
   BYTE regCMD;      // Регистр команд 8-бит
   BOOL iniRES;      // Сброс по инициализации 3 такта
   BOOL tmpRES;      // Сброс по входу RESET
   BOOL tgINTE;      // Триггер "Разрешения прерывания"
   BOOL tgHLDA;      // Триггер "Подтверждения захвата"
   BOOL tgHALT;      // Триггер "Подтверждение останова"
   INT  cntRES;      // Счетчик тактов сброса
   INT  takt_T;      // Номер такта
   INT  max_TM;      // Максимальный такт цикла
   INT  cycleM;      // Номер цикла
Ну и в схеме моделирования задействуем 2 экземпляра I8080.
Первый - загрузит свою DLL-модель, инициализирует переменные...

Второй, как мне представляется, вторую копию DLL загружать не должен,
и как им делить в таком случае меж собой переменные и регистры?

Или я ошибаюсь по поводу загрузки DLL-библиотеки? Поясните, если в курсе,
как правильно эти переменные-то объявлять в случае DLL-библиотек?
iLavr
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

дык ты не делай их как глобальные переменные
делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано (линк с первой страницы топика):
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:дык ты не делай их как глобальные переменные
делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано (линк с первой страницы топика):
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Да вроде так и делаю... но что-то озадачило меня... решил посоветоваться,
прежде чем 2 проца вместе "упадут"... :wink:

Ладно - надо будет запустить два - и убедиться... :lol:
А то скоро извилины выпрямятся - всё угадывать за этот i8080. :-?
iLavr
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

begoon wrote:Выложил в виде проекта исходники эмулятора I8080, которые являются сердцем моих эмуляторов РК.
Благодаря помощи Вячеслава Славинского были выловлены все глюки, и сейчас тест 8080/8085 CPU
Exerciser полностью проходит.
Расписал я для себя растактовки для команд 8080, и поскольку я обычно проверяю
по нескольким источникам - сверился с твоими растактовками в исходниках.

Несколько команд не сошлись по количеству тактов... :(

Не подскажешь, свой источник растактовок по командам?

В принципе - я могу свои таблицы выложить для сравнения...

Я понимаю, что у тебя это не слишком принципиально для правильной работы,
но предполагал свериться как с эталоном.
Всё же ты достаточно много над своими исходниками работал...
iLavr
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

Lavr wrote:Расписал я для себя растактовки для команд 8080, и ...
сверился с твоими растактовками в исходниках.
Несколько команд не сошлись по количеству тактов... :(

Code: Select all

        case 0x40:            /* mov b, b */ 4  ???
            cpu_tacts = 5;

        case 0xC1:            /* pop b */ 11   ???
            cpu_tacts = 10;

        case 0xD1:            /* pop d */ 11   ???
            cpu_tacts = 10;

        case 0xE1:            /* pop h */ 11   ???
            cpu_tacts = 10;
            break;

        case 0xD9:            /* ret, undocumented */10 ???
            cpu_tacts = 11;

        case 0x76:            /* hlt */ ------------------ 4 ???
            cpu_tacts = 7; - и далее пока не выйдем из hlt
там где cpu_tacts = хх - число тактов из таблиц, х ??? - число тактов из исходников.

Таблицы я использовал следующие:

Image

Image

Image

Image

Image
iLavr
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Re:

Post by Lavr »

Shaos wrote:делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано (линк с первой страницы топика):
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Shaos, покажи отсюда пример, как это у тебя сделано, а то мне сейчас надо dll-ку написать, где должно быть разделение переменных для разных процессов, а я что-то этот момент подзабыл... :osad:
iLavr