Программная модель Intel 8080/КР580ВМ80А

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Re:

Post by Shaos »

Lavr wrote:
Shaos wrote:делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано (линк с первой страницы топика):
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup
Shaos, покажи отсюда пример, как это у тебя сделано, а то мне сейчас надо dll-ку написать, где должно быть разделение переменных для разных процессов, а я что-то этот момент подзабыл... :osad:

Code: Select all

class BlahBlah
{
  int internal_var;
public:
  int A,B,C;
  BlahBlah(){A=B=C=0;}
};

и где-то по ходу пьесы:

BlahBlah* blah = new BlahBlah();
...
int R = blah->A + blah->B;
...
delete blah;

или как локальную переменную объект создавать:

BlahBlah blah;
...
int R = blah.A + blah.B;
это C++, а если надо на голом C, то так:

Code: Select all

typedef struct _BlahBlah
{
 int internal_var;
 int A,B,C;
} BlahBlah;

void init_BlahBlah(BlahBlah *this)
{
  this->A = this->B = this->C = 0;
}

и далее где-то в недрах твоей программы:

BlahBlah* blah = (BlahBlah*)malloc(sizeof(BlahBlah));
if(blah!=NULL) init_BlahBlah(blah);
...
int R = blah->A + blah->B;
...
free(blah);

как локальную переменную на C тоже можно:

BlahBlah blah;
init_BlahBlah(&blah);
...
int R = blah.A + blah.B;
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

Спасибо! Похоже я чисто по старой памяти и по аналогии сделал всё же правильно.
По крайней мере два экземпляра троичного счетчика на одной dll-ке работают нормально... :kruto:

Меня просто aav8 немного спугнул...
aav8 wrote:Некоторые особенности и мысли по поводу модели x80:
В проекте можно использовать только один проц.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

Shaos, и если тебе не трудно, расскажи из собственного опыта, как C или С++ проект грамотно разграничивается на отдельные файлы?

Я вот тут расписывал чужой проект, разбитый на отдельные файлы, и вроде идеология какая-то просматривалась.
Но потом встретил пару чужих проектов, где всё это было свалено в одну кучу, и что-то смысл разбиения потерялся... :osad:
И проект, разбитый на файлы, и проект, где один .cpp и один .h компилятся в общем-то нормально.

В чем там основная идея, когда разбивают проект на отдельные файлы? И важна ли какая-то последовательность?
iLavr
User avatar
Shaos
Admin
Posts: 24078
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Shaos »

Основная идея чтобы не собирать всё каждый раз когда надо перекомпилировать весь проект - если куча маленьких файлов, то пересобираться будет только то, что изменилось (если через среду разработки собирать или через MAKE) - существенно быстрее будет. Сопутствующая идея - если над проектом работают несколько людей народу, то логичнее, чтобы каждый ковырял свой файл, не наступаю друг-другу на пятки. Ну и в случае стягивания за уши разных вещей - типа сторонние либы и.т.д. оно как бы само напрашивается чтобы было в разных файлах. Для сей как правило тела функций сидят в c-файлах, а объявления функций (а также макросы, объявления типов и структур) в h-файлах (для C++ это cpp и h).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re:

Post by Lavr »

Shaos wrote:делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано

Code: Select all

class BlahBlah
{
  int internal_var;
public:
  int A,B,C;
  BlahBlah(){A=B=C=0;}
};

и где-то по ходу пьесы:

BlahBlah* blah = new BlahBlah();
...
int R = blah->A + blah->B;
...
delete blah;

или как локальную переменную объект создавать:

BlahBlah blah;
...
int R = blah.A + blah.B;
Shaos, а что бы почитать на эту тему, чтобы мне самому было более понятно, что делаю?
Что-нибуть не очень заумное...

Или хотя бы на какую тему погуглить, а то я часа три потратил - ничего подходящего не попалось.


P.S. Вот, к примеру, вот здесь - по делу, или не по делу написано? http://purecodecpp.com/archives/2286
В комментах к этому материалу его раскритиковали и обхрюкали... :-?
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Программная модель Intel 8080/КР580ВМ80А

Post by Lavr »

В общем, как мне кажется, кратко и понятно написано здесь:
http://www.c-cpp.ru/books/operatory-u

Более развернуто изложено вот здесь:
http://www.forum.crossplatform.ru/index ... topic=2555
Здесь рекомендована популярная литература.

Если её читать некогда, то можно "поумнеть" здесь: 8)
http://math.msu.su/~vvb/2course/Borisenko/Lect01.html
http://itedu.ru/courses/cpp/oop-in-cpp
http://mycpp.ru/cpp/book/c13.html
Г.Остер wrote:Чтоб дело мастера боялось, он знает много страшных слов! :wink:
Поскольку времени немного, я вкратце матом объясню...
iLavr
User avatar
barsik
Doomed
Posts: 585
Joined: 19 Feb 2017 03:46
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь

п/п-ммы HEX-печати в отечественных и иностранных программах

Post by barsik »

.
В этой теме обсуждали, что из программ не будет работать без команды DAA. Большинство игр Специалиста точно будет работать (т.к команда DAA там обычно не нужна). Но часть системных программ, может быть даже большинство, не будет работать.

Это зависит ещё и от того какое ПЗУ стоит. В отличие от иностранных программ в отечественных самодельных ЭВМ (т.е МИКРО-80, РК86, Специалист и ОРИОН) программисты-любители, увы, не догадались как сделать самую короткую реализацию печати HEX-числа. Потому в МИКРО-80 и во всех последующих самоделках подпрограмма HEX_A (F815) в ROM-BIOS содержала вот такую цепочку:

Code: Select all

NIBLE:  AND     0FH			; отечественный вариант (из ПЗУ РК86 и ОРИОНА)
        CP      10
        JP      M, NBL_1
        ADD     A, 7
NBL_1:  ADD     A, 30H
        JP      SCOUTA

Это чисто отечественное изобрЕтение, в импортных программах такого не найдешь. Очевидно эту процедуру последовательно заимствовали из МИКРО-80, не пытаясь написать что-то лучше. А в некоторых играх РК86 я встречал совсем неудачный алгоритм HEX_A размером ещё раза в 3-4 больше. В некоторых отечественных программах встречается и другой, еще более неоптимальный вариант (аж 12 байтов):

Code: Select all

NIBBLE: AND     0FH 			; неоптимальный вариант
        CP      10
        JP      NC,NBL_1
        ADD     A,30H
        JP      SCOUTA
        
NBL_1:  ADD     A,37H
        JP      SCOUTA

А вот в иностранных CP/M-программах написанных, естественно, профессионалами применяются два других, намного более оптимальных варианта:

Code: Select all

NIBBLE: AND     0FH			; короткий и понятный
        CP      10
        CCF
        ADC     A,30H
        DAA
        JP      SCOUTA

Code: Select all

NIBBLE: AND     0FH			 ; короткий из DDT
        ADD     A,90H
        DAA
        ADC     A,40H
        DAA
        JP      SCOUTA

Первый из этих вариантов стал чуть-чуть известен в СССР после публикации (примерно в 1987) в болгарском журнале "Компьютер за Вас" статьи "Шесть байтов HEXPRINT", где он был приведён. Но увы, стал известен лишь немногим, т.к выписывали журнал единицы (в том числе и я). Второй вариант впервые применён в DDT в 1977 и часто встречается в других программах CP/M.

Как видите, если не считать маскирование ниббла и команду для вывода, то вражеские варианты занимают всего по 6 байтов, а два неоптимальных отечественных - по 9 и по 12 байтов, т.е они соответственно аж в 1.5 и 2 раза длиннее. Очевидно это получилось из-за того, что неизвестный отечественный автор, кто писал монитор МИКРО-80 в 1981 году, ещё не знал, как с пользой использовать команду DAA.

Естественно, когда я модернизировал ПЗУ РК86, Специалиста и ОРИОНА, я выигрывал 3 байта применяя короткую импортную процедуру HEX_A. Подпрограмма HEX_A часто используется и при реализации подпрограммы десятичной печати (например в бейсике). Отечественный Бейсик (что производный от бейсика Билла), кстати, тоже использует DAA.

Но если не считать такой пользы от DAA, то вообще-то десятичная арифметика совсем низачем не нужна и без DAA вполне можно обойтись. Хотя есть некоторые антикварные процессоры, где арифметические команды, поставив десятичный флаг, можно заставить считать в двоично-десятичном виде. А в Intel сделали умнее, ограничились командой DAA и флагом нибблового переноса.

P.S. Подпрограмма SCOUTA (Saved ConOUT from A) в случае РК86, где подпрограмма CONOUT (F809) не портит регистры, имеет вид:

Code: Select all

SCOUTA: PUSH    BC
        LD      C,A
        CALL    CONOUT
        POP     BC
        RET

А полная подпрограмма HEX_A имеет вид:

Code: Select all

HEX_A:  PUSH    AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL    NIBBLE
        POP     AF
NIBBLE: AND     00001111B
        CP      10
        CCF
        ADC     A,30H
        DAA
        JP      SCOUTA