|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
|||
|
|||
Вот получил один ответ правда с припиской "КАЖЕТСЯ ТАК". Верно ли реализована команда в ЭТОМ примере?...
======================== Данная команда преобразует двоичное число в аккумуляторе в его двоично-десятичное представление. 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
|
|||
|
|||
Следом вопрос: А как устанавливается Флаг Ас в 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
|
|||
|
|||
Цитата:
НЕПОЙМУ С ЧЕМ ЭТО СВЯЗАНО! Броузер ОПЕРА Версия: 11.64 Сборка: 1403 Платформа: Win32 Система: Windows XP |
#5
|
||||
|
||||
Цитата:
Далее подобные вопросы и прочий оффтоп пиши в личку. |
Этот пользователь сказал Спасибо Admin за это полезное сообщение: | ||
sas9568635 (05.09.2013)
|
#6
|
|||
|
|||
При переводе программ написанных в Маш.кодах (в частоности КР580) в структуру Дельфи…
структура ассемблера не позволяет перевести (транслировать) такие программы так как в структуре ассемблера: 1 .есть «досрочный» выход из процедуры минуя end, a Ret может располагаться где угодно, а также даже не однин «хвост» окончания одной процедуры… 2. есть вход в середину процедуры по метке перехода, что не позволяет среда Дельфи. 3. Также на одну метку в ассемблере возможен переход как на процедуру (Call) так и «обычный» переход (Jmp) Вопрос: Возможно ли транслирование структуры ассемблера с вот такими вот особенностями которыми обладает почти все Асм-программы в структуру Дельфи?.. Какие конструкции мне необходимо знать? |
#7
|
|||
|
|||
1. Exit
2. label / goto 3. не знаю что это |
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
sas9568635 (05.09.2013)
|
#8
|
||||
|
||||
1 см выше
2 см выше 3 Call - по сути вызов подпрограммы (процедуры), поэтому обращение происходит по имени процедуры, т.е. Call XXXX можно заменить некоей SomeProcedure, параметры процедуры (если они есть) размещаются перед вызовом Call XXXX в соответствующих регистрах, на стеке или адресах, согласно соглашению о вызовах (стандартный для Delphi sdcall), jmp по сути тот же GOTO (см. п. 2 выше) Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
sas9568635 (05.09.2013)
|
#9
|
|||
|
|||
процедура задержки
Существует процедура задержки (часть кода из нее)
Код:
while w2 > w1 do begin Application.ProcessMessages; w1:= RDTSC; end; Что нужно поместить в цикл, чтобы уменьшить загрузку процессора?... т.е. вроде как отдавать ненужные промежутки времени процессору (другим программам) |
#10
|
|||
|
|||
Цитата:
Код:
Sleep(100) |
Этот пользователь сказал Спасибо MiraLaklamon за это полезное сообщение: | ||
sas9568635 (05.09.2013)
|
#11
|
|||
|
|||
Какой самый быстрый (но и простой) способ вывода (поточечной) графики на форму?... быстрее, чем через 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
|
|||
|
|||
вложение – пример как можно Pixels ускорить bitmap.scanline-ом
а что нибудь уже играбельно на этом эмуляторе? |
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
sas9568635 (27.07.2012)
|
#13
|
|||
|
|||
Цитата:
|
#14
|
|||
|
|||
Всех кого интересует этот проект могут скачать очередной черновик
Вспомогательный модуль для среды Дельфи, с возможностью компилирования программ в машинные коды ПК-01 Львов версия 0.03 http://sas.forumbb.ru/viewtopic.php?id=290#p2104 |
#15
|
|||
|
|||
Уважаемые форумчане!
Уже не знаю как и вопрос задать... :-) а также незнаю что искать:-) вообщем... Каким образом можно быстро и грамотно «распознавать» текст (код) языка паскаля (дельфи)?... т.е. я было начал писать подобное... если «program» тогда ... если «uses» тогда ... если «Var» тогда... пробелы, табы, вводы - пропустить... «вычислить» переменную.... пробелы, табы, вводы, пропустить... ожидать... либо запятую... либо двоеточие... о господи:-), если еще одна переменная опять повторить - пробелы, табы, вводы пропустить... а предыдущие переменные «помнить» так как их тип будет указан после двоеточия... а также после указания типа возможно еще «=значение» и т.*д. Вообщем, у меня началось головокружение... :-) Вот и подумал, может существует какой-то более простой способ «распознавания» этого всего страхомудия!?.. иль кто подскажет что мне необходимо искать в инете для реализации этого?!... а может вообще готовый модуль существует подточенный под распознавание паскаля?!... |