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

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

Moderator: Shaos

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

Post by Shaos »

вот "quick&dirty" прослойка, заменяющая i8080.c автора, для тестирования этими тестами моего 8080-ядра (proc8080.cpp из состава "nedoPC SDK"):

Code: Select all

// 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: Select all

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
далее висит...
Last edited by Shaos on 26 Aug 2012 22:39, edited 4 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

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
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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 :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

дополнил программу автора вот такой функцией:

Code: Select all

int i8080_regs_af(void) {
    i8080_store_flags();
    return AF;
}
чтобы нагенерить гигабайты логов со значениями регистров на каждом шагу и сравнить со своими...

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

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

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

Code: Select all

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: Select all

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 всё усложняют и замедляют - в следующем своём эмуле сделаю возможность отключать эту фигню ради скорости...
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 905
Joined: 26 May 2003 06:57

Post by b2m »

Shaos wrote:Вот мой вариант DAA, который проходит все тесты
За исключением небольших несовпадений в использовании переменных, у меня абсолютно аналогично. Фактически, алгоритмы совпадают. Не удивительно. :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

b2m wrote:
Shaos wrote:Вот мой вариант DAA, который проходит все тесты
За исключением небольших несовпадений в использовании переменных, у меня абсолютно аналогично. Фактически, алгоритмы совпадают. Не удивительно. :)
Я посмотрел как у других сделано - выглядит толще и путаннее ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
begoon
Senior
Posts: 146
Joined: 22 Aug 2012 17:06
Location: 188.220.42.216

Post by begoon »

Shaos wrote:P.P.S. оказалось, что AC после вычитания должен содержать ИНВЕРТИРОВАННОЕ значение полупереноса (точнее "полузаёма"), кроме того DAA у меня было реализовано не совсем правильно...
Надо полагать, что AC = A(3) | Param(3) в операциях AND ты тоже сделал? Остается загадкой, как господа svo и b2m до этого доперли в свое время.

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

Image

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

Post by Lavr »

Shaos wrote:А вообще этот DAA и флаг AC всё усложняют и замедляют - в следующем своём эмуле сделаю возможность отключать эту фигню ради скорости...
Да кроме DAA ничто более этот флаг осевого переноса AC и не использует, на мой взгляд...
iLavr
b2m
Devil
Posts: 905
Joined: 26 May 2003 06:57

Post by b2m »

Есть маньяки, использующие push psw / ret
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

И с какой целью мониаки анализируют таким способом флаг осевого переноса AC ?
Защиты хитрые делают?

Вобщем-то программы таких мониаков становятся в этом случае жестко привязаны к i8080.
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Ну поведение флагов C и AC достаточно подробно в документациях описаны, в отличие от DAA, которую многие просто игнорируют либо описывают двумя-тремя словами...

Code: Select all

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;
Я это изменение вроде бы уже давно сделал - где-то вычитал ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:
Lavr wrote:...модели что i8080, что Z80 мы знаем довольно неплохо и разные исходники и прототипы у нас есть,
может быть, ты взглянул бы разочек, как оформляется dll-модель для "Protezus"?
Ну тут придётся ведь по тактам делать правдоподобное поведение, а в эмуле можно такие тонкости опустить....
А мне казалось - достаточно приблизительно соблюсти временные соотношения,
удобоваримые для распространённых ПЗУ, ОЗУ и УВВ
...
Или я в этом вопросе не прав?

А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
Shaos wrote:
Lavr wrote:...модели что i8080, что Z80 мы знаем довольно неплохо и разные исходники и прототипы у нас есть,
может быть, ты взглянул бы разочек, как оформляется dll-модель для "Protezus"?
Ну тут придётся ведь по тактам делать правдоподобное поведение, а в эмуле можно такие тонкости опустить....
А мне казалось - достаточно приблизительно соблюсти временные соотношения,
удобоваримые для распространённых ПЗУ, ОЗУ и УВВ
...
Или я в этом вопросе не прав?

А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)
А какже слово состояния? Прерывания с чтением команды с щины адреса? И потом 8080 напрямую не подключишь - надо что-то между ставить...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:А какже слово состояния? Прерывания с чтением команды с щины адреса? И потом 8080 напрямую не подключишь - надо что-то между ставить...
Ну как-то надо упрощенно, как мне кажется...
Слово состояния хочется "уволить" больше всего. Во многих конструкциях
его же просто не используют...

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

Ну а что "8080 напрямую не подключишь - надо что-то между ставить" - эту
странную точку зрения я только в некоторых странных книжках встречал...
В отличие от i8085, i8080 и z80 как раз неплохо напрямую
включаются, если не превышать нагрузочную способность шин...
Или ты другое имел ввиду?
Lavr wrote:А никто не подскажет примеры, где эмулируют процессор программно-аппаратно?
То есть, где реально ПЗУ, ОЗУ и УВВ подключают? (Только не на ПЛИС...)
Я имею ввиду, где эмулируют PIC-ом или др. контроллером только сам проц,
а память и УВВ внешние.

Вот тут у нас коллега что-то похожее делал, цепляя 580ВВ55 к эмулятору i8080
на меге8515, но память внутреннюю юзал...
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Я имел ввиду шину данных - по прерыванию 8080 читает оттуда команду которую надо выполнить. В наших нищебродских самодельных компах шина данных как правило подтянута к +5В и проц в этом случае читает FF что есть RST 7 (переход по адресу 0038h). Кроме того у 8080 нету команд !RMEM, !WMEM, !RIO, !WIO - их делает 8228/8238. Опять же у нас принято использовать в качестве !RD инвертированный сигнал DBIN, но это не везде проходит...
Я тут за главного - если что шлите мыло на me собака shaos точка net