nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 21 Oct 2020 01:14



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

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
вот "quick&dirty" прослойка, заменяющая i8080.c автора, для тестирования этими тестами моего 8080-ядра (proc8080.cpp из состава "nedoPC SDK"):
Code:
// i8080_my.cpp - Alexander Shabarshin (26-Aug-2012)
#include "i8080.h"
#include "i8080_hal.h"
#include "proc8080.h"
class my8080 : public Processor8080
{
public:
 my8080():Processor8080(){};
~my8080(){};
 SH_BYTE get(SH_WORD a){return (SH_BYTE)i8080_hal_memory_read_byte(a);};
 void put(SH_WORD a,SH_BYTE b){i8080_hal_memory_write_byte(a,b);};
 int newstep(){unsigned long t=timel;step();time=timel;return (timel>t)?timel-t:1;};
 int getA(){return A;};
 int getB(){return B;};
 int getC(){return C;};
 int getD(){return D;};
 int getE(){return E;};
 int getH(){return H;};
 int getL(){return L;};
} *my = NULL;
void i8080_init(void){my = new my8080();}
int i8080_instruction(void){return my->newstep();}
void i8080_jump(int addr){my->setPC(addr);}
int i8080_pc(void){return my->getPC();}
int i8080_regs_af(void){return my->getPSW();}
int i8080_regs_bc(void){return my->getBC();}
int i8080_regs_de(void){return my->getDE();}
int i8080_regs_hl(void){return my->getHL();}
int i8080_regs_sp(void){return my->getSP();}
int i8080_regs_a(void){return my->getA();}
int i8080_regs_b(void){return my->getB();}
int i8080_regs_c(void){return my->getC();}
int i8080_regs_d(void){return my->getD();}
int i8080_regs_e(void){return my->getE();}
int i8080_regs_h(void){return my->getH();}
int i8080_regs_l(void){return my->getL();}


Результат таков:
Code:
bash-4.1$ make
g++ -O3 -o i8080_test2 proc8080.cpp i8080_my.cpp i8080_hal.c i8080_test.c
./i8080_test2

*********************************
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 FAILED:
ERROR COUNT 0001H

INSTRUCTION SEQUENCE WAS 050000H
REGISTER f CONTAINS 46H
BUT SHOULD CONTAIN 56H
REGISTER VALUE BEFORE INSTRUCTION SEQUENCE WAS 02H
TEST NUMBER  0011H


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 06B7

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

*********************************
File "8080EX1.COM" loaded, size 4608
8080 instruction exerciser (KR580VM80A CPU)
dad <b,d,h,sp>................  OK
aluop nn......................  ERROR **** crc expected:9e922f9e found:1eac32ec

далее висит...

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


Last edited by Shaos on 26 Aug 2012 23:39, edited 4 times in total.



26 Aug 2012 13:06
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
begoon wrote:
Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?
То что на шину данных выдаётся процессором 8080 в некоторые моменты времени для чипов 8228 или 8238, которые из него формируют сигналы MEMR, MEMW, IOR, IOW и т.д.
На самом деле в эмуляторах этого и не надо - как правило программная модель 8080 олицетворяет собой не конкретный чип 8080A, а процессорный модуль целиком, т.е. 8080+8024+8228

Ну да, а мне-то как-то его вроде аппаратно эмулировать надо бы...
Вот он (STATUS) меня несколько и озадачил...

Но в подавляющем большинстве случаев (работа с памятью) мне можно его
и не формировать, чтобы не тормозить и так тормозной PIC.

А вот в случаях IN/OUT, HOLD, HLT - как-то определиться надо для внешних
устройств... Или же сказать самому себе - да нет, это i8085 эмулируется!
Никаких STATUS-ов - нафиг!

_________________
iLavr


26 Aug 2012 13:43
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
Lavr wrote:
Shaos wrote:
begoon wrote:
Не совсем понимаю, что вы имеете под названием STATUS? Регистр флагов F?
То что на шину данных выдаётся процессором 8080 в некоторые моменты времени для чипов 8228 или 8238, которые из него формируют сигналы MEMR, MEMW, IOR, IOW и т.д.
На самом деле в эмуляторах этого и не надо - как правило программная модель 8080 олицетворяет собой не конкретный чип 8080A, а процессорный модуль целиком, т.е. 8080+8024+8228

