⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emit20.c

📁 基于DOS SVGA图形界面的JJY/WWVB/DCF/MSF广播时间码发生器
💻 C
字号:
//
//***************************************************************************
//	  TIME CODE RECEIVER TEST PLATFORM
//	  Copyright 1999 Chen Jian Zhong  JLY.2000
//***************************************************************************
//
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <bios.h>
#include "svgacc.h"
#include "emit20.h"
#include "time.c"
#include "frame.c"

#define __CPPARGS

#define FREQ 	0XE923	//486DX2 & OLD_Func()
//#define FREQ 	0XE920	//486DX4 & OLD_Func()
//#define FREQ 	0XE91F	//PII-450 & OLD_Func()
//#define FREQ 	0XE90C	//HANDPAD & OLD_Func()
//#define FREQ 	0XE91F	//P4-1.8G & OLD_Func()
//#define FREQ 	59660	//HANDPAD & OLD_Func()

#define HCent 299
#define VCent 399

#define LEFT VCent-340
#define RIGHT VCent+340
#define TOP HCent-64
#define BOT HCent+64

#define TEXT TOP+15
#define SL LEFT+90
#define SR RIGHT-90
#define ST TOP+60
#define BUTTON TOP+6
#define TITLE TOP+104

#define ESC 0x1B
#define INTV 0x08

#define BCOLR 28
#define FCOLR 10
#define LIGHT 31
#define SHAD 21

static unsigned char *WeekStr[7]={"SUN","MON","TUE","WED","THU","FRI","SAT"};

static unsigned char Colr[4][60]={
	{	15,	12,	12,	12,	 0,	12,	12,	12,	12,	15,
		 0,  9,  9,  9,  0,  9,  9,  9,  9, 15,
		 0,  0, 10, 10,  0, 10, 10, 10, 10, 15,
		10, 10, 10, 10,  0,  0, 13, 13, 13, 15,
		13, 14, 14, 14, 14, 11, 11, 11, 11, 15,
		 4,  4,  4,  1,  1,  0,  0,  0,  0, 15	},

	{	15,	12,	12,	12,	 0,	12,	12,	12,	12,	15,
		 0,  9,  9,  9,  0,  9,  9,  9,  9, 15,
		 0,  0, 10, 10,  0, 10, 10, 10, 10, 15,
		10, 10, 10, 10,  0,  0,  1,  1,  1, 15,
		 4,  4,  4,  4,  0, 14, 14, 14, 14, 15,
		11, 11, 11, 11,  0, 13, 13, 13, 13, 15	},

	{ 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		 0,  0,  0,  0,  0, 13, 13, 13, 13, 13,
		 0, 12, 12, 12, 12, 12, 12, 12, 15,  9,
		 9,  9,  9,  9,  9, 15, 10, 10, 10, 10,
		10, 10,  4,  4,  4,  1,  1,  1,  1,  1,
		11, 11, 11, 11, 14, 14, 14, 14, 15,  0	},

	{ 	15,  0,  0,  0,  0,  0,  0,  0,  0,  0,
		 0,  0,  0,  0,  0,  0,  0, 14, 14, 14,
		14, 11, 11, 11, 11,  1,  1,  1,  1,  1,
		10, 10, 10, 10, 10, 10,  4,  4,  4,  9,
		 9,  9,  9,  9,  9, 12, 12, 12, 12, 12,
		12, 12,  0, 13, 15, 15, 15, 15, 13,  0	}	};

static unsigned char *Station[4]={"JG2AS","WWVB ","DCF77"," MSF "};
static unsigned char *Dst[2]={"STD", "DST"};

static char Buff[120];
static int TX[10]={180, 278, 302, 326, 392, 416, 440, 506, 588, 662};
static int Tn[10]={5, 2, 2, 2, 2, 2, 2, 3, 3, 3};
static int PORT, CharPos;

void DrwScene(void);
void Display(void);
void DrwArwBox(int, int, int, int, int);
void interrupt TimeOut(__CPPARGS);
void interrupt (*OldFunc)(__CPPARGS);
//
//*******************************************************************
//*                        Main	procudre		  					*
//*******************************************************************
//
void main(int argc, char *argv) {

	int startvideomode, cpu, videocard, videomemory;
	int i, j, quit;

	union{
		int divisor;
		unsigned char c[2];
	} count;
	int oldcount;
	unsigned char oldctrl;

	union inkey{
		char ch[2];
		int i;
		}c;

	// save video mode
	startvideomode = videomodeget();


	// check cpu type
	cpu = whichcpu();
	if (cpu < 486) {
		printf("This grogram requires an 80486 or better processor.\n");
		exit(0);
		}

	// check video card type
	videocard = whichvga();
	if (videocard == 0) {
		printf("This program requires a SuperVGA video adapter.\n");
		exit(0);
		}

	// check video memory size
	videomemory = whichmem();
	if (videomemory < 1) {
		printf("Unable to identify the amount of installed video memory.\n");
		exit(0);
		}

	PORT=0x3F8;	//COM1
	if(argc>1){
		while(*++argv!='\r'){
			if(*++argv=='/'){
				switch(*(argv+1)){
					case '1':
						PORT=0x3F8;
						break;
					case '2':
						PORT=0x2F8;
						break;
					default:
						printf("Invalid selection:");
						printf(argv);
						printf("\n");
						printf("Serial port selection:");
						printf("/1: COM1(default)\n");
						printf("/2: COM2\n");
						exit(0);
					}
				}
			}
		}
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+                        Initialization		  					+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
	SET_FL=DST=Count=Option=quit=Row=Col=0;

	for(i=0; i<60; i++)Bit[i].endc='\0';
	for(i=0; i<120; i++)Buff[i]='\0';

	InitTime();
	CharPos=(Sec[0]-0x30)*10+Sec[1]-0x30;  //set pointer
	CalcWeek();
	PutFrame();
	res800();
	DrwScene();

	outp(PORT+3,0x00);	   /* int disabled */
	outp(PORT+1,0x00);
	outp(PORT+4,0X10);     /* loopback mode */

	OldFunc=getvect(INTV);
	oldctrl=inp(0x43);
	outp(0x43, 0x34);
	count.c[0]=inp(0x40);
	count.c[1]=inp(0x40);
	oldcount=count.divisor;
	count.divisor=FREQ;
	outp(0x40, count.c[0]);
	outp(0x40, count.c[1]);
	setvect(INTV, TimeOut);
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+                      Process key input			  	        	+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
	while(quit==0){
		if(bioskey(1)){

			c.i=bioskey(0);
			if(c.ch[0]){
				switch(c.ch[0]){
					case '\r':
						if(SET_FL){
							SET_FL=0;
							PutFrame();
							CharPos=(Sec[0]-0x30)*10+Sec[1]-0x30;  //set pointer
							Drw3dBox(LIGHT, SHAD, LEFT+6, BUTTON, LEFT+40, BUTTON+30);
							Drw3dBox(SHAD, LIGHT, RIGHT-40, BUTTON, RIGHT-6, BUTTON+30);
							Display();
							}
						break;

					case ESC:
						quit=1;
						break;
					}
				}
			else {
				switch(c.ch[1]){
					case 0x3D:         //F3
						if(SET_FL==0){
							SET_FL=1;
							Drw3dBox(LIGHT, SHAD, RIGHT-40, BUTTON, RIGHT-6, BUTTON+30);
							Drw3dBox(SHAD, LIGHT, LEFT+6, BUTTON, LEFT+40, BUTTON+30);
							drwfillbox(1, BCOLR, SL+10, ST, SR-10, ST+28);

							Col=0;
							Count=9;
							}
						break;

					case 0x48:         //UP
					  if(SET_FL){
						switch(Col){
							case 0:
								Option++;
								if(Option==4)Option=0;
								break;
							case 1:
								UP_day();
								CalcWeek();
								break;
							case 2:
								{
								UP_mon();
								CheckDay();
								CalcWeek();
								}
								break;
							case 3:
								{
								UP_year();
								CheckDay();
								CalcWeek();
								}
								break;
							case 4:
								UP_hour();
								break;
							case 5:
								UP_min();
								break;
							case 6:
								UP_sec();
								Count=0;
								break;
							case 7:
								if(DST)DST=0;
								else DST=1;
								break;
							default:
								break;
							}
						}
						break;
					case 0x50:         //DOWN
					  if(SET_FL){
						switch(Col){
							case 0:
								Option--;
								if(Option<0)Option=3;
								break;
							case 1:
								DN_day();
								CalcWeek();
								break;
							case 2:
								{
								DN_mon();
								CheckDay();
								CalcWeek();
								}
								break;
							case 3:
								{
								DN_year();
								CheckDay();
								CalcWeek();
								}
								break;
							case 4:
								DN_hour();
								break;
							case 5:
								DN_min();
								break;
							case 6:
								DN_sec();
								Count=0;
								break;
							case 7:
								if(DST)DST=0;
								else DST=1;
								break;
							default:
								break;
							}
						}
						break;
					case 0x4B:         //LEFT
					  if(SET_FL){
						Col--;
						if(Col<0)Col=7;
						Count=9;
						}
						break;
					case 0x4D:         //RIGHT
					  if(SET_FL){
						Col++;
						if(Col==8)Col=0;
						Count=9;
						}
						break;
					}
				Display();
				}
			}
		}

	count.divisor=oldcount;
	outp(0x40, count.c[0]);
	outp(0x40, count.c[1]);
	outp(0x43, oldctrl);
	setvect(INTV, OldFunc);
	fillscreen(0);
	videomodeset(startvideomode);
	exit(0);
}

void DrwScene()
{
	int i;

	videooff();
	drwfillbox(1, BCOLR, LEFT, TOP, RIGHT, BOT);
	Drw3dBox(LIGHT, SHAD, LEFT, TOP, RIGHT, TITLE);

	drwstring(1, 0, BCOLR, "STATION", 108, TEXT);
	drwfillbox(1, 0, 169, TEXT-2, 232, TEXT+14);    //STATION
	drwstring(1, 0, BCOLR, "DATE", 238, TEXT);
	drwfillbox(1, 0, 274, TEXT-2, 345, TEXT+14);  	//DATE
	drwstring(1, 0, BCOLR, "TIME", 351, TEXT);
	drwfillbox(1, 0, 387, TEXT-2, 459, TEXT+14);     //TIME
	drwstring(1, 0, BCOLR, "ZONE", 466, TEXT);
	drwfillbox(1, 0, 501, TEXT-2, 534, TEXT+14);     //WEEK
	drwstring(1, 0, BCOLR, "WEEK", 542, TEXT);
	drwfillbox(1, 0, 577, TEXT-2, 610, TEXT+14);     //DAYS
	drwstring(1, 0, BCOLR, "DAYS", 618, TEXT);
	drwfillbox(1, 0, 653, TEXT-2, 691, TEXT+14);     //ZONE

	drwstring(1, FCOLR, 0, "/", 294, TEXT);
	drwstring(1, FCOLR, 0, "/", 318, TEXT);
	drwstring(1, FCOLR, 0, ":", 408, TEXT);
	drwstring(1, FCOLR, 0, ":", 432, TEXT);

	Display();

	Drw3dBox(LIGHT, SHAD, LEFT+6, BUTTON, LEFT+40, BUTTON+30);
	drwstring(1, 4, BCOLR, "F3", LEFT+15, BUTTON+2);
	drwstring(1, 0, BCOLR, "SET", LEFT+11, BUTTON+16);

	Drw3dBox(SHAD, LIGHT, RIGHT-40, BUTTON, RIGHT-6, BUTTON+30);
	drwstring(1, 4, BCOLR, "ENT", RIGHT-35, BUTTON+2);
	drwstring(1, 0, BCOLR, "OK", RIGHT-31, BUTTON+16);

	drwline(1, SHAD, LEFT, TOP+42, RIGHT, TOP+42);
	drwline(1, LIGHT, LEFT, TOP+43, RIGHT, TOP+43);

	Drw3dBox(SHAD, LIGHT, SL, ST-5, SR+1, ST+32);
	drwstring(1, 0, BCOLR, "TXD", LEFT+34, ST);
	drwstring(1, 0, BCOLR, "BITS", LEFT+30, ST+14);
	drwbox(1, 4, LEFT+25, ST-3, LEFT+65, ST+29);
	drwstring(1, 0, BCOLR, "PREV", SR+30, ST);
	DrwArwBox(4, SR+20, ST, SR+72, ST+12);
	drwstring(1, 0, BCOLR, "NEXT", SR+30, ST+14);
	DrwArwBox(4, SR+20, ST+14, SR+72, ST+26);

	drwstring(1, 1, BCOLR, "TIME CODE TRANSMITTER", LEFT+9, TITLE+6);
	drwstring(1, 1, BCOLR, "- POPLAND SOFTWARE - 2004", RIGHT-206, TITLE+6);

	videoon();
	}

