Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2012, 10:50   #1
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию DprToLvt (PasToLvt). Пишу среду разработки (Эмулятор) для ПК-01 Львов на Delphi6

Команды КР580 в виде Дельфи процедур…

Правильно ли реализованы следующие процедуры:
//Код Delphi
Код:
Procedure SBBD; 
Begin 
if FlagC then wremb:=1 else wremb:=0; 
RgA:=RgA-RgD-wremb;
end;
 
Procedure SBI(b:byte);
Begin
if FlagC then wremb:=1 else wremb:=0;
RgA:=RgA-b-wremb;
 end;
 
Procedure ORI(b:byte);
Begin 
RgA:=RgA or b; 
SetFlagAc(false);SetFlagC(false);
end;
Не знаю как реализовать Команду DAA на Дельфи, вот есть вырезки из СИ(которого я не знаю) и Асма, помогите транслировать в Дельфи конструкции или опишите пожалуйста каждую строку словами
Код C++
Код:
Procedure DAA;
case 0x27: // 27 DAA
    tmp1 = 0;
    if ((RgF & f_C) || ( RgA         > 0x99)) tmp1 |= 0x60;
    if ((RgF & f_A) || ((RgA & 0x0F) > 0x09)) tmp1 |= 0x06;
    tmp2 = RgA + tmp1;
    RgF = i8080_flags[tmp2 & 0xFF];
    if ((tmp2 ^ RgA ^ tmp1) & 0x10) RgF |= f_A;
    if (tmp2 > 0xFF) RgF |= f_C;
    RgA = tmp2 & 0xFF;
    clock += 4;
    izmRgPC(+1);
    break;
Код:
;Код ASM
; DAA
C27:
        mov ax, [RgPSW]
        sahf
        daa
        lahf
        mov [RgPSW], ax
        ret

вот еще огрызок который мне пытались перевести на паскаль (Дельфи):Код Pascal
tmp := src1 + src2;
SetFlagAc(((src1 xor src2 xor tmp) and 16) <> 0);
dst := tmp;

Последний раз редактировалось Stilet; 15.07.2012 в 16:26.
sas9568635 вне форума Ответить с цитированием
Старый 16.07.2012, 07:57   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Я не увидел никаких признаков отслеживания времени выполнения команд, а между тем для i8080 (К580ВМ80) это отнюдь не маловажный фактор: обычно компьютеры на этом процессоре не имели отдельного таймера, поэтому все временнЫе интервалы реализовались посредством определенного количества команд известной продолжительности.

2. Привели бы Вы описания команд. Сами понимаете, с тех пор, когда реально программировали на i8080, прошло немало лет. Я, например, уже мало что помню.
Ну и описание глобальных переменных Вашей программы тоже не помешало бы.
s-andriano вне форума Ответить с цитированием
Старый 16.07.2012, 19:48   #3
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
1. Я не увидел никаких признаков отслеживания времени выполнения команд, а между тем для i8080 (К580ВМ80) это отнюдь не маловажный фактор: обычно компьютеры на этом процессоре не имели отдельного таймера, поэтому все временнЫе интервалы реализовались посредством определенного количества команд известной продолжительности.
Я умышленно выкинул процедуры задержек, счетчики команд (PC) и процедуры установки флагов…
Так как они у меня работают правильно (в других командах которые работают правильно) Чтобы не «засорять» людям мозги, а хотел узнать правильно ли реализована сама «соль» команды… т.е. правильно ли применяются в процедуре признак займа?... правильна ли операция (логическая операция) над нужными регистрами?... и т.д.

Цитата:
Сообщение от s-andriano Посмотреть сообщение
2. Привели бы Вы описания команд. Сами понимаете, с тех пор, когда реально программировали на i8080, прошло немало лет. Я, например, уже мало что помню.
Привожу. см.ниже
Цитата:
Сообщение от s-andriano Посмотреть сообщение
Ну и описание глобальных переменных Вашей программы тоже не помешало бы.
Хм… А что оно даст… Я думал тут итак все понятно… Ну вот…
Код:
{ Регистры общего назначения (порядок следования должен быть таким!) }
  RgC:   byte;
  RgB:   byte;
  RgE:   byte;
  RgD:   byte;
  RgL:   byte;
  RgH:   byte;
  RgA:   byte;//=Hi(RgPSW) absolute
  RgF:   byte;//=Lo(RgPSW) absolute
  RgSP:  word; //Указатель стека Изначально какой?
  RgPC:  word; // Счетчик команд
  RgBC:  word absolute RgC;
  RgDE:  word absolute RgE;
  RgHL:  word absolute RgL;
  RgPSW: word absolute RgA; 	// Флаги: 7 6 5  4 3 2 1 0   //  RgPSW: word absolute RgA      RgF:   byte;
        			//        S Z   Ac   P   C
 { Вспомогательные регистры и флаги }

  RC1:   byte;                { Регистры очереди команд           }
  RC2:   byte;
  RC3:   byte;
  IntF:  boolean;             { Флаг разрешения прерываний        }

