C PDP-12 TRAINING PROGRAM (TRAIN) C C LAST EDIT: 17-FEB-1989 20:00 CJL C C P?S/8 FOCAL-BASED TRAINING PROGRAM (TRAIN) FOR USE WITH P?S/8 FOCAL C TRAINING OVERLAY (TPATCH). C C USAGE: C C .R FOCAL,8PATCH,TPATCH,TPARM1,TPARM2,TPTSK1,TPTSK2,TRAIN1,TRAIN2, C TRAIN3,TRAIN4,TRAIN5 (GN) C C WHERE TRAIN1,TRAIN2,TRAIN3,TRAIN4,TRAIN5 COMPRISE THIS FILE. C C FILE DESCRIPTIONS. C C 8PATCH 8K FOCAL OVERLAY C TPATCH TRAINING OVERLAY C TPARM1-TPARM2 INITIALIZATION FILE C TPTSK1-TPTSK2 TASK DESCRIPTORS C TRAIN1-TRAIN4 THIS PROGRAM C C C MAIN PROGRAM. C C C OUTPUT THE OPENING BANNER AND INITIALIZE GLOBAL VARIABLES. 1.1 DO 31 C C GIVE MENU PROMPT. 1.2 TYPE !,"OPTION: " C C GET USER RESPONSE. 1.3 DO 30 C C DISPATCH TO APPROPRIATE ROUTINE. 1.4 GOTO 29.01 C C SINK FOR BAD RESPONSES. C C ALWAYS START ON A NEW LINE. 1.5 TYPE ! C C OUTPUT RESPONSE LETTER. 1.6 SET D=FIO(K) C C OUTPUT ADDITIONAL BLURB. 1.7 TYPE " NOT AVAILABLE!" C C NOW RESTART. 1.8 GOTO 1.2 C C C START ROUTINE. C C FINISH THE BLURB. 2.1 TYPE "TART TRAINING",! C C GET SWITCHES SET UP, ETC. 2.2 ASK !,"SET SENSE SWITCHES THEN PRESS ",D C C WAIT FOR ALL PRINTING TO COMPLETE. 2.3 FOR I=1,400; C C CALL "FGO" WITH ZERO ARGUMENT TO CLEAR ALL RUN-TIME ACCUMULATION C VARIABLES. 2.4 SET D=FGO(0) C C INDICATE BLOCK IS OVER AND RESTART. 2.5 TYPE "BLOCK OVER!";GOTO 1.2 C C C RESUME ROUTINE. C C FINISH THE BLURB. 3.1 TYPE "ESUME TRAINING",! C C WAIT FOR ALL PRINTING TO COMPLETE. 3.2 FOR I=1,600; C C CALL "FGO" WITH NON-ZERO ARGUMENT TO PRESERVE ALL RUN-TIME ACCUMULATION C VARIABLES. 3.3 SET D=FGO(1) C C INDICATE BLOCK IS OVER AND RESTART. 3.4 TYPE "BLOCK OVER!";GOTO 1.2 C C C ZERO (CENTER) CALIBRATION ROUTINE. C C FINISH THE BLURB. 4.1 TYPE "ERO (CENTER) CALIBRATION",! C C DETERMINE IF ANIMAL OR GALVO CALIBRATION. 4.2 TYPE !,"ANIMAL? (Y/N) ";DO 27;IF (YN) 4.4 C C INDICATE ANIMAL USAGE. 4.3 SET AG=0;DO 24;GOTO 1.2 C C IF NOT ANIMAL, ASK IF GALVO. 4.4 TYPE !!,"GALVO? (Y/N) ";DO 27;IF (YN) 1.2 C C INDICATE GALVO USAGE. 4.5 SET AG=1;DO 24;GOTO 1.2 C C C ACQUISITION TIME ROUTINE. C C FINISH THE BLURB. 5.10 TYPE "CQUISITION TIME",!!,"PRIMARY/SECONDARY? (P/S) " C C GET RESPONSE. 5.15 SET K=FIO(-1) C C CHECK IF UPPER CASE "P". 5.20 IF (K-80) 5.25,5.50,5.25 C C CHECK IF LOWER CASE "P". 5.25 IF (K-112) 5.30,5.50,5.30 C C CHECK FOR UPPER CASE "S". 5.30 IF (K-83) 5.35,5.55,5.35 C C CHECK FOR LOWER CASE "S". 5.35 IF (K-115) 5.40,5.55,5.40 C C CHECK FOR . 5.40 IF (K-13) 5.45,1.2,5.45 C C COMES HERE ON BAD CHARACTERS. 5.45 SET D=FIO(7);GOTO 5.15 C C COMES HERE IF PRIMARY REQUESTED. C 5.50 SET PS=0;TYPE "P",!!,"PRIMARY";GOTO 5.60 C C COMES HERE IF SECONDARY REQUESTED. C 5.55 SET PS=1;TYPE "S",!!,"SECONDARY" C C COMMON ROUTINE. C 5.60 TYPE " ACQUISITION TIME IS",%2.03,FWRD(PS+33)/200," SECONDS" 5.65 TYPE !!,"CHANGE? (Y/N) ";DO 27;IF (YN) 1.2 5.70 ASK !!,"NEW ACQUISITION TIME (SEC) ",T 5.75 SET D=FWRD(PS+33,T*200);GOTO 1.2 C C C EDIT A TASK ROUTINE. C C FINISH THE BLURB. 6.10 TYPE "DIT A TASK",!!,"ENTER TASK DESCRIPTOR (A-P) " 6.15 SET ER=0;DO 21;IF (-ER) 1.2 6.20 TYPE !!;SET I=((K-65)*16)+256;DO 23 6.25 TYPE !,"CHANGE TASK? (Y/N) ";DO 27;IF (YN) 1.2 6.30 TYPE !;SET LI=I+15 6.35 ASK !,"FIXATION TIME (SEC) ",J;SET D=FWRD(I,J*200) 6.40 IF (J-1) 1.2 6.45 ASK !,"GALVO X (DEG) ",J;SET D=FWRD(I+1,J/GS) 6.50 ASK !,"GALVO Y (DEG) ",J;SET D=FWRD(I+2,J/GS) 6.55 SET I=I+3;SET D=FWRD(I,0);IF (I-LI) 6.35,1.2 C C C WINDOW SIZE ROUTINE. C C FINISH THE BLURB. 7.1 TYPE "INDOW SIZE",! C C INDICATE PRIMARY WINDOW AND USE COMMON ROUTINE. 7.2 SET PS=0;GOTO 7.5 C C C JUMP (SECONDARY) WINDOW SIZE ROUTINE. C C FINISH THE BLURB. 7.3 TYPE "UMP (SECONDARY) WINDOW SIZE",! C C INDICATE SECONDARY WINDOW. 7.4 SET PS=4 C C GIVE CURRENT VALUES AND ASK FOR CHANGES. 7.5 TYPE "CURRENT WINDOW H:",%3.00,FWRD(5+PS)," V:",FWRD(6+PS),!!,"CHANGE? (Y/N) " 7.6 DO 27;IF (YN) 1.2 7.7 ASK !,"H: ",A;SET D=FWRD(4+PS,-A)+FWRD(5+PS,A) 7.8 ASK "V: ",A;SET D=FWRD(6+PS,A)+FWRD(7+PS,-A) C C OUTPUT NEW VALUES. 7.9 TYPE "NEW WINDOW H:",FWRD(5+PS)," V:",FWRD(6+PS),!;GOTO 1.2 C C C OPERATING MODE ROUTINE. C C FINISH THE BLURB. 8.10 TYPE "PERATING MODE",!!,"CURRENT MODE IS " C C DETERMINE IF RANDOM OR SEQUENTIAL. 8.12 IF (MO-1) 8.20;TYPE "SEQUENTIAL",!! 8.14 FOR I=1,MO;DO 8.9 8.16 GOTO 8.22 C C COMES HERE IF RANDOM MODE. C 8.20 TYPE "RANDOM",!!;FOR I=1,16;DO 8.8 C C ASK FOR MODE CHANGE. 8.22 TYPE !!,"CHANGE MODE? (Y/N) ";DO 27;IF (YN) 1.2 8.24 TYPE !!,"MODE? (S,R,C) " C C GET RESPONSE. 8.26 SET K=FIO(-1) C C CHECK FOR UPPER CASE "S". 8.28 IF (K-83) 8.30,8.44,8.30 C C CHECK FOR LOWER CASE "S". 8.30 IF (K-115) 8.32,8.44,8.32 C C CHECK FOR UPPER CASE "R". 8.32 IF (K-82) 8.34,8.46,8.34 C C CHECK FOR LOWER CASE "R". 8.34 IF (K-114) 8.36,8.46,8.36 C C CHECK FOR UPPER CASE "C". 8.36 IF (K-67) 8.38,8.62,8.38 C C CHECK FOR LOWER CASE "C". 8.38 IF (K-99) 8.40,8.62,8.40 C C CHECK FOR . 8.40 IF (K-13) 8.42,1.2,8.42 C C SINK FOR BAD CHARACTERS. 8.42 SET D=FIO(7);GOTO 8.26 C C COMES HERE IF SEQUENTIAL MODE IS CHOSEN. C 8.44 TYPE "SEQUENTIAL";SET NM=1;GOTO 8.50 C C COMES HERE IF RANDOM MODE IS CHOSEN. C 8.46 TYPE "RANDOM";SET NM=0 C C CLEAR ALL POINTER FWRDS BEFORE SETTING NEW ONES. 8.50 FOR I=64,79;SET D=FWRD(I,0) 8.52 TYPE !!,"ENTER DESCRIPTORS (A-P)",!! C C GET DESCRIPTORS. 8.54 SET ER=0;SET J=0;FOR I=1,16;DO 22 C C SET MODE AS NECESSARY. 8.56 IF (NM-1) 8.58;SET MO=J;GOTO 8.60 8.58 SET MO=0 8.60 SET D=FWRD(12,MO);GOTO 1.2 C C COMES HERE IF CALIBRATION RUN MODE IS CHOSEN. C 8.62 TYPE "CALIBRATION",!;SET S1=FWRD(12);SET D=FWRD(12,1) 8.64 SET S2=FWRD(64);SET D=FWRD(64,192)+FGO() 8.66 SET D=FWRD(12,S1)+FWRD(64,S2);GOTO 1.2 C C C LOCAL SUBROUTINES. C C C PRINTOUT NON-ZERO POINTER ENTRY. C 8.80 IF (FWRD(64+I-1)-1) 8.81;DO 8.9 8.81 RETURN C C C PRINTOUT POINTER ENTRY. C 8.90 TYPE %2.00,I,":";SET IN=FWRD(64+I-1);SET D=FIO(((IN-256)/16)+65) C C C TASK TABLE ROUTINE. C C FINISH THE BLURB. 9.1 TYPE "ASK TABLE",! 9.2 TYPE !,"ID X Y FIXATION",! 9.3 FOR I=256,16,496;DO 23 9.4 GOTO 1.2 C C C HELP ROUTINE. C C FINISH THE BLURB. 10.10 TYPE "ELP",!! 10.14 TYPE "THE FOLLOWING COMMANDS ARE AVAILABLE BY TYPING " 10.18 TYPE "THE FIRST LETTER OF THE COMMAND:",!! 10.22 TYPE "S START TRAINING SESSION",! 10.26 TYPE "R RESUME TRAINING SESSION",! 10.30 TYPE "O OPERATING MODE",! 10.34 TYPE "Z ZERO (CENTER) CALIBRATION",! 10.38 TYPE "C CALIBRATE INPUT GAIN",! 10.42 TYPE "E EDIT A TASK",! 10.46 TYPE "A ACQUISITION TIME",! 10.50 TYPE "W WINDOW SIZE",! 10.54 TYPE "J JUMP (SECONDARY) WINDOW SIZE",! 10.58 TYPE "T TASK TABLE",! 10.62 TYPE "D DURATION OF TRAINING SESSION (MAXIMUM)",! 10.66 TYPE "M MONITOR (RETURN TO P?S/8)",! 10.70 TYPE "H HELP (PRINTS THIS MESSAGE)",! 10.74 GOTO 1.2 C C C MONITOR ROUTINE. C 11.1 TYPE "ONITOR (RETURN TO P?S/8)",!;LEAVE C C C SUBROUTINES. C C C TASK DESCRIPTOR INPUT ROUTINE. C C SETS "ER" IF IS TYPED TO ALLOW CALLER'S QUICK EXIT ON SUBSEQUENT C CALLS. ALLOWS UPPER CASE "A" THROUGH UPPER CASE "P" AND LOWER CASE "A" C THROUGH LOWER CASE "P" (FOLDED TO THEIR UPPER CASE EQUIVALENTS). ALL C ACCEPTED CASES ARE ECHOED EXCEPT WHICH SETS "ER" AND EXITS. C C 21.10 SET K=FIO(-1) C C ALL CHARACTERS BELOW ARE REJECTED. 21.15 IF (K-13) 21.40,21.55 C C ALL ADDITIONAL CHARACTERS BELOW UPPER CASE "A" ARE REJECTED. 21.20 IF (K-65) 21.40 C C ALL ADDITIONAL CHARACTERS BETWEEN UPPER CASE "A" AND UPPER CASE "P" ARE C ACCEPTED AS IS. 21.25 IF (K-81) 21.50 C C ALL ADDITIONAL CHARACTERS BELOW LOWER CASE "A" ARE REJECTED. 21.30 IF (K-97) 21.40 C C ALL ADDITIONAL CHARACTERS BETWEEN LOWER CASE "A" AND LOWER CASE "P" ARE C ACCEPTED AND FOLDED TO THEIR UPPER CASE EQUIVALENTS. 21.35 IF (K-113) 21.45 C C COMES HERE TO REJECT BAD CHARACTERS. 21.40 SET D=FIO(7);GOTO 21.10 C C COMES HERE TO FOLD LOWER CASE TO UPPER CASE. 21.45 SET K=K-32 C C COMES HERE TO ACCEPT AND ECHO THE USER CHOICE. 21.50 SET D=FIO(K);RETURN C C COMES HERE IF IS TYPED. 21.55 SET ER=1 C C C TASK DESCRIPTOR ROUTINE. C C GETS DESCRIPTOR ID FROM KEYBOARD AND APPLIES IT TO LATEST FWRD(64+I-1). C C CHECK IF "ER" IS SET FIRST. 22.1 IF (-ER) 22.6 22.2 TYPE %2.00,I,":";DO 21;IF (-ER) 22.5 22.3 SET J=J+1;SET IN=(((K-65)*16)+256);SET D=FWRD(64+I-1,IN) 22.4 IF (-FWRD(IN)) 22.5;TYPE " **WARNING** UNDEFINED!" 22.5 TYPE ! 22.6 RETURN C C C TASK TABLE PRINTOUT SUBROUTINE. C 23.1 SET J=0;SET IN=((I-256)/16)+65;IF (-FWRD(I)) 23.3 23.2 SET D=FIO(IN);TYPE ": UNDEFINED",!;RETURN 23.3 SET D=FIO(IN);TYPE ":" 23.4 SET T=FWRD(I+J);SET X=FWRD(I+J+1);SET Y=FWRD(I+J+2) 23.5 IF (-T) 23.6;TYPE !;RETURN 23.6 TYPE " ",%2.00,X*GS," ",Y*GS," ",%2.02,(T/200) 23.7 SET J=J+3;GOTO 23.4 C C C MAIN SUBROUTINE FOR ZERO (CENTER) CALIBRATION. C C USAGE: C C SET AG=0 FOR ANIMAL, 1 FOR GALVO. C C DO 24 C C OUTPUT CURRENT HORIZONTAL OFFSET. 24.10 TYPE !!,"CURRENT HORIZONTAL OFFSET ",%4.01,FWRD((4*AG)+26)*2," MV" C C OUTPUT CURRENT VERTICAL OFFSET. 24.13 TYPE !!,"CURRENT VERTICAL OFFSET ",FWRD((4*AG)+28)*2," MV" C C GET CALIBRATION COUNT; CHECK IF ANY READINGS TAKEN. 24.16 SET C=FWRD((2*AG)+21);IF (C-1) 24.76 C C PRINT OUT HORIZONTAL READINGS. 24.19 TYPE !!,%1.00,C," READINGS",!!,"HORIZONTAL (MV): " C C SET ANIMAL/GALVO TABLE BASE AND EVEN ACCESS FOR HORIZONTAL READINGS. 24.22 SET B=(AG*32)+128;SET O=0 24.25 FOR I=0,C-1;DO 26;TYPE %4.00," ",R*2 24.28 TYPE ! C C ACCEPT/REJECT THE HORIZONTAL READINGS. 24.31 SET S=0;SET Q=0;SET ER=0;FOR I=0,C-1;DO 25 C C CHECK IF ANY READINGS ACCEPTED. 24.34 IF (Q-1) 24.46;SET S=S/Q C C REPORT AVERAGE HORIZONTAL OFFSET; ASK IF ACCEPTED. 24.37 TYPE !!,"AVERAGE HORIZONTAL OFFSET ",S," MV",!!,"NULL OFFSET? (Y/N) " C C GET RESPONSE; UPDATE HORIZONTAL OFFSET IF "YES". 24.40 DO 27;IF (YN) 24.46;SET V=FWRD((AG*4)+26) 24.43 TYPE !!,"NEW HORIZONTAL OFFSET ",FWRD((AG*4)+26,-(S/2)+V)*2," MV" C C PRINTOUT VERTICAL READINGS. 24.46 TYPE !!,"VERTICAL (MV): " C C SET ODD ACCESS FOR VERTICAL READINGS. 24.49 SET O=1 24.52 FOR I=0,C-1;DO 26;TYPE %4.00," ",R*2 24.55 TYPE ! C C ACCEPT/REJECT THE VERTICAL READINGS. 24.58 SET S=0;SET Q=0;SET ER=0;FOR I=0,C-1;DO 25 C C CHECK IF ANY READINGS ACCEPTED. 24.61 IF (Q-1) 24.73;SET S=S/Q C C REPORT AVERAGE VERTICAL OFFSET; ASK IF ACCEPTED. 24.64 TYPE !!,"AVERAGE VERTICAL OFFSET ",S," MV",!!,"NULL OFFSET? (Y/N) " C C GET RESPONSE; UPDATE VERTICAL OFFSET IF "YES". 24.67 DO 27;IF (YN) 24.73;SET V=FWRD((AG*4)+28) 24.70 TYPE !!,"NEW VERTICAL OFFSET ",FWRD((AG*4)+28,-(S/2)+V)*2," MV" C C CLEAR CALIBRATIONS COUNT. 24.73 SET D=FWRD((AG*2)+21,0);RETURN C C COMES HERE IF THERE WERE NO READINGS TAKEN TO ALLOW MANUAL ENTRY. 24.76 TYPE !!,"NO CALIBRATIONS TAKEN!",!!,"ALTER HORIZONTAL OFFSET? (Y/N) " C C GET RESPONSE. IF "YES", ALLOW UPDATE. 24.79 DO 27;IF (YN) 24.85 24.82 ASK " CORRECTION VALUE (MV): ",X;SET D=FWRD((AG*4)+26,X/2);GOTO 24.88 C C COMES HERE TO FINISH THE LINE IF RESPONSE WAS "NO". 24.85 TYPE ! C C NOW ASK ABOUT VERTICAL OFFSET. 24.88 TYPE !,"ALTER VERTICAL OFFSET? (Y/N) ";DO 27;IF (YN) 24.94 C C ASK FOR VERTICAL CORRECTION VALUE. 24.91 ASK " CORRECTION VALUE (MV): ",Y;SET D=FWRD((AG*4)+28,Y/2);RETURN C C COMES HERE TO FINISH THE LINE IF RESPONSE WAS "NO". 24.94 TYPE ! C C C ACCEPT/REJECT ROUTINE FOR CALIBRATION VALUES. C C USAGE: C C SET B=BASE OF TABLE. C SET O=0 OR 1 AS NECESSARY TO ACCESS EVEN/ODD MEMBERS OF TABLE. C SET I=CURRENT PAIR NUMBER (GENERALLY I IS THE LOOP COUNTER). C C DO 25 C C NOTE: SINCE THE YES/NO// ROUTINE IS USED, THE "ER" VARIABLE C WILL BECOME +1 IF THE OPTION IS EXERCISED, OR -1 IF THE C OPTION IS EXERCISED. THIS CAUSES THE CURRENT AND ALL FURTHER VALUES TO C BE ACCEPTED OR REJECTED AS NECESSARY WITHOUT THE ATTENDANT QUESTION. C C CHECK IF "ER" IS ALREADY SET. 25.1 IF (ER) 25.7,25.2,25.5 C C ASK ACCEPTANCE QUESTION. 25.2 TYPE !,"ACCEPT ";DO 26;TYPE R*2,"? (Y/N) ";DO 28;IF (ER) 25.6,25.3,25.4 C C CHECK IF RESPONSE WAS "YES" OR "NO". 25.3 IF (YN) 25.7,25.5,25.5 C C COMES HERE IF RESPONSE WAS . 25.4 TYPE "ALL FURTHER VALUES ACCEPTED" C C ACCEPT LATEST VALUE INTO SUMMATION. 25.5 DO 26;SET S=S+(R*2);SET Q=Q+1;RETURN C C COMES HERE IF RESPONSE WAS . 25.6 TYPE "ALL FURTHER VALUES REJECTED" 25.7 RETURN C C C TABLE-ORIENTED "FWRD" RETRIEVAL ROUTINE FOR USE WITH CALIBRATION, ETC. C C USAGE: C C SET B=BASE OF TABLE. C SET O=0 OR 1 AS NECESSARY TO ACCESS EVEN/ODD MEMBERS OF TABLE. C SET I=CURRENT PAIR NUMBER (GENERALLY I IS THE LOOP COUNTER). C C DO 26 WILL RETURN THE VALUE IN R OF THE REQUIRED TABLE ELEMENT. C 26.1 SET R=FWRD(B+O+(I*2)) C C C YES/NO ROUTINE. CALLS YES/NO// ROUTINE THEN REJECTS C AND CASES LOCALLY. C C CALL YES/NO// ROUTINE. 27.1 DO 28 C C CHECK IF OR CASES. 27.2 IF (ER) 27.3,27.4,27.3 C C REJECT OR CASES WITH A . 27.3 SET D=FIO(7);GOTO 27.1 27.4 RETURN C C C YES/NO// ROUTINE. ECHOES "YES" IF UPPER CASE "Y" (89) OR C LOWER CASE "Y" (121). ECHOES "NO" IF UPPER CASE "N" (78) OR LOWER CASE C "N" (110). ACCEPTS (13) WITHOUT ECHO. ACCEPTS (27) C WITHOUT ECHO. ALL OTHER CASES OUTPUT A BEEP CHARACTER (7). C C SETS "YN" TO 0 IF "Y" OR . C C SETS "YN" TO -1 IF "N" OR . C C SETS "ER" TO -1 IF . C C SETS "ER" TO 1 IF . C C SETS "ER" TO 0 IF "Y" OR "N". C C GET INPUT CHARACTER. 28.10 SET K=FIO(-1) C C RANGE CHECKING. C C ALL BELOW (13) ARE REJECTED. (13) IS ACCEPTED. 28.15 IF (K-13) 28.45,28.60 C C ALL BELOW (27) ARE REJECTED. (27) IS ACCEPTED. 28.20 IF (K-27) 28.45,28.65 C C ALL OTHERS BELOW UPPER CASE "N" (78) ARE REJECTED. UPPER CASE "N" (78) C IS ACCEPTED. 28.25 IF (K-78) 28.45,28.50 C C ALL OTHERS BELOW UPPER CASE "Y" (89) ARE REJECTED. UPPER CASE "Y" (89) C IS ACCEPTED. 28.30 IF (K-89) 28.45,28.55 C C ALL OTHERS BELOW LOWER CASE "N" (110) ARE REJECTED. LOWER CASE "N" (110) C IS ACCEPTED. 28.35 IF (K-110) 28.45,28.50 C C ALL OTHERS BELOW LOWER CASE "Y" (121) ARE REJECTED. LOWER CASE "Y" (121) C IS ACCEPTED. ALL HIGHER VALUES ARE REJECTED. 28.40 IF (K-121) 28.45,28.55 C C COMES HERE TO REJECT ALL BAD CHARACTER VALUES. 28.45 SET D=FIO(7);GOTO 28.10 C C VALID "NO" VALUES COME HERE. 28.50 SET YN=-1;SET ER=0;TYPE "NO";RETURN C C VALID "YES" VALUES COME HERE. 28.55 SET YN=0;SET ER=0;TYPE "YES";RETURN C C COMES HERE. 28.60 SET YN=0;SET ER=1;RETURN C C COMES HERE. 28.65 SET YN=-1;SET ER=-1 C C C MAIN DISPATCH ROUTINE. C C CHECK FOR "A". 29.01 IF (K-65) 29.02,5.1 C C CHECK FOR "B". 29.02 IF (K-66) 29.03,1.5 C C CHECK FOR "C". 29.03 IF (K-67) 29.04,1.5 C C CHECK FOR "D". 29.04 IF (K-68) 29.05,1.5 C C CHECK FOR "E". 29.05 IF (K-69) 29.06,6.1 C C CHECK FOR "F". 29.06 IF (K-70) 29.07,1.5 C C CHECK FOR "G". 29.07 IF (K-71) 29.08,1.5 C C CHECK FOR "H". 29.08 IF (K-72) 29.09,10.1 C C CHECK FOR "I". 29.09 IF (K-73) 29.10,1.5 C C CHECK FOR "J". 29.10 IF (K-74) 29.11,7.3 C C CHECK FOR "K". 29.11 IF (K-75) 29.12,1.5 C C CHECK FOR "L". 29.12 IF (K-76) 29.13,1.5 C C CHECK FOR "M". 29.13 IF (K-77) 29.14,11.1 C C CHECK FOR "N". 29.14 IF (K-78) 29.15,1.5 C C CHECK FOR "O". 29.15 IF (K-79) 29.16,8.1 C C CHECK FOR "P". 29.16 IF (K-80) 29.17,1.5 C C CHECK FOR "Q". 29.17 IF (K-81) 29.18,1.5 C C CHECK FOR "R". 29.18 IF (K-82) 29.19,3.1 C C CHECK FOR "S". 29.19 IF (K-83) 29.20,2.1 C C CHECK FOR "T". 29.20 IF (K-84) 29.21,9.1 C C CHECK FOR "U". 29.21 IF (K-85) 29.22,1.5 C C CHECK FOR "V". 29.22 IF (K-86) 29.23,1.5 C C CHECK FOR "W". 29.23 IF (K-87) 29.24,7.1 C C CHECK FOR "X". 29.24 IF (K-88) 29.25,1.5 C C CHECK FOR "Y". 29.25 IF (K-89) 29.26,1.5 C C CHECK FOR "Z". 29.26 IF (K-90) 29.27,4.1 C C SHOULDN'T COME HERE! 29.27 TYPE "INTERNAL ERROR!";GOTO 1.1 C C C MENU RESPONSE ROUTINE. ACQUIRES A CHARACTER AND FILTERS OUT BAD VALUES. C ONLY UPPER AND LOWER CASE LETTERS ARE ACCEPTED. GOOD VALUES ARE ECHOED C IN UPPER CASE. BAD VALUES ARE BEEPED WITH . C C GET INPUT CHARACTER. 30.1 SET K=FIO(-1) C C RANGE CHECKING. C C CHARACTERS LESS THAN UPPER CASE "A" (65) ARE REJECTED. 30.2 IF (K-65) 30.6 C C CHARACTERS BETWEEN UPPER CASE "A" (65) AND UPPER CASE "Z" (90) ARE C ACCEPTED. 30.3 IF (K-91) 30.8 C C CHARACTERS ABOVE UPPER CASE "Z" (90) BUT LESS THAN LOWER CASE "A" (97) C ARE REJECTED. 30.4 IF (K-97) 30.6 C C CHARACTERS ABOVE LOWER CASE "Z" (122) ARE REJECTED. CHARACTERS BETWEEN C LOWER CASE "A" (97) AND LOWER CASE "Z" (122) ARE ACCEPTED. 30.5 IF (K-123) 30.7 C C COMES HERE TO REJECT ALL BAD CHARACTERS. 30.6 SET D=FIO(7);GOTO 30.1 C C COMES HERE TO FOLD LOWER CASE CHARACTERS TO UPPER CASE EQUIVALENT. 30.7 SET K=K-32 C C COMES HERE TO ECHO THE (UPPER CASE) ACCEPTED CHARACTER. 30.8 SET D=FIO(K) C C C OPENING BANNER ROUTINE. C 31.1 TYPE "PDP-12 MONKEY TRAINING PROGRAM (VERSION " 31.2 SET D=FIO(V+48)+FIO(R+64) 31.3 TYPE ")",!!,"TYPE 'H' FOR HELP.",! C C C VARIABLE INITIALIZATION. C C SET VERSION NUMBER. C SET V=2 ;C VERSION NUMBER C C SET REVISION LETTER. C SET R=5 ;C REVISION LETTER C C SET GALVO SCALING FACTOR RELATING D-A UNITS TO DEGREES. C SET GS=5/512 ;C GALVO SCALING FACTOR C C SET DEFAULT OPERATING MODE. C SET MO=1 ;C DEFAULT OPERATING MODE IS SEQUENTIAL C C C END OF TRAINING PROGRAM.