rem This could become a nice program rem with a little work! rem rem jezar@cix rem Public Domain. rem PROC minicalc: global string$(255),straddr% local old$(255),float,long& global binchar$(1),octchar$(1) binchar$="?" octchar$="@" straddr%=addr(string$) Print "SIMPLE CALCULATOR" print "Prefix HEX numbers with a &" print "Prefix OCTAL numbers with a",octchar$ print "Prefix BINARY numbers with a",binchar$ print "Type an expression:" while 1 print ">"; edit string$ old$=string$ if string$="" continue endif string$=string$+chr$(0) if conv%:(binchar$,2) or conv%:(octchar$,8) continue endif fixup%:(straddr%) onerr message float = eval(string$) onerr over rem some obscure "sign" bugs rem are hiding here... long& = float onerr off if long&=float print "",binchar$;base$:(long&,2) print "",octchar$;base$:(long&,8) print " &";base$:(long&,16) if long&<0 print " ",long&+4294967296 endif endif ovc:: print " ",float erc:: string$=old$ endwh message:: print "Error:",err$(err) goto erc over:: goto ovc ENDP proc conv%:(symbol$,radix%) local locate%,error% do locate%=loc(string$,symbol$) if locate% error%=tostr%:(straddr%+locate%+1,radix%) if error% print "Error",error%,"in",symbol$,"number." endif endif until locate%=0 or error% return error% endp proc tostr%:(str%,radix%) local ax%,bx%,cx%,dx%,si%,di% local flags%,reg% reg%=addr(ax%) rem String to integer cx%=radix% rem Base whatever... si%=str% ax%=$0600 flags%=os($8a,reg%) if flags% and 1 return ax% or $ff00 endif rem Integer to string dx%=ax% cx%=10 rem Base 10 di%=str%-1 ax%=$0100 os($8a,reg%) rem String copy (close gap) di%=di%+ax% ax%=0 os($ac,reg%) fixup%:(straddr%) endp proc fixup%:(adr%) local ax%,bx%,cx%,dx%,si%,di% rem revalidate OPL string. di%=adr%+1 ax%=0 os($b9,addr(ax%)) pokeb adr%,ax% endp proc base$:(lng&,base%) local buffer$(255),buf% local ax%,bx%,cx%,dx%,si%,di% local flags%,reg%,long& long&=lng& reg%=addr(ax%) buf%=addr(buffer$) rem Integer to string pokew addr(dx%),peekw(addr(long&)+2) pokew addr(bx%),peekw(addr(long&)) cx%=base% di%=buf%+1 ax%=$0100 os($8a,reg%) fixup%:(buf%) return buffer$ endp rem end of file