//..…………………………….
// Установка флага
Procedure SetFlagS(f:Boolean);cdecl; Procedure SetFlagZ(f:Boolean);cdecl;
Procedure SetFlagAc(f:Boolean);cdecl;Procedure SetFlagP(f:Boolean);cdecl;
Procedure SetFlagC(f:Boolean);cdecl;Procedure SetFlagIntF(f:Boolean);cdecl;
// Чтение флага
Function FlagS:Boolean; cdecl; Function FlagZ:Boolean; cdecl;
Function FlagAc:Boolean;cdecl; Function FlagP:Boolean; cdecl;
Function FlagC:Boolean;cdecl;  Function FlagIntF:Boolean;cdecl;
sas9568635 вне форума Ответить с цитированием
Старый 16.07.2012, 19:51   #4
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

Вот все команды которые у меня «под подозрением» неправильной их реализации, а ниже описание, если кто уже забыл…

Код:
 Procedure ADCB;
Begin
if FlagC then wremb:=1 else wremb:=0; 
RgA:=RgA+RgB+wremb;
 end; 

Procedure SBBB;
Begin
if FlagC then wremb:=1 else wremb:=0; 
RgA:=RgA-RgB-wremb;
 end; 

Procedure ACI(b:byte);
Begin
if FlagC then wremb:=1 else wremb:=0; 
RgA:=RgA+b+wremb;
end; 

{C7} Procedure RST0_;
Begin
If FlagIntF then begin// если Разрешено прерывание
RgPC:=RgPC+1;Word_:=RgPC;WriteMem(RgSP-1,Byte_[2]);WriteMem(RgSP-2,Byte_[1]);RgSP:=RgSP-2;//сохранение куда возвращатся
RgPC:=8*0; //0 - поточу то рст нулевое
                 end else izmRgPC(+1);

Procedure SBI(b:byte);
Begin if FlagC then wremb:=1 else wremb:=0;
RgA:=RgA-b-wremb;izmRgPC(+2);
end;

Procedure PCHL_;
Begin JMP_(RgHL);
end; 

Procedure XRI(b:byte);
Begin 
RgA:=(RgA xor b);
SetFlagAc(false);SetFlagC(false);
end; 

Procedure ORI(b:byte);
Begin 
RgA:=RgA or b;
SetFlagAc(false);SetFlagC(false);
 end;
Вместо S - регистры A,B,C,D,E,H,L,M.
+ признак изменяется
- не изменяется

S - знак результата
Z - признак нулевого результата
Ac- дополнительный перенос
P - признак четности
C - признак переноса/заема
Вместо D8, тип Байт

S Z Ac P C
ADC S | A=A+S+c | + + + + + | Сложение с учетом признака переноса "c".
SBB S | A=A-S-c | + + + + + | Вычитание с учетом заема "c".
ACI D8 | A=A+D8+c | + + + + + | Сложение с учетом переноса.
RST V |PC-->M(SP-1,SP-2) | --- -- | Прерывание по вектору
|SP=SP-2, V*8-->PC | | V*8. V = 0 ...7
SBI D8 | A=A-D8-c | + + + + + | Вычитание с учетом заема.
PCHL | переход на HL | Переход по адресу, заданному в HL.
XRI D8 ! A = A ¤ D8 | + + 0 + 0 | Исключающее ИЛИ.
ORI D8 | A = A ! D8 | + + 0 + 0 | Логическое ИЛИ.

Пока все….
sas9568635 вне форума Ответить с цитированием
Старый 17.07.2012, 15:47   #5
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

При переводе программ написанных в Маш.кодах (в частоности КР580) в структуру Дельфи…
структура ассемблера не позволяет перевести (транслировать) такие программы так как в структуре ассемблера:
1 .есть «досрочный» выход из процедуры минуя end, a Ret может располагаться где угодно, а также даже не однин «хвост» окончания одной процедуры…
2. есть вход в середину процедуры по метке перехода, что не позволяет среда Дельфи.
3. Также на одну метку в ассемблере возможен переход как на процедуру (Call) так и «обычный» переход (Jmp)
Вопрос:
Возможно ли транслирование структуры ассемблера с вот такими вот особенностями которыми обладает почти все Асм-программы в структуру Дельфи?.. Какие конструкции мне необходимо знать?
sas9568635 вне форума Ответить с цитированием
Старый 17.07.2012, 20:40   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Насколько я помню, стек при запуске программы устанавливается в 100h и растет вниз.
2. Попытка один в один переписать с языка низкого уровня на язык высокого уровня изначально обречена на провал - не стоит и пытаться этого делать. Единственный, на мой взгляд, вариант - интерпретация кодов i8080.
3. Не понял, что такое "регистры очереди команд".
4. Команда ADCB реализована неверно - она также должна устанавливать (или сбрасывать) флаг переноса в зависимости от того, помещается ли результат в байт.
5. Аналогично SBBB.
6. Аналогично ACI (или ADI?). Смысл в том, чтобы обрабатывать не только двухбайтовые числа, а числа любой длины.
7. Не знаю, как работает эмулятор, но PCHL я бы записал RgPC := RgHL.

