home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug029.ark / FPINT.SRC < prev    next >
Encoding:
Text File  |  1984-04-29  |  7.4 KB  |  316 lines

  1.     NAME    FPINT    ;FLOATING POINT INTERFACE PACKAGE
  2.     CSEG        ;CODE SEGMENT
  3. ;
  4. ;    NOTE: THE JMP 0000 TO BUILD MUST BE PATCHED
  5. ;          JMP 0000 TO INTERP MUST BE PATCHED
  6. ;
  7. ;
  8. ;    EQUATES FOR CP/M SYSTEM
  9. BDOS    EQU    0005H    ;PRIMARY ENTRY POINT TO CP/M
  10. BOOT    EQU    0000H    ;REBOOT ENTRY POINT
  11. ;
  12. ;    PUBLIC SYMBOLS FOR MAIN PROGRAM
  13. ;
  14.     PUBLIC    BEGIN,START    ;BEGINNING OF BUILD, START OF INTERP
  15.     PUBLIC    MON1        ;FUNC,PARM INPUT, NO OUTPUT
  16.     PUBLIC    MON2        ;FUNC,PARM INPUT, BYTE OUTPUT
  17.     PUBLIC    MON3        ;SYSTEM REBOOT
  18. ;
  19.     PUBLIC    MOVEA        ;.SOURCE,DEST,N, MOVES BYTES
  20.     PUBLIC    MOVE4        ;SOURCE,DEST, MOVES 4 BYTES
  21. ;
  22.     PUBLIC    CBIN        ;CONVERT TO BINARY
  23.     PUBLIC    CFLT        ;CONVERT TO FLOAT
  24.     PUBLIC    FLTINP        ;FLOATING POINT INPUT
  25.     PUBLIC    FLTOUT        ;FLOATING POINT OUTPUT
  26.     PUBLIC    FPOUT        ;EQUIVALENT TO FLTOUT
  27.     PUBLIC    FLTRET        ;FLOATING POINT OPERATOR RETURN
  28.     PUBLIC    FLTOP        ;FLOATING POINT OPERATOR
  29. ;
  30. ;    SPECIAL PURPOSE SUBROUTINES
  31.     PUBLIC    INPUT    ;PORT, RETURNS BYTE
  32.     PUBLIC    OUTPUT    ;PORT, BYTE
  33.     PUBLIC    RANDOM
  34. ;
  35. ;    EXTERNAL SYMBOLS
  36.     EXTRN    FSTOR,FLOAD,FADD,FSUB,FMUL,FDIV,FABS,FZERO,FTEST,FCHS
  37.     EXTRN    OVER
  38.     EXTRN    FINP,FOUT,FFLOAT,FFIX
  39.     EXTRN    FSQRT,FCOS,FSIN,FATAN,FCOSH,FSINH,FEXP,FLOG
  40.     EXTRN    RAND
  41.     EXTRN    ACCUM
  42. ;
  43. ;    SUBROUTINES FOR MONITOR INTERFACE
  44. ;    START OF BASIC COMPILER
  45.     JMP    0000    ;PATCHED TO BUILD ENTRY POINT
  46. START:
  47.     JMP    0000    ;GO TO THE INTERPRETER
  48. BEGIN:    DW    0000    ;FILLED IN WHEN WE FIGURE OUT MEMORY MAP
  49. ;
  50. MON1:    JMP    BDOS
  51. MON2:    JMP    BDOS
  52. MON3:    JMP    BOOT
  53. ;
  54. ;    SPECIAL PURPOSE SUBROUTINE ENTRY POINTS
  55. ;
  56. ;    SUBROUTINES FOR STORAGE MOVE OPERATIONS
  57. MOVEA:    ;.SOURCE,DESTINATION,COUNT ADDRESSED BY B,C
  58.     MOV    H,B
  59.     MOV    L,C
  60.     MOV    C,M    ;LS SOURCE
  61.     INX    H
  62.     MOV    B,M    ;MS SOURCE
  63.     INX    H
  64.     MOV    E,M    ;LS DEST
  65.     INX    H
  66.     MOV    D,M    ;MS DEST
  67.     INX    H
  68.     MOV    A,M    ;LS COUNT
  69.     INX    H
  70.     MOV    H,M    ;MS COUNT
  71.     MOV    L,A    ;LS COUNT
  72. ;    SOURCE IN B,C  DEST IN D,E  COUNT IN H,L
  73. MOVER:    MOV    A,L    ;CHECK FOR ZERO COUNT
  74.     ORA    H    ;BOTH ZERO?
  75.     RZ
  76. ;    MOVE NEXT BYTE FROM SOURCE TO DESTINATION
  77.     DCX    H    ;COUNT = COUNT - 1
  78.     LDAX    B    ;BYTE TO REGISTER A
  79.     STAX    D    ;TO DESTINATION
  80.     INX    B    ;SOURCE = SOURCE + 1
  81.     INX    D    ;DEST = DEST + 1
  82.     JMP    MOVER    ;FOR THE NEXT BYTE
  83. ;
  84. MOVE4:    ;SOURCE IN B,C  DEST IN D,E
  85.     LXI    H,4
  86.     JMP    MOVER
  87. ;
  88. ;  FPINT IS AN INTERFACE PROGRAM BETWEEN THE
  89. ;  INTERPRETER AND THE FLOATING POINT PACKAGE
  90. ;      THE FLOATING POINT PACKAGE IS LOCATED AT
  91. ;
  92. ;  THERE ARE SIX ENTRY POINTS INTO FPINT:
  93. ;
  94. ;      (1) FLTINP - CONVERTS ASCII NUMERIC
  95. ;      STRING TO FLOATING POINT
  96. ;
  97. ;      (2) FLTOUT - CONVERTS FLOATING POINT
  98. ;      NUMBER TO AN ASCII STRING
  99. ;
  100. ;      (3) CBIN - CONVERTS FLOATING POINT
  101. ;      NUMBER TO A BINARY NUMBER
  102. ;
  103. ;      (4) CFLT - CONVERST BINARY NUMBER
  104. ;      TO A FLOATING POINT NUMBER
  105. ;
  106. ;      (5) FLTRET - PERFORMS FP ARITHMETIC
  107. ;      OPERATION AND STORES RESULT BACK INTO
  108. ;      AREA SPECIFIED BY THE INTERPRETER
  109. ;
  110. ;      (6) FLTOP - PERFORMS FP ARITHMETIC
  111. ;      OPERATION BUT DOES NOT STORE RESULT
  112. ;      BACK INTO INTERPRETER
  113. ;
  114. ;
  115. ;
  116. ;
  117. ;    ENTRY POINT FOR INP CALL (FUNCTION)
  118. ;    REG C CONTAINS NUMBER OF CHARACTERS TO CONVERT
  119. ;    REG D,E POINT TO CHAR STRING TO BE CONVERTED
  120. ;    TO FLOATING POINT REPRESENTATION. FIRST IT IS
  121. ;    MOVED TO ACCUM AND THEN CONVERTED.    THIS IS DONE
  122. ;    BECAUSE FP PKG REQUIRES ALL ADDRESSES BE ON ONE PAGE
  123. ;
  124. FLTINP:
  125.     MOV    A,C
  126.     ORA    A
  127.     JNZ    FLTI1
  128.     MVI    C,8
  129.     JMP    FLTOP
  130. FLTI1:    LXI    H,ACCUM    ;POINTER TO ACCUM
  131. INP1:    LDAX    D    ;LOAD A CHAR
  132.     SUI    30H    ;CONVERT TO INTERFACE CODE
  133.     MOV    M,A    ;STORE CHAR INTO ACCUM
  134.     INX    D    ;POINT TO NEXT CHAR
  135.     INX    H    ;POINT TO NEXT ACCUM LOC
  136.     DCR    C    ;DECREMENT COUNTER
  137.     JNZ    INP1    ;LOOP
  138.     MVI    A,011H    ;END OF STRING INDICATOR    
  139.     MOV    M,A
  140.     LXI    H,ACCUM    ;THIS IS WHERE STRING IS NOW
  141.     CALL    FINP    ;CALL FP PKG
  142.     RET        ;RETURN TO INTERP
  143. ;
  144. ;    ENTRY POINT FOR OUT CALL (FUNCTION 12)
  145. ;    CONVERT NUMBER IN FP ACCUM TO STRING AND PLACE IT
  146. ;    IN THE ADDRESS IN REG B,C. ACCUM USED AS INTERM.
  147. ;    STORAGE OF STRING.
  148. ;
  149. FPOUT:
  150. FLTOUT:
  151.     PUSH    B
  152.     LXI    H,ACCUM    ;TEMP STORE STRING HERE
  153.     CALL    FOUT    ;CONVERT TO ASCII
  154.     LXI    D,ACCUM+9    ;IS IT IN EXP FORM?
  155.     LDAX    D    ;IF SO THIS IS LETTER E
  156.     LXI    D,ACCUM+13    ;SETUP REG D,E
  157.     CPI    'E' - 30H    ;IS IT AN E?
  158.     JZ    FP2    ;YES LEAVE STRING AS IS
  159. FP1:
  160. ;    OTHERWISE REMOVE TRAILING BLANKS, ZEROS
  161.     DCX    D    ;NEXT LOCATION
  162.     LDAX    D    ;GET CHAR
  163.     CPI    0    ;A ZERO?
  164.     JZ    FP1    ;YES, SKIP IT
  165.     CPI    0F0H    ;A BLANK?
  166.     JZ    FP1    ;YES, SKIP IT
  167. ;    FOUND NON BLANK, NON ZERO CHAR
  168.     CPI    0FEH    ;IS IT TRAILING .
  169.     JNZ    FP3    ;IF SO ELIM 
  170. FP2:
  171.     DCX    D    ;IT WAS . SO ELIM
  172. FP3:
  173.     POP    H    ;ADDRESS TO STORE STRING
  174.     MOV    B,E    ;SAVE RIGHT END OF STRING
  175.     LXI    D,ACCUM    ;BEGINNING
  176. FP4:
  177.     LDAX    D    ;GET CHAR
  178.     ADI    30H    ;CONV TO ASCII
  179.     CPI    ' '    ;IF A BLANK DO NOT PASS 
  180.     JZ    FP5    ;TO MAIN PROGRAM IE SKIP IT
  181.     MOV    M,A    ;NOT BLANK MOVE IT
  182.     INX    H    ;NEXT LOCATION
  183. FP5:
  184.     MOV    A,E    ;CURRENT POS
  185.     INX    D    ;SETUP FOR NEXT CHAR
  186.     CMP    B    ;COMPLETE?
  187.     JNZ    FP4    ;NO    - CONTINUE
  188.     MVI    M,' '    ;LEAVE TRAILING BLANK
  189.     RET
  190. ;
  191. ;    ENTRY POINT FOR CONVERSION FROM F/P TO BINARY
  192. ;    REG B,C CONTAINS ADDRESS OF F/P NUMBER
  193. ;    BINARY NUMBER IS MOVED BACK TO REPLACE F/P NUMBER
  194. ;
  195. CBIN:    PUSH    B    ;SAVE ADDRESS
  196.     POP    D    ;NOW ADDRESS IN D,E
  197.     PUSH    D    ;SAVE AGAIN
  198.     MVI    C,2    ;LOAD FUNCTION NUMBER
  199.     CALL    FLTOP    ;GET F/P NUMBER INTO REG A-D
  200.     MVI    E,32    ;SET SCALING FACTOR
  201.     CALL    FFIX    ;CALL CONV ROUTINE
  202.     JMP EMPTY    ;MOVE BACK AND RETURN
  203. ;
  204. ;    ENTRY POINT FOR CONVERSION FROM BINARY TO F/P
  205. ;    REG B,C CONTAIN ADDRESS OF NUMBER TO CONV
  206. ;
  207. CFLT:    PUSH    B
  208.     POP    H    ;NOW ADDR IN H,L
  209.     PUSH    H    ;ALSO SAVE IT
  210.     CALL    FETCH    ;GET NUMBER TO REG A - D
  211.     MVI    E,32
  212.     CALL    FFLOAT    ;CALL CONV TO BINARY ROUTINE
  213.     JMP    EMPTY    ;MOVE BACK AND RET
  214. ;
  215. ;    BUILD JUMP TABLE FOR USE BY STORE AND ENTER
  216. ;
  217. JUMPT:
  218.     DW    INITP    ;FUNC = 0 INITIALIZE
  219.     DW    FSTOR    ;FUNC = 1 STORE ACCUM
  220.     DW    FLOAD    ;FUNC = 2 LOAD ACCUM
  221.     DW    FADD    ;FUNC = 3 ADD TO ACCUM
  222.     DW    FSUB    ;FUNC = 4 SUB FROM ACCUM
  223.     DW    FMUL    ;FUNC = 5 MULT ACCUM
  224.     DW    FDIV    ;FUNC = 6 DIV ACCUM
  225.     DW    FABS    ;FUNC = 7 ABSOLUTE VALUE
  226.     DW    FZERO    ;FUNC = 8 ZERO ACCUM
  227.     DW    FTEST    ;FUNC = 9 TEST FOR ZERO
  228.     DW    FCHS    ;FUNC = 10 COMPLEMENT ACCUM
  229.     DW    FSQRT    ;FUNC = 11 SQUARE ROOT
  230.     DW    FCOS    ;FUNC = 12 COSINE
  231.     DW    FSIN    ;FUNC = 13 SINE
  232.     DW    FATAN    ;FUNC = 14 ARCTAN
  233.     DW    FCOSH    ;FUNC = 15 COSH
  234.     DW    FSINH    ;FUNC = 16
  235.     DW    FEXP    ;FUNC = 17
  236.     DW    FLOG    ;FUNC = 18
  237. ;
  238. ;    ENTRY POINT WHEN RESULT IE FP ACCUM IS STORED
  239. ;        BACK INTO ADDRESS PASSED IN D,E.
  240. ;        REG C IS A FUNCTION
  241. ;        REG D,E IS ADDRESS OF PARAMETER
  242. ;
  243. FLTRET:    ;PERFORM OPERATION AND RETURN RESULT
  244.     PUSH    D    ;SAVE RETURN PARAMETER ADDRESS
  245.     CALL    FLTOP    ;RETURNS TO THIS ADDRESS
  246. EMPTY:    POP    H    ;RETURN PARAMETER ADDRESS
  247.     MOV    M,A
  248.     INX    H
  249.     MOV    M,B
  250.     INX    H
  251.     MOV    M,C
  252.     INX    H
  253.     MOV    M,D
  254.     RET
  255. ;
  256. ;
  257. ;    ENTRY POINT WHEN NO STORE BACK IS DESIRED
  258. ;        REG C IS FUNCTION
  259. ;        REG D,E IS A PARAMETER
  260. ;
  261. ;    GET PROPER FUNCTION BY ADDIING FUNCTION NUMBER IN B
  262. ;    REGISTER TO THE FIRST FUNCTION ADDRESS SETUP AS A DW
  263. ;
  264. FLTOP:
  265.     LXI     H,JUMPT
  266.     MVI    B,0
  267.     DAD     B
  268.     DAD     B
  269. ;
  270.     MOV    C,M
  271.     INX    H
  272.     MOV    B,M
  273.     LXI    H,JMPIN+1    ;CHANGE ADDRESS FIELD
  274.     MOV    M,C
  275.     INX    H
  276.     MOV    M,B
  277. ;    JMP INSTRUCTION CHANGED (CANNOT USE PCHL BECAUSE OF H,L PARAMETER)
  278.     XCHG    ;PARM TO H,L READY FOR CALL
  279. JMPIN:    JMP    0000    ;ADDRESS FIELD ALTERED ABOVE
  280. ;
  281. ;
  282. INITP:    XRA    A
  283.     STA    OVER
  284.     RET
  285. ;
  286. ;
  287. INPUT:    ;PORT NUMBER, RETURN VALUE IN A
  288.     LXI    H,INP+1
  289.     MOV    M,C    ;IN XX CHANGED
  290. INP:    IN    00    ;CHANGED ABOVE
  291.     RET
  292. ;
  293. OUTPUT:    ;PORT NUMBER, VALUE
  294.     LXI    H,OUTP+1
  295.     MOV    M,C    ;OUT INSTRUCTION CHANGED
  296.     MOV    A,E    ;VALUE TO SEND
  297. OUTP:    OUT    00    ;CHANGED ABOVE
  298.     RET
  299. ;
  300. RANDOM:    JMP    RAND
  301. ;
  302. ;    THE FOLLOWING SUBROUTINE MOVES A FOUR BYTE
  303. ;    QUANTITY FROM MEMORY TO REG A - D
  304. ;
  305. FETCH:
  306.     MOV    A,M
  307.     INX    H
  308.     MOV    B,M
  309.     INX    H
  310.     MOV    C,M
  311.     INX    H
  312.     MOV    D,M
  313.     RET
  314. ;
  315.     END
  316.