/ PDP-12 FOCAL TRAINING OVERLAY / PDP-12 TRAINING PROGRAM IMPLEMENTED AS AN OVERLAY TO P?S/8 FOCAL ("TPATCH"). / LAST EDIT: 04-FEB-1989 21:00:00 CJL / CAN BE ASSEMBLED WITH '/J' SWITCH SET. / MUST BE ASSEMBLED WITH '/8' SWITCH SET. / MUST BE ASSEMBLED WITH '/E' SWITCH SET. / (OBVIOUSLY RUNS ON PDP-12 ONLY.) XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / THIS IS A COLLECTION OF PATCHES TO P?S/8 FOCAL TO IMPLEMENT THREE FUNCTIONS: / 1) FGO(INITIALIZE-INDICATOR) / 2) FWRD(ADDRESS[,REPLACEMENT VALUE]) / 3) FIO(ARGUMENT) / DESCRIPTION OF FUNCTIONS: / THE FUNCTION "FGO" RUNS THE TRAINING ROUTINE AS LONG AS SNS[0] IS SET OR THE COUNT-DOWN / TIMER VARIABLE DOESN'T OVERFLOW. WHEN EITHER TERMINATION CONDITION OCCURS, THE FUNCTION / RETURNS (RETURN VALUE UNIMPORTANT). VARIOUS OTHER SENSE SWITCH SETTINGS PROVIDE FOR / OPTIONAL DISPLAYS AND CALIBRATION. VARIOUS ADDRESSES (WHICH CAN BE REFERENCED BY "FWRD") / ARE USED AS PARAMETERS OR VARIABLES. IF THE PASSED ARGUMENT IS ZERO, ALL ACCUMULATED / VARIABLES (RUNNING TIME, ETC.) ARE CLEARED. IF THE PASSED ARGUMENT IS NON-ZERO, THE / VARIABLES WILL BE PRESERVED TO ACCUMULATE TOTAL TIMES, ETC. SEE SENSE SWITCH TABLE FOR / ADDITIONAL FEATURES. / THE FUNCTION "FWRD" INVOKED WITH ONE ARGUMENT RETURNS THE CONTENTS OF A SPECIFIED MEMORY / ADDRESS EVALUATED FROM THE ARGUMENT. IF "FWRD" IS INVOKED WITH TWO ARGUMENTS, THE / EVALUATION OF THE SECOND ARGUMENT BECOMES THE REPLACEMENT VALUE TO BE STORED IN THE / SPECIFIED ADDRESS EVALUATED FROM THE FIRST ARGUMENT. (IT ALSO BECOMES THE RETURN VALUE / OF THE FUNCTION). THE (FIRST) ARGUMENT IS AN ELEVEN BIT ADDRESS OF A TWENTY-FOUR BIT / NUMBER; LEGAL ADDRESS VALUES RANGE FROM 0 THROUGH 2047; LEGAL DATA VALUES FOR THE / SECOND ARGUMENT (OR RETURNED VALUE) RANGE FROM -8,388,608 THROUGH 8,388,607. THE BASE / ADDRESS IS THAT OF THE VARIABLE TABLES TO ALLOW FOR FOCAL PROGRAM COMPATIBILITY IN CASE / OF REASSEMBLY OF THIS TRAINING PROGRAM OVERLAY. / THE FUNCTION "FIO" PERFORMS INPUT OR OUTPUT OF A SINGLE CHARACTER DEPENDING ON THE PASSED / ARGUMENT. IF THE ARGUMENT IS >2047 OR NEGATIVE THEN THE FUNCTION RETURNS THE NUMERICAL / VALUE (MODULO 128) OF THE NEXT ASCII CHARACTER TYPED INTO P?S/8 FOCAL; THE FUNCTION WILL / HANG IF NECESSARY UNTIL A CHARACTER IS TYPED. IF THE ARGUMENT IS <2048 THEN THE VALUE / PASSED (MODULO 256) WILL BE OUTPUT TO THE PREVAILING TERMINAL OUTPUT DEVICE. / DESCRIPTION OF SENSE SWITCH SETTINGS FOR "FGO" (NORMAL RUN): / SENSE SWITCH USAGE / 0 1=TRAIN ANIMAL. / 0=RETURN TO FOCAL. / 1 0=DON'T ALLOW CALIBRATION READINGS. / 1=ALLOW CALIBRATION READINGS FROM SXL 11, 12, 13. / 2 1=DISPLAY WINDOW BORDER (POSSIBLY RELATIVE). / 0=DON'T DISPLAY WINDOW BORDER. / 3 1=DISPLAY CURRENT GALVO POSITION (ABSOLUTE). / 0=DON'T DISPLAY CURRENT GALVO POSITION. / 4 1=DISPLAY CURRENT ANIMAL POSITION (POSSIBLY RELATIVE). / 0=DON'T DISPLAY CURRENT ANIMAL POSITION. / 5 1=DISPLAY OF WINDOW OR GALVO IS RELATIVE TO GALVO. / 0=DISPLAY OF WINDOW OR GALVO IS ABSOLUTE. / RELAY USAGE: / 0 TARGET LIGHT. / 1 REWARD. / 2 D-A ENABLE. / 3 D-A BIT[0]. / 4 D-A BIT[1]. / 5 D-A BIT[2]. / SXL USAGE: / 10 OPEN=DON'T GIVE REWARD. / CLOSED=GIVE REWARD INDEPENDENTLY OF TASKS. / 11 OPEN=GALVO READINGS WILL BE TAKEN. / CLOSED=ANIMAL READINGS WILL BE TAKEN. / 12 OPEN=DON'T TAKE FIRST-CASE READINGS. / CLOSED=TAKE FIRST-CASE READINGS. / 13 OPEN=DON'T TAKE SECOND-CASE READINGS. / CLOSED=TAKE SECOND-CASE READINGS. / DESCRIPTION OF VARIABLES TO BE ACCESSED BY "FWRD": / FWRD FIRST ARGUMENT VALUE USAGE / 0 TOTAL RUNNING (CLOCK) TIME. / 1 IN-WINDOW RUNNING TIME. / 2 INTO-WINDOW TRANSITION COUNT. / 3 OUT-OF-WINDOW TRANSITION COUNT. / 4 PRIMARY LEFT-HAND WINDOW LIMIT. / 5 PRIMARY RIGHT-HAND WINDOW LIMIT. / 6 PRIMARY UPPER WINDOW LIMIT. / 7 PRIMARY LOWER WINDOW LIMIT. / 8 SECONDARY LEFT-HAND WINDOW LIMIT. / 9 SECONDARY RIGHT-HAND WINDOW LIMIT. / 10 SECONDARY UPPER WINDOW LIMIT. / 11 SECONDARY LOWER WINDOW LIMIT. / 12 TASK LIST CONTROL COUNT. CAN BE SET TO 1 THROUGH 16 / (MAXIMUM) TO INDICATE COUNT OF ACTIVE TASK POINTERS / STARTING IN FWRD(64). SET FWRD(12) TO ZERO TO USE ALL / NON-ZERO POINTERS IN FWRD(64) THROUGH FWRD(79) RANDOMLY. / 13 COUNT-DOWN TIMER (NEGATIVE). / 14 REWARD DURATION. / 15 REWARD COUNT. / 16 SEED VARIABLE FOR RANDOM NUMBER GENERATOR. / 17 SUCCESSFUL INTER-TRIAL INTERVAL TIME. / 18 FAILING INTER-TRIAL INTERVAL TIME. / 19 PRIMARY DELAY TIME. / 20 SECONDARY DELAY TIME. / FWRD FIRST ARGUMENT VALUE USAGE / 21 ANIMAL FIRST-CASE READING CALIBRATION COUNT (0-16). / 22 ANIMAL SECOND-CASE READING CALIBRATION COUNT (0-16). / 23 GALVO FIRST-CASE READING CALIBRATION COUNT (0-16). / 24 GALVO SECOND-CASE READING CALIBRATION COUNT (0-16). / 25 ANIMAL X-CHANNEL GAIN (DEFAULT IS 1.0000*2^22). / 26 ANIMAL X-CHANNEL OFFSET (DEFAULT IS 0.0000). / 27 ANIMAL Y-CHANNEL GAIN (DEFAULT IS 1.0000*2^22). / 28 ANIMAL Y-CHANNEL OFFSET (DEFAULT IS 0.0000). / 29 GALVO X-CHANNEL GAIN (DEFAULT IS 1.0000*2^22). / 30 GALVO X-CHANNEL OFFSET (DEFAULT IS 0.0000). / 31 GALVO Y-CHANNEL GAIN (DEFAULT IS 1.0000*2^22). / 32 GALVO Y-CHANNEL OFFSET (DEFAULT IS 0.0000). / 33 PRIMARY ACQUISITION TIME. / 34 SECONDARY ACQUISITION TIME. / 35 TARGET LIGHT TURN-ON DELAY TIME. / 36 GALVO POSITION LOAD DELAY TIME. / 37 TOTAL TRAINING (MONITORED ANIMAL POSITION) TIME. / 38 DISPLAY SCALE. / 39-63 RESERVED FOR FUTURE VARIABLES. / FWRD FIRST ARGUMENT VALUE USAGE / 64-79 ACTIVE TASK POINTERS TO TASK LISTS. LISTS SHOULD BE / CREATED SEQUENTIALLY STARTING IN FWRD(192). IF FWRD(12) / IS NON-ZERO (SEQUENTIAL MODE) THEN FWRD(12) CONTROLS THE / COUNT OF ACTIVE POINTERS (STARTING FROM FWRD(64); EXCESS / ENTRIES (THROUGH FWRD(79)) ARE IGNORED. IF FWRD(12) IS / ZERO (RANDOM MODE) THEN UNUSED ENTRIES MUST BE ZERO. / 80-127 RESERVED FOR FUTURE VARIABLES. / 128-143 ANIMAL FIRST-CASE X, Y CALIBRATION READINGS STORED HERE. / 144-159 ANIMAL SECOND-CASE X, Y CALIBRATION READINGS STORED HERE. / 160-175 GALVO FIRST-CASE X, Y CALIBRATION READINGS STORED HERE. / 176-191 GALVO SECOND-CASE X, Y CALIBRATION READINGS STORED HERE. / 192- SPACE FOR SEQUENTIAL TASK LISTS TO BE POINTED TO BY / FWRD(64) THROUGH FWRD(79). / TASK DEFINITIONS. / AS CONTROLLED BY FWRD(12), 1 OR MORE (UP TO 16) TASKS MAY BE ACTIVATED BY STORING / POINTERS TO TASK LISTS IN FWRD(64) THROUGH FWRD(79). TASKS ARE STORED AS SEQUENTIAL / LISTS OF DATA AND SHOULD OCCUPY ANY AVAILABLE SPACE STARTING AT FWRD(192). THE TASK / FORMAT IS: / FIXATION TIME, GALVO X-POSITION, GALVO Y-POSITION. THIS SEQUENCE IS REPEATED AS MANY / TIMES AS NECESSARY ALLOWING MULTIPLE GALVO JUMPS. A FINAL FIXATION TIME OF ZERO SIGNALS / THE END OF THE TASK. / THE FOLLOWING IS AN EXAMPLE OF A SINGLE TASK USAGE WITH A SINGLE JUMP: / *SET D=FWRD(12,1) ;C USE ONE (SEQUENTIAL) TASK / *SET D=FWRD(64,192) ;C FIRST (ONLY) TASK WILL BE IN FWRD(192) ONWARD / *SET D=FWRD(192,.5*200) ;C FIRST FIXATION TIME IS .5 SECONDS / *SET D=FWRD(193,0) ;C FIRST GALVO X-POSITION IS 000 / *SET D=FWRD(194,0) ;C FIRST GALVO Y-POSITION IS 000 / *SET D=FWRD(195,1.25*200) ;C SECOND FIXATION TIME IS 1.25 SECONDS / *SET D=FWRD(196,1024) ;C SECOND GALVO X-POSITION IS 1024 / *SET D=FWRD(197,-1024) ;C SECOND GALVO Y-POSITION IS -1024 / *SET D=FWRD(198,0) ;C ZERO FIXATION TIME ENDS THE LIST / GALVO COORDINATE POSITION CONSIDERATIONS. / THE GALVO IS DRIVEN THROUGH A 4096 BY 4096 COORDINATE SYSTEM CENTERED AT (0,0). VALID / COORDINATE VALUES RANGE FROM -2048 THROUGH 2047. ACTUAL GALVO POSITION IS ALSO / DETERMINED BY EXTERNAL GAIN AND OFFSET CONSIDERATIONS. THE PROGRAM MONITORS ACTUAL GALVO / POSITION BY A-D CONVERSION. THUS CONVERSION OF GALVO COORDINATES TO DEGRESS OF ARC IS / DETERMINED BY THE USER. / DUE TO A CURRENT HARDWARE LIMITATION, THE GALVO COORDINATES ARE RESTRICTED TO THE DEFINED / RANGE MODULO 512. VALID VALUES OF COORDINATES ARE: / VALUE TIMES 512 EQUIVALENT / 1536 3 / 1024 2 / 512 1 / 0 0 / -512 -1 / -1024 -2 / -1536 -3 / -2048 -4 / GAIN AND OFFSET CONSIDERATIONS. / GAIN FACTORS ARE AVAILABLE FROM 0.0000 THROUGH 1.9999 AND MUST BE EXPRESSED AS MULTIPLIED / BY (2^22). THE FOLLOWING EXAMPLE WILL ILLUSTRATE: / *SET R=2^22 ;C SET NORMAL SCALING FACTOR / *SET D=FWRD(25,1.2368*R) ;C THIS SETS THE ANIMAL X-CHANNEL GAIN TO 1.2368 / ATTEMPTS TO USE GAIN FACTORS OUTSIDE OF THE RANGE 0.0000 THROUGH +1.9999 WILL YIELD / ANOMALOUS RESULTS. THE DEFAULT VALUE FOR ALL GAIN FACTORS IS +1.0000*2^22. / OFFSET FACTORS ARE AVAILABLE FROM -512 THROUGH 511 AND ARE STATED IN THE UNITS OF THE A-D / CONVERTER WHERE THE 1024 VALUES REPRESENT THE VOLTAGES IN THE RANGE -1.024 THROUGH 1.023 / VOLTS. THE FOLLOWING EXAMPLE WILL ILLUSTRATE: / *SET A=1024/2.048 ;C SET SCALING FACTOR FOR OFFSET IN VOLTS / *SET D=FWRD(26,-0.0054*A) ;C THIS SETS ANIMAL X-OFFSET TO -0.0054 VOLTS / OFFSET FACTORS SHOULD BE HELD AS CLOSE TO 0.0000 AS POSSIBLE, AS A SIGNIFICENT OFFSET / (POSSIBLY COUPLED WITH A RELATIVELY LARGE GAIN) COULD YIELD ANOMALOUS RESULTS. OFFSET / VALUES IN THE RANGE -20 THROUGH +20 (APPROX. -40 MILLIVOLTS THROUGH +40 MILLIVOLTS) / SHOULD GENERALLY NOT BE HARMFUL. THE DEFAULT VALUE FOR ALL OFFSETS IS 0 (0.0000 VOLTS). / THE EXPERIMENTER MUST SET THE SCALING FACTOR RELATING OFFSET VOLTAGES TO DEGREES OF ARC / AS THIS IS DEPENDENT ON MANY FACTORS EXTERNAL TO THE COMPUTER HARDWARE (AND ALSO THE / CORRESPONDING GAIN FACTOR), ETC. XLIST OFF IFNDEF OFF IFNDEF ON XLIST ON / ASSEMBLY INSTRUCTIONS: / SET "PCHFLD" TO THE PROPER FIELD FOR "FGO", "FWRD" (DEFAULT IS 20). / PCHFLD= 20 /TRAINING ROUTINE, ETC. FIELD / SET "TBLFLD" TO THE PROPER FIELD FOR CORRECTION TABLES (DEFAULT IS 40). / TBLFLD= 40 /CORRECTION TABLE FIELD / SET "ANX" TO THE PROPER A-D CHANNEL FOR ANIMAL X-POSITION (DEFAULT IS 10). / ANX= 10 /ANIMAL X-POSITION CHANNEL / SET "ANY" TO THE PROPER A-D CHANNEL FOR ANIMAL Y-POSITION (DEFAULT IS 11). / ANY=11 /ANIMAL Y-POSITION CHANNEL / SET "GALVX" TO THE PROPER A-D CHANNEL FOR GALVO X-POSITION (DEFAULT IS 12). / GALVX= 12 /GALVO X-POSITION CHANNEL / SET "GALVY" TO THE PROPER A-D CHANNEL FOR GALVO Y-POSITION (DEFAULT IS 13). / GALVY= 13 /GALVO Y-POSITION CHANNEL PMODE /ENSURE DEFINITION MODE IFNDEF PCHFLD /TRAINING ROUTINE FIELD IFNDEF TBLFLD /CORRECTION TABLE FIELD FIELD PCHFLD%10 /START IN TRAINING FIELD *200 /ENSURE PROPER ORIGIN FOR DEFINITIONS / DEFINITIONS FROM FOCAL, 1969 (ORIGINAL PAPER-TAPE VERSION). BOTTOM= 0035 /FOCAL PUSHDOWN LIMIT CHAR= 0066 /FOCAL'S INPUT BUFFER EFUN3I= 0136 /FUNCTION RETURN POINTER EVAL= 1613 /EVALUATOR ENTRY POINT FLAC= 0044 /FLOATING ACCUMULATOR HERE FNTABF= 0374 /FUNCTION ADDRESS TABLE FNTABL= 2165 /HASHED FUNCTION NAME TABLE INDEV= 0064 /INPUT ROUTINE POINTER INTEGER=0053 /FLOATING TO FIXED CONVERSION POINTER OUTDEV= 0063 /OUTPUT POINTER POPA= TAD I 13 /REMOVE WORD FROM STACK POPJ= JMP I 141 /REMOVE AND RETURN FROM STACK PUSHA= JMS I 142 /PUSH WORD ONTO STACK PUSHJ= JMS I 140 /CALL WITH RETURN ON STACK P7600= 0104 /CONSTANT 7600 RETURN= JMP I EFUN3I /FUNCTION RETURN INSTRUCTION / DEFINITIONS FROM P?S/8 FOCAL OVERLAY. BEOFZAP=7505 /BINARY LOADER ZAP WORD BONCE= 3600 /OVERLAY ONCE-ONLY ADDRESS PCSAVE= 0000 /PC SAVED HERE ON INTERRUPT PINTHND=0002 /INTERRUPT HANDLER POINTER SYSIO= 7640 /SYSTEM I/O ENTRY POINT / KW12A CLOCK DEFINITIONS. CLSK= 6131 /SKIP ON CLOCK INTERRUPT CLLR= 6132 /LOAD CLOCK CONTROL REGISTER CLAB= 6133 /AC TO CLOCK BUFFER CLEN= 6134 /AC TO ENABLE REGISTER CLSA= 6135 /OR STATUS INTO AC, CLEAR STATUS PER AC BITS CLBA= 6136 /CLOCK BUFFER TO AC CLCA= 6137 /CLOCK COUNTER TO CLOCK BUFFER, /CLOCK BUFFER TO AC / A-D CHANNEL DEFINITIONS. ANX= 10 /ANIMAL X POSITION CHANNEL ANY= 11 /ANIMAL Y POSITION CHANNEL GALVX= 17/12 /GALVO X POSITION CHANNEL GALVY= 13 /GALVO Y POSITION CHANNEL / SXL DEFINITIONS. GET1= 12 /GET READING NUMBER ONE INPUT GET2= 13 /GET READING NUMBER TWO INPUT GIVE= 10 /GIVE (PHONY) REWARD INPUT GORA= 11 /GALVO/ANIMAL INPUT / EXTENDED ARITHMETIC DEFINITIONS. XLIST OFF IFNDEF DAD IFNDEF DCM IFNDEF DLD IFNDEF DST IFNDEF DVI XLIST ON CAM= CLA MQL /CLEAR AC, MQ DAD= JMS I [DADD] /DOUBLE-PRECISION ADD DCM= JMS I [DCOM] /DOUBLE-PRECISION COMPLEMENT DLD= JMS I [DLOAD] /DOUBLE-PRECISION LOAD DST= JMS I [DSTORE] /DOUBLE-PRECISION STORE MQA= 7501 /OR MQ INTO AC MQL= 7421 /LOAD AC INTO MQ, CLEAR MQ MUY= 7405 /MULTIPLY SWP= MQA MQL /SWAP AC, MQ / MISCELLANEOUS DEFINITIONS. BNCCNT= 310 /DE-BOUNCING DELAY COUNT VALUE JMPC= JMP . /CURRENT PAGE JUMP INSTRUCTION NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL0003= CLA CLL CML IAC RAL /LOAD AC WITH 0003 NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 NODUMP= 4000 /DON'T DUMP PAGE ZERO LITERALS VALUE NSTART= 4105 /PATCH ASSEMBLY ADDRESS FIELD 0!NODUMP /ENSURE FIELD ZERO *FNTABL+14 /PUT IN HASHED NAMES "G^2+"O /GO "W^2+"R^2+"D /WRD "I^2+"O /IO *NSTART /START PATCH HERE FOR DIRECT LOADING / MEMORY REFERENCE FUNCTION: FWRD(ADDRESS[,NEWVALUE]). XWRD, JMS I INTEGER /GET ADDRESS ARGUMENT CLL RAL /ADJUST TO DOUBLE-WORD ADDRESS TAD (VARS) /ADD ON TABLE BASE PUSHA /SAVE IT PUSHJ /EVALUATE SECOND IF ANY LARG, ARG /**** RELOCATE **** JMP GETIT /NONE, JUST GET VALUE POPA /RESTORE ADDRESS DCA WRDTMP /SAVE AS POINTER JMS I INTEGER /GET REPLACEMENT VALUE CDF PCHFLD /GOTO BUFFER FIELD DCA I WRDTMP /STORE LOW-ORDER TAD WRDTMP /GET THE POINTER IAC /BUMP TO NEXT DCA WRDTM2 /STASH THE POINTER TO HIGH-ORDER TAD FLAC+1 /GET HIGH-ORDER VALUE DCA I WRDTM2 /STORE IT JMP GETIT2 /FINISH IT THERE GETIT, POPA /GET BACK ADDRESS DCA WRDTMP /SAVE IT GETIT2, CDF PCHFLD /GOTO BUFFER FIELD TAD I WRDTMP /GET LOW-ORDER DCA FLAC+2 /STASH IT ISZ WRDTMP /BUMP TO HIGH-ORDER TAD I WRDTMP /GET HIGH-ORDER FINFINI,DCA FLAC+1 /STASH IT TAD (27) /GET NEW EXPONENT DCA FLAC /STASH IT CDF 00 /ENSURE FIELD ZERO RETURN /RETURN TO FOCAL / CHARACTER I/O FUNCTION: FIO(ARGUMENT) XIO, JMS I INTEGER /GET THE ARGUMENT SMA CLA /SKIP IF INPUT REQUESTED JMP XOUT /JUMP IF OUTPUT REQUESTED JMS I INDEV /GET A CHARACTER AND (177) /JUST SEVEN-BIT ASCII DCA FLAC+2 /STORE IN LOW-ORDER JMP FINFINISH /FINISH IT THERE XOUT, TAD FLAC+2 /GET LOW-ORDER BACK JMS I OUTDEV /OUTPUT IT JMP FINFINISH /FINISH IT THERE / TRAINING ROUTINE FUNCTION: FGO(INITIALIZE-INDICATOR) XGO, JMS I INTEGER /GET THE INDICATOR ARGUMENT IOF /PREVENT PROBLEMS! CIF CDF PCHFLD /GOTO PATCH FIELD JMP I (TRINIT) /CONTINUE THERE / ARGUMENT EVALUATOR. ARG, TAD CHAR /ARGUMENT EVALUATOR TAD (-",) /GOOD TERMINATOR? SZA CLA /SKIP IF SO POPJ /RETURN IF NOT PUSHJ; EVAL-1 /EVALUATE SECOND ARGUMENT IAC /INDICATE SKIP RETURN POPJ /RETURN WRDTMP, .-. /TEMPORARY WRDTM2, .-. /TEMPORARY PAGE NEND= . /END OF RELOCATABLE PATCH CODE / ONCE-ONLY CODE STARTS HERE. *BONCE /OVER DEFAULT ONCE-ONLY AREA PBASE, TAD BOTTOM /\ TAD (-200+1) / \ESTABLISH AND P7600/[7600] / /BASE ADDRESS DCA PBASE // TAD PBASE /\ TAD (NSTART&177-1) / >ESTABLISH NEW LIMIT DCA BOTTOM // TAD PBASE /\ TAD (XGO&177) / >INSERT FGO DCA I (FNTABF+14) // TAD PBASE /\ TAD (XWRD&177) / >INSERT FWRD DCA I (FNTABF+15) // TAD PBASE /\ TAD (XIO&177) / >INSERT FIO DCA I (FNTABF+16) // TAD PBASE /\ TAD (ARG&177) / >FIXUP ADDRESS CONSTANT DCA I (LARG) // TAD BOTTOM /\ IAC / >SETUP MOVE BASE DCA PBASE // TAD I LNSTART /\ DCA I PBASE / \ ISZ LNSTART / \MOVE DOWN PATCH TO ISZ PBASE / /WHERE IT BELONGS ISZ MOVCNT / / JMP .-5 // CDF PCHFLD /GOTO TRAINING CODE FIELD TAD PINTHND /GET INTERRUPT POINTER DCA I (INTRETURN) /STORE IN OUR INTERRUPT HANDLER CDF 00 /BACK TO FIELD ZERO TAD (CIF CDF PCHFLD) /GET FIELD CHANGE INSTRUCTION DCA PCSAVE+1 /ZAP FOCAL'S INTERRUPT HANDLER TAD (EXTINT&177+JMPC) /GET JUMP INSTRUCTION DCA PINTHND /MAKE FOCAL COME TO US CLEN /CLEAR CLOCK INTERRUPT ENABLE DCA I (BEOFZAP) /REPAIR LOADER JMP I (BEOFZAP) /RESUME LOADING LNSTART,NSTART /POINTER TO NSTART MOVCNT, NSTART-NEND /CODE MOVE COUNTER PAGE FIELD PCHFLD%10!NODUMP/DEFINE LOADING FIELD *0 /START AT THE BEGINNING EXTINT, JMP I [INTER] /GO HANDLER INTERRUPTS DALPHA, .-. /DISPLAY ALPHA REGISTER FOO, .-. /TEMPORARY INTRETU,.-. /WILL BE INTERRUPT ROUTINE POINTER RANAC, .-. /RANDOM NUMBER AC RANCNT, .-. /RANDOM NUMBER COUNTER RANMQ, .-. /RANDOM NUMBER MQ WCHDOG, .-. /WATCH-DOG SWITCH *10 /GET TO AUTO-INDEX AREA TASKXR, .-. /LATEST TASK POINTER DSPCNT, .-. /DISPLAY COUNTER *20 /GET PAST AUTO-INDEX AREA AC, .-. /SAVED AC ON INTERRUPT ACQCNT, .-. /ACQUISITION TIME COUNTER ANGAOFF,.-. /ANIMAL/GALVO OFFSET FOR CALIBRATION BOUNCE, .-. /DEBOUNCING TEMPORARY CALCSW, .-. /TASK CALCULATION REQUEST SWITCH CNTBASE,.-. /CALIBRATION STORAGE POINTER CNTPTR, .-. /CALIBRATION COUNTER POINTER DELCNT, .-. /DELAY-TIME COUNTER FIXCNT, ZBLOCK 2 /FIXATION TIME COUNTER FIXTIME,ZBLOCK 2 /LATEST FIXATION TIME FTPTR, .-. /FIXATION TASK LIST POINTER GALVOX, .-. /LATEST GALVO X-POSITION GALVOY, .-. /LATEST GALVO Y-POSITION GCNT, .-. /GALVO MOVE DELAY COUNTER ITCNTR, .-. /INTER-TRIAL COUNTER IWFLAG, .-. /IN-WINDOW FLAG IWFLG2, .-. /IN-WINDOW EDGE FLAG LCNT, .-. /LIGHT DELAY COUNTER LIMBO, .-. /IN LIMBO FLAG LINK, .-. /SAVED LINK ON INTERRUPT PA, .-. /POINTER TO ACQUISITION TIME PRISEC, .-. /PRIMARY/SECONDARY WINDOW INDICATOR RCNTR1, .-. /RELAY D-A COUNTER RCNTR2, .-. /RELAY D-A COUNTER RELAY, .-. /IMAGE OF RELAYS REWPLS, .-. /REWARD PULSE TIMER XGPOS, .-. /UNSIGNED X GALVO POSITION XPOS, .-. /UNSIGNED X POSITION XVAL, .-. /CALIBRATION X VALUE YGPOS, .-. /UNSIGNED Y GALVO POSITION YPOS, .-. /UNSIGNED Y POSITION YVAL, .-. /CALIBRATION Y VALUE / SMOOTHED X DATA. X0, .-. /LATEST X VALUE X1, .-. /PREVIOUS X VALUE X2, .-. /PREVIOUS X VALUE X3, .-. /PREVIOUS X VALUE / SMOOTHED Y DATA. Y0, .-. /LATEST Y VALUE Y1, .-. /PREVIOUS Y VALUE Y2, .-. /PREVIOUS Y VALUE Y3, .-. /PREVIOUS Y VALUE / SMOOTHED X GALVO DATA. XG0, .-. /LATEST X GALVO VALUE XG1, .-. /PREVIOUS X GALVO VALUE XG2, .-. /PREVIOUS X GALVO VALUE XG3, .-. /PREVIOUS X GALVO VALUE / SMOOTHED Y GALVO DATA. YG0, .-. /LATEST Y GALVO VALUE YG1, .-. /PREVIOUS Y GALVO VALUE YG2, .-. /PREVIOUS Y GALVO VALUE YG3, .-. /PEVIOUS Y GALVO VALUE / DISPLAY TEMPORARIES. DX, .-. /X POSITION FOR SOME CALLERS DY, .-. /Y POSITION FOR SOME CALLERS / WINDOW POINTERS. DPTR, .-. /POINTER TO LOWER PARAMETER LPTR, .-. /POINTER TO LEFT-HAND PARAMETER RPTR, .-. /POINTER TO RIGHT-HAND PARAMETER UPTR, .-. /POINTER TO UPPER PARAMETER / WINDOW LIMIT TEMPORARIES. DLIMIT, .-. /LOWER LIMIT LLIMIT, .-. /LEFT-HAND LIMIT RLIMIT, .-. /RIGHT-HAND LIMIT ULIMIT, .-. /UPPER LIMIT / POSITION TEMPORARIES (OBSOLETE). /XP, ZBLOCK 2 /CURRENT ANIMAL X POSITION (SIGNED) /YP, ZBLOCK 2 /CURRENT ANIMAL Y POSITION (SIGNED) /XGP, ZBLOCK 2 /CURRENT GALVO X POSITION (SIGNED) /YGP, ZBLOCK 2 /CURRENT GALVO Y POSITION (SIGNED) PAGE / COMES HERE WITH ARGUMENT IN AC FROM FGO (WITH INTERRUPTS OFF). TRINIT, SNA CLA /SKIP IF VARIABLES SHOULD BE PRESERVED JMS I (CLRVARIABLES) /CLEAR OUT VARIABLES JMS I (CLRCALIBRATE) /CLEAR CALIBRATE VARIABLES JMS I (SETGAIN) /SETUP GAIN-ORIENTED STUFF JMS I (PRISETUP) /SETUP PRIMARY WINDOW LIMITS JMS I (DSCSETUP) /SETUP THE DISPLAY SCALE DCA REWPLS /NOT CURRENTLY REWARDING TAD (TSKPTRS) /POINT TO THE DCA FTPTR /FIXATION TASKS LIST CLEN /CLEAR CLOCK INTERRUPTS NOW CLSA /GET CLOCK STATUS (TO CLEAR IT) NL0001 /INDICATE NEW DCA CALCSW /TASK NEEDED DCA IWFLAG /NOT CURRENTLY IN WINDOW DCA IWFLG2 /NOT AT EDGE OF WINDOW NL0001 /INDICATE WINDOW STATUS DCA LIMBO /CANNOT CHANGE NOW LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT ATR /CLEAR THE RELAYS PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELAY /STORE IMAGE OF RELAYS ALSO TAD I (ITBTIME) /GET FAILING INTER-TRIAL TIME CIA /WANT NEGATIVE FORM DCA ITCNTR /SETUP INTER-TRIAL COUNTER NL0001 /SET THE DCA WCHDOG /WATCH-DOG SWITCH DCA GALVOX /CLEAR GALVO X-POSITION DCA GALVOY /CLEAR GALVO Y-POSITION JMS I [LOADGALVO] /CENTER THE GALVO JMS I (CLKINIT) /SETUP THE KW-12 CLOCK TAD (SKP) /SETUP OUR DCA I (INTZAP) /CLOCK HANDLER ION /HERE WE GO! NULJOB, LAS /GET THE SWITCHES DCA FOO /STASH THEM TAD I FOO /GET THE CORRESPONDING CONTENTS MQL /DISPLAY THEM TAD WCHDOG /GET WATCH-DOG SWITCH SNA CLA /SKIP IF STILL SET JMP ENDIT /JUMP IF NO LONGER SET CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 0 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SZA CLA /SKIP IF SWITCH IS NOW OFF JMP TEST1 /ELSE JUST KEEP GOING ENDIT, TAD [NOP] /DISABLE OUR DCA I (INTZAP) /CLOCK HANDLER CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT ATR /CLEAR THE RELAYS NOW PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT IOF /PREVENT INTERRUPTS CLKWAIT,CLSK /CLOCK FLAG UP? JMP .-1 /NO, WAIT FOR IT CLSA /GET STATUS NOW SMA CLA /SKIP IF OVERFLOW JMP CLKWAIT /ELSE GO BACK AGAIN CLEN /CLEAR CLOCK ENABLE ION /INTERRUPTS ALLOWED AGAIN CIF CDF 00 /GOING TO FIELD ZERO JMP I (FINFINISH) /FINISH UP THERE TEST1, CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS 1 /SKIP IF SWITCH THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SNA /SKIP IF SWITCH NOT THROWN TAD BOUNCE /ELSE CHECK IF CURRENTLY DEBOUNCING SZA CLA /SKIP IF SWITCH THROWN AND NOT CURRENTLY DEBOUNCING JMP I (TEST2) /KEEP GOING IF SWITCH NOT THROWN OR DEBOUNCING LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SXL I GORA /SKIP IF SET (ANIMAL POSITION) ADD (LOFF2-LOFF1) /GET GALVO OFFSET STC ANGAOFFSET /STORE EITHER WAY SXL GET1 /SKIP IF NOT TAKING FIRST-CASE READINGS COM /INDICATE TAKING FIRST-CASE READINGS PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SNA CLA /SKIP IF TAKING FIRST-CASE READINGS JMP TRY2 /JUMP IF NOT / WE NEED TO LET THE INTERRUPTS HAPPEN AGAIN! JMP .+1 /LET THE INTERRUPTS RESUME TAD ANGAOFFSET /GET ANIMAL/GALVO OFFSET SZA CLA /SKIP IF ANIMAL TAD (GXY1CN-AXY1CN) /ELSE USE GALVO OFFSET TAD (AXY1CNT) /ADD ON COUNTER BASE ADDRESS DCA CNTPTR /STASH THE POINTER TAD ANGAOFFSET /GET ANIMAL/GALVO OFFSET AGAIN TAD (CAXY1) /ADD ON STORAGE BASE ADDRESS / DCA CNTBASE /STASH THE POINTER JMP CCOMMON /CONTINUE THERE / COMES HERE TO TEST FOR SECOND TYPE CALIBRATION. TRY2, CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SXL GET2 /SKIP IF NOT TAKING SECOND-CASE READINGS COM /INDICATE TAKING SECOND-CASE READINGS PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SNA CLA /SKIP IF TAKING SECOND-CASE READINGS JMP I (TEST2) /JUMP IF NOT TAD ANGAOFFSET /GET ANIMAL/GALVO OFFSET SZA CLA /SKIP IF ANIMAL TAD (GXY2CN-AXY2CN) /ELSE USE GALVO OFFSET TAD (AXY2CNT) /ADD ON COUNTER BASE ADDRESS DCA CNTPTR /STASH THE POINTER TAD ANGAOFFSET /GET THE ANIMAL/GALVO OFFSET AGAIN TAD (CAXY2) /ADD ON STORAGE BASE ADDRESS CCOMMON,DCA CNTBASE /STASH THE POINTER JMP I (SNS1MORE) /CONTINUE THERE PAGE SNS1MOR,TAD ANGAOFFSET /GET ANIMAL/GALVO OFFSET AGAIN SZA CLA /SKIP IF ANIMAL JMP USEGALVO /JUMP IF GALVO TAD XPOS /GET UNSIGNED X POSITION DCA XVAL /STASH IT TAD YPOS /GET UNSIGNED Y POSITION / DCA YVAL /STASH IT JMP SCOMMON /CONTINUE THERE USEGALV,TAD XGPOS /GET UNSIGNED GALVO X POSITION DCA XVAL /STASH IT TAD YGPOS /GET UNSIGNED GALVO Y POSITION SCOMMON,DCA YVAL /STASH IT TAD I CNTPTR /GET CURRENT COUNT TAD [-10] /COMPARE TO UPPER LIMIT SMA CLA /SKIP IF NOT TOO MANY JMP TEST2 /ELSE FORGET IT / CALCULATE STORAGE POINTER FOR X AND Y VALUES. TAD I CNTPTR /GET CURRENT COUNT CLL RTL /*4 TAD CNTBASE /ADD ON TABLE BASE DCA CNTBASE /STASH THE POINTER TAD XVAL /GET X VALUE TAD [7000] /MAKE IT SIGNED DCA I CNTBASE /STASH LOW-ORDER TAD I CNTBASE /GET IT BACK ISZ CNTBASE /BUMP TO HIGH-ORDER SPA CLA /SKIP IF POSITIVE NL7777 /ELSE MAKE IT NEGATIVE DCA I CNTBASE /STORE HIGH-ORDER ISZ CNTBASE /BUMP TO NEXT TAD YVAL /GET Y VALUE TAD [7000] /MAKE IT SIGNED DCA I CNTBASE /STASH LOW-ORDER TAD I CNTBASE /GET IT BACK ISZ CNTBASE /BUMP TO HIGH-ORDER SPA CLA /SKIP IF POSITIVE NL7777 /ELSE MAKE IT POSITIVE DCA I CNTBASE /STORE HIGH-ORDER TAD (-BNCCNT) /SETUP THE DCA BOUNCE /DE-BOUNCER ISZ I CNTPTR /BUMP STORAGE COUNT / COMES HERE TO TEST FOR DISPLAY OPTIONS. TEST2, CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 2 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SZA CLA /SKIP IF SWITCH NOT THROWN JMS I (DISPWINDOW) /DISPLAY WINDOW BORDER IF SWITCH THROWN TEST3, CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 3 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SNA CLA /SKIP IF SWITCH IS NOW ON JMP TEST4 /JUMP IF SWITCH NOT ON TAD RELAY /GET RELAY IMAGE AND [40] /JUST RELAY[0] BIT SNA CLA /SKIP IF LIGHT IS ON JMP TEST4 /ELSE FORGET IT TAD XGPOS /GET X GALVO POSITION TAD [7000] /MAKE IT SIGNED DCA DX /STASH IT TAD YGPOS /GET Y GALVO POSITION TAD [7000] /MAKE IT SIGNED DCA DY /STASH IT TAD [-13] /SETUP THE DCA DSPCNT /DISPLAY COUNT JMS I [DISPLAY] /CALL DISPLAY ROUTINE ISZ DSPCNT /DONE ENOUGH? JMP .-2 /NO, GO BACK TEST4, CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 4 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SNA CLA /SKIP IF SWITCH IS ON JMP TESTMORE /JUMP IF SWITCH IS OFF CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 5 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT SZA CLA /SKIP IF SWITCH IS OFF (ABSOLUTE MODE) JMP DANRELATIVE /JUMP IF SWITCH IS ON (RELATIVE MODE) TAD XPOS /GET X ANIMAL POSITION TAD [7000] /MAKE IT SIGNED DCA DX /STASH IT TAD YPOS /GET Y ANIMAL POSITION TAD [7000] /MAKE IT SIGNED DCA DY /STASH IT TAD [-13] /SETUP THE DCA DSPCNT /DISPLAY COUNT JMS I [DISPLAY] /CALL DISPLAY ROUTINE ISZ DSPCNT /DONE ENOUGH? JMP .-2 /NO, GO BACK SKP /DON'T DISPLAY RELATIVE POSITION DANRELA,JMS I (DISPRELATIVE) /DISPLAY ANIMAL POSITION RELATIVE TO GALVO TESTMOR,TAD CALCSW /IS A TASK CALCULATION NEEDED? SZA CLA /SKIP IF NOT JMS I (CALTASK) /GO CALCULATE NEXT TASK JMP I (NULJOB) /KEEP GOING PAGE / BACKGROUND SUBROUTINES. USAGE OF MQ IS PROHIBITED HERE! CALTASK,.-. /CALCULATE NEXT TASK ROUTINE TAD I (TSKNUMBER) /GET TASK COUNT SZA CLA /SKIP IF RANDOM MODE SELECTED JMP SEQNEXT /JUMP IF SEQUENTIAL MODE CHOSEN GETRAND,NL0003 /SET INCREMENTAL VALUE DCA RANMQ /LOAD INITIAL INCREMENT TAD (-5) /SETUP THE DCA RANCNT /MULTIPLICATION COUNT RANLUP, CLL /CLEAR LINK NOW DCA RANAC /SAVE HIGH-ORDER TAD RANMQ /GET LOW-ORDER TAD I (SEEDNUMBER) /ADD ON LOW-ORDER SEED DCA RANMQ /STORE BACK TAD RANAC /GET HIGH-ORDER SZL /CARRY? IAC /YES TAD I (SEEDNUMBER+1) /ADD ON HIGH-ORDER SEED ISZ RANCNT /DONE ENOUGH? JMP RANLUP /NO, KEEP GOING DCA I (SEEDNUMBER+1) /YES, STORE NEW HIGH-ORDER FOR NEXT TIME TAD RANMQ /GET LOW-ORDER DCA I (SEEDNUMBER) /STORE NEW LOW-ORDER FOR NEXT TIME TAD RANMQ /GET LOW-ORDER AGAIN AND (17^2) /JUST MASK BITS SEQRESE,TAD (TSKPTRS) /POINT TO LIST MEMBER DCA FTPTR /STASH THE POINTER TAD I FTPTR /GET THE POINTER SNA /SKIP IF ACTIVE JMP GETRANDOM /ELSE GO FIND ANOTHER ONE SEQENTR,CLL RAL /*2 TAD (VARS-1) /POINT TO PROPER VARIABLE DCA TASKXR /STASH THE POINTER TAD I TASKXR /GET LOW-ORDER DCA FIXTIME /STASH IT TAD I TASKXR /GET HIGH-ORDER DCA FIXTIME+1 /STASH IT TAD I TASKXR /GET GALVO X-POSITION DCA GALVOX /STASH IT ISZ TASKXR /BUMP PAST HIGH-ORDER TAD I TASKXR /GET GALVO Y-POSITION DCA GALVOY /STASH IT ISZ TASKXR /BUMP PAST HIGH-ORDER DCA CALCSW /CLEAR TASK CALCULATION SWITCH JMP I CALTASK /RETURN / COMES HERE IF USING LIST SEQUENTIALLY. SEQNEXT,TAD I FTPTR /GET LASTEST POINTER VALUE DCA RANCNT /SAVE IT FOR NOW ISZ FTPTR /BUMP TO ISZ FTPTR /NEXT ENTRY TAD I (TSKNUMBER) /GET TASK COUNT CLL RAL /*2 FOR PAIRS TAD (TSKPTRS) /POINT PAST ACTIVE LIST CIA /INVERT FOR TESTING TAD FTPTR /COMPARE TO UPDATED POINTER SMA CLA /SKIP IF STILL WITHIN LIST JMP SEQRESET /JUMP IF AT END OF LIST TAD RANCNT /GET LATEST POINTER VALUE BACK JMP SEQENTRY /CONTINUE THERE DISPLAY,.-. /DISPLAY ROUTINE CLA /CLEAN UP TAD DX /GET X VALUE DSZAP1, NOP /OR CLL RAR TAD (400) /COMPENSATE FOR SIGN DCA DALPHA /STASH X POSITION TAD DY /GET Y VALUE DSZAP2, NOP /OR CLL RAR CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT DIS DALPHA&1777 /DISPLAY THE POINT PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ALSO CLA /CLEAN UP JMP I DISPLAY /RETURN / DISPLAY ANIMAL POSITION RELATIVE TO GALVO ROUTINE. DISPRE,.-. /DISPLAY RELATIVE POSITION ROUTINE TAD XGPOS /GET GALVO X POSITION CIA /INVERT IT TAD XPOS /ADD ON ANIMAL X POSITION DCA DX /SAVE AS RELATIVE X VALUE TAD DX /GET IT BACK TAD [1000] /BIAS IT UP AND [6000] /JUST RANGE BITS SNA /SKIP IF PROBLEMATIC JMP DXOK /JUMP IF NOT SPA CLA /SKIP IF TOO HIGH TAD [7000-777] /ELSE USE NEGATIVE VALUE TAD [777] /GET POSITIVE VALUE DCA DX /STORE NEW X VALUE DXOK, TAD YGPOS /GET GALVO Y POSITION CIA /INVERT IT TAD YPOS /ADD ON ANIMAL Y POSITION DCA DY /SAVE AS RELATIVE Y VALUE TAD DY /GET IT BACK TAD [1000] /BIAS IT UP AND [6000] /JUST RANGE BITS SNA /SKIP IF PROBLEMATIC JMP DYOK /JUMP IF NOT SPA CLA /SKIP IF TOO HIGH TAD [7000-777] /ELSE USE NEGATIVE VALUE TAD [777] /GET POSITIVE VALUE DCA DY /STORE NEW Y VALUE DYOK, TAD [-13] /SETUP THE DCA DSPCNT /DISPLAY COUNT JMS I [DISPLAY] /CALL DISPLAY ROUTINE ISZ DSPCNT /DONE ENOUGH? JMP .-2 /NO, GO BACK JMP I DISPRELATIVE /RETURN PAGE DISPWIN,.-. /DISPLAY WINDOW BORDER ROUTINE CIF PCHFLD /PREVENT LINC INTERRUPTS LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SNS I 5 /SKIP IF SWITCH NOT THROWN COM /ELSE COMPLEMENT AC PDP /BACK TO GOODY MODE EITHER WAY PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELINDICATOR /SAVE ABSOLUTE/RELATIVE INDICATOR TAD PRISEC /GET PRIMARY/SECONDARY INDICATOR DCA DPS /STASH IT TAD [PUP] /GET UPPER POINTER TAD DPS /ADD OFFSET DCA DUPTR /STASH THE POINTER TAD [PLEFT] /GET LEFT-HAND POINTER TAD DPS /ADD OFFSET DCA DLPTR /STASH THE POINTER TAD [PDOWN] /GET LOWER POINTER TAD DPS /ADD OFFSET DCA DDPTR /STASH THE POINTER TAD [PRIGHT] /GET RIGHT-HAND POINTER TAD DPS /ADD OFFSET DCA DRPTR /STASH THE POINTER TAD I DUPTR /GET UPPER LIMIT JMS DHLINE /DRAW UPPER HORIZONTAL LINE TAD I DDPTR /GET LOWER LIMIT JMS DHLINE /DRAW LOWER HORIZONTAL LINE TAD I DLPTR /GET LEFT-HAND LIMIT JMS DVLINE /DRAW LEFT-HAND VERTICAL LINE TAD I DRPTR /GET RIGHT-HAND LIMIT JMS DVLINE /DRAW RIGHT-HAND VERTICAL LINE JMP I DISPWINDOW /RETURN DHLINE, .-. /DRAW HORIZONTAL LINE ROUTINE DCA DY /STORE PASSED VERTICAL VALUE TAD RELINDICATOR /GET ABSOLUTE/RELATIVE INDICATOR SZA CLA /SKIP IF ABSOLUTE MODE REQUESTED JMP DHRELATIVE /JUMP IF RELATIVE MODE REQUESTED TAD YGPOS /GET GALVO Y POSITION TAD [7000] /MAKE IT SIGNED TAD DY /ADD ON WINDOW INCREMENT DCA DY /STORE ABSOLUTE POSITION TAD XGPOS /GET GALVO X POSITION TAD [7000] /MAKE IT SIGNED DHRELAT,DCA DXOFFSET /STORE HORIZONTAL OFFSET TAD I DLPTR /GET LEFT-HAND STARTING POINT FOR HORIZONTAL LINE DCA DXWORK /STASH IT TAD [-17] /SETUP THE DCA DXCNT /CORNER COUNTER SKP /DON'T BUMP YET DXWBMP, ISZ DXWORK /BUMP TO NEXT POSITION CLA /CLEAN UP DHLOOP, TAD DXWORK /GET LATEST POSITION TAD DXOFFSET /ADD ON OFFSET DCA DX /STORE IN X PARAMETER JMS I [DISPLAY] /DISPLAY A POINT TAD DXWORK /GET THE POINTER CIA /INVERT FOR TESTING TAD I DRPTR /COMPARE TO RIGHT-HAND LIMIT SNA /SKIP IF NOT THERE YET JMP I DHLINE /RETURN IF DONE ISZ DXCNT /DONE WITH ALL CORNER POINTS? JMP DXWBMP /NO, KEEP GOING AND [7760] /ARE WE NEAR THE RIGHT-HAND CORNER? SNA CLA /SKIP IF NOT JMP DXWBMP /JUMP IF SO TAD [10] /SET INCREMENT TAD DXWORK /UPDATE DCA DXWORK /STORE BACK NL7777 /CAUSE CHECKING DCA DXCNT /NEXT TIME JMP DHLOOP /KEEP GOING DVLINE, .-. /DRAW VERTICAL LINE ROUTINE DCA DX /STORE PASSED HORIZONTAL VALUE TAD RELINDICATOR /GET ABSOLUTE/RELATIVE INDICATOR SZA CLA /SKIP IF ABSOLUTE MODE REQUESTED JMP DVRELATIVE /JUMP IF RELATIVE MODE REQUESTED TAD XGPOS /GET GALVO X POSITION TAD [7000] /MAKE IT SIGNED TAD DX /ADD ON WINDOW INCREMENT DCA DX /STORE ABSOLUTE POSITION TAD YGPOS /GET GALVO Y POSITION TAD [7000] /MAKE IT SIGNED DVRELAT,DCA DYOFFSET /STORE VERTICAL OFFSET TAD I DDPTR /GET LOWER STARTING POINT FOR VERTICAL LINE DCA DYWORK /STASH IT TAD [-17] /SETUP THE DCA DYCNT /CORNER COUNTER SKP /DON'T BUMP YET DYWBMP, ISZ DYWORK /BUMP TO NEXT POSITION CLA /CLEAN UP DVLOOP, TAD DYWORK /GET LATEST POSITION TAD DYOFFSET /ADD ON OFFSET DCA DY /STORE IN Y PARAMETER JMS I [DISPLAY] /DISPLAY A POINT TAD DYWORK /GET THE POINTER CIA /INVERT FOR TESTING TAD I DUPTR /COMPARE TO LOWER LIMIT SNA /SKIP IF NOT THERE YET JMP I DVLINE /RETURN IF DONE ISZ DYCNT /DONE WITH ALL CORNER POINTS? JMP DYWBMP /NO, KEEP GOING AND [7760] /ARE WE NEAR THE RIGHT-HAND CORNER? SNA CLA /SKIP IF NOT JMP DYWBMP /JUMP IF SO TAD [10] /SET INCREMENT TAD DYWORK /UPDATE DCA DYWORK /STORE BACK NL7777 /CAUSE CHECKING DCA DYCNT /NEXT TIME JMP DVLOOP /KEEP GOING DDPTR, .-. /DISPLAY LOWER POINTER DLPTR, .-. /DISPLAY LEFT-HAND POINTER DPS, .-. /DISPLAY PRIMARY/SECONDARY INDICATOR DRPTR, .-. /DISPLAY RIGHT-HAND POINTER DUPTR, .-. /DISPLAY UPPER POINTER DXCNT, /DISPLAY X COUNTER DYCNT, .-. /DISPLAY Y COUNTER DXOFFSE, /DISPLAY X OFFSET DYOFFSE,.-. /DISPLAY Y OFFSET DXWORK, /DISPLAY X WORKING POINTER DYWORK, .-. /DISPLAY Y WORKING POINTER RELINDI,.-. /ABSOLUTE/RELATIVE DISPLAY INDICATOR PAGE / INTERRUPTS COME HERE. INTER, CLSK /CLOCK INTERRUPT? JMP I (FOCINT) /NO, NOT ONE OF OURS DCA AC /SAVE INTERRUPT AC RAL /GET THE LINK DCA LINK /SAVE IT CLSA /YES, GET STATUS SMA CLA /SKIP IF CLOCK OVERFLOWED HLT /**** ERROR **** INTZAP, NOP/SKP /SKIP IF CLOCK HANDLING ALLOWED JMP I (INTXIT) /JUMP IF NO CLOCK TICKS ALLOWED ISZ I (TIMLO) /COUNT THIS TICK SKP /SKIP IF IT DIDN'T OVERFLOW ISZ I (TIMHI) /ELSE COUNT MAJOR TICK TAD LIMBO /GET "IN LIMBO" FLAG SZA CLA /SKIP IF NORMAL JMP NOTCNT /JUMP IF NOT ISZ I (TTIME) /COUNT THIS TICK SKP /SKIP IF IT DIDN'T OVERFLOW ISZ I (TTIME+1) /ELSE COUNT MAJOR TICK NOTCNT, ISZ I (WATCHLO) /LOWER WATCH-DOG OVERFLOW? JMP DMOVE /JUMP IF NOT ISZ I (WATCHHI) /HIGHER WATCH-DOG OVERFLOW? SKP /SKIP IF NOT DCA WCHDOG /TELL BACKGROUND ABOUT IT IF SO / MOVE DOWN THE SMOOTHED DATA ONE NOTCH IN PREPARATION FOR THE LATEST SET. DMOVE, TAD X2 /\ DCA X3 / \ TAD X1 / \MOVE DOWN THE ANIMAL DCA X2 / /X POSITION DATA TAD X0 / / DCA X1 // TAD Y2 /\ DCA Y3 / \ TAD Y1 / \MOVE DOWN THE ANIMAL DCA Y2 / /Y POSITION DATA TAD Y0 / / DCA Y1 // TAD XG2 /\ DCA XG3 / \ TAD XG1 / \MOVE DOWN THE GALVO DCA XG2 / /X POSITION DATA TAD XG0 / / DCA XG1 // TAD YG2 /\ DCA YG3 / \ TAD YG1 / \MOVE DOWN THE GALVO DCA YG2 / /Y POSITION DATA TAD YG0 / / DCA YG1 // / NOW GET THE LATEST DATA VALUES. LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SAM ANX /GET ANIMAL X POSITION DATA STC X0 /STASH IT SAM ANY /GET ANIMAL Y POSITION DATA STC Y0 /STASH IT SAM GALVX /GET GALVO X POSITION DATA STC XG0 /STASH IT SAM GALVY /GET GALVO Y POSITION DATA STC YG0 /STASH IT PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT / FORM THE (UNSIGNED) ANIMAL X POSITION. NL4000 /SET INVERSION VALUE (7000^4) TAD X0 /\ TAD X1 / \SUM THE ANIMAL TAD X2 / /X POSITION VALUES TAD X3 // CLL RAR;CLL RAR /%4 DCA XPOS /STORE ANIMAL X POSITION TAD XPOS /GET ANIMAL X POSITION MQL /TO LOW-ORDER MUY; XF, .-. /MULTIPLY BY SCALE FACTOR (OR FRACTION) XFZAP, TAD XPOS /**** GAIN < 1 **** NOP TAD I (XOFF) /ADD ON ANIMAL X OFFSET DCA XPOS /STORE ANIMAL X POSITION / TAD XPOS /GET IT BACK / TAD [7000] /MAKE IT SIGNED / DCA XP /STORE IN POSITION VARIABLE / TAD XP /GET IT BACK / SPA CLA /SKIP IF POSITIVE / NL7777 /ELSE MAKE IT NEGATIVE / DCA XP+1 /STORE SIGN EXTENSION / FORM THE (UNSIGNED) ANIMAL Y POSITION. NL4000 /SET INVERSION VALUE (7000^4) TAD Y0 /\ TAD Y1 / \SUM THE ANIMAL TAD Y2 / /Y POSITION VALUES TAD Y3 // CLL RAR;CLL RAR /%4 DCA YPOS /STORE ANIMAL Y POSITION TAD YPOS /GET ANIMAL Y POSITION MQL /TO LOW-ORDER MUY; YF, .-. /MULTIPLY BY SCALE FACTOR (OR FRACTION) YFZAP, TAD YPOS /**** GAIN < 1 **** NOP TAD I (YOFF) /ADD ON ANIMAL Y OFFSET DCA YPOS /STORE ANIMAL Y POSITION / TAD YPOS /GET IT BACK / TAD [7000] /MAKE IT SIGNED / DCA YP /STORE IN POSITION VARIABLE / TAD YP /GET IT BACK / SPA CLA /SKIP IF POSITIVE / NL7777 /ELSE MAKE IT NEGATIVE / DCA YP+1 /STORE SIGN EXTENSION / FORM THE (UNSIGNED) X GALVO POSITION. NL4000 /SET INVERSION VALUE (7000^4) TAD XG0 /\ TAD XG1 / \SUM THE GALVO TAD XG2 / /X POSITION DATA VALUES TAD XG3 // CLL RAR;CLL RAR /%4 DCA XGPOS /STORE GALVO X POSITION TAD XGPOS /GET GALVO X POSITION MQL /TO LOW-ORDER MUY; GXF, .-. /MULTIPLY BY SCALE FACTOR (OR FRACTION) GXFZAP, TAD XGPOS /**** GAIN < 1 **** NOP TAD I (GXOFF) /ADD ON GALVO X OFFSET DCA XGPOS /STORE GALVO X POSITION / TAD XGPOS /GET IT BACK / TAD [7000] /MAKE IT SIGNED / DCA XGP /STORE IN POSITION VARIABLE / TAD XGP /GET IT BACK / SPA CLA /SKIP IF POSITIVE / NL7777 /ELSE MAKE IT NEGATIVE / DCA XGP+1 /STORE SIGN EXTENSION JMP I (INTMORE) /CONTINUE THERE PAGE / FORM THE (UNSIGNED) Y GALVO POSITION. INTMORE,NL4000 /SET INVERSION VALUE (7000^4) TAD YG0 /\ TAD YG1 / \SUM THE GALVO TAD YG2 / /Y POSITION DATA VALUES TAD YG3 // CLL RAR;CLL RAR /%4 DCA YGPOS /STORE GALVO Y POSITION TAD YGPOS /GET GALVO Y POSITION MQL /TO LOW-ORDER MUY; GYF, .-. /MULTIPLY BY SCALE FACTOR (OR FRACTION) GYFZAP, TAD YGPOS /**** GAIN < 1 **** NOP TAD I (GYOFF) /ADD ON GALVO Y OFFSET DCA YGPOS /STORE GALVO Y POSITION / TAD YGPOS /GET IT BACK / TAD [7000] /MAKE IT SIGNED / DCA YGP /STORE IN POSITION VARIABLE / TAD YGP /GET IT BACK / SPA CLA /SKIP IF POSITIVE / NL7777 /ELSE MAKE IT NEGATIVE / DCA YGP+1 /STORE SIGN EXTENSION / CHECK IF PHONEY REWARD SHOULD BE GIVEN. LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT SXL GIVE /SKIP IF NO REWARD SHOULD BE GIVEN COM /INDICATE REWARD SHOULD BE GIVEN PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT SZA CLA /SKIP IF NO REWARD REQUESTED JMP I (GIVREWARD) /JUMP IF FAKE REWARD SHOULD BE GIVEN / CHECK IF IN LIMBO FIRST. TAD LIMBO /GET "IN LIMBO" FLAG SZA CLA /SKIP IF CLEAR JMP I (REWCHK) /JUMP IF NOT / FORM THE UNSIGNED WINDOW LIMIT VALUES. TAD XGPOS /GET X GALVO POSITION TAD I LPTR /ADD ON LEFT-HAND PARAMETER DCA LLIMIT /SAVE AS LEFT-HAND LIMIT TAD XGPOS /GET X GALVO POSITION TAD I RPTR /ADD ON RIGHT-HAND PARAMETER DCA RLIMIT /SAVE AS RIGHT-HAND LIMIT TAD YGPOS /GET Y GALVO POSITION TAD I UPTR /ADD ON UPPER PARAMETER DCA ULIMIT /SAVE AS UPPER LIMIT TAD YGPOS /GET Y GALVO POSITION TAD I DPTR /ADD ON LOWER PARAMETER DCA DLIMIT /SAVE AS LOWER LIMIT / COMPARE CURRENT POSITION TO WINDOW EDGES. TAD LLIMIT /GET LEFT-HAND LIMIT CLL CIA /INVERT IT TAD XPOS /COMPARE TO X POSITION SNL CLA /SKIP IF POSSIBLE JMP I (NOTIN) /FORGET IT TAD RLIMIT /GET RIGHT-HAND LIMIT CLL CIA /INVERT IT TAD XPOS /COMPARE TO X POSITION SZL CLA /SKIP IF POSSIBLE JMP I (NOTIN) /FORGET IT / HORIZONTALLY (AT LEAST) THE POSITION IS OK. TAD ULIMIT /GET UPPER LIMIT CLL CIA /INVERT IT TAD YPOS /COMPARE TO Y POSITION SZL CLA /SKIP IF POSSIBLE JMP I (NOTIN) /FORGET IT TAD DLIMIT /GET LOWER LIMIT CLL CIA /INVERT IT TAD YPOS /COMPARE TO Y POSITION SNL CLA /SKIP IF IN THE WINDOW JMP I (NOTIN) /FORGET IT / WE ARE IN THE WINDOW; CHECK FURTHER. ISZ I (INTMLOW) /COUNT THIS TICK AS IN THE WINDOW SKP /SKIP IF IT DIDN'T TURN OVER ISZ I (INTMHIGH) /ELSE BUMP HIGH-ORDER TAD IWFLAG /ARE WE ALREADY IN THE WINDOW? SZA CLA /SKIP IF NOT JMP WASIN /JUMP IF SO ISZ IWFLAG /INDICATE WE ARE IN THE WINDOW NOW ISZ I (INCLO) /COUNT THIS TRANSITION SKP /SKIP IF IT DIDN'T TURN OVER ISZ I (INCHI) /ELSE BUMP HIGH-ORDER WASIN, TAD IWFLG2 /DID WE NOTICE THE WINDOW ALREADY? SZA CLA /SKIP IF NOT JMP I (INALREADY) /JUMP IF SO ISZ IWFLG2 /SET EDGE FLAG / WE JUST GOT INTO THE WINDOW SINCE LIMBO WAS LIFTED; CANCEL ACQUISITION TIME AND START THE / FIXATION TASK. DLD; FIXTIME /GET LATEST FIXATION TIME DCM /WANT NEGATIVE FORM DST; FIXCNT /STASH THE COUNTER CAM /CLEAN UP DCA ACQCNT /CLEAR ACQUISION TIME-OUT COUNTER JMP I [BNCHECK] /CONTINUE THERE PAGE / COMES HERE IF THE WINDOW IS BEING MAINTAINED. INALREA,ISZ FIXCNT /LOW-ORDER FIXATION TIME OVERFLOW? JMP I [BNCHECK] /NO, KEEP GOING ISZ FIXCNT+1 /HIGH-ORDER FIXATION TIME OVERFLOW? JMP I [BNCHECK] /NO, KEEP GOING / ANIMAL HAS MAINTAINED THE WINDOW FOR THE LATEST TARGET. TAD I TASKXR /GET NEXT FIXATION TIME (LOW-ORDER) DCA FIXTIME /STASH IT TAD I TASKXR /GET NEXT FIXATION TIME (HIGH-ORDER) DCA FIXTIME+1 /STASH IT TAD FIXTIME /GET LOW-ORDER SNA /SKIP IF SOMETHING THERE TAD FIXTIME+1 /ELSE GET HIGH-ORDER SNA CLA /SKIP IF NON-ZERO JMP GIVREWARD /JUMP IF AT END OF FIXATION TASK / SETUP NEXT FIXATION JUMP. TAD I TASKXR /GET GALVO X-POSITION DCA GALVOX /STASH IT ISZ TASKXR /IGNORE HIGH-ORDER TAD I TASKXR /GET GALVO Y-POSITION DCA GALVOY /STASH IT ISZ TASKXR /IGNORE HIGH-ORDER JMS I (SECSETUP) /CHANGE TO SECONDARY WINDOW LIMITS NL0001 /PUT US BACK DCA LIMBO /IN LIMBO DCA IWFLG2 /CLEAR EDGE FLAG TAD [40] /GET RELAY[0] BIT JMS I [CLRELAY] /TURN THE LIGHT OFF TAD (ACQUI2) /POINT DELAY ROUTINE DCA PA /TO SECONDARY ACQUISITION TIME TAD I (GDELAY) /GET GALVO MOVE DELAY COUNT CIA /WANT NEGATIVE FORM DCA GCNT /STASH THE COUNTER TAD I (DTIME2) /GET SECONDARY DELAY TIME JMP NJENTRY /CONTINUE THERE / ALL FIXATIONS COMPLETED; GIVE A REWARD. GIVREWA,TAD I (REWLENGTH) /GET REWARD TIME LENGTH CIA /WANT NEGATIVE FORM DCA REWPLS /SETUP REWARD PULSER TAD [20] /SET RELAY[1] BIT JMS I [SETRELAY] /TURN THE RELAY ON FOR REWARD ISZ I (GRWCNT) /BUMP LOW-ORDER REWARD COUNTER SKP /SKIP IF IT DIDN'T OVERFLOW ISZ I (GRWCNT+1) /ELSE BUMP HIGH-ORDER REWARD COUNTER TAD I (ITGTIME) /GET GOOD INTER-TRIAL TIME JMP I (ITCOMMON) /CONTINUE THERE / COMES HERE IF NOT IN THE WINDOW. NOTIN, TAD IWFLAG /WERE WE IN THE WINDOW? SNA CLA /SKIP IF SO JMP REWCHK /JUMP IF NOT DCA IWFLAG /INDICATE WE ARE NOT IN THE WINDOW ISZ I (OUTCLOW) /COUNT THIS FAILURE SKP /SKIP IF IT DIDN'T TURN OVER ISZ I (OUTCHIGH) /ELSE BUMP HIGH-ORDER TAD ACQCNT /GET ACQUISITION COUNT SNA CLA /SKIP IF ACTIVE JMP I (OWFAIL) /CONTINUE THERE / COMES HERE TO CHECK FOR REWARD, ETC. REWCHK, TAD REWPLS /ARE WE REWARDING? SZA CLA /SKIP IF NOT ISZ REWPLS /ELSE ARE WE DONE WITH IT? JMP ITCHECK /NO, JUST KEEP GOING TAD [20] /SET RELAY[1] BIT JMS I [CLRELAY] /TURN THE REWARD OFF / CHECK IF IN INTER-TRIAL TIME. ITCHECK,TAD ITCNTR /GET INTER-TRIAL TIME SNA CLA /SKIP IF SOMETHING JMP DELCHK /JUMP IF NOT ISZ ITCNTR /BUMP LOW-ORDER JMP I [BNCHECK] /DIDN'T OVERFLOW / THE INTER-TRIAL TIME HAS JUST EXPIRED; SETUP DELAY TIME INTERVAL. JMS I [LOADGALVO] /LOAD NEW GALVO POSITION TAD (ACQUI1) /SETUP THE PRIMARY DCA PA /ACQUISITION POINTER TAD I (DTIME1) /GET PRIMARY DELAY VALUE NJENTRY,CIA /WANT NEGATIVE FORM DCA DELCNT /STASH THE COUNTER TAD I (LDELAY) /GET LIGHT DELAY CIA /WANT NEGATIVE FORM DCA LCNT /STASH THE LIGHT DELAY COUNTER JMP I [BNCHECK] /CONTINUE THERE / COMES HERE TO CHECK IF CURRENTLY IN DELAY INTERVAL. DELCHK, TAD DELCNT /GET DELAY COUNTER SNA CLA /SKIP IF SOMETHING JMP I (ACQCHECK) /JUMP IF NOT ISZ DELCNT /BUMP THE COUNTER JMP I [BNCHECK] /DIDN'T OVERFLOW / THE DELAY INTERVAL HAS JUST EXPIRED; SETUP ACQUISITION TIME. DCA LIMBO /CLEAR LIMBO MODE TAD I PA /GET PROPER ACQUISITION TIME CIA /WANT NEGATIVE FORM DCA ACQCNT /STASH ACQUISITION TIME COUNTER JMP I [BNCHECK] /CONTINUE THERE PAGE / COMES HERE TO CHECK IF CURRENTLY IN ACQUISITION INTERVAL. ACQCHEC,TAD ACQCNT /GET ACQUISITION COUNT SZA CLA /SKIP IF CLEAR ISZ ACQCNT /BUMP IT JMP BNCHECK /DIDN'T OVERFLOW / ANIMAL HAS FAILED TO ACQUIRE LATEST TARGET; TERMINATE TRIAL. OWFAIL, TAD I (ITBTIME) /GET FAILING INTER-TRIAL TIME ITCOMMO,CIA /WANT NEGATIVE FORM DCA ITCNTR /STASH THE INTER-TRIAL COUNTER NL0001 /PUT US IN DCA LIMBO /LIMBO MODE DCA IWFLG2 /CLEAR EDGE FLAG TAD [40] /GET RELAY[0] BIT JMS I [CLRELAY] /TURN THE LIGHT OFF NL0001 /INDICATE A NEW TASK DCA CALCSW /SHOULD BE CALCULATED DCA GALVOX /CLEAR GALVO X-POSITION DCA GALVOY /CLEAR GALVO Y-POSITION TAD I (GDELAY) /GET GALVO MOVE DELAY COUNT CIA /WANT NEGATIVE FORM DCA GCNT /STASH THE COUNTER JMS I (PRISETUP) /SETUP PRIMARY WINDOW LIMITS BNCHECK,TAD BOUNCE /GET DE-BOUNCING COUNTER SZA CLA /SKIP IF NOT ACTIVE ISZ BOUNCE /ELSE COUNT IT NOP /JUST IN CASE TAD RCNTR1 /GET FIRST RELAY COUNTER SZA CLA /SKIP IF NOT ACTIVE ISZ RCNTR1 /ELSE BUMP IT JMP CHKR2 /JUMP IF IT DIDN'T OVERFLOW TAD [10] /GET RELAY[2] VALUE JMS I [CLRELAY] /CLEAR THE BIT TAD [-4] /SETUP THE DCA RCNTR2 /NEXT COUNTER JMP DLCHECK /CONTINUE THERE CHKR2, TAD RCNTR2 /GET SECOND RELAY COUNTER SZA CLA /SKIP IF NOT ACTIVE ISZ RCNTR2 /ELSE BUMP IT JMP DLCHECK /JUMP IF IT DIDN'T OVERFLOW TAD RELAY /GET RELAY IMAGE AND [60] /REMOVE DATA BITS DCA RELAY /SAVE FOR NOW NL4000 /SET SIGN INVERSION BIT TAD GALVOY /GET GALVO Y-POSITION RTL;RTL /MOVE DOWN AND [7] /JUST HIGH-ORDER BITS TAD RELAY /NOW HAVE COMPOSITE LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT ATR /LOAD THE RELAYS PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELAY /SAVE IMAGE OF RELAYS DLCHECK,TAD LCNT /GET LIGHT DELAY COUNTER SNA CLA /SKIP IF SOMETHING JMP GLCHECK /ELSE FORGET IT ISZ LCNT /BUMP THE COUNTER JMP GLCHECK /DIDN'T OVERFLOW TAD [40] /GET RELAY[0] VALUE JMS I [SETRELAY] /TURN THE LIGHT ON GLCHECK,TAD GCNT /GET GALVO MOVE DELAY COUNT SNA CLA /SKIP IF SOMETHING JMP CLCHECK /ELSE FORGET IT ISZ GCNT /BUMP IT SKP /SKIP IF IT DIDN'T OVERFLOW JMS I [LOADGALVO] /LOAD NEW GALVO POSITION CLCHECK,CLSK /CLOCK FLAG UP AGAIN? JMP INTXIT /JUMP IF NOT CLSA /GET STATUS SPA /SKIP IF NOT OVERFLOW HLT /HALT IF OVERFLOW CLA /CLEAN UP / INTERRUPTS EXIT HERE. INTXIT, TAD LINK /GET SAVED LINK CLL RAR /RESTORE IT TAD AC /RESTORE AC / COMES HERE WHEN INTERRUPTS COME FROM OTHER THAN THE CLOCK. FOCINT, CIF CDF 00 /GOING TO FIELD ZERO JMP I INTRETURN /REJOIN FOCAL'S INTERRUPT HANDLER DSCSETU,.-. /DISPLAY SCALE SETUP ROUTINE TAD I (DSCALE) /GET SCALE CONTROLLER RAR /INTO LINK SNL CLA /SKIP IF SET TAD (CLL RAR) /GET NORMAL VALUE SZL /SKIP IF NOT SET TAD [NOP] /GET TWO-TIMES VALUE DCA I (DSZAP1) /ZAP IT IN TAD I (DSZAP1) /GET IT BACK DCA I (DSZAP2) /ZAP IT IN JMP I DSCSETUP /RETURN PAGE / CLEAR RELAYS ROUTINE. CLRELAY,.-. /CLEAR RELAYS ROUTINE DCA BCLOP /STORE IN-LINE TAD RELAY /GET RELAYS IMAGE LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT BCL I; BCLOP, .-. /CLEAR PASSED BIT ATR /LOAD THE RELAYS PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELAY /SAVE NEW VALUE JMP I CLRELAY /RETURN / SET RELAYS ROUTINE. SETRELA,.-. /SET RELAYS ROUTINE DCA BSEOP /STORE IN-LINE TAD RELAY /GET RELAYS IMAGE LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT BSE I; BSEOP, .-. /SET PASSED BIT ATR /LOAD THE RELAYS PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELAY /SAVE NEW VALUE JMP I SETRELAY /RETURN / DOUBLE-PRECISION SIMULATOR ROUTINES. DCOM, .-. /COMPLEMENT ROUTINE SWP /GET LOW-ORDER FIRST CLL CIA /INVERT IT SWP /PUT IT BACK CMA /INVERT HIGH-ORDER SZL /CARRY? IAC /YES, SO INCREMENT JMP I DCOM /RETURN DLOAD, .-. /LOAD ROUTINE CAM /CLEAN UP TAD DLOAD /GET OUR CALLER DCA DADD /MAKE IT THEIRS SKP /AND DON'T EXECUTE ADDRESS! DADD, .-. /ADD ROUTINE DCA DCOM /SAVE HIGH-ORDER TAD I DADD /GET ARGUMENT DCA DLOAD /STASH IT MQA /GET LOW-ORDER CLL /INITIALIZE CARRY TAD I DLOAD /ADD ON LOW-ORDER ARGUMENT MQL /PUT INTO MQ ISZ DADD /BUMP PAST ARGUMENT ISZ DLOAD /BUMP TO HIGH-ORDER RAL /GET CARRY TAD DCOM /RESTORE AC TAD I DLOAD /ADD ON HIGH-ORDER ARGUMENT JMP I DADD /RETURN DSTORE, .-. /STORE ROUTINE DCA DCOM /SAVE AC TAD I DSTORE /GET ARGUMENT DCA DLOAD /STASH IT MQA /GET LOW-ORDER DCA I DLOAD /STORE IT ISZ DSTORE /BUMP PAST ARGUMENT ISZ DLOAD /BUMP TO HIGH-ORDER TAD DCOM /RESTORE AC DCA I DLOAD /STORE IT TAD DCOM /RESTORE AC AGAIN JMP I DSTORE /RETURN CLKINIT,.-. /CLOCK INITIALIZE ROUTINE TAD (2100) /GET 100 KHZ RATE AND MODE 01 CLLR /LOAD CONTROL REGISTER CLA /CLEAN UP TAD (0100) /SET CLOCK OVERFLOW INTERRUPT ENABLE CLEN /LOAD ENABLE REGISTER CLA /CLEAN UP TAD (-764) /SETUP THE CLAB /BUFFER/PRESET REGISTER CLA /CLEAN UP JMP I CLKINIT /RETURN CLRVARI,.-. /CLEAR VARIABLES ROUTINE CAM /CLEAN UP DST; TIMLO /CLEAR CLOCK TIME DST; INTMLO /CLEAR IN-WINDOW TIME DST; TTIME /CLEAR TRAINING TIME DST; INCLO /CLEAR INTO-WINDOW TRANSITION COUNTER DST; OUTCLO /CLEAR OUT-OF-WINDOW TRANSITION COUNTER DST; GRWCNT /CLEAR REWARD COUNT JMP I CLRVARIABLES /RETURN / CALIBRATION VARIABLES CLEAR ROUTINE. CLRCALI,.-. /CALIBRATION VARIABLES CLEAR ROUTINE CAM /CLEAN UP DST; AXY1CNT /CLEAR ANIMAL FIRST-CASE COUNT DST; AXY2CNT /CLEAR ANIMAL SECOND-CASE COUNT DST; GXY1CNT /CLEAR GALVO FIRST-CASE COUNT DST; GXY2CNT /CLEAR GALVO SECOND-CASE COUNT JMP I CLRCALIBRATE /RETURN / LOAD GALVO ROUTINE. LOADGAL,.-. /LOAD GALVO ROUTINE SZA /BETTER BE CLEAR! HLT /BARF! TAD RELAY /GET CURRENT RELAY IMAGE AND [60] /REMOVE D-A BITS DCA RELAY /STORE BACK NL4000 /SET SIGN INVERSION BIT TAD GALVOX /GET X-POSITION RTL;RTL /MOVE DOWN AND [7] /JUST HIGH-ORDER BITS TAD [10] /ADD ON X-INDICATOR TAD RELAY /ADD ON OTHER RELAYS VALUE LINC /GOTO L...MODE LMODE /TELL THE ASSEMBLER ABOUT IT ATR /LOAD THE RELAYS PDP /BACK TO GOODY MODE PMODE /TELL THE ASSEMBLER ABOUT IT DCA RELAY /STORE UPDATED RELAY IMAGE TAD [-4] /SETUP THE DCA RCNTR1 /FIRST RELAY COUNTER DCA RCNTR2 /CLEAR SECOND RELAY COUNTER JMP I LOADGALVO /RETURN PAGE / GAIN SETUP ROUTINE. SETGAIN,.-. /SETUP GAIN STUFF ROUTINE / SETUP ANIMAL X-GAIN STUFF. TAD I (XGAIN+1) /GET HIGH-ORDER ANIMAL X GAIN RTL /MOVE UP AND [7774] /SAVE UPPER BITS DCA I (XF) /SAVE FOR NOW TAD I (XGAIN) /GET LOW-ORDER ANIMAL X GAIN RTL;RAL /MOVE DOWN AND [3] /JUST LOWER BITS TAD I (XF) /ADD ON UPPER BITS DCA I (XF) /SAVE COMPOSITE NL2000 /SETUP MASK AND I (XGAIN+1) /CHECK IF ONE OR GREATER SNA CLA /SKIP IF SO JMP XFRACT /JUMP IF NOT TAD (TAD XPOS) /GET WHOLE POWER ADD-ON INSTRUCTION SKP /DON'T USE FRACTIONAL CODE XFRACT, TAD [NOP] /MAKE IT USE FRACTION ONLY DCA I (XFZAP) /STORE IN-LINE / SETUP ANIMAL Y-GAIN STUFF. TAD I (YGAIN+1) /GET HIGH-ORDER ANIMAL Y GAIN RTL /MOVE UP AND [7774] /SAVE UPPER BITS DCA I (YF) /SAVE FOR NOW TAD I (YGAIN) /GET LOW-ORDER ANIMAL Y GAIN RTL;RAL /MOVE DOWN AND [3] /JUST LOWER BITS TAD I (YF) /ADD ON UPPER BITS DCA I (YF) /SAVE COMPOSITE NL2000 /SETUP MASK AND I (YGAIN+1) /CHECK IF ONE OR GREATER SNA CLA /SKIP IF SO JMP YFRACT /JUMP IF NOT TAD (TAD YPOS) /GET WHOLE POWER ADD-ON INSTRUCTION SKP /DON'T USE FRACTIONAL CODE YFRACT, TAD [NOP] /MAKE IT USE FRACTION ONLY DCA I (YFZAP) /STORE IN-LINE / SETUP GALVO X-GAIN STUFF. TAD I (GXGAIN+1) /GET HIGH-ORDER GALVO X GAIN RTL /MOVE UP AND [7774] /SAVE UPPER BITS DCA I (GXF) /SAVE FOR NOW TAD I (GXGAIN) /GET LOW-ORDER GALVO X GAIN RTL;RAL /MOVE DOWN AND [3] /JUST LOWER BITS TAD I (GXF) /ADD ON UPPER BITS DCA I (GXF) /SAVE COMPOSITE NL2000 /SETUP MASK AND I (GXGAIN+1) /CHECK IF ONE OR GREATER SNA CLA /SKIP IF SO JMP GXFRACT /JUMP IF NOT TAD (TAD XGPOS) /GET WHOLE POWER ADD-ON INSTRUCTION SKP /DON'T USE FRACTIONAL CODE GXFRACT,TAD [NOP] /MAKE IT USE FRACTION ONLY DCA I (GXFZAP) /STORE IN-LINE / SETUP GALVO Y-GAIN STUFF. TAD I (GYGAIN+1) /GET HIGH-ORDER GALVO Y GAIN RTL /MOVE UP AND [7774] /SAVE UPPER BITS DCA I (GYF) /SAVE FOR NOW TAD I (GYGAIN) /GET LOW-ORDER GALVO Y GAIN RTL;RAL /MOVE DOWN AND [3] /JUST LOWER BITS TAD I (GYF) /ADD ON UPPER BITS DCA I (GYF) /SAVE COMPOSITE NL2000 /SETUP MASK AND I (GYGAIN+1) /CHECK IF ONE OR GREATER SNA CLA /SKIP IF SO JMP GYFRACT /JUMP IF NOT TAD (TAD YGPOS) /GET WHOLE POWER ADD-ON INSTRUCTION SKP /DON'T USE FRACTIONAL CODE GYFRACT,TAD [NOP] /MAKE IT USE FRACTION ONLY DCA I (GYFZAP) /STORE IN-LINE JMP I SETGAIN /RETURN PRISETU,.-. /PRIMARY WINDOW LIMITS SETUP ROUTINE CIF PCHFLD /PREVENT INTERRUPTS TAD [PLEFT] /GET PRIMARY LEFT-HAND POINTER DCA LPTR /STASH IT TAD [PRIGHT] /GET PRIMARY RIGHT-HAND POINTER DCA RPTR /STASH IT TAD [PUP] /GET PRIMARY UPPER POINTER DCA UPTR /STASH IT TAD [PDOWN] /GET PRIMARY LOWER POINTER DCA DPTR /STASH IT DCA PRISEC /CLEAR OFFSET FOR PRIMARIES JMP I PRISETUP /RETURN SECSETU,.-. /SECONDARY WINDOW LIMITS SETUP ROUTINE CIF PCHFLD /PREVENT INTERRUPTS TAD (SLEFT) /GET SECONDARY LEFT-HAND POINTER DCA LPTR /STASH IT TAD (SRIGHT) /GET SECONDARY RIGHT-HAND POINTER DCA RPTR /STASH IT TAD (SUP) /GET SECONDARY UPPER POINTER DCA UPTR /STASH IT TAD (SDOWN) /GET SECONDARY LOWER POINTER DCA DPTR /STASH IT TAD [SLEFT-PLEFT] /SETUP OFFSET DCA PRISEC /FOR SECONDARIES JMP I SECSETUP /RETURN PAGE / VARIABLES AND OTHER PARAMETERS. VARS= . /VARIABLES, ETC. HERE / EXPERIMENT RUNNING TIME. TIMLO, .-. /RUNNING TIME - LOW-ORDER FWRD(0) TIMHI, .-. /RUNNING TIME - HIGH-ORDER / IN-WINDOW TIME. INTMLO, .-. /IN-THE-WINDOW TIME - LOW-ORDER FWRD(1) INTMHI, .-. /IN-THE-WINDOW TIME - HIGH-ORDER / TRANSITION COUNTERS. INCLO, .-. /INTO-WINDOW TRANSITION COUNT - LOW-ORDER FWRD(2) INCHI, .-. /INTO-WINDOW TRANSITION COUNT - HIGH-ORDER OUTCLO, .-. /OUT-OF-WINDOW TRANSITION COUNT - LOW-ORDER FWRD(3) OUTCHI, .-. /OUT-OF-WINDOW TRANSITION COUNT - HIGH-ORDER / WINDOW EDGE PARAMETERS. PLEFT, ZBLOCK 2 /PRIMARY LEFT-HAND LIMIT VALUE FWRD(4) PRIGHT, ZBLOCK 2 /PRIMARY RIGHT-HAND LIMIT VALUE FWRD(5) PUP, ZBLOCK 2 /PRIMARY UPPER LIMIT VALUE FWRD(6) PDOWN, ZBLOCK 2 /PRIMARY LOWER LIMIT VALUE FWRD(7) SLEFT, ZBLOCK 2 /SECONDARY LEFT-HAND LIMIT VALUE FWRD(8) SRIGHT, ZBLOCK 2 /SECONDARY RIGHT-HAND LIMIT VALUE FWRD(9) SUP, ZBLOCK 2 /SECONDARY UPPER LIMIT VALUE FWRD(10) SDOWN, ZBLOCK 2 /SECONDARY LOWER LIMIT VALUE FWRD(11) / TASK LIST COUNTER; SET TO LENGTH OF LIST TO BE SEQUENTIALLY USED, OR / ZERO TO ACTIVATE ALL NON-ZERO ENTRIES. TSKNUMB,ZBLOCK 2 /TASK LIST COUNTER FWRD(12) / WATCH-DOG TIMER; SET TO TWO'S COMPLEMENT OF TICKS UNTIL AUTO-SHUTDOWN. WATCHLO,.-. /TIMER - LOW-ORDER FWRD(13) WATCHHI,.-. /TIMER - HIGH-ORDER / REWARD TIMER; SET TO NUMBER OF TICKS REWARD LASTS. REWLENG,ZBLOCK 2 /REWARD DURATION FWRD(14) / REWARD COUNTER; TALLIES TOTAL REWARDS GIVEN TO ANIMAL. GRWCNT, ZBLOCK 2 /REWARD COUNTER FWRD(15) / RANDOM NUMBER GENERATOR SEED. SEEDNUM,ZBLOCK 2 /RANDOM NUMBER SEED FWRD(16) ITGTIME,ZBLOCK 2 /INTER-TRIAL TIME IF TRIAL SUCCEEDS FWRD(17) ITBTIME,ZBLOCK 2 /INTER-TRIAL TIME IF TRIAL FAILS FWRD(18) DTIME1, ZBLOCK 2 /PRIMARY DELAY TIME FWRD(19) DTIME2, ZBLOCK 2 /SECONDARY DELAY TIME FWRD(20) / CALIBRATION READINGS COUNTERS. AXY1CNT,ZBLOCK 2 /ANIMAL FIRST-CASE READINGS COUNT FWRD(21) AXY2CNT,ZBLOCK 2 /ANIMAL SECOND-CASE READINGS COUNT FWRD(22) GXY1CNT,ZBLOCK 2 /GALVO FIRST-CASE READINGS COUNT FWRD(23) GXY2CNT,ZBLOCK 2 /GALVO SECOND-CASE READINGS COUNT FWRD(24) / ANALOG GAIN AND OFFSET ADJUSTMENTS. XGAIN, 0; 2000 /ANIMAL X-CHANNEL GAIN FWRD(25) XOFF, ZBLOCK 2 /ANIMAL X-CHANNEL OFFSET FWRD(26) YGAIN, 0; 2000 /ANIMAL Y-CHANNEL GAIN FWRD(27) YOFF, ZBLOCK 2 /ANIMAL Y-CHANNEL OFFSET FWRD(28) GXGAIN, 0; 2000 /GALVO X-CHANNEL GAIN FWRD(29) GXOFF, ZBLOCK 2 /GALVO X-CHANNEL OFFSET FWRD(30) GYGAIN, 0; 2000 /GALVO Y-CHANNEL GAIN FWRD(31) GYOFF, ZBLOCK 2 /GALVO Y-CHANNEL OFFSET FWRD(32) ACQUI1, ZBLOCK 2 /FIRST ACQUISITION TIME FWRD(33) ACQUI2, ZBLOCK 2 /SECOND ACQUISITION TIME FWRD(34) / MISCELLANEOUS. LDELAY, 0001; 0000 /TARGET LIGHT TURN-ON DELAY TIME FWRD(35) GDELAY, 0001; 0000 /GALVO MOVE DELAY TIME FWRD(36) TTIME, ZBLOCK 2 /TRAINING TIME (NON-LIMBO TIME) FWRD(37) DSCALE, ZBLOCK 2 /ABSOLUTE DISPLAY SCALE FACTOR FWRD(38) PAGE /ROOM FOR MORE VARIABLES, ETC. NOPUNCH /TURN OFF BINARY OUTPUT TSKPTRS,ZBLOCK 20^2 /TASK POINTER LIST FWRD(64)-FWRD(79) PAGE /ROOM FOR MORE VARIABLES, ETC. LOFF1= . /LINC MODE OFFSET DEFINITION CAXY1, ZBLOCK 10^2^2 /ANIMAL FIRST-CASE X, Y READINGS FWRD(128)-FWRD(143) CAXY2, ZBLOCK 10^2^2 /ANIMAL SECOND-CASE X, Y READINGS FWRD(144)-FWRD(159) LOFF2= . /LINC MODE OFFSET DEFINITION CGXY1, ZBLOCK 10^2^2 /GALVO FIRST-CASE X, Y READINGS FWRD(160)-FWRD(175) CGXY2, ZBLOCK 10^2^2 /GALVO SECOND CASE X, Y READINGS FWRD(176)-FWRD(191) ENPUNCH /RESUME BINARY OUTPUT FIELD PCHFLD%10 /DUMP LITERALS NOW FIELD 0 /BACK TO FIELD ZERO *BEOFZAP /OVER LOADER SKP /MAKE IT COME TO US $ /THAT'S ALL FOLK!