home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG029.ARK / FPCONV.SRC < prev    next >
Text File  |  1984-04-29  |  14KB  |  305 lines

  1.     NAME    FPCNV
  2.     CSEG
  3.  
  4.     PUBLIC    FFLOAT,FFIX,FINP,FOUT
  5.     EXTRN    FSTOR,FZERO,FABS,FTEST,FLOAD,FMUL
  6.     EXTRN    FDIV,FADD,ADD10,LSH,RSH,FCOMP
  7.     EXTRN    OVER,ACCE,ACCS,ACC1,ACC2,ACC3,SF
  8.     EXTRN    FTEN,RND0
  9.     EXTRN    ADRL,ADRH,TMP1,TMP2,TMP3,VALE,VAL1,VAL2,VAL3,TMP4
  10.  ;     8080 BINARY FLOATING POINT SYSTEM
  11.  ;     FORMAT CONVERSION PACKAGE
  12.  ;     PROGRAMMER  CAL OHME
  13.  ;     DATE  26 DECEMBER 1973
  14.  
  15.  
  16.  ;     SUBROUTINE TO CONVERT FROM FIXED
  17.  ;     POINT TO FLOATING POINT FORMAT.
  18.  FFLOAT: MOV     L,E;       INPUT EXPONENT
  19.         MOV     E,D;       4TH INPUT FRACTION
  20.         MOV     D,C;       3RD INPUT FRACTION
  21.         MOV     C,B;       2ND INPUT FRACTION
  22.         MOV     B,A;       1ST INPUT FRACTION
  23.         MOV     A,L;       INPUT EXPONENT
  24.         XRI     80H;  APPLY EXPONENT BIAS
  25.         LXI     H,ACCE;  TO ADDR ACCUM EXPONENT
  26.         MOV     M,A;       ACCUMULATOR EXPONENT
  27.         INR     L;       TO ADDRESS ACCUM SIGN
  28.         MVI     M,80H;  SET ACCUM SIGN POSITIVE
  29.         INR     L;       TO ADDR ACCUM 1ST FRCTN
  30.         MOV     A,B;       1ST INPUT FRACTION
  31.         ANA     A       ;       SET SIGN BIT
  32.         RAL     ;       INPUT SIGN TO CARRY
  33.         JMP     ADD10; COMPLETE CONVERSION
  34.  ;     SUBROUTINE TO CONVERT FROM FLOATING
  35.  ;     POINT TO FIXED POINT FORMAT.
  36.  FFIX:  LXI     H,ACCE;  TO ADDRESS SCRATCH BANK
  37.         MOV     A,M;       ACCUMULATOR EXPONENT
  38.         ANA     A       ;       SET CONTROL BITS
  39.         JZ      FIX1;  IF ACCUMULATOR IS ZERO
  40.         MOV     A,E;       INPUT EXPONENT
  41.         ADI     7FH;  APPLY BIAS - 1
  42.         SUB     M;       SHIFT COUNT - 1
  43.         RC      ;       RETURN IF ACCUM TOO LARGE
  44.         CPI     1FH;  COMPARE TO LARGE SHIFT
  45.         JNC     FIX1;  IF ACCUMULATOR TOO SMALL
  46.         ADI     1;     SHIFT COUNT
  47.         MVI     L,LOW(ACC1);  TO ADDR ACCUM 1ST FRCTN
  48.         MOV     B,M;       ACCUMULATOR 1ST FRACTION
  49.         INR     L;       TO ADDR ACCUM 2ND FRCTN
  50.         MOV     C,M;       ACCUMULATOR 2ND FRCTN
  51.         INR     L;       TO ADDR ACCUM 3RD FRCTN
  52.         MOV     D,M;       ACCUMULATOR 3RD FRCTN
  53.         CALL    RSH;   POSITION THE FRACTION
  54.         MVI     L,LOW(ACCS);  TO ADDR ACCUM SIGN
  55.         MOV     A,M;       ACCUMULATOR SIGN
  56.         ANA     A       ;       SET CONTROL BITS
  57.         CP      FCOMP;  COMPLEMENT FRCTN IF NEG
  58.         MVI     A,1;     NON-ZERO
  59.         ORA     B;       SET CONTROL BITS FOR EXIT
  60.         MOV     A,B;       1ST RESULT
  61.         MOV     B,C;       2ND RESULT
  62.         MOV     C,D;       3RD RESULT
  63.         MOV     D,E;       4TH RESULT
  64.         RET     ;       RETURN TO CALLER
  65.  FIX1:  XRA     A;       ZERO
  66.         MOV     B,A;       ZERO
  67.         MOV     C,A;       ZERO
  68.         MOV     D,A;       ZERO
  69.         RET     ;       RETURN TO CALLER
  70.         DB      0;     CHECKSUM WORD
  71.  ;     INP SUBROUTINE ENTRY POINT.
  72.  ;     INITIALIZE TEMPORARY STORAGE.
  73.  FINP:  MOV     E,M;       FIRST CHARACTER OF STRING
  74.         CALL    SVAD;  SET CHAR ADDR, PNT FLG, EXP
  75.         INR     L;       TO ADDRESS VALUE SIGN
  76.         MVI     M,80H;  SET VALUE SIGN POSITIVE
  77.         LXI     H,ACCE;  TO ADDR ACCUM EXPONENT
  78.         MOV     M,D;       SET ACCUM TO ZERO
  79.         MOV     A,E;       FIRST CHARACTER
  80.         CPI     0F0H;  COMPARE TO SPACE
  81.         JZ      INP1;  IF SPACE CHARACTER
  82.         CPI     0FBH;  COMPARE CHAR TO PLUS
  83.         JZ      INP1;  IF PLUS SIGN
  84.         CPI     0FDH;  COMPARE TO MINUS
  85.         JNZ     INP2;  IF NOT MINUS SIGN
  86.         LXI     H,TMP3;  TO ADDR VALUE SIGN
  87.         MOV     M,D;       SET VALUE SIGN NEGATIVE
  88.  ;     ANALYZE NEXT CHARACTER IN STRING.
  89.  INP1:  CALL    CHAD;  CALL CHAR ADDR SBRTN
  90.         MOV     A,M;       NEXT CHARACTER
  91.  INP2:  MVI     B,0;     DIGIT 2ND WD OR DEC EXP
  92.         CPI     0FEH;  COMPARE TO DECIMAL POINT
  93.         JZ      INP3;  IF DECIMAL POINT
  94.         CPI     15H;  COMPARE TO EXPONENT SIGN
  95.         JZ      INP4;  IF EXPONENT SIGN
  96.         CPI     0AH;   SET CARRY IF CHAR IS DIGIT
  97.         JNC     INP8;  IF CHAR IS NOT A DIGIT
  98.         LXI     H,TMP4;  TO ADDR CURRENT DIGIT
  99.         MOV     M,A;       SAVE CURRENT DIGIT
  100.         LXI     H,FTEN;  TO ADDR FLOATING TEN
  101.         CALL    FMUL;   MULTIPLY BY TEN
  102.         MVI     L,LOW(VALE);  TO ADDR VALUE
  103.         CALL    FSTOR;   STORE OLD VALUE TIMES TEN
  104.         INR     L;       TO ADDR CURRENT DIGIT
  105.         MOV     A,M;       CURRENT DIGIT
  106.         MVI     B,0;     CLEAR 2ND WORD OF DIGIT
  107.         MOV     C,B;       CLEAR 3RD WORD OF DIGIT
  108.         MOV     D,B;       CLEAR 4TH WORD OF DIGIT
  109.         MVI     E,8;  INDICATE DIGIT IS IN REG A
  110.         CALL    FFLOAT;   CONVERT DIGIT TO FLOATING PNT
  111.         MVI     L,LOW(VALE);  TO ADDR VALUE
  112.         CALL    FADD ;   ADD OLD VALUE TIMES TEN
  113.         MVI     L,LOW(TMP2);  TO ADDR DEC PNT FLAG
  114.         MOV     A,M;       DECIMAL POINT FLAG
  115.         ANA     A       ;       SET CONTROL BITS
  116.         JZ      INP1;  IF NO DEC PNT ENCOUNTERED
  117.         DCR     L;       TO ADDR INPUT EXPONENT
  118.         MOV     B,M;       INPUT EXPONENT
  119.         DCR     B;       DECREMENT INPUT EXPONENT
  120.         MOV     M,B;       UPDATE INPUT EXPONENT
  121.         JMP     INP1;  TO GET NEXT CHARACTER
  122.  INP3:  LXI     H,TMP2;  TO ADDR DEC PNT FLAG
  123.         XRA     M;       ZERO IF FLAG SET
  124.         MOV     M,A;       SET DEC PNT FLAG
  125.         JNZ     INP1;  IF FLAG NOT ALREADY SET
  126.         JMP     INP8;  IF 2ND DEC PNT
  127.  ;     PROCESS DECIMAL EXPONENT.
  128.  INP4:  CALL    CHAD;  CALL CHAR ADDR SBRTN
  129.         MOV     A,M;       NEXT CHARACTER OF STRING
  130.         MOV     B,A;       CURRENT CHARACTER
  131.         SUI     0FDH;  COMPARE TO MINUS CHAR
  132.         MOV     E,A;       CHAR - MINUS SIGN
  133.         JZ      INP5;  IF MINUS SIGN
  134.         ADI     2;     COMPARE TO PLUS CHAR
  135.         MOV     A,B;       CURRENT CHARACTER
  136.         JNZ     INP6;  IF NOT PLUS SIGN
  137.  INP5:  INR     L;       TO ADDRESS NEXT CHAR
  138.         MOV     A,M;       NEXT CHARACTER OF STRING
  139.  INP6:  MVI     B,0;     POSSIBLE DEC EXPONENT
  140.         CPI     0AH;   SET CARRY IF CHAR IS DIGIT
  141.         JNC     INP8;  IF CHAR IS NOT A DIGIT
  142.         MOV     B,A;       DEC EXP EQUAL DIGIT
  143.         INR     L;       TO ADDRESS NEXT CHAR
  144.         MOV     A,M;       NEXT CHARACTER OF STRING
  145.         CPI     0AH;   SET CARRY IF CHAR IS DIGIT
  146.         JNC     INP7;  IF CHAR IS NOT A DIGIT
  147.  ;     FORM COMPLETE DECIMAL EXPONENT.
  148.         MOV     C,A;       LS DIGIT OF DEC EXP
  149.         MOV     A,B;       MS DIGIT OF DEC EXP
  150.         ADD     A;       2 * MS DIGIT
  151.         ADD     A;       4 * MS DIGIT
  152.         ADD     B;       5 * MS DIGIT
  153.         ADD     A;       10 * MS DIGIT
  154.         ADD     C;       10 * MS + LS DIGIT
  155.         MOV     B,A;       DECIMAL EXPONENT
  156.  INP7:  MOV     A,E;       SIGN OF DEC EXPONENT
  157.         ANA     A       ;       SET CONTROL BITS
  158.         JNZ     INP8;  IF SIGN PLUS
  159.         SUB     B;       COMPLEMENT DEC EXP
  160.         MOV     B,A;       DECIMAL EXPONENT
  161.  INP8:  LXI     H,TMP3;  TO ADDRESS SCRATCH BANK
  162.         MOV     C,M;       INPUT SIGN
  163.         LXI     H,ACCS;  TO ADDRESS ACCUM SIGN
  164.         MOV     M,C;       ACCUMULATOR SIGN
  165.         MOV     A,B;       DECIMAL EXPONENT
  166.  ;     CONVERT DECIMAL EXPONENT TO BINARY.
  167.  INP9:  LXI     H,TMP1;  TO ADDRESS DEC EXPONENT
  168.         ADD     M;       ADJUST DECIMAL EXPONENT
  169.         JZ      FTEST;   IN DEC EXP IS ZERO
  170.         MOV     M,A;       CURRENT DECIMAL EXPONENT
  171.         LXI     H,FTEN;  TO ADDR FLOATING TEN
  172.         JP      INP10; IF MULTIPLY REQUIRED
  173.         CALL    FDIV;   DIVIDE BY TEN
  174.         MVI     A,1;     TO INCREMENT DEC EXP
  175.         JMP     INP9;  TO TEST FOR COMPLETION
  176.  INP10: CALL    FMUL;   MULTIPLY BY TEN
  177.         RC      ;       RETURN IF OVERFLOW
  178.         MVI     A,0FFH;  TO DECREMENT DEC EXP
  179.         JMP     INP9;  TO TEST FOR COMPLETION
  180.  ;     OUT SUBROUTINE ENTRY POINT.
  181.  ;     SAVE CHARACTER ADDRESS AND ACCUMULATOR.
  182.  FOUT:  DCR     L;       DECREMENT CHARACTER ADDRESS
  183.         CALL    SVAD;  SET CHAR ADDR, DIG CNT, DEC EXP
  184.         CALL    FTEST;   LOAD ACCUM TO REGISTERS
  185.         LXI     H,VALE;  TO ADDR ACCUM SAVE AREA
  186.         CALL    FSTOR;   CALL REG STR SUBROUTINE
  187.  ;     OUTPUT SIGN CHARACTER.
  188.         CALL    CHAD;  CALL CHAR ADDR SBRTN
  189.         MVI     M,0F0H;  STORE SPACE CHARACTER
  190.         ANA     A       ;       SET CONTROL BITS
  191.         JZ      OUT3;  IF ACCUMULATOR IS ZERO
  192.         MOV     E,A;       ACCUMULATOR EXPONENT
  193.         MOV     A,B;       ACCUM SIGN AND 1ST FRCTN
  194.         ANA     A       ;       SET CONTROL BITS
  195.         MOV     A,E;       ACCUMULATOR EXPONENT
  196.         JP      OUT1;  IF ACCUM IS POSITIVE
  197.         MVI     M,0FDH;  CHANGE SIGN TO MINUS
  198.  ;     SCALE ACCUMULATOR TO .1 - 1. RANGE.
  199.  OUT1:  CPI     7EH;  COMPARE TO SMALL EXPONENT
  200.  OUT2:  LXI     H,FTEN;  TO ADDR FLOATING TEN
  201.         JC      OUT4;  IF EXPONENT TOO SMALL
  202.         CPI     81H;  COMPARE TO LARGE EXP
  203.         JC      OUT5;  IF EXP SMALL ENOUGH
  204.         CALL    FDIV;   DIVIDE BY TEN
  205.  OUT3:  LXI     H,TMP2;  TO ADDRESS SCRATCH BANK
  206.         MOV     E,M;       DECIMAL EXPONENT
  207.         INR     E;       INCREMENT DECIMAL EXPONENT
  208.         MOV     M,E;       DECIMAL EXPONENT
  209.         JMP     OUT2;  TO TEST FOR SCALING COMPLETE
  210.  OUT4:  CALL    FMUL;   MULTIPLY BY TEN
  211.         LXI     H,TMP2;  TO ADDR DECIMAL EXPONENT
  212.         MOV     E,M;       DECIMAL EXPONENT
  213.         DCR     E;       DECREMENT DECIMAL EXPONENT
  214.         MOV     M,E;       DECIMAL EXPONENT
  215.         JMP     OUT1;  TO TEST FOR SCALING COMPLETE
  216.  ;     ROUND THE VALUE BY ADDING .00000005.
  217.  OUT5:  CALL    FABS;   SET ACCUM POSITIVE
  218.         LXI     H,RND0;  TO ADDRESS ROUNDER
  219.         CALL    FADD;   ADD THE ROUNDER
  220.         CPI     81H;  CHECK FOR OVERFLOW
  221.         JNC     OUT2;  IF EXP TOO LARGE
  222.  ;     SET DIGIT COUNTS.
  223.         LXI     H,TMP2;  TO ADDR DECIMAL EXPONENT
  224.         MOV     A,M;       DECIMAL EXPONENT
  225.         MOV     E,A;       DIGITS BEFORE DEC POINT
  226.         CPI     8;  COMPARE TO LARGE EXP
  227.         JC      OUT6;  IF EXPONENT IN RANGE
  228.         MVI     E,1;     DIGITS BEFORE DEC POINT
  229.  OUT6:  SUB     E;       ADJUST DEC EXPONENT
  230.         MOV     M,A;       DECIMAL EXPONENT
  231.         MVI     A,7;     TOTAL NUMBER OF DIGITS
  232.         SUB     E;       DIGITS AFTER DECIMAL PNT
  233.         INR     L;       TO ADDR 2ND DIGIT CNT
  234.         MOV     M,A;       DIGITS AFTER DECIMAL POINT
  235.         DCR     E;       DECREMENT DIGIT COUNT
  236.         MOV     A,E;       DIGITS BEFORE DEC PNT
  237.  ;     OUTPUT SIGNIFICANT DIGITS.
  238.  OUT7:  LXI     H,TMP1;  TO ADDR DIGIT COUNT
  239.         ADD     M;       ADJUST DIGIT COUNT
  240.         MOV     M,A;       NEW DIGIT COUNT
  241.         JM      OUT8;  IF COUNT RUN OUT
  242.         LXI     H,FTEN;  TO ADDR FLOATING TEN
  243.         CALL    FMUL;   MULTIPLY BY TEN
  244.         MVI     E,8;   TO PLACE DIGIT IN REG A
  245.         CALL    FFIX;   CONVERT TO FIXED FORMAT
  246.         CALL    CHAD;  CALL CHAR ADDR SBRTN
  247.         MOV     M,A;       OUTPUT DECIMAL DIGIT
  248.         XRA     A;       CLEAR CURRENT DIGIT
  249.         MVI     E,8;  BINARY SCALING FACTOR
  250.         CALL    FFLOAT;   RESTORE VALUE MINUS DIGIT
  251.         MVI     A,0FFH;  TO ADJUST DIGIT CNT
  252.         JMP     OUT7;  LOOP FOR NEXT DIGIT
  253.  OUT8:  LXI     H,TMP3;  TO ADDR 2ND DIGIT CNT
  254.         MOV     A,M;       DIGITS AFTER DECIMAL PNT
  255.         MVI     M,0FFH;  SET 2ND COUNT NEG
  256.         ANA     A       ;       SET CONTROL BITS
  257.         JM      OUT9;  IF 2ND COUNT RAN OUT
  258.         CALL    CHAD;  CALL CHAR ADDR SBRTN
  259.         MVI     M,0FEH;  STORE DECIMAL POINT
  260.         JMP     OUT7;  LOOP FOR NEXT DIGIT
  261.  OUT9:  DCR     L;       TO ADDR DECIMAL EXP
  262.         ANA     M       ;       DECIMAL EXPONENT
  263.         JZ      OUT13; IF DECIMAL EXPONENT IS ZERO
  264.  ;     OUTPUT DECIMAL EXPONENT.
  265.         MVI     B,0FBH;  PLUS CHARACTER
  266.         JP      OUT10; IF EXPONENT IS POSITIVE
  267.         MVI     B,0FDH;  CHANGE SIGN TO MINUS
  268.         MOV     C,A;       NEGATIVE EXPONENT
  269.         XRA     A;       ZERO
  270.         SUB     C;       COMPLEMENT EXPONENT
  271.  OUT10: MVI     C,0FFH;  EMBRYO TENS DIGIT
  272.  OUT11: MOV     D,A;       UNITS DIGIT
  273.         INR     C;       INCREMENT TENS DIGIT
  274.         SUI     0AH;  REDUCE REMAINDER
  275.         JNC     OUT11; IF MORE TENS
  276.         MVI     A,15H;  EXPONENT SIGN
  277.  OUT12: CALL    CHAD;  CALL CHAR ADDR SBRTN
  278.         CALL    FSTOR;   STORE LAST 4 CHARACTERS
  279.         LXI     H,VALE;  TO ADDRESS ACCUM SAVE AREA
  280.         JMP     FLOAD;   RESTORE ACCUM AND EXIT
  281.  ;     OUTPUT 4 SPACES IF EXPONENT IS ZERO.
  282.  OUT13: MVI     A,0F0H;  SPACE CHARACTER
  283.         MOV     B,A;       SPACE CHARACTER
  284.         MOV     C,A;       SPACE CHARACTER
  285.         MOV     D,A;       SPACE CHARACTER
  286.         JMP     OUT12; TO STORE CHARACTERS
  287.  ;     SUBROUTINE TO SAVE CHARACTER STRING ADDR.
  288.  SVAD:  MOV     A,L;       CHARACTER STRING WORD
  289.         MOV     B,H;       CHARACTER STRING BANK
  290.         MVI     C,0;     INPUT EXP OR DIGIT CNT
  291.         MOV     D,C;       DEC PNT FLAG OR DEC EXP
  292.         LXI     H,ADRL;  TO ADDR CHAR STRING WORD
  293.         CALL    FSTOR;   STORE A, B, C, AND D
  294.         RET     ;       RETURN TO CALLER
  295.  ;     SUBROUTINE TO OBTAIN NEXT CHARACTER ADDR.
  296.  CHAD:  LXI     H,ADRL;  TO ADDRESS SCRATCH BANK
  297.         MOV     E,M;       CHARACTER STRING WORD
  298.         INR     E;       TO ADDR NEXT CHARACTER
  299.         MOV     M,E;       UPDATE CHAR STRING WORD
  300.         INR     L;       TO ADDR CHAR STRING BANK
  301.         MOV     H,M;       CHARACTER STRING BANK
  302.         MOV     L,E;       CHARACTER STRING WORD
  303.         RET     ;       RETURN TO CALLER
  304.     END
  305.