PDA

Просмотр полной версии : адаптация CP/M-программ под стандартный ZX-Spectrum



siril
18.04.2013, 12:09
Под CP/M существует довольно много полезных и потенциально полезных программ.

Каков алгоритм переноса CP/M-программы в стандартный режим ZX Spectrum'а?

Я так понимаю, что если у нас есть исходник переносимой программы, то:

1) пытаемся скомпилировать его под ZXCPM (http://zx.pk.ru/showthread.php?t=155). (Кстати, возможно ли переделать её под BASE - 4000, TPA - 4100. А в bios реализовать переключение в 7-ю страницу для вывода текста на экран #c000, и стоит ли такой изврат выгоды в 8 килобайт?)

Вопрос а) перекомпилированы ли под ZXCPM основные средства разработки? PL/pascal/etc и с чем есть проблемы?

Если у нас получилось скомпилировать приложение под ZXCPM и оно работает - значит принципиальная возможность его работы в обычном спектрумовском режиме доказана и есть в наличии, следовательно можно попытаться адаптировать получившийся код к спектрумовскому режиму (заменой библиотек с процедурами ввода/вывода). Как это лучше всего сделать?

Если исходника нет, то?

Какие тут есть возможности? чем декомпилировать? (с осмысленной интерпретацией системных вызовов) каков формат .com файла? Как в CP/M организована работа с прерываниями?

Vadim
18.04.2013, 12:34
Может не заниматься ерундой? А запустить CP/M на спектрум +3, хотя бы. Или на Профи/ATM?

siril
18.04.2013, 12:40
Может не заниматься ерундой? А запустить CP/M на спектрум +3, хотя бы. Или на Профи/ATM?

Vadim, если бы стояла задача запустить что-то в режиме CP/M, я бы так и спросил.

есть что сказать по существу вопроса? Для каких средств разработки есть исходники (и где)? какие есть декомпиляторы под CP/M?

Eltaron
18.04.2013, 12:48
Если есть исходник, а программа написана нормально (=вся работа с диском, экраном и клавиатурой идет через BDOS), то достаточно реализовать те BDOS-функции, которые она использует. Их обычно мало - я эмулятор CP/M для PC, способный запускать ассемблер M80 и Hitech C, написал за вечер.
После чего заменить все CALL 5 с соответствующими LD на вызовы новых функций.

Как я понимаю, ZXCPM именно это и делает. Что значит, что ассемблерный CP/M исходник под ней соберется, но не заработает - точку входа в BDOS всё равно надо менять.

Если исходников нет, то путь один - дизассемблирование com-файла (внутри это голый код без заголовков, который кладется по адресу 0x100 и с него же исполняется), а дальше та же самая замена CALL 5 на свои функции.

siril
18.04.2013, 13:04
Если есть исходник, а программа написана нормально (=вся работа с диском, экраном и клавиатурой идет через BDOS)
это относится только к программам на ассемблере? (их можно попытаться откомпилить и в спектрумовских асмах).

а если исходники на паскале, С, PL/M?

есть ли исходники этих компиляторов (где-нибудь) и можно ли их перекомпилировать под ZXCPM, либо, скомпилировать с их помощью под обычной CP/M на другой рабочий адрес? (не под 0x0100)

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


