* * FLOAT THE VALUE IN HL TO TOP OF STACK * FLOAT LXI D,OBUF CALL CNS MVI A,CR STAX D LXI D,OBUF LOAD OBUF INTO D LXI H,FPSIN CALL FPIN LXI H,FPSINK JMP PSHAS PUTS THE CONVERTED VALUE ON STACK AND RETURN * * FIX FLOATING TO INTEGER * RETURN INTEGER VALUE IN DE * FP VALUE FROM TOP OF ARG STACK, POP ARG STACK * ZERO FLAG SET IF ZERO RESULT * PFIXE CALL NFIXE FIXCK MOV A,B ORA A JNZ OBERR CAN'T BE NEG MOV A,D ORA E SET/CLEAR Z FLAG RET * PFIX CALL NFIX JMP FIXCK * NFIXE CALL EXPRB ENTRY POINT THAT GETS EXPRESSION FROM TEXT * NFIX CALL TOPFP PUSH H CALL FINT CALL POPFP POP TOP FP TO FPSINK POP H MOV A,M EXPONENT MOV C,M TWICE DCX H POINT TO SIGN MOV B,M GET IT LXI D,-FPSIZ+1 DAD D H NOW POINTS TO MSB-1 LXI D,0 IN CASE OF ZERO ORA A RZ . RETURN IF ZERO DCR C SET UP FOR LOOP * PFIX1 INX H MOV A,M RRC RRC RRC RRC PUSH H CALL MUL10 POP H JC OBERR DCR C JP PFIX2 MOV A,M PUSH H CALL MUL10 POP H JC OBERR DCR C JM PFIX1 * PFIX2 MOV A,D ORA E RET . B = 0 FOR POS; B = 1 FOR NEG * * GET INTEGER FROM TXA * SET CARRY IF NOT FOUND * RETURNS INTEGER VALUE IN HL * RETURNS TERMINATOR IN ACC * INTGER LHLD TXA DO THIS TO SKIP OVER LEADING BLANKS SHLD STRPT CALL GNC1 CMC RC LXI D,0 * INTG1 CALL MUL10 JC OBERR CALL GNC JC INTG1 LOOP IF CHAR IS ANOTHER DIGIT LHLD STRPT DCX H LEAVE TXA POINTING TO TERMINATOR (BLANK OR WHATEVE SHLD TXA TXA WILL POINT 1 AFTER LAST DIGIT XCHG RET . CARRY IS CLEAR * * GET CODED LINE NUMBER FOR GOTO, GOSUB OR ON STATEMENT * LNUM MVI A,LNRW CALL SCANC RC . NO LN * MOV E,M INX H HIGH ORDER MOV D,M INX H SHLD TXA XCHG . TO HL, TXA TO DE * ORA A TO CLEAR CARRY RET * * CONVERT INTEGER TO STRING * DE CONTAINS ADDRESS OF STRING, RETURN UPDATED VALUE IN DE * HL CONTAINS VALUE TO CONVERT * CNS XRA A SET FOR NO LEADING BLANKS CLNS LXI B,-10000 * * AT THIS POINT: * A = 0 FOR NO LEADING CHARACTERS * A = 1 FOR LEADING ZEROS * A = ' ' FOR LEADING BLANKS * CALL RSUBX LXI B,-1000 CALL RSUBX CNS3 LXI B,-100 ENTRY POINT FROM FPOUT FOR EXPONENT CALL RSUBX CNS1 LXI B,-10 CALL RSUBX LXI B,-1 MOV A,B FORCE A FINAL ZERO CALL RSUBX RET * * TAKES VALUE IN HL * SUB MINUS NUMBER IN BE THE MOST POSSIBLE TIMES * PUT VALUE ON STRING AT DE * IF A=0 THEN DONT PUT BLANK ON STRING * RETURN NON-ZERO IN A IF SOMETHING PUT ON STRING * RSUBX PUSH D MVI D,-1 * RSUB9 INR D DAD B JC RSUB9 * * SUBTRACT OVERFLOWED, ADD BACK LAST VALUE TO MAKE POSITIVE * PUSH PSW MOV A,B CMA MOV B,A MOV A,C CMA MOV C,A INX B DAD B POP PSW * MOV B,D POP D ORA B A GETS 0 IFF A IS 0 AND B IS 0 RZ * SUI ' ' ORA B JNZ RSUB2 IF A=' ' AND B=0 THEN LEADING BLANKS MVI A,' ' JMP RSUB3 * * RSUB2 MVI A,'0' ADD B RSUB3 STAX D INX D RET * * TAKE NEXT DIGIT IN A (MASK TO 17Q) * ACCUMULATE TO VALUE IN DE * PRESERVES ALL BUT A, DE * MUL10 MOV H,D MOV L,E DAD H GIVING 2X RC DAD H GIVING 4X RC DAD D GIVING 5X RC DAD H GIVING 10X RC XCHG ANI 17Q ADD E MOV E,A MOV A,D ACI 0 PROPOGATE THE CARRY MOV D,A RET * * TAKES ADDRESS OF FP VALUE IN HL * HL PRESERVED * SETS Z IF THE VALUE IS INTEGRAL * ITEST PUSH H PUSH H LXI D,FPSIN PUSH D PUSH D CALL VCOPY POP D CALL FINT CONVERT THE FPSINK ONE TO INTEGER POP H FPSINK POP D ORIGINAL VALUE CALL RELOP WILL RETURN WITH Z SET OR CLEAR POP H RET * *