mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 07:54:25 +00:00
316 lines
7.0 KiB
Plaintext
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
|