Files
Digital-Research-Source-Code/ASSEMBLY & COMPILE TOOLS/Basic-E/source/FPINT.SRC
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

316 lines
7.0 KiB
Plaintext

NAME FPINT ;FLOATING POINT INTERFACE PACKAGE
CSEG ;CODE SEGMENT
;
; NOTE: THE JMP 0000 TO BUILD MUST BE PATCHED
; JMP 0000 TO INTERP MUST BE PATCHED
;
;
; EQUATES FOR CP/M SYSTEM
BDOS EQU 0005H ;PRIMARY ENTRY POINT TO CP/M
BOOT EQU 0000H ;REBOOT ENTRY POINT
;
; PUBLIC SYMBOLS FOR MAIN PROGRAM
;
PUBLIC BEGIN,START ;BEGINNING OF BUILD, START OF INTERP
PUBLIC MON1 ;FUNC,PARM INPUT, NO OUTPUT
PUBLIC MON2 ;FUNC,PARM INPUT, BYTE OUTPUT
PUBLIC MON3 ;SYSTEM REBOOT
;
PUBLIC MOVEA ;.SOURCE,DEST,N, MOVES BYTES
PUBLIC MOVE4 ;SOURCE,DEST, MOVES 4 BYTES
;
PUBLIC CBIN ;CONVERT TO BINARY
PUBLIC CFLT ;CONVERT TO FLOAT
PUBLIC FLTINP ;FLOATING POINT INPUT
PUBLIC FLTOUT ;FLOATING POINT OUTPUT
PUBLIC FPOUT ;EQUIVALENT TO FLTOUT
PUBLIC FLTRET ;FLOATING POINT OPERATOR RETURN
PUBLIC FLTOP ;FLOATING POINT OPERATOR
;
; SPECIAL PURPOSE SUBROUTINES
PUBLIC INPUT ;PORT, RETURNS BYTE
PUBLIC OUTPUT ;PORT, BYTE
PUBLIC RANDOM
;
; EXTERNAL SYMBOLS
EXTRN FSTOR,FLOAD,FADD,FSUB,FMUL,FDIV,FABS,FZERO,FTEST,FCHS
EXTRN OVER
EXTRN FINP,FOUT,FFLOAT,FFIX
EXTRN FSQRT,FCOS,FSIN,FATAN,FCOSH,FSINH,FEXP,FLOG
EXTRN RAND
EXTRN ACCUM
;
; SUBROUTINES FOR MONITOR INTERFACE
; START OF BASIC COMPILER
JMP 0000 ;PATCHED TO BUILD ENTRY POINT
START:
JMP 0000 ;GO TO THE INTERPRETER
BEGIN: DW 0000 ;FILLED IN WHEN WE FIGURE OUT MEMORY MAP
;
MON1: JMP BDOS
MON2: JMP BDOS
MON3: JMP BOOT
;
; SPECIAL PURPOSE SUBROUTINE ENTRY POINTS
;
; SUBROUTINES FOR STORAGE MOVE OPERATIONS
MOVEA: ;.SOURCE,DESTINATION,COUNT ADDRESSED BY B,C
MOV H,B
MOV L,C
MOV C,M ;LS SOURCE
INX H
MOV B,M ;MS SOURCE
INX H
MOV E,M ;LS DEST
INX H
MOV D,M ;MS DEST
INX H
MOV A,M ;LS COUNT
INX H
MOV H,M ;MS COUNT
MOV L,A ;LS COUNT
; SOURCE IN B,C DEST IN D,E COUNT IN H,L
MOVER: MOV A,L ;CHECK FOR ZERO COUNT
ORA H ;BOTH ZERO?
RZ
; MOVE NEXT BYTE FROM SOURCE TO DESTINATION
DCX H ;COUNT = COUNT - 1
LDAX B ;BYTE TO REGISTER A
STAX D ;TO DESTINATION
INX B ;SOURCE = SOURCE + 1
INX D ;DEST = DEST + 1
JMP MOVER ;FOR THE NEXT BYTE
;
MOVE4: ;SOURCE IN B,C DEST IN D,E
LXI H,4
JMP MOVER
;
; FPINT IS AN INTERFACE PROGRAM BETWEEN THE
; INTERPRETER AND THE FLOATING POINT PACKAGE
; THE FLOATING POINT PACKAGE IS LOCATED AT
;
; THERE ARE SIX ENTRY POINTS INTO FPINT:
;
; (1) FLTINP - CONVERTS ASCII NUMERIC
; STRING TO FLOATING POINT
;
; (2) FLTOUT - CONVERTS FLOATING POINT
; NUMBER TO AN ASCII STRING
;
; (3) CBIN - CONVERTS FLOATING POINT
; NUMBER TO A BINARY NUMBER
;
; (4) CFLT - CONVERST BINARY NUMBER
; TO A FLOATING POINT NUMBER
;
; (5) FLTRET - PERFORMS FP ARITHMETIC
; OPERATION AND STORES RESULT BACK INTO
; AREA SPECIFIED BY THE INTERPRETER
;
; (6) FLTOP - PERFORMS FP ARITHMETIC
; OPERATION BUT DOES NOT STORE RESULT
; BACK INTO INTERPRETER
;
;
;
;
; ENTRY POINT FOR INP CALL (FUNCTION)
; REG C CONTAINS NUMBER OF CHARACTERS TO CONVERT
; REG D,E POINT TO CHAR STRING TO BE CONVERTED
; TO FLOATING POINT REPRESENTATION. FIRST IT IS
; MOVED TO ACCUM AND THEN CONVERTED. THIS IS DONE
; BECAUSE FP PKG REQUIRES ALL ADDRESSES BE ON ONE PAGE
;
FLTINP:
MOV A,C
ORA A
JNZ FLTI1
MVI C,8
JMP FLTOP
FLTI1: LXI H,ACCUM ;POINTER TO ACCUM
INP1: LDAX D ;LOAD A CHAR
SUI 30H ;CONVERT TO INTERFACE CODE
MOV M,A ;STORE CHAR INTO ACCUM
INX D ;POINT TO NEXT CHAR
INX H ;POINT TO NEXT ACCUM LOC
DCR C ;DECREMENT COUNTER
JNZ INP1 ;LOOP
MVI A,011H ;END OF STRING INDICATOR
MOV M,A
LXI H,ACCUM ;THIS IS WHERE STRING IS NOW
CALL FINP ;CALL FP PKG
RET ;RETURN TO INTERP
;
; ENTRY POINT FOR OUT CALL (FUNCTION 12)
; CONVERT NUMBER IN FP ACCUM TO STRING AND PLACE IT
; IN THE ADDRESS IN REG B,C. ACCUM USED AS INTERM.
; STORAGE OF STRING.
;
FPOUT:
FLTOUT:
PUSH B
LXI H,ACCUM ;TEMP STORE STRING HERE
CALL FOUT ;CONVERT TO ASCII
LXI D,ACCUM+9 ;IS IT IN EXP FORM?
LDAX D ;IF SO THIS IS LETTER E
LXI D,ACCUM+13 ;SETUP REG D,E
CPI 'E' - 30H ;IS IT AN E?
JZ FP2 ;YES LEAVE STRING AS IS
FP1:
; OTHERWISE REMOVE TRAILING BLANKS, ZEROS
DCX D ;NEXT LOCATION
LDAX D ;GET CHAR
CPI 0 ;A ZERO?
JZ FP1 ;YES, SKIP IT
CPI 0F0H ;A BLANK?
JZ FP1 ;YES, SKIP IT
; FOUND NON BLANK, NON ZERO CHAR
CPI 0FEH ;IS IT TRAILING .
JNZ FP3 ;IF SO ELIM
FP2:
DCX D ;IT WAS . SO ELIM
FP3:
POP H ;ADDRESS TO STORE STRING
MOV B,E ;SAVE RIGHT END OF STRING
LXI D,ACCUM ;BEGINNING
FP4:
LDAX D ;GET CHAR
ADI 30H ;CONV TO ASCII
CPI ' ' ;IF A BLANK DO NOT PASS
JZ FP5 ;TO MAIN PROGRAM IE SKIP IT
MOV M,A ;NOT BLANK MOVE IT
INX H ;NEXT LOCATION
FP5:
MOV A,E ;CURRENT POS
INX D ;SETUP FOR NEXT CHAR
CMP B ;COMPLETE?
JNZ FP4 ;NO - CONTINUE
MVI M,' ' ;LEAVE TRAILING BLANK
RET
;
; ENTRY POINT FOR CONVERSION FROM F/P TO BINARY
; REG B,C CONTAINS ADDRESS OF F/P NUMBER
; BINARY NUMBER IS MOVED BACK TO REPLACE F/P NUMBER
;
CBIN: PUSH B ;SAVE ADDRESS
POP D ;NOW ADDRESS IN D,E
PUSH D ;SAVE AGAIN
MVI C,2 ;LOAD FUNCTION NUMBER
CALL FLTOP ;GET F/P NUMBER INTO REG A-D
MVI E,32 ;SET SCALING FACTOR
CALL FFIX ;CALL CONV ROUTINE
JMP EMPTY ;MOVE BACK AND RETURN
;
; ENTRY POINT FOR CONVERSION FROM BINARY TO F/P
; REG B,C CONTAIN ADDRESS OF NUMBER TO CONV
;
CFLT: PUSH B
POP H ;NOW ADDR IN H,L
PUSH H ;ALSO SAVE IT
CALL FETCH ;GET NUMBER TO REG A - D
MVI E,32
CALL FFLOAT ;CALL CONV TO BINARY ROUTINE
JMP EMPTY ;MOVE BACK AND RET
;
; BUILD JUMP TABLE FOR USE BY STORE AND ENTER
;
JUMPT:
DW INITP ;FUNC = 0 INITIALIZE
DW FSTOR ;FUNC = 1 STORE ACCUM
DW FLOAD ;FUNC = 2 LOAD ACCUM
DW FADD ;FUNC = 3 ADD TO ACCUM
DW FSUB ;FUNC = 4 SUB FROM ACCUM
DW FMUL ;FUNC = 5 MULT ACCUM
DW FDIV ;FUNC = 6 DIV ACCUM
DW FABS ;FUNC = 7 ABSOLUTE VALUE
DW FZERO ;FUNC = 8 ZERO ACCUM
DW FTEST ;FUNC = 9 TEST FOR ZERO
DW FCHS ;FUNC = 10 COMPLEMENT ACCUM
DW FSQRT ;FUNC = 11 SQUARE ROOT
DW FCOS ;FUNC = 12 COSINE
DW FSIN ;FUNC = 13 SINE
DW FATAN ;FUNC = 14 ARCTAN
DW FCOSH ;FUNC = 15 COSH
DW FSINH ;FUNC = 16
DW FEXP ;FUNC = 17
DW FLOG ;FUNC = 18
;
; ENTRY POINT WHEN RESULT IE FP ACCUM IS STORED
; BACK INTO ADDRESS PASSED IN D,E.
; REG C IS A FUNCTION
; REG D,E IS ADDRESS OF PARAMETER
;
FLTRET: ;PERFORM OPERATION AND RETURN RESULT
PUSH D ;SAVE RETURN PARAMETER ADDRESS
CALL FLTOP ;RETURNS TO THIS ADDRESS
EMPTY: POP H ;RETURN PARAMETER ADDRESS
MOV M,A
INX H
MOV M,B
INX H
MOV M,C
INX H
MOV M,D
RET
;
;
; ENTRY POINT WHEN NO STORE BACK IS DESIRED
; REG C IS FUNCTION
; REG D,E IS A PARAMETER
;
; GET PROPER FUNCTION BY ADDIING FUNCTION NUMBER IN B
; REGISTER TO THE FIRST FUNCTION ADDRESS SETUP AS A DW
;
FLTOP:
LXI H,JUMPT
MVI B,0
DAD B
DAD B
;
MOV C,M
INX H
MOV B,M
LXI H,JMPIN+1 ;CHANGE ADDRESS FIELD
MOV M,C
INX H
MOV M,B
; JMP INSTRUCTION CHANGED (CANNOT USE PCHL BECAUSE OF H,L PARAMETER)
XCHG ;PARM TO H,L READY FOR CALL
JMPIN: JMP 0000 ;ADDRESS FIELD ALTERED ABOVE
;
;
INITP: XRA A
STA OVER
RET
;
;
INPUT: ;PORT NUMBER, RETURN VALUE IN A
LXI H,INP+1
MOV M,C ;IN XX CHANGED
INP: IN 00 ;CHANGED ABOVE
RET
;
OUTPUT: ;PORT NUMBER, VALUE
LXI H,OUTP+1
MOV M,C ;OUT INSTRUCTION CHANGED
MOV A,E ;VALUE TO SEND
OUTP: OUT 00 ;CHANGED ABOVE
RET
;
RANDOM: JMP RAND
;
; THE FOLLOWING SUBROUTINE MOVES A FOUR BYTE
; QUANTITY FROM MEMORY TO REG A - D
;
FETCH:
MOV A,M
INX H
MOV B,M
INX H
MOV C,M
INX H
MOV D,M
RET
;
END