Другое > Hard'n'Soft
Вспоминаем Turbo Pascal и решаем задачи на нём
<< < (15/15)
Deefrex:
Итоги минувших дней...

Но предварительно хотел бы рассказать, чем же именно я всё-таки занимаюсь.

Пару лет назад, когда я повторял Паскаль, чтобы программирование совсем уж не выветрилось из головы, меня посетила идея сделать маленькую консольную программку, которая могла бы хранить в себе и отображать ANSI-графику, а то уж совсем скучно было решать студенческие математические паскалевские задачи. Тогда я ещё не понимал, куда я в итоге вмазался. :lol:

Первым, казалось бы, решением проблемы, на которое я наткнулся, было PingAnsi v1.30: https://pascal.sources.ru/ansi/ansi_130.htm

На том сайте есть версия постарше (1.33) с дополнительным модулем, но я тогда остановился именно на ранней версии.

Первой проблемкой было уже то, что для успешной компиляции юнитов из комплекта и самой программки PingAnsi требовались модули из библиотеки "Turbo Professional" от компании TurboPower Software, последняя версия которой была выпущена в свет чёрт знает когда (ещё до официальной смерти самого Паскаля). Библиотеку в интернете я нашёл, нужные модули и объекты компилятору скормил.

Второй проблемкой стало то, что на финальном шаге я столкнулся с ошибкой 200 "Division by zero", которая осталась сейчас только на моём старом видео, что я тогда записывал (честно, пытался на днях повторить данную ошибку на виртуалке с Windows XP, и даже задирал в ВМ количество потребляемой оперативы до 2 ГБ - ошибка не повторяется, словно сама по себе куда-то бесследно испарилась, хотя ноут, на котором я всё это провожу, тот же самый).



В интернете тогда нагуглил, что данная ошибка впоследствии стала появляться на всех компьютерах, частота процессора которого превышала 200+ МЕГАГЕРЦ!!! :lol: И что для решения проблемы нужно скачать официальный фикс TPCrt от той же конторы.

Фикс я нашёл, TPCrt перекомпилировал, а вместе с ним и пару юнитов PingAnsi. Программа скомпилировалась и завелась!

Но вот незадача - оригинальный Borland Pascal компилирует программки в 16-битной разрядности, которые максимум могут запуститься в 32-битной системе. А мне бы хотелось, чтобы она запускалась и в 64-битной ОС тоже (для чего весь этот процесс и был начат).

Начался долгий, безумный, бессонный и мучительный перебор всевозможных 32-битных компиляторов Паскаля, большинство из которых останавливали обработку кода на тех же местах, как и в этом случае, что я публиковал на днях: https://www.emu-land.net/forum/index.php/topic,33894.msg1544016.html#msg1544016

Пример такой необработанной процедуры (красным помечен тот участок кода, который большинство 32-битных компиляторов вводил в состояние полнейшего ступора от того, что же за муть ему пытаются скормить):
procedure SetJump(var JumpDest : JumpRecord);
  inline(
    $5F/                     {pop di           ;di = Ofs(JmpDest)}
    $07/                     {pop es           ;es = Seg(JmpDest)}
    $26/$89/$25/             {mov es:[di],sp   ;save sp}
    $26/$89/$6D/$02/         {mov es:[di+2],bp ;save bp}
    $E8/$00/$00/             {call null        ;push IP onto stack}
                             {null:}
    $58/                     {pop ax           ;pop into ax}
    $05/$0C/$00/             {add ax,12        ;point to "next:"}
    $26/$89/$45/$04/         {mov es:[di+4],ax ;save jump offset}
    $26/$8C/$4D/$06);        {mov es:[di+6],cs ;save jump segment}
                             {next:}

Как мне ответили 2 года назад на форуме Lazarus, в левой части находится ассемблерный код для древних 8086 процессоров, и чтобы данный участок обработать их Фри Паскалем - нужно правую часть в комментариях правильно для компилятора оформить. Но как я ни пытался вчера всё это оформить...

И так:



И сяк:



Компиляция тупо не идёт.

Я понимаю, что в разделе Interface перед Implementation я много чего не описал, но основная проблема не в этом, а в том, что компилятор в принципе этот ассемблерный код не может обработать. А сам я язык ассемблера не знаю от слова совсем (можно, конечно, в теории и на его обучение потратить пару лет в свободное от работы время, но так же как и с Паскалем я на данный момент не вижу в этом смысла, да и до книг Дональда Кнута "Искусство программирования" в качестве развлечений пока ещё не добрался).

Единственным 32-битным компилятором, который обработал 8086 ассемблерный код, был TMT Pascal: http://old-dos.ru/files/file_1410.html (по ссылке, к примеру, есть неурезанная Multitarget-версия 2002 года с ключиком)

Но и тот в одном из юнитов сначала ругнулся на неправильно проставленную границу Implementation, а потом ещё на что-то (понятно, ведь юниты писались под 5 версию Borland / Turbo Паскаля, а тогда и синтаксис у языка, судя по всему, был ещё другой).