Ну да, а мне-то как-то его вроде аппаратно эмулировать надо бы...
Вот он (STATUS) меня несколько и озадачил...

Но в подавляющем большинстве случаев (работа с памятью) мне можно его
и не формировать, чтобы не тормозить и так тормозной PIC.

А вот в случаях IN/OUT, HOLD, HLT - как-то определиться надо для внешних
устройств... Или же сказать самому себе - да нет, это i8085 эмулируется!
Никаких STATUS-ов - нафиг!


да нет - почему же 8085? это 8080, но шина данных спрятана за 8228 :)

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


26 Aug 2012 13:57
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
дополнил программу автора вот такой функцией:
Code:
int i8080_regs_af(void) {
    i8080_store_flags();
    return AF;
}

чтобы нагенерить гигабайты логов со значениями регистров на каждом шагу и сравнить со своими...

P.S. пока вижу, что у меня неправильно считается AC при вычитании (и соответсвтенно сравнении)

P.P.S. оказалось, что AC после вычитания должен содержать ИНВЕРТИРОВАННОЕ значение полупереноса (точнее "полузаёма"), кроме того DAA у меня было реализовано не совсем правильно...

P.P.P.S. плюс там у меня были проблемы с переполнением 32-битного счётчика тактов (из-за этого зависало на последнем тесте) - всё исправил (а также добавил игнор неизвестных опкодов) и вот что получил:

Code:
bash-4.1$ make
g++ -O2 -o i8080_test2 proc8080.cpp i8080_my.cpp i8080_hal.c i8080_test.c
./i8080_test2

*********************************
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


Спасибо автору - теперь и у меня есть "эталонный" эмулятор процессора 8080 ;)

P.P.P.P.S. Вот мой вариант DAA, который проходит все тесты:

Code:
case 0x27: // DAA
  timel+=4;
  cc = c_;
  if(a_||(A&0x0F)>9) A=plus(A,0x06);
  bb = a_;
  if(c_) cc = 1;
  if(cc||((A&0xF0)>>4)>9) A=plus(A,0x60);
  if(cc) c_ = 1;
  a_ = bb;
  flag_all(A);
  break;


А вообще этот DAA и флаг AC всё усложняют и замедляют - в следующем своём эмуле сделаю возможность отключать эту фигню ради скорости...

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


26 Aug 2012 14:18
Profile WWW
Devil

Joined: 26 May 2003 07:57
Posts: 703
Reply with quote
Post 
Shaos wrote:
Вот мой вариант DAA, который проходит все тесты

За исключением небольших несовпадений в использовании переменных, у меня абсолютно аналогично. Фактически, алгоритмы совпадают. Не удивительно. :)

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


26 Aug 2012 23:49
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
b2m wrote:
Shaos wrote:
Вот мой вариант DAA, который проходит все тесты

За исключением небольших несовпадений в использовании переменных, у меня абсолютно аналогично. Фактически, алгоритмы совпадают. Не удивительно. :)


Я посмотрел как у других сделано - выглядит толще и путаннее ;)

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


27 Aug 2012 00:26
Profile WWW
Senior

Joined: 22 Aug 2012 18:06
Posts: 103
Location: 188.220.42.216
Reply with quote
Post 
Shaos wrote:
P.P.S. оказалось, что AC после вычитания должен содержать ИНВЕРТИРОВАННОЕ значение полупереноса (точнее "полузаёма"), кроме того DAA у меня было реализовано не совсем правильно...


Надо полагать, что AC = A(3) | Param(3) в операциях AND ты тоже сделал? Остается загадкой, как господа svo и b2m до этого доперли в свое время.

UPDATE: Хотя вот, в разных мануалах разная информация.

Image

Image


27 Aug 2012 02:45
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
А вообще этот DAA и флаг AC всё усложняют и замедляют - в следующем своём эмуле сделаю возможность отключать эту фигню ради скорости...

Да кроме DAA ничто более этот флаг осевого переноса AC и не использует, на мой взгляд...

_________________
iLavr


