mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
Upload
Digital Research
This commit is contained in:
315
ASSEMBLY & COMPILE TOOLS/Basic-E/source/FPINT.SRC
Normal file
315
ASSEMBLY & COMPILE TOOLS/Basic-E/source/FPINT.SRC
Normal file
@@ -0,0 +1,315 @@
|
||||
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
|
Reference in New Issue
Block a user