Как стать автором
Обновить

Ностальгия по КУВТ: ретроспектива средств разработки для 8-битных компьютеров MSX. Часть 1 — языки, редакторы, трансляторы

Время на прочтение12 мин
Количество просмотров14K

Введение



Давным давно, в далекой Галактике, когда жесткие диски были не более 100 Мб (а кое где их и не было вовсе), шина адреса всего 16 бит, о графических 3D-ускорителях никто, или почти никто даже не помышлял, а Интернет приходил в редкие дома, по мокрым бельевым веревкам через пищащие коробки…

В общем тогда люди тоже писали программы. Учились их писать, писали, и даже продавали потом. Ностальгия по старым школьным компьютерам побудила меня, вооружившись эмулятором, гуглом, и собственными руками, переменного радиуса кривизны, вспомнить как это было самому, а потом рассказать вам. Добро пожаловать под кат.

Теплый и, в каком-то смысле, ламповый монитор прошлого...




Что нужно для разработки? Во все времена необходимый минимум состоял из:

  1. Редактора для работы с исходным кодом
  2. Транслятора исходного кода в машинные инструкции
  3. Отладчика


и ничего нового тут, в общем-то и нет. Ещё мы обязаны определится с операционной системой, где будем работать. Я буду излагать всё нижеследующее применительно к MSX-DOS версии 2.20, так как сам в свое время прошел через неё (ещё была CP/M, но я с ней не работал, но эту тему я тоже затрону в других публикациях, ибо рассказать есть о чем)

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

1. OpenMSX — обработка надфилем



Для начала надо рассказать о настройках эмулятора. В прошлый раз мы использовали графический фронтэнд Catapult, однако он имеет ряд ограничений по параметрам запуска эмулятора (например, можно подключить «ром» для единственного аппаратного расширения, хотя их может быть до четырех, в зависимости от выбранной модели компьютера). CLI-интерфейс позволит нам полностью раскрыть мощь эмулятора ничего не потеряв в удобстве использования.

Итак, запустим эмулятор из командной строки

$ openmsx -machine Yamaha_YIS-805-128R2 &


Ключик -machine задает аппаратную конфигурацию запускаемого MSX. Конфигурация определяется *.xml-конфигами, в линуксе размещаемыми по пути /usr/share/openmsx/machines/. При наличие «ромов» и представления об аппаратной архетиктуре этих компьютеров такой конфиг можно сварганить и самостоятельно, но пока что мне хватало добытых на просторах сети (все ссылки имеются в прошлой статье).

Я выбираю Yamaha YIS-805/128 локализованную японцами для СССР (о чем красноречиво говорит буковка R в имени конфига). Это учительская машина, за которой я в общей сложности провел большую часть времени. Локализация нам не повредит, в чём мы убедимся чуть позже.

Итак, перед нами предстанет интерпретатор бейсика, но пока он нам не нужен. А нужно нам вот это

Встроенный командный интерпретатор OpenMSX


Окошко внизу экрана всплывает/убирается по нажатию F10 и позволяет «рулить» эмулятором, используя встроенную командную оболочку. Можно писать даже cкрипты, коих прилично идет в комплекте с программой по пути /usr/share/openmsx/scripts/.

Например, мы хотим подключить мышь (мышь была на учительском компе, фото поместил под спойлер)
Мышь для Yamaha КУВТ2



Для этого выполняем команду

> plug joyporta mouse


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

Для работы с дискетами используем команды:

поместить дискету в виртуальный привод
> diska <имя файла с образом дискеты A>
> diskb <имя файла с образом дискеты B>

извлечь дискету из привода
> diska eject
> diskb eject

Если нам нужна чистая дискета, то мы можем её создать
> diskmanipulator create <имя образа> <емкость в килобайтах>

отформатировать
>virtual_drive <имя образа> 
>diskmanipulator format virtual_drive

и скопировать на неё,
> diskmanipulator import virtual_drive <имя файла | каталога, содержимое которого надо поместить на диск>

а так же и с неё, необходимые нам файлы
> diskmanipulator export virtual_drive <имя  каталога, в который надо поместить содержимое диска>

Есть возможность создавать каталоги на дискете
> diskmanipulator mkdir virtual_drive <имя каталога>

и перемещаться по ним
> diskmanipulator chdir virtual_drive <имя каталога>

Кроме того, в качестве дискеты можно указать и каталог на хост-машине
> diska <имя каталога>

