home *** CD-ROM | disk | FTP | other *** search
/ 64'er Special 33 / 64er_Magazin_Sonderheft_33_19xx_Markt__Technik_de_Side_B.d64 / drehe.src (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  10KB  |  576 lines

  1. 0 ;*********************************
  2. 1 ;   written on 22-24.12.87 by
  3. 2 ;
  4. 3 ;     christian rodemeyer
  5. 4 ;     goldregenstrasse 28
  6. 5 ;     4370  marl - sinsen
  7. 6 ;
  8. 7 ;*********************************
  9. 8  +$c000
  10. 9 ;
  11. 10 ; rom-routinen
  12. 11 ;
  13. 12  tab(conupk=$ba8c
  14. 13  tab(movfm=$bba2
  15. 14  tab(movmf=$bbd4
  16. 15  tab(actofc=$bc3c
  17. 16  tab(movaf=$bc0c
  18. 17  tab(cos=$e264
  19. 18  tab(fadd=$b867
  20. 19  tab(sin=$e26b
  21. 20  tab(negop=$bfb4
  22. 21  tab(fmultt=$ba30
  23. 22  tab(chkcom=$aefd
  24. 23  tab(frmnum=$ad8a
  25. 24  tab(getadr=$b7f7
  26. 26  tab(fsub=$b850
  27. 27  tab(faddh=$b849
  28. 28  tab(sign=$bc28
  29. 29  tab(aadd=$bd7e
  30. 49 ;
  31. 50 ; variablen
  32. 51 ;
  33. 52  tab(tzeiger=$340
  34. 53  tab(zaehler=2
  35. 54  tab(dest=$fd
  36. 55  tab(source=$fb
  37. 56  tab(chelp=$342
  38. 57  tab(xs=$343
  39. 58  tab(ys=$344
  40. 59  tab(xt=$345
  41. 60  tab(yt=$346
  42. 61  tab(ytabz=$347
  43. 62  tab(vrzchn=102
  44. 99 ;
  45. 100 getlaxclosewert
  46. 101  mid$#<(wert)
  47. 102  peek#>(wert)
  48. 103 new
  49. 104 ;
  50. 105 getsaxcloseaddr
  51. 106  (NULL)addr
  52. 107  (NULL)addr+1
  53. 108 new
  54. 109 ;
  55. 110 getlohiclosewert,addr
  56. 111  closelaxclosewert
  57. 112  closesaxcloseaddr
  58. 113 new
  59. 114 ;
  60. 115 getpokecloseaddr,byte
  61. 116  mid$#byte
  62. 117  (NULL)addr
  63. 118 new
  64. 119 ;
  65. 120 gettadclosevon,nach
  66. 121  mid$von
  67. 122  (NULL)nach
  68. 123  mid$von+1
  69. 124  (NULL)nach+1
  70. 125 new
  71. 126 ;
  72. 127 gettbyclosevon,nach
  73. 128  mid$von
  74. 129  (NULL)nach
  75. 130 new
  76. 131 ;
  77. 132 getcbqcloseziel,arg
  78. 133  str$#arg
  79. 134  (NULL)ziel
  80. 135 new
  81. 136 ;
  82. 137 getcbncloseziel,arg
  83. 138  str$#arg
  84. 139  (NULL)ziel
  85. 140 new
  86. 141 ;
  87. 142 getlbqcloseziel,arg
  88. 143  str$#arg
  89. 144  (NULL)*+5
  90. 145  (NULL)ziel
  91. 146 new
  92. 147 ;
  93. 148 getlbncloseziel,arg
  94. 149  str$#arg
  95. 150  (NULL)*+5
  96. 151  (NULL)ziel
  97. 152 new
  98. 153 ;
  99. 154 getbibcloseziel,arg
  100. 155  str$#arg+1
  101. 156  (NULL)ziel
  102. 157 new
  103. 158 ;
  104. 159 getbiscloseziel,arg
  105. 160  str$#arg
  106. 161  (NULL)ziel
  107. 162 new
  108. 163 ;
  109. 164 getlbbcloseziel,arg
  110. 165  str$#arg+1
  111. 166  (NULL)*+5
  112. 167  (NULL)ziel
  113. 168 new
  114. 169 ;
  115. 170 getlbscloseziel,arg
  116. 171  str$#arg
  117. 172  (NULL)*+5
  118. 173  (NULL)ziel
  119. 174 new
  120. 175 getdplcloseziel
  121. 176  (NULL)
  122. 177  (NULL)ziel
  123. 178 new
  124. 179 ;
  125. 180 getiwocloseaddr
  126. 181  right$addr
  127. 182  (NULL)end
  128. 183  right$addr+1
  129. 184 end
  130. 185 new
  131. 186 ;
  132. 187 getdwocloseaddr
  133. 188  chr$addr
  134. 189  (NULL)end
  135. 190  chr$addr+1
  136. 191 end
  137. 192 new
  138. 193 ;
  139. 194 getdbncloseziel,neu,reg
  140. 195  chr$reg
  141. 196  (NULL)ziel
  142. 197  *neu>255,200;tantantan^
  143. 198  mid$#neu;    (NULL)
  144. 199  /201;tantan^ (NULL)
  145. 200  mid$neu;<tan(NULL)tanexp
  146. 201  (NULL)reg;<tanexp
  147. 202 new
  148. 203 ;
  149. 204 getphx
  150. 205  (NULL)
  151. 206  (NULL)
  152. 207 new
  153. 208 ;
  154. 209 getplx
  155. 210  (NULL)
  156. 211  (NULL)
  157. 212 new
  158. 213 ;
  159. 214 getphy
  160. 215  (NULL)
  161. 216  (NULL)
  162. 217 new
  163. 218 ;
  164. 219 getply
  165. 220  (NULL)
  166. 221  (NULL)
  167. 222 new
  168. 223 ;
  169. 224 getplsclosesum1,sum2
  170. 225  (NULL)
  171. 226  mid$sum1
  172. 227 ^sum2>255
  173. 228  valsum2
  174. 229 and
  175. 230  val#sum2
  176. 231 or
  177. 232  (NULL)sum1
  178. 233  (NULL)ncarryc
  179. 234  right$sum1+1
  180. 235 ncarryc
  181. 236 new
  182. 237 ;
  183. 238 getmnsclosemin,sub
  184. 239  (NULL)
  185. 240  mid$min
  186. 241 ^sub>255
  187. 242  (NULL)sub
  188. 243 and
  189. 244  (NULL)#sub
  190. 245 or
  191. 246  (NULL)min
  192. 247  (NULL)ncarryc
  193. 248  chr$min+1
  194. 249 ncarryc
  195. 250 new
  196. 251 ;
  197. 500 ;betriebssystem-macros
  198. 501 ;achtung!!!  bei werten>$400
  199. 502 ;wird die addresse als absolut
  200. 503 ;angenommen, bei werten<$400 als
  201. 504 ;zeiger auf die addresse
  202. 510 ;
  203. 520 getmfmcloseaddr
  204. 521 ^addr>$400
  205. 530  peek#<(addr)
  206. 540  len#>(addr)
  207. 541 and
  208. 542  peekaddr
  209. 543  lenaddr+1
  210. 544 or
  211. 550  (NULL)$bbd4
  212. 560 new
  213. 570 ;
  214. 580 getmmfcloseaddr
  215. 585 ^addr>$400
  216. 590  mid$#<(addr)
  217. 600  len#>(addr)
  218. 601 and
  219. 602  mid$addr
  220. 603  lenaddr+1
  221. 604 or
  222. 610  (NULL)$bba2
  223. 620 new
  224. 630 ;
  225. 640 getfpmcloseaddr
  226. 645 ^addr>$400
  227. 650  mid$#<(addr)
  228. 660  len#>(addr)
  229. 661 and
  230. 662  mid$addr
  231. 663  lenaddr+1
  232. 664 or
  233. 670  (NULL)$b867
  234. 680 new
  235. 999 ;
  236. 1000 ;crtab erzeugt die tabellen sintab
  237. 1002 ;& costab, der winkel steht in fac
  238. 1004 ;
  239. 1010 crtab mfmclosesinhelp
  240. 1020  (NULL)cos
  241. 1030  mfmclosecoshelp
  242. 1032  (NULL)movaf
  243. 1033  mid$#12
  244. 1034  (NULL)actofc
  245. 1035  (NULL)fmultt
  246. 1036  (NULL)negop
  247. 1040  mid$#0
  248. 1050  (NULL)zaehler
  249. 1070  lohiclosecostab,tzeiger
  250. 1080 cosloop mfmclosetzeiger
  251. 1090  plsclosetzeiger,5
  252. 1150  fpmclosecoshelp
  253. 1160  right$zaehler
  254. 1170  mid$zaehler
  255. 1180  cbnclosecosloop,24
  256. 1190 ;
  257. 1200  mmfclosesinhelp
  258. 1210  (NULL)sin
  259. 1220  mfmclosesinhelp
  260. 1221  (NULL)movaf
  261. 1222  mid$#12
  262. 1223  (NULL)actofc
  263. 1224  (NULL)fmultt
  264. 1225  (NULL)negop
  265. 1230  mid$#0
  266. 1240  (NULL)zaehler
  267. 1260  lohiclosesintab,tzeiger
  268. 1270 sinloop mfmclosetzeiger
  269. 1280  plsclosetzeiger,5
  270. 1340  fpmclosesinhelp
  271. 1350  right$zaehler
  272. 1360  mid$zaehler
  273. 1370  cbnclosesinloop,24
  274. 1380  (NULL)
  275. 1390 ;
  276. 1500 ;eingabeparameter(von calcpos):
  277. 1510 ;zeile im y-reg; spalte im x-reg
  278. 1520 ;ausgabeparameter:
  279. 1530 ;addresse des bytes im sprite
  280. 1540 ;steht im y-reg, die nummer des
  281. 1550 ;bits im x-reg
  282. 1560 ;
  283. 1570 calcpos (NULL)
  284. 1580  (NULL)chelp
  285. 1590  (NULL)
  286. 1600  (NULL)
  287. 1610  valchelp
  288. 1620  (NULL)chelp
  289. 1630  (NULL)
  290. 1640  (NULL)
  291. 1650 tloop (NULL)#8
  292. 1660  right$chelp
  293. 1670  (NULL)tloop
  294. 1680  chr$chelp
  295. 1690  val#8
  296. 1700  (NULL)
  297. 1701  lenchelp
  298. 1710  (NULL)
  299. 1720 ;
  300. 1750 bits fn128,64,32,16,8,4,2,1
  301. 1760 ;
  302. 2000 ;awiclosereg,tab bringt die
  303. 2010 ;addresse des n. mflpt-wertes
  304. 2020 ;in der tabelle in tzeiger.
  305. 2030 ;die nummer steht dabei in dem
  306. 2040 ;durch reg spezifizierten register
  307. 2050 ;die tabelle in tab.
  308. 2060 ;
  309. 2070 getawiclosereg,tab
  310. 2080  pokeclosetzeiger+1,>(tab)
  311. 2090  mid$reg
  312. 2100  (NULL)
  313. 2110  (NULL)
  314. 2120  (NULL)
  315. 2130  valreg
  316. 2140  val#<(tab)
  317. 2150  (NULL)tzeiger
  318. 2160  (NULL)*+5
  319. 2170  right$tzeiger+1
  320. 2190 new
  321. 2200 ;
  322. 9000 ;*********************************
  323. 9010 ;hier steht das hauptprogramm,
  324. 9011 ;*********************************
  325. 9020 ;nunaechst wird folgende syntax
  326. 9030 ;realisiert:
  327. 9040 ;
  328. 9050 ;sys 49358,quelle,ziel,winkel
  329. 9060 ;
  330. 9070 ;quelle und ziel geben die
  331. 9080 ;anfangsaddressen der sprites an
  332. 9090 ;(0-65535), quelle wird in source
  333. 9100 ;ziel in dest gespeichert.
  334. 9110 ;winkel gibt den winkel um den das
  335. 9120 ;quellsprite gedreht werden soll
  336. 9130 ;im bogenmass an. dieser wert
  337. 9140 ;verbleibt fuer crtab im fac.
  338. 9150 ;
  339. 10000 drehe (NULL)chkcom
  340. 10010  (NULL)frmnum
  341. 10020  (NULL)getadr
  342. 10030  (NULL)source
  343. 10040  (NULL)source+1
  344. 10050 ;
  345. 10060  (NULL)chkcom
  346. 10070  (NULL)frmnum
  347. 10080  (NULL)getadr
  348. 10090  (NULL)dest
  349. 10100  (NULL)dest+1
  350. 10110 ;
  351. 10120  (NULL)chkcom
  352. 10130  (NULL)frmnum
  353. 10140 ;
  354. 10150 ;tabelle erstellen (crtab)
  355. 10160 ;
  356. 10170 usrin (NULL)crtab
  357. 10180 ;
  358. 10190 ;das zielsprite wird geloescht, da
  359. 10200 ;dann die drehung der nichtge-
  360. 10210 ;setzten pixel entfaellt.
  361. 10220 ;
  362. 10230  mid$#0
  363. 10240  len#63
  364. 10250 dloop (NULL)(dest),y
  365. 10260  (NULL)
  366. 10270  (NULL)dloop
  367. 10280 ;
  368. 10290 ;die realkoordinatenzeiger xs und
  369. 10300 ;ys werden auf den realen ursprung
  370. 10310 ;0(NULL)0 gesetzt.
  371. 10320 ;
  372. 10330  (NULL)xs
  373. 10340  (NULL)ys
  374. 10341  pokecloseytabz,22
  375. 10350 ;
  376. 10360 ;die addresse des zu bearbeitenden
  377. 10370 ;pixels im quellsprite wird
  378. 10380 ;berechnet.
  379. 10390 ;
  380. 10400 transloop peekxs
  381. 10410  lenys
  382. 10420  (NULL)calcpos
  383. 10430 ;
  384. 10440 ;es wird geprueft, ob dieses pixel
  385. 10450 ;ueberhaupt gesetzt ist, wenn
  386. 10460 ;ja, werden die koordinaten nach
  387. 10470 ;der drehung berechnet,
  388. 10480 ;andernfalls wird dieser schritt
  389. 10490 ;uebersprungen.
  390. 10500 ;
  391. 10510  mid$(source),y
  392. 10520  ascbits,x
  393. 10521  str$#0
  394. 10530  (NULL)*+5
  395. 10535  (NULL)nextpxl
  396. 10540 ;
  397. 10550 ;die x-koordinate nach der drehung
  398. 10560 ;wird in dem pseudo-koordinaten-
  399. 10570 ;system nach folendem schema
  400. 10580 ;berechnet: x'=x*cos(w)-y*sin(w)
  401. 10590 ;die produkte sind in den von
  402. 10600 ;crtab erzeugten tabellen ab-
  403. 10610 ;gespeichert.
  404. 10620 ;
  405. 10630 ;zunaechst wird der y*sin(w)
  406. 10640 ;in den fac gebracht
  407. 10650 ;
  408. 10660  awicloseytabz,sintab
  409. 10670  mmfclosetzeiger
  410. 10680 ;
  411. 10690 ;x*cos(w) wird in a/y addressiert
  412. 10700 ;
  413. 10710  awiclosexs,costab
  414. 10720  mid$tzeiger
  415. 10730  lentzeiger+1
  416. 10740 ;
  417. 10750 ;mittels fsub wird die differenz
  418. 10760 ;gebildet und das ergebnis in
  419. 10770 ;reale koordinaten umgerechnet
  420. 10780 ;
  421. 10790  (NULL)fsub
  422. 10800  mid$#12
  423. 10810  (NULL)aadd
  424. 10820  (NULL)faddh
  425. 10830 ;
  426. 10840 ;wenn eine bereichsueberschreitung
  427. 10850 ;fac also negativ ist, so wird
  428. 10860 ;sofort der naechte pixel
  429. 10870 ;bearbeitet,
  430. 10880 ;
  431. 10890  mid$vrzchn
  432. 10900  (NULL)nextpxl
  433. 10910 ;
  434. 10920 ;anderfalls wird die koordinate
  435. 10930 ;in integer gewandelt, auf eine
  436. 10940 ;positive bereichsueberschreitung
  437. 10950 ;geprueft und falls diese nicht
  438. 10951 ;vorhanden war in xt gespeichert.
  439. 10960 ;
  440. 10970  (NULL)getadr
  441. 10971  atn#24
  442. 10972  (NULL)nextpxl
  443. 10990  (NULL)xt
  444. 11000 ;
  445. 11010 ;die y-koordinate nach der drehung
  446. 11020 ;wird nach y'=x*sin(w)+y*cos(w)
  447. 11030 ;berechnet. die berechnung geht
  448. 11040 ;aehnlich wie bei der oben
  449. 11050 ;beschriebenen transformation
  450. 11060 ;vonstatten.
  451. 11070 ;
  452. 11080  awicloseytabz,costab
  453. 11090  mmfclosetzeiger
  454. 11100 ;
  455. 11110  awiclosexs,sintab
  456. 11120  mid$tzeiger
  457. 11130  lentzeiger+1
  458. 11140 ;
  459. 11150 ;die transformation von pseudok.
  460. 11160 ;in realk. geht nach r=10-p
  461. 11170 ;vonstatten.
  462. 11180 ;
  463. 11190  (NULL)fadd
  464. 11200  mid$#<(zehn)
  465. 11210  len#>(zehn)
  466. 11220  (NULL)fsub
  467. 11230  (NULL)faddh
  468. 11240 ;
  469. 11500  mid$vrzchn
  470. 11510  (NULL)nextpxl
  471. 11520 ;
  472. 11530  (NULL)getadr
  473. 11540  atn#21
  474. 11550  (NULL)nextpxl
  475. 11560  (NULL)yt
  476. 11570 ;
  477. 11580 ;die koordinaten des gedrehten
  478. 11590 ;punkts liegen jetzt in xt yt.
  479. 11600 ;nun wird dieser punkt im
  480. 11610 ;zielsprite gesetzt.
  481. 11620 ;
  482. 11630  peekxt
  483. 11640  lenyt
  484. 11650  (NULL)calcpos
  485. 11660 ;
  486. 11670 ;punkt setzen
  487. 11680 ;
  488. 11690  mid$(dest),y
  489. 11700  (NULL)bits,x
  490. 11710  (NULL)(dest),y
  491. 11720 ;
  492. 11730 ;die koordinaten des naechsten zu
  493. 11740 ;transformierenden pixels werden
  494. 11750 ;werden berechnet,falls der letzte
  495. 11760 ;erreichtist, wird das programm
  496. 11770 ;beendet.
  497. 11780 ;
  498. 11790 nextpxl right$xs
  499. 11800  mid$xs
  500. 11810  lbnclosetransloop,24
  501. 11820  pokeclosexs,0
  502. 11830  right$ys
  503. 11840  chr$ytabz
  504. 11850  mid$ys
  505. 11860  lbnclosetransloop,21
  506. 11870 ;
  507. 11880  (NULL)
  508. 11890 ;
  509. 11900 ;
  510. 19000 ;zehn enthaelt 10 im mflpt-format
  511. 19010 ;
  512. 19020 zehn fn$84,$20,0,0,0
  513. 19030 ;
  514. 20000 ;ab hier stehen die tabellen, die
  515. 20010 ;erst vom programm erstellt werden
  516. 20020 ;
  517. 20030 ;costab enthaelt die mit -12 - 11
  518. 20040 ;multiplizierten kosinuswerte des
  519. 20050 ;eingegebenen winkels im mflpt
  520. 20060 ;format
  521. 20070 ;
  522. 20080 costab then24*5
  523. 20090 ;
  524. 20100 ;sintab entspricht costab, hier
  525. 20110 ;sind jedoch sinuswerte angegeben
  526. 20120 ;
  527. 20130 sintab then24*5
  528. 20140 ;
  529. 20150 ;coshelp & sinhelp sind
  530. 20160 ;hilfsregister im mflpt-format
  531. 20170 ;
  532. 20180 coshelp then5
  533. 20190 ;
  534. 20200 sinhelp then5
  535. 20210 ;
  536. 30000 ;
  537. 30010 ;---------------------------------
  538. 30020 ;
  539. 30030 ;allgemeine programmbeschreibung
  540. 30040 ;
  541. 30050 ;---------------------------------
  542. 30060 ;
  543. 30070 ;das hier vorliegende programm
  544. 30080 ;drehe dreht ein quellsprite
  545. 30090 ;gegen den uhrzeigersinn um den
  546. 30091 ;punkt m(12(NULL)10) (der ursprung
  547. 30092 ;liegt links oben) in einem
  548. 30100 ;beliebigen winkel und speichert
  549. 30110 ;es an der angegebenen addresse
  550. 30120 ;ab.
  551. 30130 ;folgendes funktionsprinzip wird
  552. 30140 ;dabei verwirklicht:
  553. 30150 ;das zielsprite wird geloescht,
  554. 30160 ;jeder gesetzte punkt wird um
  555. 30170 ;den angegebenen winkel gedreht
  556. 30180 ;und im zielsprite an der neuen
  557. 30190 ;position gesetzt.
  558. 30200 ;die neuen koordinaten werden
  559. 30210 ;nach den transformations-
  560. 30220 ;gleichungen
  561. 30230 ;  x'=x*cos(winkel)-y*sin(winkel)
  562. 30240 ;  y'=x*sin(winkel)+y*cos(winkel)
  563. 30250 ;errechnet.
  564. 30260 ;um rechenzeit zu sparen werden
  565. 30270 ;die winkelfunktionsprodukte in
  566. 30280 ;tabellen abgespeichert.
  567. 30290 ;fuer die transformation werden
  568. 30300 ;die realkoordinaten in pseudo-
  569. 30310 ;koordinaten verwandelt.
  570. 30320 ; r(12(NULL)10) = p(0(NULL)0)
  571. 30330 ;die einzelnen schritte sind
  572. 30340 ;hoffentlich so gut dokumentiert
  573. 30350 ;das aenderungen leicht moeglich
  574. 30360 ;sind,z.b drehung um einen anderen
  575. 30370 ;(vielleicht beliebigen) punkt.
  576.