/ EAE MODE A INTEGER ROUTINES / 8K FORTRAN INTEGER MATH PACKAGE FOR EAE / V1 8/18/71 PHIL SIEMENS ENTRY IREM ENTRY IABS ENTRY DIV ENTRY MPY ENTRY IRDSW ENTRY CLEAR ENTRY SUBSC OPDEF KRS 6034 OPDEF TADI 1400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 OPDEF MQL 7421 OPDEF MQA 7501 OPDEF DVI 7407 OPDEF MUY 7405 LAP ////////// / MULTIPLY ROUTINE /IN THE FOLLOWING PROGRAM, THE EAE MULTIPLY ROUTINE /RUNS FASTER THAN THE STANDARD BY A FACTOR OF 2.75. / DO 10 I=1,10 / DO 10 J=1,200 / 10 N=I*J /NUMBER OF CYCLES REQUIRED / 40 CYCLES + MULT. TIME + CALL TIME / 60 + 7.2 + 121 = 188 USEC FOR PDP-8/I MPY, 6140 /INTEGER MULTIPLY ROUTINE 0002 DCA MQ /AC TO MQ TAD MPY /GET CDF TO ARG LIST DCA MPY1 /PUT IN LINE MPY1, NOP /BECOMES CDF TO ARGS TADI MPY# /GET FIELD OF MULTIPLIER INC MPY# DCA MPY2 /PUT IN LINE TADI MPY# /GET ADDRESS OF MULTIPLIER INC MPY# DCA DIV MPY2, NOP /BECOMES CDF TO MULTIPLIER TADI DIV /GET MULTIPLIER MQL MUY /MULTIPLY MQ, 0 CLA CLL CML RTL TAD MPY DCA MPY3 /CDF CIF FOR FAST RETURN MQA MPY3, NOP JMPI MPY# ////////// / DIVIDE ROUTINE /IN THE FOLLOWING EXAMPLE, THE EAE DIVIDE ROUTINE /RUNS FASTER THAN THE STANDARD BY A FACTOR OF 3.2. / DO 10 I=1,10 / DO 10 J=1,200 / 10 N=J/I /NUMBER OF CYCLES REQUIRED / 57 + DVI TIME + CALL TIME / 85 + 8 + 121 = 214 USEC FOR PDP-8/I DIV, 6140 /INTEGER DIVIDE SUBROUTINE 0002 CLL SPA /IS DIVIDEND POSITIVE? CML CIA /NO MQL /LOAD MQ REGISTER TAD DIV /GET FIELD OF ARGS DCA DIV1 /PUT IN LINE DIV1, NOP /BECOMES CDF TO ARGS TADI DIV# /GET FIELD OF DIVISOR INC DIV# DCA DIV2 /PUT IN LINE TADI DIV# /GET ADDRESS OF DIVISOR INC DIV# DCA MPY DIV2, NOP /BECOMES CDF TO DIVISOR TADI MPY /GET DIVISOR SNA /IS DIVISOR ZERO? JMP DIVZ /YES  SPA [?YS4giv{o~oy{~sowW~|?o?w}|~?;~~nue RSN DCI#I VAD D C2I P V U/ ITNLN EIA DTVDI/#ITG D EEDA SR OSVDFOII RSN DCI#I VAD P C YMVD 2IPN,/ OCB EOECSM D TFVDOOCIA CLL CML RTL TAD DIV DCA DIV3 MQA ISZ MPY /CHECK SIGN CIA /MAKE QUOTIENT NEGATIVE DIV3, NOP JMPI DIV# ////////// SAV, BLOCK 1 /REMAINDER FROM LAST DIVISION IREM, 6140 /INTEGER REMAINDER FUNCTION 0002 INC IREM# INC IREM# CLA CLL CML RTL TAD IREM DCA IREM1 TAD SAV IREM1, NOP JMPI IREM# / NOTE: THIS FAST RETURN METHOD SAVES APPROX 90 USEC DIVZ, CALL 1, ERROR /ZERO DIVIDE ERROR ARG DVERR CLA CLL CMA RAR RETRN DIV DVERR, 4411 2632 IABS, 6140 /INTEGER ABS VALUE FUNCTION 0002 TAD IABS /GET FIELD OF ARGS DCA IAB1 IAB1, NOP /BECOMES CDF TO ARGS TADI IABS# /GET FIELD OF ARG INC IABS# DCA IAB2 TADI IABS# /GET ADDRESS OF ARG INC IABS# DCA IRDSW IAB2, NOP TADI IRDSW /GET ARG SPA CIA DCA IRDSW CLA CLL CML RTL TAD IABS DCA IAB3 TAD IRDSW IAB3, NOP JMPI IABS# IRDSW, 6140 /READ SR FUNCTION 0002 INC IRDSW# INC IRDSW# CLA CLL CML RTL TAD IRDSW DCA IRD1 OSR IRD1, NOP JMPI IRDSW# PAGE ////////// / THE FLOATING POINT CLEAR SUBROUTINE WAS ADDED TO INTEGR / SO THAT PROGRAMS WHICH DO NOT USE FLOATING POINT MATH / CAN RUN WITHOUT LOADING THE F.P. MATH PACKAGE. CLEAR, 6140 0002 MQL DCA ACH DCA ACM DCA ACL MQA RETRN CLEAR / THE FOLLOWING CAN BE USED FOR DOUBLY OR SINGLY / SUBSCRIPTED ARRAYS. ON ENTRY THE AC SHOULD BE / NEGATIVE FOR FLOATING POINT VARIABLES. THIS MAY / BE ANY NEGATIVE NUMBER FOR SINGLY SUBSCRIPTED / VARIABLES, AND MUST BE THE FIRST DIMENSION FOR / DOUBLY SUBSCRIPTED VARIABLES. S1, BLOCK 1 /ADDR OF FIRST SUBSC S2, BLOCK 1 /ADDR OF SECOND SUBSC A, BLOCK 2 /ADDR OF ARRAY R, BLOCK 1 /ADDR FOR RESULT TM, 0 FL, 0 /DOUBLE SUBSC FLAG N, 0 /DIMENSION -- NEGATIVE IF FLOATING SUBSC, 6140 0002 DCA N /SAVE THE DIMENSION TAD N SPA CMA DCA MQ2 /MULTIPLIER CLA CLL CMA RAL /-2 TAD SUBSC# DCA 10 /SET AUTO INDEXING POINTER TAD SUBSC /GET FIELD OF ARGS DCA SUB1 SUB1, NOP /BECOMES CDF TO ARGS TADI 10 /GET NUMBER OF ARGS AND (100 SNA CLA /DOUBLE SUBSC? JMP SB0 TADI 10 /YES -- GET FIELD OF 2ND SUB DCA SB2 TADI 10 /GET ADDR OF 2ND SUB DCA S2 CMA SB0, DCA FL /SET DOUBLE SUB FLAG TADI 10 /GET FIELD OF SUB DCA SB1 TADI 10 /GET ADDR OF SUB DCA S1 TADI 10 DCA A /FIELD OF ARRAY TADI 10 DCA A# /ADDR OF ARRAY TAD SUBSC DCA SUB2 TADI 10 /ADDR OF RESULT DCA R TAD 10 IAC DCA SUBSC# ISZ FL /DBL SUBS JMP SB1 CLA CMA /GET 2ND SUBSC SB2, NOP /CDF TO FIELD OF 2ND SUBSC TADI S2 SZA /IS IT A 1? JMP MQ1 SB1, NOP /CDF TO FIELD OF 1ST SUBSC TADI S1 TAD (-1 DCA TM SUB2, NOP TAD A DCAI R INC R TAD N SPA CLA /FIXED OR FLOATING? TAD TM CLL RAL TAD TM TAD A# DCAI R STL CLA RTL TAD SUBSC DCA SUB3 SUB3, NOP JMPI SUBSC# MQ1, MQL MUY MQ2, 0 CLA MQA JMP SB1 END