nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 28 Jun 2017 06:41



Reply to topic  [ 94 posts ]  Go to page 1, 2, 3, 4, 5 ... 7  Next
Программная модель Intel 8080/КР580ВМ80А 
Author Message
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Выложил в виде проекта исходники эмулятора I8080, которые являются сердцем моих эмуляторов РК. Благодаря помощи Вячеслава Славинского были выловлены все глюки, и сейчас тест 8080/8085 CPU Exerciser полностью проходит. В сборку включены еще тесты три теста. Все тесты прогоняются автоматически при сборке.

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

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

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

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

P.S. Может кто сделает репост на zx.pk.ru. Там почему-то закрыта регистрация.


24 Aug 2012 09:32
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
Надо будет мою кору 8080 сравнить с твоей - а то на моём коде CP/M нормально работать отказывается и кое-какие орионовские проги глючат...

_________________
:eugeek: https://twitter.com/Shaos1973


24 Aug 2012 10:31
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
А документашечка есть на это дело?

Code:
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:
typedef union {
    struct {
        uns8 l, h;
    } b;
    uns16 w;
} reg_pair;

_________________
:eugeek: https://twitter.com/Shaos1973


24 Aug 2012 17:17
Profile WWW
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Post 
Shaos wrote:
А документашечка есть на это дело?


Code:
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:
extern int i8080_hal_io_input(int port);
extern void i8080_hal_io_output(int port, int value);


Вызываются командам IN и OUT соответственно.

Code:
extern void i8080_hal_iff(int on);


EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)

Code:
extern unsigned char* i8080_hal_memory(void);


Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.


Last edited by begoon on 24 Aug 2012 17:41, edited 2 times in total.



24 Aug 2012 17:32
Profile
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Post 
Quote:
P.S. Кстати вот эта конструкция на big-endian будет работать неправильно:
Code:
typedef union {
    struct {
        uns8 l, h;
    } b;
    uns16 w;
} reg_pair;


Факт. Хорошо, что PIC32 little endian. Там вообще надо реорганизовать. Убрать все это ерзанье со структурами и тем более юнионами. Ноги растут из моих неопытных давних попыток типа оптимизировать память. Я еще битовые поля использовал, но сейчас убрал.

Бонус тут в чем -- при наличие автоматического test suite'а можно карячить имплементацию как угодно. Шанс привнести баг, который не обнаружится текущими тестами крайне мал.


24 Aug 2012 17:39
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
begoon wrote:
Shaos wrote:
А документашечка есть на это дело?


Code:
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:
extern int i8080_hal_io_input(int port);
extern void i8080_hal_io_output(int port, int value);


Вызываются командам IN и OUT соответственно.


Это понятно - у меня тоже самое

begoon wrote:
Code:
extern void i8080_hal_iff(int on);


EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)


А как кстати прерывания реализовать при данном интерфейсе?

begoon wrote:
Code:
extern unsigned char* i8080_hal_memory(void);


Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.


непонял, а если память побита не сегменты?
по идее в общем случае памяти как массива может и не существовать в-принципе...

_________________
:eugeek: https://twitter.com/Shaos1973


24 Aug 2012 17:46
Profile WWW
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Post 
Shaos wrote:

begoon wrote:
Code:
extern void i8080_hal_iff(int on);


EI вызывает i8080_hal_iff(1)
DI вызывает i8080_hal_iff(0)


А как кстати прерывания реализовать при данном интерфейсе?


Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.

begoon wrote:
Code:
extern unsigned char* i8080_hal_memory(void);


Эта функция эмулятору собственно не нужна, но полезна для остальных "пользователей" HAL'а. Возвращает адрес первой ячейки пямяти.


Quote:
непонял, а если память побита не сегменты?
по идее в общем случае памяти как массива может и не существовать в-принципе...


Эмулятору все равно, он просто вызвает функции для поступа в память по адресу. А вот уже эмуляция аппаратуры будет знать о сегментах и обрабатывать их. Массив-память или ее сегменты принадлежат аппаратуре, а не процессору.


24 Aug 2012 17:58
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
begoon wrote:
Выложил в виде проекта исходники эмулятора I8080, которые являются сердцем моих эмуляторов РК. Благодаря помощи Вячеслава Славинского были выловлены все глюки, и сейчас тест 8080/8085 CPU Exerciser полностью проходит. В сборку включены еще тесты три теста. Все тесты прогоняются автоматически при сборке.

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

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


в последней слаке собралось и отработало без проблем:

Code:
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 в твой тест и погляжу как скажется на результатах

_________________
:eugeek: https://twitter.com/Shaos1973


25 Aug 2012 22:24
Profile WWW
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Shaos wrote:
P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах


Я без наезда, но, думаю, тебя ждет большой сюрприз ;-). По крайней мере, у меня он был.


26 Aug 2012 03:50
Profile
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Shaos wrote:
в последней слаке собралось и отработало без проблем:


Отлично. У меня работает на Windows VS2012 и OSX/Clang.


26 Aug 2012 03:52
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
begoon wrote:
Shaos wrote:
P.S. попробую воткнуть свой 8080 в твой тест и погляжу как скажется на результатах


Я без наезда, но, думаю, тебя ждет большой сюрприз ;-). По крайней мере, у меня он был.


Я подозреваю что и не один ;)

_________________
:eugeek: https://twitter.com/Shaos1973


26 Aug 2012 09:14
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
Post 
А вот такой вопрос, чисто практический, нужен мне для этого проекта...

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

Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?

_________________
iLavr


26 Aug 2012 09:58
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
эта программная модель вообще без прерываний

begoon wrote:
Четкого интерфейса для прерываний у меня нет, так как в РК их реально нет. Можно, например, так: если извне принято решения о прерывании, и флаг IFF установлен, то после очередной команды лезем в регистры напрямую (сейчас есть функции только для чтения регистров), и сообразно меняем их так, как будто бы началось прерывание.


и вроде бы слова состояния там также нету

_________________
:eugeek: https://twitter.com/Shaos1973


26 Aug 2012 10:55
Profile WWW
Senior

Joined: 22 Aug 2012 20:06
Posts: 100
Location: 188.220.42.216
Reply with quote
Post 
Lavr wrote:
Словосостояние (STАTUS) вы формируете каждый раз в цикле выборки кода операции? Или как в ситуации с прерываниями - только по мере необходимости?

Ну, скажем, только в случае IN/OUT, HOLD, HLT или тот же INT?


Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?


26 Aug 2012 13:30
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15362
Location: New York
Reply with quote
Post 
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

_________________
:eugeek: https://twitter.com/Shaos1973


26 Aug 2012 14:32
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 94 posts ]  Go to page 1, 2, 3, 4, 5 ... 7  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.