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

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

Moderator: Shaos

begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

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

https://github.com/begoon/i8080-core

Старался сделать так, чтобы модуль процессора был максимально независим. В тестах можно посмотреть, как его "подключать" к аппаратуре.

Исходники полного эмулятора, работающего на Maximite, выложу скоро. Пришлось с начала глюки в процессоре вылавливать.

В целом идея максимально изоливать процессор появилась в процессе работы над тестами Exerciser'а. Так как можно запустить на любой машине, не надо ждать два часа. Все тесты у меня проходят секунд за 10.

P.S. Может кто сделает репост на zx.pk.ru. Там почему-то закрыта регистрация.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Надо будет мою кору 8080 сравнить с твоей - а то на моём коде CP/M нормально работать отказывается и кое-какие орионовские проги глючат...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А документашечка есть на это дело?

Code: Select all

extern int i8080_hal_memory_read_word(int addr);
extern void i8080_hal_memory_write_word(int addr, int word);

extern int i8080_hal_memory_read_byte(int addr);
extern void i8080_hal_memory_write_byte(int addr, int byte);

extern int i8080_hal_io_input(int port);
extern void i8080_hal_io_output(int port, int value);

extern void i8080_hal_iff(int on);

extern unsigned char* i8080_hal_memory(void);
Вообще очень похоже на мой интерфейс :)
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Я тоже хотел на голимый си переписать, но только с возможностью иметь более одного процессора в программе

P.S. Кстати вот эта конструкция на big-endian будет работать неправильно:

Code: Select all

typedef union {
    struct {
        uns8 l, h;
    } b;
    uns16 w;
} reg_pair;
Я тут за главного - если что шлите мыло на me собака shaos точка net
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Post by begoon »

Shaos wrote:А документашечка есть на это дело?

Code: Select all

extern int i8080_hal_memory_read_word(int addr);
extern void i8080_hal_memory_write_word(int addr, int word);

extern int i8080_hal_memory_read_byte(int addr);
extern void i8080_hal_memory_write_byte(int addr, int byte);
Эти функции вызываются, когда эмулятору надо прочитать или записать байт или слово в память. Я сделал явные функции для двухбайтовых величин (хотя их можно реализовать через однобайтовые), чтобы если писать отладчик, можно было реализовать брейкпоинты на слово, а не просто на байты.

Code: Select all

extern int i8080_hal_io_input(int port);
extern void i8080_hal_io_output(int port, int value);
Вызываются командам IN и OUT соответственно.

Code: Select all

extern void i8080_hal_iff(int on);
EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)

Code: Select all

extern unsigned char* i8080_hal_memory(void);
Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.
Last edited by begoon on 24 Aug 2012 14:41, edited 2 times in total.
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Post by begoon »

P.S. Кстати вот эта конструкция на big-endian будет работать неправильно:

Code: Select all

typedef union {
    struct {
        uns8 l, h;
    } b;
    uns16 w;
} reg_pair;
Факт. Хорошо, что PIC32 little endian. Там вообще надо реорганизовать. Убрать все это ерзанье со структурами и тем более юнионами. Ноги растут из моих неопытных давних попыток типа оптимизировать память. Я еще битовые поля использовал, но сейчас убрал.

Бонус тут в чем -- при наличие автоматического test suite'а можно карячить имплементацию как угодно. Шанс привнести баг, который не обнаружится текущими тестами крайне мал.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

begoon wrote:
Shaos wrote:А документашечка есть на это дело?

Code: Select all

extern int i8080_hal_memory_read_word(int addr);
extern void i8080_hal_memory_write_word(int addr, int word);

extern int i8080_hal_memory_read_byte(int addr);
extern void i8080_hal_memory_write_byte(int addr, int byte);
Эти функции вызываются, когда эмулятору надо прочитать или записать байт или слово в память. Я сделал явные функции для двухбайтовых величин (хотя их можно реализовать через однобайтовые), чтобы если писать отладчик, можно было реализовать брейкпоинты на слово, а не просто на байты.

Code: Select all

extern int i8080_hal_io_input(int port);
extern void i8080_hal_io_output(int port, int value);
Вызываются командам IN и OUT соответственно.
Это понятно - у меня тоже самое
begoon wrote:

Code: Select all

extern void i8080_hal_iff(int on);
EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)
А как кстати прерывания реализовать при данном интерфейсе?
begoon wrote:

Code: Select all

extern unsigned char* i8080_hal_memory(void);
Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.
непонял, а если память побита не сегменты?
по идее в общем случае памяти как массива может и не существовать в-принципе...
Я тут за главного - если что шлите мыло на me собака shaos точка net
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Post by begoon »