Однако, если кто-то думает что так можно обойти ограничение в 720 Кб (так подумал я, хотя следовало бы догадаться что эмулятор рассматривает этот каталог как дисковое устройство со вполне определенной геометрией), то Вас ждет разочарование — как только объем записанных данных превысит указанный предел, эмулятор скажет вам, что диск полон — всё по-честному.

Таким образом мы вооружены до зубов. КУВТ2 поддерживал диски ёмкостью 360 и 720 килобайт, что очень не густо по нынешним-то временам, но что поделать — в то время такое положение дел никого не огорчало. Главное — у нас есть носители для транспорта нужного нам ПО внутрь эмулятора.

«До кучи» ещё несколько полезных команд эмулятора

аппаратный сброс
> reset

выключение/включение питания машины
> set power off
> set power on

сделать скриншот можно так
> screenshot <имя файла>

без указания имени файла эмулятор положит скрин в ~/.openMSX/screenshots/

2. Загрузка ОС, настройка терминала и редактирование текстов



MSX-DOS можно взять тут. Распаковываем архив, и запускаем эмулятор
$ openmsx -exta msxdos2 -machine Yamaha_YIS-805-128R2 -diska MSXDOS2T.DSK


Ключ -exta подключает аппаратное расширение msxdos2 которое позволит нам использовать эту ОС на «ямахе». Всего допускается до 4х расширений (зависит от эмулируемого компьютера) добавляемые ключами -exta...-extd. Ключ -diska означает старт эмулятора со вставленной в дисковод A дискетой.

После загрузки мы увидим экран в «некошерном» режиме 40x25. Нам будет неудобно там работать, поэтому необходимо переключится в нормальный режим 80x25

A> mode 80

Режим 80x25. Ну что, так уже жить в этой консоли можно


Содержимое autoexec.bat
ramdisk 4064/d
copy %1command2.com h:\
reboot.bat %1

сообщает нам, что создается RAM-диск H: емкостью 4064 Кб, куда помещается командный процессор command2.com и выполняется переинициализация переменных окружения скриптом reboot.bat
set temp=h:\
set shell=h:\command2.com
path %1\kids;%1\tools;%1\utility

Это для того, чтобы мы не потеряли возможность использовать командную оболочку, если нам вдруг потребуется временно извлечь дискету с системой. А такая необходимость преиодически возникает — места на дискетах мало, дисководов всего два (это в лучшем случае), так что тасовать дискеты приходилось довольно часто. Меня, до университета не видевшего компа с HDD, это не смущало, но всё же изрядно напрягало.

В составе дискеты имеются и простейшие текстовые редакторы KID и AKID от компании ASCII — основного поставщика системного ПО для MSX-ов.

A> akid


Нас попросят задать имя файлу
Ввод имени файла


и можно набирать текст
Редактирование текста


выход из редактора, сохранение и прочее — по хоткеям. Основные операции можно выполнить через меню, вызываемое по F1.
Главное меню


Простецкий такой, блокното-/nano-подобный редактор текстов. За остальной информацией о нем идем по ссылке. Редактор KID оказался глюковатой версией AKID, поэтому отдельного интереса у меня не вызвал.

Ну а если мы будем писать мегапрограмму на ассемблере состоящую из нескольких файлов исходников? Нам бы сюда хотя бы vi… М-де, ну у нас будет не vi, а что-то попроще, но достаточно солидное, называемое TOR (не путать с tor-браузером). TOR — это транслит от русской аббривиатуры ТОР — Текстовый Оконный Редактор. Качнуть его можно тут. Распакуем архив в отдельный каталог, подрубим его к дисководу B: и посмотрим что у нас имеется

в консоли эмулятора
> diskb /home/$USER/msx/tor

в MSX-DOS
A>B:\tor


Русская версия русского же редактора ТОР от Леонида Бараза — заставка


Дааа, локализация это очень приятно. Только работает она на локализованой версии «ямахи», то есть на КУВТ. На TURBO-R вас встретят иерогливы или другие кракозябры (сперва я подумал что редактор на японском, а потом догадался, что дело в таблице ASCII). На этот случай предусмотрена английская версия, запускаемая командой
A>B:\tor\tore

Вражий вариант интерфейса - TORE



Внутри редактор выглядит товарно

Окно редактирования TOR

и позволяет работать с несколькими (до десяти) файлами в разных буферах (почти как vim/emacs). Управление может показаться «двинутым», но для того времени наверное всё было ок и дело привычки (надо же, уже успел позабыть...). Например, чтобы вставить строку между двух строк надо шлепать Ctrl + Enter а не просто Enter. Ну и так далее. Благо, справка и меню на русском и достаточно подробно

Ещё несколько скринов
Меню, вызываемое нажатием ESC


Выход из редактора



3. MSX BASIC



Интерпретатор Бейсика в 8-битных компьютерах играл особую роль — он тебе и ОС, и шелл, и редактор кода, и IDE и отладчик — программа останавливалась на крушащей её строке и выдавала ругательства на английском языке, грязные и и не очень. По умолчанию после загрузки вы попадали именно в бейсик. Из доса в него попасть тоже просто
A>basic


MSX BASIC — первый ЯП многих советских и российских школьников


Чтобы выставить 80х25 режим набираем команду
width 80

Можно сменить и расскраску фона и букв на экране
color 15,1,1

набить программу, запустить её (F5), сохранить на диск командой
save "A:\answer.bas"



Потом можно загрузить её обратно
load "A:\answer.bas"

Получить листинг (F4) и снова выполнить (F5)


Вернуться обратно в DOS можно командой
call system


Язык подкупал и подкупает своей исключительной простотой и очевидностью конструкций. Кроме того, в его состав входили библиотеки функций упрощающие работу с графикой — спрайты 8х8 и 16х16 пикселей, работа со страницами видеопамяти, если нужно было делать быструю анимацию больших кусков изображения. В общим много программ было написано на нем (вот только где они теперь???).

Ну хорошо, а если мы хотим транслировать наш Basic-код в исполняемый файл, можно? Можно. Для этого нам потребуется SOLiD VBasic — тулчейн для компиляции *.BAS файлов в исполняемый код формата *.COM. Содержимое архива подключаем к эмулятору
> diskb solidvbasic/

На диске — набор утилит для компиляции


Попробуем собрать какой-нибудь «хелловорд». Возвращаемся в интерпретатор и пишем код



Сохраняем файл на диск, ОБЯЗАТЕЛЬНО указав ключик «А» в конце, чтобы исходник сохранился в виде ASCII-текста, и возвращаемся в DOs
save "b:\hello.bas",A
call system

Транслируем код на бейсике в ассемблерный
B>vbc hello.bas

Выполняем компиляцию
B>as hello.asm

и компоновку
B>ld hello=bk,hello.rel,ilib/s,basend

Всё проходит ок, угу. Данная команда, как видно компонует объектный код нашей программы с RTL-библиотеками MSX-BASIC.

На выходе имеем исполняемый файл НЕLLO.COM, который запускается из шелл


Интересен ассемблерный выхлоп
Ассемблерный исходник, генерированный транслятором VBC
; Solid Soft V-BASIC compiler V2.5
; Demo version -- buy normal version from SOLID
	.Z80
;
CALLF	MACRO	ADR
	IF2
	IFNDEF	ADR
	EXTRN	ADR
	ENDIF
	ENDIF
	CALL	ADR
	ENDM
	CSEG
_000A:
	call	?FINIT##
	push	hl
	ld	hl,?const+00000h
	call	?LDSTR##
	call	?INCLF##
	pop	de
	call	?CPUTS##
_0014:
	call	?EXIT?##
	ret

?CONST:
	db	048h,065h,06Ch,06Ch,06Fh,02Ch,020h,032h,030h,031h,035h,074h,068h,020h,070h,065h,06Fh
	db	070h,06Ch,065h,021h,000h,00h
	END


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

4. Turbo Pascal 3.0 для MSX-DOS и CP/M



Паскаль стал мои вторым языком программирования. И изучал я его на «ямахах». К сожалению я не помню ту версию паскаля, что была у нас в школе. Но это был странный паскаль — хотите режьте меня, материте, закидывайте пищевыми отходами и прочей гадостью, но та версия была РЕГИСТРОЗАВИСИМОЙ!!! Да знаю я что паскаль регистронезависимый язык, как-никак довольно долго на нем работал, но вот это и удивило в университете — оказалось что классика жанра отличается в этом смысле от того, что попалось мне. Буду крайне признателен, если кто-то из моих читателей подтвердит моё воспоминание и подскажет мне, что это за вариант паскаля.

Для опытов был собран по кусочкам дистрибутив Turbo Pascal 3.0 от ныне покойной Borland.

Это Pascal. Turbo Pascal. А вы ожидали цветастое меню, синий фон и подсветку синтаксиса? Не-а, это MSX, это Спарта!!!


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

Главное меню


Все пункты меню висят на хоткеях — шлепаем ту букву, что в верхнем регистре. Навигация достаточно простая. Жмем E. вводим имя исходника и попадаем в редактор кода

