home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug018.ark / FPCONV.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  18KB  |  599 lines

  1. ; 8008 BINARY  FLOATING POINT  SYSTEM
  2. ; FORMAT CONVERSION PACKAGE
  3. ; THE FORMAT CONVERSION PACKAGE OF THE 8008 BINARY FLOATING
  4. ; POINT SYSTEM CONTAINS  SUBROUTINES  FOR THE CONVERSION OF
  5. ; DATA BETWEEN THE FLOATING POINT SYSTEM NOTATION AND TWO  OTHER
  6. ; FORMATS.  THE NON-FLOATING-POINT FORMATS  ARE: FOUR WORD FIXED
  7. ; POINT  FORMAT AND  VARIABLE LENGTH CHARACTER STRING  FORMAT.
  8. ; THE FORMAT CONVERSION PACKAGE IS CONTAINED IN 512 CONSECUTIVE
  9. ; WORDS OF MEMORY (2 BANKS OF ROM) AND REQUIRES FOR ITS
  10. ; EXECUTION THAT THE ARITHMETIC AND UTILITY PACKAGE BE 
  11. ; AVAILABLE  IN  MEMORY.  THE COMBINATION  OF  THIS PACKAGE AND THE 
  12. ; ARITHMETIC  AND UTILITY PACKAGE USES  THE FIRST 64 WORDS
  13. ; OF  A BANK  OF RAM AS  SCRATCHPAD MEMORY.
  14. ; THE  FIXED POINT FORMAT DATA PROCESSED BY THIS  PACKAGE
  15. ; CONSIST OF 32 BIT BINARY NUMBERS  OCCUPYING FOUR WORDS.
  16. ; 2'S COMPLEMENT  NOTATION IS USED TO REPRESENT NEGATIVE
  17. ; VALUES.
  18. ; THE POSITION  OF THE BINARY POINT RELATIVE  TO THE 
  19. ; BITS  REPRESENTING  THE VALUE IS DENOTED BY A BINARY
  20. ; SCALING FACTOR.  THE BINARY SCALING FACTOR IS NOT  NORMALLY
  21. ; RECORDED IN THE COMPUTER, BUT WHEN  A FORMAT CONVERSION
  22. ; SUBROUTINE IS CALLED, THE  BINARY SCALING FACTOR MUST  BE
  23. ; SPECIFIED (IN THE E REGISTER).  A  BINARY SCALING  FACTOR OF  
  24. ; ZERO  INDICATES  THAT THE BINARY  POINT  IS  IMMEDIATELY TO THE 
  25. ; LEFT  OF THE MOST SIGNIFICANT OF  THE 32 BITS REPRESENTING  THE
  26. ; VALUE.  A BINARY SCALING  FACTOR OF 32 INDICATES THAT  THE BINARY
  27. ; POINT  IS IMMEDIATELY TO THE  RIGHT OF THE LEAST  SIGNIFICANT
  28. ; BIT.  THE PERMISSIBLE  RANGE OF THE BINARY SCALING  FACTOR IS
  29. ; -128 (200 OCTAL)  TO +127 (177 OCTAL).
  30. ; THE CHARACTER STRING FORMAT DATA PROCESSED BY THIS PACKAGE
  31. ; CONSIST OF BINARY REPRESENTATIONS OF CHARACTERS OCCUPYING
  32. ; CONSECUTIVE WORDS OF MEMORY.   A CHARACTER STRING  MAY NOT
  33. ; CROSS A MEMORY BANK BOUNDARY.  THE  CHARACTERS WHICH MAY BE
  34. ; INCLUDED  IN  A CHARACTER STRING, AND THE CORRESPONDING 
  35. ; OCTAL REPRESENTATIONS ARE  LISTED BELOW.
  36. ;       DECIMAL DIGITS          000B-011B  BCD DIGITS
  37. ;       SPACE                   360B
  38. ;       +                       373B       PLUS
  39. ;       -                       375B       MINUS
  40. ;       .                       376B       DECIMAL POINT
  41. ;       E                       25QB       EXPONENTIAL SIGN
  42. ; (THESE OCTAL REPRESENTATIONS CAN BE CONVERTED TO THE
  43. ; CORRESPONDING ASCII CHARACTERS BY ADDING 60 OCTAL TO EACH
  44. ; THE  OUT  SUBROUTINE GENERATES CHARACTER STRINGS IN TWO
  45. ; FORMATS, EACH CONSISTING OF 13 CHARACTERS.  THE  FORMAT
  46. ; USED IN A SPECIFIC CASE IS  DEPENDENT ON THE MAGNITUDE
  47. ; OF THE VALUE REPRESENTED.
  48. ; ZERO AND MAGNITUDES BETWEEN  .1000000 AND 9999999. ARE
  49. ; REPRESENTED BY A SPACE OR MINUS SIGN, SEVEN DECIMAL  DIGITS,
  50. ; AN APPROPRIATELY POSITIONED DECIMAL  POINT, AND FOUR SPACES.
  51. ; MAGNITUDES  OUTSIDE THE ABOVE  RANGE ARE REPRESENTED BY A
  52. ; SPACE OR MINUS SIGN, A VALUE BETWEEN 1.00000Q AND 9.999999,
  53. ; AN EXPONENTIAL SIGN, AND A SIGNED TWO DIGIT  POWER OF TEN.
  54. ; THE INP SUBROUTINE  CONVERTS CHARACTER STRINGS IN EITHER
  55. ; OF THE ABOVE FORMATS, OR A MODIFIED VERSION OF THEM.  THE 
  56. ; LEADING SIGN CHARACTER MAY BE INCLUDED OR OMITTED.  UP TO
  57. ; 37 DIGITS MAY BE USED TO INDICATE THE VALUE, WITH  OR WITHOUT
  58. ; AN INCLUDED DECIMAL  POINT.  IF A POWER-OF-TEN MULTIPLIER
  59. ; IS  INDICATED IT MAY BE  SIGNED OR UNSIGNED AND MAY CONTAIN
  60. ; ONE OR TWO DIGITS.  AN INPUT CHARACTER STRING IS TERMINATED
  61. ; BY THE FIRST CHARACTER WHICH DEPARTS FROM THE SPECIFIED FORMAT.
  62. ; THE FOLLOWING ARE EXAMPLES OF INPUT AND CORRESPONDING
  63. ; OUTPUT CHARACTER STRINGS.
  64. ;        3. 141593          3.141593
  65. ;        -.000000000001Q   -1.00000QE-13
  66. ;        +1.6E5             160000.0
  67. ;        12345678           1.234568E+08
  68. ;        54321E-10          5.432100E-6Q
  69. ;        -2718281828       -2.718282E+09
  70. ; THE INDIVIDUAL SUBROUTINES INCLUDED IN THE FORMAT CONVERSION
  71. ; PACKAGE OF THE FLOATING POINT SYSTEM ARE DESCRIBED IN DETAIL
  72. ; BELOW.
  73. ; CHARACTER STRING INPUT SUBROUTINE
  74. ; THE CHARACTER STRING INPUT SUBROUTINE CONVERTS  THE VALUE
  75. ; REPRESENTED BY A CHARACTER STRING STORED IN MEMORY TO 
  76. ; FLOATING POINT  FORMAT AND STORES THE RESULT IN  THE FLOATING 
  77. ; POINT ACCUMULATOR.
  78. ; ENTRY POINT
  79. ;       INP
  80. ; ENTRY CONDITIONS
  81. ;       H REGISTER = MS 6 BITS OF THE ADDRESS OF THE STRING
  82. ;       L REGISTER = LS 8 BITS OF THE ADDRESS  OF THE STRING
  83. ; EXIT CONDITIONS
  84. ;       CONTROL BITS  SET AS DEFINED FOR THE SYSTEM
  85. ;       IF OVERFLOW
  86. ;           LOCATION  <OVER> SET  NON-ZERO
  87. ;       IF NO OVERFLOW
  88. ;           A REGISTER = ACCUM EXP
  89. ;           B REGISTER = ACCUM SIGN AND 1ST FRACTION
  90. ;           C REGISTER = ACCUM 2ND FRACTION
  91. ;           D REGISTER = ACCUM 3RD FRACTION
  92. ; REGISTERS ALTERED
  93. ;       ALL
  94. ; MAXIMUM SUBROUTINE LEVELS USED
  95. ;       3
  96. ; CHARACTER STRING OUTPUT ROUTINE
  97. ; THE CHARACTER STRING OUTPUT SUBROUTINE CONVERTS THE VALUE
  98. ; IN THE FLOATING  POINT ACCUMULATOR TO A CHARACTER  STRING
  99. ; FORMAT CONSISTING  OF 13 CHARACTERS AND STORES  THE STRING
  100. ; IN  MEMORY.
  101. ; ENTRY POINT
  102. ;       OUT
  103. ; ENTRY CONDITIONS
  104. ;       H REGISTER = MS  6 BITS  OF THE ADDRESS OF THE STRING
  105. ;       L REGISTER = LS 8 BITS OF THE ADDRESS OF THE STRING
  106. ; EXIT CONDITIONS
  107. ;       CONTROL BITS SET AS DEFINED FOR  THE SYSTEM
  108. ;       A REGISTER = ACCUM EXP
  109. ;       B REGISTER = ACCUM SIGN AND 1ST FRACTION
  110. ;       C REGISTER = ACCUM 2ND FRACTION
  111. ;       D REGISTER = ACCUM 3RD FRACTION
  112. ; REGISTERS ALTERED
  113. ;       ALL
  114. ; MAXIMUM SUBROUTINE LEVELS USED
  115. ;       3
  116. ; FLOAT ROUTINE
  117. ; THE FLOAT SUBROUTINE CONVERTS THE FIXED POINT FORMAT DATA
  118. ; IN  THE A,B,C, AND D REGISTERS TO FLOATING POINT  FORMAT
  119. ; AND STORES THE RESULT IN  THE FLOATING POINT ACCUMULATOR.
  120. ; ENTRY POINT
  121. ;       FLT
  122. ; ENTRY CONDITIONS
  123. ;       A REGISTER = MOST SIG  WORD OF THE FIXED POINT VALUE
  124. ;       B REGISTER = 2ND WORD OF  THE FIXED POINT VALUE
  125. ;       C REGISTER = 3RD WORD OF THE FIXED POINT VALUE
  126. ;       D REGISTER = LEAST SIG WORD OF THE FIXED POINT VALUE
  127. ;       E REGISTER = BINARY SCALING FACTOR OF THE FIXED POINT  VALUE
  128. ; EXIT CONDITIONS
  129. ;       CONTROL BITS  SET AS DEFINED FOR THE SYSTEM
  130. ;       A REGISTER = ACCUM EXP
  131. ;       B REGISTER = ACCUM SIGN AND 1ST  FRACTION
  132. ;       C REGISTER = ACCUM 2ND FRACTION
  133. ;       D REGISTER = ACCUM 3RD FRACTION
  134. ; REGISTERS ALTERED
  135. ;       ALL
  136. ; MAXUMUM SUBROUTINE LEVELS USED
  137. ;       2
  138. ; FIX ROUTINE
  139. ; THE FIX SUBROUTINE CONVERTS THE VALUE IN  THE FLOATING
  140. ; POINT ACCUMULATOR TO  FIXED POINT FORMAT AND RETURNS
  141. ; THE  RESULT IN  THE A,B,C, AND  D REGISTERS
  142. ; ENTRY POINT 
  143. ;       FIX
  144. ; ENTRY  CONDITIONS
  145. ;       E REGISTER = BINARY SCALING FACTOR OF THE FIXED POINT VALUE
  146. ; EXIT CONDITIONS
  147. ;       IF THE VALUE CANNOT BE REPRESENTED  AT THE SPECIFIED
  148. ;       BINARY SCALING FACTOR
  149. ;            CARRY BIT = 1
  150. ;       OTHERWISE
  151. ;            CARRY BIT  = 0
  152. ;     
  153. ;            ZERO BIT = 0 IF THE VALUE IS NON-ZERO
  154. ;                     = 1 IF THE VALUE IS ZERO
  155. ;            SIGN BIT = 0 IF THE VALUE IS POSITIVE
  156. ;                     = 1 IF THE VALUE IS NEGATIVE
  157. ;            A REGISTER = MOST SIG WORD OF THE FIXED POINT VALUE
  158. ;            B REGISTER = 2ND WORD
  159. ;            C REGISTER = 3RD WORD
  160. ;            D REGISTER = LEAST SIG WORD OF THE FIXED POINT VALUE
  161. ; REGISTERS ALTERED
  162. ;       ALL
  163. ; MAXIMUM SUBROUTINE LEVELS USED
  164. ;       1
  165.     ORG    3000Q
  166. SCR    EQU    5400Q
  167. SCRB    EQU    13Q
  168. ARITH    EQU    1400Q        ;BASE ADDRESS OF ARITHMETIC PKG
  169. SPACE    EQU    360Q
  170. PLUS    EQU    373Q
  171. MINUS    EQU    375Q
  172. POINT    EQU    376Q
  173. EXPO    EQU    25Q
  174. ; 8008 BINARY FLOATING POINT SYSTEM
  175. ; FORMAT CONVERSION PACKAGE
  176. ; PROGRAMMER: CAL OHME
  177. ; DATE: 26 DECEMBER 1973
  178. ; ARITH IS THE BEGINNING ADDRESS OF THE 
  179. ; ARITHMETIC AND UTILITY PACKAGE OF THE FLOATING POINT SYSTEM
  180. ; SCR IS THE BEGINNING ADDRESS OF THE RAM  USED AS SCRATCHPAD
  181. OVER    EQU    56Q        ;OVERFLOW FLAG
  182. ACCE    EQU    60Q        ;ACCUM EXP
  183. ACCS    EQU    ACCE+1        ;ACCUM SIGN
  184. ACC1    EQU    ACCS+1        ;ACCUM 1ST FRACTION
  185. ACC2    EQU    ACC1+1        ;ACCUM 2ND FRACTION
  186. ACC3    EQU    ACC2+1        ;ACCUM 3RD FRACTION
  187. SF    EQU    ACC3+1        ;SUBTRACTION FLAG
  188. ADRL    EQU    SF+1        ;CHARACTER STRING WORD
  189. ADRH    EQU    ADRL+1        ;CHARACTER STRING BANK
  190. TMP1    EQU    ADRH+1        ;TEMPORARY STORAGE
  191. TMP2    EQU    TMP1+1
  192. TMP3    EQU    TMP2+1
  193. VALE    EQU    TMP3+1        ;VALUE EXPONENT
  194. VAL1    EQU    VALE+1        ;VALUE 1ST FRACTION
  195. VAL2    EQU    VAL1+1        ;VALUE 2ND FRACTION
  196. VAL3    EQU    VAL2+1        ;VALUE 3RD FRACTION
  197. TMP4    EQU    VAL3+1        ;TEMPORARY STORAGE
  198. ; ADDRESSES IN THE ARITHMETIC AND UTILITY PACKAGE
  199. ; REFERENCED BY THE FORMAT CONVERSION PACKAGE .
  200. STR    EQU    ARITH+76Q
  201. ZRO    EQU    ARITH+106Q
  202. ABS    EQU    ARITH+120Q
  203. TST    EQU    ARITH+131Q
  204. LOD    EQU    ARITH+156Q
  205. MUL    EQU    ARITH+214Q
  206. DIV    EQU    ARITH+264Q
  207. ADD    EQU    ARITH+327Q
  208. ADD10    EQU    ARITH+553Q
  209. LSH    EQU    ARITH+674Q
  210. RSH    EQU    ARITH+711Q
  211. COMP    EQU    ARITH+757Q
  212. ; SUBROUTINE TO CONVERT  FROM FIXED POINT TO  FLOATING POINT FORMAT
  213. FLT:    MOV    L,E        ;INPUT EXP
  214.     MOV    E,D        ;4TH INPUT FRACTION
  215.     MOV    D,C        ;3RD INPUT    FRACTION
  216.     MOV    C,B        ;2ND INPUT FRACTION
  217.     MOV    B,A        ;1ST INPUT    FRACTION
  218.     MOV    A,L        ;INPUT EXP
  219.     XRI    200Q        ;APPLY EXPONENT BIAS
  220.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  221.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  222.     MOV    M,A        ;STORE ACCUM EXP
  223.     INR    L        ;ADDRESS ACCUM SIGN
  224.     MVI    M,200Q        ;SET ACCUM SIGN    POSITIVE
  225.     INR    L        ;ADDRESS ACCUM 1ST FRACTION
  226.     MOV    A,B        ;1ST INPUT FRACTION
  227.     ANA    A        ;SET SIGN BIT
  228.     RAL        ;INPUT SIGN TO    CARRY
  229.     JMP    ADD10        ;COMPLETE CONVERSION
  230. ; SUBROUTINE TO  CONVERT FROM FLOATING POINT TO FIXED POINT FORMAT
  231. FIX:    MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  232.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  233.     MOV    A,M
  234.     ANA    A        ;SET CONTROL BITS
  235.     JZ    FIX1        ;IF ACCUM IS ZERO
  236.     MOV    A,E        ;INPUT EXP
  237.     ADI    177Q        ;ADD BIAS-1
  238.     SUB    M        ;SHIFT COUNT -1
  239.     RC        ;RETURN IF ACCUM TOO    LARGE
  240.     CPI    31        ;COMPARE TO LARGE    SHIFT
  241.     JNC    FIX1        ;IF ACCUM TO SMALL
  242.     ADI    1        ;SHIFT COUNT
  243.     MVI    L,ACC1        ;ADDRESS ACCUM 1ST FRACTION
  244.     MOV    B,M
  245.     INR    L        ;ADDRESS ACCUM 2ND FRACTION
  246.     MOV    C,M
  247.     INR    L        ;ADDRESS ACCUM 3RD FRACTION
  248.     MOV    D,M
  249.     CALL    RSH        ;POSITION THE FRACTION
  250.     MVI    L,ACCS        ;ADDRESS ACCUM SIGN
  251.     MOV    A,M
  252.     ANA    A        ;SET CONTROL BITS
  253.     CP    COMP        ;COMPLEMENT FRACTION IF NEGATIVE
  254.     MVI    A,1        ;NON-ZERO
  255.     ORA    B        ;SET CONTROL BITS FOR EXIT
  256.     MOV    A,B        ;1ST RESULT
  257.     MOV    B,C        ;2ND RESULT
  258.     MOV    C,D        ;3RD RESULT
  259.     MOV    D,E        ;4TH RESULT
  260.     RET
  261. FIX1:    XRA    A        ;SET A REG TO ZERO
  262.     MOV    B,A
  263.     MOV    C,A
  264.     MOV    D,A
  265.     RET
  266.     DB    0        ;CHECKSUM WORD
  267. ; INP SUBROUTINE ENTRY POINT
  268. ; INITIALIZE TEMPORARY STORAGE
  269. INP:    MOV    E,M        ;FIRST CHAR OF STRING
  270.     CALL    SVAD        ;SET CHAR ADDR, PNT FLAG, EXP
  271.     INR    L        ;ADDRESS VALUE SIGN
  272.     MVI    M,200Q        ;SET VALUE SIGN POSITIVE
  273.     MVI    L,ACCE        ;ADDRESS ACCUM EXP
  274.     MOV    M,D        ;SET ACCUM TO ZERO
  275.     MOV    A,E        ;1ST    CHAR
  276.     CPI    SPACE        ;COMPARE TO SPACE
  277.     JZ    INP1        ;IF SPACE CHAR
  278.     CPI    PLUS        ;COMPARE TO PLUS
  279.     JZ    INP1        ;IF PLUS SIGN
  280.     CPI    MINUS        ;COMPARE TO MINUS
  281.     JNZ    INP2        ;IF NOT MINUS SIGN
  282.     MVI    L,TMP3        ;ADDRESS VALUE    SIGN
  283.     MOV    M,D        ;SET VALUE SIGN NEGATIVE
  284. ; ANALYZE NEXT CHARACTER IN STRING
  285. INP1:    CALL    CHAD        ;CALL CHAR ADDRESS SUBROUTINE
  286.     MOV    A,M        ;NEXT CHAR
  287.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  288. INP2:    MVI    B,0        ;DIGIT 2ND WORD OR DEC EXP
  289.     CPI    POINT        ;COMPARE TO    DECIMAL POINT
  290.     JZ    INP3        ;IF DECIMAL    POINT
  291.     CPI    EXPO        ;COMPARE TO EXPONENT SIGN
  292.     JZ    INP4        ;IF EXPONENT SIGN
  293.     CPI    10        ;SET CARRY IF CHAR IS A DIGIT
  294.     JNC    INP8        ;IF CHAR IS NOT A DIGIT
  295.     MVI    L,TMP4        ;ADDRESS CURRENT DIGIT
  296.     MOV    M,A        ;SAVE CURRENT DIGIT
  297.     LXI    H,FTEN        ;ADDRESS FLOATING TEN
  298.     CALL    MUL        ;MULTIPLY BY TEN
  299.     MVI    L,VALE        ;ADDRESS VALUE
  300.     CALL    STR        ;STORE OLD VALUE TIMES TEN
  301.     INR    L        ;ADDRESS CURRENT DIGIT
  302.     MOV    A,M
  303.     MVI    B,0        ;CLEAR 2ND WORD    OF DIGIT
  304.     MOV    C,B        ;CLEAR 3RD WORD
  305.     MOV    D,B        ;CLEAR 4TH WORD
  306.     MVI    E,8        ;INDICATE DIGIT IS IN REG A
  307.     CALL    FLT        ;CONVERT DIGIT TO FLOATING POINT
  308.     MVI    L,VALE        ;ADDRESS VALUE
  309.     CALL    ADD        ;ADD OLD VALUE TIMES TEN
  310.     MVI    L,TMP2        ;ADDRESS DECIMAL POINT FLAG
  311.     MOV    A,M
  312.     ANA    A        ;SET CONTROL BITS
  313.     JZ    INP1        ;IF NO DECIMAL POINT ENCOUNTERED
  314.     DCR    L        ;ADDRESS INPUT EXP
  315.     MOV    B,M
  316.     DCR    B        ;DECREMENT INPUT    EXP
  317.     MOV    M,B        ;UPDATE INPUT EXP
  318.     JMP    INP1        ;GET NEXT CHAR
  319. INP3:    MVI    L,TMP2        ;ADDRESS DECIMAL POINT FLAG
  320.     XRA    M        ;ZERO IF FLAG SET
  321.     MOV    M,A        ;SET DEC POINT FLAG
  322.     JNZ    INP1        ;IF FLAG NOT ALREADY SET
  323.     JMP    INP8        ;IF 2ND DECIMAL POINT
  324. ; PROCESS DECIMAL EXPONENT
  325. INP4:    CALL    CHAD        ;CALL CHAR ADDR SUB
  326.     MOV    A,M        ;NEXT CHAR OF STRING
  327.     MOV    B,A        ;CURRENT CHAR
  328.     SUI    MINUS        ;COMPARE TO MINUS    CHAR
  329.     MOV    E,A        ;CHAR - <MINUS SIGN>
  330.     JZ    INP5        ;IF MINUS SIGN
  331.     ADI    MINUS-PLUS        ;COMPARE TO PLUS SIGN
  332.     MOV    A,B        ;CURRENT CHAR
  333.     JNZ    INP6        ;IF NOT PLUS SIGN
  334. INP5:    INR    L        ;ADDRESS NEXT CHAR
  335.     MOV    A,M        ;NEXT CHAR OF STRING
  336. INP6:    MVI    B,0        ;POSSIBLE DECIMAL EXPONENT
  337.     CPI    10        ;SET CARRY IF CHAR IS A DIGIT
  338.     JNC    INP8        ;IF CHAR IS NOT A DIGIT
  339.     MOV    B,A        ;DEC EXP EQUAL DIGIT
  340.     INR    L        ;ADDRESS NEXT CHAR
  341.     MOV    A,M
  342.     CPI    10        ;SET CARRY IF A DIGIT
  343.     JNC    INP7        ;IF CHAR IS NOT A DIGIT
  344. ; FORM COMPLETE DECIMAL  EXPONENT
  345.     MOV    C,A        ;LS DIGIT OF DEC EXP
  346.     MOV    A,B        ;MS DIGIT OF DEC EXP
  347.     ADD    A        ;2 * MS DIGIT
  348.     ADD    A        ;4 * MS DIGIT
  349.     ADD    B        ;5 * MS DIGIT
  350.     ADD    A        ;10 * MS DIGIT
  351.     ADD    C        ;10 * MS + LS DIGIT
  352.     MOV    B,A        ;DECIMAL EXP
  353. INP7:    MOV    A,E        ;SIGN OF DEC EXP
  354.     ANA    A        ;SET CONTROL BITS
  355.     JNZ    INP8        ;IF SIGN PLUS
  356.     SUB    B        ;COMPLEMENT DEC EXP
  357.     MOV    B,A        ;DEC EXP
  358. INP8:    MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  359.     MVI    L,TMP3        ;ADDRESS INPUT SIGN
  360.     MOV    C,M
  361.     MVI    L,ACCS        ;ADDRESS ACCUM SIGN
  362.     MOV    M,C        ;STORE ACCUM SIGN
  363.     MOV    A,B        ;DEC EXP
  364. ; CONVERT DECIMAL EXPONENT TO BINARY
  365. INP9:    MVI    L,TMP1        ;ADDRESS DEC EXP
  366.     ADD    M        ;ADJUST DEC EXP
  367.     JZ    TST        ;IF DEC EXP IS ZERO
  368.     MOV    M,A        ;CURRENT DEC EXP
  369.     LXI    H,FTEN        ;ADDRESS FLOATING POINT TEN
  370.     JP    INP10        ;IF MULTIPLY REQUIRED
  371.     CALL    DIV        ;DIVIDE BY 10
  372.     MVI    A,1        ;TO INCREMENT DEC EXP
  373.     JMP    INP9        ;TEST FOR COMPLETION
  374. INP10:    CALL    MUL        ;MULTIPLY BY 10
  375.     RC        ;RETURN IF OVERFLOW
  376.     MVI    A,-1        ;DECREMENT DEC EXP
  377.     JMP    INP9        ;TO    TEST FOR COMPLETION
  378. ; OUT SUBROUTINE ENTRY POINT
  379. ; SAVE CHARACTER ADDRESS AND ACCUMULATOR.
  380. OUT:    DCR    L        ;DECREMENT CHAR ADDRESS
  381.     CALL    SVAD        ;SET CHAR ADDR, DIG CNT, DEC EXP
  382.     CALL    TST        ;LOAD ACCUM TO REGISTERS
  383.     MVI    L,VALE        ;ADDRESS ACCUM SAVE AREA
  384.     CALL    STR
  385. ; OUTPUT SIGN CHAR
  386.     CALL    CHAD        ;CALL CHAR ADDR SUBROUTINE
  387.     MVI    M,SPACE        ;STORE SPACE CHAR
  388.     ANA    A        ;SET CONTROL BITS
  389.     JZ    OUT3        ;IF ACCUM IS ZERO
  390.     MOV    E,A        ;ACCUM EXP
  391.     MOV    A,B        ;ACCUM SIGN AND 1ST FRACTION
  392.     ANA    A        ;SET CONTROL BITS
  393.     MOV    A,E        ;ACCUM EXP
  394.     JP    OUT1        ;IF ACCUM IS POSITIVE
  395.     MVI    M,MINUS        ;CHANGE SIGN TO MINUS
  396. ; SCALE ACCUM TO  .1 - 1. RANGE
  397. OUT1:    CPI    176Q        ;COMPARE TO SMALL EXPONENT
  398. OUT2:    LXI    H,FTEN        ;ADDRESS OF FLOATING TEN
  399.     JC    OUT4        ;IF EXPONENT TOO SMALL
  400.     CPI    201Q        ;COMPARE TO LARGE EXP
  401.     JC    OUT5        ;IF    EXP SMALL ENOUGH
  402.     CALL    DIV        ;DIVIDE BY TEN
  403. OUT3:    MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  404.     MVI    L,TMP2        ;ADDRESS DECIMAL    EXP
  405.     MOV    E,M
  406.     INR    E        ;INCREMENT DEC EXP
  407.     MOV    M,E        ;STORE DECIMAL EXP
  408.     JMP    OUT2        ;TEST FOR SCALING COMPLETE
  409. OUT4:    CALL    MUL        ;MULTIPLY    BY    TEN
  410.     MVI    L,TMP2        ;ADDRESS DECIMAL EXP
  411.     MOV    E,M
  412.     DCR    E        ;DECREMENT DEC EXP
  413.     MOV    M,E
  414.     JMP    OUT1        ;TEST FOR SCALING COMPLETE
  415. ; ROUND THE VALUE BY ADDING .0000005Q
  416. OUT5:    CALL    ABS        ;SET ACCUM POSITIVE
  417.     LXI    H,RND0        ;ADDRESS ROUNDER
  418.     CALL    ADD        ;ADD THE ROUNDER
  419.     CPI    201Q        ;CHECK FOR OVERFLOW
  420.     JNC    OUT2        ;IF EXP TOO LARGE
  421. ; SET DIGIT COUNTS
  422.     MVI    L,TMP2        ;ADDRESS DEC EXP
  423.     MOV    A,M
  424.     MOV    E,A        ;DIGITS BEFORE DECIMAL POINT
  425.     CPI    8        ;COMPARE TO LARGE EXP
  426.     JC    OUT6        ;IF EXPONENT IN RANGE
  427.     MVI    E,1        ;DIGITS BEFORE DECIMAL POINT
  428. OUT6:    SUB    E        ;ADJUST DEC EXP
  429.     MOV    M,A        ;DEC EXP
  430.     MVI    A,7        ;TOTAL NUMBER OF DIGITS
  431.     SUB    E        ;DIGITS AFTER DECIMAL POINT
  432.     INR    L        ;ADDRESS 2ND DIGIT CNT
  433.     MOV    M,A        ;DIGITS AFTER DEC POINT
  434.     DCR    E        ;DECREMENT DIGIT COUNT
  435.     MOV    A,E        ;DIGITS BEFORE DEC POINT
  436. ; OUTPUT SIGNIFICANT DIGITS
  437. OUT7:    MVI    L,TMP1        ;ADDRESS DIGIT COUNT
  438.     ADD    M        ;ADJUST DIGIT COUNT
  439.     MOV    M,A        ;NEW DIGIT COUNT
  440.     JM    OUT8        ;IF COUNT RUN OUT
  441.     LXI    H,FTEN        ;ADDRESS FLOATING TEN
  442.     CALL    MUL        ;MULTIPLY BY TEN
  443.     MVI    E,8        ;TO PLACE DIGIT IN REGISTER A
  444.     CALL    FIX        ;CONVERT TO FIXED POINT FORMAT
  445.     CALL    CHAD        ;CALL CHAR ADDRESS SUBROUTINE
  446.     MOV    M,A        ;SEND OUT DECIMAL DIGIT
  447.     XRA    A        ;CLEAR CURRENT DIGIT
  448.     MVI    E,8        ;BINARY SCALING FACTOR
  449.     CALL    FLT        ;RESTORE VALUE MINUS DIGIT
  450.     MVI    A,-1        ;TO ADJUST DIGIT COUNT
  451.     JMP    OUT7        ;LOOP FOR NEXT DIGIT
  452. OUT8:    MVI    L,TMP3        ;ADDRESS 2ND DIGIT CNT
  453.     MOV    A,M        ;DIGITS AFTER DECIMAL POINT
  454.     MVI    M,-1        ;SET 2ND COUNT NEGATIVE
  455.     ANA    A        ;SET CONTROL BITS
  456.     JM    OUT9        ;IF 2ND COUNT RAN OUT
  457.     CALL    CHAD        ;CALL CHAR ADDR SUBROUTINE
  458.     MVI    M,POINT        ;STORE DECIMAL POINT
  459.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  460.     JMP    OUT7        ;LOOP FOR NEXT DIGIT
  461. OUT9:    DCR    L        ;ADDRESS DECIMAL EXP
  462.     ANA    M        ;DEC EXP
  463.     JZ    OUT13        ;IF DEC EXP IS ZERO
  464. ; SEND OUT DECIMAL  EXPONENT
  465.     MVI    B,PLUS        ;PLUS CHARACTER
  466.     JP    OUT10        ;IF EXP IS POSITIVE
  467.     MVI    B,MINUS        ;CHANGE SIGN TO    MINUS
  468.     MOV    C,A        ;NEGATIVE EXP
  469.     XRA    A        ;CLEAR A REG
  470.     SUB    C        ;COMPLEMENT EXP
  471. OUT10:    MVI    C,-1        ;EMBRYO TENS DIGIT
  472. OUT11:    MOV    D,A        ;UNITS DIGIT
  473.     INR    C        ;INCREMENT TENS DIGIT
  474.     SUI    10        ;REDUCE REMAINDER
  475.     JNC    OUT11        ;IF MORE TENS
  476.     MVI    A,EXPO        ;EXPONENT SIGN
  477. OUT12:    CALL    CHAD        ;CHAR ADR SUBROUTINE
  478.     CALL    STR        ;STORE LAST 4 CHARACTERS
  479.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  480.     MVI    L,VALE        ;ADDRESS ACCUM SAVE AREA
  481.     JMP    LOD        ;RESTORE ACCUM AND EXIT
  482. ; SEND OUT 4 SPACES IF EXPONENT IS ZERO
  483. OUT13:    MVI    A,SPACE        ;SPACE CHARACTER
  484.     MOV    B,A
  485.     MOV    C,A
  486.     MOV    D,A
  487.     JMP    OUT12        ;STORE CHARACTERS
  488. ; SUBROUTINE TO SAVE CHARACTER STRING ADDRESS
  489. SVAD:    MOV    A,L        ;CHARACTER STRING WORD
  490.     MOV    B,H        ;CHARACTER STRING BANK
  491.     MVI    C,0        ;INPUT EXP OR DIGIT COUNT
  492.     MOV    D,C        ;DEC PNT FLAG OR DEC EXP
  493.     MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  494.     MVI    L,ADRL        ;ADDRESS CHAR STRING WORD
  495.     CALL    STR        ;STORE A,B,C,AND D
  496.     RET
  497. ; SUBROUTINE TO OBTAIN NEXT CHARACTER ADDRESS
  498. CHAD:    MVI    H,SCRB        ;ADDRESS SCRATCH BANK
  499.     MVI    L,ADRL        ;ADDRESS CHAR STRING    WORD
  500.     MOV    E,M        ;CHAR STRING WORD
  501.     INR    E        ;ADDRESS NEXT CHAR
  502.     MOV    M,E        ;UPDATE CHAR STRING WORD
  503.     INR    L        ;ADDRESS CHAR STRING BANK
  504.     MOV    H,M        ;CHAR STRING BANK
  505.     MOV    L,E        ;CHAR STRING WORD
  506.     RET
  507. FTEN:    DB    204Q,40Q,0,0        ;FLOATING TEN
  508. RND0:    DB    150Q,126Q,277Q,225Q ;.0000005Q
  509.     DB    0        ;CHECKSUM WORD
  510.     END    
  511.