home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 106.img / MIRROR2.ZIP / CALC.XTS < prev    next >
Text File  |  1988-12-15  |  12KB  |  397 lines

  1. ;*****************************************************************
  2. ;*         Sample script : Calc version 4              *
  3. ;*  Simple calculator with user-defined number of decimal places *
  4. ;*  available up to maximum of 4 (no floating decimal)           *
  5. ;*  (This version is a sub-script of Point-&-Dial)         *
  6. ;*****************************************************************
  7. abort disable
  8.  
  9. ad c prism
  10. if #= 1 ju checkspace
  11. cl
  12. al 3n : al 3n
  13. me
  14. [12,15][h]PRISM add-in module must be loaded to run this script.[n]
  15. [14,15]Please consult your Mirror III User's Guide for information
  16. [15,15]on the [h]ADdin load[n] command and use of the [h]MIRROR.CFG[n] file.
  17. .
  18. ab
  19.  
  20. LABEL CHECKSPACE
  21. ;  Prism is loaded...check to see if enough SAVESPACE is available.
  22. if (savespace >= 1500) jump all_go
  23. cl
  24. al 3n : al 3n
  25. me
  26. [12,15][h]You need at least 1500 bytes of SAVESCREEN space to run CALC.[n]
  27. [14,15]Please consult your Mirror III User's Guide for information
  28. [15,15]on the [h]ADdin load[n] command and use of the [h]MIRROR.CFG[n] file.
  29. .
  30. ab
  31.  
  32. LABEL ALL_GO
  33. sc l kk :         ;hide command line
  34. sc t
  35. box at 1,1 size 25,80 color "kk" 
  36. background return
  37.  
  38. LABEL DECL
  39. me [10,10]One moment please...
  40. var  real op, total, tens[5]
  41. var  integer l, r, c, z, count, d
  42. var  string ch[2,1], colors[3,2], formt[5,4], pth[67]
  43.  
  44. var  integer mode 
  45. ;     0 = none, 1 = plus, 2 = minus, 3 = times, 4 = divide, 5 = equal
  46.  
  47. jump /r setup
  48. jump /r show_calc
  49. me [22,41][wk] Press [Yk]F1[wk] for help 
  50. jump show_tape
  51.  
  52. LABEL LOOP
  53. ch[2] = ch[1]
  54. LABEL LOOP2
  55. ;    Loop2 is used when keys other than digits & math operators 
  56. ;    are pressed. These other keys are not recorded in ch[2]
  57. z = inkey(-1)
  58. if (z = keyval("esc")) jump exit
  59. sound 1004,10 :             ;    keyclick
  60. ch[1] = upcase(chr(z))
  61.  
  62. l =  instr("0123456789",ch[1])
  63. if (l > 0) jump acc
  64.  
  65. l = inlist(z,13,keyval("f1"),keyval("alt-d"),keyval("alt-c"))
  66. if (l = 1) ch[1] = "="
  67. on l jump equal,help,set_decimal,show_tape
  68.  
  69. l = instr("+-*/PMTD=CS.O",ch[1]) 
  70. on l jump plus,minus,mult,div,plus,minus,mult,div
  71. on (l-8) jump equal,clear,sign_change,point,exit
  72.  
  73. if (z = keyval("up-arrow")) scroll at 6,41 size 14,16 : jump loop2
  74. if (ch[1] = "E") jump cl_entry
  75. ;    An invalid key was pushed. Ignore it.
  76. jump loop2
  77.  
  78. LABEL ACC
  79. ;    Build the current operand
  80. l = l - 1
  81. if (op < 0) l = -1 * l
  82. if (mode = 5) mode = 0 : total = 0
  83. if (count = 0)  op = (op * 10) + l  : ju sayit
  84.  
  85. ;    COUNT <> 0 so we must be entering digits after the decimal point
  86.  
  87. op = op + (l * tens[count])
  88. if (count < 5) count = count + 1
  89. LABEL SAYIT
  90. ;     Display the current operand
  91. say at 3,10; color colors[1]; op:@(formt[d])
  92. jump loop
  93.  
  94. LABEL CLEAR
  95. ;    Flash the CLEAR button & clear the calculator
  96. say at 8,19; color "Ww";"  C  "
  97. for z = 1 to 2
  98. box at 7,18 size 3,7   style 4 color colors[3] hollow
  99. box at 7,18 size 3,7   style 4 color colors[2] hollow
  100. next
  101. say at 8,19; color "Wb";"  C  "
  102.  
  103. say at 3,23; color colors[2]; " "
  104. total = 0
  105. mode = 0
  106. ;    write to tape
  107. scroll up 2 at 6,41 size 14,16
  108. say at 19,43; color colors[2]; total:@(formt[d]); " c"
  109. jump disp_total
  110.  
  111. LABEL CL_ENTRY
  112. ;    Clear current operand, but not operation or total
  113. op = 0
  114. count = 0  :  ;    RESET DECIMAL (NOT ENTERING DIGITS AFTER THE DEC. PT.)   
  115. if (0 < instr(digit+".",ch[2])) say at 3,10; color colors[1]; op:@(formt[d]);
  116. jump loop2
  117.  
  118. LABEL SIGN_CHANGE
  119. ;    change operand's sign, if operand is being entered
  120. if (0 <> instr("+-*/PMTD=",ch[2])) jump loop2
  121. op = op * -1
  122. say at 3,10; color colors[1]; op:@(formt[d]);
  123. jump loop2
  124.  
  125. LABEL POINT
  126. ;    Handles display of decimal point
  127. if (d = 1) jump loop2 :           ;; we are in INTEGER mode. ignore
  128. if (count <> 0) jump loop2      : ;; decimal point was already entered
  129. count = 1 :                 ;; indicates 1st place after dec. 
  130. say at 3,10; color colors[1]; op:@(formt[d])
  131. jump loop2
  132.  
  133. LABEL PLUS
  134. say at 3,23; color colors[2]; "+"
  135. count = 0
  136. if (0 = instr("+-*/PMTD=",ch[2])) jump plus1
  137. ;    Here, An operator was the LAST thing entered 
  138. mode = 1  
  139. scroll at 6,41 size 14,16 
  140. say at 19,43; color colors[2]; ; total:@(formt[d]);" +";
  141. jump loop2
  142. LABEL PLUS1
  143. if (mode = 0) jump no_mode
  144. jump /r calc                 : ;; perform CURRENT operation
  145. say color colors[2]; " +";   : ;; update the tape
  146. mode = 1                     : ;; set NEW current operation
  147. jump disp_total
  148.  
  149. LABEL MINUS
  150. say at 3,23; color colors[2]; "-"
  151. count = 0
  152. if (0 = instr("+-*/PMTD=",ch[2])) jump minus1
  153. ;    Here, An operator was the LAST thing entered 
  154. mode = 2  
  155. scroll at 6,41 size 14,16 
  156. say at 19,43; color colors[2]; ; total:@(formt[d]);" -";
  157. jump loop2
  158. LABEL MINUS1
  159. if (mode = 0) jump no_mode
  160. jump /r calc                 : ;; perform CURRENT operation
  161. say color colors[2]; " -";   : ;; update the tape
  162. mode = 2                     : ;; set NEW current operation
  163. jump disp_total
  164.  
  165. LABEL MULT
  166. say at 3,23; color colors[2]; "x"
  167. count = 0
  168. if (0 = instr("+-*/PMTD=",ch[2])) jump mult1
  169. ;    Here, An operator was the LAST thing entered 
  170. mode = 3  
  171. scroll at 6,41 size 14,16 
  172. say at 19,43; color colors[2]; ; total:@(formt[d]);" x";
  173. jump loop2
  174. LABEL MULT1
  175. if (mode = 0) jump no_mode    
  176. jump /r calc                 : ;; perform CURRENT operation
  177. say color colors[2]; " x";   : ;; update the tape
  178. mode = 3                     : ;; set NEW current operation
  179. jump disp_total
  180.  
  181. LABEL DIV
  182. say at 3,23; color colors[2]; "÷"
  183. count = 0
  184. if (0 = instr("+-*/PMTD=",ch[2])) jump div1
  185. ;    Here, An operator was the LAST thing entered 
  186. mode = 4  
  187. scroll at 6,41 size 14,16 
  188. say at 19,43; color colors[2]; ; total:@(formt[d]);" ÷";
  189. jump loop2
  190. LABEL DIV1
  191. if (mode = 0) jump no_mode
  192. jump /r calc                 : ;; perform CURRENT operation
  193. say color colors[2]; " ÷";   : ;; update the tape
  194. mode = 4                     : ;; set NEW current operation
  195. jump disp_total
  196.  
  197. LABEL NO_MODE
  198. ;    There is no CURRENT operation when the first operator is pressed.
  199. ;    The default operation is PLUS. Add operand to total.
  200. total = op
  201. ;    Set the CURRENT mode
  202. mode = ((l-1) mod 4) + 1
  203. ;     Update the tape
  204. scroll at 6,41 size 14,16
  205. say at 19,43 ; color colors[2]; op:@(formt[d]); " "; mid("+-x÷",mode,1)
  206. jump disp_total
  207.  
  208. LABEL EQUAL
  209. say at 3,23; color colors[2]; " "   : ;; Erase displayed operator 
  210. if (0 = instr("=+-*/PMTD",ch[2])) jump E1
  211. ;    Last key was an operator, so display TOTAL line on the tape
  212. ;    (sequence was, for example: operand operator = )
  213. scroll at 6,41 size 14,16
  214. say at 19,41; color colors[2]; "T "; total:@(formt[d]);
  215. mode = 5
  216. jump loop  
  217. LABEL E1
  218. ;    Last key was NOT an operator. See if there is a CURRENT operator.
  219. count = 0
  220. if (mode <> 0) jump e2
  221. ;    Here, the user has hit = before entering an operator
  222. total = op 
  223. scroll at 6,41 size 14,16
  224. say at 19,41; color colors[2]; "T "; total:@(formt[d]);
  225. jump disp_total
  226. LABEL E2
  227. ;     Here, = was hit in a "normal" sequence so calculate & display
  228. ;     (i.e. operand1 operator operand2 = )
  229. jump /r calc
  230. say at 19,41; color colors[2]; "T";
  231. say at 3,10; color colors[1]; total:@(formt[d]);
  232. op = 0
  233. mode = 5
  234. jump loop
  235.  
  236. LABEL DISP_TOTAL
  237. ;    Display the total in the Calc display
  238. say at 3,10; color colors[1]; total:@(formt[d]);
  239. if (0 = instr("=+-*/PMTD",ch[2])) op = 0
  240. jump loop
  241.  
  242. LABEL CALC
  243. ;    Perform CURRENT operation and update the tape
  244. scroll at 6,41 size 14,16
  245. say at 19,43 ; color colors[2]; op:@(formt[d])
  246. if (mode = 1) total = total + op : jump calc1
  247. if (mode = 2) total = total - op : jump calc1
  248. if (mode = 3) total = total * op : jump calc1
  249. if (op = 0) jump calc_error
  250. total = total / op
  251. LABEL CALC1
  252. scroll at 6,41 size 14,16
  253. say at 19,41; color colors[2]; "S "; str(total:@(formt[d]));
  254. rturn
  255.  
  256. LABEL CALC_ERROR
  257. ;    Divide by Zero, or attempt to enter 2nd decimal point
  258. al 7n
  259. say at 3,10; color colors[1]; "       ERROR";
  260. say at 19,56; color colors[2]; "E"
  261. ;    Accept only CLEAR
  262. repeat
  263. z = inkey(-1)
  264. until (0 <> instr("Cc",chr(z)))
  265. jump clear
  266.  
  267. LABEL HELP
  268. ;     Display HELP screen, and return to input mode
  269. box at 7,42 size 16,37 style 5 color "rw" save
  270. me
  271. [7,50][Wr]*** CALC  HELP ***  
  272. [09,44][Kw]P[kw]  or  [Kw]+[kw]    add    
  273. [10,44][Kw]M[kw]  or  [Kw]-[kw]    subtract
  274. [11,44][Kw]T[kw]  or  [Kw]*[kw]    multiply 
  275. [12,44][Kw]D[kw]  or  [Kw]/[kw]    divide
  276. [14,44][Kw]O[kw]      calculator off (exit CALC)
  277. [15,44][Kw]S[kw]      change sign of operand
  278. [16,44][Kw]C[kw]      clear calculator
  279. [17,44][Kw]E[kw]      clear entry
  280. [18,44][Kw]Alt-C[kw]  clear calculator & tape
  281. [19,44][Kw]Alt-D[kw]  change # of decimal places
  282. [20,44][Kw][kw]      tape feed
  283. [22,47][Wr]< Press a key to exit Help >
  284. .
  285. ;    Wait for key 
  286. z = inkey(-1)
  287. restore
  288. jump LOOP2
  289.  
  290. LABEL SET_DECIMAL
  291. ;    Allow user to configure # of decimal places displayed
  292. box at 7,42 size 6,37 style 5 color "bw" save
  293. say at 7,45; color "Wb"; "Change Number of Decimal Places"
  294. say at 9,44; color colors[2]; "How many places (0 - 4) ? "
  295. ;    NOTE: The variable 'd' contains the number of decimal places
  296. ;          to be displayed PLUS ONE. This is because 'd' is used as
  297. ;          an array index and CANNOT = 0
  298. z = d-1
  299. input z at 9,70 format 1 color colors[1] only "01234"
  300. d = z + 1
  301. say at 3,28; color colors[2]; "D:"; color colors[1]; z:1
  302. say at 10,44; color colors[2]; "Make this the default (Y/N)?"
  303. ch[1] = "N"
  304. input ch[1] at 10,73 color colors[1] alluc only "YN"
  305. if  (ch[1] = "N") restore : jump loop2
  306. ;    Here we create or update a CALC.CFG file which is to contain
  307. ;    the number of digits to be displayed after the decimal.
  308. open append pth as 1 size 1
  309. seek 1, 0
  310. write line 1, z
  311. close 1
  312. say at 12,45; color "WB"; "Done!"; color "Wb"; "   Press a key..."
  313. z = inkey(50)
  314. restore
  315. jump loop2
  316.  
  317. LABEL SHOW_TAPE
  318. ;    Draw the Tape
  319. box at 3,40 size 18,18 color colors[2] style 2
  320. draw from 5,40 to 5,57 color colors[2] style 2 ends "╠" + "╣"
  321. say at 4,45; color colors[2]; "T A P E"
  322. jump clear
  323.  
  324. LABEL SHOW_CALC
  325. ;    Draw the Calculator
  326. box at 2,5 size 22,30 style 2 color colors[2] 
  327. draw from 4,5 to 4,34 color colors[2] ends "╟╢"
  328. me
  329. [5,9][Bk] P[Ck] R[Gk] I[Yk] S[Rk] M   [Wk]C A L C [kk]
  330. .
  331. say at 3,28; color colors[2]; "D:"; color colors[1]; (d-1):1
  332. box at 10,8 size 3,5 across 3 down 4 xsep 2 ysep 1 style 2 color "kw" hollow
  333. for l = 1 to 3
  334. say at 11,(10 + ((l-1)*6));  color colors[2]; l + 6
  335. say at 14,(10 + ((l-1)*6));  color colors[2]; l + 3
  336. say at 17,(10 + ((l-1)*6));  color colors[2]; l 
  337. say at 20,(10 + ((l-1)*6));  color colors[2]; mid("±0∙",l,1)
  338. next
  339.  
  340. box at 7,28 size 3,3 down 5, ysep 1 style 3 color colors[2] hollow
  341. for l = 1 to 5
  342. say at (8 + ((l-1)*3)),29; color colors[2]; mid("+-x÷=",l,1)
  343. next
  344.  
  345. box at 7,8 size 3,7 across 2 xsep 4 style 4 color colors[2]
  346. say at 8,9; color "Wr"; " O"; color "wr"; "n  "
  347. say at 8,19; color "Wb";"  C  "
  348. rturn
  349.  
  350. LABEL SETUP
  351. ;    Initialize variables & colors
  352. box at 1,1 size 25,80 color "kk" style 0
  353. colors[1] = "ky"
  354. colors[2] = "kw"
  355. colors[3] = "Wk"
  356. d = 1               : ;; default # of digits after decimal is 0
  357. tens[1] = 0.1       : ;; used to enter digits after the decimal
  358. tens[2] = 0.01
  359. tens[3] = 0.001
  360. tens[4] = 0.0001
  361. tens[5] = 0.00001
  362. formt[1] = "12"     : ;; used for current display mode
  363. formt[2] = "12.1"
  364. formt[3] = "12.2"
  365. formt[4] = "12.3"
  366. formt[5] = "12.4"
  367. ;    create path name containing path where calc.xts resides, 
  368. ;    followed by the filename CALC.CFG
  369. pth = strip(value("do"),letter + ".",1) + "CALC.CFG"
  370. if -[@(pth)] rt              : ;; CALC.CFG doesn't exist
  371. ;    CALC.CFG exists. Input & validate the configuration
  372. open input pth as 1 size 1
  373. get 1,1,ch[1]
  374. close 1
  375. if (0 = instr("01234",ch[1])) rt
  376. d = int(ch[1]) + 1
  377. rt
  378.  
  379. LABEL EXIT
  380. for z = 1 to 2
  381. box at 7,8 size 3,7 style 4 color colors[3] hollow
  382. box at 7,8 size 3,7 style 4 color colors[2] hollow
  383. next
  384. say at 8,9; color colors[2]; " O"; color "Kw"; "ff "
  385. LABEL ERROR_LABEL
  386. ;    Here is where execution is transfered to when user presses the
  387. ;    ATtention key (to abort CALC)
  388. say at 25,20; color "Wk"; "Press a key to exit CALC...";
  389. z = inkey(40)
  390. sc l kw
  391. cl
  392. var forget op
  393. LABEL KILL_STACK
  394. rt KILL_STACK
  395. end
  396.