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;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.