Редактор кода имеет особенность — функцию клавиши BS выполняет DEL, а для BS есть хоткей.


Для выхода из режима редактирования жмем Ctrl+T, компилируем, нажав на «C»


По умолчанию компиляция производилась прямо в память, что серьезно ускоряло процесс. При желании получить *.COM надо было выбрать в меню «Options» режим компиляции на диск

и собрать бинарник, который собирался уже горазно медленнее

но потом нормально запускался из-под DOS


5. Assembler Великий и Ужасный



Все «отъявленные» спектрумисты, наигравшись бейсиком на ZX Spectrum рано или позно приходили к тому, что все возможности из этой железяки можно выжать только с помощью ассемблера. Не был исключением и MSX, однако в свое время я не успел приобщится к коддингу на «асме» (впервые я познакомился с 386-м ассемблером в 2004 году) и поковырялся в этом вопросе исключительно ради написания данной статьи.

Что касается компилятора, то он есть, например, в дистрибутиве Turbo Pascal и зовется GEN80.COM. Достаточно открыть любой текстовый редактор и начать набивать код
B>akid

напишем такой вот простецкий код
;--------------------------------------------------
;	Sipmles asm program for MSX
;--------------------------------------------------
	
        ld	C, 09h
	ld	DE, MESSAGE
	call	05h
	ret

MESSAGE
	
	defm	"I'm Z80 CPU. I'll be back!!!"
	defb	24h
	defb	0

Собираем его командой
B> gen80 hasm=hasm.asm

и получаем результат


Для работы на ассемблере надо было иметь представление о системных вызовах MSX-DOS, соглашении о вызовах системных функций. И это минимум. Ещё могут понадобится функции BIOS, и представление о прямом доступе к аппаратуре целевой машины. Всю эту информацию можно почерпнуть на замечательном ресурсе MSX Assembly Page где собрана куча ссылок на полезную информации.

Вот только где бы я взял всё это в 1998 году…

В приведенном примере производится вызов системной функции 09h — вывод строки на экран. Номер функции передается через регистр C, адрес строки — через DE, сам вызов — командой call 05h. Строка должна завершаться символом '$' (код 24h) иначе на экран выведется всё содержимое ОЗУ, и хорошо если по пути попадется 24h :).

При наличии прямых рук, информации и свободного времени вы могли сотворить массу замечательных вещей.

6. MSX-C — темная сторона Силы



Честно говоря, я был несколько удивлен — C на 8-битной машине. Оказалось, что можно было прекрасно программировать и на нем, например используя MSX-C. Качаем полный пакет Complete package of MSX-C. Распаковываем. Да, там много всего

[maisvendoo@arch-host MSX-C-package]$ ls -l
итого 948
drwx------ 6 maisvendoo users   4096 мар  7 19:59 bootDisk
-rw-rw-r-- 1 maisvendoo users 172574 июн 11  2013 bootDisk.zip
drwx------ 2 maisvendoo users   4096 май 14  2012 msxC-1.10
-rw-rw-r-- 1 maisvendoo users 176785 июн 11  2013 msxC-1.10.zip
drwx------ 6 maisvendoo users   4096 мар 15  2012 msxC-1.20
-rw-rw-r-- 1 maisvendoo users 136565 июн 11  2013 msxC-1.20.zip
drwx------ 2 maisvendoo users   4096 май 22  2012 msxC-Lib
-rw-rw-r-- 1 maisvendoo users  95508 июн 11  2013 msxC-Lib.zip
-rwxr-xr-x 1 maisvendoo users 230623 май 23  2002 msxCMan.htm
-rw-rw-r-- 1 maisvendoo users  33410 июн 11  2013 msxCMan.htm.zip
drwx------ 2 maisvendoo users   4096 мар 15  2012 msxC-Utils
-rw-rw-r-- 1 maisvendoo users  83571 июн 11  2013 msxC-Utils.zip


Нас будет интересовать каталог bootDisk/ — загрузочный диск среды разработки.

[maisvendoo@arch-host MSX-C-package]$ ls -l bootDisk
итого 56
-rwxr-xr-x 1 maisvendoo users   536 дек 31  1994 AUTOEXEC.BAK
-rwxr-xr-x 1 maisvendoo users   664 мар  7 19:59 AUTOEXEC.BAT
drwx------ 2 maisvendoo users  4096 мар 15  2012 BIN
-rwxr-xr-x 1 maisvendoo users 15744 янв  1  1980 COMMAND2.COM
drwx------ 2 maisvendoo users  4096 мар 15  2012 INCLUDE
drwx------ 2 maisvendoo users  4096 мар 15  2012 MAIN
-rwxr-xr-x 1 maisvendoo users  4992 янв  1  1980 MSXDOS2.SYS
-rwxr-xr-x 1 maisvendoo users  6144 дек 23  1993 RRAMDISK.COM
drwx------ 2 maisvendoo users  4096 мар  7 19:55 UTILS