После чего заменить все CALL 5 с соответствующими LD на вызовы новых функций.
Не подскажешь где есть подробное описание точек входа? (что-то вроде этого? (http://www.seasip.demon.co.uk/Cpm/bdos.html))


Если исходников нет, то путь один - дизассемблирование com-файла (внутри это голый код без заголовков, который кладется по адресу 0x100 и с него же исполняется), а дальше та же самая замена CALL 5 на свои функции.

Кроме как через CALL 5 в правильной CP/M программе взаимодействие с системой как-то осуществляется?

Какой-то стоящий подробный мануал для программиста по внутреннему устройству CP/M можешь подсказать? (в интернетах искал, но по CP/M гуглы ничего лучше чем мануал для пользователя не находили).

Eltaron
18.04.2013, 14:02
это относится только к программам на ассемблере? (их можно попытаться откомпилить и в спектрумовских асмах).

а если исходники на паскале, С, PL/M?

Ну, компилятор-то всё равно выдает ассемблерный код. Проблема, скорее, в исходниках библиотек, которые этими компиляторами используются. Что с ними делать - не знаю. Наверное только дизассемблировать.


есть ли исходники этих компиляторов (где-нибудь) и можно ли их перекомпилировать под ZXCPM, либо, скомпилировать с их помощью под обычной CP/M на другой рабочий адрес? (не под 0x0100)
Тот компилятор, который лежит на дискете в ZXCPM, есть в исходниках - http://www.bdsoft.com/resources/bdsc.html
Hitech C бесплатен, но не открыт. Про остальные языки и компиляторы не в курсе.


(чтобы, например, заиметь 2 версии откомпилированного файла, с возможностью автоматически найти все изменяемые адреса переходов путём сравнения двух бинарников.)
Если компилер отделен от линкера (как в тех же Hitech C и BDC), то даже компилировать не надо, в объектном файле содержится информация о точках, где требуется релокация адреса.



Не подскажешь где есть подробное описание точек входа? (что-то вроде этого? (http://www.seasip.demon.co.uk/Cpm/bdos.html))

Да, оно.
Или еще http://atmturbo.nedopc.com/inf/bios_cpm.htm



Кроме как через CALL 5 в правильной CP/M программе взаимодействие с системой как-то осуществляется?
Есть еще BIOS, самая низкоуровневая часть CP/M, его использование не запрещено. Но на практике гораздо удобней использовать BDOS, поэтому подавляющее большинство программ в BIOS не лезет.


Какой-то стоящий подробный мануал для программиста по внутреннему устройству CP/M можешь подсказать? (в интернетах искал, но по CP/M гуглы ничего лучше чем мануал для пользователя не находили).
Где-то был мануал от Кворума, но там, по-моему, ровно то же, что и по твоей ссылке, и на сайте АТМ. Поищу на всякий случай.

caro
18.04.2013, 14:11
Какой-то стоящий подробный мануал для программиста по внутреннему устройству CP/M можешь подсказать? (в интернетах искал, но по CP/M гуглы ничего лучше чем мануал для пользователя не находили).Вот почитай для начала:

siril
18.04.2013, 14:27
@Eltaron: спасибо!


Вот почитай для начала:

отлично! спасибо!

в примере там есть процедура вычисления адреса BIOS:



ld hl,#0001

ясно, что по адресу #0000 стоит JP BIOS, означает ли это, что BIOS начинается с процедуры холодного старта?

esl
18.04.2013, 14:31
Если есть исходник, а программа написана нормально (=вся работа с диском, экраном и клавиатурой идет через BDOS)

не факт, она еще может определять доступную память читая из
0006: DW

она еще часто ходит в биос (т.к. это тоже стандартно и они имеют полное право)
там еще default fcb 005c, ....

а в общем то имхо смысла очень мало ....

Eltaron
18.04.2013, 14:34
означает ли это, что BIOS начинается с процедуры холодного старта?
Теплого


Список функций BIOS приведен в таблице 5.

Таблица 5.


г======T=============T===============T=========== ===============┐
│Номер │ Смещение │ Имя │ Назначение │
│функц │ HEX │ функции │ │
│======+=============+===============+============ ==============│
│ 0 │ 00 │ WarmBoot │ "Теплый старт" │
│------+-------------+---------------+--------------------------│
│Управление вводом-выводом │
│------T-------------T---------------T--------------------------│
│1 │ 03 │ ConSt │ Состояние консоли │
│2 │ 06 │ ConIn │ Ввод с консоли │
│3 │ 09 │ ConOut │ Вывод на консоль │
│4 │ 0D │ List │ Вывод на принтер │
│5 │ 0F │ Punch │ Вывод на перфоратор │
│6 │ 12 │ Reader │ Чтение с перфоленты │
│------+-------------+---------------+--------------------------+
│Управление дисковыми накопителями │
│------T-------------T---------------T--------------------------│
│7 │ 15 │ Home │ Установка головки │
│ │ │ │ на 0 трек │
│8 │ 18 │ SelDsk │ Выбор текущего дисковода│
│9 │ 1B │ SetTrc │ Установить номер тек. │
│ │ │ │ трека для операции │
│10 │ 1E │ SetSec │ Установить номер тек. │
│ │ │ │ сектора для операции │
│11 │ 21 │ SetDma │ Установить адрес DMA │
│12 │ 24 │ Read │ Чтение текущего сектора │
│13 │ 27 │ Write │ Запись текущего сектора │
│------+-------------+---------------+--------------------------│
│Дополнительные функции │
│------T-------------T---------------T--------------------------│
│14 │ 2A │ ListSt │ Опрос состояния принтера│
│15 │ 2D │ SecTran │ Пересчет номера сектора │
L======│=============│===============│============ ==============-

Vadim
18.04.2013, 20:05
если бы стояла задача запустить что-то в режиме CP/M, я бы так и спросил.
Мне непонятна сама идея. Порт софта из под ОСи, пусть и старой, в режим компа без оной. Не понимаю - зачем? Варианты эмуляции ОС ущербны. Исходники некоторых программ под CP/M есть, но они опять же ориентированы на то, что у нас есть система, которая поддерживает работу с файлами. А не трдос. Что делать? Прилеплять поддержку файлов? Перелопачивать программу? Смысла не вижу. Вот и написал.

artice
19.04.2013, 08:29
Согласен с предыдущим оратором! В cp/m свои графические и текстовые режимы! Придётся и процедуры вывода графики переделывать и саму графику перерисовывать, как-то так...

caro
19.04.2013, 09:26
Согласен с предыдущим оратором! В cp/m свои графические и текстовые режимы! Придётся и процедуры вывода графики переделывать и саму графику перерисовывать, как-то так...Нет там никакой графики, за редким исключением.
Основной режим текстовый, причем базовым является режим 80 символов в строке, что и является основной сложностью при адаптации таких программ под Спектрумовский экран, в котором максимально можно разместить 64 символа в строке.

Vadim
19.04.2013, 12:46
Нет там никакой графики, за редким исключением.
Слова о графике некорректны вообще, уже много раз читал: "графика и CP/M". Компьютер может иметь графические режимы, а программы, которые запускаются под управлением CP/M могут напрямую обращаться к аппаратуре. На многих 8-и битных компах как правило так и было (MSX, Amstrad CPC/PCW, Kaypro, Commodore и многие другие). Т.е. программного интерефейса ни в CP/M 2 ни в версии 3 нет. Аналогично в обоих MP/M. Единственным графическим расширением было GSX, но, насколько я знаю оно было только под CP/M 86.

caro
19.04.2013, 14:44
Вопрос а) перекомпилированы ли под ZXCPM основные средства разработки? PL/pascal/etc и с чем есть проблемы?
Сейчас под ZXCPM перекомпилированы:
1) Редактор текстов WordMaster (WM);
2) Пакет M80/L80/LIB80;
3) Компилятор под микроконтроллеры серии MSC51;
4) Компилятор C - версия BDSC.
TurboPascal есть в исходниках, но он требует свободной памяти в TPA не меньше 40 кбайт, а это в ZXCPM не возможно, учитывая что начало TPA = 0x6100.

