home *** CD-ROM | disk | FTP | other *** search
- { A Laboratory Management & Analysis Program }
- { by }
- { Douglas Standing & Gen. Max VonBirdface }
-
- { VERSION 4.0 }
-
- { Copyright 1991 }
- { This version includes code to call QCHART.EXE out of the }
- { Statisitics routine in Labcoat. The file Exec.com from }
- { Bela Lubkin, via TUG, is essential & much appreciated. }
- { If you wish to use or modify the code for Exec, contact }
- { me. Unfortunately Birdface kicked the bucket 2/89, }
- { and he will not be able to help you. He was a good bird. }
-
-
- PROGRAM LABCOAT;
-
- VAR
- QUIT : BOOLEAN;
- CH : CHAR;
- I,J: INTEGER;
-
-
- PROCEDURE CLEARLINES; { Clears lines 23 & 24 for repeated entry }
-
- BEGIN
- GOTOXY(1,23);
- TEXTBACKGROUND(1);
- CLREOL;
- GOTOXY(1,24);
- TEXTBACKGROUND(1);
- CLREOL;
- END;
-
- PROCEDURE MAKEaLINE; { Screen drawer of lines }
-
- BEGIN
- FOR I := 1 TO 80 DO
- WRITE(CHR(205));
- WRITELN;
- END;
-
- PROCEDURE MAKEaBORDER (VAR OUTFILE : TEXT); { Makes lines on reports }
- BEGIN
- FOR I := 1 TO 80 DO
- WRITE(LST,CHR(61)); { best with EPSON char set }
- WRITELN(LST); { IBM would be 205 }
- END;
-
- PROCEDURE SIGNON; { Initial Screen gizmo }
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(15,8);
- LOWVIDEO;
- FOR I := 1 TO 50 DO
- BEGIN
- WRITE(CHR(205))
- END;
- GOTOXY(20,10);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(4);
- WRITELN(' LABORATORY DATA & COST ANALYSIS');
- WRITELN(' by ');
- WRITELN(' D. Standing and M. VonBirdface');
- WRITELN(' v4.0 copyright 1991');
- GOTOXY(15,14);
- LOWVIDEO;
- FOR J := 1 TO 50 DO
- BEGIN
- WRITE(CHR(205));
- END;
- DELAY(4500);
- CLRSCR
- END;
-
- PROCEDURE EXPLAIN; { 2nd screen - blame it on Birdface }
- { or remove the call from main code }
- BEGIN { if it annoys you , or to speed up }
- TEXTBACKGROUND(1); CLRSCR;GOTOXY(15,7);
- WRITELN('The Name, Labcoat, & All Compiled Files Copyright 1991');
- GOTOXY(15,10);
- TEXTCOLOR(15);
- WRITELN(' You will be asked for numerous inputs in this program.');
- GOTOXY(15,12);
- TEXTCOLOR(0);
- WRITELN(' If you are interested in seeing a list of the variables,');
- GOTOXY(15,13);
- WRITELN('the opportunity to print them will come on the next screen.');
- GOTOXY(15,15);
- TEXTCOLOR(3);
- WRITELN(' If you are pleased with the program or have comments,');
- GOTOXY(15,16);
- TEXTCOLOR(15);
- WRITELN(' send comments AND CASHEWS to my co-author:');
- GOTOXY(15,18);
- TEXTCOLOR(4);
- WRITELN(' General Max VonBirdface ');
- GOTOXY(15,19);
- WRITELN(' 943 Aster Ct, Sunnyvale CA 94086');
- GOTOXY(12,21);
- TEXTCOLOR(3);
- WRITELN(' (Birdface is the parrot who wrote most of the error traps)');
- WRITELN;
- TEXTCOLOR(0);
- WRITE(' Peck Any Key To Continue');
- READ(KBD,CH);
- END;
-
- {###################### Main Test Cost Routine ##############################}
-
- OVERLAY PROCEDURE GETIT; { Note: The sole Overlay Procedure in this Program. }
- { LIPID has many - Reason: Heap-Stack crashes }
- { between Labcoat and Lipid at Lipid Call }
- TYPE
- STRINGTYPE = STRING[50];
-
- VAR MAKER {manufacture name},
- TESTNAME {kit name},
- THISDATE {current date},
- PLACENAME {clinic or lab name},
- STABLELIFE {reagent reconstituted stability} :STRINGTYPE;
-
- KITCOST {price/kit},
- CONSUMPRICE {cost/test consumables},
- CONSUMABLES {price/pkg of consumables},
- COLLECTI {drawing/processing costs},
- REFLAB {the competition price},
- DEPRECYR {annual inst depreciation amount},
- QC {cost/yr of survey spec for this test},
- QCSPEC {qc/12},
- YOURPRICE {tentative charge},
- COSTTEST1 {kitcost/kittests},
- PTREP {1 patient x replicate},
- CONSUM {consumprice},
- STANDARDSET {cost of separate stds},
- STANDARDCOST {cost / run for sep stds },
- CALIBCST {cost/pkg of calibrators},
- CALIBCSTRN {cost per test run of calibration },
- DRAW {collection},
- SURVEY {qc/12/testpermonth},
- DEPREC1 {depreciation costs/run},
- INITIAL { the calculated cost / run setup },
- PTS { testcost for pts after initial },
- PRIMECOST { cost per run of inst primes },
- TESTCOST { initial + pts / # patients per run },
- TECHTIME { tech time in min. to do batch},
- TECHDOLLARS { tech salary in $/Hr },
- MAINTENENCE {service contract or yearly maint charges},
- UPKEEP {cost/run for MAINTENENCE},
- RUNKITMONTH { runs / kit / month },
- RUNCONSUMMONTH {runs / pkg disposables / month },
- LABOR { techtime x (techdollars/60 },
- VT,CT,XT,FC,RT,DT,DE,CALR,CALC, {see cost breakdown section}
- BREAKEVEN,COSTBRKEVEN,PROFLOSS,REVBRKEVEN, {deal w/ break-even}
- TOTALCOST,TOTALSALES,UNITCOST,VARIABLECOST { " } : REAL;
-
- KITTESTS {number of tests/kit} ,
- NUMCONTROLS {number of different control levels},
- NUMSTANDARDS {number of standards/run},
- BLANK {number of blanks/run} ,
- REPLICATE {number of replicates of controls & pts/run},
- NUMCONSUMTST {number of tests/pkg consumables},
- TOTALANATST {max number/run for analyser},
- STDSRUN {number of runs to use up purchased standards},
- CALIBLIFE {# runs useful calibrator life},
- CALFREQ {times/month calibrators used},
- NUMCAL {number of calib tests each calibration},
- TESTPERMONTH {expected number of this test/month},
- SHELFLIFE {shelf life of kit reagents},
- STANDARDLIFE {# of runs/std set},
- MAXHEADROOM {est avg # pt spec/batch},
- MAXBATCH {maximum batch # for analyser},
- RUNSPERMONTH { expected # of runs per month },
- PRIME { # tests reag used to prime inst. },
- CURQUAN,ENDQTY,INCRQTY,STARTQTY, {for break-even}
- SICKO { number of pts to be run } : INTEGER;
-
- {************************** Input Section **********************************}
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(1,5);
- TEXTCOLOR(0);
- MAKEaLINE;
- GOTOXY(1,6);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,7);
- TEXTCOLOR(14);
- MAKEaLINE;
- GOTOXY(1,8);
- TEXTCOLOR(2);
- MAKEaLINE;
- GOTOXY(1,9);
- TEXTCOLOR(0);
- MAKEaLINE;
- GOTOXY(10,12);
- TEXTCOLOR(0);
- WRITELN('Please type in answers as requested, then press Enter Key.');
- TEXTCOLOR(15);
- WRITELN;
- WRITE(' DO NOT USE COMMAS OR DOLLAR SIGNS');
- GOTOXY(1,23);
- TEXTCOLOR(7);
- WRITE('Enter the name of your Facility (( 50 Characters Max )).');
- GOTOXY(1,24);
- READ(PLACENAME);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter today''s date: ');
- READ(THISDATE);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter the name of the test: ');
- READLN(TESTNAME);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Name of the ',TESTNAME,' kit Manufacturer: ');
- READLN(MAKER);
- CLEARLINES;
- KITCOST:= 0;KITTESTS:= 1;SHELFLIFE:=0;
- GOTOXY(1,23);
- WRITE('Enter the price / kit for ',MAKER,'''s kit: $ ');
- READ(KITCOST);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter the number of tests in each ',MAKER,' kit: ');
- READ(KITTESTS);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('Enter ',MAKER,'''s claimed avg. shelf life (months) for the reagents: ');
- READ(SHELFLIFE);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('Enter reconsituted stability of reagents (type hours or days): ');
- READ(STABLELIFE);
- CLEARLINES;
- GOTOXY(1,23);
- QC:= 0;NUMSTANDARDS:=0;STANDARDSET:= 0;STANDARDLIFE:= 1;
- WRITE
- ('If extra QC survey specimens are necessary, enter cost/yr (or `0''): $ ');
- READ(QC);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter the number of standards each run: ');
- READ(NUMSTANDARDS);
- IF (NUMSTANDARDS > 0) THEN
- BEGIN
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Are the standards run in duplicate? (Y/N): ');
- READ(KBD,CH);
- IF (CH = 'Y') OR (CH = 'y') THEN NUMSTANDARDS := NUMSTANDARDS * 2;
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Are Standards purchased separately from the kit? (Y/N) : ');
- READ(KBD,CH);
- IF (CH='Y') OR (CH='y') THEN
- BEGIN
- CLEARLINES; STANDARDSET:=0; STANDARDCOST:=0;
- GOTOXY(1,23);
- WRITE('Enter the cost of The Standards set:$ ');
- READ(STANDARDSET);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('Enter the estimated # of runs obtained / standard set: ');
- READ(STANDARDLIFE);
- CLEARLINES;
- END;
- CLEARLINES;
- END;
- REPEAT
- GOTOXY(1,23);
- WRITE
- ('Is calibration (as opposed to routine standards) required? (Y/N): ');
- READ(KBD,CH);
- CLEARLINES;
- CALIBCST:=0;CALIBLIFE:=1;CALFREQ:=1;NUMCAL:=0;
- UNTIL (CH = 'Y') OR (CH = 'y') OR (CH = 'N') OR (CH = 'n');
- IF (CH='Y') OR (CH='y') THEN
- BEGIN
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('What is the cost of calibrators? :$ ');
- READ(CALIBCST);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('How many months can calibrators be used? : ');
- READ(CALIBLIFE);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('How many times / year is calibration required? : ');
- READ(CALFREQ);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('How many calibrator tests are run each calibration? : ');
- READ(NUMCAL);
- CLEARLINES;
- END;
- CLEARLINES;
- NUMCONTROLS:= 0;BLANK:= 1;REPLICATE:= 0;CONSUMABLES:= 0;
- GOTOXY(1,23);
- WRITE('Enter the number of different control levels / run: ');
- READ(NUMCONTROLS);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter the number of blanks / run: ');
- READ(BLANK);
- CLEARLINES;
- REPEAT
- GOTOXY(1,23);
- WRITE
- ('Enter `2'' if you are running things in duplicate, or `1'' if not: ');
- READ(REPLICATE);
- CLEARLINES;
- UNTIL (REPLICATE = 1) OR (REPLICATE = 2);
- REPEAT
- CLEARLINES;
- CONSUMABLES:=0;NUMCONSUMTST:=1;CONSUMPRICE:=0;REFLAB:=0;MAINTENENCE:=0;
- GOTOXY(1,23);
- WRITELN
- ('Does this test use consumables in the testing process? (Y/N): ');
- READ(KBD,CH);
- UNTIL (CH='Y') OR (CH='y') OR (CH='N') OR (CH='n');
- IF (CH='Y') OR (CH='y') THEN
- BEGIN
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('Enter price for a known quantity of consumables for ',MAKER,'''s test.');
- WRITE('Pick the price for a package or case, etc: $ ');
- READ(CONSUMABLES);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('How many tests / package of those consumables? ');
- READ(NUMCONSUMTST);
- END;
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('What is the estimated drawing cost (labor / supplies) / test: $ ');
- READ(DRAW);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('Enter the price your reference lab charges for ',TESTNAME,': $ ');
- READ(REFLAB);
- CLEARLINES;
- GOTOXY(1,23);
- TOTALANATST:=1;DEPRECYR:=0;PRIME:=1;PRIMECOST:=0;MAINTENENCE:=0;
- TECHTIME:=0;TECHDOLLARS:=0;YOURPRICE:=0.001;STARTQTY:=0;
- WRITE('Do you want to include instrumentation costs? (Y/N): ');
- REPEAT
- READ(KBD,CH);
- UNTIL (CH='Y') OR (CH='y') OR (CH='N') OR (CH='n');
- IF (CH=('Y')) OR (CH='y') THEN
- BEGIN
- GOTOXY(1,23);
- WRITE('Please enter yearly maintenence costs for your instrument: $ ');
- READ(MAINTENENCE);
- CLEARLINES;
- REPEAT
- GOTOXY(1,23);
- WRITE('Will an automated or semi-automated analyser be used? (Y/N): ');
- READ(KBD,CH);
- IF (CH = ('Y')) OR (CH = 'y') THEN
- BEGIN
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('How many different tests, including ',TESTNAME,' is it doing: ');
- READ(TOTALANATST);
- CLEARLINES;
- GOTOXY(1,23);
- WRITELN
- ('If you wish to enter this year''s depreciation allowance ');
- WRITE('on the instrument, do so now, or enter `0'': $ ');
- READ(DEPRECYR);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('How much reagent (in # of tests) are used to prime the analyser each run: ');
- READ(PRIME);
- CLEARLINES;
- END
- ELSE
- CLEARLINES;
- UNTIL
- (CH = 'Y') OR (CH ='y') OR (CH = 'N') OR (CH = 'n');
- END;
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('What is estimated Tech. time in minutes per batch run? : ');
- READ(TECHTIME);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('What is Tech salary / Hr? : $ ');
- READ(TECHDOLLARS);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('To prepare Break-Even report, enter price you will charge for the test: $ ');
- READ(YOURPRICE);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('Please enter the Minimum number of Patients necessary to run a batch: ');
- READ(STARTQTY);
- CLEARLINES;
- ENDQTY:= 0;INCRQTY:= 0;MAXBATCH:= 0;MAXHEADROOM:= 0;RUNSPERMONTH:= 1;
- GOTOXY(1,23);
- WRITE
- ('Enter The Maximum number of Patients in a batch of ',TESTNAME,': ');
- READ(ENDQTY);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('For Break-Even report, what increments of patient quantities to show? : ');
- READ(INCRQTY);
- CLEARLINES;
- GOTOXY(1,23);
- REPEAT
- WRITE
- ('What is the maximum batch size (blank,stds,ctrls,pts) you can run?: ');
- READ(MAXBATCH);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('For Batch run efficiency report, enter avg. # of patient spec / batch: ');
- READ(MAXHEADROOM);
- IF MAXHEADROOM > MAXBATCH THEN
- BEGIN
- CLEARLINES;
- GOTOXY(1,23);
- TEXTCOLOR(4);
- WRITELN
- ('YOUR AVERAGE BATCH AMOUNT EXCEEDS YOUR MAXIMUM BATCH SIZE');
- TEXTCOLOR(0);
- WRITE('Press any key to continue');
- READ(KBD,CH);
- CLEARLINES;
- END;
- UNTIL (MAXHEADROOM) <= (MAXBATCH);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE
- ('And, please enter the expected number of runs of ',TESTNAME,' per month: ');
- READ(RUNSPERMONTH);
- CLEARLINES;
- GOTOXY(1,23);
- WRITE('For a quick screen display, how many patients to run? : ');
- SICKO:=1;
- READ(SICKO);
- CLEARLINES;
-
- { ccccccccccccccccccccccccccccccc COMPUTATION AND FORMULAS ccccccccccccccccc }
-
- STANDARDCOST:= STANDARDSET / STANDARDLIFE;
-
- CONSUMPRICE:= CONSUMABLES / NUMCONSUMTST;
-
- PRIMECOST:= COSTTEST1 * PRIME;
-
- LABOR:= TECHTIME * (TECHDOLLARS / 60);
-
- DEPREC1:= DEPRECYR / (TOTALANATST * (RUNSPERMONTH * 12));
-
- UPKEEP := MAINTENENCE / (TOTALANATST * (12 * RUNSPERMONTH));
-
- COSTTEST1 := KITCOST / KITTESTS;
-
- SURVEY := QC / (TOTALANATST * (RUNSPERMONTH * 12));
-
- CALIBCSTRN := ((CALIBCST/CALIBLIFE)/RUNSPERMONTH);
-
- INITIAL := (COSTTEST1 * ((NUMCONTROLS * REPLICATE) + BLANK + NUMSTANDARDS)) +
- DEPREC1 + (CONSUMPRICE *
- (( NUMCONTROLS * REPLICATE) + BLANK + NUMSTANDARDS))
- + SURVEY + LABOR + UPKEEP + STANDARDCOST + CALIBCSTRN + PRIMECOST;
-
- PTS := (COSTTEST1 * (SICKO * REPLICATE)) + (DRAW * SICKO)
- + (CONSUMPRICE * SICKO);
-
- TESTCOST := (INITIAL + PTS)/ SICKO;
-
- RUNKITMONTH := RUNSPERMONTH / (KITTESTS /((REPLICATE *
- (NUMCONTROLS + MAXHEADROOM)) +
- (BLANK + NUMSTANDARDS) + (NUMCAL / (CALFREQ * 12)) +
- PRIME ));
-
- RUNCONSUMMONTH := NUMCONSUMTST /((REPLICATE*(NUMCONTROLS + MAXHEADROOM)) +
- (BLANK + NUMSTANDARDS));
-
- TESTPERMONTH := MAXHEADROOM * RUNSPERMONTH;
-
- VARIABLECOST:= ((COSTTEST1 * REPLICATE) + (CONSUMPRICE * REPLICATE) +
- DRAW);
-
- TOTALCOST:=INITIAL + (VARIABLECOST * CURQUAN);
-
- TOTALSALES:= YOURPRICE * CURQUAN;
-
- BREAKEVEN:= INITIAL / (YOURPRICE - VARIABLECOST);
-
- REVBRKEVEN:= YOURPRICE * BREAKEVEN;
-
- COSTBRKEVEN:= INITIAL + (VARIABLECOST * BREAKEVEN);
-
- {****************************************************************************}
-
-
- GOTOXY(10,17); { Give Quick Screen Answer }
- TEXTCOLOR(14);
- WRITE
- ('Your run cost for ',SICKO,' pts for ',MAKER,'''s ',
- TESTNAME,' is: $ ',TESTCOST * SICKO:2:2);
- GOTOXY(10,19);
- DELAY(4000);
- WRITE
- (' Thus, your cost per patient at this volume is: $',TESTCOST:2:2);
- GOTOXY(4,21);
- WRITE('So, with ',SICKO,' patient(s) on the run, profit is = $ ',
- YOURPRICE - TESTCOST:2:2,' per patient.');
- GOTOXY(15,24);
- TEXTCOLOR(2);
- WRITE(' Peck any key to continue... ');
- READ(KBD,CH);
- GRAPHBACKGROUND(3);
- TEXTBACKGROUND(3);
- CLRSCR;
- GOTOXY(1,5);
- TEXTCOLOR(0);
- MAKEaLINE;
- GOTOXY(1,6);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,7);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(10,10);
- TEXTCOLOR(14);
- WRITE(' PLEASE TURN ON YOUR PRINTER - AUTOMATIC PRINTOUT');
- GOTOXY(10,15);
- TEXTCOLOR(0);
- WRITE(' Peck the `P'' key to begin printout or `N'' to QUIT: ');
- READ(KBD,CH);
- IF (CH = 'P') OR (CH = 'p') THEN
-
-
- {********************* Print Routine for GETIT ******************************}
-
- BEGIN
- { ***** PAGE 1 ***** }
-
- WRITE(LST,(CHR(27)),(CHR(69))); { turn on emphasized pitch }
- MAKEaBORDER(LST);
- MAKEaBORDER(LST);
- WRITE(LST,' ');
- WRITELN(LST,' TEST COST DATA ANALYSIS');
- MAKEaBORDER(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST,'DONE AT: ',PLACENAME);
- WRITELN(LST,'DATE: ',THISDATE);
- WRITELN(LST);
- WRITELN(LST,'TEST: ',TESTNAME);
- WRITELN(LST,'MANUFACTURER: ',MAKER);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST,'PACKAGE COST: $ ',KITCOST:3:2);
- WRITELN(LST,'YIELD: ',KITTESTS,' Tests/Kit');
- WRITELN(LST,'KIT TEST COST: $ ',KITCOST/KITTESTS:2:2,'/ Test');
- WRITELN(LST,'CLAIMED SHELF LIFE: ',SHELFLIFE,' months');
- WRITELN(LST,'RECONSTITUTED STABILITY: ',STABLELIFE);
- WRITELN(LST,'USES: ',BLANK,' Blanks per run');
- WRITELN(LST,'USES: ',NUMSTANDARDS,' Standards each run');
- WRITELN(LST,'CALIBRATORS COST: $ ',CALIBCSTRN:2:2,' /run');
- WRITELN(LST,'USES: ',NUMCONTROLS,' levels of Controls each run');
- WRITELN
- (LST,'REPLICATES: ',REPLICATE,
- ' (1 = single 2 = controls/pts in duplicate)');
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST,'CONSUMABLES: $ ',CONSUMPRICE:2:2,' per test');
- WRITELN(LST,'STANDARDS: $ ',STANDARDCOST:2:2,' per run');
- WRITELN(LST,'DRAWING COSTS: $ ',DRAW:2:2,' per patient test');
- WRITELN(LST,'TECH LABOR: $ ',LABOR:2:2,' per batch');
- WRITELN(LST);
- WRITELN(LST);
- WRITELN
- (LST,'INSTRUMENT DEPRECIATION: $ ',DEPREC1:2:2,' /this test/run day');
- WRITELN(LST,'QC SURVEY COSTS: $ ',SURVEY:2:2,' /this test/run day');
- WRITELN(LST,'MAINTENENCE COSTS: $ ',UPKEEP:2:2,'/this test/run day');
- WRITELN(LST,'INITAL SETUP (no pts): $ ',INITIAL:2:2);
- WRITELN(LST);
- WRITELN(LST);
- WRITE(LST,'TESTS / MONTH EXPECTED: ',RUNSPERMONTH * MAXHEADROOM);
- WRITE(LST,' ');
- WRITELN(LST,'* EXPECTED KIT USE: ',RUNKITMONTH:2:1,' kits/month');
- WRITE(LST,' ');
- WRITELN
- (LST,'* EXPECTED DISPOSABLES LIFE: ',RUNCONSUMMONTH:2:1,' runs/pkg');
- WRITE(LST,' ');
- WRITELN
- (LST,'* ASSUMING ',MAXHEADROOM,' tests/batch and ',RUNSPERMONTH,' runs/month');
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN
- (LST,'CURRENT REFERENCE LAB PRICE: $ ',REFLAB:2:2,' per test for ',TESTNAME);
- WRITELN(LST);
- WRITELN
- (LST,'PROPOSED CHARGE: $ ',YOURPRICE:2:2,' per test for ',TESTNAME);
- WRITELN(LST);
- WRITELN(LST);
- MAKEaBORDER(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITE(LST,' ');
- WRITELN
- (LST,'SEE NEXT PAGES FOR BATCH RUN EFFICIENCY AND BREAK-EVEN ANALYSIS');
- WRITE(LST,CHR(12));
-
-
- { ********************************** PAGE 2 ******************************** }
-
- MAKEaBORDER(LST);
- MAKEaBORDER(LST);
- WRITE(LST,' ');
- WRITELN(LST,'BATCH RUN EFFICIENCY ANALYSIS');
- MAKEaBORDER(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- FOR SICKO := 1 TO MAXHEADROOM DO
- BEGIN
- WRITELN
- (LST,'Cost of test/pt with ',SICKO,' patients = $ ',
- (INITIAL + (COSTTEST1 * (SICKO * REPLICATE)) +
- (DRAW * SICKO) + (CONSUMPRICE * SICKO))/SICKO:2:2);
- WRITELN(LST);
- END;
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN
- (LST,'Doing this test in-house with ',MAXHEADROOM,' pts saves you: $ ',
- (REFLAB * MAXHEADROOM) - (INITIAL + (COSTTEST1 *
- (MAXHEADROOM * REPLICATE)) + (DRAW * MAXHEADROOM) +
- (CONSUMPRICE * MAXHEADROOM)):2:2);
- WRITELN
- (LST,'out of the reference lab liability of $ ',REFLAB * MAXHEADROOM:3:2);
- WRITELN(LST,'for the same ',TESTNAME,'''s on ',MAXHEADROOM,' patients.');
- WRITELN(LST);
- WRITE(LST,CHR(12));
-
- { **************************** PAGE 3 ********************************** }
-
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST,' COST BREAKDOWN');
- WRITELN(LST);
- WRITELN
- (LST,' FOR ',MAXHEADROOM,' PT RUN COSTING $ ',
- ((TESTCOST*MAXHEADROOM)/2):3:2);
-
- {cccccccccccccccccccccccccccccccc Cost Breakdown Calculations cccccccccccccc}
-
- IF (INITIAL < 0.0001) THEN INITIAL:=0.0001;
- CT:= CONSUMPRICE + COSTTEST1;
- XT:= NUMSTANDARDS + BLANK + PRIME +
- ((NUMCONTROLS + MAXHEADROOM)*REPLICATE);
- VT:= 100*(CT*XT/(INITIAL + (COSTTEST1 *
- (MAXHEADROOM *REPLICATE)) + (DRAW*MAXHEADROOM) + (CONSUMPRICE *
- MAXHEADROOM))); WRITELN(LST); WRITE(LST, 'VARIABLE COSTS TOTAL: ',VT:3:1,' %');
- WRITE(LST,' ');
- WRITELN(LST,'COST = $ ',((VT/100)*(TESTCOST * MAXHEADROOM)/2):3:2); WRITELN(LST);
- DT:=(CONSUMPRICE * MAXHEADROOM)/((TESTCOST * MAXHEADROOM)/2) * 100;
- RT:=VT-DT;
- WRITELN(LST,' STDS/REAGENTS: ',RT:3:1,' %');
- WRITELN(LST,' DISPOSABLES: ',DT:3:1,' %');
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST);
- FC:= 100 - VT;
- WRITE(LST,' FIXED COSTS TOTAL: ',FC:3:1,' %');
- WRITE(LST,' ');
- WRITELN
- (LST,' COST = $ ',(((TESTCOST * MAXHEADROOM)-
- ((VT/100) * (TESTCOST * MAXHEADROOM)))/2):3:2);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST,' (FIXED COSTS INCLUDE LABOR, DEPRECIATION & MAINTENENCE)');
- WRITELN(LST);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITE(LST,CHR(12));
-
- {******************************* PAGE 4 - BREAKEVEN **************************}
-
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITE(LST,' ');
- WRITELN(LST,'BREAKEVEN TABLE FOR ',TESTNAME);
- WRITELN(LST);
- MAKEaBORDER(LST);
- IF (STARTQTY < 1) THEN STARTQTY:=1;
- CURQUAN:= STARTQTY;
- WRITELN(LST);
- WRITE(LST,' QTY TOTAL COST TOTAL BILLED');
- WRITELN(LST,' GAIN/LOSS UNIT COST');
- MAKEaBORDER(LST);
- WRITELN(LST);
- IF (ENDQTY < 2) THEN ENDQTY:=2;
- IF (INCRQTY < 1) THEN INCRQTY:=1;
- WHILE (CURQUAN <= ENDQTY) DO
- BEGIN
- TOTALSALES := YOURPRICE * CURQUAN;
- TOTALCOST := INITIAL + (VARIABLECOST * CURQUAN);
- UNITCOST := TOTALCOST / CURQUAN;
- PROFLOSS := TOTALSALES - TOTALCOST;
- WRITELN(LST,' ',CURQUAN:7,' ',TOTALCOST:12:2,' ',
- TOTALSALES:12:2,' ',PROFLOSS:12:2,' ',
- UNITCOST:12:2);
- CURQUAN := CURQUAN + INCRQTY;
- END;
- WRITELN(LST);
- MAKEaBORDER(LST);
- CURQUAN := TRUNC(BREAKEVEN);
- WRITELN(LST,' ',CURQUAN:7,' ',COSTBRKEVEN:12:2,' ',
- REVBRKEVEN:12:2,' = BREAKEVEN POINT');
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST,' TOTAL FIXED COST (no Pts):$',INITIAL:12:2);
- WRITELN(LST,' VARIABLE COSTS / TEST $',VARIABLECOST:12:2);
- WRITELN(LST,' BILLING PRICE / TEST $',YOURPRICE:12:2);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST);
- IF (YOURPRICE > REVBRKEVEN) THEN
- BEGIN
- WRITE(LST,' ');
- WRITELN
- (LST,'**** At Your Price, You Profit With Even The Smallest Increment ****');
- WRITELN(LST);
- END;
- WRITELN(LST);
- WRITELN(LST);
- WRITELN
- (LST,' END OF REPORT FOR ',MAKER,'''S ',TESTNAME,' ANALYSIS');
- WRITELN(LST);
- WRITELN(LST);
- WRITELN
- (LST,' | Please Note: Use of Real Numbers in calculations usually yields slight |');
- WRITELN
- (LST,' | ( less than 1% ) inaccuracies or inconsistencies in calculations. |');
- WRITE(LST,CHR(12));
- END
- END;
-
- {************************* Escape Routine for GETIT ************************ }
-
-
- PROCEDURE CHOOSE;
-
- BEGIN
- TEXTBACKGROUND(4); { 1st is to get out of GETIT }
- TEXTCOLOR(14);
- CLRSCR;
- GOTOXY(20,9);
- WRITE('THE FOLLOWING PROCEDURE IS VERY LONG.');
- GOTOXY(17,11);
- TEXTCOLOR(1);
- WRITE('You will need information from PRINT VARIABLES');
- GOTOXY(17,13);
- TEXTCOLOR(15);
- WRITE('Peck the `Y'' key to Continue or `N'' to Escape: ');
- READ(KBD,CH);
- IF CH = 'Y' THEN GETIT;
- IF CH = 'y' THEN GETIT;
- END;
-
- {******************* Instrument Depreciation Main Routine *******************}
-
-
- PROCEDURE DEPREC;
-
- TYPE
- DEPRECTYPE = (SL,SOYD,DB);
- STRINGTYPE = STRING[80];
-
- VAR {the core variables are self-explanatory}
- I, L : INTEGER;
- CH : CHAR;
- ALLDONE : BOOLEAN;
- BOOKVALUE, CUMDEPREC, CURRENTYR,
- DBFACTOR, SCRAPVALUE, STRAIGHTLINE,
- USEFULLIFE, YRSLEFT,AQUISCOST : REAL;
- ITEMDESCR, ITEMNAME : STRINGTYPE;
- LISTOUT : TEXT;
-
- { ####################### INTERNAL PROCEDURES TO DEPREC ##################}
-
- PROCEDURE SIGNON; { initial fancy screen }
-
- BEGIN
- TEXTBACKGROUND(1);
- GRAPHBACKGROUND(1);
- CLRSCR;
- GOTOXY(1,10);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,11);
- TEXTCOLOR(7);
- MAKEaLINE;
- GOTOXY(1,15);
- TEXTCOLOR(7);
- MAKEaLINE;
- GOTOXY(1,16);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(22,13);
- TEXTCOLOR(15);
- WRITE('THREE-METHOD DEPRECIATION CALCULATOR');
- GOTOXY(10,20);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITE(' *** Printout is automatic. Please turn on printer ***');
- DELAY(6000);
- CLRSCR;
- END;
-
- PROCEDURE GETDATA; { Gets Data!! }
-
- BEGIN
- TEXTBACKGROUND(0);
- GRAPHBACKGROUND(0);
- CLRSCR;
- GOTOXY(1,5);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,6);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(1,7);
- TEXTCOLOR(1);
- MAKEaLINE;
- GOTOXY(5,9);
- TEXTCOLOR(7);
- WRITE('Enter name of the item to be depreciated: ');
- READLN(ITEMNAME);
- WRITELN;
- GOTOXY(5,11);
- WRITE('Short description of ',ITEMNAME,': ');
- READLN(ITEMDESCR);
- WRITELN;
- GOTOXY(5,13);
- WRITE('Give aquisition cost of ',ITEMNAME,' (NO COMMAS):$ ');
- READLN(AQUISCOST);
- WRITELN;
- GOTOXY(5,15);
- WRITE('Enter the useful life in years: ');
- READLN(USEFULLIFE);
- WRITELN;
- GOTOXY(5,17);
- WRITE
- ('Enter the scrap value at end of ',USEFULLIFE:2:0,' years (NO COMMAS):$ ');
- READLN(SCRAPVALUE);
- WRITELN;
- GOTOXY(5,19);
- WRITE('Factor (%) for Declining Balance calculations is: ');
- READLN(DBFACTOR);
- CLRSCR;
- END;
-
- PROCEDURE METHODHEADERS(VAR LISTOUT:TEXT ; WHATKIND:DEPRECTYPE);
-
- { sets up report headers }
- BEGIN
- WRITELN(LISTOUT);
- CASE (WHATKIND) OF
- SL : WRITELN(LISTOUT,'==========>> STRAIGHT-LINE METHOD');
- SOYD : WRITELN(LISTOUT,'==========>> SUM-OF-YEARS-DIGITS');
- DB : WRITELN
- (LISTOUT,'==========>> DECLINING BALANCE with ',DBFACTOR:5:2
- ,' PERCENT FACTOR');
- END;
- WRITELN(LISTOUT);
- WRITELN
- (LISTOUT,' Current Year Cumulative Book');
- WRITELN(LISTOUT,
- 'Year Depreciation Depreciation Value');
- WRITELN(LISTOUT,
- '------------------------------------------------------')
- END;
-
- PROCEDURE PRINTmainHEADINGS; { Prints main headings of Report!! }
-
- BEGIN
- WRITE(LST,(CHR(27)),(CHR(69)));
- MAKEaBORDER(LST);
- WRITELN(LISTOUT);
- WRITE(LISTOUT,' ');
- WRITELN(LISTOUT,' DEPRECIATION SCHEDULES');
- MAKEaBORDER(LST);
- WRITELN(LISTOUT);
- WRITELN(LISTOUT);
- WRITELN(LISTOUT,'Name of the item to be depreciated: ',ITEMNAME);
- WRITELN(LISTOUT,ITEMNAME,' described as: ',ITEMDESCR);
- WRITELN(LISTOUT,'Aquisition cost: $',AQUISCOST:6:2);
- WRITELN(LISTOUT,'Useful life is ',USEFULLIFE:2:0,' years');
- WRITELN(LISTOUT,'Scrap value at end of ',USEFULLIFE:2:0,' years: $',
- SCRAPVALUE:6:2);
- WRITELN(LISTOUT);
- TEXTBACKGROUND(1);
- GRAPHBACKGROUND(1);
- CLRSCR;
- GOTOXY(1,5);
- TEXTCOLOR(0);
- MAKEaLINE;
- GOTOXY(1,6);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(1,7);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,9);
- TEXTCOLOR(0);
- WRITELN(CON,'Name of the item to be depreciated: ',ITEMNAME);
- WRITELN(CON,ITEMNAME,' described as: ',ITEMDESCR);
- WRITELN(CON,'Aquisition cost: $',AQUISCOST:6:2);
- WRITELN(CON,'Useful life is ',USEFULLIFE:2:0,' years.');
- WRITELN(CON,'Scrap value at end of ',USEFULLIFE:2:0,' years: $',
- SCRAPVALUE:6:2);
- WRITELN(CON);
- END;
-
- PROCEDURE WRITEVALUE (VAR LISTOUT:TEXT; YEARNUM,CURYR,CUMUL,BOOK:REAL);
-
- { claculates and adds data to printout }
-
- BEGIN
- WRITELN(LISTOUT,YEARNUM:2:0,' ',CURYR:10:2,' ',CUMUL:10:2,
- ' ',BOOK:10:2)
- END;
-
- { ############### END OF INTERNAL PROCEDURES FOR DEPREC ############## }
-
- BEGIN { Main Procedure DEPREC Code }
- ASSIGN(LISTOUT,'LST:');
- REWRITE(LISTOUT);
- CLRSCR;
- SIGNON;
- GETDATA;
- PRINTmainHEADINGS;
- TEXTCOLOR(4);
- METHODHEADERS(CON,SL);
- TEXTCOLOR(0);
- METHODHEADERS(LISTOUT,SL);
- CUMDEPREC := 0;
- WRITEVALUE(CON,0,0,0,AQUISCOST);
- WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
- FOR I := 1 TO TRUNC(USEFULLIFE) DO
- BEGIN
- CURRENTYR := (AQUISCOST - SCRAPVALUE)/USEFULLIFE;
- CUMDEPREC := CUMDEPREC + CURRENTYR;
- BOOKVALUE := AQUISCOST - CUMDEPREC;
- STRAIGHTLINE := (USEFULLIFE * USEFULLIFE + USEFULLIFE)/2.0;
- WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
- WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE)
- END;
- TEXTCOLOR(4);
- METHODHEADERS(CON,SOYD);
- TEXTCOLOR(0);
- METHODHEADERS(LISTOUT,SOYD);
- CUMDEPREC := 0;
- WRITEVALUE(CON,0,0,0,AQUISCOST);
- WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
- FOR I := 1 TO TRUNC(USEFULLIFE) DO
- BEGIN
- YRSLEFT := USEFULLIFE - I + 1;
- CURRENTYR := YRSLEFT / STRAIGHTLINE * (AQUISCOST - SCRAPVALUE);
- CUMDEPREC := CUMDEPREC + CURRENTYR;
- BOOKVALUE := AQUISCOST - CUMDEPREC;
- WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
- WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
- END;
- TEXTCOLOR(4);
- METHODHEADERS(CON,DB);
- TEXTCOLOR(0);
- METHODHEADERS(LISTOUT,DB);
- CUMDEPREC := 0;
- WRITEVALUE(CON,0,0,0,AQUISCOST);
- WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
- DBFACTOR := (DBFACTOR / 100.0) / USEFULLIFE;
- CURRENTYR := AQUISCOST * DBFACTOR;
- I := 1;
- ALLDONE := FALSE;
- REPEAT
- YRSLEFT := USEFULLIFE - I +1;
- CUMDEPREC := CUMDEPREC + CURRENTYR;
- BOOKVALUE := AQUISCOST - CUMDEPREC;
- WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
- WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
- CURRENTYR := BOOKVALUE * DBFACTOR;
- I := I +1;
- IF (BOOKVALUE < SCRAPVALUE) THEN
- BEGIN
- ALLDONE := TRUE;
- WRITELN;
- WRITELN(LISTOUT);
- WRITELN('Cannot take depreciation below book value of $',
- SCRAPVALUE:6:2);
- WRITELN(LISTOUT,'Cannot take depreciation below book value of $',
- SCRAPVALUE:6:2);
- END;
- IF (I > TRUNC(USEFULLIFE)) THEN
- ALLDONE := TRUE;
- UNTIL (ALLDONE);
- WRITELN(LISTOUT);
- WRITELN(LISTOUT);
- WRITELN(LISTOUT);
- MAKEaBORDER(LST);
- WRITELN(LISTOUT);
- WRITELN(LISTOUT);
- MAKEaBORDER(LST);
- WRITELN(LISTOUT,CHR(12));
- WRITELN(CON);
- WRITELN(CON);
- TEXTCOLOR(4);
- WRITELN(CON,' *** ALL DONE ***',CHR(7));
-
- END;
-
- {************* Prints Out the Variables list for Cost/Test routine **********}
-
-
-
- PROCEDURE PRINTVAR;
-
- BEGIN
-
- GRAPHBACKGROUND(3);
- TEXTBACKGROUND(3);
- CLRSCR;
- GOTOXY(1,5);
- TEXTCOLOR(0);
- MAKEaLINE;
- GOTOXY(1,6);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,7);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(10,10);
- TEXTCOLOR(14);
- WRITE(' PLEASE TURN ON YOUR PRINTER - AUTOMATIC PRINTOUT');
- GOTOXY(10,15);
- TEXTCOLOR(4);
- WRITE(' Peck the `P'' key to begin printout or `N'' to QUIT: ');
- READ(KBD,CH);
- IF (CH = 'P') OR (CH = 'p') THEN
- BEGIN
- WRITE(LST,(CHR(27)),(CHR(69)));
- WRITELN(LST);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST,' **** TEST COST VARIABLES LIST **** ');
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- WRITELN
- (LST,' You will need to have the following information available');
- WRITELN(LST,' for entry into the test cost analysis:');
- WRITELN(LST);
- WRITELN(LST,' 1. The name of your facility or lab.');
- WRITELN(LST,' 2. Today''s date.');
- WRITELN(LST,' 3. The test name.');
- WRITELN(LST,' 4. The kit or system manufacturer''s name.');
- WRITELN(LST,' 5. The price / kit. ');
- WRITELN(LST,' 6. The number of tests / kit.');
- WRITELN
- (LST,' 7. The averaged claimed shelf life (months) of the kit.');
- WRITELN
- (LST,' 8. Reconstitued stability of reagents (hours or days).');
- WRITELN
- (LST,' 9. The number of est. tests / month (incl blank,stds,ctrls).');
- WRITELN(LST,' 10. Any new yearly cost for QC survey specimens.');
- WRITELN(LST,' 11. The number of control levels used /run.');
- WRITELN(LST,' 12. Cost for calibrators if they''re used.');
- WRITELN
- (LST,' 13. Some quest. about calibration frequency and numbers.');
- WRITELN(LST,' 14. The number of standards / run.');
- WRITELN
- (LST,' 15. If not part of the kit, the cost of the Standards.');
- WRITELN
- (LST,' 16. The expected number of runs to use up the standards.');
- WRITELN(LST,' 17. The number of blanks / run.');
- WRITELN(LST,' 18. Whether you''re running singly or in duplicate.');
- WRITELN(LST,' 19. Price / known quantity package of consumables.');
- WRITELN
- (LST,' 20. The number of tests / package of those consumables.');
- WRITELN
- (LST,' 21. Estimated or known blood drawing/preparation costs.');
- WRITELN
- (LST,' 22. Maximum batch size / run (incl blanks, stds, ctrls).');
- WRITELN(LST,' 23. Price for similar test at your reference lab.');
- WRITELN
- (LST,' 24. Whether the test uses an automated or semi-auto analyser.');
- WRITELN
- (LST,' 25. If so, how many different tests the analyser is doing.');
- WRITELN
- (LST,' 26. If you''re using depreciation allowance, this yrs amount.');
- WRITELN(LST,' 27. A tentative price you''ll charge for the test.');
- WRITELN
- (LST,' 28. An estimate of the average number of patient spec / batch.');
- WRITELN(LST,' 29. Estimated Tech time in minutes to run a batch.');
- WRITELN(LST,' 30. Tech salary in $ / Hr.');
- WRITELN
- (LST,' 31. Yearly maintenence/service charges for instrument.');
- WRITELN
- (LST,' 32. The # of tests of reagent your analyser uses to prime itself ');
- WRITELN(LST,' before running a batch.');
- WRITELN(LST);
- WRITELN(LST);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN
- (LST,' As you can see, I''m not going to supply you with CAP Workload');
- WRITELN
- (LST,'units, just simple labor estimates. Labor is a very large and');
- WRITELN
- (LST,'important part of test costing. However my feeling is that no one ');
- WRITELN
- (LST,'way of workload accounting is best for all situations - So just');
- WRITELN
- (LST,'pick a method you like, or use my simple batch labor as the add on to');
- WRITELN
- (LST,'the cost / test data from this program. Also, because most full, ');
- WRITELN
- (LST,'instrument calibrations are infrequent, calibrator use of reagent ');
- WRITELN(LST,'and consumables is NOT figured into test cost directly.');
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITELN(LST);
- WRITELN(LST);
- MAKEaBORDER(LST);
- WRITE(LST,CHR(12));
- END
- END;
-
- {******************************* Escape from DEPREC **************************}
-
- PROCEDURE GETOUT;
- BEGIN
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(15,10);
- TEXTCOLOR(15);
- WRITELN(' DEPRECIATION PROGRAM - PRINTER MUST BE READY');
- GOTOXY(15,13);
- TEXTCOLOR(4);
- WRITE('Peck `Y'' to continue or `N'' to return to menu: ');
- READ(KBD,CH);
- IF CH = 'Y' THEN DEPREC;
- IF CH = 'y' THEN DEPREC;
- END;
-
- {********************************** Statisitics Procedure ******************}
-
- PROCEDURE STATS;
-
- CONST
- MAX = 81;
-
- TYPE
- STR80 = STRING[80];
- DATAITEM = REAL;
- DATAARRAY = ARRAY[1..MAX] OF DATAITEM;
-
- VAR
- CH:CHAR;
- DATA:DATAARRAY;
- NUM,T:INTEGER;
- A,M,MD,STD,AVG:REAL;
- ENTERED,QUIT:BOOLEAN;
- DATANAME:STRING[40];
-
- PROCEDURE SIGNON; { initial screen }
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(15,8);
- LOWVIDEO;
- FOR I:=1 TO 50 DO
- BEGIN
- WRITE(CHR(205))
- END;
- GOTOXY(14,10);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(4);
- WRITE('STATISTICS: SD - MEAN - MEDIAN - MIN/MAX - 2SD RANGE');
- GOTOXY(15,12);
- LOWVIDEO;
- FOR J:=1 TO 50 DO
- BEGIN
- WRITE(CHR(205))
- END;
- DELAY(3000);
- CLRSCR;
- END;
-
- PROCEDURE QUICKSORT (VAR ITEM:DATAARRAY;COUNT:INTEGER);
-
- PROCEDURE QS (L,R:INTEGER; VAR IT:DATAARRAY);
- VAR
- I,J:INTEGER;
- X,Y:DATAITEM; { quicksort used to help median calc }
- BEGIN
- I:=L; J:=R;
- X:=IT[(L+R) DIV 2];
- REPEAT
- WHILE IT[I] < X DO I:= I+1;
- WHILE X < IT[J] DO J:= J-1;
- IF I <= J THEN
- BEGIN
- Y:= IT[I];
- IT[I]:= IT[J];
- IT[J]:= Y;
- I:= I+1; J:= J-1;
- END;
- UNTIL I > J;
- IF L < J THEN QS(L,J,IT);
- IF L < R THEN QS(I,R,IT)
- END;
- BEGIN
- QS(1,COUNT,ITEM);
- END;
- FUNCTION ISIN(CH:CHAR;S:STR80):BOOLEAN;
- VAR
- T:INTEGER;
-
- BEGIN
- ISIN:=FALSE;
- FOR T:=1 TO LENGTH(S) DO
- IF S[T]=CH THEN ISIN:= TRUE;
- END; { maybe }
-
- FUNCTION MENU:CHAR;
-
- VAR
- CH:CHAR;
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- WRITELN;
- TEXTCOLOR(0);
- REPEAT
- WRITELN('[D] = Run Q-Chart QC Graph & Statistics Routine - PRINTER REQD.');
- WRITELN('[E] = Enter Data');
- WRITELN('[B] = Display & Perform Statistics on Entered Data');
- WRITELN('[Q] = Quit');
- WRITELN;
- TEXTCOLOR(4);
- WRITE('Please Peck A Letter: ');
- TEXTCOLOR(0);
- READ(KBD,CH); WRITELN;
- CH:=UPCASE(CH);
- UNTIL ISIN(CH,'EDBQ');
- MENU := CH;
- GOTOXY(1,7);
- CLREOL;
- END;
-
- PROCEDURE DISPLAY (DATA:DATAARRAY;NUM:INTEGER);
-
- VAR
- T:INTEGER;
- Y:INTEGER;
- BEGIN
- TEXTBACKGROUND(1);
- GOTOXY(1,1);
- TEXTCOLOR(14);
- CLRSCR;
- WRITELN(' DATA FOR: ',DATANAME);
- BEGIN
- IF (NUM <= 20) THEN
- BEGIN
- GOTOXY(1,3);
- FOR T:=1 TO NUM DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
- WRITELN;
- END
- ELSE
- IF (NUM > 20) AND (NUM <= 40) THEN
- BEGIN
- GOTOXY(1,3);
- FOR T:= 21 TO NUM DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:= 1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
- END
- ELSE
- IF (NUM > 40) AND (NUM <=60) THEN
- BEGIN
- GOTOXY(1,3);
- FOR T:=41 TO NUM DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:= 21 TO 40 DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:=1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
- END
- ELSE
- IF (NUM > 60) AND (NUM <= 80) THEN
- BEGIN
- GOTOXY(1,3);
- FOR T:=61 TO NUM DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:= 41 TO 60 DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:=21 TO 40 DO WRITELN
- (' ',T,': ',DATA[T]:5:2);
- GOTOXY(1,3);
- FOR T:=1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
- END;
- END;
- GOTOXY(20,24);
- TEXTCOLOR(4);
- WRITE('Peck Any Key To Continue (or Shft-PrtSc to print): ');
- READ(KBD,CH);
- END;
-
- PROCEDURE ENTER (VAR DATA:DATAARRAY);
-
- VAR
- T:INTEGER;
-
- BEGIN
- TEXTBACKGROUND(1);
- TEXTCOLOR(0);
- REPEAT
- ENTERED := FALSE;
- GOTOXY(5,10);
- WRITE('How Many Data Items (1 to 80) ? : ');
- TEXTCOLOR(15);
- READ(NUM);
- IF (NUM > 80) THEN
- BEGIN
- SOUND(500);
- DELAY(700);
- NOSOUND;
- GOTOXY(15,23);
- TEXTCOLOR(14);
- WRITE('HEY!!!! FOLLOW DIRECTIONS FOR ARRAY SIZE!!!');
- DELAY(2000);
- CLEARLINES;
- GOTOXY(5,10);
- CLREOL;
- END;
- UNTIL (NUM <= 80);
- WRITELN;
- GOTOXY(5,12);
- WRITE('Enter Heading for Data (1-40 char): ');
- READ(DATANAME);
- WRITELN;
- FOR T:=1 TO NUM DO
- BEGIN
- TEXTCOLOR(0);
- GOTOXY(5,23);
- WRITE('Enter Item ',t,' : ');
- TEXTCOLOR(15);
- READ(DATA[T]);
- CLEARLINES;
- END;
- GOTOXY(1,24);
- TEXTCOLOR(4);
- SOUND(300);
- DELAY(600);
- NOSOUND;
- WRITE
- ('OK, That''s It - Peck Any Key to Continue: ');
- READ(KBD,CH);
- ENTERED := TRUE;
- END;
-
- FUNCTION MEAN(DATA:DATAARRAY;NUM:INTEGER):REAL;
-
- VAR
- T:INTEGER;
- AVG:REAL;
-
- BEGIN
- AVG:=0;
- FOR T:=1 TO NUM DO AVG:=AVG+DATA[T];
- MEAN:=AVG/NUM;
- END;
-
- FUNCTION STDDEV (DATA:DATAARRAY;NUM:INTEGER):REAL;
-
- VAR
- T:INTEGER;
- STD,AVG:REAL;
-
- BEGIN
- AVG:=MEAN(DATA,NUM);
- STD:=0;
- FOR T:= 1 TO NUM DO
- STD:=STD+((DATA[T]-AVG)*(DATA[T]-AVG));
- STD:=STD/NUM;
- STDDEV:=SQRT(STD);
- END;
-
- FUNCTION MEDIAN (DATA:DATAARRAY;NUM:INTEGER):REAL;
-
- VAR
- DTEMP:DATAARRAY;
- T:INTEGER;
-
- BEGIN
- MEDIAN:=1;
- FOR T:=1 TO NUM DO DTEMP[T]:=DATA[T];
- QUICKSORT(DTEMP,NUM);
- MEDIAN:= DTEMP[NUM DIV 2];
- END;
-
- FUNCTION GETMAX(DATA:DATAARRAY;NUM:INTEGER):INTEGER;
-
- VAR
- T:INTEGER;
- MAX:REAL;
-
- BEGIN
- MAX:=DATA[1];
- FOR T:=2 TO NUM DO
- IF DATA[T] > MAX THEN MAX:= DATA[T];
- GETMAX := ROUND(MAX);
- END;
-
- FUNCTION GETMIN(DATA:DATAARRAY;NUM:INTEGER):INTEGER;
-
- VAR
- T:INTEGER;
- MIN:REAL;
-
- BEGIN
- MIN:= DATA[1];
- FOR T:=2 TO NUM DO
- IF DATA[T] < MIN THEN MIN:= DATA[T];
- GETMIN:= TRUNC(MIN);
- END;
-
- PROCEDURE TRANSFER; {*** FOR GOING TO Q-CHART.EXE ***}
-
- VAR
- TRANSFER:FILE;
-
- BEGIN
- ASSIGN(TRANSFER,'EXEC.COM');
- EXECUTE(TRANSFER);
- END;
-
- BEGIN { Main Code for Stats }
- SIGNON;
- FOR NUM:=1 TO 80 DO
- DATA[NUM]:=0; { Zero the array space }
- ENTERED := FALSE;
- DATANAME := ' ';
- REPEAT
- CH:=UPCASE(MENU);
- CASE CH OF
- 'E':ENTER(DATA);
- 'D':TRANSFER;
- 'B': BEGIN
- IF ENTERED THEN
- BEGIN
- CLRSCR;
- DISPLAY(DATA,NUM);CLRSCR;
- GOTOXY(10,2);
- WRITELN('STATISTICS FOR: ',DATANAME);
- GOTOXY(1,5);
- TEXTCOLOR(7);
- A:=MEAN(DATA,NUM);
- M:=MEDIAN(DATA,NUM);
- STD:=STDDEV(DATA,NUM);
- WRITELN;
- WRITELN('MEDIAN : ',M:10:2);
- WRITELN;
- WRITELN('MEAN : ',A:10:2);
- WRITELN;
- WRITELN('STANDARD DEVIATION: ',STD:10:2);
- WRITELN;
- WRITELN('CV in % : ',((STD/A)*100):10:2);
- WRITELN;
- WRITELN
- ('MAXIMUM VALUE : ',GETMAX(DATA,NUM):10,' Rounded (up)');
- WRITELN;
- WRITELN
- ('MINIMUM VALUE : ',GETMIN(DATA,NUM):10,' Truncated (down)');
- WRITELN;
- WRITELN
- ('2 SD RANGE : ',(A-(2*STD)):10:2,' TO ',(A+(2*STD)):10:2);
- GOTOXY(1,23);
- TEXTCOLOR(4);
- WRITE('Peck any Key when done (or Shft-PrtSc to Print): ');
- READ(KBD,CH);
- CH := 'Q';
- END
- ELSE
- IF NOT ENTERED THEN
- BEGIN
- GOTOXY(5,20);
- TEXTCOLOR(15);
- WRITE('SORRY - NO VALUES, NO STATISTICS');
- GOTOXY(1,23);
- TEXTCOLOR(4);
- WRITE('Peck any Key to continue: ');
- READ(KBD,CH);
- ENTERED :=FALSE;
- END;
- END;
- END;
- UNTIL CH = 'Q';
- END;
-
- {***************************** Moving Average Procedure ********************}
-
-
- PROCEDURE MOVINGAV;
-
- CONST
- MAXNUMPERIOD=50;
-
- TYPE
- PERNUMTYPE=1..MAXNUMPERIOD;
- STRINGTYPE=STRING[80];
-
- VAR
- CH:CHAR;
- I,J,K,L:INTEGER;
- NUMAVERAGED,NUMPERIODS:INTEGER;
- PERIODVALUE:ARRAY [PERNUMTYPE] OF REAL;
- TRENDVALUE:REAL;
-
- PROCEDURE SIGNON; { FIRST SCREEN }
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(15,8);
- LOWVIDEO;
- FOR I:=1 TO 50 DO
- BEGIN
- WRITE(CHR(205))
- END;
- GOTOXY(20,10);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(4);
- WRITE('TREND ANALYSIS with MOVING AVERAGES');
- GOTOXY(15,12);
- LOWVIDEO;
- FOR J:= 1 TO 50 DO
- BEGIN
- WRITE(CHR(205))
- END;
- DELAY(3000);
- CLRSCR;
- END;
-
- PROCEDURE AVERAGINGPERIOD; { GETS DATA }
-
- BEGIN
- REPEAT
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- WRITE(' Enter the number of periods to be averaged: ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READLN(NUMAVERAGED);
- IF (NUMAVERAGED < 1) THEN
- BEGIN
- WRITELN;
- WRITE('HEY!!!! Are You TRYING To Make Me CRASH? ');
- END;
- WRITELN;
- UNTIL (NUMAVERAGED >= 1);
- END;
-
- PROCEDURE FACTSONLY; { GETS MORE BIRDFOOD }
-
- VAR
- PERIODCOUNTER:PERNUMTYPE;
-
- BEGIN
- GRAPHBACKGROUND(1);
- TEXTBACKGROUND(1);
- CLRSCR;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(0);
- WRITE('How many TIME PERIODS are to be pecked in? (50 Maximum): ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READLN(NUMPERIODS);
- IF (NUMPERIODS > 50) THEN
- BEGIN
- WRITELN;
- TEXTCOLOR(4);
- WRITE('Hey! That''s more than 50. Try again: ');
- TEXTCOLOR(0);
- READLN(NUMPERIODS);
- END;
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(0);
- WRITELN('OK, enter a value for each of the ',NUMPERIODS,' periods: ');
- WRITELN;
- FOR PERIODCOUNTER:=1 TO NUMPERIODS DO
- BEGIN
- LOWVIDEO;
- TEXTBACKGROUND(1);
- WRITE(' ',PERIODCOUNTER:3,': ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READLN(PERIODVALUE[PERIODCOUNTER])
- END;
- SOUND(400);
- DELAY(400);
- NOSOUND;
- AVERAGINGPERIOD; { RUN PROCEDURE AVERAGINGPERIOD }
- WRITELN;
- WRITELN;
- WRITELN;
- END;
-
- PROCEDURE PATTERN1 (VAR F:TEXT);
-
- BEGIN
- TEXTBACKGROUND(1);
- LOWVIDEO;
- TEXTBACKGROUND(1);
- WRITE(F,' ');
- FOR L:=1 TO 70 DO
- BEGIN
- WRITE(F,CHR(205))
- END;
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITELN(F)
- END;
-
- PROCEDURE PATTERN2 (VAR F:TEXT);
-
- BEGIN
- TEXTBACKGROUND(1);
- LOWVIDEO;
- TEXTBACKGROUND(1);
- WRITE(F,' ');
- FOR K:=1 TO 50 DO
- BEGIN
- WRITE(F,'-');
- END;
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITELN(F);
- END;
-
- PROCEDURE MAKETHETABLE (VAR F:TEXT); { PRODUCE TIME TREND TABLE }
-
- VAR
- COUNTER:PERNUMTYPE;
- NUMSEQUENCE:INTEGER;
-
- BEGIN
- TEXTBACKGROUND(1);
- CLRSCR;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- PATTERN1(F);
- WRITELN(F);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITELN(F,' MOVING AVERAGES - TIME TREND ANALYSIS');
- WRITELN(F);
- LOWVIDEO;
- TEXTBACKGROUND(1);
- PATTERN1(F);
- WRITELN(F);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITE(F,' ');
- WRITELN(F,'PERIOD RAW DATA SMOOTHED DATA');
- PATTERN2(F);
- WRITELN(F);
- FOR NUMSEQUENCE:=1 TO NUMPERIODS + 1 DO
- BEGIN
- TRENDVALUE:=0;
- IF (NUMSEQUENCE > NUMAVERAGED) THEN
- BEGIN
- FOR COUNTER:=1 TO NUMAVERAGED DO
- TRENDVALUE:=TRENDVALUE + PERIODVALUE[NUMSEQUENCE-COUNTER];
- TRENDVALUE:=TRENDVALUE/NUMAVERAGED;
- END;
- IF (NUMSEQUENCE <= NUMPERIODS) THEN
- BEGIN
- WRITE(F,' ',NUMSEQUENCE:7);
- WRITE(F,' ',PERIODVALUE[NUMSEQUENCE]:7:1);
- WRITELN(F,' ',TRENDVALUE:7:1)
- END
- ELSE
- BEGIN
- WRITELN(F);
- LOWVIDEO;
- TEXTBACKGROUND(1);
- PATTERN2(F);
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- WRITE(F,' ','THE TREND FORCASTS PERIOD ');
- WRITELN(F,NUMSEQUENCE,' AS: ',TRENDVALUE:7:1);
- PATTERN2(F);
- WRITE(F,' ');
- WRITELN(F,'NUMBER OF PERIODS AVERAGED: ',NUMAVERAGED)
- END
- END;
- WRITELN(F);
- PATTERN1(F);
- END;
-
- BEGIN { MAIN CODE }
-
- SIGNON;
- FACTSONLY;
- CLRSCR;
- REPEAT
- MAKETHETABLE(CON);
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(4);
- WRITE(' Repeat the Display? (Y/N): ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READ(KBD,CH);
- IF (CH='Y') OR (CH='y') THEN
- BEGIN
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(0);
- WRITE
- (' Change the number of periods to be averaged? (Y/N): ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READ(KBD,CH);
- IF (CH='Y') OR (CH='y') THEN
- AVERAGINGPERIOD { GENERATE REVISED TABLE }
- ELSE
- MAKETHETABLE(CON)
- END
- UNTIL (CH='N') OR (CH='n');
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- TEXTCOLOR(16);
- WRITELN(' For a printout, turn on the printer.');
- TEXTCOLOR(0);
- WRITE(' When ready, peck the letter `Y'', or `N'' to QUIT: ');
- HIGHVIDEO;
- TEXTBACKGROUND(1);
- READ(KBD,CH);
- WHILE (CH='Y') OR (CH='y') DO
- BEGIN
- WRITE(LST,(CHR(27)),(CHR(69)));
- MAKETHETABLE(LST);
- WRITE(LST,CHR(12));
- WRITELN;
- LOWVIDEO;
- TEXTBACKGROUND(1);
- WRITE(' Do another printout? (Y/N): ');
- READ(KBD,CH)
- END
- END;
-
-
- {*************************** Employee Evaluation Procedure ******************}
-
- PROCEDURE eval; { This is an Assignment/Execute Procedure }
- VAR EVALUATE:FILE; { To work, you must have compiled .COM }
- { versions of LABCOAT.PAS and EVALUATE.PAS }
- { together on the same disk. }
- BEGIN
- ASSIGN(EVALUATE,'EVALUATE.COM');
- EXECUTE (evaluate);
- END;
-
- {******************************** Escape from EVALUATE *********************}
-
- PROCEDURE EVALESCAPE;
-
- BEGIN
- TEXTBACKGROUND(1);
- CLRSCR;
- GOTOXY(20,10);
- TEXTCOLOR(15);
- WRITELN('EMPLOYEE EVALUATION PROGRAM');
- GOTOXY(15,13);
- TEXTCOLOR(4);
- WRITE('Peck `Y'' to continue or `N'' to return to Main Menu: ');
- READ(KBD,CH);
- IF CH = 'Y' THEN EVAL;
- IF CH = 'y' THEN EVAL;
- END;
-
- PROCEDURE LIPO; { Calls Program LIPID via Execute }
-
- VAR
- LIPID:FILE;
-
- BEGIN
-
- ASSIGN(LIPID,'LIPID.COM');
- EXECUTE(LIPID);
-
- END;
-
- procedure birdstuff;
-
- var birdface:file;
- begin
- assign (birdface,'birdface.com');
- execute(birdface); end;
-
- {############################# MAIN PROGRAM BODY ############################}
-
-
- BEGIN
- SIGNON;
- EXPLAIN;
- MEM[$40:$17] := MEM[$40:$17] OR $40; { toggles caps lock on }
- QUIT := FALSE;
- REPEAT
- TEXTBACKGROUND(2);
- GRAPHBACKGROUND(2);
- TEXTCOLOR(1);
- CLRSCR;
- GOTOXY(1,3);
- MAKEaLINE;
- GOTOXY(27,5);
- TEXTCOLOR(4);
- WRITE('**** MAIN USER MENU ****');
- GOTOXY(1,7);
- TEXTCOLOR(1);
- MAKEaLINE;
- GOTOXY(1,16);
- TEXTCOLOR(1);
- MAKEaLINE;
- GOTOXY(1,17);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(1,18);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,19);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(1,20);
- TEXTCOLOR(1);
- MAKEaLINE;
- GOTOXY(1,21);
- TEXTCOLOR(4);
- MAKEaLINE;
- GOTOXY(1,22);
- TEXTCOLOR(15);
- MAKEaLINE;
- GOTOXY(1,23);
- TEXTCOLOR(1);
- MAKEaLINE;
- GOTOXY(5,9);
- TEXTCOLOR(0);
- WRITE
- (' [V] = Print Variables List [T] = Enter Test Cost Data ');
- WRITELN;
- GOTOXY(5,11);
- WRITE
- (' [D] = Figure Depreciation [S] = Mean , StanDev, Range');
- GOTOXY(5,13);
- WRITE
- (' [M] = Moving Average Calculation [E] = Employee evaluation ');
- GOTOXY(5,15);
- WRITE
- (' [L] = Lipid Profile [A] = Art [Q] = QUIT Peck Your Choice: ');
- READ(KBD,CH);
- CASE CH OF
- 'V','v' : PRINTVAR;
- 'T','t' : CHOOSE;
- 'Q','q' : QUIT := TRUE;
- 'D','d' : GETOUT;
- 'S','s' : STATS;
- 'L','l' : LIPO; {!!!! Execute Procedure - See note Below!!!}
- 'M','m' : MOVINGAV;
- 'A','a' : BIRDSTUFF; {!!! Go to Birdface Execute !!!}
- 'E','e' : evalescape; {!!!!!!! Don't Use this Execute Procedure}
- END; {Unless compiling to a COM file!!!!!!!!!!}
- UNTIL QUIT;
- GRAPHBACKGROUND(0);TEXTBACKGROUND(0);TEXTCOLOR(7); { Reset Video to Exit }
- MEM[$40:$17] := MEM[$40:$17] AND $40; { Reset Keyboard to Caps Lock Off }
- MEM[$40:$17] := MEM[$40:$17] AND $20; { Reset Keyboard to Num Lock Off }
- CLRSCR
-
- END.
-
-
- { }
-