Я бы реализовал эмулятор i8080 как конечный автомат: читается байт по смещению RgPC, интерпретируется, счетчик команд смещается на 1/2/3 байта, читается следующий код команды и т.д.
s-andriano вне форума Ответить с цитированием
Старый 17.07.2012, 21:53   #7
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
2. Попытка один в один переписать с языка низкого уровня на язык высокого уровня изначально обречена на провал - не стоит и пытаться этого делать. Единственный, на мой взгляд, вариант - интерпретация кодов i8080.
У меня реализовываются оба варианта :
1.Загрузка кодов в память (т.е. массив байтов 64килобайта как ПК-01) и обрабатывается в "той" памяти как бы в памяти "ПК-01 Львов", считавает команды и выполняет их Дельфийскими процедурами такими как я приводил пример.

2. Этими же дельфийскими процедурами можно написать прямо программу как программу в дельфи .
Цитата:
Сообщение от s-andriano Посмотреть сообщение
3. Не понял, что такое "регистры очереди команд".
Считываешь в регистры очереди команд текущую команду и еще два байта, так как команды могут быть 1,2,3 байтовые и передаешь в процедуру обработки команды, пусть она "раслебывается" (в зависимости от первого байта ) нужны ли ей второй и трейтий байт...
Цитата:
Сообщение от s-andriano Посмотреть сообщение
4. Команда ADCB реализована неверно - она также должна устанавливать (или сбрасывать) флаг переноса.... 5. Аналогично SBBB....
Ну блин... :-) Я специально удалил из команд все лишнее (перед тем как выложить на форум) чтобы не отвлекало!!!! Есть там процедура установки флагов (и увеличиние счетчика) во всех командах которые необходимо чтобы они устанавливали флаги!
ТЫ МНЕ СКАЖИ, САМО, ОСНОВНОЕ ДЕЙСТИВЕ В КОМАНДЕ Верно?... Или нет?...
Цитата:
Сообщение от s-andriano Посмотреть сообщение
7. Не знаю, как работает эмулятор, но PCHL я бы записал RgPC := RgHL.
Программы неиспользующие "подозрительных" на неправильность работы команд (т.е. и этих что я писал) РАБОТАЮТ НОРМАЛЬНО! А вот запуск ПЗУ - неработает!
Цитата:
Сообщение от s-andriano Посмотреть сообщение
Я бы реализовал эмулятор i8080 как конечный автомат: читается байт по смещению RgPC, интерпретируется, счетчик команд смещается на 1/2/3 байта, читается следующий код команды и т.д.
Ну и такое есть, как я писал уже, (выше в этом сообщение), но и эмуляторы такие тоже есть, а я хотел пойти бы дальше... чтобы можно было бы прям в дельфи писать проги, вот такими вот процедурами, а в дальнейшем развивать это. После написать отдельный компилятор в маш коды КР580 ПК-01 Львов, программу написанную в дельфи среде. Пускай для начала даже мнемокодами КР580 (в виде дельфи процедур)...
sas9568635 вне форума Ответить с цитированием
Старый 17.07.2012, 22:09   #8
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

Вот ссылка http://sas.forumbb.ru/viewtopic.php?id=290 на мой форум, где описание и черновой готовый модуль с примерами, скачивайте и рассматривайте. Там черновик модуля не один, поэтому скачивате последний...
вот этот:
вспомогательный модуль для среды Дельфи,
с возможностью компилирования программ
в машинные коды ПК-01 Львов.
.............
Доработанный модуль с примером игрой «Пьяный лифтер»
и предыдущими примерами
http://file.oboz.ua/download.php?fid=138217
sas9568635 вне форума Ответить с цитированием
Старый 21.07.2012, 16:47   #9
sas9568635
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 18
По умолчанию

Существует процедура задержки (часть кода из нее)
Код:
while w2 > w1 do
begin
Application.ProcessMessages;
w1:= RDTSC;
end;
Что нужно поместить в цикл, чтобы уменьшить загрузку процессора?... т.е. вроде как отдавать ненужные промежутки времени процессору (другим программам)
sas9568635 вне форума Ответить с цитированием
Старый 21.07.2012, 22:16   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от sas9568635 Посмотреть сообщение
Что нужно поместить в цикл, чтобы уменьшить загрузку процессора?... т.е. вроде как отдавать ненужные промежутки времени процессору (другим программам)
Чудес не бывает - ничего другого не получится.
Программа будет грузить 100% одного ядра, отдавать время другим процессам не получится, и, хуже того, даже это не обеспечит стабильность временных интервалов.
Любой квант времени, который Вы захотите отдать, будет лежать в интервале от нескольких до нескольких десятком мс, в худшем случае достигая сотен. Учитывая, что в i8080 время выполнения короткой команды составляет 0.0016 мс, такие интервалы выглядят совершенно неприемлемыми.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветуйте среду разработки blacktener Софт 10 18.04.2011 15:18
Среду разработки C++ программ. firephenix Помощь студентам 6 17.04.2011 12:13
Какую среду разработки посоветуете для новичка? yura_zb Общие вопросы C/C++ 3 25.02.2011 00:01
среду разработки Chrome IDE CPU Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.01.2009 11:40