Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Пишу среду разработки (Эмулятор)… (http://sas.forumbb.ru/viewtopic.php?id=290)
Правильно ли реализованы следующие процедуры:
Код:
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 на Дельфи, вот есть вырезки из СИ(которого я не знаю) и Асма, помогите транслировать в Дельфи конструкции или опишите пожалуйста каждую строку словами
Код:
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;

Вот асм реализация DAA
Код:
; DAA
C27:
  mov ax, [RgPSW]
  sahf
  daa
  lahf
  mov [RgPSW], ax
  ret
вот еще огрызок который мне пытались перевести на паскаль (Дельфи):
Код:
tmp := src1 + src2;
SetFlagAc(((src1 xor src2 xor tmp) and 16) <> 0);
dst := tmp;

Последний раз редактировалось Admin, 15.07.2012 в 18:33.
Ответить с цитированием
  #2  
Старый 15.07.2012, 18:24
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот получил один ответ правда с припиской "КАЖЕТСЯ ТАК". Верно ли реализована команда в ЭТОМ примере?...
========================
Данная команда преобразует двоичное число в аккумуляторе в его двоично-десятичное представление.
1. Если младшие 4 бита аккумулятора представляют число, которое больше 9, или если триггер вспомогательного переноса регистра признаков AC=1, то содержимое аккумулятора увеличивается на 6. В противном случае изменение не происходит.
2. Если старшие 4 бита аккумулятора представляют число, которое больше 9, или если триггер переноса (заема) регистра признаков CY=1, то старшие 4 бита аккумулятора увеличиваются на 6. В противном случае изменение не происходит.
Код:
Procedure DAA;
Var
  tmp : Word;
Begin 
  tmp:=RgA And $FF;
  If (((RgA And $F)>9) Or FlagAc) Then
  Begin
    Inc(tmp,6);
    SetFlagAc(True);
  End;
  If (((tmp And $F0)>$90) Or FlagC) Then
  Inc(tmp,$60);
 
  RgA:=Lo(tmp);
  SetFlagC((tmp And $100)<>0);
  SetFlagZ(RgA=0);
end;

Кажется так.
========================

Последний раз редактировалось Admin, 15.07.2012 в 18:33.
Ответить с цитированием
  #3  
Старый 15.07.2012, 18:28
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Следом вопрос: А как устанавливается Флаг Ас в True (False)?…
Вот моя процедура обработки флагов (заодно посмотрите пожалуйста правильно ли реализованы)…
Результат передается дважды в процедуру (см.пример вызов процедуры установки флагов SetAllFlags, из асм-команды ADDB для обработки результата как «округленный» типом Байт, и второй как Integer… стоит ли передавать два результата в процедуру?... Или может как-то по другому можно?....
Код:
Procedure SetAllFlags(ResByte:byte;ResInteger:Integer);// проверка результаустановка ВСЕХ флаго
var wremb,wremb1:byte;
begin
if (ResByte and 128)=128 then SetFlagS(true) else SetFlagS(False); //(7) S (sign - знак) - флаг знака.  Условия формирования:

If ResByte=0 then SetFlagZ(True) else SetFlagZ(False);// (6) Z (zero - ноль) - флаг нуля.  Условия формирования: //если результат операции <>0, то "0" FZ, если результат операции = 0, то 1FZ.

// (2)P - флаг четности.  Условия формирования: если результат операции чётный, то  1 FР, если результат операции нечётный, то  0?FР).//(Четный - это результат, в двоичном эквиваленте которого четное количество единиц).
wremb:=0;
if (ResByte and 128) =128 then wremb:=wremb+1; if (ResByte and 64) =64 then wremb:=wremb+1;
if (ResByte and 32) =32 then wremb:=wremb+1; if (ResByte and 16) =16 then wremb:=wremb+1;
if (ResByte and 8) = 8 then wremb:=wremb+1; if (ResByte and 4) = 4 then wremb:=wremb+1;
if (ResByte and 2) = 2 then wremb:=wremb+1; if (ResByte and 1) = 1 then wremb:=wremb+1;
if (wremb mod 2) = 0 then SetFlagP(True) else SetFlagP(False);

If (ResInteger>255) or (ResInteger<0) then SetFlagC(true) else SetFlagC(false);// (0) FC - флаг переполнения результата //Если при получении результата произошло переполнение в старшем седьмом разря-де,//то единица записывается в ячейку флага переполнения результата (1?FC).
end;//SetAllFlags(ResByte:byte;ResInteger:Integer);// проверка результаустановка ВСЕХ флагов


Procedure ADDB;// сложение
Begin
SetAllFlags(RgA+RgB,RgA+RgB);
RgA:=RgA+RgB;
end;
Админ: Пользуемся тегами для оформления кода!

Последний раз редактировалось Admin, 15.07.2012 в 18:34.
Ответить с цитированием
  #4  
Старый 15.07.2012, 18:47
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от sas9568635
Админ: Пользуемся тегами для оформления кода!
ТО АДМИН: У МЕНЯ ПОЧЕМУ-ТО НА ЭТОМ ФОРУМЕ ОНИ НЕ РАБОТАЮТ!!!
НЕПОЙМУ С ЧЕМ ЭТО СВЯЗАНО! Броузер
ОПЕРА
Версия: 11.64
Сборка: 1403
Платформа: Win32
Система: Windows XP
Ответить с цитированием
  #5  
Старый 15.07.2012, 19:06
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,564
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от sas9568635
ТО АДМИН: У МЕНЯ ПОЧЕМУ-ТО НА ЭТОМ ФОРУМЕ ОНИ НЕ РАБОТАЮТ!!!
НЕПОЙМУ С ЧЕМ ЭТО СВЯЗАНО! Броузер
ОПЕРА
Версия: 11.64
Сборка: 1403
Платформа: Win32
Система: Windows XP
Видимо жмешь не на те кнопки на клавиатуре, ибо у всех все работает.
Далее подобные вопросы и прочий оффтоп пиши в личку.
Ответить с цитированием
Этот пользователь сказал Спасибо Admin за это полезное сообщение:
sas9568635 (05.09.2013)
  #6  
Старый 17.07.2012, 15:49
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter