/ NICOLET 1070 P?S/8 FOCAL PATCHES / (C) 1984, 1985 CHARLES LASNER ASSOCIATES. / LAST EDIT: 03-NOV-1985 10:00:00 CJL / PATCHES TO P?S/8 FOCAL TO CONTROL THE NICOLET 1070 AVERAGER, ETC. / ASSEMBLY INSTRUCTIONS: / SET "BUFFLD" TO PROPER FIELD FOR FBLK (DEFAULT IS 20). / SET "N" TO AMOUNT OF P?S/8 BLOCKS PER READ/WRITE FOR FBLK (DEFAULT IS 2). / MUST BE A POWER OF TWO FOR PROPER OPERATION. / SET "NICODE" TO PROPER BASE DEVICE CODE (DEFAULT IS 30). / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / THESE ARE PATCHES TO P?S/8 FOCAL FOR THE IMPLEMENTATION OF THREE FUNCTIONS: / 1): FBLK(BLOCKNUMBER[,WRITEINDICATOR]) / 2): FWRD(ADDRESS[,NEWVALUE]) / 3): FNIC(ADDRESS[,NEWVALUE]) / FUNCTION FBLK READS IN N DISK BLOCKS INTO FIELD BUFFLD STARTING FROM THE / BLOCK NUMBER PASSED. IF A SECOND ARGUMENT IS PASSED, THE BLOCKS ARE WRITTEN / INSTEAD OF READ. THE UNIT USED FOR ALL I/O IS . / FUNCTION FWRD RETURNS THE CONTENTS OF THE SPECIFIED LOCATION WHOSE ADDRESS / IS THE FIRST ARGUMENT. IF A SECOND ARGUMENT IS PASSED, IT BECOMES THE NEW / STORED VALUE. / FUNCTION FNIC RETURNS THE CONTENTS OF THE SPECIFIED LOCATION IN THE AVERAGER / WHOSE ADDRESS IS THE FIRST ARGUMENT. IF A SECOND ARGUMENT IS PASSED, IT / BECOMES THE NEW STORED VALUE. THE FUNCTION RETURNS ZERO IF TWO ARGUMENTS ARE / USED. / 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 INTEGER=0053 /FLOATING TO FIXED CONVERSION 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 P7700= 0101 /CONSTANT 7700 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 SBTFUN= 7602 /P?S/8 MONITOR BOOTSTRAP FUNCTION SYSIO= 7640 /SYSTEM I/O ENTRY POINT / MISCELLANEOUS DEFINITIONS. IFNDEF BUFFLD /BUFFER FIELD FOR FBLK AND FWRD IOT= 6000 /IOT BASE IFNDEF N /NUMBER OF P?S/8 BLOCKS IN READ/WRITE IFNDEF NICODE /BASE DEVICE CODE OF AVERAGER NL4000= CLA CLL CML RAR /SET AC TO 4000 NL7777= CLA CMA /SET AC TO 7777 NSTART= 4035 /PATCH ASSEMBLY ADDRESS / AVERAGER IOT INSTRUCTIONS. TSWEEP= NICODE^10+IOT 1 /SKIP IF SWEEP IN PROGRESS TSTOP= NICODE^10+IOT 2 /SKIP IF AVERAGER IS STOPPED PULSE= NICODE^10+IOT 4 /PULSE EXT ADDRESS ADVANCE TERMINAL TREADY= NICODE+1^10+IOT 1 /SKIP IF AVERAGER IS IN P0 STATE TCCF= NICODE+1^10+IOT 2 /SKIP IF COMPUTER CONTROL IS SET TADCL= NICODE+1^10+IOT 4 /TRANSFER ADC CONTENTS TO L REGISTER STARTM= NICODE+2^10+IOT 1 /START MEASURE PROGRAM STARTR= NICODE+2^10+IOT 2 /START READOUT PROGRAM STOP= NICODE+2^10+IOT 4 /STOP HARDWIRE PROGRAMS LANDM= NICODE+3^10+IOT 1 /M+L=>M WRITE= NICODE+3^10+IOT 2 /C(M)=>MEM(ADDRESS) / = NICODE+3^10+IOT 4 /NOT USED TACAS= NICODE+4^10+IOT 1 /C(AC)=>ADDRESS READ= NICODE+4^10+IOT 2 /C(MEM(ADDRESS))=>M / = NICODE+4^10+IOT 4 /NOT USED RMRL= NICODE+5^10+IOT 1 /RESET M AND L REGISTERS TMUAC= NICODE+5^10+IOT 2 /M<0:5>=>AC<6:11> TACLU= NICODE+5^10+IOT 4 /AC<6:11>=>L<0:5> TMLAC= NICODE+6^10+IOT 1 /M<6:17>=>AC TACLL= NICODE+6^10+IOT 2 /AC=>L<6:17> TDISP= NICODE+6^10+IOT 4 /LOAD X, Y FROM ADDRESS AND ADDER CCCF= NICODE+7^10+IOT 1 /CLEAR COMPUTER CONTROL SCCF= NICODE+7^10+IOT 2 /SET COMPUTER CONTROL / = NICODE+7^10+IOT 4 /NOT USED FIELD 0 /ENSURE FIELD ZERO *FNTABL+14 /PUT IN HASHED NAMES "B^2+"L^2+"K /BLK "W^2+"R^2+"D /WRD "N^2+"I^2+"C /NIC *NSTART /START PATCH HERE FOR DIRECT LOADING / DISK I/O FUNCTION: FBLK(BLOCKNUMBER[,WRITEINDICATOR]). XBLK, JMS I INTEGER /GET BLOCK ARGUMENT PUSHA /SAVE IT PUSHJ /FIND OUT IF WE WRITE LARG1, ARG /**** RELOCATE **** NL4000 /MAKE IT A READ TAD IOWORD /MAKE IT A WRITE DCA FUN /PUT IN-LINE EITHER WAY POPA /RESTORE BLOCK ARGUMENT DCA TBLK /PUT IN-LINE ALSO JMS I PSYSIO/(SYSIO) /CALL FOR READ OR WRITE 0000 /CORE FUN, .-. /FILLED IN TBLK, .-. /FILLED IN ION /MAKE SURE INTERRUPTS ARE STILL ON RETURN /BACK TO FOCAL / MEMORY REFERENCE FUNCTION: FWRD(ADDRESS[,NEWVALUE]). XWRD, JMS I INTEGER /GET ADDRESS ARGUMENT PUSHA /SAVE IT PUSHJ /EVALUATE SECOND IF ANY LARG2, ARG /**** RELOCATE **** JMP GET /NONE, JUST GET VALUE POPA /RESTORE ADDRESS AND (N^200-1) /MASK OFF BAD BITS DCA TBLK /SAVE AS POINTER JMS I INTEGER /GET REPLACEMENT VALUE CDF BUFFLD /GOTO BUFFER FIELD DCA I TBLK /STORE IT JMP GET2 /FINISH UP GET, POPA /GET BACK ADDRESS AND (N^200-1) /MASK OFF BAD BITS DCA TBLK /SAVE IT CDF BUFFLD /GOTO BUFFER FIELD GET2, TAD I TBLK /GET VALUE SPA CLA /IS IT POSITIVE? NL7777 /NO, EXTEND NEGATIVE SIGN DCA FLAC+1 /SAVE HIGH-ORDER EITHER WAY TAD I TBLK /GET IT AGAIN CDF 00 /BACK TO US NWEXIT, DCA FLAC+2 /STORE LOW-ORDER NREXIT, TAD (27) /GET EXPONENT VALUE DCA FLAC /STORE EXPONENT RETURN /RETURN TO FOCAL / AVERAGER FUNCTION: FNIC(ADDRESS[,NEWVALUE]). XNIC, JMS I INTEGER /GET ADDRESS ARGUMENT PUSHA /SAVE IT SCCF /SET COMPUTER CONTROL STOP /STOP HARDWIRE PROGRAM TSTOP /IS IT STOPPED? JMP .-1 /NO, WAIT FOR IT PUSHJ /FIND OUT IF WE WRITE LARG3, ARG /**** RELOCATE **** JMP GETVALUE /NO, WE READ JMS SETADRESS /SETUP ADDRESS JMS I INTEGER /GET SECOND ARGUMENT RMRL /RESET M, L REGISTERS TACLL!TDISP /TRANSFER AC, LOAD X, Y CLA /CLEAN UP TAD FLAC+1 /GET MOST SIGNIFICENT BITS TACLU /LOAD UPPER L BITS LANDM!WRITE /M<=M+L, MEM(ADDRESS)<=C(M) CLA /CLEAN UP CCCF /CLEAR COMPUTER CONTROL RMRL /RESET M, L STARTR /START READOUT PROGRAM DCA FLAC+1 /CLEAR HIGH-ORDER JMP NWEXIT /EXIT WITH CLEAR FLAC GETVALU,JMS SETADRESS /SETUP ADDRESS WRITE /C(M)=>MEM(ADDRESS) TMLAC!TDISP /READ M, LOAD X, Y DCA FLAC+2 /SAVE LOW-ORDER BITS TMUAC /GET HIGH-ORDER BITS DCA FLAC+1 /SAVE HIGH-ORDER BITS TAD FLAC+1 /GET IT BACK AND (40) /JUST SIGN BIT SZA CLA /SKIP IF POSITIVE TAD P7700/[-100] /ELSE SET SIGN EXTENSION BITS TAD FLAC+1 /ADD ON OTHER BITS DCA FLAC+1 /STORE BACK COMPOSITE CCCF /CLEAR COMPUTER CONTROL RMRL /RESET M, L STARTR /START READOUT PROGRAM JMP NREXIT /FINISH THERE SETADRE,.-. /SETUP ADDRESS ROUTINE POPA /GET ADDRESS VALUE RMRL /RESET M, L TACAS!READ /AC=>ADDRESS, MEM(ADDRESS)=>M CLA /CLEAN UP JMP I SETADRESS /RETURN ARG, TAD CHAR /ARGUMENT EVALUATOR TAD (-",) /GOOD TERMINATOR? PSYSIO, SZA CLA /SKIP IF SO POPJ /RETURN IF NOT PUSHJ; EVAL-1 /EVALUATE SECOND ARGUMENT IAC /INDICATE SKIP RETURN POPJ /RETURN IOWORD, .-. /I/O WORD FOR FBLK 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 (XBLK&177) / >INSERT FBLK DCA I (FNTABF+14) // TAD PBASE /\ TAD (XWRD&177) / >INSERT FWRD DCA I (FNTABF+15) // TAD PBASE /\ TAD (XNIC&177) / >INSERT FNIC DCA I (FNTABF+16) // TAD PBASE /\ TAD (ARG&177) / \ DCA I (LARG1) / \ TAD I (LARG1) / >FIXUP ADDRESS CONSTANTS DCA I (LARG2) / / TAD I (LARG2) / / DCA I (LARG3) // TAD I (SBTFUN) /GET MONITOR UNIT RAR /MOVE LOW-ORDER TO LINK CML RAL /INVERT AND MOVE BACK AND (7) /JUST UNIT BITS TAD (N^100+BUFFLD+4000) /ADD ON FUNCTION BITS DCA I (IOWORD) /STORE IN I/O WORD 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 // DCA I (BEOFZAP) /REPAIR LOADER JMP I (BEOFZAP) /RESUME LOADING LNSTART,NSTART /POINTER TO NSTART MOVCNT, NSTART-NEND /CODE MOVE COUNTER PAGE *BEOFZAP /OVER LOADER SKP /MAKE IT COME TO US $ /THAT'S ALL FOLK!