home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er
/
64ER_CD.iso
/
sh3x
/
sh33b.d64
/
drehe.src
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
1995-03-30
|
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.