User Tag List

Показано с 1 по 10 из 53

Тема: SDCC - Small Device C Compiler

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    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

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

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

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

Эту тему просматривают: 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

Ваши права

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