Создадим загрузочный диск средствами эмулятора
> diskmanipulator create msxc.dsk 720
> virtual_drive msxc.dsk
>diskmanipulator format virtual_drive

Мы создали новый диск и отформатировали его, добавив загрузочный сектор для запуска MSX-DOS. Теперь подшаманим немножко его содержимое. Во-первых добавим в каталог UTILS/ редактор AKID.COM, ибо идущий в комплекте E.COM ужасен. Далее отредактируем autoexec.bat дабы сразу включался режим 80x25 и редактор AKID.COM копировался на RAM-диск

MODE 80
PATH \
SET PROMPT=ON
SET ECHO=OFF
SET UPPER=ON
SET REDIR=ON
SET TIME 24
SET DATE dd-mm-yy
SET HELP=A:\HELP

utils\RRAMDISK 720
SET TEMP=H:\
COPY COMMAND2.COM H:\
SET SHELL=H:\COMMAND2.COM

mkdir h:\utils
mkdir h:\include
mkdir h:\src

path=h:\;h:\utils;
set include=h:\include

REM Copy system to ramdisk only if ramdisk was not recovered
SET COPY2RAM=NO
if not exist h:\utils\e.com set COPY2RAM=YES
if %COPY2RAM%==YES copy \utils\e.com + \utils\akid.com + \utils\meek.com + \bin h:\utils
if %COPY2RAM%==YES copy \main h:\
if %COPY2RAM%==YES copy \include h:\include
if %COPY2RAM%==YES b:
if %COPY2RAM%==NO h:
set COPY2RAM=


после чего копируем все данные каталога bootDisk/ на виртуальный флоп
> diskmanipulator import virtual_drive MSX-C-packege/bootDisk/


И ещё — нам не хватит оперативки. RAM-диск для MSX-C просит 720 Кб. А у нас всего 128 Кб. Так что нам придется подключить как минимум ещё 1Мб памяти. В реальности нам пришлось бы прикупить к «ямахе» модуль расширения памяти — таковые видимо были, раз в эмуляторе нам предлагается использовать «ромы»-расширители памяти. Подключаем расширение ram1mb при запуске эмулятора
$ openmsx -exta msxdos2 -extb ram1mb -machine Yamaha_YIS-805-128R2 -diska msxc.dsk

и, видимо всё ок, раз рамдиск создался в требуемом объеме и началось копирование файлов. Дожидаемся окончания процесса.


По его окончании переходим на диск H: и видим что на нем сформировались каталоги среды разработки на C. Кроме, того при загрузке были прописаны все необходимые переменные среды и мы можем приступить к пробе системы


Запускаем редактор
H:\> akid

И набиваем там код файла hello.c

выходим из редактора с сохранением (F1 -> E). Для сборки предусмотрен скрипт C.BAT. Скармливая ему исходник НЕ указываем раширение файла, иначе случится «бяка»
H:\> c hello

и наблюдаем за процессом сборки. Процесс дилтельный — выполняется разбор исходника, при котором выявляются синтаксические ошибки (утилита CF.COM), проверка параметров функций (FPC.COM), генерация ассемблерного кода (CG.COM), компиляция майкрософтовским макро-ассемблером (M80.COM) и наконец компоновка с RTL-библиотеками (L80.COM). После того как всё успешно закончится (я долго разбирался со всем этим, прежде чем собрал хелловорлд) можно попробовать запустить программу

и… она запустилась!

Так что, таки да, на «ямахе» был C. И на нем можно было писать программы

7. Отладка



Пошаговых отладчиков внутри IDE я не обнаружил, возможно плохо искал. В те времена когда я использовал единственный метод отладки — просмотр исходных текстов. А мог использовать, например MON80.COM, который идет в комплекте с Turbo Pascal 3.0.

MON80 — отладчик для MSX


Навскидку работа с ним простой не оказалось, поэтому оставлю тему отладки на продолжение цикла. Надеюсь, Вам понравилась эта статья

Продолжение следует...
Теги:
Хабы:
Всего голосов 19: ↑18 и ↓1+17
Комментарии34

Публикации

Истории

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область