Эволюция ПО в разработке игр на практике: 1981 - IBM PC, Софт и игра
Конфигурация
Несмотря на то, что IBM PC можно было приобрести в одном из двух вариантов, более дешевый не имеет смысла из-за серьезных ограничений по носителям(только кассеты) и возможностям BASIC (только текстовый режим без возможности работы с цветом). Для работы же с версией BASIC на дискете требовалась конфигурация на 48КБ из которых 32КБ забирала система при загрузке PC DOS с дискеты. Также ревизия 1981 года была ограничена 64кб памяти, а вариант на 256кб появился только в следующем году. Это, к слову, в некоторой мере объясняет большую редкость софта под IBM PC на кассетах будь то любительский или коммерческий (строго говоря, он редок и для TRS-80 c Apple II, но хотя бы для последнего известно некоторое количество игр в таком формате). Потому практически все ранние игры для IBM PC рассчитаны под конфиг с 48КБ базовой памяти. Дополнительные 16КБ кажутся относительно дешевыми при таких условиях, мышей еще не было (первая для IBM PC будет только в 1983 году), а джойстик можно будет приобрести потом (к этому времени оные формата Atari VCS/2600 - стик с одной кнопкой - стали стандартом и был доступен вариант известных под термином пэдл (paddle) для подобий Pong и Breakout).
Документация
За годы с момента выхода IBM PC полный комплект документации за 1981 год до сих не оцифрован. Из нее наиболее интересным является руководство по BASIC, включающее в том числе раздел с описанием команд.
Однако, оцифровано руководство в ревизии за май 1982 года (BASIC_1.1_May82), которое допустимо использовать, так как правки не значительны и со связанными с ними ситуациями вряд ли придётся столкнуться в ходе использования. Источником примеров программ и игр могут быть книги-сборники 101 BASIC Computer Games (первое издание - 07.1973, издание за март 1975 года) и BASIC Computer Games с More BASIC Computer Games (1978 и 1979 годы соответственно).
Софт
В сущности, в комплекте PC DOS из коробки был доступен только BASIC, а VisiCalc нужно было приобретать отдельно. Рассматривать последний смысла нет, так как оный к моменту выпуска IBM PC был доступен и на TRS-80 и смысла приобретать ту же программу для другой системы смысла не имело. Также самая ранняя версия VisiCalc для IBM PC доступна на Winworld, но не эмулируется ни в одном эмуляторе из-за специфической защиты от копирования , которая работает на секторно-байтовом уровне и ни одна реализация чтения образов дискет не учитывает такие особенности (в отличие от самих форматов, из которых можно произвести физическую запись на дискету, работоспособную на реальном железе). Чуть более поздняя версия заработала в Dosbox-X, а в PCBox происходит зависание (возможно, нужно больше 64КБ). Таким образом, последующая информация будет про BASIC.
Особенности и использование BASIC
Некоторые нюансы работы:
- Произвольно редактировать нельзя: только последовательная построчная запись (компенсация - группировать строки особым образом и оставлять место для новых, так как BASIC умеет их подставлять последовательно: если добавить LINE 881 <Код>, то она встанет между 880 и 882 без участия пользователя).
- Сохранение на кассету происходит только один раз, перезапись изменения не учитывает (компенсация - сделать новый образ кассеты и делать новое сохранение на неё).
- Подставить уже готовый к загрузке .BAS файл (блокнот-> dosbox-x -> PCBox) нельзя: либо портятся или неверно интерпретируются строки в файле или обрабатывается только часть строк. Потому вводить только самостоятельно в эмуляторе (с другой стороны плюс - вникаешь в ход работы строк по ходу перепечатывания).
- Использовать EDLIN для редактирования .BAS файла нельзя: он неправильно читает данные.
- Нельзя произвольно редактировать строку: если в строке есть ошибка, то заменять нужно всю строку от её места (хинт - для замены одного символа на другой достаточно дойти до оного и сразу нажать на одну из нужных клавиш клавиатуры - старый символ заменится на новый).
- Нельзя после загрузки .BAS файла с дискеты пересохранить на другую, только на ту же (компенсация - заранее сделать новую чистую дискету и отформатировать её; скопировать файл образа чистой дискеты переименовав её).
- Нельзя залупить музыку (команды SOUND, PLAY).
- Реализовать 160х100х16 возможно только через ассемблер (BASIC 1.x не поддерживает DATA).
- Сохранение лучше делать в формате 'SAVE"TEST.BAS",A'. без A будет сохранение в бинарном формате.
Приятный бонус - можно использовать BASIC в качестве простейшего псевдо-текстовика.
Нюансом в написании кода является использование нейросетей с последующей правкой в случае необходимости.
Программы
CP437 Draw (CP437DRW)
Примеры рисунков:
Music Maker (MUSMAKE)
Простая программа для набора нот для PLAY и SOUND. Запрос.
Игра
В качестве теста попробовал сделать простенькую реализацию Space Invaders. Для этого документ по BASIC 1.10 перевел через Abbyy FineReader в текстовый формат (размер - 445КБ), а также сохранил вариант в RTF. После этого полученный текстовый файл с примерами на .BAS (Donkey.BAS, Sample.BAS) был загружен в Google Gemini 3 (Pro-версия, доступна минимум 1 раз в сутки).
Запрос (английский): "Lets write simple Space Invaders clone game under BASIC for IBM PC which will work on the earliest one models with 16-48-64 kbytes.I've provide BASIC documentation and sample game in BASIC code.Take a note - .BAS file size limit must be not exceed 16000 bytes. "
Ссылки - Google Gemini 3, Qwen3-Max (правки).
Итоговый код после ряда правок:
Скриншот:
Баги:
- Противники спускаются на один пиксель сразу по осям X и Y.
- Не очищается предыдущая позиция при перемещении на новое место (касается всех объектов - корабля игрока, ракеты и противников).
- Противники при спуске оставляют шлейф.
- Ракета может пролететь мимо противника несмотря на то, что визуально она проходит через его спрайт.
- От ракеты остается полоска после прохождения позиции.
- После попадания противник не стирается полностью: его рамка продолжает падать, но прямо вниз (хотя может выглядеть как визуализация обломков после взрыва).
Костыли:
- Фон в цвете шлейфа.
Что можно было бы исправить:
- Спуск противников по X до конца линии, а потом спуск по Y до достижения конца линии по X.
- Коррекция скорости ракеты, чтобы её линии попадания совпадали с линиями движения противников.
Что можно было бы добавить:
- Жизни.
- Отстрел противниками.
- После первого попадания от противников остаются обломки, которые нужно уничтожать отдельно.
На мой взгляд, исправить баги и получится вполне себе donationware за $4.99, который мог распространяться через BBS или быть опубликован в каком-нибудь журнале в виде листинга.
Скачать - github
Возможные выводы
В целом, несмотря на некоторые неудобства, опыт написания под BASIC на оригинальном конфиге IBM PC образца 1981 года интересный. Сделать нечто динамичное теоретически возможно, особенно если разобраться с нюансами рисования и отображения графики (Donkey хороший пример такого). Понятно, что для чего-то более комплексного потребуется использовать MASM (для сегментов кода, которые нужно обрабатывать быстро, BASIC такое допускает через CALL), а в идеале вовсе писать на C. Однако в 1981 году реализации C под IBM PC еще не было - самые ранние вышли уже в 1982 году, но доступны те, что датируются 1983 годом.
Также, по моим впечатлениям, BASIC похож на Python (построчный синтаксис исполняющийся последовательно, но при этом предусматривающий некоторое распараллеливание операций через GOSUB и GOTO), только проще и по функционалу, и по возможностям.