void Drw3dBox(int t, int b, int left, int top, int right, int bottom)
{
	drwline(1, t, left, top, right, top);
	drwline(1, t, left, top, left, bottom);
	drwline(1, b, right, top+1, right, bottom);
	drwline(1, b, left+1, bottom, right, bottom);
	drwpoint(1, BCOLR, right, top);
	drwpoint(1, BCOLR, left, bottom);
	}

void Display(void)
{
	drwstring(1, FCOLR, 0, Station[Option], TX[0], TEXT);

	drwstring(1, FCOLR, 0, Day, TX[1], TEXT);
	drwstring(1, FCOLR, 0, Mon, TX[2], TEXT);
	drwstring(1, FCOLR, 0, Year, TX[3], TEXT);

	drwstring(1, FCOLR, 0, Hour, TX[4], TEXT);
	drwstring(1, FCOLR, 0, Min, TX[5], TEXT);
	drwstring(1, FCOLR, 0, Sec, TX[6], TEXT);

	drwstring(1, FCOLR, 0, Dst[DST], TX[7], TEXT);
	drwstring(1, FCOLR, 0, WeekStr[Week], TX[8]-6, TEXT);
	drwstring(1, FCOLR, 0, Days, TX[9], TEXT);
}

void DrwArwBox(int colr, int left, int top, int right, int bottom)
{
	int m, n;

	m=(bottom+top)/2;
	n=(bottom-top)/2;
	drwline(1, colr, left-n, m, left, top);
	drwline(1, colr, left-n, m, left, bottom);
	drwline(1, colr, left, top, right, top);
	drwline(1, colr, left, bottom, right, bottom);
	drwline(1, colr, right, top, right, bottom);
	}

//
//*******************************************************************
//*                       Interrupt service		  					*
//*******************************************************************
//
void interrupt TimeOut(__CPPARGS)
{
	Count++;
	if(Count>=20){
		Count=0;
		if(Option==JG2AS)outp(PORT+4,0x01);		//Bipolar output
		else if((Option==DCF77)&&(Psec==57))outp(PORT+4,0x01);
		else outp(PORT+4,0x02);

		if(UP_sec()){
			if(UP_min()){
				if(UP_hour()){
					if(UP_day())
					if(UP_mon())UP_year();
					CalcWeek();
					drwstring(1, FCOLR, 0, Day, TX[1], TEXT);
					drwstring(1, FCOLR, 0, Mon, TX[2], TEXT);
					drwstring(1, FCOLR, 0, Year, TX[3], TEXT);
					drwstring(1, FCOLR, 0, WeekStr[Week], TX[8]-6, TEXT);
					drwstring(1, FCOLR, 0, Days, TX[9], TEXT);
					}
				}
			}

		Fsec=(Sec[0]-0x30)*10+(Sec[1]-0x30);
		Psec=Fsec-1;
		if(Psec<0)Psec=59;

		Buff[Psec*2]=Bit[Psec].ch;	//put to buffer

		if(Fsec==0){
			PutFrame();
			drwstring(1, FCOLR, 0, Hour, TX[4], TEXT);
			drwstring(1, FCOLR, 0, Min, TX[5], TEXT);
			drwfillbox(1, BCOLR, SL+10, ST+14, SR-10, ST+28);
			while(CharPos<60){
				drwstring(1, Colr[Option][CharPos], BCOLR, &Buff[CharPos*2], SL+11+CharPos*8, ST);
				CharPos++;
				}
			CharPos=0;
			}

		drwstring(1, FCOLR, 0, Sec, TX[6], TEXT);

		if(SET_FL)Display();
		else {
			drwstring(1, BCOLR, Colr[Option][Fsec], &Bit[Fsec].ch, SL+11+Fsec*8, ST+14);
			if(Fsec)drwstring(1, Colr[Option][Psec], BCOLR, &Bit[Psec].ch, SL+11+Psec*8, ST+14);
			}
		 }

	else if(Count==Bit[Fsec].lcnt){
			if(Option==JG2AS)outp(PORT+4,0x02);  //Bipolar output
			else outp(PORT+4,0x01);
			}

	if((SET_FL)&&(Count==10))drwfillbox(1, 0, TX[Col], TEXT, TX[Col]+Tn[Col]*8, TEXT+14);

	OldFunc();
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -