home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug010.ark / LLLFP.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  62KB  |  1,645 lines

  1. ;###S
  2. ;MODIFIED BY TONY GOLD FOR NON-MACR0 ASSEMBLER
  3. ;CHANGES WITHIN ;###S AND ;###E LINES
  4. ;ALL ORIGINAL CODE RETAINED AS COMMENTS
  5. ;###E
  6. ;
  7.  ;       ////FLOATING POINT PACKAGE FOR THE MCS8
  8.  ;       ////BY DAVID MEAD
  9.  ;       ////MODIFIED BY HAL BRAND 9/6/74
  10.  ;       ////MODIFIED FOR 24 BIT MANTISSAS***********
  11.  ;       ////PLUS ADDED I/O CONVERSION ROUTINES
  12.  ;       ////NEW ROUTINE COMMENTS
  13.  ;       ////ARE PRECEEDED BY /
  14.  ;       ////OTHER CHANGES ARE NOTED BY **
  15. ;        ////MODIFIED BY FRANK OLKEN 6/28/75
  16.  ;
  17.  ;
  18. ;###S
  19. ;    EQUATES FOR RELOCATED PACKAGES
  20.     ORG    10DDH
  21. INTERP:    EQU    0100H
  22. FPTBL:    EQU    1774H
  23. IOJUMP:    EQU    1900H
  24. CONIN:    EQU    IOJUMP+4
  25. STATUS:    EQU    IOJUMP+0AH
  26. INP:    EQU    FPTBL+33H
  27. OUTR:    EQU    FPTBL+36H
  28. OUTL:    EQU    INTERP+7D9H
  29. INL:    EQU    INTERP+996H
  30. ;         ORG 110000Q
  31.  ;
  32.  ;
  33. CPM:    EQU    5
  34. ;CONIN     EQU    404Q        ; JMP TABLE LOCATION OF CONSOLE INP.
  35. ;STATUS    EQU    412Q        ; JMP TABLE LOC. FOR STATUS PORT INPUT
  36. ;OUTR      EQU    113775Q            ;LINK TO BASIC
  37. ;OUTL      EQU    103726Q
  38. ;INL       EQU    104623Q
  39. ;INP       EQU    113772Q            ;LINK TO BASIC
  40. ;###E
  41. MINCH     EQU    300Q        ;MINIMUM CHARACTERISTIC WITH SIGN EXTENDED
  42. MAXCH     EQU    077Q        ;MAXIMUM CHARACTERISTIC WITH SIGN EXTENDED
  43.  ;
  44.  ;
  45.  ;******************************************************
  46.  ;       //// DIVIDE SUBROUTINE
  47.  ;******************************************************
  48.  ;
  49.  ;
  50. LDIV:    CALL    CSIGN       ;COMPUTE SIGN OF RESULT
  51.          CALL    ZCHK        ;CHECK IF DIVIDEND = ZERO
  52.          JNZ     DTST2       ;IF DIVIDEND .NE. 0 CHECK DIVISOR
  53.          CALL    BCHK        ;CHECK FOR ZERO/ZERO
  54.          JZ      INDFC       ;ZERO/ZERO = INDEFINITE
  55.          JMP     WZERC       ;ZERO/NONZERO = ZERO
  56. DTST2:   CALL    BCHK        ;COME HERE IF DIVIDEND .NE. 0
  57.          JZ      OFLWC       ;NONZERO/ZERO = OVERFLOW
  58.                              ;IF WE GET HERE, THINGS LOOK OKAY
  59.          MOV     E,L         ;SAVE BASE IN E
  60.          MOV L,C           ;BASE\6 TO L
  61.          CALL DCLR         ;CLEAR QUOTIENT MANTISSA SLOT
  62.          MOV L,E           ;RESTORE BASE IN L
  63.          CALL ENT1         ;DO FIRST CYCLE
  64.          MOV L,C           ;BASE \6 TO L
  65.          CALL DLST         ;MOVE QUOTIENT OVER ONE PLACE
  66.          MVI D,23          ;NUMBER OF ITERATIONS TO D
  67.  REP3:   MOV L,E
  68.          CALL ENT2
  69.          DCR D             ;DEC D
  70.          JZ  GOON
  71.          MOV A,L
  72.          MOV L,C           ;BASE\6 TO L
  73.          MOV C,A
  74.          CALL DLST         ;MOVE QUOTIENT MANT OVER
  75.          MOV A,L           ;CPTR TO A
  76.          MOV E,C           ;LPTR TO E
  77.          MOV C,A           ;CPTR TO C
  78.          JMP REP3
  79. ;
  80. GOON:     CALL   AORS             ;CHECK IF RESULT IS NORMALIZED
  81.          JM  CRIN
  82.          MOV A,L           ;LPTR TO A
  83.          MOV L,C           ;CPTR TO L
  84.          MOV C,A           ;LPTR TO C
  85.          CALL DLST         ;SHIFT QUOTIENT LEFT
  86.          MOV C,L
  87.          MOV L,E
  88.          CALL    LDCP        ;COMPUTE THE CHARACTERISTIC OF RESULT
  89.          RET
  90. ;
  91. CRIN:     CALL   CFCHE            ;GET A=CHAR(H,L), E=CHAR(H,B)
  92.          SUB     E           ;NEW CHAR = CHAR(DIVIDEND) - CHAR(DVISIOR)
  93.          CPI     177Q        ;CHECK MAX POSITIVE NUMBER
  94.          JZ      OFLWC       ;JUMP ON OVERFLOW
  95.          ADI     1           ;ADD 1 SINCE WE DID NOT LEFTSHIFT
  96.          CALL    CCHK        ;CHECK AND STORE CHARACTERISTIC
  97.          RET                 ;RETURN
  98. ;
  99.  ;
  100.  ;
  101.  ;******************************************************
  102.  ;       //// ADDITION SUBROUTINE
  103.  ;******************************************************
  104.  ;
  105.  ;
  106.  LADD:   XRA A             ;/***SET UP TO ADD
  107.          JMP LADS          ;/NOW DO IT
  108.  ;
  109.  ;
  110.  ;******************************************************
  111.  ;       //// SUBTRACTION SUBROUTINE
  112.  ;******************************************************
  113.  ;
  114.  ;
  115.  LSUB:   MVI A,200Q        ;/****SET UP TO SUBTRACT
  116.  ;                       SUBROUTINE LADS
  117.  ;                       FLOATING POINT ADD OR SUB
  118.  ;                       A[128 ON ENTRY[SUB
  119.  ;                       A[0 ON ENTRY[ADD
  120.  ;                       F-S[F,FIRST OPER DESTROYED
  121.  ;                       BASE \11 USED FOR SCRATCH
  122.  LADS:   CALL ACPR         ;SAVE ENTRY PNT AT BASE \6
  123.          CALL    BCHK        ;CHECK ADDEND/SUBTRAHEND = ZERO
  124.          RZ                  ;IF SO, RESULT=ARG SO RETURN
  125.                              ;THIS WILL PREVENT UNDERFLOW INDICATION ON
  126.                              ;ZERO + OR - ZERO
  127.          CALL CCMP
  128.          JZ  EQ02          ;IF EQUAL, GO ON
  129.          MOV D,A           ;SAVE LPTR CHAR IN D
  130.          JC  LLTB
  131.          SUB E             ;L.GT.B IF HERE
  132.          ANI 127
  133.          MOV D,A           ;DIFFERENCE TO D
  134.          MOV E,L           ;SAVE BASE IN E
  135.          MOV L,C           ;C PTR TO L
  136.          INR L             ;C PTR\1 TO L
  137.          MOV M,E           ;SAVE BASE IN C PTR\1
  138.          MOV L,B           ;B PTR TO L
  139.          JMP NCHK
  140.  LLTB:   MOV A,E           ;L.LT.B IF HERE,BPTR TO A
  141.          SUB D             ;SUBTRACT LPTR CHAR FROM BPTR CHAR
  142.          ANI 127
  143.          MOV D,A           ;DIFFERENCE TO D
  144.  NCHK:   MVI A,24
  145.          CMP D
  146.          JNC SH10
  147.          MVI D,24
  148.  SH10:   ORA A
  149.          CALL DRST
  150.          DCR D
  151.          JNZ SH10
  152.  EQUL:   MOV A,L
  153.          CMP B
  154.          JNZ EQ02          ;F.GT.S IF L.NE.B
  155.          MOV L,C           ;C PTR TO L
  156.          INR L             ;C PTR\1 TO L
  157.          MOV L,M           ;RESTORE L
  158.  EQ02:   CALL LASD         ;CHECK WHAT TO
  159.          CALL ACPR         ;SAVE ANSWER
  160.          CPI 2             ;TEST FOR ZERO ANSWER
  161.          JNZ NOT0
  162.          JMP     WZER        ;WRITE FLOATING ZERO AND RETURN
  163. ;
  164.  NOT0:   MVI D,1           ;WILL TEST FOR SUB
  165.          ANA D
  166.          JZ  ADDZ          ;LSB[1 INPLIES SUB
  167.          CALL TSTR         ;CHECK NORMAL/REVERSE
  168.          JZ  SUBZ          ;IF NORMAL,GO SUBZ
  169.          MOV A,L           ;OTHERWISE REVERSE
  170.          MOV L,B           ;ROLES
  171.          MOV B,A           ;OF L AND B
  172. ;
  173. SUBZ:    CALL    DSUB        ;SUBTRACT SMALLER FROM BIGGER
  174.          CALL    MANT        ;SET UP SIGN OF RESULT
  175.          CALL    TSTR        ;SEE IF WE NEED TO INTERCHANGE
  176.                              ;BPTR AND LPTR
  177.          JZ      NORM        ;NO INTERCHANGE NECESSARY, SO NORMALIZE
  178.                              ;AND RETURN
  179.          MOV A,L           ;INTERCHANGE
  180.          MOV L,B           ;L
  181.          MOV B,A           ;AND B
  182.          MOV A,C           ;CPTR  TO A
  183.          MOV C,B           ;BPTR TO C
  184.          MOV E,L           ;LPTR TO E
  185.          MOV B,A           ;CPTR TO B
  186.          CALL LXFR         ;MOVE_BPTR> TO _LPTR>
  187.          MOV A,B
  188.          MOV B,C
  189.          MOV C,A
  190.          MOV L,E
  191.          JMP     NORM        ;NORMALIZE RESULT AND RETURN
  192. ;
  193. ;   COPY THE LARGER CHARACTERISTIC TO THE RESULT
  194. ;
  195. ADDZ:    CALL    CCMP        ;COMPARE THE CHARACTERISTICS
  196.          JNC     ADD2        ;IF CHAR(H,L) .GE. CHAR(H,B) CONTINUE
  197.          CALL    BCTL        ;IF CHAR(H,L) .LT. CHAR(H,B) THE COPY
  198.                              ;CHAR(H,B) TO CHAR(H,L)
  199. ADD2:    CALL    MANT        ;COMPUTE SIGN OF RESULT
  200.          CALL    DADD        ;ADD MANTISSAS
  201.           JNC    SCCFG            ;IF THERE IS NO OVFLW - DONE
  202.          CALL    DRST        ;IF OVERFLOW SHIFT RIGHT
  203.          CALL    INCR        ;AND INCREMENT CHARACTERISTIC
  204.          RET                 ;ALL DONE, SO RETURN
  205. ;
  206. ;   THIS ROUTINE STORES THE MANTISSA SIGN IN THE RESULT
  207. ;   THE SIGN HAS PREVIOUSLY BEEN COMPUTED BY LASD.
  208. ;
  209.  MANT:   MOV E,L           ;SAVE L PTR
  210.          MOV L,C           ;C PTR TO L
  211.          MOV A,M           ;LOAD INDEX WORD
  212.          ANI 128           ;SCARF SIGN
  213.          MOV L,E           ;RESTORE L PTR
  214.          INR L             ;L PTR\2
  215.          INR L
  216.          INR L             ;TO L
  217.          MOV E,A           ;SAVE SIGN IN E
  218.          MOV A,M
  219.          ANI 127           ;SCARF CHAR
  220.          ADD E             ;ADD SIGN
  221.          MOV M,A           ;STORE IT
  222.          DCR L             ;RESTORE
  223.          DCR L
  224.          DCR L             ;L PTR
  225.          RET
  226. ;
  227. ;
  228.  ;                       SUBROUTINE LASD
  229.  ;                       UTILITY ROUTINE FOR LADS
  230.  ;                       CALCULATES TRUE OPER AND SGN
  231.  ;                       RETURNS ANSWER IN
  232.  LASD:   CALL MSFH         ;FETCH MANT SIGNS, F IN A,D
  233.          CMP E             ;COMPARE SIGNS
  234.          JC  ABCH          ;F\,S- MEANS GO TO A BRANCH
  235.          JNZ BBCH          ;F- S\ MEANS GO TO B BRANCH
  236.          ADD E             ;SAME SIGN IF HERE, ADD SIGNS
  237.          JC  BMIN          ;IF BOTH MINUS, WILL OVERFLOW
  238.          CALL AORS         ;BOTH POS IF HERE
  239.          JP  L000          ;IF AN ADD, LOAD 0
  240.  COM1:   CALL DCMP         ;COMPARE F WITH S
  241.          JC  L131          ;S.GT.F,SO LOAD 131
  242.          JNZ L001          ;F.GT.S,SO LOAD 1
  243.  L002:   MVI A,2           ;ERROR CONDITION, ZERO ANSWER
  244.          RET
  245.  BMIN:   CALL AORS         ;CHECK FOR ADD OR SUB
  246.          JP  L128          ;ADD, SO LOAD 128
  247.  COM2:   CALL DCMP         ;COMPARE F WITH S
  248.          JC  L003          ;S.GT.F,SO LOAD 3
  249.          JNZ L129          ;FGT.S.SO LOAD 129
  250.          JMP L002          ;ERROR
  251.  ABCH:   CALL AORS         ;FT,S- SO TEST FOR A/S
  252.          JM  L000          ;SUBTRACT, SO LOAD 0
  253.          JMP COM1          ;ADD, SO GO TO DCMP
  254.  BBCH:   CALL AORS         ;F-,S\,SO TEST FOR A/S
  255.          JM  L128          ;SUB
  256.          JMP COM2          ;ADD
  257.  L000:   XRA A
  258.          RET
  259.  L001:   MVI A,1
  260.          RET
  261.  L003:   MVI A,3
  262.          RET
  263.  L128:   MVI A,128
  264.          RET
  265.  L129:   MVI A,129
  266.          RET
  267.  L131:   MVI A,131
  268.          RET
  269.  ;
  270.  ;                       SUBROUTINE LMCM
  271.  ;                       COMPARES THE MAGNITUDE OF
  272.  ;                       TWO FLOATING PNT NUMBERS
  273.  ;                       Z[1 IF [,C[1 IF F.LT.S.
  274.  LMCM:   CALL CCMP         ;CHECK CHARS
  275.          RNZ               ;RETURN IF NOT EQUAL
  276.          CALL DCMP         ;IF EQUAL, CHECK MANTS
  277.          RET
  278.  ;
  279.  ;
  280.  ;
  281.  ;***************************************************
  282.  ;       //// MULTIPLY SUBROUTINE
  283.  ;***************************************************
  284.  ;
  285.  ;                       SUBROUTINE LMUL
  286.  ;                       FLOATING POINT MULTIPLY
  287.  ;                       L PTR X B PTR TO C PTR
  288. ;
  289. LMUL:    CALL    CSIGN       ;COMPUTE SIGN OF RESULT AND STORE IT
  290.          CALL    ZCHK        ;CHECK FIRST OPERAND FOR ZERO
  291.          JZ      WZERC       ;ZERO * ANYTHING = ZERO
  292.          CALL    BCHK        ;CHECK SECOND OPERAND FOR ZERO
  293.          JZ      WZERC       ;ANYTHING * ZERO = ZERO
  294.          MOV E,L           ;SAVE L PTR
  295.          MOV L,C           ;C PTR TO L
  296.          CALL DCLR         ;CLR PRODUCT MANT LOCS
  297.          MOV L,E           ;L PTR TO L
  298.          MVI D,24          ;LOAD NUMBER ITERATIONS
  299.  KPGO:   CALL DRST         ;SHIFT L PTR RIGHT
  300.          JC  MADD          ;WILL ADD B PTR IF C[1
  301.          MOV A,L           ;INTERCHANGE
  302.          MOV L,C           ;L AND
  303.          MOV C,A           ;C PTRS
  304.  INTR:   CALL DRST         ;SHIFT PRODUCT OVER
  305.          MOV A,L           ;INTERCHANGE
  306.          MOV L,C           ;L AND C PTRS_BACK TO
  307.          MOV C,A           ;ORIGINAL>
  308.          DCR D
  309.          JNZ KPGO          ;MORE CYCLES IF Z[0
  310.          CALL    AORS        ;TEST IF RESULT IS NORMALIZED
  311.          JM      LMCP        ;IF NORMALIZED GO COMPUTE CHAR
  312.          MOV     E,L         ;SAVE LPTR IN E
  313.          MOV     L,C         ;SET L=CPTR
  314.          CALL    DLST        ;LEFT SHIFT RESULT TO NORMALIZE
  315.          MOV     L,E         ;RESTORE LPTR
  316.          CALL    CFCHE       ;OTHERWISE SET A=CHAR(H,L), E=CHAR(H,B)
  317.          ADD     E           ;CHAR(RESULT) = CHAR(H,L) + CHAR(H,B)
  318.          CPI     200Q        ;CHECK FOR SMALLEST NEGATIVE NUMBER
  319.          JZ      UFLWC       ;IF SO THEN UNDERFLOW
  320.          SUI     1           ;SUBTRACT 1 TO COMPENSATE FOR NORMALIZE
  321.          CALL    CCHK        ;CHECK CHARACTERISTIC AND STORE IT
  322.          RET                 ;RETURN
  323. ;
  324.  MADD:   MOV A,L           ;INTERCHANGE
  325.          MOV L,C           ;L AND
  326.          MOV C,A           ;C PTRS
  327.          CALL DADD         ;ACCUMULATE PRODUCT
  328.          JMP INTR
  329. ;
  330. ;   SUBROUTINE NORM
  331. ;
  332. ;       THIS SUBROUTINE WILL NORMALIZE A FLOATING POINT
  333. ;       NUMBER, PRESERVING ITS ORIGINAL SIGN.
  334. ;       WE CHECK FOR UNDERFLOW AND SET THE CONDITION
  335. ;       FLAG APPROPRIATELY.  (SEE ERROR RETURNS).
  336. ;       THER IS AN ENTRY POINT TO FLOAT A SIGNED INTEGER
  337. ;       (FLOAT) AND AN ENTRY POINT TO FLOAT AN UNSIGNED
  338. ;       INTEGER.
  339. ;
  340. ;   ENTRY POINTS:
  341. ;
  342. ;       NORM  - NORMALIZE FLOATING PT NUMBER AT (H,L)
  343. ;       FLOAT - FLOAT TRIPLE PRECISION INTEGER AT (H,L)
  344. ;               PRESERVING SIGN BIT IN (H,L)+3
  345. ;       DFXL  - FLOAT UNSIGNED (POSITIVE) TRIPLE PRECISION
  346. ;               AT (H,L)
  347. ;
  348. ;REGISTERS ON EXIT:
  349. ;
  350. ;       A = CONDITION FLAG (SEE ERROR RETURNS)
  351. ;       D,E = GARBAGE
  352. ;       B,C,H,L = SAME AS ON ENTRY
  353. ;
  354. NORM:    MOV     E,L         ;SAVE L IN E
  355. NORM1:   CALL    GCHAR       ;GET CHAR(H,L) IN A WITH SIGN EXTENDED
  356.          MOV     D,A         ;SAVE CHAR IN D
  357. FXL1:    MOV     L,E         ;RESTORE L
  358. FXL2:    CALL    ZMCHK       ;CHECK FOR ZERO MANTISSA
  359.          JZ      WZER        ;IF ZERO MANTISSA THEN ZERO RESULT
  360. REP6:    MOV     A,M         ;GET MOST SIGNIFICANT BYTE OF
  361.                              ;MANTISSA
  362.          ORA     A           ;SET FLAGS
  363.          JM      SCHAR       ;IF MOST SIGNFICANT BIT = 1 THEN
  364.                              ;NUMBER IS NORMALIZED AND WE GO TO
  365.                              ;STORE THE CHARACTERISTIC
  366.          MOV     A,D         ;OTHERWISE CHECK FOR UNDERFLOW
  367.          CPI     MINCH       ;COMPARE WITH MINIMUM CHAR
  368.          JZ      WUND        ;IF EQUAL THEN UNDERFLOW
  369.          CALL    DLST        ;SHIFT MANTISSA LEFT
  370.          DCR     D           ;DECREMENT CHARACTERSTIC
  371.          JMP     REP6        ;LOOP AN TEST NEXT BIT
  372. SCHAR:   JMP     INCR3       ;STORE THE CHARACTERISTIC USING
  373.                              ;THE SAME CODE AS THE INCREMENT
  374. ;
  375. DFXL:    MOV     E,L         ;ENTER HERE TO FLOAT UNSIGNED
  376.                              ;INTEGER
  377.                              ;FIRT SAVE L IN E
  378.          INR     L           ;MAKE (H,L) POINT TO CHAR
  379.          INR     L           ;MAKE (H,L) POINT TO CHAR
  380.          INR     L           ;MAKE (H,L) POINT TO CHAR
  381.          XRA     A           ;ZERO ACCUMULATOR
  382.          MOV     M,A         ;STORE A PLUS (+) SIGN
  383.          MOV     L,E         ;RESTORE L
  384. FLOAT:   MVI     D,24        ;ENTER HERE TO FLOAT INTEGER
  385.                              ;PRESERVING ORIGINAL SIGN IN (H,L)+3
  386.                              ;SET UP CHARACTERISTIC
  387.          JMP     FXL2        ;GO FLOAT THE NUMBER
  388. ;
  389. ;
  390. ;
  391. ;
  392. ;   SUBROUTINE ZCHK
  393. ;
  394. ;       THIS ROUTINE SETS THE ZERO FLAG IF IT DETECTS
  395. ;       A FLOATING ZERO AT (H,L).
  396. ;
  397. ;   SUBROUTINE ZMCHK
  398. ;
  399. ;       THIS ROUTINE SETS THE ZERO FLAG IF IT DETECTS A
  400. ;       ZERO MANTISSA AT (H,L)
  401. ;
  402. ZCHK:
  403. ZMCHK:   INR     L           ;SET L TO POINT LAST BYTE OF MANTISSA
  404.          INR     L           ;SET L TO POINT TO LAST BYTE OF MANTISSA
  405.          MOV     A,M         ;LOAD LEAST SIGNIFICANT BYTE
  406.          DCR     L           ;L POINTS TO MIDDLE BYTE
  407.          ORA     M           ;OR WITH LEAST SIGNFICANT BYTE
  408.          DCR     L           ;L POINTS TO MOST SIGNFICANT BYTE
  409.                              ;OF MANTISSA (ORIGINAL VALUE)
  410.          ORA     M           ;OR IN MOST SIGNFICANT BYTE
  411.          RET                 ;RETURNS WITH ZERO FLAG SET APPROPRIATELY
  412. ;
  413. ;  SUBROUTINE BCHK
  414. ;
  415. ;       THIS ROUTINE CHECKS (H,B) FOR FLOATING PT ZERO
  416. ;
  417. BCHK:    MOV     E,L         ;SAVE LPTR IN E
  418.          MOV     L,B         ;SET L=BPTR
  419.          CALL    ZCHK        ;CHECK FOR ZERO
  420.          MOV     L,E         ;RESTORE L=LPTR
  421.          RET                 ;RETURN
  422. ;
  423. ;
  424. ;                        SUBROUTINE DLST
  425.  ;                       SHIFTS DBL WORD ONE PLACE LF
  426.  DLST:   INR L
  427.          INR L             ;/***TP
  428.          MOV A,M           ;LOAD IT
  429.          ORA A             ;KILL CARRY
  430.          RAL               ;SHIFT IT LEFT
  431.          MOV M,A           ;STORE IT
  432.          DCR L
  433.          MOV A,M           ;LOAD IT
  434.          RAL               ;SHIFT IT LEFT
  435.  ;                       IF CARRY SET BY FIRST SHIFT
  436.  ;                       IT WILL BE IN LSB OF SECOND
  437.          MOV M,A
  438.          DCR L             ;/***TP EXTENSION
  439.          MOV A,M
  440.          RAL
  441.          MOV M,A           ;/***ALL DONE TP
  442.          RET
  443.  ;                       SUBROUTINE DRST
  444.  ;                       SHIFTS DOUBLE WORD ONE PLACE
  445.  ;                       TO THE RIGHT
  446.  ;                       DOES NOT AFFECT D
  447.  DRST:   MOV E,L           ;/***TP MODIFIED RIGHT SHIFT TP
  448.          MOV A,M           ;LOAD FIRST WORD
  449.          RAR               ;ROTATE IT RIGHT
  450.          MOV M,A           ;STORE IT
  451.          INR L             ;/*** TP
  452.          MOV A,M           ;LOAD SECOND WORD
  453.          RAR               ;SHIFT IT RIGHT
  454.          MOV M,A           ;STORE IT
  455.          INR L             ;/*** TP EXTENSION
  456.          MOV A,M
  457.          RAR
  458.          MOV M,A
  459.          MOV L,E           ;/***TP - ALL DONE TP
  460.          RET
  461.  ;                       SUBROUTINE DADD
  462.  ;                       ADDS TWO DOUBLE PRECISION
  463.  ;                       WORDS, C[1 IF THERE IS OVRFLW
  464.  DADD:   MOV E,L           ;SAVE BASE IN E
  465.          MOV L,B           ;BASE \3 TO L
  466.          INR L             ;BASE \4 TO L
  467.          INR L             ;/***TP
  468.          MOV A,M           ;LOAD S MANTB
  469.          MOV L,E           ;BASE TO L
  470.          INR L             ;BASE \1 TO L
  471.          INR L             ;/***TP
  472.          ADD M             ;ADD TWO MANTB]S
  473.          MOV M,A           ;STORE ANSWER
  474.          MOV L,B           ;/***TP EXTENSION
  475.          INR L
  476.          MOV A,M
  477.          MOV L,E
  478.          INR L
  479.          ADC M
  480.          MOV M,A           ;/***TP - ALL DONE
  481.          MOV L,B           ;BASE \3 TO L
  482.          MOV A,M           ;MANTA OF S TO A
  483.          MOV L,E           ;BASE TO L
  484.          ADC M             ;ADD WITH CARRY
  485.          MOV M,A           ;STORE ANSWER
  486.          RET
  487.  ;                       SUBROUTINE DCLR
  488.  ;                       CLEARS TWO SUCCESSIVE
  489.  ;                       LOCATIONS OF MEMORY
  490.  DCLR:   XRA A
  491.          MOV M,A
  492.          INR L
  493.          MOV M,A
  494.          INR L             ;/***TP EXTENSION
  495.          MOV M,A           ;/***TP ZERO 3
  496.          DCR L             ;/***TP - ALL DONE
  497.          DCR L
  498.          RET
  499.  ;                       /*****ALL NEW DSUB - SHORTER***
  500.  ;                       SUBROUTINE DSUB
  501.  ;                       DOUBLE PRECISION SUBTRACT
  502.  DSUB:   MOV E,L           ;SAVE BASE IN E
  503.          INR L             ;/***TP EXTENSION
  504.          INR L             ;/START WITH LOWS
  505.          MOV A,M           ;/GET ARG
  506.          MOV L,B           ;/NOW SET UP TO SUB
  507.          INR L
  508.          INR L
  509.          SUB M             ;/NOW DO IT
  510.          MOV L,E           ;/NOW MUST PUT IT BACK
  511.          INR L
  512.          INR L
  513.          MOV M,A           ;/PUT BACK
  514.          DCR L             ;/***TP - ALL DONE
  515.          MOV A,M           ;/GET LOW OF LOP
  516.          MOV L,B           ;/SET TO BOP
  517.          INR L             ;/SET TO BOP LOW
  518.          SBB M             ;/GET DIFF. OF LOWS
  519.          MOV L,E           ;/SAVE IN LOP LOW
  520.          INR L             ;/TO LOP LOW
  521.          MOV M,A           ;/INTO RAM
  522.          DCR L             ;/BACK UP TO LOP HIGH
  523.          MOV A,M           ;/GET LOP HIGH
  524.          MOV L,B           ;/SET TO BOP HIGH
  525.          SBB M             ;/SUB. WITH CARRY
  526.          MOV L,E           ;/SAVE IN LOP HIGH
  527.          MOV M,A           ;/INTO RAM
  528.          RET               ;/ALL DONE - MUCH SHORTER
  529. ;
  530. ;   SUBROUTINE GCHAR
  531. ;
  532. ;       THIS SUBROUTINE RETURNS THE CHARACTERISTIC OF
  533. ;       THE FLOATING POINT NUMBER POINTED TO BY (H,L)
  534. ;       IN THE A REGISTER WITH ITS SIGN EXTENDED INTO THE
  535. ;       LEFTMOST BIT.
  536. ;
  537. ;   REGISTERS ON EXIT:
  538. ;
  539. ;       A = CHARACTERISTIC OF (H,L) WITH SIGN EXTENDED
  540. ;       L = (ORIGINAL L) + 3
  541. ;       B,C,D,E,H = SAME AS ON ENTRY
  542. ;
  543. GCHAR:   INR     L           ;MAKE (H,L) POINT TO CHAR
  544.          INR     L           ;MAKE (H,L) POINT TO CHAR
  545.          INR     L           ;MAKE (H,L) POINT TO CHAR
  546.          MOV     A,M         ;SET A=CHAR + MANTISSA SIGN
  547.          ANI     177Q        ;GET RID OF MANTISSA SIGN BIT
  548.          ADI     100Q        ;PROPAGATE CHAR SIGN INTO LEFTMOST BIT
  549.          XRI     100Q        ;RESTORE ORIGINAL CHAR SIGN BIT
  550.          RET                 ;RETURN WITH (H,L) POINTING TO THE
  551.                              ;CHAR = ORIGINAL (H,L)+3
  552.                              ;SOMEONE ELSE WILL CLEAN UP
  553. ;
  554. ;
  555. ;   SUBROUTINE CFCHE
  556. ;
  557. ;       THIS SUBROUTINE RETURNS THE CHARACTERISTICS OF THE
  558. ;       FLOATING POINT NUMBERS POINTED TO BY (H,L) AND
  559. ;       (H,B) IN THE A AND E REGISTERS RESPECTIVELY,
  560. ;       WITH THEIR SIGNS EXTENDED INTO THE LEFTMOST BIT.
  561. ;
  562. ;   REGISTERS ON EXIT:
  563. ;
  564. ;       A = CHARACTERISTIC OF (H,L) WITH SIGN EXTENDED
  565. ;       E = CHARACTERISTIC OF (H,B) WITH SIGN EXTENDED
  566. ;       B,C,H,L = SAME AS ON ENTRY
  567. ;       D = A
  568. ;
  569. CFCHE:   MOV     E,L         ;SAVE LPTR IN E
  570.          MOV     L,B         ;SET L = BPTR
  571.          CALL    GCHAR       ;GET CHAR(H,B) WITH SIGN EXTENDED IN A
  572.          MOV     L,E         ;RESTORE L = LPTR
  573.          MOV     E,A         ;SET E=CHAR(H,B) WITH SIGN EXTENDED
  574.          CALL    GCHAR       ;SET A=CHAR(H,L) WITH SIGN EXTENDED
  575.          DCR     L           ;RESTORE L = LPTR
  576.          DCR     L           ;RESTORE L = LPTR
  577.          DCR     L           ;RESTORE L = LPTR
  578.          MOV     D,A         ;SET D=A=CHAR(H,L) WITH SIGN EXTENDED
  579.          RET
  580. ;
  581. ;
  582. ;   SUBROUTINE CCMP
  583. ;
  584. ;       THIS SUBROUTINE COMPARES THE CHARACTERISTICS OF
  585. ;       FLOATING POINT NUMBERS POINTED TO BY (H,L) AND (H,B).
  586. ;       THE ZERO FLIP-FLOP IS SET IF CHAR(H,L) EQUALS
  587. ;       CHAR(H,B).  IF CHAR(H,L) IS LESS THAN CHAR(H,B) THEN
  588. ;       THE CARRY BIT WILL BE SET.
  589. ;
  590. ;   REGISTERS ON EXIT:
  591. ;
  592. ;       A = CHARACTERISTIC OF (H,L) WITH SIGN EXTENDED
  593. ;       E = CHARACTERISTIC OF (H,B) WITH SIGN EXTENDED
  594. ;       D = A
  595. ;       B,C,H,L = SAME AS ON ENTRY
  596. ;
  597. CCMP:    CALL    CFCHE       ;FETCH CHARACTERTISTICS WITH SIGN EXTENDED
  598.                              ;INTO A (CHAR(H,L)) AND E (CHAR(H,B)) REGISTERS
  599.          MOV     D,A         ;SAVE CHAR (H,L)
  600.          SUB     E           ;SUBTRACT E (CHAR(H,B))
  601.          RAL                 ;ROTATE SIGN BIT INTO CARRY BIT
  602.          MOV     A,D         ;RESTORE A=CHAR(H,L)
  603.          RET                 ;RETURN
  604. ;
  605. ;   ERROR RETURNS
  606. ;
  607. ;       THE FOLLOWING CODE IS USED TO RETURN VARIOUS
  608. ;       ERROR CONDITIONS.  IN EACH CASE A FLOATING POINT
  609. ;       NUMBER IS STORED IN  THE 4 WORDS POINTED TO BY (H,L)
  610. ;       AND A FLAG IS STORED IN THE ACCUMULATOR.
  611. ;
  612. ;       CONDITION   FLAG   RESULT (+)        RESULT (-)
  613. ;
  614. ;       UNDERFLOW    377   000 000 000 100   000 000 000 300
  615. ;       OVERFLOW     177   377 377 377 077   377 377 377 277
  616. ;       INDEFINITE   077   377 377 377 077   377 377 377 277
  617. ;       NORMAL       000   XXX XXX XXX XXX   XXX XXX XXX XXX
  618. ;       NORMAL ZERO  000   000 000 000 100   (ALWAYS RETURNS +0)
  619. ;
  620. ;   ENTRY POINTS:
  621. ;
  622. ;       WUND - WRITE UNDERFLOW
  623. ;       WOVR - WRITE OVERFLOW
  624. ;       WIND - WRITE INDEFINITE
  625. ;       WZER - WRITE NORMAL ZERO
  626. ;
  627. ;###S
  628. ;WFLT     MACRO   VMANT,VCHAR,VFLAG,LABEL  ;WRITE FLOATING NUMBER
  629. ;
  630. ;         MVI     D,VCHAR     ;LOAD CHARACTERISTIC INTO D REGISTER
  631. ;         CALL    WCHAR       ;WRITE CHARACTERISTIC
  632. ;LABEL::  MVI     A,VMANT     ;LOAD MANTISSA VALUE
  633. ;                             ;WE ASSUME HERE THAT ALL BYTES OF MANTISSA
  634. ;                             ;ARE THE SAME
  635. ;         CALL    WMANT       ;WRITE THE MANTISSA
  636. ;         MVI     A,VFLAG     ;SET ACCUMULATOR TO FLAG
  637. ;         ORA     A           ;SET FLAGS PROPERLY
  638. ;         RET                 ;RETURN (WMANT RESTORED (H,L))
  639. ;         ENDM
  640. ;
  641. ;WUND:    WFLT    0,100Q,377Q,UFLW1  ;WRITE UNDERFLOW
  642. WUND:         MVI     D,100Q     ;LOAD CHARACTERISTIC INTO D REGISTER
  643.          CALL    WCHAR       ;WRITE CHARACTERISTIC
  644. UFLW1:  MVI     A,0     ;LOAD MANTISSA VALUE
  645.                              ;WE ASSUME HERE THAT ALL BYTES OF MANTISSA
  646.                              ;ARE THE SAME
  647.          CALL    WMANT       ;WRITE THE MANTISSA
  648.          MVI     A,377Q     ;SET ACCUMULATOR TO FLAG
  649.          ORA     A           ;SET FLAGS PROPERLY
  650.          RET                 ;RETURN (WMANT RESTORED (H,L))
  651. ;WOVR:    WFLT    377Q,77Q,177Q,OFLW1  ;WRITE OVERFLOW
  652. WOVR:         MVI     D,77Q     ;LOAD CHARACTERISTIC INTO D REGISTER
  653.          CALL    WCHAR       ;WRITE CHARACTERISTIC
  654. OFLW1:  MVI     A,377Q     ;LOAD MANTISSA VALUE
  655.                              ;WE ASSUME HERE THAT ALL BYTES OF MANTISSA
  656.                              ;ARE THE SAME
  657.          CALL    WMANT       ;WRITE THE MANTISSA
  658.          MVI     A,177Q     ;SET ACCUMULATOR TO FLAG
  659.          ORA     A           ;SET FLAGS PROPERLY
  660.          RET                 ;RETURN (WMANT RESTORED (H,L))
  661. ;WIND:    WFLT    377Q,77Q,77Q,INDF1  ;WRITE INDEFINITE
  662. WIND:         MVI     D,77Q     ;LOAD CHARACTERISTIC INTO D REGISTER
  663.          CALL    WCHAR       ;WRITE CHARACTERISTIC
  664. INDF1:  MVI     A,377Q     ;LOAD MANTISSA VALUE
  665.                              ;WE ASSUME HERE THAT ALL BYTES OF MANTISSA
  666.                              ;ARE THE SAME
  667.          CALL    WMANT       ;WRITE THE MANTISSA
  668.          MVI     A,77Q     ;SET ACCUMULATOR TO FLAG
  669.          ORA     A           ;SET FLAGS PROPERLY
  670.          RET                 ;RETURN (WMANT RESTORED (H,L))
  671. ;###E
  672. ;
  673. WZER:    INR     L           ;WRITE NORMAL ZERO
  674.          INR     L           ;
  675.          INR     L           ;
  676.          MVI     M,100Q      ;STORE CHARACTERISTIC FOR ZERO
  677.          XRA     A           ;ZERO ACCUMULATOR
  678.          CALL    WMANT       ;STORE ZERO MANTISSA
  679.          ORA     A           ;SET FLAGS PROPERLY
  680.          RET                 ;RETURN
  681. ;
  682. ; ROUTINE TO WRITE MANTISSA FOR ERROR RETURNS
  683. ;
  684. WMANT:   DCR     L           ;POINT LEAST SIGNIFICANT BYTE
  685.                              ;OF MANTISSA
  686.          MOV     M,A         ;STORE LSBYTE OF MANTISSA
  687.          DCR     L           ;POINT TO NEXT LEAST SIGNIFICANT BYTE
  688.                              ;OF MANTISSA
  689.          MOV     M,A         ;STORE NLSBYTE OF MANTISSA
  690.          DCR     L           ;POINT TO MOST SIGNIFICANT BYTE
  691.                              ;OF MANTISSA
  692.          MOV     M,A         ;STORE MSBYTE OF MANTISSA
  693.          RET                 ;RETURN (H,L) POINTS TO BEGINNING OF
  694.                              ;FLOATING POINT RESULT
  695. ;
  696. ; ROUTINE TO WRITE CHARACTERTIC FOR ERROR RETURNS
  697. ; NOTE:  WE PRESERVE ORIGINAL MANTISSA SIGN
  698. ; ON ENTRY D CONTAINS NEW CHARACTERTISTIC TO BE STORED.
  699. ;
  700. WCHAR:   INR     L           ;SET (H,L) TO POINT TO CHARACTERISTIC
  701.          INR     L           ;PART OF ABOVE
  702.          INR     L           ;PART OF ABOVE
  703.          MOV     A,M         ;LOAD CHARACTERISTIC A
  704.                              ;AND MANTISSA SIGN
  705.          ANI     200Q        ;JUST KEEP MANTISSA SIGN
  706.          ORA     D           ;OR IN NEW CHARACTERISTIC
  707.          MOV     M,A         ;STORE IT BACK
  708.          RET                 ;RETURN WITH (H,L) POINT TO CHARACTERISTIC
  709.                              ;OF RESULT
  710.                              ;SOMEONE ELSE WILL FIX UP (H,L)
  711. ;
  712. ;   SUBROUTINE INDFC
  713. ;
  714. ;       THIS ROUTINE WRITES A FLOATING INDEFINITE, SETS
  715. ;       THIS WRITES WRITES A FLOATING POINT INDEFINITE
  716. ;       AT (H,C), SETS THE CONDITION FLAG AND RETURNS
  717. ;
  718. ;
  719. INDFC:   MOV     E,L         ;SAVE LPTR IN E
  720.          MOV     L,C         ;SET L=CPTR SO (H,L)-ADDR OF RESULT
  721.          CALL    WIND        ;WRITE INDEFINITE
  722.          MOV     L,E         ;RESTORE L=LPTR
  723.          RET                 ;RETURN
  724. ;
  725. ;
  726. ;   SUBROUTINE WZERC
  727. ;
  728. ;       THIS ROUTINE WRITES A NORMAL FLAOTING POINT ZERO
  729. ;       AT (H,C), SETS THE CONDITION FLAG AND RETURNS
  730. ;
  731. WZERC:   MOV     E,L         ;SAVE LPTR IN E
  732.          MOV     L,C         ;SETL=CPTR SO (H,L)=ADDR OF RESULT
  733.          CALL    WZER        ;WRITE NORMAL ZERO
  734.          MOV     L,E         ;RESTORE L=LPTR
  735.          RET                 ;RETURN
  736. ;
  737. ;   SUBROUTINE INCR
  738. ;
  739. ;       THIS SUBROUTINE INCREMENTS THE CHARACTERISTIC
  740. ;       OF THE FLOATING POINT NUMBER POINTED TO BY (H,L).
  741. ;       WE TEST FOR OVERFLOW AND SET APPROPRIATE FLAG.
  742. ;       (SEE ERRROR RETURNS).
  743. ;
  744. ;   REGISTERS ON EXIT:
  745. ;
  746. ;        A = CONDITION FLAG (SEE ERROR RETURNS)
  747. ;        D = CLOBBERED
  748. ;        B,C,H,L = SAME AS ON ENTRY
  749. ;
  750. INCR:    CALL    GCHAR       ;GET CHAR WITH SIGN EXTENDED
  751.          CPI     MAXCH       ;COMPARE WITH MAX CHAR PERMITTED
  752.          JZ      OFLW1       ;INCREMENT WOULD CAUSE OVERFLOW
  753.          MOV D,A           ;/SAVE IT IN D
  754.          INR D             ;/INCREMENT IT
  755.          JMP     INCR2       ;JUMP AROUND ALTERNATE ENTRY POINT
  756. INCR3:   INR     L           ;COME HERE TO STORE CHARACTERISTIC
  757.          INR     L           ;POINT (H,L) TO CHAR
  758.          INR     L           ;POINT (H,L) TO CHAR
  759. INCR2:   MVI A,177Q
  760.          ANA D             ;/KILL SIGN BIT
  761.          MOV D,A           ;/BACK TO D
  762.          MOV A,M           ;/NOW SIGN IT
  763.          ANI 200Q          ;/GET MANTISSA SIGN
  764.          ORA D             ;/PUT TOGETHER
  765.          MOV M,A           ;/STORE IT BACK
  766.          DCR L             ;/NOW BACK TO BASE
  767.          DCR L             ;/***TP
  768.          DCR L
  769. SCCFG:    XRA    A                ;SET SUCCESS FLAG
  770.          RET
  771. ;
  772. ;   SUBROUTINE DECR
  773. ;
  774. ;       THIS SUBROUTINE DECREMENTS THE CHARACTERISTIC
  775. ;       OF THE FLOATING POINT NUMBER POINTED TO BY (H,L).
  776. ;       WE TEST FOR UNDERFLOW AND SET APPROPRIATE FLAG.
  777. ;       (SEE ERRROR RETURNS).
  778. ;
  779. ;   REGISTERS ON EXIT:
  780. ;
  781. ;        A = CONDITION FLAG (SEE ERROR RETURNS)
  782. ;        D = CLOBBERED
  783. ;        B,C,H,L = SAME AS ON ENTRY
  784. ;
  785. DECR:    CALL    GCHAR       ;GET CHAR WITH SIGN EXTENDED
  786.          CPI     MINCH       ;COMPARE WITH MIN CHAR PERMITTED
  787.          JZ      UFLW1       ;DECREMENT WOULD CAUSE UNDERFLOW
  788.          MOV     D,A         ;SAVE CHARACTERSTIC IN D
  789.          DCR     D           ;DECREMENT CHARACTERISTIC
  790.          JMP     INCR2       ;GO STORE IT BACK
  791. ;
  792.  ;                       SUBROUTINE AORS
  793.  ;                       RETURN S[1 IF BASE \6
  794.  ;                       HAS A 1 IN MSB
  795.  AORS:   MOV E,L           ;SAVE BASE
  796.          MOV L,C           ;BASE \6 TO L
  797.          MOV A,M           ;LOAD IT
  798.          ORA A             ;SET FLAGS
  799.          MOV L,E           ;RESTORE BASE
  800.          RET
  801.  ;                       SUBROUTINE TSTR
  802.  ;                       CHECKS C PTR TO SEE IF
  803.  ;                       NLSB[1
  804.  ;                       RETURNS Z[1 IF NOT
  805.  ;                       DESTROYS E,D
  806.  TSTR:   MOV E,L           ;SAVE BASE
  807.          MOV L,C           ;C PTR TO L
  808.          MVI D,2           ;MASK TO D
  809.          MOV A,M           ;LOAD VALUE
  810.          MOV L,E           ;RESTORE BASE
  811.          ANA D             ;AND VALUE WITH MASK
  812.          RET
  813.  ;                       SUBROUTINE ACPR
  814.  ;                       STORES A IN LOCATION OF CPTR
  815.  ;                       LPTR IN E
  816.  ACPR:   MOV E,L           ;SAVE LPTR
  817.          MOV L,C           ;CPTR TO L
  818.          MOV M,A           ;STORE A
  819.          MOV L,E           ;RESTORE BASE
  820.          RET
  821.  ;                       SUBROUTINE DCMP
  822.  ;                       COMPARES TWO DOUBLE LENGTH
  823.  ;                       WORDS
  824.  DCMP:   MOV A,M           ;NUM MANTA TO A
  825.          MOV E,L           ;SAVE BASE IN E
  826.          MOV L,B           ;BASE\3 TO L
  827.          CMP M             ;COMPARE WITH DEN MANTA
  828.          MOV L,E           ;RETURN BASE TO L
  829.          RNZ               ;RETURN IF NOT THE SAME
  830.          INR L             ;L TO NUM MANTB
  831.          MOV A,M           ;LOAD IT
  832.          MOV L,B           ;DEN MANTB ADD TO L
  833.          INR L             ;BASE\ 4 TO L
  834.          CMP M
  835.          MOV L,E
  836.          RNZ               ;/***TP EXTENSION
  837.          INR L             ;/NOW CHECK BYTE 3
  838.          INR L
  839.          MOV A,M           ;/GET FOR COMPARE
  840.          MOV L,B
  841.          INR L
  842.          INR L             ;/BYTE 3 NOW
  843.          CMP M             ;/COMPARE
  844.          MOV L,E           ;/***TP - ALL DONE
  845.          RET
  846.  ;                       SUBROUTINE DIVC
  847.  ;                       PERFORMS ONE CYCLE OF DOUBLE
  848.  ;                       PRECISION FLOATING PT DIVIDE
  849.  ;                       ENTER AT ENT1 ON FIRST CYCLE
  850.  ;                       ENTER AT ENT2 ALL THEREAFTER
  851.  ENT2:   CALL DLST         ;SHIFT MOVING DIVIDEND
  852.          JC  OVER          ;IF CARRY[1,NUM.GT.D
  853.  ENT1:   CALL DCMP         ;COMPARE NUM WITH DEN
  854.          JNC OVER          ;IF CARRY NOT SET,NUM.GE.DEN
  855.          RET
  856.  OVER:   CALL DSUB         ;CALL DOUBLE SUBTRACT
  857.          MOV E,L           ;SAVE BASE IN E
  858.          MOV L,C           ;BASE \6 TO L
  859.          INR L             ;BASE \7 TO L
  860.          INR L             ;/***TP
  861.          MOV A,M
  862.          ADI 1             ;ADD 1
  863.          MOV M,A           ;PUT IT BACK
  864.          MOV L,E           ;RESTORE BASE TO L
  865.          RET
  866.  ;                       SUBROUTINE LXFR
  867.  ;                       MOVES CPTR TO EPTR
  868.  ;                       MOVES 3 WORDS IF ENTER AT LXFR
  869.  LXFR:   MVI D,4           ;/MOVE 4 WORDS
  870.  REP5:   MOV L,C           ;CPTR TO L
  871.          MOV A,M           ;_CPTR> TO A
  872.          MOV L,E           ;EPTR TO L
  873.          MOV M,A
  874.          INR C             ;/INCREMENT C
  875.          INR E             ;/INCREMENT E TO NEXT
  876.          DCR D             ;/TEST FOR DONE
  877.          JNZ REP5          ;/GO FOR FOR TILL D=0
  878.          MOV A,E           ;/NOW RESET C AND E
  879.          SUI 4             ;/RESET BACK BY 4
  880.          MOV E,A           ;/PUT BACK IN E
  881.          MOV A,C           ;/NOW RESET C
  882.          SUI 4             ;/BY 4
  883.          MOV C,A           ;/BACK TO C
  884.          RET               ;/DONE
  885. ;
  886. ;   SUBROUTINE LDCP
  887. ;
  888. ;       THIS SUBROUTINE COMPUTES THE CHARACTERISTIC
  889. ;       FOR THE FLOATING DIVIDE ROUTINE
  890. ;
  891. ;   REGISTERS ON EXIT:
  892. ;
  893. ;       A = CONDITION FLAG (SEE ERROR RETURNS)
  894. ;       D,E = GARBAGE
  895. ;       B,C,H,L = SAME AS ON ENTRY
  896. ;
  897. ;   REGISTERS ON ENTRY:
  898. ;
  899. ;       (H,B) = ADDRESS OFF DIVISOR
  900. ;       (H,C) = ADDRESS OF QUOTIENT
  901. ;       (H,L) = ADDRESS OF DIVIDEND
  902. ;
  903. LDCP:    CALL    CFCHE       ;SET E=CHAR(H,B), A=CHAR(H,L)
  904.          SUB     E           ;SUBTRACT TO GET NEW CHARACTERISTIC
  905.          JMP     CCHK        ;GO CHECK FOR OVER/UNDERFLOW
  906.                              ;AND STORE CHARACTERTISTIC
  907. ;
  908. ;
  909. ;   SUBROUTINE LMCP
  910. ;
  911. ;       THIS SUBROUTINE COMPUTES THE CHARACTERISTIC
  912. ;       FOR THE FLOATING MULTIPLY ROUTINE.
  913. ;
  914. ;   REGISTERS ON EXIT:
  915. ;
  916. ;       A = CONDITION FLAG (SEE ERROR RETURNS)
  917. ;       D,E = GARBAGE
  918. ;       B,C,H,L = SAME AS ON ENTRY
  919. ;
  920. ;   REGISTERS ON ENTRY:
  921. ;
  922. ;       (H,B) = ADDRESS OFF MULTIPLICAND
  923. ;       (H,C) = ADDRESS OF PRODUCT
  924. ;       (H,L) = ADDRESS OF MULTIPLIER
  925. ;
  926. LMCP:    CALL    CFCHE       ;SET E=CHAR(H,B), A=CHAR(H,L)
  927.          ADD     E           ;ADD TO GET NEW CHARACTERISTIC
  928.                              ;NOW FALL INTO THE ROUTINE
  929.                              ;WHICH CHECKS FOR OVER/UNDERFLOW
  930.                              ;AND STORE CHARACTERTISTIC
  931. ;
  932. ;
  933. ;   SBUROUTINE CCHK
  934. ;
  935. ;       THIS SUBROUTINE CHECKS A CHARACTERISTIC IN
  936. ;       THE ACCUMULATOR FOR OVERFLOW OR UNDERFLOW.
  937. ;       IT THEN STORES THE CHARACTERISTIC, PRESERVING
  938. ;       THE PREVIOUSLY COMPUTED MANTISSA SIGN.
  939. ;
  940. ;  REGISTERS ON ENTRY:
  941. ;
  942. ;       (H,L) = ADDRESS OF ONE OPERAND
  943. ;       (H,B) = ADDRESS OF OTHER OPERAND
  944. ;       (H,C) = ADDRESS OF RESULT
  945. ;       A     = NEW CHARACTERISTIC OF  RESULT
  946. ;
  947. ;   REGISTERS ON EXIT:
  948. ;
  949. ;       A = CONDITION FLAG (SEE ERROR RETURNS)
  950. ;       D,E = GARBAGE
  951. ;       B,C,H,L = SAME AS ON ENTRY
  952. ;
  953. CCHK:                        ;ENTER HERE TO CHECK CHARACTERISTIC
  954.          CPI     100Q        ;CHECK FOR 0 TO +63
  955.          JC      STORC       ;JUMP IF OKAY
  956.          CPI     200Q        ;CHECK FOR +64 TO +127
  957.          JC      OFLWC       ;JUMP IF OVERFLOW
  958.          CPI     300Q        ;CHECK FOR -128 TO -65
  959.          JC      UFLWC       ;JUMP IF UNDERFLOW
  960. STORC:   MOV     E,L         ;SAVE L IN E
  961.          MOV     L,C         ;LET L POINT TO RESULT
  962.          MOV     D,A         ;SAVE CHARACTERISTIC IN D
  963.          CALL    INCR3       ;STORE CHARACTERISTIC
  964.          MOV     L,E         ;RESTORE L
  965.          RET                 ;RETURN
  966. ;
  967. ;   SUBROUTINE OFLWC
  968. ;
  969. ;       THIS ROUTINE WRITES A FLOATING POINT OVERFLOW AT (H,C)
  970. ;       SETS THE CONDITION FLAG, AND RETURNS.
  971. ;
  972. OFLWC:   MOV     E,L         ;SAVE L IN E
  973.          MOV     L,C         ;SET L=CPTR, SO (H,L)=ADDR OF RESULT
  974.          CALL    WOVR        ;WRITE OUT OVERFLOW
  975.          MOV     L,E         ;RESTORE L
  976.          RET                 ;RETURN
  977. ;
  978. ;   SUBROUTINE UFLWC
  979. ;
  980. ;       THIS ROUTINE WRITES A FLOATING POINT UNDERFLOW AT (H,C)
  981. ;       SETS THE CONDITION FLAG, AND RETURNS.
  982. ;
  983. UFLWC:   MOV     E,L         ;SAVE L IN E
  984.          MOV     L,C         ;SET L=CPTR, SO (H,L)=ADDR OF RESULT
  985.          CALL    WUND        ;WRITE OUT UNDEFLOW
  986.          MOV     L,E         ;RESTORE L
  987.          RET                 ;RETURN
  988. ;
  989. ;
  990. ;   SUBROUTINE CSIGN
  991. ;
  992. ;       THIS SUBROUTINE COMPUTES AND STORE THE MANTISSA
  993. ;       SIGN FOR THE FLOATING MULTIPLY AND DIVIDE ROUTINES
  994. ;
  995. ;   REGISTERS ON ENTRY:
  996. ;
  997. ;       (H,L) = ADDRESS OF ONE OPERAND
  998. ;       (H,B) = ADDRESS OF OTHER OPERAND
  999. ;       (H,C) = ADDRESS OF RESULT
  1000. ;
  1001. ;   REGISTERS ON EXIT:
  1002. ;
  1003. ;       A,D,E = GARBAGE
  1004. ;       B,C,H,L = SAME AS ON ENTRY
  1005. ;
  1006. ;
  1007. CSIGN:   CALL    MSFH        ;SET A=SIGN(H,L), E=SIGN(H,B)
  1008.          XRA     E           ;EXCLUSIVE OR SIGNS TO GET NEW SIGN
  1009.          CALL    CSTR        ;STORE SIGN INTO RESULT
  1010.          RET                 ;RETURN
  1011. ;
  1012. ;
  1013.  ;                       SUBROUTINE CSTR
  1014.  ;                       STORES VALUE IN A IN
  1015.  ;                       CPTR\2
  1016.  ;                       PUTS LPTR IN E
  1017.  CSTR:   MOV E,L           ;SAVE LPTR IN E
  1018.          MOV L,C           ;CPTR TO L
  1019.          INR L             ;CPTR\2
  1020.          INR L             ;TO L
  1021.          INR L             ;/***TP
  1022.          MOV M,A           ;STORE ANSWER
  1023.          MOV L,E           ;LPTR BACK TO L
  1024.          RET
  1025. ;
  1026. ;   SUBROUTINE MSFH
  1027. ;
  1028. ;       THIS SUBROUTINE FETCHES THE SIGNS OF THE MANTISSAS
  1029. ;       OF THE FLOATING POINT NUMBERS POINTED TO BY (H,L)
  1030. ;       AND (H,B) INTO THE A AND E REGISTERS RESPECTIVELY.
  1031. ;
  1032. ;   REGISTERS ON EXIT:
  1033. ;
  1034. ;       A = SIGN  OF MANTISSA OF (H,L)
  1035. ;       E = SIGN OF MANTISSA OF (H,B)
  1036. ;       B,C,D,H,L = SAME AS ON ENTRY
  1037. ;
  1038.  MSFH:   MOV E,L           ;SAVE LPTR
  1039.          MOV L,B           ;BPTR TO L
  1040.          INR L             ;BPTR\2
  1041.          INR L             ;/***TP
  1042.          INR L             ;TO L
  1043.          MOV A,M           ;_BPTR\2>TO A
  1044.          ANI 128           ;SAVE MANT SIGN
  1045.          MOV L,E           ;LPTR BACK TO L
  1046.          MOV E,A           ;STORE BPTR MANT SIGN
  1047.          INR L             ;LPTR\2
  1048.          INR L             ;/***TP
  1049.          INR L             ;TO L
  1050.          MOV A,M           ;_LPTR\2>TO A
  1051.          ANI 128           ;SAVE LPTR MANT SIGN
  1052.          DCR L             ;LPTR BACK
  1053.          DCR L             ;TO L
  1054.          DCR L             ;/***TP
  1055.          RET
  1056.  ;                       SUBROUTINE BCTL
  1057.  ;                       MOVES BPTR CHAR TO LPTR CHAR
  1058.  ;                       DESTROYSE
  1059.  BCTL:   MOV E,L           ;LPTR TO E
  1060.          MOV L,B           ;BPTR TO L
  1061.          INR L             ;BPTR \2
  1062.          INR L             ;/***TP
  1063.          INR L             ;TO L
  1064.          MOV A,M           ;BPTR CHAR TO A
  1065.          MOV L,E           ;LPTR TO L
  1066.          INR L             ;LPTR \2
  1067.          INR L             ;TO L
  1068.          INR L             ;/***TP
  1069.          MOV M,A           ;STORE BPTR CHAR IN LPTR CHAR
  1070.          MOV L,E           ;LPTR TO L
  1071.          RET
  1072.  ;
  1073.  ;
  1074.  ;******************************************************
  1075.  ;       //// 5 DIGIT FLOATING PT. OUTPUT
  1076.  ;******************************************************
  1077.  ;
  1078.  ;
  1079.  ;
  1080.  ;
  1081.  ;       *******ROUTINE TO CONVERT FLOATING PT.
  1082.  ;       ***NUMBERS TO ASCII AND OUTPUT THEM VIA A SUBROUTINE
  1083.  ;       ***CALLED OUTR  -  NOTE: THIS IS CURRENTLY SET
  1084.  ;       ***TO ODT'S OUTPUT ROUTINE
  1085.  ;
  1086.  ;
  1087. CVRT:     CALL   ZCHK             ;CHECK FOR NEW ZERO
  1088.           JNZ    NNZRO            ;NOT ZERO
  1089.           INR    C                ;IT WAS, OFFSET C BY 2
  1090.           INR    C
  1091.           MOV    L,C
  1092.           CALL   WZER             ;WRITE ZERO
  1093.           INR    L                ;PNT TO DECIMAL EXPONENT
  1094.           INR    L
  1095.           INR    L
  1096.           INR    L
  1097.           XRA    A                ;SET IT TO ZERO
  1098.           MOV    M,A
  1099.           JMP    MDSKP            ;OUTPUT IT
  1100. NNZRO:    MOV    D,M              ;/GET THE NUMBER TO CONVERT
  1101.          INR L
  1102.          MOV B,M
  1103.          INR L
  1104.          MOV E,M
  1105.          INR L             ;/4 WORD***TP
  1106.          MOV A,M           ;/***TP
  1107.          INR C             ;/OFFSET SCRATCH POINTER BY 2
  1108.          INR C
  1109.          MOV L,C           ;/L NOT NEEDED ANY MORE
  1110.          MOV M,D           ;/SAVE NUMBER IN SCRATCH
  1111.          INR L
  1112.          MOV M,B
  1113.          INR L
  1114.          MOV M,E           ;/***TP
  1115.          INR L             ;/***TP
  1116.          MOV B,A           ;/SAVE COPY OF CHAR & SIGN
  1117.          ANI 177Q          ;GET ONLY CHAR.
  1118.          MOV M,A           ;/SAVE ABS(NUMBER)
  1119.          CPI 100Q          ;CK FOR ZERO
  1120.          JZ  NZRO
  1121.          SUI 1             ;/GET SIGN OF DEC. EXP
  1122.          ANI 100Q          ;/GET SIGN OF CHAR.
  1123.  NZRO:   RLC               ;MOVE IT TO SIGN POSITION
  1124.          INR L             ;/MOVE TO DECIMAL EXP.
  1125.          MOV M,A           ;/SAVE SIGN OF EXP.
  1126.          MOV A,B           ;/GET MANT. SIGH BACK
  1127.          CALL SIGN         ;/OUTPUT SIGN
  1128.          MVI L,(TEN5 AND 377Q)  ;/TRY MULT. OR DIV. BY 100000 FIRST
  1129.          CALL COPT         ;/MAKE A COPY IN RAM
  1130.  TST8:   CALL GCHR         ;/GET CHAR. OF NUMBER
  1131.          MOV B,A           ;/SAVE A COPY
  1132.          ANI 100Q          ;/GET ABSOLUTE VALUE OF CHAR
  1133.          MOV A,B           ;/INCASE PLUS
  1134.          JZ  GOTV          ;/ALREADY PLUS
  1135.          MVI A,200Q        ;/MAKE MINUS INTO PLUS
  1136.          SUB B             ;/PLUS=200B-CHAR
  1137.  GOTV:   CPI 22Q           ;/TEST FOR USE OF 100000
  1138.          JM  TRY1          ;/WONT GO
  1139.          CALL MORD         ;/WILL GO SO DO IT
  1140.          ADI 5             ;/INCREMENT DEC. EXPONENT BY 5
  1141.          MOV M,A           ;/UPDATE MEM
  1142.          JMP TST8          ;/GO TRY AGAIN
  1143. TRY1:    MVI L,(TEN AND 377Q)  ;/NOW USE JUST TEN
  1144.          CALL COPT         ;/PUT IT IN RAM
  1145.  TST1:   CALL GCHR         ;/GET CHARACTERISTIC
  1146.          CPI 1             ;/MUST GET IN RANGE 1 TO 6
  1147.          JP  OK1           ;/ATLEAST ITS 1 OR BIGGER
  1148.  MDGN:   CALL MORD         ;/MUST MUL OF DIV BY 10
  1149.          ADI 1             ;/INCREMENT DECIMAL EXP.
  1150.          MOV M,A           ;/UPDATE MEM
  1151.          JMP TST1          ;/NOW TRY AGAIN
  1152.  OK1:    CPI 7             ;/TEST FOR LESS THAN 7
  1153.          JP  MDGN          ;/NOPE - 7 OR GREATER
  1154. MDSKP:    MOV    L,C              ;/SET UP DIGIT COUNT
  1155.          DCR L
  1156.          DCR L             ;/IN 1ST WORD OF SCRATCH
  1157.          MVI M,5           ;/5 DIGITS
  1158.          MOV E,A           ;/SAVE CHAR. AS LEFT SHIFT COUNT
  1159.          CALL LSFT         ;/SHIFT LEFT PROPER NUMBER
  1160.          CPI 12Q           ;/TEST FOR 2 DIGITS HERE
  1161.          JP  TWOD          ;/JMP IF 2 DIGITS TO OUTPUT
  1162.          CALL DIGO         ;/OUTPUT FIRST DIGIT
  1163.  POPD:   CALL MULTT        ;/MULTIPLY THE NUMBER BY 10
  1164.  INPOP:  CALL DIGO         ;/PRINT DIGIT IN A
  1165.          JNZ POPD          ;/MORE DIGITS?
  1166.          MVI A,305Q        ;/NO SO PRINT E
  1167.          CALL OUTR         ;/BASIC CALL TO OUTPUT
  1168.          CALL GETEX        ;/GET DECIMAL EXP
  1169.          MOV B,A           ;/SAVE A COPY
  1170.          CALL SIGN         ;/OUTPUT SIGN
  1171.          MOV A,B           ;/GET EXP BACK
  1172.          ANI 77Q           ;/GET GOOD BITS
  1173.          CALL CTWO         ;/GO CONVERT 2 DIGITS
  1174.  DIGO:   ADI 260Q          ;/MAKE A INTO ASCII
  1175.          CALL OUTR         ;/OUTPUT DIGIT
  1176.          MOV L,C           ;/GET DIGIT COUNT
  1177.          DCR L             ;/BACK UP TO DIGIT COUNT
  1178.          DCR L
  1179.          MOV A,M           ;/TEST FOR DECIMAL PT
  1180.          CPI 5             ;/PRINT . AFTER 1ST DIGIT
  1181.          MVI A,256Q        ;/JUST IN CASE
  1182.          CZ  OUTR          ;/OUTPUT . IF 1ST DIGIT
  1183.          MOV D,M           ;/NOW DECREMENT DIGIT COUNT
  1184.          DCR D
  1185.          MOV M,D           ;/UPDATE MEM AND LEAVE FLOPS SET
  1186.          RET               ;/SERVES AS TERM FOR DIGO & CVRT
  1187.  MULTT:  MVI E,1           ;/MULT. BY 10 (START WITH X2)
  1188.          CALL LSFT         ;/LEFT SHIFT 1 = X2
  1189.          MOV L,C           ;/SAVE X2 IN "RESULT"
  1190.          DCR L             ;/SET TO TOP OF NUMBER
  1191.          MOV A,C           ;/SET C TO RESULT
  1192.          ADI 11Q
  1193.          MOV C,A           ;/NOW C SET RIGHT
  1194.          MOV A,H           ;/SHOW RAM TO RAM TRANSFER
  1195.          CALL COPY         ;/SAVE X2 FINALLY
  1196.          MOV A,C           ;/MUST RESET C
  1197.          SUI 11Q           ;/BACK TO NORMAL
  1198.          MOV C,A
  1199.          MVI E,2           ;/NOW GET (X2)X4=X8
  1200.          MOV L,C           ;/BUT MUST SAVE OVERFLOW
  1201.          DCR L
  1202.          CALL TLP2         ;/GET X8
  1203.          MOV L,C           ;/SET UP TO CALL DADD
  1204.          MOV A,C           ;/SET B TO X2
  1205.          ADI 12Q           ;/TO X2
  1206.          MOV B,A
  1207.          CALL DADD         ;/ADD TWO LOW WORDS
  1208.          DCR L             ;/BACK UP TO OVERFLOW
  1209.          MOV A,M           ;/GET IT
  1210.          MOV L,B           ;/NOW SET TO X2 OVERFLOW
  1211.          DCR L             ;/ITS AT B-1
  1212.          ADC M             ;/ADD WITH CARRY - CARRY WAS PRESERVED
  1213.          RET               ;/ALL DONE, RETURN OVERFLOW IN A
  1214.  LSFT:   MOV L,C           ;/SET PTR FOR LEFT SHIFT OF NUMBER
  1215.          DCR L             ;/BACK UP TO OVERFLOW
  1216.          XRA A             ;/OVERFLOW=0 1ST TIME
  1217.  TLOOP:  MOV M,A           ;/SAVE OVERFLOW
  1218.  TLP2:   DCR E             ;/TEST FOR DONE
  1219.          RM                ;/DONE WHEN E MINUS
  1220.          INR L             ;/MOVE TO LOW
  1221.          INR L
  1222.          INR L             ;/***TP EXTENSION
  1223.          MOV A,M           ;/SHIFT LEFT 4 BYTES
  1224.          RAL
  1225.          MOV M,A           ;/PUT BACK
  1226.          DCR L             ;/***TP - ALL DONE
  1227.          MOV A,M           ;/GET LOW
  1228.          RAL               ;/SHIFT LEFT 1
  1229.          MOV M,A           ;/RESTORE IT
  1230.          DCR L             ;/BACK UP TO HIGH
  1231.          MOV A,M           ;/GET HIGH
  1232.          RAL               ;/SHIFT IT LEFT WITH CARRY
  1233.          MOV M,A           ;/PUT IT BACK
  1234.          DCR L             ;/BACK UP TO OVERFLOW
  1235.          MOV A,M           ;/GET OVERFLOW
  1236.          RAL               ;/SHIFT IT LEFT
  1237.          JMP TLOOP         ;/GO FOR MORE
  1238.  SIGN:   ANI 200Q          ;/GET SIGN BIT
  1239.          MVI A,240Q        ;/SPACE INSTEAD OF PLUS
  1240.          JZ  PLSV          ;/TEST FOR +
  1241.          MVI A,255Q        ;/NEGATIVE
  1242.  PLSV:   CALL OUTR         ;/OUTPUT SIGN
  1243.          RET
  1244.  GCHR:   MOV L,C           ;/GET CHARCTERISTIC
  1245.  GETA:   INR L             ;/MOVE TO IT
  1246.          INR L
  1247.          INR L             ;/***TP
  1248.          MOV A,M           ;/FETCH INTO A
  1249.          RET               ;/DONE
  1250.  MORD:   CALL GETEX        ;/MUL OR DIV DEPENDING ON EXP
  1251.          MOV E,A           ;/SAVE DECIMAL EXP
  1252.          MOV B,L           ;/SET UP TO MULT OR DIV
  1253.          INR B             ;/NOW BOP POINTER SET
  1254.          MOV L,C           ;/L POINTS TO NUMBER TO CONVERT
  1255.          MOV A,C           ;/POINT C AT "RESULT" AREA
  1256.          ADI 11Q           ;/IN SCRATCH
  1257.          MOV C,A           ;/NOW C SET RIGHT
  1258.          MOV A,E           ;/NOW TEST FOR MUL
  1259.          ANI 200Q          ;/TEST NEGATIVE DEC. EXP.
  1260.          JZ  DIVIT         ;/IF EXP IS + THEN DIVIDE
  1261.          CALL LMUL         ;/MULT.
  1262.  FINUP:  MOV A,C           ;/SAVE LOC. OF RESULT
  1263.          MOV C,L           ;/C=LOC OF NUMBER (IT WAS DESTROYED)
  1264.          MOV L,A           ;/SET L TO LOC. OF RESUTL
  1265.          MOV A,H           ;/SHOW RAM TO RAM TRANSFER
  1266.          CALL COPY         ;/MOVE RESULT TO NUMBER
  1267.  GETEX:  MOV L,C           ;/NOW GET DECIMAL EXP
  1268.          INR L
  1269.          JMP GETA          ;/USE PART OF GCHR
  1270.  DIVIT:  CALL LDIV         ;/DIVIDE
  1271.          JMP FINUP
  1272.  TWOD:   CALL CTWO         ;/CONVERT TO 2 DIGITS
  1273.          MOV B,A           ;/SAVE ONES DIGIT
  1274.          CALL GETEX        ;/GET DECIMAL EXP
  1275.          MOV E,A           ;/SAVE A COPY
  1276.          ANI 200Q          ;/TEST FOR NEGATIVE
  1277.          JZ  ADD1          ;/BUMP EXP BY 1 SINCE 2 DIGITS
  1278.          DCR E             ;/DECREMENT NEGATIVE EXP SINCE 2 DIGITS
  1279.  FINIT:  MOV M,E           ;/RESTORE EXP WITH NEW VALUE
  1280.          MOV A,B           ;/NOW DO 2ND DIGIT
  1281.          JMP INPOP         ;/GO OUT 2ND AND REST FO DIGITS
  1282.  ADD1:   INR E             ;/COMPENSATE FOR 2 DIGITS
  1283.          JMP FINIT
  1284.  CTWO:   MVI E,377Q        ;/CONVERT 2 DIGIT BIN TO BCD
  1285.  LOOP:   INR E             ;/ADD UP TENS DIGIT
  1286.          SUI 12Q           ;/SUBTRACT 10
  1287.          JP  LOOP          ;/TIIL NEGATIVE RESULT
  1288.          ADI 12Q           ;/RESTORE ONES DIGIT
  1289.          MOV B,A           ;/SAVE ONES DIGIT
  1290.          MOV A,E           ;/GET TENS DIGIT
  1291.          CALL DIGO         ;/OUTPUT IT
  1292.          MOV A,B           ;/SET A TO 2ND DIGIT
  1293.          RET
  1294.  COPT:   MOV A,C           ;/COPY FROM 10N TO RAM
  1295.          ADI 5
  1296.          MOV C,A           ;/SET C TO PLACE TO PUT
  1297.          MVI A,(TEN5/256)
  1298.          CALL COPY         ;/COPY IT
  1299.          MOV A,C           ;/NOW RESET C
  1300.          SUI 5
  1301.          MOV C,A           ;/ITS RESET
  1302.          RET
  1303.  COPY:   MOV B,H           ;/SAVE RAM H
  1304.          MOV H,A           ;/SET TO SOURCE H
  1305.          MOV A,M           ;/GET 4 WORDS INTO THE REGS.
  1306.          INR L
  1307.          MOV D,M
  1308.          INR L
  1309.          MOV E,M
  1310.          INR L
  1311.          MOV L,M           ;/LAST ONE ERASES L
  1312.          MOV H,B           ;/SET TO DESTINATION RAM
  1313.          MOV B,L           ;/SAVE 4TH WORD IN B
  1314.          MOV L,C           ;/SET TO DESTINATION
  1315.          MOV M,A           ;/SAVE FIRST WORD
  1316.          INR L
  1317.          MOV A,M           ;/SAVE THIS WORD IN A (INPUT SAVES C HERE
  1318.          MOV M,D           ;/NOW PUT 2ND WORD
  1319.          INR L
  1320.          MOV M,E
  1321.          INR L
  1322.          MOV M,B           ;/ALL 4  COPIED NOW
  1323.          RET               ;/ALL DONE
  1324.  ;
  1325.  ;
  1326.  TEN5:  DB 303Q,120Q,0Q,21Q  ;/303240(8) = 100000.
  1327.  TEN:   DB 240Q,0Q,0Q,4Q  ;/12(8) = 10
  1328.  ;
  1329.  ;       SCRATCH MAP FOR I/O CONVERSION ROUTINES
  1330.  ;
  1331.  ;       RELATIVE TO (C+2)USE
  1332.  ;       C-2             DIGIT COUNT
  1333.  ;       C-1             OVERFLOW
  1334.  ;       C               HIGH NUMBER - MANTISSA
  1335.  ;       C+1             LOW NUMBER
  1336.  ;       C+2             CHARACTERISTIC
  1337.  ;       C+3             DECIMAL EXPONEXT (SIGN & MAG.)
  1338.  ;       C+4             TEN**N
  1339.  ;       C+5             TEN**N
  1340.  ;       C+6             TEN**N
  1341.  ;       C+7             RESULT OF MULT & DIV
  1342.  ;       C+8             AND TEMP FOR X2
  1343.  ;       C+9             "       "
  1344.  ;       C+10            L FOR NUMBER TO GO INTO (INPUT ONLY)
  1345.  ;       C+11            DIGIT JUST INPUT (INPUT ONLY)
  1346.  ;
  1347.  ;
  1348.  ;                       /*****BEGIN INPUT*************
  1349.  ;
  1350.  ;
  1351. ERR:      STC                     ;ERROR FLAG
  1352.           RET                     ;AND RETURN
  1353.  ;
  1354.  ;********************************************************
  1355.  ;       //// 4 1/2 DIGIT INPUT ROUTINE
  1356.  ;*******************************************************
  1357.  ;
  1358.  ;
  1359.  ;                       /L POINTS TO WHERE TO PUT INPUT NUMBER
  1360.  ;                       /C POINTS TO 13(10) WORDS OF SCRATCH
  1361.  ;
  1362.  INPUT:  MOV B,L           ;/SAVE ADDRESS WHERE DATA IS TO GO
  1363.          MOV A,C           ;/IN SCRATCH
  1364.          ADI 17Q           ;/COMPUTE LOC. IN SCRATCH
  1365.          MOV L,A
  1366.          MOV M,B           ;/PUT IT
  1367.          INR C             ;/OFFSET SCRATCH POINTER
  1368.          INR C             ;/BY 2
  1369.          CALL ZROIT        ;/ZERO NUMBER
  1370.          INR L             ;/AND ZERO
  1371.          MOV M,A           ;/DECIMAL EXPONENT
  1372.          CALL GNUM         ;/GET INTEGER PART OF NUM
  1373.          CPI 376Q          ;/TERM=.?
  1374.          JZ  DECPT         ;/YES
  1375.  TSTEX:  CPI 25Q           ;/TEST FOR E
  1376.          JZ  INEXP         ;/YES - HANDLE EXP
  1377.          CPI 360Q          ;/TEST FOR SPACE TERM (240B-260B)
  1378.          JNZ ERR           ;/NOT LEGAL TERM
  1379.          CALL FLTSGN       ;/FLOAT # AND SIGN IT
  1380.  SCALE:  CALL GETEX        ;/GET DECIMAL EXP
  1381.          ANI 177Q          ;/GET GOOD BITS
  1382.          MOV E,A           ;/SAVE COPY
  1383.          ANI 100Q          ;/GET SIGN OF EXP
  1384.          RLC               ;/INTO SIGN BIT
  1385.          ORA A             ;/SET FLOPS
  1386.          MOV B,A           ;/SAVE SIGN
  1387.          MOV A,E           ;/GET EXP BACK
  1388.          JZ  APLS          ;/JMP IS +
  1389.          MVI A,200Q        ;/MAKE MINUS +
  1390.          SUB E             ;/NOW ITS +
  1391.  APLS:   ADD B             ;/SIGN NUMBER
  1392.          MOV M,A           ;/SAVE EXP (SIGN & MAG.)
  1393.          MVI L,(TEN5 AND 377Q)  ;/TRY MORD WITH 10**5 FIRST
  1394.          CALL COPT         ;/TRANSFER TO RAM
  1395.          CALL GETEX        ;/GET DECIMAL EXP
  1396.  INT5:   ANI 77Q           ;/GET MAG. OF EXP
  1397.          CPI 5Q            ;/TEST FOR USE OF 10**5
  1398.          JM  TRYTN         ;/WONT GO - TRY 10
  1399.          CALL MORD         ;/WILL GO SO DO IT
  1400.          SUI 5Q            ;/MAG = MAG -5
  1401.          MOV M,A           ;/UPDATE DEC. EXP IN MEM
  1402.          JMP INT5          ;/GO TRY AGAIN
  1403. TRYTN:   MVI L,(TEN AND 377Q)  ;/PUT TEN IN RAM
  1404.          CALL COPT
  1405.          CALL GETEX        ;/SET UP FOR LOOP
  1406.  INT1:   ANI 77Q           ;/GET MAGNITUDE
  1407.          ORA A             ;/TEST FOR 0
  1408.          JZ  SAVEN         ;/DONE, MOVE NUM OUT AND GET OUT
  1409.          CALL MORD         ;/NOT DONE - DO 10
  1410.          SUI 1Q            ;/EXP = EXP -1
  1411.          MOV M,A           ;/UPDATE MEM
  1412.          JMP INT1          ;/TRY AGAIN
  1413.  DECPT:  MOV L,C           ;/ZERO DIGIT COUNT
  1414.          DCR L             ;/SINCE ITS NECESSARY
  1415.          DCR L             ;/TO COMPUTE EXP.
  1416.          MVI M,0           ;/ZEROED
  1417.          CALL EP1          ;/GNUM IN MIDDLE
  1418.          MOV E,A           ;/SAVE TERMINATOR
  1419.          MOV L,C           ;/MOVE DIGIT COUNT TO EXP
  1420.          DCR L             ;/BACK UP TO DIGIT COUNT
  1421.          DCR L
  1422.          MOV B,M           ;/GOT DIGIT COUNT
  1423.          CALL GETEX        ;/SET L TO DEC. EXP
  1424.          MOV M,B           ;/PUT EXP
  1425.          MOV A,E           ;/TERM BACK TO A
  1426.          JMP TSTEX         ;/TEST FOR E+OR-XX
  1427.  INEXP:  CALL FLTSGN       ;/FLOAT AND SIGN NUMBER
  1428.          CALL SAVEN        ;/SAVE NUMBER IN (L) TEMP
  1429.          CALL ZROIT        ;/ZERO OUT NUM. FOR INPUTTING EXP
  1430.          CALL GNUM         ;/NOW INPUT EXPONENT
  1431.          CPI 360Q          ;/TEST FOR SPACE TERM.
  1432.          JNZ ERR           ;/NOT LEGAL - TRY AGAIN
  1433.          MOV L,C           ;/GET EXP OUT OF MEM
  1434.          INR L             ;/***TP
  1435.          INR L             ;/EXP LIMITED TO 5 BITS
  1436.          MOV A,M           ;/GET LOWEST 8 BITS
  1437.          ANI 37Q           ;/GET GOOD BITS
  1438.          MOV B,A           ;/SAVE THEM
  1439.          INR L             ;/GET SIGN OF EXP
  1440.          MOV A,M           ;/INTO A
  1441.          ORA A             ;/SET FLOPS
  1442.          MOV A,B           ;/INCASE NOTHING TO DO
  1443.          JM  USEIT         ;/IF NEG. USE AS +
  1444.          MVI A,0Q          ;/IF + MAKE -
  1445.          SUB B             ;/0-X = -X
  1446.  USEIT:  INR L             ;/POINT AT EXP
  1447.          ADD M             ;/GET REAL DEC. EXP
  1448.          MOV M,A           ;/PUT IN MEM
  1449.          MOV A,C           ;/NOW GET NUMBER BACK
  1450.          ADI 15Q           ;/GET ADD OF L
  1451.          MOV L,A           ;/L POINTS TO L OF NUMBER
  1452.          MOV L,M           ;/NOW L POINTS TO NUMBER
  1453.          MOV A,H           ;/RAM TO RAM COPY
  1454.          CALL COPY         ;/COPY IT BACK
  1455.          JMP SCALE         ;/NOW ADJUST FOR EXP
  1456.  GNUM:   CALL INP          ;/GET A CHAR
  1457.          CPI 240Q          ;/IGNORE LEADING SPACES
  1458.          JZ  GNUM
  1459.          CPI 255Q          ;/TEST FOR -
  1460.          JNZ TRYP          ;/NOT MINUS
  1461.          MOV L,C           ;/MINUS SO SET SIGN
  1462.          INR L             ;/IN CHAR LOC.
  1463.          INR L             ;/***TP
  1464.          INR L
  1465.          MVI M,200Q        ;/SET - SIGN
  1466.          JMP GNUM
  1467.  TRYP:   CPI 253Q          ;/IGNORE +
  1468.          JZ  GNUM
  1469.  TSTN:   SUI 260Q          ;/STRIP ASCII
  1470.          RM                ;/RETURN IF TERM
  1471.          CPI 12Q           ;/TEST FOR NUMBER
  1472.          RP                ;/ILLEGAL
  1473.          MOV E,A           ;/SAVE DIGIT
  1474.          CALL GETN         ;/LOC. OF DIGIT STORAGE TO L
  1475.          MOV M,E           ;/SAVE DIGIT
  1476.          CALL MULTT        ;/MULT NUMBER BY 10
  1477.          ORA A             ;/TEST FOR TOO MANY DIGITS
  1478.          RNZ               ;/TOO MANY DIGITS
  1479.          CALL GETN         ;/GET DIGIT
  1480.          MOV L,C           ;/SET L TO NUMBER
  1481.          INR L
  1482.          INR L             ;/***TP
  1483.          ADD M             ;/ADD IN THE DIGIT
  1484.          MOV M,A           ;/PUT RESULT BACK
  1485.          DCR L             ;/NOW DO HIGH
  1486.          MOV A,M           ;/GET HIGH TO ADD IN CARRY
  1487.          ACI 0Q            ;/ADD IN CARRY
  1488.          MOV M,A           ;/UPDATE HIGH
  1489.          DCR L             ;/***TP EXTENSION
  1490.          MOV A,M
  1491.          ACI 0Q            ;/ADD IN CARRY
  1492.          MOV M,A           ;/***TP ALL DONE
  1493.          RC                ;/OVERFLOW ERROR
  1494.          DCR L             ;/BUMP DIGIT COUNT NOW
  1495.          DCR L
  1496.          MOV B,M           ;/GET DIGIT COUNT
  1497.          INR B             ;/BUMP DIGIT COUNT
  1498.          MOV M,B           ;/UPDATE DIGIT COUNT
  1499.  EP1:    CALL INP          ;/GET NEXT CHAR
  1500.          JMP TSTN          ;/MUST BE NUM. OR TERM
  1501. FLTSGN:  MOV     L,C         ;POINT L AT NUMBER TO FLOAT
  1502.          JMP     FLOAT       ;GO FLOAT IT
  1503.  SAVEN:  MOV A,C           ;/PUT NUMBER IN (L)
  1504.          ADI 15Q           ;/GET ADD OF L
  1505.          MOV L,A
  1506.          MOV E,M           ;/GET L OF RESULT
  1507.          MOV L,E           ;/POINT L AT (L)
  1508.          INR L             ;/SET TO 2ND WORD TO SAVE C
  1509.          MOV M,C           ;/SAVE C IN (L) +1 SINCE IT WILL BE DESTROYED
  1510.          MOV L,C           ;/SET UP TO CALL COPY
  1511.          MOV C,E           ;/NOW L&C SET
  1512.          MOV A,H           ;/RAM TO RAM COPY
  1513.          CALL COPY         ;/COPY TO L
  1514.          MOV C,A           ;/(L)+1 RETURNED HERE SO SET AS C
  1515.           ORA    A                ;MAKE SURE CY=0 (NO ERROR)
  1516.          RET               ;/NOW EVERYTHING HUNKY-DORRY
  1517.  GETN:   MOV A,C           ;/GET DIGIT
  1518.          ADI 16Q           ;/LAST LOC. IN SCRATCH
  1519.          MOV L,A           ;/PUT IN L
  1520.          MOV A,M           ;/GET DIGIT
  1521.          RET
  1522.  ZROIT:  MOV L,C           ;/ZERO NUMBER
  1523.          XRA A
  1524.          MOV M,A           ;/***TP
  1525.          INR L             ;/***TP
  1526.          MOV M,A
  1527.          INR L
  1528.          MOV M,A
  1529.          INR L             ;/NOW SET SIGN TO +
  1530.          MOV M,A
  1531.          RET               ;/DONE
  1532. ; CONTAIN LOW BYTE OF TWO BYTE VALUE. RETURNS CY=1 IF
  1533. ; BC>DE, CY=0 IF BC<DE: Z=1 IF BC=DE.
  1534. DCOMP:    MOV    A,E
  1535.           CMP    C
  1536.           RNZ
  1537.           MOV    A,D
  1538.           CMP    B
  1539.           RET
  1540. ; ROUTINE TO INPUT CHAR FROM TTY
  1541. CHAR2:    PUSH   B
  1542.           CALL   CONIN            ;INPUT FROM ODT
  1543.           MOV    A,B              ;GET CHAR TO A REG.
  1544.           POP    B                ;RESTORE B,C
  1545.           RET
  1546. ; ROUTINE TO ADJUST VALUES OF BIN, FORWARD PNT. AND
  1547. ; LINE LENGTH OF SOURCE LINE.  PASSED ADD OF TEMP VARIABLE
  1548. ; CONTAINING ADD OF SOURCE LINE.
  1549. PTVAL:    PUSH   PSW
  1550.           PUSH   D
  1551.           PUSH   H
  1552.           MVI    A,002
  1553.           MOV    E,M
  1554.           INR    L
  1555.           MOV    D,M
  1556.           INR    L
  1557.           PUSH   D
  1558. N1:       XTHL
  1559.           MOV    E,M
  1560.           INX    H
  1561.           MOV    D,M
  1562.           INX    H
  1563.           XTHL
  1564.           MOV    M,E
  1565.           INR    L
  1566.           MOV    M,D
  1567.           INR    L
  1568.           DCR    A
  1569.           JNZ    N1
  1570.           XTHL
  1571.           MOV    D,M
  1572.           POP    H
  1573.           MOV    M,D
  1574.           POP    H
  1575.           POP    D
  1576.           POP    PSW
  1577.           RET
  1578. ; ROUTINE TO CHK FLAGS ON INPUT AND OUTPUT.
  1579. ; PASSED FLAG VALUE IN REG B.
  1580. MCHK:     PUSH   PSW
  1581. MCHK1:    CALL   STATUS
  1582.           ANA    B
  1583.           JZ     MCHK1
  1584.           POP    PSW
  1585.           RET
  1586. ; MULTIPLICATION ROUTINE (ADD. VALUES)
  1587. MULT:     MOV    E,M
  1588.           DCX    H
  1589.           MOV    D,M
  1590.           MVI    M,11H
  1591.           MVI    B,0
  1592.           MOV    C,B
  1593. TOP:      MOV    A,E
  1594.           RAR
  1595.           MOV    E,A
  1596.           MOV    A,D
  1597.           RAR
  1598.           DCR    M
  1599.           MOV    D,A
  1600.           RZ
  1601.           JNC    SHIFT
  1602.           DCX    H
  1603.           DCX    H
  1604.           MOV    A,B
  1605.           ADD    M
  1606.           MOV    B,A
  1607.           INX    H
  1608.           MOV    A,C
  1609.           ADC    M
  1610.           MOV    C,A
  1611.           INX    H
  1612. SHIFT:    MOV    A,C
  1613.           RAR
  1614.           MOV    C,A
  1615.           MOV    A,B
  1616.           RAR
  1617.           MOV    B,A
  1618.           JMP    TOP
  1619. ;LINKAGES TO FLOATING POINT ROUTINES
  1620. ;###S
  1621.     ORG    1774H
  1622. FPTBL:
  1623. ;          ORG    113707Q
  1624. ;###E
  1625.           JMP    NORM
  1626.           JMP    FLOAT
  1627.           JMP    WZER
  1628.           JMP    LADD
  1629.           JMP    LMUL
  1630.           JMP    LDIV
  1631.           JMP    LSUB
  1632.           JMP    DFXL
  1633.           JMP    LMCM
  1634.           JMP    COPY
  1635.           JMP    CVRT
  1636.           JMP    INPUT
  1637.           JMP    MULT
  1638.           JMP    PTVAL
  1639.           JMP    DCOMP
  1640.           JMP    MCHK
  1641.           JMP    CHAR2
  1642.           JMP    INL
  1643.           JMP    OUTL
  1644.           END
  1645.