- BrainTools - https://www.braintools.ru -

Эволюция ПО в разработке игр на практике: 1982 — IBM PC

Мир в 1982 году

Общие даты [1], по категориям [2], наука [3], спорт [4], музыка [5], кино [6], театр [7], литература [8], живопись [9], игры [10] (англ. [11]), авиация [12], метро [13], железные дороги [14].

Положение на игровом и компьютерно-железных рынках

По моим впечатлениям [15], этот год не был чем-то примечателен – выходили новые игры и системы (компьютеры, приставки, портативные устройства) и ничто не предвещало бурь в следующем году.

Из выпущенных систем стоит отметить:

11.1981 – PC-88. Несмотря на выпуск в прошлом году, игры начали выходить только с 1982 года (во всяком случае достоверной информации о играх за 1981 год нет, на mobygames с высокой долей вероятности может быть ошибка [16] с платформой).

23.04.1982 – ZX Spectrum. Только в Британии, выпуск в США будет только в ноябре 1983 года. 06.1982 – MPC 1600 (Columbia Data Products). Первый IBM PC совместимый клон.

08.1982 – Commodore 64. Легенда и важный гвоздь кризиса игровой индустрии США в 1983 году. 10.1982 – PC-98. Самый известный японский компьютер. В последние годы, за счет основы на процессорах Intel, возможна эмуляция в DosBox-X.

11.1982 – Sharp X1. Самый продвинутый из основной тройки японцев на момент выхода (PC-88, X1, FM-7).

11.1982 – FM-7.

Для обычного человека все тоже шло своим чередом – потребности [17] покупать еще один компьютер нет, в отличие от приобретения софта и потенциального расширения памяти [18]. Последнее можно было приобрести у IBM или же купить у Microsoft подобие-аналог RamCard (помимо опции расширения памяти её можно было использовать и как RAM-диск, что могло быть полезным). Другое направление – программирование. BASIC показался привлекательным по своей простоте и интересно посмотреть еще какой-нибудь язык. Таковым становится ассемблер, благо IBM и Microsoft продают компиляторы под него (но с нюансом).

Эмуляционный конфиг

Эволюция ПО в разработке игр на практике: 1982 — IBM PC - 1

RamCard выпускался с начала 1982 года (пример [19] раннего экземпляра – у некоторых чипов стоит дата 8204 (четвертая неделя 1982 года), а на самой плате указан 1981 год) и был доступным решением (125 долларов за вариант на 64КБ при покупке напрямую у Microsoft согласно официальной брошюре, у реселлеров цена могла быть до двух с небольшим раз выше). Память же нужна для работы компилятора из .ASM в .OBJ – нужно минимум 128КБ, на 64КБ работать не будет.

Софт

Насколько понимаю, новая версия BASICA поставлялась с новыми партиями IBM PC, потому на текущем этапе будут использоваться изначальные PC-DOS и BASICA версий 1.00. BASIC-86 5.22 также не стал смотреть из-за наличия знакомства с BASIC и несовместимости (исполняемый файл в формате CMD, работающий под CPM).

Однако, как раз с этого года доступны компиляторы под ассемблер – IBM Macro Assembler и Microsoft Macro Assembler. По факту это один и тот же компилятор, просто у IBM самая ранняя версия за декабрь 1981 года. Вариант Microsoft вышел в феврале-марте 1982 года, но обновленная версия указано только у линковщика (LINK.EXE, 1.08) – у компилятора 1.00 и 1981 год. Нюанс в том, что у IBM на дискете только компилятор, а LINK.EXE изначально вложен в состав PC-DOS 1.00. Я об этом подумал уже в ходе компиляции кода под вариант Microsoft, но я решил этим пренебречь ввиду не сильно большой разницы во времени выхода.

