Автор Тема: Вспоминаем Turbo Pascal и решаем задачи на нём  (Прочитано 49298 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн supremacy

  • Пользователь
  • Сообщений: 2268
  • Пол: Мужской
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #270 : 15 Ноябрь 2022, 17:12:02 »
Мне кажется нет ни одного программиста который научился программированию на занятиях в ВУЗе, чаще всего это самостоятельное изучение языка. Если ты осознано пошёл учится на ИТ специальность, то ты уже умеешь программировать, и всё обучение сводится к сдаче лабораторных. Те, кому это не интересно просто искали готовые лабы и сдавали их не разбираясь в этом. Так что язык обучения не важен. У нас в универе давали фортран, потом си. При том что я со школы знал бейсик и паскаль, вообще никаких проблем не испытывал, пролистал учебник, нашёл все аналогичные конструкции и написал все лабы сразу. Это ещё тогда когда интернет был далеко не у всех и найти ответ по программированию на yahoo, astalavista и rambler было тяжело. Это сейчас по любому вопросу есть ответ на stack overflow, было бы желание его поискать...

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7503
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #271 : 15 Ноябрь 2022, 17:53:47 »
astalavista
altavista. Домен всё ещё существует, но ведёт на yahoo.

Оффлайн MaxWooD

  • Пользователь
  • Сообщений: 1079
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #272 : 15 Ноябрь 2022, 19:42:53 »
ВУЗ должен дать базис и методику. А дальше сам
:thumbup:

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #273 : 16 Ноябрь 2022, 01:41:14 »
altavista. Домен всё ещё существует, но ведёт на yahoo.
Тоже взглядом зацепился и завис, думаю astalavista это же искалка кряков и серийников была, как он там ответы по программированию искал :lol:

Оффлайн supremacy

  • Пользователь
  • Сообщений: 2268
  • Пол: Мужской
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #274 : 16 Ноябрь 2022, 05:19:51 »
Я уже и забыл, что был поисковик кряков, но название где-то в памяти засело. Действительно altavista. Хотя раньше и мысли не было искать что-то по программированию, форумов было меньше и находились, в основном, домашние странички и текстовые мануалы, может ещё faq с bbs.

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7503
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #275 : 16 Ноябрь 2022, 09:59:04 »
Тоже взглядом зацепился и завис, думаю astalavista это же искалка кряков и серийников была, как он там ответы по программированию искал :lol:
Мы сидели на serials.ws, там было всё! Даже тектосвые ключики. Но сам сайт, по понятным причинам, был весь завирусован. И мы как спецназ-ниндзи, обвешавшись всякими блокировщиками и вырезателями скриптов, шастали и вытаскивали самое вкусное, в том числе и на заказ... Эх, было время, в 2023 году уже 20 лет будет...

Оффлайн Deefrex

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #276 : 27 Ноябрь 2022, 08:10:52 »
Господа паскальщики, есть проблемка.

Имеется файл pas (который должен создать unit), в котором прописан ассемблерный код. Оригинальный 16-битный Borland Pascal его нормально обрабатывает, а вот 32-битный нет - обработка останавливается как раз на том месте, где этот ассемблерный код начинается. Выделил его красным в коде.


Пару лет назад спрашивал здесь, как его в итоге обработать: https://forum.lazarus.freepascal.org/index.php/topic,51989.0.html

Там мне дали ответ:
FPC does not support TP's Inline intrinsic. You need to convert it to full blown inline assembly.

Essentially you should be able to simply take the comments at the right and copy that into asm … end blocks in the implementation section for each function and add the directives assembler; nostackframe; to the declarations in the interface section.

Please note however that these routines are only useful if you use FPC's i8086-msdos or i8086-win16 targets. For other targets you need to replace them (and even for the mentioned targets it's more portable if you do so), for example with Pascal code (e.g. for FlagIsSet) or by calls to existing functions (e.g. SetJump and LongJump are provided by FPC as are replacements for HiWord, LoWord or SwapWord).


Нашёл похожий пример здесь: http://www.freepascal.ru/forum/viewtopic.php?f=1&t=11774#p103463

Сделал по аналогии - всё равно ругается.



Если прописываю: assembler; nostackframe;
- компилятор в итоге ругается на nostackframe и дальше не идёт.

P.S. TPINLINE - модуль (unit) из библиотеки Turbo Professional от TurboPower Software, который необходим для компиляции одной программки.

https://forum.sources.ru/index.php?showtopic=14916

Я 2 года назад как-то делал, что 32-битный компилятор этот ассемблерный код в итоге обработал. Но как - уже выветрилось из головы. Тогда очень долго с этим сидел. Даже пробовал другие 32-битные компиляторы (Virtual Pascal, GNU Pascal - все стопарились при обработке на этом месте). Сегодня ночью опять на этом моменте застрял. Сейчас на ближайшие 12 часов выдвигаюсь на работу. Вечером приеду - ещё посижу.

Такому меня в моём бывшем колледже не учили. :D

И да, работаю на ВМ с 32-битной Windows XP.

Компилятор вот этой версии: https://www.freepascal.org/down/i386/win32.html
« Последнее редактирование: 27 Ноябрь 2022, 08:19:21 от Deefrex »

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7503
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #277 : 27 Ноябрь 2022, 08:24:32 »
Цитата
TPLINE.PAS(28,1) Fatal: Syntax error, "IMPLENETATION" expected but "ASM" found.
Т.е., оформить юнит согласно правилу синтаксиса религия не позволяет? Ну тогда ищи версию, которая поддерживает описание тела функций до IMPLEMENTATION.

Оффлайн Deefrex

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #278 : 27 Ноябрь 2022, 12:40:13 »
HardWareMan, спасибо. Не разбирался пока. Дошёл до этого шага и начал собираться на работу. В Паскале до этого 2 года не работал.

Оффлайн Deefrex

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #279 : 27 Ноябрь 2022, 22:45:18 »
HardWareMan, вроде разобрался.

Но всё равно на том форуме мне как-то не совсем корректно объяснил человек. В итоге я сейчас в области interface должен перечислить все не только функции, но и процедуры, участвующие в юните (местами с assembler и nostackframe, где они нужны), а область implementation поднять наверх и в ней все эти процедуры и функции с их телами грамотно оформить.

Оффлайн Deefrex

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #280 : 30 Ноябрь 2022, 13:59:31 »
Итоги минувших дней...

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

Пару лет назад, когда я повторял Паскаль, чтобы программирование совсем уж не выветрилось из головы, меня посетила идея сделать маленькую консольную программку, которая могла бы хранить в себе и отображать 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 и продвинуться уже куда-нибудь на уровень повыше.

Весь оставшийся код для СВОЕЙ желаемой программы у меня уже написан, даже сделана привязка к системному времени. Осталась вот единственная наполовину нерешённая задача.
« Последнее редактирование: 30 Ноябрь 2022, 20:51:43 от Deefrex »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5078
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #281 : 30 Ноябрь 2022, 15:00:35 »
Компиляция тупо не идёт.
Похоже для ASM вы используете Intel синтаксис, а по умолчанию AT&T. В примерах пишут {$asmMode intel} для выбора Intel.

Оффлайн Deefrex

  • Пользователь
  • Сообщений: 27
    • Просмотр профиля
Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #282 : 30 Ноябрь 2022, 15:09:09 »
Sharpnull, спасибо. В принципе, мне уже всё равно в данном случае на этот процессорный синтаксис. Я нашёл другое решение для своей проблемы. Оставшийся вопрос немного из другого направления.