ssfire.c
来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 164 行
C
164 行
/* * Copyright (c) 2002-2004, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is part of the Contiki desktop environment * * $Id: ssfire.c,v 1.1 2007/05/23 23:11:24 oliverschmidt Exp $ * */#include <stdlib.h>#include "ctk/ctk.h"#include "ctk/ctk-draw.h"#include "ctk/ctk-mouse.h"#include "contiki.h"#include "sys/loader.h"PROCESS(ssfire_process, "Fire screensaver");static unsigned char flames[8*17];static const unsigned char flamecolors[16] = {COLOR_BLACK, COLOR_BLACK, COLOR_BLACK, COLOR_RED, COLOR_LIGHTRED, COLOR_YELLOW, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE, COLOR_WHITE}; /*---------------------------------------------------------------------------*/static voidfire_init(void){ unsigned char *ptr, *cptr; /* Fill screen with inverted spaces. */ cptr = COLOR_RAM; for(ptr = (unsigned char *)0x0400; ptr != (unsigned char *)0x07e8; ++ptr) { *ptr = 0xa0; *cptr++ = 0x00; } SID.v3.freq = 0xffff; SID.v3.ctrl = 0x80; SID.amp = 0; VIC.ctrl1 = 0x1b; /* $D011 */ VIC.addr = 0x17; /* $D018 */ VIC.ctrl2 = 0xc8; /* $D016 */ VIC.bordercolor = 0x00; /* $D020 */ VIC.bgcolor0 = 0x00; /* $D021 */ CIA2.pra = 0x03; /* $DD00 */}/*---------------------------------------------------------------------------*/#pragma optimize(push, off)static voidfire_burn(void){ /* Calculate new flames. */ asm("ldy #$00");loop1: asm("lda %v+7,y", flames); asm("clc"); asm("adc %v+8,y", flames); asm("adc %v+9,y", flames); asm("adc %v+16,y", flames); asm("lsr"); asm("lsr"); asm("sta %v,y", flames); asm("iny"); asm("cpy #(8*15)"); asm("bne %g", loop1); /* Fill last line with pseudo-random data from noise generator on voice 3. */ asm("ldy #$05");loop2: asm("ldx #$20");delay: asm("dex"); asm("bne %g", delay); asm("lda $D41B"); asm("and #$0F"); asm("sta %v+8*15+1,y", flames); asm("dey"); asm("bpl %g", loop2);}#pragma optimize(pop)/*---------------------------------------------------------------------------*/static unsigned char *flameptr, *colorptr1, *colorptr2;static unsigned char x, y;static voidpollhandler(void){ if(ctk_mode_get() == CTK_MODE_SCREENSAVER) { fire_burn(); /* Display flames on screen. */ flameptr = flames; colorptr1 = COLOR_RAM + 40*10; colorptr2 = colorptr1 + 0x20; for(y = 0; y < 15; ++y) { for(x = 0; x < 8; ++x) { colorptr1[x] = colorptr2[x] = flamecolors[flameptr[x]]; } colorptr1 += 0x28; colorptr2 += 0x28; flameptr += 8; } }}/*---------------------------------------------------------------------------*/PROCESS_THREAD(ssfire_process, ev, data){ PROCESS_POLLHANDLER(pollhandler()); PROCESS_BEGIN(); ctk_mode_set(CTK_MODE_SCREENSAVER); ctk_mouse_hide(); fire_init(); PROCESS_WAIT_EVENT_UNTIL(ev == ctk_signal_screensaver_stop || ev == PROCESS_EVENT_EXIT); ctk_draw_init(); ctk_desktop_redraw(NULL); PROCESS_END();}/*---------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?