ChipMaster's bwBASIC This also includes history going back to v2.10. *WARN* some binary files might have been corrupted by CRLF.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

350 lines
10 KiB

  1. 90 PRINT CHR$(26): 'Put your clear screen code here !!
  2. 100 PRINT TAB(25);"EXTENDED PRECISION CALCULATOR":PRINT
  3. 110 '
  4. 120 PRINT TAB(30); "JUDSON D. MCCLENDON":PRINT
  5. 130 ' 844 Sun Valley Road
  6. 140 ' Birmingham, AL 35215
  7. 150 '
  8. 160 ' Compuserve 74415,1003
  9. 170 '
  10. 180 PRINT TAB(20);" Modified for S-Basic by R.J. Sandel"
  11. 190 ' Added always dump and fundamental operations print.
  12. 191 ' Corrected obvious errors, and added initial instructions
  13. 192 PRINT:PRINT:PRINT:PRINT:
  14. 193 PRINT "Legal commands are: ADD, SUB, MUL, & DIV for math operations"
  15. 194 PRINT:PRINT "A or EA for Enter into Register A: ";
  16. 195 PRINT " PA for Print A: CA for Clear A "
  17. 196 PRINT: PRINT "XAB for Exchange A and B: MAB for Move A into B: ";
  18. 197 PRINT " similar for other registers":PRINT
  19. 198 PRINT "ZAP for Clear All: END or QUIT or Q for termination.":PRINT
  20. 199 PRINT:PRINT "Warning !!! 100 place divisions take a while !!!":PRINT:PRINT
  21. 200 PRINT TAB(30);:INPUT "Enter maximum (10 to 100) precision desired ";SZ$
  22. 205 ' SIZE = MAXIMUM DIGITS PRECISION
  23. 206 PRINT CHR$(26): ' Clear Screen Again
  24. 210 DEFINT A-Z : I=0:J=0:K=0:L=0
  25. 220 SIZE = VAL(SZ$)
  26. 221 IF SIZE <10 THEN 200
  27. 222 IF SIZE > 100 THEN 200
  28. 230 E1=0:E2=0:E3=0:E4=0: ' DIGITS TO LEFT OF DECIMAL POINT
  29. 240 E6=0:E7=0:E8=0:E9=0: ' NUMBER LENGTH
  30. 250 DIM EA(SIZE),EB(SIZE),EC(SIZE),EH(SIZE): ' REGISTERS EH IS TEMP HOLD
  31. 1000 ' *** Command Loop
  32. 1010 PRINT
  33. 1015 GOSUB 8000:PRINT
  34. 1020 LINE INPUT "ENTER COMMAND: ",COMMAND$
  35. 1025 COMMAND$=TRIM$(COMMAND$)
  36. 1030 IF COMMAND$="END" THEN END
  37. 1031 IF COMMAND$="Q" THEN END
  38. 1032 IF COMMAND$="QUIT" THEN END
  39. 1040 IF COMMAND$="ADD" THEN GOSUB 3000:GOTO 1000
  40. 1050 IF COMMAND$="SUB" THEN GOSUB 4000:GOTO 1000
  41. 1060 IF COMMAND$="MUL" THEN GOSUB 5000:GOTO 1000
  42. 1070 IF COMMAND$="DIV" THEN GOSUB 6000:GOTO 1000
  43. 1200 IF COMMAND$="DMP" THEN GOSUB 8000:GOTO 1000
  44. 1210 IF COMMAND$="EA" THEN GOSUB 8100:GOTO 1000
  45. 1211 IF COMMAND$="A" THEN GOSUB 8100:GOTO 1000
  46. 1220 IF COMMAND$="PA" THEN GOSUB 8200:GOTO 1000
  47. 1230 IF COMMAND$="EB" THEN GOSUB 8300:GOTO 1000
  48. 1231 IF COMMAND$="B" THEN GOSUB 8300:GOTO 1000
  49. 1240 IF COMMAND$="PB" THEN GOSUB 8400:GOTO 1000
  50. 1250 IF COMMAND$="EC" THEN GOSUB 8500:GOTO 1000
  51. 1251 IF COMMAND$="C" THEN GOSUB 8500:GOTO 1000
  52. 1260 IF COMMAND$="PC" THEN GOSUB 8600:GOTO 1000
  53. 1270 IF COMMAND$="XAB" THEN GOSUB 8700:GOTO 1000
  54. 1280 IF COMMAND$="XAC" THEN GOSUB 8800:GOTO 1000
  55. 1290 IF COMMAND$="XBC" THEN GOSUB 8900:GOTO 1000
  56. 1300 IF COMMAND$="ZAP" THEN GOSUB 9000:GOTO 1000
  57. 1310 IF COMMAND$="MAB" THEN GOSUB 9100:GOTO 1000
  58. 1320 IF COMMAND$="MAC" THEN GOSUB 9200:GOTO 1000
  59. 1330 IF COMMAND$="CA" THEN GOSUB 9300:GOTO 1000
  60. 1340 IF COMMAND$="MBA" THEN GOSUB 9400:GOTO 1000
  61. 1350 IF COMMAND$="MBC" THEN GOSUB 9500:GOTO 1000
  62. 1360 IF COMMAND$="CB" THEN GOSUB 9600:GOTO 1000
  63. 1370 IF COMMAND$="MCA" THEN GOSUB 9700:GOTO 1000
  64. 1380 IF COMMAND$="MCB" THEN GOSUB 9800:GOTO 1000
  65. 1390 IF COMMAND$="CC" THEN GOSUB 9900:GOTO 1000
  66. 1900 PRINT "Invalid Command"
  67. 1910 GOTO 1000
  68. 3000 PRINT:PRINT " B = B + A ":PRINT
  69. 3010 IF E1<E2 THEN SC=E2-E1:GOSUB 7200
  70. 3020 IF E2<E1 THEN SC=E1-E2:GOSUB 7400
  71. 3030 IF E7<E6 THEN E7=E6
  72. 3100 FOR I=E6 TO 1 STEP -1
  73. 3110 EB(I)=EB(I)+EA(I)
  74. 3120 IF EB(I)>9 THEN EB(I-1)=EB(I-1)+1:EB(I)=EB(I)-10
  75. 3130 NEXT
  76. 3140 GOSUB 7700
  77. 3150 GOSUB 7800
  78. 3190 RETURN
  79. 4000 PRINT:PRINT " B = B - A ":PRINT
  80. 4010 IF E1<E2 THEN SC=E2-E1:GOSUB 7200
  81. 4020 IF E2<E1 THEN SC=E1-E2:GOSUB 7400
  82. 4030 IF E7<E6 THEN E7=E6
  83. 4100 FOR I=E6 TO 1 STEP -1
  84. 4110 EB(I)=EB(I)-EA(I)
  85. 4120 IF EB(I)<0 THEN EB(I-1)=EB(I-1)-1:EB(I)=EB(I)+10
  86. 4130 NEXT
  87. 4140 GOSUB 7700
  88. 4150 GOSUB 7800
  89. 4190 RETURN
  90. 5000 PRINT:PRINT " C = B * A ":PRINT
  91. 5010 GOSUB 9900
  92. 5020 E8=E7
  93. 5030 FOR I=E6 TO 1 STEP -1
  94. 5040 FOR K=E7 TO 0 STEP -1
  95. 5050 EC(K)=EC(K)+EB(K)*EA(I)
  96. 5060 IF K>=SIZE THEN 5100
  97. 5070 WHILE EC(K+1)>9
  98. 5080 EC(K)=EC(K)+1:EC(K+1)=EC(K+1)-10
  99. 5090 WEND
  100. 5100 NEXT
  101. 5110 FOR L=E8 TO 0 STEP -1
  102. 5120 EC(L+1)=EC(L)
  103. 5130 NEXT :EC(0)=0
  104. 5140 E8=E8+1
  105. 5150 NEXT
  106. 5160 E8=E6+E7:E3=E1+E2
  107. 5170 GOSUB 7900
  108. 5190 RETURN
  109. 6000 PRINT:PRINT " C = B / A ":PRINT
  110. 6010 IF E6=0 THEN PRINT "Divide by Zero":RETURN
  111. 6020 GOSUB 9900
  112. 6030 E9=E7:E4=E2:FOR I=0 TO E7:EH(I)=EB(I):NEXT
  113. 6040 IF E2<E1 THEN SC=E1-E2:GOSUB 7400
  114. 6050 IF E7<E6 THEN E7=E6
  115. 6060 E3=E2-E1+1 :E8=1
  116. 6090 ZF=0
  117. 6100 WHILE ZF=0
  118. 6110 I=0:WHILE ((I<=E6) AND (EA(I)=EB(I))):I=I+1:WEND
  119. 6120 IF I<=E6 AND EB(I)<EA(I) THEN GOSUB 6500:GOTO 6190
  120. 6130 EC(E8)=EC(E8)+1
  121. 6140 FOR I=E6 TO 1 STEP -1
  122. 6150 EB(I)=EB(I)-EA(I)
  123. 6160 IF EB(I)<0 THEN EB(I-1)=EB(I-1)-1:EB(I)=EB(I)+10
  124. 6170 NEXT
  125. 6190 WEND
  126. 6200 IF E8<E3 THEN E8=E3
  127. 6210 E7=E9:E2=E4:FOR I=0 TO E7:EB(I)=EH(I):NEXT
  128. 6270 GOSUB 7900
  129. 6290 RETURN
  130. 6500 ZF=1
  131. 6510 FOR I=1 TO E7+1
  132. 6520 IF EB(I)<>0 THEN ZF=0
  133. 6530 EB(I-1)=EB(I)
  134. 6540 NEXT
  135. 6560 IF E8<SIZE THEN E8=E8+1 ELSE ZF=1
  136. 6590 RETURN
  137. 7000 ' Get Shift Digits
  138. 7010 INPUT "Enter number of digits to shift: ",SC
  139. 7090 RETURN
  140. 7100 ' Shift A left (SC digits)
  141. 7110 FOR I=0 TO E6-SC
  142. 7120 EA(I)=EA(I+SC)
  143. 7130 NEXT
  144. 7140 FOR I=E6-SC+1 TO E6
  145. 7150 EA(I)=0
  146. 7160 NEXT
  147. 7170 E6=E6-SC:E1=E1-SC
  148. 7190 RETURN
  149. 7200 ' Shift A right (SC digits)
  150. 7210 FOR I=E6 TO 0 STEP -1
  151. 7220 EA(I+SC)=EA(I)
  152. 7230 NEXT
  153. 7240 FOR I=0 TO SC-1
  154. 7250 EA(I)=0
  155. 7260 NEXT
  156. 7270 E6=E6+SC:E1=E1+SC
  157. 7290 RETURN
  158. 7300 ' Shift B left (SC digits)
  159. 7310 FOR I=0 TO E7-SC
  160. 7320 EB(I)=EB(I+SC)
  161. 7330 NEXT
  162. 7340 FOR I=E7-SC+1 TO E7
  163. 7350 EB(I)=0
  164. 7360 NEXT
  165. 7370 E7=E7-SC:E2=E2-SC
  166. 7390 RETURN
  167. 7400 ' Shift B right (SC digits)
  168. 7410 FOR I=E7 TO 0 STEP -1
  169. 7420 EB(I+SC)=EB(I)
  170. 7430 NEXT
  171. 7440 FOR I=0 TO SC-1
  172. 7450 EB(I)=0
  173. 7460 NEXT
  174. 7470 E7=E7+SC:E2=E2+SC
  175. 7490 RETURN
  176. 7500 ' Shift C left (SC digits)
  177. 7510 FOR I=0 TO E8-SC
  178. 7520 EC(I)=EC(I+SC)
  179. 7530 NEXT
  180. 7540 FOR I=E8-SC+1 TO E8
  181. 7550 EC(I)=0
  182. 7560 NEXT
  183. 7570 E8=E8-SC:E3=E3-SC
  184. 7590 RETURN
  185. 7600 ' Shift C right (SC digits)
  186. 7610 FOR I=E8 TO 0 STEP -1
  187. 7620 EC(I+SC)=EC(I)
  188. 7630 NEXT
  189. 7640 FOR I=0 TO SC-1
  190. 7650 EC(I)=0
  191. 7660 NEXT
  192. 7670 E8=E8+SC:E3=E3+SC
  193. 7690 RETURN
  194. 7700 ' Normalize A
  195. 7710 WHILE (E6>E1) AND (EA(E6)=0):E6=E6-1:WEND
  196. 7720 IF E6=0 THEN E1=0:GOTO 7790
  197. 7730 IF EA(0)<>0 THEN SC=1:GOSUB 7200:GOTO 7790
  198. 7740 I=1:WHILE (I<E1) AND (EA(I)=0):I=I+1:WEND
  199. 7750 IF I>1 THEN SC=I-1:GOSUB 7100
  200. 7790 RETURN
  201. 7800 ' Normalize B
  202. 7810 WHILE (E7>E2) AND (EB(E7)=0):E7=E7-1:WEND
  203. 7820 IF E7=0 THEN E2=0:GOTO 7890
  204. 7830 IF EB(0)<>0 THEN SC=1:GOSUB 7400:GOTO 7890
  205. 7840 I=1:WHILE (I<E2) AND (EB(I)=0):I=I+1:WEND
  206. 7850 IF I>1 THEN SC=I-1:GOSUB 7300
  207. 7890 RETURN
  208. 7900 ' Normalize C
  209. 7910 WHILE (E8>E3) AND (EC(E8)=0):E8=E8-1:WEND
  210. 7920 IF E8=0 THEN E3=0:GOTO 7990
  211. 7930 IF EC(0)<>0 THEN SC=1:GOSUB 7600:GOTO 7990
  212. 7940 I=1:WHILE (I<E3) AND (EC(I)=0):I=I+1:WEND
  213. 7950 IF I>1 THEN SC=I-1:GOSUB 7500
  214. 7990 RETURN
  215. 8000 ' Dump Registers
  216. 8010 GOSUB 8200
  217. 8020 GOSUB 8400
  218. 8030 GOSUB 8600
  219. 8090 RETURN
  220. 8100 ' Extract EA from string
  221. 8110 GOSUB 9300 :INPUT "Enter A: ",EN$ :E1=LEN(EN$)
  222. 8120 FOR I=1 TO LEN(EN$)
  223. 8130 X$=MID$(EN$,I,1)
  224. 8140 IF X$="." THEN E1=E6:GOTO 8180
  225. 8150 IF X$<"0" OR X$>"9" THEN PRINT "Error in A, char:";I
  226. 8160 E6=E6+1
  227. 8170 EA(E6)=VAL(X$)
  228. 8180 NEXT :GOSUB 7700
  229. 8190 RETURN
  230. 8200 ' PRINT A
  231. 8210 PRINT "A: "; :CC=3
  232. 8220 IF E1=0 THEN PRINT "0"; :CC=4
  233. 8230 FOR I=1 TO E6
  234. 8240 IF I=E1+1 THEN PRINT "."; :CC=CC+1
  235. 8250 PRINT USING "#";EA(I); :CC=CC+1
  236. 8260 IF I<>E1 THEN IF ABS(I-E1)MOD 5=0 THEN PRINT " ";
  237. 8261 CC=CC+1:IF CC>70 THEN PRINT:PRINT " ";:CC=3
  238. 8262 IF E1=0 THEN PRINT " ";:CC=4
  239. 8270 NEXT:PRINT
  240. 8290 RETURN
  241. 8300 ' EXTRACT EB FROM STRING
  242. 8310 GOSUB 9600 :INPUT "Enter B: ",EN$ :E2=LEN(EN$)
  243. 8320 FOR I=1 TO LEN(EN$)
  244. 8330 X$=MID$(EN$,I,1)
  245. 8340 IF X$="." THEN E2=E7:GOTO 8380
  246. 8350 IF X$<"0" OR X$>"9" THEN PRINT "Error in B, char:";I
  247. 8360 E7=E7+1
  248. 8370 EB(E7)=VAL(X$)
  249. 8380 NEXT :GOSUB 7800
  250. 8390 RETURN
  251. 8400 ' PRINT B
  252. 8410 PRINT "B: "; :CC=3
  253. 8420 IF E2=0 THEN PRINT "0"; :CC=4
  254. 8430 FOR I=1 TO E7
  255. 8440 IF I=E2+1 THEN PRINT "."; :CC=CC+1
  256. 8450 PRINT USING "#";EB(I); :CC=CC+1
  257. 8460 IF I<>E2 THEN IF ABS(I-E2)MOD 5=0 THEN PRINT " ";:CC=CC+1
  258. 8461 IF CC>70 THEN PRINT:PRINT " ";:CC=3:IF E2=0 THEN PRINT " ";:CC=4
  259. 8470 NEXT:PRINT
  260. 8490 RETURN
  261. 8500 ' Extract EC from string
  262. 8510 GOSUB 9900 :INPUT "Enter C: ",EN$ :E3=LEN(EN$)
  263. 8520 FOR I=1 TO LEN(EN$)
  264. 8530 X$=MID$(EN$,I,1)
  265. 8540 IF X$="." THEN E3=E8:GOTO 8580
  266. 8550 IF X$<"0" OR X$>"9" THEN PRINT "Error in C, char";I
  267. 8560 E8=E8+1
  268. 8570 EC(E8)=VAL(X$)
  269. 8580 NEXT :GOSUB 7900
  270. 8590 RETURN
  271. 8600 ' Print C
  272. 8610 PRINT "C: "; :CC=3
  273. 8620 IF E3=0 THEN PRINT "0"; :CC=4
  274. 8630 FOR I=1 TO E8
  275. 8640 IF I=E3+1 THEN PRINT "."; :CC=CC+1
  276. 8650 PRINT USING "#";EC(I); :CC=CC+1
  277. 8660 IF I<>E3 THEN IF ABS(I-E3)MOD 5=0 THEN PRINT " ";
  278. 8661 CC=CC+1:IF CC>70 THEN PRINT:PRINT " ";
  279. 8662 CC=3:IF E3=0 THEN PRINT " ";:CC=4
  280. 8670 NEXT:PRINT
  281. 8690 RETURN
  282. 8700 ' Exchange A BT
  283. 8710 IF E6>E7 THEN J=E6 ELSE J=E7
  284. 8720 FOR I=0 TO J:T=EA(I):EA(I)=EB(I):EB(I)=T:NEXT ' FOR I=0 TO J:SWAP EA(I),EB(I):NEXT
  285. 8730 SWAP E6,E7:SWAP E1,E2
  286. 8790 RETURN
  287. 8800 ' Exchange A C
  288. 8810 IF E6>E8 THEN J=E6 ELSE J=E8
  289. 8820 FOR I=0 TO J:T=EA(I):EA(I)=EC(I):EC(I)=T:NEXT ' FOR I=0 TO J:SWAP EA(I),EC(I):NEXT
  290. 8830 SWAP E6,E8:SWAP E1,E3
  291. 8890 RETURN
  292. 8900 ' Exchange B C
  293. 8910 IF E7>E8 THEN J=E7 ELSE J=E8
  294. 8920 FOR I=0 TO J:T=EB(I):EB(I)=EC(I):EC(I)=T:NEXT ' FOR I=0 TO J:SWAP EB(I),EC(I):NEXT
  295. 8930 SWAP E7,E8:SWAP E2,E3
  296. 8990 RETURN
  297. 9000 ' Clear all regs
  298. 9010 GOSUB 9300
  299. 9020 GOSUB 9600
  300. 9030 GOSUB 9900
  301. 9090 RETURN
  302. 9100 ' Move A B T
  303. 9110 IF E6>E7 THEN J=E6 ELSE J=E7
  304. 9120 FOR I=0 TO J:EB(I)=EA(I):NEXT
  305. 9130 E7=E6:E2=E1
  306. 9190 RETURN
  307. 9200 ' Move A C "
  308. 9210 IF E6>E8 THEN J=E6 ELSE J=E8
  309. 9220 FOR I=0 TO J:EC(I)=EA(I):NEXT
  310. 9230 E8=E6:E3=E1
  311. 9290 RETURN
  312. 9300 ' Clear A
  313. 9320 FOR I=0 TO E6:EA(I)=0:NEXT
  314. 9330 E6=0:E1=0
  315. 9390 RETURN
  316. 9400 ' Move B A
  317. 9410 IF E6>E7 THEN J=E6 ELSE J=E7
  318. 9420 FOR I=0 TO J:EA(I)=EB(I):NEXT
  319. 9430 E6=E7:E1=E2
  320. 9490 RETURN
  321. 9500 ' Move B C
  322. 9510 IF E7>E8 THEN J=E7 ELSE J=E8
  323. 9520 FOR I=0 TO J:EC(I)=EB(I):NEXT
  324. 9530 E8=E7:E3=E2
  325. 9590 RETURN
  326. 9600 ' Clear BNT
  327. 9620 FOR I=0 TO E7:EB(I)=0:NEXT
  328. 9630 E7=0:E2=0
  329. 9690 RETURN
  330. 9700 ' Move C A
  331. 9710 IF E6>E8 THEN J=E6 ELSE J=E8
  332. 9720 FOR I=0 TO J:EA(I)=EC(I):NEXT
  333. 9730 E6=E8:E1=E3
  334. 9790 RETURN
  335. 9800 ' Move C B
  336. 9810 IF E7>E8 THEN J=E7 ELSE J=E8
  337. 9820 FOR I=0 TO J:EB(I)=EC(I):NEXT
  338. 9830 E7=E8:E2=E3
  339. 9890 RETURN
  340. 9900 ' Clear C
  341. 9920 FOR I=0 TO E8:EC(I)=0:NEXT
  342. 9930 E8=0:E3=0
  343. 9990 RETURN
  344. 9991 REM ---------------------------------
  345. 9992 REM Updated for bwBASIC 3.0 by Howard Wulf, AF5NE, May 7th 2015:
  346. 9993 REM a) added line 1025
  347. 9994 REM b) changed SWAP EA(I),EB(I)
  348. 9999 END