📄 pal_library.c
字号:
/*
* file : PAL_library.c
* project : PIC PAL SOFTWARE VIDEO GENERATOR
* author : Bruno Gavand
* compiler : mikroC V6.2
* date : January 17, 2006
* updated : April 30, 2008
* minor adjustment for mikroC V8.1
*
* description :
* PAL library for PIC18 MCU
* This library turns your PIC18 into a B&W PAL software video generator
*
* schematic :
___
RB0 (LUM) +---|___|---+
100 |
____ |
RE0 (SYNC) +---|____|--+--------> VIDEO OUT (to TV video input)
1K
GND +--------------------> GND
*
* target devices :
* Tested with PIC18F452 and PIC18F4620 @ 32 Mhz (8 Mhz crystal + HS PLL)
*
* Licence :
* Feel free to use this source code at your own risks.
*
* history :
*
* see more details on http://www.micro-examples.com/
*/
#include "PAL_Library.h"
/*
* I/O definition
*/
#define PAL_BSYNC PORTE.F0 // bit for synchronization
#define PAL_BVID PORTD.F0 // bit for luminance. Note : full PORT is reserved !
#define PAL_DELAY4 1 // real delay in microsecond for 4 祍 pulse
#define PAL_DELAY28 20 // real delay in microsecond for 28 祍 pulse
/********************
* MACRO DEFINITIONS
********************/
/*
* create picture border
*/
#define PAL_MAKE_BORDER asm MOVFF _PAL_border, PORTD
/*
* header to load first group of 8 pixels
*/
#define PAL_BLOCK_HEAD\
asm { MOVFF PAL_ISR_ptr_L2, FSR0L }\
asm { MOVFF PAL_ISR_ptr_L2+1, FSR0H }\
asm { MOVFF POSTINC0, PORTD }
/*
* process 8 pixels
* pre-fetch next 8 pixels
*/
#define PAL_BLOCK_SHIFT\
asm { INFSNZ PAL_ISR_ptr_L2, 1, 1 }\
asm { INCF PAL_ISR_ptr_L2+1, 1, 1 }\
asm { RRCF PORTD, 1, 0 }\
asm { MOVFF PAL_ISR_ptr_L2, FSR0L }\
asm { RRCF PORTD, 1, 0 }\
asm { MOVFF PAL_ISR_ptr_L2+1, FSR0H }\
asm { RRCF PORTD, 1, 0 }\
asm { nop }\
asm { RRCF PORTD, 1, 0 }\
asm { nop }\
asm { RRCF PORTD, 1, 0 }\
asm { nop }\
asm { RRCF PORTD, 1, 0 }\
asm { nop }\
asm { RRCF PORTD, 1, 0 }\
asm { nop }
/*
* load 8 pixel bloc
*/
#define PAL_BLOCK_LOAD\
asm { MOVFF POSTINC0, PORTD }
/*
* set video signal to SYNC or BLACK for d 祍
*/
#define PAL_HSYNC(d) PAL_BVID = 0 ; PAL_BSYNC = 0 ; Delay_us(d)
#define PAL_BLACK(d) PAL_BVID = 0 ; PAL_BSYNC = 1 ; Delay_us(d)
/*
* vertical sync line is made of 4 levels of UP and LOW pulses of 28 and 4 祍
*/
#define PAL_LOW28 0b00
#define PAL_UP28 0b01
#define PAL_LOW4 0b10
#define PAL_UP4 0b11
/*
* a vertical sync line is coded on one byte
*/
#define PAL_P1(x) (x)
#define PAL_P2(x) (x << 2)
#define PAL_P3(x) (x << 4)
#define PAL_P4(x) (x << 6)
/*
* vertical sync lines codification
*/
#define PAL_L1 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L2 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L3 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L4 PAL_P1(PAL_LOW28) | PAL_P2(PAL_UP4) | PAL_P3(PAL_LOW28) | PAL_P4(PAL_UP4)
#define PAL_L5 PAL_P1(PAL_LOW28) | PAL_P2(PAL_UP4) | PAL_P3(PAL_LOW28) | PAL_P4(PAL_UP4)
#define PAL_L6 PAL_P1(PAL_LOW28) | PAL_P2(PAL_UP4) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L7 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L8 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L311 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L312 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L313 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW28) | PAL_P4(PAL_UP4)
#define PAL_L314 PAL_P1(PAL_LOW28) | PAL_P2(PAL_UP4) | PAL_P3(PAL_LOW28) | PAL_P4(PAL_UP4)
#define PAL_L315 PAL_P1(PAL_LOW28) | PAL_P2(PAL_UP4) | PAL_P3(PAL_LOW28) | PAL_P4(PAL_UP4)
#define PAL_L316 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
#define PAL_L317 PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP28) | PAL_P3(PAL_LOW4) | PAL_P4(PAL_UP28)
/*
* these info lines are not visible on screen
*/
#define PAL_LINFO PAL_P1(PAL_LOW4) | PAL_P2(PAL_UP4) | PAL_P3(PAL_UP28) | PAL_P4(PAL_UP28)
/*
* this is the code of a visible video line
*/
#define PAL_LVIDEO 0
/*
* now, the full table of a 625 lines frame
* it does not start with first sync line for my own convenience (spares a test in ISR)
*/
const unsigned char PAL_ltype[] =
{
PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO,
PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO,
PAL_LVIDEO, // 286 times
// synchro 311 to 317
PAL_L311, PAL_L312, PAL_L313, PAL_L314, PAL_L315, PAL_L316, PAL_L317,
PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO,
PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO, PAL_LINFO,
PAL_LVIDEO, // 286 times
// synchro 1 to 8
PAL_L1, PAL_L2, PAL_L3, PAL_L4, PAL_L5, PAL_L6, PAL_L7, PAL_L8
} ;
/***************
* RAM variables
***************/
const char *PAL_linePtr = PAL_ltype ; // pointer to the current line type
unsigned char PAL_lineIdx = 0 ; // index of the current line type
unsigned char PAL_lineCode = 0 ; // current line code
unsigned int PAL_lineVideo = 0 ; // current visible video line number
unsigned int PAL_border = 0 ; // border flag : 1=white border, 0=black border
unsigned char PAL_y ; // number of vertical pixels
unsigned int PAL_max_y ; // last video line number
unsigned char PAL_shift_y ; // first video line number (vertical centering)
unsigned char PAL_render ; // start rendering flag
unsigned long PAL_frameCtr = 0 ; // frame counter, 25 per second
/*****************
* ROM tables
*****************/
/*
* TERMINAL fonts
* 6x8 ASCII character table, starts from 0 (32 = space) up to 255
*
*/
const unsigned char PAL_charTable[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
0x60, 0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x00,
0x3A, 0x40, 0x40, 0x20, 0x7A, 0x00,
0x38, 0x54, 0x54, 0x55, 0x59, 0x00,
0x21, 0x55, 0x55, 0x79, 0x41, 0x00,
0x21, 0x54, 0x54, 0x78, 0x41, 0x00,
0x21, 0x55, 0x54, 0x78, 0x40, 0x00,
0x20, 0x54, 0x55, 0x79, 0x40, 0x00,
0x0C, 0x1E, 0x52, 0x72, 0x12, 0x00,
0x39, 0x55, 0x55, 0x55, 0x59, 0x00,
0x39, 0x54, 0x54, 0x54, 0x59, 0x00,
0x39, 0x55, 0x54, 0x54, 0x58, 0x00,
0x00, 0x00, 0x45, 0x7C, 0x41, 0x00,
0x00, 0x02, 0x45, 0x7D, 0x42, 0x00,
0x00, 0x01, 0x45, 0x7C, 0x40, 0x00,
0xF0, 0x29, 0x24, 0x29, 0xF0, 0x00,
0xF0, 0x28, 0x25, 0x28, 0xF0, 0x00,
0x7C, 0x54, 0x55, 0x45, 0x00, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54, 0x44,
0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x41,
0x32, 0x49, 0x49, 0x49, 0x32, 0x00,
0x32, 0x48, 0x48, 0x48, 0x32, 0x00,
0x32, 0x4A, 0x48, 0x48, 0x30, 0x00,
0x3A, 0x41, 0x41, 0x21, 0x7A, 0x00,
0x3A, 0x42, 0x40, 0x20, 0x78, 0x00,
0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x00,
0x39, 0x44, 0x44, 0x44, 0x39, 0x00,
0x3D, 0x40, 0x40, 0x40, 0x3D, 0x00,
0x3C, 0x24, 0xFF, 0x24, 0x24, 0x00,
0x48, 0x7E, 0x49, 0x43, 0x66, 0x00,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0x00,
0xFF, 0x09, 0x29, 0xF6, 0x20, 0x00,
0xC0, 0x88, 0x7E, 0x09, 0x03, 0x00,
0x20, 0x54, 0x54, 0x79, 0x41, 0x00,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -