Ретро-программирование: пишем простую игру на том самом GW-BASIC 1983 года

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Image by : Opensource.com

Не так давно корпорация Microsoft открыла исходный код GW-BASIC. И на волне этого инфоповода автор решил скачать его, установить на FreeDOS и написать на этом языке знаменитую игру с угадыванием чисел. Казалось бы, всё просто. Но не совсем… Об этом его статья.

В детстве я почитал за абсолютную истину, что вообще любой «персональный компьютер» от TRS-80 до Commodore и Apple позволяет писать свои собственные программы на BASIC. Меня также подкупил тот факт, что его название расшифровывалось, как Beginner's All-purpose Symbolic Instruction Code — универсальный код символических инструкций для начинающих. В нашей семье был клон Apple II под названием Franklin ACE 1000. На его борту работал интерпретатор AppleSoft BASIC. Естественно, я хотел научиться программировать на BASIC и начал с чтения соответствующих книг и журналов.

Позже наша семья перешла на IBM PC с DOS. На этой машине была установлена ​​собственная версия DOS под названием BASICA. Более поздние версии DOS уже выходили с обновленным интерпретатором GW-BASIC.

BASIC стал моим счастливым билетом в мир программирования. Со временем я изучил другие языки программирования. Я не писал код на BASIC много лет, но всегда с теплотой вспоминал BASIC и GW-BASIC.

Microsoft открыла исходный код GW-BASIC


В прошлом году Microsoft удивила всех (включая меня), когда открыла исходный код GW-BASIC. После размещения на GitHub MS-DOS 1.25 и 2.0 с открытым исходным кодом компания получила множество сообщений с просьбой выложить исходники Microsoft BASIC. 

Как указано в readme репозитория, исходный код написан на ассемблере (это 100% ассемблер) для процессоров Intel 8088. Дата выпуска исходников — 10 февраля 1983 года. Код находится в открытом доступе в образовательных и ознакомительных целях.

Вы можете найти исходный код GW-BASIC на GitHub. И да, Microsoft действительно выпустила его под лицензией MIT.

Open source энтузиасты всё-таки умудрились подготовить код для сборки с обновленными ассемблерами. В связи с этим появились такие проекты, как TK Chia's GitHub (обновление GW-BASIC для сборки с JWASM и другими ассемблерами). В репозитории TK Chia лежит несколько исходников и бинарников. В примечаниях к последней версии (октябрь 2020 г.) говорится, что это «предварительный» двоичный файл GW-BASIC, пересобранный в 2020 году. 

Поддержка ввода-вывода через последовательный порт отсутствует. Вход для светового пера, вход для джойстика и выход принтера (параллельный порт) нуждаются в дополнительном тестировании. Но если вам не нужны эти дополнительные функции в GW-BASIC, вы сможете использовать эту сборку.

Я пользуюсь FreeDOS 1.3 RC4. На неё и буду устанавливать GW-BASIC. Это достаточно просто: нужно загрузить архив gwbas-20201025.zip из GW-BASIC TK Chia за октябрь 2020 года и распаковать его в своей системе FreeDOS. Для распаковки бинарный архив по умолчанию использует путь \DEVEL\GWBASIC.


Начало работы с GW-BASIC


Чтобы стартовать GW-BASIC, запустите файл GWBASIC.EXE из командной строки DOS. Обратите внимание, что DOS нечувствителен к регистру, поэтому вам не нужно вводить команды заглавными буквами. Кроме того, DOS будет запускать любые программы EXE, COM или BAT автоматически, поэтому вам также не нужно указывать расширение файла. Зайдите в \DEVEL\GWBASIC и введите GWBASIC.




Оболочка GW-BASIC

https://opensource.com/file/504876 (Jim Hall, CC-BY SA 4.0)

GW-BASIC — это интерпретируемый язык программирования. Среда GW-BASIC — это «оболочка», которая анализирует каждую строку в вашей программе BASIC при запуске кода. Он работает немного медленнее, чем компилируемые языки  (например, C). Зато это упрощает процесс кодирования-отладки. Вы можете тестировать свой код, просто вводя его в интерпретатор.

Каждая строка в программе GW-BASIC должна начинаться с номера этой строки. GW-BASIC использует номера строк, чтобы убедиться, что он выполняет операторы вашей программы в правильном порядке. Благодаря такой фиче вы можете, например, позже «вставить» новый оператор между двумя другими операторами (допустим, с номерами строк m и n, где m < n), присвоив ему номер строки (k > m, k < n). По этой причине в те времена большинство BASIC-программистов писали номера строк, кратные десяти: 10, 20, 30 и так далее.

Если вы подзабыли или не знали GW-BASIC раньше, можете прочитать  онлайн-справочник. Например, вот полезная ссылка, которая, похоже, является копией оригинального Руководства пользователя Microsoft GW-BASIC.

Первая программа


