NNNNNN]sp NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN壭` `! #@%`')-//3@o79;=?A CoGKQ S@W]a c@e`gkmsu`wy{} ` / @ ` @ ` @ ǀ @ ` ٠ /@ @!a  !Aa!!#o)+/35a79;?A!CAEaGIKOQ!SAUaWY[a!Oeikmoq!sAuawy{}/O/AaO!A/Oaׁ١/Aa!Aa " o  !"!o!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5#9##=#?$A"$CB$o$G$K$$O%Q"%SB%Ub%W%Y%[%]%a"&cB&eb&g&ik&m&o'q"'sB'ub'w` `! #@%`')-//3@o79;=?A CoGKQ S@W]a c@e`gkmsu`wy{} ` / @ ` @ ` @ ǀ @ ` ٠ /@ @!a  !Aa!!#o)+/35a79;?A!CAEaGIKOQ!SAUaWY[a!Oeikmoq!sAuawy{}/O/AaO!A/Oaׁ١/Aa!Aa " o  !"!o!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5#9##=#?$A"$CB$o$G$K$$O%Q"%SB%Ub%W%Y%[%]%a"&cB&eb&g&ik&m&o'q"'sB'ub'wST_SH_4 C_1GRAFIK ^iSPRACHE  `i^SYSTEM ;`iUTILITIES_1{`i. ^i.. FASTZOOM ^iFADE ^iKREISE _iLCURSOR  _i[VARIABLE +_iqUNFILL 6_iRADIEREN B_iSPLINES N_iLASSO Z_iPALETTE h_iSKALIER n_iSCROLL t_i$TEXT_OUT |_i1. ^i.. ^iFASTZOOMC xa FASTZOOMH la1FASTZOOMO SwaRFASTZOOMPRJ xa ZOOMDEMOC ka ZOOMDEMOPRG za /*--------------------------------------------------------------------*/ /* Fastzoom-Routine */ /* */ /* Originalroutine in GFA-BASIC: Gerald Schmieder */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 MAXON Computer GmbH */ /*--------------------------------------------------------------------*/ #include /*--------------------------------------------------------------------*/ /* Fastzoom-Routine */ /* */ /* vx,vy - x/y-Vergrerung */ /* x,y - x/y-Koordinate der linken oberen Ecke des Originals */ /* br - Breite in Pixel */ /* ho - Hhe in Pixel */ /* xo,yo - x/y-Koordinate der linken oberen Ecke der Vergrerung */ /* mode - Schreibmodus */ /* handle - Grafik-Handle */ /* schirm - Adresse der MFDB-Struktur des Bildschirms */ /*--------------------------------------------------------------------*/ void great(int vx,int vy,int x,int y,int br,int ho,int xo,int yo, int mode,int handle, MFDB *schirm) { int i, j, xw, yw, xy[8]; /*-----------------------------------------------------*/ /* Die Vergrerungsschleifen laufen rckwrts, */ /* da sonst Probleme auftauchen, falls Teile der Kopie */ /* in das Original reichen, sprich: */ /* Vergrerung schon vergrerter Graphikteile !!! */ /*-----------------------------------------------------*/ /**** Vergrerung der Vorlage an der Y-Achse ****/ for (i=(y+ho); i>=y; i--) /* Schleife frs Einlesen der Zeilen */ { xy[0] = x; xy[1] = i; xy[2] = x+br; xy[3] = i; yw = yo+((i-y)*vy); for (j=0; jxo; i--) /* Schleife frs Einlesen der Spalten */ { xy[0] = i; xy[1] = yo; xy[2] = i; xy[3] = yo+(ho*vy); xw = xo+((i-xo)*vx); for (j=0; j/88/:&H:/2o6`b>?E0/o4?@?E<o2DBC`2?G0C?@ 2o4?A ?@/ "KA0/B2/@NXORComSEo2l:o4`d>?D?E0/6D?@<GGBC`60C?@?D ?@ 2/6D?A/ "KA0/B2/@NXORComSEEmOLNu|rgreat vro_cpyfmzoomdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o fastzoom.o zoomdemo (fastzoom.h) pcstdlib.lib pcgemlib.lib pctoslib.lib/*--------------------------------------------------------------------*/ /* Demo zur Fastzoom-Routine */ /* */ /* Originalroutine in GFA-BASIC: Gerald Schmieder */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 MAXON Computer GmbH */ /*--------------------------------------------------------------------*/ #include #include #include #include "fastzoom.h" extern int handle, work_out[]; void gem_prg() { int i, j; MFDB schirm; void init_MFDB(MFDB *block, int handle); init_MFDB(&schirm, handle); graf_mouse(M_OFF, 0); for (i=1; i<9; i+=2) { for (j=1; j<12; j+=3) { v_clrwk(handle); v_gtext(handle, 0, 16,"Zoomdemo"); great(i,j,0,0,8*8,16,0,0,3,handle,&schirm); Crawcin(); } } graf_mouse(M_ON, 0); } void init_MFDB(MFDB *block, int handle) { block->fd_addr = 0; vq_extnd(handle, 1, work_out); block->fd_nplanes = work_out[4]; }`.``*>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3 k #& Ј<.@#"Jy g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON(0 J"LN? 9g @N 9g @NN ?<LNA/ EBN5@R@gPp` 2A5R@| m5|HjHjCANPO5@5@4HjC JNXOp`B@$_Nu09NNrNuNS@fN0NB@NLNuCANpN4NuHO?@?A?B>/88/:&H:/2o6`b>?E0/o4?@?E<o2DBC`2?G0C?@ 2o4?A ?@/ "KA0/B2/@N XORComSEo2l:o4`d>?D?E0/6D?@<GGBC`60C?@?D ?@ 2/6D?A/ "KA0/B2/@N XORComSEEmOLNuH(OE0ANz0<N0N  LtBA0N *?p?BgBgr?t@?BgA02BBNON,VD| mTC| m0<N OLNu/ $HBAZrN $5yb $_NuA(p"@ "By>A1B3>3@O"Nu/ Hz?<&NN\O$_Nu/QOM-O, ICHza&XOPO,_NuH@B@H@"VraJ@kNu.np`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#/ABh1|1A2<fa2"_2r+2QAr 2QNu/A1|1|!I!o1A"_A000000000Arm`ABhBhr`ABhBhre`C3A03B23|CrtRB2fA1Br`v3/ C2dBi3| Cp 2Q"<Hps/ NB$_ _0A"op,2QAp 2QNu / 1@ 0"<psNBA0$_Nup `:p`4/ /pMa*"_2"_2"o2"o2Nu#3pN`/ 3@@A"CB@22220<"<NBA0$_Nu / ?<NATO$_NuFehler bei der Programminitialisierung!ZoomdemoXXX r  h(&r &  ~."(6 $  8 :. ^i.. ^iADD1FADEO 8nbADD1FADES 5nbADD8FADEO hADD8FADES hFADE H #pbFADEDEMOC γhFADEDEMOPRG ճh_4FADEDEMOPRJ h+PIC_SHOWGFA ,B PIC_SHOWINF + 0lPIC_SHOWLST 1PIC_SHOWPRG 5;RND1FADEO rbDRND1FADES rbE RND8FADEO )rbHRND8FADES (rbI4NL$6 o"o"/ <t*<|.<& 00f 0` 0ԁb`SjNu  "     inc_countbit_1loop_endadd1fadepx_loop dec_count;****************************************************************************** ;* ADD1FADE - pixelweises berblenden zwischen zwei Bildschirmen * ;* mit Konstanten-Addition von Andreas Hollmann * ;* (c) 1992 MAXON Computer GmbH * ;****************************************************************************** GLOBL add1fade; add1fade: movea.l 4(sp),a0 ;src_Adr holen movea.l 8(sp),a1 ;dst_Adr holen move.l 12(sp),d1 ;Add-Wert holen ;------------------------------------------------------------------------------ move.l #255999,d0 ;soviele Pixel (+1) mssen kopiert werden moveq #0,d2 ;Zhler ist am Anfang 0 move.l #255999,d5 ;fr Vergleich (schneller !) moveq #7,d6 ;fr AND-Bit (schneller !) move.l #256000,d7 ;fr SUB (schneller !) ;------------------------------------------------------------------------------ px_loop: move.l d2,d3 ;Zhler in d3 kopieren asr.l #3,d3 ;d3/8 = Byte-Adr move.b d2,d4 ;Zhler in d4 kopieren and.b d6,d4 ;Pixel berechnen eor.b d6,d4 ;Bit berechnen btst d4,0(a0,d3.w) ;entsprechendes Bit testen bne.s bit_1 ;S_Bit ist 1 => verzweigen bclr d4,0(a1,d3.w) ;S_Bit ist 0 => D_Bit lschen bra.s inc_count ;-> bit_1: bset d4,0(a1,d3.w) ;D_Bit setzen inc_count: add.l d1,d2 ;zum Zhler Add-Wert addieren cmp.l d5,d2 ;Zhler mit 255999 vergleichen bhi.s dec_count ;Zhler grer -> bra.s loop_end ;zum Schleifenende dec_count: sub.l d7,d2 ;Zhler um 256000 verringern loop_end: subq.l #1,d0 ;1 Pixel kopiert bpl.s px_loop ;------------------------------------------------------------------------------ rts END N> ."o o"/ >< <|t ><Qԁ |n`}QNu      copy_loopdelayloop_end sub_countadd8fade;****************************************************************************** ;* ADD8FADE - Byteweises berblenden zwischen zwei Bildschirmen * ;* mit Konstanten-Addition von Andreas Hollmann * ;* (c) 1992 MAXON Computer GmbH * ;****************************************************************************** GLOBL add8fade; add8fade: movea.l 4(sp),a1 ;src_adr holen movea.l 8(sp),a0 ;dst_adr holen move.l 12(sp),d1 ;Add-Wert holen ;------------------------------------------------------------------------------ move.w #10,d7 ;Verzgerungs-Wert move.l #31999,d0 ;Schleifenzhler moveq #0,d2 ;Zhler ist am Anfang 0 ;------------------------------------------------------------------------------ copy_loop: move.b 0(a1,d2.w),0(a0,d2.w) ;1 Byte kopieren move.w #20,d7 ;Verzgerungswert restaurieren delay: dbra d7,delay ;Brems-Schleife add.l d1,d2 ;zum Zhler Add-Wert addieren cmpi.l #31999,d2 bgt.s sub_count ;falls Zhler > 31999, -> bra.s loop_end ;zum Schleifenende sub_count: sub.l #32000,d2 ;Zhler um 32000 verringern loop_end: dbra d0,copy_loop ;------------------------------------------------------------------------------ rts END void cdecl add1fade(void *Puffer1, void *Puffer2, long mode); void cdecl add8fade(void *Puffer1, void *Puffer2, long mode); void cdecl rnd1fade(void *Puffer1, void *Puffer2); void cdecl rnd8fade(void *Puffer1, void *Puffer2); /*--------------------------------------------------------------*/ /* Demo zu den vier berblendroutinen */ /* */ /* (c) 1992 MAXON Computer GmbH */ /*--------------------------------------------------------------*/ #include #include #include #include #include #include #include "fade.h" extern int handle, work_out[]; void gem_prg(void) { void *Bild1, *Bild2; int w_out[57]; void Zeichne_Bild(void); vq_extnd(handle,1, w_out); graf_mouse(ARROW,0); Bild1 = Malloc(((long)(work_out[0]+1) * (long)(work_out[1]+1) * (long)w_out[4])/8); if (Bild1 == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); return; } Bild2 = Malloc(((long)(work_out[0]+1) * (long)(work_out[1]+1) * (long)w_out[4])/8); if (Bild2 == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(Bild1); return; } Setscreen(Bild1, Physbase(),-1); Zeichne_Bild(); Setscreen(Bild2, Physbase(),-1); Zeichne_Bild(); Setscreen(Physbase(), Physbase(),-1); graf_mouse(M_OFF, 0); add1fade(Bild1, Physbase(), 123457L); Crawcin(); add8fade(Bild2, Physbase(), 117); Crawcin(); rnd1fade(Bild1, Physbase()); Crawcin(); rnd8fade(Bild2, Physbase()); Crawcin(); graf_mouse(M_ON, 0); Mfree(Bild1); Mfree(Bild2); } void Zeichne_Bild(void) { int i, x, y, r, xy[4]; graf_mouse(M_OFF, 0); xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); v_clrwk(handle); vswr_mode(handle, 1); for (i=0; i<10; i++) { x = abs(work_out[0]*(Random()/pow(2,24))); y = abs(work_out[1]*(Random()/pow(2,24))); r = 20 + abs(100*(Random()/pow(2,24))); v_circle(handle, x, y, r); } vs_clip(handle, 0, xy); graf_mouse(M_ON, 0); }`1``3>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3~33 k #3 Ј<.@#3Jy3g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 91g @N 91g @NN?<LNA/ E3N-5@R@gPp` 2A5R@| m5|HjHjCAN-PO5@5@4HjC JN,XOp`B@$_Nu094.N,N-dNuNS@fN`NB@NLNuC1A3 NpN4Nu o"o"/ <t*<|.<& 00f 0` 0ԁb`SjNu"o o"/ >< <|t ><Qԁ |n`}QNu o"op&<xz<<.< g g` ` g `∰b<$0 g ` SjNu o"o><|pgg``g` @|b<<QQNu/ / OAr094.N*lB@N,G3pSHrkHNR2/HNHrNN)$H fA2pN+`pSHrkHN2/HN rNPN)&H fA2pN+f JN)`N)"H JpN)NN)"H KpN)Np?N)"H/ N)x"_0N)0<N+H/<AN)\// NO N)pu/N)D// NO N)N)0// N,PON(N)// NzPON(0<N* JN( KN(Or&_$_NuHOБ0<N*BWBoG3?S?kI4.Ar0N)@0N)r0N)BC`N(A&N(A2P/ / ? A2Z/ / ? HoNvOA&CNA&0NA&N'0N 8N(ZA&N'A2d/ / ? A2n/ / ? HoN OA&CNA&0+NHA&N'60N (:N(A&N'XA2x/ / ? A2/ / ? HoN OA&CNhA&C2N(A&N&0N <|?420N(@TORC| mABA0N'0<N)NO0LxNuA(p"@ "By2A1B3232O"Nu/ Hz?<&NN\O$_Nu@TXJ? ?ry@ڢ!h5?ڢ!h5?ڢ!h5?@@NaN-INF+INF(C)Xmath by d'ART/QOM-O, ICHza&XOPO,_NuH@B@H@"VraJ@kNu.np`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"1p` 3!1p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!1`0123456789abcdefghijklmnopqrstuvwxyz/ &y3b g/ &S?<INA\O`&y3f g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNupowerACHVMBa//?Aa~//?,o f>,?B^BJ g`<,,A CHnHzpaPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA2?BPAa 32CaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدalJk fJg aA2?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAaIa aDKxA !%!%1%xaKMa|MQC aCadOL`NuA"o4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ92gJg j c a0JfJg92g92fJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzap` ҁQ !1LNudivCA/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG92f,⎜bHFRFkHz``, c92g~92fJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu92f╚kfg` JfJg`,HFRdR`,HF  @c"$HzaD` ЀP !1L Numod42<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ ?<NATO$_Nu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nu/ ?<NNTO @$_Nu/ ?<NNTO$_Nu/ ?/ /?<NNO $_Nu/A4B@22220<"</NBA50$_Nu4<4Z457T9T Fehler bei der Programminitialisierung![3][ Nicht gengend Speicher frei! ][ Abbruch ]@@@@@@@2223 4<49l56Tr  h(Z2<0 J L (`l&  ~.^6V0T *<<*&8 4B @ (& .* Jf0 4 & t (6  , fadedemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o add1fade.o add8fade.o rnd1fade.o rnd8fade.o fadedemo (fade.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.libGFA-BASIC3|t       F F F F J T1T2REPEATSPATHTEXTSCREEN0SCREEN1RND_FADE START_WERTX_FADEP_SRCP_DSTP_ADD1FADE_INLP_ADD8FADE_INLP_RND1FADE_INLP_RND2FADE_INLP_RND8FADE_INLMODEP_RN1QFADE_INLP_NEW_RND1_INLP_BUFFERLINES SHOW_TIMEP_ADD81FADE_INLP_PATHREPEATSTEXTMODEOFFSETFINISHDRIVE DEF_INLINESADD1FADEADD8FADERND1FADERND2FADERND8FADERN1QFADENEW_RND1 START_SHOW GET_INLINESINF_LOADGET_PATHR----------------------------------------------------------------------------- >Programm: berblenden von monochromen Bildschirmgrafiken n$Sprache: GFA-Basic + Assembler Autor: Andreas Hollmann b(c) MAXON Computer GmbH R-----------------------------------------------------------------------------  ߀F.Hd F Feld fr Datei 'PIC_SHOW.INF' 04F GEMDOS-Pfad ermitteln (Compilat!!!) .4a:\F absoluter Pfad (Interpreter!!!) , F$ Adressen der INLINE-Blcke holen *< lи  JF genug Speicher fr Puffer? "8и} F dann her damit P& F Datei 'PIC_SHOW.INF' laden h.й F Puffer-Speicher wieder freigeben a 8ҺF6LY! ! Nicht genug Hauptspeicher frei !FFJ F$F FFFR=============================================================================  FZ!LF o"o"/ <t*<|.<& 00f 0` 0ԁb`SjNuL!>F"o o2/ >< <|t ><Qԁ |n`}QNun !`F o"op&<xz<<.< g g` ` g `∰b<$0 g ` SjNu^ !PF o"o><|pgg``g` @|b<<QQNuF F: dT pic_show.inf F 'PIC_SHOW.INF' existiert ?"$i!M! pic_show.infF.LM! !!F in Stringfeld laden 0MFFF ab geht's HF 8նFT:LY! "%Datei 'PIC_SHOW.INF' existiert nicht!FJ F$FFF!!F$"85 F  Zeit pro Bild 2XG5 F Anzahl Wiederholungen @FF, zT F nur wenn Bild existiert "T !FF neues Bild laden F 2  effect 1Fl berblendeffekt lesen u !V F@ effect 2Fu !V F@P effect 3F u!V !u F@׊ effect 4F u!V ! F@ effect 5F u!V ! F@ effect 6F u!V !> F@8 effect 7F u!V !! F@r effect 8F u!V !A F@ج effect 9F u!V ! F@  effect 10F u!V ! F$8:F unbekannter Effektname 0T!V !}Ff Bild einfach kopieren $FF2z F warte noch ein Weilchen... 8٢FTF  nchstes Bild $F@ endF&,F Bildsequenz wiederholen F,(F aktuellen GEMDOS-Pfad feststellen !F@W F4 F8qм XFF8WG!! F 0=Driveno=aktuelles Laufwerk "4B߂ :aX\FHF,F5 0 a:\pictures\wikinger.scr effect 1 a:\pictures\worldmap.scr effect 2 a:\pictures\frau.scr effect 3 a:\pictures\daybreak.scr effect 4 a:\pictures\space.scr effect 5 a:\pictures\portrait.scr effect 6 a:\pictures\atartsym.scr effect 7 a:\pictures\oldhouse.scr effect 8 a:\pictures\apfel_m.scr effect 9 a:\pictures\globus.scr effect 10 end ' ----------------------------------------------------------------------------- ' Programm: berblenden von monochromen Bildschirmgrafiken ' Sprache: GFA-Basic + Assembler ' Autor: Andreas Hollmann ' (c) MAXON Computer GmbH ' ----------------------------------------------------------------------------- RESERVE 2^16 DIM text$(100) ! Feld fr Datei 'PIC_SHOW.INF' path$=FN get_path$ ! GEMDOS-Pfad ermitteln (Compilat!!!) path$="a:\" ! absoluter Pfad (Interpreter!!!) get_inlines ! Adressen der INLINE-Blcke holen IF MALLOC(-1)>32000 THEN ! genug Speicher fr Puffer? p_buffer%=MALLOC(32000) ! dann her damit inf_load ! Datei 'PIC_SHOW.INF' laden ~MFREE(p_buffer%) ! Puffer-Speicher wieder freigeben ELSE PRINT AT(1,1),"Nicht genug Hauptspeicher frei !" ~INP(2) ENDIF ERASE text$() RESERVE END ' ============================================================================= PROCEDURE get_inlines INLINE p_add1fade_inl%,76 INLINE p_add8fade_inl%,62 INLINE p_rnd1fade_inl%,96 INLINE p_rnd8fade_inl%,80 RETURN PROCEDURE inf_load IF EXIST(path$+"pic_show.inf") ! 'PIC_SHOW.INF' existiert OPEN "i",#1,path$+"pic_show.inf" RECALL #1,text$(),-1,lines% ! in Stringfeld laden CLOSE #1 HIDEM start_show ! ab geht's SHOWM ELSE PRINT AT(1,1);"Datei 'PIC_SHOW.INF' existiert nicht!" ~INP(2) ENDIF RETURN PROCEDURE start_show LOCAL show_time%,offset&,repeats% show_time%=VAL(text$(0)) ! Zeit pro Bild FOR repeats%=0 TO VAL(text$(1)) ! Anzahl Wiederholungen offset&=2 DO IF EXIST(text$(offset&)) ! nur wenn Bild existiert BLOAD text$(offset&),p_buffer% ! neues Bild laden INC offset& IF text$(offset&)="effect 1" ! berblendeffekt lesen ~C:p_rnd8fade_inl%(L:p_buffer%,L:XBIOS(2)) ELSE IF text$(offset&)="effect 2" ~C:p_rnd1fade_inl%(L:p_buffer%,L:XBIOS(2)) ELSE IF text$(offset&)="effect 3" ~C:p_add8fade_inl%(L:p_buffer%,L:XBIOS(2),W:117) ELSE IF text$(offset&)="effect 4" ~C:p_add8fade_inl%(L:p_buffer%,L:XBIOS(2),W:177) ELSE IF text$(offset&)="effect 5" ~C:p_add8fade_inl%(L:p_buffer%,L:XBIOS(2),W:19) ELSE IF text$(offset&)="effect 6" ~C:p_add8fade_inl%(L:p_buffer%,L:XBIOS(2),W:15999) ELSE IF text$(offset&)="effect 7" ~C:p_add1fade_inl%(L:p_buffer%,L:XBIOS(2),L:801) ELSE IF text$(offset&)="effect 8" ~C:p_add1fade_inl%(L:p_buffer%,L:XBIOS(2),L:123457) ELSE IF text$(offset&)="effect 9" ~C:p_add1fade_inl%(L:p_buffer%,L:XBIOS(2),L:127999) ELSE IF text$(offset&)="effect 10" ~C:p_add1fade_inl%(L:p_buffer%,L:XBIOS(2),L:3789) ELSE ! unbekannter Effektname BMOVE p_buffer%,XBIOS(2),32000 ! Bild einfach kopieren ENDIF INC offset& ~EVNT_TIMER(show_time%*1000) ! warte noch ein Weilchen... ELSE ADD offset&,2 ! nchstes Bild ENDIF LOOP UNTIL text$(offset&)="end" NEXT repeats% ! Bildsequenz wiederholen RETURN FUNCTION get_path$ ! aktuellen GEMDOS-Pfad feststellen LOCAL drive&,p_path% drive&=GEMDOS(25) path$=SPACE$(128) p_path%=LONG{ARRPTR(path$)} ~GEMDOS(71,L:p_path%,0) ! 0=Driveno=aktuelles Laufwerk path$=CHR$(65+drive&)+":"+CHAR{p_path%}+"\" RETURN path$ ENDFUNC `9;:AON <r4<&<x:<a a,a+pd~A퀀a4NC,a"fNHx?<HNA\}o$Hx}?<HNA\+@tN/-t?<INA\`pra2pa#rE:tp a#Ppa2A퀀a6a*aE9: +@TE9 +@XE9 +@\E:$ +@dNuE:p a'6C,aaNg@E:p a'C,araptA퀀a0+Axpa8aN`a`pra1E:p%a"pa2 Nua(Aa&BA a&Aa&2x"ma64a(a$m$$mBx"ma6a(aa Z`$m 4$m 8H"ma5ag$m 8H"ma5 -ta6,$m RR$m 8H"ma5E:pag?<NNT//-t mdNP`:$m 8H"ma5E:pag?<NNT//-t m\NP`$m 8H"ma5HE:paPgHyuNNT//-t mXNO `$m 8H"ma5 E:pagHyNNT//-t mXNO `$m 8H"ma4E:pagHyNNT//-t mXNO `N$m 8H"ma4E:pagHy>NNT//-t mXNO `$m 8H"ma4XE:pa`g Hx!?<NNT//-t mTNO `$m 8H"ma4E:pa"g"HyA?<NNT//-t mTNO `$m 8H"ma3E;pag Hy?<NNT//-t mTNO `T$m 8H"ma3E; p agHx?<NNT//-t mTNO `?<NNT"@ <} mta$m RR$m $刔Ђa`$m TR$m 8H"ma3$E;pa,g$mR$m o]`$a%@Aa"Aa"?<NAT$m40<a%rC,aA, $m$Bg$m/?<GNAPpA$m4RЊa#p:a/$m aR"_azp\aC,apA,`$apa JkpNupNua$AHPB?HQ?<NNAP _NuDExa`bDEa`ZaR11!Nua11!Nu 24&8:DE`6 24&8:DB`&ah&8:DE`DEx`aT` 24&8:HnghDBHngXDE~<En g6@ABDFGcGcGb8(vHDl`G8BCHC` GHD8HD쬵k&Dуd QRB BbJjDBNu DENupN֓DjdDA@ cAр[SBoJjDBNurptNuH@g0J`Ѐ[rGoJjDBNu0ftNu@[rB oH@JjDBNu 24afpNu 24afpNu>jDGGe GbFGNuG GbFGNu~Nu 24HjDBaDBNuBe B/dAрQ4<`jBNutNu $HkBk Bj*DBNupNuDBBkBjDBDNuf gp`` 246jDCCe0 C/jC C@j C jr0H@{0>H@Nur{0Nu{0NutNu 246j(:<DCaf AfBfNu`la 00Nur$o, b4< J@k @[H@NuH@RBNu4<Ѐ[NuDg8k2 b4< J@k @[H@DBNuH@RBDBNu4<Ѐ[DBNu4H@Ѓdh`^HCH@:">H@`H2g&HCH@:<HC>H@Ѓd(`HCH@:H@r` gDBgkDE`HDBDEaBDBNugDBa8DBNutNua 11!Nux`xa`a` 24&8:HoHoEBJAgJDfr:g,|HC҅H@:ۆ<HC>H@Ѓd`vHCH@:H@`fgDBgkDE` DBDEaDBNugDBaDBNutNuHoHoEBz:g|HC҅H@:ۆ҄ۆ<HC>H@ЃdHA@B@H@хk HAҁHAрSB BbNuJBj^tNuk(g.JBjDBAр[SBDBjNutNuAр[SBkNuJlNu0gH@rJBkB JkЀ[`DBЀ[`J.;gP:pr4<Nup` <r4<NupNJBktNu@AB`&8:~.gNa`&8:` &8:@ABJBgJEgJAfJ@f<jDFF Fdx.HGއQJGfjHGH??UGgkte <r4<` 24HL&8*a dgHL8a`L8aTJ_ k:NuH 24kBaL8a`TJ_LkNuTJ_Lja&8* <r4<`HL aJBfL agLJBjDBa8L8a@a*DBNuLJBjDBaL8a"` p`n 24?o4<&8: 3f AcDA@Aр[SBDBT`SBAрkfJAftTSWa>H&8:aH&0rHGGdHGGdSWDуdi?<>0rHGGdHGGdSWDуdi ?<>0rHGGdHGGdSWDуd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNu?<,>CEdGH@0r`xJCgz?<0rÐdSWЃdi?<0rÐdSWЃdid?<0ÐdSWЃd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNu?<0riR?0i?`?<`;apE;;gP;`LJg&B.C`a8aD*9;fap-I,=|p4aHz*9;g ENp9;` _a &nO:NM;INK;$<Nu[1][Error +111][Return]E; g g>Jf`Ar Hjr-D@Hd0H@H 0H@0CNuAF"H [1][fSEfNu`HQ?< NA\Nu"_K;M;INO:HQ <-H*,`N,d d3 d# d# # d# # # # d ALH dAL H LH d AL`H L|0H>L|H>d~# # # # A`@ALH L|H>L|H>L|PH>L| H>L|H>L|H>L|H>L|`H>L|0H>L|H>QL|Nu$H$&"BA -KaXA"f B &nNuH>dd2d"d""d""""d LHC dLHLH C@d LHL|H| L|H|PCd~""""C`:LHL|H| L|H|PL|H|L|H|L|H|L|H|L|H|@L|H|pL|H|L|H|CQL|Nua`Np?a a?<LNA``NuNu`aza`aa~aHA-Hhp alpMah=@F?<NNTT@A0r p0Q`pdr ta0.F=@=@ACp,2QAp 2Qa *a`\`Xpea>pCR2Ad0A2r22a "<P0<NBLNurt=@:=A@=B NuHz(` N"Hz ?<&NN\Nu9vTgNuWvTNu|^|  R^,T:&0D4(*<B$,>2::(   F..26"8@"PQ1!P1P!0PP`0  q#aaaa O: n*NNuNuNupc?a0QNurdAd6Ag,B(dB(dH Ac<a tgBAp`NuNu?<OA`d?<IA`Z0<H IaLt Ig Og Ug Ag Rg*afNup`ap`0a fHRab>Er$Wgr STD:gr COM:g r LPT:f2FA$_0=@D~CA0< BhaB2"pNu$_AF Ge><QBAFpNuahgzp=` a\gzp _a &G` VNuag`af`ae `ac` acpNuadpNu/ a $I> _a 4Ae4v` VfANuHP0(R@kBa $I _a IUd4Id4Id$Id `$$$$Q @JfNuNup `a rSAfNuag`af`ae `ac` acpNuadpNua >SAkfJANuH HPhkJa 0 $I _a IUd4Id4Id$Id `$$$$Q @JgSL`QNup `>a ҰAf` VNuag`af`ae `ac` acpNuadpNua 4@m4v` Vf@NuH@-@|p`pBp'rta n2rt6(SC0(S@apaB\papava0pa=n-nNuv `v`vh`SCS@AB8Hp=@0<rt`@H\Nup` 24DBaDB11!Nu 24DBa DBNu 24x6o<Ce(FC BdЄeNu B/dHDDdRdQRBNu&<:<`.g BbUC BcjNu BcHDDdSkg RBAрjNuNu0ftNuB H@"jNuE"eaԵ"ep`&6NuE "e a"d&&6NuE"e a"d66NuE"e ax"d666NuE"e aX"d6Nua`QNuHg"cc/ 0)a _$PS@kH2QNu2(g$PRAA4DBH%$Y2Pg 1AHRAA%NuBhNu~dGdEH<Nup`0@F@AJhg PLNu`LJg(HPBHh/??<@NAXLf ѨLNuJkp%`naJBja!| ??<>NAXOJkpNu0< aF`0< CF2p`p a0`p CFp`aCF"p`Hza `Hz"J`B.@=|DNua.@FpAR@C` B.@=|DNuB.@a=GDgNup`Jg$_a: HN$_a: HN$_aBHN$_a؄BpHN$_aB0HN$_axBpHN$_alN$_ab؄N$_aXN$_aPN$_aF 0HN$_a:؄00HHN$_a,p0HN$_a 24N$_a:p 0HgpN"X I"_(*UGk*<(؆QNp`p`p` p`pJPg`$_a!HN$_a؄1HN$_aHN$_a 00N 246jDC C b H&<;)8<\:<aaHaR/@L&`jAF gp gj g grffnnpenbfJ.fj6pRGFc$SG` J.fjpRGFcRF` Ff`> `?~ap a0p a*0Nu|``CpE`bf`FgRGJGgSGSFFgCpE`Yf`Nua@Jf gH@ fa(@ fza0 b @ Ee0NuagNu4.rf?HyaNM\Nu=|D`LjazEfpadppa`AFEg0PaEfaFRE`ܾEfp a@a8?nnnp a2RF`<annoS@f nhfSnl=Ah=FnNup` papq4.rf?HyavNM\Nu=|DHa LNu|A0"P2(@e2<EF`QHP=|DJ@g$abAF$HpR@ 0 f _aB`QNuHPp?ap a| _2<|0`C&pHQ/Hy@NA NuC pa:NuHQ/Hy?NA Nu&g4 FgagJAga2< R@AdSf0Nu0ap Ce`&g4 FgabJBjazgPAe CbRa R@Sf0Nu FgRa*g JBja<CF Ipa<0HNuaB`]@><CF Ipa Nu?|`?a 0R@f|0aHJFkHPa _Nupo`HSHP&I>g\SG??<NMXJk Q _t&_Nu&_`ۮC`C``C` C`CJhfJfRRRRRRRHP? @CFH~8:E#P&<2 `b$bYEf`"RAf rЁЀ`&Ѐe "ЀeЁdp`JAkfgRer?DDЁaAa8$HX :CFE` YEjT"_$P"2trDDd0d d d` QjNu`ڂaDa DNu na^ K"ng42 $`gk2&Hg Af deђ$`ebѐXf&nNu AgebѐA``-Kx$ n&$n""Hg8" &Ak cѐ S`g"" k#&Acё2+SAI3 Q&f-I"&nNu-Kx$&ր n&$n""HgR" k&Ac b S` S`g4" k#&AcbrkX`ޑ2+SAI3 Q&f-I"&nNu"H YJQfNu YH瀀aLP|HPG9 C&֛֛֛֛֛(HDDCBg6Cv6C[RCF8[[[aL6C[RCF8:G9 FWfTL L-KA `$I\bfBjQNu$YbfBjQNu؄*؄؅CH`؅X`$_  IahHR"H @`̘؄*؄؅AHNu؅X`$_ Ia4HR"H`#8HrYapYa:LapY`^ :/rYapYaHyp?o?<?NAO JkpY`(/a `תH.gZ <r4<?k"SWgaj`TL8Ha$a< <|t ><Qԁ |n`}QNu o"op&<xz<<.< g g` ` g `∰b<$0 g ` SjNu o"o><|pgg``g` @|b<<QQNuNicht genug Hauptspeicher frei !pic_show.infDatei 'PIC_SHOW.INF' existiert nicht!effect 1effect 2effect 3effect 4effect 5effect 6effect 7effect 8effect 9effect 10end 6* " 488<<<<>@>xj *~ f((@4VN`8X o"op&<xz<<.< g g` ` g `∰b<$0 g ` SjNu            bits00bits01bits10bits11bits0xbits1xrnd1fadechk_rndclr_bitcalc_rnd dec_count;****************************************************************************** ;* RND1FADE - Pixelweises berblenden zwischen zwei Bildschirmen * ;* mit Pseudo-Zufallszahlen von Andreas Hollmann * ;* (c) 1992 MAXON Computer GmbH * ;****************************************************************************** GLOBL rnd1fade; rnd1fade: movea.l 4(sp),a0 ;src_adr holen movea.l 8(sp),a1 ;dst_adr holen ;------------------------------------------------------------------------------ moveq #1,d0 ;Schiebe-Register mit Startwert 1 laden move.l #255999,d3 ;fr Vergleich obere Grenze (schneller !) moveq #0,d4 ;fr 1. Abgriff (schneller !) moveq #7,d5 ;fr 2. Abgriff (schneller !) move.w #17,d6 ;fr linkes Bit (schneller !) move.l #255999,d7 ;soviele Bits werden kopiert ;------------------------------------------------------------------------------ ;Erzeugung von Pseudo-Zufallszahlen mit einem rckgekoppelten Schieberegister: ; calc_rnd: btst d4,d0 ;1. Abgriff (Bit 0) beq.s bits0x ;falls Bit=0 -> bits1x: btst d5,d0 ;2. Abgriff (Bit 1) beq.s bits10 bits11: lsr.l #1,d0 ;kein Bit setzen, weil 1 eor 1 = 0 ist bra.s chk_rnd bits10: lsr.l #1,d0 bset d6,d0 ;weil 1 eor 0 = 1 ist bra.s chk_rnd bits0x: btst d5,d0 ;2. Abgriff (Bit 1) beq.s bits00 bits01: lsr.l #1,d0 bset d6,d0 ;weil 0 eor 1 = 1 ist bra.s chk_rnd bits00: lsr.l #1,d0 ;kein Bit setzen, weil 0 eor 0 = 0 ist ;------------------------------------------------------------------------------ chk_rnd: cmp.l d3,d0 ;max. 255999 ! (in d3 steht 255999) bhi.s calc_rnd ;sonst neue Zufallszahl... move.b d0,d1 ;Zufallszahl in d1 kopieren and.b #7,d1 ;Pixel berechnen move.l d0,d2 ;Zufallszahl in d2 kopieren asr.l #3,d2 ;Byte berechnen btst d1,0(a0,d2.w) ;src_adr-Bit abfragen beq.s clr_bit bset d1,0(a1,d2.w) ;dst_adr-Bit setzen bra.s dec_count clr_bit: bclr d1,0(a1,d2.w) ;dst_adr-Bit lschen dec_count: subq.l #1,d7 ;Pixel-Zhler dekrementieren bpl.s calc_rnd ;------------------------------------------------------------------------------ rts END NP8T o"o><|pgg``g` @|b<<QQNu           bits00bits01bits10bits11bits0xbits1xrnd8fadechk_rndcalc_rnddelayprg_end;****************************************************************************** ;* RND8FADE - Byteweises berblenden zwischen zwei Bildschirmen * ;* mit Pseudo-Zufallszahlen von Andreas Hollmann * ;* (c) 1992 MAXON Computer GmbH * ;****************************************************************************** GLOBL rnd8fade; rnd8fade: movea.l 4(sp),a0 ;src_adr holen movea.l 8(sp),a1 ;dst_adr holen move.w #31999,d7 ;soviele Bytes werden kopiert moveq #1,d0 ;Schiebe-Register mit Startwert 1 laden ;------------------------------------------------------------------------------ ;Erzeugung von Pseudo-Zufallszahlen mit einem rckgekoppelten Schieberegister: ; calc_rnd: btst #0,d0 ;1. Abgriff (Bit 0) beq.s bits0x ;falls Bit=0 -> bits1x: btst #1,d0 ;2. Abgriff (Bit 1) beq.s bits10 bits11: lsr.l #1,d0 ;kein Bit setzen, weil 1 eor 1 = 0 ist bra.s chk_rnd bits10: lsr.l #1,d0 bset #14,d0 ;weil 1 eor 0 = 1 ist bra.s chk_rnd bits0x: btst #1,d0 ;2. Abgriff (Bit 1) beq.s bits00 bits01: lsr.l #1,d0 bset #14,d0 ;weil 0 eor 1 = 1 ist bra.s chk_rnd bits00: lsr.l #1,d0 ;kein Bit setzen, weil 0 eor 0 = 0 ist ;------------------------------------------------------------------------------ chk_rnd: cmpi.w #31999,d0 ;Zufallszahl nur von 0-31999 ! bhi.s calc_rnd ;sonst neue Zufallszahl... move.w #20,d6 ;Verzgerungswert delay: dbra d6,delay ;Verzgerungs-Schleife move.b 0(a0,d0.w),0(a1,d0.w) ;1 Byte kopieren dbra d7,calc_rnd ;------------------------------------------------------------------------------ prg_end: rts END . _iL.. ^iKREISDEMC dMxKREISDEMPRG ۳dO1KREISDEMPRJ (dUKREISE C dV KREISE H ӨdY1KREISE O ֳdZ8/*----------------------------------------------------------------*/ /* Demo zum inkrementalen Kreisgenerator (nach Horns Algorithmus) */ /* */ /* Originalroutine in GFA-BASIC von Andreas Hollmann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include "kreise.h" extern int handle; void gem_prg() { int i, r, type, t[3]; t[0] = 0xFFFF; /* durchgezogene Linie */ t[1] = 0xAAAA; /* gepunktete Linie */ t[2] = 0xEEEE; /* gestrichelte Linie */ for (i=0; i<3; i++) { type = t[i]; graf_mouse(M_OFF,0); v_clrwk(handle); graf_mouse(M_ON,0); for (r=2; r<80; r+=5) { vsl_type(handle, 7); vsl_udsty(handle,type); graf_mouse(M_OFF,0); v_arc(handle,480,199,r,0,3600); /* VDI-'Kreis' */ graf_mouse(M_ON,0); vsl_type(handle, 1); circle(160,199,r,type); /* echter Kreis */ } Crawcin(); } } `$``>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3 k # Ј<.@#Jyg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9g @N 9g @NN?<LNA/ EN5@R@gPp` 2A5R@| m5|HjHjCANdPO5@5@4HjC JNXOp`B@$_Nu09lNZN*NuNS@fNNB@NLNuCA^NpN4NuHYO6>?B0<N8/BE|>`N0|bB@0;N60@o`z0/FgJ2SAgUAgUAg"UAg,`62E0DN`(2D0EN`2E0DN` 2D0ENFJFf|0@R@oRE0/m 2AUAoSDEl`0@o`~0@S@oSE0/l 2ATAoRDDgZ0/FgJ2UAgUAgUAg"UAg,`62D0EN^`(2E0DNP`2D0ENB` 2E0DN4FJFf|JElFJFf|RW Wo0<NXOLNuQO>?A?@?AA09lrNPONuH]O>?|?|BCGl`0@870<N<0N (0<N,z`Xr0N 20N 0<N?<Bg?4<2<0N \O0<N r0N V?42<0<NTOZE|PmN *RC|mp\OL8NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/QOM-O, ICHza&XOPO,_NuH@B@H@"VraJ@kNu.np`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#/ ?<NATO$_NuAzBh1|1Ar`,AzBh1|1Arq`Az1|1|1| 1A01B2Bh4Bh6Bh8Bh:1o1o1or `AzBhBhr`AzBhBhre`3/ Cz2dBi3| Cp 2Q"<ps/ NB$_ _0A8"op,2QAp 2QNuz88Cz3ABi# Ira#Nu/ 1@ 0"<psNBA80$_Nup `:p`4/ /pMa*"_2"_2"o2"o2Nu#38pN`/ 3z@@A"C|B@22220<"<NBA80$_Nuz88 Fehler bei der Programminitialisierung!Hz88r  h((&  ~..L  8 "kreisdem.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o kreise.o kreisdem (kreise.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* Inkrementaler Kreisgenerator (nach Horns Algorithmus) */ /* */ /* Originalroutine in GFA-BASIC von Andreas Hollmann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include extern int handle; /*--------------------------------------*/ /* Parameter: */ /* x0,y0: Kreismittelpunkt-Koordinaten */ /* r: Kreisradius */ /* type: Linienmuster (16 Bits) */ /*--------------------------------------*/ void circle(int x0, int y0, int r, int type) { int octant, x, y, test; void Plot(int x, int y); graf_mouse(M_OFF,0); x = r; y = 0; test = 1; for (octant = 1; octant <= 8; octant++) { switch(octant) { case 1: /* Oktant 1,3,5,7 */ case 3: case 5: case 7: r -= (x<<1); while (y<=x) { if (type & test) /* Muster-Bit gesetzt? */ switch(octant) /* dann Punkt setzen */ { case 1: Plot(x0+x,y0+y); break; case 3: Plot(x0-y,y0+x); break; case 5: Plot(x0-x,y0-y); break; case 7: Plot(x0+y,y0-x); break; } test <<= 1; if (test == 0) test = 1; r += ((y<<1) + 1); y++; if (r>=0) { r -= ((x<<1) - 2); x--; } } break; case 2: /* Oktant 2,4,6,8 */ case 4: case 6: case 8: r += (x<<1); while (y>=0) { r -= ((y<<1) - 1); y--; if (r<0) { r += ((x<<1) + 2); x++; } if (x != y) /* Diagonalen-Linien vermeiden */ { if (type & test) /* Muster-Bit gesetzt? */ { switch(octant) /* dann Punkt setzen */ { case 2: Plot(x0+y,y0+x); break; case 4: Plot(x0-x,y0+y); break; case 6: Plot(x0-y,y0-x); break; case 8: Plot(x0+x,y0-y); break; } } test <<= 1; if (test == 0) test = 1; } } test <<= 1; if (test == 0) test = 1; break; } } graf_mouse(M_ON,0); } void Plot(int x, int y) { int xy[4]; xy[0] = x; xy[1] = y; xy[2] = x; xy[3] = y; v_pline(handle,2,xy); } void circle(int x0, int y0, int r, int type); N@*HYO6>?B0<N8/BE|>`N0|bB@0;N60@o`z0/FgJ2SAgUAgUAg"UAg,`62E0DN`(2D0EN`2E0DN` 2D0ENFJFf|0@R@oRE0/m 2AUAoSDEl`0@o`~0@S@oSE0/l 2ATAoRDDgZ0/FgJ2UAgUAgUAg"UAg,`62D0EN`(2E0DN`2D0EN` 2E0DNFJFf|JElFJFf|RW Wo0<NXOLNuQO>?A?@?AA09rNPONuh*  handle graf_mousecirclePlotv_pline. !_i[.. ^iCURSDEMOC e\ CURSDEMOPRG e_m'CURSDEMOPRJ seiCURSOR C ej CURSOR H enCURSOR O eoL/*----------------------------------------------------------------*/ /* Demo zur Routine zur (Grafik-)Text-Eingabe */ /* */ /* Originalroutine in GFA-BASIC von Tom Quellenberg */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #include #include "cursor.h" extern int handle, work_out[]; MFDB Schirm_mfdb; void gem_prg() { MFDB Puffer_mfdb; void *Puffer; int xy[4], w_out[57], Modus, Stil, Winkel, Groesse, exit, d; void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp); void Put(int x1, int y1, MFDB *mp); vq_extnd(handle,1, w_out); Schirm_mfdb.fd_addr = Physbase(); Schirm_mfdb.fd_nplanes = w_out[4]; Schirm_mfdb.fd_w = work_out[0] + 1; Schirm_mfdb.fd_h = work_out[1]; Schirm_mfdb.fd_wdwidth = (work_out[0] + 1)/16; Schirm_mfdb.fd_stand = 0; xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); graf_mouse(M_OFF,0); v_clrwk(handle); vswr_mode(handle, 1); graf_mouse(ARROW,0); graf_mouse(M_ON,0); Puffer = Malloc((long) work_out[0] * (long) work_out[1] * w_out[4]); if (Puffer == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } do { Get(0,0,work_out[0],work_out[1],Puffer,&Puffer_mfdb); Modus = form_alert(0,"[2][ Endgltige Ausgabe | mit Schreibmodus ][ REPLACE | TRANSPARENT ]"); graf_mouse(M_OFF,0); printf("\n\n Textstil <0..31>? "); scanf("%i",&Stil); printf("\n Ausgabewinkel <0, 90, 180, 270>? "); scanf("%i",&Winkel); printf("\n Textgre <0..27>? "); scanf("%i",&Groesse); Put(0,0,&Puffer_mfdb); vst_rotation(handle, Winkel*10); vst_effects(handle,Stil); vst_height(handle, Groesse, &d, &d, &d, &d); graf_mouse(M_ON,0); Gem_Text(Modus); exit = form_alert(1,"[2][ Demo beenden? ][ Ja | Nein ]"); } while (exit != 1); vs_clip(handle, 0, xy); } void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp) { int xy[8]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; xy[4] = 0; xy[5] = 0; xy[6] = x2 - x1; xy[7] = y2 - y1; mp->fd_addr = p; mp->fd_nplanes = Schirm_mfdb.fd_nplanes; mp->fd_w = ((x2 - x1) + 16) & 0xFFF0; mp->fd_h = y2 - y1; mp->fd_wdwidth = mp->fd_w/16; mp->fd_stand = 0; graf_mouse(M_OFF, 0); vro_cpyfm(handle, 3, xy, &Schirm_mfdb, mp); graf_mouse(M_ON, 0); } void Put(int x1, int y1, MFDB *mp) { int xy[8]; xy[0] = 0; xy[1] = 0; xy[2] = mp->fd_w; xy[3] = mp->fd_h; xy[4] = x1; xy[5] = y1; xy[6] = x1 + mp->fd_w; xy[7] = y1 + mp->fd_h; graf_mouse(M_OFF, 0); vro_cpyfm(handle, 3, xy, mp, &Schirm_mfdb); graf_mouse(M_ON, 0); } `$``&>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#&3& k #& Ј<.@#&Jy&g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9$g @N 9$g @NN?<LNA/ E&N h5@R@gPp` 2A5R@| m5|HjHjCAN TPO5@5@4HjC JN\XOp`B@$_Nu09'jNN NuNS@fNNB@NLNuC$A&ZNpN4NuH2(h?Ah?@?A?@h ?A 4(P?B ?A?B0(h?@A09'jrNONuOA09'jNpA'C0/J@g|gB|gj|g`0BQpP1@2/DARA1ABh0/oS@1@`BP0/D@22/DARA1At@1B2/oSA1A`Z0/D@0BQr@1Apo1@Bh2/oDARA1A`,BP2po1@rQ1A4/oDBRB1BBhONuH:OfE'jAr0NI'NP(9o G&pS9@9kH9@Bl IzBTBl9S9k Lr0N0<N"0Nr0NtB@N 0<N0H2+HNt2/HNjN/HM$ /f NpN LBA0N>r0N`?+C o4BAB@NTOA0B@Nd60<NAvNHoANtXOANHoAN^XOANHoANHXOABAB@N0/2I@A0Np2/0NHWHoCA2/ 0NPO0<N0NApN|f. LBA0NTOL\NuHO6/ &I>?A?B?CBoBo 8@?D 2C?I&7y' ||7D7I0+H7@Bk 0<Nf/ C'Ar09'jNXO0<NBOLNu/ O&HBWBo?k?k?@?A 4k?B 0k?@0<NHy'"KAr09'jNBA< <b;k`|<*f<`&<0< b ACp an$Wb<gt<.f6<*f4`$<0< b ACp a0$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a6A pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 /YOMPC HzNHz2aLPOJ.f2k?0A%aR20JAkXO,_Nup`JgA%a L"oR0aJ@kfAJk [RCJEk0` ` L"oR0aJ@kfxAJk [RCJEk0` ` L"oR0aJ@kXfJAJk [RCJEk0` ` L"oR0aJ@k*fAJk [RCJEk0` `0&LRG4`kI 4`b,ֆSDgNRG4`b`NSGB@$2LNup`NSGp`H8vBG8ghzB$H&II bNJ@kbRG4`k<0fSDgBNRG<߰<Xf SDg.NRGI *4`b,ֆSDgNRG4`b`NSGB@$2LNuP`NSGp`H8vBE8gjB$H&IINJ@kdRE4`k<-Wg<+fNREI 4`< b<ֆSDg NRE4`< b փ"փփց`NSE$JgD2B@LNup`NSEp`H<8z$H&IIPNJ@knREJ4k| gNSEJj$JDgJNREJ@kB| gJ4jNSE`0SDf`**o JDg NREJ@k| gJ4jNSE`SDfB2QL<8NuP`H06g(8$H&IJCjvJj NJ@kSCf` NJ@kSCfQC2L NuP`H<6g^8BE$H&I(o$Jj$NJ@j P`FNJ@k> F4Pg>SCf`**o NJ@j P`NJ@k F4PgSCfBQC2L<8NuBN`H:$H&I(S&gfJg^+g`)ft,k x$ڹd SfRe`.&// Kab$"J@k,f4(SSfRf& L\Nu3 $p`"`&x,A'J'JE8'J & KaJ@kfRf"`"PdB@ Nu(g*gg/a _J@f/a: _J@kf"P`3 $pNuJ@k"Pc  PNupNuH&H(k L0+"+ aJkRgF+f, L"St gSj`"HSISSk ögSjJg&"'LBLNup`p`H&H(k6+"+g0Dta2Jk+fZ"S"L Ip gSj`*| // " 0a"_"JkNgPAp SjH@" 0aLJk*g,`0" LaJkg&'LB@LNup`p`/ J@f//aJ@fBg`//??<?NAO $_JkNu  _`a3$pNuH&Hx&SgkJ9&kvf~a<g&< g<<gP< g< e޸dRa`JgSSKpap apa`Rp a&p a`bJg^&`TxB9&`Jx B9&`&p a2 L$_NuBx`xB9&`x B9&`?<NATONu??<NAXONuH@??<@NAO $_JkfNuaZ3$pNu3$Nu/ |b2@?? /?<BNAO JjfSBg jX?<? p/?<BNAO Jk$`X?<? p/?<BNAO JkzЁ"kt?<? p/?<BNAO Jk\$`?<? p/?<BNAO Jk@$Ҁk: $k2HzN <e/`/? ?<@NAO Jkb $_Nua`3$p$_Nu0<`H 6?<?B?<BNAO (Bg?/<?<BNAO *Bg?/?<BNAO JWHL8NuD@| |"b;NupNu   H0$H|g|$bGrtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"$p` 3!$p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!$`0123456789abcdefghijklmnopqrstuvwxyz/ &y& g/ &S?<INA\O`&y& g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu/ /?<HNA\O @$_Nu/ ?<NNTO @$_Nu/A'BhBh2<&a"_222222A)2222Nu/A'Bh1|1A2<fa`"_2r+2QA)r 2QNu/A'1|1|!I!o1A"_A000000000A'rm`A'Bh1|1Ar`A'1ABh1|r`A'Bh1|1Arh`A'Bh1|1Arj`/ /A'1|BhBh01A2r avA)"_2"_2"o2"o2NuA'Bh1|1Ar `@A'Bh1|1Ar `&C'3|3|3AC0""A'2<`A'BhBhr`A'BhBhre`C'3A03B23|CrtRB2fA'1Br`3'/ C'2dBi3| Cp 2Q"<!ps/ NB$_ _0'A)Z"op,2QA)p 2QNu'(Z,)Z)C'3ABi#& Ira#,&Nu/ 1@ 0"<&psNBA)Z0$_Nup `rp`lp`f#*3(Zp4`T/ /pMaJ"_2"_2"o2"o2Nu#*3(ZpN`"/ /pOa"_2"_2"o2"o2Nu/ 3'@@A"C'B@22220<"<"NBA)Z0$_Nu''(Z)Z*, Fehler bei der Programminitialisierung![3][ Nicht gengend Speicher frei! ][ Abbruch ][2][ Endgltige Ausgabe | mit Schreibmodus ][ REPLACE | TRANSPARENT ] Textstil <0..31>? %i Ausgabewinkel <0, 90, 180, 270>? Textgre <0..27>? [2][ Demo beenden? ][ Ja | Nein ]%%%&D'(Z,)Z)r  h(" :& R J6 `*@"b 2> P ~.$(6 $  ,. cursdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o cursor.o cursdemo (cursor.h) pcstdlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* Routine zur (Grafik-)Text-Eingabe */ /* */ /* Originalroutine in GFA-BASIC von Tom Quellenberg */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include typedef enum { FALSE, TRUE } boolean; extern int handle; int Cd_x, Cd_y, Xpos, Ypos, C_x, C_y, X, Y; /*----------------------------------------------------------------*/ /* Parameter: */ /* Modus: Ausgabemodus fr Text */ /*----------------------------------------------------------------*/ void Gem_Text(int Modus) { int k, d, Stelle, x1, y1; char Z, Text[100]; void Cursor(void); void Zeichengroesse(void); Zeichengroesse(); vsf_color(handle, 1); vsf_interior(handle,FIS_SOLID); vsf_perimeter(handle, 0); vswr_mode(handle, MD_XOR); graf_mouse(ARROW,0); do { graf_mkstate(&Xpos, &Ypos, &k, &d); graf_mouse(M_OFF,0); Cursor(); graf_mouse(M_ON,0); do { do graf_mkstate(&x1, &y1, &k, &d); while ((!(k&1)) && (!(k&2)) && (x1 == Xpos) && (y1 == Ypos)); graf_mouse(M_OFF,0); Cursor(); graf_mouse(M_ON,0); Xpos = x1; Ypos = y1; graf_mouse(M_OFF,0); Cursor(); graf_mouse(M_ON,0); } while ((!(k&1)) && (!(k&2))); graf_mouse(M_OFF,0); Cursor(); if (!(k&2)) { Stelle = 0; Text[Stelle] = 0; do { Cursor(); Z = (char) evnt_keybd() & 0x00ff; Cursor(); if ((Z != 13) && (Z != 0) && (Z != 8)) { Text[Stelle++] = Z; Text[Stelle] = 0; v_gtext(handle, Xpos, Ypos, &Text[Stelle-1]); Xpos += X; Ypos += Y; } if ((Z == 8) && (Stelle > 0)) { Xpos -= X; Ypos -= Y; v_gtext(handle, Xpos, Ypos, &Text[Stelle-1]); Text[--Stelle] = 0; } } while (Z != 13); if (Stelle > 0) { vswr_mode(handle, Modus); for (--Stelle; Stelle >= 0; Stelle--) { Xpos -= X; Ypos -= Y; v_gtext(handle, Xpos, Ypos, &Text[Stelle]); Text[Stelle] = 0; } vswr_mode(handle, MD_XOR); } } graf_mouse(M_ON,0); } while (!(k&2)); vswr_mode(handle, MD_REPLACE); vsf_perimeter(handle, 1); } void Cursor(void) { int xy[10]; xy[0] = Xpos+Cd_x; xy[1] = Ypos+Cd_y; xy[2] = Xpos+Cd_x+C_x; xy[3] = Ypos+Cd_y; xy[4] = Xpos+Cd_x+C_x; xy[5] = Ypos+Cd_y+C_y; xy[6] = Xpos+Cd_x; xy[7] = Ypos+Cd_y+C_y; xy[8] = Xpos+Cd_x; xy[9] = Ypos+Cd_y; v_pline(handle, 5, xy); } void Zeichengroesse(void) { int attr[10]; vqt_attributes(handle,attr); switch(attr[2]) { case 0: X = attr[8]; Y = 0; C_x = X - 1; C_y = -attr[9] + 1; Cd_x = 0; Cd_y = attr[9] - attr[7] - 1; break; case 900: X = 0; Y = -attr[8]; C_x = -attr[9] + 1; C_y = Y + 1; Cd_x = attr[9] - attr[7] - 1; Cd_y = 0; break; case 1800: X = -attr[8]; Y = 0; C_x = X + 1; C_y = attr[9] - 1; Cd_x = 0; Cd_y = -(attr[9] - attr[7]) + 1; break; case 2700: X = 0; Y = attr[8]; C_x = attr[9] - 1; C_y = Y - 1; Cd_x = -(attr[9] - attr[7]) + 1; Cd_y = 0; break; } } void Gem_Text(int Modus); NvH2(h?Ah?@?A?@h ?A 4(P?B ?A?B0(h?@A09rNONuOA09NAC0/J@g|gB|gj|g`0BQpP1@2/DARA1ABh0/oS@1@`BP0/D@22/DARA1At@1B2/oSA1A`Z0/D@0BQr@1Apo1@Bh2/oDARA1A`,BP2po1@rQ1A4/oDBRB1BBhONu        &     ( 4         R      vsf_perimeter vsf_colorCd_yCd_xhandle graf_mouseZeichengroesse evnt_keybdGem_TextYposXpos vsf_interiorC_yC_x vswr_modev_gtext graf_mkstatevqt_attributesCursorYXv_pline. +_iq.. ^iMCDEMO C frMCDEMO PRG +ft8MCDEMO PRJ +fMOVECOPYC "fMOVECOPYH fMOVECOPYO $f\/*----------------------------------------------------------------*/ /* Demo zur Verschiebe- und Kopier-Routine */ /* */ /* Originalroutine in GFA-BASIC von Hans-H. Ackermann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #include #include "movecopy.h" extern int handle, work_out[]; void gem_prg(void) { void Zeichne_Bild(void); graf_mouse(ARROW, 0); Zeichne_Bild(); form_alert(0,"[0][1. Demo zu MoveCopy |-> Nur Verschieben][ weiter ]"); Verschieben(0); Zeichne_Bild(); form_alert(0,"[0][2. Demo zu MoveCopy |-> Kopieren][ weiter ]"); Verschieben(1); form_alert(1,"[0][Demo-Ende ][ Ok ]"); } void Zeichne_Bild(void) { int i, x, y, r, xy[4]; graf_mouse(M_OFF, 0); xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); v_clrwk(handle); vswr_mode(handle, 1); for (i=0; i<10; i++) { x = abs(work_out[0]*(Random()/pow(2,24))); y = abs(work_out[1]*(Random()/pow(2,24))); r = 20 + abs(100*(Random()/pow(2,24))); v_circle(handle, x, y, r); } vs_clip(handle, 0, xy); graf_mouse(M_ON, 0); } `5``7>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#737 k #7 Ј<.@#7Jy7g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON 0 J"LN? 95g @N 95g @NN?<LNA/ E8 N15@R@gPp` 2A5R@| m5|HjHjCAN1xPO5@5@4HjC JN0XOp`B@$_Nu098N0\N1,NuNS@fNNB@NLNuC5A7N,pN4NuH?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y8 Bk 0<N,/ C8Ar098N* XO0<N,OLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@0<N,ZHy8"KA2098N)XO0<N,6O&_6Nu?O6/>?A?B?A?B?C ?@ ?C?@?A0<N+Ar098N+`0<N+O6NuQO>?A?B?o 0<N+A098N**0<N+PONuB@N+N8A6.B@N+RB@NNN"A6fB@N+BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"5p` 3!5p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!5`0123456789abcdefghijklmnopqrstuvwxyz/ &y7 g/ &S?<INA\O`&y7 g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNupowerACHVMBa//?Aa~//?,o f>,?B^BJ g`<,,A CHnHzpaPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA7?BPAa 37CaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدalJk fJg aA7?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAaIa aDKxA !%!%1%xaKMa|MQC aCadOL`NuA"o4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ97 gJg j c a0JfJg97 g97 fJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzap` ҁQ !1LNudivCA/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG97 f,⎜bHFRFkHz``, c97 g~97 fJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu97 f╚kfg` JfJg`,HFRdR`,HF  @c"$HzaD` ЀP !1L Numod42<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nu/ ?<NNTO @$_Nu/ ?<NNTO$_Nu/A8Bh1|1A2<faV"_2r+2QA:r 2QNu/A81|1|!I!o1A"_A000000000A8rm`/ /A81|Bh1A01B2raA:"_2"_2"o2NuA8Bh1|1Ar`A8Bh1|1A1Br!`A8Bh1|1Ar`lA8Bh1|1Ar `RC83|3|3AC0""A82<`&C=2222A81|Bh1| r `A81|Bh1| 1A01B2Bh4Bh61o8Bh:r `A8BhBhr`A8BhBhre`38/ C82dBi3| Cp 2Q"<2ps/ NB$_ _08A:v"op,2QA:p 2QNu89v=:v:C83ABi#7 Ira#=7Nu/ 1@ 0"<7psNBA:v0$_Nup `lp`f#;39vp4`T/ /pMaJ"_2"_2"o2"o2Nu#;39vpN`"/ /pOa"_2"_2"o2"o2Nu/ 38@@A"C8B@22220<"<3NBA:v0$_Nu889v:v;= Fehler bei der Programminitialisierung![3][ Nicht gengend Speicher frei! ][ Abbruch ][0][1. Demo zu MoveCopy |-> Nur Verschieben][ weiter ][0][2. Demo zu MoveCopy |-> Kopieren][ weiter ][0][Demo-Ende ][ Ok ]@@@@@@@7"7"7"7r89v=:v:r  h("  D l2l 0 2b d^:$&0 J L (`l&  ~.^^6V0T *<<*&8 4B @ (& .* Jf0 4 & t (66  ,. mcdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o movecopy.o mcdemo (movecopy.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* Routine zum Verschieben und Kopieren von Bildbereichen */ /* */ /* Originalroutine in GFA-BASIC von Hans-H. Ackermann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #include extern int handle, work_out[]; MFDB Schirm_mfdb; void Verschieben(int Copy) { int Xl, Xr, X, Xt, Yl, Yr, Y, Yt, K, d, w_out[57], xy[4]; MFDB Puffer_mfdb, Zwischen_mfdb; void *Puffer, *Zwischen; void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp); void Put(int x1, int y1, MFDB *mp, int Mode); void Box(int x1, int y1, int x2, int y2); void Box_filled(int x1, int y1, int x2, int y2); vq_extnd(handle,1, w_out); Schirm_mfdb.fd_addr = Physbase(); Schirm_mfdb.fd_nplanes = w_out[4]; Schirm_mfdb.fd_w = work_out[0] + 1; Schirm_mfdb.fd_h = work_out[1]; Schirm_mfdb.fd_wdwidth = (work_out[0] + 1)/16; Schirm_mfdb.fd_stand = 0; xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle,1,xy); do { while (graf_mkstate(&Xl,&Yl,&K,&d), (!(K&1))&&(!(K&2))); vswr_mode(handle, MD_XOR); vsl_type(handle,2); /***** Rahmen zeichnen *****/ graf_mouse(THIN_CROSS,0); Xr = Xl; Yr = Yl; while ((K&1) && (!(K&2))) { Box(Xl,Yl,Xr,Yr); /* Verschiebe Bildumrahmen */ while(graf_mkstate(&X,&Y,&K,&d), ((K&1) && (!(K&2)) && (X==Xr) && (Y==Yr))); if (X < Xl) /* Keine "negativen" Werte */ { X = Xl; vsin_mode(handle,1,2); vrq_locator(handle,X,Y, &d, &d, &d); } if (Y < Yl) { Y = Yl; vsin_mode(handle,1,2); vrq_locator(handle,X,Y, &d, &d, &d); } Box(Xl,Yl,Xr,Yr); /* alten Rahmen loeschen */ Xr = X; Yr = Y; } vsl_type(handle,1); Puffer = Malloc((long)(Xr-Xl+15) * (long)(Yr-Yl) * (long)w_out[4]); if (Puffer == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vs_clip(handle,0,xy); vswr_mode(handle, MD_REPLACE); return; } Zwischen = Malloc((long)(Xr-Xl+15) * (long)(Yr-Yl) * (long)w_out[4]); if (Zwischen == NULL) { Mfree(Puffer); form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vs_clip(handle,0,xy); vswr_mode(handle, MD_REPLACE); return; } Get(Xl,Yl,Xr,Yr,Puffer,&Puffer_mfdb); /* Ausschnitt puffern */ if(Copy!=1) /* Nicht kopieren? */ { vsf_color(handle,0); vswr_mode(handle, MD_REPLACE); Box_filled(Xl,Yl,Xr,Yr); /* dann Original berdecken */ vsf_color(handle,1); } X = Xl; /* Maus an Boxanfang */ Y = Yl; vsin_mode(handle,1,2); vrq_locator(handle,X,Y, &d, &d, &d); graf_mouse(ARROW,0); while(graf_mkstate(&Xt,&Yt,&K,&d), ((!(K&1)) && (!(K&2)) && (Xt==Xr) && (Yt==Yr))); /***** Verschieben/Kopieren *****/ while((!(K&1)) && (!(K&2))) { Get(X,Y,Xr+(X-Xl),Yr+(Y-Yl),Zwischen,&Zwischen_mfdb); /* Hintergrund puffern */ Put(X,Y,&Puffer_mfdb,3); /* Ausschnitt zeigen */ while(graf_mkstate(&Xt,&Yt,&K,&d), (!(K&1)) && (!(K&2)) && (X==Xt) && (Y==Yt)); Put(X,Y,&Zwischen_mfdb,3); /* Hintergrund zurckschreiben */ X = Xt; Y = Yt; } Put(X,Y,&Puffer_mfdb,3); /* Ausschnitt entgltig zeichnen */ Mfree(Puffer); Mfree(Zwischen); while (graf_mkstate(&Xl,&Yl,&K,&d), ((K&1)&&(!(K&2)))); }while (!(K&2)); graf_mouse(ARROW,0); vswr_mode(handle, MD_REPLACE); vs_clip(handle,0,xy); } void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp) { int xy[8]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; xy[4] = 0; xy[5] = 0; xy[6] = x2 - x1; xy[7] = y2 - y1; mp->fd_addr = p; mp->fd_w = x2 - x1; mp->fd_h = y2 - y1; mp->fd_wdwidth = ((mp->fd_w+15)&0xFFF0)/16; mp->fd_nplanes = Schirm_mfdb.fd_nplanes; mp->fd_stand = 0; graf_mouse(M_OFF, 0); vro_cpyfm(handle, 3, xy, &Schirm_mfdb, mp); graf_mouse(M_ON, 0); } void Put(int x1, int y1, MFDB *mp, int Mode) { int xy[8]; xy[0] = 0; xy[1] = 0; xy[2] = mp->fd_w; xy[3] = mp->fd_h; xy[4] = x1; xy[5] = y1; xy[6] = x1 + mp->fd_w; xy[7] = y1 + mp->fd_h; graf_mouse(M_OFF, 0); vro_cpyfm(handle, Mode, xy, mp, &Schirm_mfdb); graf_mouse(M_ON, 0); } /*----------------------------------------------------------------*/ /* Rechteck zeichnen */ /*----------------------------------------------------------------*/ void Box(int x1, int y1, int x2, int y2) { int xy[10]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y1; xy[4] = x2; xy[5] = y2; xy[6] = x1; xy[7] = y2; xy[8] = x1; xy[9] = y1; graf_mouse(M_OFF, 0); v_pline(handle, 5, xy); graf_mouse(M_ON, 0); } /*----------------------------------------------------------------*/ /* Geflltes Rechteck zeichnen */ /*----------------------------------------------------------------*/ void Box_filled(int x1, int y1, int x2, int y2) { int xy[4]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; graf_mouse(M_OFF, 0); v_bar(handle, xy); graf_mouse(M_ON, 0); } void Verschieben(int Copy);NH?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y Bk 0<N/ CAr09NXO0<NOLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@0<NHy"KA209NXO0<NO&_6Nu?O6/>?A?B?A?B?C ?@ ?C?@?A0<NAr09N0<NO6NuQO>?A?B?o 0<NA09N0<NPONu[3][ Nicht gengend Speicher frei! ][ Abbruch ]              4                   J6$(    P    B    8      0  vsf_colorv_bar Schirm_mfdb vro_cpyfmhandle graf_mousework_out_lmul Box_filledMallocBox vsin_mode vswr_modeMfreePutGet vrq_locatorvs_clip Verschiebenvsl_type graf_mkstatevq_extndPhysbase form_alertv_pline. 6_i.. ^iUNFDEMO C (g UNFDEMO PRG ig4UNFDEMO PRJ igUNFILL C g UNFILL H gUNFILL O jg/*----------------------------------------------------------------*/ /* Demo zur UNFILL-Routine */ /* */ /* Originalroutine in GFA-BASIC von Dirk Haun */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #include #include #include "unfill.h" extern int handle, work_out[]; void gem_prg(void) { void Zeichne_Bild(void); graf_mouse(ARROW,0); Zeichne_Bild(); form_alert(0,"[0][Demo zur Unfill-Routine ][ weiter ]"); Unfill(); Crawcin(); } void Zeichne_Bild(void) { int i, x, y, r, xy[4]; graf_mouse(M_OFF, 0); xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); v_clrwk(handle); vswr_mode(handle, 1); for (i=0; i<10; i++) { x = abs(work_out[0]*(Random()/pow(2,24))); y = abs(work_out[1]*(Random()/pow(2,24))); r = 20 + abs(100*(Random()/pow(2,24))); v_circle(handle, x, y, r); } vs_clip(handle, 0, xy); graf_mouse(M_ON, 0); } `1``3>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#333 k #3 Ј<.@#3Jy3g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 92g @N 92g @NN"?<LNA/ E3N-5@R@gPp` 2A5R@| m5|HjHjCAN-PO5@5@4HjC JN-XOp`B@$_Nu094pN,N-~NuNS@fNNB@NLNuC2A3bNLpN4NuH>OJE Jr094pN+xI4~N+P(9j G39S9kpSH9@Bl BWBo?S?kAr094pN+pSHrkHN2*HNN**H fA20pN,`6pSHrkHNn2*HNdN*,H fA20pN,~ MN*`pSHrkHN22*HN(N*T$H fA20pN,B MN*N NN*H`0<N,Z?+C M4BAB@NTO?+C N4rB@NTOtABAB@N?+C| J4BAB@NTOtABAB@N?+C N4BApN`TOtABAB@NtAzBAB@N0<N+ MN) NN) JN)ABA094pN*Fr094pN* OL|NuHO6/ &I>?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y4 Bk / C4~Ar094pN)`XOOLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@Hy4~"KA2094pN)XOO&_6NuB@N*NA2`B@N*dNN(NNuHOБ0<N*zBWBoG3?S?kI4pAr0N(0N)Vr0N(BC`N(BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"1p` 3!1p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!1`0123456789abcdefghijklmnopqrstuvwxyz/ &y3 g/ &S?<INA\O`&y3 g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNupowerACHVMBa//?Aa~//?,o f>,?B^BJ g`<,,A CHnHzpaPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA2?BPAa 32CaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدalJk fJg aA2?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAaIa aDKxA !%!%1%xaKMa|MQC aCadOL`NuA"o4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ92gJg j c a0JfJg92g92fJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzap` ҁQ !1LNudivCA/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG92f,⎜bHFRFkHz``, c92g~92fJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu92f╚kfg` JfJg`,HFRdR`,HF  @c"$HzaD` ЀP !1L Numod42<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ ?<NATO$_Nu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nu/ ?<NNTO @$_Nu/ ?<NNTO$_Nu/A4Bh1|1A2<faz"_2r+2QA6r 2QNu/A41|1|!I!o1A"_A000000000A4rm`A4Bh1|1Ar `C43|3|3AC0""A42<`A41|Bh1| 1A01B2Bh4Bh61o8Bh:r `A4BhBhr`A4BhBhre`v34/ C42dBi3| Cp 2Q"</Tps/ NB$_ _04A6P"op,2QA6p 2QNu45P96P6/ 1@ 0"<3psNBA6P0$_Nup `Lp`F#735Pp4`4/ /pMa*"_2"_2"o2"o2Nu#735PpN`/ 34@@A"C4B@22220<"<0NBA6P0$_Nu445P6P79 Fehler bei der Programminitialisierung![3][ Nicht gengend Speicher frei! ][ Abbruch ][0][Demo zur Unfill-Routine ][ weiter ]@@@@@@@2223L45P96P6r  h(" 606< b P".0 J L (`l&  ~.^^6V0T *<<*&8 4B @ (& .* Jf0 4 & t (6 6  , unfdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o unfill.o unfdemo (unfill.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* UNFILL-Routine */ /* */ /* Originalroutine in GFA-BASIC von Dirk Haun */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include extern int handle, work_out[]; MFDB Schirm_mfdb; void Unfill(void) { MFDB P1_mfdb, P2_mfdb, P3_mfdb; void *P1, *P2, *P3; int w_out[57], xy[4]; void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp); void Put(int x1, int y1, MFDB *mp, int Mode); vq_extnd(handle,1, w_out); Schirm_mfdb.fd_addr = Physbase(); Schirm_mfdb.fd_nplanes = w_out[4]; Schirm_mfdb.fd_w = work_out[0]; Schirm_mfdb.fd_h = work_out[1]; Schirm_mfdb.fd_wdwidth = (work_out[0] + 1)/16; Schirm_mfdb.fd_stand = 0; xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle,1,xy); P1 = Malloc((long)(work_out[0]+16) * (long)(work_out[1]+1) * (long)w_out[4]); if (P1 == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } P2 = Malloc((long)(work_out[0]+16) * (long)(work_out[1]+1) * (long)w_out[4]); if (P2 == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(P1); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } P3 = Malloc((long)(work_out[0]+16) * (long)(work_out[1]+1) * (long)w_out[4]); if (P3 == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(P1); Mfree(P2); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } graf_mouse(M_OFF,0); Get(0,0,work_out[0],work_out[1],P1,&P1_mfdb); Get(0,1,work_out[0],work_out[1],P2,&P2_mfdb); Put(0,0,&P2_mfdb,6); Get(0,0,work_out[0],work_out[1],P3,&P3_mfdb); Put(0,0,&P1_mfdb,3); Get(1,0,work_out[0],work_out[1],P2,&P2_mfdb); Put(0,0,&P2_mfdb,6); Put(0,0,&P3_mfdb,7); graf_mouse(M_ON,0); Mfree(P1); Mfree(P2); Mfree(P3); vs_clip(handle,0,xy); vswr_mode(handle, 1); } void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp) { int xy[8]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; xy[4] = 0; xy[5] = 0; xy[6] = x2 - x1; xy[7] = y2 - y1; mp->fd_addr = p; mp->fd_w = x2 - x1; mp->fd_h = y2 - y1; mp->fd_wdwidth = ((mp->fd_w+15)&0xFFF0)/16; mp->fd_nplanes = Schirm_mfdb.fd_nplanes; mp->fd_stand = 0; vro_cpyfm(handle, 3, xy, &Schirm_mfdb, mp); } void Put(int x1, int y1, MFDB *mp, int Mode) { int xy[8]; xy[0] = 0; xy[1] = 0; xy[2] = mp->fd_w; xy[3] = mp->fd_h; xy[4] = x1; xy[5] = y1; xy[6] = x1 + mp->fd_w; xy[7] = y1 + mp->fd_h; vro_cpyfm(handle, Mode, xy, mp, &Schirm_mfdb); } void Unfill(void);NH>OJE Jr09NIN(9j G9S9kpSH9@Bl BWBo?S?kAr09NpSHrkHN2*HNN*H fApN`6pSHrkHN2*HNN,H fApN MN`pSHrkHN2*HNN$H fApN MN NN`0<N?+C M4BAB@NTO?+C N4rB@NTOtABAB@N?+C| J4BAB@NTOtABAB@N?+C N4BApNTOtABAB@NtAzBAB@N0<N MN NN JNABA09Nr09NOL|NuHO6/ &I>?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y Bk / CAr09NXOOLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@Hy"KA209NXOO&_6Nu[3][ Nicht gengend Speicher frei! ][ Abbruch ]    6                        P   <  0 Unfill Schirm_mfdb vro_cpyfmhandle graf_mousework_out_lmulMalloc vswr_modeMfreePutGetvs_clipvq_extndPhysbase form_alert. B_i.. ^iRADDEMO C xdRADDEMO PRG !ng1;RADDEMO PRJ /ngRADIERENC mgRADIERENH WQdRADIERENO mg /*----------------------------------------------------------------*/ /* Demo zur RADIER-Routine */ /* */ /* Originalroutine in GFA-BASIC von Hans-H. Ackermann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #include #include "radieren.h" extern int handle, work_out[]; void gem_prg(void) { void Zeichne_Bild(void); graf_mouse(ARROW, 0); Zeichne_Bild(); form_alert(0,"[0][ Demo zur Radier-Routine ][ weiter ]"); Radieren(); form_alert(1,"[0][ Demo-Ende ][ Ok ]"); } void Zeichne_Bild(void) { int i, x, y, r, xy[4]; graf_mouse(M_OFF, 0); xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); v_clrwk(handle); vswr_mode(handle, 1); for (i=0; i<10; i++) { x = abs(work_out[0]*(Random()/pow(2,24))); y = abs(work_out[1]*(Random()/pow(2,24))); r = 20 + abs(100*(Random()/pow(2,24))); v_circle(handle, x, y, r); } vs_clip(handle, 0, xy); graf_mouse(M_ON, 0); }`86``:">>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#:3: k #: Ј<.@#:Jy:g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON \0 J"LN? 988g @N 98O*Ar09:N0N0#:3:3:R:3:T:py:RH3:By:BWBo?y:R?y:TAr09:N1tMKzI|HUHT"NAN3POpTJ@fܑpN2?| ?| tr09:N0E4(G6(HU"M M4209:N0XOr09:N0?42/0/NTOHUHTCAN2PO0/of 2/~Vft`BBJBf?42/0/N\TO?42/0/NJTOHUHT"NAN2HPOpTf2/Rf 4Sfp`B@J@f?42/0/N TO460ol*tr09:N0HU"M M42/09:N/XO40ol*tr09:N/HU"M M4/209:N/jXO6pTg>HUHT"NAN1POpTJ@f0o|H2oHNL2/HNBN.`/H fA8hpN1`0o|H2oHN2/HNN."/H fA8hpN0 oN.`Jpy:RHry:THN2/HNN-/H f:A8hpN0 oN- oN-ABA09:N.r09:N.`r09:N.?C o42/0/NTOBA09:N.`pS?tRropoNTOr09:N.8?42/0/N*TO?C o42/0/NTOtA2/0/Nr09:N.&6o8oB@N/HUHT"NAN/POpTJ@ftr09:N-09:RH429:TH6HU"M M409:2N-LXO?R?S~?9:TC o49:RBAB@NTO0D?C o4C20NTOtA20NVHUHTCAN/2PO0/of 2/Vft`BBJBftA20N46`0D?C o4C20NbTOtA20NHUHT"NAN.POpTf*rTf$4/Rfp`B@?2Sft`BB_gp`B@J@ftA20N46pTfPrTgp`FtABAB@Nl0D?C o4C20NTOtA20NBHUHT"K JN."POpTgrUf`r09:N,*BA09:N+0D?4C20N0TOr09:N+r09:N+0D?4C20NTOHUHT"NAN-POpTf2/Rf 4Sfp`B@J@f0D?4C20NhTO46pTfZrTgHUHT"NAN-PPOpTfrTf09:rN+&r09:N+R oN*. oN*&OL|Nu?O6/>?A?B?A?B?C ?@ ?C?@?A0<N,Ar09:N,20<N,O6NuQO>?A?B?o 0<N,A09:N*0<N,rPONuHO6/ &I>?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y: Bk 0<N, / C:Ar09:N)xXO0<N+OLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@0<N+Hy:"KA209:N)XO0<N+tO&_6NuB@N+bN A8B@N+ NA8pN+NuHOБ0<N+.BWBoG:R?S?kI:Ar0N)\0N)r0N)4BC`N(.A&N'A8/ / ? A8/ / ? HoNOA&CNA&0N,A&N'0N 8N'A&N'BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"86p` 3!86p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!86`0123456789abcdefghijklmnopqrstuvwxyz/ &y9 g/ &S?<INA\O`&y9 g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNupowerACHVMBa//?Aa~//?,o f>,?B^BJ g`<,,A CHnHzpaPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA96?BPAa 396CaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدalJk fJg aA96?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAaIa aDKxA !%!%1%xaKMa|MQC aCadOL`NuA"o4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ997gJg j c a0JfJg997g997fJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzap` ҁQ !1LNudivCA/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG997f,⎜bHFRFkHz``, c997g~997fJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu997f╚kfg` JfJg`,HFRdR`,HF  @c"$HzaD` ЀP !1L Numod42<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nu/ ?<NNTO @$_Nu/ ?<NNTO$_Nu/A:Bh1|1A2<fa<"_2r+2QA " &(J: r b:f d,&0 J L (`l&  ~.^^6V0T *<<*&8 4B @ (& .* Jf0 4 & t (66  ,. raddemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o radieren.o raddemo (radieren.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* RADIER-Routine */ /* */ /* Originalroutine in GFA-BASIC von Hans-H. Ackermann */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include MFDB Schirm_mfdb; extern int handle, work_out[]; void Radieren(void) { void *Puffer, *Radier, *Undo; MFDB Puffer_mfdb, Radier_mfdb, Undo_mfdb; int xx, yy, x, y, x1, y1, xd, yd, ux, uy; int k, d, w_out[57], xy[4]; void Box(int x1, int y1, int x2, int y2); void FillBox(int x1, int y1, int x2, int y2); void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp); void Put(int x1, int y1, MFDB *mp, int Mode); vq_extnd(handle,1, w_out); Schirm_mfdb.fd_addr = Physbase(); Schirm_mfdb.fd_nplanes = w_out[4]; Schirm_mfdb.fd_w = work_out[0]; Schirm_mfdb.fd_h = work_out[1]; Schirm_mfdb.fd_wdwidth = (work_out[0] + 1)/16; Schirm_mfdb.fd_stand = 0; xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle,1,xy); while(graf_mkstate(&x1, &y1, &k, &d), k&1); graf_mouse(THIN_CROSS, 0); /* Fadenkreuz */ xx = 10; /* Linke-obere Ecke */ yy = 10; /* der Radierbox und */ vsin_mode(handle,1,2); /* Default fr rechte- */ x = 40; y = 40; vrq_locator(handle,x,y, &d, &d, &d);/* untere Ecke */ vswr_mode(handle, 3); Box(xx,yy,x,y); /* Radierbox zeigen */ while(graf_mkstate(&ux, &uy, &k, &d), (ux == x1) && (uy == y1)); Box(xx,yy,x,y); /* Radierbox zeigen */ do /* Rahmen-Schleife */ { Box(xx,yy,x,y); /* Radierbox zeigen */ /* bis Maustaste losgelassen oder Maus bewegt */ while(graf_mkstate(&x1, &y1, &k, &d), (!(k&1)) && (x1 == x) && (y1 == y)); Box(xx,yy,x,y); /* Radierbox lschen */ x = x1; y = y1; if (x < xx) /* Keine "negativen" Werte */ { vsin_mode(handle,1,2); vrq_locator(handle,xx,y, &d, &d, &d); x = xx; } if (y < yy) { vsin_mode(handle,1,2); vrq_locator(handle,x,yy, &d, &d, &d); y = yy; } } while (!(k&1)); while(graf_mkstate(&x1, &y1, &k, &d),k&1); Puffer = Malloc((long)(x-xx+16) * (long)(y-yy) * (long)w_out[4]); if (Puffer == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } Radier = Malloc((long)(x-xx+16) * (long)(y-yy) * (long)w_out[4]); if (Radier == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(Puffer); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } Undo = Malloc((long)(work_out[0]+1) * (long)(work_out[1]+1) * (long)w_out[4]); if (Undo == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(Puffer); Mfree(Radier); vs_clip(handle,0,xy); vswr_mode(handle, 1); return; } vswr_mode(handle, 1); Get(xx,yy,x,y,Puffer,&Puffer_mfdb); /* Hintergrund retten */ vsf_color(handle, 0); /* und fr */ FillBox(xx+1,yy+1,x-1,y-1); /* Radierbox subern */ vsf_color(handle, 1); Box(xx,yy,x,y); Get(xx,yy,x,y,Radier,&Radier_mfdb); /* und puffern */ Put(xx,yy,&Puffer_mfdb,3); /* Hintergrund restaurieren */ vswr_mode(handle, 3); xd = x - xx; /* Boxmae fr */ yd = y - yy; /* Offset berechnen */ graf_mouse(ARROW, 0); while(graf_mkstate(&x1, &y1, &k, &d), k&1); vsin_mode(handle,1,2); /* Radierbox in Bildmitte */ x = work_out[0]/2; y = work_out[1]/2; vrq_locator(handle,x,y, &d, &d, &d); ux = x; uy = y; Get(0,0,work_out[0],work_out[1],Undo,&Undo_mfdb); /* Bild fr UNDO puffern */ Get(x,y,x+xd,y+yd,Puffer,&Puffer_mfdb);/* Hintergrund puffern */ Put(x,y,&Radier_mfdb,3); /* Radierbox zeigen */ while(graf_mkstate(&xx, &yy, &k, &d), (xx == x1) && (yy == y1)); Put(x,y,&Puffer_mfdb,3); /* Hintergrund zeichnen */ x = xx; y = yy; do /* Radierschleife */ { while ((!(k&1)) && (!(k&2))) /* Verschiebeschleife */ { Get(x,y,x+xd,y+yd,Puffer,&Puffer_mfdb);/* Hintergrund puffern */ Put(x,y,&Radier_mfdb,3); /* Radierbox zeigen */ while(graf_mkstate(&x1, &y1, &k, &d), (!(k&1)) && (!(k&2)) && (x1==x) & (y1 == y)); /* warten */ Put(x,y,&Puffer_mfdb,3); /* Hintergrund zeichnen */ x = x1; y = y1; } while ((k&1) && (d&8)) /* linke MT und ALTERNATE (Undo-Fkt.) */ { Put(0,0,&Undo_mfdb,3); /* Bild restaurieren */ Get(x,y,x+xd,y+yd,Puffer,&Puffer_mfdb);/* Hintergrund puffern */ Put(x,y,&Radier_mfdb,3); /* Radierbox zeigen */ graf_mkstate(&x, &y, &k, &d); } while (k&1) /* Wenn linke MT gedrckt */ { vswr_mode(handle, 1); vsf_color(handle, 0); FillBox(x,y,x+xd,y+yd); /* und lschen */ vsf_color(handle, 1); vswr_mode(handle, 3); Box(x,y,x+xd,y+yd); while(graf_mkstate(&x1, &y1, &k, &d), (!(k&2)) && (x1 == x) && (y1 == y)); Box(x,y,x+xd,y+yd); x = x1; y = y1; } } while (!(k&2)); do graf_mkstate(&x1, &y1, &k, &d); while ((k&1) || (k&2)); vsf_color(handle, 1); vswr_mode(handle, 1); Mfree(Puffer); Mfree(Radier); } /*----------------------------------------------------------------*/ /* Rechteck zeichnen */ /*----------------------------------------------------------------*/ void Box(int x1, int y1, int x2, int y2) { int xy[10]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y1; xy[4] = x2; xy[5] = y2; xy[6] = x1; xy[7] = y2; xy[8] = x1; xy[9] = y1; graf_mouse(M_OFF,0); v_pline(handle, 5, xy); graf_mouse(M_ON,0); } /*----------------------------------------------------------------*/ /* geflltes Rechteck zeichnen */ /*----------------------------------------------------------------*/ void FillBox(int x1, int y1, int x2, int y2) { int xy[4]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; graf_mouse(M_OFF,0); v_bar(handle, xy); graf_mouse(M_ON,0); } void Get(int x1, int y1, int x2, int y2, void *p, MFDB *mp) { int xy[8]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; xy[4] = 0; xy[5] = 0; xy[6] = x2 - x1; xy[7] = y2 - y1; mp->fd_addr = p; mp->fd_w = x2 - x1; mp->fd_h = y2 - y1; mp->fd_wdwidth = ((mp->fd_w+15)&0xFFF0)/16; mp->fd_nplanes = Schirm_mfdb.fd_nplanes; mp->fd_stand = 0; graf_mouse(M_OFF,0); vro_cpyfm(handle, 3, xy, &Schirm_mfdb, mp); graf_mouse(M_ON,0); } void Put(int x1, int y1, MFDB *mp, int Mode) { int xy[8]; xy[0] = 0; xy[1] = 0; xy[2] = mp->fd_w; xy[3] = mp->fd_h; xy[4] = x1; xy[5] = y1; xy[6] = x1 + mp->fd_w; xy[7] = y1 + mp->fd_h; graf_mouse(M_OFF,0); vro_cpyfm(handle, Mode, xy, mp, &Schirm_mfdb); graf_mouse(M_ON,0); } void Radieren(void); NbTH>O*Ar09NN#3 33pyH3By BWBo?y?yAr09NMKzI|HUHT"NANPOpTJ@fܑpN?| ?| tr09NE4(G6(HU"M M4209NXOr09N?42/0/NTOHUHTCANPO0/of 2/~Vft`BBJBf?42/0/NTO?42/0/NTOHUHT"NANPOpTf2/Rf 4Sfp`B@J@f?42/0/NTO460ol*tr09NHU"M M42/09NXO40ol*tr09NHU"M M4/209NXO6pTg>HUHT"NANPOpTJ@f0o|H2oHN2/HNN/H fApN`0o|H2oHN2/HNN/H fApN oN`JpyHryHN2/HNN/H f:ApN oN oNABA09Nr09N`r09N?C o42/0/NTOBA09NpS?tRropoNTOr09N?42/0/NTO?C o42/0/NTOtA2/0/Nr09N6o8oB@NHUHT"NANPOpTJ@ftr09N09H429H6HU"M M4092NXO?R?S~?9C o49BAB@NTO0D?C o4C20NTOtA20NHUHTCANPO0/of 2/Vft`BBJBftA20N46`0D?C o4C20NTOtA20NHUHT"NANPOpTf*rTf$4/Rfp`B@?2Sft`BB_gp`B@J@ftA20N46pTfPrTgp`FtABAB@N0D?C o4C20NTOtA20NHUHT"K JNPOpTgrUf`r09NBA09N0D?4C20NTOr09Nr09N0D?4C20NTOHUHT"NANPOpTf2/Rf 4Sfp`B@J@f0D?4C20NTO46pTfZrTgHUHT"NANPOpTfrTf09rNr09N oN oNOL|Nu?O6/>?A?B?A?B?C ?@ ?C?@?A0<NAr09N0<NO6NuQO>?A?B?o 0<NA09N0<NPONuHO6/ &I>?A?B?CBoBo 8@?D 2C?I&7D7Ipk|H7@7y Bk 0<N/ CAr09NXO0<NOLNu?/ O&H6BWBo?k?k?@?A 4k?B 0k?@0<NHy"KA209NXO0<NO&_6Nu[3][ Nicht gengend Speicher frei! ][ Abbruch ]                .  0    "                          ,&F$      2 &   8      P    B    0  vsf_colorv_bar Schirm_mfdb vro_cpyfmhandle graf_mousework_out_lmulMallocFillBoxBox vsin_mode vswr_modeRadierenMfreePutGet vrq_locatorvs_clip graf_mkstatevq_extndPhysbase form_alertv_pline. N_i.. ^iSPLIDEMOC N|h'SPLIDEMOPRG chk7SPLIDEMOPRJ IhSPLINE C h/SPLINE H |hKSPLINE O Rh /*-------------------------------------------------------------------*/ /* Berechnung von Splines in der Ebene zur Glttung von Polygonzgen */ /* oder zur Verbindung einzelner Punkte */ /* */ /* Demoprogramm zu den Splines-Routinen */ /* Originalroutine in Modula 2: Dietmar Rabich, Dlmen */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 MAXON Computer GmbH */ /*-------------------------------------------------------------------*/ #include #include #include "spline.h" extern int handle; void gem_prg(void) { int n; int yA, yB; Points p; spline splX[MaxPoint], splY[MaxPoint]; yA = 0; /* 2. Ableitung = 0 */ yB = 0; /* <=> keine Krmmung an den Enden */ n = 12; /* 12 Punkte */ p[0].x = 200; /* Koordinaten */ p[0].y = 100; /* . */ p[1].x = 100; /* . */ p[1].y = 100; /* . */ p[2].x = 100; p[2].y = 200; p[3].x = 200; p[3].y = 200; p[4].x = 200; p[4].y = 300; p[5].x = 100; p[5].y = 300; p[6].x = 300; p[6].y = 100; p[7].x = 400; p[7].y = 100; p[8].x = 350; p[8].y = 100; p[9].x = 350; p[9].y = 200; p[10].x = 350; p[10].y = 250; p[11].x = 350; p[11].y = 300; v_clrwk(handle); /* Bildschirm lschen */ vsm_type(handle,5); /* Kreuz als Marker */ v_pmarker(handle,n,p); /* Marker setzen (nicht unbedingt ntig) */ MakeSplines(p,n,splX,splY,yA,yB); /* Splines berechnen */ DrawSplines(handle,splX,splY,n); /* Splines ausgeben */ Crawcin(); /* auf Taste warten */ } `5 t``6>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#636 k #6 Ј<.@#6Jy6g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON 0 J"LN? 95"g @N 95&g @NN?<LNA/ E6N1*5@R@gPp` 2A5R@| m5|HjHjCAN0PO5@5@4HjC JN/XOp`B@$_Nu097DN/N0NuNS@fN NB@NLNuC5*A66N 0pN4NuH8O&H6(I:8E0"J KNHR/ 420CANPO0CANx0CANl/ HRHoHo420"oR LNTOO&L8NuH6O?@$H&I?ArN.r0/N.r0/N.pBDBEKM`r2 ЀЁ42 r|<>2`A5\/ / ? 0t4"ҁ҂剐rr2A N-A(/ / ? HoFNOr2 ЀЁt42A N-nA2CN%$A5f/ / ? 0t4"ҁ҂剐rr2A N-6A(/ / ? Ho(NOr2 ЀЁt42A N-ACN$A2CN"0t4"ҁ҂剐rt4A N,A2CN"Zr2 ЀЁt42A N,A2CN"2A2N,V&A5p/ / ? 0t4"ҁ҂剐sr2A N,^A(/ / ? HoFNOr2 ЀЁt43A N,,A2CN#A5z/ / ? 0t4"ҁ҂剐sr2A N+A(/ / ? Ho2NDOr2 ЀЁt43A N+ACN#xA2CN!H0t4"ҁ҂剐st4A N+A2CN!r2 ЀЁt43A N+^A2CN A2N+ >?@JDf*x` <=m=W=o Nr0/N,*Fr2 ЀЁ刾r c8REpo@cO<4x~C?x8匜tHHGpF<<FEFz:څEX5F~C|<:4h~>叚txH<F`~C|<>4h|C?x8匞tHHF`G>>GEGz:څEX5GRCx@Dc26hv@C:70|<܆Ehj:i270AhhO2LNuH8OjEd4dBAG2`@t4Ԃ40(2H6C070Hv6փ8vAx8؄60HdBtAB5 RAt@Bc>r`(tAB63 x8؄IH4,C6C?0RAt@BcB67 DCHÇ x@t4Ԃ3(BA`:t@Av6փ808vBz:څX6Cw0DDHĉ0z:څ3XRAt@BcOL8NuHO(H*I ov&o~8BC`p0ЀzCE?PRCpD@c>zDE?PBC`pC@274Bw HpCt4Ԃ03(t4Ԃs(:E@E80@:7Hŋ9ErCt4 o00(z:卐pXNHrCt4Ԃ:3(r2ҁs4B27 AtCBw HŋE9@r2 o9pp0Ѐ9szCt4Ԃ9s( I RCpD@cBC`p0Ѐ ozrCA?RCpD@cBC`TpC@274Bw HpCt4Ԃ03(t4Ԃs(:E@E:0@:7Hŋ;ErCt4 o00(z:卐pXN|HrCt4Ԃ:3(r2ҁsA2N%pCr2ҁ43z:څsXA<0N$pC@AF07N$0@AP07N$APC5NvAFCPNFABA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"5 p` 3!5 p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!5 `0123456789abcdefghijklmnopqrstuvwxyz/ &y6x g/ &S?<INA\O`&y6| g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@NupowerACHVMBaj//?Aa^//?,o f>,?B^BJ g`<,,A CHnHzparPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA5?BPAa p35CaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدalJk fJgaA5?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAaIa ajKxA !%!%1%xaKMa^MQC anCaFOL`NuA"o4HEBEڇ>,HFƔ.HG,HGBGBFHFj ԅӄSԅӄkf Jf|`&I"HA,h,BFHFԆ|`$BBHB6HCBBHB>ƖDjSFօDk.h.BGHGև~HC4BC`&BC2ǖDjSGօDkփB2DjJGfr2ҁSցDSFSGօDօDkHF<95g( c295gj95g``RJBjS`DkN b:օD"HA.HABABGHGҁ߇DD.ǒD95fDo RۄfR@@2""]ILNusquareA"o95g4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ95gJg j c a0JfJg95g95fJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzan` ҁQ !1LNudivCAn/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG95f,⎜bHFRFkHz``, c95g~95fJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu95f╚kfg` JfJg`,HFRdR`,HF  @c"$HzaB` ЀP !1L Nu5|$Ap" EP jW5|H j W$$$ jW5B j W$$$ jW5|h j Wf !R!R$ANu5|$Ap" EP jW5B j W$$$ jW5|h j Wf"#R#R$ANu$(0r@Ag8"(jNufJf @DNuH@aJ@jR@fЀPDNu"(fJfJ@kDNuDNuDNu2""]INur2` r`r2""]INuap` ap`apHQ//aP.Nu6C`6*)<<HFFg6()kfJfU`SCڅلj0"$HFFgJjNuf4Jf0]Nu()fJfY`JfJf  Nu\HNuJkS@ԂӁjNu0<rtv`H@Frtv`<<6(FgF Cpn @b:H@@95g 95g 695[Ck S@rt`rtv` @n0H@@rtv95gv95gl895\Dj`t`PvxR@fЀP95fg,` 95g 95gJ@k`J@j JgRdR !1.Nuv]H//?HW//0aPO0 ]H.Nu/ / o\H// ? o \H\I//!?!// ? //*?A52DAZA g&C5H 1g"@?BPANA50J@f0 @c 3"5 `3!5 ` o4C0 O$ _"_NuafpNu@|@k <`D@ @cpNu JPjDNuH$fBA`PjDh 2< <`>2<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ ?<NATO$_NuA7RBh1|1Ar` #include #include #include "spline.h" #define Round(a) ceil(a) void MakeSplines(Points pts, unsigned int NoPts, spline *splA, spline *splB, unsigned int ysa, unsigned int ysb) { int Param[MaxPoint]; /* Parameter */ int ergA[MaxPoint], ergB[MaxPoint]; /* Ergebnis (y'') */ TriGlSys SystemA, SystemB; void MakeParameters (Points p, int *t, unsigned int No); void MakeSystem (TriGlSys *system1, TriGlSys *system2, Points p, int t[], unsigned int No, unsigned int ysa, unsigned int ysb); void SolveSystem(TriGlSys *system, int *erg, unsigned int No); void SetSplines(spline *spl1, spline *spl2, int erg1[], int erg2[], int par[], Points p, unsigned int No, unsigned int ysa, unsigned int ysb); MakeParameters(pts,Param,NoPts); MakeSystem(&SystemA,&SystemB,pts,Param,NoPts,ysa,ysb); SolveSystem(&SystemA,ergA,NoPts); SolveSystem(&SystemB,ergB,NoPts); SetSplines(splA,splB,ergA,ergB,Param,pts,NoPts,ysa,ysb); } /*-------------------------------------------------------------------------*/ /* Routine wertet Interpolationspolynom aus und stellt Kurve graphisch dar */ /*-------------------------------------------------------------------------*/ void DrawSplines (int dev, spline splX[], spline splY[], unsigned int No) { unsigned int i, x, Abst; long X, Y; int xy[4]; point PMem, P; boolean set; vswr_mode(dev, MD_REPLACE); vsl_type(dev, 1); vsl_color(dev, 1); set = FALSE; /* alle Polynome nacheinander */ for (i=0; i <= No-2; i++) { /* alle Werte von XStart bis XEnde */ Abst = (splX[i].XEnde-splX[i].XStart)/20; /* Feinheit der Unterteilung */ /* je feiner die Unterteilung, desto genauer wird die Kurve dargestellt, */ /* aber auch desto langsamer wird die Darstellung */ x = splX[i].XStart; while (x<=splX[i].XEnde) { /* Interpolationspolynome */ X = splX[i].a * pow((x-splX[i].XStart),3)+ splX[i].b * pow((x-splX[i].XStart),2)+ splX[i].c * (x-splX[i].XStart)+ splX[i].d; Y = splY[i].a * pow((x-splY[i].XStart),3)+ splY[i].b * pow((x-splY[i].XStart),2)+ splY[i].c * (x-splY[i].XStart)+ splY[i].d; P.x = (int) X; P.y = (int) Y; if (!set) { PMem = P; /* erster Punkt als Startpunkt */ set = TRUE; } else { xy[0] = PMem.x; xy[1] = PMem.y; xy[2] = P.x; xy[3] = P.y; v_pline(dev,2,xy); /* Linie zu P ziehen */ PMem = P; } x += Abst; } } } /* berechnet Parameter, damit die Koordinaten als normale Sttzwerte */ /* genutzt werden knnen */ void MakeParameters (Points p, int *t, unsigned int No) { unsigned int i; t[0] = 0; /* bei 0 geht's los */ for (i = 1; i <= No-1; i++) t[i] = t[i-1] + /* alter Wert + */ (int) (sqrt(pow((p[i].x-p[i-1].x),2)+ /* Abstand der */ pow((p[i].y-p[i-1].y),2))); /* Punkte */ } /* berechnet lineares Gleichungssystem mit tridiagonaler */ /* Koeefizientenmatrix */ void MakeSystem (TriGlSys *system1, TriGlSys *system2, Points p, int t[], unsigned int No, unsigned int ysa, unsigned int ysb) { int h[MaxPoint]; unsigned int i; for (i = 0; i <= No-2; i++) /* Schrittweiten */ h[i] = t[i+1]-t[i]; for (i = 0; i <= No-4; i++) /* Haupt- und Nebendiagonale */ { system1->m[i] = 2 * (h[i]+h[i+1]); system2->m[i] = 2 * (h[i]+h[i+1]); system1->o[i] = h[i+1]; system2->o[i] = h[i+1]; system1->u[i] = system1->o[i]; system2->u[i] = system1->o[i]; } system1->m[No-3] = 2 * (h[No-3]+h[No-2]); system2->m[No-3] = 2 * (h[No-3]+h[No-2]); for (i = 0; i <= No-3; i++) /* Inhomogenitt */ { system1->l[i] = 6 * ((p[i+1].x-p[i].x) / h[i] -(p[i+2].x-p[i+1].x) / h[i+1]); system2->l[i] = 6 * ((p[i+1].y-p[i].y) / h[i] -(p[i+2].y-p[i+1].y) / h[i+1]); } system1->l[0] += h[0] * ysa; /* Randwerte dazu */ system1->l[No-3] += h[No-2] * ysb; system2->l[0] += h[0] * ysa; system2->l[No-3] += h[No-2] * ysb; } /* berechnet Lsung des Gleichungssystems */ /* stark vereinfacht, da Matrix Tridiagonalmatrix */ void SolveSystem(TriGlSys *system, int *erg, unsigned int No) { unsigned int i, Back; int m[MaxPoint], l[MaxPoint], x[MaxPoint]; m[0] = system->m[0]; /* LR - Zerlegung */ for (i = 0; i<= No-4; i++) { l[i] = system->u[i] / m[i]; /* L - Matrix, Nebendiagonale */ m[i+1] = system->m[i+1]-l[i] / system->o[i];/* R - Matrix, Hauptdiagonale */ } x[0] = system->l[0]; /* einsetzen */ for (i = 1; i<= No-3; i++) /* berechnet x aus */ x[i] = system->l[i]-l[i-1] * x[i-1]; /* L x - system.l = 0 */ erg[No-3] = -x[No-3] / m[No-3]; /* Lsung */ for (i = 0; i<= No-4; i++) /* berechnet erg aus */ { Back = No-4-i; /* R erg + x = 0 */ erg[Back] = -(x[Back] + system->o[Back] * (erg[Back+1])) / m[Back]; } } /* berechnet die Koeffizienten des Interpolationspolynoms */ void SetSplines(spline *spl1, spline *spl2, int erg1[], int erg2[], int par[], Points p, unsigned int No, unsigned int ysa, unsigned int ysb) { unsigned int i; int y[MaxPoint]; /* 1. fr x-Werte */ for(i = 0; i<= No-3; i++) /* 2. Ableitung */ y[i+1] = erg1[i]; y[0] = ysa; y[No-1] = ysb; for (i = 0; i <= No-2; i++) { spl1->a = (y[i+1]-y[i]) / (6 * (par[i+1]-par[i])); /* Koeffizienten */ spl1->b = y[i] / 2; spl1->c = abs(p[i+1].x-p[i].x) / (par[i+1]-par[i]) -(par[i+1]-par[i]) * (y[i+1]+2 * y[i]) / 6; spl1->d = (p[i].x); spl1->XStart = par[i]; /* Anfang */ spl1->XEnde = par[i+1]; /* Ende */ spl1++; } /* 2. fr y-Werte */ for (i = 0; i<= No-3; i++) /* 2. Ableitung */ y[i+1] = erg2[i]; for (i = 0; i<= No-2; i++) { spl2->a = (y[i+1]-y[i]) / (6 * (par[i+1]-par[i])); /* Koeffizienten */ spl2->b = y[i] / 2; spl2->c = abs(p[i+1].y-p[i].y) / (par[i+1]-par[i]) -(par[i+1]-par[i]) * (y[i+1]+2.0*y[i]) / 6; spl2->d = p[i].y; spl2->XStart = par[i]; /* Anfang */ spl2->XEnde = par[i+1]; /* Ende */ spl2++; } } #define MaxPoint 25 typedef enum { FALSE, TRUE } boolean; typedef struct { int o[MaxPoint], u[MaxPoint]; /* untere/obere Diagonale */ int m[MaxPoint]; /* Hauptdiagonale */ int l[MaxPoint]; /* Inhomogenitt */ } TriGlSys; typedef struct /* Record fr Splines */ { unsigned int a, b, c, d; /* Koeffizienten des Polynoms */ unsigned int XStart, XEnde; /* Definitionsbereich */ } spline; typedef struct { int x; int y; }point; typedef point Points[MaxPoint]; /* Punkte */ void MakeSplines(Points pts, unsigned int NoPts, spline *splA, spline *splB, unsigned int ysa, unsigned int ysb); void DrawSplines (int dev, spline splX[], spline splY[], unsigned int No); N 4H8O&H6(I:8E0"J KNHR/ 420CANPO0CAN0CAN/ HRHoHo420"oR LNOO&L8NuH6O?@$H&I?ArNr0/Nr0/NBDBEKM`r2 ЀЁ42 r|<>2`A / / ? 0t4"ҁ҂剐rr2A NA(/ / ? HoFNOr2 ЀЁt42A NA2CNA/ / ? 0t4"ҁ҂剐rr2A NA(/ / ? Ho(NOr2 ЀЁt42A NACNA2CN0t4"ҁ҂剐rt4A NA2CNr2 ЀЁt42A NA2CNA2N&A/ / ? 0t4"ҁ҂剐sr2A NA(/ / ? HoFNOr2 ЀЁt43A NA2CNA(/ / ? 0t4"ҁ҂剐sr2A NA(/ / ? Ho2NOr2 ЀЁt43A NACNA2CN0t4"ҁ҂剐st4A NA2CNr2 ЀЁt43A NA2CNA2N >?@JDf*x` <=m=W=o Nr0/N*Fr2 ЀЁ刾r c8REpo@cO<4x~C?x8匜tHHGpF<<FEFz:څEX5F~C|<:4h~>叚txH<F`~C|<>4h|C?x8匞tHHF`G>>GEGz:څEX5GRCx@Dc26hv@C:70|<܆Ehj:i270AhhO2LNuH8OjEd4dBAG2`@t4Ԃ40(2H6C070Hv6փ8vAx8؄60HdBtAB5 RAt@Bc>r`(tAB63 x8؄IH4,C6C?0RAt@BcB67 DCHÇ x@t4Ԃ3(BA`:t@Av6փ808vBz:څX6Cw0DDHĉ0z:څ3XRAt@BcOL8NuHO(H*I ov&o~8BC`p0ЀzCE?PRCpD@c>zDE?PBC`pC@274Bw HpCt4Ԃ03(t4Ԃs(:E@E80@:7Hŋ9ErCt4 o00(z:卐pXNHrCt4Ԃ:3(r2ҁs4B27 AtCBw HŋE9@r2 o9pp0Ѐ9szCt4Ԃ9s( I RCpD@cBC`p0Ѐ ozrCA?RCpD@cBC`TpC@274Bw HpCt4Ԃ03(t4Ԃs(:E@E:0@:7Hŋ;ErCt4 o00(z:卐pXNHrCt4Ԃ:3(r2ҁsA2NpCr2ҁ43z:څsXA<0NpC@AF07N0@AP07NAPC #include #include #include #include #include "lasso.h" extern int handle, work_out[]; void gem_prg() { void Zeichne_Bild(void); graf_mouse(ARROW ,0); Zeichne_Bild(); form_alert(0,"[0][Demo zur Lasso-Routine ][ weiter ]"); Lasso(1, 7); form_alert(1,"[0][Demo-Ende ][ weiter ]"); } void Zeichne_Bild(void) { int i, x, y, r, xy[4]; graf_mouse(M_OFF, 0); xy[0] = 0; xy[1] = 0; xy[2] = work_out[0]; xy[3] = work_out[1]; vs_clip(handle, 1, xy); v_clrwk(handle); vswr_mode(handle, 1); for (i=0; i<10; i++) { x = abs(640*(Random()/pow(2,24))); y = abs(400*(Random()/pow(2,24))); r = abs(100*(Random()/pow(2,24))); v_circle(handle, x, y, r); } vs_clip(handle, 0, xy); graf_mouse(M_ON, 0); }`2b``4b>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#4T34X k #4^ Ј<.@#4ZJy4Xg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON |0 J"LN? 92dg @N 92hg @NN?<LNA/ E4zN.(5@R@gPp` 2A5R@| m5|HjHjCAN.PO5@5@4HjC JN-XOp`B@$_Nu095N,N-NuNS@fNrNB@NLNuC2lA3N pN4NuH>O?@?A095rN+r095N+BBBA095N+Xr095N+2r095N+ N*V&H694?y4 /fA2pN,`/o?o4 ?C?o<pCH?@Bo0<N,p"K oN)095N+pp"K KN)0<N,BoBo>:/2oo`2/?AԺRl0`0:0<N*p"K oN'r095N)?420NTOp"K KN'đ0<N*r095N(?420NTO?420NTO8<pVf?420NTO?/4/2/0/NnTO?/4/20N\TO0<N*Hp"K oN':r095N(n?/4/20N(TO?A?B?o 0<N&Ar095N&L0<N&PONu?O6/>?A?B?A?B?C ?@ ?C?@?AA095rN&O6NuB@N&tN$A2B@N&2rpNA2pN&NuHOБ0<N&BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"2bp` 3!2bp& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!2b`0123456789abcdefghijklmnopqrstuvwxyz/ &y48 g/ &S?<INA\O`&y4< g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@NupowerACHVMBaD//?Aa8//?,o f>,?B^BJ g`<,,A CHnHzpaLPO`Jo nhkJ f`JWkB^BB`| 0@@@>D@k@ @?brt @b  /` @  /SdS¯fvįfn/@A CaBCA3v?BPAa J33vCaxJgVO,_Nuexp C6O璃cW䔋mϫp ԥT/Xx6.=8?Xlb?\>np?X?mKz?m?ZD?` +?y?ryXF$^?4 xدallJk fJga~A3v?BPHM:@v@ @?bg0 `:xEE?kFg( Em bJGj SD&,FFAFBCF0@DLd>@8<HDBD/DBAa`IaaDKxA !%!%1%xa`KMa8MQC aHCa OL`NuA"o4CG?/p<6>܇׀HAHBHDHE>܇׀?<BCHCHF.HG܇׀.HG܇׀.HG܇׀.HG܇׀.HGև.HGևр?<6HCHFp>܇׀>܇׀>և(".Jkއ93wgJg j c a0JfJg93wg93wfJkt`Jk`h/"HA.HGpށ@H@HG0BGHBHE2tށـׂ݂p"Jk އل݆׃SANu b c0a b f$JfgJk؄݆׃SAR׀fRA` Jk؄݆׃SA Ae "$Hzan` ҁQ !1LNudivCA/ / ? AaA0 ]HNu4CG?bfb RGd6|/|$F,HF.h.BGHG҇~`"BAHA,HFpHAHB024 6<?~Gj SWԅӄGd, Q,HF.h.BGHG҇~HA`"BAHB02BB6|FjSG҄FdHG>HG93wf,⎜bHFRFkHz``, c93wg~93wfJkb`lJkf`X//&HC0BCHCH@B@4rЂׁ"$dSGԅӄNu93wf╚kfg` JfJg`,HFRdR`,HF  @c"$HzaB` ЀP !1L Nu5|$Ap" EP jW5|H j W$$$ jW5B j W$$$ jW5|h j Wf !R!R$ANu5|$Ap" EP jW5B j W$$$ jW5|h j Wf"#R#R$ANu$(0r@Ag8"(jNufJf @DNuH@aJ@jR@fЀPDNu"(fJfJ@kDNuDNuDNu2""]INur2` r`r2""]INuap` ap`apHQ//aP.Nu6C`6*)<<HFFg6()kfJfU`SCڅلj0"$HFFgJjNuf4Jf0]Nu()fJfY`JfJf  Nu\HNuJkS@ԂӁjNu0<rtv`H@Frtv`<<6(FgF Cpn @b:H@@93wg 93wg 693v[Ck S@rt`rtv` @n0H@@rtv93wgv93wgl893v\Dj`t`PvxR@fЀP93wfg,` 93wg 93wgJ@k`J@j JgRdR !1.Nuv]H//?HW//0aPO0 ]H.Nu/ / o\H// ? o \H\I//!?!// ? //*?A3w2DAZA g&C3bH 1g"@?BPANA3v0J@f0 @c 3"2b`3!2b` o4C0 O$ _"_NuafpNu@|@k <`D@ @cpNu JPjDNuH$fBA`PjDh 2< <`>2<@H@J@fAH@ @bQA @bYA @?bUAJ@kSAH@AԂQ0 B]HNu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nu/ ?<NNTO @$_Nu/ ?<NNTO$_Nu/ ?/ /?<NNO $_Nu/A5Bh1|1A2<fat"_2r+2QA7*r 2QNu/A51|1|!I!o1A"_A000000000A5rm`A51ABh1|r`A5Bh1|1Ar`A5Bh1|1A1Brl`A5Bh1|1Ar`A51|Bh1A0Bh2ra097*NuA5Bh1|1Ar`hA5Bh1|1Ar `NC53|3|3AC0""A52<`"A51|Bh1| 1A01B2Bh4Bh61o8Bh:r `A5BhBhr`A5BhBhre`A51A01B21|1|1org`35/ C52dBi3| Cp 2Q"</pps/ NB$_ _05A6"op,2QA7*p 2QNu55:B67*C53ABi#4H Ira#:B4HNu/ 1@ 0"<4@psNBA60$_Nup `lp`f#8*35p4`T/ /pMaJ"_2"_2"o2"o2Nu#8*35pN`"/ /pOa"_2"_2"o2"o2Nu/ 35@@A"C5B@22220<"<0zNBA60$_Nu550568*:* Fehler bei der Programminitialisierung![3][ Nicht gengend Speicher frei! ][ Abbruch ][0][Demo zur Lasso-Routine ][ weiter ][0][Demo-Ende ][ weiter ]@@@@@@@@@333355:B67*r  h(" VJtD .L:B ^Tv*. 4J &0 (& (& (\l&  ~.^6V0T *<&8 4B @ (& .* J 4 & t (6 6&  ,. lassdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o lasso.o lassdemo (lasso.h) pcstdlib.lib pcfltlib.lib pctoslib.lib pcgemlib.lib /*----------------------------------------------------------------*/ /* LASSO-FUNKTION */ /* */ /* Originalroutine in OMIKRON.BASIC: L. Canisius */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include #define MAX(a, b) ((a>b) ? a : b) #define MIN(a, b) ((a>b) ? b : a) extern int handle, work_out[]; /*----------------------------------------------------------------*/ /* LASSO-FUNKTION */ /* */ /* Aufruf: Lasso(Undo, Modus, handle) */ /* Undo: 1, wenn Bild gerettet werden soll */ /* Modus: Verknpfungsart des Ausschnitts (0-15) */ /* handle: Grafik-Handle */ /*----------------------------------------------------------------*/ void Lasso(int Undo, int Modus) { void *Puffer, *Undo_Puffer, *Schirm; int Xstart, Ystart, Xmax, Ymax, Xmin, Ymin, XMAX, YMAX; int X, X1, X2, Y, Y1, Y2, Breite, Hoehe; int pstatus, dummy, w_out[57], xy[10]; unsigned int Bildx, Bildy; long Bildg; MFDB Schirm_mfdb, Puffer_mfdb, Undo_mfdb; void Draw(int x1, int y1, int x2, int y2); void Box(int x1, int y1, int x2, int y2); vsl_type(handle, 1); /* durchgehende Linien */ vsl_width(handle, 1); vsl_ends(handle, 0, 0); vsl_color(handle, 1); vsf_interior(handle, 1); /* schwarze Fllung */ Schirm = Physbase(); Bildx = work_out[0]; Bildy = work_out[1]; vq_extnd(handle,1, w_out); Bildg = ((Bildx+1)/8) * (Bildy+1) * w_out[4]; Schirm_mfdb.fd_addr = Schirm; Schirm_mfdb.fd_nplanes = w_out[4]; Schirm_mfdb.fd_w = Bildx; Schirm_mfdb.fd_h = Bildy; Schirm_mfdb.fd_wdwidth = (Bildx+1)/16; Schirm_mfdb.fd_stand = 0; /* Arbeitspuffer in Bildschirmge */ Puffer = Malloc(Bildg); if (Puffer == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); vswr_mode(handle, 1); return; } Puffer_mfdb.fd_addr = Puffer; Puffer_mfdb.fd_nplanes = Schirm_mfdb.fd_nplanes; Puffer_mfdb.fd_w = Bildx; Puffer_mfdb.fd_h = Bildy; Puffer_mfdb.fd_wdwidth = (Bildx+1)/16; Puffer_mfdb.fd_stand = 0; graf_mouse(M_OFF,0); Setscreen(Puffer, Schirm, -1); v_clrwk(handle); Setscreen(Schirm, Schirm, -1); graf_mouse(M_ON,0); /* Anfangswerte des Begrenzungsrechtecks (Bildschirmauflsung) */ Xmax = 0; Ymax = 0; Xmin = Bildx; Ymin = Bildy; XMAX = Bildx-2; YMAX = Bildy-2; /* Original retten, wenn gewnscht */ if (Undo==1) { xy[0] = 0; xy[1] = 0; xy[2] = Bildx; xy[3] = Bildy; xy[4] = 0; xy[5] = 0; xy[6] = Bildx; xy[7] = Bildy; Undo_Puffer = Malloc(Bildg); if (Undo_Puffer == NULL) { form_alert(1,"[3][ Nicht gengend Speicher frei! ][ Abbruch ]"); Mfree(Puffer); vswr_mode(handle, 1); return; } Undo_mfdb.fd_addr = Undo_Puffer; Undo_mfdb.fd_nplanes = Schirm_mfdb.fd_nplanes; Undo_mfdb.fd_w = Bildx; Undo_mfdb.fd_h = Bildy; Undo_mfdb.fd_wdwidth = (Bildx+1)/16; Undo_mfdb.fd_stand = 0; graf_mouse(M_OFF, 0); vro_cpyfm(handle, 3, xy, &Schirm_mfdb, &Undo_mfdb); graf_mouse(M_ON, 0); } /* auf Mausklick warten und Anfangskoordinaten ermitteln */ while(graf_mkstate(&Xstart, &Ystart, &pstatus, &dummy),!(pstatus & 1)); X1 = Xstart; X2 = X1; Y1 = Ystart; Y2 = Y1; /* Ausschnitt mit der Maus whlen */ do { while(graf_mkstate(&X1, &Y1, &pstatus, &dummy), (pstatus & 1) && (X1 == X2) && (Y1 == Y2)); /* Lasso nicht an den Rand lassen */ X1 = MIN(X1,XMAX); X1 = MAX(X1,2); Y1 = MIN(Y1,YMAX); Y1 = MAX(Y1,2); /* Ermittlung des Begrenzungsrechtecks */ Xmax = MAX(X1 ,Xmax); Xmin = MIN(X1 ,Xmin); Ymax = MAX(Y1 ,Ymax); Ymin = MIN(Y1 ,Ymin); /* Zeichnen des Lassos: */ /* 1) versteckt */ graf_mouse(M_OFF,0); Setscreen(Puffer, Schirm, -1); vswr_mode(handle, 1); Draw(X2, Y2, X1, Y1); Setscreen(Schirm, Schirm, -1); graf_mouse(M_ON,0); /* 2) sichtbar */ vswr_mode(handle, 3); Draw(X2, Y2, X2, Y2); Draw(X2, Y2, X1, Y1); X2 = X1; Y2 = Y1; } while((pstatus & 1)); /* Umrandung schliessen */ Draw(X2, Y2, X2, Y2); Draw(Xstart, Ystart, Xstart, Ystart); Draw(X2, Y2, Xstart, Ystart); /* Ab jetzt alles im Puffer ausfhren */ graf_mouse(M_OFF,0); Setscreen(Puffer, Schirm, -1); vswr_mode(handle, 1); Draw(X2, Y2, Xstart, Ystart); /* Maske durch Fllen des Begrenzungsrechtecks erstellen */ Breite = Xmax-Xmin; Hoehe = Ymax-Ymin; Box(Xmin-2,Ymin-2,Breite+6,Hoehe+6); v_contourfill(handle, Xmin-1, Ymin-1, 1); /* Maske mit Bild NOT AND-Verknpfen */ xy[0] = 0; xy[1] = 0; xy[2] = Bildx; xy[3] = Bildy; xy[4] = 0; xy[5] = 0; xy[6] = Bildx; xy[7] = Bildy; vro_cpyfm(handle, 2, xy, &Schirm_mfdb, &Puffer_mfdb); /* Ab jetzt wieder alles auf sichtbarem Bildschirm ausfhren * Setscreen(Schirm, Schirm, -1); /* Bild restaurieren */ if (Undo==1) { xy[0] = 0; xy[1] = 0; xy[2] = Bildx; xy[3] = Bildy; xy[4] = 0; xy[5] = 0; xy[6] = Bildx; xy[7] = Bildy; vro_cpyfm(handle, 3, xy, &Undo_mfdb, &Schirm_mfdb); } /* Weiterverarbeitung: Verschieben des Ausschnitts */ xy[0] = 0; xy[1] = 0; xy[2] = Bildx; xy[3] = Bildy; vs_clip(handle, 1, xy); graf_mkstate(&X, &Y, &pstatus, &dummy); xy[0] = Xmin; xy[1] = Ymin; xy[2] = Xmin + Breite; xy[3] = Ymin + Hoehe; xy[4] = X; xy[5] = Y; xy[6] = X + Breite; xy[7] = Y + Hoehe; vro_cpyfm(handle, 6, xy, &Puffer_mfdb, &Schirm_mfdb); graf_mouse(M_ON, 0); do { while(graf_mkstate(&X1, &Y1, &pstatus, &dummy), (!(pstatus&1)) && (!(pstatus&2)) && (X == X1) && (Y == Y1)); xy[0] = Xmin; xy[1] = Ymin; xy[2] = Xmin + Breite; xy[3] = Ymin + Hoehe; xy[4] = X; xy[5] = Y; xy[6] = X + Breite; xy[7] = Y + Hoehe; graf_mouse(M_OFF, 0); vro_cpyfm(handle, 6, xy, &Puffer_mfdb, &Schirm_mfdb); X = X1; Y = Y1; xy[0] = Xmin; xy[1] = Ymin; xy[2] = Xmin + Breite; xy[3] = Ymin + Hoehe; xy[4] = X; xy[5] = Y; xy[6] = X + Breite; xy[7] = Y + Hoehe; vro_cpyfm(handle, 6, xy, &Puffer_mfdb, &Schirm_mfdb); graf_mouse(M_ON, 0); } while((!(pstatus&1)) && (!(pstatus&2))); graf_mouse(M_OFF, 0); xy[0] = Xmin; xy[1] = Ymin; xy[2] = Xmin + Breite; xy[3] = Ymin + Hoehe; xy[4] = X; xy[5] = Y; xy[6] = X + Breite; xy[7] = Y + Hoehe; if (pstatus&2) /* Ausschnitt gem Modus einkopieren */ vro_cpyfm(handle, Modus, xy, &Puffer_mfdb, &Schirm_mfdb); else vro_cpyfm(handle, 6, xy, &Puffer_mfdb, &Schirm_mfdb); graf_mouse(M_ON, 0); xy[0] = 0; xy[1] = 0; xy[2] = Bildx; xy[3] = Bildy; vs_clip(handle, 0, xy); /* Speicher freigeben */ Mfree(Puffer); if (Undo==1) Mfree(Undo_Puffer); Setscreen(Schirm, Schirm, -1); vswr_mode(handle, 1); vst_color(handle, 1); } /*----------------------------------------------------------------*/ /* Linie zeichnen */ /*----------------------------------------------------------------*/ void Draw(int x1, int y1, int x2, int y2) { int xy[4]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y2; graf_mouse(M_OFF, 0); v_pline(handle, 2, xy); graf_mouse(M_ON, 0); } void Box(int x1, int y1, int x2, int y2) { int xy[10]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y1; xy[4] = x2; xy[5] = y2; xy[6] = x1; xy[7] = y2; xy[8] = x1; xy[9] = y1; v_pline(handle, 5, xy); } /*----------------------------------------------------------------*/ /* LASSO-FUNKTION */ /* */ /* Aufruf: Lasso(Undo, Modus, handle) */ /* Undo: 1, wenn Bild gerettet werden soll */ /* Modus: Verknpfungsart des Ausschnitts (0-15) */ /* handle: Grafik-Handle */ /*----------------------------------------------------------------*/ void Lasso(int Undo, int Modus); N|H>O?@?A09rNr09NBBBA09Nr09Nr09NN&H69?y /fApN`/o?o4 ?C?o<pCH?@Bo0<Np"K oN09Np"K KN0<NBoBo>:/2oo`2/?AԺRl0`0:0<Np"K oNr09N?420NTOp"K KN0<Nr09N?420NTO?420NTO8<pVf?420NTO?/4/2/0/NTO?/4/20NTO0<Np"K oNr09N?/4/20NTO?A?B?o 0<NAr09N0<NPONu?O6/>?A?B?A?B?C ?@ ?C?@?AA09rNO6Nu[3][ Nicht gengend Speicher frei! ][ Abbruch ]              > 2      N   0   4             $   4  <    F  h   N   J                4  0 vst_color vsl_colorLassoDraw vro_cpyfm Setscreenhandle graf_mousework_out v_contourfillvsl_ends vsf_interiorMalloc vsl_widthBox vswr_modeMfreevs_clipvsl_type graf_mkstatevq_extndPhysbase form_alertv_clrwkv_pline. h_i.. ^iANIDEMO C LAi ANIDEMO PRG KFiTANIDEMO PRJ @i /*----------------------------------------------------------------*/ /* Animations-Demo */ /* */ /* Originalroutine in MAXON-PASCAL von Christen Fihl */ /* C-Konvertierung: Thomas Werner */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include typedef enum { FALSE, TRUE } boolean; extern int handle; void gem_prg(void) { int P1[16], P2[16], P3[16], n, d, k; boolean Snow; void Box(int x1, int y1, int x2, int y2); graf_mouse(ARROW,0); v_clrwk(handle); Snow = FALSE; P1[0] = P1[4] = P1[8] = P1[12] = 0; P1[1] = P1[5] = P1[9] = P1[13] = 9; P1[2] = P1[6] = P1[10]= P1[14] = 2; P1[3] = P1[7] = P1[11]= P1[15] = 3; P2[0] = P2[1] = P2[2] = P2[3] = 0; P2[4] = P2[5] = P2[6] = P2[7] = 9; P2[8] = P2[9] = P2[10]= P2[11] = 2; P2[12]= P2[13]= P2[14]= P2[15] = 3; P3[0] = P3[12]= 0; P3[1] = P3[5] = P3[9] = P3[13]= 9; P3[2] = P3[4] = P3[6] = P3[8] = P3[10]= P3[14] = 2; P3[3] = P3[7] = P3[11]= P3[15] = 3; graf_mouse(M_OFF,0); vswr_mode(handle, MD_XOR); vsl_color(handle,2); Box(220,10,250,40); vsl_color(handle,8); Box(220+50,10,250+50,40); do { n = 0; vsl_color(handle,8); Box(n+1,n+1,n+181,n+181); for (n=1; n<20; n++) { vsl_color(handle,2); Box(n,n,n+180,n+180); if (!Snow) Setpalette(P3); Setpalette(P1); evnt_timer(10,0); vsl_color(handle,8); Box(n,n,n+180,n+180); Box(n+1,n+1,n+181,n+181); if (!Snow) Setpalette(P3); Setpalette(P2); evnt_timer(10,0); vsl_color(handle,2); Box(n,n,n+180,n+180); } n=20+1; vsl_color(handle,8); Box(n,n,n+180,n+180); graf_mkstate(&d, &d, &d, &k); } while(!(k&8)); graf_mouse(M_ON,0); } /*----------------------------------------------------------------*/ /* Rechteck zeichnen */ /*----------------------------------------------------------------*/ void Box(int x1, int y1, int x2, int y2) { int xy[10]; xy[0] = x1; xy[1] = y1; xy[2] = x2; xy[3] = y1; xy[4] = x2; xy[5] = y2; xy[6] = x1; xy[7] = y2; xy[8] = x1; xy[9] = y1; v_pline(handle, 5, xy); } `$``>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3 k # Ј<.@#Jyg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9g @N 9g @NN?<LNA/ EN5@R@gPp` 2A5R@| m5|HjHjCANfPO5@5@4HjC JNvXOp`B@$_Nu09NLNNuNS@fN&NB@NLNuCANpN4NuH>OB@NE0NBCGDB@7@7@7@6r 7A7A7A 7Ap7@7@7@ 7@r7A7A7A7AI$B@9@9@9@8r 9A9A 9A 9Ap9@9@9@9@r9A9A9A9AKB@;@:r ;A;A;A ;Ap;@;@;@;@ ;@;@r;A;A;A;A0<Nr0N r0N p(?4<r 0<N:TOr0N p(?4<,r 0<NTOMBDr0N z0|?4rDpDNTOx`r0N T0|?420NTOJCf MN & KN BAp NJr0N 0|?420NTO0|?4rDpDNTOJCf MN LN BAp N r0N 0|?420NVTORD|m\xr0N 0|?420N.TOHWHV"N NN POpWg0<N OdL|Nu?O6/>?A?B?A?B?C ?@ ?C?@?AA09rN O6NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/QOM-O, ICHza&XOPO,_NuH@B@H@"VraJ@kNu.np`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#/ /?<NN\O$_NuABh1|1Ar`ABh1|1Ar `ABhBhr`ABhBhre`3/ C2dBi3| Cp 2Q"<ps/ NB$_ _0AZ"op,2QAp 2QNuZZC3ABi# Ira#Nu/ 1@ 0"<psNBAZ0$_Nup `jp`dAZ00p`T/ /pMaJ"_2"_2"o2"o2Nu#3ZpN`"/ /pOa"_2"_2"o2"o2Nu/ 3@@A"CB@22220<"<NBAZ0$_NuZZ Fehler bei der Programminitialisierung!jZZr  h(" &  ~.0  0. "anidemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o anidemo pcstdlib.lib pctoslib.lib pcgemlib.lib . n_i.. ^iSKALIER BAS {c+SKALIER LST {c'"H4|R$ p   H 4~h:fl J!"# <$ >% X& r' ( ) * J+ l, - . / 0 H1 n2 3 4 5 6 7 8 \9 : ; << ~= > ?2@hABCD`EFGHHI~JKL(M`NOPQ>RzSTUV*WrXYZ&[\\]^ _<`abc<dvefgh*ihjkl$mVnop$qnrst:ufvwxy@zp{|}~HV*`.T^2HP $ R !!<!r!!""J""1 -=> Demoprogramm fr die Skalen (hohe Auflsung)0C Schirm lschen2,Demo reines Achsenkreuz mit einfachem Raster1.Demo2NrFP<# Einfaches Achskreuz1 D 10 Sekunden zeigen0C Schirm lschen2+Demo Achsenkreuzkasten mit doppeltem Raster 2.Demo2NrFP<# Einfaches Achskreuz1 D 10 Sekunden zeigen0C Schirm lschen27Demo fr verschiedene x-Skalierungen bei gleicher Lnge3.Demo"(r-2 Skalenschleife x(X>> Skala in x 1 D 10 Sekunden zeigen0C Schirm lschen27Demo fr verschiedene y-Skalierungen bei gleicher Lnge4.Demo"Fl-22 Skalenschleife y2r>> Skala in y 1 D 10 Sekunden zeigen0C Schirm lschen2+Demo fr verschiedene Skalierung und Raster 5. Demo<Dn<& x-Achse unten<D<n" x-Achse oben<n<D =$ y-Achse links<nD<#() y-Achse rechts1 D 10 Sekunden zeigen02?Demo fr gleiche Skalierung und Richtungsumkehr mit Mischraster&<h<<& x-Achse unten<&<h<% x-Achse obenh<<&' y-Achse links<h&<( y-Achse rechts1<D 10 Sekunden zeigeno ##################### # Achsenkreuzkasten # #####################6  $(,0B Links - Pixelwert linke Kante Rechts - Pixelwert rechte KanteA Unten - Pixelwert untere Kante Oben - Pixelwert obere Kante Xmin!, Xmax! - Skalenwerte x Ymin!, Ymax! - Skalenwerte y% Wie: 0 Nur Achsenkreuz, 1 Achskasten2 Raster: Rasterbreite in 4er-Pixel (0 kein Raster) >>>>> >0?,& >>>>> >>> >>$>(>0?,&>>> >$>(>4 ##################### # Skalierung Achsen # #####################648<@DHLPA Von - Startpunkt der Achse, Bis - Zielpunkt der AchseH Wo - Andere Ordinate Achse selbst, Hier - Andere Ordinate fr RasterB Unt! - Realer unterster Wert, Ob! - Realer oberster WertE Was - Achsrichtung (>0 y-Achse, <0 x-Achse, 1 dann rechts, 2 links,= -2 unterhalb und -1 oberhalb der Achse)< Rast - Raster zeichnen (0 nein, x ja im Abstand 4er-Punkte)2 Umkehr der Werterichtung: Bis und Von vertauschen7TX\`dhlpt Lokale Variablen7x| Lokale Variablen7 Zur BeschleunigungP"P/ Nur positives Raster|"HDʹ+ Differenz SkalenendenH"H|ŬG) Oben bischen mehrD"D|ŬG+ Unten bischen weniger"D"H SkalenendenT" ŬGɧ Dimension untere GrenzeX" ŬGɧ Dimension obere Grenzet"XT% Optimale Stellenanzahl* ---- Ermittlung der maximalen Stellenzahlx"tt$ Maximale Stellenzahl merken L# y-Achse<4<8# y-Achse zeichnen"84ʹ) Pixelhhe der Achse"Ƹ% max. Zahleinteilung, x-Achse4<8<# x-Achse zeichnen"84ʹ) Pixellnge der Achse" xƸ max. Zahleinteilung1 ---- Ermittlung der groben Teilung (Zahlenwerte)\"t5 Zuweisung der Stellen 2? Bei engen Werten solange ...\"\/ ... erniedrigen, bis ...l" \+ ... Schrittweite OK."HlƸl! Grenze oben drunter setzen"DlƸl Grenze unten drber setzenlƹ!Feinstriche md. sooft wie Teilung"l 1 Variable grobe Teilung"  Dimension des Teils" Ganzanteil"> Merkvariable fr .25 Teilung1""Skalenteile zu wenig-""Skalenteile zu wenig-""Immer noch zu eng-""" .25-Teilung!- ---- Ermittlung der feinen Teilung (Striche)l" "HlƸl# Grenze oben drunter setzen"DlƸl Grenze unten drber setzen|"- Differenz Skalenendenp"|l1 ..neue Anzahl der Schritte"x2 Stellen vor dem Komma"l ( Limitdefinition" ̫waɸ Hilfsgre" Nachkommastellen"84HD/ 1. Hilfsgre zur Beschleunigung"L9 2. Hilfsgre zur Beschleunigung"P@<ʺ0 3. Hilfsgre zur Beschleunigung"L9 4. Hilfsgre zur Beschleunigung" L"L 5.+6. Hilfsgre"L L 7. Hilfsgre`"|ŬG-l Schleife"` String bilden" Blanks wegd"4`D+ Ort ermitteln(wahrer Ort!)"`Ƹ`ʹWertentscheidungsvariable LE! y-Achse<d<d) Zeichnen des feinen Striches  Platz fr Text <d<d Grober Strich <Њd Zahl schreiben P3 h"<@-hd h Raster J* x-Achsed<d<) Zeichnen des feinen Striches  Platz fr Text d<d< Grober Strich dЊ< Zahl schreiben P3 h"<@-dh h Raster  `4# ################################### # Lscht Blanks vorne und hinten ## ##################################7( Lokale VariablenX". 1. Buchstaben ungleich Blank F T"-' Letzten Buchstaben ungleich ' ' F 4"' Probleme korrigieren+" Bei Problemen korrigieren4ۂ Blankfrei zurckgeben+ ##########################################+ # String bilden mit Vor und Nach-Stellen #+ ##########################################7% Lokale Variablen0"# Nach Minimum 00"$ Vor Minimum 1" Totallnge"#( Vorstellen*".# Nachstellen- So gebrauchen"& Wert zuweisen9 Wieder normalgebrauch42 und Wert zurck..o  ,8DNXdp|"*6DLV`l|&2>JZbrACHSKREUZ IACHSELINKSRECHTSUNTENOBENXMINXMAXYMINYMAXWIERASTERVONBISWOHIERUNTOBWASRASTUNTEN_DIMOBEN_DIMSTELLENPDAKHUEPFWIEOFTSTSTELDISTTEILTEIL_DIMTEILUNTENOBENTEILMAXHILF1HILF1HILF2HILF3HILF4HILF5HILF6MERKENUNHOEHEBREITEVORHERGRENZENACHHERPFNWANDLEFNBLANKSWEGPMODULWASVORNEHINTENWERTVORNACHTOTALWIEWXU ' -=> Demoprogramm fr die Skalen (hohe Auflsung) CLS ' Schirm lschen TEXT 50,28,"Demo reines Achsenkreuz mit einfachem Raster"'1.Demo Achskreuz(50,590,370,70,-30,80,20,60,0,1)' Einfaches Achskreuz WAIT 10' 10 Sekunden zeigen CLS ' Schirm lschen TEXT 50,28,"Demo Achsenkreuzkasten mit doppeltem Raster"' 2.Demo Achskreuz(50,590,370,70,-30,80,20,60,1,2)' Einfaches Achskreuz WAIT 10' 10 Sekunden zeigen CLS ' Schirm lschen TEXT 50,28,"Demo fr verschiedene x-Skalierungen bei gleicher Lnge"'3.Demo FOR I=40 TO 370 STEP 30' Skalenschleife x Achse(40,600,I,I,0,(I/190)^5.3,-2,0)' Skala in x NEXT I' WAIT 10' 10 Sekunden zeigen CLS ' Schirm lschen TEXT 50,28,"Demo fr verschiedene y-Skalierungen bei gleicher Lnge"'4.Demo FOR I=70 TO 620 STEP 50' Skalenschleife y Achse(50,370,I,I,0,(I/177)^4.3,2,0)' Skala in y NEXT I' WAIT 10' 10 Sekunden zeigen CLS ' Schirm lschen TEXT 50,28,"Demo fr verschiedene Skalierung und Raster"' 5. Demo Achse(60,580,366,60,-30,30,-2,2)' x-Achse unten Achse(60,580,60,366,1210,1250,-1,0)' x-Achse oben Achse(60,366,60,580,-.05,-.01,2,3)' y-Achse links Achse(60,366,580,60,35,40,1,0)' y-Achse rechts WAIT 10' 10 Sekunden zeigen CLS ' TEXT 50,28,"Demo fr gleiche Skalierung und Richtungsumkehr mit Mischraster"' Achse(550,60,360,60,-20,60,-2,3)' x-Achse unten Achse(60,550,60,360,-20,60,-1,2)' x-Achse oben Achse(360,60,60,550,-.4,.1,2,4)' y-Achse links Achse(60,360,550,60,-.4,.1,1,3)' y-Achse rechts WAIT 60' 10 Sekunden zeigen END ' ##################### ' # Achsenkreuzkasten # ' ##################### DEF PROC Achskreuz(Links,Rechts,Unten,Oben,Xmin!,Xmax!,Ymin!,Ymax!,Wie,Raster) ' Links - Pixelwert linke Kante Rechts - Pixelwert rechte Kante ' Unten - Pixelwert untere Kante Oben - Pixelwert obere Kante ' Xmin!, Xmax! - Skalenwerte x ' Ymin!, Ymax! - Skalenwerte y ' Wie: 0 Nur Achsenkreuz, 1 Achskasten ' Raster: Rasterbreite in 4er-Pixel (0 kein Raster) Achse(Links,Rechts,Unten,Oben,Xmin!,Xmax!,-2,Raster) IF Wie=1 THEN Achse(Links,Rechts,Oben,Unten,Xmin!,Xmax!,-1,0) Achse(Unten,Oben,Links,Rechts,Ymin!,Ymax!,2,Raster) IF Wie=1 THEN Achse(Unten,Oben,Rechts,Links,Ymin!,Ymax!,1,0) RETURN ' ##################### ' # Skalierung Achsen # ' ##################### DEF PROC Achse(Von,Bis,Wo,Hier,Unt!,Ob!,Was,Rast) ' Von - Startpunkt der Achse, Bis - Zielpunkt der Achse ' Wo - Andere Ordinate Achse selbst, Hier - Andere Ordinate fr Raster ' Unt! - Realer unterster Wert, Ob! - Realer oberster Wert ' Was - Achsrichtung (>0 y-Achse, <0 x-Achse, 1 dann rechts, 2 links, ' -2 unterhalb und -1 oberhalb der Achse) ' Rast - Raster zeichnen (0 nein, x ja im Abstand 4er-Punkte) ' Umkehr der Werterichtung: Bis und Von vertauschen LOCAL Unten_Dim,Oben_Dim,Stellen,P!,Da,K,Huepf!,Wieoft,St' Lokale Variablen LOCAL Stel,Dist!,Teil!,Teil_Dim,Teil,Unten!,Oben!,Teilmax' Lokale Variablen LOCAL Hilf1,Hilf1!,Hilf2,Hilf3,Hilf4,Hilf5,Hilf6,Merken' Zur Beschleunigung Rast= ABS(Rast)' Nur positives Raster Dist!= ABS(Ob!-Unt!)' Differenz Skalenenden Ob!=Ob!+Dist!*1E-5' Oben bischen mehr Unt!=Unt!-Dist!*1E-5' Unten bischen weniger Unten!=Unt!:Oben!=Ob!' Skalenenden Unten_Dim= LOG(10, ABS(Unten!)+1E-5)' Dimension untere Grenze Oben_Dim= LOG(10, ABS(Oben!)+1E-5)' Dimension obere Grenze St= MAX(Oben_Dim,Unten_Dim)' Optimale Stellenanzahl ' ---- Ermittlung der maximalen Stellenzahl Stel= ABS(St)+2-2*(St<=1)-(Un!<0)' Maximale Stellenzahl merken IF Was>0 THEN ' y-Achse DRAW Wo,Von TO Wo,Bis' y-Achse zeichnen Hoehe= ABS(Bis-Von)' Pixelhhe der Achse Teilmax= INT(Hoehe/22)' max. Zahleinteilung ELSE ' x-Achse DRAW Von,Wo TO Bis,Wo' x-Achse zeichnen Breite= ABS(Bis-Von)' Pixellnge der Achse Teilmax= INT(Breite/10/Stel)' max. Zahleinteilung ENDIF ' ---- Ermittlung der groben Teilung (Zahlenwerte) Stellen=St' Zuweisung der Stellen REPEAT ' Bei engen Werten solange ... Stellen=Stellen-1' ... erniedrigen, bis ... Huepf!=10^Stellen' ... Schrittweite OK. Oben!=( INT(Ob!/Huepf!))*(Huepf!)' Grenze oben drunter setzen Unten!=( INT(Unt!/Huepf!)+1)*(Huepf!)' Grenze unten drber setzen UNTIL ABS((Oben!-Unten!)/(Huepf!))>Teilmax'Feinstriche md. sooft wie Teilung Teil!=Huepf!*10' Variable grobe Teilung Teil_Dim= INT( LOG(10,Teil!))' Dimension des Teils Teil=(Oben!-Unten!)/Teil!' Ganzanteil Merken=0' Merkvariable fr .25 Teilung IF(Teil*5)<=Teilmax THEN Teil!=Teil!/5:Teil=Teil*5'Skalenteile zu wenig IF(Teil*2)<=Teilmax THEN Teil!=Teil!/2:Teil=Teil*2'Skalenteile zu wenig IF(Teil*5)<=Teilmax THEN Teil!=Teil!/5:Teil=Teil*5'Immer noch zu eng IF(Teil*2)<=Teilmax THEN Teil!=Teil!/2:Teil=Teil*2:Merken=1'.25-Teilung! ' ---- Ermittlung der feinen Teilung (Striche) Huepf!=Teil!/10 Oben!=( INT(Ob!/Huepf!))*(Huepf!)' Grenze oben drunter setzen Unten!=( INT(Unt!/Huepf!)+1)*(Huepf!)' Grenze unten drber setzen Dist!=Oben!-Unten!' Differenz Skalenenden Wieoft=Dist!/Huepf!' ..neue Anzahl der Schritte Vorher=Stel+2' Stellen vor dem Komma Grenze!=Huepf!/10' Limitdefinition Hilf1!= INT( LOG(10,Teil!)+1D-8)' Hilfsgre Nachher= MAX(0,-Hilf1!)+Merken' Nachkommastellen Hilf1!=(Bis-Von)/(Ob!-Unt!)' 1. Hilfsgre zur Beschleunigung Hilf1=(1.5-Was)*4' 2. Hilfsgre zur Beschleunigung Hilf2=Rast*3* SGN(Hier-Wo)' 3. Hilfsgre zur Beschleunigung Hilf3=(1.5+Was)*4' 4. Hilfsgre zur Beschleunigung Hilf4=10*(Was=1):Hilf5=8*(Was=2)' 5.+6. Hilfsgre Hilf6=-24*(Was=-2)+9*(Was=-1)' 7. Hilfsgre FOR P!=Unten! TO Oben!+Dist!*1E-5 STEP Huepf!' Schleife P$=FN Wandle$(P!,Vorher,Nachher)' String bilden P$=FN Blanksweg$(P$)' Blanks weg Da=Von+(P!-Unt!)*Hilf1!' Ort ermitteln(wahrer Ort!) Pmodul!= ABS( INT((P!+Grenze!)/Teil!)*Teil!-P!)'Wertentscheidungsvariable IF Was>0 THEN ' y-Achse DRAW Wo,Da TO Wo+Hilf1,Da' Zeichnen des feinen Striches IF Pmodul!0 THEN FOR K=Wo TO Hier STEP Hilf2: DRAW K,Da: NEXT K' Raster ENDIF ENDIF ELSE ' x-Achse DRAW Da,Wo TO Da,Wo-Hilf3' Zeichnen des feinen Striches IF Pmodul!0 THEN FOR K=Wo TO Hier STEP Hilf2: DRAW Da,K: NEXT K' Raster ENDIF ENDIF ENDIF NEXT P! RETURN ' ################################## ' # Lscht Blanks vorne und hinten # ' ################################## DEF FN Blanksweg$(Was$) LOCAL Vorne,Hinten' Lokale Variablen FOR Vorne=1 TO LEN(Was$)' 1. Buchstaben ungleich Blank IF MID$(Was$,Vorne,1)<>" " THEN EXIT NEXT Vorne FOR Hinten= LEN(Was$) TO 1 STEP -1' Letzten Buchstaben ungleich ' ' IF MID$(Was$,Hinten,1)<>" " THEN EXIT NEXT Hinten IF Vorne<1 THEN Vorne=1' Probleme korrigieren IF(Hinten-Vorne)<1 THEN Hinten=Vorne+1' Bei Problemen korrigieren RETURN MID$(Was$,Vorne,Hinten-Vorne+1)' Blankfrei zurckgeben ' ########################################## ' # String bilden mit Vor und Nach-Stellen # ' ########################################## DEF FN Wandle$(Wert!,Vor,Nach) LOCAL Total,Wie$,Wxu$' Lokale Variablen IF Nach<0 THEN Nach=0' Nach Minimum 0 IF Vor<1 THEN Vor=1' Vor Minimum 1 Total=Vor+Nach+1+(Nach=0)' Totallnge Wie$="#"*Vor' Vorstellen IF Nach>0 THEN Wie$=Wie$+"."+"#"*Nach' Nachstellen USING Wie$' So gebrauchen Wxu$= STR$(Wert!)' Wert zuweisen USING ' Wieder normalgebrauch RETURN Wxu$' und Wert zurck.. . t_i$.. ^iSCRLINITC i%bSCROLL H e'ySCROLL PRG q(SCROLL S le-/* SCROLL - ROUTINEN fr MEGAMAX LASER C */ /* von Ulrich Witte */ /* (c) 1992 MAXON Computer */ #include #include "scroll.h" void scrollinit(RECT *k,SCROLLER *scroll,int links_oder_oben) { register int help, x1, x2; /* x-Koordinaten geteilt durch 16 ergibt An- */ /* zahl der Worte pro Zeile */ /* Die x-Koordinaten der Struktur */ /* drfen nicht gendert werden */ x1 = k->x1 >> 4; x2 = k->x2 >> 4; scroll->adr = (char *)Physbase(); /* Monitor-Adresse holen */ help = x2 - x1; /* Differenz merken */ if (links_oder_oben) /* ==> Adresse auf linke obere Ecke setzen */ scroll->adr += (x1 << 1) + (k->y1 * 80); else /* ==> oder rechts unten als Adresse eintragen */ scroll->adr += (x2 << 1) + ((k->y2 - 1) * 80); scroll->words = help - 1; scroll->offset = (long)(help << 1); /* Bytes = Worte * 2 */ scroll->zeilen = k->y2 - k->y1 - 1; /* Zeilen - 1 */ scroll->pixel = help << 4; /* Pixelzahl = Differenz * 16 */ } /* Header fr Scrollroutinen */ /* Struktur fr die 4 Eckpunkte des zu scrollenden Bereichs, wird */ /* fr die Initialisierung der Parameter */ /* der SCROLLER-Struktur bentigt */ typedef struct { int x1; int y1; int x2; int y2; }RECT; /* Struktur, die zum Scrollen */ /* ntigen Parameter enthlt */ typedef struct { int words; /* Wortbreite des Bereichs */ long offset; /* Breite in Bytes */ int zeilen; /* Hhe in Pixelzeilen */ char *adr; /* Adresse auf dem Monitor */ int pixel; /* Breite in Pixel,wird fr */ /* Links-Rechts bentigt */ }SCROLLER; void cdecl scroll_lr(SCROLLER *scroll,long warten,int pixel,int richtung); void cdecl scroll_ou(SCROLLER *scroll,long warten,int anzahl,int richtung); void scrollinit(RECT *k,SCROLLER *scroll,int links_oder_oben); `h KByPJ$f"O/9?<HNA\O.@N RyP m A#Z"ҍ¼.A// Bg?<JNA N NVH>. n:((<(*h4.SB&. Q M2 Gg 0(P0QPQQ`0P0QPQQL N^NuNVH<>. n:((<("h$I0P Gg`*I(J6.SC2&M"M$L . Q4 Gg"7+QėPQ45!QQ` 6PQPQ44QQLE0.g0@2,PAHѭ`0@2,SAPAHѭ0S@:0@H+@0,lS@;@0@;@ L0N^NuNV=|=|=|BNNZ=@ ?.N PT?.NT?.N>T`0.` n?.N>T`Rn0. @ m=| `Sn0. @n=|`Rn0. @ m=| `Sn0. @n=|`R . m-|`dS .JnB`PB0<=@=@`<`:| g| g:|(g|)g|*gl|+g4|-gD|/gl0.W|??./.HyNO ?.?./.HybNzO 0.W|??</.Hy~NzO 0.W|??</.HypNzO ?.?</.HyNO ?<?<N .X=@ @f@ ?.N zTNBgN .TN^NuNuNVtHBG`0RG@A1 G m=|HntHntHntHntNpO=@vHnxHnvHnN O 0.vLN^NuNVH>.HnHnHnHn?<?N OHy?<d?<?N O HnHnHnHn?< ?N OHy?<?<d?N O ?<?N X?<?N nX?<?N X?<?N X?<|?<?<?<HnN lO Hn?N \?<?N X?<?N X?<J?<0?<+?<?HnN lO Hn?N \Hy?<@?<J?N O ?<?N ~XHnHnHnHn?<?N OLN^NuNVH>.?<j?<?<I?<HnN lO ?HybHnNO 0W|?HyHnNO ?<J?<0?<,?<@HnN lO 0W|?HypHnNO ?HyHnNO ?<|?<?<?<HnN lO 0W|?Hy~HnNO 0W|?HyHnNO ?<?<?<?<dHnN lO 0W|?HyHnNO 0W|?HyHnNO ?<^?<0?<?< HnN lO ?<HyHnNO LN^NuNV?<N T0<N^NuNVA#A#A # Al#$A`#(AR#,A#2?< N T3l0090N^NuNV?<MN T n0n n 0p n0r n0t09lN^NuA0JXyJ !J!_ NMYyJA0J"P$h/( J@NuA0JXyJ !J!_ NNYyJA0J"P$h/( J@NuA0JXyJ !J!_ NAYyJA0J"P$h/( J@NuNV n0 n1n n1n n1nN^NuNV30.| A.HЈ-@=|` nR2.AAH1Rn nm/92N X09lN^NuNV# >3 3By33N A2#>N^NuNV3ByBy3N N^NuNV3eByBy3N N^NuNV3 23 4BnNq nR2.RnHA`|1f33Sn0.33N N^NuNV#:#B .мZ#F3dBy3  n 3N 09 n 03A`#:A#BA#FA2#>N^NuNV .3 .3N^NuNV .3 .3N^NuNV0969Ƽ n N^NuA0JXyJ !JHy!W #6Hy6" <sNBYyJA0J"P$hNuNV3 `3By33N 09N^NuNV3 `3By33N 09N^NuNV3 `3By33N 09N^NuNVBy23 43 3By3N  n 0 n0 n0 n0N^NuNV3 `3 By33N 09N^NuNV3 `3 By33N 09N^NuA0JXyJ !J"/0<NBYyJA0J"P$hNu LEA.L _LAUFSCHRIFT,A0Dieser String scrollt in die andere Richtung.Z W E I BOXEN, die Scrollen!  $>  F8  2           H&"     GLOBL scroll_lr; GLOBL scroll_ou; scroll_lr: movea.l 4(SP),A0 ;Adr. der Struktur move.w (A0),words ;Vars aus Struktur in ;in Register schieben move.l 2(A0),offset move.w 6(A0),zeilen move.l 8(A0),quelle ;Adresse des Blocks move.w 12(SP),D2 subq.w #1,D2 anzahl: move.l 8(SP),D3 pause1: dbf D3,pause1 ;Pause ;Scrollgeschwindigkeit absolut movea.l quelle,A0 move.w zeilen,D1 cmpi.w #1,14(SP) ;TRUE = linksherum beq.s links1 rechts1: move.w -2(A0),D0 roxr.w #1,D0 move.w words,D0 ;worte pro Zeile suba.l offset,A0 ;Ptr auf Zeilenanf. rechts2: roxr.w (A0)+ ;alle Bytes 1 ;Pixel weiterrollen dbf D0,rechts2 suba.l #80,A0 ;==> 1 Zeile hher dbf D1,rechts1 dbf D2,anzahl bra.s end ;das war's schon links1: move.w (A0),D0 roxl.w #1,D0 move.w words,D0 adda.l offset,A0 links2: roxl.w -(A0) dbf D0,links2 adda.l #80,A0 ;==> nchste Zeile dbf D1,links1 dbf D2,anzahl end: rts scroll_ou: movea.l 4(SP),A0 ;Adr. der Struktur move.w (A0),words move.l 2(A0),offset move.w 6(A0),zeilen movea.l 8(A0),A1 ;Adresse des Blocks movea.l A1,A3 move.w zeilen,D0 ;==> Zeilenzahl * 80 mulu.w #80,D0 ;==> anpassen cmpi.w #1,14(SP) beq.s add suba.l D0,A3 ;Adr der 1. Zeile bra.s cont add: adda.l D0,A3 ;Adr der letzten ;Zeile fr hochsrollen cont: move.l A1,anfang ;Anfangs-Adr. buffern move.l A3,ende ;last_line buffern move.w 12(SP),D3 ;Gesamtdurchlufe subq.w #1,D3 z1: move.w zeilen,D1 ;1. Schleife: ;Gesamtdurchlufe movea.l anfang,A2 ;Laufptr auf Anfang movea.l anfang,A1 ;Adr. der ersten ;und letzten Zeile laden move.l ende,A3 z: move.l 8(SP),D0 ;2. Schleife: ;zeilenweise pause: dbf D0,pause ;Pause... move.w words,D2 ;Worte pro Zeile cmpi.w #1,14(SP) beq.s wo ; nach unten: wu: move.w -82(A2),-(A2) ;==> 3.Schleife: ;Jede Zeile wortweise eine Zeile tiefer schieben dbf D2,wu adda.l offset,A2 suba.l #80,A2 ;==> nchste Zeile dbf D1,z move.w words,D2 ;letzte Zeile in erste ll: move.w -(A1),-(A3) dbf D2,ll dbf D3,z1 bra.s end2 ;fertig ;nach oben: wo: move.w 80(A2),(A2)+ ;==> ;jede Zeile wortweise eine Zeile hher schieben dbf D2,wo sub.l offset,A2 add.l #80,A2 ;==> nchste Zeile dbf D1,z move.w words,D2 fl: move.w (A1)+,(A3)+ ;erste Zeile in die letzte Zeile dbf D2,fl dbf D3,z1 end2: rts quelle: ds.p 1 anfang: ds.p 1 ende: ds.p 1 zeilen: ds.w 1 words: ds.w 1 offset: ds.l 1 .END . }_i1.. ^iDEMO LST F 2oTEXT LST F 4l#TEXT Q jNi=Q=TEXT S ieM+>TEXT H Uf]' ****************************************** ' ** ** ' ** DEMO-PROGRAMM ** ' ** ** ' ****************************************** ' @Text_install A$="ST-COMPUTER"+Chr$(0) Xs%=100 Ys%=100 Hidem ' Do X_neu%=Mousex Y_neu%=Mousey If X_neu%<>X% Or Y_neu%<>Y% Or Xs_alt%<>Xs% Or Ys_alt%<>Ys% Or Alpha<>Alpha_alt ' ' TEXT AN ALTER POSITION LSCHEN ' @Text_color(0,-1,0) @Text_exec(A$,X%,Y%) ' ' TEXT AN DIE NEUE POSITION SCHREIBEN ' @Text_parameter(Alpha,0,Xs%,Ys%) @Text_color(1,-1,0) @Text_exec(A$,X_neu%,Y_neu%) ' X%=X_neu% Y%=Y_neu% Xs_alt%=Xs% Ys_alt%=Ys% Alpha_alt=Alpha Endif ' If Mousek=1 Add Xs%,7 Add Ys%,7 Xs%=Min(600,Xs%) Ys%=Min(600,Ys%) Else If Mousek=2 Sub Xs%,7 Sub Ys%,7 Xs%=Max(0,Xs%) Ys%=Max(0,Ys%) Endif Endif ' B$=Inkey$ If B$="+" Add Alpha,15/180*Pi Else If B$="-" Sub Alpha,15/180*Pi Endif Endif ' Loop ' ************************************ ' * * ' * SCHNELLE VARIABLE TEXTAUSGABE * ' * * ' * VON * ' * * ' * M.MALICH E.GRAH * ' * * ' * 1989 * ' * * ' ************************************ ' Procedure Text_install Local Z%,Wert% Dim Text!(3500*8) Text_init%=Varptr(Text!(0)) Text_parameter%=Text_init%+4 Text_color%=Text_init%+8 Text_exec%=Text_init%+12 ' ************************************************ ' ** Entweder die Maschinenspracheroutinen ** ' ** werden von Diskette bzw. HD geladen, ** ' ************************************************ ' Bload "TEXT.B",Text_init% ' ************************************************ ' ** oder der Maschinencode wird aus den ** ' ** DATA-Zeilen eingelesen. ** ' ************************************************ Restore Text_daten T%=Text_init% Do Read Wert% Exit If Wert%=-1 Poke T%,Wert% Inc T% Loop ' ' Void C:Text_init%() Return ' Procedure Text_color(Col%,Mask%,Mode%) Void C:Text_color%(Col%,Mask%,Mode%) Return ' Procedure Text_parameter(Alpha,Kursiv%,X_size%,Y_size%) Void C:Text_parameter%(Sin(Alpha)*256,Cos(Alpha)*256,Kursiv%,X_size%,Y_size%) Return ' Procedure Text_exec(A$,X_pos%,Y_pos%) Void C:Text_exec%(L:Varptr(A$),X_pos%,Y_pos%) Return ' ' ' ************************************************* ' ** Die folgenden DATA-Zeilen werden nur ** ' ** bentigt, wenn man die Maschinensprache- ** ' ** routinen nicht von Diskette bzw. HD ldt. ** ' ************************************************* ' Text_daten: ' Data 78,250,0,226,78,250,1,116,78,250,1,34,34,111,0,4,76 Data 175,0,3,0,8,71,250,9,6,32,107,0,18,116,0,118,0,120 Data 0,122,0,69,250,9,12,124,0,28,25,103,0,0,178,188,60 Data 0,32,103,0,0,158,220,70,220,70,213,198,74,146,103 Data 226,36,82,82,138,20,26,107,0,0,138,22,26,24,26,26 Data 26,102,0,0,6,74,4,103,236,216,2,218,3,72,231,236,224 Data 60,3,205,211,224,70,212,70,60,5,205,211,224,70,216 Data 70,60,2,205,235,0,16,62,3,207,235,0,14,156,71,224 Data 70,60,70,60,2,205,235,0,10,62,3,207,235,0,12,220,71 Data 224,70,58,70,60,4,205,235,0,16,62,5,207,235,0,14,156 Data 71,224,70,56,70,201,235,0,10,203,235,0,12,218,68,224 Data 69,60,1,220,192,216,192,156,77,146,69,195,142,72,168 Data 80,66,0,38,160,3,76,223,7,55,20,4,22,5,96,0,255,124 Data 208,107,0,6,146,107,0,8,96,0,255,70,78,117,65,250 Data 8,78,67,250,0,208,66,152,112,0,114,0,18,17,52,1,148 Data 64,85,66,107,0,0,8,66,152,81,202,255,252,48,1,32,201 Data 18,25,178,60,0,255,102,248,74,41,255,254,102,242,74 Data 41,255,253,102,236,12,17,0,255,102,206,122,1,124,255 Data 126,0,96,0,0,8,76,175,0,224,0,4,160,0,67,250,7,250 Data 34,136,112,255,72,168,0,193,0,32,112,0,114,0,116,0 Data 118,0,8,5,0,0,103,0,0,4,112,1,8,5,0,1,103,0,0,4,114 Data 1,8,5,0,2,103,0,0,4,116,1,8,5,0,3,103,0,0,4,118,1 Data 72,168,0,15,0,24,78,117,65,250,7,162,76,175,0,31,0 Data 4,72,144,0,28,58,0,203,195,224,133,60,1,205,195,224 Data 134,62,1,207,196,224,135,50,71,62,0,207,196,224,135 Data 116,25,201,67,198,194,199,193,72,67,200,194,201,192 Data 72,68,72,168,2,248,0,6,78,117,33,8,11,0,4,4,0,0,252 Data 252,0,0,0,10,20,251,20,11,0,250,236,0,0,255,34,3,40 Data 5,0,0,246,251,10,0,0,13,40,5,0,0,246,251,10,0,0,255 Data 36,3,15,4,252,7,0,4,4,0,7,252,4,249,0,252,4,0,6,4 Data 4,7,0,4,252,0,0,11,40,0,227,0,0,255,37,3,11,15,29 Data 0,0,3,40,7,0,0,249,249,0,0,7,0,0,11,18,7,0,0,249,249 Data 0,0,7,0,0,255,38,18,22,252,0,0,249,252,252,253,0,252 Data 4,0,7,11,8,0,6,252,4,251,252,0,250,13,237,0,0,255 Data 39,8,40,5,0,0,246,251,10,0,0,255,40,6,11,253,9,0,11 Data 3,9,0,0,255,41,15,11,3,9,0,11,253,9,0,0,255,42,3,26 Data 16,0,0,0,11,18,0,16,0,0,3,18,16,16,0,0,3,34,16,240 Data 0,0,255,43,3,26,16,0,0,0,11,18,0,16,0,0,255,44,8,15 Data 0,5,4,0,0,251,253,252,1,4,254,0,0,0,255,45,3,26,15 Data 0,0,0,255,46,8,11,0,4,4,0,0,252,252,0,0,0,255,47,3 Data 11,15,29,0,0,255,48,3,15,0,21,4,4,7,0,4,252,0,235 Data 252,252,249,0,252,4,15,21,0,0,255,49,3,26,8,14,0,227 Data 0,0,255,50,3,30,0,6,4,4,7,0,4,252,0,250,241,237,15 Data 0,0,0,255,51,3,40,15,0,249,242,3,0,4,252,0,249,252 Data 252,249,0,252,4,0,0,255,52,3,15,11,25,0,0,14,20,0 Data 247,0,0,3,15,15,0,0,0,255,53,3,15,4,252,7,0,4,4,0 Data 7,252,4,245,0,0,14,15,0,0,0,255,54,3,22,4,4,7,0,4 Data 252,0,249,252,252,249,0,252,4,0,21,4,4,7,0,4,252,0 Data 0,255,55,3,40,15,0,245,227,0,0,255,56,3,15,0,7,4,4 Data 7,0,4,4,0,6,252,4,249,0,252,252,0,250,4,252,0,0,14 Data 26,4,252,0,249,252,252,249,0,252,4,0,0,255,57,3,15 Data 4,252,7,0,4,4,0,21,252,4,249,0,252,252,0,250,4,252 Data 11,0,0,0,255,58,8,25,0,5,4,0,0,251,252,0,0,0,8,15 Data 0,5,4,0,0,251,252,0,0,0,255,59,8,25,0,5,4,0,0,251 Data 252,0,0,0,8,15,0,5,4,0,0,251,253,252,1,4,254,0,0,0 Data 255,60,10,16,249,7,7,7,0,0,255,61,3,29,15,0,0,0,18 Data 23,241,0,0,0,255,62,11,30,7,249,249,249,0,0,255,63 Data 8,11,0,4,4,0,0,252,252,0,0,0,8,20,10,10,0,6,252,4 Data 249,0,252,252,7,0,3,253,251,243,0,0,255,65,3,11,0 Data 25,4,4,7,0,4,252,0,231,0,0,18,26,241,0,0,0,255,66 Data 3,11,0,29,11,0,4,252,0,250,252,252,245,0,0,0,14,26 Data 4,252,0,249,252,252,245,0,0,0,255,67,18,15,252,252 Data 249,0,252,4,0,21,4,4,7,0,4,252,0,0,255,68,3,11,0,29 Data 11,0,4,252,0,235,252,252,245,0,0,0,255,69,3,11,0,29 Data 15,0,0,0,14,26,245,0,0,0,3,11,15,0,0,0,255,70,3,11 Data 0,29,15,0,0,0,14,26,245,0,0,0,255,71,11,26,7,0,0,245 Data 252,252,249,0,252,4,0,21,4,4,7,0,4,252,0,0,255,72 Data 3,11,0,29,0,0,18,40,0,227,0,0,18,26,241,0,0,0,255 Data 73,7,11,7,0,0,0,11,11,0,29,0,0,7,40,7,0,0,0,255,74 Data 3,15,4,252,7,0,4,4,0,25,0,0,255,75,3,11,0,29,0,0,18 Data 40,249,242,248,0,0,0,11,26,7,241,0,0,255,76,3,40,0 Data 227,15,0,0,0,255,77,3,11,0,29,8,242,7,14,0,227,0,0 Data 255,78,3,11,0,29,15,227,0,29,0,0,255,79,3,15,0,21 Data 4,4,7,0,4,252,0,235,252,252,249,0,252,4,0,0,255,80 Data 3,11,0,29,11,0,4,252,0,250,252,252,245,0,0,0,255,81 Data 3,15,0,21,4,4,7,0,4,252,0,235,252,252,249,0,252,4 Data 0,0,14,15,4,252,0,0,255,82,3,11,0,29,11,0,4,252,0 Data 250,252,252,245,0,0,0,14,26,4,241,0,0,255,83,3,15 Data 4,252,7,0,4,4,0,7,252,4,249,0,252,4,0,6,4,4,7,0,4 Data 252,0,0,255,84,11,11,0,29,0,0,3,40,15,0,0,0,255,85 Data 3,40,0,231,4,252,7,0,4,4,0,25,0,0,255,86,3,40,8,227 Data 7,29,0,0,255,87,3,40,0,231,4,252,4,4,3,252,4,4,0,25 Data 0,0,255,88,3,40,15,227,0,0,3,11,15,29,0,0,255,89,3 Data 40,8,242,7,14,0,0,11,26,0,241,0,0,255,90,3,40,15,0 Data 241,227,15,0,0,0,255,97,3,15,0,7,4,4,7,0,4,252,0,0 Data 18,26,0,241,0,0,18,15,252,252,249,0,252,4,0,0,255 Data 98,3,11,0,29,0,0,3,22,4,4,7,0,4,252,0,249,252,252 Data 249,0,252,4,0,0,255,99,18,15,252,252,249,0,252,4,0 Data 7,4,4,7,0,4,252,0,0,255,100,18,15,252,252,249,0,252 Data 4,0,7,4,4,7,0,4,252,0,0,18,40,0,227,0,0,255,101,18 Data 15,252,252,249,0,252,4,0,7,4,4,7,0,4,252,0,252,241 Data 0,0,0,255,102,7,11,0,25,4,4,3,0,4,252,0,0,11,26,248 Data 0,0,0,255,103,3,5,4,252,7,0,4,4,0,21,0,0,18,22,252 Data 4,249,0,252,252,0,249,4,252,7,0,4,4,0,0,255,104,3 Data 11,0,29,0,0,3,22,4,4,7,0,4,252,0,245,0,0,255,105,7 Data 11,7,0,0,0,11,11,0,15,252,0,0,0,11,31,0,3,0,0,255 Data 106,5,5,4,252,3,0,4,4,0,21,0,0,16,31,0,3,0,0,255,107 Data 3,11,0,29,0,0,18,27,241,248,15,248,0,0,255,108,7,11 Data 7,0,0,0,11,11,0,29,252,0,0,0,255,109,3,11,0,15,0,0 Data 3,22,4,4,4,252,0,245,0,0,11,22,4,4,4,252,0,245,0,0 Data 255,110,3,11,0,15,0,0,3,22,4,4,7,0,4,252,0,245,0,0 Data 255,111,3,15,0,7,4,4,7,0,4,252,0,249,252,252,249,0 Data 252,4,0,0,255,112,3,1,0,25,0,0,3,22,4,4,7,0,4,252 Data 0,249,252,252,249,0,252,4,0,0,255,113,18,15,252,252 Data 249,0,252,4,0,7,4,4,7,0,4,252,0,0,18,26,0,231,0,0 Data 255,114,3,11,0,15,0,0,3,22,4,4,7,0,4,252,0,0,255,115 Data 3,15,4,252,7,0,4,4,252,4,248,0,253,3,4,4,7,0,4,252 Data 0,0,255,116,18,15,252,252,252,0,252,4,0,25,0,0,3,26 Data 6,0,0,0,255,117,3,26,0,245,4,252,7,0,4,4,0,0,18,11 Data 0,15,0,0,255,118,3,26,7,241,1,0,7,15,0,0,255,119,3 Data 26,0,245,4,252,4,4,4,252,4,4,0,11,0,0,255,120,3,26 Data 15,241,0,0,3,11,15,15,0,0,255,121,3,5,4,252,7,0,4 Data 4,0,21,0,0,3,26,0,245,4,252,7,0,4,4,0,0,255,122,3 Data 26,15,0,241,241,15,0,0,0,255,129,3,26,0,245,4,252 Data 7,0,4,4,0,0,18,11,0,15,0,0,7,28,0,3,0,0,14,28,0,3 Data 0,0,255,132,3,15,0,7,4,4,7,0,4,252,0,0,18,26,0,241 Data 0,0,18,15,252,252,249,0,252,4,0,0,7,28,0,3,0,0,14 Data 28,0,3,0,0,255,142,3,11,0,25,4,4,7,0,4,252,0,231,0 Data 0,18,26,241,0,0,0,7,43,0,3,0,0,14,43,0,3,0,0,255,148 Data 3,15,0,7,4,4,7,0,4,252,0,249,252,252,249,0,252,4,0 Data 0,7,28,0,3,0,0,14,28,0,3,0,0,255,153,3,15,0,21,4,4 Data 7,0,4,252,0,235,252,252,249,0,252,4,0,0,7,43,0,3,0 Data 0,14,43,0,3,0,0,255,154,3,40,0,231,4,252,7,0,4,4,0 Data 25,0,0,7,43,0,3,0,0,14,43,0,3,0,0,255,158,3,1,0,35 Data 4,4,7,0,4,252,0,250,252,252,253,0,0,0,14,26,4,252 Data 0,249,252,252,249,0,0,0,255,255,-1 ; ************************************ ; * * ; * SCHNELLE VARIABLE TEXTAUSGABE * ; * * ; * VON * ; * * ; * M.MALICH E.GRAH * ; * * ; ************************************ INIT_LINE_A = $A000 LINE_A = $A003 X1 = 38 PLANES = 24 LSTLIN = 32 ;*********************************** JMP INIT_POINTER JMP SET_PARAMETER JMP SET_COLOR MOVE.L 4(SP),A1 ; TEXT_ADRESSE MOVEM 8(SP),D0/D1 ; (X,Y)-KOORD LEA KURSIV,A3 MOVE.L 18(A3),A0 ; LINE_A0 BLOCK MOVEQ #0,D2 MOVEQ #0,D3 MOVEQ #0,D4 MOVEQ #0,D5 PLOT_CHAR: LEA POINTER,A2 MOVEQ #0,D6 MOVE.B (A1)+,D6 ; NEUES ZEICHEN BEQ FERTIG CMP.B #32,D6 ; BLANK ?? BEQ ZEICHEN_FERTIG ADD D6,D6 ; * 4 ADD D6,D6 ADD.L D6,A2 ; POINTER BERECHNEN TST.L (A2) ; ZEICHEN VORHANDEN ?? BEQ PLOT_CHAR MOVE.L (A2),A2 ADDQ.L #1,A2 NEW_POLYGON: MOVE.B (A2)+,D2 ; POLYGONSTART BMI ZEICHEN_FERTIG MOVE.B (A2)+,D3 POLYGON: MOVE.B (A2)+,D4 ; DRAW TO (D4,D5) MOVE.B (A2)+,D5 BNE NEXT TST.B D4 ; POLYGONENDE ?? BEQ NEW_POLYGON NEXT: ADD.B D2,D4 ADD.B D3,D5 MOVEM.L D0-D2/D4-D5/A0-A2,-(SP) MOVE D3,D6 ; FROM_Y MULS (A3),D6 ; * KURSIV ASR #8,D6 ADD D6,D2 ; + FROM_X = FROM_X MOVE D5,D6 ; TO_Y MULS (A3),D6 ; * KURSIV ASR #8,D6 ADD D6,D4 ; + TO_X = TO_X MOVE D2,D6 ; FROM_X MULS 16(A3),D6 ; * Y_COS MOVE D3,D7 ; FROM_Y MULS 14(A3),D7 ; * Y_SIN SUB D7,D6 ; - ASR #8,D6 MOVE D6,A6 ; = NEW FROM_X MOVE D2,D6 ; FROM_X MULS 10(A3),D6 ; * X_SIN MOVE D3,D7 ; FROM_Y MULS 12(A3),D7 ; * X_COS ADD D7,D6 ; + ASR #8,D6 MOVE D6,A5 ; = NEW FROM_Y MOVE D4,D6 ; TO_X MULS 16(A3),D6 ; * Y_COS MOVE D5,D7 ; TO_Y MULS 14(A3),D7 ; * Y_SIN SUB D7,D6 ; - ASR #8,D6 MOVE D6,A4 ; = NEW TO_X MULS 10(A3),D4 ; TO_X * X_SIN MULS 12(A3),D5 ; TO_Y * X_COS ADD D4,D5 ; + ASR #8,D5 ; = NEW TO_Y MOVE D1,D6 ADD D0,A6 ; + X ADD D0,A4 SUB A5,D6 ; Y - SUB D5,D1 EXG D1,A6 MOVEM D1/D6/A4/A6,X1(A0) DC.W LINE_A MOVEM.L (SP)+,D0-D2/D4-D5/A0-A2 MOVE.B D4,D2 MOVE.B D5,D3 BRA POLYGON ZEICHEN_FERTIG: ADD 6(A3),D0 ; + OFFSET_X SUB 8(A3),D1 ; + OFFSET_Y BRA PLOT_CHAR FERTIG: RTS ;*********************************** INIT_POINTER: LEA POINTER,A0 LEA ZEICHEN,A1 CLR.L (A0)+ MOVEQ #0,D0 LOOP: MOVEQ #0,D1 MOVE.B (A1),D1 MOVE D1,D2 SUB D0,D2 SUBQ #2,D2 BMI WEG LOOP_2: CLR.L (A0)+ DBRA D2,LOOP_2 WEG: MOVE D1,D0 MOVE.L A1,(A0)+ SUCHE_CHAR: MOVE.B (A1)+,D1 CMP.B #$FF,D1 BNE SUCHE_CHAR TST.B -2(A1) BNE SUCHE_CHAR TST.B -3(A1) BNE SUCHE_CHAR CMP.B #$FF,(A1) BNE LOOP MOVEQ #1,D5 ; COLOR MOVEQ #-1,D6 ; MASK MOVEQ #0,D7 ; GRAPHMODE BRA INIT_COLOR ;*********************************** SET_COLOR: MOVEM 4(SP),D5-D7 ; COLOR/MASK/MODE INIT_COLOR: DC.W INIT_LINE_A LEA LINE_A0,A1 MOVE.L A0,(A1) MOVEQ #-1,D0 MOVEM D0/D6/D7,LSTLIN(A0) MOVEQ #0,D0 MOVEQ #0,D1 MOVEQ #0,D2 MOVEQ #0,D3 BTST #0,D5 BEQ PLANE_1 MOVEQ #1,D0 PLANE_1: BTST #1,D5 BEQ PLANE_2 MOVEQ #1,D1 PLANE_2: BTST #2,D5 BEQ PLANE_3 MOVEQ #1,D2 PLANE_3: BTST #3,D5 BEQ PLANE_4 MOVEQ #1,D3 PLANE_4: MOVEM D0-D3,PLANES(A0) RTS ;*********************************** SET_PARAMETER: LEA KURSIV,A0 MOVEM 4(SP),D0-D4 ; PARAMETER_BLOCK MOVEM D2-D4,(A0) MOVE D0,D5 ; SIN MULS D3,D5 ; * SIZE_X ASR.L #8,D5 MOVE D1,D6 ; COS MULS D3,D6 ; * SIZE_X ASR.L #8,D6 MOVE D1,D7 ; COS MULS D4,D7 ; * SIZE_Y ASR.L #8,D7 MOVE D7,A1 MOVE D0,D7 ; SIN MULS D4,D7 ; * SIZE_Y ASR.L #8,D7 MOVEQ #25,D2 EXG D3,D4 MULU D2,D3 MULS D1,D3 ; * COS SWAP D3 ; /256/256 MULU D2,D4 MULS D0,D4 ; * SIN SWAP D4 ; /256/256 MOVEM D3-D7/A1,6(A0) RTS ;*********************************** ZEICHEN: DC.B $21,$08,$0B,$00,$04,$04,$00,$00,$FC,$FC,$00,$00 DC.B $00,$0A,$14,$FB,$14,$0B,$00,$FA,$EC,$00,$00,$FF DC.B $22,$03,$28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$0D DC.B $28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$FF,$24,$03 DC.B $0F,$04,$FC,$07,$00,$04,$04,$00,$07,$FC,$04,$F9 DC.B $00,$FC,$04,$00,$06,$04,$04,$07,$00,$04,$FC,$00 DC.B $00,$0B,$28,$00,$E3,$00,$00,$FF,$25,$03,$0B,$0F DC.B $1D,$00,$00,$03,$28,$07,$00,$00,$F9,$F9,$00,$00 DC.B $07,$00,$00,$0B,$12,$07,$00,$00,$F9,$F9,$00,$00 DC.B $07,$00,$00,$FF,$26,$12,$16,$FC,$00,$00,$F9,$FC DC.B $FC,$FD,$00,$FC,$04,$00,$07,$0B,$08,$00,$06,$FC DC.B $04,$FB,$FC,$00,$FA,$0D,$ED,$00,$00,$FF,$27,$08 DC.B $28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$FF,$28,$06 DC.B $0B,$FD,$09,$00,$0B,$03,$09,$00,$00,$FF,$29,$0F DC.B $0B,$03,$09,$00,$0B,$FD,$09,$00,$00,$FF,$2A,$03 DC.B $1A,$10,$00,$00,$00,$0B,$12,$00,$10,$00,$00,$03 DC.B $12,$10,$10,$00,$00,$03,$22,$10,$F0,$00,$00,$FF DC.B $2B,$03,$1A,$10,$00,$00,$00,$0B,$12,$00,$10,$00 DC.B $00,$FF,$2C,$08,$0F,$00,$05,$04,$00,$00,$FB,$FD DC.B $FC,$01,$04,$FE,$00,$00,$00,$FF,$2D,$03,$1A,$0F DC.B $00,$00,$00,$FF,$2E,$08,$0B,$00,$04,$04,$00,$00 DC.B $FC,$FC,$00,$00,$00,$FF,$2F,$03,$0B,$0F,$1D,$00 DC.B $00,$FF,$30,$03,$0F,$00,$15,$04,$04,$07,$00,$04 DC.B $FC,$00,$EB,$FC,$FC,$F9,$00,$FC,$04,$0F,$15,$00 DC.B $00,$FF,$31,$03,$1A,$08,$0E,$00,$E3,$00,$00,$FF DC.B $32,$03,$1E,$00,$06,$04,$04,$07,$00,$04,$FC,$00 DC.B $FA,$F1,$ED,$0F,$00,$00,$00,$FF,$33,$03,$28,$0F DC.B $00,$F9,$F2,$03,$00,$04,$FC,$00,$F9,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$FF,$34,$03,$0F,$0B,$19,$00 DC.B $00,$0E,$14,$00,$F7,$00,$00,$03,$0F,$0F,$00,$00 DC.B $00,$FF,$35,$03,$0F,$04,$FC,$07,$00,$04,$04,$00 DC.B $07,$FC,$04,$F5,$00,$00,$0E,$0F,$00,$00,$00,$FF DC.B $36,$03,$16,$04,$04,$07,$00,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$15,$04,$04,$07,$00,$04 DC.B $FC,$00,$00,$FF,$37,$03,$28,$0F,$00,$F5,$E3,$00 DC.B $00,$FF,$38,$03,$0F,$00,$07,$04,$04,$07,$00,$04 DC.B $04,$00,$06,$FC,$04,$F9,$00,$FC,$FC,$00,$FA,$04 DC.B $FC,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$FF,$39,$03,$0F,$04,$FC,$07 DC.B $00,$04,$04,$00,$15,$FC,$04,$F9,$00,$FC,$FC,$00 DC.B $FA,$04,$FC,$0B,$00,$00,$00,$FF,$3A,$08,$19,$00 DC.B $05,$04,$00,$00,$FB,$FC,$00,$00,$00,$08,$0F,$00 DC.B $05,$04,$00,$00,$FB,$FC,$00,$00,$00,$FF,$3B,$08 DC.B $19,$00,$05,$04,$00,$00,$FB,$FC,$00,$00,$00,$08 DC.B $0F,$00,$05,$04,$00,$00,$FB,$FD,$FC,$01,$04,$FE DC.B $00,$00,$00,$FF,$3C,$0A,$10,$F9,$07,$07,$07,$00 DC.B $00,$FF,$3D,$03,$1D,$0F,$00,$00,$00,$12,$17,$F1 DC.B $00,$00,$00,$FF,$3E,$0B,$1E,$07,$F9,$F9,$F9,$00 DC.B $00,$FF,$3F,$08,$0B,$00,$04,$04,$00,$00,$FC,$FC DC.B $00,$00,$00,$08,$14,$0A,$0A,$00,$06,$FC,$04,$F9 DC.B $00,$FC,$FC,$07,$00,$03,$FD,$FB,$F3,$00,$00,$FF DC.B $41,$03,$0B,$00,$19,$04,$04,$07,$00,$04,$FC,$00 DC.B $E7,$00,$00,$12,$1A,$F1,$00,$00,$00,$FF,$42,$03 DC.B $0B,$00,$1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5 DC.B $00,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC,$FC,$F5 DC.B $00,$00,$00,$FF,$43,$12,$0F,$FC,$FC,$F9,$00,$FC DC.B $04,$00,$15,$04,$04,$07,$00,$04,$FC,$00,$00,$FF DC.B $44,$03,$0B,$00,$1D,$0B,$00,$04,$FC,$00,$EB,$FC DC.B $FC,$F5,$00,$00,$00,$FF,$45,$03,$0B,$00,$1D,$0F DC.B $00,$00,$00,$0E,$1A,$F5,$00,$00,$00,$03,$0B,$0F DC.B $00,$00,$00,$FF,$46,$03,$0B,$00,$1D,$0F,$00,$00 DC.B $00,$0E,$1A,$F5,$00,$00,$00,$FF,$47,$0B,$1A,$07 DC.B $00,$00,$F5,$FC,$FC,$F9,$00,$FC,$04,$00,$15,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$48,$03,$0B,$00 DC.B $1D,$00,$00,$12,$28,$00,$E3,$00,$00,$12,$1A,$F1 DC.B $00,$00,$00,$FF,$49,$07,$0B,$07,$00,$00,$00,$0B DC.B $0B,$00,$1D,$00,$00,$07,$28,$07,$00,$00,$00,$FF DC.B $4A,$03,$0F,$04,$FC,$07,$00,$04,$04,$00,$19,$00 DC.B $00,$FF,$4B,$03,$0B,$00,$1D,$00,$00,$12,$28,$F9 DC.B $F2,$F8,$00,$00,$00,$0B,$1A,$07,$F1,$00,$00,$FF DC.B $4C,$03,$28,$00,$E3,$0F,$00,$00,$00,$FF,$4D,$03 DC.B $0B,$00,$1D,$08,$F2,$07,$0E,$00,$E3,$00,$00,$FF DC.B $4E,$03,$0B,$00,$1D,$0F,$E3,$00,$1D,$00,$00,$FF DC.B $4F,$03,$0F,$00,$15,$04,$04,$07,$00,$04,$FC,$00 DC.B $EB,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$50,$03 DC.B $0B,$00,$1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5 DC.B $00,$00,$00,$FF,$51,$03,$0F,$00,$15,$04,$04,$07 DC.B $00,$04,$FC,$00,$EB,$FC,$FC,$F9,$00,$FC,$04,$00 DC.B $00,$0E,$0F,$04,$FC,$00,$00,$FF,$52,$03,$0B,$00 DC.B $1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5,$00,$00 DC.B $00,$0E,$1A,$04,$F1,$00,$00,$FF,$53,$03,$0F,$04 DC.B $FC,$07,$00,$04,$04,$00,$07,$FC,$04,$F9,$00,$FC DC.B $04,$00,$06,$04,$04,$07,$00,$04,$FC,$00,$00,$FF DC.B $54,$0B,$0B,$00,$1D,$00,$00,$03,$28,$0F,$00,$00 DC.B $00,$FF,$55,$03,$28,$00,$E7,$04,$FC,$07,$00,$04 DC.B $04,$00,$19,$00,$00,$FF,$56,$03,$28,$08,$E3,$07 DC.B $1D,$00,$00,$FF,$57,$03,$28,$00,$E7,$04,$FC,$04 DC.B $04,$03,$FC,$04,$04,$00,$19,$00,$00,$FF,$58,$03 DC.B $28,$0F,$E3,$00,$00,$03,$0B,$0F,$1D,$00,$00,$FF DC.B $59,$03,$28,$08,$F2,$07,$0E,$00,$00,$0B,$1A,$00 DC.B $F1,$00,$00,$FF,$5A,$03,$28,$0F,$00,$F1,$E3,$0F DC.B $00,$00,$00,$FF,$61,$03,$0F,$00,$07,$04,$04,$07 DC.B $00,$04,$FC,$00,$00,$12,$1A,$00,$F1,$00,$00,$12 DC.B $0F,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$62,$03 DC.B $0B,$00,$1D,$00,$00,$03,$16,$04,$04,$07,$00,$04 DC.B $FC,$00,$F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF DC.B $63,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$64,$12,$0F,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$07,$04,$04,$07,$00,$04 DC.B $FC,$00,$00,$12,$28,$00,$E3,$00,$00,$FF,$65,$12 DC.B $0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04,$04,$07 DC.B $00,$04,$FC,$00,$FC,$F1,$00,$00,$00,$FF,$66,$07 DC.B $0B,$00,$19,$04,$04,$03,$00,$04,$FC,$00,$00,$0B DC.B $1A,$F8,$00,$00,$00,$FF,$67,$03,$05,$04,$FC,$07 DC.B $00,$04,$04,$00,$15,$00,$00,$12,$16,$FC,$04,$F9 DC.B $00,$FC,$FC,$00,$F9,$04,$FC,$07,$00,$04,$04,$00 DC.B $00,$FF,$68,$03,$0B,$00,$1D,$00,$00,$03,$16,$04 DC.B $04,$07,$00,$04,$FC,$00,$F5,$00,$00,$FF,$69,$07 DC.B $0B,$07,$00,$00,$00,$0B,$0B,$00,$0F,$FC,$00,$00 DC.B $00,$0B,$1F,$00,$03,$00,$00,$FF,$6A,$05,$05,$04 DC.B $FC,$03,$00,$04,$04,$00,$15,$00,$00,$10,$1F,$00 DC.B $03,$00,$00,$FF,$6B,$03,$0B,$00,$1D,$00,$00,$12 DC.B $1B,$F1,$F8,$0F,$F8,$00,$00,$FF,$6C,$07,$0B,$07 DC.B $00,$00,$00,$0B,$0B,$00,$1D,$FC,$00,$00,$00,$FF DC.B $6D,$03,$0B,$00,$0F,$00,$00,$03,$16,$04,$04,$04 DC.B $FC,$00,$F5,$00,$00,$0B,$16,$04,$04,$04,$FC,$00 DC.B $F5,$00,$00,$FF,$6E,$03,$0B,$00,$0F,$00,$00,$03 DC.B $16,$04,$04,$07,$00,$04,$FC,$00,$F5,$00,$00,$FF DC.B $6F,$03,$0F,$00,$07,$04,$04,$07,$00,$04,$FC,$00 DC.B $F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$70,$03 DC.B $01,$00,$19,$00,$00,$03,$16,$04,$04,$07,$00,$04 DC.B $FC,$00,$F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF DC.B $71,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$12,$1A,$00,$E7,$00 DC.B $00,$FF,$72,$03,$0B,$00,$0F,$00,$00,$03,$16,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$73,$03,$0F,$04 DC.B $FC,$07,$00,$04,$04,$FC,$04,$F8,$00,$FD,$03,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$74,$12,$0F,$FC DC.B $FC,$FC,$00,$FC,$04,$00,$19,$00,$00,$03,$1A,$06 DC.B $00,$00,$00,$FF,$75,$03,$1A,$00,$F5,$04,$FC,$07 DC.B $00,$04,$04,$00,$00,$12,$0B,$00,$0F,$00,$00,$FF DC.B $76,$03,$1A,$07,$F1,$01,$00,$07,$0F,$00,$00,$FF DC.B $77,$03,$1A,$00,$F5,$04,$FC,$04,$04,$04,$FC,$04 DC.B $04,$00,$0B,$00,$00,$FF,$78,$03,$1A,$0F,$F1,$00 DC.B $00,$03,$0B,$0F,$0F,$00,$00,$FF,$79,$03,$05,$04 DC.B $FC,$07,$00,$04,$04,$00,$15,$00,$00,$03,$1A,$00 DC.B $F5,$04,$FC,$07,$00,$04,$04,$00,$00,$FF,$7A,$03 DC.B $1A,$0F,$00,$F1,$F1,$0F,$00,$00,$00,$FF,$81,$03 DC.B $1A,$00,$F5,$04,$FC,$07,$00,$04,$04,$00,$00,$12 DC.B $0B,$00,$0F,$00,$00,$07,$1C,$00,$03,$00,$00,$0E DC.B $1C,$00,$03,$00,$00,$FF,$84,$03,$0F,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$12,$1A,$00,$F1,$00 DC.B $00,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$07 DC.B $1C,$00,$03,$00,$00,$0E,$1C,$00,$03,$00,$00,$FF DC.B $8E,$03,$0B,$00,$19,$04,$04,$07,$00,$04,$FC,$00 DC.B $E7,$00,$00,$12,$1A,$F1,$00,$00,$00,$07,$2B,$00 DC.B $03,$00,$00,$0E,$2B,$00,$03,$00,$00,$FF,$94,$03 DC.B $0F,$00,$07,$04,$04,$07,$00,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$00,$07,$1C,$00,$03,$00 DC.B $00,$0E,$1C,$00,$03,$00,$00,$FF,$99,$03,$0F,$00 DC.B $15,$04,$04,$07,$00,$04,$FC,$00,$EB,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$07,$2B,$00,$03,$00,$00,$0E DC.B $2B,$00,$03,$00,$00,$FF,$9A,$03,$28,$00,$E7,$04 DC.B $FC,$07,$00,$04,$04,$00,$19,$00,$00,$07,$2B,$00 DC.B $03,$00,$00,$0E,$2B,$00,$03,$00,$00,$FF,$9E,$03 DC.B $01,$00,$23,$04,$04,$07,$00,$04,$FC,$00,$FA,$FC DC.B $FC,$FD,$00,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$00,$00,$FF,$FF KURSIV: DC.W 0 SIZE_X: DC.W 0 SIZE_Y: DC.W 0 OFFSET_X: DC.W 0 OFFSET_Y: DC.W 0 X_SIN: DC.W 0 X_COS: DC.W 0 Y_SIN: DC.W 0 Y_COS: DC.W 0 LINE_A0: DC.L 0 POINTER: DS.L 256,0 END ; ************************************ ; * * ; * SCHNELLE VARIABLE TEXTAUSGABE * ; * * ; * VON * ; * * ; * M.MALICH E.GRAH * ; * * ; * (c) 1992 MAXON Computer GmbH * ; * * ; ************************************ GLOBL Text_Init GLOBL Text_Parameter GLOBL Text_Color GLOBL Text_Exec INIT_LINE_A = $A000 LINE_A = $A003 X1 = 38 PLANES = 24 LSTLIN = 32 ;*********************************** Text_Init: JMP INIT_POINTER Text_Parameter: JMP SET_PARAMETER Text_Color: JMP SET_COLOR Text_Exec: MOVE.L 4(SP),A1 ; TEXT_ADRESSE MOVEM 8(SP),D0/D1 ; (X,Y)-KOORD LEA KURSIV,A3 MOVE.L 18(A3),A0 ; LINE_A0 BLOCK MOVEQ #0,D2 MOVEQ #0,D3 MOVEQ #0,D4 MOVEQ #0,D5 PLOT_CHAR: LEA POINTER,A2 MOVEQ #0,D6 MOVE.B (A1)+,D6 ; NEUES ZEICHEN BEQ FERTIG CMP.B #32,D6 ; BLANK ?? BEQ ZEICHEN_FERTIG ADD D6,D6 ; * 4 ADD D6,D6 ADD.L D6,A2 ; POINTER BERECHNEN TST.L (A2) ; ZEICHEN VORHANDEN ?? BEQ PLOT_CHAR MOVE.L (A2),A2 ADDQ.L #1,A2 NEW_POLYGON: MOVE.B (A2)+,D2 ; POLYGONSTART BMI ZEICHEN_FERTIG MOVE.B (A2)+,D3 POLYGON: MOVE.B (A2)+,D4 ; DRAW TO (D4,D5) MOVE.B (A2)+,D5 BNE NEXT TST.B D4 ; POLYGONENDE ?? BEQ NEW_POLYGON NEXT: ADD.B D2,D4 ADD.B D3,D5 MOVEM.L D0-D2/D4-D5/A0-A2,-(SP) MOVE D3,D6 ; FROM_Y MULS (A3),D6 ; * KURSIV ASR #8,D6 ADD D6,D2 ; + FROM_X = FROM_X MOVE D5,D6 ; TO_Y MULS (A3),D6 ; * KURSIV ASR #8,D6 ADD D6,D4 ; + TO_X = TO_X MOVE D2,D6 ; FROM_X MULS 16(A3),D6 ; * Y_COS MOVE D3,D7 ; FROM_Y MULS 14(A3),D7 ; * Y_SIN SUB D7,D6 ; - ASR #8,D6 MOVE D6,A6 ; = NEW FROM_X MOVE D2,D6 ; FROM_X MULS 10(A3),D6 ; * X_SIN MOVE D3,D7 ; FROM_Y MULS 12(A3),D7 ; * X_COS ADD D7,D6 ; + ASR #8,D6 MOVE D6,A5 ; = NEW FROM_Y MOVE D4,D6 ; TO_X MULS 16(A3),D6 ; * Y_COS MOVE D5,D7 ; TO_Y MULS 14(A3),D7 ; * Y_SIN SUB D7,D6 ; - ASR #8,D6 MOVE D6,A4 ; = NEW TO_X MULS 10(A3),D4 ; TO_X * X_SIN MULS 12(A3),D5 ; TO_Y * X_COS ADD D4,D5 ; + ASR #8,D5 ; = NEW TO_Y MOVE D1,D6 ADD D0,A6 ; + X ADD D0,A4 SUB A5,D6 ; Y - SUB D5,D1 EXG D1,A6 MOVEM D1/D6/A4/A6,X1(A0) DC.W LINE_A MOVEM.L (SP)+,D0-D2/D4-D5/A0-A2 MOVE.B D4,D2 MOVE.B D5,D3 BRA POLYGON ZEICHEN_FERTIG: ADD 6(A3),D0 ; + OFFSET_X SUB 8(A3),D1 ; + OFFSET_Y BRA PLOT_CHAR FERTIG: RTS ;*********************************** INIT_POINTER: LEA POINTER,A0 LEA ZEICHEN,A1 CLR.L (A0)+ MOVEQ #0,D0 LOOP: MOVEQ #0,D1 MOVE.B (A1),D1 MOVE D1,D2 SUB D0,D2 SUBQ #2,D2 BMI WEG LOOP_2: CLR.L (A0)+ DBRA D2,LOOP_2 WEG: MOVE D1,D0 MOVE.L A1,(A0)+ SUCHE_CHAR: MOVE.B (A1)+,D1 CMP.B #$FF,D1 BNE SUCHE_CHAR TST.B -2(A1) BNE SUCHE_CHAR TST.B -3(A1) BNE SUCHE_CHAR CMP.B #$FF,(A1) BNE LOOP MOVEQ #1,D5 ; COLOR MOVEQ #-1,D6 ; MASK MOVEQ #0,D7 ; GRAPHMODE BRA INIT_COLOR ;*********************************** SET_COLOR: MOVEM 4(SP),D5-D7 ; COLOR/MASK/MODE INIT_COLOR: DC.W INIT_LINE_A LEA LINE_A0,A1 MOVE.L A0,(A1) MOVEQ #-1,D0 MOVEM D0/D6/D7,LSTLIN(A0) MOVEQ #0,D0 MOVEQ #0,D1 MOVEQ #0,D2 MOVEQ #0,D3 BTST #0,D5 BEQ PLANE_1 MOVEQ #1,D0 PLANE_1: BTST #1,D5 BEQ PLANE_2 MOVEQ #1,D1 PLANE_2: BTST #2,D5 BEQ PLANE_3 MOVEQ #1,D2 PLANE_3: BTST #3,D5 BEQ PLANE_4 MOVEQ #1,D3 PLANE_4: MOVEM D0-D3,PLANES(A0) RTS ;*********************************** SET_PARAMETER: LEA KURSIV,A0 MOVEM 4(SP),D0-D4 ; PARAMETER_BLOCK MOVEM D2-D4,(A0) MOVE D0,D5 ; SIN MULS D3,D5 ; * SIZE_X ASR.L #8,D5 MOVE D1,D6 ; COS MULS D3,D6 ; * SIZE_X ASR.L #8,D6 MOVE D1,D7 ; COS MULS D4,D7 ; * SIZE_Y ASR.L #8,D7 MOVE D7,A1 MOVE D0,D7 ; SIN MULS D4,D7 ; * SIZE_Y ASR.L #8,D7 MOVEQ #25,D2 EXG D3,D4 MULU D2,D3 MULS D1,D3 ; * COS SWAP D3 ; /256/256 MULU D2,D4 MULS D0,D4 ; * SIN SWAP D4 ; /256/256 MOVEM D3-D7/A1,6(A0) RTS ;*********************************** ZEICHEN: DC.B $21,$08,$0B,$00,$04,$04,$00,$00,$FC,$FC,$00,$00 DC.B $00,$0A,$14,$FB,$14,$0B,$00,$FA,$EC,$00,$00,$FF DC.B $22,$03,$28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$0D DC.B $28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$FF,$24,$03 DC.B $0F,$04,$FC,$07,$00,$04,$04,$00,$07,$FC,$04,$F9 DC.B $00,$FC,$04,$00,$06,$04,$04,$07,$00,$04,$FC,$00 DC.B $00,$0B,$28,$00,$E3,$00,$00,$FF,$25,$03,$0B,$0F DC.B $1D,$00,$00,$03,$28,$07,$00,$00,$F9,$F9,$00,$00 DC.B $07,$00,$00,$0B,$12,$07,$00,$00,$F9,$F9,$00,$00 DC.B $07,$00,$00,$FF,$26,$12,$16,$FC,$00,$00,$F9,$FC DC.B $FC,$FD,$00,$FC,$04,$00,$07,$0B,$08,$00,$06,$FC DC.B $04,$FB,$FC,$00,$FA,$0D,$ED,$00,$00,$FF,$27,$08 DC.B $28,$05,$00,$00,$F6,$FB,$0A,$00,$00,$FF,$28,$06 DC.B $0B,$FD,$09,$00,$0B,$03,$09,$00,$00,$FF,$29,$0F DC.B $0B,$03,$09,$00,$0B,$FD,$09,$00,$00,$FF,$2A,$03 DC.B $1A,$10,$00,$00,$00,$0B,$12,$00,$10,$00,$00,$03 DC.B $12,$10,$10,$00,$00,$03,$22,$10,$F0,$00,$00,$FF DC.B $2B,$03,$1A,$10,$00,$00,$00,$0B,$12,$00,$10,$00 DC.B $00,$FF,$2C,$08,$0F,$00,$05,$04,$00,$00,$FB,$FD DC.B $FC,$01,$04,$FE,$00,$00,$00,$FF,$2D,$03,$1A,$0F DC.B $00,$00,$00,$FF,$2E,$08,$0B,$00,$04,$04,$00,$00 DC.B $FC,$FC,$00,$00,$00,$FF,$2F,$03,$0B,$0F,$1D,$00 DC.B $00,$FF,$30,$03,$0F,$00,$15,$04,$04,$07,$00,$04 DC.B $FC,$00,$EB,$FC,$FC,$F9,$00,$FC,$04,$0F,$15,$00 DC.B $00,$FF,$31,$03,$1A,$08,$0E,$00,$E3,$00,$00,$FF DC.B $32,$03,$1E,$00,$06,$04,$04,$07,$00,$04,$FC,$00 DC.B $FA,$F1,$ED,$0F,$00,$00,$00,$FF,$33,$03,$28,$0F DC.B $00,$F9,$F2,$03,$00,$04,$FC,$00,$F9,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$FF,$34,$03,$0F,$0B,$19,$00 DC.B $00,$0E,$14,$00,$F7,$00,$00,$03,$0F,$0F,$00,$00 DC.B $00,$FF,$35,$03,$0F,$04,$FC,$07,$00,$04,$04,$00 DC.B $07,$FC,$04,$F5,$00,$00,$0E,$0F,$00,$00,$00,$FF DC.B $36,$03,$16,$04,$04,$07,$00,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$15,$04,$04,$07,$00,$04 DC.B $FC,$00,$00,$FF,$37,$03,$28,$0F,$00,$F5,$E3,$00 DC.B $00,$FF,$38,$03,$0F,$00,$07,$04,$04,$07,$00,$04 DC.B $04,$00,$06,$FC,$04,$F9,$00,$FC,$FC,$00,$FA,$04 DC.B $FC,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$FF,$39,$03,$0F,$04,$FC,$07 DC.B $00,$04,$04,$00,$15,$FC,$04,$F9,$00,$FC,$FC,$00 DC.B $FA,$04,$FC,$0B,$00,$00,$00,$FF,$3A,$08,$19,$00 DC.B $05,$04,$00,$00,$FB,$FC,$00,$00,$00,$08,$0F,$00 DC.B $05,$04,$00,$00,$FB,$FC,$00,$00,$00,$FF,$3B,$08 DC.B $19,$00,$05,$04,$00,$00,$FB,$FC,$00,$00,$00,$08 DC.B $0F,$00,$05,$04,$00,$00,$FB,$FD,$FC,$01,$04,$FE DC.B $00,$00,$00,$FF,$3C,$0A,$10,$F9,$07,$07,$07,$00 DC.B $00,$FF,$3D,$03,$1D,$0F,$00,$00,$00,$12,$17,$F1 DC.B $00,$00,$00,$FF,$3E,$0B,$1E,$07,$F9,$F9,$F9,$00 DC.B $00,$FF,$3F,$08,$0B,$00,$04,$04,$00,$00,$FC,$FC DC.B $00,$00,$00,$08,$14,$0A,$0A,$00,$06,$FC,$04,$F9 DC.B $00,$FC,$FC,$07,$00,$03,$FD,$FB,$F3,$00,$00,$FF DC.B $41,$03,$0B,$00,$19,$04,$04,$07,$00,$04,$FC,$00 DC.B $E7,$00,$00,$12,$1A,$F1,$00,$00,$00,$FF,$42,$03 DC.B $0B,$00,$1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5 DC.B $00,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC,$FC,$F5 DC.B $00,$00,$00,$FF,$43,$12,$0F,$FC,$FC,$F9,$00,$FC DC.B $04,$00,$15,$04,$04,$07,$00,$04,$FC,$00,$00,$FF DC.B $44,$03,$0B,$00,$1D,$0B,$00,$04,$FC,$00,$EB,$FC DC.B $FC,$F5,$00,$00,$00,$FF,$45,$03,$0B,$00,$1D,$0F DC.B $00,$00,$00,$0E,$1A,$F5,$00,$00,$00,$03,$0B,$0F DC.B $00,$00,$00,$FF,$46,$03,$0B,$00,$1D,$0F,$00,$00 DC.B $00,$0E,$1A,$F5,$00,$00,$00,$FF,$47,$0B,$1A,$07 DC.B $00,$00,$F5,$FC,$FC,$F9,$00,$FC,$04,$00,$15,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$48,$03,$0B,$00 DC.B $1D,$00,$00,$12,$28,$00,$E3,$00,$00,$12,$1A,$F1 DC.B $00,$00,$00,$FF,$49,$07,$0B,$07,$00,$00,$00,$0B DC.B $0B,$00,$1D,$00,$00,$07,$28,$07,$00,$00,$00,$FF DC.B $4A,$03,$0F,$04,$FC,$07,$00,$04,$04,$00,$19,$00 DC.B $00,$FF,$4B,$03,$0B,$00,$1D,$00,$00,$12,$28,$F9 DC.B $F2,$F8,$00,$00,$00,$0B,$1A,$07,$F1,$00,$00,$FF DC.B $4C,$03,$28,$00,$E3,$0F,$00,$00,$00,$FF,$4D,$03 DC.B $0B,$00,$1D,$08,$F2,$07,$0E,$00,$E3,$00,$00,$FF DC.B $4E,$03,$0B,$00,$1D,$0F,$E3,$00,$1D,$00,$00,$FF DC.B $4F,$03,$0F,$00,$15,$04,$04,$07,$00,$04,$FC,$00 DC.B $EB,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$50,$03 DC.B $0B,$00,$1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5 DC.B $00,$00,$00,$FF,$51,$03,$0F,$00,$15,$04,$04,$07 DC.B $00,$04,$FC,$00,$EB,$FC,$FC,$F9,$00,$FC,$04,$00 DC.B $00,$0E,$0F,$04,$FC,$00,$00,$FF,$52,$03,$0B,$00 DC.B $1D,$0B,$00,$04,$FC,$00,$FA,$FC,$FC,$F5,$00,$00 DC.B $00,$0E,$1A,$04,$F1,$00,$00,$FF,$53,$03,$0F,$04 DC.B $FC,$07,$00,$04,$04,$00,$07,$FC,$04,$F9,$00,$FC DC.B $04,$00,$06,$04,$04,$07,$00,$04,$FC,$00,$00,$FF DC.B $54,$0B,$0B,$00,$1D,$00,$00,$03,$28,$0F,$00,$00 DC.B $00,$FF,$55,$03,$28,$00,$E7,$04,$FC,$07,$00,$04 DC.B $04,$00,$19,$00,$00,$FF,$56,$03,$28,$08,$E3,$07 DC.B $1D,$00,$00,$FF,$57,$03,$28,$00,$E7,$04,$FC,$04 DC.B $04,$03,$FC,$04,$04,$00,$19,$00,$00,$FF,$58,$03 DC.B $28,$0F,$E3,$00,$00,$03,$0B,$0F,$1D,$00,$00,$FF DC.B $59,$03,$28,$08,$F2,$07,$0E,$00,$00,$0B,$1A,$00 DC.B $F1,$00,$00,$FF,$5A,$03,$28,$0F,$00,$F1,$E3,$0F DC.B $00,$00,$00,$FF,$61,$03,$0F,$00,$07,$04,$04,$07 DC.B $00,$04,$FC,$00,$00,$12,$1A,$00,$F1,$00,$00,$12 DC.B $0F,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$62,$03 DC.B $0B,$00,$1D,$00,$00,$03,$16,$04,$04,$07,$00,$04 DC.B $FC,$00,$F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF DC.B $63,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$64,$12,$0F,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$07,$04,$04,$07,$00,$04 DC.B $FC,$00,$00,$12,$28,$00,$E3,$00,$00,$FF,$65,$12 DC.B $0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04,$04,$07 DC.B $00,$04,$FC,$00,$FC,$F1,$00,$00,$00,$FF,$66,$07 DC.B $0B,$00,$19,$04,$04,$03,$00,$04,$FC,$00,$00,$0B DC.B $1A,$F8,$00,$00,$00,$FF,$67,$03,$05,$04,$FC,$07 DC.B $00,$04,$04,$00,$15,$00,$00,$12,$16,$FC,$04,$F9 DC.B $00,$FC,$FC,$00,$F9,$04,$FC,$07,$00,$04,$04,$00 DC.B $00,$FF,$68,$03,$0B,$00,$1D,$00,$00,$03,$16,$04 DC.B $04,$07,$00,$04,$FC,$00,$F5,$00,$00,$FF,$69,$07 DC.B $0B,$07,$00,$00,$00,$0B,$0B,$00,$0F,$FC,$00,$00 DC.B $00,$0B,$1F,$00,$03,$00,$00,$FF,$6A,$05,$05,$04 DC.B $FC,$03,$00,$04,$04,$00,$15,$00,$00,$10,$1F,$00 DC.B $03,$00,$00,$FF,$6B,$03,$0B,$00,$1D,$00,$00,$12 DC.B $1B,$F1,$F8,$0F,$F8,$00,$00,$FF,$6C,$07,$0B,$07 DC.B $00,$00,$00,$0B,$0B,$00,$1D,$FC,$00,$00,$00,$FF DC.B $6D,$03,$0B,$00,$0F,$00,$00,$03,$16,$04,$04,$04 DC.B $FC,$00,$F5,$00,$00,$0B,$16,$04,$04,$04,$FC,$00 DC.B $F5,$00,$00,$FF,$6E,$03,$0B,$00,$0F,$00,$00,$03 DC.B $16,$04,$04,$07,$00,$04,$FC,$00,$F5,$00,$00,$FF DC.B $6F,$03,$0F,$00,$07,$04,$04,$07,$00,$04,$FC,$00 DC.B $F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF,$70,$03 DC.B $01,$00,$19,$00,$00,$03,$16,$04,$04,$07,$00,$04 DC.B $FC,$00,$F9,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$FF DC.B $71,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$12,$1A,$00,$E7,$00 DC.B $00,$FF,$72,$03,$0B,$00,$0F,$00,$00,$03,$16,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$73,$03,$0F,$04 DC.B $FC,$07,$00,$04,$04,$FC,$04,$F8,$00,$FD,$03,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$FF,$74,$12,$0F,$FC DC.B $FC,$FC,$00,$FC,$04,$00,$19,$00,$00,$03,$1A,$06 DC.B $00,$00,$00,$FF,$75,$03,$1A,$00,$F5,$04,$FC,$07 DC.B $00,$04,$04,$00,$00,$12,$0B,$00,$0F,$00,$00,$FF DC.B $76,$03,$1A,$07,$F1,$01,$00,$07,$0F,$00,$00,$FF DC.B $77,$03,$1A,$00,$F5,$04,$FC,$04,$04,$04,$FC,$04 DC.B $04,$00,$0B,$00,$00,$FF,$78,$03,$1A,$0F,$F1,$00 DC.B $00,$03,$0B,$0F,$0F,$00,$00,$FF,$79,$03,$05,$04 DC.B $FC,$07,$00,$04,$04,$00,$15,$00,$00,$03,$1A,$00 DC.B $F5,$04,$FC,$07,$00,$04,$04,$00,$00,$FF,$7A,$03 DC.B $1A,$0F,$00,$F1,$F1,$0F,$00,$00,$00,$FF,$81,$03 DC.B $1A,$00,$F5,$04,$FC,$07,$00,$04,$04,$00,$00,$12 DC.B $0B,$00,$0F,$00,$00,$07,$1C,$00,$03,$00,$00,$0E DC.B $1C,$00,$03,$00,$00,$FF,$84,$03,$0F,$00,$07,$04 DC.B $04,$07,$00,$04,$FC,$00,$00,$12,$1A,$00,$F1,$00 DC.B $00,$12,$0F,$FC,$FC,$F9,$00,$FC,$04,$00,$00,$07 DC.B $1C,$00,$03,$00,$00,$0E,$1C,$00,$03,$00,$00,$FF DC.B $8E,$03,$0B,$00,$19,$04,$04,$07,$00,$04,$FC,$00 DC.B $E7,$00,$00,$12,$1A,$F1,$00,$00,$00,$07,$2B,$00 DC.B $03,$00,$00,$0E,$2B,$00,$03,$00,$00,$FF,$94,$03 DC.B $0F,$00,$07,$04,$04,$07,$00,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$FC,$04,$00,$00,$07,$1C,$00,$03,$00 DC.B $00,$0E,$1C,$00,$03,$00,$00,$FF,$99,$03,$0F,$00 DC.B $15,$04,$04,$07,$00,$04,$FC,$00,$EB,$FC,$FC,$F9 DC.B $00,$FC,$04,$00,$00,$07,$2B,$00,$03,$00,$00,$0E DC.B $2B,$00,$03,$00,$00,$FF,$9A,$03,$28,$00,$E7,$04 DC.B $FC,$07,$00,$04,$04,$00,$19,$00,$00,$07,$2B,$00 DC.B $03,$00,$00,$0E,$2B,$00,$03,$00,$00,$FF,$9E,$03 DC.B $01,$00,$23,$04,$04,$07,$00,$04,$FC,$00,$FA,$FC DC.B $FC,$FD,$00,$00,$00,$0E,$1A,$04,$FC,$00,$F9,$FC DC.B $FC,$F9,$00,$00,$00,$FF,$FF DATA KURSIV: DC.W 0 SIZE_X: DC.W 0 SIZE_Y: DC.W 0 OFFSET_X: DC.W 0 OFFSET_Y: DC.W 0 X_SIN: DC.W 0 X_COS: DC.W 0 Y_SIN: DC.W 0 Y_COS: DC.W 0 LINE_A0: DC.L 0 POINTER: DS.L 256 END void cdecl Text_Init(void); void cdecl Text_Color(int Col, int Mask, int Mode); void cdecl Text_Parameter(int Sin_Alpha, int Cos_Alpha, int Kursiv, int X_size, int Y_size); void cdecl Text_Exec(char *A, int X_pos, int Y_pos); .  `i^.. MEMORY_C  `i_EXGET `iALLOCA (`iMENGEN ,`i.  `i_..  `i^MEM_DEMOC {h`MEM_DEMOPRG hc MEM_DEMOPRJ hfMEM_MNGEC OhgeMEM_MNGEH h&MEM_MNGEO hN/********************************************************************/ /* Grundgerst zur Verwendung der MEM_MNGE-Speicherverwaltung. Der */ /* wesentliche Unterschied zur gewohnten Verwendung ist die Anfangs */ /* erforderlich Beschaffung eines zu verwaltenden Bereiches und die */ /* Initialisierung des Memory-Managers damit. Zum Programmende wird */ /* der anfangs allokierte Speicher wieder dem Betriebssystem ber- */ /* geben. */ /* */ /* Autor: Hans-Jrgen Richstein */ /* (c) 1992 MAXON Computer GmbH */ /********************************************************************/ #include #include #include /* Fr 'Malloc' und 'Mfree', unter ANSI-C */ /* auch als 'malloc', 'coreleft' und 'free' */ /* in zu finden... */ #include "MEM_MNGE.H" void main() { char *mein_puffer; long puffer_groesse; char *testpuffer,*temp; /* Zu */ long *langwort_array; /* Demonstrationszwecken */ mein_puffer = NULL; puffer_groesse = (long) Malloc(-1L) - 50000L; /* Malloc(-1L) liefert grten freien Speicherbereich */ /* und entspricht 'coreleft()' unter ANSI-C. Dem Rest */ /* der Welt lassen wir 50000 Bytes. */ if (puffer_groesse > 0) mein_puffer = (char *) Malloc(puffer_groesse); if ((mein_puffer != NULL) && (init_memory_manager(mein_puffer,puffer_groesse) == 0L)) { /* Alles Paletti, jetzt kann's los gehen. Die Speicherver- waltung wird nun genauso benutzt, wie die des Betriebs- systems oder von Turbo-C. Z.B.: */ testpuffer = (char *) hjr_malloc(20); /* . . */ langwort_array = (long *) hjr_calloc(30,sizeof(long)); /* Feld fr 30 'Longs' */ /* . . */ temp = hjr_realloc(testpuffer,50); /* Um 30 Bytes vergrern */ if (temp != NULL) testpuffer = temp; /* Knnte ja nicht geklappt haben */ /* . . */ hjr_free(testpuffer); /* . . */ } Mfree(mein_puffer); /* Am Schlu wird der gesamte Speicher an */ /* das Betriebssystem zurckgegeben */ } ` 0*6`` h>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@# Z3 ^ k # d Ј<.@# `Jy ^g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN@? 9 2g @N 9 6g @NN?<LNA/ rb$fp` B!@C "#HE#J Bp$_NuH8&JmJN&A &P(H`(K&S gn g&"+tc&+`  KN(  KN$H JLNu// (N(N$H g"B@N J$_(NuH>O$H&N(" g.tb&IHWHTC JNPOo oN,H&P "of:Ыn2* lo "JANR"  oN$H` .A"of "Ҁn*`*  ofD".C of4ЁЫn**, NN *J  NN$H "MN"  NN`L*J N~$H g>"M N MN>`.l* ol "J oTHN"  oN JO L|8Nu/ O$H gHWHoCNXPO / oN`pO $_Nuo Bh\HNu0THNur€gRlr`rҀ to NuH8$o&o0(fI"$pВ&`I"p0$rҀ&LNuC `"Qc f INuH $H(&tnAN\N$  JNP`  JNFLNuC""(#A!@ NuH0$H&N"P gG8e&pn "(Ge e G8 cp`8%C (Gfר$H`%C$ *Af ")Ӫ$pL Nu/ $HN B$_NuH8pN&ּ"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu/ /?<HNA\O @$_Nu/ /?<INA\O$_Nur  "0p  mem_demo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o mem_mnge.o mem_demo (mem_mnge.h) pcstdlib.lib pctoslib.lib /*************************************************************************/ /* Memory Manager */ /* ================ */ /* */ /* Funktionen zur effektiven Verwaltung eines Freispeicher-Heaps, ins- */ /* besondere vorteilhaft bei Verwendung vieler kleiner dynamisch erfor- */ /* derlicher Speicherbereiche, wie sie in Datenstrukturen wie Listen und */ /* Bumen oft erforderlich sind. */ /* */ /* Autor : Hans-Jrgen Richstein */ /* Konrad-Adenauer Str. 19 */ /* 6750 Kaiserslautern */ /* Tel.: 0631/22253 */ /* */ /* (c) 1992 MAXON Computer GmbH */ /*************************************************************************/ #include #include #include #include "MEM_MNGE.H" /* Prototypen der exportierten Funktionen */ /*********************** Datenstrukturen *********************************/ #define MEM_BLOCK struct memory_header MEM_BLOCK /* Header der Freispeicherbereiche */ { /* =============================== */ MEM_BLOCK *next; /* Freispeicher an der nchsthheren Adresse */ long size; /* Gre dieses Speicherblocks (incl. Header)*/ char data[]; /* Rest des Blocks folgt hier */ }; typedef struct /* Header fr vergebenen Speicher > 64 KB */ { /* ====================================== */ long size; /* Gre des Blocks (incl. Header) */ int mark; /* Markierung (immer 0) */ char user_block[]; /* Hier beginnt der vom User nutzbare Bereich*/ } LARGE_BLOCK; typedef struct /* Header fr vergebenen Speicher < 64 KB */ { /* ====================================== */ unsigned int size; /* Gre des Blocks (incl. Header) */ char user_block[]; /* Hier beginnt der vom User nutzbare Bereich*/ } SMALL_BLOCK; /**************** Prototypen der internen Funktionen *********************/ void remove_from_list(MEM_BLOCK *block); void get_block_data (void *block, MEM_BLOCK **block_start, long *block_size, long *size_of_user_data); void *make_user_block(MEM_BLOCK *block, long block_size); void *shrink_block(void *block, long old_size, long new_size); void split_block(MEM_BLOCK *block, long size_of_first); long actual_size(long desired_size); long insert_into_list(MEM_BLOCK *block,long size); MEM_BLOCK *find_previous_block(MEM_BLOCK *block); /******************* Verwaltungsinformationen ****************************/ static MEM_BLOCK head; /* Listenkopf, dummy-Header mit size = 0 */ static char *start_of_buffer, /* Anfang und Ende des verwalteten Be- */ *end_of_buffer; /* reichs zur Plausibilittskontrolle der*/ /* mit 'hjr_free' zurckgegebenen Blcke */ /*-----------------------------------------------------------------------*/ long init_memory_manager(void *start_adress,long size) /*************************************************************************/ /* Eingabe: Zeiger auf den zu verwaltenden Speicherbereich und die Lnge */ /* dieses Bereiches */ /* Effekt : Die internen Verwaltungsstrukturen werden initialisiert */ /* Wert : 0 = Alles Paletti, -1 = Es konnte nicht initialisiert werden */ /*************************************************************************/ { if ((size < sizeof(MEM_BLOCK)) || (start_adress == NULL)) return -1; else { ((MEM_BLOCK *) start_adress)->next = NULL; ((MEM_BLOCK *) start_adress)->size = size; head.next = (MEM_BLOCK *) start_adress; start_of_buffer = (char *) start_adress; end_of_buffer = (char *) start_adress + size; head.size = 0; return 0; } } /*-----------------------------------------------------------------------*/ void *hjr_malloc(long desired_size) /*************************************************************************/ /* Eingabe: Die gewnschte Speichergre */ /* Effekt : Es wird der erste passende Bereich ('First Fit' Verfahren) */ /* auf die gewnschte Gre gestutzt und verbleibender Speicher */ /* wieder an die Freispeicherverkettung eingehngt. */ /* Wert : Ein void-Zeiger auf den allokierten Bereich. Ist kein aus- */ /* reichend groer Speicher vorhanden, wird ein Nullzeiger zu- */ /* rckgegeben */ /*************************************************************************/ { MEM_BLOCK *current_block,*previous_block; void *desired_block; long allocated_size; desired_block = NULL; if (desired_size >= 0) { allocated_size = actual_size(desired_size); current_block = head.next; previous_block = &head; while ((current_block != NULL) && (current_block->size < allocated_size)) { previous_block = current_block; current_block = current_block->next; } if (current_block != NULL) { if (current_block->size - allocated_size < sizeof(MEM_BLOCK)) allocated_size = current_block->size; /* Aufteilen lohnt */ else /* nicht... */ split_block(current_block,allocated_size); previous_block->next = current_block->next; desired_block = make_user_block(current_block,allocated_size); } } return desired_block; } /*-----------------------------------------------------------------------*/ void *hjr_calloc(long number_of_items, long size_of_items) /*************************************************************************/ /* Eingabe: Eine Anzahl von Elementen und die Gre eines dieser Elemente*/ /* Effekt : Es wird ein 'hjr_malloc' mit Anzahl * Gre Bytes durchge- */ /* fhrt. Falls dies erfolgreich war, wird der Bereich mit Null */ /* initialisiert */ /* Wert : siehe 'hjr_malloc' */ /*************************************************************************/ { void *block; long total_size; total_size = number_of_items * size_of_items; block = hjr_malloc(total_size); if (block != NULL) memset(block,0,total_size); return block; } /*-----------------------------------------------------------------------*/ void *hjr_realloc(void *block, long new_size) /*************************************************************************/ /* Eingabe: Der Zeiger auf einen bereits allokierten Block und eine neue */ /* Gre fr diesen Bereich. */ /* Effekt : Bei einer Verkleinerung wird der frei werdende Speicher */ /* wieder in die Freispeicherverkettung einsortiert, bei einer */ /* Vergrerung wird zunchst versucht, Speicher der zustzlich */ /* erforderlichen Gre direkt hinter dem bestehenden Block zu */ /* finden. Gelingt dies nicht, wird ein neuer Block der ge- */ /* wnschten Gre allokiert und die bestehenden Daten werden */ /* in den neuen Bereich verschoben. */ /* Wert : Der Zeiger auf den neuen Bereich. Kann kein Speicher der an- */ /* geforderten Gre reallokiert werden, so wird ein Nullzeiger */ /* geliefert. Der ursprngliche Block bleibt dann unverndert. */ /*************************************************************************/ { MEM_BLOCK *returned_block, *previous, *following; void *temp_block; long current_size, size_of_reallocation, size_of_enlargement, data_size; size_of_reallocation = actual_size(new_size); if ((block != NULL) && (size_of_reallocation >= sizeof(MEM_BLOCK))) { get_block_data(block,&returned_block,¤t_size,&data_size); if (size_of_reallocation > current_size) /* Block vergrern */ /* ================= */ { previous = find_previous_block(returned_block); following = previous->next; if (((char *) returned_block + current_size == (char *) following) && (current_size + following->size >= size_of_reallocation)) { size_of_enlargement = current_size + following->size; previous->next = following->next; if ( (current_size < 0xffff) && (size_of_reallocation > 0xffff)) memcpy((char *) block + sizeof(LARGE_BLOCK) - sizeof(SMALL_BLOCK), block,data_size); block = shrink_block(returned_block, size_of_enlargement, size_of_reallocation); } else if (((char *) returned_block == (char *) previous + previous->size) && (current_size + previous->size >= size_of_reallocation)) { size_of_enlargement = current_size + previous->size; remove_from_list(previous); temp_block = block; block = make_user_block(previous,size_of_reallocation); memcpy(block,temp_block,data_size); shrink_block(previous, size_of_enlargement, size_of_reallocation); } else if (((char *) returned_block + current_size == (char *) following) && ((char *) returned_block == (char *) previous + previous->size) && (current_size + previous->size + following->size >= size_of_reallocation)) { size_of_enlargement = current_size + previous->size + following->size; previous->next = following->next; remove_from_list(previous); temp_block = block; block = make_user_block(previous,size_of_reallocation); memcpy(block,temp_block,data_size); shrink_block(previous, size_of_enlargement, size_of_reallocation); } else { temp_block = block; block = hjr_malloc(new_size); if (block != NULL) { memcpy(block,temp_block,data_size); hjr_free(temp_block); } } } else if (size_of_reallocation < current_size) /* Block verkleinern */ { /* ================= */ if ((current_size > 0xffff) && (size_of_reallocation < 0xffff)) memcpy(((SMALL_BLOCK *) returned_block)->user_block, block,data_size); shrink_block(returned_block, current_size, size_of_reallocation); } } return block; } /*-----------------------------------------------------------------------*/ long hjr_free(void *block) /*************************************************************************/ /* Eingabe: Der Zeiger auf einen allokierten Block. */ /* Effekt : Soweit mglich, wird mittels einer Plausibilittskontrolle */ /* geprft, ob es sich tatschlich um einen vorher allokierten */ /* Block handelt. Wenn ja, wird dieser in die Freispeicherver- */ /* kettung eingehngt. */ /* Wert : 0 = Alles Paletti, -1 = Block konnte nicht angenommen werden */ /*************************************************************************/ { MEM_BLOCK *returned_block; long size, dummy; if (block != NULL) { get_block_data(block,&returned_block,&size,&dummy); return insert_into_list(returned_block,size); } else return -1; } /*-----------------------------------------------------------------------*/ long hjr_coreleft(void) /*************************************************************************/ /* Eingabe: -- */ /* Effekt : -- */ /* Wert : Die nutzbare Gre des grten freien Speicherbereichs */ /*************************************************************************/ { MEM_BLOCK *block; long size_of_largest; size_of_largest = 0; block = &head; while (block->next != NULL) { if (block->size > size_of_largest) size_of_largest = block->size; block = block->next; } return size_of_largest - ((size_of_largest < 0xFFFFL) ? sizeof(SMALL_BLOCK) : sizeof(LARGE_BLOCK)); } /*-----------------------------------------------------------------------*/ long hjr_total_coreleft(void) /*************************************************************************/ /* Eingabe: -- */ /* Effekt : -- */ /* Wert : Die Summe der nutzbaren Gren aller freien Speicherbereiche */ /*************************************************************************/ { MEM_BLOCK *block; long total; block = head.next; total = 0L; while (block != NULL) { total += block->size - ((block->size < 0xFFFFL) ? sizeof(SMALL_BLOCK) : sizeof(LARGE_BLOCK)); block = block->next; } return total; } /*-----------------------------------------------------------------------*/ long hjr_number_of_fragments(void) /*************************************************************************/ /* Eingabe: -- */ /* Effekt : -- */ /* Wert : Die Anzahl der Freipeicherfragmente */ /*************************************************************************/ { MEM_BLOCK *block; long total; block = &head; total = 0L; while (block->next != NULL) { total++; block = block->next; } return total; } /*-----------------------------------------------------------------------*/ /*************************************************************************/ /* Interne Funktionen */ /*************************************************************************/ static void *make_user_block(MEM_BLOCK *block, long block_size) /*************************************************************************/ /* Eingabe: Zeiger auf einen (ehemaligen) Freispeicherbereich und die */ /* Lnge des vergebenen Blocks. */ /* Effekt : Der Block wird zur Vergabe mit dem der Gre entsprechenden */ /* Header versehen, also in einen 'Userblock' verwandelt. */ /* Wert : Der void-Zeiger auf den tatschlich nutzbaren Bereich. */ /*************************************************************************/ { if (block_size > 0xFFFF) { ((LARGE_BLOCK *) block)->size = block_size; ((LARGE_BLOCK *) block)->mark = 0; return (void *) &(((LARGE_BLOCK *) block)->user_block); } else { ((SMALL_BLOCK *) block)->size = (unsigned int) block_size; return (void *) &(((SMALL_BLOCK *) block)->user_block); } } /*-----------------------------------------------------------------------*/ static long actual_size(long desired_size) /*************************************************************************/ /* Eingabe: Die gewnschte Gre */ /* Effekt : -- */ /* Wert : Die tatschlich zuzuweisende Gre incl. Verwaltungsbereich */ /*************************************************************************/ { long size; if (desired_size & 1L) /* Ungerade ? */ desired_size++; /* ... gibt's nicht */ size = desired_size + ((desired_size < 0xFFFEL) ? sizeof(SMALL_BLOCK) : sizeof(LARGE_BLOCK)); if (size < (long) sizeof(MEM_BLOCK)) size = sizeof(MEM_BLOCK); return size; } /*-----------------------------------------------------------------------*/ static void get_block_data (void *block, MEM_BLOCK **block_start, long *block_size, long *size_of_user_data) /*************************************************************************/ /* Eingabe: Zeiger auf einen zurckgegebenen Block und die Adressen von */ /* Variablen fr einen Zeiger, Blockgre und Datenbereichsgre*/ /* Effekt : In die Variable 'block_start' wird der tatschliche Beginn */ /* des Blocks geschrieben, in 'block_size' die Gre des gesam- */ /* ten Blocks und in 'size_of_user_data' die Gre des Daten- */ /* bereichs. */ /* Wert : -- */ /*************************************************************************/ { if (*((int *) block - 1) == 0) { *block_start = (MEM_BLOCK *) ((LARGE_BLOCK *) block - 1); *block_size = ((LARGE_BLOCK *) *block_start)->size; *size_of_user_data = *block_size - sizeof(LARGE_BLOCK); } else { *block_start = (MEM_BLOCK *) ((SMALL_BLOCK *) block - 1); *block_size = (long) ((SMALL_BLOCK *) *block_start)->size; *size_of_user_data = *block_size - sizeof(SMALL_BLOCK); } } /*-----------------------------------------------------------------------*/ static MEM_BLOCK *find_previous_block(MEM_BLOCK *block) /*************************************************************************/ /* Eingabe: Zeiger auf einen Speicherbereich */ /* Effekt : -- */ /* Wert : Zeiger auf den letzten freien Speicherblock, der vor der */ /* bergebenen Adresse liegt. */ /*************************************************************************/ { MEM_BLOCK *previous; previous = &head; while ((previous->next < block) && (previous->next != NULL)) previous = previous->next; return previous; } /*-----------------------------------------------------------------------*/ static void *shrink_block(void *block, long old_size, long new_size) /*************************************************************************/ /* Eingabe: Ein Zeiger auf einen bel. Block, dessen bisherige Gre und */ /* die neue (kleinere) Gre. */ /* Effekt : Falls der verbleibende Rest zur Aufnahme eines MEM_BLOCK- */ /* Headers ausreicht, wird er wie ein zuvor allokierter Block */ /* prpariert und dann freigegeben, also in die Freispeicherver-*/ /* kettung einverleibt. */ /* Wert : Der verkleinerte Block als 'Userblock'. */ /*************************************************************************/ { if (old_size - new_size >= (long) sizeof(MEM_BLOCK)) { hjr_free(make_user_block((MEM_BLOCK *) ((char *) block + new_size), old_size - new_size)); return make_user_block(block,new_size); } else return make_user_block(block,old_size); } /*-----------------------------------------------------------------------*/ static void split_block(MEM_BLOCK *block, long size_of_first) /*************************************************************************/ /* Eingabe: Zeiger auf einen Freispeicherbereich und die gewnschte Lnge*/ /* des ersten der beiden entstehenden Blcke. */ /* Effekt : Der neu entstehende zweite Freispeicherbereich wird mit der */ /* sich ergebenden Gre und der Adresses des folgenden Blocks */ /* initialisiert. Dementsprechend wird der erste Block mit der */ /* neuen Gre und der Adresse des neuen zweiten Blocks als */ /* Folgeblock aktualisiert */ /* Wert : -- */ /*************************************************************************/ { MEM_BLOCK *second_block; second_block = (MEM_BLOCK *) (((char *) block) + size_of_first); second_block->next = block->next; second_block->size = block->size - size_of_first; block->size = size_of_first; block->next = second_block; } /*-----------------------------------------------------------------------*/ static long insert_into_list(MEM_BLOCK *block, long size) /*************************************************************************/ /* Eingabe: Ein Zeiger auf einen zuknftigen, daher evt. nicht initiali- */ /* sierten Freispeicherblock und (deswegen extra) dessen Lnge. */ /* Effekt : Zunchst wird geprft, ob sich aus Adresse und Lnge keine */ /* Kollisionsprobleme mit vorherigem und nachfolgendem Freispei-*/ /* cher ergeben. In dem Fall passiert nichts. Ansonsten wird */ /* versucht, aus dem gegebenen Block und dem davor- und/oder da-*/ /* hinterliegenden Freispeicher einen zusammenhngenden Block zu*/ /* erzeugen. */ /* Wert : -1 = o.g. Kollisionsproblem ist aufgetreten */ /* 0 = alles in Ordnung */ /*************************************************************************/ { MEM_BLOCK *previous,*following; previous = find_previous_block(block); following = previous->next; if ( ( (following != NULL) /* Plausibilittskontrolle */ && ((MEM_BLOCK *) ((char *) block + size) > following)) || (size < (long) sizeof(MEM_BLOCK)) || (block < (MEM_BLOCK *) ((char *) previous + previous->size)) || ((char *) block < start_of_buffer) || ((char *) block + size > end_of_buffer)) return -1; /* Diesen Block nehmen wir nicht */ else { block->size = size; if ((MEM_BLOCK *) ((char *) previous + previous->size) == block) { previous->size += size; block = previous; } else { block->size = size; block->next = following; previous->next = block; } if ((MEM_BLOCK *) ((char *) block + block->size) == following) { block->size += following->size; block->next = following->next; } return 0; } } /*-----------------------------------------------------------------------*/ static void remove_from_list(MEM_BLOCK *block) /*************************************************************************/ /* Eingabe: Ein Zeiger auf einen initialisierten Freispeicherblock. */ /* Effekt : Der Block wird aus der Freispeicherverkettung entfernt */ /* Wert : -- */ /*************************************************************************/ { MEM_BLOCK *previous; previous = find_previous_block(block); previous->next = block->next; block->next = NULL; } /*-----------------------------------------------------------------------*/ /**************************************************************/ /* MEM_MNGE.H */ /* ============ */ /* */ /* Prototypen der Funktionen, die zur Verwendung des neuen */ /* "Memory Managers" erforderlich sind. Diese mssen mit */ /* '#include "MEM_MNGE.H"' in das eigene Programm eingebunden */ /* werden. In der Projektdatei mu dann lediglich der Objekt- */ /* code durch einfgen einer Zeile 'MEM_MNGE.O' bekannt ge- */ /* macht werden. */ /**************************************************************/ long init_memory_manager(void *start_adress, long size); long hjr_total_coreleft(void); long hjr_number_of_fragments(void); long hjr_coreleft(void); long hjr_free(void *block); void *hjr_malloc(long desired_size); void *hjr_calloc(long number_of_items, long size_of_items); void *hjr_realloc(void *block, long new_size); N,/ rb$fp` B!@C"#HE#J Bp$_NuH8&JmJN&A&P(H`(K&S gn g&"+tc&+`  KN(  KN$H JLNu// (N(N$H g"B@N J$_(NuH>O$H&N(" g.tb&IHWHTC JNPOo oN,H&P "of:Ыn2* lo "JAN"  oN$H` .A"of "Ҁn*`*  ofD".C of4ЁЫn**, NN*J  NN$H "MN"  NN`L*J N$H g>"M N MN`.l* ol "J oTHN"  oN JO L|8Nu/ O$H gHWHoCNPO / oN`pO $_NupA` l ( P"flt`t" Nu yp` lr`r$(Ђ P"fNuAp`R P"fNuo Bh\HNu0THNur€gRlr`rҀ to NuH8$o&o0(fI"$pВ&`I"p0$rҀ&LNuC`"Qc f INuH $H(&tnANN  JN`  JNLNuC""(#A!@ NuH0$H&N"P gG8e&pn "(Gee G8cp`8%C (Gfר$H`%C$ *Af ")Ӫ$pL Nu/ $HN B$_Nu   4    " 8 R    $   , (    $ :        $  H     hjr_realloc end_of_bufferremove_from_listinsert_into_list hjr_coreleft_lmul hjr_calloc hjr_mallocget_block_data shrink_blockhjr_number_of_fragmentsstart_of_bufferinit_memory_managermemcpyhjr_freememsetheadhjr_total_coreleft split_blockmake_user_blockfind_previous_block actual_size. `i..  `i^EXGET C nh EXGET H zhAEG_DEMO PRJ YhEXGET O phnEG_DEMO C ih]EG_DEMO TOS xh/* --------------------------------------------------------------- Funktion exget zum einlesen von Strings Autor: Helmut Lehmkuhl, Vogelpothsweg 96, 4600 Dortmund 50 (c) 1992 MAXON Computer GmbH --------------------------------------------------------------- */ #include #include #include #include #include #define TRUE 1 #define FALSE 0 void exget(char **wort, int laenge,int dfstr, int schalter) { char y, *zwwort; int schleife, i, z, ende, insert; zwwort = *wort; if( dfstr == 1 ) { i = 0; while( zwwort[i] != '\0' && i < (laenge - 1) ) { putch(zwwort[i]); i++; } if( i < (laenge - 2) ) laenge = i + 1; ende = i; } else { i = 0; ende = 0; } insert = FALSE; Cursconf(1, 0); Cursconf(3, 0); if( schalter == 1 ) { printf("\033j"); printf("\033Y\067\040 AP: %3d AL: %3d ML: %3d", i + 1, ende + 1, laenge); printf("\033k"); } while ( (z = evnt_keybd()) != 7181 ) { switch (z) { case 3592 : /* Backspace gedrckt */ if( i > 0 ) { if( i == ende ) { printf("\b \b"); i--; ende--; if ( i < 0 ) i = 0; } else /* Fall fr Backspace in der Mitte der Eingabe */ { printf("\b \b"); i--; for( schleife = i; schleife < ( ende - 1 ); schleife++) { zwwort[schleife] = zwwort[schleife+1]; printf("%c", zwwort[schleife]); } printf(" \b"); ende--; schleife = ende; while( schleife != i ) { printf("\b"); schleife--; } /* while( schleife != i ) */ } /* if( i == ende ) */ } /* if( i > 0 ) */ else printf("\a"); break; case 21375 : /* Delete gedrckt */ if( i != ende ) /* Nur der Fall fr Delete in der Mitte */ { printf(" \b"); for( schleife = i; schleife < ( ende - 1 ); schleife++) { zwwort[schleife] = zwwort[schleife+1]; printf("%c", zwwort[schleife]); } printf(" \b"); ende--; schleife = ende; while( schleife != i ) { printf("\b"); schleife--; } } /* if( i != ende ) */ else printf("\a"); break; case 20992 : /* INSERT gedrckt */ if( insert == TRUE ) { insert = FALSE; Cursconf(3, 0); } else { insert = TRUE; Cursconf(2, 0); } break; case 19200 : /* Pfeil links gedrckt */ if( i > 0 ) { printf("\b"); i--; } else printf("\a"); break; case 19712 : /* Pfeil rechts gedrckt */ if( i < ende ) { printf("%c", zwwort[i]); i++; } else printf("\a"); break; case 18176 : /* CLR/HOME gedrckt */ case 19252 : /* Shift Pfeil links gedrckt */ /* An den Anfang des Eingabestrings springen */ while( i > 0 ) { printf("\b"); i--; } break; case 18231 : /* Shift CLR/HOME gedrckt */ case 19766 : /* Shift Pfeil rechts gedrckt */ /* An das Ende des Eingabestrings springen */ while( i < ende ) { printf("%c", zwwort[i]); i++; } break; case 283 : /* ESCAPE gedrckt */ /* Eingabe von neuem beginnen */ while( i < ende ) { printf(" "); i++; } while( i > 0 ) { printf("\b \b"); i--; } ende = 0; break; default : y = (char) z; if( isprint(y) ) { if( ende < (laenge - 1) || (insert == FALSE && i != ende) ) { if( insert == FALSE ) { putch(y); zwwort[i] = y; if( i == ende ) ende++; i++; } else /* Buchstaben in Mitte einfgen */ { putch(y); for( schleife = ende; schleife > i; schleife--) zwwort[schleife] = zwwort[schleife-1]; zwwort[i] = y; i++; ende++; for( schleife = i; schleife < ende; schleife++) printf("%c", zwwort[schleife]); schleife = ende; while( schleife != i ) { printf("\b"); schleife--; } } /* if( insert == FALSE ) */ } /* if( ende < (laenge - 1) ) */ else printf("\a"); } /* if( isprint(y) ) */ } /* switch (z) */ if( schalter == 1 ) { printf("\033j"); printf("\033Y\067\040 AP: %3d AL: %3d ML: %3d", i + 1, ende + 1, laenge); printf("\033k"); } } /* while( (z = evnt_keybd()) != 7181 ) */ zwwort[ende] = '\0'; *wort = zwwort; if( schalter == 1 ) printf("\033j\033Y\067\040 \033k"); Cursconf(0, 0); return; } void exget(char **wort, int laenge, int dfstr, int schalter); eg_demo.tos ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o exget.o eg_demo (exget.h) pcstdlib.lib pcextlib.lib pctoslib.lib pcgemlib.libN2H8]O$H?@?B&P|f6BC` 30HNRC30g roAmpo@lrC?A:`BC:BF2pNIBApN`\0|K4grn0|Gghn|g| g<`|G7gh|g `|Mg|6gL|gԐ|gx`dJCoCfA)NSCSEJClBC`A)NSC>`pp3pH?A-NTORGpE@mA*NSE>` A+NSGGf`Cg|A*N>`pp3pH?A-NTORGpE@mA*NSE>` A+NSGGf`6|fBF`|BApN`JCoA+NSC`Co30H?A-NTO`A+NSCJCn`30H?A-NTORCCn`A2NRCCn` A)NSCJCnBE`/HNJ@gpo@m JFfpCgjJFfHN0CfRERC`XHN>`ppSGGm0RCRE>`3pH?A-NTORGGn>` A+NSGGf`A0N of( LN?/pE?rC?AN\OA&NN>| fjB3P$ ofA4NBAB@N\OLNujY7 AP: %3d AL: %3d ML: %3dk %c jY7 k$6  v &,   \exgetprintf evnt_keybdputchisprintCursconf/* --------------------------------------------------------------- Demo zur Exget-Routine Autor: Helmut Lehmkuhl, Vogelpothsweg 96, 4600 Dortmund 50 (c) 1992 MAXON Computer GmbH --------------------------------------------------------------- */ #include #include #include #include"exget.h" main() { char *eing; printf("\033EBitte geben Sie einen String ein: "); eing = "Dies ist eine Probe"; exget(&eing, 20, 1, 1); printf("\n\nIhre Eingabe war : %s\n", eing); getch(); Crawcin(); return(0); } `Z``X>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#J3N k #T Ј<.@#PJyNg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON.0 J"LN? 9g @N 9g @NN?<LNAH8]O$H?@?B&P|f6BC` 30HNRC30g roAmpo@lrC?A:`BC:BF2pNIBApNt`\0|K4grn0|Gghn|g| g<`|G7gh|g `|Mg|6gL|gԐ|gx`dJCoCfA)NSCSEJClBC`A)NSC>`pp3pH?A-NTORGpE@mA*NSE>` A+NtSGGf`Cg|A*N\>`pp3pH?A-NBTORGpE@mA*N.SE>` A+N SGGf`6|fBF`|BApN4`JCoA+NSC`Co30H?A-NTO`A+NSCJCn`30H?A-NTORCCn`A2NRCCn` A)NSCJCnBE`/HN >J@gpo@m JFfpCgjJFfHNZ0CfRERC`XHND>`ppSGGm0RCRE>`3pH?A-NTORGGn>` A+NSGGf`A0N of( LN?/pE?rC?AN\OA&NN >| fjB3P$ ofA4NBAB@N \OLNuYOANr.?trpAN/ASNTXON 8N pB@XONuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/YOM,C Hza(XOXO,_NuH@B@H@CraJ@kNu.Vp`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.GD3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ &yB g/ &S?<INA\O`&yF g/ &S?<INA\O`&_NuJ@k|A0|NuB@Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#09pf/ ?<NATO$_J@f#pNuBypNu/ ???<NAXO0$_Nu/ ?<NATO$_Nu/ ???<NN\O$_Nup`/ 3t@@A"CvB@22220<"<NBA20$_Nut22 jY7 AP: %3d AL: %3d ML: %3dk %c jY7 kEBitte geben Sie einen String ein: Dies ist eine Probe Ihre Eingabe war : %s r  h &@&  ~.<D . )`i..  `i^ALLOCA O әhDALLOCA S ҙhN  _0 TN   alloca ; alloca() reserviert Platz auf dem Stack ; Die aufrufende Funktion darf keine Regist- ; ervariablen verwenden ! ; Autor: Roman Hodek ; (c) 1992 MAXON Computer alloca: move.l (a7)+,a0 ; Rcksprungadr. move.w (a7),d0 suba.l d0,a7 move.l a7,d0 addq.l #2,d0 jmp (a0) . -`i..  `i^MENGEN C hMENGEN O hhM_DEMO C XhM_DEMO PRJ chM_DEMO TOS hvM_EXT H h}M_TYP H h/*----------------------------------------------------------------*/ /* Mengen-Bibliothek */ /* */ /* Autor: K. Rindfrey */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include "m_typ.h" #define BPI 16 /* Bits pro int . */ /* Zwei Makros zum Ansprechen eines Elements e: */ #define BSINDEX(e) ((e) / BPI) /* Liefert den Index fuer bitset[] . */ #define ELEMMASK(e) (0x01 << ((e) % BPI)) /* Zum Maskieren des e repraesentierenden * Bits in bitset[BSINDEX(e)] . */ BitSetDefType *bs_newsettype(mine, maxe) int mine, maxe; /* * Liefert Zeiger auf neuen Mengentyp mit mine als kleinst * moeglichem und maxe als groesst moeglichem Element. * Sinnvoll nur, wenn mine < maxe ( wird nicht geprueft ). */ { BitSetDefType *bsdp; /* Zeiger auf Mengentyp. */ unsigned msk = 0, card; /* Maske, Kardinalitaet. */ bsdp = (BitSetDefType *) Malloc((long)sizeof(BitSetDefType)); if(bsdp == NULL) return(NULL); card = maxe - mine + 1; /* Max. Kardinalitaet . */ bsdp->arrlen = card / BPI; /* Laenge von bitset[] . */ if(card % BPI != 0){ /* Kardinalitaet kein Viel- */ (bsdp->arrlen)++; /* faches von BPI --> Maske */ msk = (0x01 << card % BPI) - 1; /* Maske berechnen . */ } bsdp->maxcard = card; bsdp->minelem = mine; bsdp->maxelem = maxe; bsdp->mask = msk; return(bsdp); } BitSetType *bs_createset(bsd) BitSetDefType *bsd; /* * Erzeugt neue, leere Menge vom Typ *bsd. * Rueckgabe : Zeiger auf die Menge. */ { BitSetType *bset; /* Zeiger auf Menge. */ register unsigned *ip, /* Zeiger auf bitset[]. */ i; /* Schleifenzaehler. */ long s; /* Speichergroesse. */ s = sizeof(BitSetType) + (bsd->arrlen * sizeof(int)); bset = (BitSetType *) Malloc(s); ip = bset->bitset; for(i = 0; i < bsd->arrlen; i++) *ip++ = 0; /* Alles = 0 --> leere Menge. */ bset->bsdef = bsd; /* Zeiger auf Mengendefinition. */ return(bset); } int bs_2setop(bs1, bs2, erg, opid) BitSetType *bs1, *bs2, *erg; BS_OpId opid; /* Gewuenschte Operation. */ /* * Fuehrt Mengenoperation mit 2 Operanden aus : * *bs1 *bs2 --> *erg . * Die drei Mengentypen muessen gleich sein. Rueckgabe * FALSE, falls falsche Mengentypen, sonst TRUE. */ { BitSetDefType *bsd; /* Zeiger auf Mengentyp . */ register unsigned *ip1, *ip2, *ipe,/* Zeiger auf bitsets. */ i; /* Schleifenzaehler. */ bsd = bs1->bsdef; if((bsd != bs2->bsdef) || (bsd != erg->bsdef)) return(FALSE); /* --> Typen stimmen nicht ueberein ! */ else{ ip1 = bs1->bitset; /* Zeiger auf die bitsets. */ ip2 = bs2->bitset; ipe = erg->bitset; switch(opid){ case BS_UNION : /* Vereinigungsmenge. */ for(i = 0; i < bsd->arrlen; i++) *ipe++ = *ip1++ | *ip2++; return(TRUE); case BS_INTERSECT : /* Schnittmenge. */ for(i = 0; i < bsd->arrlen; i++) *ipe++ = *ip1++ & *ip2++; return(TRUE); case BS_DIFFERENCE : /* Differenzmenge. */ for(i = 0; i < bsd->arrlen; i++) *ipe++ = *ip1++ & ~(*ip2++); return(TRUE); } } return(FALSE); } static int wbitcount(w) register unsigned w; /* * Zaehlt die in w gesetzten Bits. */ { register int i, /* Schleifenzaehler. */ count = 0; /* Zaehlt die Bits. */ for(i = 0; i < BPI; i++){ if((w & 0x01) != 0)/* Bit 0 in w gesetzt ? */ count++; /* Dann Zaehler erhoehen. */ w >>= 1; /* w nach rechts shiften. */ } return(count); } int bs_1setop(bsp, opid) BitSetType *bsp; BS_OpId opid; /* Gewuenschte Operation */ /* * Fuehrt Mengenoperationen mit 1 Operanden (bsp) aus. */ { register unsigned i, /* Schleifenzaehler. */ *ip, /* Zeigt auf bitset[]. */ count = 0; /* Fuer Kardinalitaet. */ static int wbitcount(register unsigned w); ip = bsp->bitset; switch(opid){ case BS_CARDINAL : /* Kardinalitaet berechnen. */ for(i = 0; i < (bsp->bsdef->arrlen); i++) count += wbitcount(*ip++); return((int)count); case BS_COMPLEMENT : /* Komplement berechnen. */ for(i = 0; i < (bsp->bsdef->arrlen) - 1; i++){ *ip = ~(*ip); ip++; } *ip = ~(*ip) & (bsp->bsdef->mask); /* !! Maskieren !! */ return(TRUE); } return(FALSE); } int bs_elemop(e, bsp, opid) int e; BitSetType *bsp; BS_OpId opid; /* Gewuenschte Operation. */ /* * Fuehrt Operationen mit einem Element e und einer * Menge (bsp) als Operanden durch. */ { register BitSetDefType *bsdp; bsdp = bsp->bsdef; e -= bsdp->minelem; if((e < 0) || (e > bsdp->maxcard)) return(FALSE); else{ switch(opid){ case BS_INCLUDE : /* Element einfuegen. */ (bsp->bitset[BSINDEX(e)]) |= ELEMMASK(e); return(TRUE); case BS_EXCLUDE : /* Element entfernen. */ (bsp->bitset[BSINDEX(e)]) &= ~ELEMMASK(e); return(TRUE); case BS_ISELEMENT : /* Pruefe Element-von. */ if((ELEMMASK(e) & (bsp->bitset[BSINDEX(e)])) != 0) return(TRUE); else return(FALSE); } } return(FALSE); } int bs_cmpset(bs1, bs2, opid) BitSetType *bs1, *bs2; /* Operanden. */ BS_OpId opid; /* Gewuenschte Operation. */ /* * Fuert Vergleichsoperationen aus. */ { register unsigned i, /* Schleifenzaehler. */ *ip1, *ip2; /* Zeiger auf bitset[]. */ register BitSetDefType *bsdp;/* Zeiger auf Mengendef. */ if((bsdp = bs1->bsdef) != bs2->bsdef) return(FALSE); else{ ip1 = bs1->bitset; ip2 = bs2->bitset; switch(opid){ case BS_ISSUBSET : /* Pruefe Teilmenge. */ for(i = 0; i < bsdp->arrlen; i++) if((*ip1++ & ~(*ip2++)) != 0) return(FALSE); return(TRUE); case BS_ISEQUAL : /* Pruefe Gleichheit. */ for(i = 0; i < bsdp->arrlen; i++) if(*ip1++ != *ip2++) return(FALSE); return(TRUE); } } return(FALSE); } unsigned bs_maxcard(bs) BitSetType *bs; /* * Liefert maximale Kardinalitaet. */ { return(bs->bsdef->maxcard); } N>4bH8:BCp N f`.0DR@2I0t@g RPvrkSC1@1D1E1CL8Nu// $Hv6փX NCB@`BYR@Re $_&Nu/ / &o $PfTfPXHXIXK4JBg SBgSBg&`:BA`0Y6RARe`$BA`0Y6RARe`BA` 0F@X6RARep`B@&_$_Nu/BA4`v@JCgRAHRB|m0&NuH0$HBCG2QAgSAg`>BD` 0N@RD RPe0`(BD` 0F@6TKRDp RP@e2FAh6p`B@L Nu"PiJ@mibx4WBg SBg&SBgD`fr4H…HBi4H…HԂp(`Br4H…HBiFA4H…HԂp(` r4H…HBi4H…HԂp(gpNuB@Nu/ $Pf8XHXI4]BgSBg`(BA` 0F@XfRARe`BA`0Yf RARep`B@$_Nu"P0)Nu  >   j" >F wbitcount bs_cmpset bs_elemop bs_1setop bs_2setop bs_maxcard bs_createsetMalloc bs_newsettype/*----------------------------------------------------------------*/ /* Demo zur Mengen-Bibliothek */ /* */ /* Autor: K. Rindfrey */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include "m_typ.h" #include "m_ext.h" void prsc(bs) /* print set of char. */ register *bs; { register unsigned i, m; m = bs_maxcard(bs); printf("{ "); for(i = 0; i < m; i++) if(bs_iselem(i, bs)) printf("%c ", i); printf("}\n"); } int main() { BitSetDefType *setofchar; /* Mengentyp fuer char. */ BitSetType *bs1, *bs2, *bs3; char i; void prsc(register *bs); setofchar = bs_newsettype(0,255); /* Typ definieren. */ bs1 = bs_createset(setofchar); /* 3 Mengen dieses */ bs2 = bs_createset(setofchar); /* Typs erzeugen. */ bs3 = bs_createset(setofchar); for(i = 'a'; i <= 'p'; i++) bs_incl(i, bs1); /* bs1 = {'a', ... , 'p'} */ for(i = 'k'; i <= 'y'; i++) bs_incl(i, bs2); /* bs2 = {'k', ... , 'y'} */ printf("bs1 = "); prsc(bs1); printf("bs2 = "); prsc(bs2); bs_union(bs1, bs2, bs3); printf("bs1 vereinigt mit bs2 = ");prsc(bs3); bs_inters(bs1, bs2, bs3); printf("bs1 geschnitten mit bs2 = bs3 = ");prsc(bs3); printf("Ist dies (bs3) Teilmenge von bs1 ? "); if(bs_issubset(bs3, bs1)) printf("Ja\n"); else printf("Nein\n"); printf("bs3 hat %d Elemente\n", bs_card(bs3)); bs_diff(bs1, bs2, bs3); printf("bs1 - bs2 = "); prsc(bs3); printf("Weiter mit bel. Taste...\n"); gemdos(0x01); return(0); } m_demo.tos ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o mengen.o m_demo (m_typ.h, m_ext.h) pcstdlib.lib pctoslib.lib pcgemlib.lib `.``6>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#(3, k #2 Ј<.@#.Jy,g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ONr0 J"LN ? 9g @N 9g @NN?<LNAH8:BCp N f`.0DR@2I0t@g RPvrkSC1@1D1E1CL8Nu// $Hv6փX NzCB@`BYR@Re $_&Nu/ / &o $PfTfPXHXIXK4JBg SBgSBg&`:BA`0Y6RARe`$BA`0Y6RARe`BA` 0F@X6RARep`B@&_$_Nu/BA4`v@JCgRAHRB|m0&NuH0$HBCG2QAgSAg`>BD` 0N@RD RPe0`(BD` 0F@6TKRDp RP@e2FAh6p`B@L Nu"PiJ@mibx4WBg SBg&SBgD`fr4H…HBi4H…HԂp(`Br4H…HBiFA4H…HԂp(` r4H…HBi4H…HԂp(gpNuB@Nu/ $Pf8XHXI4]BgSBg`(BA` 0F@XfRARe`BA`0Yf RARep`B@$_Nu"P0)NuH0$HN6G KNBD`r J0NJ@g ?AN|TORDDbANlL NuH<2<B@Nl(HN$H LN&H LN(Hva`r JHNR<povk`r KHNR<yoKA N JNNAN KN@/ B@"K JNnXOAN LN$/ p"K JNRXOA1N LNARNp"J LNJ@g AwN`A{Np LN?AN|TO/ p"K JNXOANd LNANVp?N TOB@L<NuA(p"@ "By^A1B3^3`O"Nu/ Hz?<&NN\O$_Nu/YOM,C Hza(XOXO,_NuH@B@H@CraJ@kNu.Vp`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ &y g/ &S?<INA\O`&y$ g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"##N#RNA$yR yNN/ /?<HNA\O @$_Nu{ %c } bs1 = bs2 = bs1 vereinigt mit bs2 = bs1 geschnitten mit bs2 = bs3 = Ist dies (bs3) Teilmenge von bs1 ? Ja Nein bs3 hat %d Elemente bs1 - bs2 = Weiter mit bel. Taste... xxxr  Z@&  ~. /* M_EXT.H --- extern Deklarationen der BITSET-Funktionen * und einige Makros */ BitSetDefType *bs_newsettype(int min, int max); BitSetType *bs_createset(BitSetDefType *bsd); int bs_2setop(BitSetType *bs1,BitSetType *bs2,BitSetType *erg, BS_OpId opid); int bs_1setop(BitSetType *bsp,BS_OpId opid); int bs_elemop(int e,BitSetType *bsp,BS_OpId opid); int bs_cmpset(BitSetType *bs1,BitSetType *bs2,BS_OpId opid); unsigned bs_maxcard(BitSetType *bs); /* * Folgende define's dienen der besseren Handhabung * der BITSET-Funktionen : */ #define bs_union(s1,s2,u) bs_2setop(s1,s2,u,BS_UNION) #define bs_inters(s1,s2,i) bs_2setop(s1,s2,i,BS_INTERSECT) #define bs_diff(s1,s2,d) bs_2setop(s1,s2,d,BS_DIFFERENCE) #define bs_card(s) bs_1setop(s,BS_CARDINAL) #define bs_complement(s) bs_1setop(s,BS_COMPLEMENT) #define bs_isequal(s1,s2) bs_cmpset(s1,s2,BS_ISEQUAL) #define bs_issubset(s1,s2) bs_cmpset(s1,s2,BS_ISSUBSET) #define bs_incl(e,s) bs_elemop(e,s,BS_INCLUDE) #define bs_excl(e,s) bs_elemop(e,s,BS_EXCLUDE) #define bs_iselem(e,s) bs_elemop(e,s,BS_ISELEMENT) /* M_TYP.H --- Typefinitionen fuer Bitsets */ /* * BitSetDefType --- Enthaelt Informationen des Mengentyps. * !!! Interne Struktur - Nicht darauf zugreifen !!! */ typedef struct { unsigned arrlen; /* Laenge von bitset[]. */ unsigned maxcard; /* Max. Kardinalitaet. */ int minelem; /* Kleinstes moegliche * Element. */ int maxelem; /* Groesstes moegliche * Element. */ unsigned mask; /* Zum Maskieren des letzten * Feldes in bitset[]. */ } BitSetDefType; /* * BitSetType --- Datentyp fuer Mengen. * !!! Interne Struktur - Nicht darauf zugreifen !!! */ typedef struct { BitSetDefType *bsdef; /* Zeigt auf Definition des * Mengentyps. */ unsigned bitset[]; /* Menge als Bitmuster. */ } BitSetType; /* * BS_OpId --- Code fuer die moeglichen Mengenoperationen. */ typedef enum { BS_UNION, BS_INTERSECT, BS_DIFFERENCE, BS_INCLUDE, BS_EXCLUDE, BS_ISELEMENT, BS_ISEQUAL, BS_ISSUBSET, BS_CARDINAL, BS_COMPLEMENT } BS_OpId; #define TRUE 1 #define FALSE 0 . <`i.. SPEICHER =`iMOVEDIAL L`iBFORCE ]`iDIALOG c`iMALLOC k`iVAR_EDIT o`i. @`i.. ;`iMEM_DEMOPRJ jhMEM_DEMOC :hMEM O nhMEM H =hMEM C 6hyMEM_DEMOPRG Dh mem_demo.prg .C [ -Y ] .L [ -L -Y ] .S [ -Y ] = pcstart.o pcframe.o mem.o mem_demo (mem.h) pcstdlib.lib pctoslib.lib pcgemlib.lib/* Testprogramm zu den Routinen zur Speicherverwaltung * * Autor: Klaus Elsbernd, Hilgardring 32, 6750 Kaiserslautern * (c) 1992 MAXON Computer GmbH */ #include #include #include "mem.h" extern int handle, work_out[]; void gem_prg (void) { int i, j; register MYrec startrecord, record; graf_mouse(ARROW,0); graf_mouse(M_OFF,0); v_clrwk(handle); graf_mouse(M_ON,0); form_alert(0,"[0][Speicherverwaltungstest ][ Start ]"); /* Schleife, die in jedem Durchlauf 387 * Datenstrukturen anfordert und diese * anschlieend wieder freigibt. */ graf_mouse(M_OFF,0); v_gtext(handle, (work_out[0]/2)-96, (work_out[1]/2)-8,"Test dauert max. 3 Min!"); graf_mouse(M_ON,0); for (i = 0; i < 3000; i++) { for (startrecord = mkrec(), record = startrecord, j = 0; j < 387; j++) { record->meinZeiger = mkrec(); record = record->meinZeiger; } for (record = startrecord, j = 0; j < 387; j++) { startrecord = record->meinZeiger; freemem((long)(sizeof(struct myrecord)), (long *)record); record = startrecord; } } vswr_mode(handle, MD_XOR); graf_mouse(M_OFF,0); v_gtext(handle, (work_out[0]/2)-96, (work_out[1]/2)-8,"Test dauert max. 3 Min!"); graf_mouse(M_ON,0); vswr_mode(handle, MD_REPLACE); form_alert(1,"[0][Test beendet! ][ Ok ]"); } N`pNpNNu// 6J@fvp0N$H f #include #include #include /* size of cell table */ #define CELLTABSIZE 512 /* Number of Bytes in one block */ #define BLOCKBYTES 8192 /* control-blk for alloc of memory of same size*/ struct memcntrl { /*!*/ long **memtab; /* current memtab */ long memtabidx; /* idx in memtabentry */ long memtabsize; /* max of memblocks */ long memblockidx; /* idx memblockentry */ long memblocksize; /* no entries in block */ unsigned int memsize;/* size memblock entry */ long *memfreelist; /* points to ... */ long *memblockptr; /* points to curr blk */ long memstatentries; /* no allocated entries*/ long memstatuentries; /* no of used entries */ long memstatfentries; /* no of free entries */ struct memcntrl *memnext;/* next memory-def */ }; /* memory description */ typedef struct memcntrl *kernmem; /* start of memory-control */ struct memcntrl *sysmem; /* das ist meine Datenstruktur */ struct myrecord { struct myrecord *meinZeiger; long meineZahl; int meinIndex; }; typedef struct myrecord *MYrec; #define CONVmyrec(x) (MYrec)(x) void faterr(char *str); /* ANSI-C lt gren */ char *new(unsigned int size); kernmem newmemcntrl(long size), searchmemcntrl(long); long *collectgarb(void), *freshmem(kernmem); char err_memory[] = "[1][No more | memory available!][Abort]"; int phase1 = 1; /* block allocation phase */ void faterr (str) /* prints a fatal error message */ char *str; { form_alert(1,str); exit(1); } /* faterr */ char * new (size) /* -------- allocates 'size' bytes */ unsigned int size; { char *res; /*! alloc minimal 1 byte */ if (!size) size = 1; if ((res = malloc(size)) == NULL) { /* terminate block allocation phase */ phase1 = 0; { register kernmem mem = sysmem; while (mem != NULL) { mem->memtabsize = mem->memtabidx + 1; mem = mem->memnext; } } collectgarb(); /* try again */ if ((res = malloc(size)) == NULL) faterr(err_memory); } return(res); } /* new */ kernmem newmemcntrl (size) /* new memory control blk */ long size; { kernmem mem = (kernmem) new((unsigned int)sizeof(struct memcntrl)); long idx = (int)(BLOCKBYTES/size); mem->memtab = (long **) new((unsigned int) (CELLTABSIZE*sizeof(long *))); mem->memtabidx = -1; mem->memtabsize = CELLTABSIZE; if (idx == 0) idx = 1; mem->memblockidx = mem->memblocksize = BLOCKBYTES/size; mem->memsize = (unsigned int)size; mem->memfreelist = mem->memblockptr = NULL; mem->memnext = NULL; mem->memstatentries = mem->memstatuentries = mem->memstatfentries = 0; return(mem); } /* newmemcntrl */ long * freshmem (mem) /* returns a fresh memory-blk */ kernmem mem; { long *memblockptr; if (phase1) { /* in this phase storage is still * available */ if (mem->memblockidx++ >=mem->memblocksize) { /* get it from current block */ if (++mem->memtabidx < mem->memtabsize) {/* create a new block */ if ((mem->memtab[mem->memtabidx] = mem->memblockptr = (long *)malloc((size_t) (mem->memsize * mem->memblocksize)) ) == NULL) { mem->memtabsize=mem->memtabidx; /* run out of storage --> * phase2 */ goto phase2; } memset(mem->memblockptr,'\0', (size_t)(mem->memsize * mem->memblocksize)); mem->memblockidx = 1; } else goto phase2; } /* count number of demanded memory-entries*/ ++mem->memstatentries; ++mem->memstatuentries; memblockptr = mem->memblockptr; (char *)mem->memblockptr += mem->memsize; return(memblockptr); phase2: /* in this phase storage is exhausted */ phase1 = 0; } if (mem->memfreelist == NULL) { /* try garbage collecting */ if (collectgarb() == NULL) faterr(err_memory); } /*! count number of demanded block entries */ ++mem->memstatuentries; mem->memstatfentries--; memblockptr = mem->memfreelist; mem->memfreelist = (long *)(*mem->memfreelist); return(memblockptr); } /* freshmem */ kernmem searchmemcntrl (size) /* search for cntrl blk */ register long size; { register kernmem mem = sysmem, *pmem = &sysmem; while (mem != NULL && mem->memsize < size) { /* save a pointer to the last controlblock */ pmem = &mem->memnext; mem = mem->memnext; } if (mem == NULL || mem->memsize != size ){ /* insert new memory */ *pmem = newmemcntrl(size); (*pmem)->memnext = mem; mem = *pmem; } return(mem); } /* searchmemcntrl */ void freemem (size,ptr) /* free a record im mem-blk*/ long size; long *ptr; { kernmem mem = searchmemcntrl(size); /* concatenate memory-blocks */ *ptr = (long)mem->memfreelist; mem->memfreelist = ptr; mem->memstatfentries++; } /* freemem */ long * collectgarb () /* ----------- collect garbage */ { /* was auch immer hier gemacht wird, * (wie Mll eingesammelt werden kann), * es sollte die Freispeicherliste * zurckgegeben werden */ return(sysmem->memfreelist); } /* collectgarb */ MYrec mkrec () /*! ----------- make a record object */ { register MYrec rec; rec = CONVmyrec(freshmem(searchmemcntrl((long) (sizeof(struct myrecord))))); /* oder alternativ, wenn es nur ein Record-typ: rec = CONVmyrec(freshmem(&sysmem)); */ rec->meinZeiger = NULL; rec->meineZahl = 0; rec->meinIndex = 0; return(rec); } /* mkrec */ ```H>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#:3> k #D Ј<.@#@Jy>g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9g @N 9g @NN\?<LNA/ E`Nv5@R@gPp` 2A5R@| m5|HjHjCAN\PO5@5@4HjC JNXOp`B@$_Nu09N4NNuNS@fN\NB@NLNuCANpN4NupNpN&Nu// 6J@fvp0N 4$H fB@Nԑ0<NE0N0<NG KB@Nt0<NIxA(4,H…QB2H|0Np0<NjBC`8Nn*H,MBD` Nb,,HRD|m,MBD`*V Np N",MRD|mRC| mr0Nڑ0<NA(4,H…QB2H|0N0<Nr0NA@pNL|NuA(p"@ "By\A1B3\3^O"Nu/ Hz?<&NN\O$_Nu/QOM-O, ICHza&XOPO,_NuH@B@H@"VraJ@kNu.np`H8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp at$Wb<gt<.f6<*f4`$<0< b ACp a6$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a<߶<Xfg.G3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyzH &/?<HNA\OJf 9g @ NJ@fp @LNuH0&gPR<e a g!CC "A`rG"&S f. < a gj&@Ap !| 'H&"#"A"P` )d I"Q f`rd ` #@#C"nAL Nuk |`3 `/ &y g/ &S?<INA\O`&y" g/ &S?<INA\O`&_Nu/$gSe40HB4 gxH_>"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNuABh1|1Ar `ABhBhr`ABhBhre`C3A03B23|CrtRB2fA1Br`v3 / C2dBi3| Cp 2Q"<ps/ NB$_ _0 A"op,2QAp 2QNu0/ 1@ 0"<&psNBA0$_Nup `Lp`F#3p4`4/ /pMa*"_2"_2"o2"o2Nu#3pN`/ 3@@A"CB@22220<"<NBA0$_Nu Fehler bei der Programminitialisierung![1][No more | memory available!][Abort][0][Speicherverwaltungstest ][ Start ]Test dauert max. 3 Min![0][Test beendet! ][ Ok ]vvv0_PgmSizeD_DigCnvTR_GemParB_VdiParB&_ChrCla1R_MemCluL"_AesCtrlh_MemBlkL_VdiCtrl_BasPag:write vswr_modwork_outxwork_in`ultoav_opnvwksysmemstrtoul v_gtextRv_clsvwk>v_clrwk*phys_hannewPOutBlank memsetOutZero mainnewmemcnmallocmkrecbphase1searchmelseek open_vwohandlefaterrBfwrite exitrerrnofprintfgem_prgxform_ale$err_memofreemem>freshmem(gl_apidgraf_mouVclose_vwgl_wboxgl_hboxgraf_han6_ldivgl_wchargl_hchar__exit__text__bss:collectgV_app>_lmulR_AtExitV__dataappl_exiappl_ini_fpuvectH_FreeAll\_PrintF_fpumode\_OutStr _fpuinit_StkSize_fpuctrl^_StdOutF_StdPrnF_OutIntD_StkLim@_FlshBuf _OutChr _OutCarO Z_OutCarH _OutCarD _StdErrF_StdAuxF_global_StdInF`_heapErr_FilSysV_RedirTaH_XltErr r  h(:,,\8&  ~@D.R $  , QDB1Lb<`$yh:x "   "  KR ^0`0bkPxsFx8| 8 T (@,7 A0D:\PURE_C\SONDER\SYSTEM\SPEICHER\MEM_DEMO.CmeinZeigermeineZahlmeinIndexrecordstartrecordjimyrecordgem_prgMYrec. L`i.. ;`iMOVELIB H zhMOVEDEMOPRJ hMOVEDEMODFN MOVEDEMOH JMOVELIB O עhhMOVEDEMOPRG @h MOVEDEMORSC MOVELIB C 0h'MOVEDEMOC 8h /**************************************/ /* MOVEDIAL-Library fr Dialogboxen */ /*------------------------------------*/ /* Include-File: MOVELIB.H */ /*------------------------------------*/ /* by M.Baldauf */ /* (c) 1992 MAXON Computer GmbH */ /**************************************/ #include #include int gem_init(void); void gem_exit(int handle); void vor_dial(OBJECT *dialbox, int dialtype); void draw_dial(OBJECT *dialbox, int dialtype); void nach_dial(OBJECT *dialbox, int dialtype); void movedial(OBJECT *dialbox, int dialtype); int do_dial(OBJECT *tree); int do_movedial(OBJECT *tree, int DRAGGER); int do_popup(OBJECT *tree); movedemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o movelib.o movedemo (movedemo.h, movelib.h) pcstdlib.lib pctoslib.lib pcgemlib.lib DIALOGDIALOGDRDIALOGOK DIALOGON DIALOGOFDIALOGT1 DIALOGT2POPUPINFODIALPOPQUITPOPMOVEPOPPOPUPPOPSTANDPOPPIE#define DIALOG 0 /* TREE */ #define DIALOGDR 1 /* OBJECT in TREE #0 */ #define DIALOGOK 7 /* OBJECT in TREE #0 */ #define DIALOGON 11 /* OBJECT in TREE #0 */ #define DIALOGOF 12 /* OBJECT in TREE #0 */ #define DIALOGT1 8 /* OBJECT in TREE #0 */ #define DIALOGT2 9 /* OBJECT in TREE #0 */ #define POPUP 1 /* TREE */ #define INFODIAL 2 /* TREE */ #define POPQUIT 3 /* OBJECT in TREE #1 */ #define POPMOVE 1 /* OBJECT in TREE #1 */ #define POPPOPUP 2 /* OBJECT in TREE #1 */ #define POPSTAND 5 /* OBJECT in TREE #1 */ #define POPPIE 3 /* TREE */ N/ OlN|fp`LHWHoC ANPO?@B@Ez` 2A5R@| m5|HoC JNXO0/O$_NuNNNuH0O$H6pNG0S@gS@g\`0*f82*f2HkHkHk"K JNO 5S5k5k5k`67j7j7j`HoHo CABBrpNPO?@HoHoHo Ho rB@NO0/ 2*HA6Wl60o2j@o 4/j65S0/ 2*HA7@ol7o0/o2+j@o 4/j7B5k`HkHkHk"K JNO ?+?+?+??+?+4+2B@NO OL Nu/ QO$H2SAgSAg`>?j?j?j`HoHoHo C JNO ?/?/?/4/rB@ JN\OPO$_Nu/ QO$H2SAgSAg`>?j?j?j`HoHoHo C JNO ?/?/?/?/?/?/4/2/ pNO B@NPO$_Nu/ O&H|fpNpNpNHoHoHo Ho rB@NO?/?/?/?/?+CA4+2+0+NO ?+?+?+?+?+?+4+2+pNO 0/ kk0/kk?+?+?+?+?+?+4+2+B@NO B@NpNB@NO &_Nu?/ $HB@NB@ JNB@ JN6H"ҁҀr JB@N0$_6NuH $H8pNp JNB@ JN6H"ҁҀr Cf JpNCgp JN0LNu?/ $HpNp JNB@ JN6H"ҁҀr JpN0$_6Nu 4 2R&  > >*  0* B             appl_exit appl_init graf_dragbox graf_mousewind_get nach_dialgem_exitgem_init form_dial draw_dialdo_popupvor_dialmovedialv_clsvwkv_opnvwk form_centerform_do evnt_button do_movedialdo_dial objc_draw wind_update graf_handle` LV`` b>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@# T3 X k # ^ Ј<.@# ZJy Xg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ONR0 J"LN? 9 g @N 9 g @NNd?<LNA/ OlN|fp`LHWHoC ANpPO?@B@Ez` 2A5R@| m5|HoC JNXO0/O$_NuNN@NuH0O$H6pNG0S@gS@g\`0*f82*f2HkHkHk"K JNO 5S5k5k5k`67j7j7j`HoHo CABBrpNPO?@HoHoHo Ho rB@NO0/ 2*HA6Wl60o2j@o 4/j65S0/ 2*HA7@ol7o0/o2+j@o 4/j7B5k`HkHkHk"K JNO ?+?+?+??+?+4+2B@N6O OL Nu/ QO$H2SAgSAg`>?j?j?j`HoHoHo C JNO ?/?/?/4/rB@ JN\OPO$_Nu/ QO$H2SAgSAg`>?j?j?j`HoHoHo C JNO ?/?/?/?/?/?/4/2/ pNXO B@NtPO$_Nu/ O&H|fpNXpNRpNHoHoHo Ho rB@NO?/?/?/?/?+CA4+2+0+NzO ?+?+?+?+?+?+4+2+pNO 0/ kk0/kk?+?+?+?+?+?+4+2+B@NpO B@N6pNB@N~O &_Nu?/ $HB@NB@ JNB@ JN"6H"ҁҀr JB@NZ0$_6NuH $H8pN`p JNB@ JN6H"ҁҀr Cf JpNCgp JN 0LNu?/ $HpNp JNB@ JN6H"ҁҀr JpN0$_6Nu?OA BAB@NArB@NArB@NArB@Np WNp WNB@ WN&6H"ҁҀ Wp WpN\0S@g S@gW@g`p o N` oN8` oN|fO6Nu?OA Cp QN6J@m(pNANJ@gB@NxN 0NB@`pO6NuA(p"@ "By 4A1B3 43 6O"Nu/ Hz?<&NN\O$_Nu/ &y 8 g/ &S?<INA\O`&y < g/ &S?<INA\O`&_NuA zBhBhre`v3 / C z2dBi3| Cp 2Q"<ps/ NB$_ _0 A8"op,2QAp 2QNu z 88/ 1@ 0"< @psNBA80$_Nup `p`/ /A 8000pa"_2"_2"o2"o2Nu#A 8000000p*`F#3 8p2`4#A 80000000 0 0p3`/ #p6a"_2"o2"o2"o 2Nu#pn`/A 800ppa"_"Nu/ /pMa"_2"_2"o2"o2Nu/ /A 80000 0000pGal"_2"_2Nu#3 8pN`P/ ?A 800pha<2CSA|;$Y4Q$_Nu3 8pk`/ 3 z@@A"C |B@22220<"< NBA80$_Nu z 88 MOVEDEMO.RSC z 88r  TX   ( ,$,0> $!MOVEDIALTHE MOVABLE DIAL-BOXTO MOVE THIS BOX, SIMPLY CLICK ON THE "MOVE-BAR",HOLD DOWN THE MOUSE-BUTTON AND MOVE THE MOUSEIt's OK@________________________TEXT-1:_________________________XXXXXXXXXXXXXXXXXXXXXXXXX@________________________TEXT-2:_________________________XXXXXXXXXXXXXXXXXXXXXXXXXONOFFMOVEDIALPOPUPQUITAuswahlmenueSTANDARDStandard-DialogOKOPTION 1OPTION 2OPTION 3OPTION 4BUTTON 1BUTTON 2BUTTON 3BUTTON 4$-. /DEFxy2z.!!B!w  -@!-  $%@"  \  x    \ 1_ , c l r  %   !    % l/**************************************/ /* MOVEDIAL-Library fr Dialogboxen */ /*------------------------------------*/ /* Sourcefile: MOVELIB.C */ /*------------------------------------*/ /* by M.Baldauf */ /* (c) 1992 MAXON Computer GmbH */ /**************************************/ #include /* AES-Routinen */ #include /* VDI-Routinen */ #include "movelib.h" /* Unterprogramm-Deklarationen */ /**********************************************************************/ /*+------------------------------------------------------------------+*/ /*| Erledigung der leidigen GEM-Initialisierung zu Anfang |*/ /*+------------------------------------------------------------------+*/ int gem_init(void) { int handle; int ap_id,work_in[12],work_out[57]; int gr_1,gr_2,gr_3,gr_4, i; /* Applikation anmelden */ ap_id = appl_init(); /* war alles OK? */ if (ap_id==-1) /* scheint nicht so */ return(-2); else { /* scheinbar war alles OK! => VDI-Handle ermitteln */ handle = graf_handle(&gr_1,&gr_2,&gr_3,&gr_4); for (i=0; i<10; work_in[i++]=1) ; work_in[10] = 2; /* Virtual-Workstation ffnen */ v_opnvwk(work_in, &handle, work_out); /* und das ermittelte Handle zurckliefern */ return(handle); } } /*+------------------------------------------------------------------+*/ /*| Abmelden der Applikation vom GEM |*/ /*+------------------------------------------------------------------+*/ void gem_exit(int handle) { /* Virtual-Workstation schlieen */ v_clsvwk(handle); /* Applikation abmelden */ appl_exit(); } /**********************************************************************/ /*+------------------------------------------------------------------+*/ /*| Vorbereitungen zur Dialogbox-Darstellung |*/ /*+------------------------------------------------------------------+*/ void vor_dial(OBJECT *dialbox, int dialtype) { GRECT a; int mx,my,dummy; GRECT desk; /* Fenstererneuerung */ wind_update(BEG_UPDATE); switch (dialtype) { case 1: /* MOVEDIAL */ /* war dies der erste Aufruf? */ if ((dialbox->ob_x == 0) && (dialbox->ob_y == 0)) { form_center(dialbox,&a.g_x,&a.g_y,&a.g_w,&a.g_h); dialbox->ob_x = a.g_x; dialbox->ob_y = a.g_y; dialbox->ob_width = a.g_w; dialbox->ob_height = a.g_h; } else { a.g_x = dialbox->ob_x; a.g_y = dialbox->ob_y; a.g_w = dialbox->ob_width; a.g_h = dialbox->ob_height; } break; case 2: /* POPUPDIAL */ /* Mausposition ermitteln */ dummy = evnt_button(1,1,0,&mx,&my,&dummy,&dummy); /* Gre des Desktop ermitteln */ wind_get(0,WF_WORKXYWH,&desk.g_x,&desk.g_y,&desk.g_w,&desk.g_h); /* X-Position der Dialogbox bestimmen */ a.g_x = mx - (dialbox->ob_width / 2); /* ist sie innerhalb der Desktop-Grenzen? */ if (a.g_x < desk.g_x) a.g_x = desk.g_x; if ((a.g_x + dialbox->ob_width) > (desk.g_x + desk.g_w)) a.g_x = desk.g_w - dialbox->ob_width; /* Objekt-Position neu setzen */ dialbox->ob_x = a.g_x; /* Y-Position der Dialogbox bestimmen */ a.g_y = my - (dialbox->ob_height / 2); /* ist sie innerhalb der Desktop-Grenzen? */ if (a.g_y < desk.g_y) a.g_y = desk.g_y; if ((a.g_y + dialbox->ob_height) > (desk.g_y + desk.g_h)) a.g_y = desk.g_h - dialbox->ob_height; /* Objekt-Position neu setzen */ dialbox->ob_y = a.g_y; break; default:/* STANDARDDIAL */ /* Dialogbox zentrieren */ form_center(dialbox,&a.g_x,&a.g_y,&a.g_w,&a.g_h); break; } /* Hintergrund reservieren */ form_dial(FMD_START, a.g_x,a.g_y,a.g_w,a.g_h, a.g_x,a.g_y,a.g_w,a.g_h); } /*+------------------------------------------------------------------+*/ /*| Dialogbox zeichnen (nur nach 'vor_dial' aufrufen !!!) |*/ /*+------------------------------------------------------------------+*/ void draw_dial(OBJECT *dialbox, int dialtype) { GRECT a; switch (dialtype) { case 1: /* MOVEDIAL */ a.g_x = dialbox->ob_x; a.g_y = dialbox->ob_y; a.g_w = dialbox->ob_width; a.g_h = dialbox->ob_height; break; case 2: /* POPUPDIAL */ a.g_x = dialbox->ob_x; a.g_y = dialbox->ob_y; a.g_w = dialbox->ob_width; a.g_h = dialbox->ob_height; break; default:/* STANDARDDIAL */ /* Dialogbox zentrieren */ form_center(dialbox,&a.g_x,&a.g_y,&a.g_w,&a.g_h); break; } /* Dialogbox ausgeben */ objc_draw(dialbox,ROOT,MAX_DEPTH,a.g_x,a.g_y,a.g_w,a.g_h); } /*+------------------------------------------------------------------+*/ /*| Nachbereitung der Dialogbox-Darstellung |*/ /*+------------------------------------------------------------------+*/ void nach_dial(OBJECT *dialbox, int dialtype) { GRECT a; switch (dialtype) { case 1: /* MOVEDIAL */ a.g_x = dialbox->ob_x; a.g_y = dialbox->ob_y; a.g_w = dialbox->ob_width; a.g_h = dialbox->ob_height; break; case 2: /* POPUPDIAL */ a.g_x = dialbox->ob_x; a.g_y = dialbox->ob_y; a.g_w = dialbox->ob_width; a.g_h = dialbox->ob_height; break; default:/* STANDARDDIAL */ /* Dialogbox zentrieren */ form_center(dialbox,&a.g_x,&a.g_y,&a.g_w,&a.g_h); break; } /* Hintergrund freigeben */ form_dial(FMD_FINISH, a.g_x,a.g_y,a.g_w,a.g_h, a.g_x,a.g_y,a.g_w,a.g_h); /* Erneuerung beendet */ wind_update(END_UPDATE); } /*+------------------------------------------------------------------+*/ /*| 'MOVEDIAL'-Box auf Desktop verschieben |*/ /*+------------------------------------------------------------------+*/ void movedial(OBJECT *dialbox, int dialtype) { int nx,ny; GRECT desk; if (dialtype == 1) /* es ist also eine 'MOVEDIAL'-Box */ { wind_update(BEG_UPDATE); /* Fenstererneuerung */ wind_update(BEG_MCTRL); /* Mauskontrolle */ graf_mouse(FLAT_HAND,0); /* Maus auf "flache Hand" */ /* Gre des Desktop ermitteln */ wind_get(0,WF_WORKXYWH,&desk.g_x,&desk.g_y,&desk.g_w,&desk.g_h); /* Rechteck an neue Position verschieben */ graf_dragbox(dialbox->ob_width, dialbox->ob_height, dialbox->ob_x, dialbox->ob_y, desk.g_x, desk.g_y, desk.g_w, desk.g_h, &nx,&ny); /* Alte Object-Zeichnung lschen (Speicher freigeben) */ form_dial(FMD_FINISH, dialbox->ob_x, dialbox->ob_y, dialbox->ob_width,dialbox->ob_height, dialbox->ob_x, dialbox->ob_y, dialbox->ob_width,dialbox->ob_height); /* Jetzt die Verschiebung in die OBJECT-Struktur eintragen */ dialbox->ob_x += nx-dialbox->ob_x; dialbox->ob_y += ny-dialbox->ob_y; /* Speicher an der neuen Position reservieren */ form_dial(FMD_START, dialbox->ob_x, dialbox->ob_y, dialbox->ob_width,dialbox->ob_height, dialbox->ob_x, dialbox->ob_y, dialbox->ob_width,dialbox->ob_height); graf_mouse(ARROW,0); /* Maus wieder Pfeil */ wind_update(END_MCTRL); /* keine Mauskontrolle */ wind_update(END_UPDATE); /* Erneuerung beendet */ } } /*+------------------------------------------------------------------+*/ /*| 'STANDARD' Dialog erledigen |*/ /*+------------------------------------------------------------------+*/ int do_dial(OBJECT *tree) { int ret; /* Vorbereitung */ vor_dial(tree,0); /* Durchfhrung */ draw_dial(tree,0); ret = form_do(tree,0); /* dies erledigt das AES */ tree[ret].ob_state &= ~SELECTED; /* SELECTED zurcksetzen */ /* Nachbereitung */ nach_dial(tree,0); return(ret); } /*+------------------------------------------------------------------+*/ /*| 'MOVEDIAL' Dialog erledigen |*/ /*+------------------------------------------------------------------+*/ int do_movedial(OBJECT *tree, int DRAGGER) { int ret; /* Vorbereitung */ vor_dial(tree,1); /* Durchfhrung */ do { /* Dialogbox ausgeben*/ draw_dial(tree,1); ret = form_do(tree,0); /* dies erledigt das AES */ tree[ret].ob_state &= ~SELECTED; /* SELECTED zurcksetzen */ if (ret==DRAGGER) movedial(tree,1); } while (ret == DRAGGER); /* Nachbereitung */ nach_dial(tree,1); return(ret); } /*+------------------------------------------------------------------+*/ /*| 'POPUP' Dialog erledigen |*/ /*+------------------------------------------------------------------+*/ int do_popup(OBJECT *tree) { int ret; /* Vorbereitung */ vor_dial(tree,2); /* Durchfhrung */ draw_dial(tree,2); ret = form_do(tree,0); /* dies erledigt das AES */ tree[ret].ob_state &= ~SELECTED; /* SELECTED zurcksetzen */ /* Nachbereitung */ nach_dial(tree,2); return(ret); } /*~~~~~~~~~~~~~~~~~~~~~~~~~ ENDE von MYLIB.C ~~~~~~~~~~~~~~~~~~~~~~~~~*//****************************************/ /* Demoprogramm der MOVEDIAL-Routinen */ /*--------------------------------------*/ /* Sourcefile: MOVEDIAL.C */ /*--------------------------------------*/ /* by M.Baldauf */ /* (c) 1992 MAXON Computer GmbH */ /****************************************/ #include "movedemo.h" /* RSC-Definitionen */ #include "movelib.h" /* Unterprogramm-Deklarationen */ #include /* AES-Routinen */ #include /* VDI-Routinen */ void do_popup_menue(void); void do_popup_menue(void) { /* Objecte (Dialogboxen, Men, etc.) deklarieren */ OBJECT *dialog, /* MOVEDIAL-Box */ *infodial,/* STANDARD-Dialogbox */ *poppie, /* POPUP-Dialogbox */ *popup; /* Auswahl-(Popup-)Dialog */ int ret; rsrc_gaddr(R_TREE, DIALOG, &dialog); rsrc_gaddr(R_TREE, POPUP, &popup); rsrc_gaddr(R_TREE, INFODIAL, &infodial); rsrc_gaddr(R_TREE, POPPIE, &poppie); /* Durchfhrung */ do { /* Vorbereitung */ vor_dial(popup,2); /* Dialogbox ausgeben (zeichnen) */ draw_dial(popup,2); ret = form_do(popup,0); /* dies erledigt das AES */ popup[ret].ob_state &= ~SELECTED; /* SELECTED zurcksetzen */ /* Nachbereitung */ nach_dial(popup,2); /* was hat der Benutzer gewhlt? */ switch (ret) { case POPMOVE: do_movedial(dialog,DIALOGDR); break; case POPPOPUP: do_popup(poppie); break; case POPSTAND: do_dial(infodial); break; default: break; } } while (ret != POPQUIT); } int main(void) { int handle; char rsc_name[] = "MOVEDEMO.RSC"; /* Initialisierung der Applikation */ handle = gem_init(); if (handle >= 0) { /* Maus als Bienchen */ graf_mouse(HOURGLASS,0L); /* Resource-Datei laden */ if (rsrc_load(rsc_name)) { /* und los gehts */ graf_mouse(ARROW,0L); do_popup_menue(); } else return(-1); /* Abmelden der Applikation */ gem_exit(handle); return(0); } else return(-1); }. ]`i.. ;`iBIOS S hSUPER GLOBL install,exstall bios EQU $B4 ;adr des bios- ; vektors gemdos EQU $84 ;adr des gemdos- ; vektors anfang: bra schluss DC.B "XBRABFOR" oldbios:DC.L 1 mybios: movem.l D0-D1/A0-A1,-(SP) lea 22(SP),A0 ;funktionsnum- ; mer auf superstack move.w -6(A0),D0 ;statusregister btst #13,D0 ;alter Status ; == superviser? bne.s aktiv ;nein->zu aktiv move USP,A0 ;sonst usp ; laden aktiv: move.w (A0),D0 ;funktionsnum- ; mer laden cmpi.w #132,D0 ;meine umlenk- ; funktion? beq newnumb ;ja-> ; neuumlenkung cmpi.w #1,D0 ;nein, Bconin? beq.s input ;ja -> ; inputfunktion cmp.w #2,D0 ;Bconstat? beq.s input ;ja cmpi.w #3,D0 ;Bconout? beq.s outputs ;ja cmpi.w #8,D0 ;Bcostat? beq.s outputs ;ja back: ;eigene arbeit erledigt movem.l (SP)+,D0-D1/A0-A1 ;weiter im ; bios move.l oldbios(PC),-(SP) rts input: move.w 2(A0),D0 ;device in d0 add.w D0,D0 ;2* wegen word lea itab(PC),A1 ;inputtab in a1 cmpi.w #6,0(A1,D0.w) ;wert in tab<6? bcs.s biosin ; ja-> ; umlenkung bleibt ; im bios ; ab hier umlenkung in gemdos tst.b isdos ;aufruf aus ; gemdos? bne.s back ;ja, dann weiter cmpi.w #1,(A0) ;Bconstat? beq.s info ; ja, dann wie ; Bcostat dosin: move.w 0(A1,D0.w),D0 ; nein, gemdos ; lesen: ; device in d0 pea buf(PC) ;alles klar- ; machen fr ; Fread move.l #1,-(SP) move.w D0,-(SP) move.w #$3F,-(SP) trap #1 lea 12(SP),SP inend: movem.l (SP)+,D0-D1/A0-A1 moveq #0,D0 ;wegen long- ; rckgabe ; lschen move.b buf(PC),D0 ;ergebnis in d0 ; bringen rte ;ende der gemdosarbeit biosin: move.w 0(A1,D0.w),2(A0) ;funktions- ; nummer aus ; tabelle ; bernehmen bra.s back ;weiter ; im bios outputs: move.w 2(A0),D0 ;device in d0 add.w D0,D0 ;2* wegen word lea otab(PC),A1 ;inputtab in a1 cmpi.w #6,0(A1,D0.w) ;wert in tab<6? bcs.s biosout ;ja-umlenkung ; bleibt im bios tst.b isdos ;aufruf aus ; gemdos? bne.s back ;ja, dann weiter cmpi.w #8,(A0) ;Bcostat? bne.s dosout ;nein, dann ; raus damit info: movem.l (SP)+,D0-D1/A0-A1 ;register ; zurck move.l #-1,D0 ;wert ; zurckgeben rte dosout: move.w 0(A1,D0.w),D0 ;gemdos: ; newdev in d0 move.w 4(A0),D1 ;zeichen- move.b D1,buf ;argument in ; buffer bringen pea buf(PC) ;alles klar- move.l #1,-(SP) ;machen fr move.w D0,-(SP) ;Fwrite move.w #$40,-(SP) trap #1 lea 12(SP),SP bra.s exit biosout:move.w 0(A1,D0.w),2(A0) ;funktions- ; nummer aus ; tabelle ; bernehmen bra back ;weiter im bios newnumb:move.w 2(A0),D0 ;device add.w D0,D0 ;2* wegen word move.w 4(A0),D1 ;neue device- ; nummer lea itab(PC),A1 ;tabelle fr ; input tst.w 6(A0) ;input ; gewnscht? beq.s umleit ;ja->dann los lea otab(PC),A1 ;sonst output- ; tabelle umleit: move.w D1,0(A1,D0.w) ;neue num- ; mer eintragen exit: movem.l (SP)+,D0-D1/A0-A1 rte install: move.l A0,-(SP) movea.l bios.w,A0 cmpi.l #"BFOR",-8(A0) ;schon ; installiert? beq.s fast_ende move.l A0,oldbios ;alten bios ; retten move.l #mybios,bios.w ;neuen ein- ; setzen fast_ende: ;nochmal das ganze mit gemdos movea.l gemdos.w,A0 cmpi.l #"BFOR",-8(A0) beq.s ende move.l A0,dosvek move.l #mydos,gemdos.w ende: movea.l (SP)+,A0 ;und rts ;zurck ;hier kann man alles wieder rckgngig machen exstall: cmpi.l #mybios,bios.w bne.s fast_bye move.l oldbios(PC),bios.w fast_bye: cmpi.l #mydos,gemdos.w bne.s bye move.l dosvek(PC),gemdos.w bye: rts ;einklinken in GEMDOS-Vektor DC.B "XBRABFOR" dosvek: DC.L 1 mydos: movem.l D0/A0,-(SP) move.w 14(SP),D0 ;funktionsnummer btst #5,8(SP) ;statusregister bne.s ok ;supervisor move USP,A0 ;sonst user move.w (A0),D0 ;funktionsnummer ok: cmp.w #$4B,D0 ;pexec? beq.s dosend ;ja, dann ok move.l 10(SP),saveptr ;sonst move.l #dosret,10(SP) ;einklinken st isdos ;bin in gemdos dosend: movem.l (SP)+,D0/A0 ;weiter im move.l dosvek(PC),-(SP) ;gemdos rts dosret: clr.b isdos ;zurck aus move.l saveptr(PC),-(SP) ;gemdos rts saveptr:DC.L 1 itab: ;tabelle der DC.W 0 ;eingabe- DC.W 1 ;leitung DC.W 2 DC.W 3 DC.W 4 DC.W 5 otab: DC.W 0 ;und der DC.W 1 ;Ausgabe- DC.W 2 ;umleitung DC.W 3 DC.W 4 DC.W 5 buf: DS.B 1 ;puffer fr ; Fread isdos: DS.B 1 ;semaphore fr ; gemdos-erkennung EVEN ;ein kleines installationsprogramm schluss:pea install(PC) ;Supexec move.w #38,-(SP) trap #14 addq.l #6,SP clr.w -(SP) ;Ptermres move.l #(256+schluss-anfang),-(SP) move.w #$31,-(SP) trap #1 END . c`i.. ;`iDIALOG PRJ xhDIALOG PRG h0DIALOG S hE/dialog.prg = dialog.s `, OO h"h C/ /Bg?<JNAO JfKMp "<aktpM"<a Mp 0Q0pdGB6 7Va3$:pr"<AzaSUjBUpN"<aI`xap"<aBgNAp6"< LarL`BBH`H` a(p*H`p*"< LaDatH`H` p3"< :`,pa6.;|;|;|p"<:Aa.fl0. Jf$H L(g JPgA`.=| `r;n :Bmp7"< La>.JVgJngv;n ;Cpav6.`fBU;|+np+"< Lad>j?<?<?<NM\`4p8"<:;n  La8JVg04 g Gga8`;Cp:;@p."< L#A0"<0<NBNu3$3"<psNBNu o ( #мШ#A <3p a o"hEB@BAg4RA` <C3# yp`^~+% @ x y  a%  Testdialog fr neue form_do-Routine5 @ Eingabefeld 1: __________XXXXXXXXXX\g @ Eingabefeld 2: __________XXXXXXXXXXRadiobutton 1Radiobutton 2OKABBRUCH02   (2Dl******************************** * neue form_do-Routine * * mit erweiterten Funktionen * * by Uwe Seimet * * (c) 1992 MAXON Computer GmbH * ******************************** *fr die wenigen Systemaufrufe GEMDOS = 1 MSHRINK = 74 BIOS = 13 BCONOUT = 3 move.l sp,a0 lea stack+400,sp ;Stackpointer initialisieren move.l 4(a0),a0 ;Pointer auf Basepage move.l 12(a0),a1 ;Lnge des TEXT-Segments add.l 20(a0),a1 ;Lnge des DATA-Segments add.l 28(a0),a1 ;Lnge des BSS-Segments lea $100(a1),a1 ;256 Bytes fr die Basepage move.l a1,-(sp) move.l a0,-(sp) clr -(sp) move #MSHRINK,-(sp) trap #GEMDOS ;nicht bentigten Speicher zurckgeben lea 12(sp),sp tst.l d0 ;Fehler? bne error ;ja- lea intin,a5 ;Pointer auf INTIN-Array lea intout,a6 ;Pointer auf INTOUT-Array moveq #10,d0 ;appl_init move.l #$00010000,d1 bsr aes bmi.s error ;Fehler- moveq #77,d0 ;graf_handle move.l #$00050000,d1 bsr aes move.l a5,a0 moveq #9,d0 .opn: move #1,(a0)+ dbra d0,.opn move #2,(a0) moveq #100,d0 ;v_opnvwk lea contrl+2,a3 clr.l (a3)+ move #11,(a3) move (a6),6(a3) ;graf_handle bsr vdiinit move 6(a3),vdi_h ;vdi_handle merken move #7,(a5) ;Objektzahl eintragen fix: moveq #114,d0 ;rsrc_obfix move.l #$01010100,d1 lea objc000(pc),a0 ;Adresse der Objektdaten bsr aesobj ;Koordinaten umrechnen subq #1,(a5) bpl fix ;nchstes Objekt, falls vorhanden clr (a5) ;Pfeil als Mauscursor moveq #78,d0 ;graf_mouse move.l #$01010100,d1 bsr aes lea objc000(pc),a4 ;Adresse der Dialogbox moveq #2,d4 ;Nummer des ersten Eingabefeldes bsr.s form_do ;Dialog ausfhren moveq #19,d0 ;appl_exit move.l #$00010000,d1 bsr aes error: clr -(sp) ;das war's trap #GEMDOS form_do: moveq #54,d0 ;form_center move.l #$00050100,d1 move.l a4,a0 bsr aesobj movem.l 2(a6),d5/d6 ;form_xy und form_wh clr d2 ;FMD_START movem.l d5/d6,2(a5) movem.l d5/d6,10(a5) bsr.s form_dial moveq #1,d0 ;bis zu Ebene 1 zeichnen move.l d0,(a5) movem.l d5/d6,4(a5) moveq #42,d0 ;objc_draw move.l #$06010100,d1 move.l a4,a0 bsr aesobj ;Dialogbox darstellen bsr.s _form_do ;zur neuen Dialogroutine moveq #3,d2 ;FMD_FINISH movem.l d5/d6,2(a5) movem.l d5/d6,10(a5) form_dial: moveq #51,d0 ;form_dial move.l #$09010100,d1 move d2,(a5) bra aes *neue form_do-Routine, Exit-Button wird in D7 zurckgeliefert _form_do: moveq #1,d0 ;Cursor einschalten bsr objcedit move 2(a6),d3 ;Position des Cursors dloop: move #1,2(a5) ;warten auf einen Mausklick move #1,4(a5) ;auf linken Mausbutton warten move #1,6(a5) ;gedrckter Mausbutton moveq #25,d0 ;evnt_multi move.l #$10070100,d1 move #3,(a5) ;MU_KEYBD|MU_BUTTON lea ev_buff,a0 bsr aesobj ;Benutzeraktion abwarten btst #1,1(a6) ;MU_BUTTON? bne.s button ;ja- move 10(a6),d0 ;Scan- und ASCII-Code der Taste tst.b d0 ;ASCII-Zeichen? bne.s noalt ;ja- lsr #8,d0 ;Scancode ins low Byte move.l a4,a0 uloop: cmp.b 6(a0),d0 ;Button fr gedrckte Taste gefunden? beq.s default ;ja- tst (a0) ;letztes Objekt im Baum erreicht? beq.s noalt ;ja- lea 24(a0),a0 ;nchstes Objekt prfen bra uloop default: sub.l a4,a0 move.l a0,d7 divu #24,d7 ;ergibt Objektnummer move #1,12(a6) ;fr Simulation eines Mausklicks bra.s obj noalt: move 10(a6),2(a5) ;eingegebenes Zeichen move d4,(a5) ;aktuelles Eingabefeld clr 4(a5) moveq #55,d0 ;form_keybd move.l #$03030100,d1 move.l a4,a0 bsr aesobj move 2(a6),d7 ;neues Eingabefeld tst (a6) ;Exit-Objekt bettigt? beq exit ;ja- tst 4(a6) ;Wechsel des Eingabefeldes? beq.s newinput ;ja- move 10(a6),2(a5) ;eingegebenes Zeichen move d3,4(a5) ;aktuelle Cursorposition moveq #2,d0 ;Zeichen ausgeben bsr.s objcedit move 2(a6),d3 ;neue Cursorposition bra dloop button: clr (a5) move #1,2(a5) ;bis Ebene 1 suchen move.l 2(a6),4(a5) ;aktuelle Mausposition moveq #43,d0 ;objc_find move.l #$04010100,d1 move.l a4,a0 bsr.s aesobj move (a6),d7 ;Objektnummer bpl.s obj ;Objekt wurde gefunden- move #$07,-(sp) ;BEL move #2,-(sp) move #BCONOUT,-(sp) trap #BIOS ;Glockenton als Fehlermeldung addq.l #6,sp bra dloop obj: moveq #56,d0 ;form_button move.l #$02020100,d1 move d7,(a5) ;angeklicktes Objekt move 12(a6),2(a5) ;Anzahl der Mausklicks move.l a4,a0 bsr.s aesobj tst (a6) ;wurde Exit-Objekt angeklickt? beq.s exit ;ja- move d7,d0 mulu #24,d0 btst #3,9(a4,d0) ;Objekt editierbar? beq dloop ;nein- cmp d7,d4 ;Wechsel des Eingabefeldes? beq dloop ;nein- newinput:bsr.s exit ;Cursor abschalten move d7,d4 ;neues Eingabefeld bra _form_do ;Dialog fortfhren exit: move d3,4(a5) ;Cursorposition moveq #3,d0 objcedit:move d4,(a5) ;Nummer des Eingabefeldes move d0,6(a5) moveq #46,d0 ;objc_edit move.l #$04020100,d1 move.l a4,a0 aesobj: move.l a0,addrin aes: lea contrl,a0 move d0,(a0) movep.l d1,3(a0) move.l #aespb,d1 move #$c8,d0 trap #2 ;AES-Aufruf rts vdi: move vdi_h,contrl+12 vdiinit: move d0,contrl move.l #vdipb,d1 moveq #$73,d0 trap #2 ;VDI-Aufruf rts *Benutzerdefiniertes Objekt zeichnen draw: move.l 4(sp),a0 move.l 10(a0),d0 ;x/y-Koordinaten sub.l #$00030000,d0 move.l d0,ptsin add.l #$00060000,d0 add.l 14(a0),d0 move.l d0,ptsin+4 lea contrl,a0 move.l #$02000000,d0 movep.l d0,3(a0) move #8,contrl+10 moveq #11,d0 ;v_rbox bsr vdi ;abgerundete Box zeichnen move.l 4(sp),a0 move.l 26(a0),a1 ;Pointer auf Textstring lea intin,a2 clr d0 clr d1 .loop: move.b (a1)+,d0 beq.s .end move d0,(a2)+ addq #1,d1 bra .loop .end: move.l #$01000000,d0 lea contrl,a1 movep.l d0,3(a1) move d1,contrl+6 move.l 10(a0),ptsin add #17,ptsin+2 moveq #8,d0 ;v_gtext bra vdi user: dc.l draw dc.l spec000 *Daten fr die Dialogbox *---------------------------------------------------------------------------- *verwendetet Objekttypen BOX = 20 BUTTON = 26 STRING = 24 FTEXT = 29 objc000:.dc.w $ffff .dc.w $0001,$0007 .dc.w BOX .dc.w $0000,$0010 .dc.l $00021100 .dc.w $0007,$0004 .dc.w $002b,$000f .dc.w $0002 .dc.w $ffff,$ffff .dc.w STRING .dc.w $0000,$0011 .dc.l user ;" Testdialog fr neue form_do-Routine" .dc.w $0003,$0001 .dc.w $0025,$0801 .dc.w $0003 .dc.w $ffff,$ffff .dc.w FTEXT .dc.w $0008,$0000 .dc.l spec001 ;"Eingabefeld 1: __________" .dc.w $0009,$0005 .dc.w $0019,$0001 .dc.w $0004 .dc.w $ffff,$ffff .dc.w FTEXT .dc.w $0008,$0000 .dc.l spec002 ;"Eingabefeld 2: __________" .dc.w $0009,$0007 .dc.w $0019,$0001 .dc.w $0005 .dc.w $ffff,$ffff .dc.w $781a .dc.w $0011,$0001 .dc.l spec003 ;"Radiobutton 1" .dc.w $0007,$000a .dc.w $000e,$0001 .dc.w $0006 .dc.w $ffff,$ffff .dc.w $791a .dc.w $0011,$0000 .dc.l spec004 ;"Radiobutton 2" .dc.w $0016,$000a .dc.w $000e,$0001 .dc.w $0007 .dc.w $ffff,$ffff .dc.w BUTTON .dc.w $0007,$0000 .dc.l spec005 ;"OK" .dc.w $000c,$000d .dc.w $0009,$0001 .dc.w $0000 .dc.w $ffff,$ffff .dc.w $611a .dc.w $0025,$0000 .dc.l spec006 ;"ABBRUCH" .dc.w $0016,$000d .dc.w $0009,$0001 spec000:.dc.b " Testdialog fr neue form_do-Routine",0,0 spec001:.dc.l txt001,plt001,val001 .dc.w $0003 .dc.w $0006 .dc.w $0000 .dc.w $1180 .dc.w $0000 .dc.w $ffff .dc.w $000b,$001a txt001: .dc.b "@ ",0 plt001: .dc.b "Eingabefeld 1: __________",0 val001: .dc.b "XXXXXXXXXX",0 spec002:.dc.l txt002,plt002,val002 .dc.w $0003 .dc.w $0006 .dc.w $0000 .dc.w $1180 .dc.w $0000 .dc.w $ffff .dc.w $000b,$001a txt002: .dc.b "@ ",0 plt002: .dc.b "Eingabefeld 2: __________",0 val002: .dc.b "XXXXXXXXXX",0 spec003:.dc.b "Radiobutton 1",0 spec004:.dc.b "Radiobutton 2",0 spec005:.dc.b "OK",0 spec006:.dc.b "ABBRUCH",0 ***************************** * Konvertiert durch RSCCONV * * Autor: Uwe Seimet * * (C) 1989 by CCD * ***************************** *---------------------------------------------------------------------------- DATA aespb: dc.l contrl,global,intin,intout,addrin,addrout vdipb: dc.l contrl,intin,ptsin,intout,ptsout bss *diverse AES- und VDI-Arrays contrl: ds.w 11 global: ds.w 15 intin: ds.w 64 intout: ds.w 64 addrin: ds.w 64 addrout: ds.w 64 ptsin: ds.w 64 ptsout: ds.w 64 ev_buff: ds.w 8 ;Puffer fr evnt_multi vdi_h: ds.w 1 ;VDI-Handle even stack: ds.l 100 ;eigener Stackbereich . k`i.. ;`iACMALLOCS Ԩh; *************************************************************** ; * ACCMalloc / ACCMfree: 'dauerhaftes' ACC-Malloc per Trick! * ; *************************************************************** ; * Autor: Lutz Preler, Ahornweg 11, 2904 Hatten * ; *************************************************************** ; * (c) 1992 MAXON Computer GmbH * ; *************************************************************** ; ***************** ; * ACCMalloc: entspr. Malloc; Parameterbergabe anders: ; * IN: d4.l: amount ; * OUT: d4.l: maret ; * USES: d0-d2/a0-a2 ; ***************** ACCMalloc: movem.l a3-a5,-(sp) ; Regs retten clr.l -(sp) ; in Supervisormodus move.w #$20,-(sp) ; Super trap #1 ; GEMDOS addq.l #6,sp move.l d0,-(sp) ; alten SSP auf Stack bsr Get_act_pd ; act_pd -> a4 movea.l (a4),a5 ; akt. PD move.l #TextStart-256,(a4) ; eigener PD ; ** Das Label TextStart mu vor dem ersten Befehl im Text-Segment ** ; ** stehen (evtl. umbenennen). #TextStart-256 ist dann die Adresse ** ; ** der eigenen Basepage. Ntig, da bei ACC Basepageadr. nicht auf ** ; ** dem Stack liegt. ** moveq.l #-1,d0 ; grter move.l d0,-(sp) ; Speicherblock move.w #$48,-(sp) ; Malloc trap #1 ; GEMDOS sub.l d4,d0 ; - Lnge move.l d0,2(sp) ; als Parameter trap #1 ; GEMDOS (Malloc) movea.l d0,a3 move.l d4,2(sp) ; gewnschte Lnge trap #1 ; GEMDOS (Malloc) addq.l #6,sp move.l d0,d4 ; Rckgabewert move.l a3,-(sp) ; Speicherblock move.w #$49,-(sp) ; Mfree trap #1 ; GEMDOS addq.l #6,sp move.l a5,(a4) ; alter PD move.w #$20,-(sp) ; Super (SSP auf Stack) trap #1 ; GEMDOS addq.l #6,sp movem.l (sp)+,a3-a5 ; Regs zurck rts ; ***************** ; * ACCMfree: entspr. Mfree; Parameterbergabe anders: ; * IN: d4.l: saddr ; * OUT: d4.l: mfret ; * USES: d0-d2/a0-a2 ; ***************** ACCMfree: movem.l a3-a5,-(sp) ; Regs retten clr.l -(sp) ; in Supervisormodus move.w #$20,-(sp) ; Super trap #1 ; GEMDOS addq.l #6,sp move.l d0,-(sp) ; alten SSP auf Stack bsr Get_act_pd ; act_pd -> a4 movea.l (a4),a5 ; akt. PD move.l #TextStart-256,(a4) ; eigener PD ; ( *** siehe ACCMalloc! *** ) move.l d4,-(sp) ; Adresse move.w #$49,-(sp) ; Mfree trap #1 ; GEMDOS addq.l #6,sp move.l d0,d4 ; Rckgabewert move.l a5,(a4) ; alter PD move.w #$20,-(sp) ; Super (SSP auf Stack) trap #1 ; GEMDOS addq.l #6,sp movem.l (sp)+,a3-a5 ; Regs zurck rts ; ***************** ; * Get_act_pd ; * IN: Supervisormodus ; * OUT: a4: act_pd-Adresse (a0: sysbase) ; ***************** Get_act_pd: movea.l $4f2,a0 ; sysbase movea.l #$602c,a4 ; Default-act_pd cmpi.w #$102,2(a0) ; TOS-Version >= 1.2? blt Get_actpdx ; nein movea.l 40(a0),a4 ; act_pd holen Get_actpdx: rts . o`i.. ;`iVAR_EDITC hVAR_EDITO ݫhVAR_EDITH hVE_DEMO C hVE_DEMO PRJ ٫h VE_DEMO PRG h /*****************************************************************/ /* Var_edit erzeugt Dialogboxen mit Editfeldern variabler Laenge */ /* */ /* Autor: Wolfgang Heine, 8111 Urfeld */ /* (c) 1992 MAXON Computer GmbH */ /*****************************************************************/ #include #include #include #define TITEL 1 #define TXT_1 2 #define TXT_2 3 #define TXT_3 4 #define AUS 5 #define OK 6 int contrl[12], intin[128], intout[128], ptsin[128], ptsout[128]; char *var_edit(OBJECT tree[], int index, int n, char *pt, char *tx, char *val) /* OBJECT tree[]: uebergebenes Objekt */ /* int index: Objektindex */ /* int n: Laenge des Editfeldes */ /* char *pt, *tx, *val: Zeiger auf Maskentext u.Text */ { /* und Validittszeichen */ register OBJECT *obj; register TEDINFO *ted; register char *s, *t; obj = (OBJECT*) &tree[index]; /* Adresse des Objekts im Baum */ obj->ob_width = 8*n; /* Obj.breite = 8 * Buchst.zahl */ obj->ob_x = (tree[0].ob_width /* Objekt zentrieren */ - obj->ob_width)/2; ted = obj->ob_spec.tedinfo; /* Tedinfoadresse ermitteln */ ted->te_tmplen = n + 1; /* Laenge der Textmaske */ /* Nullbyte nicht vergessen */ strcpy (s = ted->te_ptmplt, pt); /* Maskentext eintragen */ while( strlen(ted->te_ptmplt) < n ) /* Rest mit "_" auffuellen */ strcat(ted->te_ptmplt, "_"); t = ted->te_pvalid; /* Fuer jedes "_" im Maskentext */ while(*s) /* wird im Validitaetsstring das*/ if (*s++ == '_') /* in val uebergebene Zeichen */ *t++ = *val; /* eingetragen */ *t= '\0'; /* Mit Nullbyte abschlieen */ ted->te_txtlen=strlen(ted->te_pvalid)+1;/* Textlaenge=Validlaenge+Nullb.*/ return strcpy (ted->te_ptext, tx); /* Text eintragen und Adresse */ /* zurueckmelden */ } /*---------------------*/ /* Dialogfeld aufrufen */ /*---------------------*/ int hndl_dial (OBJECT tree[],int cur,int x,int y,int w,int h) /* OBJECT tree []: Baumadresse */ /* int cur,x,y,w,h: Wo soll der Cursor sitzen? */ { int xd, yd, wd, hd; int exit_objc; /* Nummer d. Exit-Buttons */ form_center (tree, &xd, &yd, &wd, &hd); /* Formular zentrieren */ form_dial(FMD_START, x,y,w,h, xd,yd,wd,hd); /* Bildschirmbereich res. */ form_dial(FMD_GROW, x,y,w,h, xd,yd,wd,hd); /* Growbox */ objc_draw(tree,ROOT,MAX_DEPTH, xd,yd,wd,hd); /* Dialogbox zeichnen */ exit_objc = form_do (tree, cur ) & 0x7FFF; /* Dialog abhandeln */ form_dial(FMD_SHRINK, x,y,w,h, xd,yd,wd,hd); /* Shrinkbox */ form_dial(FMD_FINISH, x,y,w,h, xd,yd,wd,hd); /* Bildschirmbereich frei-*/ /* geben und Hintergrund */ /* herstellen */ objc_change(tree,exit_objc, 0, 0,0,639,399,NORMAL, 0); /* selektierten Knopf wieder normal darstellen */ return (exit_objc); /* Exitbutton melden */ } N|H,$H8*oH$ԂԀA(I1A4*AH…1B$h rD5A(j LN`C jN0H/ jNe j` _ffB jNR@5@"o RNL4NuHQO,H><:8/06/2GIKHWHSHT"M NNO ??????42B@NO ??????42pNO ???4rB@ NN\O0 NN|>??????42pNO ??????42pNO BgBg?<?<BgBBBA0 NNO 0POLxNu_D    .     contrlptsinintinvar_edit hndl_dial form_dial form_centerstrcpyform_dostrcatptsoutintout objc_drawstrlen objc_change char *var_edit(OBJECT tree[], int index, int n, char *pt, char *tx, char *val); /* OBJECT tree[]: uebergebenes Objekt */ /* int index: Objektindex */ /* int n: Laenge des Editfeldes */ /* char *pt, *tx, *val: Zeiger auf Maskentext u.Text */ int hndl_dial (OBJECT tree[],int cur,int x,int y,int w,int h); /* OBJECT tree []: Baumadresse */ /* int cur,x,y,w,h: Wo soll der Cursor sitzen? */ /*****************************************************************/ /* Var_edit erzeugt Dialogboxen mit Editfeldern variabler Laenge */ /* */ /* Autor: Wolfgang Heine, 8111 Urfeld */ /* (c) 1992 MAXON Computer GmbH */ /*****************************************************************/ #include #include #include #include "var_edit.h" #define TITEL 1 #define TXT_1 2 #define TXT_2 3 #define TXT_3 4 #define AUS 5 #define OK 6 int contrl[12], intin[128], intout[128], ptsin[128], ptsout[128]; typedef char STRING[80]; STRING s[] = { "", /* s[ 0] */ "", /* s[ 1] */ "", /* s[ 2] */ "", /* s[ 3] */ "", /* s[ 4] */ "", /* s[ 5] */ "", /* s[ 6] */ "", /* s[ 7] */ "", /* s[ 8] */ "", /* s[ 9] */ "", /* s[10] */ "", /* s[11] */ "Ende", /* s[12] */ "OK" /* s[13] */ }; TEDINFO ted[] = { s[ 0], s[ 1], s[ 2], 3, 6, 2, 0x1180, 0x0, -4, -2, -2, s[ 3], s[ 4], s[ 5], 3, 6, 0, 0x1180, 0x0, -1, -2, -2, s[ 6], s[ 7], s[ 8], 3, 6, 0, 0x1180, 0x0, -1, -2, -2, s[ 9], s[10], s[11], 3, 6, 0, 0x1180, 0x0, -1, -2, -2 }; OBJECT baum[] = { -1, 1, 6, G_BOX, NONE, OUTLINED, 0x21100L, 0, 0, -2, 200, 2,-1,-1, G_BOXTEXT, NONE, OUTLINED|SHADOWED, &ted[0], -2, 20, -2, 18, 3,-1,-1, G_FTEXT, EDITABLE, NORMAL, &ted[1], -2, 60, -2, 18, 4,-1,-1, G_FTEXT, EDITABLE, NORMAL, &ted[2], -2, 80, -2, 18, 5,-1,-1, G_FTEXT, EDITABLE, NORMAL, &ted[3], -2, 100, -2, 18, 6,-1,-1, G_BUTTON, SELECTABLE|EXIT|OUTLINED, NORMAL, s[12], -2, 130, 70, 20, 0,-1,-1, G_BUTTON, SELECTABLE|EXIT|DEFAULT|LASTOB, NORMAL, s[13], -2, 130, 70, 20 }; /**************************************************************************/ main() { char help[80]; int n; /* Buchstaben im Editfeldfeld */ char *txt1_adr, *txt2_adr, *txt3_adr; /* Adressen der Texte */ appl_init(); /* Applikation anmelden */ for ( n = 25; n < 85 ; n += 10) /* Verschiedene n probieren */ { baum[0].ob_width = n*8+60; /* Breite des Vaterobjekts */ baum[AUS].ob_x=baum[0].ob_width/2 /* Ende-Button und OK-Button */ - 10-baum[AUS].ob_width; /* symmetrisch zur Mitte */ baum[OK].ob_x=baum[0].ob_width/2+10; /* anordnen */ /* 3 Editfelder der Laenge n einrichten und Texte eintragen */ sprintf(help,"%s %d %s"," Editfelder mit", n, "Buchstaben "); var_edit(baum, TITEL, strlen(help),"",help,"X"); txt1_adr = var_edit(baum, TXT_1, 18, "Datum : __.__.19__","310790","9"); txt2_adr = var_edit(baum, TXT_2, n, "Zeile 1: ","Edit-","X"); txt3_adr = var_edit(baum, TXT_3, n, "Zeile 2: ","felder","X"); /* Dialogfeld aufrufen, Prog. beenden, falls Ende-Button gedrueckt ist*/ if ( hndl_dial(baum, TXT_1, 0,0,0,0) == AUS ) break; printf("\033Y "); /* od. "\033Y%c%c",y+' ',x+' ' */ printf("\033K%s\n",txt1_adr); /* Zeilen freimachen und aus- */ printf("\033K%s\n",txt2_adr); /* gelesene Texte anschreiben */ printf("\033K%s\n",txt3_adr); puts(" Taste druecken!"); } appl_exit(); /* Programm beenden */ return(0); } ve_demo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o var_edit.o ve_demo (var_edit.h) pcstdlib.lib pctoslib.lib pcgemlib.lib `HV``D>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#63: k #@ Ј<.@#<:8/06/2GIKHWHSHT"M NNO ??????42B@NPO ??????42pN6O ???4rB@ NN\O0 NN|>??????42pNO ??????42pNO BgBg?<?<BgBBBA0 NNO 0POLxNuH>ON:vE$GI`0H|<5@H|j5@2*H| 5AHk?Hk "K LNVO Hk%HTC/ LN "p J"_NPOHkAHk:C'rp JNPO*HHk%HkMCC2p JNPO,HHk%Hk]CS2p JNPO.BgBgBBBAp JN6XO[@g@AdN/ AiNXO/AiNvXO/AiNjXOAoN| |UmNB@OTL|NuA(p"@ "BylA1B3l3nO"Nu/ Hz?<&NN\O$_Nu/YOM,C HzaZXOXO,_NuH@B@H@CraJ@kNu.Vp`/YOM, IC HzaXO VBXO,_Nu"VS@eQ,NuH8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp a 8$Wb<gt<.f6<*f4`$<0< b ACp a$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA aA pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 CaAp `\/ / B@JgB)g@)fJ&Q(i ge"// Ia"_ _J@f&Q`B@"(_&_Nu3 Hp`#H#H&HJfS#K " I(Ia:"LJ@f`H:$H&I(S&gfJg^+g`)ft,k x$ڹd SfRe`.&// Ka$"J@k,f4(SSfRf& L\Nu3 Hp`"`&x,A'J'JE8'J & KaxJ@kfRf"`(g4(f>"P | dNu?/a8 _2J@f 0Nu3 HpNuC!I!IR!I `H&H(k6+"+g0DtaJk+fZ"S"L Ip gSj`*| // " 0a`"_"JkNgPAp SjH@" 0a<߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"Hp` 3!Hp& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!H`0123456789abcdefghijklmnopqrstuvwxyz/ &y. g/ &S?<INA\O`&y2 g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#p `p`#tA000000p*`#tA0000000 0 p/`j#t3p2`X#tA0000000 0 0p3`(/ #tp6a"_2"o2"o2"o 2Nu/ 3\@@A"C^B@22220<"<`NBA0$_Nu\zt!t _EndeOKTD4$t0<PdF'dF%s %d %s Editfelder mitBuchstaben XDatum : __.__.19__3107909Zeile 1: Edit-Zeile 2: felderY K%s Taste druecken!r  TH6@b `  ~.,& ,& L8. |`i.. FFF }`iDIR_BAUM `i6FILEINFO `iIHARDINFO `i_. `i.. {`iFFF TTP qLVF_FFF S Ckx`. o,hOjHzaanB?< NA/@.8NA\2CE"~zxvtJFk4g^A-H0aPHp"HzapAaHzavtaHzahLaGA:\?a2JFjRB| fr2ta^HnFa,"taRHn^a r2taDHnqa?<NATHnaBgNAH//?< NA\L.NuH??<NAXLNuH@C<0@@Cx&!pВUD@<0gxa҃QLNuJfJBfp0` d'B@;A B.|  gS -fR  gS :fp(T< d<  gSCE"BBBQtrg< g< g<.g8<?f JBf(QQ`"<*ft`JBf<ae <zbPQ`JBf  PQCE*rg8< g2< g,<?fQQ`&<*g$<ae <zbPQ`  PQNuS@2( fP g"g‘f<"(©f."(©f .falRD(HA(ځ( gD g> P. g8 P..g2H瀐.R\  PabRCL A QVNuH.g\  BGpg< g<.f  gap`LNuH~0-a(@&@?.2- m??-/ /<NMOJk >-SG, g gaI Q K0-L~NuH ,&Lzp0-ap(@JEf'L?.0U@m ??-/ /<NMOJk>-OSG, g g T. g T..gaI QRE0@ n 60j'E LNuH=@afp0-Ѐa-@ 0-a-@?.?- ?-/./<NMOJka: n X2-WApJXfR@QLNu?.?<NMX-@g*@Nu n"n 0-2-gHS@T2QNu||e|2(I|e|2VQNu/R<".AӮ zXe0 _Nu Dateien mit insgesamt Bytes gefunden. Ordner sind vorhanden. Taste drcken. EeFFF V1.5 (Fast-File-Finder) 1989 by -soft, Markus Fritze EfLaufwerk : ( Bytes frei.) L************************************************* * Link-Virus-Finder V1.5 * * und Fast-File-Finder V1.5 * * (c)1989 by Maxon Computer * * von -soft, Markus Fritze * * entwickelt mit Turbo-Ass V1.4 * ************************************************* ;Schalter: virus EQU 0 ;0:Fast-File-Finder, <>0:Link-Virus-Finder IF virus OUTPUT 'LVF.TTP' ;Link-Virus-Finder ELSE OUTPUT 'FFF.TTP' ;Fast-File-Finder ENDC OPT F+,W+ ;Warnungen an,Fast-Load an max_prgs EQU 1000 ;max.1000 Programme im LVF max_sektorsize EQU 8192 ;max.Sektorgre ;A6-Register zeigt auf das BSS-Segment BASE A6,BSS ;Struktur des BIOS-Parameter-Blocks definieren PART 'BPB-Struktur' RSRESET recsiz:RS.W 1 ;Bytes pro Sektor clsiz: RS.W 1 ;Sektoren pro Cluster clsizb:RS.W 1 ;Bytes pro Cluster rdlen: RS.W 1 ;Lnge des Root-Directories fsiz: RS.W 1 ;Lnge einer FAT fatrec:RS.W 1 ;Startsektor der 2.FAT datrec:RS.W 1 ;Starts. des 1.freien Sektors numcl: RS.W 1 ;Gesamtanzahl der Cluster bflags:RS.W 1 ;Bit0=1 bei 16-bit-FAT ENDPART _drvbits EQU $04C2 ;Die Bitmaske der Laufwerke PART 'main' anfang: movea.l 4(SP),A0 ;Ptr auf die Basepage movea.l $18(A0),A6 ;Ptr auf den BSS-Bereich lea own_stack(PC),SP pea init_text(PC) bsr print_line ;Startup-Meldung IF virus lea data_buff(A6),A0 move.l A0,data_base(A6) clr.w -(SP) pea fname(A6) move.w #$3D,-(SP) trap #1 ;Fopen() addq.l #8,SP move.l D0,D7 bmi.s anfang1 ;Fehler move.l data_base(A6),-(SP) move.l #max_prgs*32,-(SP) move.w D7,-(SP) move.w #$3F,-(SP) trap #1 ;Fread() - Datenblock einlesen lea 12(SP),SP move.w D7,-(SP) move.w #$3E,-(SP) trap #1 ;Fclose() addq.l #4,SP anfang1: ENDC bsr convert ;Commandline auswerten clr.l -(SP) move.w #$20,-(SP) trap #1 ;Supervisormode an move.l D0,2(SP) move.l _drvbits.w,D7 ;Variable auslesen trap #1 ;Usermode wieder an addq.l #6,SP move.w D7,D1 ;_drvbits nach D1 IF !virus lea search_mask(A6),A1 ;Suchmaske lea search_chars(A6),A2 ;Suchdaten ENDC moveq #$18,D7 ;Ordner & Vol-Label ignorieren moveq #0,D5 ;Bytes der gefundenen Dateien moveq #0,D4 ;Anzahl der gefundenen Dateien moveq #0,D3 ;Anzahl der Ordner moveq #2,D2 ;mit Drive C geht es los tst.w D6 ;keine Laufwerksangabe? bmi.s loop ;Genau! => move.w D6,D2 ;das spezielle Laufwerk testen loop: btst D2,D1 ;Laufwerk vorhanden? beq.s loop1 ;Nein! => movea.l #heap,A0 adda.l A6,A0 move.l A0,heap_pnt(A6) ;Heap zurcksetzen move.w D2,D0 bsr set_drive ;Laufwerk anmelden, FAT lesen movem.l D1-D3,-(SP) move.l D0,D1 pea drive_text(PC) bsr print_line moveq #'A',D0 add.b D2,D0 bsr chrout ;aktuelles Drive ausgeben pea drive_text2(PC) bsr print_line moveq #7,D2 ;max.8 Stellen ausgeben bsr dez_out ;freien Speicher ausgeben pea drive_text3(PC) bsr print_line ;"Bytes frei" movem.l (SP)+,D1-D3 bsr read_dir ;Kompletten Baum einlesen lea pfad(A6),A3 move.b #'A',(A3) add.b D2,(A3)+ ;Laufwerkskennung move.b #':',(A3)+ move.b #'\',(A3)+ ;Root-Pfad festlegen move.w D1,-(SP) bsr hunt_dir ;Baum durchsuchen move.w (SP)+,D1 loop1: tst.w D6 ;Laufwerksangabe? bpl.s loop2 ;Ja! => Fertig addq.w #1,D2 cmp.w #32,D2 ;bis Bit 32 wird hochgezhlt bne.s loop ;noch nicht alle? Stimmt! => loop2: IF virus moveq #0,D1 move.w virus_count(A6),D1 ;Viren gefunden? beq.s loop3 ;Nein! => moveq #4,D2 ;max.5 Stellen ausgeben bsr dez_out pea viren_text(A6) bsr print_line ;verseuchte Dateien gefunden loop3: ENDC moveq #0,D1 move.w D4,D1 ;Anzahl der 'Hits' moveq #5,D2 ;max.6 Stellen ausgeben bsr dez_out pea files_text(A6) bsr print_line move.l D5,D1 ;Lnge aller Dateien zusammen moveq #7,D2 ;max.8 Stellen ausgeben bsr dez_out pea files_text2(A6) bsr print_line moveq #0,D1 move.w D3,D1 ;Anzahl der Ordner moveq #4,D2 ;max.5 Stellen ausgeben bsr dez_out pea folders_text(A6) bsr.s print_line move.w #7,-(SP) trap #1 ;auf Taste warten addq.l #2,SP IF virus bclr #5,D0 cmp.b #'J',D0 ;Schreiben? bne.s _exit ;Nein! => movea.l data_base(A6),A4 movea.l A4,A3 ;Datenbasis merken code: tst.l (A4) ;Ende der Liste? beq.s code2 ;Ja! => lea 24(A4),A4 bra.s code code2: suba.l A3,A4 ;Lnge aller Daten clr.w -(SP) pea fname(A6) move.w #$3C,-(SP) trap #1 ;Fcreate() addq.l #8,SP move.l D0,D7 bmi.s _exit ;Fehler move.l A3,-(SP) ;Basisadresse der Daten move.l A4,-(SP) ;Lnge move.w D7,-(SP) move.w #$40,-(SP) trap #1 ;Fwrite() lea 12(SP),SP move.w D7,-(SP) move.w #$3E,-(SP) trap #1 ;Fclose() addq.l #4,SP ENDC _exit: pea exit_text(A6) bsr.s print_line ;Cursor wieder aus, etc. clr.w -(SP) trap #1 ;Programmende ENDPART ************************************************* * String auf dem Stack ausgeben * ************************************************* PART 'print_line' print_line: movem.l D0-D2/A0-A2,-(SP) move.l 4+6*4(SP),-(SP) move.w #$09,-(SP) trap #1 ;Cconws() addq.l #6,SP movem.l (SP)+,D0-D2/A0-A2 move.l (SP)+,(SP) ;Stack korrigieren rts ENDPART ************************************************* * Zeichen in D0 ausgeben * ************************************************* PART 'chrout' chrout: movem.l D0-D2/A0-A2,-(SP) move.w D0,-(SP) move.w #$02,-(SP) trap #1 ;Cconout() addq.l #4,SP movem.l (SP)+,D0-D2/A0-A2 rts ENDPART ********************************************** * positive Dezimal-Zahl in D1 * * ohne Fhrungsnullen ausgeben * * max.Anzahl der Stellen minus 1 in D2 * ********************************************** PART 'dez_out' dez_out: movem.l D0-D4/A1,-(SP) lea dez_tab(PC),A1 ;Zeiger auf die Tabelle move.w D2,D0 ;Anzahl der Stellen-1 add.w D0,D0 ;mal 4 add.w D0,D0 ;(schneller als LSL.W #2,D0!) lea 4(A1,D0.w),A1 ;Ptr auf die Stellenzahl moveq #0,D4 ;fhrende Nullen ignorieren dez_out1: move.l -(A1),D3 ;Tabellenwert moveq #-'0',D0 ;wird zu -'1',-'2',-'3',... dez_out2: sub.l D3,D1 ;SUB bis zum Unterlauf dbcs D0,dez_out2 ;Unterlauf? Nein! => neg.w D0 ;z.B. -'1' => '1' cmp.b #'0',D0 ;eine Null? beq.s dez_out4 ;Ja! => moveq #-1,D4 ;ab nun werden auch Nullen dez_out3: bsr.s chrout ;Zeichen in D0 ausgeben dez_out5: add.l D3,D1 ;den Unterlauf zurck dbra D2,dez_out1 ;schon alle Stellen? movem.l (SP)+,D0-D4/A1 rts dez_out4: tst.b D4 ;Nullen ausgeben? bne.s dez_out3 ;Ja! => tst.w D2 ;letzte Ziffer? bne.s dez_out5 ;Nein! => dann ignorieren moveq #'0',D0 ;wenn der gesamte Wert 0 ist, bra.s dez_out3 ;zumindest eine 0 ausgeben! dez_tab: DC.L 1,10,100,1000,10000,100000 DC.L 1000000,10000000,100000000,1000000000 ENDPART ************************************************* * convert() - Die Commandline auswerten * * * * Dabei wird die Variable "flag" gesetzt, * * das D6-Register (Laufwerk) definiert und * * die Suchmaske und der Suchstring aus dem * * Filenamen zusammengesetzt. * ************************************************* PART 'convert' convert: lea anfang-128+1(A6),A0 ;Commandline clr.b flag(A6) ;alle Flags lschen moveq #-1,D6 ;keine Laufwerksangabe convert1: cmpi.b #' ',(A0)+ ;Spaces berlesen beq.s convert1 subq.l #1,A0 cmpi.b #'-',(A0) ;folgt noch was? bne.s convert2 ;Nein! => addq.l #1,A0 bset #0,flag(A6) ;Files nur zhlen convert2: cmpi.b #' ',(A0)+ ;Spaces berlesen beq.s convert2 subq.l #1,A0 IF virus cmpi.b #'+',(A0) ;folgt noch was? bne.s convert3 ;Nein! => addq.l #1,A0 bset #1,flag(A6) ;alle Files bernehmen convert3: cmpi.b #' ',(A0)+ ;Spaces berlesen beq.s convert3 subq.l #1,A0 cmpi.b #':',(A0) bne.s convert8 addq.l #1,A0 ;Doppelpunkt ignorieren convert8: moveq #0,D0 move.b (A0),D0 bmi.s convert14 ;Code>127 => kein Laufwerk bclr #5,D0 subi.b #'A',D0 bmi.s convert14 ;<'A' => kein Laufwerk cmp.b #32,D0 bhs.s convert14 ;>maxdrive => kein Laufwerk move.w D0,D6 ;Laufwerksangabe merken convert14: rts ELSE cmpi.b #':',(A0) bne.s convert6 moveq #0,D0 move.b 1(A0),D0 addq.l #2,A0 bclr #5,D0 cmp.b #32,D0 bhs.s convert6 ;>maxdrive => kein Laufwerk move.w D0,D6 ;Laufwerksangabe merken convert6: cmpi.b #' ',(A0)+ ;Spaces berlesen beq.s convert6 subq.l #1,A0 lea search_mask(A6),A1 ;Suchmaske lea search_chars(A6),A2 ;Suchdaten clr.l (A1)+ clr.l (A1)+ ;alle Suchmasken lschen clr.l (A1) subq.l #8,A1 moveq #0,D2 ;kein Allquantor moveq #7,D1 ;max.8 Zeichen Filename convert7: move.b (A0)+,D0 beq convert19 ;Ende des Filenames cmp.b #' ',D0 ;Space als Ende? beq convert19 ;Ja! => cmp.b #13,D0 ;CR als Ende? beq convert19 ;Ja! => cmp.b #'.',D0 ;Start der Extension? beq.s convert12 ;Ja! => cmp.b #'?',D0 ;Existenzquantor? bne.s convert8 ;Nein! => tst.w D2 ;Allquantor schon angegeben? bne.s convert11 ;Ja! => sf (A1)+ sf (A2)+ ;Zeichen ignorieren bra.s convert11 ;weiter => convert8: cmp.b #'*',D0 ;Allquantor? bne.s convert9 ;Nein! => moveq #-1,D2 ;Allquantor bra convert7 convert9: tst.w D2 ;Allquantor schon angegeben? bne.s convert11 ;Ja! => cmp.b #'a',D0 blo.s convert10 cmp.b #'z',D0 bhi.s convert10 bclr #5,D0 ;in Grobuchstaben wandeln convert10: move.b D0,(A2)+ ;Zeichen bernehmen st (A1)+ ;Maske dazu setzen convert11: dbra D1,convert7 ;max.8 Zeichen bra convert13 convert12: tst.w D2 ;Allquantor angegeben? bne convert13 ;Ja! => move.b #' ',(A2)+ ;Filenamen mit ' ' st (A1)+ ;auffllen dbra D1,convert12 convert13: lea search_mask+8(A6),A1 ;Suchmaske lea search_chars+8(A6),A2 ;Suchdaten moveq #2,D1 ;max.3 Zeichen Extension convert14: move.b (A0)+,D0 beq.s convert17 ;Ende des Filenames cmp.b #' ',D0 ;Space als Ende? beq.s convert17 ;Ja! => cmp.b #13,D0 ;CR als Ende? beq.s convert17 cmp.b #'?',D0 ;Existenzquantor? bne.s convert15 ;Nein! => sf (A1)+ sf (A2)+ ;Zeichen ignorieren bra.s convert18 ;weiter => convert15: cmp.b #'*',D0 ;Allquantor? beq convert19 ;Nein! => cmp.b #'a',D0 blo.s convert16 cmp.b #'z',D0 bhi.s convert16 bclr #5,D0 ;in Grobuchstaben wandeln convert16: move.b D0,(A2)+ ;Zeichen bernehmen st (A1)+ ;Maske dazu setzen dbra D1,convert14 ;schon alle max.8 Zeichen bra convert19 convert17: move.b #' ',(A2)+ ;Extension mit st (A1)+ ;Space auffllen convert18: dbra D1,convert17 convert19: rts ENDC ENDPART ************************************************* * hunt_dir() - Kompletten Dir-Baum ab A0 * * durchsuchen, dabei steht die Anzahl der * * Eintrge im Directory in D0. * * * * Diese Routine ruft sich selbst rekursiv * * auf, um auch beliebig tiefe Ordnerebene zu * * durchsuchen. * * * * Der Baum mu durch read_dir() im Speicher * * liegen, d.h. bereits mit Pointern ver- * * kettet sein. * ************************************************* PART 'hunt_dir' hunt_dir: subq.w #1,D0 ;fr DBRA hunt_dir1: move.w D7,D1 ;Illegale Fileattr-Bits and.b 11(A0),D1 ;Flags dazu bne hunt_dir3 ;Datei nicht finden! => cmpi.b #$E5,(A0) ;gelschte Datei? beq hunt_dir2 ;Ja! => IF !virus move.l (A0),D1 beq hunt_dir4 ;Ende des Directories => and.l (A1),D1 cmp.l (A2),D1 ;Zeichen 1-4 des Filesnamens bne hunt_dir3 move.l 4(A0),D1 and.l 4(A1),D1 cmp.l 4(A2),D1 ;Zeichen 5-8 des Filenamens bne hunt_dir3 move.l 8(A0),D1 and.l 8(A1),D1 cmp.l 8(A2),D1 ;die Extension vergleichen bne hunt_dir3 btst #0,flag(A6) ;Dateien nur zhlen? bne.s print_fname4 ;Ja! => bsr print_fname ;Filenamen ausgeben print_fname4: addq.w #1,D4 ;Dateien zhlen movep.w 31(A0),D1 move.b 30(A0),D1 swap D1 ;Dateilnge movep.w 29(A0),D1 ;von Intel move.b 28(A0),D1 ;nach 68000er add.l D1,D5 ;zur Gesamtlnge ELSE tst.b (A0) beq hunt_dir4 ;Ende des Directories => addq.w #1,D4 ;eine Datei mehr gefunden move.w 8(A0),D1 ;Zeichen 1+2 der Ext. holen cmp.w #'PR',D1 ;PRG, PRX, etc. beq.s found_file cmp.w #'TO',D1 ;TOS beq.s found_file cmp.w #'TT',D1 ;TTP beq.s found_file cmp.w #'AC',D1 ;ACC, ACX, etc. beq.s found_file cmp.w #'AP',D1 ;APP beq.s found_file cmp.w #'DR',D1 ;DRV (Treiber) beq.s found_file cmp.w #'SY',D1 ;SYS (Plattentreiber!) bne hunt_dir3 found_file: move.l D0,-(SP) regs REG D1-D4/D6-A2/A4-A6 movem.l regs,-(SP) movep.w 27(A0),D0 move.b 26(A0),D0 ;Cluster ins Intel-Format move.w drive(A6),-(SP) ;aktuelles Drive subq.w #2,D0 mulu clsiz(A5),D0 ;mal Sektoren pro Cluster add.w datrec(A5),D0 ;+ erster freier Sektor move.w D0,-(SP) ;= abs. Sektor move.w #1,-(SP) ;einen Sektor einlesen pea sektor_buffer(A6) ;in den Buffer move.l #$040000,-(SP) trap #13 ;Rwabs() - Sektor einlesen lea 14(SP),SP tst.l D0 bmi _exit lea sektor_buffer(A6),A2 moveq #0,D0 cmpi.w #$601A,(A2) ;Programmkennung? bne.s count_loop1 ;Nein! => lea 28(A2),A0 ;Zeiger auf den Programmstart cmpi.w #$487A,(A0)+ ;PEA bne.s no_virus ;Nein! => cmpi.w #$FFFE,(A0)+ ;*-2(PC) bne.s no_virus ;Nein! => cmpi.w #$4EF9,(A0) ;c't-Virus? beq virus2 ;JA! =>> cmpi.l #$207A0006,(A0)+ ;VCS-Virus? bne.s no_virus ;Nein! => cmpi.l #$4EFB8800,(A0) beq virus1 ;JA! =>> no_virus: moveq #127,D2 count_loop: eor.w D2,D0 ;Prfsumme errechnen sub.w (A2)+,D0 addq.w #1,D0 dbra D2,count_loop tst.w D0 bne.s count_loop1 moveq #213,D0 ;die Prfsumme ist NIE 0! count_loop1: movem.l (SP),regs ;Chksumme in D0 tst.l D0 ;Prfsumme=0? beq check_it6 ;dann kein Programm! => movea.l data_base(A6),A1 bra.s check_it0 check_it2: lea 24(A4),A1 ;der nchste Eintrag movea.l A2,A0 ;auf den Filenamen zurck check_it0: movea.l A0,A2 ;A0 retten movea.l A1,A4 ;A1 retten tst.l (A1) ;Tabelle ist leer, bzw. Ende beq.s check_it3 ;Neuer Eintrag ntig! => moveq #4,D1 ;nur 10(!) Buchstaben check_it1: cmpm.w (A1)+,(A0)+ ;vergleichen dbne D1,check_it1 bne.s check_it2 ;ungleich => lea 10(A4),A1 ;Zeiger auf die Prfsumme moveq #6,D1 ;max.7 Prfsummen check_it5: tst.w (A1) beq.s check_it4 ;Prfsumme nicht gefunden cmp.w (A1)+,D0 dbeq D1,check_it5 ;weiter vergleichen => lea -12(A1),A1 beq.s check_it8 ;Prfsumme ist ok! => check_it4: movea.l A2,A0 bsr print_fname ;Filenamen ausgeben pea fehler_text(A6) bsr print_line ;Meldung machen! btst #1,flag(A6) ;stets bernehmen? bne.s check_it7 ;Ja! => movem.l D0/D2/A0-A2,-(SP) move.w #7,-(SP) trap #1 ;auf Taste warten addq.l #2,SP bclr #5,D0 move.w D0,D1 movem.l (SP)+,D0/D2/A0-A2 cmp.b #'J',D1 ;bernehmen? bne.s check_it6 ;Nein! => check_it7: move.w D0,(A1) ;Prfsumme kopieren addq.w #1,D5 bra.s check_it6 check_it3: move.l (A2)+,(A4)+ ;neuen Eintrag move.l (A2)+,(A4)+ ;Filenamen kopieren move.w (A2)+,(A4)+ ;(nur 10 Buchstaben!) move.w D0,(A4) ;1.Prfsumme addq.w #1,D5 movem.l (SP),regs bsr print_fname ;Filenamen ausgeben pea new_text(A6) bsr print_line bra.s check_it6 check_it8: btst #0,flag(A6) ;Ausgabe? bne.s check_it6 ;Nein! => movem.l (SP),regs bsr print_fname ;Filenamen ausgeben bra.s check_it6 virus1: movem.l (SP),regs ;Filenamen nach A0 lea virus1_text(A6),A4 ;VCS-Linkvirus bra.s check_it9 virus2: movem.l (SP),regs ;Filenamen nach A0 lea virus2_text(A6),A4 ;Milzbrand-Virus check_it9: bsr.s print_fname ;Fname ausgeben pea virus_text(A6) bsr print_line ;Meldung machen! move.l A4,-(SP) bsr print_line addq.w #1,virus_count(A6) ;Virenanzahl check_it6: movem.l (SP)+,regs move.l (SP)+,D0 ENDC hunt_dir3: btst #4,11(A0) ;ein Ordner? beq.s hunt_dir2 ;Nein! => cmpi.b #$E5,(A0) ;Gelscht? beq.s hunt_dir2 ;Ja! => cmpi.w #'. ',(A0) beq.s hunt_dir2 ;Dummy-Eintrge ignorieren cmpi.w #'..',(A0) beq.s hunt_dir2 movem.l D0/A0/A3,-(SP) REPT 8 move.b (A0)+,(A3)+ ENDR move.b #'.',(A3)+ REPT 3 move.b (A0)+,(A3)+ ;in den Pfad kopieren ENDR addq.l #1,A0 move.b #'\',(A3)+ move.l (A0)+,D0 ;Baumlnge in Eintrgen movea.l (A0),A0 bsr hunt_dir addq.w #1,D3 ;INC Anzahl der Ordner movem.l (SP)+,D0/A0/A3 hunt_dir2: lea 32(A0),A0 ;=> nchsten Eintrag dbra D0,hunt_dir1 ;alle Eintrge durch? hunt_dir4: rts ENDPART ************************************************* * Filenamen ab A0 ausgeben * ************************************************* PART 'print_fname' print_fname: movem.l D0-D2/A0-A3,-(SP) REPT 8 move.b (A0)+,(A3)+ ;Filenamen ENDR move.b #'.',(A3)+ REPT 3 move.b (A0)+,(A3)+ ;an den Pfad anhngen ENDR btst #4,(A0) ;ein Ordner? beq.s print_fname0 move.b #'\',(A3)+ ;dann auch so abschlieen print_fname0: move.b #13,(A3)+ ;CR move.b #10,(A3)+ ;LF clr.b (A3) lea pfad(A6),A3 print_fname1: moveq #0,D0 move.b (A3)+,D0 ;Zeichen holen beq.s print_fname2 ;Ende des Pfades => cmp.b #' ',D0 ;Spaces ignorieren beq.s print_fname1 ;nchstes Zeichen => cmp.b #'.',D0 ;Extension erreicht? bne.s print_fname3 ;Nein! => cmpi.b #' ',(A3) ;es folgt ein " "? beq.s print_fname1 ;dann den "." ignorieren print_fname3: bsr chrout ;das Zeichen ausgeben bra.s print_fname1 print_fname2: movem.l (SP)+,D0-D2/A0-A3 rts ENDPART ************************************************* * read_dir() - Kompletten Dir-Baum einlesen * * (ab A0 liegt er, Lnge in D0) * * Diese Routine liest das Root-Directory ein * * und ruft dann bei jedem Ordner die Routine * * "read_sub_dir" auf, welche sich selbst * * wieder rekursiv aufrufen kann. * ************************************************* PART 'read_dir' read_dir: movem.l D1-D7/A1-A6,-(SP) move.w rdlen(A5),D0 ;Lnge des Root-Dirs mulu recsiz(A5),D0 ;mal Sektorgre bsr get_mem ;Speicher anfordern movea.l D0,A4 ;Zeiger auf das ROOT-Dir movea.l D0,A3 ;Anfang des Root-Dir move.w drive(A6),-(SP) ;aktuelles Drive move.w fatrec(A5),D1 add.w fsiz(A5),D1 move.w D1,-(SP) ;Startsektor des Root-Dir move.w rdlen(A5),-(SP) ;Lnge der FAT move.l A4,-(SP) ;in den Buffer move.l #$040000,-(SP) trap #13 ;Rwabs() - DIR einlesen lea 14(SP),SP tst.l D0 bmi _exit move.w rdlen(A5),D7 ;Lnge des Root-Dir mulu recsiz(A5),D7 ;mal Sektorgre lsr.l #5,D7 ;\32 Bytes (Eintraggre) subq.w #1,D7 ;Gesamtanzahl der Eintrag-1 hunt_dir_loop: btst #4,11(A4) ;ein Ordner? beq.s hunt_dir_loop1 ;Nein! => cmpi.b #$E5,(A4) ;gelschter Ordner? beq.s hunt_dir_loop1 ;Ja! => bsr.s read_sub_dir hunt_dir_loop1: lea 32(A4),A4 ;nchster Eintrag dbra D7,hunt_dir_loop ;alle Eintrge? movea.l A3,A0 ;Anfangsadresse des Dirs move.w rdlen(A5),D0 ;Lnge des Dirs in Bytes mulu recsiz(A5),D0 ;errechnen lsr.l #5,D0 ;\32 Bytes (Eintragsgre) movem.l (SP)+,D1-D7/A1-A6 rts ENDPART ************************************************* * read_sub_dir() - Unterverzeichnisse ab A4 * * rekursiv einlesen * * A4 zeigt auf den Ordner, der eingelesen * * werden soll. Es wird die Clusternummer * * ermittelt, dann geht's los. Damit * * "hunt_dir" das alles richtig hinbekommt, * * werden die Eintrge mit Langworten * * (Zeigern) verkettet. Dazu steht im Ordner- * * eintrag (der ist 32 Bytes lang) bei Offset * * 16 ein Langwort, welches auf den Ordner * * zeigt. Beim Offset 20 steht die max. Anzahl * * an Eintrgen die in diesem Ordner mglich * * sind. Diese Angabe wird von "hunt_dir" * * ebenfalls bentig. * ************************************************* PART 'read_sub_dir' read_sub_dir: movem.l D0-A6,-(SP) movep.w 27(A4),D3 move.b 26(A4),D3 ;Clusternr. im Intel-Format movea.l A4,A3 ;Ptr auf Hauptdirectory merken moveq #0,D5 ;Clusteranzahl des Sub-Dirs read_sub_dir1: moveq #0,D0 move.w clsizb(A5),D0 ;Bytes pro Cluster bsr get_mem ;Speicher anfordern movea.l D0,A4 ;Zeiger auf den Cluster tst.w D5 bne.s read_sub_dir5 move.l A4,16(A3) ;Zeiger auf Sub-Dir read_sub_dir5: move.w drive(A6),-(SP) ;akt.Drv move.w D3,D0 ;akt.Clusternummer subq.w #2,D0 mulu clsiz(A5),D0 ;mal Sektoren pro Cluster add.w datrec(A5),D0 ;+ erster freier Sektor move.w D0,-(SP) ;= abs. Sektor move.w clsiz(A5),-(SP) ;Cluster einlesen move.l A4,-(SP) ;in den Buffer move.l #$040000,-(SP) trap #13 ;Rwabs() - Cluster einlesen lea 14(SP),SP tst.l D0 bmi _exit move.w clsizb(A5),D7 ;Bytes pro Cluster lsr.w #5,D7 ;\32 Bytes (Eintragsgre) subq.w #1,D7 ;fr DBRA read_sub_dir2: btst #4,11(A4) ;ein Ordner? beq.s read_sub_dir3 ;Nein! => cmpi.b #$E5,(A4) ;gelscht? beq.s read_sub_dir3 ;Ja! => cmpi.w #'. ',(A4) beq.s read_sub_dir3 ;ignore Dummy-Eintrge cmpi.w #'..',(A4) beq.s read_sub_dir3 bsr.s read_sub_dir read_sub_dir3: lea 32(A4),A4 ;nchster Eintrag dbra D7,read_sub_dir2 ;alle Eintrge? addq.w #1,D5 ;Clusteranzahl des Sub-Dir move.w D3,D0 add.w D0,D0 ;mal 2, als Zeiger auf die FAT movea.l fat_adr(A6),A0 ;Ptr: decodierte FAT move.w 0(A0,D0.w),D3 ;Nr des Folgeclusters bpl.s read_sub_dir1 ;Ende? Nein! => mulu clsizb(A5),D5 ;Bytes pro Cluster lsr.l #5,D5 ;Gre des Sub-Dir in Bytes move.l D5,12(A3) ;Anzahl der mgl.Eintrge movem.l (SP)+,D0-A6 rts ENDPART ************************************************* * Laufwerk D0 als akt.Laufwerk anmelden, FAT * * einlesen. Der freie Speicherplatz wird in * * D0 zurckgegeben * * WICHTIG: A5 zeigt nach "set_drive" STETS * * auf den BPB des aktuellen Laufwerkes. * * Davon wird in "read_dir" ausgegangen. * ************************************************* PART 'set_drive' set_drive: movem.l D1-A4,-(SP) move.w D0,drive(A6) ;akt.Laufwerk setzen bsr.s get_bpb ;BPB-Adresse holen moveq #0,D0 move.w numcl(A5),D0 add.l D0,D0 ;Gesamtzahl der Cluster*2 bsr get_mem ;Speicher anfordern move.l D0,fat_adr(A6) move.w fsiz(A5),D0 ;Lnge der FAT mulu recsiz(A5),D0 ;mal Bytes pro Sektor bsr get_mem ;Speicher anfordern move.l D0,fat_buffer(A6) move.w drive(A6),-(SP) ;aktuelles Drive move.w fatrec(A5),-(SP) ;Anfang der 2.FAT move.w fsiz(A5),-(SP) ;Lnge der FAT move.l fat_buffer(A6),-(SP) move.l #$040000,-(SP) trap #13 ;2.FAT komplett einlesen lea 14(SP),SP tst.l D0 bmi _exit bsr.s wandel_fat ;FAT ins 68000er-Format movea.l fat_adr(A6),A0 ;Ptr: decodierte FAT addq.l #4,A0 ;erste 2 Cluster ignorieren move.w numcl(A5),D1 subq.w #3,D1 ;2 Cluster abziehen (DBRA!) moveq #0,D0 ;Anzahl der freien Cluster set_drive1: tst.w (A0)+ ;ein freier Cluster? bne.s set_drive2 ;Nein! => addq.w #1,D0 ;INC freie Cluster set_drive2: dbra D1,set_drive1 ;alle gezhlt? mulu clsizb(A5),D0 ;mal Bytes pro Cluster movem.l (SP)+,D1-A4 rts ENDPART ************************************************* * BPB des akt.Laufwerkes nach A5 * ************************************************* PART 'get_bpb' get_bpb: move.w drive(A6),-(SP) move.w #7,-(SP) trap #13 ;Getbpb(drive) addq.l #4,SP move.l D0,akt_bpb(A6) beq _exit movea.l D0,A5 ;Zeiger auf den BPB rts ENDPART ************************************************* * FAT vom 12-bit- bzw. 16-bit-Intel-Format * * ins 16-bit-68000er-Format * ************************************************* PART 'wandel_fat' wandel_fat: movea.l fat_buffer(A6),A0 ;Ptr: FAT movea.l fat_adr(A6),A1 ;Ptr: decodierte FAT move.w fsiz(A5),D0 ;Lnge der FAT mulu recsiz(A5),D0 ;mal Bytes pro Sektor move.w bflags(A5),D1 ;Flags holen btst #0,D1 ;12-bit-FAT? beq.s wandel_fat2 ;Ja! => lsr.w #1,D0 ;Anzahl der Worte subq.w #1,D0 ;fr DBRA wandel_fat1: movep.w 1(A0),D1 move.b (A0),D1 ;Intel-Wandl. bei 16-bit-FAT addq.l #2,A0 move.w D1,(A1)+ dbra D0,wandel_fat1 rts wandel_fat2: divu #3,D0 ;12-bit-FAT wandeln wandel_fat3: movep.w 1(A0),D1 move.b (A0),D1 ;Intel-Word holen and.w #$0FFF,D1 ;Bit 12-15 sind unwichtig cmp.w #$0FF0,D1 ;Nummer $FF0-$FFF? blo.s wandel_fat4 ;Nein! => or.w #$F000,D1 ;Vorzeichen erweitern wandel_fat4: move.w D1,(A1)+ ;Cluster merken movep.w 2(A0),D1 move.b 1(A0),D1 ;Intel-Word holen lsr.w #4,D1 ;Bit 0-3 sind unwichtig cmp.w #$0FF0,D1 ;Nummer $FF0-$FFF? blo.s wandel_fat5 ;Nein! => or.w #$F000,D1 ;Vorzeichen erweitern wandel_fat5: move.w D1,(A1)+ ;Cluster merken addq.l #3,A0 ;3 Bytes sind fertig dbra D0,wandel_fat3 ;schon alle Tripel? rts ENDPART ************************************************* * D0=get_mem(Byteanzahl in D0) * * Speicher vom Heap anfordern * ************************************************* PART 'get_mem' get_mem: move.l A0,-(SP) addq.l #1,D0 ;EVEN and.b #-2,D0 move.l heap_pnt(A6),D1 ;alter Heap-Pointer exg D0,D1 add.l D1,heap_pnt(A6) ;Platz auf dem Heap movea.l anfang-256+4(PC),A0 ;Speicherende cmpa.l heap_pnt(A6),A0 ;Speicherobergrenze? blo _exit ;Ja! => raus => movea.l (SP)+,A0 rts ENDPART ************************************************* * Ab hier: das DATA-Segment * ************************************************* DATA IF virus files_text: DC.B ' Dateien, ',0 files_text2: DC.B ' genderte bzw. neue Dateien.',13,10,0 folders_text: DC.B ' Ordner sind vorhanden.' DC.B ' Schreiben?',13,10,0 init_text: DC.B 27,'E',27,'e' DC.B 'LVF V1.5 (Link-Virus-Finder)',13,10 DC.B '1989 by -soft,' DC.B ' Markus Fritze',13,10,10,0 fehler_text: DC.B 'Prfsumme ist fehlerhaft' DC.B ' (bernehmen?)',13,10,0 virus_text: DC.B 7,'Datei enthlt ' DC.B ' wahrscheinlich ',0 virus1_text: DC.B 'einen VCS-Linkvirus!',13,10,7,0 virus2_text: DC.B 'den Milzbrand-Linkvirus!',13,10,7,0 viren_text: DC.B ' wahrscheinlich verseuchte' DC.B ' Dateien gefunden!',7,13,10,0 new_text: DC.B 'Datei wurde hinzugefgt.',13,10,0 fname: DC.B 'LVF.DAT',0 ELSE files_text: DC.B ' Dateien mit insgesamt ',0 files_text2: DC.B ' Bytes gefunden.',13,10,0 folders_text: DC.B ' Ordner sind vorhanden.' DC.B ' Taste drcken.',13,10,0 init_text: DC.B 27,'E',27,'e' DC.B 'FFF V1.5 (Fast-File-Finder)',13,10 DC.B '1989 by -soft, Markus Fritze' DC.B 13,10,10,0 ENDC exit_text: DC.B 27,'E',27,'f',0 drive_text: DC.B 'Laufwerk ',0 drive_text2:DC.B ': (',0 drive_text3:DC.B ' Bytes frei.)',13,10,0 ********************************************** * Ab hier: das BSS-Segment * ********************************************** BSS DS.L 1024 ;4k Stack fr rekursive Suche own_stack:DS.L 0 drive: DS.W 1 ;aktuelles Laufwerk akt_bpb: DS.L 1 ;Ptr: BPB des akt.Laufwerks fat_buffer:DS.L 1 ;Adresse der gelesenen FAT fat_adr: DS.L 1 ;Adresse der decodierten FAT virus_count:DS.W 1 ;Anz. der gefundenen Viren flag: DS.B 1 ;Bit 0=1: keine Fileausgabe ;Bit 1=1: neue Programme bernehmen EVEN pfad: DS.B 256 ;Platz fr den Suchpfad heap_pnt: DS.L 1 IF virus data_base:DS.L 1 ;Ptr: File-Daten im RAM data_buff:DS.B 24*max_prgs ;Prg-Buffer sektor_buffer:DS.B max_sektorsize ;Sektorbuf. ELSE search_mask:DS.B 12 ;Suchmaske (Joker) search_chars:DS.B 12 ;Suchzeichen ENDC heap: DS.L 0 ;freier Speicher ab hier END . `i6.. {`iDIR_BAUMLST V7 DIR_BAUMPRG [;$DIR_BAUMGFA VEN ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' DIRBAUM.BAS Directory als einfaches Baumdiagramm darstellen + ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' von Peter Ubachs + ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' (c) 1992 MAXON Computer GmbH + ' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' ' benutzte GEMDOS-Funktionen DEFFN fsfirst(adr_dateiname%,attribut%)=GEMDOS(&H4E,L:adr_dateiname%,attribut%) DEFFN fsnext=GEMDOS(&H4F) @schalt(4) !8x8 Kleinschrift ' max_dateien%=2500 max_ebenen%=15 DIM name$(max_dateien%,max_ebenen%) DIM anz_dateien%(max_ebenen%),nr%(max_ebenen%) ' einrueck%=10 ' DO ' Welcher Pfad? FILESELECT DIR$(0)+"\*.*","",pfad$ ' ------------------------------------------------------------- EXIT IF pfad$="" !~Abbruch angeklickt? ' ------------------------------------------------------------- WHILE RIGHT$(pfad$)<>"\" pfad$=LEFT$(pfad$,LEN(pfad$)-1) WEND CHDIR pfad$ ' ' Ausgabegert? ALERT 2,"A u s g a b e g e r t ?",1,"Monitor|Drucker|Datei",antw% IF antw%=1 OPEN "O",#1,"CON:" CLS ELSE IF antw%=2 OPEN "O",#1,"PRN:" ELSE FILESELECT DIR$(0)+"\*.*","",dirpfad$ OPEN "O",#1,dirpfad$ ENDIF ENDIF ' VOID GEMDOS(&H1A,L:BASEPAGE+128) !DTA setzen PRINT #1;pfad$ ebene%=1 @directory_zusammensuchen(ebene%,pfad$) ' IF antw%=1 PRINT " p Taste drcken q"; REPEAT UNTIL LEN(INKEY$) ENDIF CLOSE LOOP @schalt(8) EDIT ' PROCEDURE directory_zusammensuchen(ebene%,pfad$) LOCAL fsret%,dateiname$,datei_nr%,suchpfad$ suchpfad$=pfad$+"*.*"+CHR$(0) datei_nr%=0 fsret%=FN fsfirst(VARPTR(suchpfad$),16) WHILE fsret%=0 @dateiname_bestimmen(*dateiname$) !d.h. aus der DTA lesen IF dateiname$<>"." AND dateiname$<>".." INC datei_nr% NAME "$(datei_nr%" AS "ebene%)=dateiname$ !abspeichern" ENDIF fsret%=FN fsnext WEND anz_dateien%(ebene%)=datei_nr% ' ' IF anz_dateien%(ebene%)>0 @vorsatz(ebene%) PRINT #1;"|" ENDIF ' nr%(ebene%)=1 WHILE nr%(ebene%)<=anz_dateien%(ebene%) IF MOUSEK=1 !linke Maustaste: Halt REPEAT UNTIL MOUSEK=2 !rechte Maustaste: Weiter ENDIF @vorsatz(ebene%) PRINT #1;"|_____ ";name$(nr%(ebene%),ebene%) @directory_zusammensuchen(ebene%+1,pfad$+name$(nr%(ebene%),ebene%)+"\") INC nr%(ebene%) WEND ' IF (anz_dateien%(ebene%)>0) AND (nr%(ebene%-1)1 FOR l%=1 TO ebene%-1 IF nr%(l%)< |a6RGk0Gg`a(0GVfA1G<ap??<?<NM\Nu??< NMXNu&8*:EENuHnL 2$4BBNuAd RdQRB BbABJk 0NuJBjBBXNu 0Nu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@N(?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|p  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</N:JFkSFk&aQN:`Ha"FFaQL8N6.pJgtBnpNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?N<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dNAXJ@jNNu~c0NQNuvN)@p `H@)@prtN$AHplrtN$B 2pNpNpapaprapalpalpalpaTpaTpaTBp'a?<NNT@B){L9|0<rtN$papap9@p`pvNv`v`vj`v `v`v`v`?aBp0,l 2Nua40,HNua*p0,l 4Nuaprt0,l 22,l 44,NuN9||BlBlrҌpsNBNu0<}N*& ?<NNC`&?<NNT"@ C <}N`N(* 9AJA)H@@[000][ˈNL Evz`* [g" ]g |g QSz` zQSpQ][ɈNL Dvx`* [g" ]g |g QSx` xQSpQ]Bp4NHNu*( INLA)H @depd ae zb QB DNLA\)H @ e` ae zb \gQBA BhNxpZNA BP"`#|}NA"H0,tg"Hg \f`A\fS A EN*AR@H`2QNu2(g"P@g2RADAH""l`r2oZAe 1@#)I`Nuk1@Nup NN"l`dpNAtrdJhk\QpaNH ld$l`"Hg0 k&@ S`g k#&@0+S@H3 Q&f)I`LNu?<?<NAXJgJgNAH@B pN6A NuApN6A0pN6N$$N$BS@kH2QNupC ұd"X0Pg"RA$D#Nu"X0Nu _0HpN6 _0HpN6p"_0HqNp"_0HqNE ұeHHQ0)N*$_$ZR@H`2QNu$Y0gHR@@"D%$X0P2g# R@%NupE $ $X0dP.gRG,D%pr Y2dP.gRG,D!p4Ae4v`VfANuNWHNuNVHNuJhg NL1NNu Ihd*N$E$RR@H`2QˈNL ENu(* 0(iN$E 4R`Q$D 4R`QˈNL DNL ENu2p <0N`QNu?Hl?<GNAPA"HJf SN6pA` p9`p:`p;?NL>J@fCAHPBHQ?NA\ _JjNNuHpx$ ld$l`"Hg8" &Ak eѐ S`g"" k#&Aeё2+SAI3 Q&f)I`LNuHRp` HRpJQfpNNq Y QfdЀЀ 0NuNN$_& Y Qfdփփ!8NNN~,Nq8DRzXEEg"7PNqR$HBJBgpNJgJigp`eetЂ`"ЀeЁdp`ЀeЀe"Ѕe$W.H@@/ l\N` NL"2` NqR YEjrd0` SjN$_NЀЀN YQf "_Nq*eNN*< NqbІSGfN $_Nփփ"@HHRN YQf "_&Nq*eNN*<&NqbֆSGfN~$_NЀЀЈNҳxdtdD& pk<HCJCf2 INj|d& xfNL"Nud & f2Nup@Nxd& tkHCJCfN"@Ed ddeƐdH@J@f  @  "002Nu" KC`e N`d \N: l\Ӭ\ NupNd d3 d# d# # d# # # # d# # # # # # # # dB` # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # QNudd2d"d""d""""d""""""""dB` """"""""""""""""""""""""""""""""QNup`pNu)H9@Jp4NP'J&f H LNu P&NuQ'` J,'fJ,&gHA#ȇeC! B,&LNu-W)K20, 8k8@ gJl&f"Nu , 8g"P 8 @/, 8NZ  8fQ 8J,'gNupB <``L@ H)l26)z @W , Jf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C]fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Fehler # ][Abbruch]\f.B &lX)K\)ld` lp ,BQjNup(NX"l`Yd&-KNN"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`& $Y8gHRDD*D%H8#$c2g# HRDD%H`p"l`Qd&&| NuN"l`QepZNpr`&AdRd QJBgRBBABJk"l` d&6&|0!NuN"l` epZNC ҳfHP0(N$W$RR@H`2Q"H _$l` dd" $X&0BP6Y&|Hg R@@%E ҳeHQ0)N*$_$RR@H`2QNu$Y 0P1@Hg R@@%NuN$l` epZN`. A~N A퀎N?-/-?<NNAPN N`?<ONATN N <r$<HA#NZ+| Ā+|/- -C~N -CN -CN+| pNHPNv\*.*"_NHPA HPA6""_NVHm6A "_NZgNA6NnHPp\N"_NdJBfNlHm6A6NLN H <r$<L8NNL"_NC6N`A6N.HxNA u s g a b e g e r t ?4HPNMonitor|Drucker|Dateir"_ N+@ -SgNpONHPNvCON:r"_NNNd -UgN$pONHPNvPRN:r"_NNdpNHPNv\*.*"_NHPA HPAx""_NVpONHPAxr"_NN /?<NA\pNZA6NN+|/-Hm6A(NZ -SgNNrN4 p Taste drcken qNNL$gN4` <r$<HA#NZNN"_A6Np A퀂NA퀆NAHNlA퀞NA`NlHm6N*.*"_NHPpN"_NC`NB -`/HxA.NZNL+@ -JgN 8 NNLN)@A r @0A r @0A rf @0pNBNN $ |j~D 6 X vZl@GFA-BASIC3,@           XAPFADDIRPFAD DATEINAMESUCHPFADNAMEA ADR_DATEINAMEATTRIBUT MAX_DATEIEN MAX_EBENENEINRUECKANTWEBENEFSRETDATEI_NRADR_NAMEILNAME ANZ_DATEIENNRSCHALTDIRECTORY_ZUSAMMENSUCHENDATEINAME_BESTIMMENVORSATZFSFIRSTFSNEXTD+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DDIRBAUM.BAS Directory als einfaches Baumdiagramm darstellen + D+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Dvon Peter Ubachs + D+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D(c) 1992 MAXON Computer GmbH + D+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  benutzte GEMDOS-Funktionen + #! EWN!! F+EWO F # F8x8 Kleinschrift  8 F88F8H! FxH ! F 8 FF FWelcher Pfad? $ \*.*!!FhB------------------------------------------------------------- $F~Abbruch angeklickt? B------------------------------------------------------------- < \F-4;!B  F F!FF Ausgabegert? H!A u s g a b e g e r t ?!!Monitor|Drucker|Datei!F ߀Fb$O!M!CON:FFF 8F ߀Fb$O!M!PRN:F 8F$ \*.*!!F $O!M!F$F$F (W!߀ FDTA setzen PM߀"F8F# F  ߀F<L4 p Taste drcken q"FF BS F $F0FF FB# F F ! F !!!F4*.*B F8FB8#л ! FF &#н F!d.h. aus der DTA lesen  ...FeF4( $(datei_nr%lebene%)=dateiname$ !abspeichernF$F 8F FF P9F    F # FPM߀"|FF$F P9F|  F. <߀Felinke Maustaste: Halt iF0 <߀Ferechte Maustaste: Weiter $F # F&PM߀"|_____ " ! FF*# ! \ Fe  F FF 6 #  # ߀ FF # F PMF $F F  F ! F8 ߀F? F ($=name$+CHR$(PEEK(i%))lF Fn Fa  EFF  F F  ߀F(X G݀F   F$PM߀"|"߀ "FF 8FPM߀" "FF$F F$FF  F4b b bNu F 0л F0u FF!!A F߀!F!Fߠ!fF \FF @schalt(4)=Kleinschrift 8*8 "@schalt(8)=Grossschrift 8*16 ". `iI.. {`iFILEINFOACC m{}J FILEINFOS cVMF`j,O#\*.* KM p "<ab8:pr"<aLSUjpM"<a@3 p#"<:ALa(3 p"<G Ka S(f09 ΰkfa` Mp 0Q0pdIB8 3 a3 pZ"<#  A aJng^pazA C E Qf e4S !\fRR# A EHp  QE:<.fE6`fBHy ?<CNA J@kA+C?fIA[CofIACfIBgHy ?<=NAP,kBg?Hy ?<WNA B29 I |? <0A@H@<0@I <0HA<0B29 | <0AH@<0I | <0H@<0I|P|de|d <0HA<0pk"<:ap6"<aLBBHap*"<*+n+naB@ap2"<:a>|f&AB@(<0 <0(|P2AB@(<0 <0(@AB@<0 <0@3 AB@<0 <02AB@<0 <0@A3 ?<?Hy ?<WNA B@9g9g9Wg??<Hy ?<CNA "y Ap< g gQ`.fHy QHy Bg?<VNA tHa\p/"< M0BXHB aT??<>NAXpk"<BUaBB@apeA1y 0"<psNBNu:pN"<`H p3"< :A.# A0"<j0<NBNu Fileinfo(|    ( Z     )  4   >  G QT [ %b FILEINFO V1.00  von Uwe Seimet Buchenlochstrae 29&'6750 KaiserslauternDXY (c) 1992 MAXON v FILENAMEEXTFilename: ________.___ppppppppppp000000Erstellungsdatum: __.__.__999999 $0000Erstellungszeit: __:__9999Read/WriteRead OnlySichtbarVerstecktOKNormalSystemABBRUCH J J J 4"  .`> 6 (P , <00.***D>v**************************** * FILEINFO V1.00, * * (C) Uwe Seimet * * Buchenlochstrae 29 * * 6750 Kaiserslautern * * Telefon: 0631/21237 * * (c) 1992 MAXON Computer * **************************** *GEMDOS-Konstanten GEMDOS = 1 OPEN = $3d CLOSE = $3e CHMOD = $43 RENAME = $56 GSDTOF = $57 *Wichtige Objektindices NAME = 6 OK = 14 text lea stack+400,sp ;Stackpointer initialisieren move.l #"\*.*",inpath ;Pfad fr Disk lea intin,a5 ;Pointer auf INTIN-Array lea intout,a6 ;Pointer auf INTOUT-Array moveq #10,d0 ;appl_init move.l #$00010000,d1 bsr aes move (a6),d4 ;apid_nr merken move #18,(a5) ;19 Objekte fix: moveq #114,d0 ;rsrc_obfix move.l #$01010100,d1 bsr aesobj ;Koordinaten auf Auflsung umrechnen subq #1,(a5) bpl fix ;nchstes Objekt moveq #77,d0 ;graf_handle move.l #$00050000,d1 bsr aes move (a6),phys_h ;phys_handle merken moveq #35,d0 ;menu_register move.l #$01010100,d1 move d4,(a5) lea name(pc),a0 ;Accessory-Name bsr aes ;in Menleiste eintragen move (a6),nr ;Nummer des Eintrags merken *Warteschleife doacc: moveq #23,d0 ;evnt_mesag move.l #$00010100,d1 lea ev_buff,a3 ;Puffer fr GEM-Messages move.l a3,a0 bsr aes cmp #40,(a3) ;AC_OPEN? bne doacc ;nein- move nr,d0 cmp 8(a3),d0 ;Programm angeklickt? bne doacc ;nein- bsr.s act ;Dialog ausfhren bra doacc ;weiter in Warteschleife *Dialog mit dem Benutzer act: move.l a5,a0 ;Pointer auf INTIN-Array moveq #9,d0 opn: move #1,(a0)+ ;Parameter fr OPEN VIRTUAL WORKSTATION dbf d0,opn move #2,(a0) moveq #100,d0 ;v_opnvwk lea contrl+2,a4 clr.l (a4)+ move #11,(a4) move phys_h,vdi_h bsr vdi move 6(a4),vdi_h ;vdi_handle merken moveq #90,d0 ;fsel_input move.l #$00020200,d1 move.l #insel,addrin+4 lea inpath,a0 bsr aes ;Eingabe des Filenamens tst 2(a6) ;Abbruch? beq exit ;ja- moveq #2,d0 ;Biene als Mauscursor bsr mouse lea inpath,a0 ;Pointer auf Pfad lea nam,a1 ;Pointer auf alten Filenamen lea nnam,a2 ;Pointer auf neuen Filenamen tpat: move.b (a0)+,d0 move.b d0,(a1)+ ;Pfadnamen kopieren move.b d0,(a2)+ bne tpat tpat1: cmp.l #nam,a1 bcs exit subq.l #1,a2 cmp.b #"\",-(a1) bne tpat1 addq.l #1,a1 addq.l #1,a2 move.l a2,newnam ;Pointer auf Beginn des neuen Namens lea insel,a0 lea filnam(pc),a2 moveq #10,d0 filspc: move.b #" ",(a2)+ ;Bereich fr Filenamen lschen dbf d0,filspc lea filnam(pc),a2 tsel: move.b (a0)+,d0 ;Pfad- und Filenamen zusammensetzen cmp.b #".",d0 bne.s tsel1 lea filnam+8(pc),a2 bra.s tsel2 tsel1: move.b d0,(a2)+ tsel2: move.b d0,(a1)+ bne.s tsel clr.l -(sp) ;Attribut ermitteln pea nam move #CHMOD,-(sp) trap #GEMDOS add #10,sp tst d0 ;alles klar? bmi exit ;dummerweise nicht- lea flg1+3(pc),a0 ;Pointer auf lea flg2+3(pc),a1 ;Radio-Buttons btst #0,d0 ;Read Only? bne.s ro ;ja- exg.l a0,a1 ro: bclr #0,(a0) ;Buttons deselektieren bset #0,(a1) ;bzw. selektieren lea flg3+3(pc),a0 lea flg4+3(pc),a1 btst #1,d0 ;versteckt? bne.s hidden ;ja- exg.l a0,a1 hidden: bclr #0,(a0) bset #0,(a1) lea flg5+3(pc),a0 lea flg6+3(pc),a1 btst #2,d0 ;System-File? bne.s system ;ja- exg.l a0,a1 system: bclr #0,(a0) bset #0,(a1) clr -(sp) pea nam move #OPEN,-(sp) ;Datei mu vor GSDTOF trap #GEMDOS ;erst geffnet werden addq.l #8,sp move.l d0,d6 ;Fehler beim ffnen? bmi exit ;ja- clr -(sp) ;Flag fr Datum und Zeit ermitteln move d6,-(sp) pea dati ;Puffer fr Datum und Zeit move #GSDTOF,-(sp) trap #GEMDOS add #10,sp clr.l d1 move dati,d1 ;Zeit holen lsr #5,d1 ;Sekundenbits rausschieben move.l d1,d0 and #%111111,d0 ;Minuten isolieren divu #10,d0 add.b #"0",d0 ;und nach ASCII wandeln lea time(pc),a0 move.b d0,2(a0) swap d0 add.b #"0",d0 move.b d0,3(a0) lsr #6,d1 ;Stunden isolieren divu #10,d1 add.b #"0",d1 move.b d1,(a0)+ swap d1 add.b #"0",d1 move.b d1,(a0) clr.l d1 move dati+2,d1 ;Datum holen move.l d1,d0 and #%11111,d0 ;Tag divu #10,d0 add.b #"0",d0 lea date(pc),a0 move.b d0,(a0)+ swap d0 add.b #"0",d0 move.b d0,(a0)+ lsr #5,d1 move.l d1,d0 and #%1111,d0 ;Monat divu #10,d0 add.b #"0",d0 move.b d0,(a0)+ swap d0 add.b #"0",d0 move.b d0,(a0)+ lsr #4,d1 ;Jahr add #80,d1 cmp #100,d1 ;falls im Jahr 2000 oder spter erstellt bcs.s ovr ;(man kann ja nie wissen) sub #100,d1 ovr: divu #10,d1 add.b #"0",d1 move.b d1,(a0)+ swap d1 add.b #"0",d1 move.b d1,(a0) moveq #107,d0 ;wind_update move.l #$01010000,d1 move #1,(a5) bsr aes moveq #54,d0 ;form_center move.l #$00050100,d1 bsr aesobj movem.l 2(a6),a3/a4 ;form_xy und form_wh merken clr d2 ;Bildschirmspeicher reservieren movem.l a3/a4,2(a5) bsr form_dial moveq #42,d0 ;objc_draw move.l #$06010100,d1 move.l #$00000002,(a5) move.l 2(a6),4(a5) move.l 6(a6),8(a5) bsr aesobj ;Dialogbox darstellen clr d0 ;Pfeil als Mauscursor bsr mouse moveq #50,d0 ;form_do move.l #$01010101,d1 move #NAME,(a5) ;Eingabefeld bsr aesobj ;Dialog starten move (a6),d7 bclr #15,d7 ;Bit fr Doppelklick lschen cmp #OK,d7 ;OK-Button angewhlt? bne break ;nein-keine nderung vornehmen lea date(pc),a0 clr d0 move.b 4(a0),d0 sub.b #"0",d0 mulu #10,d0 sub.b #"0",d0 add.b 5(a0),d0 sub #80,d0 move d0,d1 asl #4,d1 ;Jahr clr d0 move.b 2(a0),d0 sub.b #"0",d0 mulu #10,d0 sub.b #"0",d0 add.b 3(a0),d0 or d0,d1 asl #5,d1 ;Monat clr d0 move.b (a0)+,d0 sub.b #"0",d0 mulu #10,d0 sub.b #"0",d0 add.b (a0),d0 or d0,d1 ;Tag move d1,dati+2 ;Datum merken lea time(pc),a0 clr d0 move.b (a0)+,d0 sub.b #"0",d0 mulu #10,d0 sub.b #"0",d0 add.b (a0)+,d0 move d0,d1 asl #6,d1 ;Stunden clr d0 move.b (a0)+,d0 sub.b #"0",d0 mulu #10,d0 sub.b #"0",d0 add.b (a0),d0 or d0,d1 ;Minuten asl #5,d1 move d1,dati ;Zeit merken move #1,-(sp) ;Datum und Zeit setzen move d6,-(sp) pea dati move #GSDTOF,-(sp) trap #GEMDOS add #10,sp clr d0 btst #0,flg2+3 ;Read Only? beq.s ro1 ;nein- bset #0,d0 ro1: btst #0,flg4+3 ;versteckt? beq.s hidden1 ;nein- bset #1,d0 hidden1:btst #0,flg6+3 ;System-File? beq.s system1 ;nein- bset #2,d0 system1:move d0,-(sp) move #1,-(sp) pea nam move #CHMOD,-(sp) trap #GEMDOS ;neue Attribute setzen add #10,sp move.l newnam,a1 lea filnam(pc),a0 moveq #7,d0 copnew: move.b (a0)+,d1 cmp.b #" ",d1 beq.s copn2 move.b d1,(a1)+ ;neuen Filenamen zusammensetzen beq.s copn1 dbf d0,copnew bra.s copn3 copn2: add.l d0,a0 copn3: move.b #".",(a1)+ copnew1:move.b (a0)+,(a1)+ bne copnew1 copn1: pea nnam ;neuer Name pea nam ;alter Name clr -(sp) move #RENAME,-(sp) trap #GEMDOS ;Datei umbenennen add #12,sp break: moveq #3,d2 ;Bildschirmspeicher wieder freigeben movem.l a3/a4,2(a5) bsr.s fo_dial moveq #47,d0 ;objc_change move.l #$08010100,d1 move.l a5,a0 move d7,(a0)+ clr (a0)+ movem.l a3/a4,(a0) clr.l 12(a5) bsr.s aesobj ;ausgewhlten Button wieder deselektieren move d7,-(sp) move #CLOSE,-(sp) trap #GEMDOS ;das war's addq.l #4,sp moveq #107,d0 ;wind_update move.l #$01010000,d1 clr (a5) bsr.s aes exit: clr d0 ;Pfeil als Mauscursor bsr.s mouse moveq #101,d0 ;v_clsvwk vdi: lea contrl,a0 move vdi_h,12(a0) ;vdi_handle move d0,(a0) ;Funktionsnummer move.l #vdipb,d1 moveq #$73,d0 ;VDI trap #2 ;aufrufen rts *Mausform auswhlen mouse: move d0,(a5) ;Mausform festlegen moveq #78,d0 ;graf_mouse move.l #$01010100,d1 bra.s aes fo_dial: movem.l a3/a4,10(a5) form_dial: moveq #51,d0 ;form_dial move.l #$09010100,d1 move d2,(a5) aesobj: lea _objcdat(pc),a0 aes: move.l a0,addrin ;Objekt-Adresse lea contrl,a0 ;Pointer auf CONTRL-Array move d0,(a0) ;Befehlsnummer movep.l d1,3(a0) ;Parameter in Array bertragen move.l #aespb,d1 move #$c8,d0 ;AES trap #2 ;aufrufen rts name: dc.b " Fileinfo",0 ;Name des Meneintrags even *-------------------- *Objektdaten fr die Dialogbox _objcdat: dc.w $ffff dc.w $0001,$0012 dc.w $0014 dc.w $0000,$0010 dc.l $00021100 dc.w $0006,$0001 dc.w $0028,$0012 dc.w $0002 dc.w $ffff,$ffff dc.w $001c dc.w $0000,$0011 dc.l spec000 dc.w $000c,$0001 dc.w $0010,$0001 dc.w $0003 dc.w $ffff,$ffff dc.w $0015 dc.w $0000,$0000 dc.l spec001 dc.w $000c,$0003 dc.w $0410,$0001 dc.w $0004 dc.w $ffff,$ffff dc.w $0015 dc.w $0000,$0000 dc.l spec002 dc.w $000d,$0004 dc.w $020e,$0001 dc.w $0005 dc.w $ffff,$ffff dc.w $0015 dc.w $0000,$0000 dc.l spec003 dc.w $000d,$0005 dc.w $020e,$0001 dc.w $0006 dc.w $ffff,$ffff dc.w $0015 dc.w $0000,$0000 dc.l spec004 dc.w $000d,$0006 dc.w $020e,$0001 dc.w $0007 dc.w $ffff,$ffff dc.w $001d dc.w $0008,$0000 dc.l spec005 dc.w $000a,$0008 dc.w $0016,$0001 dc.w $0008 dc.w $ffff,$ffff dc.w $001d dc.w $0008,$0000 dc.l spec006 dc.w $0002,$0009 dc.w $001a,$0001 dc.w $0009 dc.w $ffff,$ffff dc.w $001d dc.w $0008,$0000 dc.l spec007 dc.w $0003,$000a dc.w $0016,$0001 dc.w $000a dc.w $ffff,$ffff dc.w $001a flg1: dc.w $0011,$0000 dc.l spec008 dc.w $0002,$000c dc.w $000b,$0001 dc.w $000b dc.w $ffff,$ffff dc.w $001a flg2: dc.w $0011,$0000 dc.l spec009 dc.w $000e,$000c dc.w $000b,$0001 dc.w $000e dc.w $000c,$000d dc.w $0019 dc.w $0000,$0000 dc.l $00001100 dc.w $0002,$000e dc.w $0017,$0001 dc.w $000d dc.w $ffff,$ffff dc.w $001a flg3: dc.w $0011,$0000 dc.l spec010 dc.w $0000,$0000 dc.w $000b,$0001 dc.w $000b dc.w $ffff,$ffff dc.w $001a flg4: dc.w $0011,$0000 dc.l spec011 dc.w $000c,$0000 dc.w $000b,$0001 dc.w $000f dc.w $ffff,$ffff dc.w $001a dc.w $0007,$0000 dc.l spec012 dc.w $001e,$000e dc.w $0008,$0001 dc.w $0012 dc.w $0010,$0011 dc.w $0019 dc.w $0000,$0000 dc.l $00001100 dc.w $0002,$0010 dc.w $0017,$0001 dc.w $0011 dc.w $ffff,$ffff dc.w $001a flg5: dc.w $0011,$0000 dc.l spec013 dc.w $0000,$0000 dc.w $000b,$0001 dc.w $000f dc.w $ffff,$ffff dc.w $001a flg6: dc.w $0011,$0000 dc.l spec014 dc.w $000c,$0000 dc.w $000b,$0001 dc.w $0000 dc.w $ffff,$ffff dc.w $001a dc.w $0025,$0000 dc.l spec015 dc.w $001e,$0010 dc.w $0008,$0001 spec000:dc.b ' FILEINFO V1.00 ',0 spec001:dc.l spec001+$001c,spec001+$0033,spec001+$0034 dc.w $0005 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0017,$0001 dc.b '(C) 1987 by Uwe Seimet',0 dc.b 0 dc.b 0 spec002:dc.l spec002+$001c,spec002+$0030,spec002+$0031 dc.w $0005 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0014,$0001 dc.b 'Buchenlochstrae 29',0 dc.b 0 dc.b 0 spec003:dc.l spec003+$001c,spec003+$0030,spec003+$0031 dc.w $0005 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0014,$0001 dc.b '6750 Kaiserslautern',0 dc.b 0 dc.b 0 spec004:dc.l spec004+$001c,spec004+$0030,spec004+$0031 dc.w $0005 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0014,$0001 dc.b 'Telefon: 0631/21237',0 dc.b 0 dc.b 0 spec005:dc.l spec005+$001c,spec005+$0028,spec005+$003f dc.w $0003 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $000c,$0017 filnam: dc.b 'FILENAMEEXT',0 dc.b 'Filename: ________.___',0 dc.b 'ppppppppppp',0 spec006:dc.l spec006+$001c,spec006+$0023,spec006+$003e dc.w $0003 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0007,$001b date: dc.b '000000',0 dc.b 'Erstellungsdatum: __.__.__',0 dc.b '999999',0 spec007:dc.l spec007+$001c,spec007+$0021,spec007+$0038 dc.w $0003 dc.w $0006 dc.w $0000 dc.w $1180 dc.w $0000 dc.w $ffff dc.w $0005,$0017 time: dc.b '0000',0 dc.b 'Erstellungszeit: __:__',0 dc.b '9999',0 spec008:dc.b 'Read/Write',0 spec009:dc.b 'Read Only',0 spec010:dc.b 'Sichtbar',0 spec011:dc.b 'Versteckt',0 spec012:dc.b 'OK',0 spec013:dc.b 'Normal',0 spec014:dc.b 'System',0 spec015:dc.b 'ABBRUCH',0 *-------------------- data aespb: dc.l contrl,global,intin,intout,addrin,addrout vdipb: dc.l contrl,intin,ptsin,intout,ptsout bss *Speicherbereiche fr VDI und AES contrl: ds 11 global: ds 15 intin: ds 64 ptsin: ds 64 intout: ds 64 ptsout: ds 64 addrin: ds 64 addrout:ds 64 phys_h: ds 1 vdi_h: ds 1 nr: ds 1 ;Nummer des Accessory-Eintrags ev_buff:ds 8 ;Puffer fr GEM-Mitteilungen dati: ds 2 ;Puffer fr Datum und Zeit newnam: ds.l 1 ;Pointer auf neuen Dateinamen even inpath: ds.b 40 ;Pfad fr Fileselector insel: ds.b 13 ;Dateiname fr Fileselector nam: ds.b 52 ;kompletter alter Name der Datei nnam: ds.b 52 ;kompletter neuer Name der Datei even stack: ds.l 100 ;fr Stack . `i_.. {`iHARDDISKTOS sO.`$HARDDISKC Vj6` F N6N`N NNNFN6N N.*O*m - ЭЭм!"ҍ¼.A// Bg?<JNA m"m -So Q m -SBQ(m)M*mN0 lHhNZX/,?,N\?<N ?<A?<NAXNuNVN.J@g NF`Hl?< N\?<NTN^NuNuNV?< NT0.V@?Hn?<6NPP ./ </N 2.A `0.AB0. l A 2.A 0.A ѬRn nm"N NN^NuNV l/(HlN"P l (N N N HlHl?<N HlHl?<N HlHl?<N /,/,HlN l ( l-@/.HlNP .N 6N RN >HlJHl?<N lHlRHl?<N \HlZHl?<N L/,/,Hl8NV .N N N HlHl?<N HlHl?<(N HlHl?<N HlHl?<N /,/,HlbN ./ </N > N jN "./"</N "N ~N N V//Hl?<N XHlHl?<N r/,/,HlN| ,N N $N HlHl?<N >HlHl?<N ./,/,HlN8 l (g` l/(HlNP l (N N N Hl Hl?<NHlHl?<N/,/,HlN ` HlNXN^NuNVBn`Hl@?< N:\0. l AP0. l AP0. l APB.0.R@?HlNL\0. l AgHnHlN&P` HlNX0. l AH|gHlNX` HlNX0. l Ag0.A/HlNP0.A N6NRN>HlHl?<NlHlHl?<N\HlHl?<NL/,/,HlNV 0.A / </N 2.A-@ .NNNHl Hl?<NHl(Hl?<N/,/,Hl N .NnN2.A"/"</N "NxNNP//Hl?<N~XHl@Hl?<Nl/,/,Hl0Nv 0.A NNNHldHl?<N.HllHl?<N/,/,HlHN( Rn nmhN^NuNV?.N T nn0<`?.?<>N X9@Zg0<`0<N^NuNV?.?<LN ZXN^NuNV/ A&H`0+ |g/ N*X A"Ҽm?.NT&_N^NuNV/ &n/ NDXJ@g0<`00+ |g /+N DXBk ?+ N,TJ@g0<`0<&_N^NuNVH&n0+ |f0<`.0+ |gV0+ |f0<`v0+ |g?<B?+ NP?/+?+ NP @f0<`@k 0Hѫ`$ k o?<0+D@H/?+ NRP'@&Bk0<LN^NuNV/ &n Bk0+ |fk@ 0+ |@g0<` `R0+ |g AAA &'@`*0+H/NX&'@ fk `k g0+ |g SR k `<0+ |g2k SR . H| g kl . H|`T/ N\XJ@g k@ 0<`<0+ |gBk. H|`"` 0+S@7@k . SRH|&_N^NuNV n Sh0( @m. n "R AH|`/. . H?N\N^NuNV fBC`&SCdTC0|g0|gԼdRC`|CHBC0|@HB LN^NuNVNVH n " n $&JjFFJjFFLN^@NuNVH n"n $0(H@6C|g.0)H@:E|gE|BB0<まef bRAQ$0P`HNVH n$0(H@6C|gd"n .0)H@:E|gD|E(HD*HE20HGHBBB8:BGBBЇӄЂӅJg$0P`B`NVH"n 0<9@Q`NVH"n Bl n,0(H@8D|fB.0)H@:E|fB2$60Enfl8,:.6$0Jg0Eg|n0@gDԇ0,Q fBB`HSCdTC0|g0|gԼdRC`|"|CHB|C0|@HB AHABA LN^NuNVH0.|=@n n f n0H-@HnNFXA-H`> n(g nf. n-P n(f HnNX` HnNXA-H/./. 0.A\ PNPLN^/W DNuN^Nu)@HlNXONu)@HlNtXONuHlN*XO ,Nu)AxHlxNXONuHlxN XO",xNuNVH n "(fJg"¼м@ LN^NuNVH nB fB`м8 LN^NuNVH n$fBCB`nD6< f႖|NN^NuNVH0&n$n Bn-J @)P)h-l-lBEG>O|g|JGn|m` REHl/ NPO`SEHl/ N2PO`&0+H@JGgDG0<0dR@0.BAQ,>QQֆG|0QB`Rn0.g$nB`0R 2.HmB`b .6.HЃR$@ nH|0fRZ"` R"H|9n nH|0f$n R&@fSE .6.HЃ @B n0L N^NuNVH$.f BB`J". BnJlVnDJlRnDvd`Bbd nmDdD-@-A LN^NuNV/BnJlRnDJ lRnD 0. -@0.n0. nngD -n N^.JNuN^NuNV nl <`?.?./. ?<BN -@ m .`?<?.B?<BNv -@?<?.B?<BN\ -@ nf .Ю -@ `$ nf .Ю -@ `0.g <`b . oHn . /?.?<@N Bg?./. ?<BN ]|9@Zg <` `BlZ . N^NuNV/.?<HN\N^NuNV/.?<IN\N^NuNVBn`&0.A*0nf0.A*BPRn nLmN^NuNV?>.=|0A*"HPgXHf0(>N^Nu)I&)J")_NM"l&$l"/,Nu)I&)J")_NA"l&$l"/,NuNVH&n Bn0.|dg`>< `.`|ug`>< ``|og`><``|xg`>< l* ndf SR- .D-@`0. f Gf .`& Gf .` ./0H/NX 2.RnA0 Gf .`( Gf .` ./0H/N: X-@ .fp`FSn0.A P m0.A0| |A`0.A0|0 SR0.fLN^NuNVH&n n f=| )n)nHlHl?<N]|@0. R@?HnHnHnN".g SR-.H|0f.f SR`J nff>.n RG0lo0,`0> Gl0<`0?HnHnHnNBF`0RFA SRSGSn0g nl` SR0Sn nl0. g SR.` SR0RnSn 0. g nm`" Go0RFAH`0<0 SRSG0. Sn J@f`` SR0. g SR.><`0RGA SR0. Sn J@f SRE?.Hl/N: /NpXHѓLN^NuNVBn`"0. n PHC|0=@ nR n PH|0m n PH|9o0.N^NuNVH0&n -n @$PX`R` nRg H|%fH|%f,RBn=|Bn| H|-f=|RH|0f|0R-JHnN$X=@$nH|.fR-JHnNX=@$nH|lf=|RgH-n Gdg Gog Gxg GufB0.g @ ` @0H/Hn?.?NV 0.g0<`0<H` Gcf R @ nRT` Gsf4 @-PX<.` nR nRSF0g nf`J Geg Gfg Ggf, @)P)h/,/,Hn?.?NP` 0 nR .nl0.g$<.".A` nRSF0f`b .2.SAHЁ-@-@,.` .2SAHЁ @ nSSF0f` nR .o .R-@f nB .L N^NuNV/. HnNhP=@/.HnN8P0.N^NuNVHnHlNPN^NuNVHn /.N&PN^NuNV`/. nRH?N\ nfN^NuNVH0&n$K`Rf `L N^NuNV`4 nH| f?< ?<NX nRH??<NX0. Sn J@fN^NuNV` nRH??<NX0. Sn J@fN^NuNV` nRH??<NX0. Sn J@fN^NuNVH0&n $KA-H nf?./ N4\=n`L nf?./ N`\=n`. nf?./ Np\=n`-KBn?.NTJ@f`H| f |o@ H-@/./.?.?<@N 9@ZHg0<`0,Zn/./<?.?<@Nx 9@Z @g0<`tRnR -@`R ned` 6.ƼЃ$@ H-@/./.?.?<@N 9@ZHg0<`0,ZnBlZ0.L N^NuA)H)|)|)|)|)| )| )| )|)|>C"2"2 2"2"2"22"2"2"22"2x9|)lt)lx)l|)l)l9|C\A"A"A"A$"A*"A"A "NuLeider kann keine Information ausgegeben werden !! p HARDDISK-INFORMATION V2.0 Von Ulrich Meumann q -------------------------------------------------------------------------------- Gesamte Gre : %8ld Sektoren = %8.3f MBytes @@@ Wahre Gre : %8ld Sektoren = %8.3f MBytes @@@ Davon belegt : %8.3f MBytes@@@ = %7.2f %% @Y Freier Platz : %8.3f MBytes @@ Defekte Sektoren: %5ld = %8.1fKBytes @@ Keine defekten Sektoren vorhanden. -------------------------------------------------------------------------------- Partition %d : %s Nicht benutzt. und bootbar. Gre : %8ld Sektoren = %8.3f MBytes @@@ Belegt: %8.3f MBytes@@ = %7.2f %%@Y Frei : %8.3f Mbytes @@@$??CON:AUX:PRT:%d /****************************************************/ /* */ /* HARDDISK - INFORMATION TOS-Version 2.0 */ /* */ /* Programm zum Ausgeben von Informationen ber die */ /* Belegung von Festplatten */ /****************************************************/ /* Geschrieben in Megamax C von */ /* */ /* Ulrich Meumann */ /* Lehnerweg 2, 7900 Ulm */ /* Tel. 0731/382100 */ /****************************************************/ /* (c) 1992 MAXON Computer GmbH */ /****************************************************/ #include #define ON -1 #define OFF 0 #define READ 0x08 /* Controller: Von Platte lesen */ #define LANG 400 #define KURZ 10 struct partition { /* Partition-Info im Bootblock */ char p_flag; /* Flag, <>0, wenn Part. gltig */ char p_id1; /* Drei ID-Bytes */ char p_id2; char p_id3; long p_start; /* Startsektor der Partition */ long p_size; /* Lnge in Sektoren */ }; struct bootblock { char nutzlos[0x1c0]; /* Je nach Autobooter versch. */ char hi_spt; /* Sektoren pro Spur (SH205: 17)*/ long hd_size; /* Lnge der Platte in Sektoren */ struct partition p_table[4]; /* Vier Partition-Eintrge*/ long bsl_start; /* Anfang der defekten Sektoren */ long bsl_count; /* Anzahl der defekten Sektoren */ int checksum; /* Checksumme fr den Autoboot */ }; char puffer[512]; /* Hier kommt der Bootblock rein*/ struct bootblock *boot = puffer; char *gpip = 0xFFFA01L; /* I/O-Register im MFP */ int *diskctl_w = 0xFF8604L; /* HDC-Register in der DMA */ long *diskctl_l = 0xFF8604L; /* Das Gleiche in long */ int *fifo = 0xFF8606L; /* Steuerregister der DMA */ char *dmahigh = 0xFF8609L; /* DMA-Adresse, High-Byte */ char *dmamid = 0xFF860BL; /* Mid-Byte */ char *dmalow = 0xFF860DL; /* Low-Byte */ int *hz_200 = 0x4BAL; /* Der 200Hz-Systemzhler */ int *flock = 0x43EL; /* Sperren der Floppy-VBL's */ long save_ssp; /* Supervisor-Stackpointer */ main() { if (get_boot()) do_info(); else Cconws("Leider kann keine Information ausgegeben werden !!\n\r"); Cconin(); } /***********************************/ /* Bootsektor von Harddisk lesen */ /***********************************/ int get_boot() { if(Drvmap() & 60) /* Sind ber Stationen angemeldet ?*/ return(hd_read(0L,1,puffer,0,0)); else return(0); } /**************************************************************/ /* >anzahl< Sektoren ab >sektor< vom Laufwerk >drv< mit dem */ /* Controller >crtl< in den Puffer >buf< laden */ /**************************************************************/ int hd_read(sektor, anzahl, buf, drv, crtl) long sektor, buf; int anzahl, drv, crtl; { int ok; super_on(); /* Supervisor-Modus einschalten */ *flock = ON; /* Floppy-VBL sperren */ set_buf(buf); /* Adresse des Puffers eintragen */ ok = seek_block(READ, sektor, anzahl, drv, crtl); /* Sektoren suchen */ if (ok) dma_read(anzahl); /* DMA auf Lesen programmieren */ ok = status(); /* Hat's auch geklappt ??? */ *fifo = 0x80; /* DMA wieder in den Normalzustand */ *flock = OFF; /* Floppy-VBl wieder freigeben */ super_off(); /* Zurck in den User-Modus */ return(ok); /* Das war's !! */ } set_buf(buf) /* Pufferadresse in DMA eintragen */ long buf; { *dmalow = (char)(buf & 0xFF); *dmamid = (char)((buf >> 8) & 0xFF); *dmahigh= (char)((buf >> 16) & 0xFF); } /****************************************/ /* Sektor(en) auf der Platte anfahren */ /****************************************/ int seek_block(befehl, sektor, anzahl, drive, controller) int befehl, anzahl, drive, controller; long sektor; { long kommando; int fehler; *fifo = 0x88; kommando = ((long)controller << 21) | ((long)befehl << 16) | 0x8a; *diskctl_l = kommando; /* 1.Byte an den Controller schicken*/ if ((fehler = timer(KURZ)) == 0) /* 1/20 Sekunde warten, bis */ return(fehler); /* der Controller OK bereit ist */ *diskctl_l = ((long)drive << 21) | (sektor & 0xFF0000) | 0x8A; if ((fehler = timer(KURZ)) == 0) /* 2.Byte senden und warten */ return(fehler); *diskctl_l = (sektor & 0xFF00) << 8 | 0x8A; /* 3.Byte senden */ if ((fehler = timer(KURZ)) == 0) return(fehler); *diskctl_l = (sektor & 0xFF) << 16 | 0x8A; /* 4.Byte senden */ if ((fehler = timer(KURZ)) == 0) return(fehler); *diskctl_l = ((long)anzahl & 0xFF) << 16 | 0x8A; /* Anzahl senden */ return(timer(KURZ)); } /******************************************************************************/ /* Auf die Bereit-Meldung des Controllers warten, aber hchstens zeit/20 Sek. */ /******************************************************************************/ timer(zeit) int zeit; { int wert; wert = *hz_200 + zeit; while (*hz_200 != wert) if ((*gpip & 0x20) == 0) /* Hat der Controller sich gemeldet ?*/ return(-1); return(0); /* Zeit abgelaufen: Fehler ! */ } /******************************************************/ /* DMA auf Lesen von >anzahl< Blocks programmieren... */ /******************************************************/ dma_read(anzahl) int anzahl; { *fifo = 0x98; /* Mit der Schreib-Lese-Leitung klappern..*/ *fifo = 0x198; *fifo = 0x98; *diskctl_w = anzahl; /* Anzahl eintragen... */ *fifo = 0x8A; *diskctl_l = 0L; } /**************************************/ /* Statusmeldung vom Controller holen */ /**************************************/ int status() { int fehler; if ((fehler = timer(LANG)) == 0) /* Zwei Sekunden warten */ return(0); /* Fehler, weil Zeit alle */ *fifo = 0x8A; fehler = *diskctl_w & 0xFF; return(!fehler); } super_on() /* Supervisor-Modus einschalten */ { save_ssp = Super(0L); } super_off() /* Zurck in den User-Modus */ { Super(save_ssp); } /**********************************************/ /* Information ber die Festplatte ausgeben */ /**********************************************/ long p_frei[4], hd_frei, p_lang[4]; char p_str[4]; do_info() { long pbuff[4]; int i; hd_frei = 0; Cconws(" \033p HARDDISK-INFORMATION V2.0 Von Ulrich Meumann \033q\n\r"); Cconws("--------------------------------------------------------------------------------\r"); for(i=0;i<4;i++) { if(boot->p_table[i].p_flag && boot->p_table[i].p_id1=='G' && boot->p_table[i].p_id2=='E') { Dfree(pbuff,i+3); /* Freier Platz auf der Partition */ p_frei[i] = pbuff[0]*1024; } else p_frei[i] = 0; p_lang[i] = boot->p_table[i].p_size; /* Lnge der Partition in Sektoren */ hd_frei += p_frei[i]; /* Freier Platz auf der ganzen Platte */ } disk_info(); /* Information ber die Gesamtbelegung */ partitions(); /* Informationen zu den Partitions */ } /**********************************************/ /* Informationen zur gesamten Platte ausgeben */ /**********************************************/ disk_info() { long ws; printf(" Gesamte Gre : %8ld Sektoren",boot->hd_size); printf(" = %8.3f MBytes\n",((float)boot->hd_size*512)/1024/1024); ws = (boot->hd_size - boot->bsl_count); printf(" Wahre Gre : %8ld Sektoren",ws); printf(" = %8.3f MBytes\n",((float)ws*512)/1024/1024); printf(" Davon belegt : %8.3f MBytes",((float)ws*512-hd_frei)/1024/1024); printf(" = %7.2f %%\n",((float)(ws*512-hd_frei)/(float)(ws*512)*100)); printf(" Freier Platz : %8.3f MBytes\n",((float)hd_frei)/1024/1024); if (boot->bsl_count) { printf(" Defekte Sektoren: %5ld",boot->bsl_count); printf(" = %8.1fKBytes\n",((float)boot->bsl_count*512)/1024); } else printf(" Keine defekten Sektoren vorhanden.\n"); } /*******************************************************/ /* Informationen zu den einzelnen Partitionen ausgeben */ /*******************************************************/ partitions() { int i; long belegt; char p_code[4]; for(i=0;i<4;i++) { Cconws("--------------------------------------------------------------------------------\r"); p_code[0]=boot->p_table[i].p_id1; p_code[1]=boot->p_table[i].p_id2; p_code[2]=boot->p_table[i].p_id3; p_code[3]='\0'; printf(" Partition %d : ",i+1); if (boot->p_table[i].p_flag) printf("%s ",p_code); else printf("Nicht benutzt.\n"); if (boot->p_table[i].p_flag & 0x80) printf("und bootbar.\n"); else printf("\n"); if (boot->p_table[i].p_flag) { printf(" Gre : %8ld Sektoren",p_lang[i]); printf(" = %8.3f MBytes\n",((float)p_lang[i]*512)/1024/1024); belegt = p_lang[i]*512-p_frei[i]; printf(" Belegt: %8.3f MBytes",((float)belegt)/1024/1024); printf(" = %7.2f %%",((float)belegt/(float)(p_lang[i]*512))*100); printf(" Frei : %8.3f Mbytes\n",(float)p_frei[i]/1024/1024); } } } /***********************************************/ /* ZUSTZLICHE FUNKTIONEN:SCHREIBEN UND PARKEN */ /***********************************************/ #define WRITE 0x0A /**************************************************************/ /* >anzahl< Sektoren ab >sektor< vom Puffer >buf< auf das */ /* Laufwerk >drv< mit dem Controller >crtl< schreiben */ /**************************************************************/ int hd_write(sektor, anzahl, buf, drv, crtl) long sektor, buf; int anzahl, drv, crtl; { int ok; super_on(); /* Supervisor-Modus einschalten */ *flock = ON; /* Floppy-VBL sperren */ set_buf(buf); /* Adresse des Puffers eintragen */ ok = seek_block(WRITE, sektor, anzahl, drv, crtl); /* Sektoren suchen */ if (ok) dma_write(anzahl); /* DMA auf Schreiben programmieren */ ok = wr_status(); /* Hat's auch geklappt ??? */ *fifo = 0x80; /* DMA wieder in den Normalzustand */ *flock = OFF; /* Floppy-VBl wieder freigeben */ super_off(); /* Zurck in den User-Modus */ return(ok); /* Das war's !! */ } /**********************************************************/ /* DMA auf Schreiben von >anzahl< Blocks programmieren... */ /**********************************************************/ dma_write(anzahl) int anzahl; { *fifo = 0x98; /* Mit der Schreib-Lese-Leitung klappern..*/ *fifo = 0x198; *diskctl_w = anzahl; /* Anzahl eintragen... */ *fifo = 0x18A; *diskctl_l = 0x100L; } /**************************************/ /* Statusmeldung vom Controller holen */ /**************************************/ int wr_status() { int fehler; if ((fehler = timer(LANG)) == 0) /* Zwei Sekunden warten */ return(0); /* Fehler, weil Zeit alle */ *fifo = 0x18A; fehler = *diskctl_w & 0xFF; return(!fehler); } #define PARK 0x1B /***********************************************************************/ /* Kpfe der Platte >drv< mit HDC >crtl< in die Parkposition fahren... */ /***********************************************************************/ int hd_park(drv,crtl) int drv, crtl; { int ok; super_on(); /* Supervisor-Modus einschalten */ *flock = ON; /* Floppy-VBL sperren */ ok = seek_block(PARK, 0L, 0, drv, crtl); /* Sektoren suchen */ *diskctl_l = (long)0x0a; /* Noch ein Byte senden... */ ok = timer(KURZ); /* Und nochmal warten... */ ok = status(); /* Hat's auch geklappt ??? */ *fifo = 0x80; /* DMA wieder in den Normalzustand */ *flock = OFF; /* Floppy-VBl wieder freigeben */ super_off(); /* Zurck in den User-Modus */ return(ok); /* Das war's !! */ }