home *** CD-ROM | disk | FTP | other *** search
- 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.
-