Форум по 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)
Вопрос:
Возможно ли транслирование структуры ассемблера с вот такими вот особенностями которыми обладает почти все Асм-программы в структуру Дельфи?.. Какие конструкции мне необходимо знать?
Ответить с цитированием
  #7  
Старый 17.07.2012, 16:21
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

1. Exit
2. label / goto
3. не знаю что это
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
sas9568635 (05.09.2013)
  #8  
Старый 17.07.2012, 19:41
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

1 см выше
2 см выше
3 Call - по сути вызов подпрограммы (процедуры), поэтому обращение происходит по имени процедуры, т.е. Call XXXX можно заменить некоей SomeProcedure, параметры процедуры (если они есть) размещаются перед вызовом Call XXXX в соответствующих регистрах, на стеке или адресах, согласно соглашению о вызовах (стандартный для Delphi sdcall), jmp по сути тот же GOTO (см. п. 2 выше)
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Этот пользователь сказал Спасибо cotseec за это полезное сообщение:
sas9568635 (05.09.2013)
  #9  
Старый 21.07.2012, 16:48
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию процедура задержки

Существует процедура задержки (часть кода из нее)
Код:
while w2 > w1 do
begin
Application.ProcessMessages;
w1:= RDTSC;
end;

Что нужно поместить в цикл, чтобы уменьшить загрузку процессора?... т.е. вроде как отдавать ненужные промежутки времени процессору (другим программам)
Ответить с цитированием
  #10  
Старый 21.07.2012, 17:03
MiraLaklamon MiraLaklamon вне форума
Новичок
 
Регистрация: 07.06.2012
Сообщения: 59
Версия Delphi: 6, 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от sas9568635
Существует процедура задержки (часть кода из нее)
Код:
while w2 > w1 do
begin
Application.ProcessMessages;
w1:= RDTSC;
end;

Что нужно поместить в цикл, чтобы уменьшить загрузку процессора?... т.е. вроде как отдавать ненужные промежутки времени процессору (другим программам)
Код:
Sleep(100)
где 100 - пауза в миллисекундах.
Ответить с цитированием
Этот пользователь сказал Спасибо MiraLaklamon за это полезное сообщение:
sas9568635 (05.09.2013)
  #11  
Старый 23.07.2012, 10:19
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Какой самый быстрый (но и простой) способ вывода (поточечной) графики на форму?... быстрее, чем через Timage,TPaintBox и Tbitmap? Последнее что я использую это Tbitmap, а можно ли еще быстрее?... как-то напрямую в форму что-ль? У меня для быстроты вывода выводится графика через матрицу маленьких Tbitmap..
Подобное вот такому, в цикле:

Код:
MasTbitmaps[TekBitmapsX,TekBitmapsY].Canvas. Pixels[TekPixVBitmapsX,TekPixVBitmapsY]:=p1; //точка
………………….
EkranLvovMainForm.Canvas.Draw(TekBitmapsX*kolvoPixV1EkraneX, TekBitmapsY*kolvoPixV1EkraneY,
MasTbitmaps[TekBitmapsX,TekBitmapsY]);
………………….
Когда надо перечертить весь массив битмапов, тогда вот так:

Код:
Procedure RefreshAllBitMap;// Перечертить все битмапы
var X,Y:Byte;
Begin
For y:=0 to KolvoTbitmapsY-1 do begin
For x:=0 to KolvoTbitmapsX-1 do begin
EkranLvovMainForm.Canvas.Draw(X*kolvoPixV1EkraneX,
Y*kolvoPixV1EkraneY,
MasTbitmaps[X,Y]);
                                end;
                                end;
Ответить с цитированием
  #12  
Старый 23.07.2012, 16:38
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

вложение – пример как можно Pixels ускорить bitmap.scanline-ом

а что нибудь уже играбельно на этом эмуляторе?
Вложения
Тип файла: zip scanline.zip (1.8 Кбайт, 6 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
sas9568635 (27.07.2012)
  #13  
Старый 27.07.2012, 13:54
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
а что нибудь уже играбельно на этом эмуляторе?
Пока все косо-криво т.е. неверно реализованне (с ошибками) некоторые команды КР580... недореализованы порты ввода вывода... и т.д. но я думаю концовка одна : Рано или поздно все будет сделано вопрос времени :-) а пока - ЛЕТО ! :-)
Ответить с цитированием
  #14  
Старый 04.08.2012, 16:22
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всех кого интересует этот проект могут скачать очередной черновик
Вспомогательный модуль для среды Дельфи, с возможностью компилирования программ в машинные коды ПК-01 Львов версия 0.03
http://sas.forumbb.ru/viewtopic.php?id=290#p2104
Ответить с цитированием
  #15  
Старый 19.12.2012, 19:03
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Уважаемые форумчане!
Уже не знаю как и вопрос задать... :-) а также незнаю что искать:-)
вообщем...
Каким образом можно быстро и грамотно «распознавать» текст (код) языка паскаля (дельфи)?... т.е. я было начал писать подобное...
если «program» тогда ...
если «uses» тогда ...
если «Var» тогда... пробелы, табы, вводы - пропустить... «вычислить» переменную.... пробелы, табы, вводы, пропустить... ожидать... либо запятую... либо двоеточие... о господи:-), если еще одна переменная опять повторить - пробелы, табы, вводы пропустить... а предыдущие переменные «помнить» так как их тип будет указан после двоеточия... а также после указания типа возможно еще «=значение» и т.*д.
Вообщем, у меня началось головокружение... :-)
Вот и подумал, может существует какой-то более простой способ «распознавания» этого всего страхомудия!?.. иль кто подскажет что мне необходимо искать в инете для реализации этого?!... а может вообще готовый модуль существует подточенный под распознавание паскаля?!...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter