nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 10:38



Reply to topic  [ 97 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7
Программная модель Intel 8080/КР580ВМ80А 
Author Message
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано (линк с первой страницы топика):
http://nedopc.cvs.sourceforge.net/viewv ... iew=markup

Shaos, покажи отсюда пример, как это у тебя сделано, а то мне сейчас надо dll-ку написать, где должно быть разделение переменных для разных процессов, а я что-то этот момент подзабыл... :osad:

Code:
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:
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;

_________________
:dj: https://mastodon.social/@Shaos


13 Feb 2016 10:36
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Спасибо! Похоже я чисто по старой памяти и по аналогии сделал всё же правильно.
По крайней мере два экземпляра троичного счетчика на одной dll-ке работают нормально... :kruto:

Меня просто aav8 немного спугнул...
aav8 wrote:
Некоторые особенности и мысли по поводу модели x80:
В проекте можно использовать только один проц.

_________________
iLavr


13 Feb 2016 10:47
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos, и если тебе не трудно, расскажи из собственного опыта, как C или С++ проект грамотно разграничивается на отдельные файлы?

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

В чем там основная идея, когда разбивают проект на отдельные файлы? И важна ли какая-то последовательность?

_________________
iLavr


13 Feb 2016 22:01
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Основная идея чтобы не собирать всё каждый раз когда надо перекомпилировать весь проект - если куча маленьких файлов, то пересобираться будет только то, что изменилось (если через среду разработки собирать или через MAKE) - существенно быстрее будет. Сопутствующая идея - если над проектом работают несколько людей народу, то логичнее, чтобы каждый ковырял свой файл, не наступаю друг-другу на пятки. Ну и в случае стягивания за уши разных вещей - типа сторонние либы и.т.д. оно как бы само напрашивается чтобы было в разных файлах. Для сей как правило тела функций сидят в c-файлах, а объявления функций (а также макросы, объявления типов и структур) в h-файлах (для C++ это cpp и h).

_________________
:dj: https://mastodon.social/@Shaos


13 Feb 2016 22:21
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post Re:
Shaos wrote:
делай структурки (или классы) и динамически создавай экземпляры объекта
у меня вот так было сделано
Code:
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


25 Oct 2017 15:50
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
В общем, как мне кажется, кратко и понятно написано здесь:
http://www.c-cpp.ru/books/operatory-u

Более развернуто изложено вот здесь:
http://www.forum.crossplatform.ru/index.php?showtopic=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


30 Oct 2017 15:16
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
.
В этой теме обсуждали, что из программ не будет работать без команды DAA. Большинство игр Специалиста точно будет работать (т.к команда DAA там обычно не нужна). Но часть системных программ, может быть даже большинство, не будет работать.

Это зависит ещё и от того какое ПЗУ стоит. В отличие от иностранных программ в отечественных самодельных ЭВМ (т.е МИКРО-80, РК86, Специалист и ОРИОН) программисты-любители, увы, не догадались как сделать самую короткую реализацию печати HEX-числа. Потому в МИКРО-80 и во всех последующих самоделках подпрограмма HEX_A (F815) в ROM-BIOS содержала вот такую цепочку:
Code:
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:
NIBBLE: AND     0FH          ; неоптимальный вариант
        CP      10
        JP      NC,NBL_1
        ADD     A,30H
        JP      SCOUTA
       
NBL_1:  ADD     A,37H
        JP      SCOUTA

А вот в иностранных CP/M-программах написанных, естественно, профессионалами применяются два других, намного более оптимальных варианта:
Code:
NIBBLE: AND     0FH         ; короткий и понятный
        CP      10
        CCF
        ADC     A,30H
        DAA
        JP      SCOUTA

Code:
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:
SCOUTA: PUSH    BC
        LD      C,A
        CALL    CONOUT
        POP     BC
        RET

А полная подпрограмма HEX_A имеет вид:
Code:
HEX_A:  PUSH    AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL    NIBBLE
        POP     AF
NIBBLE: AND     00001111B
        CP      10
        CCF
        ADC     A,30H
        DAA
        JP      SCOUTA



17 Oct 2018 23:17
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 97 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7

Who is online

Users browsing this forum: newold86 and 18 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:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.