Shaos wrote:
begoon wrote:

Code: Select all

extern void i8080_hal_iff(int on);
EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)
А как кстати прерывания реализовать при данном интерфейсе?
Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.
begoon wrote:

Code: Select all

extern unsigned char* i8080_hal_memory(void);
Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.
непонял, а если память побита не сегменты?
по идее в общем случае памяти как массива может и не существовать в-принципе...
Эмулятору все равно, он просто вызвает функции для поступа в память по адресу. А вот уже эмуляция аппаратуры будет знать о сегментах и обрабатывать их. Массив-память или ее сегменты принадлежат аппаратуре, а не процессору.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

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

https://github.com/begoon/i8080-core

Старался сделать так, чтобы модуль процессора был максимально независим. В тестах можно посмотреть, как его "подключать" к аппаратуре.
в последней слаке собралось и отработало без проблем:

Code: Select all

bash-4.1$ make
cc -O3 -o i8080_test i8080.c i8080_hal.c i8080_test.c
./i8080_test

*********************************
File "CPUTEST.COM" loaded, size 19200

DIAGNOSTICS II V1.2 - CPU TEST
COPYRIGHT (C) 1981 - SUPERSOFT ASSOCIATES

ABCDEFGHIJKLMNOPQRSTUVWXYZ
CPU IS 8080/8085
BEGIN TIMING TEST
END TIMING TEST
CPU TESTS OK

Jump to 0000 from 3B25

*********************************
File "TEST.COM" loaded, size 1793
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0  (C) 1980

CPU IS OPERATIONAL
Jump to 0000 from 014F

*********************************
File "8080PRE.COM" loaded, size 1024
8080 Preliminary tests complete
Jump to 0000 from 032F

*********************************
File "8080EX1.COM" loaded, size 4608
8080 instruction exerciser (KR580VM80A CPU)
dad <b,d,h,sp>................  OK
aluop nn......................  OK
aluop <b,c,d,e,h,l,m,a>.......  OK
<daa,cma,stc,cmc>.............  OK
<inr,dcr> a...................  OK
<inr,dcr> b...................  OK
<inx,dcx> b...................  OK
<inr,dcr> c...................  OK
<inr,dcr> d...................  OK
<inx,dcx> d...................  OK
<inr,dcr> e...................  OK
<inr,dcr> h...................  OK
<inx,dcx> h...................  OK
<inr,dcr> l...................  OK
<inr,dcr> m...................  OK
<inx,dcx> sp..................  OK
lhld nnnn.....................  OK
shld nnnn.....................  OK
lxi <b,d,h,sp>,nnnn...........  OK
ldax <b,d>....................  OK
mvi <b,c,d,e,h,l,m,a>,nn......  OK
mov <bcdehla>,<bcdehla>.......  OK
sta nnnn / lda nnnn...........  OK
<rlc,rrc,ral,rar>.............  OK
stax <b,d>....................  OK
Tests complete
Jump to 0000 from 0137
P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах
Я тут за главного - если что шлите мыло на me собака shaos точка net
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Shaos wrote:P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах
Я без наезда, но, думаю, тебя ждет большой сюрприз ;-). По крайней мере, у меня он был.
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

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

Post by begoon »

Shaos wrote:в последней слаке собралось и отработало без проблем:
Отлично. У меня работает на Windows VS2012 и OSX/Clang.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

begoon wrote:
Shaos wrote:P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах
Я без наезда, но, думаю, тебя ждет большой сюрприз ;-). По крайней мере, у меня он был.
Я подозреваю что и не один ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

А вот такой вопрос, чисто практический, нужен мне для этого проекта...

Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки
кода операции?
Или как в ситуации с прерываниями - только по мере необходимости?

Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

эта программная модель вообще без прерываний
begoon wrote:Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.
и вроде бы слова состояния там также нету
Я тут за главного - если что шлите мыло на me собака shaos точка net
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Post by begoon »

Lavr wrote:Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки кода операции? Или как в ситуации с прерываниями - только по мере необходимости?

Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

begoon wrote:
Lavr wrote:Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки кода операции? Или как в ситуации с прерываниями - только по мере необходимости?

Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?
То что на шину данных выдаётся процессором 8080 в некоторые моменты времени для чипов 8228 или 8238, которые из него формируют сигналы MEMR, MEMW, IOR, IOW и т.д.

На самом деле в эмуляторах этого и не надо - как правило программная модель 8080 олицетворяет собой не конкретный чип 8080A, а процессорный модуль целиком, т.е. 8080+8024+8228
Я тут за главного - если что шлите мыло на me собака shaos точка net