27 Aug 2012 07:45
Profile
Devil

Joined: 26 May 2003 07:57
Posts: 703
Reply with quote
Post 
Есть маньяки, использующие push psw / ret

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


27 Aug 2012 07:49
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
И с какой целью мониаки анализируют таким способом флаг осевого переноса AC ?
Защиты хитрые делают?

Вобщем-то программы таких мониаков становятся в этом случае жестко привязаны к i8080.

_________________
iLavr


27 Aug 2012 08:23
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
Ну поведение флагов C и AC достаточно подробно в документациях описаны, в отличие от DAA, которую многие просто игнорируют либо описывают двумя-тремя словами...

Code:
case 0xE6: // ANI #
  timel+=7;
  bb=get(PC++);
  if(!is8085())
    a_=((A|bb)>>3)&1;
  else   
    a_=SH_TRUE;
  A&=bb;
  c_=SH_FALSE;
  flag_all(A);
  break;


Я это изменение вроде бы уже давно сделал - где-то вычитал ;)

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


27 Aug 2012 08:33
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Lavr wrote:
...модели что i8080, что Z80 мы знаем довольно неплохо и разные исходники и прототипы у нас есть,
может быть, ты взглянул бы разочек, как оформляется dll-модель для "Protezus"?
Ну тут придётся ведь по тактам делать правдоподобное поведение, а в эмуле можно такие тонкости опустить....

А мне казалось - достаточно приблизительно соблюсти временные соотношения,
удобоваримые для распространённых ПЗУ, ОЗУ и УВВ
...
Или я в этом вопросе не прав?

А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)

_________________
iLavr


28 Aug 2012 05:56
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
Lavr wrote:
Shaos wrote:
Lavr wrote:
...модели что i8080, что Z80 мы знаем довольно неплохо и разные исходники и прототипы у нас есть,
может быть, ты взглянул бы разочек, как оформляется dll-модель для "Protezus"?
Ну тут придётся ведь по тактам делать правдоподобное поведение, а в эмуле можно такие тонкости опустить....

А мне казалось - достаточно приблизительно соблюсти временные соотношения,
удобоваримые для распространённых ПЗУ, ОЗУ и УВВ
...
Или я в этом вопросе не прав?

А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)


А какже слово состояния? Прерывания с чтением команды с щины адреса? И потом 8080 напрямую не подключишь - надо что-то между ставить...

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


28 Aug 2012 07:15
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
А какже слово состояния? Прерывания с чтением команды с щины адреса? И потом 8080 напрямую не подключишь - надо что-то между ставить...

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

Чтением команды с шины адреса - это я как-то не понимаю...
Прерывание - это по сути три стандартных по временной диаграмме чтения по шине данных
от УВВ без выставления адреса. INTA - это фактически же дубликат DBIN.

Ну а что "8080 напрямую не подключишь - надо что-то между ставить" - эту
странную точку зрения я только в некоторых странных книжках встречал...
В отличие от i8085, i8080 и z80 как раз неплохо напрямую
включаются, если не превышать нагрузочную способность шин...
Или ты другое имел ввиду?

Lavr wrote:
А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)

Я имею ввиду, где эмулируют PIC-ом или др. контроллером только сам проц,
а память и УВВ внешние.

Вот тут у нас коллега что-то похожее делал, цепляя 580ВВ55 к эмулятору i8080
на меге8515, но память внутреннюю юзал...

_________________
iLavr


28 Aug 2012 13:52
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18882
Location: Silicon Valley
Reply with quote
Post 
Я имел ввиду шину данных - по прерыванию 8080 читает оттуда команду которую надо выполнить. В наших нищебродских самодельных компах шина данных как правило подтянута к +5В и проц в этом случае читает FF что есть RST 7 (переход по адресу 0038h). Кроме того у 8080 нету команд !RMEM, !WMEM, !RIO, !WIO - их делает 8228/8238. Опять же у нас принято использовать в качестве !RD инвертированный сигнал DBIN, но это не везде проходит...

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


28 Aug 2012 15:11
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 97 posts ]  Go to page Previous  1, 2, 3, 4, 5 ... 7  Next

Who is online

Users browsing this forum: No registered users and 2 guests


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.