home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er Special 43
/
64er_Magazin_Sonderheft_43_19xx_Markt__Technik_de_Side_B.d64
/
drehe.src
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
10KB
|
576 lines
0 ;*********************************
1 ; written on 22-24.12.87 by
2 ;
3 ; christian rodemeyer
4 ; goldregenstrasse 28
5 ; 4370 marl - sinsen
6 ;
7 ;*********************************
8 +$c000
9 ;
10 ; rom-routinen
11 ;
12 tab(conupk=$ba8c
13 tab(movfm=$bba2
14 tab(movmf=$bbd4
15 tab(actofc=$bc3c
16 tab(movaf=$bc0c
17 tab(cos=$e264
18 tab(fadd=$b867
19 tab(sin=$e26b
20 tab(negop=$bfb4
21 tab(fmultt=$ba30
22 tab(chkcom=$aefd
23 tab(frmnum=$ad8a
24 tab(getadr=$b7f7
26 tab(fsub=$b850
27 tab(faddh=$b849
28 tab(sign=$bc28
29 tab(aadd=$bd7e
49 ;
50 ; variablen
51 ;
52 tab(tzeiger=$340
53 tab(zaehler=2
54 tab(dest=$fd
55 tab(source=$fb
56 tab(chelp=$342
57 tab(xs=$343
58 tab(ys=$344
59 tab(xt=$345
60 tab(yt=$346
61 tab(ytabz=$347
62 tab(vrzchn=102
99 ;
100 getlaxclosewert
101 mid$#<(wert)
102 peek#>(wert)
103 new
104 ;
105 getsaxcloseaddr
106 (NULL)addr
107 (NULL)addr+1
108 new
109 ;
110 getlohiclosewert,addr
111 closelaxclosewert
112 closesaxcloseaddr
113 new
114 ;
115 getpokecloseaddr,byte
116 mid$#byte
117 (NULL)addr
118 new
119 ;
120 gettadclosevon,nach
121 mid$von
122 (NULL)nach
123 mid$von+1
124 (NULL)nach+1
125 new
126 ;
127 gettbyclosevon,nach
128 mid$von
129 (NULL)nach
130 new
131 ;
132 getcbqcloseziel,arg
133 str$#arg
134 (NULL)ziel
135 new
136 ;
137 getcbncloseziel,arg
138 str$#arg
139 (NULL)ziel
140 new
141 ;
142 getlbqcloseziel,arg
143 str$#arg
144 (NULL)*+5
145 (NULL)ziel
146 new
147 ;
148 getlbncloseziel,arg
149 str$#arg
150 (NULL)*+5
151 (NULL)ziel
152 new
153 ;
154 getbibcloseziel,arg
155 str$#arg+1
156 (NULL)ziel
157 new
158 ;
159 getbiscloseziel,arg
160 str$#arg
161 (NULL)ziel
162 new
163 ;
164 getlbbcloseziel,arg
165 str$#arg+1
166 (NULL)*+5
167 (NULL)ziel
168 new
169 ;
170 getlbscloseziel,arg
171 str$#arg
172 (NULL)*+5
173 (NULL)ziel
174 new
175 getdplcloseziel
176 (NULL)
177 (NULL)ziel
178 new
179 ;
180 getiwocloseaddr
181 right$addr
182 (NULL)end
183 right$addr+1
184 end
185 new
186 ;
187 getdwocloseaddr
188 chr$addr
189 (NULL)end
190 chr$addr+1
191 end
192 new
193 ;
194 getdbncloseziel,neu,reg
195 chr$reg
196 (NULL)ziel
197 *neu>255,200;tantantan^
198 mid$#neu; (NULL)
199 /201;tantan^ (NULL)
200 mid$neu;<tan(NULL)tanexp
201 (NULL)reg;<tanexp
202 new
203 ;
204 getphx
205 (NULL)
206 (NULL)
207 new
208 ;
209 getplx
210 (NULL)
211 (NULL)
212 new
213 ;
214 getphy
215 (NULL)
216 (NULL)
217 new
218 ;
219 getply
220 (NULL)
221 (NULL)
222 new
223 ;
224 getplsclosesum1,sum2
225 (NULL)
226 mid$sum1
227 ^sum2>255
228 valsum2
229 and
230 val#sum2
231 or
232 (NULL)sum1
233 (NULL)ncarryc
234 right$sum1+1
235 ncarryc
236 new
237 ;
238 getmnsclosemin,sub
239 (NULL)
240 mid$min
241 ^sub>255
242 (NULL)sub
243 and
244 (NULL)#sub
245 or
246 (NULL)min
247 (NULL)ncarryc
248 chr$min+1
249 ncarryc
250 new
251 ;
500 ;betriebssystem-macros
501 ;achtung!!! bei werten>$400
502 ;wird die addresse als absolut
503 ;angenommen, bei werten<$400 als
504 ;zeiger auf die addresse
510 ;
520 getmfmcloseaddr
521 ^addr>$400
530 peek#<(addr)
540 len#>(addr)
541 and
542 peekaddr
543 lenaddr+1
544 or
550 (NULL)$bbd4
560 new
570 ;
580 getmmfcloseaddr
585 ^addr>$400
590 mid$#<(addr)
600 len#>(addr)
601 and
602 mid$addr
603 lenaddr+1
604 or
610 (NULL)$bba2
620 new
630 ;
640 getfpmcloseaddr
645 ^addr>$400
650 mid$#<(addr)
660 len#>(addr)
661 and
662 mid$addr
663 lenaddr+1
664 or
670 (NULL)$b867
680 new
999 ;
1000 ;crtab erzeugt die tabellen sintab
1002 ;& costab, der winkel steht in fac
1004 ;
1010 crtab mfmclosesinhelp
1020 (NULL)cos
1030 mfmclosecoshelp
1032 (NULL)movaf
1033 mid$#12
1034 (NULL)actofc
1035 (NULL)fmultt
1036 (NULL)negop
1040 mid$#0
1050 (NULL)zaehler
1070 lohiclosecostab,tzeiger
1080 cosloop mfmclosetzeiger
1090 plsclosetzeiger,5
1150 fpmclosecoshelp
1160 right$zaehler
1170 mid$zaehler
1180 cbnclosecosloop,24
1190 ;
1200 mmfclosesinhelp
1210 (NULL)sin
1220 mfmclosesinhelp
1221 (NULL)movaf
1222 mid$#12
1223 (NULL)actofc
1224 (NULL)fmultt
1225 (NULL)negop
1230 mid$#0
1240 (NULL)zaehler
1260 lohiclosesintab,tzeiger
1270 sinloop mfmclosetzeiger
1280 plsclosetzeiger,5
1340 fpmclosesinhelp
1350 right$zaehler
1360 mid$zaehler
1370 cbnclosesinloop,24
1380 (NULL)
1390 ;
1500 ;eingabeparameter(von calcpos):
1510 ;zeile im y-reg; spalte im x-reg
1520 ;ausgabeparameter:
1530 ;addresse des bytes im sprite
1540 ;steht im y-reg, die nummer des
1550 ;bits im x-reg
1560 ;
1570 calcpos (NULL)
1580 (NULL)chelp
1590 (NULL)
1600 (NULL)
1610 valchelp
1620 (NULL)chelp
1630 (NULL)
1640 (NULL)
1650 tloop (NULL)#8
1660 right$chelp
1670 (NULL)tloop
1680 chr$chelp
1690 val#8
1700 (NULL)
1701 lenchelp
1710 (NULL)
1720 ;
1750 bits fn128,64,32,16,8,4,2,1
1760 ;
2000 ;awiclosereg,tab bringt die
2010 ;addresse des n. mflpt-wertes
2020 ;in der tabelle in tzeiger.
2030 ;die nummer steht dabei in dem
2040 ;durch reg spezifizierten register
2050 ;die tabelle in tab.
2060 ;
2070 getawiclosereg,tab
2080 pokeclosetzeiger+1,>(tab)
2090 mid$reg
2100 (NULL)
2110 (NULL)
2120 (NULL)
2130 valreg
2140 val#<(tab)
2150 (NULL)tzeiger
2160 (NULL)*+5
2170 right$tzeiger+1
2190 new
2200 ;
9000 ;*********************************
9010 ;hier steht das hauptprogramm,
9011 ;*********************************
9020 ;nunaechst wird folgende syntax
9030 ;realisiert:
9040 ;
9050 ;sys 49358,quelle,ziel,winkel
9060 ;
9070 ;quelle und ziel geben die
9080 ;anfangsaddressen der sprites an
9090 ;(0-65535), quelle wird in source
9100 ;ziel in dest gespeichert.
9110 ;winkel gibt den winkel um den das
9120 ;quellsprite gedreht werden soll
9130 ;im bogenmass an. dieser wert
9140 ;verbleibt fuer crtab im fac.
9150 ;
10000 drehe (NULL)chkcom
10010 (NULL)frmnum
10020 (NULL)getadr
10030 (NULL)source
10040 (NULL)source+1
10050 ;
10060 (NULL)chkcom
10070 (NULL)frmnum
10080 (NULL)getadr
10090 (NULL)dest
10100 (NULL)dest+1
10110 ;
10120 (NULL)chkcom
10130 (NULL)frmnum
10140 ;
10150 ;tabelle erstellen (crtab)
10160 ;
10170 usrin (NULL)crtab
10180 ;
10190 ;das zielsprite wird geloescht, da
10200 ;dann die drehung der nichtge-
10210 ;setzten pixel entfaellt.
10220 ;
10230 mid$#0
10240 len#63
10250 dloop (NULL)(dest),y
10260 (NULL)
10270 (NULL)dloop
10280 ;
10290 ;die realkoordinatenzeiger xs und
10300 ;ys werden auf den realen ursprung
10310 ;0(NULL)0 gesetzt.
10320 ;
10330 (NULL)xs
10340 (NULL)ys
10341 pokecloseytabz,22
10350 ;
10360 ;die addresse des zu bearbeitenden
10370 ;pixels im quellsprite wird
10380 ;berechnet.
10390 ;
10400 transloop peekxs
10410 lenys
10420 (NULL)calcpos
10430 ;
10440 ;es wird geprueft, ob dieses pixel
10450 ;ueberhaupt gesetzt ist, wenn
10460 ;ja, werden die koordinaten nach
10470 ;der drehung berechnet,
10480 ;andernfalls wird dieser schritt
10490 ;uebersprungen.
10500 ;
10510 mid$(source),y
10520 ascbits,x
10521 str$#0
10530 (NULL)*+5
10535 (NULL)nextpxl
10540 ;
10550 ;die x-koordinate nach der drehung
10560 ;wird in dem pseudo-koordinaten-
10570 ;system nach folendem schema
10580 ;berechnet: x'=x*cos(w)-y*sin(w)
10590 ;die produkte sind in den von
10600 ;crtab erzeugten tabellen ab-
10610 ;gespeichert.
10620 ;
10630 ;zunaechst wird der y*sin(w)
10640 ;in den fac gebracht
10650 ;
10660 awicloseytabz,sintab
10670 mmfclosetzeiger
10680 ;
10690 ;x*cos(w) wird in a/y addressiert
10700 ;
10710 awiclosexs,costab
10720 mid$tzeiger
10730 lentzeiger+1
10740 ;
10750 ;mittels fsub wird die differenz
10760 ;gebildet und das ergebnis in
10770 ;reale koordinaten umgerechnet
10780 ;
10790 (NULL)fsub
10800 mid$#12
10810 (NULL)aadd
10820 (NULL)faddh
10830 ;
10840 ;wenn eine bereichsueberschreitung
10850 ;fac also negativ ist, so wird
10860 ;sofort der naechte pixel
10870 ;bearbeitet,
10880 ;
10890 mid$vrzchn
10900 (NULL)nextpxl
10910 ;
10920 ;anderfalls wird die koordinate
10930 ;in integer gewandelt, auf eine
10940 ;positive bereichsueberschreitung
10950 ;geprueft und falls diese nicht
10951 ;vorhanden war in xt gespeichert.
10960 ;
10970 (NULL)getadr
10971 atn#24
10972 (NULL)nextpxl
10990 (NULL)xt
11000 ;
11010 ;die y-koordinate nach der drehung
11020 ;wird nach y'=x*sin(w)+y*cos(w)
11030 ;berechnet. die berechnung geht
11040 ;aehnlich wie bei der oben
11050 ;beschriebenen transformation
11060 ;vonstatten.
11070 ;
11080 awicloseytabz,costab
11090 mmfclosetzeiger
11100 ;
11110 awiclosexs,sintab
11120 mid$tzeiger
11130 lentzeiger+1
11140 ;
11150 ;die transformation von pseudok.
11160 ;in realk. geht nach r=10-p
11170 ;vonstatten.
11180 ;
11190 (NULL)fadd
11200 mid$#<(zehn)
11210 len#>(zehn)
11220 (NULL)fsub
11230 (NULL)faddh
11240 ;
11500 mid$vrzchn
11510 (NULL)nextpxl
11520 ;
11530 (NULL)getadr
11540 atn#21
11550 (NULL)nextpxl
11560 (NULL)yt
11570 ;
11580 ;die koordinaten des gedrehten
11590 ;punkts liegen jetzt in xt yt.
11600 ;nun wird dieser punkt im
11610 ;zielsprite gesetzt.
11620 ;
11630 peekxt
11640 lenyt
11650 (NULL)calcpos
11660 ;
11670 ;punkt setzen
11680 ;
11690 mid$(dest),y
11700 (NULL)bits,x
11710 (NULL)(dest),y
11720 ;
11730 ;die koordinaten des naechsten zu
11740 ;transformierenden pixels werden
11750 ;werden berechnet,falls der letzte
11760 ;erreichtist, wird das programm
11770 ;beendet.
11780 ;
11790 nextpxl right$xs
11800 mid$xs
11810 lbnclosetransloop,24
11820 pokeclosexs,0
11830 right$ys
11840 chr$ytabz
11850 mid$ys
11860 lbnclosetransloop,21
11870 ;
11880 (NULL)
11890 ;
11900 ;
19000 ;zehn enthaelt 10 im mflpt-format
19010 ;
19020 zehn fn$84,$20,0,0,0
19030 ;
20000 ;ab hier stehen die tabellen, die
20010 ;erst vom programm erstellt werden
20020 ;
20030 ;costab enthaelt die mit -12 - 11
20040 ;multiplizierten kosinuswerte des
20050 ;eingegebenen winkels im mflpt
20060 ;format
20070 ;
20080 costab then24*5
20090 ;
20100 ;sintab entspricht costab, hier
20110 ;sind jedoch sinuswerte angegeben
20120 ;
20130 sintab then24*5
20140 ;
20150 ;coshelp & sinhelp sind
20160 ;hilfsregister im mflpt-format
20170 ;
20180 coshelp then5
20190 ;
20200 sinhelp then5
20210 ;
30000 ;
30010 ;---------------------------------
30020 ;
30030 ;allgemeine programmbeschreibung
30040 ;
30050 ;---------------------------------
30060 ;
30070 ;das hier vorliegende programm
30080 ;drehe dreht ein quellsprite
30090 ;gegen den uhrzeigersinn um den
30091 ;punkt m(12(NULL)10) (der ursprung
30092 ;liegt links oben) in einem
30100 ;beliebigen winkel und speichert
30110 ;es an der angegebenen addresse
30120 ;ab.
30130 ;folgendes funktionsprinzip wird
30140 ;dabei verwirklicht:
30150 ;das zielsprite wird geloescht,
30160 ;jeder gesetzte punkt wird um
30170 ;den angegebenen winkel gedreht
30180 ;und im zielsprite an der neuen
30190 ;position gesetzt.
30200 ;die neuen koordinaten werden
30210 ;nach den transformations-
30220 ;gleichungen
30230 ; x'=x*cos(winkel)-y*sin(winkel)
30240 ; y'=x*sin(winkel)+y*cos(winkel)
30250 ;errechnet.
30260 ;um rechenzeit zu sparen werden
30270 ;die winkelfunktionsprodukte in
30280 ;tabellen abgespeichert.
30290 ;fuer die transformation werden
30300 ;die realkoordinaten in pseudo-
30310 ;koordinaten verwandelt.
30320 ; r(12(NULL)10) = p(0(NULL)0)
30330 ;die einzelnen schritte sind
30340 ;hoffentlich so gut dokumentiert
30350 ;das aenderungen leicht moeglich
30360 ;sind,z.b drehung um einen anderen
30370 ;(vielleicht beliebigen) punkt.