Что-то вышло замудрено.
сборка:
Код:
set PATH=d:\!!____________prj\SDCC\bin\;%PATH%
sdcc -mz80 --no-std-crt0 --code-loc 0x8000 --data-loc 0 pi.c
hexameter pi.ihx
pause
в итоге получаю
Код:
?ASlink-Warning-Undefined Global '_putchar' referenced by module 'vprintf'
Как подпихнуть crt0.s ? и как его нужно изменить для печати? сов7 туплю.
- - - Добавлено - - -
ага, на сайте CPC было решение:
putchar_zx.s
Код:
;; FILE: putchar.s
;; Modified to suit execution on the Amstrad CPC
;; by H. Hansen 2003
;; Original lines has been marked out!
.area _CODE
_putchar::
_putchar_rr_s::
ld hl,#2
add hl,sp
ld a,(hl)
rst 16 ; call 0xBB5A
ret
_putchar_rr_dbs::
ld a,e
rst 16 ; call 0xBB5A
ret
причем ассемблер так прост, что давится на rst 10h
сборка:
Код:
set PATH=d:\!!____________prj\SDCC\bin\;%PATH%
sdasz80 -o putchar_zx.s
sdcc -mz80 --code-loc 0xA000 --data-loc 0 --no-std-crt0 putchar_zx.rel pi.c
hexameter pi.ihx
pause
Тащемта, новые способы создания носителей не интересны, наверное можно взять appmake.exe из z88 или собрать scl/trd на ужясме.
Вот только непонятна инициализация печати:
которую приходится впихивать в загрузчик.
Дальше смешнее. Вот исходник(pi.c):
Код:
#include <stdio.h>
int main()
{
int r[2800 + 1];
int i, k;
int b, d;
int c;
c=0;
for (i = 0; i < 2800; i++) {
r[i] = 2000;
}
for (k = 2800; k > 0; k -= 14) {
d = 0;
i = k;
for (;;) {
d += r[i] * 10000;
b = 2 * i - 1;
r[i] = d % b;
d /= b;
i--;
if (i == 0) break;
d *= i;
}
printf("%.4d", c + d / 10000);
c = d % 10000;
}
return 0;
}
Всё компилится, но при запуске печатается сплошное непотребство. На cp/m HiTech-C программа работает, если поменять типы данных с int на long.
Меняю так же, получаю фигувам.

В чем причина неясно - то ли сам накосячил, то ли в другом?