Важная информация

User Tag List

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 21 по 30 из 41

Тема: GCC 11.2.1 с поддержкой процессоров 1801вм1 и 1801вм2

  1. #21
    Member
    Регистрация
    26.03.2019
    Адрес
    г. Киев, Украина
    Сообщений
    98
    Спасибо Благодарностей отдано 
    133
    Спасибо Благодарностей получено 
    51
    Поблагодарили
    26 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    у PDP-11 слишком мало регистров, чтоб через них передавать параметры. Например, в том же i386 так же все через стек сделано. Только в AMD64 изменили ABI, плюс регистров добавили.

    Поломать GCC, чтоб передавать параметры через регистры -- можно. Вот только в внутри вызванной функции опять таки будет использоваться стек, чтоб сохранить R0...R4 на стек и уже относительно стека работать со значениями

  2. #22
    Activist Аватар для BlaireCas
    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    438
    Спасибо Благодарностей отдано 
    111
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    125 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от yu.zxpk Посмотреть сообщение
    Поломать GCC, чтоб передавать параметры через регистры -- можно
    Хакир Но возможно это не требуется. Ассемблерные процедурки которые требуют скорости - они вообще без параметров-же будут (ожидая значения в регистрах). А регистры можно загрузить через asm() как в примере там показано:

    #define RT11_TTYOUT(c) asm(" mov %[input_c],r0\n emt 0341\n bcs .-2\n" : : [input_c] "r" (c) : "r0", "cc" )

    Я не знаю что означают символы : : например, надо гуглить синтаксис. Но оно работает и судя по дизасму все верно делает. Вставляет код который загружает параметр в регистр R0 и вызывает EMT и надеюсь компилятор понимает что регистр R0 был использован и учитывает это.

    - - - Добавлено - - -

    Чего еще хочется от GCC - чтобы FIS инструкции (эти четыре FADD, FSUB, FDIV, FMUL) использовал и формат float-а был-бы DEC-овский. Например на УКНЦ эти инструкции повешены пусть и на прерывание, но у меня работали в какой-то версии RT-11.
    А то ценность сишника без плавучки нереально сильно падает.

  3. #23
    Member
    Регистрация
    26.03.2019
    Адрес
    г. Киев, Украина
    Сообщений
    98
    Спасибо Благодарностей отдано 
    133
    Спасибо Благодарностей получено 
    51
    Поблагодарили
    26 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я посмотрю, что можно сделать с поддержкой FIS для 1801ВМ2.
    Уже пора прикрутить тесты собранного кода на "железной" реализации 1801ВМ1 и 1801ВМ2 в виде FPGA.
    То есть разбираться с DejaGNU framework, написать минимальный ROM, который будет уметь только LDA грузить и работать с 1 COM-портом, сделать соотвествующее описание "board" в DejaGNU и методы работы с ним.
    Последний раз редактировалось yu.zxpk; 14.11.2021 в 16:07.

  4. Этот пользователь поблагодарил yu.zxpk за это полезное сообщение:

    Vslav (14.11.2021)

  5. #24
    Activist Аватар для BlaireCas
    Регистрация
    06.02.2020
    Адрес
    г. Москва
    Сообщений
    438
    Спасибо Благодарностей отдано 
    111
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    125 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Попробовал на УКНЦ комманды FIS, например FADD сработало. Вообще даже не встраивая их в сам GCC можно прикрутить обертки как я понимаю для операций с float. Но я не знаю какой формат GCCшного float-a да и конечно хорошо если бы они встроены были.
    Как пример теста - складывает 12.0 и 12.0 получается 24.0, работает норм. Команды типа fadd ассемблер понимает, уже плюс.

    test.c

    Код:
    #define _TTYOUT(c) asm(" mov %[input_c],r0\n emt 0341\n bcs .-2\n" : : [input_c] "r" (c) : "r0", "cc" )
    #define LOAD_R0(c) asm(" mov %[input_c],r0\n" : : [input_c] "r" (c) : "r0", "cc" )
    	
    /*
    	char* buf = "00000";
    	
    extern void rt11_decimal (unsigned int u)
    {
    	unsigned int k = 5;
    	while (u > 0) { buf[--k] = u%10+48; u = u/10; }
    	while (k < 5) RT11_TTYOUT(buf[k++]);
    }
    */
    
    extern void rt11_bin (unsigned int u)
    {
    	for (int k=0; k<16; k++) {
    		if (u&0x8000) _TTYOUT('1'); else _TTYOUT('0');
    		u = u<<1;
    	}
    }
    
    	unsigned int fbuf[4];
    
    void main()
    {
    	// 12.0f
    	unsigned int Ahi = 0b0100001001000000; // [1-bit sign] [8-bits exponent, 177=-1, 200=0, 201=1 etc] [24-bit mantissa with first hidden bit always assume = 1]
    	unsigned int Alo = 0b0000000000000000;
    	// 12.0f
    	unsigned int Bhi = 0b0100001001000000;
    	unsigned int Blo = 0b0000000000000000;
    	// output
    	rt11_bin(Ahi); rt11_bin(Alo); _TTYOUT('+'); _TTYOUT('\n'); _TTYOUT('\r');
    	rt11_bin(Bhi); rt11_bin(Blo); _TTYOUT('='); _TTYOUT('\n'); _TTYOUT('\r');
    	// struct for fis
    	fbuf[0] = Bhi;
    	fbuf[1] = Blo;
    	fbuf[2] = Ahi;
    	fbuf[3] = Alo;
    	// fadd
    	LOAD_R0(fbuf);
    	asm ("fadd r0\n");
    	// output
    	rt11_bin(fbuf[2]); rt11_bin(fbuf[3]);
    }
    [свернуть]
    Последний раз редактировалось BlaireCas; 14.11.2021 в 16:45.

  6. Этот пользователь поблагодарил BlaireCas за это полезное сообщение:

    yu.zxpk (14.11.2021)

  7. #25
    Member
    Регистрация
    26.03.2019
    Адрес
    г. Киев, Украина
    Сообщений
    98
    Спасибо Благодарностей отдано 
    133
    Спасибо Благодарностей получено 
    51
    Поблагодарили
    26 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    в DECUS есть реализации FADD, FSUB, FMUL. Это можно "притянуть" в GAS (GNU Asm)/GCC. Но вот отмаппить `float` на FIS -- не просто, кмк

  8. #26
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,624
    Спасибо Благодарностей отдано 
    2,207
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    109 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Директива asm в GCC имеет дополнительные параметры для макроподстановки входных и выходных аргументов. Думаю, мы должны их использовать вместо явного указания N(sp) и это, возможно, поможет правильно генерировать код в inline-функциях:

    Код:
    void Palette (int n)
    {
      asm("BICB $0177774, %0"::"g"(n)); // превращается в BICB $0177774, 02(sp)
      ...
    }

  9. #27
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,624
    Спасибо Благодарностей отдано 
    2,207
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    109 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Коллеги, как можно установить вручную адрес секции .data? У меня .data всегда устанавливается в адрес (.code + 0x2000)
    Хотя по содержимому скрипта pdp11-aout.ld этого и не скажешь.

    То есть, когда юзаются библиотеки с переменными, я получаю бинарник от 8 Кб.

    Простые неинициализированные переменные в .data ложатся раньше константного массива.

    Если выкусить секцию .data вообще:
    Код:
    pdp11-aout-objcopy.exe --only-section .text --output-target binary %1.out ..\%1.bin
    то мы получаем нормальный маленький бинарь, но константные массивы тоже выкусываются.

    В идеале хотелось бы, чтобы константный массив ложился в секцию .data раньше, чем неинициализированные переменные (чтобы не увеличивать ими размер бинаря).

    Пробовал пихать код и данные в одну секцию .text:

    Код:
    OUTPUT_FORMAT("a.out-pdp11")
    ENTRY(start)
    phys = 00001000;
    SECTIONS
    {
      .text phys : AT(phys) {
        code = .;
        *(.text)
        *(.rodata);
        data = .;
        *(.data)
      }
      end = .;
    }
    Но с таким скриптом сборки переменные налазят на константный массив и занимают с ним одно адресное пространство. Помогает ALIGN:

    Код:
    OUTPUT_FORMAT("a.out-pdp11")
    ENTRY(start)
    phys = 00001000;
    SECTIONS
    {
      .text phys : AT(phys) {
        code = .;
        *(.text)
        *(.rodata)
        . = ALIGN(0100);
        data = .;
        *(.data)
      }
      end = .;
    }
    Но при таком решении приходится регулировать размер в ALIGN ручками, чтобы константный массив не налазил на переменные.

    В общем, нужен хороший совет. Как сделать, чтобы секция .data ложилась сразу после секции кода?

  10. #28
    Master Аватар для Sandro
    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    590
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    115 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от BlaireCas Посмотреть сообщение
    Попробовал на УКНЦ комманды FIS, например FADD сработало. Вообще даже не встраивая их в сам GCC можно прикрутить обертки как я понимаю для операций с float. Но я не знаю какой формат GCCшного float-a да и конечно хорошо если бы они встроены были.
    IEEE-754 single precision, разумеется. Который совместим с плавучкой от PDP-11, только слова в обратном порядке.

  11. #29
    Member
    Регистрация
    26.03.2019
    Адрес
    г. Киев, Украина
    Сообщений
    98
    Спасибо Благодарностей отдано 
    133
    Спасибо Благодарностей получено 
    51
    Поблагодарили
    26 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Полезно посмотреть на *.map файл, там будет раскладка символов по адресам.
    ALIGN можно сделать маленьким, хоть 010.
    Не инициализированные переменные ложатся в секцию BSS.

    Перезалил свои примеры `hello-gcc` на github.

    https://github.com/yshestakov/pdp11-.../pdp11-aout.ld

  12. #30
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,624
    Спасибо Благодарностей отдано 
    2,207
    Спасибо Благодарностей получено 
    143
    Поблагодарили
    109 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насчёт ALIGN'а понятно, спасибо. Непонятно почему наслаиваются друг на друга переменные и конст. массив. И почему задано такое огромное окошко между .text и .data (0x2000). И как задать его размер. Это ведь не ALIGN 0100 так работает. Даже если убрать ALIGN - будет то же самое.

    Среди опций pdp11-aout-objcopy.exe вроде бы нужных нет (чтобы задать размер окна между .text и .data).

    Да, один нюанс: я экспериментирую с генерацией не в .sav, а в .bin для БК-0010/0011. Возможно, дело в этом.

    Попробуйте генерить .bin и использовать переменные из других модулей и библиотек. Также я могу залить свой пример, чтобы помочь воспроизвести проблему (только вот кто будет его ковырять?)

    - - - Добавлено - - -

    Цитата Сообщение от yu.zxpk Посмотреть сообщение
    Не инициализированные переменные ложатся в секцию BSS.
    Вы в этом точно уверены? Мне так не показалось. По-моему, GCC для PDP-11 вообще не использует секцию .bss

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Вопрос по 1801ВМ1
    от svinka в разделе БК-0010/0011
    Ответов: 35
    Последнее: 27.02.2022, 21:22
  2. Оберон/GCC для УКНЦ/БК
    от Oleg N. Cher в разделе ДВК, УКНЦ
    Ответов: 22
    Последнее: 10.11.2021, 11:15
  3. отладочный модуль на 1801ВМ1
    от Случайность в разделе ДВК, УКНЦ
    Ответов: 16
    Последнее: 21.04.2020, 14:55
  4. 1801ВМ2 А и Б
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 03.05.2010, 11:51

Ваши права

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