Начнём с простой программы для распечатки списка случайных чисел. Оператор FOR создает цикл для диапазона чисел, а RND (1) печатает случайное значение от 0 до 1.




Пишем первую программу

https://opensource.com/file/504881 (Jim Hall, CC-BY SA 4.0)

Вы видите эти выделенные слова внизу экрана? Эти команды вы можете запускать с помощью клавиш «F» (или функциональных клавиш) на клавиатуре. Например, F1 вставит слово LIST в интерпретатор GW-BASIC. «Стрелка влево» указывает на то, что дополнительно будет «нажата» клавиша Enter. Поэтому F2 введёт команду RUN и немедленно выполнит её. 

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




Оба списка «случайных чисел» одинаковы

https://opensource.com/file/504886 (Jim Hall, CC-BY SA 4.0)

Интересно, что список случайных чисел не меняется каждый раз, когда мы запускаем программу. Это происходит потому, что генератор случайных чисел GW-BASIC отталкивается от одного и того же начального числа (сбрасывается) каждый раз, когда вы перезапускаете программу. Такова его особенность.

Чтобы каждый раз генерировать новые случайные числа, нам нужно «засеивать» генератор случайных чисел новыми начальными значениями. Один из способов сделать это — предложить пользователю ввести собственное начальное число, а затем использовать это значение с инструкцией RANDOMIZE. Мы можем вставить эти два оператора в начало программы, используя номера строк 1 и 2. GW-BASIC автоматически добавит эти операторы перед строкой 10.




Обновим наш код

https://opensource.com/file/504891 (Jim Hall, CC-BY SA 4.0)

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




Теперь списки случайных числе отличаются

https://opensource.com/file/504896 (Jim Hall, CC-BY SA 4.0)

Пишем игру «Угадай число»


Чтобы попрактиковаться в процессе изучения нового языка программирования, я люблю писать несколько простеньких программ. Среди них — простая игра «Угадай число», в которой компьютер «загадывает» число от 1 до 100 и просит меня отгадать его. Программа зацикливается, пока я не назову это число. Давайте напишем эту игру на GW-BASIC. 

Для начала введу команду NEW, чтобы GW-BASIC забыл предыдущую программу и запустил новую. Моя программа «Угадай число» сначала должна предложить пользователю ввести начальное число для засева рандомного генератора. После этого он сгенерирует случайное число от 1 до 100. На самом деле, сначала функция RND (1) сгенерирует случайное значение от 0 до 1 (точнее, до 0,9999…). Поэтому нужно умножить RND (1) на 100, чтобы получить значение от 0 до 99,9999…. И уже потом я округлю это число до целого (удалю всё после запятой). А добавление к нему единицы даст число от 1 до 100.

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





Пишем игру «Угадай число»

https://opensource.com/file/504901 (Jim Hall, CC-BY SA 4.0)

Мы можем запустить программу, нажав клавишу F2. Используем для засева начальное число 1234 (то есть, вводим его с клавиатуры по просьбе программы). Мне потребовалось шесть попыток, чтобы угадать число 49.




Урра! Я выиграл!

https://opensource.com/file/504906 (Jim Hall, CC-BY SA 4.0)

Вот такое оно — программирование на GW-BASIC! Спасибо Microsoft и энтузиастам из open source сообщества, что дали возможность вспомнить детство. Надеюсь, что и у вас этот язык связан с какими-то ностальгическими воспоминаниями…

Ой! Чуть не забыл рассказать, как выйти из оболочки GW-BASIC. Для этого есть специальная инструкция — введите SYSTEM, и GW-BASIC вернёт вас обратно в командную строку DOS.




Пока, GW-BASIC. До новых встреч!

https://opensource.com/file/504911 (Jim Hall, CC-BY SA 4.0)



VDS по выгодной цене с быстрыми NVMе-дисками и посуточной оплатой можно у Маклауд.

Источник: https://habr.com/ru/company/macloud/blog/565248/


Интересные статьи

Интересные статьи

Дело было в начале 90-х, компьютера не было, но было желание поиграть в гонки ) Показал мне друг как можно на тетрадном листе бумаги в клеточку играть в гонки. А еще гово...
Первая публикация исходников far2l, порта Far Manager под Линукс — штуки, которая когда-то считалась принципиально невозможной — состоялась 10 августа 2016го. Поскольку главный разработчи...
В первой части мы собрали автомат с логикой игры. Точнее, не всей игры, а только движения самой змеи. В этой, заключительной, части мы разберёмся с подключением экрана и закончим всю ...
Недавно заинтересовался, как устроена подсветка кода изнутри. Сначала казалось, что там все дико сложно — синтаксическое дерево, рекурсия и вот это все. Однако при более близком рассмотрении оказ...
Технология eXpress Data Path (XDP) позволяет выполнить произвольную обработку трафика на интерфейсах Linux до того, как пакеты поступят в сетевой стек ядра. Применение XDP — защита от DDoS-атак (...