/* ============================================================================ S C A N A L . C - Bar Code Scanner Analyzer ============================================================================ (C) T.Pecina, May 1993 (version 1.00) */ #include #include #include #include #include #define byte unsigned long #define INT(x) geninterrupt(x) #define kbd() INT(0x16) #define snd() INT(0xad) #define vid() INT(0x10) #define WIDTH 20 #define HEIGHT 8 #define NORM 0x07 #define INV 0x70 #define FGR 0 #define BGR 1 /* some music */ #define OD 0 #define OT 1*12 #define OC 2*12 #define TC 0 #define TCIS 1 #define TDES 1 #define TD 2 #define TDIS 3 #define TES 3 #define TE 4 #define TF 5 #define TFIS 6 #define TGES 6 #define TG 7 #define TGIS 8 #define TAS 8 #define TA 9 #define TAIS 10 #define TB 10 #define TH 11 #define Q 0x80 #define ENDT 0xff #define D256 1 #define D128 2 #define D64 4 #define D32 8 #define D16 16 #define D8 32 #define D4 64 #define D2 128 #define D1 0 #define DM D256 #define DP D64 #define SILFRQ 30000 #define TEMPO 9 static int ttbl[] = { 523, 554, 587, 622, 659, 698, 739, 783, 830, 880, 932, 987, 1046, 1108, 1174, 1244, 1318, 1396, 1479, 1567, 1661, 1760, 1864, 1975, 2093, 2217, 2349, 2489, 2637, 2793, 2959, 3135, 3322, 3520, 3729, 3951 }; static byte m2[] = { OD+TGIS,DM, OD+TA,D16, Q,D16-DM, OT+TCIS,DM, OT+TD,D16, Q,D16-DM, OT+TF,DM, OT+TFIS,D8, Q,D8-DM, OT+TE,D16, OD+TH,D16, OT+TE,D16, OT+TG,D16, OT+TH,D16, Q,D16, OT+TH,D16, Q,D16, OT+TC,DM, OT+TCIS,D16, Q,D16-DM, OT+TDIS,DM, OT+TE,D16, Q,D16-DM, OT+TGIS,DM, OT+TA,D8, Q,D8-DM, OT+TFIS,D16, OT+TD,D16, OT+TFIS,D16, OT+TA,D16, OC+TD,D16, Q,D16, OC+TD,D16, Q,D16, OD+TGIS,DM, OD+TA,D16, Q,D16-DM, OT+TCIS,DM, OT+TD,D16, Q,D16-DM, OT+TF,DM, OT+TFIS,D8, Q,D8-DM, OT+TE,D16, OD+TH,D16, OT+TE,D16, OT+TG,D16, OT+TH,D16, Q,D16, OT+TH,D16, Q,D16, OD+TAIS,DM, OD+TH,D16, Q,D16-DM, OT+TCIS,DM, OT+TD,D16, Q,D16-DM, OT+TF,DM, OT+TFIS,D8, Q,D8-DM, OT+TE,D8, OT+TGIS,DM, OT+TA,D8, OD+TA,D4-DM, Q,D16, ENDT }; static byte m3[] = { OT+TFIS,D8, OD+TA,D16, OT+TFIS,D16, OT+TA,D8, OD+TA,D16, OT+TA,D16, OC+TD,D8, OT+TD,D16, OC+TD,D16, OC+TCIS,D16, Q,D16, OT+TH,D16, Q,D16, OT+TA,D32, Q,D32, OD+TA,D32, Q,D32, OT+TA,D32, Q,D32, OT+TG,D32, Q,D32, OT+TFIS,D32, Q,D32, OD+TA,D32, Q,D32, OT+TFIS,D32, Q,D32, OT+TE,D32, Q,D32, OT+TD,D32, Q,D32, OD+TA,D32, Q,D32, OT+TD,D32, Q,D32, OT+TFIS,D32, Q,D32, OT+TE,D32, Q,D32, OD+TA,D32, Q,D32, OT+TCIS,D32, Q,D32, OT+TE,D32, Q,D32, OT+TFIS,D8, OD+TA,D16, OT+TFIS,D16, OT+TA,D8, OD+TA,D16, OT+TA,D16, OC+TD,D8, OT+TD,D16, OC+TD,D16, OC+TCIS,D16, Q,D16, OT+TH,D16, Q,D16, OT+TA,D32, Q,D32, OD+TA,D32, Q,D32, OT+TA,D32, Q,D32, OT+TG,D32, Q,D32, OT+TFIS,D32, Q,D32, OD+TA,D32, Q,D32, OT+TFIS,D32, Q,D32, OT+TE,D32, Q,D32, OT+TD,D16, OD+TA,D16, OT+TD,D32, Q,D32, OT+TFIS,D32, Q,D32, OT+TD,D8, Q,D8, ENDT }; static byte m4[] = { OT+TE,D16, Q,D16, OD+TA,D16, OT+TE,D16, OT+TDIS,D16, Q,D16, OD+TA,D16, OT+TDIS,D16, OT+TE,D16, Q,D16, OT+TA,D16, Q,D16, OC+TCIS,D8, Q,D8, ENDT }; static byte m5[] = { Q,D16, OC+TCIS,D4+D8, OT+TH,D8+D16, Q,D16, OT+TA,D32, Q,D32+D16, OT+TGIS,D32, Q,D32+D16, OT+TFIS,D32, Q,D32+D16, OT+TFIS,D16, OT+TF,D16, OT+TE,D8, OT+TGIS,D16, OT+TFIS,D16, OT+TE,D8, OT+TFIS,D16, OT+TF,D16, OT+TE,D8, OT+TA,D16, OT+TFIS,D16, OT+TE,D8, OT+TAIS,D8, OT+TH,D4, OC+TCIS,D16, OT+TH,D16+D16, Q,D16, OT+TA,D32, Q,D32+D16, OT+TGIS,D32, Q,D32+D16, OT+TFIS,D32, Q,D32+D16, OT+TFIS,D32, Q,D32, OT+TF,D32, Q,D32, OT+TE,D8, OT+TGIS,D32, Q,D32, OC+TCIS,D32, Q,D32, OT+TH,D8, OT+TA,D8-DP, Q,DP, OT+TA,D8-DP, Q,DP, OT+TA,D8-DP, Q,DP+D8, ENDT }; static byte m11[] = { OT+TFIS,D16, Q,D16, OD+TA,D16, OT+TFIS,D16, OT+TGIS,D16, Q,D16, OT+TCIS,D16, OT+TGIS,D16, OT+TA,D16, Q,D16, OT+TA,D16, Q,D16, OT+TA,D4, OT+TA,D16, Q,D16, OT+TCIS,D16, OT+TA,D16, OT+TH,D16, Q,D16, OT+TE,D16, OT+TH,D16, OC+TCIS,D16, Q,D16, OC+TCIS,D16, Q,D16, OC+TCIS,D4, ENDT }; static byte m7[] = { OC+TCIS,D16, Q,D16, OT+TH,D32, Q,D32, OT+TAIS,D32, Q,D32, OT+TH,D16, Q,D16, OC+TGIS,D32, Q,D32, OC+TFIS,D32, Q,D32, OC+TFIS,D16, Q,D16, OC+TE,D32, Q,D32, OC+TDIS,D32, Q,D32, OC+TE,D16, Q,D16, OC+TD,D32, Q,D32, OC+TCIS,D32, Q,D32, OC+TCIS,D16, Q,D16, OT+TH,D32, Q,D32, OT+TAIS,D32, Q,D32, OT+TH,D16, Q,D16, OT+TFIS,D32, Q,D32, OT+TGIS,D32, Q,D32, OT+TH,D16, Q,D16, OT+TA,D32, Q,D32, OT+TGIS,D32, Q,D32, OT+TA,D32, Q,D32+D16, OT+TE,D32, Q,D32+D16, OC+TCIS,D16, Q,D16, OT+TH,D32, Q,D32, OT+TAIS,D32, Q,D32, OT+TH,D16, Q,D16, OC+TGIS,D32, Q,D32, OC+TFIS,D32, Q,D32, OC+TFIS,D16, Q,D16, OC+TE,D32, Q,D32, OC+TDIS,D32, Q,D32, OC+TE,D16, Q,D16, OC+TD,D32, Q,D32, OC+TCIS,D32, Q,D32, OC+TCIS,D16, Q,D16, OT+TH,D32, Q,D32, OT+TAIS,D32, Q,D32, OT+TH,D16, Q,D16, OT+TFIS,D32, Q,D32, OT+TGIS,D32, Q,D32, OT+TA,D16, Q,D16, OT+TA,D16, Q,D16, OT+TA,D8, Q,D8, ENDT }; static byte m8[] = { OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TH,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TGIS,D16, OT+TA,D8, OT+TFIS,D8, OT+TA,D8, OT+TG,D16, OT+TFIS,D16, OT+TG,D8, OT+TD,D8-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TH,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TG,D16, OT+TFIS,D8, OT+TE,D8, OT+TD,D16, OT+TE,D16, OT+TCIS,D16, OT+TD,D16, OD+TH,D8, OT+TFIS,D8, OT+TG,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TH,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TGIS,D16, OT+TA,D8, OT+TFIS,D8, OT+TA,D8, OT+TG,D16, OT+TFIS,D16, OT+TG,D8, OT+TD,D8-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TH,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TG,D16, OT+TFIS,D8, OT+TE,D8, OT+TD,D16, OT+TE,D16, OT+TCIS,D16, OT+TD,D16, OD+TH,D2, ENDT }; static byte m9[] = { OC+TD,D16, Q,D16, OC+TD,D32, Q,D32, OC+TD,D32, Q,D32, OC+TD,D16, Q,D16, OC+TC,D32, Q,D32, OC+TC,D32, Q,D32, OC+TC,D16, Q,D16, OT+TB,D32, Q,D32, OT+TB,D32, Q,D32, OT+TB,D32, Q,D32, OT+TA,D32, Q,D32, OT+TG,D16, Q,D16, OC+TF,D16, Q,D16, OC+TF,D32, Q,D32, OC+TF,D32, Q,D32, OC+TF,D16, Q,D16, OC+TES,D32, Q,D32, OC+TES,D32, Q,D32, OC+TES,D16, Q,D16, OC+TD,D32, Q,D32, OC+TD,D32, Q,D32, OC+TD,D32, Q,D32, OC+TC,D32, Q,D32, OT+TB,D16, Q,D16, OT+TB,D8, OT+TA,D16, OT+TG,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D8, OT+TB,D8, OT+TA,D16, OT+TG,D16, OT+TFIS,D16, OT+TG,D16, OT+TB,D8, OC+TD,D8, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TH,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TGIS,D16, OT+TA,D8, OT+TFIS,D8, OT+TA,D8, OT+TG,D16, OT+TFIS,D16, OT+TG,D8, OT+TD,D8-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D16-DP, Q,DP, OT+TD,D8, OT+TE,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D16, OT+TB,D8-DP, Q,DP, OT+TH,D8, OT+TA,D16, OT+TG,D16, OT+TFIS,D16, OT+TG,D16, OT+TA,D8-DP, Q,DP, OT+TG,D8-DP, Q,DP, OT+TG,D8-DP, Q,DP, OT+TG,D4-DP, Q,DP, ENDT }; /* cursor off */ void curoff(void) { _AH=1; _CH=0x20; vid(); } /* cursor on */ void curon(void) { _AH=1; _CH=0; vid(); } /* beep */ void tone(int f, int len, int mode) { _AH=2; _AL=mode; _BX=f; _DL=0; _CX=len; snd(); } /* play sequence */ void play(byte *p) { byte c; for (;;) { if ( kbhit() ) { getch(); tone(SILFRQ,1000,BGR); curon(); exit(0); } c = *p++; if ( c < 0x80 ) tone(ttbl[c],TEMPO * (*p++),FGR); else if ( c == 0xff ) return; else tone(SILFRQ,TEMPO * (*p++), FGR); } } /* combine parts to make m1 */ void m1(void) { play(m2); play(m2); play(m3); play(m3); } /* combine parts to make m1 */ void m10(void) { play(m4); play(m4); play(m5); play(m4); play(m4); play(m5); play(m11); play(m7); play(m7); } /* play tune */ void tune(void) { m1(); m10(); play(m8); play(m9); play(m9); m1(); } /* set up working environment */ void setup(void) { static unsigned ctt[] = { 0x075f, 0x07dc, 0x7018, 0x7019, 0x7023, 0x7043, 0x7041, 0x7046, 0x07db, 0x70dc, 0x7018, 0x7019, 0x7023, 0x7043, 0x7041, 0x7046 }; /* keyboard */ _AH=4; _AL=0; kbd(); /* enable key click */ _AH=4; _AL=0x80; _DX=50; kbd(); /* 50 ms click duration */ _AH=0x80; _AL=0; _CX=0; kbd(); /* disable autorep */ _AH=0x82; _CX=600; _AL=0; kbd(); /* no activity timer to 10 min */ _AH=0x83; _AL=0; kbd(); /* unshift all */ _AH=0x85; _AL=3; kbd(); /* ABORT key */ _AH=0x87; _AL=0; kbd(); /* one-finger operation */ /* display */ _AH=0x85; _AL=0; _CL=WIDTH; _CH=HEIGHT; vid(); /* set LP size */ _AH=0x89; _AL=0; _CL=0; _CH=0; vid(); /* set LP position */ /* _AH=0x86; _AL=1; vid(); /* soft cursor */ /* better not... _ES=FP_SEG(ctt); _BX=FP_OFF(ctt); _AH=0x88; _AL=0; vid(); /* cursor translation table */ directvideo = 0; clrscr(); curon(); /* sound */ _AH=3; _AL=1; _BL=1; snd(); /* sound volume hi */ _AH=1; snd(); /* silence! */ /* misc */ _AH=1; _CL=0x10; _CH=0x11; INT(0xb1); /* wake-up events */ _AH=1; INT(0xB6); /* decode LED off */ _AH=0xe; _AL=0; INT(0xB3); /* provide power to laser only if in use */ } /* display centered line */ void dcl(char *ln, int which, int attr) { int n,l,r,i; char w[WIDTH+1], *p=ln, *q=w; if ( strlen(ln) > WIDTH ) ln[WIDTH]=NULL; n = strlen(ln); l = (WIDTH-n) / 2; r = WIDTH-n-l; for (i=0; i