PC-01 Lviv

It is currently 29 Apr 2024, 12:25

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 215 posts ]  Go to page Previous 1 2 3 4 5 615 Next
Author Message
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 09 Jun 2012, 11:10 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Какие и как правильно и грамотно использовать логические операции для написания процедуры по установке отдельного флага .
Вот допустим надо написать процедура для установки флага Z

var
RgA: byte;
//=Hi(RgPSW) absolute RgPSW
RgF: byte; //=Lo(RgPSW) absolute RgPSW
RgPSW: word absolute RgA;

Procedure SetFlagZ(f:Boolean);
// установить флаг
begin
if f then RgF:=
как дальше? если по умному
end;

как дальше? если по умному...


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 09 Jun 2012, 13:01 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Правильно ли реализованы процедуры и функции установки и чтения флагов
Code:
 //  RgPSW: word absolute RgA      RgF:   byte;
  	                        // Флаги: 7 6 5 4 3 2 1 0
        			//        S Z  Ac   P   C
// устновить флаг
Procedure SetFlagS(f:Boolean); begin if f then RgF:=RgF or 128 else RgF:=RgF and 128;end;
Procedure SetFlagZ(f:Boolean); begin if f then RgF:=RgF or 64 else RgF:=RgF and 64;end;
Procedure SetFlagAc(f:Boolean); begin if f then RgF:=RgF or 16 else RgF:=RgF and 16;end;
Procedure SetFlagP(f:Boolean); begin if f then RgF:=RgF or 4 else RgF:=RgF and 4;end;
Procedure SetFlagC(f:Boolean); begin if f then RgF:=RgF or 1 else RgF:=RgF and 1;end;
// Чтение флага
Function FlagS_:Boolean;begin if (RgF and 128) =128 then FlagS_:=true else FlagS_:=false; end;
Function FlagZ_:Boolean;begin if (RgF and 64) = 64 then FlagZ_:=true else FlagZ_:=false; end;
Function FlagAc_:Boolean;begin if (RgF and 16) = 16 then FlagAc_:=true else FlagAc_:=false; end;
Function FlagP_:Boolean;begin if (RgF and 4) = 4 then FlagP_:=true else FlagP_:=false; end;
Function FlagC_:Boolean;begin if (RgF and 1) = 1 then FlagC_:=true else FlagC_:=false; end;


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 09 Jun 2012, 14:14 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Непойму как работает флаг….

- FC’ – флаг вспомогательного переноса
Если при получении результата возник перенос из третьего в четвертый разряд, то единица записывается в ячейку флага вспомогательного переноса (1→FC’).

Другими словами это как?...
Если если в третьем разряде была «1» и она перенеслась… или если то что было в третьем разряде стало четвертым?...
А математическими или логическими функциями это можно выразить:
Например двоичное 111 = дес 7
Если прибавили 1 то стало = двоичное 1000 = дес 8
Это и считаеться «возник перенос из из третьего в четвертый разряд», флаг
- FC’ – становиться равным «1»?


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 09 Jun 2012, 14:28 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Quote:
- FC’ – флаг вспомогательного переноса
Если при получении результата возник перенос из третьего в четвертый разряд, то единица записывается в ячейку флага вспомогательного переноса (1→FC’).
Произошел перенос из младшей в старшую тетраду, так вроде бы. Разряды считаются от нуля.

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 05:15 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Quote:
А как такое реализовать? Что это вообше такое?..
DAA |Десятичная| |коррекция | | Преобразование содержимого аккумулятора в двоично-десятичный код.
"перепили" на паскаль и будет тебе счастье (хоть по исходнику, хоть по аттачу):
Attachment:
File comment: результат генерации кода
i8080_hc.zip [8.44 KiB]
Downloaded 352 times
Если не ошибаюсь, поиск/замена есть во всех редакторах.


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 13:35 
Offline

Joined: 29 Mar 2012, 21:35
Posts: 115
Quote:
Правильно ли реализованы процедуры и функции установки и чтения флагов
Ошибочная ветвь else, надо бы так:
Code:
// устновить флаг
Procedure SetFlagS(f:Boolean); begin if f then RgF:=RgF or 128 else RgF:=RgF and (255-128);end;
Procedure SetFlagZ(f:Boolean); begin if f then RgF:=RgF or 64 else RgF:=RgF and (255-64);end;
Procedure SetFlagAc(f:Boolean); begin if f then RgF:=RgF or 16 else RgF:=RgF and (255-16);end;
Procedure SetFlagP(f:Boolean); begin if f then RgF:=RgF or 4 else RgF:=RgF and (255-4);end;
Procedure SetFlagC(f:Boolean); begin if f then RgF:=RgF or 1 else RgF:=RgF and (255-1);end;


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 14:25 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
Quote:
Правильно ли реализованы процедуры и функции установки и чтения флагов
Ошибочная ветвь else, надо бы так:
Спасибо! Рассмотрю! Еще не проверял на запуск и использование....
Вот еще вопрос...
Я так и не понял... хоть по исходникам... хоть по документациям...
Какой смысл флагу Ac- дополнительный перенос? (4бит, регистра RgF ) 1-произошел перенос между тетрадами байта,// 0-нет переноса.
Бегло посмотрел все команды, делал поиск по описанию не видел его использования(точнее влияние на что либо)... в условных переходах его использования тоже нет... Что дает (что должна давть ) его установка в 1 или 0 другим командам или флагам?
Я так понял эмулируя команды КР580 командами (функциями и процедурами) Паскаля может его вообще не использовать?


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 15:14 
Offline

Joined: 29 Mar 2012, 21:35
Posts: 115
Quote:
Какой смысл флагу Ac- дополнительный перенос?
Выше ты спрашивал, как сделать команду DAA. Так вот, именно для этой команды и нужен этот флаг, и больше нигде.

Команда DAA производит десятичную коррекцию после сложения. Проще всего пояснить на примерах:

1. Складываем числа 15h и 16h, они шестнадцатиричные, но их можно считать и десятичными 15 и 16. В сумме должно быть 31. Но если их сложить командой ADD, то получится 15h + 16h = 2Bh, т.е. младший нибл (цифра) не соответствует десятичной системе. Если сразу после ADD выполнить DAA, то она добавит каждой такой цифре цифру 6. Т.е. 2Bh + 06h = 31h

2. Другой вариант: 18h + 19h = 31h. Тут вроде обе цифры десятичные, но результат-то неверный, должно быть 37. Так вот тут тоже надо добавить 6, а признаком этого будет установленный флаг дополнительного переноса AC (т.к. 8h + 9h = 11h).

Обычный перенос тоже учитывается таким же образом, для старшей цифры.


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 15:52 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Пока я мало что понял, но это ПОКА…
Я наблюдал за состоянием флагов используя вот такие вот мелкие проги для проверки воздействия команд на флаги процессора, «прокручивая» их пошагово.. меняя загрузочные константы для A,B…
Code:
     BeginAddres=$8000
       RunAddres=$8000
MVI B, 1
MVI a,250
ADD B
jmp $8004
заметил, что при +1 когда число становиться равным $10, $20, $30… т.е кратным Dec 16, тогда и срабатывает это флаг…
если при + N, тогда он срабатывает при «перескоке» этих же чисел…
Но как это реализовать пока не пойму…
Но дело даже не в этом…
Если я подойду к вопросу так: оставлю этот флаг (- FC’) и эту команду (DAA) «на потом», а может и вообще забуду про них.. :-)
Больше, при реализации других команд, нигде я не столкнусь в необходимости реализации флага - FC’ ? …ну и DAA?


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 16:19 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
Ошибочная ветвь else, надо бы так:
Совершенно верно! Еще раз Спасибо! :D :D :D


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 17:42 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Quote:
Если я подойду к вопросу так: оставлю этот флаг (- FC’) и эту команду (DAA) «на потом», а может и вообще забуду про них.. :-)
Больше, при реализации других команд, нигде я не столкнусь в необходимости реализации флага - FC’ ? …ну и DAA?
Код работать не будет, т.к. это используется.
я даже скажу больше - используется конкретный порядок флагов в регистре состояния. в своё время, когда я писал эмулятор, я сделал их "как попало" (т.к. информации о формате регистра состояния у меня нигде не было, интернета тогда тоже не было, а все книги, доступные мне, об этом умалчивали). потом то конечно мне сказали, что 8080 совместим с 8086 в этом вопросе, но на глюки я и сам нарвался..... какая-то из программ не переключала видеорежимы, т.к. использовала этот факт и отправляла регистр состояния прямо в порт С2 (уже не помню какой именно последовательностью команд это осуществлялось).

а в чём проблема то - флаг посчитать?
если ((результат ^ операнд_1 ^ операнд_2) and 16) <> 0 тогда УстановитьФлаг(f_AC);


P.S. в конце-концов, всегда можно заюзать имеющееся железо и "отбрутить" табличку, которую потом использовать как справочник подстановки:
Code:
#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned char i, j, k;

    for (j=0; j < 16; j++) printf(" %2d", j);
    printf("\n---\n");

    for (i=0; i < 16; i++) {
        for (j=0; j < 16; j++) {
            k = 0;
            __asm {
                mov al, i
                mov ah, j
                add al, ah
                lahf
                mov k, ah
            }
            printf("  %d", (k & 16) != 0);
//          printf("  %d", ((i ^ j ^ (i+j)) & 16) != 0);
        }
        printf("  + %d\n", i);
    }
    return 0;
}


  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
---
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  + 0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  + 1
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  + 2
  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  + 3
  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  + 4
  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  + 5
  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  1  + 6
  0  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  + 7
  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  + 8
  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  + 9
  0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  + 10
  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  + 11
  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  + 12
  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  + 13
  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  + 14
  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  + 15


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 19:32 
Offline

Joined: 20 Apr 2012, 16:00
Posts: 372
Location: Конотоп
Quote:
Код работать не будет
Неужели все программы используют это?
Я для начала пытаюсь реализовать хоть какие-то команды которые работают правильно...
Вообще, то что я пишу, т.е. в "моей среде" лучше разрабатывать с нуля. Врядле можна будет без ручной обработки, дизПАСКАЛить программы львова "в мою среду" на прямую, т.к. структура асма и паскаля разные... но ради такого можно и вручную отредактировать асм-структуру под Пас-структуру... будет утилита - "тупой перевод" команд асмЛьвова в асмПаскаля, а дальше "ножницы" и "окутутывание" процедурами Паскаля, которые должны быть обязательно в "верху" и т.д.
вот пример:
Code:
program Test;
Procedure Proba;
begin
.......
end;
Label m1;
begin
   Proba;
       MVIB(1);
       MVIA(250);
m1:
        ADDB;
goto m1;
end.
Вот к такому виду надо будет приводить "тупо" дизпаскаленные программы ПК-01.
Зато какая ЛАФА редактировать и отрабатывать программу, целой Дельфи средой со всей ее мощью это можно только представить.... и кто бы, что не говорил, да никакой асм-отладчик не заменит такого!
Зря считают меня странным :-)
Quote:
..... какая-то из программ не переключала видеорежимы, т.к. использовала этот факт и отправляла регистр состояния прямо
Если изначально писать и поверять в моей среде, то такое врядле будет возможно...
Quote:
а в чём проблема то - флаг посчитать?
Да незнаю я Сишки, незнаю ! :-)
Расшифровывать еще надо то что на Си писанное... догадку подключать :-) пусть позже...


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 20:23 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Quote:
Quote:
..... какая-то из программ не переключала видеорежимы, т.к. использовала этот факт и отправляла регистр состояния прямо
Если изначально писать и поверять в моей среде, то такое врядле будет возможно...
если совместимость с существующим кодом даже не декларируется, то без проблем, только оговори это изначально.
Quote:
Quote:
а в чём проблема то - флаг посчитать?
Да незнаю я Сишки, незнаю ! :-)
Расшифровывать еще надо то что на Си писанное... догадку подключать :-) пусть позже...
такой вид устроит?
Code:
...
tmp := src1 + src2;
SetFlagAc(((src1 xor src2 xor tmp) and 16) <> 0);
dst := tmp;
это Паскаль... процедура тоже взята из твоего кода.


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 10 Jun 2012, 21:23 
Offline

Joined: 07 Dec 2010, 16:54
Posts: 227
Quote:
Неужели все программы используют это?
все или не все, а процессорный тест "чтобы был" не помешает:
Attachment:
File comment: тест Келли Смита
http://www.classiccmp.org/dunfield/r/test.asm

test.zip [19.21 KiB]
Downloaded 327 times


Top
   
 Post subject: Re: DprToLvt (PasToLvt)
PostPosted: 11 Jun 2012, 00:19 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Quote:
Неужели все программы используют это?
Подкину уголька. Команда DAA в i8080 реализована с ошибкой, она неверно отрабатывает коррекцию после вычитания. В z80 эту багу исправили, что привело к частичной потере совместимости. Когда-то мне попадался отличный материал на эту тему, но сейчас ссылку найти не могу, поэтому ограничусь первым, что предоставил Гугль, т.е. ссылкой на форум "nedoPC" [Тест точности эмуляции 8080].
Quote:
Я для начала пытаюсь реализовать хоть какие-то команды которые работают правильно...
Вообще, то что я пишу, т.е. в "моей среде" лучше разрабатывать с нуля. Врядле можна будет без ручной обработки, дизПАСКАЛить программы львова "в мою среду" на прямую, т.к. структура асма и паскаля разные... но ради такого можно и вручную отредактировать асм-структуру под Пас-структуру... будет утилита - "тупой перевод" команд асмЛьвова в асмПаскаля, а дальше "ножницы" и "окутутывание" процедурами Паскаля, которые должны быть обязательно в "верху" и т.д.
Чё Вы там курите?
Quote:
вот пример:
Code:
program Test;
Procedure Proba;
begin
.......
end;
Label m1;
begin
   Proba;
       MVIB(1);
       MVIA(250);
m1:
        ADDB;
goto m1;
end.
Вот к такому виду надо будет приводить "тупо" дизпаскаленные программы ПК-01.
Зато какая ЛАФА редактировать и отрабатывать программу, целой Дельфи средой со всей ее мощью это можно только представить.... и кто бы, что не говорил, да никакой асм-отладчик не заменит такого!
Поставьте себя на минутку на место пользователя своего продукта. Это взрослый человек, с профессией, семьянин, т.е. вполне состоявщийся человек, так неужели он, улучив минутку, чтобы из ностальгических соображений выпилить что-то незатейливое (ибо затейливое под "Львов" уже никто и никогда писать не будет), будет забивать себе голову тем, как транслировать синтаксис ассемблера i8080 (с которым он последний раз имел дело лет двадцать назад) в синтаксис Дельфи, да еще и радоваться мощи редактора среды DELPHI XE2, которая сейчас стоит даже в STARTER EDITION 199 у.е.! За что все это?! Что мы Вам сделали плохого? На свете и без всего этого есть прекрасные бесплатные редакторы и целые IDE, которые не менее чудесно позволяют редактировать текст, существует уйма free трансляторов ассемблера z80, которые позволяют без проблем получать код для i8080... Что еще нужно? Ладно бы, Вы писали транслятор с какого-либо современного высокоуровнего языка в ассемблер i8080, но что мы сейчас видим, что за прелесть: "MVIB(1); MVIA(250);", - Господи, что это?! Стоп... Да там еще и goto используется! Рукалицо...

p.s. Еще материал про ошибку в реализации DAA.

upd. В книге А. Ларченко и Н. Родионова "ZX Spectrum & TR-DOS" нашел хорошее объяснение работы команды DAA.
Quote:
Пусть, например, нужно сложить два двоично-десятичных числа* 15 и 39 (00010101 и 00111001 соответственно).
Code:
LD A, %00010101
LD C, %00111001
ADD A,C ; A = %01001110
DAA ; A = %01010100
Согласно правилам двоичной арифметики в результате сложения в аккумулятор будет помещено число %4E, однако операция DAA скорректирует это значение, и конечный результат составит 54.

*В двоично-десятичных числах цифры от 0 до 9 кодируются четырьмя битами, причем комбинации 1010...1111 не используются. Таким образом в одном байте может быть записано только две цифры. Это расточительно с точки зрения экономии памяти, но гарантирует отсутствие ошибки "машинного" округления.

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 215 posts ]  Go to page Previous 1 2 3 4 5 615 Next

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Limited