home *** CD-ROM | disk | FTP | other *** search
/ Transactor / Transactor_18_1987_Transactor_Publishing.d64 / array.src (.txt) < prev    next >
Commodore BASIC  |  2023-02-26  |  10KB  |  483 lines

  1. 1 ;array math functions
  2. 2 ;c richard richmond
  3. 3 ; 308 rosewood ave.
  4. 4 ; springfield, ohio
  5. 5 ; 45506
  6. 6 ; (513) 322-7650
  7. 10 org $ca58
  8. 20 :memfac .eq $bba2  ;memory to fac1
  9. 30 :facmem .eq $bbd4  ;fac1 to memory
  10. 40 :compar .eq $bc5b  ;compare memory to fac1
  11. 80 :memplu .eq $b867  ;add memory to fac1
  12. 90 :memmul .eq $ba28  ;mult fac1 by memory
  13. 100 :memsub .eq $b850 ;sub fac1 from memory
  14. 110 :memdiv .eq $bb0f ;divide fac1 by memory
  15. 120 jmp :eqv ; a()=v 'starting address
  16. 130 jmp :eqb ; a()=b() 'sa+3
  17. 140 jmp :plv ; a()=a()+v 'sa+6
  18. 150 jmp :plb ; a()=a()+b() 'sa+9
  19. 160 jmp :sbv ; a()=a()-v 'sa+12
  20. 170 jmp :sbb ; a()=a()-b() 'sa+15
  21. 180 jmp :mlv ; a()=a()*v 'sa+18
  22. 190 jmp :mlb ; a()=a()*b() 'sa+21
  23. 200 jmp :dvv ; a()=a()/v 'sa+24
  24. 210 jmp :dvb ; a()=a()/b() 'sa+27
  25. 220 jmp :bsv ; a()=v-a() 'sa+30
  26. 230 jmp :bsb ; a()=b()-b() 'sa+33
  27. 240 jmp :vdv ; a()=v/a() 'sa+36
  28. 250 jmp :vdb ; a()=b()/a() 'sa+39
  29. 260 jmp :max ; v=max(a()) 'sa+42
  30. 270 jmp :min ; v=min(a()) 'sa+45
  31. 275 jmp :square ; a()=a()^2 'sa+48
  32. 277 jmp :insert ; insert v at a() 'sa+51
  33. 280 :dummy
  34. 290 .ds$0006
  35. 320 :zpage
  36. 330 .ds $000d
  37. 340 :szpage    ; routine to save
  38. 350 ldy #$0c   ; zero page memory
  39. 360 :sz1
  40. 370 lda $00bf,y
  41. 380 sta :zpage,y
  42. 390 dey
  43. 400 bpl :sz1
  44. 410 rts
  45. 420 :reset        ;routine to reset
  46. 430 ldy #$0c      ;aero page memory
  47. 440 :restorez
  48. 450 lda :zpage,y
  49. 460 sta $00bf,y
  50. 470 dey
  51. 480 bpl :restorez
  52. 490 rts           ;exit
  53. 500 :store        ;store fac1
  54. 510 ldx $b5       ;to memory
  55. 520 ldy $b6       ; specified at
  56. 530 jsr :facmem   ; $b5,$b6
  57. 540 rts
  58. 550 :test1   ;this portion
  59. 560 lda $b7  ;increments the
  60. 570 clc      ;second array
  61. 580 adc #$05 ;pointers by
  62. 590 sta $b7  ;5
  63. 600 lda $b8
  64. 610 adc #$00
  65. 620 sta $b8
  66. 630 :test   ;routine to
  67. 640 lda $b9 ;increment
  68. 650 clc     ;first array
  69. 660 adc #$05 ;pointers by
  70. 670 sta $b9  ;5
  71. 680 lda $ba
  72. 690 adc #$00
  73. 700 sta $ba
  74. 710 :test2    ;and check
  75. 720 cmp $fc   ;for the end
  76. 730 bne :cont ;of array
  77. 740 lda $b9
  78. 750 cmp $fb
  79. 760 bne :cont
  80. 770 clc
  81. 780 rts
  82. 790 :cont  ;if not to end
  83. 800 sec    ;set carry bit
  84. 810 rts
  85. 820 :eqv  ;a()=v
  86. 830 jsr :szpage ;store zero page
  87. 840 jsr :mod1   ;get addresses
  88. 850 lda $b7     ;address o
  89. 860 ldy $b8     ;v
  90. 870 jsr :memfac ;load v to fac1
  91. 880 :eqv1
  92. 890 ldx $b9     ;address of
  93. 900 ldy $ba     ;a()
  94. 910 jsr :facmem ;fac1 to a(x)
  95. 920 jsr :test   ;check if done
  96. 930 bcs :eqv1   ;no continue
  97. 940 jmp :reset  ;yes exit routine
  98. 950 :plv        ;a()=a()+v
  99. 960 jsr :szpage
  100. 970 jsr :mod1
  101. 980 :plv2
  102. 990 lda $b9     ;load address
  103. 1000 ldy $ba    ;of next a()
  104. 1010 sta $b5    ;pointer for
  105. 1020 sty $b6    ;store routine
  106. 1030 jsr :memfac;1st element to fac1
  107. 1040 lda $b7    ;address of
  108. 1050 ldy $b8    ;v
  109. 1060 jsr :memplu ;add v to fac1
  110. 1070 jsr :store  ;results to a()
  111. 1080 jsr :test
  112. 1090 bcs :plv2
  113. 1100 jmp :reset
  114. 1110 :sbv        ;a()=a()-v
  115. 1120 jsr :szpage
  116. 1130 jsr :mod1
  117. 1140 :sbv1
  118. 1150 lda $b7    ;load address
  119. 1160 ldy $b8    ;of v
  120. 1170 jsr :memfac ;v to fac1
  121. 1180 lda $b9    ;load address
  122. 1190 sta $b5    ;of
  123. 1200 ldy $ba    ;a()
  124. 1210 sty $b6
  125. 1220 jsr :memsub ;a()added to fac1
  126. 1230 jsr :store  ;result to a()
  127. 1240 jsr :test
  128. 1250 bcs :sbv1
  129. 1260 jmp :reset
  130. 1270 :bsv   ;a()=v-a()
  131. 1280 jsr :szpage
  132. 1290 jsr :mod1
  133. 1300 :bsv1
  134. 1310 lda $b9
  135. 1320 sta $b5
  136. 1330 ldy $ba
  137. 1340 sty $b6
  138. 1350 jsr :memfac ;fac1=a()
  139. 1360 lda $b7     ;address
  140. 1370 ldy $b8     ;of v
  141. 1380 jsr :memsub ;fac1=v-a()
  142. 1390 jsr :store  ;a()=fac1
  143. 1400 jsr :test
  144. 1410 bcs :bsv1
  145. 1420 jmp :reset
  146. 1430 :mlv        ;a()=a()*v
  147. 1440 jsr :szpage
  148. 1450 jsr :mod1
  149. 1460 :mlv1
  150. 1470 lda $b9
  151. 1480 sta $b5      ;address
  152. 1490 ldy $ba      ;of a()
  153. 1500 sty $b6
  154. 1510 jsr :memfac  ;fac1=a()
  155. 1520 lda $b7      ;address
  156. 1530 ldy $b8      ;of v
  157. 1540 jsr :memmul  ;fac1=a()*v
  158. 1550 jsr :store   ;a()=fac1
  159. 1560 jsr :test
  160. 1570 bcs :mlv1
  161. 1580 jmp :reset
  162. 1590 :dvv         ;a()=a()/v
  163. 1600 jsr :szpage
  164. 1610 jsr :mod1
  165. 1620 :dvv1
  166. 1630 lda $b7      ;adress
  167. 1640 ldy $b8      ;of v
  168. 1650 jsr :memfac  ;fac1=v
  169. 1660 lda $b9      ;address
  170. 1670 sta $b5      ;of a()
  171. 1680 ldy $ba
  172. 1690 sty $b6
  173. 1700 jsr :memdiv  ;fac1=a()/v
  174. 1710 jsr :store   ;a()=fac1
  175. 1720 jsr :test
  176. 1730 bcs :dvv1
  177. 1740 jmp :reset
  178. 1750 :vdv         ;a()=v/a()
  179. 1760 jsr :szpage
  180. 1770 jsr :mod1
  181. 1780 :vdv1
  182. 1790 lda $b9      ;address
  183. 1800 sta $b5      ;of a()
  184. 1810 ldy $ba
  185. 1820 sty $b6
  186. 1830 jsr :memfac  ;fac1=a()
  187. 1840 lda $b7      ;address
  188. 1850 ldy $b8      ;of v
  189. 1860 jsr :memdiv  ;fac1=v/fac1
  190. 1870 jsr :store   ;a()=fac1
  191. 1880 jsr :test
  192. 1890 bcs :vdv1
  193. 1900 jmp :reset
  194. 1910 :plb         ;a()=a()*b()
  195. 1920 jsr :szpage
  196. 1930 jsr :mod1
  197. 1940 :plb1
  198. 1950 lda $b7      ;address
  199. 1960 ldy $b8      ;of b()
  200. 1970 jsr :memfac  ;fac1=b()
  201. 1980 lda $b9
  202. 1990 sta $b5      ;address
  203. 2000 ldy $ba      ;of a()
  204. 2010 sty $b6
  205. 2020 jsr :memplu  ;fac1=fac1*a()
  206. 2030 jsr :store   ;a()=fac1
  207. 2040 jsr :test1   ;increment b pointer then a
  208. 2050 bcs :plb1
  209. 2060 jmp :reset
  210. 2070 :sbb        ;a()=a()-b()
  211. 2080 jsr :szpage
  212. 2090 jsr :mod1
  213. 2100 :sbb1
  214. 2110 lda $b7     ;address
  215. 2120 ldy $b8     ;of b()
  216. 2130 jsr :memfac ;fac1=b()
  217. 2140 lda $b9
  218. 2150 sta $b5     ;address
  219. 2160 ldy $ba     ;of a()
  220. 2170 sty $b6
  221. 2180 jsr :memsub ;fac1=a()-fac1
  222. 2190 jsr :store  ;a()=1
  223. 2200 jsr :test1  ;increment b then a
  224. 2210 bcs :sbb1
  225. 2220 jmp :reset
  226. 2230 :mlb       ;a()=a()*b()
  227. 2240 jsr :szpage
  228. 2250 jsr :mod1
  229. 2260 :mlb1
  230. 2270 lda $b7    ;address
  231. 2280 ldy $b8    ;of b()
  232. 2290 jsr :memfac ;fac1=b()
  233. 2300 lda $b9
  234. 2310 sta $b5    ;address
  235. 2320 ldy $ba    ;of a()
  236. 2330 sty $b6
  237. 2340 jsr :memmul ;fac1=fac1*a()
  238. 2350 jsr :store  ;a()=fac1
  239. 2360 jsr :test1  ;increment pointers
  240. 2370 bcs :mlb1
  241. 2380 jmp :reset
  242. 2390 :dvb        ;a()=a()/b()
  243. 2400 jsr :szpage
  244. 2410 jsr :mod1
  245. 2420 :dvb1
  246. 2430 lda $b7     ;address
  247. 2440 ldy $b8     ;of b()
  248. 2450 jsr :memfac ;fac1=b()
  249. 2460 lda $b9
  250. 2470 sta $b5     ;address
  251. 2480 ldy $ba     ;of a()
  252. 2490 sty $b6
  253. 2500 jsr :memdiv ;fac1=fac1*a()
  254. 2510 jsr :store  ;a()=fac1
  255. 2520 jsr :test1  ;increment pointers
  256. 2530 bcs :dvb1
  257. 2540 jmp :reset
  258. 2550 :bsb        ;a()=b()-a()
  259. 2560 jsr :szpage
  260. 2570 jsr :mod1
  261. 2580 :bsb1
  262. 2590 lda $b9
  263. 2600 ldy $ba     ;address
  264. 2610 sta $b5     ;of a()
  265. 2620 sty $b6
  266. 2630 jsr :memfac ;fac1=a()
  267. 2640 lda $b7     ;address
  268. 2650 ldy $b8     ;of b()
  269. 2660 jsr :memsub ;fac1=b()-fac1
  270. 2670 jsr :store  ;a()=fac1
  271. 2680 jsr :test1  ;increment pointers
  272. 2690 bcs :bsb1
  273. 2700 jmp :reset
  274. 2710 :vdb        ;a()=b()/a()
  275. 2720 jsr :szpage
  276. 2730 jsr :mod1
  277. 2740 :vdb1
  278. 2750 lda $b9
  279. 2760 sta $b5     ;address
  280. 2770 ldy $ba     ;of a()
  281. 2780 sty $b6
  282. 2790 jsr :memfac ;fac1=a()
  283. 2800 lda $b7     ;address
  284. 2810 ldy $b8     ;of b()
  285. 2820 jsr :memdiv ;fac1=b()/fac1
  286. 2830 jsr :store  ;a()=fac1
  287. 2840 jsr :test1
  288. 2850 bcs :vdb1
  289. 2860 jmp :reset
  290. 2870 :eqb        ;a()=b()
  291. 2880 jsr :szpage
  292. 2890 jsr :mod1
  293. 2900 :eqb1
  294. 2910 ldy #$00
  295. 2920 lda ($b7),y  ;1st byte of b
  296. 2930 sta ($b9),y  ;into a
  297. 2940 inc $b7      ;increment
  298. 2950 bne :eqb2    ;address
  299. 2960 inc $b8      ;of b
  300. 2970 :eqb2
  301. 2980 inc $b9      ;increment
  302. 2990 bne  :eqb3   ;address
  303. 3000 inc $ba      ;of a
  304. 3010 :eqb3
  305. 3020 lda $ba      ;hi byte of a
  306. 3030 jsr :test2   ;end of array
  307. 3040 bcs :eqb1    ;no continue
  308. 3050 jmp :reset   ;yes exit routine
  309. 3060 :mod2        ;find address of a
  310. 3070 jsr $aefd    ;skip comma
  311. 3080 jsr $ad9e    ; routine
  312. 3090 lda $47      ;lo byte of
  313. 3100 sta $b9      ;a address
  314. 3110 lda $48      ;hi byte of
  315. 3120 sta $ba      ;a address
  316. 3130 lda $2f      ;start of
  317. 3140 sta $fb
  318. 3150 lda $30      ;array storage
  319. 3160 sta $fc
  320. 3170 :again       ;search array storage
  321. 3180 ldy #$00
  322. 3190 lda ($fb),y
  323. 3200 cmp $45      ;for name
  324. 3210 bne :step2   ;of
  325. 3220 iny
  326. 3230 lda ($fb),y
  327. 3240 cmp $46      ;'a' array
  328. 3250 bne :step    ;routine returns
  329. 3260 jsr :step1   ;with ending address
  330. 3270 rts          ;of a()in $fb,$fc
  331. 3280 :step2
  332. 3290 iny
  333. 3300 :step
  334. 3310 jsr :step1
  335. 3320 jmp :again
  336. 3330 :step1       ;routine to
  337. 3340 iny          ;skip through
  338. 3350 lda ($fb),y  ;array memory
  339. 3360 sta $fd      ;from one
  340. 3370 iny          ;array to next
  341. 3380 lda ($fb),y
  342. 3390 clc
  343. 3400 adc $fc
  344. 3410 sta $fc
  345. 3420 lda $fb
  346. 3430 clc
  347. 3440 adc $fd
  348. 3450 sta $fb
  349. 3460 bcc :st2
  350. 3470 inc $fc
  351. 3480 :st2
  352. 3490 rts
  353. 3500 :mod1     ;routine to find b()
  354. 3510 jsr $aefd ;skip comma
  355. 3520 jsr $b08b ; routine
  356. 3530 lda $47   ;to find v,b
  357. 3540 sta $b7   ;or create
  358. 3550 lda $48   ;variable
  359. 3560 sta $b8   ;if not found
  360. 3570 jmp :mod2
  361. 3580 :max        ;v=maximum of a()
  362. 3590 jsr :szpage
  363. 3600 jsr :mod1
  364. 3610 lda $b9
  365. 3620 ldy $ba
  366. 3630 jsr :memfac ;fac1=a(0)
  367. 3640 .xy :dummy  ;store in
  368. 3650 jsr :facmem ;'dummy'
  369. 3660 jsr :test
  370. 3670 :max2
  371. 3680 lda $b9     ;next address
  372. 3690 ldy $ba     ;of a()
  373. 3700 jsr :memfac ;fac1=a()
  374. 3710 .xy :dummy
  375. 3720 txa
  376. 3730 jsr :compar ;compare
  377. 3740 bmi :max3   ;a() with 'dummy'
  378. 3750 .xy :dummy  ;fac1 larger
  379. 3760 jsr :facmem ;then 'dummy'=fac1
  380. 3770 :max3
  381. 3780 jsr :test   ;done
  382. 3790 bcs :max2   ;no continue
  383. 3800 .xy :dummy  ;yes
  384. 3810 txa         ;fac1='dummy'
  385. 3820 jsr :memfac
  386. 3830 ldx $b7     ;address
  387. 3840 ldy $b8     ;of v
  388. 3850 jsr :facmem ;v=fac1
  389. 3860 jmp :reset
  390. 3870 :min        ;v=minimum of a()
  391. 3880 jsr :szpage
  392. 3890 jsr :mod1
  393. 3900 lda $b9    ;address
  394. 3910 ldy $ba    ;of a(0)
  395. 3920 jsr :memfac ;store
  396. 3930 .xy :dummy  ;a(0) into
  397. 3940 jsr :facmem ;'dummy'
  398. 3945 jsr :test
  399. 3950 :min2
  400. 3960 lda $b9     ;address of
  401. 3970 ldy $ba     ;next a()
  402. 3980 jsr :memfac ;load into fac1
  403. 3990 .xy :dummy  ;and
  404. 4000 txa
  405. 4010 jsr :compar ;compare with 'dummy'
  406. 4020 bpl :min3   ;fac1<'dummy
  407. 4030 .xy :dummy  ;then 'dummy'
  408. 4040 jsr :facmem ;=fac1
  409. 4050 :min3
  410. 4060 jsr :test
  411. 4070 bcs :min2   ;'dummy =min(a)
  412. 4080 .xy :dummy
  413. 4090 txa
  414. 4100 jsr :memfac ;transfer
  415. 4110 ldx $b7     ;'dummy'
  416. 4120 ldy $b8     ;to
  417. 4130 jsr :facmem ;v
  418. 4140 jmp :reset
  419. 4150 :square     ;a=a*a
  420. 4160 jsr :szpage
  421. 4170 jsr :mod2
  422. 4180 :squ1
  423. 4190 lda $b9     ;address
  424. 4200 ldy $ba     ;of a()
  425. 4210 sta $b5
  426. 4220 sty $b6
  427. 4230 jsr :memfac ;a() to fac1
  428. 4235 lda $b9
  429. 4237 ldy $ba
  430. 4240 jsr :memmul ;fac1=a*a
  431. 4250 jsr :store
  432. 4260 jsr :test   ;increment pointer
  433. 4270 bcs :squ1
  434. 4280 jmp :reset
  435. 4290 :insert     ;a(x)=v
  436. 4300 jsr :szpage ;following
  437. 4310 jsr :mod1   ;elements
  438. 4320 lda #$05    ;moved down
  439. 4330 sta $bf     ;a(max)=a(max-1)
  440. 4340 lda $46     ;continue
  441. 4350 asl a       ;until
  442. 4360 bcc :ins1   ;a(x+1)=a(x)
  443. 4370 lda #$02    ;then a(x)=v
  444. 4380 sta $bf     ;routine will
  445. 4390 :ins1       ;automatically
  446. 4400 lda $fb     ;use proper offset
  447. 4410 clc         ;for variable type
  448. 4420 sbc $bf     ;works with
  449. 4430 sta $fb     ;strings (a$)
  450. 4440 lda $fc     ;integers (a%)
  451. 4450 sbc #$00    ;or
  452. 4460 sta $fc     ;floating point
  453. 4470 lda $fb
  454. 4480 clc
  455. 4490 sbc $bf
  456. 4500 sta $fd
  457. 4510 lda $fc
  458. 4520 sbc #$00
  459. 4530 sta $fe
  460. 4540 ldy $bf
  461. 4550 dey
  462. 4560 :ins2
  463. 4570 lda ($fd),y
  464. 4580 sta ($fb),y
  465. 4590 dey
  466. 4600 bpl :ins2
  467. 4610 lda $fe
  468. 4620 cmp $ba
  469. 4630 bne :ins1
  470. 4640 lda $fd
  471. 4650 cmp $b9
  472. 4660 bne :ins1
  473. 4670 ldy $bf
  474. 4680 dey
  475. 4690 :ins3
  476. 4700 lda ($b7),y
  477. 4710 sta ($fb),y
  478. 4720 dey
  479. 4730 bpl :ins3
  480. 4740 jmp :reset
  481. 4750 :end
  482. 4760 .en
  483.