Так как писать под ассемблер придется много, я позволил себе допустить послабление и использовать текстовый редактор для IBM PC, который стал доступен на этой платформе немного позже 1982 года. Настолько сильно погружаться в эпоху интереса [20] у меня не было, а встроенный в PC-DOS 1.00 EDLIN меня ужаснул за 10 секунд. После просмотра ряда самых маленьких текстовых редакторов на old-dos.ru выбор пал на WordStar 3.20 (остальное не заработало) – исполняемый файл датируется маем 1983 года, хотя в самой программе указан 1982 год. Несмотря на неказистый дизайн у него есть базовый набор нужных функций по набору текста. Вкупе с моноширинным шрифтом я, не побоюсь сказать, кайфанул от процесса печати кода – просто и минималистично, но в то же время приятно и комфортно. Есть, однако, нюанс с размером файлов – максимальный размер при сохранении составляет, примерно, около 14КБ (хотя при этом WordStar может открывать файлы большего размера). Дополнительная причина писать код модульно (в идеале – каждая функция в своем файле, а в условном MAIN.ASM только ссылки на эти файлы), а не в один файл.

Пример работы в WordStar 3.20

Пример работы в WordStar 3.20

Пара нюансов по Macro Assembler – расширение файла не имеет значения (можно не только .ASM, но и любое другое, главное чтобы внутри был код ассемблера), внутри файла должен быть особый символ для определения конца файла (в моем случае это был знак с hex-кодом 1A: стрелка).

Также – dosbox-x с некоторых пор поддерживает монтирование дискет форматированных под DOS 1.x, потому его можно использовать для копирования файлов туда-сюда.

Программы

Из-за размера .ASM файлов, полные листинги приводится не будут.

Скачать – github [21].

Memory Check (MEM.EXE)

Классика поздних версий MS-DOS в реализации для ранних.

Запросы: Qwen [22] (ранняя версия запроса [23]), Grok [24] (ранняя версия запроса [25]).

PC-DOS 1.00 занимает 12КБ в памяти. Интересно, про какую версию информация, что она занимает всего 8КБ?

PC-DOS 1.00 занимает 12КБ в памяти. Интересно, про какую версию информация, что она занимает всего 8КБ?

Также – рабочий пример работы с файлами через FCB (File Control Block): в ходе работы данные записываются в файл MEM.TXT объемом 64 байта, который можно посмотреть через команду TYPE. Интересно, что размер показывается честно – BASIC, WordStar и, возможно, Macro Assembler округляют размер файла до кратного 128 байтам (насколько понимаю, следствие наследиясовместимости CPM). FCB является единственным способом работы с файлами в DOS 1.x, handle-метод появился только в DOS 2.x.

Ниже – отрывок из кода (плюс код с разными процедурами выхода из программы в зависимости от версии DOS – 1.x не знает про 4Ch; выход из программы работает через RET, а перед этим нужно в самой первой процедуре кода набирать команды PUSH DS ; SUB AX, AX ; PUSH AX для обозначения PSP-сегмента, от которого выход и происходит):

    ; Set up FCB to MEM.TXT
    LEA DX, FILE_FCB
    MOV AH, 0Fh ; Open file
    INT 21h
    CMP AL, 0FFh ; FFh="not found/error"
    JNE SHORT FILE_OPENED

    ; If not found, create it
    LEA DX, FILE_FCB
    MOV AH, 16h ; Create file
    INT 21h
    CMP AL, 0FFh ; Error?
    JE SHORT SKIP_SAVE ; Skip if create failed

FILE_OPENED:
    ; Set record size to 1 byte (for seq write)
    MOV WORD PTR [FILE_FCB+0Eh], 64 ; Record size = 64

    ; Set DTA to output buffer (for write)
    MOV DX, OFFSET OUTPUT_BUFFER
    MOV AH, 1Ah ; Set DTA
    INT 21h

    ; Write to file (AH=15, number of records=OUTPUT_LEN)
    MOV CX, OUTPUT_LEN
    LEA DX, FILE_FCB
    MOV AH, 15h ; Seq write
    INT 21h
    CMP AL, 0 ; AL=0 success
    JNE SHORT SKIP_SAVE ; Skip close if write failed

    ; Close file
    LEA DX, FILE_FCB
    MOV AH, 10h ; Close file
    INT 21h

SKIP_SAVE:
    ; Exit based on DOS version
    CMP DOS_MAJOR, 2
    JAE SHORT EXIT_DOS2
    RET

EXIT_DOS2:
    MOV AH, 4Ch
    INT 21h
START ENDP
Эволюция ПО в разработке игр на практике: 1982 — IBM PC - 4 [26]

