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