Программная модель Intel 8080/КР580ВМ80А
Moderator: Shaos
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Программная модель Intel 8080/КР580ВМ80А
Выложил в виде проекта исходники эмулятора I8080, которые являются сердцем моих эмуляторов РК. Благодаря помощи Вячеслава Славинского были выловлены все глюки, и сейчас тест 8080/8085 CPU Exerciser полностью проходит. В сборку включены еще тесты три теста. Все тесты прогоняются автоматически при сборке.
https://github.com/begoon/i8080-core
Старался сделать так, чтобы модуль процессора был максимально независим. В тестах можно посмотреть, как его "подключать" к аппаратуре.
Исходники полного эмулятора, работающего на Maximite, выложу скоро. Пришлось с начала глюки в процессоре вылавливать.
В целом идея максимально изоливать процессор появилась в процессе работы над тестами Exerciser'а. Так как можно запустить на любой машине, не надо ждать два часа. Все тесты у меня проходят секунд за 10.
P.S. Может кто сделает репост на zx.pk.ru. Там почему-то закрыта регистрация.
https://github.com/begoon/i8080-core
Старался сделать так, чтобы модуль процессора был максимально независим. В тестах можно посмотреть, как его "подключать" к аппаратуре.
Исходники полного эмулятора, работающего на Maximite, выложу скоро. Пришлось с начала глюки в процессоре вылавливать.
В целом идея максимально изоливать процессор появилась в процессе работы над тестами Exerciser'а. Так как можно запустить на любой машине, не надо ждать два часа. Все тесты у меня проходят секунд за 10.
P.S. Может кто сделает репост на zx.pk.ru. Там почему-то закрыта регистрация.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
А документашечка есть на это дело?
Вообще очень похоже на мой интерфейс 
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Я тоже хотел на голимый си переписать, но только с возможностью иметь более одного процессора в программе
P.S. Кстати вот эта конструкция на big-endian будет работать неправильно:
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
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
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);
Code: Select all
extern void i8080_hal_iff(int on);
DI вызывает i8080_hal_iff(0)
Code: Select all
extern unsigned char* i8080_hal_memory(void);
Last edited by begoon on 24 Aug 2012 14:41, edited 2 times in total.
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Факт. Хорошо, что PIC32 little endian. Там вообще надо реорганизовать. Убрать все это ерзанье со структурами и тем более юнионами. Ноги растут из моих неопытных давних попыток типа оптимизировать память. Я еще битовые поля использовал, но сейчас убрал.P.S. Кстати вот эта конструкция на big-endian будет работать неправильно:Code: Select all
typedef union { struct { uns8 l, h; } b; uns16 w; } reg_pair;
Бонус тут в чем -- при наличие автоматического test suite'а можно карячить имплементацию как угодно. Шанс привнести баг, который не обнаружится текущими тестами крайне мал.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Это понятно - у меня тоже самое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);
Вызываются командам IN и OUT соответственно.Code: Select all
extern int i8080_hal_io_input(int port); extern void i8080_hal_io_output(int port, int value);
А как кстати прерывания реализовать при данном интерфейсе?begoon wrote:EI вызывает i8080_hal_iff(1)Code: Select all
extern void i8080_hal_iff(int on);
DI вызывает i8080_hal_iff(0)
непонял, а если память побита не сегменты?begoon wrote:Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.Code: Select all
extern unsigned char* i8080_hal_memory(void);
по идее в общем случае памяти как массива может и не существовать в-принципе...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.Shaos wrote:А как кстати прерывания реализовать при данном интерфейсе?begoon wrote:EI вызывает i8080_hal_iff(1)Code: Select all
extern void i8080_hal_iff(int on);
DI вызывает i8080_hal_iff(0)
begoon wrote:Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.Code: Select all
extern unsigned char* i8080_hal_memory(void);
Эмулятору все равно, он просто вызвает функции для поступа в память по адресу. А вот уже эмуляция аппаратуры будет знать о сегментах и обрабатывать их. Массив-память или ее сегменты принадлежат аппаратуре, а не процессору.непонял, а если память побита не сегменты?
по идее в общем случае памяти как массива может и не существовать в-принципе...
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Программная модель Intel 8080/КР580ВМ80А
в последней слаке собралось и отработало без проблем: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
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Программная модель Intel 8080/КР580ВМ80А
Я без наезда, но, думаю, тебя ждет большой сюрпризShaos wrote:P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах

-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
Re: Программная модель Intel 8080/КР580ВМ80А
Отлично. У меня работает на Windows VS2012 и OSX/Clang.Shaos wrote:в последней слаке собралось и отработало без проблем:
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Программная модель Intel 8080/КР580ВМ80А
Я подозреваю что и не одинbegoon wrote:Я без наезда, но, думаю, тебя ждет большой сюрпризShaos wrote:P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах. По крайней мере, у меня он был.

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
А вот такой вопрос, чисто практический, нужен мне для этого проекта...
Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки
кода операции?
Или как в ситуации с прерываниями - только по мере необходимости?
Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки
кода операции?
Или как в ситуации с прерываниями - только по мере необходимости?
Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
iLavr
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
эта программная модель вообще без прерываний
и вроде бы слова состояния там также нетуbegoon wrote:Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Senior
- Posts: 146
- Joined: 22 Aug 2012 17:06
- Location: 188.220.42.216
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
То что на шину данных выдаётся процессором 8080 в некоторые моменты времени для чипов 8228 или 8238, которые из него формируют сигналы MEMR, MEMW, IOR, IOW и т.д.begoon wrote:Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?Lavr wrote:Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки кода операции? Или как в ситуации с прерываниями - только по мере необходимости?
Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?
На самом деле в эмуляторах этого и не надо - как правило программная модель 8080 олицетворяет собой не конкретный чип 8080A, а процессорный модуль целиком, т.е. 8080+8024+8228
Я тут за главного - если что шлите мыло на me собака shaos точка net