NNNNNNp NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN6` @! #@%`')+/379;=/C@oIKMOQ S@U`WY[]cgikmoq su`wy} @` @ ` @ ` O ` @ ` ǀ / @ ׀ ٠  @` `!a  !Aa!!#Ao')+1!3A5a79;=A!CAEaGIKMO/SAoWY[]_a!cAeakmoqsAuawy{}/Oaa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!AaO b  !/!B!!!!"#B"%b")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$Co$GI$K$M$O%QO%UW%Y%[%]%_&a&i&k&m&/'sB'ub'wy'{` @! #@%`')+/379;=/C@oIKMOQ S@U`WY[]cgikmoq su`wy} @` @ ` @ ` O ` @ ` ǀ / @ ׀ ٠  @` `!a  !Aa!!#Ao')+1!3A5a79;=A!CAEaGIKMO/SAoWY[]_a!cAeakmoqsAuawy{}/Oaa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!AaO b  !/!B!!!!"#B"%b")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$Co$GI$K$M$O%QO%UW%Y%[%]%_&a&i&k&m&/'sB'ub'wy'{ST_SH_4 C_2GRUNDLAGEN ]iUTILITIES_2p^ig. ]i.. TIMER ]iSUBMENU ]i COOKIE JAR^i4GEM ^i>KRYPTOLOGIE&^iaCPX =^iWINDOWS e^i>. ]i.. ]iSLEEP LST :2+ SLEEP PRG =2+DSLEEP Q A2+Open "O",#1,"SLEEP.PRG" Cls Fertig$="Ende" Do Read Dat$ Inc Cnt% Exit If Instr(Dat$,Fertig$,1)>0 Dat$=Right$(Dat$,Len(Dat$)-1) If (Cnt% Mod 12)=1 Lin%=Val(Dat$) Chk%=0 Print At(38,25);Lin%; Else Dat$="&"+Dat$ If (Cnt% Mod 12)=0 If Chk%<>Val(Dat$) Print " => Fehler!" Chk%=0 Endif Else Add Chk%,Val(Dat$) Out #1,Val(Dat$) Endif Endif Loop Read Dat$ If Chk%<>Val("&"+Right$(Dat$,Len(Dat$)-1)) Print " => Fehler!" Endif ' ' ##################################################### Dat_lines: Data 00001, 60, 1A, 00, 00, 01, 10, 00, 00, 00, 06, 091 Data 00002, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 000 Data 00003, 00, 00, 00, 00, 00, 00, 00, 00, 48, 79, 0C1 Data 00004, 00, 00, 00, 2A, 3F, 3C, 00, 40, 3F, 3C, 160 Data 00005, 00, 07, 42, 67, 3F, 3C, 00, 1F, 4E, 4E, 1E6 Data 00006, DF, FC, 00, 00, 00, 0C, 42, 67, 2F, 3C, 2FB Data 00007, 00, 00, 02, 58, 3F, 3C, 00, 31, 4E, 41, 195 Data 00008, 48, E7, C0, 00, 13, FC, 00, 00, 00, FF, 3FD Data 00009, FA, 19, 08, B9, 00, 05, 00, FF, FA, 0F, 3E1 Data 00010, 02, 7C, F3, FF, 4A, 78, 04, 3E, 66, 00, 3DA Data 00011, 00, B0, 08, 2F, 00, 02, 00, 08, 66, 00, 157 Data 00012, 00, A6, 10, 38, 0E, 39, 0C, 00, 00, 4A, 18B Data 00013, 66, 2C, 0C, 39, 00, 01, 00, 00, 01, 14, 0ED Data 00014, 67, 0A, 04, 39, 00, 01, 00, 00, 01, 14, 0C4 Data 00015, 60, 60, 0C, B9, 00, 01, 86, A0, 00, 00, 2AC Data 00016, 01, 10, 67, 54, 06, B9, 00, 00, 00, 02, 18D Data 00017, 00, 00, 01, 10, 60, 48, 0C, 00, 00, 4E, 113 Data 00018, 66, 28, 4A, B9, 00, 00, 01, 10, 67, 0C, 215 Data 00019, 04, B9, 00, 00, 00, 02, 00, 00, 01, 10, 0D0 Data 00020, 60, 2E, 0C, 39, 00, 07, 00, 00, 01, 14, 0EF Data 00021, 67, 3A, 06, 39, 00, 01, 00, 00, 01, 14, 0F6 Data 00022, 60, 30, 0C, 00, 00, 0E, 66, 14, 23, FC, 243 Data 00023, 00, 00, 00, 00, 00, 00, 01, 10, 13, FC, 120 Data 00024, 00, 07, 00, 00, 01, 14, 60, 26, 20, 39, 0FB Data 00025, 00, 00, 01, 10, 67, 0E, 22, 39, 00, 00, 0E1 Data 00026, 01, 10, 51, C9, FF, FE, 51, C8, FF, F4, 634 Data 00027, 08, 38, 00, 00, 0E, 1B, 67, 08, 08, 38, 118 Data 00028, 00, 01, 0E, 1B, 67, F8, 13, FC, 00, 40, 2D8 Data 00029, 00, FF, FA, 1F, 13, F9, 00, 00, 01, 14, 339 Data 00030, 00, FF, FA, 19, 4C, DF, 00, 03, 4E, 73, 401 Data 00031, 00, 00, 00, 00, 07, 00, 00, 00, 00, 02, 009 Data 00032, 60, 0A, 0C, 0C, 0E, 0C, 0A, 0A, 12, 08, 0CA Data 00033, 08, 08, 26, 00, Ende, 036 `Hy*?<@?<Bg?<NN Bg/<X?<1NAH|Jx>f/f89 Jf, 9g 9`` gT`H Nf(Jg `. 9g:9`0 f#`& 9g"9QQ8g8g@LNs`  &; ##################################### ; # S L E E P 05/87 # ; ##################################### ; # gedrckte Taste: | Wirkung: # ; #-------------------+---------------# ; # - (10er-Block) | CPU langsamer # ; # + (10er-Block) | CPU schneller # ; # Shift rechts | CPU 'stoppen' # ; # Shift links | ...fortsetzen # ; # Backspace | full speed on # ; ##################################### text TASR equ $FFFA0F ; Timer A Service Register TACR equ $FFFA19 ; Timer A Control Register TADR equ $FFFA1F ; Timer A Data Register FLOPLK equ $43E ; Flag, ob Floppy aktiv ist KEY equ $E39 ; enthlt Code der derzeit gedrckten Taste SKEY equ $E1B ; enthlt Status der Sondertasten LOAD: pea IRR ; Adresse der Timer A-Interrupt-Routine move.w #64,-(a7) ; DATA = 64 move.w #7,-(a7) ; CRTL = 7 (Vorteiler auf 200) clr.w -(a7) ; Timer A (=0) move.w #31,-(a7) ; mit XBTIMER()... trap #14 ; ...des XBIOS aktivieren... add.l #12,a7 ; ...und Stapel korrigieren. clr.w -(a7) ; kein Fehler aufgetreten move.l #600,-(a7) ; 600 Bytes reservieren... move.w #$31,-(a7) ; ...KEEP PROCESS... trap #1 ; ...und weggetreten! ;========================================================================= IRR: ; Hier geht's lang beim Timer A-IR! movem.l d0-d1,-(a7) ; verwendete Register retten move.b #0,TACR ; erstmal Timer A ausschalten bclr #5,TASR ; und die MFP-IRs freigeben, andi.w #$F3FF,SR ; auerdem alle IRs ab IPL 4 tst.w FLOPLK ; Floppyzugriff??? bne ENDE ; ja, dann fertig btst #2,8(a7) ; VBL-IRR unterbrochen??? bne ENDE ; dann aber hurtig beenden! PLUS: ; Verzgerung bei '-' erhhen move.b KEY,d0 ; Tastaturcode der gedrckten Taste cmpi.b #$4A,d0 ; = '-' auf 10er-Block? bne.s MINUS ; nein DEC: ; Vorteilungsfaktor dekrementieren cmpi.b #1,CONTROL ; Schon kleinste Vorteilerstufe? beq.s DELAY_TEST ; ja, dann Verzgerung erhhen subi.b #1,CONTROL ; sonst kleinere Vorteilung whlen bra.s WAIT ; und warten DELAY_TEST: ; Verzgerungsfaktor erhhen cmpi.l #100000,DELAY ; obere Grenze schon erreicht? beq.s WAIT ; ja, dann nur warten addi.l #2,DELAY ; sonst erst Verzgerung erhhen bra.s WAIT ; und dann warten MINUS: ; Verzgerung bei '+' verkleinern cmpi.b #$4E,d0 ; = '+' auf 10er-Block? bne.s BS ; nein, dann vielleicht Backspace? tst.l DELAY ; if Verzgerung=0 beq.s INC ; then CONTROL++ subi.l #2,DELAY ; else DELAY-=2 und bra.s WAIT ; warten INC: ; Vorteilungsfaktor inkrementieren cmpi.b #7,CONTROL ; Vorteilung schon maximal? beq.s KEYPRESS ; ja addi.b #1,CONTROL ; sonst erhhen bra.s KEYPRESS BS: cmpi.b #14,d0 ; Backspace-Taste gedrckt? bne.s WAIT ; nein, nur warten move.l #0,DELAY ; sonst CPU auf volle Lotte und move.b #7,CONTROL ; Vorteilung auf 200 einstellen bra.s ENDE ; fertig WAIT: ; Warteschleife move.l DELAY,d0 ; d0=Verzgerungszhler beq.s KEYPRESS ; falls 0, dann nicht warten \wait_lp1: ; sonst warten... move.l DELAY,d1 ; ...je nach Verzgerung... \wait_lp2: dbra d1,\wait_lp2 ; ...aber immer... dbra d0,\wait_lp1 ; ...im Quadrat! KEYPRESS: btst #0,SKEY ; rechte Shift-Taste gedrckt? beq.s ENDE ; nein, dann fertig \key_release: btst #1,SKEY ; sonst warten, bis linke Shift- beq.s \key_release ; Taste gedrckt wird ENDE: ; alles hat ein Ende, nur der Timer nicht! move.b #64,TADR ; Timer-Datenregister neu laden... move.b CONTROL,TACR ; ...und aktivieren... movem.l (a7)+,d0-d1 ; ...schlielich Register restaurieren... rte ; ...und Ende der Veranstaltung! data DELAY: dc.l 0 ; enthlt Wert fr Verzgerung CONTROL: dc.b 7 ; enthlt Wert fr Timer A-Control-Register end . ]i .. ]iMENU DFN |~MENU H |~MENU RSC |~SMDEMO C fSMDEMO PRG սf SMDEMO PRJ dfSUBMENU C f [-SUBMENU H 2f,SUBMENU O ƽf- S_MENU DFN |~0S_MENU H |~1S_MENU RSC |~2 MENUFONTDATEIBILDTYPLADENSPEICHERENDESYSTEMCOMPUTERSTIL#define MENU 0 /* TREE */ #define FONT 5 /* OBJECT in TREE #0 */ #define DATEI 4 /* OBJECT in TREE #0 */ #define BILDTYP 17 /* OBJECT in TREE #0 */ #define LADEN 18 /* OBJECT in TREE #0 */ #define SPEICHER 19 /* OBJECT in TREE #0 */ #define ENDE 21 /* OBJECT in TREE #0 */ #define SYSTEM 23 /* OBJECT in TREE #0 */ #define COMPUTER 24 /* OBJECT in TREE #0 */ #define STIL 26 /* OBJECT in TREE #0 */ LLLLN$LN Desk Datei Font Your message here -------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Bildtyp Bild laden Bild speichern----------------- Ende System Computer------------ StilPP $ + 3 P : O d y   # , 7  D L:'K N/********************************************************************/ /* Demo zu Submenu V1.15 */ /* - Einsatz von Submenus unter GEM - */ /* - lauffhig unter allen TOS-Versionen und in allen Auflsungen - */ /* von Uwe Hax in Megamax C */ /* Pure C-Konvertierung: Thomas Werner */ /* (c) 1992 MAXON Computer GmbH */ /********************************************************************/ #include #include #include #include "submenu.h" typedef enum { FALSE, TRUE } boolean; int dummy; extern GEMPARBLK _GemParBlk; extern int handle; /* -------------------------------------------------------------------------- */ #define MAX_SUBMENU 4 /* 4 Submenus */ #include "menu.h" /* RSC-Definitionen fr Mens */ #include "s_menu.h" /* RSC-Definitionen fr Submenus */ extern int subnum; /* Rckgabewert: angeklickter Submenu-Eintrag */ /* -------------------------------------------------------------------------- */ void gem_prg(void) { int mesg_buff[8]; OBJECT *menu,*submenu; int event; OBJECT **rcs_pointer; OBJECT *rcs_adr; int ende=FALSE; char string[20]; int m_index[MAX_SUBMENU]; /* Resource-Files laden */ /* 1. Resource-File mit den Submenus */ if (!rsrc_load("s_menu.rsc")) { form_alert(1,"[3][SUBMENU.RSC nicht gefunden!][ Abbruch ]"); return; } rsrc_gaddr(R_TREE,MENU,&submenu); /* Adresse des Resource-Files merken */ rcs_pointer=(OBJECT **)&_GemParBlk.global[5]; rcs_adr=*rcs_pointer; /* 2. Resource-File mit allen anderen Definitionen: normale Mens, Dialogboxen, ... laden */ if (!rsrc_load("menu.rsc")) { form_alert(1,"[3][MENU.RSC nicht gefunden!][ Abbruch ]"); return; } rsrc_gaddr(R_TREE,MENU,&menu); /* Submenus installieren */ m_index[0]=BILDTYP; /* Indices aller Men-Eintrge, die Titel fr */ m_index[1]=SYSTEM; /* Submens sein sollen */ m_index[2]=COMPUTER; /* in fortlaufender Reihenfolge */ m_index[3]=STIL; init_submenus(handle,menu,submenu,MAX_SUBMENU,m_index); graf_mouse(ARROW,0); menu_bar(menu,TRUE); do { event=evnt_multi(MU_MESAG | MU_TIMER,dummy,dummy,dummy,dummy,dummy,dummy, dummy,dummy,dummy,dummy,dummy,dummy,dummy,mesg_buff,100, 0,&dummy,&dummy,&dummy,&dummy,&dummy,&dummy); if (event & MU_MESAG) { if (mesg_buff[0]==MN_SELECTED) { switch (mesg_buff[4]) { case BILDTYP: case SYSTEM: case COMPUTER: case STIL: redraw_bg(); /* bei Anklicken der Submenu-Titel */ break; /* mssen auch die Submenus ein- */ /* klappen */ case ENDE: ende=TRUE; break; } menu_tnormal(menu,mesg_buff[3],TRUE); } } if (event & MU_TIMER) /* subnum mu regelmig abgefragt werden */ { /* da kein MU_MESAG gesendet wird */ if (subnum) /* Submenu angewhlt? */ { /* Haken setzen bzw. lschen */ if (submenu[subnum].ob_state & CHECKED) menu_icheck(submenu,subnum,FALSE); else menu_icheck(submenu,subnum,TRUE); /* Index-Nr. des angewhlten Submenus ausgeben */ sprintf(string,"Submenu-Index: %d ",subnum); v_gtext(handle,0,150,string); subnum=0; /* anschlieend zurcksetzen */ } } } while (!ende); /* Resource-Files wieder freigeben */ rsrc_free(); *rcs_pointer=rcs_adr; rsrc_free(); } `Z``l>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#^3b k #h Ј<.@#dJybg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON 0 J"LN? 9g @N 9g @NN?<LNA/ EN5@R@gPp` 2A5R@| m5|HjHjCANPO5@5@4HjC JNXOp`B@$_Nu09 N4NfNuNS@fNNB@NLNuCAN pN4NuH>YO?@,H(I:*o0BCN~U@fp`p >0HЀNV$HG 2H ЀЁN>&4,H"ҁ҂24H ЀЁ<4BG`$2Hҁ45H ЀЂ4H"ҁ҂ S! Ԃ25(H ЀЁ=2H ЀЁ Sҁ05H$ԂԀ-( 4H ЀЂ"S#0F"S#85`2H ЀЁ862H ЀЁ vf460HЀ05H"ҁҀvRB0H"ҁҀ982Hҁ05H$ԂԀv(2H$Ԃԁ9(pt(H(8H؄5H<4(RGGnBG`0HЀrl62RGGn0HN'H'L(7oTXOL|NuH02H ЀЁppC p 024Np4H"ҁ҂ Sp gArF04NBA0N2H ЀЁ S:02H ЀЁ S pg6x20N2/0Nj2/0N2/0N2/0N0OLBCE rI Fr0NGOBCAN.J@fApN `G$ KBAB@N/| o /PANJ@fA/pN`TA(BAB@N>?|?|?|HWr"S o,09 NXOB@N*p o(NMI K,E HRHRHRHRHRBgpd????????????"J M42p0NO.8r@gH U fB4-|| b&B4; N Np`vr0- o(NNp DgP2gLtH(؄؁ SpH g 0BAN` r0 SN?CX NNTO N4<BA09 N BTJCg N o NOBA< <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/ &yB g/ &S?<INA\O`&yF g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#/ /?<HNA\O @$_Nu/ ?<NNTO$_Nu/A BhBh2<%aT"_22222Nu/ /A BhBhr|a.C" _0 _0 o0Nu/A 1|1|!I!o1A"_A000000000A rm`C%2222A 1|Bhrr`A Bh1|1Ar`A 1ABh1|r`|A Bh1|1Arh`bA Bh1|1Ar`HA Bh1|1Arj`.A Bh1|1Ar `A BhBhre`C 3ABi#R Ir a#%RNuC 3A03B23|CrtRB2fA 1Br`A BhBhr{`3 / C 2dBi3| Cp 2Q"<"ps/ NB$_ _0 A"F"op,2QA"p 2QNu !F%"F"A Bh1|1Arz`/ 1@ 0"<JpsNBA"F0$_Nup `*p`$##/ A!F00000 0 0000000000 pa"_2"o2"o"2"o&2"o*2"o.2Nu##3!Fp4`##pn`po`/A!F00ppa|"_"%Nu##3!Fp``##A!F00p`J##A!F00p!`4/ /pMa*"_2"_2"o2"o2Nu##3!FpN`/ 3 @@A"C B@22220<"<NBA"F0$_Nu !F"F#% Fehler bei der Programminitialisierung!s_menu.rsc[3][SUBMENU.RSC nicht gefunden!][ Abbruch ][3][MENU.RSC nicht gefunden!][ Abbruch ]Submenu-Index: %d  !F%"F"r  h(D*<" 8$&  ~.B(6 $ " j  0 smdemo.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = pcstart.o pcframe.o submenu.o smdemo (submenu.h, menu.h, s_menu.h) pcstdlib.lib pctoslib.lib pcgemlib.lib /********************************************************************/ /* Submenu V1.15 */ /* - Einsatz von Submenus unter GEM - */ /* - lauffhig unter allen TOS-Versionen und in allen Auflsungen - */ /* von Uwe Hax in Megamax C */ /* Pure C-Konvertierung: Thomas Werner */ /* (c) 1992 MAXON Computer GmbH */ /********************************************************************/ #include #include #include #include typedef enum { FALSE, TRUE } boolean; int subnum; /* Rckgabewert: Index des Submenu-Eintrags */ /* Alle folgenden globalen Variablen werden nur in den folgenden Routinen benutzt und drfen auf keinen Fall von anderen Routinen verndert werden! */ struct ext_appl_blk { /* erweiterten APPLBLK definieren */ int (*ub_code)(); /* Zeiger auf Zeichen-Routine */ long ub_parm; /* Index der Submenu-Box */ char *text; /* Men-Text */ } *block; void *menu_buffer; /* Hintergrundspeicher fr Submenus */ int copy_array[8]; /* Hintergrund-Koordinaten */ int fill_array[8]; /* Box-Koordinaten */ OBJECT *sub_menu; /* Adresse der Submenus */ MFDB memory; /* zum Kopieren */ MFDB screen; /* zum Kopieren */ int device; /* VDI-Handle */ int pxyarray[4]; /* zum Zeichnen */ int mbutton,mx,my; /* Maus */ long sm_index; /* Submenu-Index */ void init_submenus(int handle, OBJECT *menu, OBJECT *submenu, int count,int *menu_index) /* handle: VDI-Handle */ /* *menu, *submenu: Adressen der beiden Men-Zeilen */ /* count: Anzahl der Elemente in der Liste */ /* *menu_index: Liste mit Indices aller Men-Eintrge, die Titel fr Submenus sein sollen */ { int i; int cdecl draw_submenu(PARMBLK *parmblock); int box2; int *size; int max_size=0; int submenu_index; int menubar; /* Hhe der Men-Leiste ist abhngig von der Auflsung */ menubar=(Getrez()==2) ? 19 : 11; /* Speicher reservieren fr alle APPLBLK's */ size=(int *)Malloc((long)count*2L); block=(struct ext_appl_blk *) Malloc((long)(sizeof(struct ext_appl_blk)*count)); /* Index der G_BOX fr das erste Submenu holen */ submenu_index=submenu[submenu[submenu[0].ob_tail].ob_head].ob_next; for (i=0; ipb_tree[parmblock->pb_obj].ob_spec.userblk; /* Text des Men-Eintrags */ sm_text=appl_pointer->text; /* aktuelle Fllattribute merken */ vqf_attributes(device,attrib); /* Index der Submenu-Box */ sm_index=parmblock->pb_parm; /* kein Submenu angewhlt */ subnum=0; /* Korrekturfaktor fr die Ausgabe von Texten (abhngig von der Auflsung) */ resolution=Getrez(); correct=(resolution==2) ? 3 : 2; /* Auf keinen Fall Clipping durchfhren; Clip-Koordinaten sind 0!!! */ /* ist der Eintrag NORMAL? */ if (!parmblock->pb_currstate) /* ja */ { /* war der Eintrag vorher SELECTED? */ if (parmblock->pb_prevstate) /* ja */ { /* Maus im Submenu? */ vq_mouse(device,&mbutton,&mx,&my); /* wenn ja, Submenu-Kontrolle */ if ((mx>=sub_menu[sm_index].ob_x-1) && (mx<=sub_menu[sm_index].ob_x+sub_menu[sm_index].ob_width) && (my>=sub_menu[sm_index].ob_y) && (my<=sub_menu[sm_index].ob_y+sub_menu[sm_index].ob_height+1)) do_submenu(); /* Hintergrund restaurieren */ redraw_bg(); /* Men-Eintrag neu zeichnen */ pxyarray[0]=parmblock->pb_x; pxyarray[1]=parmblock->pb_y; pxyarray[2]=parmblock->pb_x+parmblock->pb_w-1; pxyarray[3]=parmblock->pb_y+parmblock->pb_h-1; switch_entry(FALSE); } else { /* Text ausgeben */ v_gtext(device,parmblock->pb_x,parmblock->pb_y+parmblock->pb_h-correct, sm_text); } state=NORMAL; } else /* SELECTED */ { /* Men-Eintrag selektieren */ pxyarray[0]=parmblock->pb_x; pxyarray[1]=parmblock->pb_y; pxyarray[2]=parmblock->pb_x+parmblock->pb_w-1; pxyarray[3]=parmblock->pb_y+parmblock->pb_h-1; switch_entry(FALSE); /* Submenu zeichnen */ /* ================ */ /* Hintergrund retten */ screen.fd_addr=NULL; memory.fd_addr=(void *)menu_buffer; memory.fd_wdwidth=sub_menu[sm_index].ob_width/16+1; memory.fd_stand=0; memory.fd_nplanes=resolution ? 2/resolution : 4; copy_array[0]=sub_menu[sm_index].ob_x; copy_array[1]=sub_menu[sm_index].ob_y-1; copy_array[2]=sub_menu[sm_index].ob_x+sub_menu[sm_index].ob_width+1; copy_array[3]=sub_menu[sm_index].ob_y+sub_menu[sm_index].ob_height; copy_array[4]=0; copy_array[5]=0; copy_array[6]=sub_menu[sm_index].ob_width+1; copy_array[7]=sub_menu[sm_index].ob_height+1; vro_cpyfm(device,3,copy_array,&screen,&memory); /* Box zeichnen */ fill_array[0]=copy_array[0]; fill_array[1]=copy_array[1]; fill_array[2]=copy_array[2]; fill_array[3]=copy_array[1]; fill_array[4]=copy_array[2]; fill_array[5]=copy_array[3]; fill_array[6]=copy_array[0]; fill_array[7]=copy_array[3]; vsf_interior(device,0); vswr_mode(device,1); v_fillarea(device,4,fill_array); /* Texte ausgeben */ index=sub_menu[sm_index].ob_head; while (sub_menu[index].ob_type==G_STRING) { if (sub_menu[index].ob_state & DISABLED) vst_effects(device,2); tx=sub_menu[sm_index].ob_x+sub_menu[index].ob_x+1; ty=sub_menu[sm_index].ob_y+sub_menu[index].ob_y+ sub_menu[index].ob_height-correct; v_gtext(device,tx,ty,sub_menu[index].ob_spec.free_string); if (sub_menu[index].ob_state & CHECKED) v_gtext(device,tx+2,ty,"\10"); vst_effects(device,0); index=sub_menu[index].ob_next; } state=SELECTED; } /* alte Fllattribute wieder herstellen */ vsf_interior(device,attrib[0]); vsf_color(device,attrib[1]); vsf_style(device,attrib[2]); vswr_mode(device,attrib[3]); vsf_perimeter(device,attrib[4]); /* Zustand des angewhlten Men-Eintrags zurckgeben */ return(state); } void redraw_bg(void) { v_hide_c(device); copy_array[0]=0; copy_array[1]=0; copy_array[2]=sub_menu[sm_index].ob_width+1; copy_array[3]=sub_menu[sm_index].ob_height+1; copy_array[4]=sub_menu[sm_index].ob_x; copy_array[5]=sub_menu[sm_index].ob_y-1; copy_array[6]=sub_menu[sm_index].ob_x+sub_menu[sm_index].ob_width+1; copy_array[7]=sub_menu[sm_index].ob_y+sub_menu[sm_index].ob_height; /* alle anderen Parameter sind bereits gesetzt */ vro_cpyfm(device,3,copy_array,&memory,&screen); v_show_c(device,1); } void switch_entry(boolean disabled) { /* je nach bergebenem Parameter Men-Eintrag entweder normal oder selektiert zeichnen */ if (!disabled) { vsf_interior(device,1); vswr_mode(device,3); vr_recfl(device,pxyarray); } } void do_submenu(void) { int index; int prev_obj=0; /* Cursor einschalten */ v_show_c(device,1); /* Mauszeiger innerhalb des Submenus? */ while ((mx>=sub_menu[sm_index].ob_x-1) && (mx<=sub_menu[sm_index].ob_x+sub_menu[sm_index].ob_width) && (my>=sub_menu[sm_index].ob_y) && (my<=sub_menu[sm_index].ob_y+sub_menu[sm_index].ob_height+1)) { /* Eintrag unter Mauszeiger suchen */ index=sub_menu[sm_index].ob_head; while (sub_menu[index].ob_type==G_STRING) if ((my>sub_menu[sm_index].ob_y+sub_menu[index].ob_y) && (myYO?@,H(I:*o0BCNU@fp`p >0HЀN$HG2H ЀЁN&4,H"ҁ҂24H ЀЁ<4BG`$2Hҁ45H ЀЂ4H"ҁ҂ S! Ԃ25(H ЀЁ=2H ЀЁ Sҁ05H$ԂԀ-( 4H ЀЂ"S#0F"S#85`2H ЀЁ862H ЀЁ vf460HЀ05H"ҁҀvRB0H"ҁҀ982Hҁ05H$ԂԀv(2H$Ԃԁ9(pt(H(8H؄5H<4(RGGnBG`0HЀrl62RGGn0HN'H'L(7oTXOL|NuH02H ЀЁppC p 024Np4H"ҁ҂ Sp gArF04NBA0N2H ЀЁ S:02H ЀЁ S pg6x20N2/0N2/0N2/0N2/0N0OLBCEIr0NG /* Hier sollte die Header-Datei mit den Prototoypen des Cookie-Moduls einge- lesen werden. */ void main (void) { COOKIE test; long wert = 0; if (!get_cookie ("XXXX", &wert)) { /* wir sind noch nicht da ! */ create_cookie (&test, "XXXX", 0L); new_cookie (&test); /* hier geht's weiter... */ } else { /* sind bereits im System */ puts ("Hurra - Cookie gefunden !"); printf ("Cookie-Wert: %lx", wert); } } /* Listing 1 */ /* Programm : Extended TOS Library Modul : cookie.c Funktion : allgemeine Routinen zur Verwaltung von Cookie Jars Edit : 01.04.90 Autor : Rolf Kotzian, D-4790 Paderborn Copyright: (c) MAXON Computer GmbH */ /* Includes */ #include #include #include #include /* Defines */ #define TRUE (0 == 0) #define FALSE (0 == 1) /* Typ-Vereinbarungen */ typedef int boolean; typedef struct { char cookie_id[4]; /* Cookie-ID */ long cookie_value; /* Cookie-Wert */ }COOKIE; /* CREATE_COOKIE: installiert in der Variablen 'cookie' einen Cookie; als weitere Parameter werden die ID des Cookies sowie dessen Wert bergeben. */ void create_cookie (COOKIE *cookie, char *id, long value) { strncpy (cookie->cookie_id, id, 4); cookie->cookie_value = value; } /* create_cookie */ /* NEW_COOKIE: trgt neuen Cookie in den Jar ein. Achtung ! Der Fall des bereits vollen Jars wird hier noch nicht abgefangen; es muss dann ent- sprechend Speicher alloziert, und die ge- samte Tabelle umkopiert werden. */ boolean new_cookie (COOKIE *entry) { int act_row = 0; long old_stack, *cookiejar; /* Zeiger auf CookieJar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); Super ((void *) old_stack); /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return (FALSE); /* NULL-Cookie suchen */ while (cookiejar[0]) { ++act_row; cookiejar = &(cookiejar[2]); } /* der neue Cookie kann nur eingetragen werden, wenn der CookieJar noch aus- reichend Platz bietet... */ if (act_row < cookiejar[1]) { /* NULL-Cookie weiterschieben */ cookiejar[2] = cookiejar[0]; cookiejar[3] = cookiejar[1]; /* neuen Cookie eintragen */ strncpy ((char *)cookiejar, entry->cookie_id, 4); cookiejar[1] = entry->cookie_value; return (TRUE); } return (FALSE); } /* new_cookie */ /* GET_COOKIE: fragt den Wert eines Cookies ab. Als Parameter werden dabei die ID des zu suchenden Cookies sowie ein Zeiger auf den ge- fundenen Wert bergeben. Die Routine liefert den Wert FALSE falls der angegebene Cookie nicht existiert... */ boolean get_cookie (char *cookie, long *value) { long old_stack; long *cookiejar; /* Zeiger auf Cookie Jar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); Super ((void *) old_stack); /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return (FALSE); do { if (!strncmp ((char *)cookiejar, cookie, 4)) { /* nur eintragen, wenn kein NULL-Zeiger */ if (value) { *value = cookiejar[1]; return (TRUE); } } else /* nchsten Cookie nehmen */ cookiejar = &(cookiejar[2]); } while (cookiejar[0]); /* NULL-Cookie ? */ return (FALSE); } /* get_cookie */ /* REMOVE_COOKIE: entfernt den mit 'cookie_id' bezeichneten Cookie aus dem Jar. */ void remove_cookie (char *cookie_id) { long old_stack, *cookiejar; /* Zeiger auf Cookie Jar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); Super ((void *) old_stack); /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return; /* suche den zu lschenden Cookie in der Tabelle... */ while ((cookiejar[0]) && (strncmp((char *) cookiejar, cookie_id, 4))) cookiejar = &(cookiejar[2]); /* wurde der gewnschte Cookie gefunden, oder ist bereits das Ende der Tabelle (NULL-Cookie) erreicht ? */ if (cookiejar[0]) { /* der Cookie wurde gefunden ! */ do { /* jetzt werden die brigen Cookies einfach eine Position nach oben gezogen... */ cookiejar[0] = cookiejar[2]; cookiejar[1] = cookiejar[3]; cookiejar = &(cookiejar[2]); } while (cookiejar[0]); } } /* remove_cookie */ /* MOVE_COOKIEJAR: verschiebt (kompletten) Jar an eine neue Speicherstelle. Als Parameter werden die neue Adresse des Jars sowie seine Grsse, d.h. die Anzahl der in ihn hinein- passenden Cookies bergeben. */ void move_cookiejar (long *dest, long size) { long old_stack, *cookiejar, *dest_cop; /* Zeiger auf Cookie Jar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); /* Alte Adresse merken */ dest_cop = dest; /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return; do { /* Cookie's kopieren */ dest[0] = cookiejar[0]; dest[1] = cookiejar[1]; dest = &(dest[2]); cookiejar = &(cookiejar[2]); }while (cookiejar[0]); /* NULL-Cookie und seinen neuen (?) Wert eintragen... */ dest[0] = cookiejar[0]; dest[1] = size; /* _p_cookies auf neue Adresse setzen */ cookiejar = (long *) 0x5a0L; *cookiejar = (long) dest_cop; Super ((void *) old_stack); } /* move_cookiejar */ /* COOKIE_SIZE: liefert die Grsse des in- stallierten Jars, d.h. die Anzahl der maximal mglichen Eintrge. */ long cookie_size (void) { long old_stack, *cookiejar; /* Zeiger auf Cookie Jar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); Super ((void *) old_stack); /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return (0L); /* suche den NULL-Cookie */ while (cookiejar[0]) cookiejar = &(cookiejar[2]); return (cookiejar[1]); } /* cookie_size */ /* PRINT_COOKIEJAR: gibt den Inhalt des Jars auf die Standard-Ausgabe aus. */ void print_cookiejar (void) { long old_stack, *cookiejar; /* Zeiger auf Cookie Jar holen */ old_stack = Super (0L); cookiejar = *((long **) 0x5a0L); Super ((void *) old_stack); /* Ist der Jar berhaupt vorhanden ? */ if (!cookiejar) return; do { /* Jar auf 'stdout' ausgeben */ printf ("%08lx %08lx\n", cookiejar[0], cookiejar[1]); cookiejar = &(cookiejar[2]); } while (cookiejar[0]); } /* print_cookiejar */ /* Listing 2 */ . ^i>.. ]iGEMPROG H ?GEMPROG PRG =gAGEMPROG RSC EINTERNA C GGEMPROG C gH`WINTERNA H ^SCANKEY H _rGEMPROG PRJ g`/***************************************************/ /* Resource-Set indicies fuer GEMPROG */ /* =============================================== */ /* Quelldatei: GEMPROG.H */ /***************************************************/ #define MENUE 0 /* Menuebaum */ #define MNINFO 3 /* TITLE in Baum MENUE */ #define MNDATEI 4 /* TITLE in Baum MENUE */ #define ITINFO 7 /* STRING in Baum MENUE */ #define ITNEU 16 /* STRING in Baum MENUE */ #define ITOEFFNE 17 /* STRING in Baum MENUE */ #define ITSICHER 19 /* STRING in Baum MENUE */ #define ITSICALS 20 /* STRING in Baum MENUE */ #define ITAUSGAB 21 /* STRING in Baum MENUE */ #define ITENDE 23 /* STRING in Baum MENUE */ #define DESKTOP 1 /* Formula/Dialog */ #define BSPICON 1 /* ICON in Baum DESKTOP */ #define INFODIAL 2 /* Formula/Dialog */ #define INFOEXIT 4 /* BUTTON in Baum INFODIAL */ #define LADEN 0 /* Alarm-String Index */ #define SPEICHER 1 /* Alarm-String Index */ #define DOPPEL 2 /* Alarm-String Index */ #define AUSGABE 3 /* Alarm-String Index */ `|``>>>> 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`$ON 0 J"LN? 9g @N 9g @NN ?<LNAH8OGN7@J@lp`pN PIdAN J@fApN p`ABAB@N E JrB@N ArB@N ArpN ABApN xArpN lArpN `HkHkHkHSrB@N O R1S R1k R1k R1k?+?+?+4rB@ RN$\OBg/rB@N \OAN fN<A LN p kNB@N LB@OPLNu?6J@f yB@NBgBrB@N \ONJCg|fN06NuHQO6,H8pN GIKHWHSHTHUr 0N O`(???4r0 NN^\OHWHSHTHUr 0NO0g2fB@N 2POLxNu0Qo`002(io`2)1A0h4iBl`0i1@2(h4)iBl`2)i1A0h0(hNuH(O6(H8pNEHjHjHjHRr 0N,O`fHoC0 LNXO2H ЀЁ?t?tC JN.?*?*?*4rB@ LNF\OHjHjHjHRr 0NO0*g2*fB@NOLNuH O8$H6H$Ԃԁr(2N(HoCB@ JNXOHoC 0 JNXOpNpNpN?*?*?/ ?/?/ C A 4/2H ЀЁ2202NO B@NpN`B@NZ0/o4H"ҁ҂r0orr J02NO LNuHOIHoCp lNFXO l?h\?h^pNGHkHkHk"K TNxO ?+?+?+??+?+4+2B@N"O ?+?+?+??/?/4/2/ pNO ?+?+?+4rB@ TNl\OB@ TN6H"ҁҀ Tp ?+?+?+??/?/4/p2/ NO ?+?+?+??+?+4+2pNvO B@NOLNu??68W@gS@g`d|f^N`X0||bL@0;NB,B: ypNh`$ ypNZ` ypNL`3pr0 yN86NuH0YO8&HE?+4rB@ RNjTO6|fNS@g`p4H"ҁ҂ Rp fp RB@2Nl jpN2H ЀЁ Rp `Z|fzGHSHo"K KNJPOpWg2SAg`V2 RB@N`J0S@g`(p4H"ҁ҂ Rp f,p 2 RB@N`p Rh"gh"r RB@NXOL Nu/ tAgjE2A|g2n |gJQAg`L|g|g`>BAp RNB jpN`BAp RN, jpNrp RN`3p$_NuH:ON6fEGIM`|HRHSHTHo&HoBgBgBgBgBgBgBgBgBgBgBgBgp?C. N4rpNO.8r@g4| g`*2.0.N`pDgA0NpDg20N09pg~` A)pN0NXB@OL\Nu/?N&88F CN08&NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_Nu/ /?< NA\O$_Nup `p`#/ A00000 0 0000000000 paB"_2"o2"o"2"o&2"o*2"o.2Nu#A000000p*`#A0000p+`/ #3p,a"_2"o2Nu#3p2`#A0000000 0 0p3`|/ #p6an"_2"o2"o2"o 2Nu#3p4`D#pn`8po`2/A00ppa "_"Nu#3p`#A00p!`/ /A0000 0000pGa"_2"_2Nu#3pN`/ /pOa"_2"_2"o2"o2Nu/ ?A00phat2CSA|;$Y4Q$_NuA000000 pi`&3pk`#pP`#pQ`/ 3@@A"CB@22220<"< NBA0$_Nu [3][ | GEMPROG.RSC| nicht gefunden. | ][ OK ][3][ | Initialisierung | erfolglos.| ][ OK ]GEMPROG.RSCx:\CLIPBRDr   t d H 8j ,$  00>  |$| GEMPROG Datei ber GemProg...-------------------- Desk-Zubehr 1 Desk-Zubehr 2 Desk-Zubehr 3 Desk-Zubehr 4 Desk-Zubehr 5 Desk-Zubehr 6 neu anlegen ^N ffnen... ^O---------------------- sichern ^S sichern als... ^A an Ausgabe...---------------------- beenden ^QBSP ICONGEM-Programm-SkelettENTWICKELT MIT TURBO C.by D. RabichOK[0][ | laden... | ][ OK ][0][ | speichern... | ][ OK ][0][ | Doppel-Klick| auswerten... | ][ OK ][0][ | Starte| Ausgabe-Programm... | ][ OK ]?? @@@@@@@ACCCCCCCCG__^@@@@@@  F|t <} PP $  - P4 F [ n   #8H _A  $  ' Brv/************************************************************/ /* Atari ST-spezifische Routine(n) */ /* ======================================================== */ /* Quelldatei: INTERNA.C */ /************************************************************/ /* TOS ist gefragt! */ # include /************************************************************/ /* Boot-Laufwerk */ /* Aufgabe: Ermittlung des Boot-Laufwerks */ /************************************************************/ int boot_dev(void) {long old_super_stack; int ret_wert; old_super_stack = Super(0L); /* Supervisor-Modus */ ret_wert = *(int*) 0x446; Super((void *) old_super_stack); /* User-Modus */ return(ret_wert); } /************************************************************/ /******************************************************************************/ /* GEM-Rahmen-Programm Vers. 1.00c */ /* ========================================================================== */ /* Autor: D. Rabich *** Entwickelt mit Turbo C. */ /* ========================================================================== */ /* Quelldatei: GEMPROG.C */ /* ========================================================================== */ /* (c) 1992 MAXON Computer GmbH */ /******************************************************************************/ /* Include-Dateien */ # include "gemprog.h" /* Resource-Datei */ # include "interna.h" /* ST-Interna */ # include "scankey.h" /* Scancodes */ # include /* AES-Routinen */ /* Definition zweier Funktionen */ # define min(a,b) ((a) < (b) ? (a) : (b)) /* Minimum */ # define max(a,b) ((a) > (b) ? (a) : (b)) /* Maximum */ /* Handle des Desktops definieren */ # define DESK 0 /* Definitionen */ # define MAXSTRING 80 # define INIT_OK 0 # define NO_INIT 1 # define NO_RESOURCE 2 /* Strings */ char no_resource[] = "[3][ | GEMPROG.RSC| nicht gefunden. | ][ OK ]"; char no_init[] = "[3][ | Initialisierung | erfolglos.| ][ OK ]"; char rsc_name[] = "GEMPROG.RSC"; char std_scrap[] = "x:\\CLIPBRD"; /* hier auch Parameter-Datei angeben! */ /* Format : .INF */ /* Beispiel: GEMPROG.INF */ /* Struktur(en) */ typedef struct { int x,y; /* kennzeichnet einen Punkt */ } POINT; /* Prototypen */ static int init_prg(void); static void exit_prg(int); static void draw_objc(int, OBJECT*, int); static void clip(GRECT*, GRECT*); static void draw2_objc(int, OBJECT*, int); static void move_objc(int, OBJECT*, int); static void do_info(void); static void hdle_menu(int, int); static void hdle_mouse(int, POINT*); static void hdle_key(int, int); /* Variablen */ int apl_id, /* Applikations-ID */ finish = 0; /* Flag fr Ende */ OBJECT *menu, /* Men */ *desktop, /* Desktop */ *infodial, /* Dialogbox */ *aktion, /* Alert-Boxen */ *laden, /* " */ *speichern, /* " */ *ausgabe; /* " */ GRECT desksize; /* Desk-Grsse */ /******************************************************************************/ /* Anmeldung des Programms */ /* Aufgabe: Anmeldung beim AES, laden und auswerten der Resource-Datei, */ /* Scrap-Pfad setzen, Men ausgeben, Desktop setzen, */ /* Mauszeiger auf Pfeil setzen */ /******************************************************************************/ static int init_prg (void) { char scrp_path[MAXSTRING]; /* anmelden */ apl_id = appl_init(); if (apl_id < 0) /* korrekte ID? */ return(NO_INIT); /* Maus als Biene/Sanduhr */ graf_mouse(HOURGLASS,0L); /* Resource-Datei laden */ if (!rsrc_load(rsc_name)) /* nicht gefunden? */ { form_alert(1,no_resource); return(NO_RESOURCE); } /* Accessories, die unter GEM 2.x laufen sollen, */ /* drfen keine Resource-Dateien laden. */ /* Anfangsadressen ermitteln */ rsrc_gaddr(R_TREE, MENUE, &menu); /* Men */ rsrc_gaddr(R_TREE, DESKTOP, &desktop); /* Desktop */ rsrc_gaddr(R_TREE, INFODIAL,&infodial); /* Dialog */ rsrc_gaddr(R_STRING,DOPPEL, &aktion); /* Alert-Boxen */ rsrc_gaddr(R_STRING,LADEN, &laden); rsrc_gaddr(R_STRING,SPEICHER,&speichern); rsrc_gaddr(R_STRING,AUSGABE, &ausgabe); /* Grsse des Desktops ermitteln */ wind_get(DESK,WF_WORKXYWH, &desksize.g_x,&desksize.g_y, &desksize.g_w,&desksize.g_h); /* Object-Struktur anpassen */ desktop[ROOT].ob_x = desksize.g_x; desktop[ROOT].ob_y = desksize.g_y; desktop[ROOT].ob_width = desksize.g_w; desktop[ROOT].ob_height = desksize.g_h; /* Default-Objektbaum setzen (Desktop) */ objc_draw(desktop,ROOT,MAX_DEPTH, desksize.g_x,desksize.g_y, desksize.g_w,desksize.g_h); wind_set(DESK,WF_NEWDESK,(long) desktop,0); /* Scrap-Pfad setzen */ scrp_read(scrp_path); if (scrp_path[0] == 0) { std_scrap[0] = 'A' + (char) boot_dev(); scrp_write(std_scrap); } /* hier kann die INF-Datei geladen werden! */ /* Der Pfad wird mit shel_find ermittelt. */ /* Men ausgeben */ menu_bar(menu,1); /* Maus als Pfeil */ graf_mouse(ARROW,0L); return(INIT_OK); } /******************************************************************************/ /* Abmeldung des Programms */ /* Aufgabe: Men abmelden, Desktop zurcksetzen, */ /* Resource-Speicher freigeben, Abmeldung beim AES */ /******************************************************************************/ static void exit_prg (int rc) { if (rc == INIT_OK) { /* Men abmelden */ menu_bar(menu,0); /* Leerer Default-Objektbaum */ wind_set(DESK,WF_NEWDESK,0L,0); /* Resource-Speicher freigeben */ rsrc_free(); } if ((rc == INIT_OK) || (rc == NO_RESOURCE)) /* abmelden */ appl_exit(); } /******************************************************************************/ /* Objekt ausgeben */ /* Aufgabe: Objekt unter Bercksichtigung der Rechteckliste ausgeben */ /******************************************************************************/ static void draw_objc (int handle, OBJECT *tree, int child) { int wi_gw1,wi_gw2,wi_gw3,wi_gw4; wind_update(BEG_UPDATE); /* Fenster wird erneuert */ /* Rechteckliste abarbeiten */ wind_get(handle,WF_FIRSTXYWH,&wi_gw1,&wi_gw2, &wi_gw3,&wi_gw4); /* erster Rechteck der Liste */ while (wi_gw3 && wi_gw4) { objc_draw(tree,child,MAX_DEPTH,wi_gw1, wi_gw2,wi_gw3,wi_gw4); /* Objekt ausgeben */ wind_get(handle,WF_NEXTXYWH,&wi_gw1, &wi_gw2,&wi_gw3,&wi_gw4); /* nchstes Rechteck */ } wind_update(END_UPDATE); /* Erneuerung beendet */ } /******************************************************************************/ /* Clipping */ /* Aufgabe: Clippt das Rechteck a unter Bercksichtigung von b */ /******************************************************************************/ static void clip (GRECT *a, GRECT *b) { a->g_x = max(a->g_x,b->g_x); /* linke obere Ecke */ a->g_y = max(a->g_y,b->g_y); a->g_w = min(a->g_x + a->g_w, b->g_x + b->g_w); /* rechte untere Ecke */ a->g_h = min(a->g_y + a->g_h, b->g_y + b->g_h); a->g_w -= a->g_x; /* Breite */ a->g_h -= a->g_y; /* Hhe */ } /******************************************************************************/ /* Object ausgeben */ /* Aufgabe: Object auch unter Bercksichtigung von HIDETREE ausgeben */ /******************************************************************************/ static void draw2_objc (int handle, OBJECT *tree, int child) { GRECT a, b; wind_update(BEG_UPDATE); /* Fenster erneuern */ /* Rechteckliste abarbeiten */ wind_get(handle,WF_FIRSTXYWH, &a.g_x,&a.g_y,&a.g_w,&a.g_h); /* erstes Rechteck der Liste */ while (a.g_w && a.g_h) { objc_offset(tree,child,&b.g_x,&b.g_y); /* Position des Objekts */ b.g_w = tree[child].ob_width; b.g_h = tree[child].ob_height; clip(&a,&b); /* Clipping */ objc_draw(tree,ROOT,MAX_DEPTH, a.g_x,a.g_y,a.g_w,a.g_h); /* Objekt ausgeben */ wind_get(handle,WF_NEXTXYWH, &a.g_x,&a.g_y,&a.g_w,&a.g_h); /* nchstes Rechteck */ } wind_update(END_UPDATE); /* Erneuerung beendet */ /* In dieser Funktion knnte auch form_dial(FMD_FINISH,...) Verwendung */ /* finden. */ } /******************************************************************************/ /* Objekt bewegen */ /* Aufgabe: Objekt verstecken, bewegen und wieder darstellen */ /******************************************************************************/ static void move_objc (int handle, OBJECT *tree, int child) { int x,y,ox,oy,nx,ny; /* Objekt verstecken */ tree[child].ob_flags |= HIDETREE; draw2_objc(handle,tree,child); /* Objekt child innerhalb des Objekts ROOT bewegen */ objc_offset(tree,ROOT,&x,&y); /* Offset berechnen */ objc_offset(tree,child,&ox,&oy); wind_update(BEG_UPDATE); /* Fenstererneuerung */ wind_update(BEG_MCTRL); /* Mauskontrolle */ graf_mouse(FLAT_HAND,0); /* Maus auf "flache Hand" */ graf_dragbox(tree[child].ob_width, tree[child].ob_height, /* bewegen */ ox, oy, x, y, tree[ROOT].ob_width, tree[ROOT].ob_height, &nx, &ny); graf_mouse(ARROW,0); /* Maus wieder Pfeil */ wind_update(END_MCTRL); /* keine Mauskontrolle */ wind_update(END_UPDATE); /* Erneuerung beendet */ tree[child].ob_x += nx - ox; /* Verschub addieren */ tree[child].ob_y += ny - oy; /* Objekt darstellen */ tree[child].ob_flags &= ~HIDETREE; draw_objc(handle,tree,child); } /******************************************************************************/ /* Information ausgeben */ /* Aufgabe: Dialogbox ausgeben */ /******************************************************************************/ static void do_info (void) { GRECT a, b; int ret; /* Position des Men-Titels berechnen */ objc_offset(menu,MNINFO,&b.g_x,&b.g_y); b.g_w = menu[MNINFO].ob_width; b.g_h = menu[MNINFO].ob_height; /* Vorbereitung */ wind_update(BEG_UPDATE); /* Fenstererneuerung */ form_center(infodial, &a.g_x,&a.g_y,&a.g_w,&a.g_h); /* Dialogbox zentrieren */ 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); /* Hintergrund reservieren */ form_dial(FMD_GROW, b.g_x,b.g_y,b.g_w,b.g_h, a.g_x,a.g_y,a.g_w,a.g_h); /* vergrsserndes Rechteck */ objc_draw(infodial,ROOT,MAX_DEPTH, a.g_x,a.g_y,a.g_w,a.g_h); /* Dialogbox ausgeben */ /* Durchfhrung */ ret=form_do(infodial,0); /* Dialog durchfhren */ infodial[ret].ob_state &= ~SELECTED; /* SELECTED zurcksetzen */ /* Nachbereitung */ form_dial(FMD_SHRINK, b.g_x,b.g_y,b.g_w,b.g_h, a.g_x,a.g_y,a.g_w,a.g_h); /* verkleinerndes Rechteck */ 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); /* Hintergrund freigeben */ wind_update(END_UPDATE); /* Erneuerung beendet */ /* Vorbereitung und Nachbereitung knnen auch in eigene Routinen */ /* ausgelagert werden. */ } /******************************************************************************/ /* Men-Handler */ /* Aufgabe: Auswertung des ausgewhlten Men-Eintrags */ /******************************************************************************/ static void hdle_menu (int title, int item) { /* Welches Drop-Down-Men? */ switch (title) { /* Info-Men? */ case MNINFO : /* Hier gibt es nur einen Eintrag */ if (item == ITINFO) do_info(); break; /* Datei-Men? */ case MNDATEI : /* Welcher Eintrag? */ switch (item) { /* Datei neu anlegen? (nicht laden!) */ case ITNEU : /* Eigene Routine... */ form_alert(1,(char*) laden); break; /* Datei ffnen? */ case ITOEFFNE : /* Eigene Routine... */ form_alert(1,(char*) laden); break; /* Datei sichern? */ case ITSICHER : /* Eigene Routine... */ form_alert(1,(char*) speichern); break; /* Datei unter neuem Namen sichern? */ case ITSICALS : /* Eigene Routine... */ form_alert(1,(char*) speichern); break; /* Ausgabe-Programm starten? */ case ITAUSGAB : /* Eigene Routine... */ form_alert(1,(char*) ausgabe); break; /* Programm-Ende? */ case ITENDE : finish = 1; break; } } menu_tnormal(menu,title,1); /* Invertierung aufheben */ } /******************************************************************************/ /* Maus-Handler */ /* Aufgabe: Auswertung des Mausklicks (linke Taste) */ /******************************************************************************/ static void hdle_mouse (int clicks, POINT *where) { int obj, dummy, but_state; /* Welches Object? */ obj = objc_find(desktop,ROOT,MAX_DEPTH,where->x,where->y); /* Doppelklick? */ if (clicks == 2) { /* Welches Objekt? */ switch (obj) { case BSPICON : /* invers darstellen */ if (!(SELECTED & desktop[obj].ob_state)) { desktop[obj].ob_state |= SELECTED; draw_objc(DESK,desktop,obj); } /* Hier knnen eigene Routinen */ /* aufgerufen werden... */ form_alert(1,(char*) aktion); /* normal darstellen */ desktop[obj].ob_state &= ~SELECTED; draw_objc(DESK,desktop,obj); /* Es knnte auch objc_change benutzt werden! */ break; /* Platz fr weitere Auwertungen und Icons... */ } } /* Einfachklick? */ else if (clicks == 1) { /* Status der Maustasten abfragen */ graf_mkstate(&dummy,&dummy,&but_state,&dummy); /* linke Maustaste festgehalten? */ if (but_state & 0x01) { /* Welches Object? */ switch (obj) { /* Objekt bewegen */ case BSPICON : move_objc(DESK,desktop,obj); break; /* Fr weitere Icons... */ } } /* einfach geklickt? */ else { /* Welches Object? */ switch (obj) { /* Objekt invertieren */ case BSPICON : if (!(SELECTED & desktop[obj].ob_state)) { desktop[obj].ob_state |= SELECTED; draw_objc(DESK,desktop,obj); } break; /* Platz fr weitere Aktionen... */ /* Invertierungen aufheben */ default : if (SELECTED & desktop[BSPICON].ob_state) { desktop[BSPICON].ob_state &= ~SELECTED; draw_objc(DESK,desktop,BSPICON); } break; } } } } /******************************************************************************/ /* Key-Handler */ /* Aufgabe: Auswertung des Tastendrucks */ /******************************************************************************/ static void hdle_key (int key, int special_key) { /* Control gedrckt? */ if (K_CTRL & special_key) { /* Welche Taste? */ switch(key >> 8) /* Scancode in den oberen 8 Bit */ { /* N gedrckt? */ case K_N : menu_tnormal(menu,MNDATEI,0); /* Titel invertieren */ /* Eigene Routine... */ form_alert(1,(char*) laden); menu_tnormal(menu,MNDATEI,1); /* Titel normal darstellen */ break; /* O gedrckt? */ case K_O : menu_tnormal(menu,MNDATEI,0); /* Titel invertieren */ /* Eigene Routine... */ form_alert(1,(char*) laden); menu_tnormal(menu,MNDATEI,1); /* Titel normal darstellen */ break; /* S gedrckt? */ case K_S : menu_tnormal(menu,MNDATEI,0); /* Titel invertieren */ /* Eigene Routine... */ form_alert(1,(char*) speichern); menu_tnormal(menu,MNDATEI,1); /* Titel normal darstellen */ break; /* A gedrckt? */ case K_A : menu_tnormal(menu,MNDATEI,0); /* Titel invertieren */ /* Eigene Routine... */ form_alert(1,(char*) speichern); menu_tnormal(menu,MNDATEI,1); /* Titel normal darstellen */ break; /* Q gedrckt? */ case K_Q : finish = 1; break; } } } /******************************************************************************/ /* Hauptprogramm */ /* Aufgabe: Initialisierung, Auswertung der Events, Abmeldung */ /******************************************************************************/ int main (void) { int events, /* fr Multi-Event */ mouse_button, /* " */ sp_key,key,clicks, /* " */ msg_buffer[8]; /* " */ POINT mouse_pos; /* " */ int ret_code; /* aus Initialisierung */ if ((ret_code = init_prg()) == INIT_OK) { while (!finish) { events=evnt_multi( /* Message-, Maustasten- und Tastatatur-Ereignis */ MU_MESAG|MU_BUTTON|MU_KEYBD, /* Doppelklick und linke Maustaste */ 0x02,0x01,0x01, /* Keine berwachung von Rechtecken */ 0,0,0,0,0,0,0,0,0,0, /* Message-Buffer */ msg_buffer, /* Kein Timer */ 0,0, /* Maus-Position und -Taste */ &mouse_pos.x,&mouse_pos.y,&mouse_button, /* Sondertaste und Taste */ &sp_key,&key, /* Anzahl der Mausklicks */ &clicks); /* Message-Event? */ if (events & MU_MESAG) { switch (msg_buffer[0]) { /* Men angeklickt? */ case MN_SELECTED : hdle_menu(msg_buffer[3],msg_buffer[4]); break; /* Platz fr weitere Message-Auswertungen... */ /* Z.B. fr Fenster: WM_REDRAW, WM_TOPPED, ... */ } } else { /* Maus-Button-Event? */ if (events & MU_BUTTON) hdle_mouse(clicks,&mouse_pos); /* Tastatur-Event? */ if (events & MU_KEYBD) hdle_key(key,sp_key); } } } else form_alert(1,no_init); /* Fehlermeldung */ exit_prg(ret_code); return(0); } /******************************************************************************/ /*************************/ /* Quelldatei: INTERNA.H */ /*************************/ # if !defined( __INTERNA ) # define __INTERNA int boot_dev(void); # endif /*********************************/ /* Quelldatei: SCANKEY.H */ /*********************************/ # if !defined( __SCANKEY ) # define __SCANKEY # define K_Q 16 # define K_O 24 # define K_A 30 # define K_S 31 # define K_N 49 /* Bei Bedarf knnen hier die */ /* weiteren Scancodes deklariert */ /* werden. */ # endif gemprog.prg = pcstart.o gemprog (gemprog.h, interna.h, scankey.h) ; Hauptmodul interna (interna.h) ; ST-interne Funktionen pcstdlib.lib pctoslib.lib pcgemlib.lib . &^ia.. ]iKR_SUBSTLST (]eb K_ZUFALLLST D]edOK_XOR LST \eeK_RSA S b]ef 5K_RSA LST ]et@CRYPTRSAASM gX{KRYPTRSAPRG /|BSCHLOSS S ^eSCHLOSS TOS ]K_TAUSCHLST \eK_ADD LST ]e' Verschlsseln durch Substitution und Addieren ' von Georg Scheibler, 4920 Lemgo ' (c) 1992 MAXON Computer GmbH DIM c%(256),d%(256) a$="dies ist ein test" TEXT 0,13,a$ z%=451 s1%=23 s2%=65 @crypt(z%,s1%,s2%,a$,*b$) TEXT 0,30,b$ @decrypt(z%,s1%,s2%,b$,*c$) TEXT 0,50,c$ PROCEDURE crypt(z%,key1%,key2%,s$,d%) LOCAL key_1%,key_2%,l%,d$ IF z%<>c%(256) @zufall(z%) ENDIF l%=LEN(s$) d$=s$ !damit nicht zuviel stringmll entsteht key_1%=0 key_2%=0 FOR i%=1 TO l% key_0%=c%(ASC(MID$(s$,i%,1))) key_1%=c%((key_1%+key1%+key_0%) AND &HFF) key_2%=c%((key_2%+key2%+key_1%) AND &HFF) MID$(d$,i%,1)=CHR$(key_2%) NEXT i% *d%=d$ RETURN PROCEDURE decrypt(z%,key1%,key2%,s$,d%) LOCAL key_1%,key_2%,h1%,h2%,l%,d$ IF z%<>c%(256) @zufall(z%) ENDIF l%=LEN(s$) d$=s$ !damit nicht zuviel stringmll entsteht h1%=0 h2%=0 FOR i%=1 TO l% key_2%=(ASC(MID$(s$,i%,1))) key_1%=(d%(key_2%)-h2%-key2%) AND &HFF key_0%=(d%(key_1%)-h1%-key1%) AND &HFF MID$(d$,i%,1)=CHR$(d%(key_0%)) h1%=key_1% h2%=key_2% NEXT i% *d%=d$ RETURN PROCEDURE zufall(x%) LOCAL h1%,h2%,xx% ' erzeugen einer "zuflligen" ' Verschlsselungstabelle ' mit Pseudozufallzahlen ' h1%=2^11 !maske fr bit 1 (+ obergrenze) h2%=2^2 !maske fr bit 2 x%=x% MOD h1% IF x%=0 INC x% ENDIF ARRAYFILL c%(),-1 c%(256)=x% !Schlssel merken cnt%=0 WHILE cnt%<256 !codiertabelle aufbauen xx%=x% AND &HFF IF c%(xx%)<0 !wert noch nicht dagewesen c%(xx%)=cnt% !codiertabelle d%(cnt%)=xx% !decodiertabelle INC cnt% ENDIF ADD x%,x% IF (x% AND h1%)<>0 XOR (x% AND h2%)<>0 INC x% ENDIF IF x%=>h1% SUB x%,h1% ENDIF WEND RETURN ' Funktionen zur Berechnung von Zufallszahlen ' mit n Bit, zweiter Abgriff bei Bit p ' Zhlung in gleiche Richtung wie Schieben ' mit Dezimation x ; x

0)) ;Prozedur zum Ver- und Entschlsseln eines Textes ;nach dem Verfahren von R. Rivest, A. Shamir und ;L. Adleman (RSA-Verfahren). ;von Georg Scheibler, Lemgo ;(c) 1992 MAXON Computer GmbH ;aufruf: ;verschlsseln: ;crypt(*quelle,lnge,*ziel,*RSA_N,*RSA_S,true.w) ;entschlsseln: ;crypt(*quelle,lnge,*ziel,*RSA_N,*RSA_T,false.w) ;mit *quelle: ptr. auf zu bearbeitenden Text ; lnge: lnge des zu bearbeiten Textes [L] ; *ziel: ptr. puffer f. bearbeiteten Text ; *RSA_N: ptr. auf Schlsselzahl N ; *RSA_S: ptr. auf Schlsselzahl S ; *RSA_T: ptr. auf Schlsselzahl T ; true: word<>0, Flag zum Verschlsseln ; false: word=0, Flag zum Entschlsseln ;die Schlsselzahlen N,S,T sind 16 Byte-Interger! ;Rckgabe: D0= Lnge des Textes in Zielpuffer ; Fehler wenn kleinr 0: ; -1 = 'N' kleiner als 256 ; -2 = exponent gleich 0 ('S' bzw. 'T') ;geschrieben mit dem 'DEVPAC'-Assembler ('GENST') ;Offsets relativ zu a6 ;die bergebenen Variablen source equ 8 laenge equ source+4 dest equ laenge+4 RSA_N equ dest+4 expo equ RSA_N+4 modus equ expo+4 ;die lokalen Variablen p1 equ -16 ;Teilergebnis [4L] len_p equ p1-2 x1 equ len_p-16 ;Zweierpotenz mod n len_x equ x1-2 len_n equ len_x-2 len_e equ len_n-2 ;gre Exponent (in word) len_s equ len_e-2 ;anzahl Byte holen len_d equ len_s-2 ;anzahl Byte speichern crypt: link a6,#len_d ;kleinste Zahl fr link movem.l d1-d7/a0-a5,-(a7) lea p1(a6),a2 lea x1(a6),a3 move.l RSA_N(a6),a1 move.l a1,a0 bsr getLEN move.w d0,len_n(a6) ble err_N ;RSA_N ist 0 subq.l #2,a0 crypt1: tst.b (a0)+ ;wieviel Byte auf einmal dbne d0,crypt1 ;codieren ? move.w d0,d1 subq.w #1,d1 ble err_N ;RSA_N ist zu klein tst.w modus(a6) bne.s crypt_d exg d1,d0 crypt_d:move.w d0,len_d(a6) move.w d1,len_s(a6) move.l expo(a6),a0 bsr getLEN asr.w #1,d0 ;anzahl word's ble.s err_exp ;Exponent ist 0 subq.w #1,d0 ;wegen dbf move.w d0,len_e(a6) move.l source(a6),a5 move.l dest(a6),a4 move.l laenge(a6),d4 cryptloop: movea.l a2,a0 ;p1 auf 1 moveq #0,d0 move.l d0,(a0)+ move.l d0,(a0)+ move.l d0,(a0)+ moveq #1,d0 move.l d0,(a0) moveq #2,d0 ;und lnge auf 2 move.w d0,len_p(a6) ;(=1 word) move.l a3,a0 ;x1 lschen moveq #0,d0 move.l d0,(a0)+ move.l d0,(a0)+ move.l d0,(a0)+ move.l d0,(a0)+ move.w len_s(a6),d0 ;highword ist 0! sub.l d0,a0 ;daher .l mglich sub.l d0,d4 ;verbleibende lnge bpl.s crypt3 ;fr nchsten Durchgang add.l d4,d0 ;nur noch den Rest bra.s crypt3 crypt2: move.b (a5)+,(a0)+ ;die nchsten crypt3: dbf d0,crypt2 ;Zeichen holen move.l a3,a0 ;(neues x1) bsr getLEN move.w d0,len_x(a6) bgt.s crypt6 ;Zahl ist 0 lea 16(a3),a0 ;dann nur kopieren bra.s crypt7 ;ergibt sowieso 0 crypt6: bsr.s ahbmodn lea 16(a2),a0 crypt7: move.w len_d(a6),d0 ;lnge Ergebnis suba.w d0,a0 bra.s crypt5 crypt4: move.b (a0)+,(a4)+ ;Ergebnis crypt5: dbf d0,crypt4 ;speichern tst.l d4 bgt cryptloop move.l a4,d0 ;lnge berechnen sub.l dest(a6),d0 bra.s crypt_E err_N: moveq #-1,d0 bra.s crypt_E err_exp:moveq #-2,d0 crypt_E:movem.l (a7)+,d1-d7/a0-a5 unlk a6 rts ;a6 wird vor dem Aufruf festgelegt !! ;nur zur optischen Trennung als Unterprogramm ahbmodn:move.w len_e(a6),d7 move.l expo(a6),a0 lea 16(a0),a0 ;ptr hinter Exponent ahbmnlp:move.w -(a0),d6 ;word vom Exponent moveq #15,d5 ;bitzhler f. Exponenten ahbmnli:lsr.w d6 ;nchste Potens testen bcc.s ahbmnli1 ;Ergebnis mit Zweipotenz multiplizieren(u. mod n) move.w len_x(a6),-(a7) ;p=(p*x) mod n move.l a3,-(a7) ;x move.w len_p(a6),-(a7) move.l a2,-(a7) ;p move.w len_n(a6),-(a7) move.l a1,-(a7) ;n move.l a2,-(a7) ;Ergebnis in p bsr abmodn lea 22(a7),a7 move.w d0,len_p(a6) ahbmnli1: tst.w d7 ;wird nchste bne.s ahbmnli2 ;Zweierpotenz tst.w d6 ;noch bentigt? beq.s ahbmn_E ahbmnli2: ;nchste Zweierpotenz bestimmen move.w len_x(a6),-(a7) ;x=(x*x) mod n move.l a3,-(a7) move.w len_n(a6),-(a7) move.l a1,-(a7) ;n move.l a3,-(a7) ;Ergebnis in x bsr ah2modn lea 16(a7),a7 move.w d0,len_x(a6) dbf d5,ahbmnli dbf d7,ahbmnlp ahbmn_E:rts ;offsets relativ zu a6 ptrRET: equ 8 ptrN: equ ptrRET+4 lenN: equ ptrN+4 ptrF1: equ lenN+2 lenF1: equ ptrF1+4 ptrF2: equ lenF1+2 lenF2: equ ptrF2+4 lenP8L: equ -2 P8L: equ lenP8L-32 ;[8L]-Puffer f. Produkt ah2modn:link a6,#P8L ;berechne a hoch 2 mod n movem.l d1-d7/a0-a5,-(a7) lea P8L(a6),a4 move.l ptrF1(a6),a1 move.w lenF1(a6),d0 movea.w #16,a3 ;max.Lnge-genutzte Lnge suba.w d0,a3 ; = 0-Bytes am Anfang movea.l a3,a2 ;aber immer grade !! adda.w a2,a2 ;Lnge * 4 (fr PC-rel. adda.w a2,a2 ;Verzweigung bentigt) add.w d0,d0 move.w d0,lenP8L(a6) ;Lnge Ergebnis fr movem.w (a1),d0-d7 ; MOD merken jmp ah2_mul(pc,a3.w) ah2_mul:mulu d0,d0 ;das Produkt mit sich mulu d1,d1 ;selbst nur einmal mulu d2,d2 mulu d3,d3 mulu d4,d4 mulu d5,d5 mulu d6,d6 mulu d7,d7 movem.l d0-d7,(a4) adda.w a3,a1 lea 18(a4,a3.w),a4 adda.w ah2_cor(pc,a3.w),a4 bra ah2_e ah2_cor:dc.w 0,2,0,2,0,2,0 ah2: movem.w (a1),d0-d7 jmp ah2mul2(pc,a3.w) ah2mul2:mulu d0,d7 ;zwei Byte pro Befehl mulu d0,d6 mulu d0,d5 mulu d0,d4 mulu d0,d3 mulu d0,d2 mulu d0,d1 move.l a4,a0 ;D0.L und X-Flag lschen (ohne Zugriff auf CCR) sub.l d0,d0 jmp ah2_W(pc,a2.w) ;ggf. mit NOP's auf 8 Byte auffllen ah2_W: move.w d6,d0 ;7 Reg. swap d0 addq.l #4,a4 bra.s ah2_w6 move.l d6,d7 ;6 Reg. swap d7 clr.w d7 bra.s ah2_w6 moveq #0,d6 ;5 Reg. addq.l #4,a4 bra.s ah2_w6 nop move.l d4,d5 ;4 Reg. swap d5 clr.w d5 bra.s ah2_w4 moveq #0,d4 ;3 Reg. addq.l #4,a4 bra.s ah2_w4 nop move.l d2,d3 ;2 Reg. swap d3 clr.w d3 bra.s ah2_w2 addq.l #4,a4 ;1 Reg. bra.s ah2_w1 ah2_w6: move.w d4,d6 swap d6 ah2_w4: move.w d2,d4 swap d4 ah2_w2: clr.w d2 swap d2 jmp ah2_a(pc,a3.w) ah2_a: add.l d0,d7 ;Teilergebnisse addieren nop addx.l d6,d5 nop addx.l d4,d3 addx.l d2,d1 ;kein bertrag mglich moveq #0,d0 ;daher nur d0 lschen jmp ah2_dup(pc,a3.w) ah2_dup:nop add.l d7,d7 nop addx.l d5,d5 nop addx.l d3,d3 ah2_w1: addx.l d1,d1 addx.w d0,d0 ;X-Flag speichern +lschen moveq #0,d2 jmp ah2_ad(pc,a3.w) ah2_ad: nop add.l d7,-(a0) addx.l d2,d5 add.l d5,-(a0) addx.l d2,d3 add.l d3,-(a0) addx.l d2,d1 add.l d1,-(a0) addx.w d2,d0 add.w d0,-(a0) bcc.s ah2_nx ah2_x: addq.w #1,-(a0) ;X-Flag so lange bcs.s ah2_x ;wie ntig add. ah2_nx: addq.l #2,a1 ;fr nchstes addq.w #8,a2 ;word vorbereiten addq.w #2,a3 ah2_e: cmpa.w #14,a3 bne ah2 bra modulo abmodn: link a6,#P8L ;berechne a*b mod n movem.l d1-d7/a0-a5,-(a7) move.l ptrF1(a6),a1 move.l ptrF2(a6),a2 moveq #0,d0 ;Ergebnispuffer lschen moveq #7,d1 lea P8L(a6),a4 ;[8L]-Puffer abMulC: move.l d0,(a4)+ dbf d1,abMulC ;a4 jetzt hinter move.w lenF1(a6),d0 ; Ergebnispuffer move.w lenF2(a6),d1 move.w d0,d2 add.w d1,d2 ;lnge Ergebnis move.w d2,lenP8L(a6) ;fr MOD merken cmp.w d0,d1 bhi.s abMulV exg d0,d1 ;ggf. Faktoren exg a1,a2 ;vertauschen abMulV: lea 16(a1),a1 ;hinter kleineren neg d1 ; Faktor lea abMul+16(pc,d1.w),a5 lsr.w #1,d0 movea.w d0,a3 ;Schleifenzhler ;greren Faktor in Reg. laden (word-weise) abMulL: movem.w (a2),d0-d6 move.w -(a1),d7 ;word von kleinen Faktor jmp (a5) ;nicht mehr Multiplika- abMul: mulu d7,d0 ;tionen als ntig mulu d7,d1 mulu d7,d2 mulu d7,d3 mulu d7,d4 mulu d7,d5 mulu d7,d6 mulu 14(a2),d7 ;noch mit LSW mult. add.w d7,-(a4) ;beachte: '.w' bcc.s abMulA addq.l #1,d6 ;[W]*[W] max. $FFFE0001 ! abMulA: move.w d5,d7 ;nidigeres Teilergebnis swap d7 ;anpassen an hheres move.w d3,d5 ;Teilergebnis swap d5 move.w d1,d3 swap d3 clr.w d1 swap d1 add.l d7,d6 ;Teilergebnisse addieren addx.l d5,d4 addx.l d3,d2 addx.l d1,d0 ;kein bertrag mglich move.l a4,a0 moveq #0,d7 add.l d6,-(a0) addx.l d7,d4 add.l d4,-(a0) addx.l d7,d2 add.l d2,-(a0) addx.l d7,d0 add.l d0,-(a0) ;kein bertrag mglich ! subq.w #1,a3 cmpa.w #0,a3 bne.s abMulL ;die modulo-division modulo: lea P8L(a6),a2 ;Ergebnis [8L] move.l ptrN(a6),a3 ;Divisor [4L] 'n' ;Lngenunterschied von 'Ergebnis' und 'n' in Byte move.w lenP8L(a6),d0 move.w lenN(a6),d1 sub.w d1,d0 ;Ergebnis kleiner bmi mod_low ;als n, fertig suba.w d0,a2 adda.w #16,a2 lsr.w #1,d0 movea.w d0,a4 neg.w d1 tst.w 16(a2,d1.w) ;MSW = 0, dann bne.s mod_0 ;ein word weniger cmpa.w #0,a4 ;Ergebnis < n ? bls.s mod_0 subq.w #1,a4 addq.l #2,a2 mod_0: move.w 16(a3,d1.w),d0 ;MSW vom Divisor cmp.w 16(a2,d1.w),d0 ;> MSW 'ergebnis'? bhi.s mod_d addq.w #1,a4 ;dann ein word mehr subq.l #2,a2 mod_d: movem.l (a3),d5-d7/a0 ;Divisor ;der folgende Befehle so nur mglich, wenn a,b0 !comandline auswerten @comand ELSE @dialog ENDIF ' PROCEDURE dialog CLS PRINT "Programm zum Codieren/ Decodieren nach" PRINT "dem RSA-Verfahren" PRINT "von Georg Scheibler, Lemgo" PRINT "(c) 1992 MAXON Computer GmbH" quelle$=CHR$(&H41+GEMDOS(25))+":"+DIR$(0)+"\" ziel$=quelle$ DO PRINT fehler!=FALSE PRINT "Quelldatei whlen" @select(quelle$) quelle$=n$ PRINT "Zieldatei whlen" @select(ziel$) ziel$=n$ IF anzahl_schluessel%>1 PRINT "Es sind ";anzahl_schluessel%; PRINT " Schlssel vorhanden" PRINT "Welcher soll verwendet werden ?" REPEAT INPUT "Bitte Nr. eingeben ",s% UNTIL s%>0 AND s%<=anzahl_schluessel% ELSE s%=1 ENDIF al$="Ver- oder Entschlsseln ?" ALERT 2,al$,1,"code|decode|abbruch|",code% IF code%=3 END ENDIF IF code%=1 PRINT "verschlsseln" ELSE PRINT "entschlsseln" ENDIF code%=2-code% !0=decode, 1=code @crypt(s%) LOOP RETURN PROCEDURE select(a$) p%=INSTR(a$,"\") IF p%>0 WHILE INSTR(a$,"\",p%+1) p%=INSTR(a$,"\",p%+1) WEND a$=LEFT$(a$,p%-1) ELSE a$=CHR$(&H41+GEMDOS(25))+":"+DIR$(0)+"\" ENDIF FILESELECT a$+"\*.*","",n$ IF n$="" OR RIGHT$(n$)="\" END ENDIF PRINT n$ RETURN PROCEDURE comand CLS fehler!=FALSE a$=SPACE$(128) BMOVE BASEPAGE+128,VARPTR(a$),128 a$=UPPER$(LEFT$(a$,INSTR(a$,CHR$(0))-1))+" " IF INSTR(a$,CHR$(13),2) a$=LEFT$(a$,INSTR(a$,CHR$(13),2)-1)+" " ENDIF ' zweites Zeichen 'C' oder 'D', dann mit lnge IF MID$(a$,2,1)="C" OR MID$(a$,2,1)="D" a$=MID$(a$,2) ENDIF IF LEFT$(a$,1)="C" PRINT "Codierung von" code%=1 ELSE IF LEFT$(a$,1)="D" PRINT "Decoodierung von" code%=0 ELSE PRINT "Befehl nicht erkannt" PAUSE 100 END ENDIF ENDIF s%=VAL(MID$(a$,2)) IF s%=0 AND anzahlschluessel%=1 s%=1 ENDIF p%=INSTR(a$," ")+1 quelle$=MID$(a$,p%,INSTR(a$," ",p%+1)-p%) p%=INSTR(a$," ",p%+1)+1 ziel$=MID$(a$,p%,INSTR(a$," ",p%+1)-p%) PRINT quelle$ PRINT "in die Datei" PRINT ziel$ @crypt(s%) IF fehler!=TRUE PAUSE 100 ENDIF RETURN PROCEDURE crypt(nr%) DEC nr% !da im array ab 0 gezhlt IF nr%<0 OR nr%=>anzahl_schluessel% PRINT "Nur ";anzahl_schluessel%; PRINT " Schlssel vorhanden" fehler!=TRUE ELSE IF schluessel%(3,2-code%,nr%)=0 PRINT "Schlsselzahl '";CHR$(&H54-code%); PRINT "' nicht vorhanden" fehler!=TRUE ENDIF ENDIF IF quelle$<"0" OR ziel$<"0" PRINT "Dateinamen fehlen" fehler!=TRUE ENDIF IF fehler!=FALSE @crypt1 ENDIF RETURN PROCEDURE crypt1 ARRAYFILL quelle%(),0 q%=VARPTR(quelle%(0)) z%=VARPTR(ziel%(0)) n%=VARPTR(schluessel%(0,0,nr%)) st%=VARPTR(schluessel%(0,2-code%,nr%)) OPEN "i",#1,quelle$ laenge%=LOF(#1) BGET #1,q%,laenge% CLOSE #1 IF code%=1 POKE q%+laenge%,255 !endekennung INC laenge% ENDIF r%=C:asm%(L:q%,L:laenge%,L:z%,L:n%,L:st%,code%) IF r%>0 IF code%=0 !ende suchen cnt%=0 WHILE PEEK(z%+r%)<>255 AND cnt%<16 DEC r% INC cnt% WEND IF cnt%=16 PRINT "Fehler beim decodieren" PRINT "eventuell falscher Schlssel" fehler!=TRUE ENDIF ENDIF IF fehler!=FALSE OPEN "o",#2,ziel$ BPUT #2,z%,r% CLOSE #2 ENDIF ELSE fehler!=TRUE PRINT "Fehlermeldung: ";r% IF r%=-1 PRINT "Schlssel 'N' falsch" ELSE IF code%=1 PRINT "Schlssel 'S' falsch" ELSE PRINT "Schlssel 'T' falsch" ENDIF ENDIF PAUSE 100 ENDIF RETURN PROCEDURE hole_asm OPEN "i",#1,"cryptrsa.asm" SEEK #1,28 !hinter dateiheader BGET #1,asm%,LOF(#1)-28 CLOSE #1 RETURN PROCEDURE lese_schluessel anzahl_schluessel%=0 DO READ a$ EXIT IF a$="" @s_to_i(0,anzahl_schluessel%,a$) READ a$ @s_to_i(1,anzahl_schluessel%,a$) READ a$ @s_to_i(2,anzahl_schluessel%,a$) IF schluessel%(0,0,anzahl_schluessel%)<0 PRINT "N bei Schlssel "; PRINT anzahl_schluessel%+1;" zu gro" PAUSE 100 END ELSE INC anzahl_schluessel% ENDIF LOOP RETURN PROCEDURE s_to_i(i2%,i3%,s$) LOCAL j%,p%,n% j%=INSTR(s$,".") WHILE j%>0 !Punkte entfernen s$=LEFT$(s$,j%-1)+MID$(s$,j%+1) j%=INSTR(s$,".") WEND n%=VAL?(s$) !anzahl ziffern p%=n% MOD 4 IF p%=0 p%=4 ENDIF ARRAYFILL h%(),0 h%(7)=VAL(LEFT$(s$,p%)) INC p% WHILE p%0 MUL h%(j%),10000 ENDIF IF h%(j%+1)<>&H10000 ADD h%(j%),h%(j%+1) DIV &H10000 h%(j%+1)=h%(j%+1) AND &HFFFF ENDIF NEXT j% ADD p%,4 WEND p%=VARPTR(schluessel%(0,i2%,i3%)) FOR j%=0 TO 7 DPOKE p%,h%(j%) ADD p%,2 NEXT j% RETURN ' DATA 3.979.429,2153, 0 DATA 3.979.429, 0,7385 ' DATA 22.250.201.032.324.000.568.863.501 DATA 1.347.459.357.773, 99.076.239.608.837 ' DATA 888888.888888.888949.666666.666666.666841 DATA 1.203.761.548.945 DATA 5.168.982.368.373.120.933.359.341 ' DATA 26.944060.708143.888142.656931.565062.692631 DATA 17.279.831.943.378.331.759,0 ' hier dekodierschlssel geheim DATA "" `NVHEG"n Iaf=@oUJV2SAoJnf@=@=A na6@o~S@=@*n(n(. Jp p p=@ Kp 0.֑jЄ`Q Ka=@nA`a.A0.Ԑ`QJn `p`pL?N^Nu>. nA< zNd ?./ ?./ ?./ / aJO=@JGfJFg"?./ ?./ / aO=@QQNuNVHI"n0.6|$K@=@LNHI`LN LN0H@X`,.HGBG`$|X`Nq*HEBE`xX`Nq&HCBC` X`.<HF8HDBBHBNހNqۆNqׄӂpNNqއNqۅNq׃Ӂ@NNqߠۂׂ۠נӂӠB`dR`eTPJTKfB`NVH"n$nprI(Q0.2.4A=B@bAICDAKH6@L>!NddR>HG:HE6HCBAHA܇مՃс L~ݠه٠ՇՠчѠSKfE&n 0.2.AkpH8@DAJrf cSLT03rbRLULL:|`.82|D׃ՂӁрf ffeSIjSLj`AL nHaL?N^NupJXV@Nu`?L;hAONazJgN:`Naa(E@$p&a'.E@Jpa'"E@[p&a'?<NATrAЁa+p:a!T/pa.6"_a ,p\a!@C a$A C&a$a&QdE@pa&Hm N6A,C a$E@pa&Hm&N6A,C&a$p x$mؒ ml 0Hg\x$mؒ ml 0HJjr$m( mlAHѐx$mؒ ml 0Hx$mؒ ml!H$mS$m lJ$mX$m $mnB$m/$m/Af~a $m$$mB$m( ml 0H$m R0$mT$mR$m _o`#a DExa`bDEa`ZaR11!Nua11!Nu 24&8:DE`6 24&8:DB`&a\&8:DE`DEx`aH` 24&8:HnghDBHngXDE~<En g6@ABDFGcGcGb8(vHDl`G8BCHC` GHD8HD쬵k&Dуd QRB BbJjDBNu DENupN֓DjdDA@ cAр[SBoJjDBNurptNuH@g0J`Ѐ[rGoJjDBNu0ftNu@[rB oH@JjDBNu $HkBk Bj*DBNupNuDBBkBjDBDNuf gp`a 00Nur$o, b4< J@k @[H@NuH@RBNu4<Ѐ[NuDg8k2 b4< J@k @[H@DBNuH@RBDBNu4<Ѐ[DBNu40rHGGdHGGdSWDуdi?<>0rHGGdHGGdSWDуdi2?<>0rHGGdHGGdSWDуd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNuCEdSW`?<,>CEdGeH@0r`fJCgz?<0rÐdSWЃdi?<0rÐdSWЃdid?<0ÐdSWЃd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNu?<0riP?0i?`?<`BJapEBCgPB`LJg&B.C`a8aD*9Cfap-I,=|p4aHz*9Cg ENp9B`h _a &nO:NMCI KBL$<Nu[1][Error +111][Return]EBJ g g>Jf`Ar Hjr-D@Hd0H@H 0H@0CNuAF"H [1][fSEfNu`\HQ?< NA\Nu@&gTkdHöfiH@HNugmNupNuz&lDaDNuJlDxeփ؄d`efNupN"_KBLMCI O: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>pCR2Ad0A2r22aZ"<v0<NBLNurt=@:=A@=B NuHz(` NHHz ?<&NN\Nu9}gNuW}Nu|^|  R^,T:&0D4(*<B$,>2::(   F..26"8@"PQ1!P1P!0PP`0  q#aaa a O: n*NNuNuNupc?a0QNurdAd6Ag,B(dB(dH Ao<a toBAp`^NuNu?<OA`d?<IA`Z0<H Ia`Lt Ig Og Ug Ag Rg,afNup`a2p`0a fHRa>Er$Wgr STD:gr COM:g r LPT:f4FA$_0=@Dk"~CA0< BhaB2"pNu$_AF Ge><QBAFpNuafgzp=` aZgzpaTaRFBd&8*L?a<aSF Be BgQRB`RAdR e <rRF&0xaCձfEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`HQ2.d Aeg>r C 5e&!R 0c 9c0`<R"_`VC0 Ef"_Nuaa/ CFr  g 00VJAgB @ nN @mHJ@j0.4DBUBk0QSAg Q.`S@k 0`0BAF "_Nu.WAkQA 0g`prt|P;Q:  g +g -f .g40  b 0e 9b da6`RF` .f 0e 9b daSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`ZJjDDDS4<.aJFkSFk4arQax`&HaFFaZQ&8*L/a,H܆jDBJ.:gtBn:Nu(:HE:a`4JVHHarЁЀ`z@`z8H@0`z(a^*d2d2d"d""d""""d"`""""""""""""""""QjNup"X2g6C/ !UAk$!Q"_Nu @$@JfS a `QNu$Aa v`QBNuHza`Hza XH `HPHQ0(ika J $I _a 2IUd4Id4Id$Id `$$$$Q _Jf,a Id4Id4Id$Id `$$$$Q @NuSa IdIdId`Q @Nup `/ a $I> _a G` VNuag`af`ae `ac` acpNuadpNu/ a X$I> _a N4Ae4v` VfANuHP0(R@kBa 4 $I _a IUd4Id4Id$Id `$$$$Q @JfNuNup `@a SAfNuag`af`ae `ac` acpNuadpNua SAkfJANuH HPhkJa $I _a IUd4Id4Id$Id `$$$$Q @JgSL`QNup `a >Af` VNuag`af`ae `ac` acpNuadpNua 4@m4v` Vf@NuBp'rta n2rt6(SC0(S@apaB\papava0pa _a4$FAFp_@[000][vx`* [g" ]g |g QSx` xQSrQ][vx`* [g" ]g |g QSx` xQStQ]BAF0-H,=@p4a2HNu <}a$Ia `$XaH`aHR?<NNT @"_ <}Nu 24JBoRBk NugSBk` 24JBoCkNugCk`aX`QNuHg"cc/ 0)a6 _$PS@kH2QNu2(g$PRAA4DBH%$Y2Pg 1AHRAA%NuBhNuao aШNupNuaJFoHPJhja?<?B?<BNAO _*kBg?/(?<BNAO Jk NuNafoazJBkAf`a|??/?<BNA.k \Hx?<BNAO [HHNux`x*0ao< 2fJjr`Nu~dGdEH<Nup`0@F@AJhg PLNu`LJg(HPBHh/??<@NAXLf ѨLNuJkp%`FaJBja!| ??<>NAXOJkpNu0< aH`0< CF2p`Tp a2`p CFp`@a CF"p`2Hza`Hy'"J`B.@=|DNua.@FpAR@C` @H` @HHy'aa"H`Hy'`Hy' 24`@H` @HHy'aa"Hav`Hy'`Hy' 24`B.@=|DNuB.@a`=GDgNup` a`a0CF"E p`.D<jRGg>VGg:TGjp`HPa0CF$IpR@  f _aHd2Hd2`"QNu`<.DHSGFaAEg f< &_Nua`ۈNu.dfa$B0=n`r>.D<jRGg.D<jRGg*VGgTGjp`ު<.Da*`" y0 faa0` y0 f aaAF "g pR@0 ,g  g  fHp`:pR@0  g  g "fR@0 ,g  g  fHpRU@"_  f#0$H _al`QNupR@0 ,g"  g  fa~ (fR~Nua ~ `a~NuaJkHQ ! gRf _NuXX~Nu0j\@??<NMXJk .dgp Nu`z<.DHSGFa ,g gAEf< &_Nu ."Ff +"g ,g`?<`Bg/0ano< 2JjJAfr`TNuH0aL`H0aL`z2(gbc  P"H`Nu/0Hax2  _ PSAvjx E(Wf* ae zb Q @NuBnp`pBnp`p=| p|=Fn@=@b=n`radHj=Ah~`:a JfBH@ RfF.f Kg" Mg sg tg Pg Hf~`xSGjtRGFcn>`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?Hya~NM\Nu=|D`LjazEfpadppa`AFEg0PaEfaFRE`ܾEfp a@a8?nnnp a2RF`<axnnoS@f nhfSnl=Ah=FnNup` papq4.rf?HyaNM\Nu=|DHaLNu|A0"P2(@e2<EF`QHP=|DJ@g$abAF$HpR@ 0 f _a"`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<0HNua``]@><CF Ipa Nu?|`?a>0R@f|0aHJFkHPa _Nupo`HSHP&I>g\SG??<NMXJk Q _t&_Nu&_`ԤaBJANuag `af`apNuapNuC`C``C` C`C-KJhfJfRRRRRRRHP? @CFH~8:E#P&<2 `b$bYEf`"RAf rЁЀ`&Ѐe "ЀeЁdp`JAkfgRer?DDЁaAa8$HX :CFE` YEjT"_$P"2trDDd0d d d` QjNu`TaDa 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 n@$d$HJf-HS Nup"`HPa _aR`QNua JH aL0Nua` .*Nu3.979.4292153 03.979.429 0738522.250.201.032.324.000.568.863.5011.347.459.357.773 99.076.239.608.837888888.888888.888949.666666.666666.6668411.203.761.548.9455.168.982.368.373.120.933.359.34126.944060.708143.888142.656931.565062.69263117.279.831.943.378.331.7590Programm zum Codieren/ Decodieren nachdem RSA-Verfahrenvon Georg Scheibler, (c) 1992 MAXON Quelldatei whlenZieldatei whlenEs sind Schlssel vorhandenWelcher soll verwendet werden ?Bitte Nr. eingeben Ver- oder Entschlsseln ?code|decode|abbruch|verschlsselnentschlsseln Codierung vonDecoodierung vonBefehl nicht erkanntin die DateiSchlsselzahl '' nicht vorhandenDateinamen fehlenFehler beim decodiereneventuell falscher SchlsselFehlermeldung: Schlssel 'N' falschSchlssel 'S' falschSchlssel 'T' falschcryptrsa.asmN bei Schlssel zu gro8 d R >0fBb&b4*. BX" * f((@4L~B 8~| ;Programm zum Berechnen von Schlsselzahlen fr ;das Codierverfahren von R. Rivest, A. Shamir und ;L. Adleman (RSA-Verfahren). ;von Georg Scheibler, Lemgo ;(c) 1992 MAXON Computer GmbH len_mb equ 1000 ;Gre des Textpuffers beginn: move.l 4(a7),a0 ;basepage move.l $18(a0),d0 ;anfang bss add.l $1c(a0),d0 ;+lnge bss add.l #1000,d0 ;+stack bclr #0,d0 ;=ende Bereich move.l d0,a7 ;neuer Stack sub.l a0,d0 ;Gesamtlnge move.l d0,-(a7) ;mschrink move.l a0,-(a7) clr.w -(a7) move.w #74,-(a7) trap #1 lea 12(a7),a7 moveq #-1,d0 ;freien Speicher move.l d0,-(a7) ;erfragen move.w #72,-(a7) ;malloc trap #1 addq.l #6,a7 prod1g equ 2*3*5*7*11*13*17 ;Array 1 gro fakt1g equ 17 ;grter Faktor 1 prod2g equ 2*19*23*29*31 ;Array 2 gro fakt2g equ 31 ;grter Faktor 2 prod2m equ 2*19*23*29 ;Array 2 mittel fakt2m equ 29 ;grter Faktor 2 prod1k equ 2*3*5*7*11*13 ;kleine Array's fakt1k equ 13 ;(bentigen nur prod2k equ 2*17*19*23 ;~30 KB) fakt2k equ 23 ;aber langsamer sub.l #100,d0 ;fr "berhang" move.l #prod1g,d1 ;wie gro drfen cmp.l d1,d0 ;die beiden bcs.s init1 ;Array's werden? move.w #fakt1g,siebMAX1 move.l #prod2g,d2 cmp.l d2,d0 bcs.s init2 move.l d2,d3 move.w #fakt2g,siebMAX2 bra.s init3 init2: move.w #fakt2m,siebMAX2 move.l #prod2m,d2 move.l d1,d3 bra.s init3 init1: move.l #prod1k,d1 ;nur kleine move.w #fakt1k,siebMAX1 ;Array's move.l #prod2k,d2 move.w #fakt2k,siebMAX2 move.l d1,d3 init3: move.l d1,siebKGV1 move.l d2,siebKGV2 add.l #100,d3 ;+ "berhang" move.l d3,-(a7) ;Speicher fr move.w #72,-(a7) ;Tabellen trap #1 ;resevieren addq.l #6,a7 move.l d0,siebBEG ;Beginn merken bmi exit ;bei Fehler Ende lea info,a0 bsr print bsr sieb_des main: moveq #0,d1 move.l #$D0A0000,membuf ;cr lf an Anfang clr.w F_entry clr.w cntFak clr.w zahl_a moveq #'1',d0 ;erste Primzahl bsr input ;einlesen ori.b #1,d1 ;nur ungrade movem.l d0-d1,RSA_P ;Primzahlen tst.w d7 bmi exit bne.s main2 lea inp_p+2,a0 cmpi.b #'L',(a0) beq.s load cmpi.b #'l',(a0) bne.s main2 load: bsr laden bsr gettime add.l d0,time ;Zeit merken move.w F_entry,d0 lsl.w #2,d0 lea entry,a0 move.l 0(a0,d0.w),a0 jmp (a0) main2: moveq #'2',d0 ;zweite Primzahl bsr input ;einlesen ori.b #1,d1 movem.l d0-d1,RSA_Q tst.w d7 bmi exit beq.s main2 bsr gettime move.l d0,time ;Zeit merken clr.l divisor addq.w #1,F_entry entry1: pea RSA_P bsr prim addq.l #4,a7 tst.l d0 ;abbruch beim berechnen bmi main ;der Primzahl ? lea text_p,a1 ;nein, dann weiter lea RSA_P,a0 ;Primzahl ausgeben moveq #8,d0 bsr pr_zahl clr.l divisor addq.w #1,F_entry entry2: pea RSA_Q bsr prim addq.l #4,a7 tst.l d0 ;abbruch (s.o.) bmi main lea text_q,a1 lea RSA_Q,a0 moveq #8,d0 bsr pr_zahl addq.w #1,F_entry pea RSA_N ;N berechnen pea RSA_P pea RSA_Q bsr mul64 lea 12(a7),a7 movem.l RSA_P,d0-d1 ;Zahl ungrade subq.l #1,d1 ;-> kein bertrag movem.l d0-d1,temp1 ;RSA_P-1 movem.l RSA_Q,d0-d1 subq.l #1,d1 movem.l d0-d1,temp2 ;RSA_Q-1 pea RSA_F ;F berechnen pea temp1 pea temp2 bsr mul64 lea 12(a7),a7 moveq #16,d0 ;N merken lea RSA_N,a2 ;(fr bersicht) lea text_n1,a1 lea ausgabe,a0 bsr makeStr bsr.s merken entry3: lea RSA_N,a0 ;N ausgeben lea text_n,a1 moveq #16,d0 bsr pr_zahl ;(mit Zeit) ;mgliche Zahlen f. 'S' u. 'T' ermitteln bsr Primfaktoren lea membuf,a0 ;bersicht ausgeben bsr print bra main exit: clr.w -(a7) ;Programm beenden move.w #76,-(a7) trap #1 merken: lea membuf,a0 ;String im move.w #len_mb,d0 ;Ausgabepuffer merken1:tst.b (a0)+ ;an String in dbeq d0,merken1 ;membuf anhngen tst.w d0 bmi.s merken_E ;sofern Platz subq.l #1,a0 lea ausgabe,a1 merken2:move.b (a1)+,(a0)+ dbeq d0,merken2 move.b #13,-1(a0) ;cr lf anhngen move.b #10,(a0)+ clr.b (a0) merken_E:rts ;Zahl und ersten Divisor ausgeben pr_info:move.l d3,-(a7) pea ausgabe ;letzte Versuchszahl move.w #8,-(a7) move.l a6,-(a7) bsr ItoS lea 10(a7),a7 move.b #' ',(a0)+ move.l a0,-(a7) move.w #4,-(a7) pea 6(a7) ;und Divisor bsr ItoS lea 10(a7),a7 move.l (a7)+,d3 movem.l d0-a6,-(a7) movea.l a0,a5 bsr.s pr_Zeit movem.l (a7)+,d0-a6 rts ;eine Zahl mit Text und Zeit ausgeben pr_zahl:lea ausgabe,a2 pr_z_cp:move.b (a1)+,(a2)+ ;Text kopieren bne.s pr_z_cp subq.l #1,a2 move.l a2,-(a7) move.w d0,-(a7) move.l a0,-(a7) bsr ItoS lea 10(a7),a7 move.l a0,a5 moveq #-1,d0 ;abfrage Ton move.l d0,-(a7) ;noch im gang ? move.w #32,-(a7) trap #14 addq.l #6,a7 tst.l d0 bne.s nogong pea gong ;akustisches Signal move.w #32,-(a7) ;ausgeben trap #14 addq.l #6,a7 nogong: move.l a5,d0 sub.l #ausgabe,d0 cmpi.w #56,d0 bls.s pr_Zeit ;bei langem Text move.b #13,(a5)+ ;Zeit in neue move.b #10,(a5)+ ;Zeile pr_Zeit:bsr gettime sub.l time,d0 move.l d0,d1 move.l #60*60*200,d3 ;Stundenfaktor moveq #60,d7 ;divisor fr divisor bsr.s zeit0 move.b #',',(a5)+ ;Komma anfgen asr.w #1,d1 ;1/100stel bsr.s zeit3 move.w #44,-(a7) ;Tgettime trap #1 addq.l #2,a7 moveq #0,d1 move.w d0,d1 add.l d1,d1 ;da sek. in 2erschritten move.l #64*64,d3 moveq #64,d7 bsr.s zeit0 clr.b (a5) lea ausgabe,a0 bsr print bsr pr_ret rts zeit0: move.b #' ',(a5)+ move.b #' ',(a5)+ moveq #0,d0 moveq #0,d2 bsr.s zeit2 bsr.s zeit1 nop zeit1: move.b #':',(a5)+ divu d7,d3 andi.l #$ffff,d3 zeit2: bsr Rdivi cmp.w #100,d1 bcs.s zeit3 divu #100,d1 ;nur f. Gesamtzeit ori.b #0,(a5)+ ;ber 100 std. clr.w d1 swap d1 zeit3: divu #10,d1 ori.l #'0000',d1 move.b d1,(a5)+ swap d1 move.b d1,(a5)+ move.l d5,d1 rts inkey: movem.l d1-d3/a0-a3,-(a7) ;zeichen holen, move.w #$ff,-(a7) ;sofern vorhanden move.w #6,-(a7) ;(in d0) trap #1 ;sonst 0 addq.l #4,a7 movem.l (a7)+,d1-d3/a0-a3 rts gettime:pea gettime1 ;200Hz-Int-Zhler move.w #38,-(a7) ;im Supermodus trap #14 addq.l #6,a7 rts gettime1:move.l $4ba,d0 ;auslesen rts inputS: clr.l inp_p ;String mit max. move.b d0,inp_p ;d0 Zeichen holen bsr print ;*Infostr in a0 inputS1:bsr.s inkey ;Tastaturpuffer leeren tst.w d0 bne.s inputS1 bsr.s cursON pea inp_p move.w #10,-(a7) ;String einlesen trap #1 addq.l #6,a7 bsr.s cursOFF bsr.s pr_ret rts cursON: move.l #$10000,-(a7) ;curser an bra.s curs cursOFF:clr.l -(a7) ;curser aus curs: move.w #21,-(a7) trap #14 addq.l #6,a7 rts input: lea t_inpZ,a0 ;Zahl einlesen lea ausgabe,a1 input1: move.b (a0)+,d1 ;Zeichen in D0 cmpi.b #'#',d1 ;bei '#' bne.s input2 ;einfgen move.b d0,d1 input2: move.b d1,(a1)+ bne.s input1 lea ausgabe,a0 moveq #19,d0 ;19 Zeichen bsr.s inputS ;einlesen lea inp_p+1,a0 move.b (a0)+,d0 ;Anzahl Zeichen beq.s empty ext.w d0 clr.b 0(a0,d0.w) ;0 ans Ende pea inp_p+2 bsr StoI ;String in 64 Bit addq.l #4,a7 ;Integer in d0,d1 rts ;d7=Anzahl Ziffern empty: moveq #-1,d7 ;kein Zeichen rts pr_ret: lea crlf,a0 ;return ausgeben bsr print rts ;Multiplikation zweier 64BIT-Zahlen ([2L]), ;Ergebnis 128BIT ([4L]) mul64: link a6,#0 movem.l d0-d6/a0-a2,-(a7) ;reg. retten movem.l 8(a6),a0-a2 ;ptr. holen moveq #3,d0 mul64c: clr.l (a2)+ ;Ergebnis lschen dbf d0,mul64c moveq #3,d6 ;4 word's moveq #0,d5 addq.l #8,a1 ;ptr. hinter Faktor 2 mul64m: movem.w (a0),d1-d4 ;Faktor 1 move.w -(a1),d0 mulu d0,d1 mulu d0,d2 mulu d0,d3 mulu d0,d4 add.w d4,-(a2) ;LSW add. addx.l d5,d3 move.w d2,d4 swap d4 clr.w d2 swap d2 add.l d4,d3 addx.l d2,d1 add.l d3,-4(a2) addx.l d5,d1 add.l d1,-8(a2) dbf d6,mul64m movem.l (a7)+,d0-d6/a0-a2 unlk a6 rts sieb_des:move.l siebBEG,a0 ;Siebarry's aufbauen ;Sieb 1 mit 3 vorbesetzen, Sieb 2 lschen move.l siebKGV1,d1 cmp.l siebKGV2,d1 ;max(KGV1,KGV2) bhi.s s_d move.l siebKGV2,d1 s_d: move.w siebMAX2,d0 ext.l d0 add.w d0,d0 add.l d0,d1 moveq #0,d0 ;anzahl Schleifen moveq #0,d2 ;ermitteln moveq #6,d3 bsr Rdivi move.l #$000000ff,d0 moveq #0,d2 move.l d2,(a0)+ move.w d2,(a0)+ s_d0: move.l d0,(a0)+ move.w d2,(a0)+ dbf d1,s_d0 sub.l #$10000,d1 bpl.s s_d0 move.l siebBEG,a0 ;anfang array's move.w siebMAX1,d3 add.w d3,d3 ;berhang ext.l d3 add.l siebKGV1,d3 add.l a0,d3 ;ende moveq #5,d0 ;erster Faktor move.w siebMAX1,d4 ;letzter Faktor1 move.l a0,a1 ;anfang bsr.s sieb2 ;sieb 1 setzen move.w siebMAX2,d3 add.w d3,d3 ;berhang ext.l d3 add.l siebKGV2,d3 add.l a0,d3 ;ende2 addq.l #1,a1 ;anfang2 move.w siebMAX2,d4 ;letzer Faktor2 bsr.s sieb1 ;sieb 2 setzen move.w siebMAX1,d0 ;Sieb 1 in ext.l d0 ;Abstandstabelle add.l siebKGV1,d0 ;umwandeln move.l siebBEG,a0 ori.b #1,d0 bra.s s_d4 s_d1: addq.l #2,d0 s_d4: tst.b 0(a0,d0.l) beq.s s_d1 adda.l d0,a0 lsr.l #1,d0 ;da in 2er-schritte moveq #0,d1 ;halb soviel schleifen s_d2: addq.b #2,d1 tst.b (a0) bne.s s_d3 moveq #0,d1 s_d3: move.b d1,(a0) subq.l #2,a0 dbf d0,s_d2 sub.l #$10000,d0 bpl.s s_d2 rts sieb1: addq.l #2,d0 ;nchste ungrade tst.b 0(a0,d0.l) ;Primzahl suchen bne.s sieb1 sieb2: bsr.s s1 cmp.w d4,d0 ;bis max. bne.s sieb1 rts s1: lea 0(a1,d0),a2 ;zahl >2 sieben move.l d0,d2 add.l d2,d2 ;da grer zwei bra.s s3 ;abstand * 2 s2: st (a2) ;(grade Zahlen s3: adda.l d2,a2 ;nicht lschen) cmpa.l d3,a2 bcs.s s2 rts ;unterprogramm zum Umwandeln einer beliebig ;langen Integerzahl von Binr nach Ascii ;mit 1000-er Punkte zur besseren Lesbarkeit ;aufruf: ItoS(*zahl,lnge.w,*string) ;rckgabe: a0 = Ptr auf 0-Byte hinter String ItoS: link a6,#-40 ;max. lnge Integer movem.l d0-d2/a1,-(a7) move.l a6,a0 move.l 8(a6),a1 ;beginn der Zahl move.w 12(a6),d0 ;lnge in Byte adda.w d0,a1 ;ende der Zahl subq.w #1,d0 ;fr dbf ItoS_c: move.b -(a1),-(a0) ;Zahl kopieren dbf d0,ItoS_c move.w 12(a6),d0 lsr.w d0 bcc.s ItoSodd clr.b -(a0) ;anfang auf wordgrenze addq.w #1,d0 ItoSodd:move.w #-1,-(a7) ;abschlu subq.w #1,d0 bra.s ItoS_L ItoS_0: addq.l #2,a0 ;fhrende 0-word weglassen ItoS_L: tst.w (a0) dbne d0,ItoS_0 move.w d0,d2 bmi.s ItoS_LE ;fertig moveq #0,d1 movea.l a0,a1 ItoS_Li:move.w (a1),d1 ;berechne divu #1000,d1 ;zahl= move.w d1,(a1)+ ;zahl / 1000 dbf d2,ItoS_Li swap d1 move.w d1,-(a7) ;rest auf stack bra.s ItoS_L ItoS_LE:movea.l 14(a6),a0 ;ziel fr ascii moveq #0,d0 move.w (a7)+,d0 ;die 'Reste' bpl.s ItoS_A ;nach ASCII move.b #'0',(a0)+ ;umwandeln bra.s ItoS_F ;sonderbehandlung ItoS_A: cmpi.w #99,d0 ;fr MSW bhi.s ItoS_A1 ;um fhrende cmp.w #9,d0 ;Nullen zu bhi.s ItoS_A2 ;vermeiden ori.b #'0',d0 move.b d0,(a0)+ bra.s ItoS_A3 ItoS_A1:divu #100,d0 ori.b #'0',d0 move.b d0,(a0)+ clr.w d0 swap d0 ItoS_A2:divu #10,d0 ori.l #'0000',d0 move.b d0,(a0)+ swap d0 move.b d0,(a0)+ ItoS_A3:move.b #'.',(a0)+ ;tausender Punkt moveq #0,d0 move.w (a7)+,d0 ;nchstes Word bpl.s ItoS_A1 subq.l #1,a0 ;letzten Punkt lschen ItoS_F: clr.b (a0) movem.l (a7)+,d0-d2/a1 unlk a6 rts StoI: ;Funktion zum umwandeln eines String ;in eine 64-Bit Integerzahl (unsigned) ;a0 auf anfang String ;d0/d1 rckgabe des Ergebnis ;d7 anzahl ziffern oder -1 fr berlauf move.l 4(a7),a0 moveq #0,d0 ;Register auf 0 setzen moveq #0,d1 moveq #0,d7 ;Zhler fr Anzahl Ziffern StoI1: moveq #0,d4 move.b (a0)+,d4 beq.s StoI_E ;Ende des Strings subi.b #'0',d4 ;Ziffer ASCII --> Integer cmpi.b #9,d4 ;ist es eine Ziffer ? bhi.s StoI_E addq.w #1,d7 ;Zhler fr Anzahl Ziffern ; alten wert mal 10 =2*(4+1) move.l d0,d2 ;alten Wert merken (f. +1) move.l d1,d3 add.l d1,d1 ;mal 2 addx.l d0,d0 bcs.s StoIer ;berlauf add.l d1,d1 ;mal 2 = mal 4 addx.l d0,d0 bcs.s StoIer ;berlauf add.l d3,d1 ; mal 5 addx.l d2,d0 bcs.s StoIer ;berlauf add.l d1,d1 ;mal 10 addx.l d0,d0 bcs.s StoIer ;berlauf ; neuen Wert addieren add.l d4,d1 bcc.s StoI1 addq.l #1,d0 bcc.s StoI1 StoIer: moveq #-1,d7 ;fehlerflag setzen StoI_E: rts prim: move.l 4(a7),a6 ;ptr auf Zahl move.l siebBEG,a2 movea.w siebMAX2,a5 adda.l a2,a5 adda.l siebKGV2,a5 move.w siebMAX1,d7 ext.l d7 add.l a2,d7 add.l siebKGV1,d7 move.l divisor,d1 ;Divisor vorgegeben? beq.s prim1 ;dann Fortsetzung moveq #0,d0 ;nach Break moveq #0,d2 move.l siebKGV2,d3 bsr Rdivi lea 1(a2,d5.l),a4 move.l divisor,d1 move.l siebKGV1,d3 bsr Rdivi lea 2(a2,d5.l),a3 move.l divisor,d3 bra.s primR ;eine neue Zahl prfen, ob sie eine Primzahl ist prim1: moveq #1,d3 ;kleinste Divisor-2 lea 2(a2,d3),a3 lea 1(a2,d3),a4 primR: moveq #0,d2 prim2: cmp.w #10,D3 ;im Abstand von $10000 auf bhi.s prim_C ;Abbruch testen (manchmal bsr inkey ; auch 2 oder 3 mal) tst.w d0 beq.s prim_C move.l d3,divisor bsr pr_info bsr speicher moveq #-1,d0 ;flag: abbruch bra.s prim5 prim_C: cmpa.l d7,a3 bcs.s primx suba.l siebKGV1,a3 primx: moveq #0,d4 move.b (a3),d4 ;nchsten mglichen addq.w #2,d4 ;Divisor ermitteln add.l d4,d3 adda.l d4,a3 adda.l d4,a4 cmp.l a5,a4 bcs.s prims2 suba.l siebKGV2,a4 prims2: tst.b (a4) bne.s prim2 prim3: movem.l (a6),d0-d1 ;zahl holen bsr.s Rdivi or.l d4,d5 beq.s prim4 ;kein rest, dann keine ; primzahl, nchste zahl testen tst.l d0 ;Ergebnis >32 bit, dann bne.s prim2 ;grer Divisor cmp.l d3,d1 ;Ergebnis > Divisor ? bhi.s prim2 ;dann noch nicht fertig moveq #0,d0 ;flag, Primzahl gefunden bra.s prim5 prim4: cmp.l #1000,d3 ;zahl u.divisor ausgeben bcs.s primM ;wenn Divisor >1000 bsr pr_info ;(hherer Zeitbedarf) primM: addq.l #2,4(a6) ;neue mgliche Primzahl bcc.s prim1 addq.l #1,(a6) bra.s prim1 ;bertrag nicht mglich, prim5: rts ; da gengend reserve ;division von unsinged 64bit integer in Registern ;Dividend d0/d1 (high,low) / Divisor d2,d3 (h,l) ;Ergebnis in d0,d1; Rest in d4,d5 ;d6 ist zhler fr schleife ;durch Fallunterscheidung wird die Berechnung ;beschleunigt die Beschleunigung gilt fr alle ;Flle im vgl. zu einer allgemeinen 64bit Div. Rdivi: moveq #0,d4 ;msLW vom rest auf 0 tst.l d2 ;divisor grer 32 bit ? bne RdivDD ;[kommt hier nicht vor] cmpi.l #$10000,d3 ;divisor weniger als bcs RdivDW ;16 bit --> divu mglich tst.l d0 ;zahl grer 32 bit ? beq.s RdivLLW ;32 bit ist schneller cmp.l d0,d3 ;ergebnis <$1 0000 0000 bhi.s RdivDLL ;dann mit 32Bit-div. moveq #0,d5 ;32Bit>divisor>16Bit swap d0 ;64Bit>dividend>48Bit move.w d0,d5 ;schnell um 16 bit rot. clr.w d0 swap d0 ;zunchst Teilergebnis >$1 0000 0000 ermitteln moveq #15,d6 tst.l d3 ;MSbit gesetzt? bpl.s Rdiv_m1 ;nein, kein berlauf Rdiv_l0:add.w d0,d0 ;!! hier word mglich !! addx.l d5,d5 bcs.s Rdiv_l cmp.l d5,d3 bhi.s Rdiv_l1 Rdiv_l: sub.l d3,d5 addq.w #1,d0 Rdiv_l1:dbf d6,Rdiv_l0 bra.s Rdiv_l7 ;die restlichen Stellen ;mit 32Bit div. ermitteln Rdiv_m1:add.w d0,d0 ;gleiche Routine ohne bcs addx.l d5,d5 ;ist schneller cmp.l d5,d3 bhi.s Rdiv_m2 sub.l d3,d5 addq.w #1,d0 Rdiv_m2:dbf d6,Rdiv_m1 moveq #31,d6 bra.s Rdiv_k1 RdivLLW:moveq #0,d5 ;dividend <32B, swap d1 ; 32B>divisor>16B move.w d1,d5 ;16 bit rotation clr.w d1 moveq #15,d6 bra.s Rdiv_l8 ;dividend>32B, divisor<32B, ergebnis <32B RdivDLL:move.l d0,d5 ;msL in rest kopieren moveq #0,d0 Rdiv_l7:moveq #31,d6 Rdiv_l8:tst.l d3 bpl.s Rdiv_k1 Rdiv_l4:add.l d1,d1 addx.l d5,d5 bcs.s Rdiv_l6 cmp.l d5,d3 bhi.s Rdiv_l5 Rdiv_l6:sub.l d3,d5 addq.w #1,d1 ;kein bertrag !! Rdiv_l5:dbf d6,Rdiv_l4 rts Rdiv_k1:add.l d1,d1 ;wenn d3 "positiv" addx.l d5,d5 ;kein overflow mglich cmp.l d5,d3 ;spart bcs und Zeit bhi.s Rdiv_k2 sub.l d3,d5 addq.w #1,d1 Rdiv_k2:dbf d6,Rdiv_k1 rts RdivDD: move.l d0,d5 ;schnell um 32B rotieren moveq #0,d0 ;(divisor immer >32 Bit) moveq #31,d6 cmpi.l #$10000,d2 ;divisor >48 bit ? bcs.s Rdiv_l2 swap d5 ;noch um 16 bit rotieren move.w d5,d4 swap d1 move.w d1,d5 clr.w d1 moveq #15,d6 Rdiv_l2:add.l d1,d1 ;zahl (+ ergebnis) um 1Bit addx.l d5,d5 ;MSB in Rest schieben addx.l d4,d4 bcs.s Rdiv_S cmp.l d4,d2 ;rest grer als divisor? bhi.s Rdiv_l3 bne.s Rdiv_S cmp.l d5,d3 bhi.s Rdiv_l3 Rdiv_S: sub.l d3,d5 ;dann substrahieren subx.l d2,d4 addq.w #1,d1 ;und bit im ergebnis setzen ;da bit0 vorher 0 ==> kein bertrag ! Rdiv_l3:dbf d6,Rdiv_l2 rts ;Routine fr divior in word-gre (<16 bit) RdivDW: move.l d0,d5 ;hchstes word beq.s RdivLW ;zahl <32 bit clr.w d5 swap d5 divu d3,d5 move.w d5,d6 swap d6 move.w d0,d5 ;zweites word +rest vom divu d3,d5 ; high word move.w d5,d6 move.l d6,d0 bra.s RdivLWd RdivLW: moveq #0,d5 RdivLWd:swap d1 ;drittes word move.w d1,d5 divu d3,d5 move.w d5,d6 swap d6 swap d1 ;low word move.w d1,d5 divu d3,d5 move.w d5,d6 move.l d6,d1 clr.w d5 swap d5 ;rest rts ;division einer groen Zahl durch ein Langword ;aufruf: a0=ptr auf Zahl ; a1=ptr auf ergebnis ; d1=lnge der Zahl in word ; d3=divisor (positiv signed, 31 bit) ;fr unsigned blokiertes 'BSC.S' freigeben ;rckgabe: d0 = rest der division diviV: movem.l d1/d4-d5/a0-a1,-(a7) ;reg. retten moveq #0,d0 subq.w #1,d1 ;lnge dividend bra.s divVc divV0: move.w d0,(a1)+ divVc: move.w (a0)+,d0 ;0-word am anfang dbne d1,divV0 ;dann 0-word im ergebnis tst.w d1 bmi.s divVLVe ;dividend war 0 cmpi.l #$10000,d3 ;divisor nur word? bcs.s divVWV ;dann schnellere ;routine ;der divisor mu hier >$FFFF sein !!!! clr.w (a1)+ ;ergebnis ist 1W kleiner subq.w #1,d1 ;da divisor >16Bit bmi.s divVLVe ;[W]/[L] = 0, rest d0 cmp.l -2(a0),d3 ;erstes [L] von bcs.s divVLVl ;zahl < divisor ? swap d0 move.w (a0)+,d0 clr.w (a1)+ subq.w #1,d1 bmi.s divVLVe divVLVl:move.w (a0)+,d5 moveq #15,d4 ;zhler fr ein word divVLVi:add.w d5,d5 ;innere schleife, ber addx.l d0,d0 ;ein word ; bcs.s divVLVs ;notwendig falls d3 32bit cmp.l d0,d3 bhi.s divVLVn divVLVs:sub.l d3,d0 addq.w #1,d5 divVLVn:dbf d4,divVLVi move.w d5,(a1)+ dbf d1,divVLVl divVLVe:movem.l (a7)+,d1/d4-d5/a0-a1 rts divVWVl:move.w (a0)+,d0 divVWV: divu d3,d0 move.w d0,(a1)+ dbf d1,divVWVl clr.w d0 swap d0 movem.l (a7)+,d1/d4-d5/a0-a1 rts ;berechnung von RSA_aF1 und Zerlegung in ;Primfaktoren sowie Verteilung auf 'S' und 'T' Primfaktoren: move.w zahl_a,d0 ;nach unterbrechnung bne.s PF_cont ; weiter lea RSA_F,a0 movem.l (a0),d0-d3 ;2 * F +1 (start) moveq #0,d4 add.l d3,d3 ;mal 2 addx.l d2,d2 addx.l d1,d1 addx.l d0,d0 ;kein bertrag !! addq.l #1,d3 ;plus 1 clr.w RSA_aF1-RSA_F(a0) ;MSW noch 0 movem.l d0-d3,RSA_aF1-RSA_F+2(a0) move.w #2,zahl_a bra.s PF_loop PF_cont:move.w cntFak,d0 lsl.w #2,d0 ;mal 4 lea faktor,a2 ;Pos. f. nchsten adda.w d0,a2 ;Faktor lea temp3,a0 ;ptr in sieb- move.l siebKGV1,d3 ;array berechnen moveq #0,d2 moveq #4,d1 lea dummy,a1 bsr diviV move.l d0,a6 ;rest als pointer move.l siebKGV2,d3 ;ptr. in sieb 2 bsr diviV move.l d0,a5 ;rest als pointer lea temp1,a0 lea temp2,a1 movem.l temp3,d2-d3 ;letzte divisor bra.s PF_con2 PF_loop:lea faktor,a2 clr.w cntFak lea RSA_F,a0 ;mit nchstem a lea RSA_aF1,a1 ;durchrechnen movem.l (a0),d0-d3 ;RSA_F zu movem.l 2(a1),d4-d7 ;RSA_aF1 addieren add.l d3,d7 addx.l d2,d6 addx.l d1,d5 addx.l d0,d4 bcc.s PF_g ;zahl >128bit addq.w #1,(a1) PF_g: addq.w #1,zahl_a movem.l d4-d7,2(a1) lea temp1,a0 ;temp1 = RSA_af1 move.w (a1),(a0) movem.l d4-d7,2(a0) lea temp2,a1 moveq #3,d3 ;kleinste ungrade Primzahl moveq #0,d2 ;divisor highlong move.l d3,a6 move.l d3,a5 PF_con2:move.l siebBEG,d0 lea 2(a6,d0.l),a6 move.w siebMAX1,d6 ext.l d6 add.l d0,d6 add.l siebKGV1,d6 lea 1(a5,d0.l),a5 move.w siebMAX2,d5 ext.l d5 add.l d0,d5 add.l siebKGV2,d5 lea 14(a0),a3 ;ptr auf letzes lea 14(a1),a4 ;LW der Zahlen moveq #9,d1 ;max. lnge RSA_aF1 in [w] PF_l0: tst.w (a0) ;nur soviel word verwenden bne.s PF_l1 ;wie ntig addq.l #2,a0 clr.w (a1)+ subq.w #1,d1 bne.s PF_l0 bra.s PF_ende ;mit dieser zahl fertig PF_l1: bsr diviV tst.l d0 ;gab es einen rest ? bne.s PF_l2 move.l d3,(a2)+ addq.w #1,cntFak ;fr nchsten faktor exg a0,a1 exg a3,a4 bra.s PF_l0 PF_l2: cmpi.w #4,d1 ;zahl schon kleiner als bhi.s PF_l3 ; 4 word ? cmp.l (a4),d3 ;ergebnis < divisor bcs.s PF_l3 ;dann neuen faktor tst.l -4(a4) ;gefunden beq.s PF_ende PF_l3: cmpi.w #10,d3 ;alle $10000 auf break bhi.s PF_c ;testen bsr inkey tst.w d0 beq.s PF_c subq.w #1,d1 PF_s: move.W (a0)+,(a1)+ ;Zahl in beide puffer dbf d1,PF_s ;speichern movem.l d2-d3,temp3 ;divisor merken bsr speicher bra PF_break PF_c: cmp.l a6,d6 bhi.s PF_l4 cmpi.l #$4000000,d3 ;abrechen, wenn bhi.s PF_ende ;faktor zu gro wird ;(es dauert zu lange) sub.l siebKGV1,a6 ;ptr zurcksetzen PF_l4: moveq #0,d0 ;nchsten divisor ermitteln move.b (a6),d0 addq.w #2,d0 ;bleibt in bytegre add.l d0,a6 add.l d0,d3 add.l d0,a5 cmp.l a5,d5 bhi.s PF_n1 sub.l siebKGV2,a5 PF_n1: tst.b (a5) beq.s PF_l1 bra.s PF_c PF_ende: ;hier primfaktoren aufteilen auf RSA_S und RSA_T move.w cntFak,d7 ;anzahl weiterer subq.w #1,d7 ;Primfakoren bmi PF_abbruch ;keine da lea -12(a3),a3 ;rest von RSA_af1 tst.w -2(a3) ;noch >128bit ? bne.w PF_abbruch lea RSA_T,a1 ;nach RSA_T lea RSA_S,a0 ;RSA_S auf 1 moveq #3,d0 PF_l5: clr.l (a0)+ move.l (a3)+,(a1)+ dbf d0,PF_l5 addq.b #1,-(a0) lea RSA_F,a0 lea -14(a4),a1 ;freier temp-Puffer moveq #0,d2 moveq #8,d1 ;lnge von RSA_F move.l a2,a3 clr.l (a2) PF_l8: move.l -(a3),d3 ;Prfen, ob Primfaktoren bsr diviV ;Divisor von RSA_F tst.l d0 bne.s PF_l9 ;hier RSA_T mit neuer Primzahl multiplizieren lea RSA_T,a4 bsr mul4L1 move.l a3,a4 PF_l10: move.l 4(a4),(a4)+ ;folgende Faktoren cmp.l a4,a2 ;herunterkopieren bne.s PF_l10 subq.l #4,a2 subq.w #1,cntFak beq PF_abbruch ;kein Faktor mehr PF_l9: dbf d7,PF_l8 ; fr RSA_S move.w cntFak,d7 bra.s PF_t_e PF_t: move.l -(a2),d3 lea RSA_S,a0 lea RSA_T,a1 moveq #3,d0 PF_t_V: cmpm.l (a0)+,(a1)+ ;RSA_S und RSA_T dbne d0,PF_t_V ;vergleichen bcs.s PF_t_T lea RSA_S,a4 ;S kleiner bra.s PF_t_g PF_t_T: lea RSA_T,a4 ;T kleiner PF_t_g: bsr.s mul4L1 ;kleinere zahl mal mal d3 PF_t_e: dbf d7,PF_t lea ausgabe,a0 lea text_s,a1 lea RSA_S,a2 moveq #16,d0 bsr makeStr lea text_t,a1 lea RSA_T,a2 bsr makeStr move.l a0,a2 lea ausgabe,a0 bsr merken moveq #2,d0 lea text_a,a1 lea zahl_a,a0 bsr pr_z_cp bra.s PFuntil PF_abbruch: moveq #2,d0 lea text_a,a1 lea zahl_a,a0 bsr pr_zahl PFuntil:cmpi.w #13,zahl_a ;schon genug Zahlen bne PF_loop ;getestet ? moveq #0,d0 rts PF_break:moveq #-1,d0 rts mul4L1: ;multiplikation eines [4L] ab a4 mit d3.l ;auf 2 64 bit mul. zurckfhren movem.l d4-d7/a0-a2,-(a7) lea temp3,a0 lea temp2,a1 movem.l (a4),d4-d7 ;zahl in temp2 movem.l d4-d7,(a1) clr.l (a0) move.l d3,4(a0) move.l a4,-(a7) pea 8(a1) move.l a0,-(a7) bsr mul64 lea 12(a7),a7 tst.l (a1) ;zahl>64bit? (sollte bne.s m4L1_v ;ausnahme sein) tst.l 4(a1) beq.s m4L1_d m4L1_v: lea temp1,a2 move.l a2,-(a7) move.l a1,-(a7) move.l a0,-(a7) bsr mul64 lea 12(a7),a7 movem.l 8(a2),d4-d5 moveq #0,d6 add.l d5,4(a4) addx.l d6,d4 add.l d4,(a4) m4L1_d: movem.l (a7)+,d4-d7/a0-a2 rts makeStr:move.b (a1)+,(a0)+ ;text kopieren bne.s makeStr ;(anhngen) subq.l #1,a0 move.l a0,-(a7) move.w d0,-(a7) move.l a2,-(a7) bsr ItoS ;zahl anhngen lea 10(a7),a7 ;rckgabe: a0=pos rts ;hinter zahl print: move.l a0,-(a7) ;string ab a0 move.w #9,-(a7) ;ausgeben trap #1 addq.l #6,a7 rts laden: clr.w -(a7) pea dana ;open move.w #61,-(a7) trap #1 addq.l #8,a7 move.w d0,d7 bmi.s lade_err pea saveBSS move.l lenSave,-(a7) ;mehr laden als addq.l #4,(a7) ;vorhanden damit move.w d7,-(a7) ;fehler wenn zu lang move.w #63,-(a7) ;fread trap #1 lea 12(a7),a7 cmp.l lenSave,d0 beq.s laden1 clr.w F_entry lea tLenErr,a0 bsr.s print laden1: move.w d7,-(a7) ;fclose move.w #62,-(a7) trap #1 addq.l #4,a7 rts lade_err:clr.w F_entry lea tNoFile,a0 bsr.s print rts speicher:bsr gettime ;bisherigen sub.l d0,time ;zeitbedarf merken moveq #1,d0 lea t_save,a0 bsr inputS move.b inp_p+2,d0 ori.b #$20,d0 ;kleinbuchstaben cmpi.b #'n',d0 beq.s speicherE cmpi.b #'j',d0 bne.s speicher clr.w -(a7) pea dana move.w #60,-(a7) ;fcreate trap #1 addq.l #8,a7 move.w d0,d7 bmi.s speicherF pea saveBSS move.l lenSave,-(a7) ;fwrite move.w d7,-(a7) move.w #64,-(a7) trap #1 lea 12(a7),a7 move.l d0,d6 move.w d7,-(a7) ;fclose move.w #62,-(a7) trap #1 addq.l #4,a7 cmp.l lenSave,d6 beq.s speicherE lea tWrtErr,a0 bra.s sp2 speicherF:lea tNoCrt,a0 sp2: bsr print bra.s speicher speicherE:rts DATA entry: dc.l main,entry1,entry2,entry3 info: dc.b 27,'E',27,'v',13,10,27,'b ',27 dc.b 'c! Programm zum Berechnen von ' dc.b 'Schlsselzahlen ',13,10 dc.b ' fr das RSA-Codierverfahren. ' dc.b 13,10,10,27,'b!',27,'c ',189 dc.b ' von Georg Scheibler,' dc.b ' 4920 Lemgo' dc.b 13,10,10,'(c) 1992 MAXON Computer GmbH' dc.b 13,10,10,'Es mssen zwei (groe)' dc.b ' Zahlen vorgegeben werden ' dc.b '(max. 19 Ziffern)',13,10,10,0 t_inpZ: dc.b 'bitte #. Zahl vorgeben: ',27 dc.b 'j____.____.____.____|',27,'k',0 crlf: dc.b 10,13,0 text_p: dc.b 'P = ',0 text_q: dc.b 'Q = ',0 text_n: dc.b 13,10,'Kombinationen fr ' text_n1:dc.b 'N = ',0 text_s: dc.b 'S = ',0 text_t: dc.b ' T = ',0 text_a: dc.b ' a = ',0 tNoFile:dc.b 'Datei "RSA_TEMP.BRK"' dc.b ' nicht gefunden',13,10,0 tLenErr:dc.b 'Datei "RSA_TEMP.BRK"' dc.b ' fehlerhaft',13,10,0 tNoCrt: dc.b 'Datei "RSA_TEMP.BRK"' dc.b ' nicht erzeut.',13,10 dc.b 'Noch mal versuchen?',13,10,0 tWrtErr:dc.b 'Fehler beim Schreiben in die' dc.b ' Datei',13,10 dc.b 'Noch mal versuchen?',13,10,0 t_save: dc.b 'Soll der aktuelle Stand' dc.b ' gespeichert werden? [J/N] ',0 dana: dc.b 'RSA_TEMP.BRK',0 gong:dc.b 0,240,1,0,2,145,3,1,4,176,5,4,7,248,8 dc.b 16,9,16,10,16,11,208,12,164,13,0,130,20 dc.b 0,239,2,222,4,140,5,5,13,0,130,30 dc.b 0,240,2,145,4,176,5,4,7,248,13,0,130,20 dc.b 0,239,2,222,4,140,5,5,13,0,130,35,130,0 lenSave:dc.l ramBSS-saveBSS BSS saveBSS:;der folgende BSS-Bereich wird bei ; Unterbrechung gespeichert ;flag fr laufenden Programmteil (f. Fortsetzung) F_entry:ds.w 1 time: ds.l 1 ;startzeit/zwischenzeit divisor:ds.l 1 ;von Primzahlsuche RSA_P: ds.l 2 ;erste Primzahl RSA_Q: ds.l 2 ;zweite Primzahl RSA_N: ds.l 4 ;RSA_P * RSA_Q RSA_S: ds.l 4 ;y = x^RSA_S mod RSA_N RSA_T: ds.l 4 ;x = y^RSA_T mod RSA_N RSA_F: ds.l 4 ;(RSA_P-1) *(RSA_Q-1) RSA_aF1:ds.w 9 ;a*RSA_F+1 , a={3,4...13} temp1: ds.w 9 ;Hilfsvariablen temp2: ds.w 9 temp3: ds.l 2 zahl_a: ds.w 1 cntFak: ds.w 1 faktor: ds.l 82 ;gefundene Primfaktoren membuf: ds.b len_mb+4 ;fr gesamtbersicht ;der folgende BSS-bereich wird nicht gespeichert ramBSS: ds.l 2 ;Platz fr mehr laden siebMAX1:ds.w 1 ;grter Faktor Sieb 1 siebKGV1:ds.l 1 ;Produkt der Faktoren siebMAX2:ds.w 1 ;dgl. f. Sieb 2 siebKGV2:ds.l 1 siebBEG:ds.l 1 ;Startadresse der Siebe inp_p: ds.b 30 ausgabe:ds.b 100 dummy: ds.l 4 ` z o (Ш.@//Bg?<JNAO p/?<HNA\d"<.e03l$< >e &3r`03r$<c&`"<uN3 l$<: 3r&#n#td/?<HNA\#xkA a 4ar# xByBy.By,p1a,HJGkXf4A~ Lg lf"a aѹ09HA pNp2aHJGk gan#BRyHya,XJkTC ApaBBRyHyaXJk$CApaRyHyHyHyaO LSHLSHHyHyHyaXO pEC*Aa a,ACpaaAxa `vBg?<LNAAx0<JWJ@kSCW|  BNu/Hy?</aO  /?<HoaO &H*HaVLNuEfS/ ?/aO *Hp/?< NN\JfHyL?< NN\  @8c  a"&< ~ @cb| b0`d0B@H@ 0000H@.p0jSBLN^Nu opr~xg20  b(RG$&ҁрeҁрe҃тeҁрe҄dRd~Nu,o$yx:yrt>9lHފ޹n"9g.pt&9taIX"9&9naGX&9` vG0I0t| baJ@g#ataFp`PenxTDքĹetJfLa(g Jfbp`ea&TdR`NuxJf eJg,@&9ta2*@ACL $`VE0By.ACLLރ݂ہـdRQRy,HA0HCvt,C*C 9xM<9lH܀ܹnK:9rHڀڹtGIr JPf TBYSAf`zazJf$Ry.HK` Ab eJgT C b aJ@gSA2QH $a*`>b b"npT@րbtJg`>9.SGkGJkfCApB"QR ACtr&JB&#aJf Ia(K(fYSy.gQ>9.`(&"ACpVeI`IarQAC/EpaC4Ea$HAapC@A,az`pC@A,a` y ,fpNupNuHA$CLHB!C/ Hi/aO JfJg$E/ / /aO L0|۬نٔLNufS/?/ aO Nu/?< NA\NuBgHy??<=NAP>kNAXNuByAPaNuaZpA a`9~ ngZ jfBgHy??<k4Hy/9??<@NAO ,??<>NAXgA`Aa`Nud0Ev b c! Programm zum Berechnen von Schlsselzahlen fr das RSA-Codierverfahren. b!c von Georg Scheibler, Lemgo (c) 1992 MAXON Computer GmbH Es mssen zwei (groe) Zahlen vorgegeben werden (max. 19 Ziffern) bitte #. Zahl vorgeben: j____.____.____.____|k P = Q = Kombinationen fr N = S = T = a = Datei "RSA_TEMP.BRK" nicht gefunden Datei "RSA_TEMP.BRK" fehlerhaft Datei "RSA_TEMP.BRK" nicht erzeut. Noch mal versuchen? Fehler beim Schreiben in die Datei Noch mal versuchen? Soll der aktuelle Stand gespeichert werden? [J/N] RSA_TEMP.BRK      #J       :,4n( \2 L  ""   (4      .N  ' Verschlsseln durch Vertauschen der Buchstaben ' zustzlich xor-Verschlsselung in ' Kommentarzeilen ' von Georg Scheibler, 4920 Lemgo ' (c) 1992 MAXON Computer GmbH a$="dies ist ein test" DIM unused!(32000) TEXT 0,13,a$ s1%=&HE62FA952 s2%=2345252 @crypt(s1%,s2%,TRUE,a$,*b$) TEXT 0,30,b$ @crypt(s1%,s2%,FALSE,b$,*c$) TEXT 0,50,c$ PROCEDURE crypt(key1%,key2%,crypt!,s$,d%) LOCAL d$,m%,h%,g%,z% ' konstanten fr PSZZG ' zur schnelleren Berechnung m%=2^(23-1) !MSB h%=2^(9-1) !zweites bit g%=m%+m%-1 !grte Zahl ' l%=LEN(s$) d$=SPACE$(l%) i%=0 max%=l% ARRAYFILL unused!(),TRUE WHILE i%0)) ' Verschlsseln durch Addieren der ASCII-Werte ' von Georg Scheibler, 4920 Lemgo ' (c) 1992 MAXON Computer GmbH a$="dies ist ein test" TEXT 0,13,a$ s1%=45 @crypt(s1%,a$,*b$) TEXT 0,30,b$ @decrypt(s1%,b$,*c$) TEXT 0,50,c$ PROCEDURE crypt(o1%,s$,d%) LOCAL d$ l%=LEN(s$) d$=s$ !damit nicht zuviel stringmll entsteht o_1%=0 FOR i%=1 TO l% o_0%=ASC(MID$(s$,i%,1)) o_1%=(o_1%+o1%+o_0%) AND &HFF MID$(d$,i%,1)=CHR$(o_1%) NEXT i% *d%=d$ RETURN PROCEDURE decrypt(o1%,s$,d%) LOCAL d$ l%=LEN(s$) d$=s$ !damit nicht zuviel stringmll entsteht h1%=0 FOR i%=1 TO l% o_1%=ASC(MID$(s$,i%,1)) o_0%=(o_1%-h1%-o1%) AND &HFF MID$(d$,i%,1)=CHR$(o_0%) h1%=o_1% NEXT i% *d%=d$ RETURN . =^i.. ]iCPXBUILDC u1w1CPXBUILDH |0CPXBUILDPRG 0CPXBUILDRSH y0 BOOT G^iXCONTROLH gDISK U^i /***********************************************/ /* Datei: CPXBUILD.C */ /* ------------------------------------------- */ /* Programm: CPXBUILD.PRG Version 1.00 */ /* (C) 1991 by MAXON Computer */ /* Autoren: Oliver Scholz & Uwe Hax */ /* verwendeter Compiler: Turbo-C 2.0 */ /* !Compileroption -M (string merging) setzen! */ /***********************************************/ /* die blichen Header-Dateien ----------------*/ #include #include #include #include #include #include #include #include "cpxbuild.rsh" #include "cpxbuild.h" #include "xcontrol.h" /* Prototypen fr Turbo-C ---------------------*/ VOID open_vwork(VOID); VOID init_header(CPX_HEADER *header); VOID load_header(CPX_HEADER *header); VOID into_dialog(CPX_HEADER *header, OBJECT *dialog); WORD get_path(char *pfad); VOID get_colors(CPX_HEADER *header, WORD *tcolor, WORD *icolor); VOID copy_icon(CPX_HEADER *header, OBJECT *dialog); VOID draw_icon(CPX_HEADER *header); VOID build_cpx(CPX_HEADER *header); VOID plot(WORD x, WORD y, WORD color); char hex(WORD i); /* ein paar Konstanten und Variablen ----------*/ #define TRUE 1 #define FALSE 0 WORD gl_apid; WORD work_in[12]; WORD work_out[57]; WORD vdi_handle; WORD ob_x,ob_y,dot_w,dot_h; /* Hier geht's zur Sache ----------------------*/ WORD main(VOID) { OBJECT *dialog; WORD x,y,w,h; WORD exitobj; WORD tcolor, icolor, i; CPX_HEADER header; char *s,*t; WORD dummy,mx,my; LONG line; /* GEM Applikation initialisieren */ gl_apid=appl_init(); vdi_handle=graf_handle(&dummy,&dummy, &dummy,&dummy); open_vwork(); init_header(&header); /* Resource relozieren */ dialog=object; for (i=0; i0) { icolor--; dialog[ICCOL].ob_spec.obspec.character= hex(icolor); header.icon_info &= 0x0FFF; header.icon_info |= (icolor << 12); objc_draw(dialog,ICCOL,MAX_DEPTH, x,y,w,h); } break; /* Iconfarbe Pfeil rechts */ case ICRIGHT: dialog[exitobj].ob_state &= ~SELECTED; objc_draw(dialog,exitobj,MAX_DEPTH, x,y,w,h); get_colors(&header, &tcolor, &icolor); if (icolor<15) { icolor++; dialog[ICCOL].ob_spec.obspec.character= hex(icolor); header.icon_info &= 0x0FFF; header.icon_info |= (icolor << 12); objc_draw(dialog,ICCOL,MAX_DEPTH, x,y,w,h); } break; /* Textfarbe Pfeil links */ case COLLEFT: dialog[exitobj].ob_state &= ~SELECTED; objc_draw(dialog,exitobj,MAX_DEPTH, x,y,w,h); get_colors(&header, &tcolor, &icolor); if (tcolor>0) { tcolor--; dialog[TEXTCOL].ob_spec.obspec. character=hex(tcolor); header.obj_state &= 0xF0FF; header.obj_state |= (tcolor << 8); objc_draw(dialog,TEXTCOL,MAX_DEPTH, x,y,w,h); } break; /* Textfarbe Pfeil rechts */ case COLRIGHT: dialog[exitobj].ob_state &= ~SELECTED; objc_draw(dialog,exitobj,MAX_DEPTH, x,y,w,h); get_colors(&header,&tcolor,&icolor); if (tcolor<15) { tcolor++; dialog[TEXTCOL].ob_spec.obspec. character=hex(tcolor); header.obj_state &= 0xF0FF; header.obj_state |= (tcolor << 8); objc_draw(dialog,TEXTCOL,MAX_DEPTH, x,y,w,h); } break; /* Icon invertieren */ case INVERT: dialog[exitobj].ob_state &= ~SELECTED; objc_draw(dialog,exitobj,MAX_DEPTH, x,y,w,h); for (i=0;i<24;i++) header.icon_data[i] ^= 0xFFFFFFFFL; copy_icon(&header,dialog); objc_draw(dialog,ICONBOX,MAX_DEPTH, x,y,w,h); draw_icon(&header); break; /* Iconbereich angewhlt (TOUCHEXIT) */ case ICONWORK: vq_mouse(vdi_handle,&dummy,&mx,&my); mx-=ob_x; my-=ob_y; mx/=dot_w; my/=dot_h; if (mx>=0 && mx<=31 && my>=0 && my<=23) { header.icon_data[my] ^= (1L<<(31-mx)); line=header.icon_data[my]; graf_mouse(M_OFF,NULL); plot(mx,my,(line & (1L<<(31-mx))) ? 1 : 0); graf_mouse(M_ON,NULL); copy_icon(&header,dialog); objc_draw(dialog,ICONBOX,MAX_DEPTH, x,y,w,h); } break; } /* Button normal darstellen */ dialog[exitobj].ob_state &= ~SELECTED; } while ((exitobj!=OK) && (exitobj!=ABBRUCH)); form_dial(FMD_FINISH,x,y,w,h,0,0,0,0); if (exitobj==OK) { /* Werte aus dem Dialog lesen */ header.flags.reserved=header.flags.boot_init= header.flags.set_only=FALSE; if (dialog[SETONLY].ob_state & SELECTED) header.flags.set_only=TRUE; if (dialog[BOOTFLAG].ob_state & SELECTED) header.flags.boot_init=TRUE; if (dialog[RESFLAG].ob_state & SELECTED) header.flags.reserved=TRUE; s=dialog[VERSION].ob_spec.tedinfo->te_ptext; t=(char *)&header.cpx_version; for(i=0; i<2; i++) t[i]=(((*s++)-'0')<<4) | ((*s++)-'0'); strncpy(header.cpx_id,dialog[CPXID].ob_spec. tedinfo->te_ptext,4); strcpy(header.icon_name,dialog[ICNNAME]. ob_spec.tedinfo->te_ptext); strcpy(header.cpx_name,dialog[CPXNAME]. ob_spec.tedinfo->te_ptext); /* CPX Modul 'linken' */ build_cpx(&header); } /* bei GEM abmelden */ v_clsvwk(vdi_handle); appl_exit(); return(0); } /* Header mit sinnvollen Daten initialisieren -*/ VOID init_header(CPX_HEADER *header) { WORD i; char init[]="@\0"; header->magic=100; header->flags.boot_init=TRUE; strcpy(header->cpx_id,init); header->cpx_version=0; strcpy(header->icon_name,init); for (i=0; i<24; i++) header->icon_data[i]=0L; header->icon_info=0x1000; strcpy(header->cpx_name,init); header->obj_state=0x1180; } /* Aktuellen Pfad und Laufwerk holen ----------*/ WORD get_path(char *pfad) { pfad[0]='A'+Dgetdrv(); pfad[1]=':'; pfad[2]='\0'; return(Dgetpath(pfad+3,0)); } /* Header aus CPX Modul lesen -----------------*/ VOID load_header(CPX_HEADER *header) { char pfad[128],filename[16],*pathend; WORD button,handle; get_path(pfad); strcat(pfad,"*.CP?"); filename[0]='\0'; fsel_input(pfad,filename,&button); if (button) { if ((pathend=strrchr(pfad,(int)'\\'))!=NULL) { strcpy(pathend+1,filename); if ((handle=Fopen(pfad,0))>0) { Fread(handle,512L,header); Fclose(handle); } } } } /* Daten aus Header in Dialog eintragen -------*/ VOID into_dialog(CPX_HEADER *header, OBJECT *dialog) { WORD tcol,icol,i; char ver[4],*s; strcpy(dialog[CPXNAME].ob_spec.tedinfo-> te_ptext,header->cpx_name); strcpy(dialog[ICNNAME].ob_spec.tedinfo-> te_ptext,header->icon_name); strncpy(dialog[CPXID].ob_spec.tedinfo-> te_ptext,header->cpx_id,4); get_colors(header,&tcol,&icol); dialog[TEXTCOL].ob_spec.obspec.character= hex(tcol); dialog[ICCOL].ob_spec.obspec.character= hex(icol); dialog[ICONSMAL].ob_spec.bitblk->bi_wb=4; dialog[ICONSMAL].ob_spec.bitblk->bi_hl=24; copy_icon(header,dialog); if (header->flags.set_only) dialog[SETONLY].ob_state |= SELECTED; else dialog[SETONLY].ob_state &= ~SELECTED; if (header->flags.boot_init) dialog[BOOTFLAG].ob_state |= SELECTED; else dialog[BOOTFLAG].ob_state &= ~SELECTED; if (header->flags.reserved) dialog[RESFLAG].ob_state |= SELECTED; else dialog[RESFLAG].ob_state &= ~SELECTED; s=(char *) &(header->cpx_version); for(i=0; i<2; i++) { ver[2*i]=((s[i]>>4) & 0xF)+'0'; ver[2*i+1]=(s[i] & 0xF)+'0'; } strncpy(dialog[VERSION].ob_spec.tedinfo-> te_ptext,ver,4); } /* Text- und Iconfarbe aus Header auslesen ----*/ VOID get_colors(CPX_HEADER *header, WORD *tcolor, WORD *icolor) { *icolor=(header->icon_info >>12) & 0xF; *tcolor=(header->obj_state >> 8) & 0xF; } /* Zahl 0..15 in Hexzahl umwandeln ------------*/ char hex(WORD i) { if ((i>=0) && (i<10)) return('0'+(char)i); if ((i>=10) && (i<16)) return ('A'+(char)(i-10)); return ('0'); } /* Icon aus Header in Dialog kopieren ---------*/ VOID copy_icon(CPX_HEADER *header, OBJECT *dialog) { WORD i; for (i=0; i<24; i++) { dialog[ICONSMAL].ob_spec.bitblk-> bi_pdata[2*i]= (WORD)((header->icon_data[i])>>16); dialog[ICONSMAL].ob_spec.bitblk-> bi_pdata[2*i+1]= (WORD)((header->icon_data[i]) & 0xFFFFL); } } /* Icon in GROSS malen ------------------------*/ VOID draw_icon(CPX_HEADER *header) { WORD ix,iy; LONG line; graf_mouse(M_OFF,NULL); for (iy=0; iy<24; iy++) { line=header->icon_data[iy]; for (ix=0; ix<32; ix++) plot(ix,iy,(line&(1L<<(31-ix))) ? 1 : 0 ); } graf_mouse(M_ON,NULL); } /* Ein 'grosses Pixel' malen ------------------*/ VOID plot(WORD x, WORD y, WORD color) { WORD pxyarray[4]; vsf_color(vdi_handle,color); pxyarray[0]=ob_x+x*dot_w; pxyarray[1]=ob_y+y*dot_h; pxyarray[2]=pxyarray[0]+dot_w-1; pxyarray[3]=pxyarray[1]+dot_h-1; v_bar(vdi_handle,pxyarray); } /* CPX Modul bauen: Header vor Prg schreiben --*/ VOID build_cpx(CPX_HEADER *header) { char pfad[128],filename[16],*pathend; char wpfad[128]; WORD button,whandle,handle; LONG length; get_path(pfad); strcat(pfad,"*.PRG"); filename[0]='\0'; fsel_input(pfad,filename,&button); if (button) { if ((pathend=strrchr(pfad,(int)'\\'))!=NULL) { strcpy(pathend+1,filename); strcpy(wpfad,pfad); if ((pathend=strrchr(wpfad,(int)'.')) !=NULL) { strcpy(pathend,".CPX"); if ((handle=Fopen(pfad,0))>0 && (whandle=Fcreate(wpfad,0))>0) { Fwrite(whandle,512L,header); do { length=Fread(handle,512L,header); Fwrite(whandle,length,header); } while (length==512L); Fclose(handle); Fclose(whandle); } } } } } /* kein Kommentar -----------------------------*/ VOID open_vwork(VOID) { WORD i; for (i=1; i<10; i++) work_in[i]=1; work_in[10]=2; v_opnvwk(work_in,&vdi_handle,work_out); } /***********************************************/ /* Datei: CPXBUILD.H */ /* ------------------------------------------- */ /* Programm: CPXBUILD.PRG Version 1.00 */ /* (C) 1991 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* vom RCS erstellte Include-Datei */ /***********************************************/ #define BUILD 0 /* TREE */ #define CPXNAME 3 /* OBJECT in TREE #0 */ #define COLLEFT 5 /* OBJECT in TREE #0 */ #define COLRIGHT 7 /* OBJECT in TREE #0 */ #define TEXTCOL 6 /* OBJECT in TREE #0 */ #define CPXID 8 /* OBJECT in TREE #0 */ #define ICONDATA 10 /* OBJECT in TREE #0 */ #define ICONSMAL 12 /* OBJECT in TREE #0 */ #define ICONBOX 11 /* OBJECT in TREE #0 */ #define ICLEFT 14 /* OBJECT in TREE #0 */ #define ICRIGHT 16 /* OBJECT in TREE #0 */ #define ICCOL 15 /* OBJECT in TREE #0 */ #define ICNNAME 17 /* OBJECT in TREE #0 */ #define INVERT 18 /* OBJECT in TREE #0 */ #define VERSION 9 /* OBJECT in TREE #0 */ #define ICONWORK 19 /* OBJECT in TREE #0 */ #define SETONLY 21 /* OBJECT in TREE #0 */ #define RESFLAG 23 /* OBJECT in TREE #0 */ #define BOOTFLAG 22 /* OBJECT in TREE #0 */ #define LOAD 24 /* OBJECT in TREE #0 */ #define OK 25 /* OBJECT in TREE #0 */ #define ABBRUCH 26 /* OBJECT in TREE #0 */ `L``j>>> TURBO-C <<<< for ATARI-ST Version 2.0 (C)88-90 Borland International &H f&op`B@#\3` k #f Ј<.@#bJy`g<"@(I$k,"Jf"JfB// ?<?<JNAO A6<HCBB`6 !jBJ)gHiRC` "fSI "WJAkHiRCBSQJ)gHiRCHy`$ON 0 J"LN? 9g @N 9g @NN ?<LNAH>ON 3HoHoC A N PO3nN G KNIhBC` 0 LN nRC|mB@N MHoHVHoC$ LN O BgBgBgBg?/?4/"2/$B@N O HyrCpp LN XO0,H 3t2,H3v4,H@H…yp2,09v4B@JBHyr"L KN?/??/4/rB@ LN \OKEp LN 8|0[@|b>@0;N22222222f22l2222(2H ЀЁt KN"L KN0?/??/4/rB@ LN ^\O`2H ЀЁt ?/??/4/ L0rN .\OHR"M KNXO0oSR0NHlt|Hltkx0r hkx?/??/4/ LprN \O`H2H ЀЁt ?/??/4/ L0rN \OHR"M KNXO RlRR`v2H ЀЁt ?/??/4/ L0rN b\OHR"M KNRU`x2H ЀЁt ?/??/4/ L0rN \OBC`0H RC|m"L KN?/??/4/rp LN ^\O KN`HWCA09nNXO09po29rW4/H…t?B0Hv>JBm~|nvJ@mr|nlrt/H0H*30<N pr/gt`BB20/N0<N "L KN?/??/4/rp LN\O2H ЀЁt |g|fBgBgBgBg?/?4/"2/$pNO |fkB@2k|Hkk|Ikplg kkplg kkpl2g kk l/P C/IBC`&p o R r o R  o0RC|mp l"PAN l"PA Nf lT"PAzNX KN09nNNXB@OL|8Nu/ YO&HCA6dkkCAN BkCA NB@` 2IBR@|m7|xCAzN7|XO&_Nu/ $HNl<A|:B*B@ANz$_NuH8On(HE JNC JN"B/HWC JNXO0g8 Jp\NL&H g*CANVB@ JN:6o L"<N0NOLNu/ / QO&H$ICz jT PNC j PNpC j PN>HoC KNXO0/NHj|Hj0/NHjt|Hjt j,1| j,1|"J KNpkgj`j0+H|gj`j0+H|gj2`j2AB@`(0HA<<04B r0<0 R@|mpC j PNPPO&_$_Nu/ 0(xr `|$o44(B|2$_NuJ@m | l<0Nu| m |l<7Nup0Nu/ B@`>2I$0r2AHҁ$i,$R5t2Ip2ARAHҁ$i,$R5R@|m$_NuH $H0<NRBC`00H(2BE`prgt`BB20N"RE| mRC|mʑ0<NL8NuH QO8:En02N 0j>2j?A4jSB?B8/jSD?DA0NPOL0NuHO"Nu/ Hz?<&NN\O$_Nu JgJgJgJgJg JgJgJfSHggggg ggf @Nug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"SefBJgSf ANu/ &y@ g/ &S?<INA\O`&yD g/ &S?<INA\O`&_Nu//??<?NAO Nu?<NATONu??<>NAXONu//??<@NAO Nu?/?<GNAPONu?/?< #include #include #include #include #include /* keine Variablen zu sichern */ #include "boot.rsh" #include "boot.h" #include "xcontrol.h" /* Definitionen zur besseren Lesbarkeit ------ */ #define TRUE 1 /* Standard-Def. */ #define FALSE 0 #define EOS '\0' #define NIL 0L #define MESSAGE -1 /* Message-Event */ #define MAX_ACTIVE 50 /* maximale Anzahl */ #define MAX_INACTIVE 50 /* von Eintrgen */ #define VISIBLE 5 /* sichtbare Eintr.*/ #define NAME_LENGTH 8+1 /* Lnge Eintrag */ #define MIN_SIZE 6 /* Slider-Gre */ #define ACTIVE TRUE /* Flags */ #define INACTIVE FALSE #define HORIZONTAL 1 #define VERTICAL 0 #define ACC 1 #define PRG 0 #define _bootdev 0x447 /* Systemvariable */ /* globale Variablen ------------------------- */ typedef struct { WORD max_num; /* Anzahl maximaler Eintrge */ WORD num; /* Anzahl Eintrge */ WORD begin; /* erster sichtbarer Eintrag */ WORD type; /* ACC oder PRG */ WORD selected; /* Nr. selektierter Eintrag */ char (*buffer)[NAME_LENGTH]; /* Buffer fr Programmnamen */ } BD; /* Buffer-Deskriptor */ BD active, inactive; /* Deskriptoren fr aktive und inaktive Programme */ CPX_PARAMS *params; /* vom Kontrollfeld ber- gebener Zeiger auf die Kontrollfeld-Funktionen */ OBJECT *boot; /* Zeiger auf Dialogboxen */ OBJECT *error; WORD scroll_param; /* bergabe-Parameter fr's Scrollen */ /* Indices der Dialogbox-Eintrge */ WORD act[VISIBLE]={ ACTIVE1, ACTIVE2, ACTIVE3, ACTIVE4, ACTIVE5 }; WORD inact[VISIBLE]= { INACTIV1, INACTIV2, INACTIV3, INACTIV4, INACTIV5 }; char empty[]=""; /* Strings fr Dialogbox */ char underlined[]="________"; char acc[]="*.ACC"; char prg[]="*.PRG"; char activate[]="ACC aktivieren"; char deactivate[]="ACC deaktivieren"; /* Prototypen fr Turbo-C -------------------- */ char boot_device(VOID); VOID change_object(OBJECT *tree, WORD object, WORD state); VOID copy(BD *dest, BD *source, WORD index); WORD get_entry(WORD object); OBJECT *get_traddr(WORD tree_index); CPX_INFO * cdecl init(CPX_PARAMS *params); VOID init_bd(char (*act_buff)[NAME_LENGTH], char (*inact_buff)[NAME_LENGTH]); VOID init_slider(WORD *slider1_pos, WORD *slider2_pos, WORD draw); WORD cdecl main(GRECT *curr_wind); VOID into_resource(BD *bd, WORD draw); VOID move_vslider(OBJECT *tree, WORD parent, WORD slider, WORD *slider_pos, BD *bd); VOID pos_vslider(OBJECT *tree, WORD parent, WORD slider, WORD *slider_pos, BD *bd); VOID pulldown(WORD *slider1_pos, WORD *slider2_pos); VOID read_config(char *type, BD *descriptor); VOID redraw_object(OBJECT *tree, WORD object); VOID refresh(WORD active_flag, WORD object); VOID scroll_down(VOID); VOID scroll_up(VOID); VOID unselect(WORD *array); VOID rename_file(VOID); VOID warning(VOID); VOID wind_center(OBJECT *tree, WORD *x, WORD *y, WORD *w, WORD *h); /* Funktionen -------------------------------- */ /***********************************************/ /* Initialisierung des Moduls: */ /* bergabeparameter: Zeiger auf die zur */ /* Verfgung stehenden Funktionen */ /* 1. Aufruf bei Laden des Headers */ /* (par->booting == TRUE) */ /* Rckgabe: 0 bei Set-Only, 1 sonst */ /* 2. Aufruf bei Laden des eigentlichen */ /* Programms (par->booting == FALSE) */ /* Rckgabe: Adresse der CPX_INFO-Struktur */ /***********************************************/ CPX_INFO * cdecl init(CPX_PARAMS *par) { static CPX_INFO info={ main,0L,0L,0L,0L, 0L,0L,0L,0L,0L }; if (par->booting) /* bei Laden des Headers */ return((CPX_INFO *)1L); else /* Aufruf bei Laden des Programms */ { /* => Lschen aller globalen Variablen! */ params=par; /* Zeiger retten! */ /* Resource relozieren */ if (!params->rsc_init) (*params->do_resource)(NUM_OBS,NUM_FRSTR, NUM_FRIMG,NUM_TREE,rs_object,rs_tedinfo, rs_strings,rs_iconblk,rs_bitblk,rs_frstr, rs_frimg,rs_trindex,rs_imdope); /* globale Variablen initialisieren */ boot=get_traddr(BOOT); error=get_traddr(ERROR); strncpy(activate,"ACC",3); strncpy(deactivate,"ACC",3); /* Dialogbox initialisieren */ boot[ACTION].ob_flags=NONE; boot[ACTION].ob_spec.tedinfo->te_ptext=empty; strcpy(boot[TYP].ob_spec.free_string,acc); /* Adresse der CPX_INFO-Struktur zurck */ return(&info); } } /***********************************************/ /* Aufruf nach Doppelclick auf das Icon im */ /* Auswahlfenster: Zeichnen der Dialogbox, */ /* Behandlung der Buttons */ /* bergabeparameter: Koordinaten des Fenster- */ /* arbeitsbereichs */ /* Rckgabe: FALSE, wenn der Dialog mittels */ /* do_form() abgearbeitet wird, */ /* TRUE, falls eigene Event-Routinen */ /* benutzt werden sollen */ /***********************************************/ WORD cdecl main(GRECT *curr_wind) { WORD msg_buff[8]; WORD button; WORD abort_flag=FALSE; char active_buff[MAX_ACTIVE][NAME_LENGTH]; char inactive_buff[MAX_INACTIVE][NAME_LENGTH]; WORD slider1_pos; WORD slider2_pos; WORD increment; VOID (*function)(); WORD max; /* Koordinaten der Dialogbox setzen */ boot[ROOT].ob_x=curr_wind->g_x; boot[ROOT].ob_y=curr_wind->g_y; /* Buffer-Deskriptoren initialiseren */ init_bd(active_buff,inactive_buff); /* Konfiguration einlesen... */ read_config("*.ACC",&active); read_config("*.ACX",&inactive); /* ...und in die Dialogbox eintragen */ into_resource(&active,FALSE); into_resource(&inactive,FALSE); /* Slider-Gre und Position initialisieren */ init_slider(&slider1_pos,&slider2_pos,FALSE); /* und Dialogbox zeichnen */ objc_draw(boot,ROOT,MAX_DEPTH,boot[ROOT].ob_x, boot[ROOT].ob_y,boot[ROOT].ob_width, boot[ROOT].ob_height); /* Dialogbox abarbeiten, bis ein Exit-Objekt angeklickt wurde */ do { /* neuer form_do()-Aufruf */ button=(*params->do_form)(boot,0,msg_buff); /* Doppelklick ausmaskieren */ if (button>=0) button &= 0x7fff; /* Slider-Variablen setzen */ increment=1; function=scroll_up; /* angeklicktes Objekt auswerten */ switch (button) { /* Name im "Aktiv"-Fenster angeklickt */ case ACTIVE1: case ACTIVE2: case ACTIVE3: case ACTIVE4: case ACTIVE5: refresh(ACTIVE,button); break; /* Name im "Inaktiv"-Fenster angeklickt */ case INACTIV1: case INACTIV2: case INACTIV3: case INACTIV4: case INACTIV5: refresh(INACTIVE,button); break; /* Datei aktivieren/deaktivieren */ case ACTION: rename_file(); into_resource(&active,TRUE); into_resource(&inactive,TRUE); init_slider(&slider1_pos,&slider2_pos, TRUE); refresh(ACTIVE,button); break; /* "Pfeil" im "Aktiv"-Fenster angeklickt */ case ACT_DOWN: increment=-1; function=scroll_down; case ACT_UP: scroll_param=ACTIVE; max=((max=active.num-VISIBLE)<0) ? 0 : max; (*params->inc_slider)(boot,PARENT1, SLIDER1,button,increment,0,max, &slider1_pos,VERTICAL,function); break; /* "Pfeil" im "Inaktiv"-Fenster */ case INACT_DO: increment=-1; function=scroll_down; case INACT_UP: scroll_param=INACTIVE; max=((max=inactive.num-VISIBLE)<0) ? 0 : max; (*params->inc_slider)(boot,PARENT2, SLIDER2,button,increment,0,max, &slider2_pos,VERTICAL,function); break; /* Slider angeklickt */ case SLIDER1: move_vslider(boot,PARENT1,SLIDER1, &slider1_pos,&active); break; case SLIDER2: move_vslider(boot,PARENT2,SLIDER2, &slider2_pos,&inactive); break; /* Slider-Hintergrund angeklickt */ case PARENT1: pos_vslider(boot,PARENT1,SLIDER1, &slider1_pos,&active); break; case PARENT2: pos_vslider(boot,PARENT2,SLIDER2, &slider2_pos,&inactive); break; /* "Anzeige-Typ" angeklickt */ case TYP: pulldown(&slider1_pos,&slider2_pos); break; /* Dialogbox verlassen */ case QUIT: abort_flag=TRUE; break; /* Nachricht eingetroffen */ case MESSAGE: switch (msg_buff[0]) { case WM_REDRAW: /* nicht notwendig */ break; case WM_CLOSED: /* nichts zu sichern */ case AC_CLOSE: abort_flag=TRUE; break; } break; } } while (!abort_flag); boot[button].ob_state &= ~SELECTED; return(FALSE); } /***********************************************/ /* Liefert Adresse einer Dialogbox */ /* (neue rsrc_gaddr()-Routine) */ /* bergabeparamter: Baum-Index */ /* Rckgabe: Zeiger auf Dialogbox */ /***********************************************/ OBJECT *get_traddr(WORD tree_index) { WORD i,j; for (i=0,j=0; i<=tree_index; i++) while (rs_object[j++].ob_next!=-1); return(&rs_object[--j]); } /***********************************************/ /* Einlesen der aktivierten und deaktivierten */ /* Programme */ /* bergabeparameter: Programmtyp, Adresse */ /* des Buffer-Deskriptors */ /* Rckgabe: keine */ /***********************************************/ VOID read_config(char *type, BD *descriptor) { DTA *dta=Fgetdta(); WORD i=0; WORD j,k; char path[20]; path[0]=boot_device(); /* Pfad je nach Typ aufbauen */ if (!strcmp(type,"*.ACC") || !strcmp(type,"*.ACX")) strcpy(&path[1],":\\"); else strcpy(&path[1],":\\AUTO\\"); strcat(path,type); /* alle Namen dieses Typs einlesen */ if (!Fsfirst(path,0)) do { j=0; while (dta->d_fname[j]!='.') descriptor->buffer[i][j]= dta->d_fname[j++]; for (k=j; kbuffer[i][k]=' '; descriptor->buffer[i++][k]=EOS; } while (!Fsnext() && (imax_num)); descriptor->num=i; if (descriptor->num==descriptor->max_num) warning(); } /***********************************************/ /* Im Fenster selektierten Namen deselektieren */ /* bergabeparameter: Adresse eines Feldes, */ /* das die Indices der Fen- */ /* stereintrge enthlt */ /* Rckgabe: keine */ /***********************************************/ VOID unselect(WORD *array) { WORD i; for (i=0; irci_first)(&xywh); /* solange noch Rechtecke da sind */ while (clip_ptr) { /* clip_ptr: Zeiger auf lokale Variable!! */ clip=*clip_ptr; /* deshalb kopieren */ /* Objekt neu zeichnen */ objc_draw(tree,object,MAX_DEPTH,clip.g_x, clip.g_y,clip.g_w,clip.g_h); /* nchstes Rechteck holen */ clip_ptr=(*params->rci_next)(); } } /***********************************************/ /* Selektierten Eintrag im Fenster deselektie- */ /* ren und je nach angeklicktem Eintrag den */ /* Aktions-Knopf neu zeichnen */ /* bergabeparameter: Fensterkennung, */ /* angeklicktes Objekt */ /* Rckgabe: keine */ /***********************************************/ VOID refresh(WORD active_flag, WORD object) { /* Ausgabetext bestimmen */ char *status=((active_flag==ACTIVE) ? deactivate : activate); /* selektierten Eintrag im anderen Fenster deselektieren */ unselect((active_flag==ACTIVE) ? inact : act); /* kein gltiger Eintrag angeklickt */ if ((boot[object].ob_spec.tedinfo->te_ptext== underlined) || (object==ACTION)) { /* selektierten Eintrag im aktuellen Fenster deselektieren */ unselect((active_flag==ACTIVE) ? act : inact); /* Aktions-Knopf abschalten */ boot[ACTION].ob_spec.tedinfo->te_ptext=empty; boot[ACTION].ob_state &= ~SELECTED; boot[ACTION].ob_flags=NONE; redraw_object(boot,ACTION); } else { /* gltiger Eintrag angeklickt */ if (boot[ACTION].ob_spec.tedinfo->te_ptext!= status) { /* Aktions-Knopf einschalten */ boot[ACTION].ob_spec.tedinfo->te_ptext= status; boot[ACTION].ob_flags=SELECTABLE|TOUCHEXIT; redraw_object(boot,ACTION); } /* Index des selektierten Eintrags merken */ if (status==activate) inactive.selected=inactive.begin+ get_entry(object); else active.selected=active.begin+ get_entry(object); } } /***********************************************/ /* Index des angeklickten Eintrags ermitteln */ /* bergabeparameter: angeklicktes Objekt */ /* Rckgabe: gesuchter Index */ /***********************************************/ WORD get_entry(WORD object) { WORD i; for (i=0; i te_ptext[4]; if (flag=='a') { /* Adressen fr Datei aktivieren */ array=inact; begin=inactive.begin; buffer=inactive.buffer; } else { /* Adressen fr Datei deaktivieren */ array=act; begin=active.begin; buffer=active.buffer; } /* Index des selektierten Eintrags ermitteln */ for (i=0; i=0; i--) if (path1[i]!=' ') { path1[++i]=EOS; break; } strcat(path1,((active.type==ACC) ? ".ACC" : ".PRG")); strcpy(path2,path1); path1[strlen(path1)-1]='X'; /* Datei umnennen */ if (flag=='a') { if (Frename(0,path1,path2)>=0) copy(&active,&inactive,index); } else { if (Frename(0,path2,path1)>=0) copy(&inactive,&active,index); } } /***********************************************/ /* Umbenannte Datei aus der einen Liste ent- */ /* fernen und in die andere Liste eintragen */ /* bergabeparameter: Zeiger auf Ziel- und */ /* Quell-Deskriptor, */ /* Index des zu entfernen- */ /* den Eintrags */ /* Rckgabe: keine */ /***********************************************/ VOID copy(BD *dest, BD *source, WORD index) { WORD i; /* Eintrag in Ziel-Liste eintragen */ if (dest->nummax_num) strcpy(dest->buffer[dest->num++], source->buffer[index]); else warning(); /* Eintrag aus der Quell-Liste lschen */ source->num--; for (i=index; inum; i++) strcpy(source->buffer[i], source->buffer[i+1]); source->begin=dest->begin=0; } /***********************************************/ /* Warnung fr Listen-berlauf ausgeben */ /* bergabeparameter: keine */ /* Rckgabe: keine */ /***********************************************/ VOID warning(VOID) { WORD x,y,w,h; /* Namens-Liste voll */ wind_center(error,&x,&y,&w,&h); objc_draw(error,ROOT,MAX_DEPTH,x-3,y-3,w+6,h+6); form_do(error,0); error[MIST].ob_state &= ~SELECTED; objc_draw(boot,ROOT,MAX_DEPTH,boot[ROOT].ob_x, boot[ROOT].ob_y,boot[ROOT].ob_width, boot[ROOT].ob_height); } /***********************************************/ /* Boot-Laufwerk ermitteln */ /* bergabeparameter: keine */ /* Rckgabe: Boot-Laufwerk */ /***********************************************/ char boot_device(VOID) { LONG ssp; char boot; ssp=Super((VOID *)0L); boot=*(BYTE *)_bootdev+'A'; Super((VOID *)ssp); return(boot); } /***********************************************/ /* Im Fenster nach oben scrollen */ /* bergabeparameter: Fensterkennung indirekt */ /* ber scroll_param */ /* Rckgabe: keine */ /***********************************************/ VOID scroll_up(VOID) { BD *bd=((scroll_param==ACTIVE) ? &active : &inactive); if (bd->begin>0) { bd->begin--; into_resource(bd,TRUE); } } /***********************************************/ /* Im Fenster nach unten scrollen */ /* bergabeparameter: Fensterkennung indirekt */ /* ber scroll_param */ /* Rckgabe: keine */ /***********************************************/ VOID scroll_down(VOID) { BD *bd=((scroll_param==ACTIVE) ? &active : &inactive); if (bd->begin+VISIBLEnum) { bd->begin++; into_resource(bd,TRUE); } } /***********************************************/ /* Namensliste in die Dialogbox eintragen */ /* bergabeparameter: Zeiger auf Buffer- */ /* Deskriptor, Zeichen-Flag */ /* Rckgabe: keine */ /***********************************************/ VOID into_resource(BD *bd, WORD draw) { WORD i; WORD *array=((bd==&active) ? act :inact); for (i=0; ibegin+inum) { /* Eintrag vorhanden */ boot[array[i]].ob_spec.tedinfo->te_ptext= bd->buffer[bd->begin+i]; boot[array[i]].ob_flags=SELECTABLE | RBUTTON | TOUCHEXIT; if (bd->begin+i==bd->selected) boot[array[i]].ob_state |= SELECTED; else boot[array[i]].ob_state &= ~SELECTED; } else { /* kein Eintrag mehr */ boot[array[i]].ob_spec.tedinfo->te_ptext= underlined; boot[array[i]].ob_flags=TOUCHEXIT; boot[array[i]].ob_state &= ~SELECTED; } /* Liste neu ausgeben */ if (draw) redraw_object(boot,(array==act) ? ACTWIND : INACWIND); } /***********************************************/ /* Vertikalen Slider positionieren */ /* bergabeparameter: Zeiger auf Dialogbox, */ /* Index Slider-Hintergrund,*/ /* Index Slider, Zeiger auf */ /* Slider-Position, Buffer- */ /* Deskriptor */ /* Rckgabe: keine */ /***********************************************/ VOID pos_vslider(OBJECT *tree, WORD parent, WORD slider, WORD *slider_pos, BD *bd) { WORD my,y; WORD dummy; WORD max,temp; /* Koordinaten einlesen */ graf_mkstate(&dummy,&my,&dummy,&dummy); objc_offset(tree,slider,&dummy,&y); /* je nach Mausposition entweder nach oben oder unten scrollen */ if (mynum-VISIBLE)<= (temp=*slider_pos+VISIBLE)) ? max : temp; else *slider_pos=((max=*slider_pos-VISIBLE)<0) ? 0 : max; /* Slider neu positionieren */ max=((max=bd->num-VISIBLE)<0) ? 0 : max; (*params->pos_vslider)(tree,parent,slider, *slider_pos,0,max,NIL); /* Namensliste neu ausgeben */ bd->begin=((max=bd->num-VISIBLE-*slider_pos)<0) ? 0 : max; into_resource(bd,TRUE); redraw_object(tree,parent); } /***********************************************/ /* Vertikalen Slider verschieben */ /* bergabeparameter: Zeiger auf Dialogbox, */ /* Index Slider-Hintergrund,*/ /* Index Slider, Zeiger auf */ /* Slider-Position, Buffer- */ /* Deskriptor */ /* Rckgabe: keine */ /***********************************************/ VOID move_vslider(OBJECT *tree, WORD parent, WORD slider, WORD *slider_pos, BD* bd) { WORD max; max=((max=bd->num-VISIBLE)<0) ? 0 : max; (*params->move_vslider)(tree,parent,slider,0, max,slider_pos,NIL); /* je nach Slider-Position die Namensliste neu ausgeben */ bd->begin=((max=bd->num-VISIBLE-*slider_pos)<0) ? 0 : max; into_resource(bd,TRUE); } /***********************************************/ /* Buffer-Deskriptoren initialisieren */ /* bergabeparameter: Zeiger auf beide Buffer */ /* Rckgabe: keine */ /***********************************************/ VOID init_bd(char (*act_buff)[NAME_LENGTH], char (*inact_buff)[NAME_LENGTH]) { active.buffer=act_buff; active.max_num=MAX_ACTIVE; active.begin=0; active.type=ACC; active.selected=-1; inactive.buffer=inact_buff; inactive.max_num=MAX_INACTIVE; inactive.begin=0; inactive.type=ACC; inactive.selected=-1; } /***********************************************/ /* Slider-Position und -Gre initialisieren */ /* bergabeparameter: Zeiger auf die beiden */ /* Sliderpositionen, */ /* Zeichenflag */ /* Rckgabe: keine */ /***********************************************/ VOID init_slider(WORD *slider1_pos, WORD *slider2_pos, WORD draw) { WORD max; /* Slider-Gre einstellen */ (*params->size_slider)(boot,PARENT1,SLIDER1, active.num,VISIBLE, VERTICAL,MIN_SIZE); (*params->size_slider)(boot,PARENT2,SLIDER2, inactive.num,VISIBLE, VERTICAL,MIN_SIZE); /* Slider-Position einstellen */ *slider1_pos=((max=active.num-VISIBLE)<0) ? 0 : max; (*params->pos_vslider)(boot,PARENT1,SLIDER1, *slider1_pos,0,max,NIL); *slider2_pos=((max=inactive.num-VISIBLE)<0) ? 0 : max; (*params->pos_vslider)(boot,PARENT2,SLIDER2, *slider2_pos,0,max,NIL); /* Slider neu zeichnen */ if (draw) { redraw_object(boot,PARENT1); redraw_object(boot,PARENT2); } } /***********************************************/ /* Dialogbox im Fenster zentrieren */ /* bergabeparameter: Zeiger auf Dialogbox, */ /* Koordinaten */ /* Rckgabe: indirekt ber Koordinaten */ /***********************************************/ VOID wind_center(OBJECT *tree,WORD *x,WORD *y, WORD *w,WORD *h) { tree[ROOT].ob_x=boot[ROOT].ob_x+ (boot[ROOT].ob_width- tree[ROOT].ob_width)/2; tree[ROOT].ob_y=boot[ROOT].ob_y+ (boot[ROOT].ob_height- tree[ROOT].ob_height)/2; *x=tree[ROOT].ob_x; *y=tree[ROOT].ob_y; *w=tree[ROOT].ob_width; *h=tree[ROOT].ob_height; } /***********************************************/ /* Pulldown-Men generieren, darstellen und */ /* auswerten. */ /* bergabeparameter: Zeiger auf Slider- */ /* Positionen */ /* Rckgabe: keine */ /***********************************************/ VOID pulldown(WORD *slider1_pos, WORD *slider2_pos) { WORD index,checked; GRECT button_xywh,window_xywh; char *pull_adr[2]; char pull_buff[2][15]; /* Texte des Mens in Buffer eintragen */ strcpy(pull_buff[0]," "); strcat(pull_buff[0],acc); strcat(pull_buff[0]," "); strcpy(pull_buff[1]," "); strcat(pull_buff[1],prg); strcat(pull_buff[1]," "); /* Index des abgehakten Eintrags */ index=(!strcmp(boot[TYP].ob_spec.free_string, acc) ? 0 : 1); /* absolute Button-Koordinaten berechnen */ objc_offset(boot,TYP,&button_xywh.g_x, &button_xywh.g_y); button_xywh.g_w=boot[TYP].ob_width; button_xywh.g_h=boot[TYP].ob_height; /* absolute Koordinaten der Dialogbox ermitteln */ objc_offset(boot,ROOT,&window_xywh.g_x, &window_xywh.g_y); window_xywh.g_w=boot[ROOT].ob_width; window_xywh.g_h=boot[ROOT].ob_height; /* Adressen der einzelnen Eintrge in das bergabe-Array eintragen */ pull_adr[0]=pull_buff[0]; pull_adr[1]=pull_buff[1]; /* Pull-Down-Men zeichnen lassen und Index des angeklickten Eintrags zurckliefern */ checked=(*(params->do_pulldown)) (pull_adr,2,index,IBM, &button_xywh,&window_xywh); /* wenn Eintrag angeklickt wurde... */ if (checked>=0) { /* ...dann neuer Eintrag im Button */ boot[TYP].ob_spec.free_string= ((checked==0) ? acc : prg); boot[TYP].ob_state &= ~SELECTED; redraw_object(boot,TYP); if (checked!=index) { /* je nach selektiertem Eintrag neue Konfiguration einlesen */ switch (checked) { case 0: strncpy(activate,"ACC",3); strncpy(deactivate,"ACC",3); active.type=inactive.type=ACC; read_config("*.ACC",&active); read_config("*.ACX",&inactive); break; case 1: strncpy(activate,"PRG",3); strncpy(deactivate,"PRG",3); active.type=inactive.type=PRG; read_config("*.PRG",&active); read_config("*.PRX",&inactive); break; } /* neue Konfiguration anzeigen */ boot[ACTION].ob_flags=NONE; boot[ACTION].ob_spec.tedinfo->te_ptext= empty; redraw_object(boot,ACTION); active.begin=inactive.begin=0; active.selected=inactive.selected=-1; into_resource(&active,TRUE); into_resource(&inactive,TRUE); init_slider(slider1_pos,slider2_pos,TRUE); } } } dBOOTDAS BOOT<<|@Boot-Selektor`~Z/ / o 0(gp`G'HE0(f8HRHjHjHjHjHjHjHj Hjr?BgBgt#? hNO,B@N&pN'HpCA0NfpCA?NV SBh` S"hd"(C$ S hS@fG`&J|fA`ANI2H ЀЁ T"p Q)g|f8|fA`AN\ T"hd"( Thb TBh`p TN`> T"hdg" T1|A`p TNҷf0N l9@`0Nl9@LNuBAA`4Bp gp gRA|m0NuH0 KN\OL88NuH8(H:8&I$ovjlBB`46B/ ?Bg??/ y h0NOvjSlB@`05@ JpNL8Nu/ E%H 42Bj5|5|%I5|2Bj5|5|$_NuH8&H(I8Er?Bgt??*p?r?/ j hNOp?Bgr??*t?p?/ j hNOvjlB@`06B?Bg?r?t?/ j h$NOvjlB@`08B?Bg?r?t?/ j h$NOJDgp RNp RNxLNu/ / E&R0+hHk1@&R2+hHk1A2"o 2$o4&o6&_$_NuH.O/H:/I6ECANxI2"LANCANCANTCANCANK"L U hLtNu JgJgJgJgJg JgJgJfSHggggg ggf @NugHf8g@f0g8f(g0f g(fg fgfgg!epNupNuJfpNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"SefBJgSf ANu#At000000p*`/ #3tp,al"_2"o2Nu#At0000000 0 p/`4#3tp2`"/ /pOa"_2"_2"o2"o2Nu/ 3@@A"CB@22220<"<NBAt0$_Nutt ?/?<NNAPONu?</NATO @Nu?<ONATONu/?< NA\ONu/ /??<VNAO Nu/Ka             ! "#$ %&' ()*,-.$A A       Q Q  Q  Q Q  @    Q Q  Q  Q   Q  @ @ @@ @@ @ A +     /012 3 '4   ________*.ACC*.PRGACC aktivierenACC deaktivierenAnzeige:*.ACC Aktiv Inaktiv ________ACC deaktivierenAusgang(C) 1990 by Uwe Hax & Oliver ScholzDie maximale Anzahl derverwaltbaren Dateienwurde berschritten!Sie sollten Ihre Festplattemal wieder aufrumen!Mist!*.ACX:\:\AUTO\.PRG *.PRG*.PRX X.$&R\&(d,\R.:j4Fh<Tt &. /***********************************************/ /* Datei: BOOT.H */ /* ------------------------------------------- */ /* Modul: BOOT.CPX Version 1.00 */ /* (C) 1990 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* Vom RCS aus Resource-Datei erstellte */ /* Include-Datei */ /***********************************************/ #define BOOT 0 /* TREE */ #define TYP 2 /* OBJECT in TREE #0 */ #define ACTWIND 5 /* OBJECT in TREE #0 */ #define ACTIVE1 6 /* OBJECT in TREE #0 */ #define ACTIVE3 7 /* OBJECT in TREE #0 */ #define ACTIVE2 9 /* OBJECT in TREE #0 */ #define ACTIVE4 8 /* OBJECT in TREE #0 */ #define ACTIVE5 10 /* OBJECT in TREE #0 */ #define ACT_UP 11 /* OBJECT in TREE #0 */ #define INACTIV1 13 /* OBJECT in TREE #0 */ #define INACWIND 12 /* OBJECT in TREE #0 */ #define INACTIV2 14 /* OBJECT in TREE #0 */ #define INACTIV3 15 /* OBJECT in TREE #0 */ #define INACTIV5 17 /* OBJECT in TREE #0 */ #define INACTIV4 16 /* OBJECT in TREE #0 */ #define INACT_UP 18 /* OBJECT in TREE #0 */ #define PARENT1 19 /* OBJECT in TREE #0 */ #define PARENT2 21 /* OBJECT in TREE #0 */ #define SLIDER1 20 /* OBJECT in TREE #0 */ #define SLIDER2 22 /* OBJECT in TREE #0 */ #define ACT_DOWN 23 /* OBJECT in TREE #0 */ #define ACTION 25 /* OBJECT in TREE #0 */ #define INACT_DO 24 /* OBJECT in TREE #0 */ #define QUIT 26 /* OBJECT in TREE #0 */ #define ERROR 1 /* TREE */ #define MIST 6 /* OBJECT in TREE #1 */ ;************************************************ ;* Datei: BOOT.PRJ * ;* -------------------------------------------- * ;* Modul: BOOT.CPX Version 1.00 * ;* (C) 1990 by MAXON Computer * ;* Autoren: Uwe Hax & Oliver Schulz * ;* Projektdatei fr Turbo-C 2.0 * ;************************************************ boot.prg = boot.c tcstdlib.lib tcgemlib.lib tctoslib.lib /***********************************************/ /* Datei: BOOT.RSH */ /* ------------------------------------------- */ /* Modul: BOOT.CPX Version 1.00 */ /* (C) 1990 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* Vom RCS aus Resource-Datei erstellte */ /* Include-Datei */ /***********************************************/ #define NUM_FRSTR 0 #define NUM_FRIMG 0 #define NUM_OBS 35 #define NUM_TREE 2 BYTE *rs_strings[] = { "Anzeige:","","","*.ACC"," Aktiv ","","", " Inaktiv ","","","________","","","________", "","","________","","","________","","", "________","","","________","","","________", "","","________","","","________","","", "________","","","ACC deaktivieren","","", "Ausgang", "(C) 1990 by Uwe Hax & Oliver Scholz", "","","Die maximale Anzahl der", "verwaltbaren Dateien","wurde berschritten!", "Sie sollten Ihre Festplatte", "mal wieder aufrumen!","Mist!" }; LONG rs_frstr[] = { 0 }; BITBLK rs_bitblk[] = { 0 }; LONG rs_frimg[] = { 0 }; ICONBLK rs_iconblk[] = { 0 }; TEDINFO rs_tedinfo[] = { (char *)0L, (char *)1L, (char *)2L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)4L, (char *)5L, (char *)6L, 3, 6, 2, 0x11A1, 0x0, 255, 8,1, (char *)7L, (char *)8L, (char *)9L, 3, 6, 2, 0x11A1, 0x0, 255, 10,1, (char *)10L, (char *)11L, (char *)12L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)13L, (char *)14L, (char *)15L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)16L, (char *)17L, (char *)18L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)19L, (char *)20L, (char *)21L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)22L, (char *)23L, (char *)24L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)25L, (char *)26L, (char *)27L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)28L, (char *)29L, (char *)30L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)31L, (char *)32L, (char *)33L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)34L, (char *)35L, (char *)36L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)37L, (char *)38L, (char *)39L, 3, 6, 2, 0x1180, 0x0, 255, 9,1, (char *)40L, (char *)41L, (char *)42L, 3, 6, 2, 0x1180, 0x0, 254, 17,1, (char *)44L, (char *)45L, (char *)46L, 5, 6, 0, 0x1180, 0x0, 255, 36,1 }; OBJECT rs_object[] = { -1, 1, 27, G_BOX, NONE, NORMAL, 0xFF1141L, 0,0, 32,11, 2, -1, -1, G_BOXTEXT, NONE, NORMAL, 0x0L, 2,768, 274,257, 3, -1, -1, G_BUTTON, 0x41, SHADOWED, 0x3L, 789,768, 8,1, 4, -1, -1, G_BOXTEXT, NONE, NORMAL, 0x1L, 2,2049, 525,257, 5, -1, -1, G_BOXTEXT, NONE, NORMAL, 0x2L, 1040,2049, 525,257, 11, 6, 10, G_BOX, NONE, NORMAL, 0xFF1100L, 2,2562, 1802,5, 7, -1, -1, G_TEXT, 0x51, NORMAL, 0x3L, 0,0, 1802,1, 8, -1, -1, G_TEXT, 0x51, NORMAL, 0x4L, 0,2, 1802,1, 9, -1, -1, G_TEXT, 0x51, NORMAL, 0x5L, 0,3, 1802,1, 10, -1, -1, G_TEXT, 0x51, NORMAL, 0x6L, 0,1, 1802,1, 5, -1, -1, G_TEXT, 0x51, NORMAL, 0x7L, 0,4, 1802,1, 12, -1, -1, G_BOXCHAR, TOUCHEXIT, NORMAL, 0x1FF1100L, 13,2562, 514,1, 18, 13, 17, G_BOX, NONE, NORMAL, 0xFF1100L, 1040,2562, 1802,5, 14, -1, -1, G_TEXT, 0x51, NORMAL, 0x8L, 0,0, 1802,1, 15, -1, -1, G_TEXT, 0x51, NORMAL, 0x9L, 0,1, 1802,1, 16, -1, -1, G_TEXT, 0x51, NORMAL, 0xAL, 0,2, 1802,1, 17, -1, -1, G_TEXT, 0x51, NORMAL, 0xBL, 0,3, 1802,1, 12, -1, -1, G_TEXT, 0x51, NORMAL, 0xCL, 0,4, 1802,1, 19, -1, -1, G_BOXCHAR, TOUCHEXIT, NORMAL, 0x1FF1100L, 1051,2562, 514,1, 21, 20, 20, G_BOX, TOUCHEXIT, NORMAL, 0xFF1111L, 13,2819, 514,3586, 19, -1, -1, G_BOX, TOUCHEXIT, NORMAL, 0xFF1100L, 0,0, 514,258, 23, 22, 22, G_BOX, TOUCHEXIT, NORMAL, 0xFF1111L, 1051,2819, 514,3586, 21, -1, -1, G_BOX, TOUCHEXIT, NORMAL, 0xFF1100L, 0,0, 514,258, 24, -1, -1, G_BOXCHAR, TOUCHEXIT, NORMAL, 0x2FF1100L, 13,2566, 514,1, 25, -1, -1, G_BOXCHAR, TOUCHEXIT, NORMAL, 0x2FF1100L, 1051,2566, 514,1, 26, -1, -1, G_BOXTEXT, 0x41, NORMAL, 0xDL, 2,3591, 1563,1, 27, -1, -1, G_BUTTON, 0x7, NORMAL, 0x2BL, 778,1033, 1290,1, 0, -1, -1, G_TEXT, LASTOB, NORMAL, 0xEL, 1282,2314, 1306,1536, -1, 1, 6, G_BOX, NONE, OUTLINED, 0x21100L, 0,0, 797,3848, 2, -1, -1, G_STRING, NONE, NORMAL, 0x2FL, 1538,3840, 23,1, 3, -1, -1, G_STRING, NONE, NORMAL, 0x30L, 516,3841, 21,1, 4, -1, -1, G_STRING, NONE, NORMAL, 0x31L, 1028,3842, 20,1, 5, -1, -1, G_STRING, NONE, NORMAL, 0x32L, 257,2308, 27,1, 6, -1, -1, G_STRING, NONE, NORMAL, 0x33L, 771,2309, 21,1, 0, -1, -1, G_BUTTON, 0x27, NORMAL, 0x34L, 778,1031, 8,1 }; LONG rs_trindex[] = { 0L,27L }; struct foobar { WORD dummy; WORD *image; } rs_imdope[] = { 0 }; /***********************************************/ /* Datei: XCONTROL.H Version 1.01 */ /* ------------------------------------------- */ /* (C) 1991 by MAXON Computer */ /* Autoren: Oliver Scholz & Uwe Hax */ /* Header-Datei fr die Entwicklung eigener */ /* CPX-Module */ /***********************************************/ /* Header eines CPX-Moduls --------------------*/ typedef struct { WORD magic; struct { unsigned reserved: 13; unsigned resident: 1; unsigned boot_init: 1; unsigned set_only: 1; } flags; char cpx_id[4]; WORD cpx_version; char icon_name[14]; LONG icon_data[24]; WORD icon_info; char cpx_name[18]; WORD obj_state; BYTE reserved[370]; } CPX_HEADER; /* bergabestruktur fr Maus-Ereignisse -------*/ typedef struct { WORD flags; WORD x,y,w,h; } MOUSE_EVENT; /* Ergebnisstruktur fr Maus-Ereignisse -------*/ typedef struct { WORD mx,my; WORD mbutton; WORD kbstate; } MOUSE_RET; /* Definition der Funktionen zur Ereignis- Behandlung ---------------------------------*/ typedef struct { WORD cdecl (*cpx_call)(GRECT *work); VOID cdecl (*cpx_draw)(GRECT *clip); VOID cdecl (*cpx_wmove)(GRECT *work); VOID cdecl (*cpx_timer)(WORD *event); VOID cdecl (*cpx_key)(WORD kbstate, WORD key, WORD *event); VOID cdecl (*cpx_button)(MOUSE_RET *mrets, WORD nclicks, WORD *event); VOID cdecl (*cpx_m1)(MOUSE_RET *mrets, WORD *event); VOID cdecl (*cpx_m2)(MOUSE_RET *mrets, WORD *event); WORD cdecl (*cpx_evhook)(WORD event, WORD *msgbuff, MOUSE_RET *mrets, WORD *key, WORD *nclicks); VOID cdecl (*cpx_close)(WORD app_term); } CPX_INFO; /* interne Struktur zur Verwaltung residenter CPX-Module ---------------------------------*/ typedef struct { VOID *text_start; LONG text_len; VOID *data_start; LONG data_len; VOID *bss_start; LONG bss_len; } CPX_SEGMENTS; /* interne Struktur zum Speichern der Header --*/ typedef struct cpxblock { char filename[14]; WORD ok; WORD valid; CPX_SEGMENTS *segments; struct cpxblock *next; CPX_HEADER header; } CPX_BLOCK; /* vom Kontrollfeld zur Verfgung gestellte Funktionen ---------------------------------*/ typedef struct { WORD phys_handle; WORD booting; WORD reserved; WORD rsc_init; CPX_BLOCK * cdecl (*get_rootblock)(VOID); WORD cdecl (*write_header)(CPX_BLOCK *header); VOID cdecl (*do_resource)(WORD num_obs, WORD num_frstr, WORD num_frimg, WORD num_tree, OBJECT *rs_object, TEDINFO *rs_tedinfo, BYTE *rs_strings[], ICONBLK *rs_iconblk, BITBLK *rs_bitblk, LONG *rs_frstr, LONG *rs_frimg, LONG *rs_trindex, struct foobar *rs_imdope); VOID cdecl (*objc_adjust)(OBJECT *tree, WORD ob_index); WORD cdecl (*do_pulldown)(char *entries[], WORD num_items, WORD checked_item, WORD font, GRECT *button_xywh, GRECT *window_xywh); VOID cdecl (*size_slider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD total, WORD seen, WORD v_h_flag, WORD min_size); VOID cdecl (*pos_hslider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD slider_pos, WORD start, WORD total, VOID (*function)()); VOID cdecl (*pos_vslider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD slider_pos, WORD start, WORD total, VOID (*function)()); VOID cdecl (*inc_slider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD button_index, WORD increment, WORD start, WORD total, WORD *slider_pos, WORD v_h_flag, VOID (*function)()); VOID cdecl (*move_hslider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD start, WORD total, WORD *slider_pos, VOID (*function)()); VOID cdecl (*move_vslider)(OBJECT *tree, WORD box_index, WORD slider_index, WORD start, WORD total, WORD *slider_pos, VOID (*function)()); WORD cdecl (*do_form)(OBJECT *tree, WORD start_obj, WORD *msg_buffer); GRECT * cdecl (*rci_first)(GRECT *object_xywh); GRECT * cdecl (*rci_next)(VOID); VOID cdecl (*multi)(WORD ev_flags, MOUSE_EVENT *mm1, MOUSE_EVENT *mm2, LONG timer); WORD cdecl (*alert)(WORD number); WORD cdecl (*write_config)(VOID *parameter, LONG length); BYTE * cdecl (*get_resarea)(VOID); WORD cdecl (*find_cookie)(LONG cookie, LONG *version); WORD dummy; VOID cdecl (*save_mform)(WORD dir, MFORM *buffer); } CPX_PARAMS; . U^i .. =^iDISK C ,/ !bDISK CPX r,%DISK H c/-DISK PRJ //DISK RSH /0CHD_PARK S v18I/***********************************************/ /* Datei: DISK.C */ /* ------------------------------------------- */ /* Modul: DISK.CPX Version 1.00 */ /* (C) 1990 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* verwendeter Compiler: Turbo-C 2.0 */ /***********************************************/ /* die blichen Header-Dateien --------------- */ #include #include #include #include #include #include /* Definitionen zur besseren Lesbarkeit ------ */ #define PAL 1 /* 50 Hertz */ #define NTSC 0 /* 60 Hertz */ #define VERIFY_ON 1 /* Verify-Flag */ #define VERIFY_OFF 0 #define MS_2 2 /* Steprate */ #define MS_3 3 #define MS_6 0 #define MS_12 1 #define MESSAGE -1 /* Message-Event */ #define TRUE 1 /* sonstige Def. */ #define FALSE 0 #define EOS '\0' #define OK_BUTTON 1 #define _nflops 0x4a6 /* Systemvariablen */ #define sshiftmd 0x44c #define hdv_init 0x46a #define seekrate 0x440 #define _fverify 0x444 #define palmode 0x448 #define _sysbase 0x4f2 #define sync_mode 0xffff820aL /* globale Variablen ------------------------- */ /* Deklaration der zu sichernden Variablen... */ typedef struct { WORD step_a; /* Steprate Laufwerk A */ WORD step_b; /* Steprate Laufwerk B */ WORD verify; /* Verify-Flag */ WORD frequency; /* Bildschirm-Frequenz */ BYTE controller0; /* 1. Controller-ID */ BYTE controller1; /* 2. Controller-ID */ BYTE unit0; /* 1. Harddisk-ID */ BYTE unit1; /* 2. Harddisk-ID */ } STATUS; /* ...und Definition */ STATUS status={ MS_3,MS_3,VERIFY_ON,PAL, 0,0,0,1 }; /* Die zu sichernden Variablen mssen unbedingt als erste definiert werden (=> erste Variable im Datensegment)! (Achtung vor dubiosen Header-Dateien!) ---- */ /* Resource-Datei deshalb erst hier einladen */ #include "disk.rsh" #include "disk.h" #include "xcontrol.h" /* darf erst nach "*.rsh" eingebunden werden */ /* sonstige globale Variablen ---------------- */ CPX_PARAMS *params; /* vom Kontrollfeld ber- gebener Zeiger auf die Kontrollfeld-Funktionen */ char ms2[]="2 ms"; /* Strings fr Dialogbox */ char ms3[]="3 ms"; char ms6[]="6 ms"; char ms12[]="12 ms"; char hz50[]="50 Hz"; char hz60[]="60 Hz"; char ein[]="Ein"; char aus[]="Aus"; char empty[]=" "; OBJECT *disk; /* Zeiger auf Dialogboxen */ OBJECT *sure; OBJECT *switchoff; OBJECT *error; /* Prototypen fr Turbo-C -------------------- */ VOID get_id(STATUS *work); OBJECT *get_traddr(WORD tree_index); VOID get_values(STATUS *work); UWORD get_version(VOID); CPX_INFO * cdecl init(CPX_PARAMS *params); WORD hd_park(BYTE controller, BYTE unit); VOID into_resource(STATUS *work); WORD cdecl main(GRECT *curr_wind); VOID pulldown(WORD button, STATUS *work); VOID redraw_object(OBJECT *tree, WORD object); VOID set_id(STATUS *work); WORD set_step(WORD drive, WORD step); WORD set_verify(WORD verify); WORD set_frequency(WORD frequency); VOID set_values(STATUS status, STATUS work); WORD switch_off(VOID); VOID wind_center(OBJECT *tree, WORD *x, WORD *y, WORD *w, WORD *h); /* Funktionen -------------------------------- */ /***********************************************/ /* Initialisierung des Moduls: */ /* bergabeparameter: Zeiger auf die zur */ /* Verfgung stehenden Funktionen */ /* 1. Aufruf bei Laden des Headers */ /* (par->booting == TRUE) */ /* Rckgabe: 0 bei Set-Only, 1 sonst */ /* 2. Aufruf bei Laden des eigentlichen */ /* Programms (par->booting == FALSE) */ /* Rckgabe: Adresse der CPX_INFO-Struktur */ /***********************************************/ CPX_INFO * cdecl init(CPX_PARAMS *par) { char vdo[5]="_VDO"; LONG version; static CPX_INFO info={ main,0L,0L,0L,0L,0L, 0L,0L,0L,0L }; if (par->booting) /* bei Laden des Headers */ { /* alle Parameter setzen */ set_step(0,status.step_a); set_step(1,status.step_b); set_verify(status.verify); /* keine Frequenz auf dem TT setzen! */ if (!(*par->find_cookie)(*(LONG *)vdo,&version)) version=0L; if (version<0x00020000L) set_frequency(status.frequency); return((CPX_INFO *)1L); /* weitermachen */ } else /* Aufruf bei Laden des Programms */ { /* => Lschen aller globalen Variablen! */ params=par; /* Zeiger retten! */ /* Resource relozieren */ if (!params->rsc_init) { (*(params->do_resource))(NUM_OBS,NUM_FRSTR, NUM_FRIMG,NUM_TREE,rs_object,rs_tedinfo, rs_strings,rs_iconblk,rs_bitblk,rs_frstr, rs_frimg,rs_trindex,rs_imdope); /* globale Variablen initialisieren */ disk=get_traddr(DISK); sure=get_traddr(SURE); switchoff=get_traddr(SWITCHOF); error=get_traddr(ERROR); /* Harddisk-ID's in die Dialogbox eintragen */ set_id(&status); } /* Adresse der CPX_INFO-Struktur zurck */ return(&info); } } /***********************************************/ /* Aufruf nach Doppelclick auf das Icon im */ /* Auswahlfenster: Zeichnen der Dialogbox, */ /* Behandlung der Buttons */ /* bergabeparameter: Koordinaten des Fenster- */ /* arbeitsbereichs */ /* Rckgabe: FALSE, wenn der Dialog mittels */ /* do_form() abgearbeitet wird, */ /* TRUE, falls eigene Event-Routinen */ /* benutzt werden sollen */ /***********************************************/ WORD cdecl main(GRECT *curr_wind) { STATUS work; WORD msg_buff[8]; WORD button; WORD abort_flag=FALSE; /* aktuelle Systemparameter einlesen */ get_values(&status); work=status; /* Koordinaten der Dialogbox setzen */ disk[ROOT].ob_x=curr_wind->g_x; disk[ROOT].ob_y=curr_wind->g_y; /* Systemparameter in Dialogbox eintragen */ into_resource(&work); /* und Dialogbox zeichnen */ objc_draw(disk,ROOT,MAX_DEPTH,disk[ROOT].ob_x, disk[ROOT].ob_y,disk[ROOT].ob_width, disk[ROOT].ob_height); /* Dialogbox abarbeiten, bis ein Exit-Objekt angeklickt wurde */ do { /* neuer form_do()-Aufruf */ button=(*params->do_form)(disk,UNIT0, msg_buff); /* Doppelklick ausmaskieren */ if (button>=0) button &= 0x7fff; /* angeklicktes Objekt auswerten */ switch (button) { case SAVE: /* Parameter in CPX-Datei speichern */ get_id(&work); if ((*params->alert)(0)==OK_BUTTON) (*params->write_config)(&work, sizeof(STATUS)); disk[SAVE].ob_state &= ~SELECTED; redraw_object(disk,ROOT); break; case OK: /* Harddisk parken? */ if (!switch_off()) disk[OK].ob_state &= ~SELECTED; else { /* neue Parameter bernehmen */ set_values(status,work); /* fr "resident" notwendig */ get_id(&work); status=work; abort_flag=TRUE; } break; case CANCEL: abort_flag=TRUE; break; case VERIFY: case FREQ: case STEPA: case STEPB: pulldown(button,&work); break; case MESSAGE: switch (msg_buff[0]) { case WM_REDRAW: break; /* nicht notwendig */ case WM_CLOSED: set_values(status,work); /* fr "resident" notwendig */ get_id(&work); status=work; case AC_CLOSE: abort_flag=TRUE; break; } break; } } while (!abort_flag); disk[button].ob_state &= ~SELECTED; return(FALSE); } /***********************************************/ /* Parameter in die Dialogbox eintragen */ /* bergabeparameter: Zeiger auf Status */ /* Rckgabe: keine */ /***********************************************/ VOID into_resource(STATUS *status) { LONG ssp; WORD drives; char cpu[5]="_CPU"; char vdo[5]="_VDO"; LONG version=0L; char *ms[4]={ ms2,ms3,ms6,ms12 }; WORD MS[4]={ MS_2,MS_3,MS_6,MS_12 }; WORD i; /* Stepraten eintragen */ for (i=0; i<4; i++) { if (status->step_a==MS[i]) disk[STEPA].ob_spec.free_string=ms[i]; if (status->step_b==MS[i]) disk[STEPB].ob_spec.free_string=ms[i]; } /* Verify-Flag eintragen */ disk[VERIFY].ob_spec.free_string= (status->verify==VERIFY_ON) ? ein : aus; /* Frequenz eintragen */ disk[FREQ].ob_spec.free_string= (status->frequency==PAL) ? hz50 : hz60; /* alle Buttons initialisieren */ disk[STEPA].ob_state |= DISABLED; disk[STEPA].ob_flags &= ~TOUCHEXIT; disk[STEPB].ob_state |= DISABLED; disk[STEPB].ob_flags &= ~TOUCHEXIT; disk[VERIFY].ob_state &= ~DISABLED; disk[VERIFY].ob_flags |= TOUCHEXIT; /* Anzahl der angeschlossenen Laufwerke ermitteln */ ssp=Super((VOID *)0L); drives=*(WORD *)_nflops; Super((VOID *)ssp); /* Buttons abhngig von der Anzahl der Diskettenlaufwerke (de)aktivieren */ switch (drives) { case 2: disk[STEPB].ob_state &= ~DISABLED; disk[STEPB].ob_flags |= TOUCHEXIT; case 1: disk[STEPA].ob_state &= ~DISABLED; disk[STEPA].ob_flags |= TOUCHEXIT; break; case 0: disk[VERIFY].ob_state |= DISABLED; disk[VERIFY].ob_flags &= ~TOUCHEXIT; break; } /* Frequenz nur im Farbmodus und nicht auf dem TT verfgbar */ if (!(*params->find_cookie)(*(LONG *)vdo,&version)) version=0L; ssp=Super((VOID *)0L); if ((*(BYTE *)sshiftmd==2) || (version>=0x00020000L)) { disk[FREQ].ob_state |= DISABLED; disk[FREQ].ob_flags &= ~TOUCHEXIT; } else { disk[FREQ].ob_state &= ~DISABLED; disk[FREQ].ob_flags |= TOUCHEXIT; } Super((VOID *)ssp); /* CPU-Typ im Cookie-Jar suchen */ if (!(*params->find_cookie)(*(LONG *)cpu,&version)) version=0L; disk[CPU].ob_spec.tedinfo->te_ptext[11]= (char)(version/10+'0'); } /***********************************************/ /* Neuzeichnen eines Objekts mit Hilfe der vom */ /* Kontrollfeld gelieferten Rechteck-Liste. */ /* bergabeparameter: Zeiger auf Objektbaum, */ /* Objekt-Index */ /* Rckgabe: keine */ /***********************************************/ VOID redraw_object(OBJECT *tree, WORD object) { GRECT *clip_ptr,clip,xywh; /* absolute Objekt-Koordinaten berechnen */ objc_offset(tree,object,&xywh.g_x,&xywh.g_y); xywh.g_w=tree[object].ob_width; xywh.g_h=tree[object].ob_height; /* erstes Rechteck holen */ clip_ptr=(*params->rci_first)(&xywh); /* solange noch Rechtecke da sind */ while (clip_ptr) { /* clip_ptr: Zeiger auf lokale Variable!! */ clip=*clip_ptr; /* deshalb kopieren */ /* Objekt neu zeichnen */ objc_draw(tree,object,MAX_DEPTH,clip.g_x, clip.g_y,clip.g_w,clip.g_h); /* nchstes Rechteck holen */ clip_ptr=(*params->rci_next)(); } } /***********************************************/ /* Pulldown-Men generieren, darstellen und */ /* auswerten. */ /* bergabeparameter: angeklickter Button, aus */ /* dem das Men "heraus- */ /* klappen" soll, */ /* Zeiger auf aktuelle */ /* Parameter */ /* Rckgabe: keine */ /***********************************************/ VOID pulldown(WORD button, STATUS *work) { WORD i; WORD num_items; WORD index,checked; WORD step; GRECT button_xywh,window_xywh; char *pull_adr[4]; char pull_buff[4][15]; WORD ms[]={ MS_2,MS_3,MS_6,MS_12 }; /* je nach Button entsprechendes Pull-Down- Men generieren */ switch (button) { case STEPA: case STEPB: /* Texte eintragen; alle Eintrge gleich lang machen */ for (i=0; i<4; i++) strcpy(pull_buff[i],empty); strcat(pull_buff[0],ms2); strcat(pull_buff[1],ms3); strcat(pull_buff[2],ms6); strcat(pull_buff[3],ms12); for (i=0; i<4; i++) strcat(pull_buff[i],empty); pull_buff[3][10]=EOS; /* Anzahl der Eintrge */ num_items=4; /* Umrechnung von Steprate in Index */ step=((button==STEPA) ? work->step_a : work->step_b); for (i=0; i<4; i++) if (ms[i]==step) break; /* Index abgehakter Eintrag */ index=i; break; case VERIFY: /* wie oben */ strcpy(pull_buff[0],empty); strcat(pull_buff[0],ein); strcat(pull_buff[0],empty); strcpy(pull_buff[1],empty); strcat(pull_buff[1],aus); strcat(pull_buff[1],empty); pull_buff[0][8]=pull_buff[1][8]=EOS; num_items=2; index=((work->verify==VERIFY_ON) ? 0 : 1); break; case FREQ: /* wie oben */ strcpy(pull_buff[0],empty); strcat(pull_buff[0],hz50); strcat(pull_buff[0],empty); strcpy(pull_buff[1],empty); strcat(pull_buff[1],hz60); strcat(pull_buff[1],empty); pull_buff[0][10]=pull_buff[1][10]=EOS; num_items=2; index=((work->frequency==PAL) ? 0 : 1); break; } /* absolute Button-Koordinaten berechnen */ objc_offset(disk,button,&button_xywh.g_x, &button_xywh.g_y); button_xywh.g_w=disk[button].ob_width; button_xywh.g_h=disk[button].ob_height; /* absolute Koordinaten der Dialogbox ermitteln */ objc_offset(disk,ROOT,&window_xywh.g_x, &window_xywh.g_y); window_xywh.g_w=disk[ROOT].ob_width; window_xywh.g_h=disk[ROOT].ob_height; /* Adressen der einzelnen Eintrge in das bergabe-Array eintragen */ for(i=0; ido_pulldown) (pull_adr,num_items,index,IBM, &button_xywh,&window_xywh); /* wenn Eintrag angeklickt wurde... */ if (checked>=0) { /* ...dann entsprechend reagieren */ switch (button) { case STEPA: work->step_a=ms[checked]; if (get_version()<0x104) { work->step_b=ms[checked]; into_resource(work); redraw_object(disk,STEPB); } break; case STEPB: work->step_b=ms[checked]; if (get_version()<0x104) { work->step_a=ms[checked]; into_resource(work); redraw_object(disk,STEPA); } break; case VERIFY: work->verify=((checked==0) ? VERIFY_ON : VERIFY_OFF); break; case FREQ: work->frequency=((checked==0) ? PAL : NTSC); break; } /* neue Werte in die Dialogbox eintragen */ into_resource(work); } /* Button neu zeichnen */ disk[button].ob_state &= ~SELECTED; redraw_object(disk,button); } /***********************************************/ /* Dialogbox im Fenster zentrieren */ /* bergabeparameter: Zeiger auf Dialogbox, */ /* Koordinaten */ /* Rckgabe: indirekt ber Koordinaten */ /***********************************************/ VOID wind_center(OBJECT *tree,WORD *x,WORD *y, WORD *w,WORD *h) { tree[ROOT].ob_x=disk[ROOT].ob_x+ (disk[ROOT].ob_width- tree[ROOT].ob_width)/2; tree[ROOT].ob_y=disk[ROOT].ob_y+ (disk[ROOT].ob_height- tree[ROOT].ob_height)/2; *x=tree[ROOT].ob_x; *y=tree[ROOT].ob_y; *w=tree[ROOT].ob_width; *h=tree[ROOT].ob_height; } /***********************************************/ /* Liefert Adresse einer Dialogbox */ /* (neue rsrc_gaddr()-Routine) */ /* bergabeparamter: Baum-Index */ /* Rckgabe: Zeiger auf Dialogbox */ /***********************************************/ OBJECT *get_traddr(WORD tree_index) { WORD i,j; for (i=0,j=0; i<=tree_index; i++) while (rs_object[j++].ob_next!=-1); return(&rs_object[--j]); } /***********************************************/ /* Auslesen der Systemparameter */ /* bergabeparameter: Zeiger auf Status */ /* Rckgabe: Systempar. indirekt ber Status */ /***********************************************/ VOID get_values(STATUS *work) { work->step_a=set_step(0,-1); work->step_b=set_step(1,-1); work->verify=set_verify(-1); work->frequency=set_frequency(-1); } /***********************************************/ /* Harddisk-ID's aus der Dialogbox auslesen */ /* bergabeparameter: Zeiger auf Status */ /* Rckgabe: Harddisk-IDs indirekt ber Status */ /***********************************************/ VOID get_id(STATUS *work) { work->controller0= disk[UNIT0].ob_spec.tedinfo->te_ptext[0]-'0'; work->controller1= disk[UNIT1].ob_spec.tedinfo->te_ptext[0]-'0'; work->unit0= disk[UNIT0].ob_spec.tedinfo->te_ptext[1]-'0'; work->unit1= disk[UNIT1].ob_spec.tedinfo->te_ptext[1]-'0'; } /***********************************************/ /* Ermitteln der Betriebssystem-Version */ /* bergabeparameter: keine */ /* Rckgabe: Tos-Version */ /***********************************************/ UWORD get_version(VOID) { LONG ssp; SYSHDR **syshdr=(SYSHDR **)_sysbase; UWORD version; ssp=Super((VOID *)0L); version=(*syshdr)->os_version; Super((VOID *)ssp); return(version); } /***********************************************/ /* Neusetzen der vernderten Parameter */ /* bergabeparameter: Zeiger auf Status vor */ /* und nach dem Dialog */ /* Rckgabe: keine */ /***********************************************/ VOID set_values(STATUS status, STATUS work) { if (status.step_a!=work.step_a) set_step(0,work.step_a); if (status.step_b!=work.step_b) set_step(1,work.step_b); if (status.verify!=work.verify) set_verify(work.verify); if (status.frequency!=work.frequency) set_frequency(work.frequency); } /***********************************************/ /* Harddisk-ID's in die Dialogbox eintragen */ /* bergabeparameter: Zeiger auf Status */ /* Rckgabe: keine */ /***********************************************/ VOID set_id(STATUS *work) { disk[UNIT0].ob_spec.tedinfo->te_ptext[0]= work->controller0+'0'; disk[UNIT1].ob_spec.tedinfo->te_ptext[0]= work->controller1+'0'; disk[UNIT0].ob_spec.tedinfo->te_ptext[1]= work->unit0+'0'; disk[UNIT1].ob_spec.tedinfo->te_ptext[1]= work->unit1+'0'; } /***********************************************/ /* Setzen und Ermitteln der Steprate */ /* bergabeparameter: Laufwerksnummer, */ /* Steprate oder -1 */ /* Rckgabe: (alte) Steprate */ /***********************************************/ WORD set_step(WORD drive,WORD step) { LONG ssp; WORD step_rate; VOID (**hdv)(VOID)=(VOID *)hdv_init; if (get_version()<0x104) if (step>=0) { ssp=Super((VOID *)0L); step_rate=*(WORD *)seekrate; *(WORD *)seekrate=step; (*hdv)(); Super((VOID *)ssp); Getbpb(drive); /* Nachlaufen verhindern */ } else { ssp=Super((VOID *)0L); step_rate=*(WORD *)seekrate; Super((VOID *)ssp); } else step_rate=Floprate(drive,step); return(step_rate); } /***********************************************/ /* Setzen und Ermitteln des Verify-Flags */ /* bergabeparameter: neue Einstellung oder -1 */ /* Rckgabe: (altes) Verify-Flag */ /***********************************************/ WORD set_verify(WORD verify) { WORD old_verify; LONG ssp; ssp=Super((VOID *)0L); old_verify=*(WORD *)_fverify; if (verify>=0) *(WORD *)_fverify=verify; Super((VOID *)ssp); return(old_verify); } /***********************************************/ /* Setzen und Ermitteln der Bild-Frequenz */ /* bergabeparameter: neue Einstellung oder -1 */ /* Rckgabe: (alte) Frequenz */ /***********************************************/ WORD set_frequency(WORD frequency) { WORD old_frequency; LONG ssp; ssp=Super((VOID *)0L); old_frequency=*(WORD *)palmode; /* bei TT Setzen nicht mglich! */ if (frequency>=0) { frequency &= 1; *(WORD *)palmode=frequency; *(BYTE *)sync_mode=(BYTE)frequency<<1; } Super((VOID *)ssp); return(old_frequency); } /***********************************************/ /* Parken der Festplatte und nach Parken */ /* zum Abschalten auffordern. */ /* bergabeparameter: keine */ /* Rckgabe: Erfolg/Mierfolg */ /***********************************************/ WORD switch_off(VOID) { WORD x,y,w,h; WORD button; WORD ret1=-1; WORD ret2=-1; STATUS work; /* Harddisk parken? */ if ((disk[UNIT0].ob_state & SELECTED) || (disk[UNIT1].ob_state & SELECTED)) { /* ja, ID's auslesen */ get_id(&work); /* Alertbox zeichen */ wind_center(sure,&x,&y,&w,&h); form_dial(FMD_START,0,0,0,0,x-3,y-3,w+6,h+6); objc_draw(sure,ROOT,MAX_DEPTH, x-3,y-3,w+6,h+6); button=form_do(sure,0); form_dial(FMD_FINISH,0,0,0,0, x-3,y-3,w+6,h+6); sure[button].ob_state &= ~SELECTED; /* angeklickten Button auswerten */ switch (button) { case SUREOK: /* gewhlte Harddisk(s) parken, sofern ID's innerhalb des Bereiches */ if (disk[UNIT0].ob_state & SELECTED) if ((work.controller0>=0) && (work.controller0<=7) && (work.unit0>=0) && (work.unit0<=7)) ret1=hd_park(work.controller0, work.unit0); if (disk[UNIT1].ob_state & SELECTED) if ((work.controller1>=0) && (work.controller1<=7) && (work.unit1>=0) && (work.unit1<=7)) ret2=hd_park(work.controller1, work.unit1); /* Parken bei mind. einer Harddisk gelungen? */ if (!ret1 || !ret2) { /* Aufforderung zum Abschalten */ form_center(switchoff,&x,&y,&w,&h); form_dial(FMD_START,0,0,0,0,x,y,w,h); objc_draw(switchoff,ROOT, MAX_DEPTH,x,y,w,h); while (TRUE); } else { /* Fehlermeldung ausgeben */ wind_center(error,&x,&y,&w,&h); objc_draw(error,ROOT,MAX_DEPTH, x-3,y-3,w+6,h+6); form_do(error,0); error[MIST].ob_state &= ~SELECTED; } break; case SURECANC: sure[SURECANC].ob_state &= ~SELECTED; break; } disk[UNIT0].ob_state &= ~SELECTED; disk[UNIT1].ob_state &= ~SELECTED; return(FALSE); } else return(TRUE); } dDISKUTILITIES@4 4 4 4 4         @Disk-Utilities` `DH8O$oGAC0*gB2B@N z2+pN p0+N HW// jPNPOJ@fB l0+N p`|I(0*fhHkvHkfHkHkHkHkHk HkHkr?BgBgt(? jNO,B@Nb)HpNX)HpNN)H pND)H KNzA O LNuH0|g|g.`.A / / / A / / / NO KNN K"J"""vJCg2H ЀЁ Tp B@OL<NuH8OCEG"EGBGE(KpQEIB@E`424Bw f 2I(R)s2(4Bw f 2I(R)sR@|m hfG`G(R)K hfI`I&R'L Rh Rh Rh Rh Rh Rh@N &88 CN 0J@g,S@gS@g`2 Rh Rh@ Rh Rh@` Rh RhHo// j hPNPOJ@fBN & 8Lg m Rh Rh` Rh Rh@ CN NHo//& j hPNPOJ@fB /r N <0 R"h<&Q@ O(LNuH3Nq(<HB#Nqakt(<HC#NqakZ#NqazkJ#Nqajk:#NqaZk*# Nqa/?< NA\0LNuH B@"< `H B@rҸ9g fp:J@LNu JgJgJgJgJg JgJgJfSHggggg ggf @Nu g<g8g4g0g,g(g$g ggggg ggf @Nu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu#*A000000p*`/ #*3p,av"_2"o2Nu#*3p2`X#*A0000000 0 0p3`(/ #*p6a"_2"o2"o2"o 2Nu/ 3@@A"CB@22220<"<NBA0$_Nu0*!* /?< NA\ONu/ ??<NMXO @$_Nu???<)NN\Nu *03;C]v03 @GOOOO癟O灇O灇O癟O癁O癁OOOOOOOOOOOG@ ?000?0 2@0UUUQT@ <0<<?3<3333c33<?<<0< * $  A     A A         A           A     %(       !"#$'%&'' %J2 ms3 ms6 ms12 ms50 Hz60 HzEinAus _VDO_CPU_VDO %*/(C) 1990 by Uwe Hax & Oliver ScholzCPU ist 68000Steprate:3 msDrive ADrive BVerifyEinACSI-Disk parken:Unit __9901Frequenz:50 HzOkAbbruchSichernDie Harddisk ist geparkt.Bitte schalten Sie jetztIhren Rechner aus!Sind Sie sicher?Alle laufenden Programmewerden beim Parken derHarddisk abgebrochen!Parken fehlgeschlagen!Mist!`bX`~P`l0  ,& 62/***********************************************/ /* Datei: DISK.H */ /* ------------------------------------------- */ /* Modul: DISK.CPX Version 1.00 */ /* (C) 1990 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* Vom RCS aus Resource-Datei erstellte */ /* Include-Datei */ /***********************************************/ #define DISK 0 /* TREE */ #define CPU 2 /* OBJECT in TREE #0 */ #define STEPB 6 /* OBJECT in TREE #0 */ #define STEPA 5 /* OBJECT in TREE #0 */ #define VERIFY 11 /* OBJECT in TREE #0 */ #define UNIT0 14 /* OBJECT in TREE #0 */ #define UNIT1 15 /* OBJECT in TREE #0 */ #define FREQ 18 /* OBJECT in TREE #0 */ #define OK 20 /* OBJECT in TREE #0 */ #define CANCEL 21 /* OBJECT in TREE #0 */ #define SAVE 23 /* OBJECT in TREE #0 */ #define SWITCHOF 1 /* TREE */ #define SURE 2 /* TREE */ #define SUREOK 6 /* OBJECT in TREE #2 */ #define SURECANC 7 /* OBJECT in TREE #2 */ #define ERROR 3 /* TREE */ #define MIST 2 /* OBJECT in TREE #3 */ ;************************************************ ;* Datei: DISK.PRJ * ;* -------------------------------------------- * ;* Modul: DISK.CPX Version 1.00 * ;* (C) 1990 by MAXON Computer * ;* Autoren: Uwe Hax & Oliver Scholz * ;* Projektdatei fr Turbo-C 2.0 * ;************************************************ disk.prg = disk.c hd_park.s tcstdlib.lib tcgemlib.lib tctoslib.lib /***********************************************/ /* Datei: DISK.RSH */ /* ------------------------------------------- */ /* Modul: DISK.CPX Version 1.00 */ /* (C) 1990 by MAXON Computer */ /* Autoren: Uwe Hax & Oliver Scholz */ /* Vom RCS aus Resource-Datei erstellte */ /* Include-Datei */ /***********************************************/ #define NUM_FRSTR 0 #define NUM_FRIMG 0 #define NUM_OBS 40 #define NUM_TREE 4 BYTE *rs_strings[] = { "(C) 1990 by Uwe Hax & Oliver Scholz", "","","CPU ist 68000","","","Steprate:","3 ms", "3 ms","Drive A","","","Drive B","","", "Verify","Ein","ACSI-Disk parken:","00", "Unit __","99","01","Unit __","99","Frequenz:", "50 Hz","Ok","Abbruch","Sichern", "Die Harddisk ist geparkt.", "Bitte schalten Sie jetzt", "Ihren Rechner aus!","Sind Sie sicher?", "Alle laufenden Programme", "werden beim Parken der", "Harddisk abgebrochen!","Ok","Abbruch", "Parken fehlgeschlagen!","Mist!" }; WORD IMAG0[] = { 0x001F, 0xFFFF, 0xFFF8, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x0000, 0x0000, 0x0047, 0xFFFF, 0xFFE2, 0x0000, 0x0000, 0x004F, 0xFFFF, 0xFFF2, 0x0000, 0x0000, 0x004F, 0x8199, 0x81F2, 0x0000, 0x0000, 0x004F, 0x8199, 0x81F2, 0x0000, 0x0000, 0x004F, 0xE799, 0x9FF2, 0x0000, 0x0000, 0x004F, 0xE781, 0x87F2, 0x0000, 0x0000, 0x004F, 0xE781, 0x87F2, 0x0000, 0x0000, 0x004F, 0xE799, 0x9FF2, 0x0000, 0x0000, 0x004F, 0xE799, 0x81F2, 0x0000, 0x0000, 0x004F, 0xE799, 0x81F2, 0x0000, 0x0000, 0x004F, 0xFFFF, 0xFFF2, 0x0000, 0x0000, 0x004F, 0xFFFF, 0xFFF2, 0x0000, 0x0000, 0x004F, 0x8199, 0x83F2, 0x0000, 0x0000, 0x004F, 0x8189, 0x81F2, 0x0000, 0x0000, 0x004F, 0x9F81, 0x99F2, 0x0000, 0x0000, 0x004F, 0x8781, 0x99F2, 0x0000, 0x0000, 0x004F, 0x8791, 0x99F2, 0x0000, 0x0000, 0x004F, 0x9F99, 0x99F2, 0x0000, 0x0000, 0x004F, 0x8199, 0x81F2, 0x0000, 0x0000, 0x004F, 0x8199, 0x83F2, 0x0000, 0x0000, 0x004F, 0xFFFF, 0xFFF2, 0x0000, 0x0000, 0x0047, 0xFFFF, 0xFFE2, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0000, 0x0000, 0x001F, 0xFFFF, 0xFFF8, 0x0000, 0x0000, 0x0000, 0x3FFF, 0xFC00, 0x0000, 0x0000, 0x001F, 0xFFFF, 0xFFFB, 0xFFFC, 0x0000, 0x0030, 0x0000, 0x000E, 0x0006, 0x0000, 0x0030, 0x0000, 0x0F8E, 0x0006, 0x0000, 0x0030, 0x0000, 0x3FEE, 0x0006, 0x0000, 0x0030, 0x0000, 0x0F8E, 0x2006, 0x0000, 0x0032, 0xAA00, 0x000E, 0x4006, 0x0000, 0x0030, 0x0000, 0x000E, 0x0006, 0x0000, 0x007F, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x008A, 0xAAAA, 0xAAA2, 0xA2A8, 0x8000, 0x0115, 0x5555, 0x55D1, 0x5154, 0x4000, 0x020A, 0xFFFF, 0xFEA0, 0x00FA, 0x2000, 0x0400, 0x0000, 0x0000, 0x0000, 0x1000, 0x07FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF800 }; WORD IMAG1[] = { 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0xF000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x3C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0F00, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03C0, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x30F0, 0x0000, 0xC000, 0x0000, 0x0000, 0x0000, 0x3C3C, 0x0000, 0xC000, 0x0000, 0x0000, 0x0000, 0x3F0F, 0x0000, 0xCFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC3, 0xC000, 0xCFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFF0, 0xF000, 0xCFE1, 0xCCC0, 0xFCF3, 0x8733, 0xFFFC, 0x3C00, 0xCFC0, 0xC4C0, 0xFCF3, 0x0333, 0xFFFF, 0x0F00, 0xCFCC, 0xC0CF, 0xFCF3, 0x3333, 0xFFFF, 0xC3C0, 0xCFCC, 0xC0C3, 0xFC93, 0x0303, 0xFFFF, 0xF0F0, 0xCFCC, 0xC8C3, 0xFC03, 0x0387, 0xFFFF, 0xF0F0, 0xCFCC, 0xCCCF, 0xFC03, 0x33CF, 0xFFFF, 0xC3C0, 0xCFC0, 0xCCC0, 0xFC63, 0x33CF, 0xFFFF, 0x0F00, 0xCFE1, 0xCCC0, 0xFCF3, 0x33CF, 0xFFFC, 0x3C00, 0xCFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFF0, 0xF000, 0xCFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC3, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x3F0F, 0x0000, 0xC000, 0x0000, 0x0000, 0x0000, 0x3C3C, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x30F0, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0F00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x3C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0xF000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0000, 0x0000 }; LONG rs_frstr[] = { 0 }; BITBLK rs_bitblk[] = { (WORD *)0L, 10, 42, 0, 0, 1, (WORD *)1L, 12, 30, 0, 0, 1 }; LONG rs_frimg[] = { 0 }; ICONBLK rs_iconblk[] = { 0 }; TEDINFO rs_tedinfo[] = { (char *)0L, (char *)1L, (char *)2L, 5, 6, 0, 0x1180, 0x0, 255, 36,1, (char *)3L, (char *)4L, (char *)5L, 3, 6, 2, 0x1180, 0x0, 255, 14,1, (char *)9L, (char *)10L, (char *)11L, 5, 6, 0, 0x1180, 0x0, 255, 8,1, (char *)12L, (char *)13L, (char *)14L, 5, 6, 0, 0x1180, 0x0, 255, 8,1, (char *)18L, (char *)19L, (char *)20L, 3, 6, 2, 0x1180, 0x0, -1, 3,8, (char *)21L, (char *)22L, (char *)23L, 3, 6, 2, 0x1180, 0x0, -1, 3,8 }; OBJECT rs_object[] = { -1, 1, 19, G_BOX, NONE, NORMAL, 0xFF1141L, 0,0,32,11, 2, -1, -1, G_TEXT, NONE, NORMAL, 0x0L, 1282,0, 1306,2560, 3, -1, -1, G_BOXTEXT, NONE, NORMAL, 0x1L, 1280,2816, 1310,513, 9, 4, 8, G_BOX, NONE, NORMAL, 0xFF1100L, 1280,2, 531,1539, 5, -1, -1, G_STRING, NONE, NORMAL, 0x6L, 517,768, 9,1, 6, -1, -1, G_BUTTON, 0x41, SHADOWED, 0x7L, 1,2049, 8,1, 7, -1, -1, G_BUTTON, 0x41, SHADOWED, 0x8L, 1801,2049, 8,1, 8, -1, -1, G_TEXT, NONE, NORMAL, 0x2L, 770,3074, 1029,2560, 3, -1, -1, G_TEXT, NONE, NORMAL, 0x3L, 523,2818, 773,2304, 12, 10, 11, G_BOX, NONE, NORMAL, 0xFF1100L, 532,2, 11,1539, 11, -1, -1, G_STRING, NONE, NORMAL, 0xFL, 770,768, 7,1, 9, -1, -1, G_BUTTON, 0x41, SHADOWED, 0x10L, 1281,2049, 8,1, 16, 13, 15, G_BOX, NONE, NORMAL, 0xFF1100L, 1280,2309, 531,1283, 14, -1, -1, G_STRING, NONE, NORMAL, 0x11L, 257,1280, 1041,769, 15, -1, -1, G_FBOXTEXT, 0x9, NORMAL, 0x4L, 1792,3073, 8,513, 12, -1, -1, G_FBOXTEXT, 0x9, NORMAL, 0x5L, 1801,3073, 8,513, 19, 17, 18, G_BOX, NONE, NORMAL, 0xFF1100L, 532,2309, 11,1283, 18, -1, -1, G_STRING, NONE, NORMAL, 0x18L, 1,1280, 9,1, 16, -1, -1, G_BUTTON, 0x41, SHADOWED, 0x19L, 1025,3073, 8,1, 0, 20, 22, G_BOX, NONE, NORMAL, 0xFF1100L, 0,777, 32,3329, 21, -1, -1, G_BUTTON, 0x7, NORMAL, 0x1AL, 1548,1792, 8,1, 22, -1, -1, G_BUTTON, 0x5, NORMAL, 0x1BL, 1046,1792, 8,1, 19, 23, 23, G_BOX, NONE, NORMAL, 0xFF1100L, 0,0, 523,3329, 22, -1, -1, G_BUTTON, 0x25, NORMAL, 0x1CL, 769,1536, 1032,513, -1, 1, 4, G_BOX, NONE, OUTLINED, 0x21100L, 0,0, 40,5, 2, -1, -1, G_STRING, NONE, NORMAL, 0x1DL, 12,1, 25,1, 3, -1, -1, G_IMAGE, NONE, NORMAL, 0x0L, 513,1025, 10,2562, 4, -1, -1, G_STRING, NONE, NORMAL, 0x1EL, 12,2, 25,1, 0, -1, -1, G_STRING, LASTOB, NORMAL, 0x1FL, 15,3, 19,1, -1, 1, 7, G_BOX, NONE, OUTLINED, 0x21100L, 0,0, 30,10, 2, -1, -1, G_IMAGE, NONE, NORMAL, 0x1L, 9,2304, 12,3585, 3, -1, -1, G_STRING, NONE, NORMAL, 0x20L, 7,515, 16,1, 4, -1, -1, G_STRING, NONE, NORMAL, 0x21L, 3,772, 536,1, 5, -1, -1, G_STRING, NONE, NORMAL, 0x22L, 260,1029, 22,1, 6, -1, -1, G_STRING, NONE, NORMAL, 0x23L, 772,1286, 277,257, 7, -1, -1, G_BUTTON, 0x5, NORMAL, 0x24L, 1797,776, 8,1, 0, -1, -1, G_BUTTON, 0x27, NORMAL, 0x25L, 16,776, 8,1, -1, 1, 2, G_BOX, NONE, OUTLINED, 0x21100L, 0,0, 28,5, 2, -1, -1, G_STRING, NONE, NORMAL, 0x26L, 3,1, 22,1, 0, -1, -1, G_BUTTON, 0x27, NORMAL, 0x27L, 10,3, 8,1 }; LONG rs_trindex[] = { 0L, 24L, 29L, 37L }; struct foobar { WORD dummy; WORD *image; } rs_imdope[] = { 0, &IMAG0[0], 0, &IMAG1[0] }; ;************************************************ ;* Datei: HD_PARK.S * ;* -------------------------------------------- * ;* Modul: DISK.CPX Version 1.00 * ;* (C) 1990 by MAXON Computer * ;* Autoren: Uwe Hax & Oliver Scholz * ;* -------------------------------------------- * ;* Mehr oder weniger (eigentlich weniger) frei * ;* nach Claus Brod: "Scheibenkleister", * ;* Seite 325 ff. (Das Buch ist fast noch besser * ;* als HITCHHIKER u. DISCWORLD zusammen!) * ;************************************************ ;C-Deklaration: WORD hd_park(BYTE controller, ; BYTE unit); ;controller = 0-7 (in Register d0) ;unit = 0-7 (in Register d1) GEMDOS = 1 SUPER = $20 flock = $43e hz_200 = $4ba dmodus = $ff8606 daccess = $ff8604 gpip = $fffa01 EXPORT hd_park TEXT hd_park: ;man wei ja nie... movem.l d1-a6,-(sp) ;Parameter retten clr.l d2 clr.l d3 move.b d0,d2 move.b d1,d3 ;Rckgabewert: kein Fehler clr d5 ;Supervisor-Modus einschalten clr.l -(sp) move #SUPER,-(sp) trap #GEMDOS addq.l #6,sp move.l d0,d6 ;Floppy-VBL ausschalten st flock ;auf dem Bus kurz mal klingeln move #$88,dmodus nop ;Controller-ID in Befehl einbauen move.l #$001b0088,d4 lsl.l #5,d2 swap d2 or.l d2,d4 ;erstes Kommandobyte bergeben move.l d4,daccess nop ;auf Besttigung warten bsr zeiteisen bmi error ;Laufwerks-ID in Befehl einbauen move.l #$0000008a,d4 lsl.l #5,d3 swap d3 or.l d3,d4 ;alle weiteren Kommandobytes ;bergeben move.l d4,daccess nop bsr zeiteisen bmi error move.l #$0000008a,daccess nop bsr zeiteisen bmi error move.l #$0000008a,daccess nop bsr zeiteisen bmi error move.l #$0001008a,daccess nop bsr zeiteisen bmi error ;letztes Kommandobyte bergeben move.l #$0000000a,daccess nop bsr wait_for_com bmi error ;ACSI-Bus selektieren move #$8a,dmodus nop ;ACSI-Status holen move daccess,d0 ;nur Statusbits auswerten andi #$001f,d0 ;kein Fehler beq error ;Fehler: Rckgabewert -1 move #-1,d5 error: ;auf FDC umschalten move #$80,dmodus nop ;Floppy-VBL einschalten clr flock ;Supervisor-Modus ausschalten move.l d6,-(sp) move #SUPER,-(sp) trap #GEMDOS addq.l #6,sp ;Rckgabe: -1 = Fehler, 0 sonst move d5,d0 movem.l (sp)+,d1-a6 rts wait_for_com: ;immer schn vorsichtig movem.l d0/d1/a2,-(sp) ;Default: kein Fehler clr d0 ;800 Ticks warten move.l #800,d1 bra get_timer zeiteisen: ;wie oben movem.l d0/d1/a2,-(sp) ;Default: kein Fehler clr d0 ;20 Ticks warten moveq #20,d1 get_timer: ;200-Hz-Zhler addieren add.l hz_200,d1 zeita: ;auf HDC-IRQ testen btst #5,gpip ;ist angekommen, dann fertig beq fix_und_fertig ;Timer-Zielwert erreicht? cmp.l hz_200,d1 bne zeita ;Fehlermeldung moveq #-1,d0 move d0,d5 fix_und_fertig: ;N-Flag aktualisieren tst d0 movem.l (sp)+,d0/d1/a2 rts . e^i>.. ]iWINDLIB C Mi?$9WINDLIB H LiNkWINDLIB O VMiQ W_DEMO PRG VuUD/*----------------------------------------------------------------*/ /* Window-Bibliothek */ /* */ /* Autor: Andreas Loetscher */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ #include #include #include #include "windlib.h" #define Min(a,b) (ab)? a:b int ap_id, handle, work_in[12], work_out[57]; WIND_DATA windows[8]; /*-----------------------------------*/ /* erweiterte open_window()-Funktion */ /*-----------------------------------*/ int open_window(char *w_name, /* Ptr auf Namensstring */ void (*redraw)(), /* Ptr auf Redraw-Funktion */ int was, /* Liste der Elemente */ int algn, /* align-Wert */ boolean snp, /* snappen? (TRUE/FALSE) */ int s_x, int s_y, /* Scrollwerte X/Y */ int doc_l,int doc_w, /* Dokumentslaenge/-breite */ int x1,int y1,int w1,int h1, /* Startkoordinaten */ int mx,int my,int mw,int mh) /* Maximalkoordinaten */ { int w_handle; void clear_window(int w_hndl); void set_slider_size(int w_handle); void set_slider_pos(int w_handle); if(mw==0) /* ermittelt die Grsse des Desktop: */ wind_get(0,4,&mx,&my,&mw,&mh); /* und meldet ein Fenster an */ w_handle=wind_create(was,mx,my,mw,mh); /* traegt wichtige Daten in Struktur ein :*/ windows[w_handle].max.g_x = mx; windows[w_handle].max.g_y = my; windows[w_handle].max.g_w = mw; windows[w_handle].max.g_h = mh; windows[w_handle].elements = was; windows[w_handle].align = algn; windows[w_handle].snap = snp; windows[w_handle].w_redraw = redraw; windows[w_handle].scroll_x = s_x; windows[w_handle].scroll_y = s_y; windows[w_handle].doc_length = doc_l; windows[w_handle].doc_width = doc_w; windows[w_handle].doc_x = 0; windows[w_handle].doc_y = 0; strcpy(windows[w_handle].name,w_name); windows[w_handle].full = (x1==mx && y1==my && w1==mw && h1==mh); wind_calc(WC_WORK,was,x1,y1,w1,h1, &windows[w_handle].work.g_x, &windows[w_handle].work.g_y, &windows[w_handle].work.g_w, &windows[w_handle].work.g_h); /* setzen des Fensternamens : */ wind_set(w_handle,2, windows[w_handle].name, 0,0); /* zeichnet ffnende Box: */ graf_growbox(0,0,0,0,x1,y1,w1,h1); wind_open(w_handle,x1,y1,w1,h1); clear_window(w_handle); set_slider_size(w_handle); set_slider_pos(w_handle); /* schliesslich geben wir dem rufenden Programm die Identifikationsnummer des Fensters zurck: */ return(w_handle); } /*------------------------------*/ /* allgemeine Fensterverwaltung */ /*------------------------------*/ void handle_window(int buffer[]) { int algn; void clear_window(int w_hndl); int rc_intersect(GRECT *p1,GRECT *p2); boolean rc_equal(GRECT *p1, GRECT *p2); void set_slider_size(int w_handle); void set_slider_pos(int w_handle); void w_c_work(int w_handle, int x, int y, int w, int h); void handle_full(int w_hndl); void snap(GRECT *w1,GRECT *w2); int align(int k,int n); void full_redraw(int w_handle); void do_redraw(int buffer[]); void wind_hslide(int w_handle,int newpos); void wind_vslide(int w_handle,int newpos); void scroll_wind(int w_handle,int what); switch(buffer[0]) { case WM_ARROWED: scroll_wind(buffer[3], buffer[4]); full_redraw(buffer[3]); break; case WM_CLOSED: wind_close(buffer[3]); break; case WM_FULLED: handle_full(buffer[3]); set_slider_size(buffer[3]); break; case WM_HSLID: wind_hslide(buffer[3], buffer[4]); full_redraw(buffer[3]); break; case WM_NEWTOP: clear_window(buffer[3]); break; case WM_REDRAW: do_redraw(buffer); break; case MN_SELECTED: break; case WM_SIZED: case WM_MOVED: /* Wenn Fenster auf maximaler Groesse und Breite bzw. Hoehe vergroessert -> Abbruch */ if(windows[buffer[3]].full &&( buffer[6]>windows[buffer[3]].max.g_w || buffer[7]>windows[buffer[3]].max.g_h)) break; /* Wenn kleiner Minimalgroesse vergroessern: */ if(buffer[6]<133) buffer[6] = 133; if(buffer[7]<133) buffer[7] = 133; /* Ausrichten der X-Koordinate, falls algn nicht gleich 0 */ algn=windows[buffer[3]].align; if(algn) buffer[4] = align(buffer[4],algn)-1; /* Falls Fenster auserhalb Maximalkoordinaten wieder zurueckschieben : */ if(windows[buffer[3]].snap) snap(&windows[buffer[3]].max,(GRECT *)&buffer[4]); /* Mit den neu berechneten Koordinaten das Fenster neu positionieren : */ wind_set(buffer[3],WF_CURRXYWH,buffer[4],buffer[5],buffer[6],buffer[7]); w_c_work(buffer[3],buffer[4],buffer[5],buffer[6],buffer[7]); set_slider_size(buffer[3]); break; case WM_TOPPED: wind_set(buffer[3],WF_TOP,buffer[3],0,0,0); break; case WM_VSLID: wind_vslide(buffer[3], buffer[4]); full_redraw(buffer[3]); break; default: break; } } /*------------------------*/ /* loescht Fensterinhalt */ /*------------------------*/ void clear_window(int w_hndl) { int clip[4]; wind_get(w_hndl,WF_WORKXYWH, &clip[0],&clip[1],&clip[2],&clip[3]); clip[2] += clip[0]; clip[2]--; clip[3] += clip[1]; clip[3]--; v_hide_c(handle); vsf_color(handle,0); vs_clip(handle,1,clip); v_bar(handle,clip); v_show_c(handle,1); } /*----------------------------------------------*/ /* ueberprueft, ob sich p1 und p2 ueberlappen : */ /*----------------------------------------------*/ int rc_intersect(GRECT *p1,GRECT *p2) { int tx, ty, tw, th; tw = Min(p1->g_x + p1->g_w, p2->g_x + p2->g_w); th = Min(p1->g_y + p1->g_h, p2->g_y + p2->g_h); tx = Max(p1->g_x, p2->g_x); ty = Max(p1->g_y, p2->g_y); p2->g_x = tx; p2->g_y = ty; p2->g_w = tw - tx; p2->g_h = th - ty; return ((tw > tx) && (th > ty)); } /*-------------------------------------------------*/ /* vergleicht zwei GRECT-Strukturen auf Gleichheit */ /*-------------------------------------------------*/ boolean rc_equal(GRECT *p1, GRECT *p2) { if((p1->g_x != p2->g_x) || (p1->g_y != p2->g_y) || (p1->g_w != p2->g_w) || (p1->g_h != p2->g_h)) return(FALSE); return(TRUE); } /*-------------------------------*/ /* Setzen der Groesse der Slider */ /*-------------------------------*/ void set_slider_size(int w_handle) { long h_size, v_size; h_size = windows[w_handle].work.g_w * 1000 / windows[w_handle].doc_width; v_size = windows[w_handle].work.g_h * 1000 / windows[w_handle].doc_length; wind_set(w_handle,WF_HSLSIZE,h_size,0,0,0); wind_set(w_handle,WF_VSLSIZE,v_size,0,0,0); } /*--------------------------------*/ /* Setzen der Position der Slider */ /*--------------------------------*/ void set_slider_pos(int w_handle) { long x_pos, y_pos; if(windows[w_handle].doc_width <= windows[w_handle].work.g_w) x_pos = 0; else x_pos = windows[w_handle].doc_x * 1000 / ( windows[w_handle].doc_width - windows[w_handle].work.g_w ); if(windows[w_handle].doc_length <= windows[w_handle].work.g_h) y_pos = 0; else y_pos = windows[w_handle].doc_y * 1000 / ( windows[w_handle].doc_length - windows[w_handle].work.g_h ); wind_set(w_handle,WF_HSLIDE,x_pos,0,0,0); wind_set(w_handle,WF_VSLIDE,y_pos,0,0,0); } /*----------------------------------------------*/ /* Berechnung der Arbeitsflaeche eines Fensters */ /*----------------------------------------------*/ void w_c_work(int w_handle, int x, int y, int w, int h) { wind_calc(WC_WORK,windows[w_handle].elements, x,y,w,h,&windows[w_handle].work.g_x, &windows[w_handle].work.g_y, &windows[w_handle].work.g_w, &windows[w_handle].work.g_h); } /*------------------------------------*/ /* ermittelt die momentane, vorherige */ /* und maximale Groesse des Fensters */ /*------------------------------------*/ void handle_full(int w_hndl) { GRECT prev; GRECT curr; GRECT full; wind_get(w_hndl,WF_CURRXYWH,&curr.g_x,&curr.g_y,&curr.g_w,&curr.g_h); wind_get(w_hndl,WF_PREVXYWH,&prev.g_x,&prev.g_y,&prev.g_w,&prev.g_h); wind_get(w_hndl,WF_FULLXYWH,&full.g_x,&full.g_y,&full.g_w,&full.g_h); if (rc_equal(&curr, &full)) { /* Window ist auf voller Groesse, jetzt auf alte Groesse setzen */ graf_shrinkbox(prev.g_x,prev.g_y,prev.g_w,prev.g_h, full.g_x,full.g_y,full.g_w,full.g_h); wind_set(w_hndl,WF_CURRXYWH,prev.g_x,prev.g_y,prev.g_w,prev.g_h); windows[w_hndl].full = FALSE; w_c_work(w_hndl,prev.g_x,prev.g_y,prev.g_w,prev.g_h); } else { /* Window ist nicht auf voller Groesse, deshalb auf volle Groesse setzen */ graf_growbox(curr.g_x,curr.g_y,curr.g_w,curr.g_h, full.g_x,full.g_y,full.g_w,full.g_h); wind_set(w_hndl,WF_CURRXYWH,full.g_x,full.g_y,full.g_w,full.g_h); windows[w_hndl].full = TRUE; w_c_work(w_hndl,full.g_x,full.g_y,full.g_w,full.g_h); } } /*---------------------------------------------*/ /* Routine, die dafuer sorgt, dass ein Fenster */ /* vollstaendig innerhalb eines spezifizierten */ /* Rechtecks liegt (z.B. Desktop) */ /*---------------------------------------------*/ void snap(GRECT *w1,GRECT *w2) { if(w2->g_x < w1->g_x) w2->g_x = w1->g_x; if(w2->g_y < w1->g_y) w2->g_y = w1->g_y; if((w2->g_x + w2->g_w) > (w1->g_x + w1->g_w)) w2->g_x = (w1->g_x + w1->g_w) - w2->g_w; if((w2->g_y + w2->g_h) > (w1->g_y + w1->g_h)) w2->g_y = (w1->g_y + w1->g_h) - w2->g_h; if(w2->g_x < w1->g_x) { w2->g_x = w1->g_x; w2->g_w = w1->g_w; } if(w2->g_y < w1->g_y) { w2->g_y = w1->g_y; w2->g_h = w1->g_h; } } /*---------------------------------------*/ /* Routine, die die Koordinate k auf ein */ /* Vielfaches von v "snappt" */ /*---------------------------------------*/ int align(int k,int n) { k += (n>>1) - 1; k = n * (k / n); return(k); } /*-----------------------------*/ /* zeichnet ganzes Fenster neu */ /*-----------------------------*/ void full_redraw(int w_handle) { clear_window(w_handle); (*windows[w_handle].w_redraw)(); } /*--------------------------------------*/ /* fuehrt den Redraw eines Fensters aus */ /*--------------------------------------*/ void do_redraw(int buffer[]) { GRECT p; int work[4]; WIND_DATA zw; v_hide_c(handle); wind_update(BEG_UPDATE); wind_get(buffer[3],WF_FIRSTXYWH, &p.g_x,&p.g_y,&p.g_w,&p.g_h); while(p.g_w>0 && p.g_h>0) { work[0] = buffer[4]; work[1] = buffer[5]; work[2] = buffer[6]; work[3] = buffer[7]; if(rc_intersect(&p,(GRECT *)&work)) { work[2] += work[0]-1; work[3] += work[1]-1; vs_clip(handle,TRUE,work); vsf_color(handle,0); v_bar(handle,work); (*windows[buffer[3]].w_redraw)(); } wind_get(buffer[3],WF_NEXTXYWH, &p.g_x,&p.g_y,&p.g_w,&p.g_h); } vs_clip(handle,FALSE,work); wind_update(END_UPDATE); v_show_c(handle,TRUE); } /*---------------------------------*/ /* Berechnen der Dokumentsposition */ /*---------------------------------*/ /* -> horizontal */ void wind_hslide(int w_handle,int newpos) { windows[w_handle].doc_x = newpos * (windows[w_handle].doc_width - windows[w_handle].work.g_w) / 1000; wind_set(w_handle,WF_HSLIDE,newpos,0,0,0); } /* -> vertikal */ void wind_vslide(int w_handle,int newpos) { windows[w_handle].doc_y = newpos * (windows[w_handle].doc_length - windows[w_handle].work.g_h) / 1000; wind_set(w_handle,WF_VSLIDE,newpos,0,0,0); } /*---------------*/ /* Slidermanager */ /*---------------*/ void scroll_wind(int w_handle,int what) { switch(what) { case WA_UPPAGE : windows[w_handle].doc_y -= windows[w_handle].work.g_h + windows[w_handle].scroll_y; if(windows[w_handle].doc_y <0) windows[w_handle].doc_y = 0; break; case WA_DNPAGE : windows[w_handle].doc_y += windows[w_handle].work.g_h - windows[w_handle].scroll_y; if(windows[w_handle].doc_y > windows[w_handle].doc_length) windows[w_handle].doc_y = windows[w_handle].doc_length; break; case WA_UPLINE : windows[w_handle].doc_y -= windows[w_handle].scroll_y; if(windows[w_handle].doc_y <0) windows[w_handle].doc_y = 0; break; case WA_DNLINE : windows[w_handle].doc_y += windows[w_handle].scroll_y; if(windows[w_handle].doc_y > windows[w_handle].doc_length) windows[w_handle].doc_y = windows[w_handle].doc_length; break; case WA_LFPAGE : windows[w_handle].doc_x -= windows[w_handle].work.g_w + windows[w_handle].scroll_x; if(windows[w_handle].doc_x <0) windows[w_handle].doc_x = 0; break; case WA_RTPAGE : windows[w_handle].doc_x += windows[w_handle].work.g_w - windows[w_handle].scroll_x; if(windows[w_handle].doc_x > windows[w_handle].doc_width) windows[w_handle].doc_x = windows[w_handle].doc_width; break; case WA_LFLINE : windows[w_handle].doc_x -= windows[w_handle].scroll_x; if(windows[w_handle].doc_x <0) windows[w_handle].doc_x = 0; break; case WA_RTLINE : windows[w_handle].doc_x += windows[w_handle].scroll_x; if(windows[w_handle].doc_x > windows[w_handle].doc_width) windows[w_handle].doc_x = windows[w_handle].doc_width; break; } set_slider_pos(w_handle); } /*----------------------------------------------------------------*/ /* Header-Datei zur Window-Library */ /* */ /* Autor: Andreas Loetscher */ /* (c) 1992 Maxon Computer GmbH */ /*----------------------------------------------------------------*/ typedef enum { FALSE, TRUE } boolean; typedef struct w_d /* Fenster-Struktur */ { GRECT max; /* Maximalgroesse */ GRECT work; /* Arbeitsbereichgroesse */ int elements; /* Bestandteile des Fensters */ int align; /* Faktor zur hor. Ausrichtung */ int snap; /* Fenster snappen (TRUE/FALSE) */ int full; /* Full-Flag (TRUE/FALSE) */ int scroll_x; /* Scrollwert fuer X-Achse */ int scroll_y; /* Scrollwert fuer Y-Achse */ int doc_x; /* X-Position des Dokumentes */ int doc_y; /* Y-Position des Dokumentes */ long doc_length; /* Dokumentslaenge */ int doc_width; /* Dokumentsbreite */ void (*w_redraw)(void); /* Pointer auf Redraw-Funktion */ char name[80]; /* Fenstername */ } WIND_DATA; /*-----------------------------------*/ /* erweiterte open_window()-Funktion */ /*-----------------------------------*/ int open_window(char *w_name, /* Ptr auf Namensstring */ void (*redraw)(), /* Ptr auf Redraw-Funktion */ int was, /* Liste der Elemente */ int algn, /* align-Wert */ boolean snp, /* snappen? (TRUE/FALSE) */ int s_x, int s_y, /* Scrollwerte X/Y */ int doc_l,int doc_w, /* Dokumentslaenge/-breite */ int x1,int y1,int w1,int h1, /* Startkoordinaten */ int mx,int my,int mw,int mh); /* Maximalkoordinaten */ /*------------------------------*/ /* allgemeine Fensterverwaltung */ /*------------------------------*/ void handle_window(int buffer[]); N H>O/H /I?@?A>6/B/HENGPILKJ0fHSHRHTHUrB@NO??420/NXO8Mpz=======-&=:=<2/>H- =@$BvBv"o A*NUfTf RfSfp`B@rz=HvHv ???C A4p2/NOBgBgpzHv*r0NPO????BgBBBAB@NO ??420NXO0N0N0N0OL|NuH0$H0|| bV@0;NX$0<6bbL2*0*N` 0*N`0*N`2*0*N`0*N` JN`Gpz23g4* sn2*sn j l5| jl5|pz63JCg20*NS@5@pz23g CAN?*?* ?* ?*r0*NPO?*?* 4* 2*0*NXO0*N`,BgBgBg?*r 0*NPO`2*0*N0*NL Nu/ QOHoHoHo Ho rNO0oSo0/oSoG0NBA0NAr0NA0Nr0NPO&_Nu?/0h2iAl`0i2(h4)iBl`2)i4Qo`46(io`6)23C0@3H8C3D@lAlx`BD0(6Nu0Qf2(if4(if 0(igB@NupNuH 6Epz82 Hĉ$H02Htz"2 N*BgBgBg/r0NO BgBgBg/r0NO L8NuH 6Epz22$r nx`pz22$r 82HĉHpz"2 42H²nz`$rz02H"2 tz:2 HŒN*BgBgBg/r0NO BgBgBg/r 0NO L8NuH 6:8EpzHrHr ?/?/?C A422pNOL8NuH4O6EHjHjHjHRr0NOGHkHkHkHSr0NOHoHoHo Ho r0NOKC JNJ@g^?/?/?/?/?+4+2+0NO ?+?+?+?r0NPOpzBu?+?+4+20NXO`b?/?/?/?/?*4*2*0NO ?/?/?/?/r0NPOpz;?/?/4/2/0NXOOL,Nu0Pl20)hl3h0i2hAoi20)i2(hAoi3A0Pl23h0)hl 3h3hNu4BSBB4H…0Nu?O6NpzACr"Q2 o&NOz6NuHgn =fa6 n <#,` %fa n <#+`Rpr A9nA0m/ПЁRSBkB`Jg:NuA<`AO4=@/</<p/p/pd//<p2//p/p/p//HzHy=N>O4=@HnN1XHnN X0. @f0.S@f0.H/N1X`0.H/N1X0.H/N2X0.H/N2XNXN^NuNVN343? HnHnHnHnN/O3?Bn n l0.RnH @?0`3?$Hy?(Hy?Hy?N-O N^Nu09?H/N.HXN3dBN&XNuNV0. HHnHnHnHnr//N2LO0.2.A=@S@=@0.2.A=@S@=@09?H/N0\X09?HB/N3P09?HHnr//N0O 09?HHn/N3P09?H/N00XN^NuNV n0H2(HЁ n 2H4(H҂o n 0H2(HЁ n2(H4(H҂ n 4(H6(Hԃ=@o n 0(H2(HЁ" n0 n 4=ABn n 0 n2( n 4(=@Bn n 2(0. n 01A4.HH/B1B4.H=AH/B1B$/o /op`pN^NuNVH0.6J@f Hn:Hn6Hn2Hn.p/BN2LO0.H2..H4.2H6.6H8.:H/////N1.H////////N/@O 0. H2.H4.H6.H8.H////z//N2O0. d @?Bh^`0.H2.H4.H6.H8.H:.H<.H>.H////////N.O 0. H2.H4.H6.H8.H////z//N2O0. d @?1|^LN^NuNV n 0 n2Al n 0 n 0( n2(Al n 1A n 0H2(HЁ n4H6(Hԃo n 0 n 0(H2(HЁ n4(H6(Hԃo n 1BN^NuNV0.H/@S2. HҀ=A H "/N+"/N+N^NuNV09?H/N0\Xp/N2X n0(HHnHnHnHnr //N2LO0.J@o0.J@o n=h=h =h =hHnHnaxPJg0.S@2.@=A0.S@2.@=A09?HHnr//N0O 09?HB/N3P09?HHn/N3P n0(d @?"h`N n0(HHnHnHnHnr //N2LO`09?HHnB/N0O BN2X09?Hr//N00PN^NuNVH n0H ml lbN`X`T`P`L`H`D`@`<`8`4`&`0`T`h`z`````/.aX` n0(Hr////r //N2O` n0(H/N1X` n0(H/aX`Hy=$p/N0P` n0(H2(Ht////t//N2O`d n0(H2(Ht////t //N2O`6 n0(d @?Jh^g0 @?"n2) 4(TBn @?0)2(VAn n0( @l1| n0( @l1| n0(d @?0(Z=@J@g n2(HH//aVPS@ n1@ n0(d"@?Ji\g"@?PP// aP n0(H2(H4( H6( H8(H////z//N2O` n0(H/aDXNqL0N^NuNV#p# lp nR"@=VgR` nJgX 9R @ p nJgR"@=VfR` nrR@JftNqJ=fBHyfp//.BpB/N-O/.p/pF/N-O /. NX/9P n R"n QR .JjN^Nup-@ n  -@Jg(gpp/B/(N#O -@J.gR .S-@JkDB/ n /(N#O p/Hn n /(N!O J/N-P#X#B O0/@11g"HS@4XBB$0 g/`?S@j?(NA.yBLNuA4!o "o1Q8!oBh.1| 21|d,N4A4CD!ICD!I "o282< "o CX/ ED2Q$_HNuA41o8Bh.Bh21|e,N4HNuA41oF1oD1oH1oF1o D1o81|.r"oRJf1A2p"o/ EH4Q$_h21| 61| ,N4HNuA4,1o">1o<1o:1o81o61o41o 21o01|1|Bh1|IN4A4,0(0HNuA4,1o">1o<1o:1o81o61o41o 21o01|1|Bh1|JN4A4,0(0HNuA4,Bh1|Bh1|MN4A4,"o22"o24"o 26"o280(0HNuA4,!o01o01|1|1|1|NN4A4,0(0HNuA41o D1o8Bh.1|21|z,N4HNuA41o8Bh.Bh21|{,N4HNuA4,!o01o01|1|1|1|4N4A4,0(0HNuA4!o 1o D1o81|.1|21|,N4A4CD!IHNuA4,!o0Bh1|1|1|N4A4,0(0HNuA4,1o81o61o41o 21o01|1|Bh1|dN4A4,0(0HNuA4,1o81o61o41o 21o01|1|Bh1|eN4A4,0(0HNuA4,1o01|1|Bh1|fN4A4,0(0HNuA4,1o01|1|Bh1|gN4A4,0(0HNuA4,1o 21o01|1|Bh1|hN4A4,"o 22"o24"o26"o280(0HNuA4,1o:1o81o61o41o 21o01|1|Bh1|iN4A4,0(0HNuA4,1o01|1|Bh1|kN4A4,0(0HNuA4,Bh1|Bh1| N4A4,0(0HNuA4,Bh1|Bh1|N4A4,0(0HNuA41o D1o8Bh.1|21|,N40(DHNuA4!o1o81|.Bh21|61| ,N4A4CD!IHNu"0<sNBNu"0<NBNu4D4\6\8\:\4D<\4\8\6\:\V1.04Hello WorldHello UniverseDemofensterzweites Demofenster[1][WM_ARROWED ...][ok]0123456789abcdef ((((( H ((((( H X 8 H*   2  , <B "  *2    62 T 42&&^6N6  (n , " ,.J@F0 .        8>*: ~$. $:0  P4Xf,"20&"NR  B4 :0` 0 .   @8X" X~2`**f@*< h LL0*"  **"::""(.@""($. p^ig.. ACS r^ihFIND_DEL ^iMEMORY ^iRSC2OBJ ^i!TRAP_LOG ^iRVIRSPY ^icXBRA ^io. r^ih.. p^igPIANO ACS X0iPIANO1 ACS g0pWPIANO2 ACS n0r PIANO AH ]0x#PIANO1 AH z0PIANO2 AH 0< PIANO1 C rVePIANO2 C zVePIANO H Z0GPIANO1 H x0HPIANO2 H }0HPIANO PRG a0PIANO1 PRG 0iPIANO2 PRG t00PIANO PRJ e0iPIANO1 PRJ j0lPIANO2 PRJ l0lPIANO C cVe.ACSd' ->ACS 1.0d PIANOWORLDYN(void *) 1046502L\ (void *) 1108731LVd(void *) 1174659LMausindex: (void *) 440000L| %F(void *) 466164L$ P(void *) 493883LXXXXXXXXXXXXXXX(void *) 523251L * Ԍ(void *) 554365L␀ > (void *) 587330LAͪ (void *) 622254L  (void *) 659255Ln Optionex (void *) 698456LT_ŎABBR6 (void *) 739989L P P(void *) 783991Ln 0X(void *) 830609L  p(void *) 880000LĈƾƲƦ.(void *) 932328Ln Probe (void *) 987767L \ALERT LISTE\FENSTER LISTEICON LISTEIMAGE LISTn  KEYS_001@A00A*0'BS0(A0 ,A+CxA$Cb A+$C. A*Cy A, Cc A#Cv A&Cn A)CmA* C,A,(C-A)C<,0A Ca0 A%CdACf 0 A!Ch A"CjA Ck0&A%C,MAUSFORM LISTEMENU LISTEOBJECT LISTEPIANO_001b S@? M/0'POPUP LISTE\REFERENZ LISTE ?@ABCZ88TEDINFO LISTE !"#$%&'()*+,6TEDI_002900q TEDI_003800q(j!TEDI_004 h;00q"TEDI_0050 2 @<00q\#TEDI_007  600p8$TEDI_008 700p%TEDI_009  =00q*l&TEDI_010:00p'TEDI_014`P |300^(TEDI_015@(0H 200:)TEDI_016>n.00p*TEDI_017@ P@0100p,n+TEDI_018 400p,TEDI_019>X500p<~-@@TEXT LISTE./0123456789:;<=2.TEXT_001nABBRUCHA$/TEXT_002UUUUUUUUUUUUUUUU Piano R0TEXT_003@pH1TEXT_004 ^In Probe H2TEXT_005nPLAYf3TEXT_006UUUUUUUjSTART\4TEXT_007 Probe TnC5TEXT_008D6TEXT_009 L \ < E6x7TEXT_010 ^I:n Probe F*8TEXT_011A#9TEXT_013D#N:TEXT_014 ^In Probe G B;TEXT_015 jhmF#6<TEXT_016@0@ $G#ې=TEXT_018 hmC#N>USERBLK LISTE?piano_make@piano_serviceUUUUUUUUUUڈAplay nFBstartt*/ACtonProbe Tn Optione.ACSd    ACS 1.0d PIANO1 LDY(void *) 440000L| %ALERT LISTE2tFENSTER LISTE ICON LISTEʶIMAGE LISTLppKEYS_001 Aa MAUSFORM LISTEMENU LISTEzü OBJECT LISTE¢ PIANO_001b S M'` POPUP LISTE \ REFERENZ LISTEz 8TEDINFO LISTE:TEDI_016>np@ TEXT LISTENTEXT_001nABBRUCHATEXT_002@0@ P Piano TEXT_003@pUSERBLK LISTEpiano_maketonProbe Tn Optione.ACSdSS Q+:ACS 1.0d PIANOWORLDYQz(void *) 1046502L\Q8(void *) 1108731LVdP(void *) 1174659LMausindex: P(void *) 440000L| %Pr(void *) 466164L$ PP0(void *) 493883LXXXXXXXXXXXXXXXO(void *) 523251L * ԌO(void *) 554365L␀ Oj (void *) 587330LAͪO( (void *) 622254L N (void *) 659255Ln OptioneN (void *) 698456LT_ŎABBRNb (void *) 739989L P PN (void *) 783991Ln 0XM(void *) 830609L  M(void *) 880000LĈƾƲƦMZ(void *) 932328Ln Probe M(void *) 987767L \LALERT LISTELLFENSTER LISTELFICON LISTELIMAGE LISTFBFxxKEYS_001@A0 , 0,A)<xA$<b A)$<.A(<yA* <c A#<v A&<n A'<m A( <, A*(<-A'<<0 A%<dA<f 0 A!<h A"<jA <k0(A%<0A <aFMAUSFORM LISTEEMENU LISTEEpEOBJECT LISTEDDPIANO_001b S; M-.'DVPOPUP LISTECCPPREFERENZ LISTE ;<CBC00TEDINFO LISTE !"#$%&'()*BCTEDI_0025..qBvB TEDI_0034..qBBR!TEDI_004 h7..qAA"TEDI_0050 2 @8..qADA#TEDI_007  2..p@A $TEDI_008 3..p@x@%TEDI_009  9..q@@T&TEDI_0106..p??'TEDI_016>n,..p?F?(TEDI_017@ P@0/..p>?")TEDI_018 0..p>z>*TEDI_019>X1..p=>:+88TEXT LISTE,-./0123456789==,TEXT_001nABBRUCHA=Z=-TEXT_002n^: Piano ==P.TEXT_003@p<=/TEXT_004 ^In Probe H #include #include /* Prototypen anlegen */ static void ton (void); static Awindow *piano_make (void *not_used); #include /* Soundgenerator ansteuern */ static char sound [] = { 0x00, 0x10, /* Generator A Frequenz einstellen */ 0x01, 0x10, 0x07, 0xf8, /* Rauschen ausschalten */ 0x0b, 0x00, /* Tonlnge Hllkurve */ 0x0c, 0x30, 0x08, 0x17, /* Lautstrke */ 0x0d, 0x00, /* Hllkurve abklingend */ 0xff, 0x00 /* stop */ }; static void ton (void) /* * lt ton der Frequenz (userp1) / 1000 ertnen * */ { AOBJECT *aob; long val; aob = (AOBJECT *) ev_object + ev_obnr + 1; val = 125000000L / (long) aob-> userp1; /* berechne Teilerwert */ sound [1] = (char) val; /* unteres Byte */ sound [3] = (char) (val >> 8) & 0x0f; /* oberes (Halb) Byte */ Dosound (sound); } static Awindow *piano_make (void *not_used) /* * Erzeuge Piano Fenster */ { Awindow *wi; wi = Awi_create (&PIANO); if (wi == NULL) return NULL; (wi-> open) (wi); /* ffne gleich */ return wi; } int ACSinit (void) /* * Doppelklick auf NEU erzeugt ein neues Fenster */ { Awindow *window; window = Awi_root (); /* root window */ if (window == NULL) return FAIL; /* lege NEU Icon an */ (window-> service) (window, AS_NEWCALL, &PIANO. create); window = &PIANO; (window-> create) (NULL); /* sofort ein Fenster erzeugen */ return OK; } /* Beispielapplikation fr ACS "Piano" Phase 2 14.1.92 Stefan Bachert (c) MAXON Computer GmbH */ #include #include #include /* Prototypen anlegen */ static void ton (void); static Awindow *piano_make (void *not_used); #include /* Soundgenerator ansteuern */ static char sound [] = { 0x00, 0x10, /* Generator A Frequenz einstellen */ 0x01, 0x10, 0x07, 0xf8, /* Rauschen ausschalten */ 0x0b, 0x00, /* Tonlnge Hllkurve */ 0x0c, 0x30, 0x08, 0x17, /* Lautstrke */ 0x0d, 0x00, /* Hllkurve abklingend */ 0xff, 0x00 /* stop */ }; static void ton (void) /* * lt ton der Frequenz (userp1) / 1000 ertnen * */ { AOBJECT *aob; long val; aob = (AOBJECT *) ev_object + ev_obnr + 1; val = 125000000L / (long) aob-> userp1; /* berechne Teilerwert */ sound [1] = (char) val; /* unteres Byte */ sound [3] = (char) (val >> 8) & 0x0f; /* oberes (Halb) Byte */ Dosound (sound); evnt_timer (80, 0); /* x Milli Sec warten (visuelle Rckmeldung) */ } static Awindow *piano_make (void *not_used) /* * Erzeuge Piano Fenster */ { Awindow *wi; wi = Awi_create (&PIANO); if (wi == NULL) return NULL; if (application) { (wi-> open) (wi); /* ffne gleich */ }; return wi; } static char oldconterm; /* fr ursprnglichen Wert */ static long off_click (void) { oldconterm = *((char *) 0x484); *((char *) 0x484) &= ~3; /* kein click und keine Tastenwiederholung */ return 0L; } static long old_click (void) { *((char *) 0x484) = oldconterm; return 0L; } void ACSterm (void) { Supexec (old_click); /* alter Zustand */ } int ACSinit (void) /* * Doppelklick auf NEU erzeugt ein neues Fenster */ { Awindow *window; Supexec (off_click); /* click ausschalten */ if (application) { window = Awi_root (); /* root window */ if (window == NULL) return FAIL; /* lege NEU Icon an */ (window-> service) (window, AS_NEWCALL, &PIANO. create); window = &PIANO; (window-> create) (NULL); /* sofort ein Fenster erzeugen */ }; return OK; } /* This file was create with ACS 1.0 (c) Stefan Bachert 1991 The contents is based on file: E:\ACS.DOC\PIANO\PIANO.ACS compiled at: Thu Jan 16 01:36:28 1992 */ /* STRINGS */ /* OBJECT TREES */ extern OBJECT KEYS; /* WINDOWS */ extern Awindow PIANO; extern Adescr ACSdescr; /* This file was create with ACS 1.0 (c) Stefan Bachert 1991 The contents is based on file: E:\ACS.DOC\PIANO\PIANO1.ACS compiled at: Wed Jan 15 01:25:14 1992 */ /* STRINGS */ /* OBJECT TREES */ extern OBJECT KEYS; /* WINDOWS */ extern Awindow PIANO; extern Adescr ACSdescr; /*  This file was create with ACS 1.0 (c) Stefan Bachert 1991 The contents is based on file: E:\ACS.DOC\PIANO\PIAOO2.ACS compiled at: Wed Jan 15 01:34:46 1992 */ /* STRINGS */ /* OBJECT TREES */ extern OBJECT KEYS; /* WINDOWS */ extern Awindow PIANO; extern Adescr ACSdescr; `pNr0``>>>> 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`$ONaT0 J"LN$? 9pPg @N 9pTg @NNc?<LNA 8NuH 29*H ЀЁ$y&E <sY@"* NfEx@"<AANg8& JNgHBApPNi y"$P8RR|l2H ЀЁЀ5*%LNu y" PBPNuH,O$y"/y&(RABNg8&BDK`*2H ЀЁЀڴ`HUHo"M MNlPO0fANg8n2H ЀЁЀ:40H$ԂԀ oC(/I <sY@") Nfx"<xr0H$ԂԀ op( "jf J0NAxNgHBApPNi4H ЀЂ o20 |"jf J0NHUHo"M MNlPO0fRDTmO L48Nu/ / AvNS$H g <N(&H$ f`BS09g J"j N J&_$_Nu/ $H2UAg` RN)2 JNYnp`p$_Nu8pNupNuANg8NuH8ANg809g.NQ$H fp` GvCph J(jN$K"jNB@LNu x (( hl0(A`,H|fA<  @###|!|| #/| yNH`Hy?<&NN\L y yN!|NuH"y y Jxg?/Hy@N y LNsHyV/<!NMP#Nu/9/<!NMPNuH8YOv@GHWHoHoHSr B@NmO0NQ(HNQ̹gF gBrlTg4SCJBm2NS`plTg L"lrNp L$lN` p L$lNXOLNu y"NNuH8&H09' $yg(j Jp N`HBy`62H ЀЁ(kI lf K0N$l p J(jNN&6lLNu/ / 29*H ЀЁ y&A$h &j JpN&_$_Nu y"NNuAN%NuH>&HK09fAN%`|$ygp J(*N`bBy`P2H ЀЁ(kI J0N0,S@g S@gS@g` (l p L,lN`Nl` MN%N&6lL|NuH>$H69 89 &P09f yAN9$%HJ0@|P62A|08pDH07@ 2HP7A 49f0+ 8D@L6KAK0+ 7@rkH ЁЁЀN(*H fp`%MMV <Cp MNd yo+| BmBm;C;D7|I;|2+AH ЀЁA0*Hxp0"N LNdp"C MNd)M 0+@@ml  JNB@`TD8I0K"`L|NuH0$H6J@m2H"ҁҀ jhϺh "h &h & J0NEL Nu/ $y" R hg1| JN0* m JB@NE$_Nu?/ Ej:jRjjj y6(pCgj:pCgjRpCgjjpCgj JN%| f*``@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf` kfrC0HAHX@5@p5@@vD4BCJ5BBrD0@AH5@rBE<>*``@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGfL Nu/ $H09g jN)2B RN)2 JNYn` JNX$_Nu/ $y" R hg1| JN0* m JB@NE$_NuAN%NuNNu09gNLpNRN6NuNNuH QO8:6yo`EpCg Rg042<09Nht` RUUg4UU2?E?C?CAr09NiPOL8NuH QO8:6yodE0@|g Rg042<09Nht` RUUg4UU2Ar09NiPOL8NuH4YO y&hBCKE`|l0HЀ y80HW"M K0NjXO y0(4U2(6W0H$ԂԀ s(fh s( 2h0H54h52hhSA54hhSB5 2h54h52hh SA5 5`H0H5520H$ԂԀs(SA4J5 24H ЀЂsSA0H5BrRCymXOL,NuH4O?@?AEr0Nhr0NhBBBA0Nh?k0kS@?@2+kSA?AA0rNhΑ0<NlKBC;C`2|l40H uf:/u/u8/u2/u ?A kl~kklxk42/ 0N420N42/0/ N4/ 2/0N42/ 0N420N4/ 20N4/2/ 0N`X:/0Hu/u8/ukl~k420N4420N*420N420NRCymȑ0<NlABA0NhBmOL,NuA0(hmpNu0(RhHЀ"h01Nu/ / UO$H>GgN&p4H"ҁ҂ jp fB2ko8r ЀЂ爂p "jf J0N0+HЀ k1RkCp J&jNTO&_$_NuHGf6+(k`0Wf2H$Ԃԁ j20( |"jf J0N0+C2+@oSkSk0HK`8:;m;m;m;m;m ;m ;mK8TLSCnCp J*jN` SCTLJCn`TOL<NuH0E&R0*oLBC`20HЀ j80RC4H ЀЂ"k21 |"kf K0NjmBjp K$kNL NuH8$H6:8(IH$ԂԀ&jk0kS@lmplnhk0kS@QmXlnR2<kfHtk f@0+| g0N`.<+JFo&"L420 JNz2H ЀЁ j<0FfLxNuH0O86Nm:NQ$H gry fN yADN5&G67CpNn?<`CA4<`2+0Nl:TO0+lD@7@S0+l D@7@kpNn#C4 KN( >?k0kS@?@2+kSA?AC4*62*4 JB@N yA8N5&OL 8NuH $H6:<H$ԂԀA(hm02(hAl$hm4(hBl0<hfrh gp`B8(JDm8hh~420 JNJ@m>2H ЀЁ82DfJGm0`0LNuHo20N8?T HoHo"L KNlPOpog Sf2/ Tg20NHoHo"L KNlPO20NmNQ$H gH4j62j4 jB@N62H ЀЁ*j4-|f j0NB66J@l`vCfgJEm.2H ЀЁ W*h4-|f2- |"hf0NzJCmF2H ЀЁ*j4-| g xm g6`0-|frm J"jf0N.:pof yA8N5&EJEm W*h5| 2H ЀЁ45 |gX5o 5o5F5G333 #"#&3*N52H ЀЁ uNN5 Wf&2H ЀЁ45|f25 |"hf0N0* g2*gp yhgJFo0`0D@?JGo0`0D@_@BC` 2A@A0RCJ@fJCg joSCJCg joSCBo`*B@86xl`ST20`@04bBNSDJDn0/RoU@mOL0*NQ&H g| RfrkVgvNBv>?j ?j ?jNQ*H0| |b@0;N@R`l`2*0*N.`C K(kjN` K"knN`pkTf y"(4g K"krN`lp K(kN`^ K"kvN`v0* K"kzN`f0* K"k~N`X0* K"kN`JC K(kN`>C K(kN`2BCp K(kN`"BC` g MNS` MNf` JN*@JCg0+o r KB@NBPOL<NuH]O?@>NEG20Nm6NQ(H g~8l6JDl$r"yigdJCg^02N/&`P6l4,l g@42 NB@N6J@m*BD:<` 0 NNB6<JFm2H ЀЁ46| IgJFm62H ЀЁK|lv4-| If02N`0-| ]S@g2-| g0tm g|y gx`.py gx:`N`pmg L0N?J@gh|mr`BA0"N LN>JDgL~KSGBAp NiHUHo"M MNlPO02/@|fJGnJEgJEgJGn 20N6\OL|NuH0YOHWHoHoHor B@NmO0/NQ$H g29A409N'J@g&j gp69j4:9j6BD42 K0N:`(2H ЀЁ43 |gxs,0 KNB6:JEl2H ЀЁЀ yA8N5&pjVf2*o JB@rNBp J&jN`2NN5`p yhf"*^g J0929N/&XOL 8NuNu// OE`HHRHRHRHRHRBgp?BgBgBgBgBgBgBgBgBgBgBg"JA.BBBAp0NjO.|g AN2v`SCJCnO$_&NuH>OEGB@46KIM HWHoHVHTHR 9r??9BgBgBgBgBgt??????"K Mp7rNjO.6r@g U)fNQ/HNx`zpNnpCg MNz`pCg20NpCg Vg0/Np CgNHVHT"J KNlPO0frCgNNxN)NRB@Nn09g 29gNOL|NuN1J@fN#ZN4LB@NuN4LpNuNuH8O&H(IE` %f +sfTK`f"L JNa"K JNafApNkOLNuH086$hG2H ЀЁ父r f?+?+?+4 J0rNj\O`$p???+?+?+4BA J0NkO L Nu/ / &H$I?*?*?*42<B@ kNj\O&_$_NuH2H ЀЁ45| g8?+?+?+??-C J4-2-0-Nl^O YRYj`pNn3*#&# "N50OL<NuPmhm4hBl 0(h@mB@NupNu0Ql00(il1i0h2iAoh00(h2)iAoh1ANu0h2iAl`0i2(h4)iBl`2)i4Qo`404(io`4)1B2@1I0h1@2(oJ@n B@1@1@Nu/ $H g0pЪ29gNc0`N. JNc0NF$_Nu// &29g Nbj$H`N. Nbj$HNF fAx}pNk`pЪѹ J$_&NuH8$H gBG Sp n <N(H f JN>`(B& S (R S!LNu/ E` RS ( R pN R (n"g N R$`$_NuB@Nu/ OC+EpQ y/oyy JGo2H ЀЁ爟ro>/oyy JGo2H ЀЁ爟roAN;N/H?/?/?/4/r0 JNj\OpNnHWHoHoHo HoBgBgBgBgBgBgBgp???/.?/2??/2C842pNjO.>pNn?/4/ r0 JNjTO<@f|Fgؑ0<Nl0/ g>4H"ҁ҂r p?42 |??-?-?- J0BA4NkO JFmpp4H"ҁ҂r f\"J M0N:4p?r0H$ԂԀ犂r( ??-?-?- J0BA4NkO 2H ЀЁr ?| `Bo 0<Nl:JFl?/4/ r0* JNjTO<J@mHWHo CANlPOp2/@|?@Fgb4H"ҁ҂ 2 fNC oN<>2H ЀЁ55"J K0BAN60 JNZ8r"J K0N`FFgpGgC oN<>2H ЀЁ55N1JFof2H ЀЁ42 |gPjgJjgD:*H(؄؅猼rHg0#"#&3*N52H ЀЁ rNN5BA0"J KNO"L,NuH086NQ$H&j^N52H ЀЁ43 |g#"#&3* sN|fNN5r0 KNkL NuH0QO$H:6&j^$ gf>?k0+j8l`0*8?@?k20AN'J@g22+H ЀЁ83?4 K0rNjTO:@l"K JN^POL 8NuH0YO$H6?A&j^$ g KNA8J@gv4+H"ҁ҂>2H ЀЁ<30+H$ԂԀ>3(vD:0 KNB66J@m,kf`*2H ЀЁ<32H ЀЁ>3Wfp`GfN5#"#&3*0* f,BA K0Nk2H ЀЁ sNr0 KNk`*r0"K JN 2H ЀЁ sNBA0"K JNN5B@XOL NuH $H6*2H ЀЁ5 622H ЀЁ820H$ԂԀ r( Nb*JEgRE0:4H"ҁ҂牚rr4H ЀЂr<*0H"ҁҀ<22H ЀЁ82Dg22H ЀЁ<22H ЀЁr0H$ԂԀr(`LxNu/ YOEHRHo"J JNlPOpWfXO$_NuHEHyHy"J JNlPO3K:GHkHkHkHSrB@NmO:GHS"MA@Ni8XO3ABP4`RPJRf K0NgZ3 333A g309gGK"K MNnJ@g6HB3C KNap/ KNa&H gCANaBI"M LNap\ LNa&HK f* ,:fCANaB,`"LANa`RK"KANaBp. MNa&H g\B`X yA09NlHWHR"J JNlPO0g.pNn"yCAx6N$4B@Nn Rf2 y0( 1@ y2( 1A N)J@gp`&N4NPhpNnN 6B@Nn0OvL<Nu/ O09>gNNQDN509Ni$09gNi`R y|E HRHRHRHRHR?<?<BgBgBgBgBgBgBgBgBgBgBg"JA.BBBAp0NjO.J@fO"$_Nu09VRyVJ@f By.N5`NuSyVfN5`09g A^N5&Nu/ $HAX0Rf "hg0!j09.f j0Nl$_NuBy0`N509.f yA8NNu/ 090Ry0J@f09.f$yE> j0Nl$_NuSy0f09.f yZ09XNlNu09.Ry.J@f 0<NlNuSy.f0<Nl yZ09XNlNuH<$HBC&H|p KGhg0HN((H g0H"JNd&L*K0+|f2+ | f+H|| b|B4; N <*p`p`N` k N8b*H'H `F k N8*H'H `4 k N8.*H'H `" k N7*H'H ` k N9$*H'H f`p KGhgF LL<Nu/ / $H g&J0+|fx2+ | fl+H|| b\B4; N <$R0R0H0 k N8`. k N9`" k N9f` k N8Z` k N8p KGhgp JN)2&_$_Nu/ / &Hp"N($H g"Kp"Nd kN9$%H f` J&_$_Nu/ $H g jN9f JN)2$_Nu/ / &HpN($H f`p"K JNd J&_$_NuN)2Nu/ / &HpN($H g>"KpNd SN9$$ kN9$%H kN9$%H g "*g$f` J&_$_Nu/ $H g$ jN9f jN9f RN9f JN)2$_Nu/ / &HpN($H f`p"K JNd J&_$_NuN)2NuH0$Hg,Nb&R N(&H f` "J KNd K`AdL NudgN)2Nu?/ $H0* |fj 0*|f JB@Nk0*|gLQ@g`j j 6(h0(h@l6jo5C6(h0(h @l6jo*5C`$ j 6(Kjo5C0*hl5hp JEhgb$_6NuH0&H$I6H"ҁҀAB@4(|| bNB4; N ""DD.D""0( H@D@`""h 0)D@`prhgprhgprh gp2(|@gpBAt h gJ@o2A`2DAAJ@lB@4(@64(@7B4BhA7B4BhA7B82H ЀЁ62|g"0H$ԂԀ犸r(f82(S82(k`L Nu/ / O$H0ljBP0*ljBjA0jhJ@oj0*jhhJ@oj0?j2j|?A4*jSB?B2*0/WR@NN((H gPBoBo 2/W?A tj?B0<Nl/ CAr09NgXO0<Nl LO(_$_Nu/ / O$H&I f2?+?+?+??+?+4+2pNk@O N"`0B@L 0NuH8(H$I6J@mH"ҁҀGtkgrk frk "lf0N0+ |g:#"#&3*r@kg kN`N5 kNN5f"pkgrk g2+ | L"lf0NLNuH8O&H$I68H$ԂԀI(2<lftl fzJDgl@ `l 0,| gDJDgrlgN0"J KN`>pl g K0N`(0 KNP`pDlfrlg~tl f J0NB68H"ҁҀ:2`>p4H"ҁ҂rgpr g22 | K"kf0N2H ЀЁ:2Efrl 0 K"kfN`plg l 2, 0 K"kfNplgfIHTHTHTHor B@NmO0+ o f@rkVgkg2NBv7C7|0+"JANC KNIrB@ KNBO L8NuH4O$H6&jrH$ԂԀ犂s( "jf0NxHoC0 KNjXO2H ЀЁ?s?sKB@:3`h:9j4<j620AN'J@g$JDfDxr4H ЀЂ爂s J"jf0N`$JDg BD4H ЀЂ23 | J"jf0NHoHo HoHoHUBgBgBgBgBgBgBgp????9?BgC42pNjO.|gH0O L,xNu/?4v@JCgt@|B@6(|gZvhfR6( JCgJ8|JDg8Df88DB|g*`*f&|g |g| g| g|Sg|r g`v hgB@` AR@`8&NuH $H6:JClBD`2H ЀЁ82JDm0<4H"ҁ҂rg:2H ЀЁ82`62H ЀЁ82JDm2H ЀЁ父rgJDm2H ЀЁ42Eg0`6`tL8NuH $H62H ЀЁ82JDlp`2H ЀЁ父rf0`6`LNu 9fg r @B@NBNuH4O$H:6WAftjVgjVBf&j8*|fpjVf>+k0"KAN:47G0m2/moj8l oj:mJEgC JNIN"2H ЀЁ s *P4*l MNb5@BjV#f>+?k0*4k0*6k4C20 KNj|f7G7oO L,NuH>O$H6<&j$ gRI 0"K LN:40*4T2*6l8* JDmK40H$ԂԀ:3( >>+2k2-k0<NlMHnHnHnHVr 0NmO`"L NN( 0.gn0.mJ@lnn0.oTFf??.?.4r K0Nj\O`42H ЀЁ7 t???.?.?. K024NkO HnHnHnHVr 0NmO0.n`0<Nl j1W j1G2H ЀЁ7 OL|Nu/ / QO$H"jAN:40*4W2*6oC J&jjNPO&_$_NuH>O$H&I6* JCm0j$o`0D@j$|l"0+j&o` 0+D@j&|ljV(j gXA4.8,:,2l2(l0<NlMHnHnHnHVr 0NmO`"K NN( 0.g<. WhJFl*j^4-H"ҁ҂>52H ЀЁ uf6;H>-4H"ҁ҂25H ЀЁ2H$Ԃԁ;(?.?.?.4r0- MNj\Onn0.o??.?.42< LB@Nj\OHnHnHnHVr 0NmO0.n0<Nl j1D j1EO L|NuH8O$H?@2* o6*HDC8*8"ji:*:i|bR@0;N00>`2 <2*@HNfT@>` <2*BHNfT@>?WIG j<(>(0/|b@0;N&:JZnJGg"0*: jh`|Gg 0*: jh`fJGg jh`VGg jh`FJFg0*8 jh`2Fg0*8 jh`JFg jh`Fg jh j0(oBh jho1D j0(oBh jho1E j0(D@jHD@1@ j2(DAjHDA1ASof JN\4?W20 JNLHSHT"K KNlPOpTf0/Wg JN\4O LNuH $H82* oR"j6)H2)j8HNfz"<NfjHCg$ j1@ j8( JN\420 JNLLNuH $H82* oR"j6)H2)j:HNfz"<NfjHCg$ j1@ j8( JN\420 JNLLNuH8UO$H0* ohB@&j2*HDAAi2*HDAAi>8+:*8<*:2lkp2)lkpil5i8pil5i:p2ij8JAokp2)ij:JAokpJ@g(j^ g4,H"ҁ҂64`BCHj*Hj(0*:C??*82*6C?C&A$4*42*"B@NmO0+D@jHD@7@2+DAjHDA7A JN\40+Wfkf j8fj:g>jV?**?*(?*&?*$r0* NmPON"pjVg C$ J&jjNTOLxNuH8YO$H8&j6*I< g@r@g0@|ft KprNA:2<@ KNA8J@l2<@ KpNA80o@@g4?j6?j8?j:CAN( I09@82/9A 9A0oS@9@ 9@2/oSA9A9AJCg(JCoTl pl >?C`ll0D@?@JDg,JDollpl?@?D`ll 0D@?@ LBA09NhΑ0<NlKHU"M Lr09NgXO0<NlC J&jjNOL<NuH6:x@D0HЀ2HNfzмN( g,C 1C1E1DBh 1y BA1A1A1AL8NuN(NuH<$oG27j7jI0+f2+g(67jpSkpkk Kr0Nhpj|lprj|lr4*@Bj 64*ABj 7B4@7B0+A7@r0Nhr0NhZr0Nhr0Nh"BBBA0Nh$HBgBgBBBA0*"NmRXO6J@l^Gl8IRpS|6H*t2g8$ g4pmTf, MNXp M,mNBgBgBBBA0*"NmRXO6`SfJCm |n0`AypNkpL|Nu/ B@CRA Pf BPJ@g`R@2I$qRP" g J$_NuH<8(H6<ER`0H&r" g "L K*k0NSCJClL<NuH86<ER`V0H&r" gHt kVg@kV4+ m(N5kV K"kNN5C$ K(kN`kVN)SCJClLNuH8El6GRpR|4H(s2g$ g LNZ`RfLNuH8El6GRpR|4H(s2g$ g LNZ`RfLNu/ $H0* o"jnN` J"j N$_NuH>&H <N($H <"KNd *g @N6$%H gfN9v *^g0 @N6$%H^ f jN7&`> j^N9v j^N0 *Zg0 @N7%HZ f jN7& j^N7& JN)2` *Jg @N9$%HJ *Ng @N9$%HN5|V5|XBCGRInK`^0H"3fR'"gtjTg"J A,A,npdN0*$5@$2*&5A&0*(5@(2**5A* J`RC|mAygpNkL|NuH8QO$H0* l$rjVgjV"jNJ@f JNR6J@lp`Gn *fAN6$%H5C 0HAR!r5AB5A@5A>5Ar0?A?ANBvp yhg*?**?*(?*&?*$?/4/2/ 0/ NlO ?**?*(4*&2*$0NmlXO(jN"rp LNA5@J@m5|rB@ JNBB@POLNuH0$H&j^#RBj gD6+H ЀЃ03H$ԂԀ43(H"ҁ҂' KN0p KNkpjVgjV J"jNJ@gp`xG *gL @1S j1kBgBg/*rB@NmPO?+?+?+??+?+4+2pNk@O Bj4Bj60k5@82+k5A:B@L NuH8QO$H6* 5| pjVgNBv5|fNJCf( *gBgBgBgBgrB@NmPOB@Nk`Gn0*V|f*"g&4*XmCX A(A(lpgN`"Jpd S(S(lNJCop yhgh2*Xm&$g"0"B"iAN:4 S0(4W2(6o`B@?@>r0?A?A?**?*(?*&?*$?/4/2/ 0/ NlO 0Nm0Nm yA8N5&JCm0HARBPOLNuH8$HjVfBy0* m J"jrNGn0*Xm"gCX A(A(lpeN j^N7& jN7& jZN8 jJN9f jNN9fBCIR`0HfB JN)2`RC|mfBLNu?6( JCoNBvBgBgBgBgr 0NmPO6Nu/ / $HpjVgL5j,$5j.&5j0(5j2*"j0)jDf 2)jFgjV j1jD j1jF`n5j$,5j&.5j(05j*2A5P$5h&5h(5h* j5hD j5hF j0(f2(gjV jBh jBh jVpjTg JN_ JN\4?**?*(?*&?*$r0* NmPON"pjVg C$ J&jjN&_$_Nu/ / $H0* ojjV5Q$5i&5i(5i*pjTgN_ JN\4?**?*(?*&?*$r0* NmPON"pjVg C$ J&jjN&_$_Nu/ $H0* o@jV5Q$5i&5i(5i*N\4?**?*(?*&?*$r0* NmPO$_NuH>O$H> &j(j^8*H0F@kkkkBo" g0,H$ԂԀ?t(<*$>*&6*(:**KMHUHV0+o ??+BgCABB2*"B@NmOVl0`06Ul2`2:y l0`09 6y l2`29 :yl09`06yl29`2:09TD49RyVCBl2`29RyVC<4yXEBl2` 2yXE>yRl49R`4<@l2`2>HUHV???CA42*"pNmO0/oUo oVU" g06,H$Ԃԃ( 4/ y9B6/@SC9C5o 45o65V85U::+VD0+2DAAl7ABCJEo 2+H 눐ЁD2HNf&jg$5C>0*"|gBgBgBg?r 0/NmPO2H 눐Ё2+HNf&jBg$5CB0*"|gBgBgBg?r0/NmPOHj*Hj(0o ??2/o?C&A$4/2*"B@NmOO L|NuH0QO$H0*(yNo`09N?@2*"|g 49o0*Ho?o&j:+BFJEo4H"ҁ҂>3803?@>`0<4H"ҁ҂sf\6sookg0D@80oWBF2H ЀЁ爼sl<32H ЀЁ77oo?C8G2H ЀЁ:3JEnzW7ovj*Apj"gPpj"gP0*"| gP *^g @4(H"ҁ҂牖p0jH@l`07@jVPOL NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu JgJgJgJgJg JgJgJfSHggggg ggf @Nug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNuH &/?<HNA\OJf 9Zg @ 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 pN`/ oLQ d nf@axJg*`6C g,g"@ f` "/?<INA\OJj`p$_Nugp`/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_NuH8$< CG g" c &@ f`(@ ,gb*"Ҩeg ` )H`p"@")Ө )H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" l eb&/ ?<INA\OJfQLNuP`Jg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _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@$ jDNu/ /?<&NN\O$_Nu/ /?< NN\O @$_Nu/A^BhBh2<&ad"_222222Av2222Nu/A^1|1|!I!o1A"_A000000000A^rm`A^Bh1|1Ar`A^1ABh1|r`A^Bh1|1Arh`A^Bh1|1Ar`A^Bh1|1A1Brl`|A^Bh1|1Ar`bA^Bh1|1Arq`HA^1|Bh1A0Bh2ra*09vNuA^Bh1|1Ar `C^3|3|3AC0""A^2<`C2222A^1|Bh1| r `A^BhBhre`3j/ C^2dBi3| Cp 2Q"<ips/ NB$_ _0jA"op,2QAvp 2QNu^vC^3ABi# Ira#Nu/ 1@ 0"<psNBA0$_Nup `0p`*A00p`#v/ A00000 0 0000000000 pa"_2"o2"o"2"o&2"o*2"o.2Nu#vA000000p*`#vA0000p+`h/ #v3p,aT"_2"o2Nu/ #vA0000p.a,"_2Nu#vA0000000 0 p/`#v3p2`#vA0000000 0 0p3`/ #vp6a"_2"o2"o2"o 2Nu#v3p4`/ C222#vp7af"_2"o2Nu#v3pr`H#v3p`6#vA00p!` 3#vp#`/ /pMa"_2"_2"o2"o2Nu/ /A0000 pFa"_2"_2Nu/ /A0000 0000pGa"_2"_2NuA0000000 0 pI`pA0000000 0 pJ`J#v3pN`8/ /pOa."_2"_2"o2"o2Nu/ ?A00pha2CSA|;$Y4Q$_NuA00000pd`A00000pe`3pg`A000000 pi`v33pj`d/ /A0000 00plaB"_2"_2"o 2"o2Nu3pf` 3pk`#v#zpx`/ 3^@@A"C`B@22220<"<nfNBA0$_Nu^|vv A Piano HPLAYSTARTCDEFA#D#GF#G#C#p{pbpbqpxpbpbqppbpbqppbpbqptpbpbppvpbpbpppbpbqp~pbpbppjpbpbpepbpbpXpbpbppcpbpbppppbpbpprpbpbp@A00A*0qj0$S0q<$0 , Aq$x Aq$b X Aq$$.Aq$y;Aq $cBAp$v 7AqN$n wAq$m mAq $,wAq($-Aq$<-,!0Ap$a&"$0 $Aq2$du}!Ap$f ~-'+0 )Ap$h J+Ap$j &Ap$k9..0&-Aq2$ rU\Qr MpZpb'KLCEBZXZFFIIh[j[ACS 1.0e PIANO8v @ [2][ | Soll das ACCESSORY | >>%s << | gestartet werden?][ JA | NEIN ][3][ | Kein Speicher| mehr vorhanden! ][ OK ][2][ Unbekannte GEM-Nachricht | erhalten.| ID = '%s'| Weiterhin berichten?][ JA | NEIN ][3][ Kein freies GEM-Fenster | mehr vorhanden!| Abhilfe ein offenes| GEM-Fenster schlieen.][ OK ][3][ Kein freier ACS-Fenster-| Einschub mehr vorhanden! | Abhilfe ein ACS-Fenster| lschen][ OK ]des ACS 1.01PAPIERKORBOKPulldown Mens ber mich ... -------------------- Aktionen ffnen ^O Schlieen ^U Lschen ^D--------------- Info ^I Beenden ^Q Fenster Nchstes ^W Horizontal ^Z Optionen aus Liste ^L Vertikal ^T Verhalten ^B-----------------Grows/Shrinks(C) 1991, 1992Verstecke ZeigerNEUInformationGenerischer DesktopDas Ziehen der Neu-Ikone aufDas Ziehen von Objektenlscht diese Objekte.auf den PapierkorbZentriere DialogACS 1.01ein anderes Objekt erzeugtkontextabhngig ein neuesDoppelklick erzeugt dasObjekt.Mutterobjekt der Anwendung.ABBRUCHVerhaltenStefan BachertAutorN1111111111|h|{*  H?Ʊ `@D"@D"@D"@D"@D"@D@D@Dr@D"@D"@D"@D"@D"@D"@D"@D"@D"@D"@d&@`?}~ y  HAUIUUU"I%UAU@@?@?@?@>@@ @_@*@UT@@ @ @@AUQb}UQbAU~Zy 0 H80 3gggg30 8*80 0 ````0 0 8T 0'''' 0~ 0     0!!7 Hl7d @ @?xxp㇇ 8p<`ßp0 Ϗ<ZZ# y z  z  z $P   y  z   y  y y y y yz) $z8X$zG$zVzVzf$ zu$$"!zSX$"zVz $ %*'z$)z$*z$z ,$ $ { {|Z|K y  b {:y  y  {. {.{N{|{{|'y  {.{k{{'y   |A|`|`|`|`y z  {  {  @y @%|9  U\QHyy'pKLCEBZXZFFIIh[j[$ 0~H(0}hH( H( w ACS 1.01 (c) Stefan BachertQH$%f[3][][OK]RELEASE 1.010123456789ABCDEF ^vr   4<& 2"&P    . :(   2 8<NV<> "&(   Jh( L > (dT4:  &  " . B 4 t\j ( : .0 F BF  "h, 0 "N**&  * P2 &H   8 ,$0 H  < @  JBLhB&" F@(2.8\@$  J&8JB2&,               D     (Z  & 0   0f. @ T "6T *" F z *02 ,DN<4>*D2 . ,<XXn * 4V  T" D  8$ (84(  <  >F(,P, 8 $(&J  B J  $ &~fPF"      2>`**>**6 lD.R,<*$6   j& ,$   0$0&&0> 4  P  8           P 8  8   8 64 x6***bH0      8   8    80000:   FD:`nL0``>>>> 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`$ON_b0 J"LN"t? 9nNg @N 9nRg @NNa?<LNA/ 29\H ЀЁ$yXE <sY@"* NdEpL@"<A JNeF$_Nu/ AnNQ$H f` J"j N J$_NuH8NO$H fp` GnCph J(jN$K"jNB@LNu x (( hl0(A`,H|fA<  @#"#&#|*!|| #/| yNH`Hy?<&NN\L y& " yN!*|NuH"y* y& "Jxg?/Hy @N y& LNsHyF/<!NMP#Nu/9/<!NMPNuH8YOv@GHWHoHoHSr B@NkO0NO(HNOgF gBrlTg4SCJBm2NQ`plTg L"lrNp L$lN` p L$lNXOLNu yTNNuH8&H09g`$yg(j Jp N`HBy`62H ЀЁ(kI lf K0N$l p J(jNN6lLNu/ / 29\H ЀЁ yXA$h &j JpN&_$_Nu yTNNuAN#NuH>&HK~09fAN#`|$ygp J(jN`bBy`P2H ЀЁ(kI J0N0,S@g S@gS@g` (l p L,lN`Nl` MN#N6lL|NuH>$H69<89>&P09f( yAN7%HJ0@|P62A|08pDH07@ 2HP7A 49f0+ 8D@L6KAK0+ 7@rkH ЁЁЀN&*H fp`%MM <Cp MNb yJo+| BmBm;C;D7|I;|2+AH ЀЁA0*Hxp0"N LNbp"C MNb)M 0+@@ml  JN B@`TD8I0K"`L|NuH0$H6J@m2H"ҁҀ jhϺh "h &h & J0NCL Nu/ $yT R hg1| JN 0* m JB@NC$_Nu?/ ELj:jRjjj y6(pCgj:pCgjRpCgjjpCgj JN#| f6o <,z`.2H ЀЁ>?tA0/2N%J@g:`TFp 4H"ҁ҂tgJEon RBh2H ЀЁ<4>H$Ԃԇ9(>49( jp( J0NC2H ЀЁ jp99 J0NCRCN8l MN'"ByOLtNu/ yT"P$Q gN$_Nu/ NPl$H f NPl$H g0* nrjTf JNQ$_NuH8$H6J@mH"ҁҀ&jIk?k k $,g "B k p"Nb0< lh 9@ `$p"Cx< k Nb l "k #hJBl p l hTgk2+ 0 J"jfNLNu yTN NuH8$H09n #TN`\&ygp K(kN`DBy`22H ЀЁ(jI lf J0N&l K"k NN6lLNu/ 29\H ЀЁ yXA$h "j JN$_NuH<$H*I&P6+JCg^(j2,H ЀЁ99C2H ЀЁ7TBTA1| R!|R!I !mZ;CX J0N:`;|XL<NuH8(H$I6JCm&l2H ЀЁs0NC2H ЀЁs8+`2H ЀЁ832H ЀЁ父sf0H$ԂԀ0H"ҁҀ7(23(f7D(T2H ЀЁ79CBl4LNu/ / $H&I2|dg6nUAg&QAgpSAgZYAg^`l|eg"SAg(SAg.SAg4`V JNT`P"K JN`F"K JN`<0 JN`20 JN `("S JN N` JN` JNl` JN`B@`p&_$_Nu/ $H P f jhh` jhh j2(jp"jf JN$_NuH0$h&P6+ 8+ kfrC0HAHX@5@@pC4J@JXB5BptD2ABI5Ar5ABBE<>*``@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf` kfrC0HAHX@5@p5@@vD4BCJ5BBrD0@AH5@rBE<>*``@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGfL Nu/ $H09g jN'"B RN'" JNW`` JNV$_Nu/ $yT R hg1| JN0* m JB@NC$_NuA}N#NuNNu09gN?E?C?CAr09@NgPOL8NuH QO8:6y8odE.0@|g Rg042<09@Nfr` RUUg4UU2Ar09@NgPOL8NuH4YO y&hBCKE0`|l0HЀ y80HW"M K0NhXO y0(4U2(6W0H$ԂԀ s(fh s( 2h0H54h52hhSA54hhSB5 2h54h52hh SA5 5`H0H5520H$ԂԀs(SA4J5 24H ЀЂsSA0H5BrRCymXOL,NuH4O?@?AE@r0Nfr0NfBBBA0Nf:r0NfXG8>?k0kS@?@2+kSA?AA0rNf̑0<NjK0BC;C`2|l40H uf:/u/u8/u2/u ?A kl~kklxk42/ 0N420N42/0/ N4/ 2/0N42/ 0N420N4/ 20N4/2/ 0N`X:/0Hu/u8/ukl~k420N4420N*420N420NRCymȑ0<NjABA0NfBmOL,NuA0(hmpNu0(RhHЀ"h01Nu/ / UO$H>GgN&p4H"ҁ҂ jp fB2ko8r ЀЂ爂p "jf J0N0+HЀ k1RkCp J&jNTO&_$_NuHGf6+(k`0Wf2H$Ԃԁ j20( |"jf J0N0+C2+@oSkSk0HK0`8:;m;m;m;m;m ;m ;mK8TLSCnCp J*jN` SCTLJCn`TOL<NuH0E&R0*oLBC`20HЀ j80RC4H ЀЂ"k21 |"kf K0NjmBjp K$kNL NuH8$H6:8(IH$ԂԀ&jk0kS@lmplnhk0kS@QmXlnR2<kfHtk f@0+| g0N`.<+JFo&"L420 JNz2H ЀЁ j<0FfLxNuH0O86Nk:NO$H gryRfN yADN3G67CpNl?<`CA4<`2+0Nj8TO0+lD@7@S0+l D@7@kpNl#C4 KN&>?k0kS@?@2+kSA?AC4*62*4 JB@N yA8N3OL 8NuH $H6:<H$ԂԀA(hm02(hAl$hm4(hBl0<hfrh gp`B8(JDm8hh~420 JNJ@m>2H ЀЁ82DfJGm0`0LNuHo20N8?T HoHo"L KNjPOpog Sf2/ Tg20NHoHo"L KNjPO20NkNO$H gH4j62j4 jB@N62H ЀЁ*j4-|f j0N@(6J@l`vCfgJEm.2H ЀЁ W*h4-|f2- |"hf0NzJCmF2H ЀЁ*j4-| g xm g6`0-|frm J"jf0N.:pof yA8N3EJEm W*h5| 2H ЀЁ45 |gX5o 5o5F5G3N3P3R#T#X3\N3x2H ЀЁ uNN3 Wf&2H ЀЁ45|f25 |"hf0N0* g2*gp yhgJFo0`0D@?JGo0`0D@_@BC` 2A@A0RCJ@fJCg joSCJCg joSCBo`*B@86xl`ST20`@04bBNSDJDn0/RoU@mOL0*NO&H g| RfrkVgvN@h>?j ?j ?jNO*H0| |b@0;N@R`l`2*0*N,`C K(kjN` K"knN`pkTf y"(4g K"krN`lp K(kN`^ K"kvN`v0* K"kzN`f0* K"k~N`X0* K"kN`JC K(kN`>C K(kN`2BCp K(kN`"BC` g MNQ` MNf` JN(2JCg0+o r KB@N@~POL<NuH]O?@>NEPGN20Nk6NO(H g~8l6JDl$r"yigdJCg^02N-`P6l4,l g@42 NB@N6J@m*BD:<` 0 NN@(<JFm2H ЀЁ46| IgJFm62H ЀЁK|lv4-| If02N`0-| ]S@g2-| g0tm g|yRgx`.pyRgx:`N`pmg L0N=J@gh|mr`BA0"N LN<JDgL~KSGBAp NgHUHo"M MNjPO02/@|fJGnJEgJEgJGn 20N&\OL|NuH0YOHWHoHoHor B@NkO0/NO$H g29PA409NN%J@g&j gp69Nj4:9Pj6BD42 K0N:`(2H ЀЁ43 |gxs,0 KN@(:JEl2H ЀЁЀ yA8N3pjVf2*o JB@rN@~p J&jN`2NN3Rp yhf"*^g J09N29PN-XOL 8NuNu// OE`HHRHRHRHRHRBgp?BgBgBgBgBgBgBgBgBgBgBg"JA.BBBAp0Nh O.|g AN2v`SCJCnO$_&NuH>OEPGNB@46KIMRHWHoHVHTHR 9r??9BgBgBgBgBgt??????"K Mp7rNh O.6r@g U)fNO/HNx`zpNlpCg MNz`pCg20NpCg Vg0/Np CgNHVHT"J KNjPO0frCgNNxN'tNPB@Nl09g 29gNOL|NuN/J@fN!JN2>B@NuN2>pNuNuH8O&H(IE` %f +sfTK`f"L JN_"K JN_tApNiOLNuH086$hG82H ЀЁ父r f?+?+?+4 J0rNh~\O`$p???+?+?+4BA J0NiO L Nu/ / &H$I?*?*?*42<B@ kNh~\O&_$_NuH`N JNa>N6$_Nu// &29g N`x$H`N N`x$HN6 fAppNi`pЪѹ J$_&NuH8$H gBGN Sp n <N(H f JN>`(B& S (R S!LNu/ EN` RS ( R pN R (n"g N R$`$_NuB@NuNu/ OC_EpQ ypgVE$0r `|w4B|w 0@|wrPwB*"JApN"3pO$_NuNNuH $H:0*H$ԂԀ42(H"ҁ҂620*H"ҁҀ82` 2H ЀЁ622H ЀЁ82Ef0L8NuH0QO&H$I68^f2AN8&2H ЀЁJDgj `j C K$kjNPOL NuH4O&H$I6 IN88r"J K0NHWHo CANjPOp2/@|?@KzBo 2H ЀЁ?r?r"JA0N8&>/oy8y/oy:y>JGo2H ЀЁ爟roAN9@/H?/?/?/4/r0 JNh~\OpNlHWHoHoHo HoBgBgBgBgBgBgBgp???/.?/2??/2C842pNh O.>pNl?/4/ r0 JNhTO<@f|Fgؑ0<Nj0/ g>4H"ҁ҂r p?42 |??-?-?- J0BA4NiO JFmpp4H"ҁ҂r f\"J M0N8&p?r0H$ԂԀ犂r( ??-?-?- J0BA4NiO 2H ЀЁr ?| `Bo 0<Nj:JFl?/4/ r0* JNhTO<J@mHWHo CANjPOp2/@|?@Fgb4H"ҁ҂ 2 fNC oN:02H ЀЁ55"J K0BAN60 JNZ8r"J K0N`FFgpGgC oN:02H ЀЁ55N/JFof2H ЀЁ42 |gPjgJjgD:*H(؄؅猼rHg0#T#X3\N3x2H ЀЁ rNN3BA0"J KNO"L,NuH086NO$H&j^N3x2H ЀЁ43 |g#T#X3\ sN|fNN3r0 KNiL NuH0QO$H:6&j^$ gf>?k0+j8l`0*8?@?k20AN%J@g22+H ЀЁ83?4 K0rNhTO:@l"K JN^POL 8NuH0YO$H6?A&j^$ g KN>8J@gv4+H"ҁ҂>2H ЀЁ<30+H$ԂԀ>3(vD:0 KN@(6J@m,kf`*2H ЀЁ<32H ЀЁ>3Wfp`GfN3x#T#X3\0* f,BA K0Ni2H ЀЁ sNr0 KNi`*r0"K JN 2H ЀЁ sNBA0"K JNN3B@XOL NuH $H6*2H ЀЁ5<622H ЀЁ820H$ԂԀ r( N`*JEgRE0B:4H"ҁ҂牚rr4H ЀЂr<*0H"ҁҀ<22H ЀЁ82Dg22H ЀЁ<22H ЀЁr0H$ԂԀr(`LxNu/ YOEHRHo"J JNjPOpWfXO$_NuH j0Nj$_NuSybf09`f y09NjNu09`Ry`J@f 0<NjNuSy`f0<Nj y09NjNuH<$HBC&H|p KGhg0HN&(H g0H"JNb&L*K0+|f2+ | f+H|| b|B4; N <*p`p`N` k N6T*H'H `F k N6*H'H `4 k N6 *H'H `" k N5*H'H ` k N7*H'H f`p KGhgF LL<Nu/ / $H g&J0+|fx2+ | fl+H|| b\B4; N <$R0R0H0 k N6`. k N7`" k N7X` k N6L` k N6p KGhgp JN'"&_$_Nu/ / &Hp"N&$H g"Kp"Nb kN7%H f` J&_$_Nu/ $H g jN7X JN'"$_Nu/ / &HpN&$H f`p"K JNb J&_$_NuN'"Nu/ / &HpN&$H g>"KpNb SN7$ kN7%H kN7%H g "*g$f` J&_$_Nu/ $H g$ jN7X jN7X RN7X JN'"$_Nu/ / &HpN&$H f`p"K JNb J&_$_NuN'"NuH0$Hg,N`&R N&&H f` "J KNb K`AL NugN'"Nu?/ $H0* |fj 0*|f JB@Ni0*|gLQ@g`j j 6(h0(h@l6jo5C6(h0(h @l6jo*5C`$ j 6(Kjo5C0*hl5hp JEhgb$_6NuH0&H$I6H"ҁҀAB@4(|| bNB4; N ""DD.D""0( H@D@`""h 0)D@`prhgprhgprh gp2(|@gpBAt h gJ@o2A`2DAAJ@lB@4(@64(@7B4BhA7B4BhA7B82H ЀЁ62|g"0H$ԂԀ犸r(f82(S82(k`L Nu/ / O$H0ljBP0*ljBjA80jhJ@oj0*jhhJ@oj0?j2j|?A4*jSB?B2*0/WR@NL(H gPBoBo 2/W?A tj?B0<Nj/ CAr09@NeXO0<Nj LO(_$_Nu/ / O$H&I f2?+?+?+??+?+4+2pNi>O N `08J@fp`.2H ЀЁ43| gz`BE2pD"K JN<B@L 0NuH8(H$I6J@mH"ҁҀGtkgrk frk "lf0N0+ |g:#T#X3\r@kg kN`N3x kNN3f"pkgrk g2+ | L"lf0NLNuH8O&H$I68H$ԂԀI(2<lftl fzJDgl@ `l 0,| gDJDgrlgN0"J KN`>pl g K0N`(0 KN@`pDlfrlg~tl f J0N@(8H"ҁҀ:2`>p4H"ҁ҂rgpr g22 | K"kf0N2H ЀЁ:2Efrl 0 K"kfN`plg l 2, 0 K"kfNplgfIHTHTHTHor B@NkO0+ o f@rkVgkg2N@h7C7|0+"JANC KNGrB@ KN@~O L8NuH4O$H6&jrH$ԂԀ犂s( "jf0NxHoC0 KNhXO2H ЀЁ?s?sKPB@:3N`h:9Nj4<j620AN%J@g$JDfDxr4H ЀЂ爂s J"jf0N`$JDg BD4H ЀЂ23 | J"jf0NHoHo HoHoHUBgBgBgBgBgBgBgp????9N?BgCN42pNh O.|gH0O L,xNu/?4v@JCgt@|B@6(|gZvhfR6( JCgJ8|JDg8Df88DB|g*`*f&|g |g| g| g|Sg|r g`v hgB@` AR@`8&NuH $H6:JClBD`2H ЀЁ82JDm0<4H"ҁ҂rg:2H ЀЁ82`62H ЀЁ82JDm2H ЀЁ父rgJDm2H ЀЁ42Eg0`6`tL8NuH $H62H ЀЁ82JDlp`2H ЀЁ父rf0`6`LNu 9g r @B@N@~NuH4O$H:6WAftjVgjVB&j8*|fpjVf>+k0"KAN8&7G0m2/moj8l oj:mJEgC JNGN 2H ЀЁ s *P4*l MN`5@BjV#>+?k0*4k0*6k4C20 KNh޶|f7G7oO L,NuH>O$H6<&j$ gRI 0"K LN8&0*4T2*6l8* JDmK40H$ԂԀ:3( >>+2k2-k0<NjMHnHnHnHVr 0NkO`"L NN&0.gn0.mJ@lnn0.oTFf??.?.4r K0Nh~\O`42H ЀЁ7 t???.?.?. K024NiO HnHnHnHVr 0NkO0.n`0<Nj j1W j1G2H ЀЁ7 OL|Nu/ / QO$H"jAN8&0*4W2*6oC J&jjNPO&_$_NuH>O$H&I6* JCm0j$o`0D@j$|l"0+j&o` 0+D@j&|ljV(j gXA4.8,:,2l2(l0<NjMHnHnHnHVr 0NkO`"K NN&0.g<. WhJFl*j^4-H"ҁ҂>52H ЀЁ uf6;H>-4H"ҁ҂25H ЀЁ2H$Ԃԁ;(?.?.?.4r0- MNh~\Onn0.o??.?.42< LB@Nh~\OHnHnHnHVr 0NkO0.n0<Nj j1D j1EO L|NuH8O$H?@2* o6*HDC8*8"ji:*:i|bR@0;N00>`2 <2*@HNdT@>` <2*BHNdT@>?WIG j<(>(0/|b@0;N&:JZnJGg"0*: jh`|Gg 0*: jh`fJGg jh`VGg jh`FJFg0*8 jh`2Fg0*8 jh`JFg jh`Fg jh j0(oBh jho1D j0(oBh jho1E j0(D@jHD@1@ j2(DAjHDA1ASof JNZ&?W20 JNJHSHT"K KNjPOpTf0/Wg JNZ&O LNuH $H82* oR"j6)H2)j8HNd"<NdjHCg$ j1@ j8( JNZ&20 JNJLNuH $H82* oR"j6)H2)j:HNd"<NdjHCg$ j1@ j8( JNZ&20 JNJLNuH8UO$H0* ohB@&j2*HDAAi2*HDAAi>8+:*8<*:2lkp2)lkpil5i8pil5i:p2ij8JAokp2)ij:JAokpJ@g(j^ g4,H"ҁ҂64`BCHj*Hj(0*:C??*82*6C?C&A$4*42*"B@NkO0+D@jHD@7@2+DAjHDA7A JNZ&0+Wfkf j8fj:g>jV?**?*(?*&?*$r0* NkPON pjVg C$ J&jjNTOLxNuH8YO$H8&j6*I< g@r@g0@|ft KprN?:2<@ KN?8J@l2<@ KpN?80o@@g4?j6?j8?j:C8AN&I09@82/9A 9A0oS@9@ 9@2/oSA9A9AJCg(JCoTl pl >?C`ll0D@?@JDg,JDollpl?@?D`ll 0D@?@ LBA09@Nf̑0<NjKHU"M Lr09@NeXO0<NjC J&jjNOL<NuH6:x@D0LHЀ2HNdмN& g,C 1C1E1DBh 1yL BA1A1A1AL8NuN&NuH<$oGd7j7jI@0+f2+g(67jpSkpkk Kr0Nfpj|lprj|lr4*@Bj 64*ABj 7B4@7B0+A7@r0Nfr0NfXr0Nfr0Nf BBBA0Nf:pjf rjfBA0Ner0Nfr0Ne K0Nfr0Nfr0NfXBBBA0Nf:pgLKpS;@;@ :rk;A;A;Apk;@;@rk;A;A M0rNgpjg0TSTkUkUk Kr0Ng267A K0rNg KBA0NfpjL<Nu/ / 09RyJ@f0<A` 2IBS@J@lC$Q1j E8&Q0*k o`&Q0+ 1@2*&Q4+ BB1A0*jk h1@4942IB1A2960HA1@49f +4g&@` Q&h0"kN#09gNU&_$_NuSyfpNPN'tNuH8BCE`0H&r" g7| RC|mBC`&0H&rB" g KNVp K(kNRC|mLNu2IA pNu yNuB@NuH>$HBgBgBBBA0*"NkPXO6J@l^G8IpS|6H*t2g8$ g4pmTf, MNVp M,mNBgBgBBBA0*"NkPXO6`SfJCm |n0`Aq8pNipL|Nu/ B@CA Pf BPJ@g`R@2I$qRP" g J$_NuH<8(H6<E`0H&r" g "L K*k0NSCJClL<NuH86<E`V0H&r" gHt kVg@kV4+ m(N3xkV K"kNN3C$ K(kN`kVN'tSCJClLNuH8E6GpR|4H(s2g$ g LNX`RfLNuH8E6GpR|4H(s2g$ g LNX`RfLNu/ $H0* o"jnN` J"j N$_NuH>&H <N&$H <"KNb *g @N4%H gfN7h *^g0 @N4%H^ f jN5`> j^N7h j^N. *Zg0 @N5%HZ f jN5 j^N5 JN'"` *Jg @N7%HJ *Ng @N7%HN5|V5|XBCGIKB`^0H"3fR'"gtjTg"J A,A,npdN0*$5@$2*&D5A&0*(5@(2**D5A* J`RC|mAqpNiL|NuH8QO$H0* l$rjVgjV"jNJ@f JNR6J@lp`G *fAN4%H5C 0HA!r5AB5A@5A>5Ar0?A?AN@hp yhg*?**?*(?*&?*$?/4/2/ 0/ NjO ?**?*(4*&2*$0NkjXO(jN rp LN?5@J@m5|rB@ JN@~B@POLNuH0$H&j^#Bj gD6+H ЀЃ03H$ԂԀ43(H"ҁ҂' KN.p KNipjVgjV J"jNJ@gp`xG8 *gL @1S j1kBgBg/*rB@NkPO?+?+?+??+?+4+2pNi>O Bj4Bj60k5@82+k5A:B@L NuH8QO$H6* 5| pjVgN@h5|fNJCf( *gBgBgBgBgrB@NkPOB@Ni`G0*V|f*"g&4*XmCX A(A(lpgN`"Jpd S(S(lNJCop yhgh2*Xm&$g"0"B"iAN8& S0(4W2(6o`B@?@>r0?A?A?**?*(?*&?*$?/4/2/ 0/ NjO 0Nk0Nk yA8N3JCm0HABPOLNuH8$HjVfBy0* m J"jrNG0*Xm"gCX A(A(lpeN j^N5 jN5 jZN6 jJN7X jNN7XBCI`0HfB JN'"`RC|mfBLNu?6( JCoN@hBgBgBgBgr 0NkPO6Nu/ / $HpjVgL5j,$5j.&5j0(5j2*"j0)jDf 2)jFgjV j1jD j1jF`n5j$,5j&.5j(05j*2A85P$5h&5h(5h* j5hD j5hF j0(f2(gjV jBh jBh jVpjTg JN] JNZ&?**?*(?*&?*$r0* NkPON pjVg C$ J&jjN&_$_Nu/ / $H0* ojjV5Q$5i&5i(5i*pjTgN] JNZ&?**?*(?*&?*$r0* NkPON pjVg C$ J&jjN&_$_Nu/ $H0* o@jV5Q$5i&5i(5i*NZ&?**?*(?*&?*$r0* NkPO$_NuH>O$H> &j(j^8*H0F@kkkkBo" g0,H$ԂԀ?t(<*$>*&6*(:**KMHUHV0+o ??+BgCABB2*"B@NkOVl0`06Ul2`2:yl2`29>:yBl09B`06yDl29D`2:09D49yCBl2`29yC<4yEBl2` 2yE>yl49`4<@l2`2>HUHV???CA42*"pNkO0/oUo oVU" g06,H$Ԃԃ( 4/ yB9B6/@SC9C5o 45o65V85U::+VD0+2DAAl7ABCJEo 2+H 눐ЁD2HNd&jg$5C>0*"|gBgBgBg?r 0/NkPO2H 눐Ё2+HNd&jBg$5CB0*"|gBgBgBg?r0/NkPOHj*Hj(0o ??2/o?C&A$4/2*"B@NkOO L|NuH0QO$H0*(yo`09?@2*"|g 494o0*Ho?o&j:+BFJEo4H"ҁ҂>3803?@>`0<4H"ҁ҂sf\6sookg0D@80oWBF2H ЀЁ爼sl<32H ЀЁ77oo?C8G2H ЀЁ:3JEnzW7ovj*A6pj"gPpj"gP0*"| gP *^g @4(H"ҁ҂牖p0jH@l`07@jVPOL Nu/ $H2UAg` JN:p`B@$_NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu JgJgJgJgJg JgJgJfSHggggg ggf @Nug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNuH &/?<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 nL`/ oLQ d nf@axJg*`6C g,g"@ f` "/?<INA\OJj`p$_Nugp`/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_NuH8$< CG g" c &@ f`(@ ,gb*"Ҩeg ` )H`p"@")Ө )H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" l eb&/ ?<INA\OJfQLNuP`Jg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _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@$ jDNu/ /?< NN\O @$_Nu/ABhBh2<&ad"_222222A2222Nu/A1|1|!I!o1A"_A000000000Arm`ABh1|1Ar`A1ABh1|r`ABh1|1Arh`ABh1|1Ar`ABh1|1A1Brl`|ABh1|1Ar`bABh1|1Arq`HA1|Bh1A0Bh2ra*09NuABh1|1Ar `C3|3|3AC0""A2<`C2222A1|Bh1| r `ABhBhre`3/ C2dBi3| Cp 2Q"<gps/ NB$_ _0AN"op,2QAp 2QNuNNC3ABi# Ira#Nu/ 1@ 0"<psNBAN0$_Nup `0p`*AN00p`#/ AN00000 0 0000000000 pa"_2"o2"o"2"o&2"o*2"o.2Nu#AN000000p*`#AN0000p+`h/ #3Np,aT"_2"o2Nu/ #AN0000p.a,"_2Nu#AN0000000 0 p/`#3Np2`#AN0000000 0 0p3`/ #p6a"_2"o2"o2"o 2Nu#3Np4`/ CN222#p7af"_2"o2Nu#3Npr`H#3Np`6#AN00p!` 3N#p#`/ /pMa"_2"_2"o2"o2Nu/ /AN0000 pFa"_2"_2Nu/ /AN0000 0000pGa"_2"_2NuAN0000000 0 pI`pAN0000000 0 pJ`J#3NpN`8/ /pOa."_2"_2"o2"o2Nu/ ?AN00pha2CSA|;$Y4Q$_NuAN00000pd`AN00000pe`3Npg`AN000000 pi`v3N3Ppj`d/ /AN0000 00plaB"_2"_2"o 2"o2Nu3Npf` 3Npk`##px`/ 3@@A"CB@22220<"<ldNBAN0$_NuNN A Piano nVn`n`p Anb" a_SNOn~ MnXn`'I>AC4XVX8DFGZY\YACS 1.0e PIANO1 l ` [2][ | Soll das ACCESSORY | >>%s << | gestartet werden?][ JA | NEIN ][3][ | Kein Speicher| mehr vorhanden! ][ OK ][2][ Unbekannte GEM-Nachricht | erhalten.| ID = '%s'| Weiterhin berichten?][ JA | NEIN ][3][ Kein freies GEM-Fenster | mehr vorhanden!| Abhilfe ein offenes| GEM-Fenster schlieen.][ OK ][3][ Kein freier ACS-Fenster-| Einschub mehr vorhanden! | Abhilfe ein ACS-Fenster| lschen][ OK ]des ACS 1.01PAPIERKORBOKPulldown Mens ber mich ... -------------------- Aktionen ffnen ^O Schlieen ^U Lschen ^D--------------- Info ^I Beenden ^Q Fenster Nchstes ^W Horizontal ^Z Optionen aus Liste ^L Vertikal ^T Verhalten ^B-----------------Grows/Shrinks(C) 1991, 1992Verstecke ZeigerNEUInformationGenerischer DesktopDas Ziehen der Neu-Ikone aufDas Ziehen von Objektenlscht diese Objekte.auf den PapierkorbZentriere DialogACS 1.01ein anderes Objekt erzeugtkontextabhngig ein neuesDoppelklick erzeugt dasObjekt.Mutterobjekt der Anwendung.ABBRUCHVerhaltenStefan BachertAutorL1111111111tus^  H?Ʊ `@D"@D"@D"@D"@D"@D@D@Dr@D"@D"@D"@D"@D"@D"@D"@D"@D"@D"@d&@`?uv>r   HAUIUUU"I%UAU@@?@?@?@>@@ @_@*@UT@@ @ @@AUQb}UQbAUvwq 0 H80 3gggg30 8x^80 0 ````0 0 8x 0'''' 0x 0     0x!!7 Hl7d @ @?xxp㇇ 8p<`ßp0 Ϗ<yZZ# q rR  r  r $P   r(  r=  q  q q q q qr] "rlH"r{"rrr" r"$"!rQJ""rr " %*'r")r"*s$s " $ s> stt r  y snq  r  sb sbsstItt1tQ'r  sbsss'r   tuttttr s0  sM  s  @r @%tm  SNOHqq'yI>AC4XVX8DFGZY\Y" 0vH(Ѐ0uH( ؀x<H( oT0ACS 1.01 (c) Stefan BachertOH"#V[3][][OK]RELEASE 1.010123456789ABCDEF NNr   "P    . :(   2 8<NV<> "&(   Jh( L > (dT4:  &  " . B 4 t\j ( : .0 F BF  "h, 0 "N**&  * P2 &H   8 ,$0 H  < @  JDLhB&" F@(2.8\@$  J&8JB2&,               D     (Z  & 0   0f. @ T "6T *" F z *02 ,DN<4>*D2 . ,<XXn * 4V  T" D  8$ (84(  <  >F(,P, 8 $(&J  B J  $ &~fPF"      2>`**>**6 ވD.R,<*$6   j& ,$   0$0&&0> 4  8 64 x6***bH0      8   8    80000:   FD:`n0``l>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#^3b k #h Ј<.@#dJybg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON_0 J"LN"? 9ng @N 9ng @NNa?<LNA/ 29H ЀЁ$yE <sY@"* NeEu@"<A JNeBApPNhX$_Nu/ At0NR0$H f`09Bg J"j N J$_Nu8pNupNuANeNuH8ANe09Bg.NP $H fp` Gt0Cph J(jN$K"jNB@LNu x (( hl0(A`,H|fA<  @###|!0|| ^#/| yNH`Hy&?<&NN\L y yN!|NuH"y y Jxg?/HyZ@N y ^LNsHy/<!NMP#Nu/9/<!NMPNuH8YOv@GHWHoHoHSr B@NkjO0NO(HNP gF gBrlTg4SCJBm2NQ`plTg L"lrNp L$lN` p L$lNXOLNu yN,NuH8&H09Pg`$yJg(j Jp N`HByR`62H ЀЁ(kI lf K0N $l p J(jNNd6lLNu/ / 29H ЀЁ yA$h &j JpN&_$_Nu yNNuA&N#NuH>&HKN09PfAN#`|$yJgp J(jN`bByR`P2H ЀЁ(kI J0N 0,S@g S@gS@g` (l p L,lN`Nl` MN#Nd6lL|NuH>$H6989&P09Bf( yFAN7b%HJ0@|P62A|08pDH07@ 2HP7A 49Bf0+ 8D@L6KAK0+ 7@rkH ЁЁЀN'*H fp`%MM <Cp MNb yo+| BmBm;C;D7|I;|2+AH ЀЁA0*Hxp0"N LNbp"C MNb)M 0+@@ml  JN B@`TD8I0K"`L|NuH0$H6J@m2H"ҁҀ jhϺh "h &h & J0NCLL Nu/ $y R hg1| JN 0* m JB@NCL$_Nu?/ Ej:jRjjj yF6(pCgj:pCgjRpCgjjpCgj JN#Ұ| f6o <,z`.2H ЀЁ>?tA0/2N%J@g:`TFp 4H"ҁ҂tgJEon RBh2H ЀЁ<4>H$Ԃԇ9(>49( jp( J0NCL2H ЀЁ jp99 J0NCLRCNd8l MN'pByTOLtNu/ y"P$Q gN$_Nu/ NP$H f NP$H g0* nrjTf JNR$_NuH8$H6J@mH"ҁҀ&jIk?k k $,g "B k p"Nb0< lh 9@ `$p"C} k Nb l "k #hJBl p l hTgk2+ 0 J"jfNLNu yN $NuH8$H09Pn #N`\&yJgp K(kN`DByR`22H ЀЁ(jI lf J0N &l K"k NNd6lLNu/ 29H ЀЁ yA$h "j JN$_NuH<$H*I&P6+JCg^(j2,H ЀЁ99C2H ЀЁ7TBTA1| !|!I !mZ;CX J0N:`;|XL<NuH8(H$I6JCm&l2H ЀЁs0NCL2H ЀЁs8+`2H ЀЁ832H ЀЁ父sf0H$ԂԀ0H"ҁҀ7(23(f7D(T2H ЀЁ79CBl4LNu/ / $H&I2|dg6nUAg&QAgpSAgZYAg^`l|eg"SAg(SAg.SAg4`V JN`P"K JN`F"K JN`<0 JN`20 JN `("S JN ` JN` JNl` JN`B@`p&_$_Nu/ $H P f jhh` jhh j2(jp"jf JN$_NuH0$h&P6+ 8+ kfrC0HAHX@5@@pC4J@JXB5BptD2ABI5Ar5ABBE<>*``@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂50@FH5REEfBERF2H ЀЁ>2JGf` kfrC0HAHX@5@p5@@vD4BCJ5BBrD0@AH5@rBE<>*``@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGf>+`@0HEHX@4H"ҁ҂56CFK5RFFfBFRE2H ЀЁ>2JGfL Nu/ $H09Bg jN'pB RN'p JNW` JNV\$_Nu/ $y R hg1| JN0* m JB@NCL$_NuA.N#NuNNu09BgNpNPNtNuNNuH QO8:6yo`EpCg Rg042<09Nf` RUUg4UU2?E?C?CAr09NhPOL8NuH QO8:6yodE0@|g Rg042<09Nf` RUUg4UU2Ar09NhPOL8NuH4YO yJ&hBCKE`|l0HЀ y^80HW"M K0NiXO yJ0(4U2(6W0H$ԂԀ s(fh s( 2h0H54h52hhSA54hhSB5 2h54h52hh SA5 5`H0H5520H$ԂԀs(SA4J5 24H ЀЂsSA0H5BrRCyPmXOL,NuH4O?@?AEr0Ngr0NfBBBA0Nfr0NfG>?k0kS@?@2+kSA?AA0rNg(0<Nk8KBC;C`2|l40H uf:/u/u8/u2/u ?A kl~kklxk42/ 0N420N42/0/ N4/ 2/0N42/ 0N420N4/ 20N4/2/ 0N`X:/0Hu/u8/ukl~k420N4420N*420N420NRCyPmȑ0<Nk8ABA0Ng(BmOL,NuAJ0(hmpNu0(RhHЀ"h01Nu/ / UO$H>GJgN&p4H"ҁ҂ jp fB2ko8r ЀЂ爂p "jf J0N0+HЀ k1RkCp J&jNTO&_$_NuHGJf6+(k`0Wf2H$Ԃԁ j20( |"jf J0N0+C2+@oSkSk0HK`8:;m;m;m;m;m ;m ;mK8TLSCnCp J*jN` SCTLJCn`TOL<NuH0EJ&R0*oLBC`20HЀ j80RC4H ЀЂ"k21 |"kf K0NjmBjp K$kNL NuH8$H6:8(IH$ԂԀ&jk0kS@lmplnhk0kS@QmXlnR2<kfHtk f@0+| g0N`.<+JFo&"L420 JNz2H ЀЁ j<0FfLxNuH0O86Nl :NO$H gryfN yFADN3dG67CpNlb?<`CA4<`2+0NjTO0+lD@7@S0+l D@7@kpNlb#JC4 KN&^>?k0kS@?@2+kSA?AC4*62*4 JB@N yFA8N3dOL 8NuH $H6:<H$ԂԀA(hm02(hAl$hm4(hBl0<hfrh gp`B8(JDm8hh~420 JNJ@m>2H ЀЁ82DfJGm0`0LNuHo20N8?T HoHo"L KNkJPOpog Sf2/ Tg20NHoHo"L KNkJPO20Nl NO$H gH4j62j4 jB@N62H ЀЁ*j4-|f j0N@t6J@l`vCfgJEm.2H ЀЁ W*h4-|f2- |"hf0NzJCmF2H ЀЁ*j4-| g xm g6`0-|frm J"jf0N.:pof yFA8N3dEJJEm W*h5| 2H ЀЁ45 |gX5o 5o5F5G333##3N32H ЀЁ uNN3 Wf&2H ЀЁ45|f25 |"hf0N0* g2*gp yFhgJFo0`0D@?JGo0`0D@_@BC` 2A@A0RCJ@fJCg joSCJCg joSCBo`*B@86xl`ST20`@04bBNSDJDn0/RoU@mOL0*NO&H g| RfrkVgvN@>?j ?j ?jNP *H0| |b@0;N@R`l`2*0*N,`C K(kjN` K"knN`pkTf yF"(4g K"krN`lp K(kN`^ K"kvN`v0* K"kzN`f0* K"k~N`X0* K"kN`JC K(kN`>C K(kN`2BCp K(kN`"BC` g MNR` MNf` JN(~JCg0+o r KB@N@POL<NuH]O?@>NEG20Nl 6NO(H g~8l6JDl$r"yFigdJCg^02N-d`P6l4,l g@42 NB@N6J@m*BD:<` 0 NN@t<JFm2H ЀЁ46| IgJFm62H ЀЁK|lv4-| If02N`0-| ]S@g2-| g0tm g|ygx`.pygx:`N`pmg L0N>J@gh|mr`BA0"N LNOEGB@46KIMHWHoHVHTHR 9$r??9&BgBgBgBgBgt??????"K Mp7rNhhO.6r@g U)fNP /HNx`zpNlbpCg MNz`pCg20NpCg Vg0/Np CgNHVHT"J KNkJPO0frCgNNxN'NQ&B@Nlb09Bg 29(gNOL|NuN0J@fN!N2B@NuN2pNuNuH8O&H(IE` %f +sfTK`f"L JN`$"K JN_ApNiOLNuH086$hG2H ЀЁ父r f?+?+?+4 J0rNh\O`$p???+?+?+4BA J0Ni\O L Nu/ / &H$I?*?*?*42<B@ kNh\O&_$_NuH`(B& S (R S!LNu/ E` RS ( R pN R (n"g N R$`$_NuB@Nu/ OCEpQ ygVE$0r `|w4B|w 0@|wrPwB*"JAvIN"3O$_NuNNuH $H:0*H$ԂԀ42(H"ҁ҂620*H"ҁҀ82` 2H ЀЁ622H ЀЁ82Ef0L8NuH0QO&H$I68^f2AN8r2H ЀЁJDgj `j C K$kjNPOL NuH4O&H$I6 IN88r"J K0NHWHo CANkJPOp2/@|?@KzBo 2H ЀЁ?r?r"JA0N8r>/oyyJGo2H ЀЁ爟ro>/oyyJGo2H ЀЁ爟roAN9/H?/?/?/4/r0 JNh\OpNlbHWHoHoHo HoBgBgBgBgBgBgBgp???/.?/2??/2C842pNhhO.>pNlb?/4/ r0 JNhTO<@f|Fgؑ0<Nk80/ g>4H"ҁ҂r p?42 |??-?-?- J0BA4Ni\O JFmpp4H"ҁ҂r f\"J M0N8rp?r0H$ԂԀ犂r( ??-?-?- J0BA4Ni\O 2H ЀЁr ?| `Bo 0<Nk8:JFl?/4/ r0* JNhTO<J@mHWHo CANkJPOp2/@|?@Fgb4H"ҁ҂ 2 fNC oN:|2H ЀЁ55"J K0BAN60 JNZ8r"J K0N`FFgpGgC oN:|2H ЀЁ55N/JFof2H ЀЁ42 |gPjgJjgD:*H(؄؅猼rHg0##3N32H ЀЁ rNN3BA0"J KNO"L,NuH086NP $H&j^N32H ЀЁ43 |g##3 sN|fNN3r0 KNjLL NuH0QO$H:6&j^$ gf>?k0+j8l`0*8?@?k20AN%J@g22+H ЀЁ83?4 K0rNhTO:@l"K JN^POL 8NuH0YO$H6?A&j^$ g KN?>8J@gv4+H"ҁ҂>2H ЀЁ<30+H$ԂԀ>3(vD:0 KN@t6J@m,kf`*2H ЀЁ<32H ЀЁ>3Wfp`GfN3##30* f,BA K0NjL2H ЀЁ sNr0 KNjL`*r0"K JN 2H ЀЁ sNBA0"K JNN3B@XOL NuH $H6*2H ЀЁ5622H ЀЁ820H$ԂԀ r( N`j*JEgRE0:4H"ҁ҂牚rr4H ЀЂr<*0H"ҁҀ<22H ЀЁ82Dg22H ЀЁ<22H ЀЁr0H$ԂԀr(`LxNu/ YOEHRHo"J JNkJPOpWfXO$_NuH j0Nk8$_NuSyf09f y09Nk8Nu09RyJ@f 0<Nk8NuSyf0<Nk8 y09Nk8NuH<$HBC&H|p KGhg0HN'(H g0H"JNb&L*K0+|f2+ | f+H|| b|B4; N <*p`p`N` k N6*H'H `F k N7.*H'H `4 k N6l*H'H `" k N6*H'H ` k N7b*H'H f`p KGhgF LL<Nu/ / $H g&J0+|fx2+ | fl+H|| b\B4; N <$R0R0H0 k N6`. k N7Z`" k N7` k N6` k N6Np KGhgp JN'p&_$_Nu/ / &Hp"N'$H g"Kp"Nb kN7b%H f` J&_$_Nu/ $H g jN7 JN'p$_Nu/ / &HpN'$H f`p"K JNb J&_$_NuN'pNu/ / &HpN'$H g>"KpNb SN7b$ kN7b%H kN7b%H g "*g$f` J&_$_Nu/ $H g$ jN7 jN7 RN7 JN'p$_Nu/ / &HpN'$H f`p"K JNb J&_$_NuN'pNuH0$Hg,N`j&R N'&H f` "J KNb K`AL NugN'pNu?/ $H0* |fj 0*|f JB@Nj(0*|gLQ@g`j j 6(h0(h@l6jo5C6(h0(h @l6jo*5C`$ j 6(Kjo5C0*hl5hp JEhgb$_6NuH0&H$I6H"ҁҀAB@4(|| bNB4; N ""DD.D""0( H@D@`""h 0)D@`prhgprhgprh gp2(|@gpBAt h gJ@o2A`2DAAJ@lB@4(@64(@7B4BhA7B4BhA7B82H ЀЁ62|g"0H$ԂԀ犸r(f82(S82(k`L Nu/ / O$H0ljBP0*ljBjA0jhJ@oj0*jhhJ@oj0?j2j|?A4*jSB?B2*0/WR@NLf(H gPBoBo 2/W?A tj?B0<Nk8/ C~Ar09NeXO0<Nk8 LO(_$_Nu/ / O$H&I f2?+?+?+??+?+4+2pNiO N!.`08J@fp`.2H ЀЁ43| gz`BE2pD"K JNpl g K0N `(0 KN`pDlfrlg~tl f J0N@t8H"ҁҀ:2`>p4H"ҁ҂rgpr g22 | K"kf0N2H ЀЁ:2Efrl 0 K"kfN`plg l 2, 0 K"kfNplgfIHTHTHTHor B@NkjO0+ o f@rkVgkg2N@7C7|0+"JANC KNH rB@ KN@O L8NuH4O$H6&jrH$ԂԀ犂s( "jf0NxHoC0 KNiXO2H ЀЁ?s?sKB@:3`h:9j4<j620AN%J@g$JDfDxr4H ЀЂ爂s J"jf0N`$JDg BD4H ЀЂ23 | J"jf0NHoHo HoHoHUBgBgBgBgBgBgBgp????9?BgC42pNhhO.|gH0O L,xNu/?4v@JCgt@|B@6(|gZvhfR6( JCgJ8|JDg8Df88DB|g*`*f&|g |g| g| g|Sg|r g`v hgB@` AR@`8&NuH $H6:JClBD`2H ЀЁ82JDm0<4H"ҁ҂rg:2H ЀЁ82`62H ЀЁ82JDm2H ЀЁ父rgJDm2H ЀЁ42Eg0`6`tL8NuH $H62H ЀЁ82JDlp`2H ЀЁ父rf0`6`LNu 9g r @B@N@NuH4O$H:6WAftjVgjVB&j8*|fpjVf>+k0"KAN8r7G0m2/moj8l oj:mJEgC JNH N!.2H ЀЁ s *P4*l MN`j5@BjV#>+?k0*4k0*6k4C20 KNi:|f7G7oO L,NuH>O$H6<&j$ gRI 0"K LN8r0*4T2*6l8* JDmK40H$ԂԀ:3( >>+2k2-k0<Nk8MHnHnHnHVr 0NkjO`"L NN&^0.gn0.mJ@lnn0.oTFf??.?.4r K0Nh\O`42H ЀЁ7 t???.?.?. K024Ni\O HnHnHnHVr 0NkjO0.n`0<Nk8 j1W j1G2H ЀЁ7 OL|Nu/ / QO$H"jAN8r0*4W2*6oC J&jjNPO&_$_NuH>O$H&I6* JCm0j$o`0D@j$|l"0+j&o` 0+D@j&|ljV(j gXA4.8,:,2l2(l0<Nk8MHnHnHnHVr 0NkjO`"K NN&^0.g<. WhJFl*j^4-H"ҁ҂>52H ЀЁ uf6;H>-4H"ҁ҂25H ЀЁ2H$Ԃԁ;(?.?.?.4r0- MNh\Onn0.o??.?.42< LB@Nh\OHnHnHnHVr 0NkjO0.n0<Nk8 j1D j1EO L|NuH8O$H?@2* o6*HDC8*8"ji:*:i|bR@0;N00>`2 <2*@HNeT@>` <2*BHNeT@>?WIG j<(>(0/|b@0;N&:JZnJGg"0*: jh`|Gg 0*: jh`fJGg jh`VGg jh`FJFg0*8 jh`2Fg0*8 jh`JFg jh`Fg jh j0(oBh jho1D j0(oBh jho1E j0(D@jHD@1@ j2(DAjHDA1ASof JNZr?W20 JNK HSHT"K KNkJPOpTf0/Wg JNZrO LNuH $H82* oR"j6)H2)j8HNd"<NejHCg$ j1@ j8( JNZr20 JNK LNuH $H82* oR"j6)H2)j:HNd"<NejHCg$ j1@ j8( JNZr20 JNK LNuH8UO$H0* ohB@&j2*HDAAi2*HDAAi>8+:*8<*:2lkp2)lkpil5i8pil5i:p2ij8JAokp2)ij:JAokpJ@g(j^ g4,H"ҁ҂64`BCHj*Hj(0*:C??*82*6C?C&A$4*42*"B@NlO0+D@jHD@7@2+DAjHDA7A JNZr0+Wfkf j8fj:g>jV?**?*(?*&?*$r0* NkPON!.pjVg C$ J&jjNTOLxNuH8YO$H8&j6*I< g@r@g0@|ft KprN?:2<@ KN?8J@l2<@ KpN?80o@@g4?j6?j8?j:CAN&^I09@82/9A 9A0oS@9@ 9@2/oSA9A9AJCg(JCoTl pl >?C`ll0D@?@JDg,JDollpl?@?D`ll 0D@?@ LBA09Ng(0<Nk8K~HU"M Lr09NeXO0<Nk8C J&jjNOL<NuH6:x@D0HЀ2HNdмN' g,C 1C1E1DBh 1y BA1A1A1AL8NuN&NuH<$oG7j7jI0+f2+g(67jpSkpkk Kr0Ng(pj|lprj|lr4*@Bj 64*ABj 7B4@7B0+A7@r0Ngr0Nfr0Nfr0Nf|BBBA0Nfpjf rjfBA0NfHr0Nfbr0Nf. K0NgTr0Nfr0NfBBBA0NfpgLKpS;@;@ :rk;A;A;Apk;@;@rk;A;A M0rNhpjg0TSTkUkUk Kr0Nh267A K0rNh KBA0Ng(pjL<Nu/ / 09RyJ@f0<A` 2IBS@J@lCF$Q1j E&Q0*k o`&Q0+ 1@2*&Q4+ BB1A0*jk h1@492IB1A290HA1@49Bf +4g&@` Q&h0"kN# 09BgNUd&_$_NuSyfpNPN'NuH8BCE`0H&r" g7| RC|mBC`&0H&rB" g KNV\p K(kNRC|mLNu2IA pNu y NuB@NuH>$HBgBgBBBA0*"NkXO6J@l^G 8IpS|6H*t2g8$ g4pmTf, MNV\p M,mNBgBgBBBA0*"NkXO6`SfJCm |n0`AvpNipL|Nu/ B@CA( Pf BPJ@g`R@2I$qRP" g J$_NuH<8(H6<E`0H&r" g "L K*k0NSCJClL<NuH86<E`V0H&r" gHt kVg@kV4+ m(N3kV K"kNN3C$ K(kN`kVN'SCJClLNuH8E 6GpR|4H(s2g$ g LNX\`RfLNuH8E 6GpR|4H(s2g$ g LNX\`RfLNu/ $H0* o"jnN` J"j N$_NuH>&H <N'$H <"KNb *g @N4b%H gfN7 *^g0 @N4b%H^ f jN5d`> j^N7 j^N/ *Zg0 @N6%HZ f jN5d j^N5d JN'p` *Jg @N7b%HJ *Ng @N7b%HN5|V5|XBCGI K`^0H"3fR'"gtjTg"J A,A,npdN0*$5@$2*&5A&0*(5@(2**5A* J`RC|mAwpNiL|NuH8QO$H0* l$rjVgjV"jNJ@f JNR6J@lp`G *fAN4b%H5C 0HA!r5AB5A@5A>5Ar0?A?AN@p yFhg*?**?*(?*&?*$?/4/2/ 0/ NjO ?**?*(4*&2*$0NkXO(jN!.rp LN?5@J@m5|rB@ JN@B@POLNuH0$H&j^#Bj gD6+H ЀЃ03H$ԂԀ43(H"ҁ҂'/ KN/p KNj:pjVgjV J"jNJ@gp`xG *gL @1S j1kBgBg/*rB@NkPO?+?+?+??+?+4+2pNiO Bj4Bj60k5@82+k5A:B@L NuH8QO$H6* 5| pjVgN@5|JfNJCf( *gBgBgBgBgrB@NkPOB@Nj:`G 0*V|f*"g&4*XmCX A(A(lpgN`"Jpd S(S(lNJCop yFhgh2*Xm&$g"0"B"iAN8r S0(4W2(6o`B@?@>r0?A?A?**?*(?*&?*$?/4/2/ 0/ NkO 0NlV0Nk yFA8N3dJCm0HABPOLNuH8$HjVJfByP0* m J"jrNG 0*Xm"gCX A(A(lpeN j^N5d jN5d jZN6N jJN7 jNN7BCI`0HfB JN'p`RC|mfBLNu?6( JCoN@BgBgBgBgr 0NkPO6Nu/ / $HpjVgL5j,$5j.&5j0(5j2*"j0)jDf 2)jFgjV j1jD j1jF`n5j$,5j&.5j(05j*2A5P$5h&5h(5h* j5hD j5hF j0(f2(gjV jBh jBh jVpjTg JN] JNZr?**?*(?*&?*$r0* NkPON!.pjVg C$ J&jjN&_$_Nu/ / $H0* ojjV5Q$5i&5i(5i*pjTgN] JNZr?**?*(?*&?*$r0* NkPON!.pjVg C$ J&jjN&_$_Nu/ $H0* o@jV5Q$5i&5i(5i*NZr?**?*(?*&?*$r0* NkPO$_NuH>O$H> &j(j^8*H0F@kkkkBo" g0,H$ԂԀ?t(<*$>*&6*(:**KMHUHV0+o ??+BgCABB2*"B@NlOVl0`06Ul2`2:yl0`096yl2`29:yl09`06yl29`2:09D49yCBl2`29yC<4yEBl2` 2yE>yl49`4<@l2`2>HUHV???CA42*"pNlO0/oUo oVU" g06,H$Ԃԃ( 4/ y9B6/@SC9C5o 45o65V85U::+VD0+2DAAl7ABCJEo 2+H 눐ЁD2HNe&jg$5C>0*"|gBgBgBg?r 0/NkPO2H 눐Ё2+HNe&jBg$5CB0*"|gBgBgBg?r0/NkPOHj*Hj(0o ??2/o?C&A$4/2*"B@NlOO L|NuH0QO$H0*(yo`09?@2*"|g 49o0*Ho?o&j:+BFJEo4H"ҁ҂>3803?@>`0<4H"ҁ҂sf\6sookg0D@80oWBF2H ЀЁ爼sl<32H ЀЁ77oo?C8G2H ЀЁ:3JEnzW7ovj*Apj"gPpj"gP0*"| gP *^g @4(H"ҁ҂牖p0jH@l`07@jVPOL Nu/ $H2UAg` JN:p`B@$_NuA(p"@ "By>A1B3>3@O"Nu/ Hz?<&NN\O$_Nu JgJgJgJgJg JgJgJfSHggggg ggf @Nug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNuH &/?<HNA\OJf 9g @ NJ@fp @LNuH0&gPR<e a g!CCB "A`rGF&S f. < a gj&@Ap !| 'H&F#FA"P` )d I"Q f`rd ` #@#C"nAL Nuk |`3 n`/ oLQ d nf@axJg*`6CB g,g"@ f` "/?<INA\OJj`p$_Nugp`/ &yB g/ &S?<INA\O`&yF g/ &S?<INA\O`&_NuH8$< CGF g" c &@ f`(@ ,gb*"Ҩeg ` )H`p"@")Ө )H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" l eb&/ ?<INA\OJfQLNuP`Jg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _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@$ jDNu/ /?<&NN\O$_Nu/ /?< NN\O @$_Nu/ABhBh2<&ad"_222222A2222Nu/A1|1|!I!o1A"_A000000000Arm`ABh1|1Ar`A1ABh1|r`ABh1|1Arh`ABh1|1Ar`ABh1|1A1Brl`|ABh1|1Ar`bABh1|1Arq`HA1|Bh1A0Bh2ra*09NuABh1|1Ar `C3|3|3AC0""A2<`C,2222A1|Bh1| r `ABhBhre`3/ C2dBi3| Cp 2Q"<gps/ NB$_ _0A"op,2QAp 2QNu,C3ABi#R Ira#,RNu/ 1@ 0"<JpsNBA0$_Nup `0p`*A00p`#/ A00000 0 0000000000 pa"_2"o2"o"2"o&2"o*2"o.2Nu#A000000p*`#A0000p+`h/ #3p,aT"_2"o2Nu/ #A0000p.a,"_2Nu#A0000000 0 p/`#3p2`#A0000000 0 0p3`/ #p6a"_2"o2"o2"o 2Nu#3p4`/ C222#p7af"_2"o2Nu#3pr`H#3p`6#A00p!` 3#p#`/ /pMa"_2"_2"o2"o2Nu/ /A0000 pFa"_2"_2Nu/ /A0000 0000pGa"_2"_2NuA0000000 0 pI`pA0000000 0 pJ`J#3pN`8/ /pOa."_2"_2"o2"o2Nu/ ?A00pha2CSA|;$Y4Q$_NuA00000pd`A00000pe`3pg`A000000 pi`v33pj`d/ /A0000 00plaB"_2"_2"o 2"o2Nu3pf` 3pk`##px`/ 3@@A"CB@22220<"<lNBA0$_Nu A Piano HCDEFA#D#GF#G#C#nnnqnnnqnnnqnnnqnnnpnnnpnnnqnnnpnnnpnnnpnnnpnnnp(@A0 ,0,Ao"xAod"b X Ao$". Ao"y; Ap "cBAoH"v 7Ao"n wAo"m mAo ",wAp ("-Ao"<0 Ao"du}An"f ~%#0 !Ao"h J#Ao,"j An"k9(&&0(%Ao"))0(An" a_bSPp( Mnn'IACX\V\XE:G@GYZ$ACS 1.0e PIANOt0 0 [2][ | Soll das ACCESSORY | >>%s << | gestartet werden?][ JA | NEIN ][3][ | Kein Speicher| mehr vorhanden! ][ OK ][2][ Unbekannte GEM-Nachricht | erhalten.| ID = '%s'| Weiterhin berichten?][ JA | NEIN ][3][ Kein freies GEM-Fenster | mehr vorhanden!| Abhilfe ein offenes| GEM-Fenster schlieen.][ OK ][3][ Kein freier ACS-Fenster-| Einschub mehr vorhanden! | Abhilfe ein ACS-Fenster| lschen][ OK ]des ACS 1.01PAPIERKORBOKPulldown Mens ber mich ... -------------------- Aktionen ffnen ^O Schlieen ^U Lschen ^D--------------- Info ^I Beenden ^Q Fenster Nchstes ^W Horizontal ^Z Optionen aus Liste ^L Vertikal ^T Verhalten ^B-----------------Grows/Shrinks(C) 1991, 1992Verstecke ZeigerNEUInformationGenerischer DesktopDas Ziehen der Neu-Ikone aufDas Ziehen von Objektenlscht diese Objekte.auf den PapierkorbZentriere DialogACS 1.01ein anderes Objekt erzeugtkontextabhngig ein neuesDoppelklick erzeugt dasObjekt.Mutterobjekt der Anwendung.ABBRUCHVerhaltenStefan BachertAutorL1111111111zzx  H?Ʊ `@D"@D"@D"@D"@D"@D@D@Dr@D"@D"@D"@D"@D"@D"@D"@D"@D"@D"@d&@`?{({wu  HAUIUUU"I%UAU@@?@?@?@>@@ @_@*@UT@@ @ @@AUQb}UQbAU|J|wg 0 H80 3gggg30 8}80 0 ````0 0 8} 0'''' 0~ 0     0~F!!7 Hl7d @ @?xxp㇇ 8p<`ßp0 Ϗ<~pZZ# wg w  x"  xL $P   w  w  wg  wg wg wg wg wgw "w"w"wwx" x@"$"!x,Q""wxW >" %*'x;6")xf"*x$xwj" $ x y]yy w   xwh  w  x xxyfyyyy'w  xy y7y!'w   yyyyyw x  x  yL  @w @%y  SPHwgwg'IACX\V\XE:G@GYZ$"Z0|(H(0{H( & &}H( tACS 1.01 (c) Stefan BachertPH$$#8#[3][][OK]0RELEASE 1.010123456789ABCDEF ,r   P    . :(   2 8<NV<> "&(   Jh( L > (dT4:  &  " . B 4 t\j ( : .0 F BF  "h, 0 "N**&  * P2 &H   8 ,$0 H  < @  JBLhB&" F@(2.8\@$  J&8JB2&,               D     (Z  & 0   0f. @ T "6T *" F z *02 ,DN<4>*D2 . ,<XXn * 4V  T" D  8$ (84(  <  >F(,P, 8 $(&J  B J  $ &~fPF"      2>`**>**6 ވD.R,<*$6   j& ,$   0$0&&0> 4  h           8  8   8 8 64 x6***bH0      8   8    80000:   FD:; ACS Example Program (c) 1992 Stefan Bachert ; PIANO.PRG ; name of executable program = ; list of modules follows... PCSTART.O ; startup code PIANO.C (PIANO.H) ; depends also from surface definition ACS.LIB ; ACS Library ; ;PCBGILIB.LIB ; BGI library ;PCFLTLIB.LIB ; floating point library PCSTDLIB.LIB ; standard library ;PCEXTLIB.LIB ; extended library PCTOSLIB.LIB ; TOS library PCGEMLIB.LIB ; AES and VDI library ;PCLNALIB.LIB ; LINE-A library ; THIS IS THE END ; ACS Example Program (c) 1992 Stefan Bachert ; PIANO1.PRG ; name of executable program = ; list of modules follows... PCSTART.O ; startup code PIANO1.C (PIANO1.H) ; depends also from surface definition ACS.LIB ; ACS Library ; ;PCBGILIB.LIB ; BGI library ;PCFLTLIB.LIB ; floating point library PCSTDLIB.LIB ; standard library ;PCEXTLIB.LIB ; extended library PCTOSLIB.LIB ; TOS library PCGEMLIB.LIB ; AES and VDI library ;PCLNALIB.LIB ; LINE-A library ; THIS IS THE END ; ACS Example Program (c) 1992 Stefan Bachert ; PIANO2.PRG ; name of executable program = ; list of modules follows... PCSTART.O ; startup code PIANO2.C (PIANO2.H) ; depends also from surface definition ACS.LIB ; ACS Library ; ;PCBGILIB.LIB ; BGI library ;PCFLTLIB.LIB ; floating point library PCSTDLIB.LIB ; standard library ;PCEXTLIB.LIB ; extended library PCTOSLIB.LIB ; TOS library PCGEMLIB.LIB ; AES and VDI library ;PCLNALIB.LIB ; LINE-A library ; THIS IS THE END /* Beispielapplikation fr ACS "Piano" 14.1.92 Stefan Bachert (c) 1992 MAXON Computer GmbH */ #include #include #include /* Prototypen anlegen */ static void ton (void); static void start (void); static void play (void); static Awindow *piano_make (void *not_used); static int piano_service (Awindow *window, int task, void *in_out); #include #define MAXSOUND 200 typedef struct { int key; long time; } single; typedef struct { int next; single field [MAXSOUND]; } tape; /* Soundgenerator ansteuern */ static char sound [] = { 0x00, 0x10, /* Generator A Frequenz einstellen */ 0x01, 0x10, 0x07, 0xf8, /* Rauschen ausschalten */ 0x0b, 0x00, /* Tonlnge Hllkurve */ 0x0c, 0x30, 0x08, 0x17, /* Lautstrke */ 0x0d, 0x00, /* Hllkurve abklingend */ 0xff, 0x00 /* stop */ }; static long timer_200Hz (void) { return *((long *) 0x4BA); /* holt 200Hz Timer */ } static void ton (void) /* * lt ton der Frequenz (userp1) / 1000 ertnen * */ { AOBJECT *aob; int next; long val, timer; tape *user; aob = (AOBJECT *) ev_object + ev_obnr + 1; val = 125000000L / (long) aob-> userp1; /* berechne Teilerwert */ sound [1] = (char) val; /* unteres Byte */ sound [3] = (char) (val >> 8) & 0x0f; /* oberes (Halb) Byte */ timer = Supexec (timer_200Hz); /* merke Zeitpunkt */ Dosound (sound); evnt_timer (80, 0); /* x Milli Sec warten (visuelle Rckmeldung) */ /* aufzeichnen */ user = ev_window-> user; next = user-> next ++; if (next >= MAXSOUND) return; /* tape voll */ user-> field [next]. key = ev_obnr; user-> field [next]. time= timer; } static void start (void) /* * Beginnt am Anfang mit dem Aufzeichnen, Lschen ! */ { tape *user; user = ev_window-> user; user-> next = 0; } static void play (void) /* * Spielt Band ab */ { Awindow *window; OBJECT *work; AOBJECT *aob; tape *user; long st_time, nxt_time, val; int act, key; int t, button; window = ev_window; work = ev_object; user = window-> user; st_time = Supexec (timer_200Hz) - user-> field-> time; /* erste Zeit berspringen */ for (act = 0; act < user-> next; act ++) { nxt_time = st_time + user-> field [act]. time; while (Supexec (timer_200Hz) < nxt_time) { graf_mkstate (&t, &t, &button, &t); /* abbruch Maustaste */ if (button != 0) break; }; /* warte */ key = user-> field [act]. key; aob = (AOBJECT *) work + key + 1; val = 125000000L / (long) aob-> userp1; /* berechne Teilerwert */ sound [1] = (char) val ; /* unteres Byte */ sound [3] = (char) (val >> 8) & 0x0f; /* oberes (Halb) Byte */ (window-> obchange) (window, key, work [key]. ob_state | SELECTED); Dosound (sound); evnt_timer (80, 0); /* x Milli Sec warten (visuelle Rckmeldung) */ (window-> obchange) (window, key, work [key]. ob_state & ~SELECTED); graf_mkstate (&t, &t, &button, &t); /* abbruch Maustaste*/ if (button != 0) break; }; } static Awindow *piano_make (void *not_used) /* * Erzeuge Piano Fenster */ { Awindow *wi; tape *user; wi = Awi_create (&PIANO); if (wi == NULL) return NULL; user = wi-> user = Ax_malloc (sizeof (tape)); /* Datenstruktur anlegen */ if (user == NULL) return NULL; /* Fehler passiert */ user-> next = 0; /* Initialisieren */ if (application) { (wi-> open) (wi); /* ffne gleich */ }; return wi; } static int piano_service (Awindow *window, int task, void *in_out) { switch (task) { case AS_TERM: /* Fenster freigeben */ Ax_free (window-> user); /* Struktur freigeben */ Awi_delete (window); break; default: return FAIL; }; return TRUE; } static char oldconterm; /* fr ursprnglichen Wert */ static long off_click (void) { oldconterm = *((char *) 0x484); *((char *) 0x484) &= ~3; /* kein click und keine Tastenwiederholung */ return 0L; } static long old_click (void) { *((char *) 0x484) = oldconterm; return 0L; } void ACSterm (void) { Supexec (old_click); /* alter Zustand */ } int ACSinit (void) /* * Doppelklick auf NEU erzeugt ein neues Fenster */ { Awindow *window; Supexec (off_click); /* click ausschalten */ if (application) { window = Awi_root (); /* root window */ if (window == NULL) return FAIL; /* lege NEU Icon an */ (window-> service) (window, AS_NEWCALL, &PIANO. create); window = &PIANO; (window-> create) (NULL); /* sofort ein Fenster erzeugen */ }; return OK; } . ^i.. p^igFIND TTP Dk 2FIND M Xe DELBAK TTP QmDELBAK M XeQ `l pAC4N4,I*H(mJ$f*O ,f < /?<HNAJkT"&@Ё.@`N - ЭЭ$ԍR&B&,gЃ` "ҍRb.A// Bg?<JNA m"-p`HA0QHAQ)M"O )I)K ^ g H NLP`& yf&N9| ^ gJf9| H NLP`Bg?<LNANuHz ?<&NN\Nu@X|NuHz ?<&NN\NuFXNu c b c TfNFNuN:"#o6 #o2 @ Pf#bCT!Q "RylNTNTNFNuNTNFNu c"c/ " g$(g e&@Ђ.@/N._&_NuNFNu 9TfNFNu @E g @$ &C&/ N$_`Nu/9Z yf"P^g bf 9TgV @ h gN2.$i|$0 f.B`O,|1h 1| &h.h?/N _1| ?<LNAJ yf ^fA2gJ#Nu yf#^BbBTBylA>!H!HHz ?<&NN\`#ZA2#NuNuHz?<&NN\&Nu 9Nu(|~N. <ѫdNF( y~60<cfB#Vj#Vn#_z#ANv#)r#`,f`VN. c#(f y~60<cf4#~j#~n#z#hv#*nrNu0<NAp1#Q6A BpNJcgA&B@ @ cNF cB<.S#W@6 kJcg&6A$&6NA&6 A$&6N&6A$&6NA$O"OpQ&6A`B& &N`&6A&6 NB@cnrA` Found: O"OpQ&6N &6pNrNAO"Op Q&6 N N6LPN]NuNFFind (|A`X:6prN<(|A`\*.*&p"<N<&&6N 60<cfv(|N8&B@ @cNF cI&0< @cNF cH&B@ @cNF cBNS |O"OpQ&6N,XN (|BT&0< @cNF cH&6N?#0Tef/ &09 @cNF cI&0< @cNF cH&09 @cNF cBNS(_RTdT |O"OpQ&6A`B& &N6N `JA` Usage: find Ap? Q&6NNA`Bitte Taste drcken!Ap ? Q&6N&NNu2DAA4 2J@d0 g&H6Nu&HB[Nu K$R`HASeWgHAQJg JgNFBNu"_2+RAR$k'O O/`HAQHAQNNuAd _/ *O$OH ,JNNF`NuB@+A pNu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AEEEIIIOOUUAIOUNuNuB&&Nj _$#$c #"c"(!I#A "#B#JNuY&&Nj _"c"NuNu cB@RNuS# cNuAeNFNU/$OH ,J M1#B< S#gB< S#W@6`6JcfB< S#W@6`6JcfB< S#W@6`6LPN]NuNFAeNFNU/$OH ,J V h6 V0(ce, V& V h0 cH@B@H@I V( V hRPLPN]NuAeNFNU/$OH ,J M1# V60.cf V&B[$a VIBT`` V6 kJcg V6B@cW@6`B[Jcg0 V&B[$ap VI8 VAR$a VASLPN]NupNA!#!#1#IBTIBT(n8A &N A &6B0# cѐI& <ѫ(I8& $aS#@?0Te/ &$a$aJcg86B@cfIBT&B[$a`& B$a`&$aj<"S#f6$aj``&$aF<'S#f6$aF`<6 kJcg6B@cW@6`B[JcgI8$aAR(_RTdT&B[$aI n860.ce$ n0.H@B@H@I(ARP`&B@ cH@B@H@I(LPN]NuNu"_2VAHU*Oc$OQB NNFNu?</NA&/?<NAPNu//?<NA\ Nu k0+N H,(r+?/N ?<NNAPN Jk&+g&6N0# kg0 :g \g S@fA`S@&6pA6QB6Nl6NN& CNJcg0(N ?<ONATN Jjt @g(`NFp c0`(N ?<ONAJjTN cBP ,LN]Nu0#S@e ??<NAXNu?<NATR@6NuB@Jc cgJg (:f S@@R@6NuDirectory (|BTNuH<#0# c:#"cJgJJFj|tFgJ0 g8RB@c`06r1@b$00fEg RARC1f6LxNuRBJ0 f6LxNu2# c JWfS"6Nu$c2#"c0# c`S@eWgJ@g JgBRNuB4Nu$c0# c2#"cJWfSR@gS@e Q`Jg BRNuJ@gB4NuNu0#2A6H2A6H@6Nu0#2AI6H2A?6H6NuNuNNuB[NhNu&NNu&NNuNuA&B[ yNUNu?< &6 yNTNu yNNuY yNJcf>e&6 yN yNS# c>f@&r dSA6 yNXNuBNvBNNuH8#(cRDp` ?/<NM\WLNu/<NMXJ@V|6Nu/<NMXRNu/<NMX&Nu6NuHz?<&NN\6NuJ9LgpPNup(Nu(|(Z(|((|(Nu(|((|((|(NuNNNuF * L^&@@   <(  J (  "T,4  0  ( B 4 ,*"$ "l.  & (***************************************************** * TITEL : Find * * ZWECK : Findet eine Datei auf dem ber- * * gegebenen Laufwerk * * AUTOREN : Martin Wunderli & Patrick Seemann * * VERSION : 1.0 * * SPRACHE : MODULA-2 (MEGAMAX MODULA V1.0) * * Compilerversion 3.6a * * (c) 1992 MAXON Computer GmbH * *****************************************************) (*$E MTP *) MODULE Find; FROM ArgCV IMPORT (* TYPES *) ArgStr, PtrArgStr, (* PROCS *) InitArgCV; FROM Directory IMPORT (* TYPES *) FileAttr, FileAttrSet, DirEntry, DirQueryProc, Drive, (* PROCS *) DirQuery, Delete, DefaultDrive, StrToDrive, SetDefaultDrive; FROM FastStrings IMPORT (* PROCS *) Append, Assign, Length, Pos; FROM Terminal IMPORT (* PROCS *) WriteString, WriteLn, Read; TYPE str4 = ARRAY [0..3] OF CHAR; VAR Result : INTEGER; Pattern, File : ArgStr; NewDrive : str4; ArgC, i : CARDINAL; ArgV : ARRAY [0..2] OF PtrArgStr; AktDrive : Drive; James : CHAR; (*****************************************************) PROCEDURE TestIfFound ( (* in *) Pfad : ARRAY OF CHAR; (* in *) Entry : DirEntry): BOOLEAN; VAR NeuerPfad : ArgStr; BEGIN IF (subdirAttr IN Entry.attr) THEN IF NOT(Entry.name[0] = ".") THEN Assign (Pfad, NeuerPfad); Append (Entry.name,NeuerPfad); Append (Pattern, NeuerPfad); DirQuery (NeuerPfad,FileAttrSet{subdirAttr}, TestIfFound, Result); END (* IF *); ELSE IF (Pos (File, Entry.name) >= 0) THEN WriteString (" Found: "); WriteString (Pfad); WriteString (Entry.name); WriteLn; END (* IF *); END (* IF *); RETURN TRUE END TestIfFound; (*****************************************************) BEGIN NewDrive := "X:"; Pattern := "\*.*"; InitArgCV (ArgC, ArgV); IF ArgC = 3 THEN AktDrive := DefaultDrive(); NewDrive[0] := CAP(ArgV[1]^[0]); SetDefaultDrive (StrToDrive (NewDrive)); FOR i := 0 TO Length (ArgV[2]^) DO File [i] := CAP (ArgV[2]^[i]); END (* FOR i *); DirQuery (Pattern, FileAttrSet{subdirAttr}, TestIfFound, Result); SetDefaultDrive (AktDrive); ELSE WriteString ("Usage: find "); WriteLn; END (* IF *); WriteString ("Bitte Taste drcken!"); Read (James); END Find. `ACN4,I*H(mJ$f*O ,f < /?<HNAJkT"&@Ё.@`N - ЭЭ$ԍR&B&,gЃ` "ҍRb.A// Bg?<JNA m"-p`HA0QHAQ)M"O )I)K ^ g H NLP`& y&N9| ^ gJf9| H NLP`Bg?<LNANuHz ?<&NN\Nu@|NuHz ?<&NN\NuFNu c  c fNFNuN:"#o6 #o2 @ Pf#C!Q "RyNTNTNFNuNTNFNu c"c/ " g$(g e&@Ђ.@/N._&_NuNFNu 9fNFNu @E g @$ &C&/ N$_`Nu/9 y"Pg f 9gV @ h gN2.$i|$0 f.B`O,|1h 1| &h.h?/N _1| ?<LNAJ y fA2gJ#Nu y#BBByA!H!HHz ?<&NN\`#A2#NuNuHz?<&NN\&Nu 9Nu(|N. <ѫdNF( y60<cfB#V#V#_#AN#) #`,`VN. c#( y60<cf4#~#~##h#*n Nu0<N Ap1#Q6A BpNJcgA&B@ @ cNF cB<.S#W@6 kJcg&6A$&6N4A&6 A$&6NB&6A$&6NBA$O"OpQ&6A`B& &N`&6A&6 N*B@co,&6A&6 N*B@c_@6`6Jcf,&6A&6 N*B@c_@6`6Jcg BNR&6pNN|AO"Op Q&6 N| A` Lschen (_/N)? O"OpQ&6N|&NBN ><NS#g\&6A$&6N4A&6 A$&6NBA$O"OpQ&6&NRNf6LPN]NuNFDelBak"(|A`\*.*&p"<N(|A`X:6prN(|A`.BAK&Ip#Q(|A`.DUP&Ip#Q(|A`.SBK&Ip#Q&&6N f60<cf(|N8&B@ @cNF cI&0< @cNF cH&B@ @cNF cBN >S |O"OpQ&6NXN |O"OpQ&6A`B& &N6N`BA` Usage: delbak Ap ? Q&6N|NfNu2DAA4 2J@d0 g&H6Nu&HB[Nu K$R`HASeWgHAQJg JgNFBNu"_2+RAR$k'O O/`HAQHAQNNuAd _/ *O$OH ,JNNF`NuB@+A pNu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AEEEIIIOOUUAIOUNuNuB&&Nj _$#$c #"c"(!I#A "#B#JNuY&&Nj _"c"NuNu cB@RNuS# cNuAeNFNU/$OH ,J M1#B< S#gB< S#W@6`6JcfB< S#W@6`6JcfB< S#W@6`6LPN]NuNFAeNFNU/$OH ,J V h6 V0(ce, V& V h0 cH@B@H@I V( V hRPLPN]NuAeNFNU/$OH ,J M1# V60.cf V&B[$a VIBT`` V6 kJcg V6B@cW@6`B[Jcg0 V&B[$ap VI8 VAR$a VASLPN]NupN A!#!#1#IBTIBT(n8A &N A &6B0# cѐI& <ѫ(I8& $aS#@?0Te/ &$a$aJcg86B@cfIBT&B[$a`& B$a`&$aj<"S#f6$aj``&$aF<'S#f6$aF`<6 kJcg6B@cW@6`B[JcgI8$aAR(_RTdT&B[$aI n860.ce$ n0.H@B@H@I(ARP`&B@ cH@B@H@I(LPN]NuNu"_2VAHU*Oc$OQB NNFNu k0+N*/?<ANA"cJkBQ]N]Nu2`Nu?</NA&/?<NAPNu//?<NA\ Nu k0+N*H,(r+?/N|?<NNAPNJk&+g&6Nn0# kg0 :g \g S@fA`S@&6pA6QB6N 6N& CNJcg0(N|?<ONATNJjt @g(`NFp c0`(N|?<ONAJjTN cBP ,LN]Nu0#S@e ??<NAXNu?<NATR@6NuB@Jc cgJg (:f S@@R@6NuDirectory (|BTNuH<#0# c:#"cJgJJFj|tFgJ0 g8RB@c`06r1@b$00fEg RARC1f6LxNuRBJ0 f6LxNu2# c JWfS"6Nu$c2#"c0# c`S@eWgJ@g JgBRNuB4Nu$c0# c2#"cJWfSR@gS@e Q`Jg BRNuJ@gB4NuNu0#2A6H2A6H@6Nu0#2AI6H2A?6H6NuNuB[NNu&NNu&NNuNuA&B[ yNUNu?< &6 yNTNu yNNuY yNJcf>e&6 yN yNS# c>f@&r dSA6 yNXNuBNRvBNRNuH8#(cRDp` ?/<NM\WLNu/<NMXJ@V|6Nu/<NMXRNu/<NMX&Nu6NuHz?<&NN\6NuJ9LgpPNup(Nu(|((|(L(|(RNu(|(.(|((|(>NuNNrNuF R((P@   <(  J (  "T, & : $ "  0 ( : ,*N"$ "l0 & (***************************************************** * TITEL : DelBak * * ZWECK : Lscht Backup-Dateien * * AUTOREN : Martin Wunderli & Patrick Seemann * * VERSION : 1.0 * * SPRACHE : MODULA-2 (MEGAMAX MODULA V1.0) * * Compilerversion 3.6a * * (c) 1992 MAXON Computer GmbH * *****************************************************) (*$E MTP *) MODULE DelBak; FROM ArgCV IMPORT (* TYPES *) ArgStr, PtrArgStr, (* PROCS *) InitArgCV; FROM Directory IMPORT (* TYPES *) FileAttr, FileAttrSet, DirEntry, DirQueryProc, Drive, (* PROCS *) DirQuery, Delete, DefaultDrive, StrToDrive, SetDefaultDrive; FROM FastStrings IMPORT (* PROCS *) Append, Assign, Pos; FROM Terminal IMPORT (* PROCS *) WriteString, WriteLn, Write, Read; TYPE str4 = ARRAY [0..3] OF CHAR; VAR Result : INTEGER; Pattern : ArgStr; NewDrive, BAK, DUP, SBK : str4; James : CHAR; ArgC : CARDINAL; ArgV : ARRAY [0..1] OF PtrArgStr; AktDrive : Drive; (*****************************************************) PROCEDURE TestIfBAK ( (* in *) Pfad : ARRAY OF CHAR; (* in *) Entry : DirEntry): BOOLEAN; VAR NeuerPfad : ArgStr; BEGIN IF (subdirAttr IN Entry.attr) THEN IF NOT(Entry.name[0] = ".") THEN Assign (Pfad, NeuerPfad); Append (Entry.name,NeuerPfad); Append (Pattern, NeuerPfad); DirQuery (NeuerPfad,FileAttrSet{subdirAttr}, TestIfBAK, Result); END (* IF *); ELSE IF (Pos (BAK,Entry.name) >= 0) OR (Pos (DUP,Entry.name) >= 0) OR (Pos (SBK,Entry.name) >= 0) THEN Write (" "); WriteString (Pfad); WriteString (Entry.name); WriteString (" Lschen (_/N)? "); Read (James); IF CAP(James) <> "N" THEN Assign (Pfad, NeuerPfad); Append (Entry.name,NeuerPfad); Delete (NeuerPfad,Result); END (* IF *); WriteLn; END (* IF *); END (* IF *); RETURN TRUE END TestIfBAK; (*****************************************************) BEGIN Pattern := "\*.*"; NewDrive := "X:"; BAK := ".BAK"; DUP := ".DUP"; SBK := ".SBK"; InitArgCV (ArgC, ArgV); IF ArgC = 2 THEN AktDrive := DefaultDrive(); NewDrive[0] := CAP(ArgV[1]^[0]); SetDefaultDrive (StrToDrive (NewDrive)); DirQuery (Pattern, FileAttrSet{subdirAttr}, TestIfBAK, Result); SetDefaultDrive (AktDrive); ELSE WriteString (" Usage: delbak "); WriteLn; END (* IF *); END DelBak. . ^i.. p^igMEMORY ACC fhMEMORY S ok`Oaf: *B]aN=z`:#:::=z(-|0a.=z@a n(f0:zfa*`:*:-|60"<B]0<NBM*N~Nup/?<HNA\Ida-|0:4:::=G(`x"<taH@rd6HSDfBBgBB0HC fNu Memory[0][Memory: Bytes ][ Ok ]FPnrv~(0*;****************************** ; Initialisierungsteil frs ACC ;****************************** lea STACK(pc),sp ; der Stapel frs ACC bsr.s FILA6 ; a6 und a5 =CONTRL, d7=1 move.w #10,(a5)+ ; 10 Opcode Appl_Init move.l d7,(a5)+ ; 0*Intin 1*Intout(d7=1) clr.w (a5)+ ; 0*Addrin bsr.s AES ; AES-Aufruf, Register setzen move.w INTOUT(pc),APPID-CONTRL(a6) ; Appl.-Nummer merken move.w #35,(a5)+ ; 35 Menu_Register move.w d7,(a5)+ ; 1*Intin(d7=1) move.w d7,(a5)+ ; 1*Intout move.w d7,(a5)+ ; 1*Addrin move.w APPID(pc),INTIN-CONTRL(a6) ; Applikationsnummer move.l #ACCNAME,ADDRIN-CONTRL(a6) ; der ACC-Name bsr.s AES ; AES aufrufen move.w INTOUT(pc),ACCID-CONTRL(a6) ; die ACC-Nummer LOOP: bsr.s MEVENT ; auf Ereignis warten cmpi.w #40,MSGBUFF-CONTRL(a6) ; ACC Open ? bne.s LOOP ; nein, weiter warten move.w MSGBUFF+8(pc),d0 ; die ACC-Nummer cmp.w ACCID(pc),d0 ; bin ich gemeint ? bne.s LOOP ; nein, weiter warten bsr.s MAIN ; ja, Hauptroutine abarbeiten bra.s LOOP ; und danach wieder warten MEVENT: move.w #23,(a5)+ ; 23 Evnt_Mesag move.l d7,(a5)+ ; 0*Intin 1*Intout(d7=1) move.w d7,(a5)+ ; 1*Addrin move.l #MSGBUFF,ADDRIN-CONTRL(a6) ; Message-Puffer ;********************* ; AES aufrufen ;********************* AES: move.l #AESPB,d1 ; Zeiger auf Adressliste clr.w (a5)+ ; 0*Addrout move.w #$c8,d0 ; Wert fr AES trap #2 ; aufrufen FILA6: lea CONTRL(pc),a6 ; Zeiger fr A6 movea.l a6,a5 ; und A5 moveq.l #1,d7 ; d7 auf 1 setzen rts ; fertig mit AES ;**************************** ; Der eigentliche Aktionsteil ;**************************** MAIN: moveq.l #-1,d0 ; Restspeicher erfragen move.l d0,-(sp) ; -1.L auf Stack move.w #$48,-(sp) ; MALLOC trap #1 ; Gemdos addq.l #6,sp ; in D0 Restspeicher lea NUMMER(pc),a4 ; Stringadresse in Alert PRLONG: bsr.s LONGNUM ; in Dezimal wandeln move.l #ALTEXT,ADDRIN-CONTRL(a6) ; Text fr Alarmbox ALERT: move.w #52,(a5)+ ; 52 Form Alert move.w d7,(a5)+ ; 1*Intin(d7=1) move.w d7,(a5)+ ; 1*Intout move.w d7,(a5)+ ; 1*Addrin move.w d7,INTIN-CONTRL(a6) ; Default Button = 1 bra.s AES ;************************************** ; Die Dezimal-Umwandlungsroutine ;************************************** LONGNUM: moveq.l #7,d4 ; insgesamt 7 Stellen move.l #1000,d1 ; zuerst 4-stellig moveq.l #(' '-'0'),d2 ; Space erlaubt divu.w d1,d0 ; durch 1000 bsr.s D4TODEZ ; umwandeln swap.w d0 ; Rest in d0.w moveq.l #100,d1 ; dann 3-stellig D4TODEZ: move.w d0,d3 ; Zahl retten W1: ext.l d3 ; auf Lang erweitern subq.w #1,d4 ; schon letzte Ziffer ? bne.s W2 ; nein clr.w d2 ; sonst kein Space erlaubt W2: divu.w d1,d3 ; Rest durch Teiler beq.s DEZPR1 ; ergab schon 0 clr.w d2 ; kein Space erlaubt DEZPR1: add.b d2,d3 ; Offset zu Space addieren addi.b #'0',d3 ; Offset fr Ascii move.b d3,(a4)+ ; ablegen in String swap.w d3 ; Rest der Division divu.w #10,d1 ; nchster Teiler bne.s W1 ; wenn ungleich 0 rts ; sonst fertig .DATA ACCNAME: .DC.b ' Memory',0 ; 2 Spaces vor 'Me...' ALTEXT: .DC.b '[0][Memory:' NUMMER: .DC.b ' Bytes ' ; 8 Spaces vor 'By...' .DC.b '][Ok]',0 .EVEN AESPB: .DC.l CONTRL,GLOBAL,INTIN,INTOUT,ADDRIN,ADDROUT .BSS APPID: .DS.w 1 ; die Applikationsnummer ACCID: .DS.w 1 ; die ACC-Nummer MSGBUFF: .DS.b 16 ; der Nachrichtenpuffer CONTRL: .DS.w 1 ; Opcode der AES-Funktion .DS.w 1 ; Anzahl der Intin-Eintrge .DS.w 1 ; Anzahl der Intout-Ausgaben .DS.w 1 ; Anzahl der Addrin-Eintrge .DS.w 1 ; Anzahl der Addrout-Ausgaben GLOBAL: .DS.w 15 INTIN: .DS.w 2 ; Wort-Eingaben INTOUT: .DS.w 2 ; Wort-Ausgaben ADDRIN: .DS.l 2 ; Adre-Eingaben ADDROUT: .DS.l 2 ; Adre-Ausgaben .DS.b 100 ; Platz fr Stapel STACK: .END . ^i!.. p^igRSCTEST C Ve"RSC2OBJ1PRJ Ve'qRSCTEST PRG %V(mRSCTEST PRJ VeDRSC2OBJ TTP +VE& RSC2OBJ C VeH&/*************************************************************************** * RSCTEST.PRG - geschrieben in Turbo-C von Christoph Conrad * (c) 1992 MAXON Computer GmbH * * FUNKTION: Test einer RSC-Objectdatei Einbindung * durch Anzeigen aller Objektbume * Der labelname auf der Kommandozeile von RSC2OBJ.TTP * muss 'resource' lauten (ohne Anfhrungsstriche) !!! * * Bentigte Bibliotheken: Standard/Gemlib/TOS-Lib. */ #include #include #include #include #include typedef enum {false, true} bool; /* Die blichen GEM-Variablen...*/ int contrl[12], intin[128], intout[128], ptsin[128], ptsout[128]; int work_in[12], work_out[57]; int handle, phys_handle; int gl_hchar, gl_wchar, gl_hbox, gl_wbox; int gl_apid; /* Beim AES/VDI anmelden */ bool open_vwork(void) { register int i; if((gl_apid = appl_init()) != -1) { for(i = 1; i < 10; work_in[i++] = 0); work_in[10] = 2; phys_handle = graf_handle(&gl_wchar, &gl_hchar, &gl_wbox, &gl_hbox); work_in[0] = handle = phys_handle; v_opnvwk(work_in, &handle, work_out); return(true); } else return(false); } /* Beim VDI/AES abmelden */ void close_vwork(void) { v_clsvwk(handle); appl_exit(); } extern RESOURCE; /* rsc zeigt auf den Anfang der Resourcedatei, also den Resourceheader */ RSHDR *rsc = (RSHDR*) &RESOURCE; /* Ersatz der Funktion rsrc_gaddr des AES. * Es werden Objektbume/Freestrings/Freeimages bercksichtigt. * Die Original-AES-Funktion liefert bei anderen Typen zum Teil * seltsame Ergebnisse. * Die Positionsoffsets im Resourceheader verweisen auf (relozierte) * Adresstabellen mit Zeigern auf die eigentlichen Objekte. * rsrc_gaddr liefert bei * - Objectbumen (re_gtype == 0): Die Anfangsadresse des Baums * - Free-Strings/Images: Zeiger auf Zeiger auf das eigentliche Object */ int rsrc_gaddr(int re_gtype, int re_gindex, OBJECT **re_gaddr) { if(re_gtype == 0 && 0 <= re_gindex && re_gindex < rsc->rsh_ntree) { *re_gaddr = *((OBJECT**) (rsc->rsh_trindex + (long) rsc + 4 * re_gindex)); return true; } if(re_gtype == 15 && 0 <= re_gindex && re_gindex < rsc->rsh_nstring) { *re_gaddr = (OBJECT*) /* eigentlich OBJECT** */ (rsc->rsh_frstr + (long) rsc + 4 * re_gindex); return true; } if(re_gtype == 16 && 0 <= re_gindex && re_gindex < rsc->rsh_nimages) { *re_gaddr = (OBJECT*) /* eigentlich OBJECT** */ (rsc->rsh_frimg + (long) rsc + 4 * re_gindex); return true; } return false; } /* Fr alle Objecte wird eine Transformation von Zeichen- in * Pixelkoordinaten vorgenommen. */ void rsrc_AllFix(OBJECT *firstObj, int nrObj) { int obj; for(obj = 0; obj < nrObj; ++obj) rsrc_obfix(firstObj, obj); } bool main(void) { if(open_vwork() == true) { OBJECT *objTree; int nrObj = rsc->rsh_nobs; int x,y,w,h; int nrObjTrees = rsc->rsh_ntree; int actObjTree; graf_mouse(0,0); /* Maus als Pfeil */ rsrc_gaddr(0,0,&objTree); /* Adresse des ersten Objectbaums */ rsrc_AllFix(objTree, nrObj);/* Zeichen -> Pixelkoordinaten */ for(actObjTree = 0; actObjTree < nrObjTrees; actObjTree++) { /* Objektbaumadresse bestimmen */ rsrc_gaddr(0, actObjTree, &objTree); /* Zentrieren des Objektbaums * Menleisten sind nicht zum Zentrieren gedacht, bei * ihnen bleibt Mll am oberen Bildschirmrand nach * dem Restaurieren mit form_dial(3,..). */ form_center(objTree, &x, &y, &w, &h); /* Bildschirmbereich reservieren */ form_dial(0, x, y, w, h, x, y, w, h); /* Objektbaum zeichnen */ objc_draw(objTree, 0, 8, x, y, w, h); Crawcin(); /* Bildschirmbereich freigeben */ form_dial(3, x, y, w, h, x, y, w, h); } close_vwork(); return false; } else { printf("Fehler bei der Programminitialisierung!"); return true; } } rsc2obj.ttp = tcstart.o ; startup code rsc2obj tctoslib.lib tcstdlib.lib ; standard lib `X``>>> TURBO-C <<<< for ATARI-ST Release 1 (C) 88 Borland International G#iJ$VH3i k  Ј<.@// ?<?<JNAO pBAA4|`g |`.gg4TB|"O4SBQBt SAe!dB)SAe !eHiR@`/ R@Hzd"k, ONZ? 9g @N 9g @NN ?<LNA/ EnN 5@R@gTp` 2ABrR@| m5|HynHynCAN C8jxA aFA pJWF@?@gA 2SAk ae(Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`XH0$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 H:$H&I(Sx&gBJg>+g@,k $ڹd SfRe`&// Ka*$"J@f(S`& L\Nu3 p`H&H(k6+"+g0DtaJk+fT"SA"L Ip Wf(| ?/ " 0aX"_2JkJAp QH@" 0a6LJj`&0" La |g&'LB@LNup`|g$//??<@NAO JkNua\3pNu// &H&g??<NAXOSb&_&Nu|b$??/?<BNAO JkNua3pNu0<`D@| |"b;NupNu   / Gn g/ &S?<INA\O`Gn g/ &S?<INA\O`&_NuH0$H|g|$brGRgJ3kSJtgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<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!`0123456789abcdefghijklmnopqrstuvwxyz@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#AnBhBhre`r3n/ Cn2dBi3| Cp 2Q"< psNB _0nAqV"op+2QAqp 2QNunoVpVqVq1@ 0"<ipsNBAqV0Nup `p`#rAoV000000p*`#rAoV0000000 0 0p3`l/ #rp6a^"_2"o2"o2"o 2Nu#r3oVpr`4/ /pMa*"_2"_2"o2"o2Nu#r3oVpN`3n@@A CnB@22220<"<NBAqV0NunnoVqVrt ?<NATONu'$W~W  File Bearbeiten Block Format Attribute Korrektur Graphik Hilfe 1st Word Plus... -------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 ffnen... Drucken... --------------------- Speichern... Speichern als... Speichern & weiter--------------------- Block lesen... Block schreiben...--------------------- Datei lschen...--------------------- Ende Suchen... Ersetzen... Erneut suchen------------------- Statistik...------------------- WP modus Trennhilfe Einfge modus Wortumbruch------------------- Setze Marke... Gehe zu Marke... Gehe zu Seite... Blockanfang Blockende--------------------- Ausschneiden Einfgen--------------------- Block kopieren Block verschieben--------------------- Block lschen--------------------- Zum Blockanfang Zum Blockende--------------------- Markierung lschen Zeige Lineal Zeige Position--------------------- Seitenformat... Lineal hinzufgen--------------------- Lineal lschen Lineal lesen--------------------- Funoten Format... Funote hinzufgen Fettschrift Unterstreichen Kursivschrift Helle Schrift Superscript Subscript--------------------- Restyle--------------------- Zentrieren Rechtsbndig Einrcken Neu formatieren... Wrterbuch laden------------------------ Korrigieren Wrterbuch Bearbeiten Wort hinzufgen... Wort lschen... Korrekturende Graphik Modus------------------ Bild lesen... Bild lschen... Extra hilfe--------------- Bearbeiten Format Rnder Tab Punkte Schreiben Korrigieren Cursor Scrollen Lschen Tastatur Seitengrenze Ausschneiden Drucken FunotenEndeAktuelle Bearbeitung beendenund Text nicht abspeichernABBRUCHBEENDENTrennungabcdefghijklmnopqrstuvwxyz0123456789ABBRUCHNEINOKErsetzen?JANEINABBRUCH Text suchen Suchen der angegebenen Zeichenkette? kann als Wildcard benutzt werden.xxxxxxxxxxxxxxxxxxxxxxxx SUCHE: ________________________XXXXXXXXXXXXXXXXXXXXXXXXSuchrichtungGro/Klein-BEACHTENIGNORIERENABBRUCHOKschreibung Suchen und ersetzen Suchen der ersten Zeichenkette undErsetzen durch die Zweite. ? kannals Wildcard benutzt werden.xxxxxxxxxxxxxxxxxxxxx ERSETZEN: _____________________XXXXXXXXXXXXXXXXXXXXXxxxxxxxxxxxxxxxxxxxxx DURCH: _____________________XXXXXXXXXXXXXXXXXXXXXSuchrichtungGro/Klein-BEACHTENIGNORIERENWas soll er-NACH RCKFRAGEALLENUR DER ERSTEABBRUCHOKschreibungsetzt werden---form title---#1#2#3#4ABBRUCH 1st Word Plus Version0.00(BRD)Software von GST, Cambridge EnglandAuthoren:Howard ChalkleyPhil ChampFrank OakesChris ScheybelerOKCopyright GST Holdings Limited, 1986Andreas VolkmannIn Lizenz an Atari Corp. (Deutschland) GmbHDeutsch von: Seiten Format _________________________XXXXXXXXXXXXXXXXXXXXXXXXXKopf LKopf M_________________________XXXXXXXXXXXXXXXXXXXXXXXXXKopf R_________________________XXXXXXXXXXXXXXXXXXXXXXXXXFu L_________________________XXXXXXXXXXXXXXXXXXXXXXXXXFu M#_________________________XXXXXXXXXXXXXXXXXXXXXXXXXFu R_________________________XXXXXXXXXXXXXXXXXXXXXXXXX66__99Papierlnge01__99Oberer Rand03__99Rand KopfzeileABBRUCH03__99Rand Fuzeile05__99Unterer Rand54__99Zeilen/SeiteOK Datei drucken Drucke von Seite001___999bis999___999Offset Seitennummer000___999Linker Rand05__99Anzahl Exemplare01__99Kopf und Fuzeile aufgeraden und ungeradenNEINJADruck QualittNORMALNLQOKABBRUCHSeiten tauschen?AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA__________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXABBRUCHOK--(title here)--____Nummer? ____9999-title here-OKABBRUCHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASuche: _______________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSUCHEN WRTERBUCH FENSTER 0123456789WRTERBUCHHAUPTFUNKTIONENHINZUFGENLSCHENDOKUMENTKORREKTURERSETZENENDE Statistik Dokument:00000Seiten: _____9999900000Zeilen: _____9999900000Worte: _____9999900000Bytes: _____K99999Verbleibender Speicher:00000RAM: _____K99999A:00000Disk: _____K99999OKF4Drucker Installiert:Keiner Parallel port ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  LEERZEICHENRETURNLOESCHEN LOESCHEN TABULATORFESTES LEERZ.F1 FETTF2 UNTERSTRICHENF3 KURSIVF4 HELLF5 EIN-FUEGENF6 ZEILELOESCHENF7 NEUESEITEF8 ZEN-TRIERENF9 EIN-RUECKENF10 NEUFORMATCAPSLOCK"Free" strings WORDMSGS.RSCWORDHELP.RSCSPELLING.DICDEFAULT RUNNING HEADS/FEETxx66010303055465 Druck Datei...Seite # Drucken... PAUSE NEUSTARTPRINTER.CFGDATEI FFNENDATEI DRUCKENDATEI LSCHENBLOCK LESENBILD LESENSPEICHERN ALSBLOCK SCHREIBENHaltHalt: Papier einlegenHalt: Normales Typenrad einlegenHalt: Kursivtypenrad einlegenHalt: Light Typenrad einlegenHalt: Light Kursivtypenrad einlegenDRUCKER WHLENParallel PortSerieller PortWort hinzufgenWort lschenSPELLING.TMPSetze MarkeGehe zu Marke Gehe zu Seite... Gehe zu Zeile...Gehe zu SeiteGehe zu Zeile Seite %d Zeile %d Spalte %d %s Zeile %d Spalte %d %sPicaEliteSchmalschriftBreitschriftLineal hinzufgenLineal ndernX:FORMATS\FORMAT.XXXLINEAL LESENDezimaltab.,Funote %d(Endnote %d)Datei druckenDatei:ccccccccccccccccccccccccccccccccDrucker:cccccccccccccccccccccccccccccc__ Anzahl: __ XX___ Seite: ___ XXX---------- reason for pause ------------OK NEUSTART STOPFILE SELECTOR TITLE--- Form Title ---SchriftPicaEliteSchmalBreitTab Abstand3456810Lnge Zeilenlineal:999JustiertZeilenabstand9EINAUSOKABBRUCHNeu formatierenAbsatzZwischen zwei LinealenGesamter TextABBRUCHFunoten Format Abstand oben__9Trennstrichlnge______999__9Abstand untenOKABBRUCHGLMqNklmq %   q 01$Vo"q ,-#.QR#Spqr!!qqFmn' "q0QRl!;>APSVehkq"&69<PSV ## 7 I Jq K P ] b p qq }  ' !!!!!!!! ! ! ! !!!!!!!!!!!!!! !!!"!$!%!&!(!)!*!5!6 !7!G!H!\!e!f !g!q!r !!!q !!!!!!!!!!!!"" "/"5"8"9":"@"O"X"["\"""!"""""## !# #,#-"#.#O#P!#Q#s#t"#u##"###"###"#$$"$$'$("$)$K$L"$M$o$p"$q$$ $$$ $$$$$$ $$$ $$$ $$$$$$ $$$$$$ $%% %%% %%%%%%%& %'%,%-%.%6%7%8%?%@%A%J%K %L%U%V %W%_%`%a%g%h%i%q%r%s%{%|%}%%1%%%%%%%%%%%%%%%(((q()) !))2)3)4)7)D )G)K)X )\)))))))))q****5*7*8*N*^*_q***q********* P P K > C J  W _ h%  t0  ;  D jP $$# 9E[q ! " # # 3%2 &*'6(D)T*h+w, - . /  0 1 2 $ C4B5 67'8=9L:W;m<~=> ? @ A B 3ODN E F*G;HQIcJwKLMN C ]P\' QRS TU,V:WFX\YfZ| [ \ O e^d2_`abc d ]2jfi=gBhRieeu kzAlmnopqrstu v w x y# z2j <"*++.%* +J +f$@ @''+  %)+ +#2#+#                (+ ,",*",F,b",~ "           )  2 = JY^l t w   ",  %  ',  ,#     &  2  C ,o -  -&   )&-B   "-^-zJ- "  - - - @.@D  @."@Y  @.>@n })( @!.Z"@#  $@%.v&@'  (.  '&. ..  / *  / ?  /:  Y o     ( /V" ,  4 /r / / r% u6/& * & /&$ @ @ " @/! @0! @06! @0R!@0n!@0!@0!@0!@0!@0 !1*12* !I* !T* 1N* 1j* !s*  %!|* $1  ! 1 1  1  1   " 2  @ 2.@2J '"U CM2f A"]"r"3 A2  2 ! 2  2 ! 2  3 !3* 3F !3b 3~ !3 3 !3 3 C 4 4& 4B 4^ 4z 4 ; M   44#!" "4 5&$% %5"#5>)'( (5Z&5v,*+ +5)5/-.# .5,5201* 16/65341 46:26V8678 76r56;9:> :686<=F =6; 6:M%% % % %% % % %  &  &1 &*&+ &3&41 &A &I &R &^ &k &y & & & &&#&#&#&# &# '#!'5##"'Y#'h# $'v# %'# &'# '' ('5 )'5 *'3 +'3 ,'3 -'3 .( /(+0(B"1(G,2(M3 3([A 4(h!5(z3 6(,7( 8(; 9(=:(  (  / 7*(76  *) 7R 7n  7!  7 ( )  ) %)!  (M 7K%7  )Q) Q) Q) Q)    )  Q) Q) Q) Q)Q)Q)  )@*7@* **% @*38@*9Q*;Q*?*C%*F  82*`*g*~%*   8N* 8j*88 *  * %* 8DFDEFGIJvLOR>RS.UW6]bccd&g&gFehler bei der Programminitialisierung!iViViViiiiiiiiinoVpVqVqh ,8JL ~0  ,$, hH00000000000000000000000H00000H0000000000x000000000H00000000000000H000000000 ,Xrsctest.prg = tcstart.o ; startup code w.o rsctest tcstdlib.lib ; standard lib tcgemlib.lib ; AES and VDI lib tctoslib.lib `"``>>> TURBO-C <<<< for ATARI-ST Release 1 (C) 88 Borland International G# J$VH3 k  Ј<.@// ?<?<JNAO pBAA4|`g |`.gg4TB|"O4SBQBt SAe!dB)SAe !eHiR@`/ R@Hzd"k, ONr? 9g @N 9g @NN?<LNAANNNuH:8BC`Ar0NrgB@`RCCnpL8NuH>O?@$HBFANI om onB@ jN?@m"*g A -f(HN|Rf|t2/pN.oBB2/pNJf NN,H g"0/NfJFg 0."HfB@ jNH8mArN&rfp2NJ@gAr0Nrfp2NJ@gAr0Nrfnp 2NJ@g` N"0NİfP j Nz` j r0Nrf.ځ j 0Xgrn`Ar0N|rfځpnAr0N`rfp2N*J@g N**H f jN*`tz`B5XRmJFg0.H"Ё&@<.?n0.6. >.HǏz`2A;RG2A;RGR2/Hm>. HǏz`2A;RG2A;RGR2Hm>.HǏz`J"4.H Ԁ B 0rNj2A;R@2A;0@;RG0@;RGR0Hmz` ЀЅ63|2|| bPA2;NFFF ЀЅA rN.0@;RG0@;0|| b@0;NPzzzzz"ҁ҅ 3 rN.B@`2A;RG2A;RGR@|m`*"ҁ҅ 3 rNF.0@;RG0@;R0Hm M"0N$f0/N0NANB@`A(NADNpN jNAjNpNz jNANpNdANpNV jNAN|pN@ jNnANfpN* jNXAjNPpNANB jNTpNO L|Nu//??<?NAO Nu?<NATONu??<>NAXONu/?< NA\ONu/?<HNA\O @Nu/?<ANA\ONu//??<@NAO Nu?/?<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu `Alles paletti!Falsche Anzahl Parameter! RSC2OBJ infile outfile labelname [-r] konnte nicht geffnet werden!: Fehler beim Ermitteln der Dateilnge!Zuwenig Speicher!: Fehler beim Einlesen!: Keine RSC-Datei oder fehlerhaft!Fehler beim Schreiben!h >&/************************************************************************** * RSC2OBJ.TTP - geschrieben in Turbo-C von Christoph Conrad * (c) 1992 MAXON Computer GmbH * * KOMMANDOZEILE: infile outfile labelname [-r] * * FUNKTION: Konvertiert die Datei infile in eine Objectdatei namens * outfile im Digital Research Objectformat. Das komplette * infile wird dabei als DATA-Segment deklariert und kann * ber die Adresse der Public-Definition (des externen Labels) * labelname referenziert werden. * * Ist der optionale Parameter -r angegeben, muss es sich beim * infile um eine Resourcedatei handeln. Dann werden zustzlich * alle ob_spec-Zeiger auf TEDINFO/ICONBLK/BITBLK-Strukturen * als zu relozierend vermerkt, die Zeiger innerhalb dieser * Strukturen, die Indize der Objectbaumtabelle, der * Freestringtabelle, der Freeimagestabelle sowie die bi_pdata- * Zeiger der Freeimages. * Dies bewirkt, das beim Laden des Programmes durch den * GEMDOS-Loader diese Referenzen automatisch auf die absoluten * Speicheradressen angepasst werden. Als einzige Arbeit bleibt * die Umrechnung von Zeichen- in Pixelkoordinaten mittels * rsrc_obfix(...). * Der labelname wird immer auf 8 Zeichen begrenzt und in * Grossbuchstaben konvertiert. * * Bentigte Bibliotheken: TOS- und Standardlib. */ #include #include typedef unsigned long size_t; extern void exit(int status); extern char *strupr(char *s); extern int toupper(int c); extern int atexit(void (*func)()); typedef enum{false, true} bool; /* Vor der Rckkehr des Programmes zum Desktop * wird auf einen Tastendruck gewartet, damit * alle Meldungen gelesen werden knnen. */ void holdScreen(void) {Cconws("\r\n"); Crawcin();} /* Ausgabe von count Nullbytes auf die Datei FILE* file */ bool fputNull(int count, int file) { int byte; for(byte = 0; byte < count; ++byte) if(Fwrite(file, 1L, "") != 1L) return false; return true; } int main (int argc, /* Anzahl bergebener Parameter + 1 */ char *argv[]) /* Einzelne Parameter (ab argv[1]) als String */ { int in, out; /* Ein/Ausgabedatei - Filedeskriptoren */ bool rscReloc = false; /* RSC-Dateikonvertierung ? */ long length; /* Lnge der Eingabedatei */ char *inbuf; /* Zeiger auf Einlesebuffer fr Eingabedatei */ int *outbuf; /* Zeiger auf Buffer fr Fixup-table */ /* Allgemeiner Schleifenindex, long wegen Lschen des outbuf (s.u.) */ long i; /* Bei Programmabschluss soll der Ausgabebildschirm bis zu * einem Tastendruck erhalten bleiben. */ atexit(holdScreen); /* Anzahl der bergabeparameter checken */ if(!(4 <=argc && argc <= 5)) goto Usage; /* ffnen der Eingabedatei */ if((in = Fopen(argv[1], 0)) < 0) goto InfileOpen; /* bergabeparameter "-r": Relocation einer RSC-Datei an */ if(argv[4] && argv[4][0] == '-' && toupper(argv[4][1]) == 'R') rscReloc = true; /* Dateilnge der Eingabedatei ermitteln */ if((length = Fseek(0L, in, 2)) <= 0 || Fseek(0L, in, 0) != 0) goto InfileLen; /* Buffer fr Eingabedatei allokieren... */ if(!(inbuf = (char*) Malloc(length))) goto Malloc; /* ...und Datei einlesen */ if(Fread(in, length, inbuf) != length) goto InfileRead; /* Test, ob (bei Angabe des Flags -r, Resourcedatei konvertieren) * die im RSC-Dateiheader abgelegte Dateilnge mit * der tatschlichen Lnge bereinstimmt. */ if(rscReloc && ((int*)inbuf)[17] != length) goto NoRSCFile; /* ffnen der Ausgabedatei */ if((out = Fcreate(argv[2], 0)) < 0) goto OutfileCreate; /* Objectdatei-Magic setzen */ if(Fwrite(out, 2, "\x60\x1A") != 2) goto Write; /* CODE-Lnge == 0 */ if(!fputNull(4, out)) goto Write; /* DATAlnge = Grsse der Eingabedatei */ if(Fwrite(out, sizeof(long), &length) != sizeof(long)) goto Write; /* 4 Nullbytes fr BSSlnge * 3 Nullbytes + 14 (Lnge der Symboltabelle als Long, ein Eintrag * in der Symboltabelle = 14 Bytes) */ if(!fputNull(7, out)) goto Write; if(Fwrite(out, 1L, "\016") != 1L) goto Write; /* Zehn reservierte Bytes (Null) */ if(!fputNull(10, out)) goto Write; /* DATA == Eingabedatei schreiben */ if(Fwrite(out, length, inbuf) != length) goto Write; /* Der Desktop wandelt ihm bergebene Kommandozeilen bei * TTP-Programmen immer in Grossbuchstaben!! strupr hier, * damit auch bei Kommandozeileninterpretern, die dies evt. * nicht machen, das gleiche Programmverhalten auftritt. */ strupr(argv[3]); /* Eintrag in der Symboltabelle * Labelname (8 Bytes) + (0xA400 == Defined global in DATA-Segment) */ for(i = 0; argv[3][i] && i < 8; ++i) if(Fwrite(out, 1L, &argv[3][i]) != 1L) goto Write; for(; i < 8; ++i) if(Fwrite(out, 1L, "") != 1L) goto Write; /* 0xA400 == defined global symbol in DATA-Segment */ if(Fwrite(out, 1L, "\xA4") != 1L) goto Write; /* Ein Nullbyte von 0xA400, vier Nullbytes Symbolwert */ if(!fputNull(5, out)) goto Write; if(!(outbuf = (int*) Malloc(length))) { Fdelete(argv[2]); /* Ausgabedatei lschen */ goto Malloc; } for(i = 0; i < length; ++i) ((char*)outbuf)[i] = 0; if(rscReloc) /* Resourcedatei, Fixuptabelle aufbereiten */ { /* Zeiger auf Resourcedateiheader */ RSHDR *rsc = (RSHDR*) inbuf; /* Zeiger auf erstes Object */ OBJECT *obj = (OBJECT*) (rsc->rsh_object + (long) rsc); /* Gesamtzahl der Objecte */ int nrObj = rsc->rsh_nobs; /* Gesamtzahl der Objektbume */ int nrObjTrees = rsc->rsh_ntree; /* Gesamtzahl der Freestrings */ int nrFreeStr = rsc->rsh_nstring; /* Gesamtzahl der Freeimages */ int nrFreeImg = rsc->rsh_nimages; /* Abstand eines zu relozierenden Wertes vom Resourcedateistart * in sizeof(int) (sizeof(int), da int *outbuf) */ int dist; /* Das Fixup-Info sieht HIER immer gleich aus: Die Tabelle * enthlt fr jedes Long des DATA-Segments (== RSC-Datei) * einen Wert, wobei ein 0L (wegen dem calloc) vorgegeben ist * und "keine Relokation" bedeutet. * Fr alle zu relozierenden Longs wird eine 0x00050001 eingetragen, * wobei das Highword fr 'relocatable', das Lowword fr 'in DATA- * Segment' steht. */ /* Objektbaumtabelleneintrge */ dist = rsc->rsh_trindex / 2; for(i = 0; i < nrObjTrees; ++i) { outbuf[dist++] = 5; outbuf[dist++] = 1; } /* Freestringtabelleneintrge */ dist = rsc->rsh_frstr / 2; for(i = 0; i < nrFreeStr; ++i) { outbuf[dist++] = 5; outbuf[dist++] = 1; } /* Freeimagestabelleneintrge + zugehrige BITBLK's */ dist = rsc->rsh_frimg / 2; for(i = 0; i < nrFreeImg; ++i) { int bi_pdataDist = ( (long*) (rsc->rsh_frimg + (long) rsc) )[i] / 2; /* bi_pdata-Zeiger in BITBLK's */ outbuf[bi_pdataDist++] = 5; outbuf[bi_pdataDist] = 1; /* Tabelleneintrge */ outbuf[dist++] = 5; outbuf[dist++] = 1; } /* Alle Objekte durchgehen */ for(i = 0; i < nrObj; ++i) { /* Bei ob_type extended-Flags (Bits 8..15) ausblenden */ int ob_type = obj[i].ob_type &0xFF; int j; /* Lokaler Schleifenindex */ /* Anpassung der ob_spec-Zeiger */ switch(ob_type) { case 21: case 22: case 23: case 26: case 28: case 29: case 30: case 31: case 32: dist = ((long) &obj[i].ob_spec - (long) rsc) / 2; outbuf[dist++] = 5; outbuf[dist] = 1; } /* Anpassung der Zeiger in TEDINFO/ICONBLK/BITBLK-Strukturen */ switch(ob_type) { case 21: case 22: case 29: case 30: case 31: /* TEDINFO/ICONBLK */ dist = (long) obj[i].ob_spec / 2; for(j = 0; j < 3; j++) { outbuf[dist++] = 5; outbuf[dist++] = 1; } break; case 23: /* BITBLK */ dist = (long) obj[i].ob_spec / 2; outbuf[dist++] = 5; outbuf[dist] = 1; } } } /* Fixup-Tabelle schreiben */ if(Fwrite(out, length, outbuf) != length) goto Write; Fclose(in); Fclose(out); Cconws("Alles paletti!"); return false; Usage: Cconws("Falsche Anzahl Parameter!\r\n"); Cconws("RSC2OBJ infile outfile labelname [-r]"); exit(1); InfileOpen: Cconws(argv[1]); Cconws(" konnte nicht geffnet werden!"); exit(2); InfileLen: Cconws(argv[1]); Cconws(": Fehler beim Ermitteln der Dateilnge!"); exit(3); Malloc: Cconws("Zuwenig Speicher!"); exit(4); InfileRead: Cconws(argv[1]); Cconws(": Fehler beim Einlesen!"); exit(5); NoRSCFile: Cconws(argv[1]); Cconws(": Keine RSC-Datei oder fehlerhaft!"); exit(6); OutfileCreate: Cconws(argv[2]); Cconws(" konnte nicht geffnet werden!"); exit(7); Write: Cconws("Fehler beim Schreiben!"); Fdelete(argv[2]); exit(8); } . ^iR.. p^igTRAP_LOGPRG SuTRAP_LOGS V-READ_ME hb9`<O./ޯ޼ޯ ޼<RG/!,A!Nu# #$#,p#Nuf&/8, 8$g NuaNu 8,pg 8gNuXBRATLOG9f6H/|g|sgX`0<V`0<AaF _ P0aa4L/9Nu// o (mB 8f A!`0(@B  _/o  PNs  _ yN/ oRf"*. " > ",,;************************************************** ;* TRAP_LOG.S - Stephan Simson * ;* * ;* Versionen * ;* 0.0 31.10.89: GEMDOS-Logger * ;* 1.0 10.12.89: AES/VDI-Logger * ;* 1.1 23.01.90: GEMDOS-Logger nur * ;* mit A0, D0 * ;* 2.0 27.03.90: AUTO-Start, XBRA * ;************************************************** ;************************************************** ;* Zuweisungen * ;************************************************** ; ; Base-Page-Offset-Werte ; TxtSgSiz EQU $00C ; Text-Segment-Gre DatSgSiz EQU $014 ; Daten-Segment-Gre BssSgSiz EQU $01C ; BSS-Segment-Gre BasPgSiz EQU $100 ; Base-Page-Gre ; ; Ascii-Zeichen ; NUL EQU $00 LF EQU $0A CR EQU $0D BLANK EQU $20 ; ; Hardware-Adressen ; MFP_PIO EQU $FFFA01 ; MFP 68901: par. I/O ; ; GEMDOS-Funktionen ; CRAWCIN EQU $07 ; rohe Zeicheneingabe CCONWS EQU $09 ; Stringausgabe PTERM0 EQU $00 ; Programmende PTERMRES EQU $31 ; Programmende / res. ; ; BIOS-Funktionen ; SetExec EQU $05 ; Exc.-Vektor setzen Bconout EQU $03 ; Ausgabe Zeichen Bcostat EQU $08 ; Test Status Ausgabe ; ; Vektor-Nummern ; IllAdVNr EQU $03 ; illegale Adresse TraceVNr EQU $09 ; Trace FLineVNr EQU $0B ; Line-F T01VktNr EQU $21 ; Trap-01 (GEMDOS) T02VktNr EQU $22 ; Trap-02 (AES / VDI) ; ; Trap-Nummern ; GEMDOS EQU $01 ; BIOS EQU $0D ; ; ; Gerte ; PRN EQU 0 ; Centronics-Port ; ; Bits ; Unlink EQU 0 ; FLine:Unlink-Modus Gesperrt EQU 0 ; Funktion gesperrt Drucken EQU 1 ; carrier detect Zeitlupe EQU 2 ; clear to send Desktop EQU 3 ; Desktop installiert BootTest EQU 4 ; Boot-Test gelaufen SuperMod EQU 5 ; Supervisor-Modus TraceMod EQU 7 ; Trace-Modus ; ; Trap-2 Funktionen ; AES_Code EQU $C8 ; AES-Funktion VDI_Code EQU $73 ; VDI-Funktion ; ; Sonstige ; StckSize EQU $100 ; Stack-Gre: 256 Bereit EQU $FFFF ; Gerte-Status ;************************************************** ;* Programm * ;************************************************** TEXT ProgrBgn: ; ; Berechnung: RAM-Bedarf und Stack-Pointer ; LEA.L ProgrBgn-BasPgSiz(PC),SP ; SP -> BP MOVE.L DatSgSiz(SP),D7 ; Data-Seg. ADD.L BssSgSiz(SP),D7 ; BSS-Seg. ADD.L #BasPgSiz,D7 ; Base-Page ADD.L TxtSgSiz(SP),D7 ; Text-Seg. ADD.L #StckSize,D7 ; Stack-Gr. OR.B #$01,D7 ; D7: RAM- ADDQ #$01,D7 ; Bedarf ADD.L D7,SP ; SP okay ; ; Test der existierenden Trap-01-Routinen ; MOVE.L #-1,-(SP) ; hole MOVE.W #T01VktNr,-(SP) ; alten MOVE.W #SetExec,-(SP) ; Vektor TRAP #BIOS ; nach D0 ADDQ.L #8,SP ; AND.L #$00FFFFFF,D0 ; MOVE.L D0,A4 ; SuchXBRA: CMP.L #'XBRA',-12(A4) ; nach BNE InstaLOG ; XBRA CMP.L #'TLOG',-8(A4) ; Standard BEQ StatAend ; vorgehen MOVE.L -4(A4),A4 ; BRA SuchXBRA ; ; ; Status ndern ; StatAend: BCHG #Gesperrt,-14(A4) ; ge- BEQ NichtAkt ; sperrt ? LEA Meldung2(PC),A0 ; Freigabe- BRA ZeigStat ; oder ; NichtAkt: LEA Meldung3(PC),A0 ; Sperr- ZeigStat: BSR ZeigMeld ; Meldung MOVE.W #PTERM0,-(SP) ; Programm TRAP #GEMDOS ; beenden ; ; Installation des Loggers fr Trap-01 ; InstaLOG: PEA Trp01LOG ; Routine MOVE.W #T01VktNr,-(SP) ; fr MOVE.W #SetExec,-(SP) ; Trap-01 TRAP #BIOS ; einbauen MOVE.L D0,_Trp01OV ; ADDQ.L #8,SP ; LEA Meldung1(PC),A0 ; Install. BSR ZeigMeld ; melden MOVE.W #0,-(SP) ; Programm MOVE.L D7,-(SP) ; beenden & MOVE.W #PTERMRES,-(SP) ; resident TRAP #GEMDOS ; halten ; ; Meldung zeigen und Taste warten ; ; Aufruf ; : Zeiger auf Meldungstext ; ZeigMeld: MOVE.L A0,-(SP) ; MOVE.W #CCONWS,-(SP) ; Meldung TRAP #GEMDOS ; ausgeben ADD.L #6,SP ; MOVE.W #CRAWCIN,-(SP) ; warte auf TRAP #GEMDOS ; Taste ADD.L #2,SP ; RTS ; ; ; Trap 01 TRAP_LOG.TOS ; ; benutzte Register: A0, D0 ; StrngFlg: DC.W NUL ; Steuerung Magic_01: DC.B 'XBRA' ; Magic Ident_01: DC.B 'TLOG' ; Ident-Nr. _Trp01OV: DC.L 0 ; Original Trp01LOG: BTST #Desktop,StrngFlg ; ggf. BNE Tr01LOG1 ; Trap-02- BSR TestBoot ; Logger BTST #Desktop,StrngFlg ; auch noch BEQ Tr01LOG1 ; instal- BSR InstTr02 ; lieren Tr01LOG1: MOVE.L SP,A0 ; A0 = SP BTST #SuperMod,(SP) ; alter BNE Tr01LOG2 ; Status MOVE.L USP,SP ; bestimmt, MOVE.L SP,D0 ; ob USP zu BRA Tr01LOG3 ; benutzen Tr01LOG2: MOVE.L SP,D0 ; ist oder ADDQ.L #6,D0 ; SSP Tr01LOG3: EXG D0,A0 ; rette den MOVE.L D0,-(SP) ; alten SP BTST #Gesperrt,StrngFlg ; ge- BNE Tr01LOG4 ; sperrt ? MOVE.L A0,-(SP) ; MOVE.W #'G',D0 ; 'G' fr BSR AusgZchn ; GEMDOS, MOVE.L (SP)+,A0 ; dann ber MOVE.W (A0),D0 ; A0 adres- MOVE.B D0,-(SP) ; sierte ASR.B #4,D0 ; Nummer BSR AusgHlbB ; ausgeben MOVE.B (SP)+,D0 ; BSR AusgHlbB ; BSR AusgLeer ; Tr01LOG4: MOVE.L (SP),SP ; SP okay Tr01LOG5: MOVE.L _Trp01OV,A0 ; weiter JMP (A0) ; wie sonst ; ; Installation Trap-02-Logger ; InstTr02: BSR RettOrgV ; erst die LEA IllAdLOG(PC),A0 ; Original- MOVE.L A0,4*IllAdVNr ; vektoren LEA TraceLOG(PC),A0 ; sichern, MOVE.L A0,4*TraceVNr ; dann die LEA FLineLOG(PC),A0 ; Logger- MOVE.L A0,4*FLineVNr ; Routinen LEA Trp02LOG(PC),A0 ; ein- MOVE.L A0,4*T02VktNr ; binden RTS ; ; ; Rettung der Original-Vektoren ; RettOrgV: MOVE.L 4*IllAdVNr,_IllAdOV ; MOVE.L 4*TraceVNr,_TraceOV ; MOVE.L 4*FLineVNr,_FLineOV ; MOVE.L 4*T02VktNr,_Trp02OV ; RTS ; ; ; Test, ob das Boot schon schwimmt ; TestBoot: BSET #BootTest,StrngFlg ; Merker f. BNE TstBoot2 ; TestBoot MOVE.L 4*FLineVNr,-(SP) ; wenn OR.L #$FF000000,(SP) ; FLine- & MOVE.L 4*TraceVNr,D0 ; Trace- OR.L #$FF000000,D0 ; Vektor CMP.L (SP)+,D0 ; ungleich, BEQ TstBoot1 ; dann BSET #Desktop,StrngFlg ; luft RTS ; Desktop TstBoot1: BSR RettOrgV ; Vektoren RTS ; retten TstBoot2: MOVE.L 4*FLineVNr,D0 ; Desktop CMP.L _FLineOV,D0 ; luft, BEQ TstBoot9 ; wenn MOVE.L 4*T02VktNr,D0 ; Vektoren CMP.L _Trp02OV,D0 ; fr FLine BEQ TstBoot9 ; & Trap-02 BSET #Desktop,StrngFlg ; gendert TstBoot9: RTS ; ; ; Trap 02 TRAP_LOG.TOS ; ; genderte Register: keine ; Magic_02: DC.B 'XBRA' ; Magic Ident_02: DC.B 'TLOG' ; Ident-Nr. _Trp02OV: DC.L 0 ; Original Trp02LOG: BTST #Gesperrt,StrngFlg ; ge- BNE Tr02LOG6 ; sperrt ? MOVEM.L D0-D2/A0-A2,-(SP) ; rette MOVE.L D1,-(SP) ; Register CMP.W #AES_Code,D0 ; AES- BEQ Trp02AES ; Aufruf ? CMP.W #VDI_Code,D0 ; VDI- BEQ Trp02VDI ; Aufruf ? ADDQ.L #4,SP ; wer kommt BRA Tr02LOG5 ; hierhin ? Trp02VDI: MOVE.W #'V',D0 ; 'V' / 'A' BRA Tr02LOG4 ; fr Trp02AES: MOVE.W #'A',D0 ; VDI / AES Tr02LOG4: BSR AusgZchn ; ausgeben MOVE.L (SP)+,A0 ; zeigt auf MOVE.L (A0),A0 ; Zeiger, MOVE.W (A0),D0 ; der zeigt BSR AusgByte ; auf Nr. BSR AusgLeer ; Tr02LOG5: MOVEM.L (SP)+,D0-D2/A0-A2 ; Reg. okay Tr02LOG6: MOVE.L _Trp02OV,-(SP) ; weiter, RTS ; wie sonst ; ; illegale Adresse ; _IllAdOV: DC.L NUL ; Original IllAdLOG: MOVE.L A0,-(SP) ; A0 und D0 MOVE.L D0,-(SP) ; retten MOVE.L 10(SP),A0 ; ill. Adr. CMP.B #$F0,-3(A0) ; selbst BLT IllAdAlt ; erzeugt ? MOVE.L 4*T02VktNr,D0 ; Logger CMP.L _Trp02OV,D0 ; wieder BNE IlAdLOG1 ; einbin- LEA Trp02LOG(PC),A0 ; den, wenn MOVE.L A0,4*T02VktNr ; Vektor BRA IlAdLOG2 ; verndert IlAdLOG1: MOVE.W -3(A0),D0 ; sonst AND.L #$00000FFF,D0 ; Merker ASR.W #2,D0 ; fr zuge- EXG.L D0,A0 ; hrige ADD.L #FLineTab,A0 ; Routine CLR.B (A0) ; lschen IlAdLOG2: MOVE.L (SP)+,D0 ; A0, D0, MOVE.L (SP)+,A0 ; Stack und MOVE.L 2(SP),10(SP) ; Rck- AND.L #$FFFFFFFE,10(SP) ; sprung- ADD.L #8,SP ; adresse RTE ; okay IllAdAlt: MOVE.L (SP)+,D0 ; D0 & A0 MOVE.L (SP)+,A0 ; okay, MOVE.L _IllAdOV,A0 ; weiter JMP (A0) ; wie sonst ; ; FLine ; _FLineOV: DC.L NUL ; Original FLineLOG: MOVE.L A0,-(SP) ; A0 retten MOVE.L 6(SP),A0 ; Opcode ADD.L #1,A0 ; testen BTST #Unlink,(A0) ; BNE FLinLOG1 ; MOVE.L D0,-(SP) ; D0 retten ADD.L #1,A0 ; Nummer d. MOVE.W -2(A0),D0 ; FLine- AND.L #$00000FFF,D0 ; Routine ASR.W #2,D0 ; bestimmen EXG.L D0,A0 ; und zuge- ADD.L #FLineTab,A0 ; hrigen TST.B (A0) ; Merker BEQ FLinLOG0 ; testen, MOVE.L (SP),-(SP) ; ggf. MOVE.L 8(SP),4(SP) ; Adresse MOVE.W 12(SP),8(SP) ; merken & MOVE.L 14(SP),10(SP) ; und Trace MOVE.L D0,14(SP) ; ver- BSET #TraceMod,8(SP) ; anlassen FLinLOG0: MOVE.L (SP)+,D0 ; D0 und A0 FLinLOG1: MOVE.L (SP),A0 ; okay MOVE.L _FLineOV,(SP) ; weiter RTS ; wie sonst ; ; Trace ; _TraceOV: DC.L NUL ; Original TraceLOG: MOVE.L A0,-(SP) ; A0 & D0 MOVE.L D0,-(SP) ; retten BTST #SuperMod,8(SP) ; alter BEQ TracLOG1 ; Status MOVE.L SP,A0 ; bestimmt, ADD.L #18,A0 ; ob SSP BRA TracLOG2 ; oder USP TracLOG1: MOVE.L USP,A0 ; zu nutzen TracLOG2: MOVE.L (A0),D0 ; wenn Adr. CMP.L 14(SP),D0 ; ungleich, BEQ TraceEnd ; D0 & A0 MOVE.L (SP)+,D0 ; vom Stack MOVE.L (SP)+,A0 ; holen, RTE ; tracen TraceEnd: BSET #0,3(A0) ; Adresse, MOVE.L (SP)+,D0 ; D0, A0 MOVE.L (SP)+,A0 ; und Stack MOVE.L 2(SP),6(SP) ; berichti- MOVE.W (SP),4(SP) ; gen, BCLR #TraceMod,4(SP) ; Trace ADD.L #4,SP ; beenden RTE ; ; ; Ausgabe Byte ; AusgByte: MOVE.W D0,-(SP) ; ASR.B #4,D0 ; oberes BSR AusgHlbB ; Halbbyte MOVE.W (SP)+,D0 ; unteres BSR AusgHlbB ; Halbbyte RTS ; ; Ausgabe Halb-Byte (nibble) ; AusgHlbB: AND.W #$000F,D0 ; unterstes LEA HexAscTb(PC),A0 ; Halbbyte MOVE.B (A0,D0),D0 ; zeigt auf BRA AusgZchn ; Zeichen ; ; Neue Zeile ; NeueZeil: MOVE.W #CR,D0 ; Zeilen- BSR AusgZchn ; anfang MOVE.W #LF,D0 ; nchste BRA AusgZchn ; Zeile ; ; Ausgabe Leerzeichen ; AusgLeer: MOVE.W #BLANK,D0 ; ' ' ! ; ; Ausgabe Zeichen ; ; enthalten sind Start/Stop und Zeitlupe ; ; Aufruf ; : Zeichen ; AusgZchn: MOVEM.L D1-D2/A1-A2,-(SP) ; Register MOVE.W D0,-(SP) ; retten BTST #Zeitlupe,MFP_PIO ; Tee BEQ AusgZch1 ; trinken, MOVE.L #150,D0 ; wenn ge- BSR Wartzeit ; schlossen AusgZch1: BSR TstDruck ; zurck, BNE AusgZch3 ; wenn ADD.L #2,SP ; geffnet BRA AusgZch4 ; AusgZch3: MOVE.W #PRN,-(SP) ; Status MOVE.W #Bcostat,-(SP) ; des TRAP #BIOS ; Druckers ADDQ.L #4,SP ; ermitteln CMP.W #Bereit,D0 ; wenn BNE AusgZch1 ; bereit, MOVE.W #PRN,-(SP) ; dann MOVE.W #Bconout,-(SP) ; Zeichen TRAP #BIOS ; ausgeben ADDQ.L #6,SP ; AusgZch4: MOVEM.L (SP)+,D1-D2/A1-A2 ; Register RTS ; holen ; ; Wartezeit ; ; Aufruf ; : Anzahl der Wartezyklen, ; leider ein Software-Timer ; Wartzeit: MOVE.L #10,D1 ; Wartzei1: DBRA D1,Wartzei1 ; DBRA D0,Wartzeit ; RTS ; genug ; ; Test Schalter 'Drucken' ; ; Rcksprung ; : 1 - Druck ; 0 - kein Druck ; TstDruck: MOVE.L D1,-(SP) ; D1 retten MOVE.B MFP_PIO,D1 ; Wenn MOVE.B StrngFlg,D0 ; Schalter EOR.B D1,D0 ; bettigt, BTST #Drucken,D0 ; dann Flag BEQ TstDrck2 ; ndern & BCHG #Drucken,StrngFlg ; ggf. BNE TstDrck1 ; Zeilen- BSR NeueZeil ; vorschub TstDrck1: MOVE.L #1000,D0 ; Ent- BSR Wartzeit ; prellen TstDrck2: MOVE.L (SP)+,D1 ; D1 okay BTST #Drucken,StrngFlg ; Test RTS ; ; ; Konstanten ; HexAscTb: DC.B '0123456789ABCDEF' ; Hex-Ascii ; ; Variablen ; FLineTab: ; Merker REPT $1000/4 ; fr DC.B $FF ; Trace ENDM ; ; ; Texte ; Meldung1: DC.B 'TRAP_LOG.PRG installiert' DC.B CR,LF,LF DC.B 'Stephan Simson 27.03.90' DC.B CR,LF,NUL Meldung2: DC.B 'TRAP_LOG.PRG wieder aktiv' DC.B CR,LF,NUL Meldung3: DC.B 'TRAP_LOG.PRG deaktiviert' DC.B CR,LF,NUL END Der Trap-Logger funktioniert nur bis TOS 1.2! . ^ic.. p^igVIRSPY PRJ 7YedFVIRSPY PRG =YeeVIRSPY O "YefRVIRSPY S !Yegvirspy.prg ;.C [ -Y ] ;.L [ -L -Y ] ;.S [ -Y ] = virspy.s `FP`XBRA4SPY Og\`NhJyfp P=g< P>> TURBO-C <<<< for ATARI-ST Release 1 (C) 88 Borland International G#,J$VH30 k  Ј<.@// ?<?<JNAO pBAA4|`g |`.gg4TB|"O4SBQBt SAe!dB)SAe !eHiR@`/ R@Hzd"k, ON? 9g @N 9g @NNP?<LNA/ EN` %HXHE *g$_Nu/ / $H&I rNJfH rNJfXONDNİ|JfAND0NN*N:|f CN \OL 8Nu/YOM,C Hza(XOXO,_NuH@B@H@Cra J@kNu.Vp`H8]O$H&I(o&BCx%p JR@gfJ@g@NBEgBA< <b;k`|<*f<`&<0< b ACp a l$Wb<gt<.f6<*f4`$<0< b ACp a .$Wb~4gv<lf gfgr@dV|?@0;NFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [0`AB(`0AB(` [2"La@``JEj `p0?4 LaTO@`@JEj `0H?4 La`TO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@N0\OLxNup`H Ov Jj|-?|D`g|+?|`g| ?|`~?|`vH Ov ?|`dH Ovf?|`L|0f|x?|`2|X?|`$H Ovf?|` |0?|$H>C8jxA a A pJWF@?@gA 2SAk ae(Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`XH0$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?0Aa20JAkXO,_Nup`JgAa+g@,k $ڹd SfRe`&// Ka $"J@f(S`& L\Nu3 p`"PdB@ Nu(g*gg/a _J@f/a8 _J@kf"P`3 pNuJ@k"Pc HNupNuH&H(k L0+"+ aJkRgF+f* L2SAt Wf"HSIS@SAk öWgJ@g&r2'LB@LNup`p`H&H(k6+"+g0DtaJk+fT"SA"L Ip Wf(| ?/ " 0a("_2JkJAp QH@" 0aLJj`&0" La|g&'LB@LNup`J@g//??<?NAO JkNu aNua(3pNuH&Hx&SkdJ94kdffar<g< g.<g>< e渃dRaZ`JgSSKpaLp aHpaD`Rp a:4p a.`4 LNux`x B94`?<NATONu??<NAXONu|g$//??<@NAO JkNua\3pNu// &H&g??<NAXOSb&_&Nu|b$??/?<BNAO JkNua3pNu0<`D@| |"b;NupNu   / G6 g/ &S?<INA\O`G: g/ &S?<INA\O`&_NuSeg ge pNuJfpNupNu"SefBJgSf ANuH0$H|g|$brG`gJ3kSJtgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<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!`0123456789abcdefghijklmnopqrstuvwxyz|A0Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNu?<NATONu/?< NA\ONu/ ?<"NNTO @$_NumidivecvkbdvecvmiderrstatvecmousevecclockvecjoyvecmidisysikbdsysTrace$Line A(Line F,GemdosBiosXbiosetv_timeretv_criticetv_termresvector*hdv_initjswv_vecnhdv_bpbrhdv_rwvhdv_bootzhdv_mediach~exec_osdump_vecprt_statprt_vec aux_stataux_vecXBRAE 1... = Seitenwahl, R = Eintrag entfernen, = Abbruch %12s $%04lX %4s wHl Entfernen: %4s '%s' entfernen (J/N) ?+++,h NBB&V("VnP>JL ~X/* XBRA.TOS * Programm zur Anzeige von XBRA-Programmen * im Speicher und zum gezielten Deaktivieren * einzelner Programme. * Entwickelt mit Turbo C von Andreas Kohler * (c) 1992 MAXON Computer GmbH */ #include #include #include #include /* Bildschirmsteuerung */ #define Cls() printf("\033E") #define Nowrap() printf("\033w") #define Top() printf("\033H\033l") typedef void **ADDR; typedef struct { char xb_magic[4]; char xb_id[4]; void *xb_vec; } XBRA; typedef struct { char name[13]; ADDR addr; } SYSVAR; int varnum; SYSVAR vars[] = { {"midivec", 0l}, {"vkbdvec", 0l}, {"vmiderr", 0l}, {"statvec", 0l}, {"mousevec", 0l}, {"clockvec", 0l}, {"joyvec", 0l}, {"midisys", 0l}, {"ikbdsys", 0l}, {"Trace", 0x24l}, {"Line A", 0x28l}, {"Line F", 0x2Cl}, {"Gemdos", 0x84l}, {"Bios", 0xB4l}, {"Xbios", 0xB8l}, {"etv_timer", 0x400l}, {"etv_critic", 0x404l}, {"etv_term", 0x408l}, {"resvector", 0x42Al}, {"hdv_init", 0x46Al}, {"swv_vec", 0x46El}, {"hdv_bpb", 0x472l}, {"hdv_rw", 0x476l}, {"hdv_boot", 0x47Al}, {"hdv_mediach", 0x47El},{"exec_os", 0x4FEl}, {"dump_vec", 0x502l}, {"prt_stat", 0x506l}, {"prt_vec", 0x50Al}, {"aux_stat", 0x50El}, {"aux_vec", 0x512l}, {"", 0l} }; void varinit() { ADDR lp; SYSVAR *sv; sv = vars; lp = (ADDR) Kbdvbase(); for (; ! sv->addr; sv++) sv->addr = lp++; } int getxbra(vec, name, next) ADDR vec; char *name; ADDR *next; { XBRA *xbp; if ((long) vec % 2l) /* ungerade Adresse */ return (0); if ((long) *vec % 2l) return (0); if ((long) *vec < sizeof(XBRA)) return (0); xbp = (XBRA *) *vec; xbp--; if (! strncmp(xbp->xb_magic, "XBRA", 4)) { strncpy(name, xbp->xb_id, 4); name[4] = '\0'; *next = &(xbp->xb_vec); return (1); } return (0); } void un_link(id) char *id; { register int i; char name[5]; ADDR next, old; for (i = 0; i < varnum; i++) { old = vars[i].addr; while (getxbra(old, name, &next)) { if (! strncmp(name, id, 4)) { *old = *next; break; } old = next; } } } void prnpage(n) int n; { register int i; ADDR next; char name[5]; Cls(); printf(" 1... = Seitenwahl, R = Eintrag "); printf("entfernen, = Abbruch "); for (i = 24 * n; i < varnum && i < (n+1) * 24; i++) { printf("\n%12s $%04lX ", vars[i].name, vars[i].addr); next = vars[i].addr; while (getxbra(next, name, &next)) printf("%4s ", name); } } main() { long oldstack; int page, c; char rmid[5]; Nowrap(); oldstack = Super(NULL); varinit(); for (varnum = 0; vars[varnum].addr; varnum++) ; prnpage(page = 0); while ((c = toupper((int) Cnecin())) != 27) { if (c >= '1' && c <= '9') { if ((c - '1') * 24 <= varnum) { page = c - '1'; prnpage(page); } } else if (c == 'R') { Top(); printf(" Entfernen: "); scanf("%4s", rmid); Top(); printf(" \'%s\' entfernen (J/N) ? ", rmid); if (toupper((int) Cnecin()) == 'J') un_link(rmid); prnpage(page); } } Super((void *) oldstack); }