|
|
Регистрация | << Правила форума >> | 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) Вопрос: Возможно ли транслирование структуры ассемблера с вот такими вот особенностями которыми обладает почти все Асм-программы в структуру Дельфи?.. Какие конструкции мне необходимо знать? |