Hitech-C для Z80 в современности.

Postby fk0 » 16 Apr 2013, 07:36

Hitech-C (в кросс-версии для PC под DOS) на современном ПК не просто запустить. Проблемы две:

1) его IDE -- бесмыссленная и беспощадная, не работает нормально под NT... да и генерить файл для ZX из под неё в чистом виде не получится.
2) за пределами windows NT -- нужен дос...

Ввиду п.1 нужен ручной вызов всех необходимых программ (для компиляции). Вплоть до вызова cpp.exe, cgen.exe, p1.exe и т.п. по-отдельности. Как это делать можно подсмотреть у IDE (hpdz.exe). Саму IDE можно запускать в dosbox -- там будет работать ок.

Собственно п.2 решается тоже через dosbox. Вопрос -- как организовать взаимодействие dosbox с какой-то внешней IDE и т.п. Тут представляется разумным (в связке с п.1) такой вариант:

1) пишется Makefile под процесс компиляции со всеми опциями для получения бинарника на ZX.

2) Используетя make.exe под DOS внутри Dosbox.

3) Вывод (stdout и stderr) компилятора перенаправляется (google stderr.exe и stderr.pas для примера как) в файлы изнутри Makefile.

4) В конечном счёте Makefile создаёт, помимо компилируемых файлов, файл errors.txt (вывод компилятора и всех программ) и файл "ok" или "fail" (это всё делается из bat, см. ниже) в зависимости от кода ошибки возвращённого последней запущенной программой (т.к. нет возможности передать код возврата из Dosbox в вызвавшую его программу).

5) Для запуска используется тот же Makefile, в котором определяется, что он запущен не внутри dosbox, в таком случае выполняется команда "env SDL_VIDEODRIVER=dummy dosbox compile.bat" и после "errors.txt" копируется в stderr, анализируется файл "ok" или "fail" и возвращается соответствующий код в exit.

6) В compile.bat удаляются файлы "fail", "ok" и "errors.txt" делается stderr.exe make -f Makefile > errors.txt < nul и при ненулевом коде возврата создаётся файл "fail", иначе файл "ok" (echo. > ok).

В итоге в нормальной ОС (NT или Linux) просто делаем make (нужен GNU Makefile, нужен dosbox, нужен stderr.exe, нужен hitech-C) и оно как-будто бы работает.

Что нужно сделать: написать compile.bat, написать Makefile для примера, в Makefile написать какие программы и как вызывать, команды линкеру под модель памяти для ZX.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1522
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 16 Apr 2013, 07:49

Разумная модель памяти для ZX:

0000..3fff ПЗУ или ОЗУ (скорпион, ATM, пентагон с кешем и т.п.), в последнем случае то же, что и 4000..c000

4000..bfff специальный сегмент кода (постоянно доступен, если явно задан сегмент), сегмент данных (по-умолчанию), heap, на самом верху -- стек (ниже c000)

c000..ffff переключаемые банки ([0],1,3,4,6) содержат код (по-умолчанию) и данные (если явно задан семент для данных), банка 7 -- код (вывод символов и т.п.) и экран.

Практически можно расчитывать на ~80 кБайт кода и ~32 кБайт данных. Функции в банках вызываются через переключатель банок... либо в пределах модуля -- напрямую.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1522
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby breeze » 16 Apr 2013, 11:47

Ну ты б выложил что-нибудь в атачменте. Может быть общими усилиями и удалось чего запустить.
breeze
 
Posts: 538
Joined: 07 Feb 2009, 16:19
Group: Registered users

Postby TS-Labs » 16 Apr 2013, 18:06

Глянул в папку со своими экпериментами с хайтеком. Выяснилось, что компилил из его ужастного ИДЕ, хотя был уверен, что собирал батником...
TS-Labs
 
Posts: 1150
Joined: 19 Apr 2010, 10:10
Location: Wildest West
Group: Registered users

Postby alone » 24 Jun 2013, 15:23

0000-00ff - CP/M
0100-... - код (near)
4000-7fff - код (far)
...-XXXX - стек
XXXX-bfff - статические данные
c000-ffff - куча с пагами

Только так.
User avatar
alone
 
Posts: 152
Joined: 04 Jun 2007, 20:04
Group: Registered users

Postby fk0 » 24 Jun 2013, 17:50

Объём кода обычно существенно больше объёма данных. И код имеет смысл в банках. Смысл "near" и "far" ? Статические данные и near код считай одно и то же, нет смысла разделять, если код не в ПЗУ. И самое главное -- переключать банки для данных имеет смысл только если доступно одновременно N (где N >= 3) переключаемых банок (в разных адресах). Иначе непонятно как с такими данными работать (хотя бы на уровне проксорить два массива и положить в третий -- после каждого байта переключать?) А с кодом можно и через одну банку. Код в банках, считаю, возможен только после введения 4-килобайтных банок в 16 окнах (адресах).
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1522
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby alone » 24 Jun 2013, 18:04

fk0 wrote:Статические данные и near код считай одно и то же,

Как раз не одно и то же, потому что far код может работать со статическими данными, поэтому они всегда должны быть открыты.
User avatar
alone
 
Posts: 152
Joined: 04 Jun 2007, 20:04
Group: Registered users

Postby fk0 » 25 Jun 2013, 07:45

far код может работать и с near кодом... включая все библиотечные функции, например.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1522
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby alone » 25 Jun 2013, 08:13

Переходы, вызовы и возвраты происходят реже, чем доступ к переменным.
User avatar
alone
 
Posts: 152
Joined: 04 Jun 2007, 20:04
Group: Registered users


Return to ZX Spectrum

Who is online

Users browsing this forum: No registered users and 1 guest

cron