Введение
Давным давно, в далекой Галактике, когда жесткие диски были не более 100 Мб (а кое где их и не было вовсе), шина адреса всего 16 бит, о графических 3D-ускорителях никто, или почти никто даже не помышлял, а Интернет приходил в редкие дома, по мокрым бельевым веревкам через пищащие коробки…
В общем тогда люди тоже писали программы. Учились их писать, писали, и даже продавали потом. Ностальгия по старым школьным компьютерам побудила меня, вооружившись эмулятором, гуглом, и собственными руками, переменного радиуса кривизны, вспомнить как это было самому а потом рассказать вам. Добро пожаловать под кат.
Теплый и, в каком-то смысле, ламповый монитор прошлого...
Что нужно для разработки? Во все времена необходимый минимум состоял из:
- Редактора для работы с исходным кодом
- Транслятора исходного кода в машинные инструкции
- Отладчика
и ничего нового тут, в общем-то и нет. Ещё мы обязаны определится с операционной системой, где будем работать. Я буду излагать всё нижеследующее применительно к 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/.
Например, мы хотим подключить мышь (мышь была на учительском компе, фото поместил под спойлер)
Для этого выполняем команду
> 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 %1kids;%1tools;%1utility
Это для того, чтобы мы не потеряли возможность использовать командную оболочку, если нам вдруг потребуется временно извлечь дискету с системой. А такая необходимость преиодически возникает — места на дискетах мало, дисководов всего два (это в лучшем случае), так что тасовать дискеты приходилось довольно часто. Меня, до университета не видевшего компа с 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:tortore
Внутри редактор выглядит товарно
Окно редактирования TOR
и позволяет работать с несколькими (до десяти) файлами в разных буферах (почти как vim/emacs). Управление может показаться «двинутым», но для того времени наверное всё было ок и дело привычки (надо же, уже успел позабыть...). Например, чтобы вставить строку между двух строк надо шлепать Ctrl + Enter а не просто Enter. Ну и так далее. Благо, справка и меню на русском и достаточно подробно
Выход из редактора
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, который запускается из шелл
Интересен ассемблерный выхлоп
; 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
utilsRRAMDISK 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:utilse.com set COPY2RAM=YES
if %COPY2RAM%==YES copy utilse.com + utilsakid.com + utilsmeek.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
Навскидку работа с ним простой не оказалось, поэтому оставлю тему отладки на продолжение цикла. Надеюсь, Вам понравилась эта статья
Продолжение следует...
Автор: maisvendoo