Не, оберон в топку. cp/m похоже гонит бинарники, а не листинг. Видел некое кросс-средство под msx, это уже интереснее.
Вид для печати
Тут поступило ценное предложение, мопед не мой потому просто процитирую:
Исправить тест и перетестировать iar, hitech 7.50 и sdcc (iar не умеет оптимизировать деление на степень двойки, вызывает библиотечную функцию деления)
заменить
dest = (unsigned char*)(ScreenTable[atY]+atX/2);
на
dest = (unsigned char*)(ScreenTable[atY]+(atX>>1));
заменить
*dest = q | ((*src++)/16&0x0f);
на
*dest = q | (((*src++)>>4)&0x0f);
компилировать iar'ом с опциями
iccz80.exe -K -T -e -uua -g -s9 -q
Увы, пока некогда. Позже.
Но то, что ИАР так с делением на степени двойки обходится - слов нет... Это уже минус - т.к. придётся вручную править исходник при портировании.
- - - Добавлено - - -
1. Найди CP/M паскаль, который может генерить код под произвольный адрес, поставишь REXX, и будет тебе счастье.
2. Найди конвертер исходников, и тоже будет тебе счастье. ;)
Еще один компилятор Small C version C3.0R1.1 (SCC3) Chris Lewis (пока лишь для 8080, 8085 и 6809)
Все из категории СПО.
А также и сам кросс-ассемблер, последнюю версию которого планируют полностью включить в sdcc 3.6.0
http://shop-pdp.net/ashtml/asxxxx.htm
Если кто Linux Gentoo пользует, то будет полезной ссылка, не все там рабочее, но я работаю над тем, чтобы все работало.
У них все "неправильное", например System14 (a CP/M look alike / replacement for Z80 based systems), кстати в исходниках на ассемблере Z80.
А руки на что? Чтобы под себя править, исходники то есть, а это главное условие, чтобы править и совершенствовать инструменты, а не писать эмуляторы и трансляторы нативные для запуска проприетарных непотребностей.
Скажите почему функция курсор не работает? Должна менять позицию вывода. Правильно ли я получаю параметры в ассемблерных вставках?
#include <stdio.h>
#include <stdlib.h>
int print(char* string, unsigned int length );
void cursor(char x, char y);
void cls();
void pause (unsigned int delay);
int main()
{
int i=0;
cls();
print("TEST", 4);
pause(0);
cls();
for(i=0;i<11;i++){
cursor(i, 10);
print("TEST2", 5);
}
return 0;
}
int print(char* string, unsigned int length ){
__asm
ld hl, #2
add hl, sp
ld e, (hl)
inc hl
ld d, (hl)
inc hl
ld c, (hl)
inc hl
ld b, (hl)
call 8252
ret
__endasm;
}
void cursor(char x, char y){
__asm
ld hl, #2
add hl, sp
ld a, #2
call 5633
ld b, (hl)
inc hl
inc hl
ld c, (hl)
ld a,#22
rst 16
ld a, c
rst 16
ld a, b
rst 16
ret
__endasm;
}
void cls(){
__asm
call 3435
ld a, #2
call 5633
ret
__endasm;
}
void pause (unsigned int delay){
__asm
ld hl, #2
add hl, sp
ld c, (hl)
inc hl
ld b, (hl)
call 7997
ret
__endasm;
}
:v2_blink:Какой компилятор использовался Си? Для начала хотя бы. С какими параметрами компиляции? Какая платформа? Что это за вызовы внутри ассемблерный вставок?
Ощепринятый компилятор среди спектрумистов - SDCC. Параметры компиляции - -mz80, --no-std-crt0. Платформа - спекки48. Параметры линкера - --code-loc 0x7530, --data-loc 0xA530. Файл хекс прогнал через хекс2бин и бин2тап.
В функции курсор, сначала устанавливается поток 2( экран), затем вывадятся в поток управляющие символы - 22( позиция курсора) и переданые координаты вывода на экране. Результат - выводится TEST, пауза до нажатия клавиши, очистка экрана, вывод десять раз TEST2 в одно и тоже место на экране без смены позиции вывода. Позиция вывода должна меняться в цикле, но на экране изменения нет.
SDCC, меня аж дергает. Тут нужен специалист, который познал инь и ян:D А если серьезно посмотрите на выходе компилятора, что у вас получилось на ассемблере. У меня SDCC эти вставки (кусочки) иногда съедал без следа, и все это называлось оптимизацией.
И версию SDCC? От этого много зависит)