User Tag List

Страница 17 из 19 ПерваяПервая ... 13141516171819 ПоследняяПоследняя
Показано с 161 по 170 из 189

Тема: Языки программирования

  1. #161

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    NovaStorm,
    Вроде бы можно. При использовании банкируемой модели все вызовы стандартных функций оборачиваются в прокси, указатели на дальнюю память, думаю, тоже.
    На досуге поближе познакомлюсь с этим компилером, заинтересовал
    Он еще под msp430 генерил более компактный код, нежели gcc. Правда имеющаяся среда разработки кривоватая...

  2. #162

    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm Посмотреть сообщение
    Кажется в IAR можно управлять вычислением указателей, не сталкивался? А то вот интересно, можно ли это применить для того, чтобы дать проге побольше памяти как при стандарном 7FFD, так и при более навороченном (4x16k)MMU? Сорцы uzi(x) как глотает? А то, я так понял, оно довольно старомодно писано...
    Что значит "управлять вычислением указателей"?
    В IAR модель памяти "banked" поддерживает размещение констант и кода в расширенной памяти (насчёт переменных - не уверен).
    Написав функции вызова дальней процедуры и возврата оттуда можно дать проге до 64К*256 = 16М памяти (по максимуму). При размере страницы 16к -> 16К*256 = 4М.
    Существуют модели с таким объемом ОЗУ?

  3. #163

    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я тут состряпал примерчик, как на IAR под ZX-Spectrum 128 проектики собирать. Надеюсь, будет полезным.

    http://zx.pk.ru/attachment.php?attac...1&d=1173860306
    Вложения Вложения
    • Тип файла: zip sample.zip (49.7 Кб, Просмотров: 380)

  4. #164

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valker Посмотреть сообщение
    Я тут состряпал примерчик, как на IAR под ZX-Spectrum 128 проектики собирать. Надеюсь, будет полезным.

    http://zx.pk.ru/attachment.php?attac...1&d=1173860306
    Какой пароль в твоем iar*.rar 9M ?
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  5. #165

    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    Какой пароль в твоем iar*.rar 9M ?
    пароль speccy.wikispaces.com
    здесь всё написано: http://speccy.wikispaces.com/iar_cross

  6. #166

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valker Посмотреть сообщение
    Я тут состряпал примерчик, как на IAR под ZX-Spectrum 128 проектики собирать. Надеюсь, будет полезным.
    Имхо надо бы переписать файлик L08.s01- дюже монстроидальные процедурки. А поддержку многопамятности (разные расширения по памяти) обернуть в условную компиляцию.
    Компилятор интересный (а в этой ветке его ктото конкретно обкакал- типа код лажовый генерится, видать про -s9/-z9 и слыхом не слыхивал...), в ближайшее время думаю погонять его на своих разных тестах чтоб посмотреть как он генерит разные конструкции. По поводу передачи параметров в доке исчерпывающе написано, а вот про структуру- ничего нет.
    Пока на глаз прикинул следующие рекомендации по написанию кода (часть из них нашла подтверждение в мануале):
    -где возможно использовать беззнаковые операнды (в частности там, где имеются сравнения). При этом читать предупреждения компилятора, он ловит бессмысленные сравнения.
    -где возможно использовать операнды меньшей разрядности (если счетчик от 0 до 100, то 1 байта ему будет с головой)
    -использовать общие переменные только если это действительно надо (в моем вышеприведенном тесте имеются общие переменные типа i,j,k...), для временных переменных использовать локальные. Это позволит компилятору хранить их в регистрах.

    Остальные рекомендации допишу когда детально все пощщупаю

  7. #166
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #167

    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Имхо надо бы переписать файлик L08.s01- дюже монстроидальные процедурки. А поддержку многопамятности (разные расширения по памяти) обернуть в условную компиляцию.
    Естественно. Всё делалось в режиме эксперимента - заработает/не заработает. Как минимум, табличку можно по круглому адресу положить.
    Цитата Сообщение от Vitamin Посмотреть сообщение
    Компилятор интересный (а в этой ветке его ктото конкретно обкакал- типа код лажовый генерится, видать про -s9/-z9 и слыхом не слыхивал...), в ближайшее время думаю погонять его на своих разных тестах чтоб посмотреть как он генерит разные конструкции. По поводу передачи параметров в доке исчерпывающе написано, а вот про структуру- ничего нет.
    Я заметил, что иногда этот компилятор генерит лишние команды пересылки между регистрами. А про какую "структуру" ничего нет?
    Цитата Сообщение от Vitamin Посмотреть сообщение
    Пока на глаз прикинул следующие рекомендации по написанию кода (часть из них нашла подтверждение в мануале):
    Ещё: часто вызываемые процедуры размещать в нижней памяти (модификатор non_banked) - это позволит сократить время вызова/возврата.

    В контексте использования С-компилятор + эмулятор хорошо бы какой-нибудь профайлер придумать, чтобы узкие места обнаруживать и на ассемблере переписывать.

  9. #168

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valker Посмотреть сообщение
    заметил, что иногда этот компилятор генерит лишние команды пересылки между регистрами. А про какую "структуру" ничего нет?
    Ну это следствие недостаточно гибкой модели распределения ролей регистров имхо.

    Про структуру- надо глянуть как он генерит switch/case конструкции при разном количестве ветвей (проверки или таблица и где порог принятия решения) и как склеивает ветки если надо, какие конструкции лучше использовать.
    Например в вышеуказанном примере var = var + 1; дало далеко не оптимальный код. Вот надо глянуть, что будет при var += 1; и var++/++var. Плюс как он делает постфиксный/префиксный инкремент если нужен результат (ну префиксный это понятно...).
    Может ли сам делать подстановку тела процедуры в код вместо вызова (например для memcpy). Как выворачивает целочисленное умножение (что сдвигами, а что вызовом) или деление (не уверен что его вообще сдвигами делает). Как делается вызов функции по указателю.


    Цитата Сообщение от valker Посмотреть сообщение
    В контексте использования С-компилятор + эмулятор хорошо бы какой-нибудь профайлер придумать, чтобы узкие места обнаруживать и на ассемблере переписывать.
    По поводу эмулятора- легко можно написать программку конверсии итогового хекс-дампа в снапшот. Формат там такой
    [Sn][Len][00][data][crc]

    Sn- неизвестно... наверное описание области прошивки(?)
    Len- количество следующих за ним байт (включая 00 и crc)
    crc- подбирается таким образом, что сумма всех полей, начиная с len и до конца заканчивается на 255.
    Для строк типа S2 первые 2 байта data содержат адрес в big endian формате

    Ты C-spy щупал? он только с железяками дружит или к нему можно прикрутить программный эмуль?

  10. #169

    Регистрация
    27.01.2005
    Адрес
    С.-Петербург
    Сообщений
    93
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    По поводу эмулятора- легко можно написать программку конверсии итогового хекс-дампа в снапшот. Формат там такой
    [Sn][Len][00][data][crc]

    Sn- неизвестно... наверное описание области прошивки(?)
    Len- количество следующих за ним байт (включая 00 и crc)
    crc- подбирается таким образом, что сумма всех полей, начиная с len и до конца заканчивается на 255.
    Для строк типа S2 первые 2 байта data содержат адрес в big endian формате
    Формат называется motorola srec. Вот тут описалово: http://www.amelek.gda.pl/avr/uisp/srecord.htm. Для нас актуальны записи типа: 0,1,2,9. Я написал конвертер в sna-формат. Но не выкладывал (сырой он, плюс требует .NET2.0). Ежели нужно, могу выложить.
    Цитата Сообщение от Vitamin Посмотреть сообщение
    Ты C-spy щупал? он только с железяками дружит или к нему можно прикрутить программный эмуль?
    Не щупал. Я пока в unreal отлаживаюсь. Конечно, не хватает отладки по исходникам, но это не самое страшное.

  11. #170

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от valker Посмотреть сообщение
    Я написал конвертер в sna-формат. Но не выкладывал (сырой он, плюс требует .NET2.0). Ежели нужно, могу выложить.
    Дотнету- нет!

    Вот сырец моего конвертора (тока шо написал, еще не проверял).
    Не берет пока 128к режим (ибо не знаю пока как раскиданы адреса по страничкам). Компиляется под gnu-gcc, но должен собраться и под виндой и под досом (ничего специфичного).
    Имя выходного файла можно задать, иначе оно берется либо из секции 0 или имени входного файла.
    Код:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef unsigned char BYTE;
    typedef unsigned short WORD;
    
    #pragma pack(push, 1)
    struct SNA48
    {
        BYTE i;
        WORD hl_;
        WORD de_;
        WORD bc_;
        WORD af_;
        WORD hl;
        WORD de;
        WORD bc;
        WORD iy;
        WORD ix;
        BYTE intstat;
        BYTE r;
        WORD af;
        WORD sp;
        BYTE intmode;
        BYTE border;
        BYTE memory[49152];
    };
    
    struct SNA128
    {
        SNA48 hdr1;
        WORD pc;
        BYTE port7ffd;
        BYTE trdosrom;
        BYTE himemory[5 * 16384];
    };
    #pragma pack(pop)
    
    class FdEnv
    {
        FdEnv(const FdEnv&);
        FdEnv& operator = (const FdEnv&);
    public:
        FdEnv(FILE* fil) {if (! (file_ = fil)) throw "Cannot open file";}
        ~FdEnv() {fclose(file_);}
        operator FILE* () {return file_;}
    private:
        FILE* file_;
    };
    
    // usage: makesna -o output.sna -v -b0 -r24576 input.s01
    int main(int argc, char** argv)
    {
    SNA128 snapshot;
    unsigned verbose = 0;
    unsigned getname = 1;
    int result = 0;
    unsigned use128k = 0;
    unsigned startaddr =0;
    
    char* infile = NULL;
    const char* outfile = NULL;
    
        memset(&snapshot, 0, sizeof(snapshot));
        try
        {
    	if (argc < 2)
            {
        	    printf( "Convert .a01 -> sna\n"
    		    "Usage:\n"
    		    "%s [options] inputfile\n\n"
    		    "Options:\n"
    	    	    "-o <filename>   -- specify output file name (else it will be taken from dump or input filename)\n"
    	    	    "-v              -- be verbose\n"
    	    	    "-bN             -- set border to N\n"
    		    "-rN             -- set run address to N\n"
    	    	    , *argv);
    	    throw 1;
    	}
    	int argind = 1;
    	for (;;)
    	{
    	    if (argind == argc)
    		throw "Wrong parameters";
    	    if (argind == argc - 1)
    	    {
    		infile = argv[argind];
    		break;
    	    }
    	    if (! strcmp(argv[argind], "-v"))
    	    {
    		verbose = 1;
    		argind++;		
    	    } else
    	    if (! strcmp(argv[argind], "-o"))
    	    {
    		outfile = argv[argind + 1];
    		argind += 2;
    	    } else
    	    if (! strncmp(argv[argind], "-b", 2))
    	    {
    		snapshot.hdr1.border = atoi(argv[argind++] + 2) & 7;
    	    } else
    	    if (! strncmp(argv[argind], "-r", 2))
    	    {
    		startaddr = atoi(argv[argind++] + 2);
    	    }
    	}
    	
    	char outname[256] = {0};
    	{
        	    FdEnv file(fopen(infile, "rt"));
    	    char instr[520];
    	    BYTE dump[256];
    	    //prepare filename
    	    if (outfile)
    		strncpy(outname, outfile, 256);
    	    else
    		strncpy(outname, infile, 256);
    	    
        	    while (fgets(instr, 520, file))
        	    {
    		unsigned mode = 0;
    		unsigned count = 0;
    		if (sscanf(instr, "S%1i%02x", &mode, &count) != 2) throw "Wrong file!";
    		infile = instr + 4;
    		BYTE* out = dump;
    		unsigned crc = count;
    		unsigned cnt = 0;
    		while (sscanf(infile, "%02x", dump + cnt) && cnt != count)
    		{
    		    crc += dump[cnt++];
    		    infile += 2;
    		}
    		if (count != cnt) throw "Error in file!";
    		if (0xff != (crc & 0xff)) throw "Wrong crc!";
    		unsigned addr = (dump[0] << 24) | (dump[1] << 16) | (dump[2] << 8) | dump[3];
    		out = dump + 4;
    		switch (mode)
    		{
    		case 0:
    		    if (! outfile)
    		    {
    			memcpy(outname, dump + 2, cnt - 3);
    			outname[cnt - 3] = 0;
    		    }
    		    break;
    		case 1:
    		    out--;
    		    addr >>= 8;
    		case 2:
    		    out--;
    		    addr >>= 8;
    		case 3:
    		    if (addr & 0xffff0000) throw ">16 bit addresses are not supported";
    		    while (out != dump + cnt - 1)
    		    {
    			if (addr >= 0x4000 && addr < 0xffff)
    			    snapshot.hdr1.memory[addr - 0x4000] = *out;
    			out++;
    			addr++;
    		    }
    		    break;
    		case 5:
    		    break;
    		case 9:
    		    out--;
    		    addr >>= 8;
    		case 8:
    		    out--;
    		    addr >>= 8;
    		case 7:
    		    if (!startaddr) startaddr = addr;
    		    break;
    		default:
    		    throw "Unknown field type!";
    		}
        	    }
    	    if (startaddr & 0xffff0000) throw "> 16 bit start address is not supported";
    	    if (verbose)
    	    {
    		printf("Created %s\nPC=%#x\n", outname, startaddr);
    	    }
    	    if (use128k)
    		snapshot.pc = startaddr;
    	    else
    	    {
    		snapshot.hdr1.sp = 0x4000;
    		snapshot.hdr1.memory[0] = startaddr & 0xff;
    		snapshot.hdr1.memory[1] = startaddr >> 8;
    	    }
    	}
            infile = strrchr(outname, '.');
    	if (! infile) infile = strrchr(outname, 0);
            strcpy(infile, ".sna");
    	FdEnv file(fopen(outname, "wb"));
    	fwrite(&snapshot, use128k ? sizeof(SNA128) : sizeof(SNA48), 1, file);
        }
        catch (const char* msg)
        {
    	puts(msg);
    	result = 1;
        }
        catch (int val)
        {
    	result = val;
        }
        catch (...)
        {
    	puts("Unknown exception");
    	result = 1;
        }
        return result;
    }

Страница 17 из 19 ПерваяПервая ... 13141516171819 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •