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

от автора


Введение

Давным давно, в далекой Галактике, когда жесткие диски были не более 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 дискетой.

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

A> mode 80 

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

Содержимое 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 дабы сразу включался режим 80×25 и редактор 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

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

Продолжение следует…

ссылка на оригинал статьи http://geektimes.ru/post/246854/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *