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