#include <16F88.h> #fuses HS, NOLVP, NOWDT, PUT, NOPROTECT, NOBROWNOUT, MCLR #use delay (clock=20000000) #use fast_io(A) #use fast_io(B) /* hsync interval */ #define H_INTERVAL 0xFEEF /* sync bit */ int1 bSync; #bit bSync = 5.0 /* video */ int8 cVid; #byte cVid = 6 /* 32bit * 60line */ int8 Lines0[60],Lines1[60],Lines2[60],Lines3[60]; const int8* Lines[4] = {Lines0,Lines1,Lines2,Lines3}; int8* p; int8 v0,v1,v2,v3; #define PUT_32BIT \ cVid = v0; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid = v1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid = v2; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid = v3; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2);\ cVid <<= 1; delay_cycles(2); cVid <<= 1; delay_cycles(2); /* vertical sync */ int1 LineField = 0; int8 LineIdx = 0; void VerticalSync(){ delay_cycles(2); /* 286:525 or 23:262 */ do{ bSync = 0; delay_us(4); bSync = 1; disable_interrupts(INT_TIMER1); p = Lines[LineIdx >> 6]; p += (LineIdx & 0x3C); v0 = *p; p++; v1 = *p; p++; v2 = *p; p++; v3 = *p; PUT_32BIT cVid = 0; delay_cycles(60); if((LineIdx & 0x3F) != 59){ LineIdx += 1; }else{ LineIdx += 5; delay_cycles(1); } }while(LineIdx != 0); // 1:9 or 263:271 LineIdx = (LineField) ? 7:6; do{ bSync = 0; delay_us(4); bSync = 1; delay_cycles(132); LineIdx--; }while(LineIdx != 0); LineField++; do{ bSync = 0; delay_us(27); bSync = 1; delay_cycles(16); LineIdx++; }while(LineIdx < 6); LineIdx = (LineField) ? 6:5; do{ bSync = 0; delay_us(4); bSync = 1; delay_cycles(132); LineIdx--; }while(LineIdx != 0); // 10 or 272 delay_cycles(1); bSync = 0; delay_us(4); bsync = 1; // 11:22 or 273:285 LineIdx = (LineField) ? 12:13; set_timer1(0xFF0F); enable_interrupts(INT_TIMER1); } #int_timer1 void timer1_isr(){ if(LineIdx == 0){ VerticalSync(); }else{ set_timer1(H_INTERVAL); bSync = 0; delay_us(4); bSync = 1; LineIdx--; } } void main(){ int8 i; /* A/D */ setup_adc_ports(NO_ANALOGS); /* port */ set_tris_a(0x00); output_A(0x00); set_tris_b(0x00); output_B(0x00); /* set image */ for(i = 0; i < 60; i++){ Lines0[i] = 0xFF; Lines1[i] = 0xFF; Lines2[i] = 0xFF; Lines3[i] = 0xFF; } Lines1[57] ^= 0x1F; Lines1[58] ^= 0xE0; Lines2[ 1] ^= 0x7C; Lines2[ 2] ^= 0x18; Lines2[ 5] ^= 0xF3; Lines2[ 6] ^= 0xFE; Lines2[ 9] ^= 0x4C; Lines2[10] ^= 0x07; Lines2[13] ^= 0x30; Lines2[14] ^= 0x03; Lines2[17] ^= 0x63; Lines2[18] ^= 0x99; Lines2[21] ^= 0xC4; Lines2[22] ^= 0x90; Lines2[25] ^= 0xC5; Lines2[26] ^= 0x90; Lines2[29] ^= 0x40; Lines2[30] ^= 0x00; Lines2[33] ^= 0x00; Lines2[34] ^= 0x00; Lines2[37] ^= 0x05; Lines2[38] ^= 0xE0; Lines2[41] ^= 0x01; Lines2[42] ^= 0xF0; Lines2[45] ^= 0x09; Lines2[46] ^= 0x08; Lines2[49] ^= 0x1E; Lines2[50] ^= 0x0C; Lines2[53] ^= 0x0F; Lines2[54] ^= 0xF8; Lines2[57] ^= 0x03; Lines2[58] ^= 0xE0; /* timer */ setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); set_timer1(H_INTERVAL); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); while(TRUE); }