PPC
19.04.2013, 15:36
Насчёт графики. GSX как раз изначально был 8-битный, и назывался GSX-80. Где-то в сети есть PDF с описанием, поищите. Под чем поддерживается, навскидку не вспомню. С GSX-80- 2 проблемы:он очень медленный, и в системе без банков отжирает в районе 13К плюс GSX BIOS (низкоуровневые драйверы для точки, линии, штриховок и т.п.)

Vadim
19.04.2013, 18:12
У меня где-то в коллекции неразобранной, возможно этот документ и есть. Но вот программ для этой библиотеки я не видел. Разбирая коллекцию я всё сортирую. Много разных дизассемблеров, утилит для вывода текст на принтер, файловых утилит (крайне простых), перекодировщиков текстов. Вот на них бывают исходники. Архиваторы тоже есть с исх.

siril
20.04.2013, 00:08
Мне непонятна сама идея. Порт софта из под ОСи, пусть и старой, в режим компа без оной. Не понимаю - зачем? Варианты эмуляции ОС ущербны. Исходники некоторых программ под CP/M есть, но они опять же ориентированы на то, что у нас есть система, которая поддерживает работу с файлами. А не трдос. Что делать? Прилеплять поддержку файлов? Перелопачивать программу? Смысла не вижу. Вот и написал.

