*3400 /BCD SUBTRACT, 6-DIGITS (DOUBLE) / /CALLING SEQUENCE: /JMS SUBBCD /X /ADDRESS OF LEAST SIGNIFICANT OF X /Y /ADDRESS OF LEAST SIGNIFICANT OF Y /EXIT IF XY /- / /(MOST SIGNIFICANT)=(LEAST)+1 / / SUBBCD, ENTRY TAD I SUBBCD /GET ARGS. ISZ SUBBCD DCA XX TAD I SUBBCD ISZ SUBBCD DCA YY JMS MOVEIT /SAVE X XX, 0 ZZZ TAD .-1 JMS COMPL /ASSUME Y>X JMS I BSADD ZZZ YY, 0 SNL CLA  /DID FOR ADD OVERFLOW. JMP SUBNEG /TEST Y Y /CALLING SEQUENCE:- / JMS ADDBCD ; XXXXXX ; YYYYYY /WORKS WITH 6 DIGIT BCD NUMBERS, POINTERS POINT AT LS ENDS /USES THE SINGLE LENGTH BCD ADD ROUTINE "BCDADD" ADDBCD, ENTRY CLA TAD I ADDBCD DCA T1  /STORE X POINTER ISZ ADDBCD TAD I ADDBCD DCA T2  /STORE Y POINTER TAD T2 IAC DCA T3  /(Y+1) = TOP END POINTER TAD I T1 JMS BCDADD /GO TO SINGLE LENGTH ADD T2, 0  /ADDEND ADDRESS DCA I T2  /LS RESULT ISZ T1  /MOVE POINTER TO (X+1) RAL  /GET CARRY TAD I T1  /ADD TO MS END JMS BCDADD /SINGLE ADD AGAIN T3, 0 DCA I T3  /STORE MS END ISZ ADDBCD /MOVE POINTER TO EXIT JMP I ADDBCD T1, 0 //////// /BCD ADDITION SUBROUTINE /CALLING SEQUENCE:- / TAD ONE NUMBER / JMS BCDADD / OTHER NUMBER'S ADDRESS / EXIT WITH SUM (BCD) IN ACC. WITH CARRY IN LINK. /NOTE. THE TWO NUMBERS NEED NOT BE RATIONALISED, PROVIDED /THE RAW SUM OF ANY CORRESPONDING DIGITS DOES NOT EXCEED 19. /IN OTHER WORDS, A BCD NUMBER COULD BE INDEXED AS A BINARY /NUMBER AND SUBSEQUENTLY RATIONALISED BY THIS ROUTINE. / / BCDADD, ENTRY DCA ALPHA TAD I BCDADD /GET OTHER OPERAND DCA TEMP2 TAD I TEMP2 DCA BETA ISZ BCDADD /MOVE POINTER DOWN JMS BBCCDD 0017  / (0000 0000 1111) 7766  / (1111 1111 0110) 0012  / (0000 0000 1010) SZL  /SKIP IF NO CARRY FROM UNITS TAD EIGHT / (0000 0001 0000) JMS BBCCDD 0360  / (0000 1111 0000) 7540  / (1111 0110 0000) 0240  / (0000 1010 0000) SZL  /SKIP IF NO CARRY FROM 8'S TAD SIXTY4 /( 0001 0000 0000) JMS BBCCDD MSK74, 7400  / (1111 0000 0000) 3000  / (0110 0000 0000) 5000  / (1010 0000 0000) JMP I BCDADD /EXIT WITH RESULT IN ACC. & LINK. /NOW THE COMMON SUBROUTINE WHICH MASKS AND ADDS THE DIGITS. BBCCDD, ENTRY DCA TEMP2 /STORE RESULT SO FAR CLL TAD I BBCCDD /GET CURRENT MASK BITS AND ALPHA DCA TEMP1 TAD I BBCCDD /GET MASK AGAIN AND BETA TAD TEMP1 /SUM THESE TWO DIGITS TAD TEMP2 /ADD PREVIOUS RESULT SO FAR ISZ BBCCDD /MOVE POINTER DOWN TAD I BBCCDD /TEST FOR SPILL FROM TOP DIGIT SO FAR ISZ BBCCDD /MOVE POINTER DOWN AGAIN SZL  /SKIP IF NO SPILL OCCURED JMP .+3  /SPILL OCCURED, END SUBROUTINE. TAD I BBCCDD /CORRECT FOR UNWANTED ADDITION OF 6 CLL  /CORRECT FOR LINK TOO ISZ BBCCDD /MOVE POINTER DOWN YET AGAIN JMP I BBCCDD /EXIT TO PUT BACK SPILL BIT IF NECESS. TEMP1, 0 TEMP2, 0 ALPHA, 0 BETA, 0 EIGHT, 0020 SIXTY4, 0400  /THESE TWO ARE IN BCD ///////////BCD MULTIPLY SUBROUTINE. /CALLING SEQUENCE:- / TAD XXX /GET MULTIPLIER / JMS MPYBCD / YYYYYY /ADDRESS OF MULTIPLICAND / ZZZZZZ /ADDRESS WHERE RESULT IS PUT /Y & Z POINT TO THE LS END OF 6 DIGIT NUMBERS /USES ZEROIT, MOVEIT, ADDBCD, BCDSH MPYBCD, ENTRY DCA MULT  /PLANT MULTIPLIER TAD I MPYBCD DCA MCAND /POINTER TO MULTIPLICAND ISZ MPYBCD TAD I MPYBCD DCA PROD  /POINTER TO PRODUCT TAD PROD JMS I ZERO1 ISZ MPYBCD JMS I MOVE /MOVE MULTIPLICAND TO WORKING AREA MCAND, 0 WORK SWIZ, TAD MULT  /GET MPYER SNA  /IS IT ZERO? JMP I MPYBCD /YES, EXIT NOW CLL RTR RTR DCA WORK2 /SHIFT NEXT DIGIT INTO POSITION TAD MSK377 /GET NEXT 3 DIGITS AND WORK2 /CLEAR THE CURRENT DIGIT AWAY DCA MULT  /STORE IT FOR THE NEXT ROUND TAD WORK2 RAR CLL  /GET CURRENT DIGIT INTO POSITION SWIZIL, TAD MSK74 /SUBTRACT 100 DCA WORK2 /HOLD COUNTED DOWN DIGIT SZL  /THIS DIGIT DONE? JMP .+4  /NO, ADD AGAIN JMS I BCDSH6 /YES, MPY BY 10 WORK  /POINTER TO WORKING AREA JMP SWIZ  /TO DO NEXT DIGIT JMS ADDBCD /DOUBLE LENGTH ADD WORK  /POINTER TO WORKING AREA PROD, 0  /POINTER TO PRODUCT AREA TAD WORK2 /GET COUNTED DOWN DIGIT AGAIN JMP SWIZIL /BACK TO CONTINUE THIS DIGIT WORK, 0 0  /MULTIPLIER WORKING AREA MULT, 0 WORK2, 0 ZERO1, ZEROIT BCDSH6, BCDSH MOVE, MOVEIT MSK377, 377 PAUSE *4000 /DOLLAR OUTUT /CALLING SEQUENCE: /JMS DOLOUT / LOW ORDER ADDRESS /(RETURNS HERE) / /THIS ROUTINE PRINTS "$XXXX.YY " ; THE "X'S" WILL /BE OR HAVE LEADING BLANKS. / DOLOUT, ENTRY TAD I .-1 ISZ .-2 JMS GETARG /PICK UP DATA. TAD DOLLAR /PRINT DOLLAR. JMS I OUTCX JMS SPACES /PRINT LEADING BLANKS. TAD FIRST ISZ ADR SNA CLA  /STILL NEED BLANKS. JMS SPACEQ JMP BCD3  /NO TAD SPACE JMS ROT  /YES BCD4, TAD POIT JMS I OUTCX /PRINT POINT AND JMS OUT  /DECIMAL DIGITS. JMS OUT TAD SPACE JMS I OUTCX /FORMAT BY A SPACE. JMP I DOLOUT /////// BCD3, JMS OUT  /PRINT ZEROS OR NUMBERS JMP BCD4 /////// /JMS SPACEQ / EXIT IF NON-SPACE / EXIT IF A SPACE(240) SPACEQ, ENTRY  /SPACE QUERY.? TAD I ADR AND P7400D SNA CLA ISZ SPACEQ JMP I SPACEQ /////// /PRINTS LEFTMOST BCD DIGIT AND ROTATES THE WORD. OUT, ENTRY TAD I ADR RTL;RTL;RAL AND P17D TAD P260D /SETUP ASCII JMS ROT  /OUTPUT JMP I OUT //////// // OUTPUT THE AC AND ROTATE I ADR. ROT, ENTRY JMS I OUTCX /PRINT A DIGIT TAD I ADR RTL;RTL  /POSITION NEXT DIGIT DCA I ADR JMP I ROT /////// POIT, 256  /. DOLLAR, 244  /$ SPACE, 240  / ADR, 0;0  /POINTER;HIGH;LOW. CNTR, 0 FIRST, 0  /SAVE HIGH ORDER TO CHECK FOR 0'S. P17D, 17 P260D, 260 P7400D, 7400 M3, -3 /PRINT SIX BCD CHARACTERS. /THE POINTER FOLLOWS THE CALL. /THE ROUTINE PRINTS LEADING BLANKS, /6 BCD DIGITS, AND ONE EXTRA SPACE. / (HIGH ORDER) = (LOW) + 1 . P6BCD, ENTRY TAD I .-1 JMS GETARGS ISZ P6BCD JMS SPACES /PRINT FIRST THREE DIGITS TAD FIRST SZA CLA  /ARE THERE ANY NON-ZEROS? JMP P6BCD2 /YES JMS P3BCD /NO ADR+2 JMP I P6BCD /// P6BCD2, ISZ ADR  /SETUP LOW ORDER WORD. JMS OUT  / PRINT LAST THREE DIRECTLY JMS OUT  / SINCE THE FIRST THREE CONTAINED JMS OUT  / AT LEAST ONE NON-ZERO NUMBER. TAD SPACE JMS I OUTCX /FORMAT SPACE. JMP I P6BCD /////// / OUT3S VIA PUNCH3 /ROUTINE PUNCHES THREE BCD NUMBERS FROM ONE REGISTER /WHOSE POINTER FOLLOWS THE CALL. / THE METHOD IS TO ADD / 17 TO THE FOUR BITS. OUT3S, ENTRY TAD I .-1 /GET ADDRESS OF ARGUMENTS. JMS GETARGS ISZ ADR  /USE ONLY LOW ORDER PART. TAD M3 DCA CNTR  / SETUP THE COUNT./ ISZ OUT3S TAD I ADR / MAKE A NO-PRINT FROM BCD. AND P17D TAD P17D JMS ROT  /OUTPUT. ISZ CNTR  /DONE YET? JMP .-5  /NO JMP I OUT3S /YES //////////// SPACES, ENTRY  /PRINTS 3BCD WITH TAD M3  /LEADING BLANKS. DCA CNTR JMS SPACEQ / IS THE NEXT DIGIT ZERO? JMP NUMBRS / NO. TAD SPACE / YES. JMS ROT  / OUTPUT AND GET NEXT. ISZ CNTR JMP .-5 JMP I SPACES ///// NUMBRS, JMS OUT  / PRINT THE NEXT DIGIT. ISZ CNTR JMP .-2  /PRINT THREE. JMP I SPACES ///////// /ROUTINE GETS THE INPUT DATA AND SAVES IT. GETARG, ENTRY  /PICK UP ARGS FOR PRINT SUBROUTINES. DCA ADR  /SAVE ADDRESS. TAD I ADR /GET LOW ORDER. DCA ADR+2 /REVERSE PLACES. ISZ ADR TAD I ADR DCA ADR+1 TAD ADR+1 /SAVE HIGH ORDER PART. DCA FIRST TAD .+3  /SET POINTER. DCA ADR JMP I GETARG ADR+1  /POINTS TO HIGH ORDER PART. /////// / P3BCD VIA PRINT3 P3BCD, ENTRY  /3+ SPACE. TAD I .-1 ISZ .-2 JMS GETARGS ISZ ADR  /USE ONLY LOW ORDER PART. JMS SPACES TAD SPACE JMS I OUTCX / PRINT TRAILING SPACE./ JMP I P3BCD *4200 /SORT AND BRANCH /"TABLE SIZE" MAY ALSO BE INTERPRETED /AS THE INCREMENT BETWEEN THE IN-TABLE /AND THE OUT-TABLE. IT MAY THEREFORE /BE NEGATIVE. /SIMILAR TO THE ABOVE PROGRAM EXCEPT THAT THE /SECOND EXIT IS NOT USED; INSTEAD THE /CORRESPONDENCE IS USED AS THE BRANCH ADDRESS. SORTCB, ENTRY DCA CHARR /SAVE THE INPUT TAD I .-2 DCA POINT /SAVE THE POINTER ISZ SORTCB TAD I POINT SPA JMP EXIT2 /END OF TABLE CIA TAD CHARR SNA CLA JMP .+3  /MATCH FOUND ISZ POINT JMP SORTCB+5 TAD I SORTCB /GET DELTA. TAD POINT DCA POINT /COMPUTE ADDRESS JMP I POINT /TRANSFER CONTROL ///// EXIT2, ISZ SORTCB /CHARACTER NOT IN TABLE JMP I SORTCB /RETURN CONTROL / GET A NUMBER / SUBROUTINE GETNUM READS IN A SERIES OF N ASCII DIGITS /TERMINATED BY A ";" . IF MORE THAN N DIGITS AFTER OR IF /ASCII CHARACTERS OTHER THAN 0-9 AND ; ARE RECEIVED, THE /ROUTINE JMP OUTS THROUGH TERROR / IF N>6 AND >6 DIGITS GIVEN,THE LAST 6 ONLY ARE KEPT AND NO / ERROR INDICATED. /CALLING SEQUENCE: / TAD (N) / JMS GETNUM / NUMBER /POINTER TO LS END OF NUMBER /USES GETCX, BCDSH, SORTCH, ZEROIT GETNUM, ENTRY CMA  / -(N+1) DCA DIGCNT TAD I GETNUM DCA GETNP /POINTER TO NUMBER TAD GETNP JMS I ZERO2 /ZERO NUMBER, NUMBER +1 ISZ GETNUM GETN1, JMS I GETCX /GET NEXT CHARACTER (ASCII) JMS SORTCH /SORT IT OUT ADDLST  /ADDING KEYBOARD LIST ADDLST-KEYINT JMS I TERROR /CHARACTER INVALID ERROR CONDITION SPA JMP GETN2 /TO EXIT WITH NUMBER ";" FOUND JMS I BCD6SH /SHIFT NEW DIGIT INTO RH END OF NUMBER GETNP, 0  /HOLDS POINTER TO NUMBER (LS END) ISZ DIGCNT />N TO DIGITS FOUND? JMP GETN1 JMS I TERROR /YES ERROR CONDITION GETN2, CLA JMP I GETNUM /EXIT DIGCNT, 0 BCD6SH, BCDSH ////////KEYBOARD CHARACTER TABLE ADDLST, 240;316;315;254;310 312;313;331;325;311 272;-11 ////////KEYBOARD INTERPRETATION TABLE KEYINT, 260;261;262;263;264;265 266;267;270;271;-257 ////// ZERO2, ZEROIT /SUBROUTINE TO PRINT A CHARACTER STRING ON EITHER DEVICE. /JMS OUTLT/OR OUTLP /STARTING ADDRESS /LENGTH JMS I OUTCT0 OUTLT, ENTRY TAD .-2 DCA OUTLXB TAD I OUTLT /GET STARTING ADDRESS - 1. DCA POINT ISZ OUTLT TAD I OUTLT /GET TOTAL NUMBER OF CHARACTERS. ISZ OUTLT CIA DCA CHARR TAD I POINT ISZ POINT OUTLXB, JMS I OUTCT0 /(CALL I OUTCP0)-FOR OUTLP. ISZ CHARR JMP .-4 JMP I OUTLT ///// JMS I OUTCP0 OUTLP, ENTRY TAD .-1  /SWITCH THE RETURN POINT. DCA OUTLT TAD OUTLP-1 JMP OUTLT+2 /SWITCH THE OUTPUT. ///// *75 /MUST BE FILLED IN BY THE USER OR BY MULTIPROC. OUTCP0=. /PRINTER OUTPUT OUTCT0=.+1 /TTY OUTPUT GETCX=.+2 /GENERAL INPUT OUTCX=.+3 /GENERAL INPUT TERROR=.+4 /ERROR CATCHER VIA JMS I TERROR $ *U*;8 x