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

User Tag List

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 11 по 20 из 53

Тема: SDCC - Small Device C Compiler

  1. #11
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    1 а что если при включении нужной банки она уже и так включенна?
    2 а что если вместе с ней выключиться кусок стека или кода на который указывает вектор прерывания или который сейчас выполняется?

  2. #12
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Лучше б они возможность размещать глобальные переменные в кодовом сегменте сделали. Объявлять нужные переменные константами и обращаться к ним через указатели очень не айс. Есть какой-то макрос для этого, но для z80 он не работает.
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

  3. #13
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    1 а что если при включении нужной банки она уже и так включенна?
    Компилятор вставляет минимально необходимое кол-во вызовов функции переключения банка. (это в мануале написано: SDCC inserts the minimum possible number calls to the bank selection functions. )

    Цитата Сообщение от bigral Посмотреть сообщение
    2 а что если вместе с ней выключиться кусок стека или кода на который указывает вектор прерывания или который сейчас выполняется?
    Программист в ответе за правильный setup памяти (где код/данные/стек).
    Просто нужно, один раз, правильно сконфигурить раскладку памяти для программы и юзать.
    V6Z80P - Back for Good

  4. #14
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eltaron Посмотреть сообщение
    Лучше б они возможность размещать глобальные переменные в кодовом сегменте сделал
    А чем не нравится обычное расположение переменных в сегменте данных ?
    V6Z80P - Back for Good

  5. #15
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию SDCC и подпрограммы на асме

    Цитата Сообщение от Eltaron Посмотреть сообщение
    попутно вспомнил, чем еще раздражает sdcc - решетками # перед числами в асме. Мозг отказывается воспринимать такие числа не как hex
    Цитата Сообщение от Valen Посмотреть сообщение
    Да, есть такая бяка.
    Поэтому использую sdcc asm, только для маленьких inline кусочков асм кода.
    Если нужно кодить на асме много, просто юзаю другой асм компилятор (с более удобным синтаксисом) и затем уже линкую скомпиленный асмом бинарь к бинарю sdcc.
    Цитата Сообщение от Eltaron Посмотреть сообщение
    а как, руками? там форматы все какие-то самописные и ни с чем не совместимые вроде бы
    Цитата Сообщение от Valen Посмотреть сообщение
    Да, руками бинарники объединяю.
    (например, вызываю bin2c для асмовского бинарника и потом просто #include в sdcc Си файл или же загружаю файл асмовского бинарника, при старте программы)
    Цитата Сообщение от Eltaron Посмотреть сообщение
    Вариант, но ведь так теряется вся полезная инфа - положение глобальных переменных, имена, адреса функций...
    Да, получается так.
    Последний раз редактировалось Valen; 26.02.2012 в 17:07.
    V6Z80P - Back for Good

  6. #16
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я пару месяцев назад начал патчить sdcc, чтоб научить его генерировать asm-код, совместимый с ассемблером из GNU binutils for z80. Если закончу, можно будет линковаться через обычные объектные файлы в coff-формате.
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

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

  8. #17
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eltaron Посмотреть сообщение
    Я пару месяцев назад начал патчить sdcc, чтоб научить его генерировать asm-код, совместимый с ассемблером из GNU binutils for z80. Если закончу, можно будет линковаться через обычные объектные файлы в coff-формате.
    Интересная мысль.

    (На досуге гляну, какой там синтаксис/возможности у асм-а из binutils-z80.)
    V6Z80P - Back for Good

  9. #18
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Valen Посмотреть сообщение
    А чем не нравится обычное расположение переменных в сегменте данных ?
    Тем, что они инициализируются при старте. На килобайт данных три килобайта кода инициализации. Константы же сразу инициализированными создаются, через DEFB. Но в константы писать нельзя, и приходится извращаться
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

  10. #19
    Activist
    Регистрация
    21.12.2005
    Адрес
    Kyiv/Ukraine
    Сообщений
    415
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию пример кодогенерации SDCC 3.1.2

    Примерчик, чтобы был.

    Ситуация:
    В видео-памяти лежит 15 фонтов, размером 8x8 (1байт на пиксел). Фонты занимают 12 страниц видео памяти (0-11).
    (Любую страницу видео-памяти, можно подключить в 8KB адресное окно z80 и затем уже в этом окне, z80 может работать с видео-памятью.)

    Нужно:
    Пройтись по этим фонтам и присвоить не-нулевым пикселям нужный цвет. Цвет для каждого фонта разный, рассчитывается по ходу дела.

    Заметка:
    4 байта локальных переменных легло на регистры z80.
    Остальные переменные объявлены как static, что ускорит обращение к ним через константный адрес, а не через стэк и ix (например ld a,(ix+1) )
    Код:
    #define FONT_8x8_SIZE   (96UL*8*8)        // chunky font size
    
    void Display_SetFontPixelColors(void)
    {
    
        BYTE* pFont = (BYTE*)VIDEO_BASE;
        WORD counter = 0;
    
        static BYTE fontColor = 1;
        static BYTE video_page = 0;
    
    
        PAGE_IN_VIDEO_RAM();
        SET_VIDEO_PAGE(video_page);
    
        while(video_page < 12) {
            // modify pixel
            if(*pFont)
                *pFont = fontColor;           // if pixel is not zero, set pixel to font color
            pFont++;
            if(pFont >= (BYTE*)VIDEO_BASE + 0x2000) {
                pFont = (BYTE*)VIDEO_BASE;
                video_page++;                // inc video page
                SET_VIDEO_PAGE(video_page);
            }
    
            counter++;
            if(counter >= (WORD)FONT_8x8_SIZE) {
                counter = 0;
                fontColor++;   // inc font color
            }
    
        }
    
        PAGE_OUT_VIDEO_RAM();
    
    }
    Код:
    ;	---------------------------------
    ; Function Display_SetFontPixelColors
    ; ---------------------------------
    _Display_SetFontPixelColors_start::
    _Display_SetFontPixelColors:
    ;src/fs/display_tilemap.c:409: BYTE* pFont = (BYTE*)VIDEO_BASE;
    	ld	de,#0x2000
    ;src/fs/display_tilemap.c:410: WORD counter = 0;
    	ld	bc,#0x0000
    ;src/fs/display_tilemap.c:416: PAGE_IN_VIDEO_RAM();
    	in	a,(_io__sys_mem_select)
    	set	6, a
    	out	(_io__sys_mem_select),a
    ;src/fs/display_tilemap.c:417: SET_VIDEO_PAGE(video_page);
    	ld	a,(#_Display_SetFontPixelColors_video_page_1_122 + 0)
    ;src/fs/display_tilemap.c:419: while(video_page < 12) {
    	ld	(#_mm__vreg_vidpage + 0),a
    00107$:
    	ld	iy,#_Display_SetFontPixelColors_video_page_1_122
    	ld	a,0 (iy)
    	sub	a, #0x0C
    	jr	NC,00109$
    ;src/fs/display_tilemap.c:421: if(*pFont)
    	ld	a,(de)
    	or	a, a
    	jr	Z,00102$
    ;src/fs/display_tilemap.c:422: *pFont = fontColor;           // if pixel is not zero, set pixel to font color
    	ld	a,(#_Display_SetFontPixelColors_fontColor_1_122 + 0)
    	ld	(de),a
    00102$:
    ;src/fs/display_tilemap.c:423: pFont++;
    	inc	de
    ;src/fs/display_tilemap.c:424: if(pFont >= (BYTE*)VIDEO_BASE + 0x2000) {
    	ld	a,d
    	sub	a, #0x40
    	jr	C,00104$
    ;src/fs/display_tilemap.c:425: pFont = (BYTE*)VIDEO_BASE;
    	ld	de,#0x2000
    ;src/fs/display_tilemap.c:426: video_page++;                // inc video page
    	ld	iy,#_Display_SetFontPixelColors_video_page_1_122
    	inc	0 (iy)
    ;src/fs/display_tilemap.c:427: SET_VIDEO_PAGE(video_page);
    	ld	a,0 (iy)
    	ld	iy,#_mm__vreg_vidpage
    	ld	0 (iy),a
    00104$:
    ;src/fs/display_tilemap.c:430: counter++;
    	inc	bc
    ;src/fs/display_tilemap.c:431: if(counter >= (WORD)FONT_8x8_SIZE) {
    	ld	a,b
    	sub	a, #0x18
    	jr	C,00107$
    ;src/fs/display_tilemap.c:432: counter = 0;
    	ld	bc,#0x0000
    ;src/fs/display_tilemap.c:433: fontColor++;   // inc font color
    	ld	iy,#_Display_SetFontPixelColors_fontColor_1_122
    	inc	0 (iy)
    	jr	00107$
    00109$:
    ;src/fs/display_tilemap.c:438: PAGE_OUT_VIDEO_RAM();
    	in	a,(_io__sys_mem_select)
    	and	a, #0xBF
    	out	(_io__sys_mem_select),a
    	ret
    _Display_SetFontPixelColors_end::
    Последний раз редактировалось Valen; 18.03.2012 в 21:15.
    V6Z80P - Back for Good

  11. #20
    --- Аватар для Shadow Maker
    Регистрация
    01.03.2005
    Адрес
    Саранск
    Сообщений
    5,823
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    235
    Поблагодарили
    100 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Valen, ты на будущее сразу сюда пиши все интересные фичи SDCC, если что полезное добавили, чтобы не плодить кучу тем.
    Свирепый агрессивно-депрессивный мордовец!
    Не уверен - не напрягай!

    Не сдавайся. Дыши?

    Virtual TR-DOS

Страница 2 из 6 ПерваяПервая 123456 ПоследняяПоследняя

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

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

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

Похожие темы

  1. ZX COMPILER
    от ALKO в разделе Программирование
    Ответов: 33
    Последнее: 13.01.2010, 02:15
  2. SDCC вокруг да около
    от andrews в разделе Программирование
    Ответов: 8
    Последнее: 26.03.2008, 08:16
  3. C compiler
    от vitasam в разделе Программирование
    Ответов: 17
    Последнее: 25.08.2005, 16:42
  4. An 8080/Z80 C Compiler
    от breeze в разделе Программирование
    Ответов: 1
    Последнее: 18.08.2005, 06:54

Ваши права

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