Draw Tool (Draw160)

Рисовалка в нестандартном режиме 160x100x16 RGBI (технически обозначается как 160×200, но чем это обусловлено я не выяснял, специалисты смогут лучше пояснить). По факту – модификация текстового режима 80×25 с поддержкой цвета.

Под DOS 1.x глючит (курсор появляется в любой точке экрана и в том числе за его пределами) и работает только один из Shift’ов клавиатуры, такое поведение [27] происходит и в MartyPC. Под DOS 2.x+ работает корректно. Также – запускается и на конфиге с 48КБ памяти.

Запросы: Qwen (1 [28], 2 [29], 3 [30]), Google Gemini [31], Grok (1 [32], 2 [33], 3 [34]).

Скриншот из dosbox-x

Скриншот из dosbox-x
Скриншот из PCBox 5.4

Скриншот из PCBox 5.4

Запись [35] в DosBox Pure (RetroArch) с шейдером crt-royale-ntsc-320px-composite.glslp (сделать скриншот не удалось – портится изображение).

Ниже два отрывка кода – в первом набор значений для перепрограммирования CRTC, а во втором сама процедура перенастройки режима:

    ; --- CRTC Register Data for 160x100 Mode ---
    crtcvals DB 71h, 50h, 5Ah, 0Ah ; R0-R3 (Horizontal)
             DB 7Fh ; R4: Vertical Total (127)
             DB 06h ; R5: Vertical Adjust
             DB 64h ; R6: Vertical Displayed (100 rows)
             DB 70h ; R7: Vertical Sync
             DB 02h ; R8 Interlace (Mode 2)
             DB 01h ; R9 Max Scan Line (1=2 lines high)
             DB 20h, 00h ; R10-11 (Cursor - hidden)
Эволюция ПО в разработке игр на практике: 1982 — IBM PC - 7 [26]
; ===============================================
; SET_MODE_160X100
; ===============================================
SET_MODE_160X100 PROC NEAR
    ; 1. Set standard 80x25 text mode first (Mode 3)
    MOV AX, 0003h
    INT 10h

    ; 2. Disable Blink (Port 03D8h)
    MOV DX, 03D8h
    MOV AL, 09h
    OUT DX, AL

    ; 3. Reprogram CRTC (6845)
    MOV SI, OFFSET DGROUP:crtcvals
    MOV CX, 12 ; Update registers 0 to 11
    MOV DX, 03D4h ; CRTC Index Register
    XOR AH, AH ; Start at Register 0

CRTC_LOOP:
    MOV AL, AH ; Select Register Index
    OUT DX, AL
    INC DX ; Select Data Register (3D5h)
    MOV AL, CS:[SI] ; Get Value (CS override needed)
    OUT DX, AL
    DEC DX ; Back to Index
    INC SI
    INC AH
    LOOP CRTC_LOOP
    RET
SET_MODE_160X100 ENDP
Эволюция ПО в разработке игр на практике: 1982 — IBM PC - 8 [26]

Основной функционал и выход из программы под DOS 1.x работает. Единственное что не удалось сделать рабочим – сохранениезагрузка файла через FCB. Найти или подобрать рабочие процедуры мне не удалось, информации про это в документации к Macro Assembler нет. Обидненько.

Текущая альтернатива это dosbox-x из-за поддержки сэйв-стейтов (и DosBox Pure в Retroarch).

Super Mario Bros., почти что скриншот

Super Mario Bros., почти что скриншот
Скриншот-мокап возможной игры (Mars Caves). Спрайты персонажей и объектов 16x16, окружения - 8x8.

Скриншот-мокап возможной игры (Mars Caves). Спрайты персонажей и объектов 16×16, окружения – 8×8.
Скриншот из dosbox-x

Скриншот из dosbox-x
Подобие spritesheet

Подобие spritesheet
Скриншот-мокап возможной игры (Cavexplore). Спрайты 8x8. Сильно упрощенная стилизация под Atari 2600.

Скриншот-мокап возможной игры (Cavexplore). Спрайты 8×8. Сильно упрощенная стилизация под Atari 2600.
Недорисованное - Contra (NES/Famicom, 1988).

Недорисованное – Contra (NES/Famicom, 1988).
Superbrothers: Sword & Sorcery EP (2011, iPhone)

Superbrothers: Sword & Sorcery EP (2011, iPhone)
Исходник (Contra)

Исходник (Contra)
Исходник (Superbrothers: Sword & Sorcery EP)

Исходник (Superbrothers: Sword & Sorcery EP)

Помощь приветствуется: DOS 1.x, FCB [36], DOS 2.x+, handle [37] (github).

PC Speaker Music Tool (PCSMUS)

По замыслу – программа для написания музыки под PC Speaker с возможностью сохранятьзагружать результат в файл для использованияпрослушивания.

Запросы: Qwen [38], DeepSeek [39], Grok (1 [40], 2 [41]).

Сделать рабочий код не старался, так как не видел смысла тратить на это время из-за фиаско с FCB для предыдущей программы. Первый вариант после конверсии из MASM 5.0+ в MASM 1.0 компилится без ошибок, но не работает (а еще из .OBJ получается большой по размеру исполняемый файл – 68480 байт). Второй вариант тоже компилится без ошибок и запускается, но зависает (возможно, неправильная последовательность операнд в одной из функцийпроцедур).

Помощьпредложения по написанию приветствуются – тема [42] на github.

Концепт подобия движка

Идея простая – используя Draw160 и PCSMUS с написанием игровой логики под ассемблер писать игры, которые можно запускать на самых ранних IBM PC как в эмуляции, так и на реальном железе. При этом они – работают в нестандартном графическом режиме (160x100x16 RGBI), с музыкой на PC Speaker (пример красивой реализации – System Beeps [43], статьи на тему от автора – 1 [44], 2 [45]).

Вспомогательные средства

CP437CHK – скрипт на python, проверяющий текстовые файлы на соответствие кодовой странице 437. Полезно, если в коде от нейронки неправильные символы из-за которых он не запускается под эмуляцией.

Возможные выводы

В целом, работа с ассемблером – это интересно. Правда, для понимания кода без справочника по командам и операндам процессора разобраться затруднительно. Сложностей при этом хватает и без этого – программа может скомпилироваться без ошибок, но не работать (для дополнительных проверок и дебага предусмотрены NUL.LST и NUL.CRF, но для этого требуются дополнительные знания) или же глючить в какой-то среде (Draw160 подглючивает в DOS 1.x, но при этом корректно работает под DOS 2.x).

Структура кода и синтаксис мне отчасти напомнили python (в частности, проставление пробелов в строках, хотя это, возможно, было не обязательно делать). Понравился и формат его организации (сначала идут сегменты данных DATASEG, потом STACKSEG, а затем до конца CODESEG; все операции желательно выполнять внутри процедур и самая первая должна быть PROC FAR, последующие – PROC NEAR; START PROC FAR и END START обертывают код внутри CODESEG). Разобрать работу с файлами и можно было бы попробовать сделать графический текстовый редактор с поддержкой нескольких языков минуя ограничения ранних IBM PC за счет использования графики из файла. И игры попробовать поделать само собой.

Автор: Gameruni

Источник [46]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/25675

URLs in this post:

[1] Общие даты: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4

[2] по категориям: https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:1982_%D0%B3%D0%BE%D0%B4

[3] наука: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%BD%D0%B0%D1%83%D0%BA%D0%B5

[4] спорт: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B5

[5] музыка: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B5

[6] кино: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%BA%D0%B8%D0%BD%D0%BE

[7] театр: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D1%82%D0%B5%D0%B0%D1%82%D1%80%D0%B5

[8] литература: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%B5

[9] живопись: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B8%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5_%D0%A1%D0%A1%D0%A1%D0%A0

[10] игры: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D0%B8%D0%B3%D1%80%D0%B0%D1%85

[11] англ.: https://en.wikipedia.org/wiki/1982_in_video_games

[12] авиация: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%B0%D0%B2%D0%B8%D0%B0%D1%86%D0%B8%D0%B8

[13] метро: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8_%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B5%D0%BD%D0%B0

[14] железные дороги: https://ru.wikipedia.org/wiki/1982_%D0%B3%D0%BE%D0%B4_%D0%B2_%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8_%D0%B6%D0%B5%D0%BB%D0%B5%D0%B7%D0%BD%D0%BE%D0%B4%D0%BE%D1%80%D0%BE%D0%B6%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0

[15] впечатлениям: http://www.braintools.ru/article/2012

[16] ошибка: http://www.braintools.ru/article/4192

[17] потребности: http://www.braintools.ru/article/9534

[18] памяти: http://www.braintools.ru/article/4140

[19] пример: https://www.reddit.com/media?url=https%3A%2F%2Fpreview.redd.it%2Fmicrosoft-pc-ramcard-v0-8pq1wdu783xe1.png%3Fwidth%3D1865%26format%3Dpng%26auto%3Dwebp%26s%3Dee9208a5bb0db1f5a2d6e978d60852ad8dd48152

[20] интереса: http://www.braintools.ru/article/4220

[21] github: https://github.com/n1tr0ms/GameDev-Soft-Evo-1981-2001-

[22] Qwen: https://chat.qwen.ai/s/805d1ef1-53f1-4de9-a56f-78f33ebcd0d9?fev=0.2.0

[23] ранняя версия запроса: https://chat.qwen.ai/s/805d1ef1-53f1-4de9-a56f-78f33ebcd0d9?fev=0.1.38

[24] Grok: https://grok.com/share/bGVnYWN5LWNvcHk_f783a634-7d72-4dbc-90cb-5c3877dd870b

[25] ранняя версия запроса: https://grok.com/share/bGVnYWN5LWNvcHk_d6658914-9d0e-4d9e-9cd8-eb379bc4da1e

[26] Image: https://sourcecraft.dev/

[27] поведение: http://www.braintools.ru/article/9372

[28] 1: https://chat.qwen.ai/s/3c369525-0d9b-4b4d-a792-8de489480767?fev=0.1.39

[29] 2: https://chat.qwen.ai/s/42ab16a2-112e-42b0-8689-3529f2d10a69?fev=0.1.39

[30] 3: https://chat.qwen.ai/s/f8e87b2b-e91d-4603-a0bc-19a97281a4ff?fev=0.1.39

[31] Google Gemini: https://gemini.google.com/share/d9ee07200416

[32] 1: https://grok.com/share/bGVnYWN5LWNvcHk_2dbba1e1-47bc-4adc-909f-1f64a84b1616

[33] 2: https://grok.com/share/bGVnYWN5LWNvcHk_eb933a4a-99ca-4426-8706-ba1947797536

[34] 3: https://grok.com/share/bGVnYWN5LWNvcHk_d6388f87-643b-4664-9004-06a5268e72ce

[35] Запись: https://d.tmpfile.link/public/2026-02-14/8fb1d64f-e5ed-4fb3-894d-975efc8bb9d9/2026-02-07%2018-02-48.mkv

[36] DOS 1.x, FCB: https://github.com/n1tr0ms/GameDev-Soft-Evo-1981-2001-/issues/1#issue-3943177885

[37] DOS 2.x+, handle: https://github.com/n1tr0ms/GameDev-Soft-Evo-1981-2001-/issues/2#issue-3943183447

[38] Qwen: https://chat.qwen.ai/s/33938c2e-dce6-4796-b56c-84636294f7fe?fev=0.1.39

[39] DeepSeek: https://chat.deepseek.com/share/sswu109bvct1hgbjuf

[40] 1: https://grok.com/share/bGVnYWN5LWNvcHk_89e03fde-f996-4fe2-8d3c-06491ba20415

[41] 2: https://grok.com/share/bGVnYWN5LWNvcHk_1c8dce03-51c8-4a6c-886c-30c435ef7e7a

[42] тема: https://github.com/n1tr0ms/GameDev-Soft-Evo-1981-2001-/issues/3#issue-3943198062

[43] System Beeps: https://www.pouet.net/prod.php?which=79996

[44] 1: https://habr.com/ru/articles/438448/

[45] 2: https://habr.com/ru/companies/ruvds/articles/951514/

[46] Источник: https://habr.com/ru/articles/996664/?utm_source=habrahabr&utm_medium=rss&utm_campaign=996664

www.BrainTools.ru

Rambler's Top100