/CALCU1 - VERSION 1 /THIS PROGRAM CAUSES THE PDP-8 TO SIMULATE A PRINTING /CALCULATOR, CAPABLE OF ADDITION, SUBTRACTION, /MULTIPLICATION, DIVISION, AND EXPONENTIATION. /SUBTOTALS AND TOTALS ARE PRODUCED ON COMMAND. /AN INITIAL DIALOG GIVES ESSENTIAL OPERATING IN- /STRUCTIONS. /THIS PROGRAM IS DESIGNED TO UTILIZE ONE OF THE DEC /FLOATING POINT PACKAGES. THE BINARY FOR THE /APPROPRIATE FLOATING POINT PACKAGE (EAE, NONEAE, 27-BIT) /MUST BE LOADED WITH THE BINARY ASSEMBLED FROM /THIS SOURCE PROGRAM OR RESULTS WILL BE UNPREDICTABLE. /FPP PSEUDO-INSTRUCTIONS: FIXMRI FADD=1000 FIXMRI FSUB=2000 FIXMRI FMPY=3000 FIXMRI FDIV=4000 FIXMRI FGET=5000 FIXMRI FPUT=6000 FEXT=0000 FEXP=0006 FLOG=0007 FNEG=0010 FIN=0011 FOUT=0012 FFIX=0013 FLOT=0014 FSMA=7110 FSZA=7050 FSPA=7100 FSNA=7040 FNOP=7010 FSKP=7020 FPP=JMS I 7 PRINT=JMS I TYPE CRLF=JMS I CRLF1 *20 TEMP1, 0 0 0 TEMP2, 0 0 0 CRLF1, CRLF2 TYPE, TYPE1 GTOP1, GTOP FAC0, 44 TEMP, 0 *56 1 /SET OUTPUT FORMAT OF 16 /FLOATING POINT PKG 6 /TO E14.6 *70 GTCHK, 0 /ROUTINE TO INPUT A NUMBER /AND CHECK FOR PROPER TER- /MINATOR BEFORE PROCEEDING FPP FPUT TEMP1 /SAVE CONTENTS OF FAC FIN /GET NO. FROM KEYBOARD FEXT CLA /AND CHECK FOR VALID INPUT TAD 53 /C(53=TERMINATOR TAD KM215 /ASCII FOR C.R. SNA /WAS IT A C.R.? JMP I GTCHK /YES, EXIT TO MAIN PROG FPP /NO, . . . FGET TEMP1 /RESTORE CONTENTS OF FAC FEXT CRLF JMP I GTOP1 /AND TRY AGAIN KM215, -215 PAGE START, TLS KCC JMS I INIT JMS I INIT3 CLA CLL FPP FGET K0 FPUT TEMP1 FPUT TEMP2 FEXT PRINT TEXT "%#CLEAR%##" GTOP, CLA KSF JMP .-1 KRB /GET OPERATOR DCA TEMP TAD TEMP TAD KM203 SNA CLA /CTRL/C? JMP I MON /YES, BACK TO MONITOR TAD TEMP /NO, GO ON TSF JMP .-1 TLS /ECHO OPERATOR TAD KM252 SNA /"*"? JMP I MULTI /YES, GO TO MULTIPLY SUB TAD KM1 /(-253 OVERALL) SNA /"+"? JMP I ADD /YES, GO TO ADD SUB TAD KM2 /(-255) SNA /"-"? JMP I SUBT /YES, GO TO SUBTRACT ROUTINE TAD KM2 /(-257) SNA /"/"? JMP I DIVD /YES, GO TO DIVIDE ROUTINE TAD KM44 /(-323) SNA /"S"? JMP I STOT /YES, OUTPUT SUBTOTAL TAD KM1 /(-324) SNA /"T"? JMP I GTOT /YES, OUTPUT TOTAL AND CLEAR TAD KM12 /(-336) SNA CLA /"^"? JMP I EXP /YES, EXPONENTIATE JMP GTOP /NO, IGNORE IT AND TRY AGAIN CRLF2, 0 PRINT TEXT "%#" JMP I CRLF2 INIT, INIT1 INIT3, INIT2 EXP, EXP1 GTOT, GTOT1 STOT, STOT1 DIVD, DIVD1 SUBT, SUBT1 ADD, ADD1 MULTI, MULTI1 KM12, -12 KM44, -44 KM2, -2 KM1, -1 KM252, -252 KM203, -203 MON, 7600 K0, 0 0 0 PAGE ADD1, JMS GTCHK /GET AND CHECK OPERAND: /RETURN WITH PREVIOUS C(FAC IN /TEMP1 AND OPERAND IN FAC. FPP FADD TEMP1 FEXT /EXIT WITH TOTAL IN FAC JMP I GTOP1 SUBT1, JMS GTCHK FPP FPUT TEMP2 /SUBTRAHEND IN TEMP2 FGET TEMP1 FSUB TEMP2 FEXT JMP I GTOP1 MULTI1, JMS GTCHK FPP FMPY TEMP1 FEXT JMP I GTOP1 DIVD1, JMS GTCHK FPP FPUT TEMP2 FGET TEMP1 FDIV TEMP2 FEXT JMP I GTOP1 EXP1, JMS GTCHK FPP FPUT TEMP2 FGET TEMP1 FLOG FMPY TEMP2 FEXP FEXT JMP I GTOP1 ERR1, PRINT TEXT "%#CANNOT EXPONENTIATE NEGATIVE NUMBER OR 0%#" JMP I START1 START1, START+4 TYPE1, 0 /TYPE MESSAGE FOLLOWING CALL; /"%#" OUTPUTS A CR/LF COMBO CLA CMA TAD TYPE1 DCA 14 TAD I 14 /NOTE: LOC 14 IS AUTOINDEX DCA TEMP TAD TEMP RTR; RTR; RTR JMS DECODE TAD TEMP JMS DECODE JMP TYPE1+4 DECODE, 0 AND MASK5 /MASK OFF BITS 0-5 SNA /END OF TEXT? JMP I 14 /YES, RETURN TAD KM40 /NO, CHECK IT OUT SMA /<40? JMP DECODE+11 /NO TAD K340 /YES, ADD 340 (300 TO ORIG.) JMP PRI /AND PRINT IT TAD KM3 /(-43 OVERALL) SZA /WAS IT "#"? JMP DECODE+16 /NO TAD K212 /YES; GET ASCII FOR L.F. JMP PRI /AND PRINT IT TAD KKM2 /(-45 IN ALL) SZA /WAS IT "%"? JMP DECODE+23 /NO TAD K215 /YES, GET ASCII FOR C.R. JMP PRI /AND PRINT IT TAD K245 /ADD 245 TO OTHERS PRI, JMS TTYP /AND PRINT JMP I DECODE TTYP, 0 TLS TSF JMP .-1 CLA JMP I TTYP MASK5, 0077 KM40, -40 K340, 340 KM3, -3 K212, 212 K215, 215 KKM2, -2 K245, 245 PAGE INIT1, 0 /INITIAL DIALOG PRINT TEXT "CALCULATOR PROGRAM:%##AFTER 'CLEAR' IS PRINTED,%#" PRINT TEXT "ENTER #+%# -%# * (TO MULTIPLY)%# " PRINT TEXT "/ (TO DIVIDE)%# ^ (TO EXPONENTIATE)%#" PRINT TEXT " S (FOR SUBTOTAL), OR%# T (FOR TOTAL);%##" JMP I INIT1 PAGE INIT2, 0 PRINT TEXT "ARITHMETIC OPERATORS ARE TO BE FOLLLOWED BY%#" PRINT TEXT "A DECIMAL NUMBER IN E14.6 FORMAT, AND 'RETURN'%#" PRINT TEXT "#IF ERROR IN ENTRY, PRESS 'RUBOUT' INSTEAD OF 'RETURN.'%##" JMP I INIT2 STOT1, FPP FPUT TEMP1 FOUT FGET TEMP1 FEXT JMP I GTOP1 GTOT1, FPP FPUT TEMP1 FOUT FGET TEMP1 FEXT JMP I START3 START3, START+4 /ERROR TRAPS *7575 ERR2 /DIVISION BY 0 ERR1 /ILLEGAL LOG *START3+1 ERR2, PRINT TEXT "%#CAN'T DIVIDE BY 0%##" JMP I START3 $$$$