/ TRIPLE PRECISION ARITHMETIC PACKAGE / / BY . . . / JOSEPH A. RODNITE / INFORMATION CONTROL SYSTEMS INC / ANN ARBOR, MICHIGAN / / ASSUME A 36 BIT ACCUMULATOR REGISTER IN / CORE LOCATIONS 40, 41, 42. / ASSUME A 36 BIT MULTIPLIER QUOTIENT REGISTER / IN CORE LOCATIONS 43, 44, 45. / / THE SUBROUTINE PACKAGE CONSISTS OF SUBROUTINES / TO MANIPULATE 36 BIT NUMBERS. EACH SUBROUTINE / OPERATES ON THE ACCUMULATOR OR MULTIPLIER / QUOTIENT REGISTER OR BOTH. / / THE GENERAL CALL IS . . . / / JMS I XXXX / ADDRESS OF OPERAND / / WHERE XXXX IS THE LOCATION OF ONE OF THE SUBROUTINES / INDIRECT TRANSFER LOCATIONS. THE ADDRESS SPECIFIED / SHOULD BE OF THE HIGH ORDER PART OF THE WORD. / / LOCATIONS 46-52 AND 10 AND 11 ARE USED BY THE / ROUTINES. / / / / MULTIPLY (LOC 53) / / MULTIPLY THE 36 BIT 2'S COMPLEMENT INTEGER / IN THE MQ REGISTER BY THE ARGUEMENT. / THE 72 BIT PRODUCT IS FOUND IN THE AC-MQ. / THE HIGHER ORDER PART IS IN THE AC. / / / DIVIDE (LOC 54) / / DIVIDE THE 72 BIT 2'S COMPLEMENT INTEGER IN / THE AC-MQ REGISTER BY THE ARGUEMENT. / THE QUOTIENT APPEARS IN THE MQ AND THE / REMAINDER APPEARS IN THE AC. / IF THE QUOTIENT WOULD BE GREATER THAN / 35 BITS THE RESULTS PRODUCED ARE MEANINGLESS. / THE SIGN OF THE REMAINDER IS ALWAYS POSITIVE. / / / ADD (LOC 55) / / ADD THE ARGUEMENT TO THE ACCUMULATOR. / THE RESULT APPEARS IN THE ACCUMULATOR. / / / SUB (LOC 56) / / SUBTRACT THE ARGUEMENT FROM THE ACCUMULATOR. / THE RESULT APPEARS IN THE ACCUMULATOR. / / / OUTPUT CONVERSION (LOC 57) / / CONVERT TO DECIMAL AND TYPE THE 11 DECIMAL / DIGIT NUMBER FOUND IN THE ARGUEMENT. / WARNING: THE AC AND MQ ARE ALTERED. / / / INPUT CONVERSION (LOC 60) / / ACCEPT A SIGNED DECIMAL NUMBER FROM / THE KEYBOARD OF THE ASR33. THE BINARY / NUMBER PRODUCED WILL APPEAR IN THE / ACCUMULATOR UPON RETURN. THE MQ IS / NOT ALTERED. THE FIRST NON-NUMERIC / CHARACTER TERMINATES THE READING. / THE TYPING OF A SIGN (+,-) ALWAYS / STARTS THE CONVERSION PROCESS OVER / AGAIN. HENCE AN ERROR MAY BE / CORRECTED BY TYPING A SIGN AND / STARTING OVER AGAIN. / / / / THE TOTAL SUBROUTINE PACKAGE REQUIRES / 4 PAGES OF CORE STORAGE (1000 OCTAL LOC). / THE BINARY TAPE FURNISHED OCCUPIES / LOCS 6600-7600. / / TRIPLE PRECISION MULTIPLY ROUTINE / / DEFINE HARDWARE 36 BIT ACCUMULATOR / ORG=6600 ACL=42 ACM=41 ACH=40 MQL=45 MQM=44 MQH=43 SRL=52 SRM=51 SRH=50 ERAS=47 IR0=10 IR1=11 / / *ORG TMPY, 0 CLA CLL DCA ACL /ZERO 36 BIT ACCUMULATOR DCA ACM DCA ACH DCA SIGN /SET SIGN OF RESULT SWITCH TAD I TMPY /ADDRESS OF MULTIPLIER DCA ERAS TAD I ERAS /HIGH ORDER MULTIPLIER DCA SRH ISZ ERAS TAD I ERAS /MED ORDER MULTIPLIER DCA SRM ISZ ERAS TAD I ERAS /LOW ORDER MULTIPLIER DCA SRL TAD MQH /HIGH ORDER MQ SMA /IS IT NEGATIVE JMP .+4 /NO ISZ SIGN /YES ... SET SIGN SWITCH JMS COMP /COMPLEMENT MQ MQH CLA CLL TAD SRH /HIGH ORDER SR SMA /IS IT NEGATIVE JMP .+4 /NO ISZ SIGN /YES ... SET SIGN SWITCH JMS COMP /COMPLEMENT SR SRH CLA CLL TAD M36 /-36 DCA SHCT /TO SHIFT COUNTER / / THIS IS THE MULTIPLICATION LOOP / MLP, CLA CLL TAD MQL /LOW ORDER MQ RAR /OBTAIN RIGHTMOST BIT SNL /WAS IT A 1 JMP SHFT /NO ... JUST SHIFT CLA CLL /YES ... ADD SR TO AC TAD ACL /LOW ORDER TAD SRL DCA ACL GLK /OVERFLOW BIT TAD ACM /MED ORDER TAD SRM DCA ACM GLK /OVERFLOW BIT TAD ACH /HIGH ORDER TAD SRH DCA ACH / / NOW SHIFT AC AND MQ RIGHT ONE PLACE / AS A 72 BIT REGISTER / SHFT, CLA CLL DCA ERAS /ZERO SHIFTED BIT LOC TAD AACH /ADDRESS OF HIGH ORDER AC-1 DCA IR0 /TO AUTO-INDEX REGISTER 0 TAD AACH DCA IR1 /ALSO TO AUTO INDEX REGISTER 1 TAD M6 /-6 DCA ERAS-1 /TO AN INDEX LOCATION TAD I IR0 /WORD RAR /SHIFT RIGHT 1 TAD ERAS /+ BIT SHIFTED OUT OF LAST WORD DCA I IR1 /TO SAME WORD RAR /LINK TO HIGH ORDER AC DCA ERAS /TO BIT LOST LOC ISZ ERAS-1 /INDEX ON NO OF WORDS IN AC-MQ (6) JMP .-7 /RETURN FOR MORE ISZ SHCT /INDEX ON SHIFT COUNTER JMP MLP /RETURN FOR MORE / / OVER WITH MULTIPLICATION / NOW SET SIGN OF RESULT / CLA CLL TAD SIGN /SIGN INDEX LOC RAR /SHIFT RIGHT ONE SNL /WAS IT AN ODD NO JMP I TMPY /NO ... RETURN WITH POSITIVE NO IN AC-MQ JMS C72 /YES ... COMPLEMENT 72 BIT PRODUCT JMP I TMPY /RETURN WITH COMPLEMENTED PRODUCT IN AC-MQ / / SUBROUTINE TO COMPLEMENT AC AND MQ / AS 1 72 BIT REGISTER / C72, 0 CLA CLL TAD M6 /-6 DCA ERAS /TO AN INDEX LOC TAD AMQL /ADDRESS OF LOW ORDER MQ DCA ERAS-1 /TO ADDRESS INDEX TAD MQL /LOW ORDER MQ CIA /COM+1 JMP .+7 /ENTER LOOP IN MIDDLE / CLA CMA CLL CML TAD ERAS-1 /-1+ADDRESS OF CUR REGISTER DCA ERAS-1 /NEW ADDRESS TAD I ERAS-1 /CONTENTS OF CUR REGISTER CMA /COMPLEMENT IT TAD SIGN /+OVERFLOW BIT DCA I ERAS-1 /BACK TO REGISTER GLK /OVERFLOW BIT DCA SIGN /TO A CORE LOC ISZ ERAS /INDEX ON NO OF REGISTERS JMP .-12 /RETURN FOR MORE JMP I C72 /RETURN WITH COMPLEMENTED NO IN AC-MQ / / SUBROUTINE TO COMPLEMENT A 36 BIT REGISTER / COMP, 0 CLA IAC /1 TAD I COMP /+HIGH ORDER ADDRESS DCA ERAS-1 /GIVES MED ORDER ADDRESS CLA CLL IAC /1 TAD ERAS-1 /+MED ORDER ADDRESS DCA ERAS /GIVES LOW ORDER ADDRESS TAD I ERAS /LOW ORDER WORD CIA /COM+1 DCA I ERAS /NEW LOW ORDER WORD GLK /OVERFLOW BIT DCA ERAS TAD I ERAS-1 /MED ORDER WORD CMA /COMPLEMENT IT TAD ERAS /+OVERFLOW BIT DCA I ERAS-1 /NEW MED ORDER GLK /OVERFLOW BIT DCA ERAS TAD I COMP /HIGH ORDER ADDRESS DCA ERAS-1 TAD I ERAS-1 /HIGH ORDER WORD CMA /COMPLEMENT IT TAD ERAS /+OVERFLOW BIT DCA I ERAS-1 /NEW HGIH ORDER ISZ COMP /INDEX OVER ADDRESS JMP I COMP /RETURN / / LOCAL CONSTANTS / M6, 0-6 M36, 0-44 AACH, ACH-1 AMQL, MQL SHCT, 0 SIGN, 0 / TRIPLE PRECISION DIVIDE / *ORG+200 TDIV, 0 CLA CLL DCA DSGN /SET SIGN OF RESULT SWITCH TAD DM3 /-3 DCA ERAS-1 /TO AN INDEX LOC TAD I TDIV /ADDRESS OF DIVISOR ISZ TDIV /INDEX FOR EXIT DCA ERAS TAD I ERAS /HIGH ORDER DIVISOR SNA ISZ ERAS-1 DCA SRH ISZ ERAS TAD I ERAS /MED ORDER DIVISOR SNA ISZ ERAS-1 DCA SRM ISZ ERS TAD I ERAS /LOW ORDER DIVISOR SZA JMP .+4 ISZ ERAS-1 JMP .+2 HLT /HALT ON AN ATTEMPT TO DIVIDE BY 0 DCA SRL / / NOW CHECK SIGNS OF EVERYTHING / TAD ACH /HIGH ORDER AC SMA /IS IT NEGATIVE JMP .+3 /NO ISZ DSGN /YES ... SET SIGN SWITCH JMS I IC72 /COMPLEMENT 72 BIT AC-MQ CLA CLL TAD SRH /COPY SR TO -SR (MSR) DCA MSRH TAD SRM DCA MSRM TAD SRL DCA MSRL TAD SRH /HIGH ORDER SR SMA /IS IT NEGATIVE JMP .+5 /NO ... COMPLEMENT -SR ISZ DSGN /YES ... SET SIGN SWITCH JMS I ICOM /COMPLEMENT SR SRH JMP .+3 JMS I ICOM /COMPLEMENT MSR IF POSITIVE MSRH TAD DM36 /-36 DCA DSHC /TO SHIFT COUNTER / / THIS BEGINS THE ACTUAL DIVIDE / / FIRST SHIFT AC-MQ LEFT ONE PLACE / DLP, CLA CLL CML TAD DM6 /-6 DCA ERAS /TO INDEX LOC TAD AMQLD /ADDRESS OF LOW ORDER MQ DCA ERAS-1 /TO ADDRESS INDEX LOC / CLA CML TAD I ERAS-1 /WORD FROM 72 BIT REGISTER RAL /SHIFT LEFT ONE DCA I ERAS-1 /NEW WORD CLA CMA /-1 TAD ERAS-1 /+ADDRESS DCA ERAS-1 /NEW ADDRESS ISZ ERAS /INDEX ON NO OF WORDS JMP .-10 /MORE / / CHECK TO SEE IF AC >= SR / CLA CLL TAD SRH /-HIGH ORDER SR CIA TAD ACH /+HIGH ORDER AC SNA JMP .+4 /MORE TESTS IF HIGH ORDER EQUAL SMA /IS AC >= SR JMP SBTC /YES ... GO TO SUBTRACT JMP INDX /NO ... GO TO INDEX SHIFT COUNTER TAD SRM /-MED ORDER SR CIA TAD ACM /+MED ORDER AC SNA JMP .+4 SMA JMP SBTC JMP INDX TAD SRL /-LOW ORDER SR CIA TAD ACL /+LOW ORDER AC SNA JMP .+3 SPA JMP INDX / / NOW SUBTRACT SR FROM AC / SBTC, CLA CLL TAD ACL /LOW ORDER TAD MSRL DCA ACL GLK /OVERFLOW BIT TAD ACM /MED ORDER TAD MSRM DCA ACM GLK /OVERFLOW BIT TAD ACH /HIGH ORDER TAD MSRH DCA ACH ISZ MQL /INDEX LOW ORDER MQ TO ACCOUNT FOR DIVISION INDX, ISZ DSHC /INDEX ON SHIFT COUNTER JMP DLP / / DIVISION COMPLETE / CHECK SIGN OF RESULT / CLA CLL TAD DSGN /SIGN SWITCH RAR /IS IT ODD SNL JMP I TDIV /NO ... RESULT + ... EXIT JMS I ICOM /YES ... COMPLEMENT RESULT MQH JMP I TDIV /EXIT / / LOCAL CONSTANTS / DM6, 0-6 DM3, 0-3 DM36, 0-44 AMQLD, MQL ICOM, COMP IC72, C72 DSHC, 0 MSRH, 0 MSRM, 0 MSRL, 0 DSGN, 0 / TRIPLE PRECISION OUTPUT / *ORG+400 TOUT, 0 CLA CLL TAD I TOUT /ADDRESS OF OUTPUT NUMBER DCA ERAS TAD I ERAS /HIGH ORDER DCA SRH ISZ ERAS TAD I ERAS /MED ORDER DCA SRM ISZ ERAS TAD I ERAS /LOW ORDER DCA SRL DCA ZRSW /SET ZERO SUPPRESSION SWITCH TAD SRH /HIGH ORDER WORD SMA CLA /IS IT NEGATIVE JMP .+6 /NO JMS I TCOM /YES ... COMPLEMENT NUMBER SRH TAD MINS JMS PRNT /PRINT A MINUS SIGN JMP .+3 TAD BLNK JMS PRNT /PRINT A BLANK IF PLUS TAD TCNT /-12 (DECIMAL DIGIT COUNT-1) DCA ERAS /TO AN INDEX LOCATION TAD ACON /ADDRESS ON CONSTANT STRING-1 DCA IR0 /TO AUTO INDEX REGISTER 0 / / THE FOLLOWING DOES ALL THE WORK / TCLP, CLA CLL DCA DIGT /SET DECIMAL DIGIT TO ZERO TAD I IR0 /HIGH ORDER SUBTRACTOR DCA MQH TAD I IR0 /MED ORDER DCA MQM TAD I IR0 /LOW ORDER DCA MQL / / MOVE CURRENT NUMBER TO ACCUMULATOR / TLP1, CLA CLL TAD SRH /HIGH ORDER DCA ACH TAD SRM /MED ORDER DCA ACM TAD SRL /LOW ORDER DCA ACL / / SUBTRACT CURRENT SUBTRACTOR / TAD ACL /LOW ORDER TAD MQL DCA ACL GLK TAD ACM /MED ORDER TAD MQM DCA ACM GLK TAD ACH /HIGH ORDER TAD MQH DCA ACH / / CHECK FOR AN OVERFLOW BIT / SNL /WAS THERE AN OVERFLOW JMP .+11 /NO ... OVER WITH CURRENT DECIMAL DIGIT TAD ACH /YES ... COPY RESULT TO CUR DCA SRH TAD ACM DCA SRM TAD ACL DCA SRL ISZ DIGT /INCREMENT DECIMAL DIGIT JMP TLP1 /RETURN FOR ANOTHER TRY / / WE NOW HAVE THE NEXT HIGHEST DECIMAL DIGIT IN DIGT / TAD DIGT /DIGIT SZA /IS IT A 0 JMP .+6 /NO ... JUST PRINT IT TAD ZRSW /YES ... IS LEADING ZERO SWITCH ON SZA JMP .+3 /YES...PRINT THE 0 TAD BLNK /NO ... PRINT A BLANK JMP .+4 DCA ZRSW /SET OR RESET LEADING ZERO SW TAD DIGT /DIGIT TAD BCD /+BCD BITS JMS PRNT /PRINT IT ISZ ERAS /INDEX ON NO OF DECIMAL DIGITS JMP TCLP /RETURN FOR MORE TAD SRL /LAST DECIMAL DIGIT TAD BCD /+BCD BITS JMS PRNT /ALWAYS PRINT LAST DIGIT ISZ TOUT /INDEX OVER ADDRESS JMP I TOUT /R E T U R N / / CONVERSION CONSTANTS / CCON, 6653 /-10 000 000 000 7501 6000 7704 /-1 000 000 000 3123 3000 7772 /-100 000 000 0241 7400 7777 /-10 000 000 3166 4600 7777 /-1 000 000 7413 6700 7777 /-100 000 7747 4540 7777 /-10 000 7775 4360 7777 /-1 000 7777 6030 7777 /-100 7777 7634 7777 /-10 7777 7766 TCNT, 0-12 ACON, CCON-1 ZRSW, 0 TCOM, COMP DIGT, 0 BLNK, 240 MINS, 255 BCD, 260 / / PRNT, 0 TSF /WAIT ON FLAG JMP .-1 TLS /SELECT CLA CLL JMP I PRNT / TRIPLE PRECISION INPUT / *ORG+600 TIN, 0 CLA CLL DCA ERAS-1 /SET SIGN SWITCH DCA SRH /ZERO ACCUMULATED NUMBER DCA SRM DCA SRL / INLP, JMS OBTN /OBTAIN A CHAR FROM KEYBOARD TAD ERAS /CHAR TAD CHK1 /-260 SPA CLA /IS IT TOO SMALL FOR A DIGIT JMP INOT /YES ... OVER OR A SIGN TAD ERAS /CHAR TAD CHK2 /-272 SMA CLA /IS IT TOO LARGE FOR A DIGIT JMP INOT /YES ... OVER OR A SIGN / / NOW MULTIPLY ACCUMULATED NO BY 10 / DCA ACL /ZERO ACCUMULATOR DCA ACM DCA ACH JMS SHL1 /SHIFT SR LEFT 1 JMS ADDS /ADD SR TO AC JMS SHL1 /SHIFT SR LEFT 2 JMS SHL1 JMS ADDS /ADD SR TO AC CLA CLL CML TAD ERAS /CHAR TAD CHK1 /-260 ... GIVES DIGIT TAD ACL /+LOW ORDER AC DCA SRL /NEW LOR ORDER GLK TAD ACM /MED ORDER DCA SRM GLK TAD ACH /HIGH ORDER DCA SRH JMP INLP / / A NON-NUMERIC CHARACTER HAS BEEN TYPED / INOT, TAD ERAS /CHAR TAD NEGS /-MINUS SIGN SZA CLA /WAS CHAR A - SIGN JMP .+3 /NO ... MORE TESTS REQD ISZ ERAS-1 /YES ... SET SIGN SWITCH JMP TIN+3 /RETURN FOR NUMBER TAD ERAS /CHAR TAD MPLS /- PLUS SIGN SNA CLA /WAS CHAR A + SIGN JMP TIN+1 /ESSENTIALLY IGNORE A + SIGN / / CHAR WAS NOT A SIGN HENCE CONVERSION OVER / TAD SRL /MOVE NO TO AC DCA ACL TAD SRM DCA ACM TAD SRH DCA ACH TAD ERAS-1 /SIGN SWITCH SNA CLA /IT IT ZERO JMP I TIN /YES ... RETURN JMS I TICM /NO ... COMPLEMENT AC ACH JMP I TIN /RETURN / / SUBROUTINE TO SHIFT SR LEFT ONE PLACE / SHL1, 0 CLA CLL TAD SRL /LOW ORDER RAL DCA SRL TAD SRM /MED ORDER RAL DCA SRM TAD SRH /HIGH ORDER RAL DCA SRH JMP I SHL1 /RETURN / / SUBROUTINE TO ADD SR TO AC / ADDS, 0 CLA CLL TAD ACL /LOW ORDER TAD SRL DCA ACL GLK TAD ACM /MED ORDER TAD SRM DCA ACM GLK TAD ACH /HIGH ORDER TAD SRH DCA ACH JMP I ADDS /RETURN / / TRIPLE PRECISION ADDITION / TADD, 0 CLA CLL TAD I TADD /ADDRESS OF ADDEND DCA ERAS JMS GET /MOVE ADDEND TO SR JMS ADDS /ADD SR TO AC ISZ TADD /INDEX OVER ADDRESS JMP I TADD /RETURN / / TRIPLE PRECISION SUBTRACTION / TSUB, 0 CLA CLL TAD I TSUB /ADDRESS OF SUBTRAHEND DCA ERAS JMS GET /MOVE TO SR JMS I TICM /COMPLEMENT SR SRH JMS ADDS /ADD SR TO AC ISZ TSUB /INDEX OVER ADDRESS JMP I TSUB /RETURN / / SUBROUTINE TO MOVE A NO TO SR / GET, 0 TAD I ERAS /HIGH ORDER DCA SRH ISZ ERAS TAD I ERAS /MED ORDER DCA SRM ISZ ERAS TAD I ERAS /LOW ORDER DCA SRL JMP I GET /RETURN / / SUBROUTINE TO OBTAIN A CHAR FROM THE KEYBOARD / OBTN, 0 KSF /WAIT ON FLAG JMP .-1 KRB /READ KEYBOARD TLS /PRINT CHAR DCA ERAS /HOLD CHAR JMP I OBTN /RETURN / / LOCAL CONSTANTS / CHK1, 0-260 CHK2, 0-272 NEGS, 0-255 MPLS, 0-253 TICM, COMP / / *53 TMPY TDIV TADD TSUB TOUT TIN $