📄 emit20.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 + -