Тут несколько аспектов, если честно об удивительно богатом наследии cp/m узнал совсем недавно, о том, что это в своё время это был очень развитый и коммерчески успешный стандарт, что программы, написанные для cp/m работают на очень разных по архитектуре компьютерах и работают без переделки (сам убедился на нескольких эмулях), и что тот же Zork и другие классические текстовые адвентюры были впервые написаны именно для неё.

Всё это богатство буквально на расстоянии вытянутой руки от спектрума – но по известным причинам в стандартном спектрумовском режиме cp/m работать не будет.

Однако ради фана и ради proof of concept мне интересно обкатать алгоритм адаптации произвольного cp/m кода: 1) через сбор информации о точках вызова системных функций путём перехвата этих функций и сбора/анализа содержимого стека, 2) интерактивное дизассемблирование с учётом информации собранной на первом этапе.

Для этапа 1 нехватало знаний и информации о внутреннем устройстве cp/m - в сети находилась только нерелевантная ерунда, спасибо большое caro, Eltaron, esl за наводки и материалы.

Подобный опыт в полуавтоматическом статическом и динамическом анализе чужого кода может быть полезным и в других обстоятелствах :)

Кстати, хотел ещё поспрашиват про cp/m на спектрум-клонах "вообще": была ли версия cp/m для графического режима Scorpion/GMX (тот, который с аппаратным скроллом)?
Как насчёт ZXCPM с базовым адресом #4000 и с экраном в 7-ой странице (что даёт нам 48кб, так как эмулятор теминала может быть в той же самой 7й странице).

Какие интерактивные дизассемблеры Z80 кроме IDA существуют? Которые могли бы подтягивать таблицу меток и заменять абсолютные адреса на них?

---------- Post added at 02:08 ---------- Previous post was at 02:04 ----------

И ещё, где брать софт под cp/m? Есть ли что-то вроде WOS/VirtualTRDOS, но с cp/m контентом?
Какое-то русскоязычное сообщество/хранилище русскоязычных документов по cp/m и российских клонов?

Vadim
20.04.2013, 05:59
И ещё, где брать софт под cp/m? Есть ли что-то вроде WOS/VirtualTRDOS, но с cp/m контентом?
Какое-то русскоязычное сообщество/хранилище русскоязычных документов по cp/m и российских клонов?

В инете есть несколько сайтов с коллекциями. В вики есть ссылки (англ). Поиск по словам CP/M programs. Есть сайты авторов некоторых программ (например тот же Aztec C). Есть ещё сайт одно немца, который дизасмом увлекается. Он и выложил исх. m80 и turbo pascal - то что я искал годами. Основная коллекция это "walnut creek cp/m cd-rom". Это файло-помойка. Некая структура там есть, но в общем свалка. Я свою коллекцию собираю из всего что найду. Одна и та же программа в том же cd-rom встречается много раз, бывает в разных версиях, то с описаниями то без. Я стараюсь делить программы по категориям, добавляя где не было краткое описание. Но уже год или полтора как опять забросил. Муторно очень.

---------- Post added at 07:59 ---------- Previous post was at 07:55 ----------


но по известным причинам в стандартном спектрумовском режиме cp/m работать не будет.
Но много чего будет работать на ZX +3. Проблемы с экраном конечно, медленный вывод, но принципиально конечно оно заработает.

PPC
20.04.2013, 06:35
У меня где-то в коллекции неразобранной, возможно этот документ и есть. Но вот программ для этой библиотеки я не видел.
Вот здесь можно забрать документацию на GSX80 которую я упоминал.
http://www.z80.eu/gsx.html
Там-же примеры работы GSX80 на 128м комоде с исходниками. Так что единый графический интерфейс у CP/M был. Просто к тому времени (1983) эта операционка как-бы помре в одночасье. А на отпочкованной MS-DOS до появления GDI в ранних окошках, единого графического интерфейса для прог как-бы не было, хотя Digital Research и предлагала GEM под MS-DOS, впрямую унаследованный от GSX уже в 84м году, но всем на это было как-бы наплевать.
http://toastytech.com/guis/gem11.html
Бизнес выбрал Микрософт, а дальше - по известной формуле, follow the money.
Мы могли бы жить в куда более совершенном мире, но случилось то что случилось.

А вообще, если CP/M программы нуждаются в рекомпиляции, значит машина не совсем CP/M - совместимая. Кстати, текстовый режим 80 символов в строке не является требованием, но некоторые проги типа WordStar, Multiplan или SuperCalc просто рассчитаны на такой текстовый режим и не могут реконфигуриться иначе. В CP/M была идеология что инсталляторы патчат .com файл на совместимость с управляющими esc последовательностями терминала и кол-во символов в строке и столбце, но не все этому следовали.

Vadim
20.04.2013, 14:16
В CP/M была идеология что инсталляторы патчат .com файл на совместимость с управляющими esc последовательностями терминала и кол-во символов в строке и столбце, но не все этому следовали.
Да да. Так и есть.

Бизнес выбрал Микрософт
Я думаю только по одной причине, 8-и битные компы того времени были слишком слабыми. Типичное значение тактовой частоты - 2,5Мгц. ОЗУ 64К и менее (страничной организации с более чем 64К было очень мало). IBM PC предлагал более продвинутые условия для программиста. CP/M-86 и пришла позднее чем 86DOS и не использовала новые возможности так широко как ДОС. Хотя, если сравнивать её с 1-й версией ДОС, то скорее всего они были примерно на одном уровне (за исключением ФС ФАТ12, которая всё же более продвинутый вариант ФС от CP/M, но прогресс налицо и удобство в программировании файловых операций, по сравнению с ФС CP/M).

Shadow Maker
20.04.2013, 16:40
А какие потенциально полезные CP/M программы имеются ввиду, если не секрет? Полезные в текущих реалиях, имею ввиду.

siril
20.04.2013, 17:54
А какие потенциально полезные CP/M программы имеются ввиду, если не секрет? Полезные в текущих реалиях, имею ввиду.

Следует учитывать, что "полезность" мера относительная и зависит от поставленных целей.
Я имел ввиду: z-machine interpreter (интересно как он реализован на 8bit архитектуре), LIB-библиотекарь, компиляторы.

Shadow Maker
21.04.2013, 00:37
Z-Machine вроде есть уже для Спека. http://vtrdos.ru/sbor.php
Так что разве что с академической точки зрения видимо. Компиляторы кросс-платформенные есть, вряд ли кто будет пользоваться. Ну это имхо.

siril
21.04.2013, 09:04
Z-Machine вроде есть уже для Спека. http://vtrdos.ru/sbor.php
Так что разве что с академической точки зрения видимо. Компиляторы кросс-платформенные есть, вряд ли кто будет пользоваться. Ну это имхо.

Да, про z-machine для спека знаю, надеялся найти для cp/m не на асме.