SUPTEST

Notes:
Epson HX-20 program for ROM
Addresses are startung at 0x6000

Due to DEFSTR U-Y strings have no trailing dollar sign.
There are 5 machine language routines of which one is called via USR function:
DEFUSR0=&H6300    INFL = USR0(OUTFL)
DEFUSR1=&H6302    never used?
DEFUSR2=12        never used?
DEFUSR3=59*60     never used?
DEFUSR4=20        never used?

  10 WIDTH 20,20 
  11 CLEAR 300,20*14 
  12 DEFINT A-T:DEFSTR U-Y:DEFSNG Z 
  20 WF="***** SOTAX AG ***** CH-4008      BASEL ":WR="SUPTEST.1_5" 
  30 TITLE WR:GOTO 3000 
 500 X=INKEY$:I=I+1:LOCATE18,N1,(I/4)MOD2:IF X="" THEN 500 :ELSE IF ASC(X)>32 THEN PRINTX; 
 510 IF ASC(X)=9 THEN M=N+2:SOUND14,4:RETURN :ELSE IF ASC(X)=13 THEN M=N+1:RETURN :ELSE IF VAL(X)<1 OR VAL(X)>N THEN 500 :ELSE M=VAL(X):RETURN 
 550 X=INKEY$:I=I+1:LOCATE CX,CY,(I/4)MOD2:IF X=""THEN 550 :ELSE IF X="y"OR X="Y"OR X="j"OR X="J" THEN X="Y":RETURN :ELSE IF X="n" OR X="N" THEN X="N":RETURN :ELSE 550 
 600 SOUND14,6:PRINT " "XE;" "CHR$(156);:Y2=INPUT$(1):PRINT:RETURN 