Тут ещё как-то кто-то писал: http://freepascal.ru/forum/viewtopic.php?f=1&t=42669#p154385
Насколько я помню древнюю историю Паскаля ( :-D ) TurboProfessional принципиально не работал ни в Windows режиме, ни в досовском защищённом.

Там и правда, ассемблера хоть одним местом ешь. И весь этот ассемблер рассчитан на:
- 16 бит;
- адресацию база+смещение.
поэтому что там может понадобиться в сегодняшнем программировании - тайна покрытая мраком. Тем более, что нынешний FPC, по сравнению с TurboPascal, позволяет делать очень много не лазая в какие-то сторонние коды.

На самом деле, как я выяснил, в 16-битном оригинальном Borland Pascal всё работало. На 32 битах такая программа работала. Проблема остро встала только при переходе на 64 бита, и, в принципе, она решаема там методом использования каких-либо DOSBox'ов, но всё равно костылями пользоваться неохота, учитывая ещё, что ТЫЖПРОГРАММИСТ!

И вчера я вспомнил, что 2 года назад я в итоге плюнул на это безблагодатное дело и начал искать другие варианты решения из своей внезапно из ниоткуда возникшей проблемы.

На том же сайте, где я в своё время вышел на PingAnsi, скачал решение под названием EmulAnsi: https://pascal.sources.ru/ansi/index.htm

Никакие модули из библиотеки "Turbo Professional" от TurboPower Software для EmulAnsi не требовались, т.е. всё работало со штатными средствами 7-го Борланда Никлаусовича Паскаля. Но им и ANSI-музыку (честно говоря, даже не знаю, что это) нельзя было завести, только графику. Мне, в принципе, только реализация графики в консоле и требовалась.

Единственный косячок там состоит в том, что автор EmulAnsi в своём модуле забыл указать глобальную переменную Coul2, которую впоследствии использовал в коде, но после её указания всё отлично компилируется и работает.

Также всё отлично скомпилировалось и в 32-битном Virtual Pascal (правда после предварительного скармливания ему Crt'хи и ряда запрашиваемых модулей из папок программы "vp21\sourse\rtl" и "vp21\sourse\w32").

После запуска программа на непонятном языке просила указать путь к ANSI-файлу, графику из которого требовалось отобразить.

После небольшой редактуры участка кода:
BEGIN
ClrScr;
Write ('Nom du fichier Ansi … afficher : ');
ReadLn (PathName);
Assign (Fichier, PathName);
{$I-}
Reset (Fichier);
{$I+}
If IOResult = 0 Then
   BEGIN
   While not Eof (Fichier) do
     BEGIN
     Read (Fichier, Caract);
     PrintChar_Ans (Caract);
     END;
   Close (Fichier);
   END
Else Writeln ('Fichier non trouv‚.');
END.

На (зелёным обозначил изменения)...
BEGIN
ClrScr;
PathName:='C:\vp21\progs\emulansi\LOGO.ANS';
Assign (Fichier, PathName);
{$I-}
Reset (Fichier);
{$I+}
If IOResult = 0 Then
   BEGIN
   While not Eof (Fichier) do
     BEGIN
     Read (Fichier, Caract);
     PrintChar_Ans (Caract);
     END;
   readln; // чтобы программа не закрывалась сразу же после запуска
   Close (Fichier);
   END
END.

Итоговая программа сразу же отобразила графику в консоли из указанного файла.

И только вчера до меня дошло, что как EmulAnsi, так и PingAnsi ранее (позже это подтвердилось) отображали графику из внешнего файла, а не из самой себя (типа зашитую графику в саму программку). Поэтому поставленная задача вроде как и была решена, а вроде как и нет (или не совсем).

Посему у меня после написания данного лонгрида осталось 2 острых вопроса:

1. Возможно ли в принципе зашить в саму программу подобного рода графику, используя ANSI-символы (ASCII-гра́фику же народ через те же wrtiteln'ы туда засовывает)?
2. Есть ли у кого-нибудь инвайт на Хабру, дабы поделиться там своей кулстори по сабжу?

Честно, после вчерашнего дня я вновь встал на черту очередного выгорания любимым делом. Ещё пару таких денёчков и я точно буду готов посвятить свою оставшуюся жизнь уже выпечке пиццы в соседнем ТЦ.

С другой стороны, хочу как можно скорее расквитаться с этим древним злом под названием PASCAL и продвинуться уже куда-нибудь на уровень повыше.

Весь оставшийся код для СВОЕЙ желаемой программы у меня уже написан, даже сделана привязка к системному времени. Осталась вот единственная наполовину нерешённая задача.
Sharpnull:

--- Цитата: Deefrex от 30 Ноябрь 2022, 13:59:31 ---Компиляция тупо не идёт.
--- Конец цитаты ---
Похоже для ASM вы используете Intel синтаксис, а по умолчанию AT&T. В примерах пишут {$asmMode intel} для выбора Intel.
Deefrex:
Sharpnull, спасибо. В принципе, мне уже всё равно в данном случае на этот процессорный синтаксис. Я нашёл другое решение для своей проблемы. Оставшийся вопрос немного из другого направления.
Навигация
Главная страница сообщений
Предыдущая страница

Перейти к полной версии