$CPU 8086 ' make compatible with XT systems $LIB ALL OFF ' turn off all PowerBASIC libraries $ERROR ALL OFF ' turn off all PowerBASIC error checking $OPTIMIZE SIZE ' optimize for smaller code $COMPILE UNIT ' compile to a UNIT (.PBU) '$COMPILE EXE ' compile to a UNIT (.PBU) DEFINT A-Z ' Required for all numeric functions, forces PB to not ' include floating point in UNIT (makes it smaller) '/*------------------------------------------------------------------*/ DECLARE FUNCTION GETSCREEN() AS STRING DECLARE SUB PUTSCREEN(BYVAL X AS STRING) DECLARE SUB GETFB(ATTR,CF,CB) DECLARE FUNCTION MKTATTR(CF,CB) AS INTEGER DECLARE SUB SAY(BYVAL Row AS INTEGER, BYVAL Col AS INTEGER, BYVAL Text AS STRING, BYVAL Attr AS INTEGER) DECLARE FUNCTION GETKEY() AS STRING DECLARE FUNCTION EVAL(BYVAL Expr$,ErrCode AS INTEGER) AS DOUBLE DECLARE SUB EDIT(ROW,COL,ATTR,LTH,F$,RKEY$,OPT$) '/*------------------------------------------------------------------*/ $CODE SEG "MLIB6" '/*------------------------------------------------------------------*/ FUNCTION LINECALC(ROW,COL,ATTR,NBR#) PUBLIC AS DOUBLE HSCREEN$ = GETSCREEN REDIM HIST$(24) IF ROW = 0 AND COL = 0 THEN OPT$ = "WS30" IF ROW = 0 THEN ROW = 25 IF COL = 0 THEN COL = 49 IF ATTR = 0 THEN BATTR = 48 EATTR = 31 ELSE BATTR = ATTR GETFB BATTR,AFC,ABC EATTR = MKTATTR(ABC,AFC) END IF IF NBR# = 0 THEN NBR$ = " " ELSE NBR$ = SETNBR(NBR#) SP = 1 CNT = 1 MH = ROW-1 DO H$ = TRIM$(NBR$) RKEY$ = CHR$(27,13,0,59,0,46) OPT$ = "END WS'30'" EDIT ROW,COL,ATTR,80,NBR$,RKEY$,OPT$ '/* --- Display Help? ---*/ IF RKEY$ = CHR$(0,59) THEN DHELP ATTR ITERATE END IF '/* --- Clear the Calculator? ---*/ IF RKEY$ = CHR$(0,46) THEN NBR$ = " " TOTAL$ = "" SP = 1 H$ = "" CNT = 1 T# = 0 PUTSCREEN HSCREEN$ ITERATE END IF IF TRIM$(NBR$) <> H$ THEN IF RKEY$ = CHR$(13) OR RKEY$ = CHR$(0,60) THEN HIST$(CNT) = TRIM$(NBR$) + " = " E = 0 T# = EVAL(NBR$,E) IF E > 0 THEN ITERATE TOTAL$ = SETNBR(T#) NBR$ = TOTAL$ HIST$(CNT) = HIST$(CNT) + TOTAL$ '/* SAY 1,1,"HIST = "+HIST$(CNT),29 '/* SAY 2,1,"NBR$ = "+NBR$,29 '/* SAY 3,1,"TOTAL$="+TOTAL$,29 '/* DHIST ROW,COL,CNT,MH,HIST$(),BATTR INCR CNT SP = 99 E = 0 END IF END IF LOOP UNTIL RKEY$ = CHR$(27) PUTSCREEN HSCREEN$ FUNCTION = VAL(TOTAL$) END FUNCTION '/*------------------------------------------------------------------*/ SUB DHELP(ATTR) LOCAL HSCREEN$ = GETSCREEN SAY 8,14," Clear = AltC, ESC = Exit ",ATTR SAY 9,14," Use: * / + - Multiplication, Division, Addition, ",ATTR SAY 10,14," and subtraction. ",ATTR SAY 11,14," \ % Integer Division, Modulus. ",ATTR SAY 12,14," ** ^ Raising to the power of. ",ATTR SAY 13,14," & | $ Logical AND, OR, and XOR. ",ATTR SAY 14,14," =< => <> Less than or Equal to, Greater than ",ATTR SAY 15,14," or Equal to, and Not Equal to. ",ATTR SAY 16,14," < > = Less than, Greater than, and Equal ",ATTR SAY 17,14," to. ",ATTR SAY 18,14," Example: 4 + 5 * (4 + 9) / 6 ",ATTR Y$ = GETKEY PUTSCREEN HSCREEN$ END SUB '/*------------------------------------------------------------------*/ SUB DHIST(ROW,COL,COUNT,MH,LL$(),ATTR) ' IF COUNT > MH THEN ' FOR R = 2 TO COUNT ' LL$(R-1) = LL$(R) ' NEXT R ' COUNT = MH ' END IF ' RCNT = COUNT + 1 ' FOR K = 1 TO COUNT ' RCNT = RCNT - 1 ' T$ = LL$(RCNT) + STRING$(80-LEN(LL$(RCNT)),32) ' SAY ROW-K,COL,T$,ATTR ' NEXT K END SUB '/*------------------------------------------------------------------*/ FUNCTION SETNBR(NBR#) AS STRING FUNCTION = RIGHT$(STR$(NBR#),LEN(STR$(NBR#))-1) END FUNCTION '/*------------------------------------------------------------------*/ ' $INCLUDE "c:\CODE\MLIB\MLIB.INC" ' T# = LINECALC(25,1,31,0) ' SAY 20,1,STR$(T#),29 ' Y$ = GETKEY