1000 Y1="":PRINT X1":"STRING$(10,32):PRINT X:PRINT "_"STRING$(N-1,46);: FOR I=1 TO N:PRINT CHR$(29);:NEXT 
1010 Y=INPUT$(1):IF Y=CHR$(9) OR (Y=CHR$(13) AND LEN(Y1)<1) THEN RETURN :ELSE IF (ASC(Y)>31) AND (ASC(Y)<123) THEN IF LEN(Y1)<N THEN Y1=Y1+Y: PRINT Y"_"CHR$(29); 
1015 IF Y=CHR$(1) AND X1=U5 AND LEN(Y1)<1 THEN X=XM(VAL(DATE$))+RIGHT$(DATE$,6) :PRINT X:RETURN 
1020 IF Y=CHR$(8) OR Y=CHR$(29) THEN IF LEN(Y1)>0 THEN PRINT"."STRING$(2,29)"_" CHR$(29);:Y1=LEFT$(Y1,LEN(Y1)-1) :ELSE 1010 
1030 IF Y=CHR$(13) THEN X=Y1:PRINT:RETURN :ELSE 1010 
1100 GET% I,ZVAL(1),ZVAL(2),ZVAL(3),NVAL:RETURN 
1120 GET% 14,XOP :GET% 15,NREC, XDAT:XDAT=LEFT$(XDAT,9) 
1130 GET% 0, XTST:GET% 13, WGT:XTST=LEFT$(XTST,12) 
1140 GET% 16, XSPEC:GET% 17, XREM(1):GET% 18, XREM(2):GET% 19, XREM(3):RETURN 
1200 PUT% I,ZVAL(1),ZVAL(2),ZVAL(3),NVAL:RETURN 
1220 PUT% 14,XOP :PUT% 15,NREC, XDAT 
1230 PUT% 0, XTST:PUT% 13, WGT 
1240 PUT% 16, XSPEC:PUT% 17, XREM(1):PUT% 18, XREM(2):PUT% 19, XREM(3):RETURN 
1300 LPRINT STRING$(2,10);U19;STRING$(24,141)U1":"TAB(10)XSPEC 
1310 FOR K=1 TO 3:IF (LEN(XREM(K))>1) AND (LEFT$(XREM(K),1)<>"-") THEN LPRINT TAB(10)XREM(K) 
1315 NEXT K 
1330 LPRINT U2":"TAB(10)WGT:LPRINT U3":"TAB(10)XTST:LPRINT U5":"TAB(10)XDAT: LPRINT U4":"TAB(10)XOP:LPRINT:RETURN 
1350 LPRINT " #"TAB(6)"A"TAB(13)"B"TAB(20)"C":RETURN 
1400 GOSUB 1100:LPRINT USING "##";I;:FOR K=1 TO 3: IF ZVAL(K)=0 THEN LPRINT "    -  "; :ELSE LPRINT USING"  ##.##";ZVAL(K); 
1410 NEXT K:LPRINT:RETURN 
1450 FOR K=1TO 3:IF ZVAL(K)<>0 THEN RETURN :ELSE NEXT:NREC=NREC-1:FLAG=1:RETURN 
1500 ZT=0:ZHI=0:ZLO=MAXT/60:FAIL=0:FOR I=1 TO NREC:GOSUB 1100:FOR K=1 TO 3: IF ZHI<ZVAL(K) THEN ZHI=ZVAL(K) 
1505 IF ZVAL(K)>0 THEN ZT=ZT+ZVAL(K) :ELSE FAIL=FAIL+1 
1510 IF (ZLO>ZVAL(K) AND ZVAL(K)>0) THEN ZLO=ZVAL(K) 
1520 NEXT:GOSUB 1900:NEXT:NT=3*NREC-FAIL 
1522 IF ZHI=0 THEN ZLO=0 
1525 IF NT>0 THEN ZAVE=ZT/NT :ELSE ZAVE=0 
1530 RETURN 
1600 ZT=0:FOR I=1 TO NREC:GOSUB 1100:FOR K=1 TO 3: IF ZVAL(K)>0 THEN ZT=ZT+(ZVAL(K)-ZAVE)^2 
1605 NEXT:GOSUB 1900:NEXT 
1610 IF NT-1>0 THEN ZT=SQR(ZT/(NT-1)) :ELSE ZT=0 
1620 IF ZAVE>0 THEN ZREL=ZT*100/ZAVE :ELSE ZREL=0 
1630 RETURN 
1700 GOSUB 1500:GOSUB 1600:LPRINT U9;XT":"TAB(13);:LPRINT USING " ##";NT: LPRINT U10":"TAB(13);:LPRINT USING " ##.## ";ZAVE;:LPRINT XM 
1710 LPRINT U11":"TAB(13);:LPRINT USING " ##.## ";ZHI;:LPRINT XM: LPRINT U12":"TAB(13);:LPRINT USING " ##.## ";ZLO;:LPRINT XM 
1720 LPRINT U13":"TAB(13);:LPRINT USING " ##.## ";ZT;:LPRINT XM:LPRINT U20":";: LPRINT TAB(13);:LPRINT USING"###.##";ZREL;:LPRINT" %";STRING$(2,10):RETURN 
1750 FOR K=1 TO 3:CX=(K-1)*6+1:CY=2:LOCATE 0,3:PRINT SPC(19);:LOCATE CX,3: PRINT"#"CHR$(64+K)" Y/N";:GOSUB 550:IF X="N" THEN ZVAL(K)=0 
1760 PRINT USING"##.##";ZVAL(K):NEXT:RETURN 
1800 Y2=TIME$:DIF=FNTIM-STIM:IF DIF<0 THEN DIF=DIF+3600:RETURN :ELSE RETURN 
1900 LOCATE 7,3:IF (I MOD 2) THEN PRINT "     ";:RETURN :ELSE PRINT XW;:RETURN 
2000 XE="ERROR":XW="WAIT":XI="INPUT":XM="Min.":XP="PRINT":XT="TEST" 
2001 U1="SPECIMEN": U2="WEIGHT" 
2003 U3="No": U4="OPERATOR" 
2005 U5="DATE": U6="RESULTS ONLY" 
2007 U7="ALL": U8="TESTER NOT READY" 
2009 U9="No of ": U10="MEAN" 
2011 U11="HIGH VALUE": U12="LOW VALUE 
2013 U13="S ABS": U14="READY for " 
2015 U15="ABORTED": U16="DELETED" 
2017 U17="TIME": U18="NO DATA" 
2019 U19="* SOTAX  SUPPOTEST ST3 *": U20="S REL": U21="REMARK" 
2050 RETURN 
3000 PRINT WF"*** "WR" ****"; 
3020 KEY1,CHR$(1):KEY2,CHR$(4):KEY3,CHR$(2):KEY4,CHR$(16):KEY5,"RUN"+CHR$(13) 
3022 KEY6,"":KEY7,"":KEY8,"":KEY9,"":KEY10,"" 
3030 GOSUB 2000 
3040 MAXR=12:NREC=MAXR:MINR=1:MAXT=59*60:MINT=20:MAXW=10 
3045 DEFUSR0=&H6300:DEFUSR1=&H6302:DEFUSR2=MAXR:DEFUSR3=MAXT:DEFUSR4=MINT: DEFFIL 14,0 
3100 DIM ZVAL(3): DIM XM(12) 
3120 DEF FNTIM=VAL(MID$(Y2,4,2))*60+VAL(RIGHT$(Y2,2)) 
3200 RESTORE 3210:FOR I=1 TO 12:READ XM(I):NEXT 
3210 DATA JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC 
4000 CLS:PRINT"**** MAIN  MENU **** 1   "XT:PRINT" 2   "XP" LAST DATA"; "TAB  END";TAB(16)"?";:N=2:N1=3:GOSUB500:ON M GOTO 5000,7000,4000,18000 
5000 GOSUB 1120:GOTO 5030 
5005 CLS:LOCATE0,0,1:X1=U1:X=XSPEC:N=14:GOSUB 1000:IFY=CHR$(9) THEN 4000 :ELSE XSPEC=X 
5010 FOR K=1 TO 3 
5015 X1=U21+STR$(K):X=XREM(K):N=14:GOSUB 1000:IF Y=CHR$(9) THEN 4000 
5020 IF (LEN(X)<=1) OR (LEFT$(X,1)="-") THEN XREM(K)="-" :ELSE XREM(K)=X 
5025 NEXT K 
5030 CLS:PRINT "SPEC: ";XSPEC; 
5035 FOR K=1 TO 3:PRINT XREM(K);:IF K<3 THEN PRINT :ELSE PRINT TAB(16)"Y/N"; 
5040 NEXT K: CX=19:CY=3:GOSUB 550:IF X="N" THEN 5005 
5055 XDAT=XM(VAL(DATE$))+RIGHT$(DATE$,6):GOTO 5090 
5065 CLS:X1=U2:X=WGT:N=12:GOSUB 1000:IF Y=CHR$(9) THEN 4000 :ELSE WGT=X 
5070 X1=U3:X=XTST:N=12:GOSUB 1000:IF Y=CHR$(9) THEN 4000 :ELSE XTST=X 
5080 X1=U4:X=XOP: N=14:GOSUB 1000:IF Y=CHR$(9) THEN 4000 :ELSE XOP=X 
5085 X1=U5:X=XDAT:N=9 :GOSUB 1000:IF Y=CHR$(9) THEN 4000 :ELSE XDAT=X 
5090 CLS:PRINT "WGT: ";WGT:PRINT "No:  ";XTST:PRINT "OP:  ";XOP: PRINT "DAT: ";XDAT;TAB(16)"Y/N"; 
5100 GOSUB 550:IF X="N" THEN 5065 :ELSE NREC=0:GOSUB 1220 
5110 GOSUB 1300:GOSUB 1350:FOR I=1 TO MAXR:PUT%I,STRING$(14,0):NEXT:FLAG=1:CLS 
5200 LOCATE0,3:PRINT SPC(19);:LOCATE1,3,1:PRINT U14;:OUTFL=&H80: IF NREC<MAXR THEN PRINT"#"NREC+1;:ELSE PRINT XP; 
5210 X=INKEY$:INFL=USR0(OUTFL):IF INFL<128 THEN 5215 :ELSE IF FLAG=0 THEN FLAG=1: I=NREC:GOSUB 1200:GOSUB 1220:GOSUB 1400 
5212 Y2=TIME$:STIM=FNTIM:GOTO 5300 
5215 IF X=CHR$(16) AND NREC>0 THEN 5500 :ELSE IF X<>CHR$(4) THEN 5210 
5220 IF NREC<1 THEN X=XT+" "+U15:LPRINT X:PRINT X:GOSUB 600:GOTO 4000 
5230 IF FLAG THEN SOUND 14,5:GOTO 5210 :ELSE FLAG=1:NREC=NREC-1:GOTO 5200 
5300 IF NREC=MAXR THEN SOUND14,5:GOTO 5210 :ELSE X=INKEY$:INFL=USR0(OUTFL): IF INFL<128 THEN 5350 :ELSE IF X=CHR$(4) THEN SOUND 14,5 :ELSE GOSUB 1800:IF DIF>MAXW THEN LPRINT U17"-"XE :ELSE 5300 
5310 GOTO 5200 
5350 Y2=TIME$:STIM=FNTIM 
5360 NREC=NREC+1:CLS:PRINT XTST;TAB(8)"#";:PRINT USING"##";NREC: PRINT"   A     B     C     ..... ..... .....";:OUTFL=7 
5400 GOSUB 1800:IF DIF<>TM THEN TM=DIF:LOCATE 14,0,0:PRINT USING"##:##"; INT(DIF/60);DIF MOD 60;:IF DIF>MAXT THEN SOUND 14,5:PRINT U17"-"XE: NREC=NREC-1:FLAG=1:GOTO 5200 
5410 X=INKEY$:IF X=CHR$(4) THEN NREC=NREC-1:FLAG=1:LOCATE 0,3:GOTO 5200 
5420 INFL=USR0(OUTFL):IF INFL<1 OR INFL>3 THEN 5440 :ELSE IF DIF<MINT THEN ZVAL(INFL)=0 :ELSE ZVAL(INFL)=DIF/60 
5430 LOCATE (INFL-1)*6+1,2:PRINT USING"##.##";ZVAL(INFL):OUTFL=PEEK(&H8D4) 
5440 IF OUTFL>0 THEN 5400 :ELSE FLAG=0:FOR K=8 TO 16:SOUND K,1:NEXT 
5445 GOSUB 1450:IF FLAG=1 THEN 5200 :ELSE LOCATE0,3:PRINT"ALL RESULTS OK Y/N"; 
5450 :CX=17:CY=3:GOSUB 550:IF X<>"Y" THEN GOSUB 1750 
5460 GOSUB 1450:GOTO 5200 
5500 LOCATE 0,3:PRINT TAB(7)XP"   ";:IF FLAG=0 THEN I=NREC:GOSUB 1200: GOSUB 1220:GOSUB 1400 
5520 LPRINT:GOSUB 1700:GOTO 4000 
6000 GOTO 6000 
7000 CLS:GOSUB 1120:PRINT U3": "XTST:PRINT XSPEC: IF NREC<MINR OR NREC>MAXR THEN PRINT U18;:GOSUB 600:GOTO 4000 
7010 PRINT"1 "XP" "U6;"2 "XP" "U7;TAB(16)"?";:N=2:N1=3:GOSUB 500: LOCATE 0,3: PRINT "       "XW;:ON M GOTO 7100,7200,4000,4000 
7100 GOSUB 1300:GOTO 7220 
7200 GOSUB 1300:GOSUB 1350:FOR I=1 TO NREC:GOSUB 1400:NEXT I 
7220 LPRINT:GOSUB 1700:GOTO 4000 
18000 KEY1,CHR$(34)+"COM0:(48N2B)"+CHR$(34):KEY2,"LIST":KEY3,"LLIST":KEY4,"STAT" 
18002 KEY5,CHR$(12)+"CLS:RUN"+CHR$(13) 
18004 KEY6,"WIND":KEY7,"LOAD":KEY8,"SAVE"+CHR$(34):KEY9,"TITLE"+CHR$(34): KEY10,"LOGIN" 
18020 CLS:PRINT WF"*** "WR" ***";:END 
30000 END 
 
