home *** CD-ROM | disk | FTP | other *** search
Wrap
' *** ERGO_TP v₧.70r (25.11/23:32): XRef-Informationen eintragen $c+ RESERVE MAX(MIN(600*1024,FRE(0)/2),200*1024) ' ' ' ' Anton Stepper Claus Brod ' Südring 7 & Blumenstra₧e 13 ' 97828 Marktheidenfeld 71134 Aidlingen ' 09391/8697 07034-63683 ' ' E-Mail: E-Mail: ' Anton Stepper Claus Brod @ BB ' claus_brod@bbn.hp.com ' ' ' SED darf innerhalb des Mausnetzes als GFA-Quelltext ' und als Compilat innerhalb dieses Archivs kopiert werden. ' Mit dieser Kopiererlaubnis sind keine weiteren Rechte verbunden, ' alle Verwertungsrechte bleiben also bei den Autoren. Insbesondere ' ist es nicht erlaubt, SED oder Teile davon auf anderem Wege als ' über das Mausnetz oder auf der 'Kleisterscheibe', der Diskette ' zum Buch 'Scheibenkleister' zu verbreiten. Auf irgendwelchen ' PD-Disketten hat der SED also nichts zu suchen, und schon gar ' nicht darf er ohne die Genehmigung der Autoren und der Firma Maxon ' kommerziell vertrieben werden. ' ' Damit darf sich also jeder aus der Maus BB die aktuellen SED- ' Versionen holen und in anderen Mäusen ablegen. Letzteres ist, ' wenn neue Versionen in die Maus BB gelangen, auch erwünscht, ' damit andere freiwillige SED-Entwickler einfacher an die ' aktuelle Version kommen können. ' ' Nur die von den Autoren freigegebenen Versionen des SED dürfen ' in Umlauf kommen. Wenn also Änderungen am SED vorgenommen werden, ' müssen sie zuerst den Autoren vorgelegt werden, um sie "offiziell" ' einzubauen. Es spricht aber nichts dagegen, zwischen zwei ' "offiziellen" Versionen Patch-Vorschläge und Verbesserungen ' in Form von diff-Listings zu verbreiten, solange darin ausdrücklich ' auf den vorläufigen Charakter hingewiesen wird. ' ' Die Autoren werden zugesandte Änderungen in den aktuellen Quelltext ' zu integrieren versuchen. Es kann natürlich vorkommen, da₧ sich ' Änderungsvorschläge nicht miteinander vertragen oder aus anderen ' Gründen nicht sinnvoll sind. Die letzte Entscheidung über die ' Integration behalten wir uns daher vor. Ebenso beanspruchen wir ' das Recht, im Laufe dieses Prozesses verbesserte SED-Versionen mit ' der aktuellen Version der 'Kleisterscheibe' im Rahmen von Updates ' weiterzugeben. ' ' Dies ist ein Quelltext für GFA3.5/3.6. ' ver$="SED_568" ' ' ' ' ' last update: 26.11.93 CB ' 1994-12-26 RS: Modifikationen von Rainer Seitel @ KA ' Mindestens folgende Fehler gibt's noch: ' In der Resource beim Menüeintrag »Dateienliste« die Punkte weg. ' In der Resource bei Dateiinfo Uhrzeit-Feld auf 6 Ziffern. Sonst werden beim Schreiben des Dateiinfo die Sekunden immer auf 0 gesetzt. ' Bei mehr als 32767 Clustern klappt »Dateienliste« nicht. ' 1995-02-05 RS: Cluster zurück geht auch wenn dieser hintendran liegt. ' Grö₧ter Clusterindex ist jetzt cpd%+1. ' SED kommt eventuell ganz mit einer FAT zurecht. ' Partitionen löschen gibt defekte Cluster nicht mehr frei. ' 2 Vorschläge vom Ende übernommen: ' In Dialogboxen können []@{}\ eingegeben werden. ' Bei FAT-Graph Anzahl der Cluster hinter dem Dateinamen. ' 1995-04-04 RS: SED sollte jetzt wirklich mit mehr als $FFFE Sektoren zurechkommen. ' FAT prüfen ordentlicher. ' In disc_save do_list auskommentiert. ' 1996-05-26 CB: Fix in media_all und media eingebaut (Dank an Steffen Engel!). ' Ob das wohl den Absturz beim Wechsel in den Plattenmodus ' behebt? Sieht so aus... ' --------------------------------------------------------------------------- var_init ! Variablen init_ram ! Speicher holen init_do ! SED_.INF laden default_bootsec ! chk_ofls ! Überwachung offener Dateien rsc_init ! RSC-Datei laden und Variablen mc_init ! SCSI-Interface INIT boot_sec ! aktuellen Bootsektor lesen warnungen ! Warnungen ausgeben base_look ! Applikation? endless_loop ! .... ' -------------------------------------------------------------- PROCEDURE var_init ! Variablen INIT .| Glob. Var.: max_err%,max_part%,multiple%,max_diff%,sec_max%,fdcinf_max% .| fdrive%,base$,a$,repflag%,n$,l$,esc$,cr$,gm$,ext_magic%,fp%,xt%,yt% .| tz%,status%,seite%,target%,geraet%,block%,dec%,z%,prg_adr%,lern%,ch% .| cvisible%,menu_pointer%,txt_zeile%,txt_links%,last%,ch2%,txt_blkon% .| block_marke%,d.isk%,f.ile%,h.ard%,r.am%,f.dc%,mode%,hex!,itar%,hard% .| buf_size%,bps%,l_end%,spd%,top%,file_open%,l_eline%,old_cpos%,old_p% .| txt_spalte%,buf_end%,beg_ascii%,minad%,maxad%,format_time_out%,drive% .| sed_pfad$,pfad$,rsc$,ver$,p_help$,sed_inf$,sed_inf2$,dum$,hlp_str$ .| fg$,wa$,sys_base%,romstart%,rom_version%,ram_max%,scsi_errmax% .| Felder : p_flag%(),p_id$(),p_start%(),p_size%(),po_start%(),po_size%() .| p_block%(),scsi_err$(),hd_typ%(),hd_typ$(),dma%(),pfad$(),scr%() .| mem%(),par%(),fe%(),wi%(),men_ienable%(),err_fld$(),flos$(),frei%() .| bt$(),bz$(),t_a%(),whdl&(),wnr%(),wz%(),wc%(),tx%(),ty%(),l_end%() .| w_titel%(),inl_tab%(),inl_dat%(),byt_sec%(),sek%(),s%(),im$(),rate%() .| se_inf$(),fdc_info$() .| Ruft auf : set_aktpar,get_pfad .| Aufruf in : HAUPTPROGRAMM-1, LOCAL i& ' max_err%=200 ! Maximale Fehler- oder Mitteilungen max_part%=12*5 ' ' globale Felder für allerlei ' für HD-Teil DIM p_flag%(max_part%),p_id$(max_part%),p_start%(max_part%),p_size%(max_part%) DIM po_start%(max_part%),po_size%(max_part%),p_block%(max_part%) DIM scsi_err$(10),hd_typ%(7),hd_typ$(6),dma%(32) ' für Window+Menü DIM pfad$(50),scr%(5),mem%(5),par%(8),fe%(15,4),wi%(15,4),men_ienable%(70) DIM err_fld$(max_err%),flos$(1,10),frei%(14,2),bt$(5),bz$(5) ' für RSC DIM t_a%(50) ' fürs 2. Fenster DIM whdl&(15),wnr%(15),wz%(15),wc%(15),tx%(15),ty%(15),l_end%(15),w_titel%(1) ' für Stringverwaltung mittels INLINE DIM inl_tab%(5),inl_dat%(5) ' ' für Floppy Routinen CLR multiple% ! Für Read/Write Sector max_diff%=30 ! Für Analyse (Diff: Trackpos. - Headerpos.) sec_max%=25 ! für Analyse fdcinf_max%=100 DIM byt_sec%(4),sek%(sec_max%,20),s%(2),im$(10),rate%(6),se_inf$(sec_max%) DIM fdc_info$(fdcinf_max%) ' FOR i&=7 TO 10 byt_sec%(i&-7)=2^i& ! FDC (WD 1772) Sektorlängen 128,256,512,1024 NEXT i& CLR fdrive% ! für Floppy A ' rate%(1)=2 rate%(2)=3 rate%(3)=0 rate%(4)=1 ! Stepratenfeld ' rate%(5)=3 ! A = 3 ms rate%(6)=0 ! B = 6 ms ' ' Aufbau von sec%(x,y): ' x=Sektornummer in physikalischer Folge ' y=0 Sektornummer ' =1 Beginn Vorspann (relativ zu Buffer) ' =2 Beginn Header " " ' =3 Beginn Gap " " ' =4 " Data " " ' =5 Ende Data " " ' =6 ' =7 Kein Sektor 3=.... 2=.... 1=Rnf. / 0= ok ' =8 abgebrochen 1=ja / 0=nein ' =9 Sektorlänge ' =10 ' =11 Kopie von Header ' =12 ' ' =13 ' ' =14 ' ' x= Sektor + 1 1,2 = Tracknachspann ! ' ' ----------------------- sonstige Variablen ----------------------- base$=CHAR{BASEPAGE+129} ! Kommandozeile übernehmen IF LEN(base$)=0 ~SHEL_READ(a$,base$) ! a$=PRG$ IF LEN(base$)>=2 base$=MID$(base$,2) ELSE CLR base$ ENDIF ENDIF IF INSTR(base$,CHR$(13))>0 base$=LEFT$(base$,INSTR(base$,CHR$(13))-1) ENDIF base$=base$+CHR$(0) ' -------------------- repflag%=PEEK(&H484) ' n$=STRING$(10,"0") ! für alle formatierten Zahlenausgaben l$=SPACE$(10) esc$="" ! ESC cr$=CHR$(13)+CHR$(10) gm$="GEMDOS-Fehler" ext_magic%=&H43424844 ! ROOT-Erkennung der zusätzlichen Partitionen ' CLR fp%,xt%,yt%,tz%,status%,seite%,target%,geraet%,block%,dec%,z% CLR prg_adr%,lern%,ch%,cvisible%,menu_pointer%,txt_zeile%,txt_links%,last% CLR ch2%,txt_blkon%,block_marke% ' ' ' LAST%- 1= ... 2= ... 3=FIND_FILES 4=FAT_GRAF 5=FILE_REPAIR ' 6=DIR_PATH 7=SHOW_ROOT 8=INFO_BUTTONS 9=INFO_FKEY ' 10=HARDSEAR 11=DIR_SORT ' ' d.isk%=1 ! die verschiedenen Modi f.ile%=2 h.ard%=3 r.am%=4 f.dc%=5 mode%=d.isk% ! Sektormodus hex!=TRUE ! In Hex-Teil ' itar%=15 ! Target des Initiators(TT) hard%=2 ! Default ist Vortex-Platte buf_size%=16384 bps%=512 ! Default-Wert für Sektorgrö₧e l_end%=bps% ! List_end ... set_aktpar(0) spd%=1 top%=1 ' file_open%=-1 ! Flag für kein File geöffnet l_eline%=-1 ! Last-Edit-Line old_cpos%=-1 ! Cursor old_p%=-1 txt_spalte%=1 buf_end%=-1 ! Block ' ARRAYFILL men_ienable%(),1 scr%(0)=0 ! für BITBLIT ' beg_ascii%=49 minad%=0 ! 1. Zeichen im Font maxad%=&HFF ! letztes ... ' ----------------- hd_typ$(1)="ATARI" hd_typ$(2)="VORTEX" hd_typ$(3)="SCSI" hd_typ$(4)="c't" hd_typ$(5)="" ' format_time_out%=20*60 ' IF ROL&(GEMDOS(48) AND &HFFFF,8)<&H15 THEN dos_max_sektors%=32767 !grö₧te Anzahl Sektoren vor GEMDOS 0.15 ELSE dos_max_sektors%=65535 !grö₧te Anzahl Sektoren ab GEMDOS 0.15 (TOS 1.04) ENDIF ' ----------------- drive%=GEMDOS(25) AND 255 ! Aktuelles Laufwerk get_pfad ! Pfad von Gemdos holen sed_pfad$=pfad$ ! zum Auffinden von "SED_xxx" FOR i&=1 TO DIM?(pfad$())-1 pfad$(i&)=sed_pfad$ ! Pfade initialisieren NEXT i& ' rsc$=pfad$+ver$+".RSC" ! RSC -Datei p_help$=pfad$+ver$+".HLP" ! HELP-Datei sed_inf$=pfad$+ver$+".INF" sed_inf2$=pfad$+ver$+".INX" dum$="SED_DUM.DUM" ! Datei, zum Prüfen des Schreibschutzes hlp_str$=" "+ver$+" (c) 1987-1992 by Anton Stepper & Claus Brod" ' fg$="?VDX." ! Für Anzeige in FAT-GRAPH ' ? = verklebt, V = Verwaltung, X = Leiche, D = defekt, . = frei ' wa$="Weiter|Abbruch" ' sys_base%=LPEEK(&H4F2) ! Zeiger auf TOS-Vorspann romstart%=LPEEK(sys_base%+8) rom_version%=DPEEK(sys_base%+2) ram_max%=&H400000 ' ' ---------------------------------------- RESTORE scsi_err ! Harddiskfehler SCSI CLR scsi_errmax% DO READ scsi_err$(scsi_errmax%) EXIT IF scsi_err$(scsi_errmax%)="*" INC scsi_errmax% LOOP ' scsi_err: DATA OK,Fehler beim Selektieren,Defaultfehler (Chaos),ungültige Phase DATA BSY-Signal verloren,Busfehler (SCSI-DMA-Übertragung),Fehler bei DMA-Transfer DATA SCSI-Bus blockiert,Timeout,"*" ' ' ---------------------------------------- RESTORE anal_errors ! Fehler in ANALYSE FOR i&=1 TO 10 READ im$(i&) NEXT i& ' anal_errors: DATA Gap Header-Datamark,Datamark not found,Sector length,Tracknr.,Double Sector DATA Gap Sector-Header,Wrong Side,Header/Sector,Sectornr.,Differenz ' ------------------- RETURN PROCEDURE rsc_init ! RSC initialisieren .| Glob. Var.: rsc$,pfad$,ver$,appl_id%,graf_handle%,z.b%,z.h%,dum%,hbox% .| planes%,scr_handle%,dx%,dy%,dw%,dh%,scr_mem%,rsc_mem%,max.text% .| font_soll$,fontsx%,help_size%,hard%,target% .| Felder : mem%(),fe%(),out$() .| Ruft auf : alrt,v_opnvwk,vq_extnd,vst_point,rsc_variable,set_rsc .| check_vor,init_font,set_help,set_hard,do_exit,wind_init,redraw_desk .| menu_2,menu_init .| Aufruf in : HAUPTPROGRAMM-1, LOCAL a$,i&,x%,y% ' IF EXIST(rsc$)=FALSE a$=pfad$+ver$+".RSC" IF EXIST(a$) rsc$=a$ ENDIF ENDIF ' DO WHILE EXIST(rsc$)=FALSE a$=RIGHT$(rsc$,LEN(rsc$)-RINSTR(rsc$,"\")) FILESELECT #"Suche '"+ver$+".RSC'",pfad$+"*.RSC",a$,rsc$ LOOP UNTIL LEN(rsc$)=0 ' IF LEN(rsc$)=0 EDIT ELSE IF RSRC_LOAD(rsc$)=0 ~@alrt(3,"RSC-Ladefehler",1,"Abbruch") EDIT ENDIF ' -------------------------- appl_id%=APPL_INIT() graf_handle%=GRAF_HANDLE(z.b%,z.h%,dum%,hbox%) v_opnvwk planes%=@vq_extnd(scr_handle%,1) ~@vst_point(scr_handle%,10) ' -------------------------- ~WIND_GET(0,4,dx%,dy%,dw%,dh%) ! Innenma₧e des DESKTOP rsc_variable ' -------------------------- scr_mem%=(planes%*rsc_mem%) DIV 8 mem%(0)=MALLOC(scr_mem%) ! BITBLIT-Felder füllen mem%(4)=0 mem%(5)=planes% ' -------------------------- x%=32768/dw% y%=32768/dh% ' fe%(1,1)=fe%(1,1)/x% fe%(1,2)=MAX(dy%,fe%(1,2)/y%) fe%(1,3)=fe%(1,3)/x% fe%(1,4)=fe%(1,4)/y% ' fe%(0,1)=fe%(0,1)/x% fe%(0,2)=MAX(dy%,fe%(0,2)/y%) fe%(0,3)=fe%(0,3)/x% fe%(0,4)=fe%(0,4)/y% ' -------------------------- set_rsc ! RSC-Einstellungen setzen DIM out$(max.text%) ! Zeilen für Textfenster check_vor ! RSC-Voreinstellungen holen init_font(font_soll$,fontsx%) ! FONT einstellen? IF help_size%>0 set_help ! HELP-Dialog initialisieren ENDIF hard%=@set_hard(target%) ! Plattentyp ' --------------------------- IF dw%<640 ~@alrt(4,ver$+"|In dieser Auflösung|kann ich nicht arbeiten!",1,"Abbruch") do_exit ENDIF wind_init redraw_desk(0) menu_2 menu_init ENDIF RETURN PROCEDURE wind_init ! Windows öffnen .| Glob. Var.: wind%,whdl&,wx&,wy&,wb&,wh& .| Felder : whdl&() .| Ruft auf : wind_calc,wind_open,wind_pos,wind_size .| Aufruf in : rsc_init-1,desktop_back-1, wind_calc(0) ! Window berechnen wind%=1 wind_open(wind%) ! Fenster öffnen wind_pos(wind%) whdl&=whdl&(wind%) ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) ' CLR wind% wind_open(wind%) whdl&=whdl&(wind%) ~WIND_GET(whdl&,5,wx&,wy&,wb&,wh&) wind_size(wind%,wx&,wy&,wb&,wh&) RETURN PROCEDURE mc_init ! SCSI-Interface INIT .| Glob. Var.: tt%,tt!,scsi%,format_time_out%,locksley% .| Ruft auf : search_cookie .| Aufruf in : HAUPTPROGRAMM-1, LOCAL frb%,pmmu% tt%=@search_cookie("_MCH",0) ! Ersatz für TT? tt!=(tt% DIV 65536)>2 frb%=@search_cookie("_FRB",0) pmmu%=@search_cookie("PMMU",0) ' ~C:scsi%(L:0,L:tt%,L:frb%,L:pmmu%,L:format_time_out%) ~C:locksley%(L:0,L:tt%,L:frb%,L:pmmu%) RETURN PROCEDURE set_rsc ! RSC voreinstellen .| Glob. Var.: hdcm1&,hdcm10&,hd.comm%,hdflag0&,v.oreinst%,dechex&,dec% .| feed&,f.eed%,slider&,s.lider%,dial2pos&,dial.pos%,sammeln&,s.ammeln% .| txtsavm&,t.xtsavm%,sperrtxt&,sperr_txt%,feedcode&,f.eedcode% .| vorcurrt&,cursor_rate%,tabanz&,tabs%,maxtext&,max.text%,targ.mask% .| tmask1&,tmask8&,tghdtyp&,desk.top%,k1&,inf_ma$,a.lert%,alrti1& .| alrti5& .| Felder : dma%(),hd_typ$(),hd_typ%() .| Ruft auf : put_char,cross_rsc,put_wert,trans_gimage .| Aufruf in : rsc_init-1,opt_konfig-1, LOCAL a&,i& ' Einstellungen die der SED speichert, im RSC setzen ' FOR i&=hdcm1& TO hdcm10& ! HARD-COMMAND löschen put_char(hd.comm%,i&,"") NEXT i& FOR i&=0 TO 4 cross_rsc(hd.comm%,hdflag0&+i&,0) NEXT i& ' -------------------------- cross_rsc(v.oreinst%,dechex&,dec%) cross_rsc(v.oreinst%,feed&,f.eed%) cross_rsc(v.oreinst%,slider&,s.lider%) cross_rsc(v.oreinst%,dial2pos&,dial.pos%) cross_rsc(v.oreinst%,sammeln&,s.ammeln%) cross_rsc(v.oreinst%,txtsavm&,t.xtsavm%) cross_rsc(v.oreinst%,sperrtxt&,sperr_txt%) ' put_char(v.oreinst%,feedcode&,HEX$(f.eedcode%,2)) put_wert(v.oreinst%,vorcurrt&,cursor_rate%,4) put_wert(v.oreinst%,tabanz&,tabs%,2) put_wert(v.oreinst%,maxtext&,max.text%,5) ' FOR i&=0 TO 15 cross_rsc(targ.mask%,tmask1&+i&,dma%(i&)) NEXT i& FOR i&=16 TO 31 cross_rsc(targ.mask%,tmask8&+i&-16,dma%(i&)) NEXT i& FOR i&=0 TO 7 put_char(targ.mask%,tghdtyp&+i&,hd_typ$(hd_typ%(i&))) NEXT i& FOR i&=0 TO 13 ! 14 kleine Boxen beschriften put_char(desk.top%,k1&+i&,MID$(inf_ma$,i&*5+1,5)) NEXT i& a&=OB_Y(a.lert%,alrti1&) ! y-Pos ICON 2-5 = y-Pos ICON 1 ! FOR i&=alrti1& TO alrti5& trans_gimage(a.lert%,i&) ! ICONs konvertieren OB_Y(a.lert%,i&)=a& ! y-Pos NEXT i& RETURN PROCEDURE base_look ! Kommandozeile? .| Glob. Var.: ver_base%,f1$,f2$,base$ .| Felder : pfad$() .| Ruft auf : menu_1,do_cursor_anz,file_compare,do_file_open .| Aufruf in : HAUPTPROGRAMM-1, LOCAL a& CLR ver_base%,f1$,f2$ ' IF LEN(base$)>0 a&=INSTR(base$," ") IF a&>0 f2$=RIGHT$(base$,LEN(base$)-a&) f2$=LEFT$(f2$,INSTR(base$,CHR$(0))-1) f1$=LEFT$(base$,a&-1) WHILE RIGHT$(f2$)=CHR$(0) f2$=LEFT$(f2$,LEN(f2$)-1) WEND ELSE f1$=LEFT$(base$,INSTR(base$,CHR$(0))-1) ENDIF IF EXIST(f1$)=TRUE OR RIGHT$(f1$)="\" menu_1 ! FILE on do_cursor_anz(0) IF LEN(f2$)>0 ver_base%=1 file_compare pfad$(8)=f1$ pfad$(9)=f2$ ELSE do_file_open(f1$) ENDIF pfad$(7)=f1$ ENDIF ENDIF RETURN PROCEDURE warnungen ! SED-Warnungen ausgeben .| Glob. Var.: user_code%,chk_ofls% .| Ruft auf : alrt .| Aufruf in : HAUPTPROGRAMM-1, ' LOCAL a$ ' user_code%=@chk_str(a$) IF user_code%=0 ! <--- muss angepasst werden user_code%=-1 ' ~@alrt(5,ver$+a$,1,"Alles klar") ELSE user_code%=1 ENDIF IF chk_ofls%=0 ~@alrt(3,"Offene Dateien können nicht erkannt werden!|Das kann zu Datenverlust führen!|Bitte CHK_OFLS installieren!",1,"Verstanden") ENDIF RETURN PROCEDURE chk_ofls ! Datei_offen_Überwacher installiert? .| Glob. Var.: chk_ofls% .| Ruft auf : search_cookie .| Aufruf in : HAUPTPROGRAMM-1, chk_ofls%=@search_cookie("OFLS",0) RETURN ' FUNCTION ofls(drv%) .| Glob. Var.: chk_ofls% .| Aufruf in : media-1,boot_sec-1, IF chk_ofls%>0 RETURN CARD{chk_ofls%+6+drv%*2} ENDIF RETURN 0 ENDFUNC FUNCTION media_all .| Glob. Var.: drv_map%,drive% .| Ruft auf : file_is_open,dsetdrv,media .| Aufruf in : menu_4-1,fehler_behandlung-1, LOCAL i% ' file_is_open drv_map%=@dsetdrv(drive%) ! BIOS(10) FOR i%=0 TO 25 IF (drv_map% AND SHL(1,i%))<>0 AND i%<>20 ! U: überspringen IF @media(i%)<0 RETURN -1 ENDIF ENDIF NEXT i% RETURN 0 ENDFUNC ' ' media: Löst auf Laufwerk drv% einen Medienwechsel aus. ' Prüft, ob auf diesem Laufwerk eine Datei von SED oder anderen ' Programmen geöffnet ist. Dazu wird CHK_OFLS benötigt oder ' aber die Funktion Dlock() benötigt. FUNCTION media(drv%) .| Glob. Var.: chk_ofls%,wa$,utis% .| Ruft auf : file_is_open,ofls,alrt .| Aufruf in : media_all-1,schreiben-2,disc_info-1,disc_clear-1,disc_load-1 .| last_5-1,dir_fldren-1,bios_block-1, LOCAL a& file_is_open ! Datei, wenn geöffnet, schlie₧en a&=GEMDOS(309,1,drv%) ! Dlock(sperren) IF a&<>-32 IF a&<0 ~@alrt(1,"Medienwechsel mit Dlock() auf |Laufwerk "+CHR$(drv%+65)+": nicht möglich, da Dateien|offen sind oder es gesperrt ist!",1,"Abbruch") RETURN -1 ENDIF ~GEMDOS(309,0,drv%) ! Dlock(freigeben) RETURN 0 ELSE IF chk_ofls%>0 ! Zeiger auf Struktur "OFLS", ver, data ... a&=@ofls(drv%) ! OFLS lesen IF a&>0 AND a&<>&HFFFF IF @alrt(1,"Achtung: |möglicher Datenverlust!| "+STR$(a&)+" geöffnete Datei(en)! ",1,wa$)=2 RETURN -1 ENDIF ENDIF ENDIF ~C:utis%(&H100+drv%) ! Medienwechsel auslösen RETURN 0 ENDIF ENDFUNC ' FUNCTION chk_str(a$) ! zum prüfen des USER_CODE LOCAL a%,i& CLR a% FOR i&=1 TO LEN(a$) ADD a%,ASC(MID$(a$,i&,1))*i& NEXT i& RETURN a% ENDFUNC ' FUNCTION getistr$(index%,typ|) ! String aus INLINE lesen .| Felder : inl_tab%(),inl_dat%() .| Aufruf in : hard_err-1,hard_message-1,hard_search-1,info-1,show_status-1 .| sh_hd_err-1,err_inf-1, LOCAL t_adr% ' t_adr%=inl_tab%(typ|) ! Tabellenadresse IF CARD{t_adr%}>=index% AND index%>=0 RETURN CHAR{inl_dat%(typ|)+CARD{t_adr%+index%*2+2}} ELSE RETURN "" ENDIF ENDFUNC ' FUNCTION rsc_gaddr(tree%) ! RSC-Baumadresse ermitteln und INIT .| Glob. Var.: baum%,dum%,rsc_mem%,hbox%,dh% .| Felder : t_a%() .| Aufruf in : rsc_variable-27, LOCAL obj&,flg& ' ~RSRC_GADDR(0,tree%,baum%) ~FORM_CENTER(baum%,dum%,dum%,dum%,dum%) ' ---------------------------- ' Speicher berechnen für Hintergrund rsc_mem%=MAX(rsc_mem%,(OB_W(baum%,0)+6)*(OB_H(baum%,0)+6)) ' ---------------------------- CLR obj& WHILE obj&>=0 flg&=OB_FLAGS(baum%,obj&) IF (flg& AND 1024)>0 ! Buttons mit SHORT-CUT OB_H(baum%,obj&)=OB_H(baum%,obj&)+2 ENDIF SELECT OB_TYPE(baum%,obj&) DIV 256 CASE 20 ! BOXTITEL OB_Y(baum%,obj&)=OB_Y(baum%,obj&)-(hbox% DIV 2) CASE 21 OB_W(baum%,obj&)=OB_W(baum%,obj&)-1 OB_H(baum%,obj&)=OB_H(baum%,obj&)-1 CASE 18 ! CROSSED IF dh%>300 OB_Y(baum%,obj&)=OB_Y(baum%,obj&)+2 OB_W(baum%,obj&)=OB_W(baum%,obj&)-2 OB_H(baum%,obj&)=OB_H(baum%,obj&)-2 ENDIF ENDSELECT EXIT IF (flg& AND &H20)>0 ! LASTOB? INC obj& WEND t_a%(tree%)=baum% RETURN baum% ENDFUNC ' ' was_ist: Prüft auf ESC-Taste oder rechte Maustaste. ' Wenn einer der beiden Tasten gedrückt ist, wird ' angeboten, die laufende Option abzubrechen. ' RETURNS: 0=weiter, 1=Abbruch FUNCTION was_ist ! Abbruch? .| Glob. Var.: esc$,wa$ .| Ruft auf : mousek,alrt .| Aufruf in : hard_bad-2,hard_test_big-2,hard_copy-1,fdc_diskanal-1 .| fdc_head-1,ram_check-1,do_sektor_compare-2,disc_clear-1,disc_check-3 .| file_dump-1,file_verify-1,pfad_compare-1,do_dump-1,search-1 .| fat_check-2,o_neu-1,test_suche-1, IF INKEY$=esc$ OR @mousek=2 RETURN @alrt(2,"Aktion abbrechen?",1,wa$)-1 ENDIF RETURN 0 ENDFUNC FUNCTION dec_hex_val$(value%,lang%) ! Zahl formatieren .| Glob. Var.: dec%,n$ .| Aufruf in : show_root-4,fdc_readadress-1,prg_load-1,ram_check-10 .| cursor_anz-1,verify_out-1,dir_files-2,do_dump-1,alt_q-6,info-13 .| info_platten-1,sh_hd_err-1,fat_bearbeiten-5,fat_cluster-1 .| fat_optimum-3,fat_graf_do-1,last_4-2, IF dec%>0 RETURN RIGHT$(n$+STR$(value%),lang%) ELSE RETURN "$"+HEX$(value%,lang%-1) ENDIF ENDFUNC FUNCTION nam_conv$(tst$,par%) ! "TEST.DAT" <-> "TEST DAT" .| Aufruf in : disc_info-1,last_5-1,datei_suchen-2,do_datei_info-2 .| dir_secsearch-1,dir_fldren-2,dir_sort-1,o_neu-2, LOCAL i%,j%,fil$ ' IF par%>0 ' par=1 "test.dat" -> "test dat" i%=INSTR(tst$,".") IF i%>0 fil$=LEFT$(tst$,i%-1)+LEFT$(STRING$(8,32),9-i%)+RIGHT$(tst$,LEN(tst$)-i%) ELSE fil$=tst$ ENDIF RETURN LEFT$(fil$+STRING$(11,32),11) ELSE ' par=0 "test dat" -> "test.dat" fil$=LEFT$(tst$+STRING$(11,32),11) fil$=LEFT$(fil$,8)+"."+RIGHT$(fil$,3) DO i%=LEN(fil$) WHILE MID$(fil$,i%,1)=" " AND i%>1 DEC i% WEND fil$=LEFT$(fil$,i%) EXIT IF RIGHT$(fil$)<>"." fil$=LEFT$(fil$,LEN(fil$)-1) LOOP CLR i% j%=LEN(fil$) REPEAT INC i% UNTIL MID$(fil$,i%,1)=" " OR i%>j% IF i%<j% fil$=LEFT$(fil$,i%-1)+RIGHT$(fil$,MAX(0,j%-8)) ENDIF RETURN fil$ ENDIF ENDFUNC FUNCTION suche_in_liste(fd$) ! FIND FILES: Datei in Liste suchen .| Glob. Var.: total% .| Felder : file$() .| Aufruf in : dir_fldren-1,dir_sort-1, LOCAL i& i&=1 REPEAT EXIT IF fd$=file$(i&) INC i& UNTIL i&>total% RETURN i& ENDFUNC FUNCTION liste_durchgehen(par%) ! Ordner suchen .| Glob. Var.: total% .| Felder : file$() .| Aufruf in : last_3-1, LOCAL j&,i&,a$,b$,folder$ ' CLR i&,j&,folder$ REPEAT INC i& a$=file$(i&) b$=LEFT$(a$,RINSTR(a$,"\")) ! Pfad isolieren IF b$<>folder$ INC j& folder$=b$ ENDIF UNTIL i&>total% OR i&+j&=par% RETURN i& ENDFUNC FUNCTION fsel$(f1$,f2$,f3$,par&) ! FILESELECTBOX Parameter vorbereiten .| Felder : pfad$() .| Ruft auf : fsel_input$,do_pfad .| Aufruf in : init_do-1,hard_restore-1,ram_load-1,prg_load-1,disc_load-1 .| disc_quick-1,file_open-1,file_compare-2,datei_concat-2,datei_copy-2 .| datei_del-1,datei_suchen-1,datei_info-1,dir_secsearch-1,dir_fldren-1 .| dir_sort-1,in_file-1,pexec-1,in_help-1,dev-1,opt_ascii-1 .| fat_cluster-1, LOCAL a$,a&,fi$ ' a&=RINSTR(pfad$(par&),"\") ! im Pfad von hinten nach \ suchen a$=LEFT$(pfad$(par&),a&) ! Pfad IF f2$="" f2$=RIGHT$(pfad$(par&),LEN(pfad$(par&))-a&) ! Name ENDIF fi$=a$+f1$ ! Pfad+Maske a$=@fsel_input$(f3$,fi$,f2$) IF LEN(a$)>0 pfad$(par&)=a$ ENDIF do_pfad(a$) RETURN a$ ENDFUNC FUNCTION fsel_input$(txt$,path$,sel$) ! Fileselektor aufrufen .| Glob. Var.: rom_version% .| Aufruf in : fsel-1, LOCAL p$,s$,t$,i% ' ~WIND_UPDATE(3) p$=STRING$(128,32) s$=p$ MID$(p$,1)=path$+CHR$(0) MID$(s$,1)=sel$+CHR$(0) ADDRIN(0)=VARPTR(p$) ADDRIN(1)=VARPTR(s$) IF txt$="" THEN GOTO my_fsel_input_ ENDIF IF CARD{LONG{GB+4}}<&H140 OR (CARD{LONG{GB+4}}>=&H200 AND CARD{LONG{GB+4}}<&H300) i%=LPEEK(&H5A0) ! FSEL-Cookie suchen IF i% THEN WHILE LPEEK(i%) IF LPEEK(i%+4)=CVL("FSEL") GOTO my_fsel_exinput_ ENDIF ADD i%,8 WEND ENDIF i%=LPEEK(&HB4) ! Trap-13-Vektor untersuchen WHILE LPEEK(i%-12)=CVL("XBRA") ' Dateiauswahlbox von Martin Patzel, Edison-Utility von Eckard Krajewski IF LPEEK(i%-8)=CVL("FSmp") OR LPEEK(i%-8)=CVL("EUek") GOTO my_fsel_exinput_ ENDIF i%=LPEEK(i%-4) WEND my_fsel_input_: GEMSYS 90 ELSE my_fsel_exinput_: t$=txt$+CHR$(0) ADDRIN(2)=VARPTR(t$) GCONTRL(0)=91 GCONTRL(1)=0 GCONTRL(2)=2 GCONTRL(3)=3 GEMSYS ENDIF ~WIND_UPDATE(2) path$=LEFT$(p$,INSTR(p$,CHR$(0))-1) sel$=LEFT$(s$,INSTR(s$,CHR$(0))-1) IF GINTOUT(1)=1 RETURN LEFT$(path$,RINSTR(path$,"\"))+sel$ ELSE RETURN "" ENDIF ENDFUNC FUNCTION akt_find(a%) ! Statuszeile in Worte zerlegen .| Glob. Var.: wind%,z.breite%,info_line$ .| Felder : tx%() .| Ruft auf : info .| Aufruf in : stat_line-1, LOCAL b%,i%,j% ' b%=(a%-tx%(wind%))/z.breite%+1 ! Abstand von links in Buchstaben info j%=1 i%=1 DO WHILE i%<LEN(info_line$) ' WHILE MID$(info_line$,i%,1)<>" " AND i%<LEN(info_line$) ! Space suchen EXIT IF i%=b% INC i% WEND EXIT IF i%=b% INC j% ! Wortwechsel DO WHILE MID$(info_line$,i%,1)=" " AND i%<LEN(info_line$) ! <>Space suchen INC i% LOOP UNTIL i%=b% ' LOOP UNTIL i%=b% RETURN j% ENDFUNC ' ' no_protekt: Warnt vor bösen Folgen, wenn geschrieben wird FUNCTION no_protekt ! Schreibschutz hilft nix ... .| Glob. Var.: hard%,wa$ .| Ruft auf : alrt .| Aufruf in : hard_zero-2,hard_part-1,hard_format-1,hard_install-1 .| hard_noboot-1,hdx_bad-1,hard_copy-1, IF hard%<3 RETURN @alrt(1,"Achtung:|Schreibschutz hilft nix!",0,wa$) ELSE RETURN 1 ENDIF ENDFUNC ' ' chk_sum: Berechnet Wortprüfsumme des Sektors im Sektorpuffer FUNCTION chk_sum ! Prüfsumme berechnen .| Glob. Var.: bps%,buf% .| Aufruf in : hard_noboot-1,hard_root-1,boot_sec-1, LOCAL i%,j% CLR j% FOR i%=0 TO bps%-1 STEP 2 ADD j%,CARD{buf%+i%} ! Alle Worte zusammenzählen NEXT i% RETURN (j% AND &HFFFF) ENDFUNC ' ' dump_data: Fragt, ob der Puffer als Hex-Dump oder als Datenblock ' ausgegeben werden soll. ' RETURNS: 0=Hexdump, 1=Daten FUNCTION dump_data ! DUMP or DATA das ist hier die Frage .| Ruft auf : alrt .| Aufruf in : sav_buf-1,sav_block-1, RETURN @alrt(2,"Was ausgeben? ",1,"HEX-Dump|Daten")-1 ENDFUNC ' ' chk_drv: Prüft, ob in chk$ ein neues Laufwerk ' (also ein anderes als drive%) angegeben ist und ' stellt eventuell auf das neue Laufwerk um. ' ' Globale Variablen: drive% FUNCTION chk_drv(chk$) ! Drive umstellen .| Glob. Var.: drive% .| Ruft auf : boot_sec .| Aufruf in : dir_secsearch-1,dir_fldren-1,dir_sort-1,fat_cluster-1, IF MID$(chk$,2,1)<>":" ! Laufwerk voranstellen, wenn noch nicht da chk$=CHR$(drive%+65)+"\"+chk$ ENDIF IF (ASC(chk$)-65)<>drive% ! Enthält Pfad das aktuelle Laufwerk? drive%=ASC(chk$)-65 ! Nein, Laufwerk umstellen boot_sec ! Bootsektor-Informationen lesen ENDIF RETURN 0 ENDFUNC FUNCTION get_fld_name$(fi$) ! Ordner isolieren .| Aufruf in : dir_secsearch-1,dir_fldren-1,dir_sort-1, LOCAL a&,b& a&=RINSTR(fi$,"\") ! nach letztem Backslash suchen IF a&>0 b&=RINSTR(a&-1,fi$,"\") ! noch einen Backslash suchen ENDIF IF a&<>b& AND b&>0 AND a&>0 ! mindestens zwei Slashes sollten's schon sein RETURN MID$(fi$,b&+1,a&-b&-1) ! letzten Ordner isolieren ELSE RETURN "" ! sonst im Wurzelverzeichnis ENDIF ENDFUNC FUNCTION eingabe(txt$,ta%) ! Zahl eingeben .| Glob. Var.: eok&,e.l%,el%,e.ingabe%,ergebnis& .| Ruft auf : do_input,get_val .| Aufruf in : hard_write-1,part_gleiche-1,do_part_cbhd-1,hard_copy-5 .| fdc_trkread-1,fdc_trkwrite-1,fdc_secread-2,fdc_secwrite-2,fdc_null-3 .| ram_adress_read-1,ram_adress_write-1,ram_save-2,ram_load-1 .| sektor_read-1,sektor_write-1,sektor_cluster-1,ph_track-1,ph_sec-1 .| set_list_offset-1,address-1,disass-1,test_suche-1, LOCAL ex_obj& ' ex_obj&=@do_input(txt$,ta%) ' IF ex_obj&=eok& CLR e.l% el%=1 RETURN @get_val(e.ingabe%,ergebnis&) ELSE CLR el% e.l%=1 RETURN 0 ENDIF ENDFUNC FUNCTION do_input(txt$,ta%) .| Glob. Var.: e.ingabe%,etext&,dec%,b$,ergebnis&,ex_obj& .| Ruft auf : put_char,box_draw,form_do,box_undraw,clr_state .| Aufruf in : eingabe-1,hard_read-1, put_char(e.ingabe%,etext&,txt$) IF dec%=1 b$=STR$(ta%) ELSE b$="$"+HEX$(ta%) ENDIF put_char(e.ingabe%,ergebnis&,b$) box_draw(e.ingabe%) ex_obj&=@form_do(e.ingabe%) AND 255 box_undraw(e.ingabe%) clr_state(e.ingabe%,ex_obj&,1) RETURN ex_obj& ENDFUNC FUNCTION get_char$(tree%,obj&) ! String aus Dialog auslesen .| Aufruf in : get_val-1,hard_read-1,get_id-1,get_value-1,sektor_compare-2 .| set_kleine_buttons-3,set_menu-1,disc_info-2,do_datei_info-3,search-2 .| einname-1,eintext-1,check_vor-1, SELECT OB_TYPE(tree%,obj&) AND &HFF CASE 21,22,29,30 RETURN CHAR{{OB_SPEC(tree%,obj&)}} DEFAULT RETURN CHAR{OB_SPEC(tree%,obj&)} ENDSELECT ENDFUNC FUNCTION get_val(tree%,obj&) ! Zahl aus Dialog ... .| Ruft auf : term$,get_char$ .| Aufruf in : eingabe-1,hard_command-10,hard_param-10,fdc_trackconfig-10 .| sektor_compare-3,disc_info-10,do_datei_info-1,check_vor-3, RETURN VAL(@get_char$(tree%,obj&)) ENDFUNC FUNCTION alrt(icon%,text$,default%,butext$) ! eigene ALERT-BOX .| Glob. Var.: alrtb1&,alrtb4&,a.lert%,alrti1&,alrti5&,ab%,z.b%,z.h%,alrtz1& .| alrtz5&,alrtohr&,box_draw%,box_addr% .| Felder : bt$(),bz$() .| Ruft auf : clr_flags,set_flags,put_char,box_undraw,box_draw,form_do .| clr_state,set_mouse .| Aufruf in : rsc_init-2,warnungen-1,media-1,was_ist-1,no_protekt-1 .| dump_data-1,nur_daten_fenster-1,nur_text_fenster-1,init_font-2 .| init_help-2,scsicall-1,hard_message-1,hard_command-1 .| hard_mode_select-1,hard_prot-1,hard_ship-1,hard_zero-1 .| hard_part_sel-1,do_part-1,hard_format-2,hard_install-3,hard_noboot-2 .| hard_restore-5,hdx_bad-2,hard_bad-2,hdx_set_bad-1,do_mark_bad-1 .| check_bsl-2,nix_vortex-2,hard_copy-1,fdc_bytes-1,fdc_drive-1 .| convert-1,gap-1,fdc_anal-1,fdc_head-1,fdc_null-2,hdumschaltung-1 .| ram_read-1,ram_write-1,ram_save-2,ram_load-1,prg_load-2 .| clr_prg_load-2,change-1,sektor_read-1,sektor_write-1 .| sektor_cluster-1,ph_track-1,ph_sec-1,ph_side-1,sektor_physik_do-1 .| sec_write_sure-1,sektor_compare-1,do_sektor_compare-2,wind_open-1 .| dat_sichern_als-2,dat_drucken-2,disc_info-2,boot_sec-1,boot_wrong-1 .| disc_clear-2,disc_save-1,disc_check-2,disc_drive-1,file_repair-1 .| last_5-6,file_close-1,file_write-2,file_dump-1,datei_cut-2 .| datei_del-1,do_file_copy-1,do_file_open-1,do_datei_info-1 .| dir_secsearch-1,last_3-1,dir_sort-1,last_12-1,in_file-1,pexec-1 .| do_pexec-1,about_me-3,exit-1,search-3,wandlung-3,info_crc-3,last_9-1 .| log_out-1,printer-1,dev-1,opt_help-1,opt_text-1,opt_fehler-2 .| err_inf1-1,err_max-1,fat_bearbeiten-1,fat_cluster-1,fat_test-3 .| fat_xor-1,nur_eine_fat-1,cl_up-2,cl_down-2,bios_block-3,find_files-2 .| fehler_behandlung-1,disass-1,temple_disass-1,init_ram-2,test_suche-1, LOCAL a%,b%,c%,i&,ih%,io%,j%,x%,az%,erg%,albt%,albz%,bt%,zrl% LOCAL box_xxx%,box_back%,ex_obj&,txt$,old_alrtw%,old_alrth% ' FOR i&=1 TO 5 bt$(i&)="" ! Buttontexte clr bz$(i&)="" ! ALERT Texte clr NEXT i& FOR i&=alrtb1& TO alrtb4& clr_flags(a.lert%,i&,&H82) ! HIDE + DEFAULT clr NEXT i& FOR i&=alrti1& TO alrti5& set_flags(a.lert%,i&,&H80) ! ICONs alle HIDE NEXT i& ' --------------------------------------------------------- a%=alrti1&+icon%-1 clr_flags(a.lert%,a%,&H80) ! neues ICON unHIDE ih%=OB_H(a.lert%,a%) io%=OB_Y(a.lert%,a%) ' CLR albt%,albz% bt%=1 j%=1 txt$=butext$+"|" FOR i&=1 TO LEN(txt$) IF MID$(txt$,i&,1)="|" bt$(bt%)=MID$(txt$,j%,i&-j%)+CHR$(0) ! Buttontext in einzelne Worte albt%=MAX(albt%,i&-j%) ! für Breite j%=i&+1 INC bt% ENDIF NEXT i& DEC bt% INC albt% ' IF default%>0 ! DEFAULT-Button angegeben? set_flags(a.lert%,alrtb1&+default%-1,2) ENDIF ' txt$=text$+"|" ! ALERT-Text in einzelne Zeilen zerlegen az%=1 j%=1 FOR i&=1 TO LEN(txt$) IF MID$(txt$,i&,1)="|" bz$(az%)=MID$(txt$,j%,i&-j%)+CHR$(0) albz%=MAX(albz%,i&-j%) j%=i&+1 INC az% ! Anzahl der Textzeilen ENDIF NEXT i& ' old_alrth%=OB_H(a.lert%,0) ! alte Höhe der Box old_alrtw%=OB_W(a.lert%,0) ! alte Breite ... ab%=albt%*z.b% ! Breite der Buttons OB_H(a.lert%,0)=MAX(io%+ih%+z.h%*2,(az%+3)*z.h%) ! neue Höhe der ALERT-Box ' CLR j% FOR i&=alrtb1& TO alrtb4& INC j% OB_W(a.lert%,i&)=ab% ! Button Breite OB_Y(a.lert%,i&)=OB_H(a.lert%,0)-z.h%*2 ! Button y-Pos put_char(a.lert%,i&,LEFT$(bt$(j%),10)+CHR$(0)) ! Button-Text setzen NEXT i& ' zrl%=OB_X(a.lert%,alrtz1&) a%=z.b%*2 ! Buttonzwischenraum=2 Zeichen c%=MAX((albz%+2)*z.b%,bt%*(ab%+a%))+zrl%+OB_W(a.lert%,alrti1&) OB_W(a.lert%,0)=c% ! neue Breite der ALERT-Box b%=c%/2 ' FOR i&=alrtb4& DOWNTO alrtb1&+bt% set_flags(a.lert%,i&,&H80) ! nicht benötigte Buttons = HIDE NEXT i& x%=OB_W(a.lert%,0)-(ab%+a%+z.b%*2) ! 1. Button rechts FOR i&=alrtb4&-(4-bt%) DOWNTO alrtb1& OB_X(a.lert%,i&)=x% SUB x%,ab%+a% ! die anderen nach links versetzen NEXT i& ' CLR j% ! hier die Textzeilen setzen FOR i&=alrtz1& TO alrtz5& INC j% IF LEN(bz$(j%))>0 put_char(a.lert%,i&,LEFT$(bz$(j%),45)) OB_W(a.lert%,i&)=LEN(bz$(j%))*z.b%-z.b% clr_flags(a.lert%,i&,&H80) ! Zeile sichtbar ELSE set_flags(a.lert%,i&,&H80) ! Zeile x = HIDE ENDIF NEXT i& ' ! Eselsohr neu positionieren! OB_X(a.lert%,alrtohr&)=OB_W(a.lert%,0)-OB_W(a.lert%,alrtohr&) ' ! ALERT neu zentrieren OB_X(a.lert%,0)=OB_X(a.lert%,0)+(old_alrtw%-OB_W(a.lert%,0))/2 OB_Y(a.lert%,0)=OB_Y(a.lert%,0)+(old_alrth%-OB_H(a.lert%,0))/2 ' ' ~WIND_GET(0,17,h_adr%,l_adr%,h_len%,l_len%) ' alert_size%=OB_H(a.lert%,0)*OB_W(a.lert%,0)/8*planes% ' internen AES-Puffer könnte man für ALERT benutzen, erfordert aber ' _einige_ Änderungen! ' IF box_draw%>0 ! Noch ein Dialog sichtbar? box_xxx%=box_addr% ! Baumadresse merken box_undraw(box_addr%) ! Ja, löschen box_back%=1 ! und merken ENDIF ' box_draw(a.lert%) ! und nun zeichnen ex_obj&=@form_do(a.lert%) box_undraw(a.lert%) clr_state(a.lert%,ex_obj&,1) erg%=ex_obj&-alrtb1&+1 ' IF box_back%>0 ! Wenn Dialog vorher auf Screen war box_draw(box_xxx%) ! dann jetzt wieder herstellen CLR box_back% ENDIF set_mouse ! Mausform wieder herstellen ' RETURN erg% ENDFUNC ' ' search_cookie: Sucht im Cookiepuffer nach dem Cookie ' coc$. Wenn was% auf 1 ist, wird zusätzlich noch der ' Inhalt der durchlaufenen Cookies ausgegeben. FUNCTION search_cookie(coc$,was%) ! Cookies suchen .| Ruft auf : out .| Aufruf in : mc_init-3,chk_ofls-1,ram_cookie-1,temple_disass-1, LOCAL adr%,i|,x%,a$ ' a$=" " ! Puffer mit vier Zeichen adr%=LPEEK(&H5A0) IF adr%>0 WHILE LPEEK(adr%) FOR i|=0 TO 3 BYTE{V:a$+i|}=BYTE{adr%+i|} NEXT i| x%={adr%+4} IF a$=coc$ RETURN x% ENDIF IF was%=1 out(a$+" $"+HEX$(x%,8)+" "+MKL$(x%)) ENDIF ADD adr%,8 WEND ENDIF RETURN 0 ENDFUNC FUNCTION set_hard(target%) ! setzt Plattentyp zum Target .| Felder : hd_typ%() .| Aufruf in : rsc_init-1,hard_search-1,last_11-1,sel_target_geraet-1 .| hard_do_copy-2,set_dma_mask-1, IF target%<8 RETURN hd_typ%(target%) ! Plattentyp zum Target holen ELSE RETURN 3 ! immer = SCSI ENDIF ENDFUNC FUNCTION runden$(a#) ! .| Aufruf in : unit_ready-2,hard_root-1,show_root-1, RETURN STR$(INT(a#*10)/10) ENDFUNC ' PROCEDURE change_pfad(pfad%,drive%) ! Pfad für FILESELECT manipulieren .| Felder : pfad$() .| Aufruf in : disc_quick-1,dir_secsearch-1,dir_fldren-1,dir_sort-1 .| fat_cluster-1, MID$(pfad$(pfad%),1)=CHR$(drive%+65) RETURN PROCEDURE mdisk ! Maus als DISC .| Glob. Var.: mdisk%,maus_form% .| Aufruf in : set_mouse-1,clr_part-1,hard_format-1,last_11-1,hard_bad-1 .| hard_copy-1,fdc_speed-1,fdc_diskanal-1,lesen-1,boot_sec-1 .| disc_check-2,do_file_copy-1, ~GRAF_MOUSE(255,mdisk%) maus_form%=4 RETURN PROCEDURE mtasse ! ... Tasse .| Glob. Var.: mtasse%,maus_form% .| Aufruf in : set_mouse-1,save_einstellungen-1,hard_search-1,hard_save-1 .| do_clr_out-1,disc_quick-1,disc_check-1,file_verify-1,dir_files-1 .| sav_buf-1,sav_block-1,print_blk-1,put_to_fkey-1,do_pexec-1,log_out-1 .| floskel-1,fat_check-1,fat_graph-1,fat_graf_do-1,cl_down-1 .| find_files-1,temple_disass-1,sed_disass-1, ~GRAF_MOUSE(255,mtasse%) maus_form%=3 RETURN PROCEDURE mnorm ! ... normal .| Glob. Var.: maus_form% .| Aufruf in : meinform_do-1,save_einstellungen-1,hard_part-1,hard_format-1 .| hard_search-1,hard_save-1,fdc_speed-1,lern_ende-1 .| message_auswerten-1,redraw_list-1,do_clr_out-1,disc_clear-1 .| disc_check-1,file_dump-1,file_verify-1,do_file_copy-1,dir_files-1 .| dir_fldren-1,sav_buf-1,sav_block-1,put_to_fkey-1,log_out-1 .| fat_check-1,cl_down-1,find_files-1, ~GRAF_MOUSE(0,0) maus_form%=0 RETURN PROCEDURE mhand .| Glob. Var.: maus_form% .| Aufruf in : set_kleine_buttons-1, ~GRAF_MOUSE(4,0) maus_form%=2 RETURN PROCEDURE set_mouse ! Maus wieder auf richtige Form .| Glob. Var.: maus_form% .| Ruft auf : mtasse,mdisk .| Aufruf in : alrt-1, SELECT maus_form% CASE 0 ~GRAF_MOUSE(0,0) ! Pfeil CASE 1 ~GRAF_MOUSE(1,0) ! Biene CASE 2 ~GRAF_MOUSE(4,0) ! Hand CASE 3 mtasse ! Tasse CASE 4 mdisk ! Disk ENDSELECT RETURN ' PROCEDURE kling ! macht PING .| Aufruf in : meinform_do-2, SOUND 1,15,440 WAVE 1,1,1,8000,0 RETURN PROCEDURE nur_daten_fenster .| Ruft auf : alrt .| Aufruf in : alt_f-1,alt_t-1,ctrl_c-1,ctrl_t-1,set_list_offset-1 .| address-1,info_crc-1, ~@alrt(1,"Das geht nur im Datenfenster!",1," Aha ") RETURN PROCEDURE nur_text_fenster .| Ruft auf : alrt (tot) ~@alrt(1,"Das geht nur im Textfenster!",1," Aha ") RETURN ' ---------------------- PROCEDURE put_char(tree%,obj&,txt$) ! String in Dialog schreiben .| Aufruf in : set_rsc-4,do_input-2,alrt-2,put_wert-1,setfont-4,set_help-1 .| hard_command-1,hard_part-1,set_part_par-1,add_size-1,set_part_dial-1 .| hard_part_sel-1,part_select-2,hard_format-2,hard_bad-5,hard_param-2 .| fdc_speed-3,fdc_protect-3,do_sektor_compare-3,set_kleine_buttons-3 .| disc_info-10,disc_clear-4,do_datei_info-8,ctrl_t-2,search-2 .| einname-2,eintext-2,opt_konfig-1,set_dma_mask-1,fat_bearbeiten-5, SELECT OB_TYPE(tree%,obj&) AND &HFF CASE 21,22,29,30 CHAR{{OB_SPEC(tree%,obj&)}}=txt$ DEFAULT CHAR{OB_SPEC(tree%,obj&)}=txt$ ENDSELECT RETURN PROCEDURE put_wert(tree%,obj&,wert%,ll%) .| Ruft auf : put_char .| Aufruf in : set_rsc-3,set_part_dial-1,hard_param-9,disc_info-10 .| do_datei_info-1, put_char(tree%,obj&,RIGHT$(SPACE$(ll%)+STR$(wert%),ll%)) RETURN ' PROCEDURE select_rsc(tree%,obj&,wert&) ! OBJECT select .| Ruft auf : set_state,clr_state (tot) IF wert&>0 ! jenach Wert 'OBJ' selectieren oder nicht set_state(tree%,obj&,1) ELSE clr_state(tree%,obj&,1) ENDIF RETURN PROCEDURE cross_rsc(tree%,obj&,wert&) ! OBJECT cross .| Ruft auf : set_state,clr_state .| Aufruf in : set_rsc-10,hard_command-1,do_datei_info-2,set_targ-1, IF wert&>0 ! jenach Wert 'OBJ' selectieren oder nicht set_state(tree%,obj&,2) ELSE clr_state(tree%,obj&,2) ENDIF RETURN ' ---------------------- RSC --------------------- PROCEDURE box_draw(tree%) ! Dialog zeichnen .| Glob. Var.: dial.pos%,dw%,dy%,dh%,h%,box_draw%,box_addr% .| Felder : mem%() .| Ruft auf : xywh,scr2mem,init_button .| Aufruf in : do_input-1,alrt-2,setfont-1,hard_command-1,hard_part_sel-1 .| part_select-1,part_gleiche-1,hard_format-1,hard_bad-1,hard_param-1 .| sel_target_geraet-1,fdc_speed-1,fdc_steprate-1,fdc_trackconfig-1 .| fdc_protect-1,disass_konv-1,sektor_compare-1,do_sektor_compare-1 .| set_kleine_buttons-1,disc_info-1,disc_clear-1,disc_drive-1 .| do_datei_info-1,ctrl_t-2,search-1,einname-1,eintext-1,infos-1 .| opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1 .| fat_bearbeiten-1, LOCAL bx%,by%,x%,y%,w% ' IF dial.pos%>0 ~GRAF_MKSTATE(x%,y%,w%,w%) bx%=x%-(OB_W(tree%,0)-6) DIV 2 by%=y%-(OB_H(tree%,0)-6) DIV 2 ELSE bx%=OB_X(tree%,0) by%=OB_Y(tree%,0) ENDIF OB_X(tree%,0)=MIN(dw%-OB_W(tree%,0)-6,MAX(3,bx%)) OB_Y(tree%,0)=MAX(dy%+3,MIN(dh%-OB_H(tree%,0)-6,by%)) xywh IF mem%(0)=0 ~FORM_DIAL(0,0,0,0,0,x%,y%,w%,h%) ELSE scr2mem(x%,y%,w%,h%) ENDIF box_draw%=1 box_addr%=tree% ~WIND_UPDATE(1) ~OBJC_DRAW(tree%,0,8,x%,y%,w%,h%) init_button(tree%) ! Unterstriche zeichnen RETURN PROCEDURE box_undraw(tree%) ! Hintergrund zurück .| Glob. Var.: x%,y%,w%,h%,box_draw% .| Felder : mem%() .| Ruft auf : xywh,mem2scr .| Aufruf in : do_input-1,alrt-2,setfont-1,hard_command-1,hard_part_sel-1 .| part_select-1,part_gleiche-1,hard_format-1,hard_bad-2,hard_param-1 .| sel_target_geraet-1,fdc_speed-1,fdc_steprate-1,fdc_trackconfig-1 .| fdc_protect-1,disass_konv-1,sektor_compare-1,do_sektor_compare-1 .| set_kleine_buttons-1,disc_info-1,disc_clear-1,disc_drive-1 .| do_datei_info-1,ctrl_t-2,search-1,einname-1,eintext-1,infos-1 .| opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1 .| fat_bearbeiten-1, xywh IF mem%(0)<=0 ~FORM_DIAL(3,0,0,0,0,x%,y%,w%,h%) ELSE mem2scr(x%,y%,w%,h%) ENDIF ~WIND_UPDATE(0) CLR box_draw% RETURN PROCEDURE xywh .| Glob. Var.: x%,tree%,y%,w%,h% .| Aufruf in : box_draw-1,box_undraw-1,meinform_do-3, x%=OB_X(tree%,0)-3 y%=OB_Y(tree%,0)-3 w%=OB_W(tree%,0)+6 h%=OB_H(tree%,0)+6 RETURN PROCEDURE objc_update(tree%,obj&) .| Ruft auf : draw_underline .| Aufruf in : meinform_do-2,setfont-4,hard_command-4,set_part_par-2 .| part_slide-1,part_slide_page-1,set_part_dial-2,hard_part_sel-1 .| part_select-2,hard_bad-3,fdc_speed-1,fdc_protect-1 .| do_sektor_compare-1,disc_clear-2,ctrl_t-1,set_dma_mask-1,set_targ-1 .| fat_bearbeiten-4, LOCAL a%,b%,x%,y% ' ~OBJC_OFFSET(tree%,obj&,x%,y%) ~WIND_UPDATE(1) ~OBJC_DRAW(tree%,obj&,8,x%,y%,OB_W(tree%,obj&),OB_H(tree%,obj&)) a%=OB_FLAGS(tree%,obj&) b%=OB_STATE(tree%,obj&) IF (a% AND 1024)>0 ! Button mit Taste IF (b% AND 8)=0 AND ((a% AND &H80)=0) draw_underline(tree%,obj&) ENDIF ENDIF ~WIND_UPDATE(0) RETURN PROCEDURE scr2mem(x%,y%,w%,h%) ! Hintergrund retten .| Glob. Var.: dx%,dy%,dw%,dh% .| Felder : par%(),mem%(),scr%() .| Aufruf in : box_draw-1,meinform_do-1, par%(0)=x% par%(1)=y% par%(2)=x%+w%-1 par%(3)=y%+h%-1 par%(4)=0 par%(5)=0 par%(6)=w%-1 par%(7)=h%-1 par%(8)=3 mem%(1)=w% mem%(2)=h% mem%(3)=((w%+15) DIV 16) CLIP dx%,dy%,dw%,dh% ~GRAF_MOUSE(256,0) BITBLT scr%(),mem%(),par%() ~GRAF_MOUSE(257,0) CLIP OFF RETURN PROCEDURE mem2scr(x%,y%,w%,h%) ! " zurück .| Glob. Var.: dx%,dy%,dw%,dh% .| Felder : par%(),mem%(),scr%() .| Aufruf in : box_undraw-1,meinform_do-2, par%(4)=x% par%(5)=y% par%(6)=x%+w%-1 par%(7)=y%+h%-1 par%(0)=0 par%(1)=0 par%(2)=w%-1 par%(3)=h%-1 par%(8)=3 CLIP dx%,dy%,dw%,dh% ~GRAF_MOUSE(256,0) BITBLT mem%(),scr%(),par%() ~GRAF_MOUSE(257,0) CLIP OFF RETURN PROCEDURE set_state(tree%,obj&,par%) ! OBJECT-Status ändern .| Aufruf in : select_rsc-1,cross_rsc-1,setfont-1,hard_part-1 .| only_used_target-1,all_targets-3,fdc_steprate-3,set_button-1 .| set_mod_button-1,disc_drive-2,ctrl_t-1, OB_STATE(tree%,obj&)=OB_STATE(tree%,obj&) OR par% RETURN PROCEDURE clr_state(tree%,obj&,par%) ! " .| Aufruf in : do_input-1,alrt-1,select_rsc-1,cross_rsc-1,setfont-2 .| hard_command-1,hard_part-1,hard_part_sel-3,part_select-2 .| hard_param-1,sel_target_geraet-2,only_used_target-2,all_targets-2 .| fdc_steprate-4,fdc_trackconfig-1,disass_konv-1,sektor_compare-1 .| clr_button-1,set_kleine_buttons-1,disc_info-1,disc_drive-2 .| do_datei_info-1,ctrl_t-3,search-1,einname-1,eintext-1,infos-1 .| opt_konfig-1,einstellungen-1,opt_help-1,set_dma_mask-1 .| fat_bearbeiten-1, OB_STATE(tree%,obj&)=OB_STATE(tree%,obj&) AND (NOT par%) RETURN PROCEDURE set_flags(tree%,obj&,par%) ! " .| Aufruf in : alrt-4,set_help-1,only_used_target-1,all_targets-1 .| disc_drive-1,do_datei_info-3,opt_help-1, OB_FLAGS(tree%,obj&)=OB_FLAGS(tree%,obj&) OR par% RETURN PROCEDURE clr_flags(tree%,obj&,par%) ! " .| Aufruf in : alrt-3,set_help-1,only_used_target-1,disc_drive-1 .| do_datei_info-3,opt_help-2, OB_FLAGS(tree%,obj&)=OB_FLAGS(tree%,obj&) AND (NOT par%) RETURN ' PROCEDURE init_button(tree%) ! Button mit SHORT-CUT zeichnen .| Glob. Var.: scr_handle% .| Ruft auf : draw_underline,v_line .| Aufruf in : box_draw-1,meinform_do-1, LOCAL j&,x&,y&,flg% ' CLR j& ~GRAF_MOUSE(256,0) WHILE j&>=0 flg%=OB_FLAGS(tree%,j&) IF (flg% AND 1024)>0 ! Button mit Taste IF (OB_STATE(tree%,j&) AND 8)=0 AND ((flg% AND &H80)=0) draw_underline(tree%,j&) ENDIF ENDIF IF (OB_TYPE(tree%,j&) DIV 256)=17 ! Eselsohr ~OBJC_OFFSET(tree%,j&,x&,y&) v_line(scr_handle%,x&-1,y&-1,x&+OB_W(tree%,j&),y&+OB_H(tree%,j&)) ENDIF EXIT IF (flg% AND &H20)>0 ! LASTOB INC j& WEND ~GRAF_MOUSE(257,0) RETURN PROCEDURE draw_underline(tree%,j&) ! ... .| Glob. Var.: z.b%,z.h%,scr_handle% .| Ruft auf : get_pixel,vswr_mode,v_line .| Aufruf in : objc_update-1,init_button-1, LOCAL a%,i&,x&,y&,a$ ' ~OBJC_OFFSET(tree%,j&,x&,y&) a$=CHAR{OB_SPEC(tree%,j&)} a%=LEN(a$) i&=1 WHILE MID$(a$,i&,1)=" " AND i&<a% INC i& WEND ADD x&,(OB_W(tree%,j&)-(a%*z.b%))/2-1+((OB_TYPE(tree%,j&) DIV 256)-1)*z.b% ADD x&,z.b%*(i&-1) ADD y&,(OB_H(tree%,j&)+z.h%)/2-1 IF @get_pixel(scr_handle%,x&,y&)>0 vswr_mode(scr_handle%,3) ENDIF v_line(scr_handle%,x&,y&,x&+z.b%,y&) vswr_mode(scr_handle%,1) RETURN FUNCTION check_dialkey(tree%,key%,kstate%) ! auf SHORT-CUT prüfen .| Aufruf in : meinform_do-1, LOCAL a&,char&,i&,j&,scan%,keytbl%,type&,flg&,a$ ' CLR j& WHILE j&>=0 flg&=OB_FLAGS(tree%,j&) IF (flg& AND 1024)>0 ! FLAG 10? IF (OB_STATE(tree%,j&) AND 8)=0 AND ((flg& AND &H80)=0) type&=(OB_TYPE(tree%,j&) DIV 256)-1 ! x.Buchstabe ' a$=CHAR{OB_SPEC(tree%,j&)} i&=1 WHILE MID$(a$,i&,1)=" " AND i&<LEN(a$) INC i& WEND char&=BYTE{V:a$+i&-1+type&} OR &H20 ' keytbl%=XBIOS(16,L:-1,L:-1,L:-1) scan%=(key% DIV 256) AND &HFF IF (kstate% AND 3)>0 ! Shift-Taste a&=BYTE{{keytbl%+4}+scan%} OR &H20 ELSE a&=BYTE{{keytbl%}+scan%} ENDIF IF char&=a& AND a&>0 ! Mit Taste vergleichen RETURN j& ENDIF ENDIF ENDIF IF (flg& AND &H20)>0 ! LASTOB RETURN -1 ELSE INC j& ENDIF WEND ' ENDFUNC ' FUNCTION form_do(tree%) .| Ruft auf : meinform_do .| Aufruf in : do_input-1,alrt-1,setfont-1,hard_command-1,hard_part_sel-1 .| part_select-1,hard_param-1,sel_target_geraet-1,fdc_steprate-1 .| fdc_trackconfig-1,disass_konv-1,sektor_compare-1 .| set_kleine_buttons-1,disc_info-1,disc_drive-1,do_datei_info-1 .| ctrl_t-2,search-1,einname-1,eintext-1,infos-1,opt_konfig-1 .| einstellungen-1,opt_help-1,set_dma_mask-1,fat_bearbeiten-1, RETURN @meinform_do(tree%) ENDFUNC FUNCTION meinform_do(tree%) ! eigene FORMDO Routine .| Glob. Var.: objc%,obj%,nextone%,key%,nextkey%,kstate%,type%,x%,y%,w%,h% .| dx%,dy%,dw%,dh%,neu_x%,neu_y% .| Felder : mem%() .| Ruft auf : fm_inifld,form_keybd,check_dialkey,objc_update,kling,xywh .| mem2scr,mnorm,scr2mem,init_button,draw_font .| Aufruf in : form_do-1, LOCAL which&,idx&,cont&,dummy%,mb%,edit_obj%,next_obj% LOCAL mx&,my&,mb&,ks&,key&,clicks&,ox%,oy%,hidden!,a% ' ~GRAF_MOUSE(0,0) ~WIND_UPDATE(3) ' next_obj%=@fm_inifld(tree%,objc%) CLR edit_obj%,obj% cont&=1 ' WHILE cont& IF (next_obj%<>0) AND (edit_obj%<>next_obj%) edit_obj%=next_obj% CLR next_obj% ~OBJC_EDIT(tree%,edit_obj%,0,idx&,1,idx&) ! EDINIT ENDIF ' which&=EVNT_MULTI(&X11,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,mx&,my&,mb&,ks&,key&,clicks&) IF (which& AND 1)<>0 ! TASTE gedrückt cont&=@form_keybd(tree%,edit_obj%,next_obj%,key&) next_obj%=nextone% key%=nextkey% kstate%=BIOS(11,-1) IF (kstate% AND 8)<>0 a%=@check_dialkey(tree%,key%,kstate%) IF a%<>-1 next_obj%=a% cont&=FORM_BUTTON(tree%,next_obj%,clicks&,next_obj%) objc_update(tree%,a%) ! Button neu zeichnen ENDIF ENDIF IF key%>0 ~OBJC_EDIT(tree%,edit_obj%,key%,idx&,2,idx&) ! EDCHAR ENDIF IF (next_obj%<>0) AND ((next_obj%<>edit_obj%) OR (cont&=0)) ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&) ! EDEND ENDIF ENDIF IF (which& AND 2)>0 ! KLICK (MOVE DIAL) next_obj%=OBJC_FIND(tree%,0,8,mx&,my&) IF next_obj%=-1 kling CLR next_obj% ELSE type%=OB_TYPE(tree%,next_obj%) IF (type% DIV 256)=18 ! Cross-Button OB_STATE(tree%,next_obj%)=OB_STATE(tree%,next_obj%) XOR 2 objc_update(tree%,next_obj%) ENDIF IF (OB_FLAGS(tree%,next_obj%) AND &H15F)=0 AND (type% DIV 256<>30) OR (type% DIV 256=17) ' nicht selektierbares Objekt ' nicht EXIT/TOUCHEXIT/EDITABLE/RADIO/DEFAULT/INDIRECT ' kein Cross-Button IF mem%(0)>0 ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&) ! EDEND xywh hidden!=FALSE IF ((mb& AND 2)=2) OR (ks& AND 8)<>0 mem2scr(x%,y%,w%,h%) hidden!=TRUE ENDIF ox%=x% oy%=y% ~GRAF_MOUSE(4,0) ~GRAF_DRAGBOX(OB_W(tree%,0),OB_H(tree%,0),OB_X(tree%,0),OB_Y(tree%,0),dx%+3,dy%+3,dw%-6,dh%-6,neu_x%,neu_y%) mnorm IF ox%<>neu_x%-3 OR oy%<>neu_y%-3 OR hidden!=TRUE xywh mem2scr(x%,y%,w%,h%) OB_X(tree%,0)=neu_x% OB_Y(tree%,0)=neu_y% xywh scr2mem(x%,y%,w%,h%) ~OBJC_DRAW(tree%,0,8,dx%,dy%,dw%,dh%) init_button(tree%) ! Unterstriche zeichnen ENDIF ~OBJC_EDIT(tree%,edit_obj%,0,idx&,1,idx&) ' IF (OB_TYPE(tree%,0) DIV 256)=5 ! Spezial: FONT-Dialog draw_font ENDIF ' ENDIF next_obj%=edit_obj% ELSE a%=next_obj% cont&=FORM_BUTTON(tree%,next_obj%,clicks&,next_obj%) IF (next_obj%<>0) AND ((next_obj%<>edit_obj%) OR (cont&=0)) ~OBJC_EDIT(tree%,edit_obj%,0,idx&,3,idx&) ! EDEND ENDIF ENDIF ENDIF ENDIF WEND ' ~WIND_UPDATE(2) RETURN next_obj% ENDFUNC FUNCTION form_keybd(tree%,edit_obj&,next_obj&,key&) .| Glob. Var.: nextone%,nextkey% .| Aufruf in : meinform_do-1, {ADDRIN}=tree% CARD{GCONTRL}=55 CARD{GCONTRL+2}=3 CARD{GCONTRL+4}=3 CARD{GCONTRL+6}=1 CARD{GCONTRL+8}=0 CARD{GINTIN}=edit_obj& CARD{GINTIN+2}=key& CARD{GINTIN+4}=next_obj& GEMSYS nextone%=CARD{GINTOUT+2} nextkey%=CARD{GINTOUT+4} RETURN CARD{GINTOUT} ENDFUNC FUNCTION find_obj(tree%,objc%,which&) .| Aufruf in : fm_inifld-1, LOCAL obj%,flag&,theflag&,inc& ' CLR obj% flag&=8 ! EDITABLE inc&=1 SELECT which& CASE -1 inc&=-1 obj%=objc%+inc& CASE 1 obj%=objc%+inc& CASE 0 flag&=2 ! DEFAULT ENDSELECT ' WHILE obj%>=0 theflag&=OB_FLAGS(tree%,obj%) IF (theflag& AND flag&)<>0 RETURN obj% ENDIF IF (theflag& AND &H20)<>0 ! LASTOB obj%=-1 ELSE obj%=obj%+inc& ENDIF WEND RETURN objc% ENDFUNC FUNCTION fm_inifld(tree%,objc&) .| Ruft auf : find_obj .| Aufruf in : meinform_do-1, IF objc&=0 objc&=@find_obj(tree%,0,1) ! FMD_FORWARD ENDIF RETURN objc& ENDFUNC FUNCTION menu_search(ap_id%,mtree%,kstate%,key%) .| Glob. Var.: mes_adr% .| Aufruf in : taste-2, LOCAL mtitle%,ctitle%,mentry%,centry%,typ%,schluss!,zeichen$ LOCAL scan%,desk%,keytbl%,su$ ' keytbl%=XBIOS(16,L:-1,L:-1,L:-1) ' ~WIND_UPDATE(1) !! ~WIND_UPDATE(0) ' schluss!=FALSE CLR desk% scan%=(key% DIV 256) AND &HFF ' IF (kstate% AND 3)<>0 ! Shift-Taste zeichen$=UPPER$(CHR$(BYTE{{keytbl%}+scan%})) ELSE zeichen$=UPPER$(CHR$(BYTE{{keytbl%}+scan%})) ENDIF ' IF (kstate% AND 8)<>0 ! ALT gedrückt su$="" ELSE IF (kstate% AND 4)<>0 ! CTRL su$="^" ! "^"+Taste ELSE schluss!=TRUE ! Nix ENDIF ENDIF su$=su$+zeichen$ ' mtitle%=OB_HEAD(mtree%,OB_HEAD(mtree%,0)) ctitle%=OB_HEAD(mtree%,mtitle%) mentry%=OB_HEAD(mtree%,OB_TAIL(mtree%,0)) centry%=OB_HEAD(mtree%,mentry%) ' WHILE NOT schluss! IF (OB_STATE(mtree%,ctitle%) AND 8)=0 ! DISABLED WHILE (NOT schluss!) AND (centry%<>mentry%) AND (centry%<>-1) IF (OB_STATE(mtree%,centry%) AND 8)=0 ! DISABLED typ%=OB_TYPE(mtree%,centry%) IF typ%=28 OR typ%=26 ! G_STRING oder G_BUTTON schluss!=INSTR(CHAR{OB_SPEC(mtree%,centry%)},su$) ENDIF ENDIF ' IF schluss!=TRUE CARD{mes_adr%}=10 ! MN_SELECTED CARD{mes_adr%+2}=ap_id% CARD{mes_adr%+4}=0 CARD{mes_adr%+6}=ctitle% CARD{mes_adr%+8}=centry% ~MENU_TNORMAL(mtree%,ctitle%,0) ~APPL_WRITE(ap_id%,16,mes_adr%) RETURN 1 ! Suche war erfolgreich ENDIF ' centry%=OB_NEXT(mtree%,centry%) IF desk%=0 centry%=mentry% desk%=1 ENDIF WEND ENDIF ctitle%=OB_NEXT(mtree%,ctitle%) mentry%=OB_NEXT(mtree%,mentry%) centry%=OB_HEAD(mtree%,mentry%) IF ctitle%=mtitle% schluss!=TRUE ENDIF WEND RETURN 0 ENDFUNC ' PROCEDURE trans_gimage(tree%,obj%) .| Ruft auf : vdi_trans .| Aufruf in : set_rsc-1, LOCAL type%,wb%,hl%,ib%,taddr% ' SELECT OB_TYPE(tree%,obj%) CASE 31 ! G_ICON ib%=OB_SPEC(tree%,obj%) taddr%={ib%} wb%=CARD{ib%+22} DIV 8 ! Breite ib_wicon hl%=CARD{ib%+24} ! Höhe ib_hicon vdi_trans(taddr%,wb%,taddr%,wb%,hl%) taddr%={ib%+4} CASE 23 ! G_IMAGE ib%=OB_SPEC(tree%,obj%) taddr%={ib%} wb%=CARD{ib%+4} hl%=CARD{ib%+6} ENDSELECT vdi_trans(taddr%,wb%,taddr%,wb%,hl%) RETURN PROCEDURE vdi_trans(saddr%,swb%,daddr%,dwb%,h%) .| Glob. Var.: scr_handle% .| Ruft auf : vdi_fix,vr_trnfm .| Aufruf in : trans_gimage-2, LOCAL src$,dst$ src$=STRING$(50,0) dst$=STRING$(50,0) ! Platz für MFDBs vdi_fix(VARPTR(src$),saddr%,swb%,h%) CARD{VARPTR(src$)+10}=1 ! Standardformat vdi_fix(VARPTR(dst$),daddr%,dwb%,h%) CARD{VARPTR(src$)+10}=0 ! Geräteabhängiges Format vr_trnfm(scr_handle%,VARPTR(src$),VARPTR(dst$)) CLR src$,dst$ RETURN PROCEDURE vdi_fix(pfd%,theaddr%,wb%,h%) .| Aufruf in : vdi_trans-2, {pfd%}=theaddr% CARD{pfd%+4}=wb%*8 CARD{pfd%+6}=h% CARD{pfd%+8}=wb%/2 CARD{pfd%+12}=1 RETURN ' ---------------------- VDI ----------------------------- PROCEDURE v_enter_cur(handle%) ! VDI 5 .| Aufruf in : do_pexec-1,start_shell-1, CARD{CONTRL}=5 CARD{CONTRL+2}=0 CARD{CONTRL+6}=0 CARD{CONTRL+10}=3 CARD{CONTRL+12}=handle% VDISYS RETURN PROCEDURE v_exit_cur(handle%) ! VDI 5 .| Aufruf in : do_pexec-2,start_shell-1, CARD{CONTRL}=5 CARD{CONTRL+2}=0 CARD{CONTRL+6}=0 CARD{CONTRL+10}=2 CARD{CONTRL+12}=handle% VDISYS RETURN PROCEDURE v_line(handle%,x%,y%,x2%,y2%) ! VDI 6 .| Aufruf in : init_button-1,draw_underline-1,out_lined_cursor-4 .| redraw_list-2,do_pexec-1, CARD{CONTRL}=6 CARD{CONTRL+2}=2 {CONTRL+4}=0 CARD{CONTRL+8}=0 CARD{CONTRL+12}=handle% CARD{PTSIN}=x% CARD{PTSIN+2}=y% CARD{PTSIN+4}=x2% CARD{PTSIN+6}=y2% VDISYS RETURN PROCEDURE vst_rotation(handle%,winkel%) ! VDI 13 .| Aufruf in : v_opnvwk-1, CARD{CONTRL}=13 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=winkel% VDISYS RETURN PROCEDURE vst_font(handle%,font%) ! VDI 21 .| Aufruf in : v_opnvwk-1,init_font-1,setfont-3, CARD{INTIN}=font% CARD{CONTRL}=21 {CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+8}=1 CARD{CONTRL+12}=handle% VDISYS RETURN PROCEDURE vst_color(handle%,colindex%) ! VDI 22 .| Aufruf in : v_opnvwk-1, CARD{CONTRL}=22 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=colindex% VDISYS RETURN PROCEDURE vsf_interior(handle%,style%) ! VDI 23 .| Aufruf in : v_opnvwk-1, CARD{CONTRL}=23 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=style% VDISYS RETURN PROCEDURE vsf_style(handle%,style_index%) ! VDI 24 .| Aufruf in : v_opnvwk-1, CARD{CONTRL}=24 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=style_index% VDISYS RETURN PROCEDURE vsf_color(handle%,color_index%) ! VDI 25 .| Aufruf in : v_opnvwk-1, CARD{CONTRL}=25 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=color_index% VDISYS RETURN PROCEDURE vswr_mode(handle%,mode%) ! VDI 32 .| Aufruf in : draw_underline-2,v_opnvwk-1,out_lined_cursor-2, CARD{INTIN}=mode% CARD{CONTRL}=32 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% VDISYS RETURN PROCEDURE vst_alignment(handle%,horin%,vertin%) ! VDI 39 .| Aufruf in : v_opnvwk-1, CARD{INTIN}=horin% CARD{INTIN+2}=vertin% CARD{CONTRL}=39 CARD{CONTRL+2}=0 CARD{CONTRL+6}=2 CARD{CONTRL+12}=handle% VDISYS RETURN PROCEDURE v_opnvwk ! VDI 100 .| Glob. Var.: graf_handle%,scr_width%,scr_height%,scr_handle%,fonts% .| neuefonts%,sed_pfad$ .| Ruft auf : set_pfad,vswr_mode,vst_color,vst_font,vst_effects .| vst_alignment,vsf_interior,vst_rotation,vsf_style,vsf_color .| Aufruf in : rsc_init-1, CARD{CONTRL}=100 CARD{CONTRL+2}=0 CARD{CONTRL+4}=6 CARD{CONTRL+6}=11 CARD{CONTRL+8}=45 CARD{CONTRL+12}=graf_handle% ' CARD{INTIN}=1 ! Bildschirmtreiber, aktuelle Auflösung CARD{INTIN+2}=1 ! Linientyp CARD{INTIN+4}=1 ! Linienfarbe CARD{INTIN+6}=1 ! Markertyp CARD{INTIN+8}=1 ! Markerfarbe CARD{INTIN+10}=1 ! Textstil CARD{INTIN+12}=1 ! Textfarbe CARD{INTIN+14}=1 ! Fülltyp CARD{INTIN+16}=1 ! Füllmuster-Index CARD{INTIN+18}=1 ! Füllmuster-Farbe CARD{INTIN+20}=2 ! RC-Koordinaten VDISYS scr_width%=CARD{INTOUT}+1 scr_height%=CARD{INTOUT+2}+1 scr_handle%=CARD{CONTRL+12} fonts%=CARD{INTOUT+20} IF GDOS? neuefonts%=VST_LOAD_FONTS(0) ! Fonts laden set_pfad(sed_pfad$) ! Pfad korrigieren ENDIF ' ' gleich alle Texteigenschaften einstellen vswr_mode(scr_handle%,1) ! Replace-Modus vst_color(scr_handle%,1) ! Farbe Schwarz vst_font(scr_handle%,1) ! Systemzeichensatz vst_effects(scr_handle%,0) ! Normal vst_alignment(scr_handle%,0,3)! Linksbündig, Zellenunterkante vsf_interior(scr_handle%,1) ! Fülltyp vst_rotation(scr_handle%,0) ! Winkel 0 vsf_style(scr_handle%,0) ! Musterindex vsf_color(scr_handle%,0) ! RETURN PROCEDURE v_clsvwk(handle%) ! VDI 101 .| Aufruf in : do_exit-1, CARD{CONTRL}=101 CARD{CONTRL+2}=0 CARD{CONTRL+6}=0 CARD{CONTRL+12}=handle% VDISYS RETURN FUNCTION vq_extnd(handle%,flag%) ! VDI 102 .| Aufruf in : rsc_init-1, CARD{CONTRL}=102 CARD{CONTRL+2}=0 CARD{CONTRL+4}=6 CARD{CONTRL+6}=1 CARD{CONTRL+8}=45 CARD{CONTRL+12}=handle% CARD{INTIN}=flag% VDISYS RETURN CARD{INTOUT+8} ENDFUNC FUNCTION get_pixel(handle%,x%,y%) ! VDI 105 .| Aufruf in : draw_underline-1, CARD{PTSIN}=x% CARD{PTSIN+2}=y% CARD{CONTRL}=105 CARD{CONTRL+2}=1 CARD{CONTRL+6}=0 CARD{CONTRL+12}=handle% VDISYS RETURN CARD{INTOUT} ENDFUNC PROCEDURE vst_effects(handle%,effect%) ! VDI 106 .| Aufruf in : v_opnvwk-1, CARD{INTIN}=effect% CARD{CONTRL}=106 CARD{CONTRL+2}=0 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% VDISYS RETURN FUNCTION vst_point(handle%,point%) ! VDI 107 .| Glob. Var.: z.breite%,z.hoehe% .| Aufruf in : rsc_init-1,init_font-1,setfont-4, CARD{INTIN}=point% CARD{CONTRL}=107 CARD{CONTRL+2}=0 CARD{CONTRL+4}=2 CARD{CONTRL+6}=1 CARD{CONTRL+8}=1 CARD{CONTRL+12}=handle% VDISYS z.breite%=CARD{PTSOUT+4} z.hoehe%=CARD{PTSOUT+6} RETURN CARD{INTOUT} ENDFUNC PROCEDURE vr_trnfm(handle%,src%,dst%) ! VDI 110 .| Aufruf in : vdi_trans-1, CARD{CONTRL}=110 {CONTRL+2}=0 {CONTRL+6}=0 CARD{CONTRL+12}=handle% {CONTRL+14}=src% {CONTRL+18}=dst% VDISYS RETURN PROCEDURE vr_recfl(handle%,x%,y%,x2%,y2%) ! VDI 114 .| Aufruf in : draw_font-1,wind_open-1,wind_clr-1,redraw_list-2, CARD{CONTRL}=114 CARD{CONTRL+2}=2 CARD{CONTRL+6}=0 CARD{CONTRL+12}=handle% CARD{PTSIN}=x% CARD{PTSIN+2}=y% CARD{PTSIN+4}=x%+x2%-1 CARD{PTSIN+6}=y%+y2%-1 VDISYS RETURN FUNCTION vqt_width(handle%,zeichen%) ! VDI 117 .| Aufruf in : chkfont-2, (tot) CARD{CONTRL}=117 CARD{CONTRL+2}=0 CARD{CONTRL+4}=3 CARD{CONTRL+6}=1 CARD{CONTRL+8}=1 CARD{CONTRL+12}=handle% CARD{INTIN}=zeichen% VDISYS RETURN CARD{PTSOUT} ENDFUNC PROCEDURE vs_clip(handle%,flag%,x%,y%,x2%,y2%) ! VDI 129 .| Aufruf in : draw_font-2,out_lined_cursor-2,wind_open-1,wind_clr-2 .| redraw_list-2,zeile-2,text_line-2,redraw_desk-2,do_pexec-1, CARD{CONTRL}=129 CARD{CONTRL+2}=2 CARD{CONTRL+6}=1 CARD{CONTRL+12}=handle% CARD{PTSIN}=x% CARD{PTSIN+2}=y% CARD{PTSIN+4}=x%+x2%-1 CARD{PTSIN+6}=y%+y2%-1 CARD{INTIN}=flag% VDISYS RETURN FUNCTION vqt_name(handle%,fontnr%,VAR fontname$) ! VDI 130 .| Aufruf in : init_font-1, RETURN VQT_NAME(fontnr%,fontname$) ENDFUNC PROCEDURE vqt_fontinfo(handle%,VAR minad%,maxad%) ! VDI 131 .| Aufruf in : chkfont-1,init_font-1, CARD{CONTRL}=131 CARD{CONTRL+2}=0 CARD{CONTRL+4}=5 CARD{CONTRL+6}=0 CARD{CONTRL+8}=2 CARD{CONTRL+12}=handle% VDISYS minad%=CARD{INTOUT} maxad%=CARD{INTOUT+2} RETURN ' FUNCTION chkfont ! nachsehen ob alle Zeichen gleich breit .| Glob. Var.: scr_handle% .| Ruft auf : vqt_fontinfo,vqt_width (tot) LOCAL i%,width%,minad%,maxad% ' vqt_fontinfo(scr_handle%,minad%,maxad%) ! first+last CHR holen width%=@vqt_width(scr_handle%,minad%) ' FOR i%=minad%+1 TO maxad%-1 IF width%<>@vqt_width(scr_handle%,i%) RETURN 1 ENDIF NEXT i% RETURN 0 ENDFUNC ' PROCEDURE init_font(font$,fontsx%) .| Glob. Var.: fonts%,neuefonts%,scr_handle%,fontname$,aktfontnr%,fontsz% .| minad%,maxad% .| Ruft auf : vqt_name,vst_font,vst_point,alrt,vqt_fontinfo,set_vdipar .| Aufruf in : rsc_init-1,setfont-1, LOCAL fontnr%,a% fontnr%=1 ' WHILE fontnr%<=fonts%+neuefonts% ! Font suchen a%=@vqt_name(scr_handle%,fontnr%,fontname$) EXIT IF TRIM$(fontname$)=TRIM$(font$) INC fontnr% WEND ' IF fontnr%<=fonts%+neuefonts% ! Font gefunden? vst_font(scr_handle%,a%) ! Ja, Font einschalten a%=@vst_point(scr_handle%,fontsx%) ! die Grö₧e dazu IF a%<>fontsx% ! hat geklappt? ~@alrt(3,"Fontgrö₧e "+STR$(fontsx%)+" nicht einstellbar!",1,"Aha") ENDIF ELSE ~@alrt(3,"Font: "+font$+" | nicht geladen!",1,"Aha") ENDIF aktfontnr%=fontnr% fontsz%=fontsx% fontname$=font$ vqt_fontinfo(scr_handle%,minad%,maxad%) ! first+last CHR set_vdipar ! ... RETURN PROCEDURE setfont .| Glob. Var.: aktfontnr%,fontsz%,fontsx%,scr_handle%,fontname$,f.ontdial% .| fontname&,fontsize&,fontall&,fontok&,fontwael&,fontabb&,fontmin& .| fontsp&,fontsm&,fonts%,neuefonts%,font_soll$ .| Ruft auf : vst_font,put_char,box_draw,vst_point,objc_update,set_state .| clr_state,draw_font,form_do,box_undraw,init_font,set_vdipar .| desktop_weg,desktop_back .| Aufruf in : einstellungen-1, LOCAL a%,a$,x%,y%,w%,h%,ex_obj&,fontnr%,font_prop% ' fontnr%=aktfontnr% fontsz%=fontsx% vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$)) put_char(f.ontdial%,fontname&,LEFT$(fontname$+STRING$(33," "),33)) put_char(f.ontdial%,fontsize&,LEFT$(STR$(fontsz%)+" ",2)) box_draw(f.ontdial%) DO vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$)) put_char(f.ontdial%,fontname&,LEFT$(fontname$+STRING$(33," "),33)) a%=@vst_point(scr_handle%,fontsz%) IF a%<=fontsz% fontsz%=a% ENDIF ' IF (OB_STATE(f.ontdial%,fontall&) AND 1) OR font_prop%=0 put_char(f.ontdial%,fontsize&,LEFT$(STR$(fontsz%)+" ",2)) objc_update(f.ontdial%,fontsize&) objc_update(f.ontdial%,fontname&) IF font_prop%>0 set_state(f.ontdial%,fontok&,8) ! nicht wählbar ELSE clr_state(f.ontdial%,fontok&,8) ENDIF objc_update(f.ontdial%,fontok&) draw_font ex_obj&=@form_do(f.ontdial%) AND &HFF IF ex_obj&<>fontall& AND ex_obj&<>fontwael& clr_state(f.ontdial%,ex_obj&,1) ENDIF objc_update(f.ontdial%,ex_obj&) EXIT IF ex_obj&=fontok& OR ex_obj&=fontabb& ELSE ex_obj&=fontmin& ENDIF ' SELECT ex_obj& CASE fontsp& REPEAT ! Size + INC fontsz% a%=@vst_point(scr_handle%,fontsz%) UNTIL a%>=fontsz% OR fontsz%=99 fontsz%=a% CASE fontsm& DEC fontsz% ! Size - a%=@vst_point(scr_handle%,fontsz%) IF a%<=fontsz% fontsz%=a% ELSE INC fontsz% ENDIF CASE fontmin& INC fontnr% ! Font + fontsz%=100 IF fontnr%>fonts%+neuefonts% fontnr%=1 ENDIF vst_font(scr_handle%,VQT_NAME(fontnr%,fontname$)) DO DEC fontsz% a%=@vst_point(scr_handle%,fontsz%) IF a%<=fontsz% fontsz%=a% EXIT IF fontsz%<=10 ELSE INC fontsz% EXIT IF -1 ENDIF LOOP ENDSELECT LOOP box_undraw(f.ontdial%) IF ex_obj&=fontabb& init_font(font_soll$,fontsx%) ELSE font_soll$=fontname$ fontsx%=fontsz% aktfontnr%=fontnr% set_vdipar desktop_weg desktop_back ENDIF RETURN PROCEDURE draw_font .| Glob. Var.: f.ontdial%,fonttest&,x%,y%,w%,h%,scr_handle%,z.hoehe% .| fontname$ .| Ruft auf : vs_clip,vr_recfl,v_gtext .| Aufruf in : meinform_do-1,setfont-1, ~OBJC_OFFSET(f.ontdial%,fonttest&,x%,y%) w%=OB_W(f.ontdial%,fonttest&) h%=OB_H(f.ontdial%,fonttest&) vs_clip(scr_handle%,1,x%,y%,w%,h%) ~WIND_UPDATE(1) ~GRAF_MOUSE(256,0) vr_recfl(scr_handle%,x%,y%,w%,h%) v_gtext(x%+1,y%+z.hoehe%,fontname$) ~GRAF_MOUSE(257,0) ~WIND_UPDATE(0) vs_clip(scr_handle%,0,0,0,0,0) RETURN PROCEDURE v_gtext(x%,y%,a$) .| Glob. Var.: vdi_par%,zeile% .| Aufruf in : draw_font-1,redraw_list-2,do_pexec-1, IF LEN(a$)>0 {vdi_par%}=VARPTR(a$) ~C:zeile%(1,L:vdi_par%,x%,y%,MIN(255,LEN(a$)),0,0) ' Op,Strukt, x-,y-,Spalten ENDIF RETURN PROCEDURE set_vdipar ! Konstanten für VDI-Ausgabe .| Glob. Var.: vdi_par%,scr_handle%,z.hoehe%,z.breite%,minad%,maxad%,dec% .| Aufruf in : init_font-1,setfont-1,wind_set-1,check_vor-1, CARD{vdi_par%+12}=scr_handle% CARD{vdi_par%+14}=z.hoehe% ! Zeichenzellenhöhe CARD{vdi_par%+16}=z.breite% ! " breite CARD{vdi_par%+18}=minad% ! first CHR im Font CARD{vdi_par%+20}=maxad% ! last CHR CARD{vdi_par%+22}=dec% ! HEX-DEC-Anzeige? RETURN ' ---------------------- Diverses ------------------------------ PROCEDURE init_do ! xxx.INF lesen .| Glob. Var.: sed_inf$,ver$,fhandle%,fll%,buf$,dum%,default%,max.text%,dec% .| dial.pos%,cursor_rate%,s.ammeln%,tabs%,target%,f.eedcode%,f.eed% .| s.lider%,t.xtsavm%,drive%,cr$,font_soll$,fontsx%,inf_ma$ .| Felder : fe%(),hd_typ%(),dma%(),frei%() .| Ruft auf : fsel$,fopen,fseek,fread$,fclose,get_str,init_help .| Aufruf in : HAUPTPROGRAMM-1, LOCAL a%,ab%,i&,fi$,a$,b$ ' fi$=sed_inf$+STRING$(128,0) a%=SHEL_FIND(fi$) b$=ver$+".INF" ' WHILE (NOT EXIST(fi$)) AND a%=0 fi$=@fsel$("*.INF",b$,"suche "+sed_inf$,1) EXIT IF EXIST(fi$) OR fi$="" WEND ' IF EXIST(fi$)=TRUE fhandle%=@fopen(fi$,0) IF fhandle%>0 fll%=@fseek(0,fhandle%,2) IF fll%<32760 ~@fseek(0,fhandle%,0) buf$=@fread$(fhandle%,fll%) ! alles lesen ~@fclose(fhandle%) ELSE ALERT 3,"INF-Datei zu lang!|Installiere DEFAULT.INF.",1," Aha ",dum% buf$=STRING$(512,0) BMOVE default%,V:buf$,512 ENDIF ENDIF ELSE buf$=STRING$(512,0) BMOVE default%,V:buf$,512 ALERT 1,"Installiere DEFAULT.INF.",1," Aha ",dum% ENDIF ' ab%=1 fe%(0,1)=@get_str(ab%) ! Datenfenster fe%(0,2)=@get_str(ab%) fe%(0,3)=@get_str(ab%) fe%(0,4)=@get_str(ab%) ' max.text%=MAX(500,@get_str(ab%)) dec%=@get_str(ab%) dial.pos%=@get_str(ab%) cursor_rate%=@get_str(ab%) s.ammeln%=@get_str(ab%) tabs%=@get_str(ab%) target%=@get_str(ab%) f.eedcode%=@get_str(ab%) f.eed%=@get_str(ab%) s.lider%=@get_str(ab%) t.xtsavm%=@get_str(ab%) drive%=@get_str(ab%) ' FOR i&=0 TO 7 hd_typ%(i&)=@get_str(ab%) NEXT i& FOR i&=0 TO 31 dma%(i&)=@get_str(ab%) NEXT i& a%=INSTR(ab%,buf$,cr$) font_soll$=LEFT$(MID$(buf$,ab%,a%-ab%)+STRING$(32,32),32) ! Fontname lesen IF INSTR(font_soll$,CHR$(0)) ! Nullbytes "konvertieren" font_soll$=LEFT$(CHAR{V:font_soll$}+STRING$(32,32),32) ENDIF ab%=a%+2 fontsx%=@get_str(ab%) ' fe%(1,1)=@get_str(ab%) fe%(1,2)=@get_str(ab%) fe%(1,3)=@get_str(ab%) fe%(1,4)=@get_str(ab%) ' FOR i&=1 TO 14 ! 14 kleine Buttons frei%(i&,0)=@get_str(ab%) frei%(i&,1)=@get_str(ab%) frei%(i&,2)=@get_str(ab%) NEXT i& IF (BIOS(10) AND 2^drive%)=0 CLR drive% ENDIF inf_ma$=MID$(buf$,ab%,14*5) CLR buf$ init_help RETURN PROCEDURE save_einstellungen ! xxx.INF schreiben .| Glob. Var.: sed_inf$,sed_inf2$,dw%,dh%,max.text%,dec%,dial.pos% .| cursor_rate%,s.ammeln%,tabs%,target%,f.eedcode%,f.eed%,s.lider% .| t.xtsavm%,drive%,fontname$,fontsz%,inf_ma$ .| Felder : fe%(),hd_typ%(),dma%(),frei%() .| Ruft auf : mtasse,frename,fcreate,fwritec,fclose,mnorm .| Aufruf in : einstellungen-1, LOCAL i&,hdl%,x%,y% ' mtasse IF EXIST(sed_inf$)=TRUE AND EXIST(sed_inf2$)=FALSE ~@frename(sed_inf$,sed_inf2$) ENDIF hdl%=@fcreate(sed_inf$,0) IF hdl%>0 x%=32768/dw% y%=32768/dh% ' fwritec(hdl%,STR$(fe%(0,1)*x%)) ! Datenfenster fwritec(hdl%,STR$(fe%(0,2)*y%)) fwritec(hdl%,STR$(fe%(0,3)*x%)) fwritec(hdl%,STR$(fe%(0,4)*y%)) ' fwritec(hdl%,STR$(max.text%)) ! Zeilen im Textfenster fwritec(hdl%,STR$(dec%)) ! DEC-HEX fwritec(hdl%,STR$(dial.pos%)) ! Dialog -> Maus fwritec(hdl%,STR$(cursor_rate%)) fwritec(hdl%,STR$(s.ammeln%)) fwritec(hdl%,STR$(tabs%)) ! TAB ' fwritec(hdl%,STR$(target%)) ! Targetnummer fwritec(hdl%,STR$(f.eedcode%)) ! Code fwritec(hdl%,STR$(f.eed%)) ! Seitenvorschub ' fwritec(hdl%,STR$(s.lider%)) ! mit Slider? fwritec(hdl%,STR$(t.xtsavm%)) ! mit Datum speichern? fwritec(hdl%,STR$(drive%)) ! Drive speichern ' FOR i&=0 TO 7 fwritec(hdl%,STR$(hd_typ%(i&))) ! Plattentypen NEXT i& FOR i&=0 TO 31 fwritec(hdl%,STR$(dma%(i&))) ! DMA-Belegung NEXT i& fwritec(hdl%,fontname$) fwritec(hdl%,STR$(fontsz%)) ' fwritec(hdl%,STR$(fe%(1,1)*x%)) ! 2. Fenster fwritec(hdl%,STR$(fe%(1,2)*y%)) fwritec(hdl%,STR$(fe%(1,3)*x%)) fwritec(hdl%,STR$(fe%(1,4)*y%)) ' FOR i&=1 TO 14 ! Funktion der 14 kleinen Boxen fwritec(hdl%,STR$(frei%(i&,0))) fwritec(hdl%,STR$(frei%(i&,1))) fwritec(hdl%,STR$(frei%(i&,2))) NEXT i& fwritec(hdl%,inf_ma$) ! Beschriftung derselben ~@fclose(hdl%) ENDIF mnorm RETURN PROCEDURE init_help ! xxx.HLP lesen .| Glob. Var.: p_help$,help_mem%,help_size%,fhandle% .| Ruft auf : fopen,fseek,alrt,fread2,fclose .| Aufruf in : init_do-1,in_help-1, LOCAL fll% IF EXIST(p_help$)=TRUE IF help_mem%>0 ~MFREE(help_mem%) CLR help_size% ENDIF fhandle%=@fopen(p_help$,0) ! Datei öffnen fll%=@fseek(0,fhandle%,2) ~@fseek(0,fhandle%,0) ! Offset 0 IF fll%<32760 help_mem%=MALLOC(fll%) IF help_mem%=0 ~@alrt(5,"Kein Speicher für HELP!",1,"kein| Help ") ELSE help_size%=fll% fread2(fhandle%,help_mem%,fll%) ENDIF ~@fclose(fhandle%) ELSE ~@alrt(5,"HELP-Datei zu gro₧!",1," Aha ") ENDIF ENDIF RETURN PROCEDURE set_help ! HELP-Datei --> HELP-Dialog .| Glob. Var.: help_size%,help_mem%,h.elp%,help1&,z.b%,help15& .| Ruft auf : get_line$,put_char,clr_flags,set_flags .| Aufruf in : rsc_init-1,in_help-1, LOCAL ab%,ax%,i&,j%,a$,buf$ ' buf$=STRING$(help_size%,0) BMOVE help_mem%,V:buf$,LEN(buf$) ' ax%=OB_W(h.elp%,help1&)/z.b%-1 i&=help1& ab%=1 WHILE ab%<=LEN(buf$) a$=@get_line$(ab%) IF ASC(a$)=45 ! "-" put_char(h.elp%,i&,LEFT$(RIGHT$(a$,LEN(a$)-1),ax%)) clr_flags(h.elp%,i&,&H80) INC i& ENDIF EXIT IF i&>help15& WEND DEC i& CLR buf$ WHILE i&<=help15& set_flags(h.elp%,i&,&H80) ! HIDE INC i& WEND RETURN ' FUNCTION get_str(VAR ab%) .| Glob. Var.: buf$,cr$ .| Aufruf in : init_do-26, LOCAL a&,b& b&=INSTR(ab%,buf$,cr$) a&=ab% ab%=b&+2 IF b&>0 RETURN VAL(MID$(buf$,a&,b&-a&)) ELSE RETURN 0 ENDIF ENDFUNC FUNCTION get_line$(VAR ab%) .| Glob. Var.: buf$,cr$ .| Aufruf in : set_help-1,help-1, LOCAL a&,b& b&=INSTR(ab%,buf$,cr$) a&=ab% ab%=b&+2 IF b&>0 RETURN MID$(buf$,a&,b&-a&) ELSE RETURN "" ENDIF ENDFUNC ' ---------------------- Harddisk-Routinen -------------------- PROCEDURE scsicall(op%,block%,cb%,sb%,mp%,cbytes%,flags%) .| Glob. Var.: buf%,scsi_komm%,itar%,target%,bps%,com_blk%,buf2%,geraet% .| h_error%,scsi%,hbyte% .| Ruft auf : alrt,set_crcbuf .| Aufruf in : hard_read_sec-1,hard_write-1,hard_command-1,hard_statistik-1 .| hard_prot-2,hard_ship-2,make_part-1,write_root-1,clr_part-3 .| do_root_cbhd-1,hard_format-3,hard_install-6,hard_noboot-1 .| hard_search-2,hard_restore-3,hard_bad-5,hard_set_bad-1,do_mark_bad-4 .| check_bsl-1,do_mode_sense-4,do_mode_select-1,unit_ready-4 .| hard_test_big-2,root_sec-1,hard_do_copy-2,schreiben-1,search_lesen-1, LOCAL block$,a% ' a%=MIN(128,cb%) ' block$=STRING$(512,0) BMOVE buf%,V:block$,512 ! Puffer retten ' CARD{scsi_komm%}=flags% ! Flagwort CARD{scsi_komm%+2}=itar% ! Initiator CARD{scsi_komm%+4}=target% ! Zieltarget CARD{scsi_komm%+6}=a% ! Anzahl der Blocks IF cb%>128 ~@alrt(3,"Platteninterface kann max. 128 Blöcke.|"+STR$(cb%)+" Blöcke wurden angefordert.",1,"Kapiert") ENDIF CARD{scsi_komm%+8}=bps% ! Blockgrö₧e {scsi_komm%+10}=mp% ! Pufferadresse CARD{scsi_komm%+14}=cbytes% ! Anzahl der Kommandobytes 6-10-12? {scsi_komm%+16}=com_blk% ! Zeiger auf Kommandoblock {scsi_komm%+20}=buf2% ! Messagepuffer ' {com_blk%}=block% ! Blocknummer BYTE{com_blk%}=op% ! Kommando BYTE{com_blk%+1}=BYTE{com_blk%+1} OR geraet%*32 ! Gerät + Blocknummer Hi BYTE{com_blk%+4}=a% ! Sektoranzahl BYTE{com_blk%+5}=sb% ! diverse Flags im Kommando ' h_error%=C:scsi%(L:scsi_komm%) IF op%<>8 ! wenn nicht lesen, dann BMOVE buf%,buf2%,512 BMOVE V:block$,buf%,512 ! Puffer zurück ENDIF ' IF h_error%=0 hbyte%=512 IF op%=8 set_crcbuf ENDIF ELSE CLR hbyte% ENDIF RETURN PROCEDURE hard_err .| Glob. Var.: h_error%,hard%,hbyte%,scsi_komm%,itar%,target%,buf2%,com_blk% .| geraet%,scsi%,h_fehler%,fer%,max_err%,hh_max% .| Felder : scsi_err$(),err_fld$() .| Ruft auf : getistr$,err_max .| Aufruf in : hard_read_sec-1,hard_write-1,hard_command-1 .| hard_mode_select-1,hard_statistik-1,hard_prot-1,hard_ship-1 .| make_part-1,write_root-1,clr_part-2,do_root_cbhd-1,hard_format-2 .| hard_install-5,hard_noboot-1,hard_search-1,hard_restore-3,hard_bad-3 .| hard_set_bad-1,do_mark_bad-4,check_bsl-1,hard_param-1 .| do_mode_select-1,get_root_info-1,unit_ready-3,hard_test_big-2 .| root_sec-2,hard_do_copy-2,schreiben-1,search_lesen-1, LOCAL a$,b$,sc% ' IF h_error%>0 IF hard%=2 IF hbyte%>255 IF (h_error% AND 2)=0 CLR h_error% ELSE h_error%=-1 ENDIF ELSE h_error%=-1 ENDIF ELSE CARD{scsi_komm%}=5 ! Flagwort (wiederholen) CARD{scsi_komm%+2}=itar% ! Initiator CARD{scsi_komm%+4}=target% ! Zieltarget CARD{scsi_komm%+6}=0 ! Anzahl der Blocks CARD{scsi_komm%+8}=512 ! Blockgrö₧e {scsi_komm%+10}=buf2% ! Pufferadresse CARD{scsi_komm%+14}=6 ! Anzahl der Kommandobytes {scsi_komm%+16}=com_blk% ! Zeiger auf Kommandoblock {scsi_komm%+20}=buf2% ! Messagepuffer ' {com_blk%}=0 ! Blocknummer BYTE{com_blk%}=3 ! Kommando: REQUEST SENSE BYTE{com_blk%+1}=geraet%*32 ! Gerät BYTE{com_blk%+4}=16 ! Byteanzahl?? BYTE{com_blk%+5}=0 ! diverse Flags im Kommando sc%=C:scsi%(L:scsi_komm%) ! Kommando verstanden? IF sc%>0 CARD{scsi_komm%}=5 ! nur 4 Byte Antwort CARD{scsi_komm%+2}=itar% CARD{scsi_komm%+4}=target% CARD{scsi_komm%+6}=0 CARD{scsi_komm%+8}=512 {scsi_komm%+10}=buf2% CARD{scsi_komm%+14}=6 {scsi_komm%+16}=com_blk% {scsi_komm%+20}=buf2% {com_blk%}=0 BYTE{com_blk%}=3 ! Kommando: REQUEST SENSE BYTE{com_blk%+1}=geraet%*32 BYTE{com_blk%+4}=4 ! 4 Byte lesen BYTE{com_blk%+5}=0 sc%=C:scsi%(L:scsi_komm%) ENDIF IF sc%=0 ' IF (BYTE{buf2%} AND &H70)=&H70 IF hard%=3 h_fehler%=BYTE{buf2%+12} ELSE h_fehler%=BYTE{buf2%} ENDIF ELSE h_fehler%=h_error% ENDIF ENDIF ELSE h_fehler%=h_error% ENDIF ' IF fer%<max_err%-1 AND h_fehler%<>0 INC fer% b$=" -> Target "+STR$(target%)+" Gerät "+STR$(geraet%) IF h_fehler%>=0 AND h_fehler%<hh_max% a$=STR$(h_fehler%)+" "+@getistr$(h_fehler%,0) ELSE IF h_fehler%>0 a$=STR$(h_fehler%)+" Fehler unbekannt" ELSE a$=STR$(h_fehler%)+" "+scsi_err$(ABS(h_fehler%)) ENDIF ENDIF err_fld$(fer%)=a$+b$ ELSE err_max ENDIF RETURN PROCEDURE hard_message(he%) .| Felder : scsi_err$() .| Ruft auf : getistr$,alrt .| Aufruf in : hard_zero-1,hard_part-1,make_part-1,clr_part-1,hard_format-1 .| hard_noboot-1,hard_save-1,hard_restore-1,hard_bad-1,hard_param-1 .| hard_root-1, LOCAL a$ IF he%>=0 a$=LEFT$(@getistr$(he%,0),32) ELSE a$=scsi_err$(ABS(he%)) ENDIF ~@alrt(1,"Plattenfehler: |"+STR$(he%)+" "+a$,1," Aha ") RETURN ' PROCEDURE hard_read ! Block lesen .| Glob. Var.: ex_obj&,block%,eok&,e.ingabe%,ergebnis&,block_marke% .| Ruft auf : change,do_input,get_char$,term$,hard_read_sec,do_list .| Aufruf in : menu_mess-1,stat_line-1, LOCAL a%,a$,b$ change ex_obj&=@do_input("Block lesen",block%) IF ex_obj&=eok& a$=@get_char$(e.ingabe%,ergebnis&) IF a$<>"" IF a$="*" block_marke%=block% ELSE IF ASC(a$)=42 b$=RIGHT$(a$,LEN(a$)-2) IF MID$(a$,2,1)="-" block%=block_marke%-VAL(b$) ELSE IF MID$(a$,2,1)="+" block%=block_marke%+VAL(b$) ENDIF ENDIF ELSE block%=VAL(a$) ENDIF hard_read_sec(block%) do_list ENDIF ' ENDIF ENDIF RETURN PROCEDURE hard_read_sec(block%) .| Glob. Var.: buf% .| Ruft auf : scsicall,hard_err .| Aufruf in : hard_read-1,get_root-1,viererblock-1,lesen-1, scsicall(8,block%,1,0,buf%,6,4) hard_err RETURN PROCEDURE hard_write ! Block schreiben .| Glob. Var.: a%,block%,el%,buf% .| Ruft auf : eingabe,scsicall,hard_err .| Aufruf in : menu_mess-1, a%=@eingabe("Block schreiben",block%) IF el%>0 AND a%>=0 block%=a% scsicall(10,block%,1,0,buf%,6,2) hard_err ENDIF RETURN PROCEDURE hard_command ! Kommando an DMA-Einheit senden .| Glob. Var.: hd.comm%,hdcmok&,hdcmab&,hdflag4&,hdkmblk&,hdkomv1&,hdcm1& .| hdflag0&,hdflag1&,buf%,buf2%,bps%,j&,i%,code%,hdcm2&,hdcm3&,hdcm4& .| hdcm5&,hdcm6&,hdcm7&,hdcm8&,hdcm9&,hdcm10&,wa$,com_blk% .| Ruft auf : box_draw,form_do,clr_state,objc_update,put_char,cross_rsc .| box_undraw,get_val,alrt,scsicall,hard_err,do_list .| Aufruf in : menu_mess-1, LOCAL h1%,h2%,h3%,h4%,h5%,h6%,h7%,h8%,h9%,anz%,i& LOCAL a%,a$,ex_obj&,com_len%,flg% ' box_draw(hd.comm%) DO ex_obj&=@form_do(hd.comm%) AND &HFF clr_state(hd.comm%,ex_obj&,1) objc_update(hd.comm%,ex_obj&) EXIT IF ex_obj&=hdcmok& OR ex_obj&=hdcmab& OR ex_obj&=hdflag4& objc_update(hd.comm%,hdkmblk&) ' RESTORE hdkom anz%=(ex_obj&-hdkomv1&)*12 WHILE anz%>0 READ a% DEC anz% WEND FOR i&=0 TO 9 READ a% put_char(hd.comm%,hdcm1&+i&,LEFT$(STR$(a%),4)) objc_update(hd.comm%,hdcm1&+i&) NEXT i& READ com_len% READ flg% ' FOR i&=0 TO 4 cross_rsc(hd.comm%,hdflag0&+i&,(flg% AND 2^i&)) objc_update(hd.comm%,hdflag0&+i&) NEXT i& ' LOOP box_undraw(hd.comm%) ' IF ex_obj&=hdcmok& OR ex_obj&=hdflag4& IF (OB_STATE(hd.comm%,hdflag1&) AND 2)>0 ! Puffer mitsenden BMOVE buf%,buf2%,bps% ELSE a$=STRING$(bps%,0) BMOVE V:a$,buf2%,bps% CLR a$ ENDIF ' CLR flg% j&=hdflag0& FOR i%=0 TO 4 IF (OB_STATE(hd.comm%,j&) AND 2)>0 flg%=flg% OR 2^i% ENDIF INC j& NEXT i% ' IF ex_obj&<>hdflag4& code%=@get_val(hd.comm%,hdcm1&) h1%=@get_val(hd.comm%,hdcm2&) h2%=@get_val(hd.comm%,hdcm3&) h3%=@get_val(hd.comm%,hdcm4&) h4%=@get_val(hd.comm%,hdcm5&) h5%=@get_val(hd.comm%,hdcm6&) h6%=@get_val(hd.comm%,hdcm7&) h7%=@get_val(hd.comm%,hdcm8&) h8%=@get_val(hd.comm%,hdcm9&) h9%=@get_val(hd.comm%,hdcm10&) h1%=h1%*65536 h2%=h2%*256 ENDIF a%=1 IF code%=4 a%=@alrt(2,"Das ist ein FORMAT-Kommando!",0,wa$) ENDIF IF a%=1 BYTE{com_blk%+6}=h6% ! diese Parameter gleich setzen BYTE{com_blk%+7}=h7% BYTE{com_blk%+8}=h8% BYTE{com_blk%+9}=h9% IF (flg% AND 4)>0 a$=STRING$(bps%,0) BMOVE V:a$,buf%,bps% CLR a$ ENDIF scsicall(code%,h1%+h2%+h3%,h4%,h5%,buf%,com_len%,flg%) IF (flg% AND 4)>0 ! Returnpuffer ansehen? BMOVE buf2%,buf%,bps% ENDIF hard_err ENDIF do_list ENDIF ' hdkom: DATA 18,0,0,0,48,0,0,0,0,0,6,5 DATA 15,0,0,0,0,0,0,0,0,0,6,5 DATA 5,0,0,0,0,0,0,0,0,0,6,0 DATA 28,0,0,1,4,0,0,0,0,0,6,5 DATA 29,4,0,0,0,0,0,0,0,0,6,5 DATA 6,3,0,1,20,0,0,0,0,0,6,4 DATA 26,0,0,0,50,0,0,0,0,0,6,5 DATA 21,0,0,0,0,0,0,0,0,0,6,2 DATA 30,0,0,0,0,0,0,0,0,0,6,0 RETURN ' PROCEDURE hard_mode_sense ! MODE SENSE .| Glob. Var.: hard% .| Ruft auf : do_mode_sense,show_hard_data,look_ex .| Aufruf in : menu_mess-1, do_mode_sense show_hard_data IF hard%<>2 look_ex ENDIF RETURN PROCEDURE show_hard_data ! HARD Parameter zeigen .| Glob. Var.: hard% .| Ruft auf : hard_param,nix_vortex .| Aufruf in : hard_mode_sense-1, IF hard%<>2 hard_param ELSE nix_vortex ENDIF RETURN ' PROCEDURE hard_mode_select ! MODE SELECT .| Glob. Var.: hard% .| Ruft auf : hard_param,do_mode_select,hard_err,alrt,nix_vortex .| Aufruf in : menu_mess-1, IF hard%<>2 IF hard%<2 hard_param do_mode_select hard_err ELSE ~@alrt(3,"Das geht im Moment nicht|bei SCSI- und VORTEX-Platten.",1,"Abbruch") ENDIF ELSE nix_vortex ENDIF RETURN PROCEDURE hard_statistik ! READ USAGE COUNTER .| Glob. Var.: erg%,buf%,target%,geraet%,buf2%,h_error% .| Ruft auf : scsicall,clr_out,out,hard_err,out_do,show_err_inf .| Aufruf in : menu_mess-1, LOCAL a$ erg%=3 scsicall(17,0,0,0,buf%,6,1+4) clr_out("Statistik (Target "+STR$(target%)+", Gerät "+STR$(geraet%)+")") out("") a$=STR$(CARD{buf2%}*256+BYTE{buf2%+2}) out("Sektorlesezähler : "+a$) a$=STR$(BYTE{buf2%+3}*&H10000+CARD{buf2%+4}) out("Suchzähler : "+a$) out("Nichtkorrigierbare Fehler : "+STR$(BYTE{buf2%+6})) out(" korrigierbare Fehler : "+STR$(BYTE{buf2%+7})) out("Fehler beim Suchen : "+STR$(BYTE{buf2%+8})) hard_err IF h_error%=0 out_do ELSE show_err_inf ENDIF RETURN PROCEDURE hard_prot ! Write protekt Trick .| Glob. Var.: hard%,buf% .| Ruft auf : scsicall,hard_err,alrt .| Aufruf in : menu_mess-1, IF hard%=1 scsicall(26,0,24,0,buf%,6,1+4) ! Mode Sense scsicall(21,0,24,0,buf%,6,2) ! Mode Select hard_err ELSE ~@alrt(1,"Diese Option ist nur bei|Adaptec-Controllern (ATARI-Modus) |anwendbar.",1," Aha ") ENDIF RETURN PROCEDURE hard_ship ! Platten parken .| Glob. Var.: hard%,buf% .| Ruft auf : alrt,scsicall,hard_err,info_line .| Aufruf in : menu_mess-1, LOCAL wwa% wwa%=@alrt(2,"Platte parken?",0,"Parken|Entpark|Abbruch") IF wwa%<3 IF hard%=2 scsicall(31,0,0,0,buf%,6,0) ! VORTEX Park-Befehl ELSE scsicall(27,0,wwa%-1,0,buf%,6,0) ! Rest der Welt ENDIF hard_err info_line ENDIF RETURN PROCEDURE hard_zero ! Partition löschen .| Glob. Var.: platte$,wa$,h_error%,part%,block%,h_fehler% .| Felder : p_start%() .| Ruft auf : no_protekt,alrt,root_sec,part_select,clr_part,hard_set_bad .| hard_message,do_list .| Aufruf in : menu_mess-1, IF @no_protekt=1 IF @alrt(4,"Platte: "+platte$+"|ACHTUNG: Partition löschen?|Daten gehen rettungslos verloren!!",0,wa$)=1 root_sec(1) IF h_error%=0 part%=@part_select IF part%>=0 IF @no_protekt=1 block%=p_start%(part%) clr_part(part%,block%) hard_set_bad ENDIF ENDIF ELSE hard_message(h_fehler%) do_list ENDIF ENDIF ENDIF RETURN ' ---------------------- PROCEDURE hard_part ! Platte partitionieren .| Glob. Var.: h_error%,hi_size%,root$,bps%,buf%,bsl_start%,bsl_count%,p1k& .| p12k&,p.art%,cbhd_found%,pcbhd&,partok&,h_fehler% .| Felder : p_start%(),p_id$() .| Ruft auf : no_protekt,get_root_info,hard_test_big,set_root,put_char .| set_state,clr_state,hard_part_sel,check_part_beginn,do_part .| hard_set_bad,hard_root,hard_message,mnorm .| Aufruf in : menu_mess-1, LOCAL a%,i&,j%,ex_obj& ' IF @no_protekt=1 get_root_info IF h_error%=0 a%=@hard_test_big IF a%>0 hi_size%=a% ENDIF set_root root$=STRING$(bps%,0) BMOVE buf%,V:root$,bps% ! Rootsektor retten ' p_start%(1)=MAX(2,p_start%(1)) bsl_start%=1 ' bsl_count%=MIN(5,bsl_count%) bsl_count%=MIN(31,bsl_count%) !RS: zerstört nicht mein MS-DOS-Medium p_start%(1)=bsl_start%+bsl_count% ' j%=1 FOR i&=p1k& TO p12k& STEP 5 IF p_id$(j%)="" OR p_id$(j%)=" " p_id$(j%)="GEM" ENDIF put_char(p.art%,i&,p_id$(j%)) INC j% NEXT i& ' IF cbhd_found% set_state(p.art%,pcbhd&,1) clr_state(p.art%,pcbhd&+1,1) ENDIF ' ex_obj&=@hard_part_sel ! PART-Dialog = Abbruch IF ex_obj&=partok& check_part_beginn do_part hard_set_bad hard_root ENDIF ELSE hard_message(h_fehler%) ENDIF ENDIF mnorm RETURN PROCEDURE set_part_par ! Partitionsinfo setzen .| Glob. Var.: part_oben%,p1s&,p12s&,bps%,a%,p.art%,prest& .| Felder : p_size%() .| Ruft auf : put_char,objc_update,add_size .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-2,part_gleiche-1, LOCAL a$,a#,b%,i&,j% ' 12 sichtbare Partitionen setzen j%=part_oben% FOR i&=p1s& TO p12s& STEP 5 b%=1024/MAX(512,bps%)*1024 a%=INT(p_size%(j%)/b%*100+0.05) a$=RIGHT$(" "+STR$(a%),5) put_char(p.art%,i&,a$) objc_update(p.art%,i&) INC j% NEXT i& add_size objc_update(p.art%,prest&) RETURN PROCEDURE part_slide ! Slider im Part-Dialog .| Glob. Var.: p.art%,partsli1&,partsli2&,part_oben%,max_part% .| Ruft auf : get_id,get_value,objc_update,set_part_dial,set_part_par .| Aufruf in : hard_part_sel-1, LOCAL a%,c%,h%,yk%,hk% ' a%=GRAF_SLIDEBOX(p.art%,partsli1&,partsli2&,1) ! Slider bewegen get_id(part_oben%) ! IDs auslesen get_value(part_oben%) ' hk%=OB_H(p.art%,partsli2&) ! Höhe des Sliders holen h%=OB_H(p.art%,partsli1&) ! Höhe des Slider-Vaters holen yk%=OB_H(p.art%,partsli1&) ! y-Koordinate Vater-Objects holen IF a%>0 c%=(h%-hk%)/1000*a% ELSE CLR c% ENDIF ' OB_Y(p.art%,partsli2&)=c% ! neue Relative y-Koordinate des Sliders setzen objc_update(p.art%,partsli1&) ! Neu zeuchnen ' ! Pointer "oben" neu setzen part_oben%=MAX(1,((max_part%-13)/1000)*a%+1) set_part_dial(part_oben%) set_part_par ! Und die restlichen Parameter RETURN PROCEDURE add_size ! alle Partitionen zusammen zählen .| Glob. Var.: bps%,p.art%,prest& .| Ruft auf : get_rest,put_char .| Aufruf in : set_part_par-1,hard_part_sel-1, LOCAL a$,b%,a# b%=1024/MAX(512,bps%)*1024 a#=INT(@get_rest/b%*100) a$=RIGHT$(" "+STR$(a#),7) put_char(p.art%,prest&,a$) RETURN FUNCTION get_rest ! Rest feststellen (Partitionieren) .| Glob. Var.: s_total%,max_part%,hi_size% .| Felder : p_start%(),p_size%() .| Aufruf in : add_size-1, LOCAL i% s_total%=p_start%(1) FOR i%=1 TO max_part% ADD s_total%,p_size%(i%) NEXT i% RETURN hi_size%-s_total% ENDFUNC ' PROCEDURE part_slide_page ! Slider im Part-Dialog .| Glob. Var.: my%,part_oben%,yvv%,p.art%,partsli2&,partsli1&,max_part%,ab% .| np% .| Ruft auf : get_id,get_value,objc_update,set_part_dial,set_part_par .| Aufruf in : hard_part_sel-1, LOCAL h%,hk%,y%,yk% ' my%=MOUSEY get_id(part_oben%) ! IDs auslesen get_value(part_oben%) ' yvv%=OB_Y(p.art%,1)+OB_Y(p.art%,0) ! y-Offset Vater hk%=OB_H(p.art%,partsli2&) ! Höhe des Sohn holen h%=OB_H(p.art%,partsli1&) ! Höhe des Slider-Vaters holen y%=OB_Y(p.art%,partsli2&) ! y-Koordinate Sohn-Object ' IF yvv%+y%+hk%<my% part_oben%=MIN(max_part%-12,part_oben%+12) IF ab%>0 part_oben%=max_part%-12 ENDIF ELSE part_oben%=MAX(1,part_oben%-12) IF ab%>0 part_oben%=1 ENDIF ENDIF np%=h%/60*part_oben%-2 OB_Y(p.art%,partsli2&)=np% ! neue Relative y-Koordinate des Sliders setzen objc_update(p.art%,partsli1&) ! Vater ' set_part_dial(part_oben%) set_part_par ! Und die restlichen Parameter RETURN PROCEDURE set_part_dial(part_oben%) .| Glob. Var.: p1n&,p12n&,p.art%,p1k&,p12k&,a$ .| Felder : p_id$() .| Ruft auf : put_wert,objc_update,put_char .| Aufruf in : part_slide-1,part_slide_page-1,part_gleiche-1, LOCAL j&,i& ' ! Pointer "oben" neu setzen j&=part_oben% ! und Nummern vorne neu stzen FOR i&=p1n& TO p12n& STEP 5 put_wert(p.art%,i&,j&,2) objc_update(p.art%,i&) INC j& NEXT i& j&=part_oben% ! danach IDs neu setzen FOR i&=p1k& TO p12k& STEP 5 a$=p_id$(j&) IF a$="" OR a$=" " a$="GEM" ENDIF put_char(p.art%,i&,a$) objc_update(p.art%,i&) INC j& NEXT i& RETURN ' FUNCTION hard_part_sel ! Part-Dialog .| Glob. Var.: part_oben%,p.art%,partitel&,platte$,partsli1&,partsli2& .| pvariabl&,prest&,partok&,partab&,max_part%,hi_size% .| Felder : p_size%(),p_id$() .| Ruft auf : put_char,box_draw,set_part_par,form_do,part_slide_page .| part_slide,clr_state,part_gleiche,get_value,add_size,objc_update,alrt .| get_id,box_undraw .| Aufruf in : hard_part-1, LOCAL a%,ab%,akt%,ex_obj&,s%,i& ' part_oben%=1 put_char(p.art%,partitel&,LEFT$(platte$,20)) box_draw(p.art%) REPEAT set_part_par DO ex_obj&=@form_do(p.art%) ab%=ex_obj& AND &HFF00 ex_obj&=ex_obj& AND &HFF ' SELECT ex_obj& CASE partsli1& part_slide_page ! Slider CASE partsli2& part_slide ! Sliderbewegung CASE pvariabl& clr_state(p.art%,ex_obj&,1) part_gleiche CASE prest& get_value(part_oben%) add_size ENDSELECT ' EXIT IF ex_obj&=partok& OR ex_obj&=partab& set_part_par LOOP clr_state(p.art%,ex_obj&,1) objc_update(p.art%,ex_obj&) ' get_value(part_oben%) ' CLR s% FOR i&=1 TO max_part% ADD s%,p_size%(i&) ' IF p_size%(i&)<32768 AND p_id$(i&)="BGM" IF p_size%(i&)<=dos_max_sectors% AND p_id$(i&)="BGM" p_id$(i&)="GEM" ENDIF ' IF p_size%(i&)>32767 AND p_id$(i&)="GEM" IF p_size%(i&)>dos_max_sectors% AND p_id$(i&)="GEM" p_id$(i&)="BGM" ENDIF NEXT i& ' IF s%>hi_size% AND ex_obj&=partok& ~@alrt(3,"Sie sollten sich die 'Rest-Anzeige' ansehen!",1,"Nochmal") CLR ex_obj& ENDIF ' UNTIL ex_obj&=partab& OR ex_obj&=partok& ' get_id(part_oben%) ! IDs auslesen get_value(part_oben%) ! Grö₧en auslesen box_undraw(p.art%) clr_state(p.art%,ex_obj&,1) ' RETURN ex_obj& ENDFUNC FUNCTION part_select ! Partition auswählen .| Glob. Var.: p.sel%,psnummer&,pselabb&,pselok&,psmin&,psmax&,part_total% .| Ruft auf : put_char,box_draw,form_do,clr_state,objc_update,box_undraw .| Aufruf in : hard_zero-1,hard_install-1, LOCAL ab%,i%,ex_obj& ab%=1 put_char(p.sel%,psnummer&,"1") box_draw(p.sel%) DO ex_obj&=@form_do(p.sel%) AND &HFF EXIT IF ex_obj&=pselabb& OR ex_obj&=pselok& SELECT ex_obj& CASE psmin& ab%=MAX(ab%-1,1) CASE psmax& ab%=MIN(part_total%,ab%+1) ENDSELECT clr_state(p.sel%,ex_obj&,1) put_char(p.sel%,psnummer&,STR$(ab%)) objc_update(p.sel%,psnummer&) objc_update(p.sel%,ex_obj&) LOOP box_undraw(p.sel%) clr_state(p.sel%,ex_obj&,1) IF ex_obj&<>pselabb& RETURN ab% ! 1-xxx ELSE RETURN -1 ENDIF ENDFUNC ' PROCEDURE part_gleiche ! n gleiche Partitionen .| Glob. Var.: p.art%,el%,hi_size%,max_part%,part_oben% .| Felder : p_size%(),p_id$() .| Ruft auf : box_undraw,eingabe,box_draw,set_part_dial,set_part_par .| Aufruf in : hard_part_sel-1, LOCAL anz%,psize%,i% box_undraw(p.art%) anz%=@eingabe("Anzahl der Partitionen:",0) IF el%>0 IF anz%>0 AND anz%<15 psize%=INT((hi_size%-anz%)/anz%) FOR i%=1 TO anz% p_size%(i%)=psize% IF p_size%(i%)<32768 p_id$(i%)="GEM" ELSE p_id$(i%)="BGM" ENDIF NEXT i% FOR i%=anz%+1 TO max_part% p_size%(i%)=0 NEXT i% ENDIF ENDIF box_draw(p.art%) set_part_dial(part_oben%) set_part_par RETURN PROCEDURE get_id(j%) ! Partitions IDs auslesen .| Glob. Var.: p1k&,p12k&,p.art% .| Felder : p_id$() .| Ruft auf : get_char$ .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-1, LOCAL i& FOR i&=p1k& TO p12k& STEP 5 p_id$(j%)=@get_char$(p.art%,i&) INC j% NEXT i& RETURN PROCEDURE get_value(j%) ! Partitionsgrö₧en auslesen .| Glob. Var.: p1s&,p12s&,p.art% .| Felder : p_size%() .| Ruft auf : get_char$ .| Aufruf in : part_slide-1,part_slide_page-1,hard_part_sel-3, LOCAL i%,a#,a$ ' FOR i%=p1s& TO p12s& STEP 5 a$=LEFT$(@get_char$(p.art%,i%)+" ",5) a#=VAL(LEFT$(a$,3)+"."+RIGHT$(a$,2)) p_size%(j%)=(a#*1024*1024)/512 INC j% NEXT i% RETURN ' ---------------------- PROCEDURE make_part(m%) ! 1 Partition anlegen .| Glob. Var.: hi_spc%,boot.raw%,buf%,hi_spt%,hi_dhc%,block%,h_error% .| h_fehler% .| Felder : p_size%(),p_start%() .| Ruft auf : scsicall,hard_err,clr_part,hard_message .| Aufruf in : do_part-1,xgm_part-5,do_part_cbhd-1, LOCAL a$,bps_2%,i%,j%,len_dir%,len_fat% ' hi_spc%=2 a$=STRING$(512,0) ! Bootsektor löschen BMOVE V:a$,buf%,512 bps_2%=512 j%=p_size%(m%) IF j%=dos_max_sectors%+1 THEN !RS: um die Cluster klein zu halten DEC j% ENDIF WHILE j%>dos_max_sectors% ! Logische Sektorgrö₧e berechnen DIV j%,2 ADD bps_2%,bps_2% IF j%=dos_max_sektors%+1 THEN !RS: um die Cluster klein zu halten DEC j% ENDIF WEND ' CARD{buf%}=&HEB3C ! INTEL short jump BYTE{buf%+2}=&H90 ! CHAR{buf%+3}="SED56" ! Name i%=XBIOS(17) ! Random() CARD{buf%+&H8}=ROL&(i%,8) ! Seriennummer BYTE{buf%+&HA}=SHR(i%,16) BYTE{buf%+11}=bps_2% MOD 256 ! BPS = log. Sektorgrö₧e BYTE{buf%+12}=bps_2% DIV 256 BYTE{buf%+13}=hi_spc% ! Sektoren/Cluster BYTE{buf%+14}=1 ! Anzahl reservierter Sektoren BYTE{buf%+15}=0 BYTE{buf%+16}=2 ! Anzahl der FATs len_dir%=MAX(256,bps_2%/32) ! 256 Einträge von 512-8192 Byte/Sektor BYTE{buf%+17}=len_dir% MOD 256 ! Einträge im Wurzelverzeichnis BYTE{buf%+18}=len_dir% DIV 256 BYTE{buf%+19}=j% MOD 256 ! Anzahl der Sektoren BYTE{buf%+20}=j% DIV 256 BYTE{buf%+21}=&HF8 ! MEDIA ' Sektoren je FAT len_fat%=(((((j%-1-len_dir%) DIV hi_spc%)+2)*2)+bps_2%-1) DIV bps_2% IF len_fat%>((((((j%-1-2*(len_fat%-1)-len_dir%) DIV hi_spc%)+2)*2)+bps_2%-1) DIV bps_2%) DEC len_fat% ENDIF BYTE{buf%+22}=len_fat% MOD 256 ! Sektoren je FAT BYTE{buf%+23}=len_fat% DIV 256 BYTE{buf%+24}=hi_spt% ! Sektoren pro Track BYTE{buf%+25}=0 BYTE{buf%+26}=hi_dhc% ! Anzahl der Köpfe BYTE{buf%+27}=0 CARD{buf%+28}=0 ! versteckte Sektoren ' Erweiterter Bootsektor wie MS-DOS 4.00 ' In spt% und heads% mu₧ die vom PC-Controller simulierte Anzahl stehen! CARD{buf%+&H18}=ROL&(32,8) ! Sektoren pro Spur (INTEL-Format) CARD{buf%+&H1A}=ROL&(64,8) ! Köpfe (INTEL-Format) LONG{buf%+&H1C}=SHL(ROL&(p_start%(m%),8),16)+ROL&(SHR(p_start%(m%),16),8) !versteckte Sektoren (INTEL-Format) IF j%>=65536 THEN BYTE{buf%+&H13}=0 ! Anzahl der Sektoren BYTE{buf%+&H14}=0 LONG{buf%+&H20}=SHL(ROL&(j%,8),16)+ROL&(SHR(j%,16),8) !Sektoren (INTEL-Format) ELSE LONG{buf%+&H20}=0 ENDIF BYTE{buf%+&H24}=0 ! physikalische Laufwerksnummer für MS-DOS BYTE{buf%+&H25}=0 ! für MS-DOS reserviert BYTE{buf%+&H26}=&H29 ! Kennung für erweiterten BPB i%=GEMDOS(44) ! Tgettime() BYTE{buf%+&H27}=i% ! Seriennummer BYTE{buf%+&H28}=SHR(i%,8) i%=GEMDOS(42) ! Tgetdate() BYTE{buf%+&H29}=i% ! noch Seriennummer BYTE{buf%+&H2A}=SHR(i%,8) CHAR{buf%+&H2B}=" FAT16 " ! Medienname und FAT-Typ CARD{buf%+&H1FE}=&H1235-@chk_sum ! ungültige Prüfsumme für Atari ' ------------------------------------- block%=p_start%(m%) ! Blocknummer holen WHILE bps_2%>0 scsicall(10,block%,1,0,buf%,6,2) ! schreibe Bootsektor hard_err EXIT IF h_error%<>0 INC block% ! und evtl. Sektoren bis log.SEKTOR 1 a$=STRING$(512,0) ! löschen BMOVE V:a$,buf%,512 SUB bps_2%,512 WEND IF h_error%=0 clr_part(m%,p_start%(m%)) ! ab Block%+1 schreiben ' RS: Der Cluster, in dem der Sektor an der Vorzeichengrenze der ' GEMDOS-Sektorpuffer liegt, wird in der FAT als defekt markiert. ' Gehört in hard_set_bad, damit es auch bei »Partition löschen« ' aufgerufen wird. Ich wei₧ jetzt nur nicht, wie ich an die nötigen ' Variablen rankomme. i%=1+2*len_fat%+len_dir%+(-2*hi_spc%+&H7FFF) IF j%>=i% THEN do_mark_bad(p_start%(m%)+i%*bps_2%/512) ENDIF ELSE hard_message(h_fehler%) ENDIF CLR a$ RETURN PROCEDURE do_part ! Partitionen anlegen .| Glob. Var.: p.art%,pcbhd&,part% .| Felder : p_size%() .| Ruft auf : do_part_cbhd,do_root_cbhd,alrt,xgm_part,clear_root,set__pid .| write_root,make_part .| Aufruf in : hard_part-1, LOCAL i% ' IF (OB_STATE(p.art%,pcbhd&) AND 1)<>0 IF part%<13 do_part_cbhd do_root_cbhd ELSE ~@alrt(4,"Nur bis max. 12 Partitionen!",1,"Abbruch") ENDIF ELSE IF part%>4 xgm_part(1,part%,0) ! XGM ... ELSE clear_root ! Rootsektor erstellen im Puffer FOR i%=1 TO 4 ! normal IF p_size%(i%)>0 set__pid(i%-1,i%,0) ENDIF NEXT i% write_root(0) FOR i%=1 TO 4 IF p_size%(i%)>0 make_part(i%) ENDIF NEXT i% ENDIF ENDIF RETURN PROCEDURE xgm_part(pfirst%,plast%,xgmoffset%) .| Felder : p_start%(),p_size%() .| Ruft auf : clear_root,set__pid,write_root,make_part,set_xpid,xgm_part .| Aufruf in : do_part-1,xgm_part-2, LOCAL currblock%,x1% ' clear_root ! Rootsektor erstellen im Puffer IF pfirst%=plast% ! letzten XGM-ROOT-Sektor schreiben currblock%=p_start%(pfirst%) INC p_start%(pfirst%) DEC p_size%(pfirst%) set__pid(0,pfirst%,currblock%) write_root(currblock%) make_part(pfirst%) ELSE IF pfirst%=1 ! ersten ROOT-Sektor schreiben set__pid(0,pfirst%,0) set_xpid(1,pfirst%+1,0) set__pid(2,plast%-1,0) set__pid(3,plast%,0) write_root(0) make_part(pfirst%) make_part(plast%-1) make_part(plast%) xgm_part(pfirst%+1,plast%-2,p_start%(pfirst%+1)) ELSE currblock%=p_start%(pfirst%) ! XGM-ROOT-Sektor schreiben INC p_start%(pfirst%) DEC p_size%(pfirst%) set__pid(0,pfirst%,currblock%) ! GEM-Eintrag set_xpid(1,pfirst%+1,xgmoffset%) ! XGM-Eintrag write_root(currblock%) ! und schreiben make_part(pfirst%) ! BOOT+FAT-Sektoren xgm_part(pfirst%+1,plast%,xgmoffset%) ENDIF ENDIF RETURN PROCEDURE set__pid(num%,a%,cblock%) .| Glob. Var.: buf% .| Felder : p_id$(),p_start%(),p_size%() .| Aufruf in : do_part-1,xgm_part-5, LOCAL x1% x1%=buf%+&H1C6+num%*12 BYTE{x1%}=1 BMOVE V:p_id$(a%),x1%+1,3 ! Kennung {x1%+4}=p_start%(a%)-cblock% ! Start {x1%+8}=p_size%(a%) ! Size RETURN PROCEDURE set_xpid(num%,a%,xgmo%) .| Glob. Var.: buf% .| Felder : p_start%(),p_size%() .| Aufruf in : xgm_part-2, LOCAL x1% x1%=buf%+&H1C6+num%*12 BYTE{x1%}=1 BYTE{x1%+1}=ASC("X") BYTE{x1%+2}=ASC("G") BYTE{x1%+3}=ASC("M") {x1%+4}=p_start%(a%)-xgmo% {x1%+8}=p_size%(a%) RETURN PROCEDURE clear_root ! ROOT-Sektor im Speicher erstellen .| Glob. Var.: buf% .| Ruft auf : set_rootdaten .| Aufruf in : do_part-1,xgm_part-1,do_root_cbhd-1, LOCAL a$ a$=STRING$(512,0) BMOVE V:a$,buf%,LEN(a$) set_rootdaten CLR a$ RETURN PROCEDURE write_root(block%) ! ROOT Sektor schreiben .| Glob. Var.: buf% .| Ruft auf : scsicall,hard_err .| Aufruf in : do_part-1,xgm_part-3, scsicall(10,block%,1,0,buf%,6,2) hard_err RETURN PROCEDURE check_part_beginn ! PART: letzte Partition ermitteln .| Glob. Var.: max_part%,part% .| Felder : p_size%(),p_start%() .| Aufruf in : hard_part-1, LOCAL i% i%=max_part% WHILE p_size%(i%)=0 AND i%>1 DEC i% WEND part%=i% ! letzte Partition i%=2 WHILE i%<=part% p_start%(i%)=p_start%(i%-1)+p_size%(i%-1) INC i% WEND RETURN PROCEDURE clr_part(m%,block%) ! Partition löschen .| Glob. Var.: buf%,bps_2%,h_error%,bps%,h_fehler% .| Ruft auf : mdisk,scsicall,readmot,hard_err,hard_message,lesen,do_list .| Aufruf in : hard_zero-1,make_part-1, LOCAL ab%,anf_fat1%,i%,ph_sektors%,tm%,x1%,a$ ' mdisk scsicall(8,block%,1,0,buf%,6,4) ! Bootsektor der Partition lesen bps_2%=@readmot(11) ! Bytes pro Sektor ! anf_fat1%=@readmot(14) ! Anzahl reservierter Sektoren x1%=anf_fat1%-1+@readmot(22)*BYTE{buf%+16}+@readmot(17)*32/bps_2% a$=STRING$(bps_2%,0) ! Leerstring zum Puffer löschen BMOVE V:a$,buf%,bps_2% ! String in Buffer CLR a$ CLR h_error% ph_sektors%=bps_2%/512 tm%=MALLOC(x1%*ph_sektors%) ab%=anf_fat1%*ph_sektors% IF tm%=0 OR x1%*ph_sektors%>127 FOR i%=ab% TO ab%+x1%*ph_sektors%-1 scsicall(10,block%+i%,1,0,buf%,6,2) ! FAT+DIR schreiben hard_err EXIT IF h_error%<>0 NEXT i% ELSE FOR i%=0 TO x1%-1 BMOVE buf%,tm%+i%*bps_2%,bps_2% NEXT i% scsicall(10,block%+ab%,x1%*ph_sektors%,0,tm%,6,2) hard_err ENDIF IF tm%>0 ~MFREE(tm%) ENDIF IF h_error%<>0 hard_message(h_fehler%) ENDIF lesen do_list RETURN ' PROCEDURE do_part_cbhd ! Partitionen schreiben .| Glob. Var.: part%,e.l%,m% .| Felder : po_start%(),p_start%(),po_size%(),p_size%() .| Ruft auf : eingabe,make_part .| Aufruf in : do_part-1, LOCAL a%,i%,mp% i%=1 WHILE po_start%(i%)=p_start%(i%) AND po_size%(i%)=p_size%(i%) AND i%<part% INC i% WEND a%=1 IF i%<>1 a%=@eingabe("Ab Partition",i%) ENDIF IF e.l%>0 OR a%>part%+1 OR a%<1 mp%=99 ELSE mp%=a% ENDIF ' IF mp%<99 FOR m%=mp% TO part% IF p_size%(m%)>0 make_part(m%) ENDIF NEXT m% ENDIF RETURN PROCEDURE do_root_cbhd ! Rootsektor generieren .| Glob. Var.: buf%,ext_magic%,bsl_start%,bsl_count% .| Felder : p_size%(),p_id$(),p_start%() .| Ruft auf : clear_root,scsicall,hard_err .| Aufruf in : do_part-1, LOCAL i%,x1% clear_root FOR i%=0 TO 11 x1%=buf%+&H1C6+i%*12+(i%>3)*&HA0 IF p_size%(i%+1)>0 BYTE{x1%}=1 ! Exist-Flag BMOVE V:p_id$(i%+1),x1%+1,3 ! Kennung {x1%+4}=p_start%(i%+1) ! Start {x1%+8}=p_size%(i%+1) ! Size ELSE {x1%}=0 ! Nicht benützte Partitionen löschen {x1%+4}=0 {x1%+8}=0 ENDIF NEXT i% BYTE{buf%+&H151}=1 ! Root-Version 1 {buf%+&H152}=ext_magic% ! --> "CBHD" {buf%+&H1F6}=bsl_start% {buf%+&H1FA}=bsl_count% scsicall(10,0,1,0,buf%,6,2) ! Schreibe Rootsector hard_err RETURN ' ---------------------- PROCEDURE hard_format ! Platte formatieren .| Glob. Var.: wa$,root$,bps%,buf%,bsl_start%,bsl_count%,bsl$,target% .| geraet%,platte$,buf2%,hard%,pt%,hi_in%,b.ox%,boxtxt&,boxaktiv& .| h_fehler%,j% .| Ruft auf : alrt,no_protekt,root_sec,hard_param,do_mode_select,put_char .| box_draw,mdisk,scsicall,hard_err,mnorm,box_undraw,hard_message .| set_root,hdx_bad .| Aufruf in : menu_mess-1, LOCAL a%,b%,c%,i%,t%,a$ ' IF @alrt(2,"Harddisk formatieren?",0,wa$)=1 IF @no_protekt=1 root_sec(1) root$=STRING$(bps%,0) BMOVE buf%,V:root$,bps% ' bsl_start%=1 bsl_count%=1 bsl$=STRING$(bps%,0) BYTE{V:bsl$+3}=&HA5 ! Leere BSL generieren ' ---------------- IF @alrt(2,"FORMATIEREN Letzte Chance:|Target:"+STR$(target%)+" Geraet:"+STR$(geraet%)+"| "+platte$,0,wa$)=1 hard_param {buf2%}=8 ! Länge der Extent Descriptor List {buf2%+4}=0 BYTE{buf2%+8}=0 IF hard%<>2 do_mode_select ENDIF IF pt%>0 b%=pt%*256+2*65536 ELSE CLR b% ENDIF b%=b%+(hi_in% DIV 256) c%=hi_in% MOD 256 IF hard%=2 OR hard%=3 CLR b% ENDIF {buf2%}=0 ' put_char(b.ox%,boxtxt&,"Festplatte formatieren") put_char(b.ox%,boxaktiv&,platte$) box_draw(b.ox%) mdisk scsicall(4,b%,c%,0,buf%,6,8) ! Format Drive hard_err mnorm box_undraw(b.ox%) IF h_fehler%<>0 hard_message(h_fehler%) ELSE BMOVE V:root$,buf%,bps% ! Rootsektor zurück in Puffer set_root ! Daten rein ' ! 1 Partition schreiben {buf%+&H1C6}=&H147454D ! FLAG=1 + "GEM" a%=1 ! Start normal ab Block 1 IF bsl_start%=1 a%=bsl_start%+bsl_count% ! sonst eventuell nach BSL ENDIF {buf%+&H1CA}=a% ! für P_start(0) {buf%+&H1CE}=255 ! Dummy-Partitions-Länge ' FOR t%=buf%+&H156 TO buf%+&H1AE STEP 4 {t%}=0 NEXT t% FOR t%=buf%+&H1D2 TO buf%+&H1F2 STEP 4 {t%}=0 NEXT t% ! Rest des Rootsektors löschen {buf%+&H1F6}=bsl_start% {buf%+&H1FA}=bsl_count% BYTE{buf%+&H151}=1 ! Root-Version 1 IF hard%=2 PAUSE 400 ! Vortex !! ENDIF scsicall(10,0,1,0,buf%,6,2) ! Write Rootsector hard_err ' --------------- BSL schreiben CLR j% FOR i%=bsl_start% TO bsl_start%+bsl_count%-1 BMOVE (V:bsl$)+j%,buf%,bps% scsicall(10,i%,1,0,buf%,6,2) ADD j%,bps% NEXT i% CLR bsl$ ' ------------------------------ hdx_bad ! zerstörender TEST ! ' ------------------------------ ENDIF ENDIF ENDIF ENDIF RETURN ' PROCEDURE hard_install ! Plattentreiber installieren .| Glob. Var.: wa$,h_error%,buf%,part%,max_part%,block%,ab%,b$,root.raw% .| bps%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%,hi_lz%,hi_rt%,hi_in%,hi_spt% .| hi_size%,bsl_start%,bsl_count%,ext_magic%,cbhd_found%,boot.raw%,fi$ .| sed_pfad$,f_pexec%,ziel$,punptr%,target%,pfad$ .| Felder : p_block%(),p_flag%(),p_start%(),p_size%() .| Ruft auf : alrt,no_protekt,root_sec,part_select,scsicall,hard_err .| do_pexec,pexec,do_file_copy,datei_copy,hard_root .| Aufruf in : menu_mess-1, LOCAL a%,i%,j%,x%,bd$,rx$,root% ' IF @alrt(2,"Platte bootbar machen?",1,wa$)=1 IF @no_protekt=1 REPEAT root_sec(1) EXIT IF h_error%<>0 ' root%=&H150 rx$=STRING$(512-root%,0) BMOVE buf%+root%,V:rx$,LEN(rx$) ! Installieren von altem CBHD-Format ' ' ------------------------------ part%=@part_select ! Welche Partition bootbar? EXIT IF part%<=0 ' IF p_block%(part%)>0 ~@alrt(1,"Diese Partition kann nicht|bootfähig gemacht werden. ",1,"Abbruch") ENDIF EXIT IF p_block%(part%)<>0 ' FOR i%=1 TO max_part% p_flag%(i%)=p_flag%(i%) AND (NOT &H80) NEXT i% p_flag%(part%)=p_flag%(part%) OR &H80 ' ------------------------------ ' block%=p_start%(part%) scsicall(8,block%,1,0,buf%,6,4) ! Bootsektor lesen hard_err EXIT IF h_error%<>0 ! Fehler? ' bd$=STRING$(22,0) BMOVE buf%+8,V:bd$,LEN(bd$) ! wichtige BOOT-Daten retten ' ab%=BYTE{buf%+1} ! xx Bytes nach 60xx retten wegen c't b$=STRING$(ab%,0) BMOVE buf%+2,V:b$,LEN(b$) ! steht in B$ BMOVE root.raw%,buf%,bps% ! Rootsektor in Puffer rein BMOVE buf%+2,V:b$,LEN(b$) ! und gerettete Daten (c't) CLR b$ BMOVE V:rx$,buf%+root%,LEN(rx$) ! Partinfo wieder rein ' CARD{buf%+&H1B6}=hi_cc% ! Zylinder BYTE{buf%+&H1B8}=hi_dhc% ! Köpfe CARD{buf%+&H1BA}=hi_rwcc% ! 1. Spur mit reduziertem Schreibstrom CARD{buf%+&H1BC}=hi_wpc% ! " " Vorkompensation BYTE{buf%+&H1BE}=hi_lz% ! Breite der Parkzone BYTE{buf%+&H1BF}=hi_rt% ! Steprate BYTE{buf%+&H1C0}=hi_in% ! Interleave BYTE{buf%+&H1C1}=hi_spt% ! Sektoren pro Track {buf%+&H1C2}=hi_size% ! Grö₧e der Platte {buf%+&H1F6}=bsl_start% ! BSL {buf%+&H1FA}=bsl_count% ! BSL BYTE{buf%+&H151}=1 ! Root_vers% {buf%+&H152}=ext_magic% ! CBHD ' IF cbhd_found%>0 FOR i%=0 TO 11 x%=buf%+&H1C6+i%*12+(i%>3)*&HA0 IF p_size%(i%+1)>0 BYTE{x%}=p_flag%(i%+1) ELSE BYTE{x%}=0 ENDIF NEXT i% ENDIF ' ~XBIOS(18,L:buf%,L:-1,-1,1) ! MAGIC scsicall(10,0,1,0,buf%,6,2) ! 1. Rootsektor schreiben hard_err IF cbhd_found%=0 ! AHDI 3.0 ' FOR i%=1 TO max_part% IF p_size%(i%)>0 ! Partition existiert? ' block%=p_block%(i%) ! ROOTSEKTOR lesen scsicall(8,block%,1,0,buf%,6,4) hard_err ' IF block%<>0 BYTE{buf%+&H1C6}=p_flag%(i%) ! FLAG schreiben!! ELSE FOR j%=0 TO 3 ! richtigen Eintrag suchen x%=&H1C6+j%*12 IF {buf%+x%+4}=p_start%(i%) BYTE{buf%+x%}=p_flag%(i%) ENDIF NEXT j% ENDIF IF i%=part% ~XBIOS(18,L:buf%,L:-1,-1,1) ! MAGIC ENDIF scsicall(10,block%,1,0,buf%,6,2) ! Rootsektor schreiben hard_err ' ENDIF NEXT i% ENDIF ' block%=p_start%(part%) scsicall(8,block%,1,0,buf%,6,4) ! Bootsektor lesen hard_err BMOVE boot.raw%,buf%,bps% ! Bootprogramm in Puffer BMOVE V:bd$,buf%+8,LEN(bd$) ! wichtige Daten rein ~XBIOS(18,L:buf%,L:4097*4096,-1,1) ! ausführbar scsicall(10,block%,1,0,buf%,6,2) ! Bootsektor schreiben ' ----------------------------- fi$=sed_pfad$+"CBHD.SYS" IF EXIST(fi$)=TRUE do_pexec(fi$) ! Treiber starten ELSE pexec ! Treiber suchen+starten ENDIF IF f_pexec%<0 ~@alrt(1,"Treiber (CBHD.SYS) |bitte selber kopieren",1," OK ") ELSE CLR ziel$ punptr%=LPEEK(&H516) FOR i%=0 TO 15 x%=BYTE{punptr%+i%+2} EXIT IF x%<>&HFF AND x%=target% NEXT i% IF i%<>16 ziel$=CHR$(i%+part%-1+65)+":\"+"CBHD.SYS" ENDIF IF EXIST(fi$)=TRUE AND ziel$<>"" do_file_copy(fi$,ziel$) ! Treiber automatisch kopieren ELSE pfad$="A:\" datei_copy ! Treiber von Hand kopieren ENDIF ENDIF ' ----------------------------- UNTIL 1 hard_root ENDIF ENDIF RETURN PROCEDURE hard_noboot ! Plattentreiber entfernen .| Glob. Var.: wa$,chk_sum%,h_error%,buf%,h_fehler% .| Ruft auf : alrt,no_protekt,root_sec,chk_sum,scsicall,hard_err .| hard_message .| Aufruf in : menu_mess-1, IF @alrt(2,"Booten von der Platte abstellen?",1,wa$)=1 IF @no_protekt=1 root_sec(1) chk_sum%=@chk_sum IF h_error%=0 IF chk_sum%<>&H1234 ~@alrt(1,"Platte ist nicht bootfähig!",1," Aha ") ELSE CARD{buf%+510}=(chk_sum%-1) AND &HFFFF scsicall(10,0,1,0,buf%,6,2) ! schreibe Rootsektor hard_err ENDIF ELSE hard_message(h_fehler%) ENDIF ENDIF ENDIF RETURN ' PROCEDURE hard_search ! DMA-Bus durchsuchen .| Glob. Var.: target%,geraet%,erg%,b$,hard%,buf%,h_error%,buf2%,h_fehler% .| Felder : dma%(),scsi_err$() .| Ruft auf : clr_out,mtasse,set_hard,scsicall,hard_err,getistr$,out,mnorm .| out_do,set_last .| Aufruf in : menu_mess-1, LOCAL a%,b%,ab%,a$ a%=target% ! alten Zustand merken b%=geraet% erg%=3 b$=STRING$(24,0) clr_out("Platten suchen ...") mtasse FOR target%=0 TO 15 FOR geraet%=0 TO 1 IF dma%(target%*2+geraet%)>0 a$="Target:"+RIGHT$("0"+STR$(target%),2)+" Gerät:"+STR$(geraet%)+" " hard%=@set_hard(target%) scsicall(0,0,0,0,buf%,6,0) ! UNIT READY hard_err IF h_error%=0 scsicall(18,0,56,0,buf%,6,5) ! INQUIRY IF h_error%=0 BMOVE buf2%+8,V:b$,24 a$=a$+b$ ELSE a$=a$+"SASI (Adaptec 4000/4070 o.ä.)" ENDIF ELSE IF h_fehler%>0 AND h_error%<>-8 a$=a$+@getistr$(ABS(h_fehler%),0) ELSE a$=a$+scsi_err$(ABS(h_error%)) ENDIF ENDIF IF h_error%<>-8 out(a$) ENDIF ENDIF NEXT geraet% NEXT target% target%=a% geraet%=b% mnorm out_do set_last(11) RETURN PROCEDURE last_11 ! Target/Gerät auswählen .| Glob. Var.: target%,geraet%,top%,txt_zeile%,out%,hard% .| Felder : whdl&(),out$() .| Ruft auf : wind_top,lesen,set_hard,mdisk,hard_root .| Aufruf in : maus_pos-1, LOCAL a%,b%,a$ ' target%=a% geraet%=b% IF top%+txt_zeile%>=out% ! wenn Abbruch target%=a% geraet%=b% wind_top(whdl&(0)) lesen ELSE a$=out$(top%+txt_zeile%) IF LEFT$(a$,7)="Target:" target%=VAL(MID$(a$,8,2)) geraet%=VAL(MID$(a$,18,1)) hard%=@set_hard(target%) mdisk hard_root ENDIF ENDIF RETURN ' PROCEDURE hard_save ! ROOT-und alle BOOT-Sektoren speichern .| Glob. Var.: h_error%,pfad$,erg%,device%,hdl%,buf%,bps%,part_total%,block% .| fehler%,h_fehler% .| Felder : p_start%(),p_size%() .| Ruft auf : root_sec,dev,fwrite2,mtasse,lesen,fclose,mnorm,do_list .| hard_message .| Aufruf in : menu_mess-1, LOCAL a$,i% root_sec(1) IF h_error%=0 pfad$="A:\" erg%=1 dev("Format speichern",31) IF device%<>99 fwrite2(hdl%,buf%,bps%) mtasse FOR i%=0 TO part_total% IF p_start%(i%)<>0 AND p_size%(i%)<>0 block%=p_start%(i%) lesen fwrite2(hdl%,buf%,bps%) IF fehler%<0 i%=part_total%+1 ENDIF ENDIF NEXT i% ~@fclose(hdl%) mnorm do_list ENDIF ELSE hard_message(h_fehler%) ENDIF RETURN PROCEDURE hard_restore ! ..... restaurieren .| Glob. Var.: h_error%,wa$,a$,target%,geraet%,root$,bps%,buf%,max_part% .| fhandle%,fehler%,block%,part_total%,erg%,h_fehler% .| Felder : po_size%(),p_size%(),po_start%(),p_start%() .| Ruft auf : root_sec,alrt,fsel$,do_list,fopen,fread2,scsicall,hard_err .| fclose,hard_message .| Aufruf in : menu_mess-1, LOCAL i%,hf$ root_sec(1) IF h_error%=0 IF @alrt(1,"HDX-RESTORE|"+STRING$(27,"-")+" |ACHTUNG: Bootsektoren|werden überschrieben! ",1,wa$)=1 a$="HDX_SAVE."+STR$(target%)+STR$(geraet%) hf$=@fsel$("*.*",a$,"HDX-SAVE Datei laden",2) IF EXIST(hf$)=TRUE root$=STRING$(bps%,0) BMOVE buf%,V:root$,bps% ! auch Rootsektor retten do_list FOR i%=1 TO max_part% po_size%(i%)=p_size%(i%) po_start%(i%)=p_start%(i%) NEXT i% ' fhandle%=@fopen(hf$,0) IF fhandle%>5 fread2(fhandle%,buf%,bps%) ' IF fehler%>=0 CLR block% IF @alrt(2,"Rootsektor schreiben?",0,"Ja| Nein ")=1 scsicall(10,block%,1,0,buf%,6,2) hard_err ENDIF root_sec(1) ' FOR i%=0 TO part_total% IF p_start%(i%)<>0 AND p_size%(i%)<>0 erg%=1 IF po_start%(i%)<>p_start%(i%) a$="Unterschied festgestellt:|Start Alt: "+STR$(po_start%(i%))+"| Neu: "+STR$(p_start%(i%)) erg%=@alrt(2,a$,0,"Schreiben|Next|Abbruch") ENDIF IF erg%=1 IF @alrt(2,"Rootsektor restaurieren?",0,"Ja| Nein ")=1 BMOVE V:root$,buf%,LEN(root$) CLR block% scsicall(10,block%,1,0,buf%,6,2) hard_err ENDIF ENDIF ' block%=p_start%(i%) fread2(fhandle%,buf%,bps%) IF fehler%<0 i%=part_total%+1 ELSE erg%=@alrt(2,"Bootsektor "+STR$(i%+1)+" schreiben?",0,"Ja|Nein|Abbruch") IF erg%=1 scsicall(10,block%,1,0,buf%,6,2) hard_err ELSE IF erg%=3 i%=part_total%+1 ENDIF ENDIF ENDIF ENDIF NEXT i% ' ENDIF ~@fclose(fhandle%) ENDIF ENDIF ENDIF ELSE hard_message(h_fehler%) ENDIF RETURN ' PROCEDURE hdx_bad ! BAD-Test manuell .| Glob. Var.: platte$,wa$,target%,geraet% .| Ruft auf : alrt,no_protekt,hard_bad .| Aufruf in : hard_format-1,menu_mess-1, IF @alrt(4,"Platte: "+platte$+"|ACHTUNG: zerstörender SCHREIB-TEST!|Daten gehen rettungslos verloren!!",0,wa$)=1 IF @no_protekt=1 IF @alrt(2,"SCHREIB-TEST Letzte Chance:|Target:"+STR$(target%)+" Gerät:"+STR$(geraet%)+"| "+platte$,0,wa$)=1 hard_bad ENDIF ENDIF ENDIF RETURN PROCEDURE hard_bad ! zerstörendes BAD nach formatieren .| Glob. Var.: erg%,hard%,h_error%,bps%,buf%,bsl$,hi_spt%,hi_dhc%,b.ox% .| boxtxt&,boxaktiv&,block%,abb%,bad%,hi_size%,utis%,bdr%,s%,bsl_start% .| bsl_count%,h_fehler% .| Ruft auf : clr_out,out,root_sec,alrt,put_char,box_draw,objc_update .| scsicall,was_ist,box_undraw,mdisk,hard_err,inc_bad_err,lesen,out_do .| do_list,hard_message .| Aufruf in : hdx_bad-1, LOCAL a%,ab%,i%,j%,tm%,tm2%,x1%,zgr%,a$,dp$,root$ ' erg%=3 clr_out("Defektliste erstellen:") out("") IF hard%<2 dp$=CHR$(&H6C)+CHR$(&HDB) ! Testmuster für MFM-Platten ELSE dp$=CHR$(&H63)+CHR$(&H33) ! " " RLL-Platten ENDIF root_sec(1) IF h_error%=0 root$=STRING$(bps%,0) ! Rootsektor retten BMOVE buf%,V:root$,bps% ' bsl$=STRING$(bps%*2,0) ! Leere BSL ' x1%=MIN(127,hi_spt%*hi_dhc%) ! max 127 !! Sek./Track tm%=MALLOC(x1%*bps%*2) ! 2*Speicher holen IF tm%=0 ~@alrt(3,"Kein Speicher für |'Test-Muster schreiben'",1,"Abbruch") ENDIF WHILE tm%>0 tm2%=tm%+x1%*bps% ! Lesepufferadresse ' ' ------------------------- put_char(b.ox%,boxtxt&,"Testmuster schreiben ...") put_char(b.ox%,boxaktiv&,"Rest: ") box_draw(b.ox%) ! Anwender beruhigen ' a$=STRING$(bps%/2,dp$) ! Testmusterstring BMOVE V:a$,buf%,bps% ! String in Buffer CLR a$ FOR i%=0 TO x1%-1 BMOVE buf%,tm%+i%*bps%,bps% ! Puffer in Schreib-RAM kopieren NEXT i% ' CLR block%,abb%,bad% DO put_char(b.ox%,boxaktiv&,"Rest: "+STR$(hi_size%-block%)) objc_update(b.ox%,boxaktiv&) ' scsicall(10,block%,x1%,0,tm%,6,2) ! Muster auf Platte schreiben ADD block%,x1% EXIT IF block%>=hi_size% abb%=@was_ist EXIT IF abb%>0 IF block%+x1%>hi_size% block%=hi_size%-x1% ENDIF LOOP IF abb%>0 box_undraw(b.ox%) ENDIF ' ---------------------------------- ' IF abb%=0 ! Schreiben durchgelaufen? zgr%=6 ! die ersten 6 Bytes sind belegt CLR block% ! Defekt, und Block löschen ' put_char(b.ox%,boxtxt&,"Testmuster lesen ...") objc_update(b.ox%,boxtxt&) ' a$=STRING$(bps%/4,"CBHD") DO put_char(b.ox%,boxaktiv&,"Rest: "+STR$(hi_size%-block%)) objc_update(b.ox%,boxaktiv&) ' BMOVE V:a$,buf%,bps% ! String in Puffer FOR i%=0 TO x1%-1 BMOVE buf%,tm2%+i%*bps%,bps% ! Puffer in LESE-RAM kopieren NEXT i% mdisk scsicall(8,block%,x1%,0,tm2%,6,4) ! und LESEN hard_err ' IF C:utis%(&H500,L:tm%,L:tm2%,L:(x1%*bps%)/4-1)<>0 OR h_error%<>0 CLR bdr% ' FOR i%=0 TO x1%-1 ! Fehler? IF C:utis%(&H500,L:tm%,L:tm2%+i%*bps%,L:bps%/4-1)<>0 inc_bad_err(block%+i%) bdr%=1 ENDIF NEXT i% ' IF bdr%=0 ! wenn da kein Fehler gefunden FOR i%=0 TO x1% scsicall(8,block%+i%,1,0,tm2%,6,4) ! einzeln lesen hard_err IF h_error%<>0 inc_bad_err(block%+i%) bdr%=1 ENDIF NEXT i% ' IF bdr%=0 ~@alrt(1,"Konnte defekten Block nicht lokalisieren.",1," Dumm ") ENDIF ENDIF ' ENDIF ADD block%,x1% EXIT IF block%>=hi_size% ! Fertig? ' IF block%+x1%>hi_size% block%=hi_size%-x1% ENDIF EXIT IF @was_ist>0 ! Abbruch? LOOP box_undraw(b.ox%) ! ja, ~MFREE(tm%) ! Speicher freigeben ENDIF ' ' --------------- BSL schreiben ' out("Anzahl der defekten Blocks: "+STR$(bad%)) out("") BYTE{V:bsl$}=(bad% AND &HFF0000)/65536 BYTE{V:bsl$+1}=(bad% AND &HFF00)/256 BYTE{V:bsl$+2}=(bad% AND &HFF) ! Anzahl der Defekte ' CLR s% ! Prüfsumme berechnen FOR i%=0 TO bad%+2*3 ADD s%,BYTE{(V:bsl$)+i%} NEXT i% BYTE{V:bsl$+3}=&HA5-(s% AND &HFF) ! auf &HA5 ' bsl_start%=1 bsl_count%=((bad%+2)*3)/bps%+1 ! Länge BSL berechnen CLR j% FOR block%=bsl_start% TO bsl_start%+bsl_count%-1 BMOVE (V:bsl$)+j%,buf%,bps% scsicall(10,block%,1,0,buf%,6,2) ! BSL schreiben ADD j%,bps% NEXT block% CLR bsl$ ' BMOVE V:root$,buf%,LEN(root$) {buf%+&H1F6}=bsl_start% {buf%+&H1FA}=bsl_count% scsicall(10,0,1,0,buf%,6,2) ! Write Rootsector hard_err lesen out_do EXIT IF 1 WEND do_list ELSE hard_message(h_fehler%) ENDIF RETURN PROCEDURE inc_bad_err(nr%) ! BAD-Fehler .| Glob. Var.: bad%,bsl$,zgr% .| Ruft auf : out .| Aufruf in : hard_bad-2, IF bad%<(LEN(bsl$)/3)-2 out("Block:"+STR$(nr%)+" defekt ...") BYTE{V:bsl$+zgr%}=(nr% AND &HFF0000)/65536 BYTE{V:bsl$+zgr%+1}=(nr% AND &HFF00)/256 BYTE{V:bsl$+zgr%+2}=(nr% AND &HFF) ADD zgr%,3 INC bad% ENDIF RETURN ' PROCEDURE hdx_set_bad .| Glob. Var.: bsl_start%,bsl_count%,wa$ .| Ruft auf : root_sec,alrt,hard_set_bad .| Aufruf in : menu_mess-1, root_sec(1) IF @alrt(2,"BAD-SEKTOR-LIST abarbeiten?|Start:"+STR$(bsl_start%)+"|Länge:"+STR$(bsl_count%),1,wa$)=1 hard_set_bad ENDIF RETURN PROCEDURE hard_set_bad ! BAD Sektor-List abarbeiten (in FAT eintragen) .| Glob. Var.: abb%,h_error%,bps%,bsl_start%,bsl_count%,hi_size%,buf%,block% .| Ruft auf : check_bsl,scsicall,hard_err,out,do_mark_bad .| Aufruf in : hard_zero-1,hard_part-1,hdx_set_bad-1, LOCAL h_def%,si%,j%,zgr%,bsl$ ' abb%=@check_bsl IF h_error%=0 AND abb%=0 bsl$=STRING$(bps%,0) FOR si%=bsl_start% TO bsl_start%+bsl_count%-1 EXIT IF si%>hi_size% scsicall(8,si%,1,0,buf%,6,4) ! X.BSL-Block lesen hard_err EXIT IF h_error%<>0 BMOVE buf%,V:bsl$,bps% zgr%=V:bsl$ IF si%=bsl_start% h_def%=BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2} ADD zgr%,3 ADD zgr%,3 ENDIF EXIT IF h_def%=0 ' FOR j%=1 TO h_def% block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2}) out("Block:"+STR$(block%)) ADD zgr%,3 do_mark_bad(block%) NEXT j% ' Jetzt Anwenderliste durchgehen block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2}) WHILE block% ADD zgr%,3 do_mark_bad(block%) block%=(BYTE{zgr%}*65536+BYTE{zgr%+1}*256+BYTE{zgr%+2}) WEND ' EXIT IF abb%>0 NEXT si% ENDIF RETURN PROCEDURE do_mark_bad(block%) ! defekten Block in FAT eintragen .| Glob. Var.: part_total%,hi_size%,buf%,h_error%,abb% .| Felder : p_start%(),p_size%() .| Ruft auf : scsicall,hard_err,readintel,alrt,lesen .| Aufruf in : hard_set_bad-2, LOCAL a%,bl%,part%,hbps%,anf_dat%,ph_sp_ls%,fat_anz% LOCAL anf_fat1%,len_dir%,len_fat%,spc%,lgs%,cluster%,x% ' CLR part% DO INC part% EXIT IF ((block%>=p_start%(part%) AND block%<=p_start%(part%)+p_size%(part%))) OR part%>part_total% LOOP ' IF part%<=part_total% AND block%<hi_size% ' scsicall(8,p_start%(part%),1,0,buf%,6,4) ! Bootsektor lesen hard_err IF h_error%=0 ' hbps%=@readintel(12) spc%=BYTE{buf%+13} anf_fat1%=@readintel(15) ! Anzahl reservierter Sektoren len_dir%=@readintel(18)*32/hbps% len_fat%=@readintel(23) fat_anz%=BYTE{buf%+16} ph_sp_ls%=hbps%/512 ! physikalische Sektoren pro logischem Sektor ' lgs%=block%-p_start%(part%) anf_dat%=anf_fat1%+len_fat%*fat_anz%+len_dir% cluster%=MAX(0,INT((lgs%-anf_dat%)/spc%)+2) block%=anf_fat1%*ph_sp_ls%+cluster%*2/512 ADD block%,p_start%(part%) ' scsicall(8,block%,1,0,buf%,6,4) ! FAT-Sektor lesen hard_err IF h_error%=0 a%=cluster%*2 WHILE a%>=512 SUB a%,512 WEND BYTE{buf%+a%}=(&HFFF7 AND &HFF) ! &HFFF7 = defekt BYTE{buf%+a%+1}=(&HFFF7 AND &HFF00)/256 scsicall(10,block%,1,0,buf%,6,2) ! FAT-Sektor schreiben hard_err x%=len_fat% WHILE fat_anz%>1 scsicall(10,block%+x%*ph_sp_ls%,1,0,buf%,6,2) ! x. FAT schreiben hard_err EXIT IF h_error%<>0 ADD x%,len_fat% DEC fat_anz% WEND ENDIF ENDIF ELSE ~@alrt(1,"Block:"+STR$(block%)+" nicht gefunden!",1,"Abbruch") ENDIF lesen IF h_error%<>0 abb%=1 ENDIF RETURN FUNCTION check_bsl ! BSL-Struktur testen .| Glob. Var.: bsl_count%,bsl_start%,h_error% .| Ruft auf : scsicall,hard_err,alrt .| Aufruf in : hard_set_bad-1, LOCAL abb%,bsl%,s%,i% ' abb%=1 bsl%=MALLOC(bsl_count%*512) IF bsl%>0 AND bsl_count%<32 AND bsl_start%<5 scsicall(8,bsl_start%,bsl_count%,0,bsl%,6,4) ! BSL komplett lesen hard_err IF h_error%=0 CLR s% ! Prüfsumme berechnen FOR i%=bsl% TO bsl%+bsl_count%*512-1 ADD s%,BYTE{i%} NEXT i% IF (s% AND &HFF)<>&HA5 ~@alrt(3,"BSL-Prüfsumme falsch!|Evtl. neu Formatieren.",1," Aha ") ELSE CLR abb% ENDIF ENDIF ELSE ~@alrt(1,"Mit dieser BSL kann ich nix anfangen.|Bitte formatieren!",1,"Abbruch") ENDIF ~MFREE(bsl%) RETURN abb% ENDFUNC ' PROCEDURE do_mode_sense ! MODE SENSE ausführen .| Glob. Var.: hard%,buf%,hi_bps%,buf2%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc% .| hi_lz%,hi_rt%,hi_spt%,hi_size%,platte$,hi_in%,bps% .| Felder : hd_typ$() .| Ruft auf : scsicall,cbps .| Aufruf in : hard_mode_sense-1,get_root_info-1,root_sec-1,hard_on-1, LOCAL i%,a$ IF hard%<>2 IF hard%=3 scsicall(26,4*256,32,0,buf%,6,5) ! Mode Sense Page 4 ELSE scsicall(26,0,24,0,buf%,6,5) ! Mode Sense ENDIF hi_bps%=BYTE{buf2%+9}*65536+BYTE{buf2%+10}*256+BYTE{buf2%+11} hi_cc%=BYTE{buf2%+13}*256+BYTE{buf2%+14} hi_dhc%=BYTE{buf2%+15} hi_rwcc%=CARD{buf2%+16} hi_wpc%=CARD{buf2%+18} hi_lz%=BYTE{buf2%+20} hi_rt%=BYTE{buf2%+21} hi_spt%=BYTE{buf2%+23} hi_size%=hi_cc%*hi_dhc%*hi_spt% ' IF hard%=3 hi_cc%=BYTE{buf2%+14}*65536+BYTE{buf2%+15}*256+BYTE{buf2%+16} hi_size%=BYTE{buf2%+5}*65536+BYTE{buf2%+6}*256+BYTE{buf2%+7} hi_dhc%=BYTE{buf2%+17} hi_rt%=CARD{buf2%+24} ' scsicall(18,0,56,0,buf%,6,5) ! Inquiry platte$=STRING$(24,0) BMOVE buf2%+8,V:platte$,24 scsicall(26,3*256,36,0,buf%,6,5) ! Mode Sense Page 3 ' hi_bps%=BYTE{buf2%+9}*65536+BYTE{buf2%+10}*256+BYTE{buf2%+11} hi_spt%=BYTE{buf2%+22}*256+BYTE{buf2%+23} IF hi_bps%<>CARD{buf2%+24} IF hi_bps%<>0 AND CARD{buf2%+24}<>0 hi_spt%=hi_spt%/(hi_bps%/CARD{buf2%+24}) ENDIF ENDIF IF hi_spt%=0 AND hi_cc%<>0 AND hi_dhc%<>0 hi_spt%=hi_size%/hi_cc%/hi_dhc% ENDIF hi_in%=BYTE{buf2%+26}*256+BYTE{buf2%+27} hi_rwcc%=hi_cc%+1 hi_wpc%=hi_cc%+1 ELSE platte$=hd_typ$(hard%) ENDIF ELSE platte$=hd_typ$(hard%) hi_bps%=512 ENDIF bps%=hi_bps% cbps RETURN PROCEDURE hard_param ! Plattenparameter .| Glob. Var.: h_error%,hard.para%,par1&,hi_bps%,par2&,hi_cc%,par3&,hi_dhc% .| par4&,hi_spt%,par5&,hi_in%,par6&,hi_rwcc%,par7&,hi_wpc%,par8&,hi_lz% .| par9&,hi_rt%,par10&,hardname&,platte$,paraok&,pt%,hi_size%,h_fehler% .| Ruft auf : hard_err,put_wert,put_char,box_draw,form_do,clr_state .| box_undraw,get_val,hard_message .| Aufruf in : show_hard_data-1,hard_mode_select-1,hard_format-1 .| get_root_info-1, LOCAL ex_obj& hard_err IF h_error%=0 put_wert(hard.para%,par1&,hi_bps%,5) put_wert(hard.para%,par2&,hi_cc%,5) put_wert(hard.para%,par3&,hi_dhc%,5) put_wert(hard.para%,par4&,hi_spt%,5) put_wert(hard.para%,par5&,hi_in%,5) put_wert(hard.para%,par6&,hi_rwcc%,5) put_wert(hard.para%,par7&,hi_wpc%,5) put_wert(hard.para%,par8&,hi_lz%,5) put_wert(hard.para%,par9&,hi_rt%,5) put_char(hard.para%,par10&,"$CB") put_char(hard.para%,hardname&,LEFT$(platte$,20)) ' box_draw(hard.para%) ex_obj&=@form_do(hard.para%) AND &HFF clr_state(hard.para%,ex_obj&,1) box_undraw(hard.para%) IF ex_obj&=paraok& hi_bps%=@get_val(hard.para%,par1&) hi_cc%=@get_val(hard.para%,par2&) hi_dhc%=@get_val(hard.para%,par3&) hi_spt%=@get_val(hard.para%,par4&) hi_in%=@get_val(hard.para%,par5&) hi_rwcc%=@get_val(hard.para%,par6&) hi_wpc%=@get_val(hard.para%,par7&) hi_lz%=@get_val(hard.para%,par8&) hi_rt%=@get_val(hard.para%,par9&) pt%=@get_val(hard.para%,par10&) hi_size%=MIN(2.14748E+09,hi_cc%*hi_dhc%*hi_spt%) ENDIF ELSE hard_message(h_fehler%) ENDIF RETURN PROCEDURE do_mode_select ! MODE SELECT .| Glob. Var.: h_error%,hard%,buf2%,bps%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc% .| hi_lz%,hi_rt%,hi_spt%,buf% .| Ruft auf : cbps,scsicall,hard_err .| Aufruf in : hard_mode_select-1,hard_format-1, IF h_error%=0 IF hard%<>3 cbps BYTE{buf2%+9}=(bps% AND &HFF0000) DIV 65536 ! Sektorgrö₧e high BYTE{buf2%+10}=(bps% AND &HFF00) DIV 256 ! ' ' mid BYTE{buf2%+11}=(bps% AND &HFF) ! ' ' low BYTE{buf2%+12}=1 ! List Format BYTE{buf2%+13}=hi_cc% DIV 256 ! Anzahl der Zylinder BYTE{buf2%+14}=hi_cc% MOD 256 BYTE{buf2%+15}=hi_dhc% ! Anzahl der Köpfe BYTE{buf2%+16}=hi_rwcc% DIV 256 ! Reduzierter Schreibstrom BYTE{buf2%+17}=hi_rwcc% MOD 256 ! ab Zylinder Hi_rwcc BYTE{buf2%+18}=hi_wpc% DIV 256 ! Vorkompensation ab BYTE{buf2%+19}=hi_wpc% MOD 256 ! Zylinder Hi_wpc BYTE{buf2%+20}=hi_lz% ! Abstand der Parkspur BYTE{buf2%+21}=hi_rt% ! Seekrate CARD{buf2%+22}=hi_spt% ! Sektoren pro Track IF hard%<>2 scsicall(&H15,0,24,0,buf%,6,2) ! MODE SELECT hard_err ENDIF ENDIF ENDIF RETURN PROCEDURE set_root ! Plattendaten in ROOT-Sektor schreiben .| Glob. Var.: buf% .| Ruft auf : set_rootdaten .| Aufruf in : hard_part-1,hard_format-1, LOCAL a%,i& set_rootdaten CLR a% FOR i&=0 TO 510 STEP 2 ADD a%,CARD{buf%+i&} ! Alle Worte zusammenzählen NEXT i& CARD{buf%+&H1FE}=&H1234-a% ! Checksumme mu₧ $1234 sein RETURN PROCEDURE set_rootdaten .| Glob. Var.: buf%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc%,hi_lz%,hi_rt%,hi_in% .| hi_spt%,hi_size%,bsl_start%,bsl_count% .| Aufruf in : clear_root-1,set_root-1, BYTE{buf%+&H151}=1 ! Root-Version 1 CARD{buf%+&H1B6}=hi_cc% ! Zylinder BYTE{buf%+&H1B8}=hi_dhc% ! Köpfe CARD{buf%+&H1BA}=hi_rwcc% ! First cyl with reduced write current CARD{buf%+&H1BC}=hi_wpc% ! ' ' with precompensation BYTE{buf%+&H1BE}=hi_lz% ! Breite der Parkzone BYTE{buf%+&H1BF}=hi_rt% ! Steprate BYTE{buf%+&H1C0}=hi_in% ! Interleave BYTE{buf%+&H1C1}=hi_spt% ! Sektoren pro Track IF hi_size%=0 hi_size%=hi_cc%*hi_dhc%*hi_spt% ENDIF {buf%+&H1C2}=hi_size% ! Grö₧e der Platte {buf%+&H1F6}=bsl_start% ! Bad Sektor List {buf%+&H1FA}=bsl_count% ! Bad Sektor Count RETURN PROCEDURE get_root_info ! Für HARD - PART .| Glob. Var.: max_part%,h_error% .| Felder : po_size%(),p_size%(),po_start%(),p_start%() .| Ruft auf : root_sec,do_mode_sense,hard_err,hard_param,do_list .| Aufruf in : hard_part-1, LOCAL i% root_sec(1) FOR i%=1 TO max_part% po_size%(i%)=p_size%(i%) po_start%(i%)=p_start%(i%) NEXT i% do_mode_sense hard_err IF h_error%=0 hard_param do_list ENDIF RETURN ' PROCEDURE hard_unit .| Ruft auf : sel_target_geraet .| Aufruf in : stat_line-2, sel_target_geraet RETURN PROCEDURE sel_target_geraet ! Target+Gerät einstellen .| Glob. Var.: t.arget%,tgok&,tgabb&,tgwahl&,t0&,t15&,target%,g0&,g7& .| geraet%,hard% .| Ruft auf : all_targets,box_draw,form_do,box_undraw,only_used_target .| clr_state,change,set_hard,hard_root .| Aufruf in : hard_unit-1, LOCAL i&,ex_obj& ' all_targets DO box_draw(t.arget%) ex_obj&=@form_do(t.arget%) AND &HFF box_undraw(t.arget%) EXIT IF ex_obj&=tgok& OR ex_obj&=tgabb& only_used_target LOOP clr_state(t.arget%,ex_obj&,1) clr_state(t.arget%,tgwahl&,1) IF ex_obj&=tgok& change FOR i&=t0& TO t15& IF (OB_STATE(t.arget%,i&) AND 1)<>0 target%=i&-t0& ENDIF NEXT i& FOR i&=g0& TO g7& IF (OB_STATE(t.arget%,i&) AND 1)<>0 geraet%=i&-g0& ENDIF NEXT i& hard%=@set_hard(target%) hard_root ENDIF RETURN PROCEDURE only_used_target .| Glob. Var.: t.arget%,tgwahl&,t0&,tt! .| Ruft auf : clr_state,clr_flags,set_state,set_flags,all_targets .| Aufruf in : sel_target_geraet-1, LOCAL i&,x&,punptr% ' IF (OB_STATE(t.arget%,tgwahl&) AND 1)<>0 FOR i&=t0& TO t0&+15 clr_state(t.arget%,i&,1) ! not selected clr_flags(t.arget%,i&,1) ! not selectable set_state(t.arget%,i&,8) ! disabled NEXT i& punptr%=LPEEK(&H516) FOR i&=0 TO 15+8*(tt!=0) x&=BYTE{punptr%+i&+2} IF x&<>&HFF AND punptr%>0 clr_state(t.arget%,x&+t0&,8) ! enable set_flags(t.arget%,x&+t0&,1) ! selectable ENDIF NEXT i& ELSE all_targets ENDIF RETURN PROCEDURE all_targets .| Glob. Var.: t0&,t15&,t.arget%,tt!,g0&,g7&,target%,geraet% .| Ruft auf : clr_state,set_flags,set_state .| Aufruf in : sel_target_geraet-1,only_used_target-1, LOCAL i&,a% ' FOR i&=t0& TO t15& clr_state(t.arget%,i&,9) ! selected+enable set_flags(t.arget%,i&,1) ! selectable NEXT i& IF tt!=0 FOR i&=t0&+8 TO t15& set_state(t.arget%,i&,8) ! disable wenn kein TT NEXT i& ENDIF FOR i&=g0& TO g7& clr_state(t.arget%,i&,1) NEXT i& set_state(t.arget%,target%+t0&,1) set_state(t.arget%,geraet%+g0&,1) RETURN ' PROCEDURE unit_ready .| Glob. Var.: erg%,block%,buf%,hard%,h_error%,buf2%,com_blk%,bps%,last% .| Ruft auf : scsicall,hard_err,out,runden$,hard_test_big,do_list .| Aufruf in : show_root-1, LOCAL a#,a%,b%,x%,a$,b$ ' erg%=3 CLR block% scsicall(0,0,0,0,buf%,6,5) ! UNIT READY hard_err IF hard%=3 AND h_error%=0 ! nur bei SCSI-Platten scsicall(18,0,64,0,buf%,6,5) ! INQUIRY ' a$=STRING$(8,0) BMOVE buf2%+8,VARPTR(a$),8 out("Hersteller : "+a$) b$=STRING$(16,0) BMOVE buf2%+16,VARPTR(b$),16 out("Produkt : "+b$) out("SCSI-Version : "+STR$(BYTE{buf2%+2})) a$=STRING$(3,0) BMOVE buf2%+32,VARPTR(a$),3 out("Firmware : "+a$) IF INSTR(b$,"SQ555") OR INSTR(b$,"SQ5110") OR INSTR(b$,"SQ5200") OR INSTR(b$,"SQ3105") OR INSTR(b$,"SQ3270") ! Wechselmedium? a$=STRING$(7,0) BMOVE buf2%+49,V:a$,7 out("Mediumserial : "+a$) ENDIF hard_err out("") ' {com_blk%+4}=0 CARD{com_blk%+8}=0 scsicall(37,0,0,0,buf%,10,5) ! Read CAPACITY IF h_error%=0 out("READ CAPACITY:") a%={buf2%}+1 b%={buf2%+4} a$=STR$(a%)+" Blöcke zu "+STR$(b%)+" Bytes" out(a$+" = "+@runden$(a%*b%/1.04858E+06)+" MB") ENDIF x%=@hard_test_big IF x%>0 a%=x% b%=bps% out("Von SED festgestellt:") a$=STR$(a%)+" Blöcke zu "+STR$(b%)+" Bytes" out(a$+" = "+@runden$(a%*b%/1.04858E+06)+" MB") ENDIF CLR last%,block% scsicall(8,block%,1,0,buf%,6,4) ! Rootsektor lesen hard_err ENDIF do_list RETURN FUNCTION hard_test_big ! Letzten Block ausfindig machen .| Glob. Var.: fer%,block%,abb%,platte$,buf%,h_fehler% .| Felder : err_fld$() .| Ruft auf : scsicall,hard_err,was_ist .| Aufruf in : hard_part-1,unit_ready-1, LOCAL hb%,hbo%,aa%,i% ' aa%=fer% block%=&X11111111111111111111 hb%=block% DIV 2 hbo%=hb% CLR abb% DO EXIT IF LEFT$(platte$,6)="CONNER" scsicall(8,block%,1,0,buf%,6,4) hard_err IF h_fehler%<>33 ADD block%,hb% ELSE SUB block%,hb% ENDIF EXIT IF hb%=1 AND h_fehler%<>33 abb%=@was_ist hb%=MAX(1,hb%/2) IF hb%=1 AND hbo%=1 abb%=1 ENDIF hbo%=hb% EXIT IF abb%<>0 LOOP ' IF LEFT$(platte$,6)="CONNER" abb%=1 ENDIF ' REPEAT EXIT IF abb%<>0 scsicall(8,block%,1,0,buf%,6,4) hard_err INC block% abb%=@was_ist UNTIL h_fehler%=33 ' FOR i%=aa% TO fer% err_fld$(i%)="" NEXT i% fer%=aa% ' IF abb%=0 RETURN block%-1 ELSE RETURN -1 ENDIF ENDFUNC ' PROCEDURE root_sec(rt%) ! ROOT-Sektor auswerten .| Glob. Var.: h_error%,block%,buf%,hard%,hi_cc%,hi_dhc%,hi_rwcc%,hi_wpc% .| hi_lz%,hi_rt%,hi_spt%,hi_size%,hi_in%,bsl_start%,bsl_count%,max_part% .| part_total%,off%,first% .| Felder : p_flag%(),p_start%(),p_size%(),p_block%(),p_id$() .| Ruft auf : scsicall,hard_err,do_mode_sense,get_root .| Aufruf in : hard_zero-1,hard_format-1,hard_install-1,hard_noboot-1 .| hard_save-1,hard_restore-2,hard_bad-1,hdx_set_bad-1,get_root_info-1 .| hard_root-1, LOCAL x1%,i%,hi_size# CLR h_error%,block% IF rt%=1 scsicall(8,block%,1,0,buf%,6,4) ! Rootsektor lesen hard_err ENDIF IF h_error%=0 do_mode_sense hard_err IF h_error%<>0 IF hard%=2 hi_cc%=CARD{buf%+&H1B6} ! Zylinder hi_dhc%=BYTE{buf%+&H1B8} ! Köpfe hi_rwcc%=CARD{buf%+&H1BA} ! 1. Spur mit reduziertem Schreibstrom hi_wpc%=CARD{buf%+&H1BC} ! ' ' Vorkompensation hi_lz%=BYTE{buf%+&H1BE} ! Breite der Parkzone hi_rt%=BYTE{buf%+&H1BF} ! Steprate hi_spt%=BYTE{buf%+&H1C1} ! Sektoren pro Track hi_size%={buf%+&H1C2} ! Grö₧e der Platte ENDIF ENDIF IF hard%<>3 hi_in%=BYTE{buf%+&H1C0} ! Interleave ENDIF IF hi_size%=0 hi_size#=ABS(hi_cc%*hi_dhc%*hi_spt%) hi_size%=MIN(&H7FFFFFFF,hi_size#) ENDIF bsl_start%={buf%+&H1F6} ! Bad Sektor List bsl_count%={buf%+&H1FA} ! Bad Sektor Count ' ARRAYFILL p_flag%(),0 ARRAYFILL p_start%(),0 ARRAYFILL p_size%(),0 ARRAYFILL p_block%(),0 FOR i%=0 TO max_part% p_id$(i%)=" " ! alles löschen NEXT i% ' CLR part_total%,off%,block%,first% get_root(block%) ' ENDIF RETURN PROCEDURE get_root(block%) ! nach Einträgen suchen .| Glob. Var.: cbhd_found%,buf% .| Ruft auf : hard_read_sec,viererblock .| Aufruf in : root_sec-1,viererblock-1, CLR cbhd_found% hard_read_sec(block%) ~@viererblock(buf%+&H1C6,0) IF @viererblock(buf%+&H156,4)>0 cbhd_found%=1 ENDIF IF @viererblock(buf%+&H186,8)>0 cbhd_found%=1 ENDIF RETURN FUNCTION viererblock(pnt%,pnr%) .| Glob. Var.: hi_size%,part_total%,first%,off%,block% .| Felder : p_flag%(),p_id$(),p_start%(),p_size%(),p_block%() .| Ruft auf : get_root,hard_read_sec .| Aufruf in : get_root-3, LOCAL b%,c%,i%,j%,kennbyte%,p%,ff% ' CLR ff% FOR i%=0 TO 3 p%=pnt%+i%*12 CLR b% FOR j%=1 TO 3 c%=BYTE{p%+j%} IF (c%>=ASC("a") AND c%<=ASC("z")) OR (c%>=ASC("A") AND c%<=ASC("Z")) OR (c%>=ASC("0") AND c%<=ASC("9")) INC b% ENDIF NEXT j% IF b%>0 b%={p%+4} IF b%>0 AND b%<hi_size% b%={p%+8} IF b%>0 AND b%<hi_size% INC part_total% j%=part_total% ff%=1 p_flag%(j%)=BYTE{p%} p_id$(j%)=CHR$(BYTE{p%+1})+CHR$(BYTE{p%+2})+CHR$(BYTE{p%+3}) ' IF p_id$(j%)="XGM" IF first%=0 off%={p%+4} ! Start-Block der ersten XGM first%=1 p_start%(j%)={p%+4}+block% ELSE p_start%(j%)={p%+4}+off% ENDIF ELSE p_start%(j%)={p%+4}+block% ENDIF p_size%(j%)=b% p_block%(j%)=block% ' IF p_id$(j%)="XGM" DEC part_total% !!! get_root(p_start%(j%)) hard_read_sec(block%) ENDIF ENDIF ENDIF ENDIF NEXT i% RETURN ff% ENDFUNC ' PROCEDURE hard_root ! ROOT-Sektor auswerten .| Glob. Var.: erg%,h_error%,target%,geraet%,hi_cc%,hi_dhc%,hi_lz%,hi_rt% .| hi_in%,hi_bps%,hi_spt%,hi_size%,bsl_start%,bsl_count%,cbhd_found% .| h_fehler% .| Ruft auf : root_sec,do_clr_out,out,runden$,chk_sum,show_root .| hard_message,do_list .| Aufruf in : hard_part-1,hard_install-1,last_11-1,sel_target_geraet-1 .| menu_mess-1, erg%=3 root_sec(1) IF h_error%=0 do_clr_out("Rootsektor von Target "+STR$(target%)+", Gerät "+STR$(geraet%)) out("Anzahl der Zylinder : "+STR$(hi_cc%)) out("Anzahl der Köpfe : "+STR$(hi_dhc%)) out("Breite der Parkzone : "+STR$(hi_lz%)) out("Steprate : "+STR$(hi_rt%)) out("Interleave : "+STR$(hi_in%)) out("Blockgrö₧e : "+STR$(hi_bps%)) out("Blöcke pro Spur : "+STR$(hi_spt%)) out("Anzahl Blöcke gesamt : "+STR$(hi_size%)+" = "+@runden$(hi_size%/2048)+" MByte") out("Bad Sector List ab : $"+HEX$(bsl_start%,6)) out("Länge der BSL : $"+HEX$(bsl_count%,6)) out("Prüfsumme : $"+HEX$(@chk_sum,4)) IF cbhd_found%>0 out("CBHD-Format") ELSE out("") ENDIF out("") out(" ID Start Grö₧e MB Block Flags") show_root ELSE hard_message(h_fehler%) do_list ENDIF RETURN PROCEDURE show_root ! ROOT-INFO anzeigen .| Glob. Var.: part_total%,wc%,n$,bps%,part_anz%,erg% .| Felder : p_id$(),p_start%(),p_size%(),p_block%(),p_flag%() .| Ruft auf : out,dec_hex_val$,runden$,unit_ready,out_do,set_last .| Aufruf in : hard_root-1, LOCAL a$,b$,i%,j% ' out(STRING$(50,"-")) FOR i%=1 TO part_total% a$=SPACE$(wc%) IF p_id$(i%)="GEM" OR p_id$(i%)="BGM" INC j% MID$(a$,1)=RIGHT$(n$+STR$(j%),2) ENDIF MID$(a$,5)=p_id$(i%)+" "+@dec_hex_val$(p_start%(i%),7) MID$(a$,19)=@dec_hex_val$(p_size%(i%),7) MID$(a$,28)=@runden$(p_size%(i%)*bps%/1.04858E+06) MID$(a$,34)=@dec_hex_val$(p_block%(i%),7) MID$(a$,43)=@dec_hex_val$(p_flag%(i%),3) IF (p_flag%(i%) AND 1)<>0 b$="Exist" ENDIF IF (p_flag%(i%) AND &H80)<>0 b$=b$+" Boot" ENDIF MID$(a$,48)=b$ out(a$) NEXT i% ' out("") part_anz%=j% unit_ready erg%=3 out_do set_last(7) RETURN PROCEDURE last_7 ! Rootinfo .| Glob. Var.: top%,txt_zeile%,part_anz%,block% .| Felder : p_start%(),whdl&() .| Ruft auf : lesen,wind_top,do_list .| Aufruf in : maus_pos-1, LOCAL a% a%=top%+txt_zeile% IF a%>14 AND a%<15+part_anz% block%=p_start%(a%-14) lesen wind_top(whdl&(0)) do_list ENDIF RETURN ' PROCEDURE nix_vortex .| Ruft auf : alrt .| Aufruf in : show_hard_data-1,hard_mode_select-1, ~@alrt(1,"... geht nicht bei|'VORTEX'! ",1,"Warum?") ~@alrt(1,"Wei₧ nicht warum -|Vortex fragen!",1,"Darum") RETURN ' PROCEDURE hard_copy ! physikalische Kopie erstellen .| Glob. Var.: a$,wa$,el%,buf_size% .| Ruft auf : alrt,no_protekt,eingabe,mdisk,hard_do_copy,was_ist .| Aufruf in : menu_mess-1, LOCAL qtarg%,ztarg%,qanz%,qblock%,zblock%,qend%,i%,bl_anz% ' a$="target" IF @alrt(1,"Vorsicht:|--------------------------|Mit dieser Funktion sollte|man nicht spielen!!!",2,wa$)=1 IF @no_protekt=1 qtarg%=@eingabe("Quell"+a$,0) IF el%>0 ztarg%=@eingabe("Ziel"+a$,0) IF el%>0 qblock%=@eingabe("1. Blocknummer auf Quell"+a$,0) IF el%>0 qanz%=@eingabe("Anzahl der Blöcke",0) IF el%>0 zblock%=@eingabe("Blocknummer auf Ziel"+a$,0) IF el%>0 ' bl_anz%=buf_size%/512 qend%=qblock%+qanz% ' WHILE qblock%<qend% ' mdisk IF @hard_do_copy(qtarg%,ztarg%,qblock%,zblock%,bl_anz%)<>0 ' FOR i%=0 TO bl_anz%-1 ~@hard_do_copy(qtarg%,ztarg%,qblock%+i%,zblock%+i%,1) NEXT i% ENDIF ' ADD qblock%,bl_anz% ADD zblock%,bl_anz% ' EXIT IF @was_ist<>0 ' WEND ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN FUNCTION hard_do_copy(qtarg%,ztarg%,qblock%,zblock%,bl_anz%) .| Glob. Var.: target%,hard%,buf%,block%,h_error% .| Felder : whdl&() .| Ruft auf : set_hard,scsicall,hard_err,set_slide .| Aufruf in : hard_copy-2, target%=qtarg% hard%=@set_hard(target%) scsicall(8,qblock%,bl_anz%,0,buf%,6,4) ! Lesen hard_err block%=qblock% set_slide(whdl&(0)) IF h_error%=0 target%=ztarg% hard%=@set_hard(target%) scsicall(10,zblock%,bl_anz%,0,buf%,6,2) ! Schreiben hard_err ENDIF RETURN h_error% ENDFUNC ' ' ---------------------- AB HIER FLOPPY-ROUTINEN ---------------- PROCEDURE floppy(op%,track%,sector%,laenge%,fbuf1%,fbuf2%,fax%,parm%,temp%) .| Glob. Var.: flo_com%,locksley%,trk_len%,l_end%,byt%,fdc_stat%,fdc_stat2% .| Aufruf in : select-1,deselect-1,rst-1,irq-1,do_seek-1,read_trk-1 .| write_trk-1,read_sector-1,write_sec-1,read_adr_feld-1,fdc_speed-2 .| fdc_secread-1,fdc_secwrite-1,do_trk_write-1,fdc_protect-1,analyse-2, CARD{flo_com%}=op% ! CODE CARD{flo_com%+2}=track% ! Tracknummer CARD{flo_com%+4}=sector% ! Länge der Übertragung CARD{flo_com%+6}=laenge% ! Länge der Übertragung {flo_com%+8}=fbuf1% ! Puffer 1 {flo_com%+12}=fbuf2% ! Puffer 2 CARD{flo_com%+32}=fax% ! Laufwerk+Seite / Extendet-Mode (Register...) CARD{flo_com%+34}=parm% ! Extended Parameter CARD{flo_com%+36}=temp% ! " ~C:locksley%(L:flo_com%) IF op%=224 ! $E0 trk_len%={flo_com%+24}-{flo_com%+20} l_end%=MAX(512,trk_len%) ELSE byt%={flo_com%+24}-{flo_com%+20} ENDIF fdc_stat%=CARD{flo_com%+36} fdc_stat2%=CARD{flo_com%+34} RETURN PROCEDURE select .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : fdc_drive-1, floppy(&HD0,track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) RETURN PROCEDURE deselect .| Glob. Var.: track%,buf%,fdc1% .| Ruft auf : floppy .| Aufruf in : chk_fdc-1, floppy(&HD0,track%,0,0,buf%,fdc1%,0,0,0) RETURN PROCEDURE rst .| Glob. Var.: track%,fdrive%,buf%,fdc1%,seite% .| Felder : rate%(),whdl&() .| Ruft auf : floppy,set_slide,gap .| Aufruf in : fdc_trkread-1, CLR track% floppy(0+rate%(fdrive%+5),track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) set_slide(whdl&(0)) gap RETURN PROCEDURE irq .| Glob. Var.: buf%,fdc1%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : fdc_speed-1,fdc_protect-1, floppy(208,0,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) RETURN PROCEDURE do_seek(track%) .| Glob. Var.: fdrive%,buf%,fdc1%,seite% .| Felder : rate%() .| Ruft auf : floppy .| Aufruf in : step_in-1,step_out-1,fdc_trkread-1,fdc_trkwrite-1,lesen-1, floppy(16+rate%(fdrive%+5),track%,0,0,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) RETURN PROCEDURE step_in .| Glob. Var.: track% .| Ruft auf : do_seek .| Aufruf in : fdc_diskanal-1,fdc_head-1,fdc_null-1, INC track% do_seek(track%) RETURN PROCEDURE step_out .| Glob. Var.: track% .| Ruft auf : do_seek .| Aufruf in : fdc_head-1, track%=MAX(0,track%-1) do_seek(track%) RETURN PROCEDURE read_trk(laenge%) .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : gap-1,fdc_anal-1,fdc_diskanal-1, IF laenge%>0 floppy(192+32,track%,0,laenge%,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) ENDIF RETURN PROCEDURE write_trk(laenge%) .| Glob. Var.: track%,buf%,fdc1%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : do_trk_write-1,fdc_null-2, IF laenge%>0 floppy(15*16,track%,0,laenge%+32,buf%,fdc1%,seite%+(fdrive%+1)*2,0,0) ENDIF RETURN PROCEDURE read_sector(sector%,laenge%) .| Glob. Var.: multiple%,track%,fdc3%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : fdc_secread-1,analyse-1, IF laenge%>0 floppy(128+multiple%,track%,sector%,laenge%,fdc3%,fdc3%,seite%+(fdrive%+1)*2,0,0) ENDIF RETURN PROCEDURE write_sec(laenge%,sector%) .| Glob. Var.: sec_hd%,multiple%,track%,buf%,fdc3%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : fdc_secwrite-1,do_trk_write-1, LOCAL a% IF laenge%>0 a%=&HA0-(sec_hd%=&HF8)-(sec_hd%=&HF9) ! Befehlscode berechnen floppy(a%+multiple%,track%,sector%,laenge%,buf%,fdc3%,seite%+(fdrive%+1)*2,0,0) ENDIF RETURN PROCEDURE read_adr_feld(laenge%) .| Glob. Var.: track%,fdc1%,fdc2%,seite%,fdrive% .| Ruft auf : floppy .| Aufruf in : fdc_readadress-1,gap-1,fdc_anal-1,fdc_diskanal-1, IF laenge%>0 floppy(192,track%,0,laenge%*4,fdc1%,fdc2%,seite%+(fdrive%+1)*2,0,0) ENDIF RETURN ' Statuszeile PROCEDURE fdc_side .| Glob. Var.: seite% .| Ruft auf : change,lesen,do_list .| Aufruf in : stat_line-1, change seite%=1-seite% lesen do_list RETURN PROCEDURE fdc_bytes .| Ruft auf : alrt .| Aufruf in : stat_line-1, ~@alrt(1,"Anzahl der gelesenen Bytes!",1," Aha ") RETURN PROCEDURE fdc_drive .| Glob. Var.: nflops%,fdrive% .| Ruft auf : change,alrt,select,lesen .| Aufruf in : stat_line-1, change nflops%=DPEEK(&H4A6) ! Anzahl der Laufwerke IF nflops%=1 ~@alrt(3,"Kein Laufwerk B: dran! ",1,"Abbruch") ELSE fdrive%=1-fdrive% ENDIF select lesen RETURN ' PROCEDURE fdc_speed .| Glob. Var.: b.ox%,boxtxt&,fdrive%,boxaktiv&,mfp%,track%,sector%,laenge% .| buf%,fdc3% .| Ruft auf : put_char,box_draw,mdisk,floppy,mousek,objc_update,mnorm .| box_undraw,irq .| Aufruf in : menu_mess-1, LOCAL dr#,genau%,t%,t2#,t3#,a$ put_char(b.ox%,boxtxt&,"Drehzahl von Laufwerk "+CHR$(fdrive%+65)) put_char(b.ox%,boxaktiv&," ") box_draw(b.ox%) mfp%=&HFFFFFA01 genau%=25 mdisk REPEAT floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H80,&HD4) CLR t% REPEAT ! Warte bis Index UNTIL (PEEK(mfp%) AND 32)=0 ! Dann Start !! t2#=TIMER ! Stopuhr WHILE t%<genau% floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H80,&HD4) REPEAT UNTIL (PEEK(mfp%) AND 32)=0 ! Warte auf Index EXIT IF @mousek=2 INC t% WEND t3#=TIMER dr#=12000*genau%/(t3#-t2#) ! Zeit berechnen dr#=INT(dr#*100)/100 a$=STR$(dr#) IF INSTR(a$,".")>0 IF MID$(a$,4,1)<>"." a$=LEFT$(LEFT$(a$,3)+".00",6) ENDIF ELSE a$=a$+".00" ENDIF put_char(b.ox%,boxaktiv&,a$) objc_update(b.ox%,boxaktiv&) UNTIL @mousek=2 mnorm box_undraw(b.ox%) irq WHILE @mousek WEND RETURN PROCEDURE fdc_steprate .| Glob. Var.: ratea%,rateb%,stepa2&,step.rate%,stepb2&,stephd&,ex_obj& .| stepresi& .| Felder : rate%() .| Ruft auf : floprate,set_state,clr_state,hdumschaltung,box_draw,form_do .| box_undraw .| Aufruf in : menu_mess-1, LOCAL a%,i&,j& ' a%=@floprate(-1,-1) ratea%=(a% AND &HFF) rateb%=(a% AND &HFF0000)/&H10000 ' FOR i&=1 TO 4 j&=stepa2&+i&-1 IF ratea%=rate%(i&) set_state(step.rate%,j&,1) ELSE clr_state(step.rate%,j&,1) ENDIF NEXT i& FOR i&=1 TO 4 j&=stepb2&+i&-1 IF rateb%=rate%(i&) set_state(step.rate%,j&,1) ELSE clr_state(step.rate%,j&,1) ENDIF NEXT i& a%=@hdumschaltung(-1) IF a%>0 set_state(step.rate%,stephd&,1) ELSE clr_state(step.rate%,stephd&,1) ENDIF ' box_draw(step.rate%) ex_obj&=@form_do(step.rate%) AND &HFF box_undraw(step.rate%) ' FOR i&=stepa2& TO stepa2&+3 IF (OB_STATE(step.rate%,i&) AND 1)<>0 rate%(5)=rate%(i&-stepa2&+1) ratea%=i&-stepa2&+1 ENDIF NEXT i& FOR i&=stepb2& TO stepb2&+3 IF (OB_STATE(step.rate%,i&) AND 1)<>0 rate%(6)=rate%(i&-stepb2&+1) rateb%=i&-stepb2&+1 ENDIF NEXT i& IF (OB_STATE(step.rate%,stepresi&) AND 1)<>0 a%=@floprate(rate%(ratea%),rate%(rateb%)) ! resident halten ENDIF IF (OB_STATE(step.rate%,stephd&) AND 1)<>0 a%=@hdumschaltung(3) ELSE a%=@hdumschaltung(0) ENDIF clr_state(step.rate%,ex_obj&,1) RETURN PROCEDURE fdc_readadress .| Glob. Var.: erg%,fdc1%,b$,a$,fdc2%,trk_len% .| Ruft auf : clr_out,gap,read_adr_feld,dec_hex_val$,out,out_do .| Aufruf in : menu_mess-1, LOCAL a%,b%,i%,j%,j1%,k%,total% ' erg%=3 clr_out("Spur Seite Sektor Länge CRC Status Position") gap IF total%>0 read_adr_feld(100) ! max. 100 Sektoren?? ' CLR i% j1%=fdc1% k%=3 b$=" " REPEAT CLR a$ FOR j%=0 TO 3 a$=a$+HEX$(BYTE{j1%},2)+b$ ! in FDC1: Header INC j1% NEXT j% a$=a$+HEX$(BYTE{j1%},2) a$=a$+HEX$(BYTE{j1%+1},2)+b$ ADD j1%,2 a%=BYTE{fdc2%+k%} a$=a$+HEX$(a%,2) EXIT IF a%=0 a%=CARD{fdc2%+k%+1} b%=trk_len%*(a%/total%)-8 a$=a$+b$+@dec_hex_val$(b%,5) out(a$) ADD k%,4 ADD i%,8 UNTIL i%>=63*8 ENDIF out_do RETURN ' PROCEDURE fdc_trkread .| Glob. Var.: track%,el% .| Ruft auf : change,eingabe,rst,do_seek,lesen,do_list .| Aufruf in : menu_mess-1,stat_line-1, change track%=@eingabe("Zieltrack eingeben",track%) IF el%>0 IF track%=0 rst ELSE do_seek(track%) ENDIF lesen do_list ENDIF RETURN PROCEDURE fdc_trkwrite .| Glob. Var.: track%,el% .| Ruft auf : eingabe,do_seek,do_trk_write,lesen .| Aufruf in : menu_mess-1, track%=@eingabe("Track schreiben auf Track:",track%) IF el%>0 do_seek(track%) do_trk_write lesen ENDIF RETURN PROCEDURE fdc_trackconfig .| Glob. Var.: c.track%,ex_obj&,trkok&,trkd10&,trkd8&,trkd5&,sc% .| trk_len_max%,buf%,trkd1&,trkd7&,trkd11&,trkd3&,trkd4&,trkd6&,trkd2& .| trk_len%,l_end% .| Felder : l_end%(),whdl&() .| Ruft auf : box_draw,form_do,clr_state,box_undraw,get_val,clear_buf,fuell .| set_slide,do_list .| Aufruf in : menu_mess-1, LOCAL a%,sec_len%,secnr%,sec_tr%,durch%,interleave%,zg%,a$ ' box_draw(c.track%) ex_obj&=@form_do(c.track%) AND &HFF clr_state(c.track%,ex_obj&,1) box_undraw(c.track%) ' IF ex_obj&=trkok& ' sec_tr%=@get_val(c.track%,trkd10&) interleave%=@get_val(c.track%,trkd8&) ' @get_val(c.track%,trkd9&) ! 1.Sektor? durch%=1 ' sec_len%=@get_val(c.track%,trkd5&) SELECT sec_len% CASE 128 sc%=0 CASE 256 sc%=1 CASE 512 sc%=2 CASE 1024 sc%=3 DEFAULT sc%=sec_len% ENDSELECT ' clear_buf(1) ! Puffer löschen fuell(0,2,trk_len_max%+1) zg%=buf% a$=STRING$(@get_val(c.track%,trkd1&),&H4E) ! GAP Trackbeginn - 1. Header BMOVE V:a$,zg%,LEN(a$) ADD zg%,LEN(a$) ' DO secnr%=durch% DO BYTE{zg%}=&HF5 ! Header schreiben: Sync BYTE{zg%+1}=&HF5 BYTE{zg%+2}=&HF5 BYTE{zg%+3}=&HFE BYTE{zg%+4}=@get_val(c.track%,trkd7&) ! Tracknummer BYTE{zg%+5}=@get_val(c.track%,trkd11&) ! Seite BYTE{zg%+6}=secnr% ! Sektornummer BYTE{zg%+7}=sc% ! Sektorgrö₧e BYTE{zg%+8}=&HF7 ! Prüfsumme fuell(zg%-buf%+5,1,zg%-buf%+9) ADD zg%,9 ' a$=STRING$(@get_val(c.track%,trkd3&),&H4E) ! Header - Sektor &H4E BMOVE V:a$,zg%,LEN(a$) ADD zg%,LEN(a$) a$=STRING$(@get_val(c.track%,trkd4&),&H0) ! GAP/2 Header - Sektor &H00 BMOVE V:a$,zg%,LEN(a$) ADD zg%,LEN(a$) ' BYTE{zg%}=&HF5 BYTE{zg%+1}=&HF5 BYTE{zg%+2}=&HF5 BYTE{zg%+3}=&HFB ADD zg%,4 ' fuell(zg%-buf%+1,0,zg%-buf%+sec_len%+1) a$=STRING$(sec_len%,&HCB) ! Sektorinhalt BMOVE V:a$,zg%,LEN(a$) ADD zg%,LEN(a$) BYTE{zg%}=&HF7 INC zg% ' a$=STRING$(@get_val(c.track%,trkd6&),&H4E) ! GAP Sektor - Header 4E BMOVE V:a$,zg%,LEN(a$) ADD zg%,LEN(a$) ' ADD secnr%,interleave% EXIT IF secnr%>sec_tr% ' a$=STRING$(@get_val(c.track%,trkd2&),&H0) ! GAP Sektor - Header 00 BMOVE V:a$,zg%,LEN(a$) ' ADD zg%,LEN(a$) LOOP INC durch% EXIT IF durch%>interleave% LOOP ' trk_len%=zg%+16-buf% l_end%=trk_len% l_end%(0)=l_end% ' a%=trk_len_max%-(zg%-buf%) a$=STRING$(a%,&H4E) ! nach letztem Sektor BMOVE V:a$,zg%,LEN(a$) CLR a$ ' set_slide(whdl&(0)) do_list ENDIF ' RETURN ' PROCEDURE fdc_secread .| Glob. Var.: sector%,el%,multiple%,track%,buf%,fdc3%,a%,byt%,trk_len_max% .| Ruft auf : eingabe,clear_buf,read_sector,floppy,info_line,fuell .| Aufruf in : menu_mess-1,stat_line-1, LOCAL l1% ' sector%=@eingabe("Welchen Sektor lesen",0) IF el%>0 l1%=@eingabe("Wieviel Bytes lesen",514) IF l1%>0 clear_buf(1) multiple%=16 ! Flag für mehrere Sektoren setzen read_sector(sector%,l1%) CLR multiple% floppy(0,track%,0,0,buf%,fdc3%,9,128+2,track%) info_line a%=INT(byt%/128)*128 IF byt%>0 BMOVE fdc3%,buf%,a% ENDIF fuell(a%+1,2,trk_len_max%) ENDIF ENDIF RETURN PROCEDURE fdc_secwrite .| Glob. Var.: sector%,el%,buf%,fdc3%,sec_hd%,multiple%,track%,laenge% .| Ruft auf : eingabe,write_sec,floppy .| Aufruf in : menu_mess-1, LOCAL l1% ' sector%=@eingabe("Welchen Sektor schreiben",0) IF el%>0 l1%=@eingabe("Wieviel Bytes schreiben",529) IF el%>0 AND l1%>0 BMOVE buf%,fdc3%,l1%+10 sec_hd%=&HFB multiple%=16 write_sec(l1%,sector%) CLR multiple% ENDIF floppy(0,track%,0,laenge%,buf%,fdc3%,9,128+2,track%) ENDIF RETURN PROCEDURE convert .| Glob. Var.: wa$,an$,trk_len_max%,trk_len%,buf%,ak%,tr$ .| Ruft auf : alrt,anal_buf,read_old_track,do_list .| Aufruf in : menu_mess-1, IF @alrt(2," Achtung! | Sektordaten gehen verloren ",1,wa$)=1 an$=STRING$(trk_len_max%,0) IF trk_len%>0 BMOVE buf%,VARPTR(an$),LEN(an$) ! Track in String holen anal_buf ! Puffer nochmal analysieren read_old_track ! Wandeln ... an$=STRING$(trk_len_max%,0) ! String mit lauter Nullen BMOVE VARPTR(an$),ak%,LEN(an$) ! Status löschen BMOVE VARPTR(tr$),buf%,LEN(tr$) ! Zurück in Puffer do_list ENDIF CLR tr$,an$ ENDIF RETURN PROCEDURE do_trk_write .| Glob. Var.: trk_len%,an$,trk_len_max%,buf%,tr$,i%,sec_anz%,sec_len%,fdc3% .| sec_hd%,snr%,trk%,track% .| Felder : sek%() .| Ruft auf : anal_buf,read_old_track,write_trk,floppy,write_sec .| Aufruf in : fdc_trkwrite-1,schreiben-1, IF trk_len%>0 an$=STRING$(trk_len_max%,0) BMOVE buf%,VARPTR(an$),LEN(an$) ! Daten retten anal_buf read_old_track ! Track wandeln BMOVE VARPTR(tr$),buf%,LEN(tr$) ! leerer Track im Puffer write_trk(LEN(tr$)) ! und jetzt schreiben. BMOVE VARPTR(an$),buf%,LEN(an$) ! Daten zurückholen CLR an$,tr$ FOR i%=1 TO sec_anz% ! nun die einzelnen Sektoren schreiben sec_len%=sek%(i%,9) IF sec_len%>0 ! Länge des Sektors BMOVE sek%(i%,4)+buf%-1,fdc3%,sec_len% ! Sektor kopieren sec_hd%=BYTE{buf%+sek%(i%,4)-2} ! Sektormodus snr%=sek%(i%,0) ! Sektornummer trk%=BYTE{sek%(i%,2)+buf%-1} ! Tracknummer aus Header lesen floppy(0,track%,0,0,buf%,fdc3%,9,128+2,trk%) write_sec(sec_len%+17,snr%) ! 17 Bytes mehr schreiben! ENDIF NEXT i% ENDIF RETURN ' PROCEDURE read_old_track .| Glob. Var.: tr$,i%,sec_anz%,a%,j%,buf%,sec_len% .| Felder : sek%() .| Aufruf in : convert-1,do_trk_write-1, ' Daten aus Trackpuffer in TR$ kopieren um ihn zu schreiben ' CLR tr$ FOR i%=1 TO sec_anz% a%=sek%(i%,2) ! zeigt auf Beginn des Headers tr$=tr$+STRING$(MAX(0,a%-sek%(i%,1)-4),0) tr$=tr$+STRING$(3,&HF5)+CHR$(&HFE) FOR j%=sek%(i%,2) TO sek%(i%,2)+3 tr$=tr$+CHR$(BYTE{buf%+j%-1}) ! Header NEXT j% tr$=tr$+CHR$(&HF7) ! Prüfsumme a%=sek%(i%,4)-2 FOR j%=sek%(i%,3)+2 TO a%-5 ! zeigt auf Datenbeginn IF BYTE{buf%+j%}=&H4E ! Lückenbytes holen tr$=tr$+CHR$(&H4E) ELSE tr$=tr$+CHR$(0) ENDIF NEXT j% IF sek%(i%,9)>0 tr$=tr$+STRING$(3,&HF5) ! Sync tr$=tr$+CHR$(BYTE{buf%+a%}) ! Sync + Datamark sec_len%=sek%(i%,9) tr$=tr$+STRING$(sec_len%,&HE5)+CHR$(&HF7) ! leerer Sector ENDIF NEXT i% tr$=tr$+STRING$(sek%(sec_anz%+1,2)-sek%(sec_anz%+1,1),0) RETURN PROCEDURE anal_buf .| Glob. Var.: an$,trk_len_max%,ak%,trk_len%,buf% .| Ruft auf : analyse,do_list .| Aufruf in : convert-1,do_trk_write-1,do_undo-1,menu_mess-1, an$=STRING$(trk_len_max%,0) BMOVE VARPTR(an$),ak%,trk_len_max% IF trk_len%>0 BMOVE buf%,VARPTR(an$),LEN(an$) analyse(2) ENDIF do_list RETURN PROCEDURE gap ! Track einlesen und normal anzeigen .| Glob. Var.: trk_len_max%,l_end%,bb$,trk_len%,buf%,an$,ak%,track% .| Felder : l_end%() .| Ruft auf : clear_buf,fuell,read_trk,alrt,read_adr_feld,search_sync .| analyse,do_list .| Aufruf in : rst-1,fdc_readadress-1,fdc_null-1,lesen-1, LOCAL wwa% ' clear_buf(1) fuell(0,2,trk_len_max%) ! Lücken read_trk(trk_len_max%) IF l_end%>0 l_end%(0)=l_end% bb$=STRING$(trk_len_max%-trk_len%,0) ! Rest löschen BMOVE VARPTR(bb$),buf%+trk_len%,trk_len% an$=STRING$(trk_len_max%,0) ! Puffer zum suchen anlegen BMOVE VARPTR(an$),ak%,trk_len_max% ! Status löschen?? BMOVE buf%,VARPTR(an$),LEN(an$) ! Track in Puffer kopieren wwa%=1 IF track%=41 ! bei Track 41 besonderes wwa%=@alrt(2," Track 41? ",1,"Gap|Anal") ENDIF IF wwa%=2 read_adr_feld(@search_sync+3) analyse(0) ELSE analyse(1) ! sonst einfache Analyse ENDIF ENDIF do_list RETURN PROCEDURE fdc_anal ! Track analysieren .| Glob. Var.: trk_len_max%,l_end%,trk_len%,bb$,buf%,an$,ak% .| Ruft auf : clear_buf,fuell,read_trk,set_aktpar,read_adr_feld,search_sync .| analyse,alrt,do_list .| Aufruf in : menu_mess-1, ' clear_buf(1) fuell(0,2,trk_len_max%) ! Lücken read_trk(trk_len_max%) l_end%=trk_len% set_aktpar(0) IF trk_len%>0 bb$=STRING$(trk_len_max%-trk_len%,0) ! Rest löschen BMOVE VARPTR(bb$),buf%+trk_len%,trk_len% an$=STRING$(trk_len_max%,0) ! Puffer zum suchen anlegen BMOVE VARPTR(an$),ak%,trk_len_max% ! Status löschen?? BMOVE buf%,VARPTR(an$),LEN(an$) ! Track in Puffer kopieren read_adr_feld(@search_sync+3) analyse(0) ELSE ~@alrt(1,"Keine Diskette drin oder was?",1,"Kann sein") ENDIF do_list ' RETURN PROCEDURE fdc_diskanal ! Disk .... .| Glob. Var.: erg%,trk_len_max%,l_end%,an$,ak%,buf%,track%,tpd%,seite% .| Ruft auf : do_list,clr_out,out,was_ist,mdisk,read_trk,info,read_adr_feld .| search_sync,analyse,fdc_do_info,out_do,lend,step_in .| Aufruf in : menu_mess-1, LOCAL wwa% ' erg%=3 do_list clr_out("ANALYSE DISK:") out("") REPEAT DO EXIT IF @was_ist>0 mdisk read_trk(trk_len_max%) ! Track lesen IF l_end%>0 info an$=STRING$(trk_len_max%,0) BMOVE VARPTR(an$),ak%,LEN(an$) ! Status löschen BMOVE buf%,VARPTR(an$),LEN(an$) ! Daten in An$ holen für Analyse read_adr_feld(@search_sync+3) analyse(0) ENDIF fdc_do_info out_do lend(0) EXIT IF track%>=tpd% ! Fertig? ' seite%=1-seite% IF seite%=0 step_in ENDIF LOOP UNTIL 1 RETURN PROCEDURE fdc_head ! Spur wechseln und einlesen .| Glob. Var.: track% .| Ruft auf : alrt,was_ist,step_out,dum,step_in,lesen .| Aufruf in : menu_mess-1, LOCAL stp% stp%=@alrt(2,"Lesetest mit Spurwechseln?",1,"Minus|Nix|Plus") DO EXIT IF @was_ist>0 OR track%>80 REPEAT ON stp% GOSUB step_out,dum,step_in UNTIL track%<>41 lesen LOOP RETURN PROCEDURE fdc_null ! Spuren löschen .| Glob. Var.: wa$,a%,el%,track%,trk_len_max%,buf%,seite% .| Ruft auf : alrt,eingabe,wandlung,info_line,write_trk,step_in,gap .| Aufruf in : menu_mess-1, LOCAL sd%,wi%,wtrk%,wwa%,w$,a$,bb$ ' IF @alrt(2," Achtung! Diskette wird | gelöscht!! ",2,wa$)=1 a%=@eingabe("Wieviel Spuren löschen",80) IF el%>0 wtrk%=track%+a%-1 sd%=@eingabe("Anzahl der Seiten",2) wwa%=@alrt(2," Was schreiben? ",1,"Puffer|Muster|Abbruch") IF wwa%=2 a$=STR$(@eingabe("Bitte Muster eingeben:",0)) wandlung(a$) IF w$="" w$=CHR$(0) ENDIF bb$=STRING$(trk_len_max%/LEN(w$),w$) BMOVE VARPTR(bb$),buf%,trk_len_max% CLR bb$ ENDIF IF wwa%<3 FOR wi%=track% TO wtrk% CLR seite% info_line write_trk(trk_len_max%) IF sd%=2 seite%=1 info_line write_trk(trk_len_max%) ENDIF step_in NEXT wi% ENDIF ENDIF gap ENDIF RETURN PROCEDURE fdc_trkinfo .| Glob. Var.: erg% .| Ruft auf : clr_out,fdc_do_info,out_do .| Aufruf in : menu_mess-1, erg%=3 clr_out("") fdc_do_info out_do RETURN PROCEDURE fdc_do_info .| Glob. Var.: track%,seite%,sec_max%,fdci% .| Felder : se_inf$(),fdc_info$() .| Ruft auf : out .| Aufruf in : fdc_diskanal-1,fdc_trkinfo-1, LOCAL a%,i% ' out("Track "+STR$(track%)+" Seite "+STR$(seite%)) out("") out("Track Seite Sector Länge") CLR a% WHILE a%<sec_max% EXIT IF se_inf$(a%)<>"" ! first SECTOR INC a% WEND WHILE a%<sec_max% EXIT IF se_inf$(a%)="" ! last Sektor INC a% WEND INC a% ' FOR i%=0 TO MIN(25,a%) out(se_inf$(i%)) NEXT i% FOR i%=0 TO fdci% out(fdc_info$(i%)) NEXT i% RETURN PROCEDURE fdc_protect .| Glob. Var.: a$,b$,b.ox%,boxtxt&,boxaktiv&,wr_old%,buf%,fdc3%,wr% .| fdc_stat%,esc$ .| Ruft auf : put_char,box_draw,floppy,objc_update,mousek,box_undraw,irq .| Aufruf in : menu_mess-1, a$="Schreibschutz" b$=" " put_char(b.ox%,boxtxt&,a$) put_char(b.ox%,boxaktiv&,b$) box_draw(b.ox%) ' wr_old%=-1 DO floppy(0,0,0,0,buf%,fdc3%,8,&H80,0) wr%=fdc_stat% AND &H40 IF wr%<>wr_old% wr_old%=wr% IF wr%>0 b$=" " ELSE b$="in" ENDIF b$=b$+"aktiv" put_char(b.ox%,boxaktiv&,b$) objc_update(b.ox%,boxaktiv&) ENDIF ' EXIT IF @mousek=2 OR INKEY$=esc$ LOOP box_undraw(b.ox%) irq RETURN ' PROCEDURE analyse(analyse%) .| Glob. Var.: zg%,a1%,a2%,p_adr%,zg_adr%,total%,a4%,senf$,sec_anz%,pos% .| fdc2%,diff%,trk_len%,max_diff%,a3%,scz%,fdc1%,snr%,sgr%,buf%,hd%,sz% .| sec_end%,sec_len%,sector%,j%,track%,laenge%,fdc3%,byt%,trk_len_max% .| Felder : sek%(),se_inf$(),byt_sec%() .| Ruft auf : anal_init,head,search_head,fuell,anal_err,anal_ctrl,mark .| search_mark,floppy,read_sector,info_line,anal_exit .| Aufruf in : anal_buf-1,gap-2,fdc_anal-1,fdc_diskanal-1, LOCAL a%,sid%,xd%,trk% ' anal_init CLR zg%,a1%,a2%,p_adr%,zg_adr% DO EXIT IF total%=0 AND analyse%=0 ' sync_a0: CLR a4%,senf$ IF analyse%=1 a%=@head(zg%) ELSE a%=@search_head(zg%) ENDIF EXIT IF a%=0 ! Kein 'FE A1' mehr gefunden ADD a%,2 p_adr%=a% fuell(a1%,2,a%) ! Lücken fuell(a%,1,a%+4) ! Header = Fett sek%(sec_anz%+1,1)=a1% ! Beginn Gap 0 sek%(sec_anz%+1,2)=a% a1%=a% a2%=a1% ' IF analyse%=0 pos%=CARD{fdc2%+4+zg_adr%*4} diff%=ABS((trk_len%*(pos%/total%)-6)-a%) IF diff%>max_diff% ! Differenz soll nicht > ?? sein anal_err(sec_anz%+1,10) ! Differenz zu gro₧ zg%=p_adr% ! sonst in Tabelle weiter GOTO sync_a0 ENDIF ENDIF EXIT IF pos%=0 AND analyse%=0 ' ------------------- Kontrolle ------------ a3%=a1%-1 IF analyse%=0 scz%=zg_adr%*6 trk%=BYTE{fdc1%+scz%} sid%=BYTE{fdc1%+scz%+1} ! aus Adre₧feld lesen snr%=BYTE{fdc1%+scz%+2} sgr%=BYTE{fdc1%+scz%+3} IF BYTE{fdc1%+scz%+4}+BYTE{fdc1%+scz%+5}=0 ! Adressfeld_status INC zg_adr% zg%=p_adr% GOTO sync_a0 ENDIF ELSE trk%=BYTE{a3%+buf%} sid%=BYTE{a3%+buf%+1} snr%=BYTE{a3%+buf%+2} sgr%=BYTE{a3%+buf%+3} ENDIF sek%(sec_anz%+1,11)=trk% ! Kopieren in Sek%(feld) sek%(sec_anz%+1,12)=sid% sek%(sec_anz%+1,13)=snr% sek%(sec_anz%+1,14)=sgr% ' IF snr%>25 snr%=0 ! ??? ENDIF ' FOR hd%=11 TO 14 senf$=senf$+" "+HEX$(sek%(sec_anz%+1,hd%),2) NEXT hd% anal_ctrl ' ------------------- Datamark suchen -------------- zg%=a% IF analyse%=1 a%=@mark(zg%) ELSE a%=@search_mark(zg%) ENDIF IF a%=0 anal_err(snr%,2) sek%(snr%,7)=1 ! Kein Datamark senf$=senf$+" RNF" INC zg_adr% ADD a1%,4 zg%=p_adr% GOTO sync_a0 ENDIF INC a% ' xd%=sek%(sec_anz%+1,2)-sek%(sec_anz%,5) IF (xd%>150 AND sec_anz%>0) OR (xd%>176 AND sec_anz%<1) anal_err(snr%,6) ! Abstand Sektor - nächster Header zu gro₧ ENDIF IF sek%(sec_anz%+1,2)+55<a% anal_err(snr%,1) ! Abstand Header-Sektor ENDIF INC a% fuell(a1%+4,2,a%) ! Gaps hell anzeigen a2%=a% ' sek%(sec_anz%+1,3)=a1%+4 ! Anfang Gap merken sek%(sec_anz%+1,4)=a% ! Anfang der Daten merken sz%=zg_adr%*6 ! zeigt auf Beginn des Headers a1%=a% ' IF sek%(sec_anz%,5)>a1% ! war im Sektor ein neuer Header? anal_err(snr%-1,8) ! Ja sek%(sec_anz%-1,8)=1 se_inf$(sec_anz%-1)=se_inf$(sec_anz%-1)+" CUT" sec_end%=sek%(sec_anz%+1,2)-8 fuell(sec_end%,2,sec_end%+8) ! Gaps auffüllen sek%(sec_anz%,9)=MAX(0,(sec_end%-sek%(sec_anz%,4))-1) ! Sektorlänge? ENDIF ' IF analyse%=0 BMOVE fdc1%+sz%,sek%(sec_anz%+1,2)+buf%-1,6 ! Header einfügen ENDIF sec_len%=byt_sec%(sgr% AND 3) sector%=snr% IF sec_anz%>0 j%=1 WHILE j%<=sec_anz%+1 IF sek%(j%,0)=sector% a4%=99 ENDIF EXIT IF a4%=99 INC j% WEND ENDIF ' IF analyse%=0 IF a4%<>99 ! wenn nicht doppelter Sektor ' floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H82,trk%) read_sector(sector%,sec_len%+2) ! Sektor lesen floppy(0,track%,sector%,laenge%,buf%,fdc3%,9,&H82,track%) info_line ! nur so ' IF byt%>0 IF sec_len%>0 IF a1%+sec_len%>trk_len% sec_len%=trk_len%-(a1%-1) ENDIF IF sec_len%>0 BMOVE fdc3%,a1%+buf%-1,sec_len% ENDIF ENDIF ELSE sek%(sec_anz%,7)=2 ! Datamark da, aber kein Sektor gelesen senf$=senf$+" RNF *" ENDIF ELSE sek%(sec_anz%,7)=3 ! Datamark da, aber Sektor doppelt senf$=senf$+" Double" anal_err(snr%+1,5) ! Sektornummer doppelt ENDIF ENDIF ' sek%(sec_anz%+1,0)=sector% ! Sektornummer merken sek%(sec_anz%+1,9)=sec_len% ! Sektorlänge sek%(sec_anz%+1,5)=a1%+sec_len% ! zeigt auf Ende der Daten zg%=p_adr% a1%=a1%+sec_len% EXIT IF a1%>trk_len_max% OR zg%>trk_len_max% INC zg_adr% se_inf$(sec_anz%)=senf$ INC sec_anz% LOOP ' IF sek%(sec_anz%,5)>a1% ! war im letzten Sektor ein neuer Header? anal_err(snr%+1,8) ! Ja sek%(sec_anz%-1,8)=1 se_inf$(sec_anz%-1)=se_inf$(sec_anz%-1)+"CUT" sec_end%=sek%(sec_anz%+1,2)-8 fuell(sec_end%,2,sec_end%+8) ! Gaps auffüllen sek%(sec_anz%,9)=(sec_end%-sek%(sec_anz%,4))-1 ! Sektorlänge?? ENDIF ' anal_exit RETURN PROCEDURE fuell(von%,was%,bis%) .| Glob. Var.: ak% .| Aufruf in : fdc_trackconfig-3,fdc_secread-1,gap-1,fdc_anal-1,analyse-5 .| anal_init-1,anal_exit-1, LOCAL zahl%,a$ zahl%=bis%-von% IF zahl%>0 a$=STRING$(zahl%,was%) BMOVE V:a$,ak%+von%-1,zahl% CLR a$ ENDIF RETURN PROCEDURE anal_init .| Glob. Var.: i%,sec_max%,fdcinf_max%,zg%,sec_anz%,im$,fdci%,total%,fdc2% .| a1%,a3% .| Felder : sek%(),se_inf$(),fdc_info$() .| Ruft auf : fuell .| Aufruf in : analyse-1, ARRAYFILL sek%(),0 FOR i%=1 TO sec_max% se_inf$(i%)="" NEXT i% FOR i%=1 TO fdcinf_max% fdc_info$(i%)="" NEXT i% zg%=1 CLR sec_anz%,im$,fdci% fuell(1,2,5) total%=CARD{fdc2%} a1%=1 a3%=5 RETURN PROCEDURE anal_ctrl .| Glob. Var.: trk%,track%,snr%,sid%,seite%,sgr% .| Ruft auf : anal_err .| Aufruf in : analyse-1, IF trk%<>track% ! steht richtige Tracknummer im Header? anal_err(snr%,4) ENDIF IF sid%<>seite% ! Steht richtige Seite im Header? anal_err(snr%,7) ENDIF IF snr%>22 ! Sektornummer? anal_err(snr%,9) ENDIF IF sgr%<>2 anal_err(snr%,3) ! Sektorlänge? ENDIF RETURN PROCEDURE anal_exit .| Glob. Var.: a1%,trk_len%,trk_len_max%,sec_anz% .| Felder : sek%() .| Ruft auf : fuell .| Aufruf in : analyse-1, IF a1%>trk_len% ! Wenn Sektorende > Trackende a1%=trk_len%-2 ENDIF fuell(a1%,2,trk_len_max%) sek%(1,1)=0 sek%(sec_anz%+1,1)=a1% ! Beginn des Tracknachspanns sek%(sec_anz%+1,2)=trk_len% RETURN PROCEDURE anal_err(fsn%,anl_err%) .| Glob. Var.: fdci%,fdcinf_max% .| Felder : fdc_info$(),im$() .| Aufruf in : analyse-7,anal_ctrl-4, IF fdci%<fdcinf_max% fdc_info$(fdci%)=" Sector:"+STR$(fsn%)+" "+im$(anl_err%) INC fdci% ENDIF RETURN ' FUNCTION head(ab%) .| Glob. Var.: an$ .| Aufruf in : analyse-1, ' ! Sucht nach Header (A1-FE)) RETURN INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFE)) ENDFUNC FUNCTION search_sync .| Glob. Var.: a$,trk_len%,an$ .| Aufruf in : gap-1,fdc_anal-1,fdc_diskanal-1, LOCAL a%,az% a$=CHR$(&HA1)+CHR$(&HFE) IF trk_len%>0 ! Routine zählt Header CLR a%,az% DO a%=INSTR(a%+1,an$,a$) EXIT IF a%=0 INC az% LOOP ENDIF RETURN az% ENDFUNC FUNCTION search_head(ab%) .| Glob. Var.: an$ .| Aufruf in : analyse-1, LOCAL a%,i% ! Sucht nach Header (A1-FC(FD,FE,FF)) CLR i% WHILE i%<4 a%=INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFC+i%)) EXIT IF a%>0 INC i% WEND RETURN a% ENDFUNC FUNCTION search_mark(ab%) .| Glob. Var.: an$ .| Aufruf in : analyse-1, LOCAL a%,i% ! Sucht nach Datenmarke (A1-F8(F9,FA,FB)) CLR i% WHILE i%<4 a%=INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HF8+i%)) EXIT IF a%>0 INC i% WEND RETURN a% ENDFUNC FUNCTION mark(ab%) .| Glob. Var.: an$ .| Aufruf in : analyse-1, ' Sucht nach Datenmarke (A1-FB)) RETURN INSTR(ab%,an$,CHR$(&HA1)+CHR$(&HFB)) ENDFUNC ' FUNCTION hdumschaltung(neu%) .| Glob. Var.: tt! .| Ruft auf : alrt .| Aufruf in : fdc_steprate-3, LOCAL alt% ' IN: neu% -1: Aktuellen Modus erfragen ' 0: Doppelte Dichte ' 3: Hohe Dichte BIT 0=8-16 MHz BIT 1=HD-Erkennung ' OUT: Funktionswert Alter Wert (0 oder 3) IF tt!<>0 alt%=DPEEK(&HFFFF860E) AND 3 IF neu%<>-1 SDPOKE &HFFFF860E,neu% ENDIF ELSE ~@alrt(1,"Nur beim ATARI-TT möglich!",1," Aha ") ENDIF RETURN alt% ENDFUNC FUNCTION floprate(stepa%,stepb%) .| Glob. Var.: rom_version% .| Aufruf in : fdc_steprate-2, LOCAL curra%,currb%,loca% ' ' IN: stepa% -1: Steprate für A erfragen ' 0-3 Steprate ' stepb% -1: Steprate für B erfragen ' 0-3 Steprate ' OUT: FUNCTION floprate() akt. Steprate für A (unteres Wort) ' akt. Steprate für B (oberes Wort) IF stepa%<>-1 SDPOKE &H440,stepa% ENDIF IF rom_version%>=&H104 curra%=XBIOS(41,0,stepa%) currb%=XBIOS(41,1,stepb%) ELSE loca%=&HA4C IF rom_version%=&H100 loca%=&HA06 ENDIF curra%=CARD{loca%+2} currb%=CARD{loca%+6} IF stepa%<>-1 SDPOKE loca%+2,stepa% ENDIF IF stepb%<>-1 SDPOKE loca%+6,stepb% ENDIF ENDIF RETURN curra%+&H10000*currb% ENDFUNC PROCEDURE chk_fdc .| Glob. Var.: mode%,f.dc% .| Ruft auf : deselect .| Aufruf in : haupt_dialog-2,do_exit-1, IF mode%=f.dc% deselect ENDIF RETURN ' ---------------------- RAM Routinen -------------------------- PROCEDURE ram_read .| Glob. Var.: utis%,ram_addr%,buf%,bps%,old_ram_addr% .| Ruft auf : alrt .| Aufruf in : prg_load-1,lesen-1, IF C:utis%(&H600,L:ram_addr%,L:buf%,L:bps%-1)<>0 ram_addr%=old_ram_addr% ~@alrt(3,"Diese Adresse hat einen |Busfehler ausgelöst!",1,"Abbruch") ENDIF old_ram_addr%=ram_addr% RETURN PROCEDURE ram_write .| Glob. Var.: utis%,buf%,ram_addr%,bps%,old_ram_addr% .| Ruft auf : alrt .| Aufruf in : schreiben-1, IF C:utis%(&H600,L:buf%,L:ram_addr%,L:bps%-1)<>0 ram_addr%=old_ram_addr% ~@alrt(3,"Hierhin können Sie nicht |schreiben, und wenn Sie|einen Handstand machen.",1,"Abbruch") ENDIF RETURN PROCEDURE ram_adress_read .| Glob. Var.: a%,ram_addr%,el% .| Ruft auf : change,eingabe,lesen,do_list .| Aufruf in : menu_mess-1,stat_line-1, change a%=@eingabe("RAM lesen ab Adresse:",ram_addr%) IF el%>0 ram_addr%=a% lesen do_list ENDIF RETURN PROCEDURE ram_adress_write .| Glob. Var.: a%,ram_addr%,el% .| Ruft auf : eingabe,schreiben .| Aufruf in : menu_mess-1, a%=@eingabe("RAM schreiben ab Adresse:",ram_addr%) IF el%>0 ram_addr%=a% schreiben ENDIF RETURN PROCEDURE ram_save .| Glob. Var.: bc%,ram_addr%,el%,a%,erg%,device%,b%,buf$,i%,bb%,utis%,hdl% .| Ruft auf : eingabe,dev,alrt,fwrite,fclose .| Aufruf in : menu_mess-1, bc%=@eingabe("Ab Adresse:",ram_addr%) IF el%>0 a%=@eingabe("bis Adresse:",0) IF el%>0 IF EVEN(a%)=FALSE INC a% ! darf nicht ungerade Anzahl sein? ENDIF erg%=1 dev("RAM speichern",32) IF device%<>99 b%=a%-bc% IF b%>0 buf$=STRING$(1024,0) FOR i%=0 TO b%/1024-1 bb%=V:buf$ IF C:utis%(&H600,L:bc%+i%*1024,L:bb%,L:1024-1)<>0 ~@alrt(3,"Busfehler aufgetreten!",1," Aha ") i%=b%/1024+1 CLR b% ELSE fwrite(hdl%,buf$) ENDIF NEXT i% IF b%/1024<>INT(b%/1024) AND b%>1024 ! und den Rest a%=b%-(INT(b%/1024)*1024) buf$=STRING$(a%,0) IF C:utis%(&H600,L:bc%+i%*1024,L:V:buf$,L:(LEN(buf$))-1)<>0 ~@alrt(3,"Busfehler aufgetreten!",1," Aha ") ELSE fwrite(hdl%,buf$) ENDIF ENDIF ENDIF CLR buf$ ~@fclose(hdl%) ENDIF ENDIF ENDIF RETURN PROCEDURE ram_load .| Glob. Var.: fi$,fhandle%,rfl%,a%,el%,t%,ram_addr%,tz%,buf% .| Ruft auf : fsel$,fopen,fseek,alrt,eingabe,fread$,fread2,fclose .| Aufruf in : menu_mess-1, LOCAL wwa% ' fi$=@fsel$("*.*","","Datei in RAM einlesen",3) IF EXIST(fi$)=TRUE fhandle%=@fopen(fi$,0) rfl%=@fseek(0,fhandle%,2) ~@fseek(0,fhandle%,0) wwa%=@alrt(2,"Datei ab Cursorposition|einlesen?",1,"RAM|Puffer|Abbruch") IF wwa%<3 a%=@eingabe("Wieviele Bytes einlesen?",rfl%) IF el%>0 IF wwa%=1 FOR t%=ram_addr%+tz% TO ram_addr%+tz%+MIN(rfl%,a%)-1 SPOKE t%,ASC(@fread$(fhandle%,1)) NEXT t% ELSE fread2(fhandle%,buf%+tz%,MIN(rfl%,a%)) ENDIF ENDIF ENDIF ~@fclose(fhandle%) ENDIF RETURN PROCEDURE prg_load .| Glob. Var.: prg_adr%,prg_fi$,fi$,ram_addr%,tz%,z%,xt%,yt% .| Ruft auf : alrt,dec_hex_val$,fsel$,ram_read,do_list .| Aufruf in : menu_mess-1, IF prg_adr%>0 IF @alrt(2,RIGHT$(prg_fi$,40)+"|ab Adresse "+@dec_hex_val$(prg_adr%,8)+"|ist noch im Speicher.|Freigeben?",1,"Ok| Nein ")=1 ~MFREE(prg_adr%) CLR prg_adr% ENDIF ELSE fi$=@fsel$("*.PRG","","Programm laden",4) IF EXIST(fi$)=TRUE prg_fi$=fi$ prg_adr%=GEMDOS(75,3,L:V:prg_fi$,L:0,L:0) ! Pexec IF prg_adr%>0 ram_addr%=prg_adr% CLR tz%,z%,xt%,yt% ram_read ELSE ~@alrt(3,"Kein Speicher frei|oder anderer Fehler. ",1,"Abbruch") ENDIF do_list ENDIF ENDIF RETURN PROCEDURE clr_prg_load .| Glob. Var.: prg_adr% .| Ruft auf : alrt .| Aufruf in : menu_mess-1, IF prg_adr%>0 IF @alrt(2,"Geladenes Programm belegt|noch Speicher.|Freigeben?",1,"Ok| Nein ")=1 ~MFREE(prg_adr%) CLR prg_adr% ENDIF ELSE ~@alrt(3,"Kein Programm geladen.",1," Aha ") ENDIF RETURN PROCEDURE disass_konv .| Glob. Var.: ram.konv% .| Ruft auf : box_draw,form_do,clr_state,box_undraw .| Aufruf in : menu_mess-1, LOCAL ex_obj& ' box_draw(ram.konv%) ex_obj&=@form_do(ram.konv%) AND &HFF clr_state(ram.konv%,ex_obj&,1) box_undraw(ram.konv%) RETURN PROCEDURE ram_cookie .| Glob. Var.: erg% .| Ruft auf : clr_out,search_cookie,out_do .| Aufruf in : menu_mess-1, erg%=3 clr_out("Cookies") ~@search_cookie("",1) out_do RETURN PROCEDURE ram_test .| Glob. Var.: erg% .| Ruft auf : clr_out,out,do_ram_test,lesen,out_do .| Aufruf in : menu_mess-1, erg%=3 clr_out("Speicher-Test") out("ST-RAM") do_ram_test(0) IF GEMDOS(68,L:-1,0)<>-32 out("TT-RAM") do_ram_test(1) ENDIF lesen out_do RETURN PROCEDURE do_ram_test(par%) .| Glob. Var.: max% .| Ruft auf : ram_check,do_ram_test .| Aufruf in : ram_test-2,do_ram_test-1, LOCAL max#,adr% IF par%=0 max%=GEMDOS(72,L:-1,0) adr%=GEMDOS(72,L:max%,0) ! 0=nur ST-RAM ELSE max%=GEMDOS(68,L:-1,1) adr%=GEMDOS(68,L:max%,1) ! 1=nur TT-RAM ENDIF IF adr%>0 ram_check(adr%,max%) ! Speicher testen do_ram_test(par%) ! und nächsten Block IF adr%>0 ~MFREE(adr%) ENDIF ENDIF RETURN PROCEDURE ram_check(a1%,a2%) .| Glob. Var.: abb%,b%,buf_size%,buf%,utis%,a% .| Ruft auf : dec_hex_val$,out,out_do,lend,was_ist .| Aufruf in : do_ram_test-1, LOCAL a$,w$,ab%,j%,i%,x%,w% ' a$="Adresse: "+@dec_hex_val$(a1%,9)+" - "+@dec_hex_val$(a1%+a2%-1,9) a$=a$+" = "+@dec_hex_val$(a2%,9)+" Bytes" out(a$) CLR abb% RESTORE ram_check_data ' ram_check_data: DATA &H55,&HAA,&H00,&HFF,* ' REPEAT READ w$ EXIT IF w$="*" w%=VAL(w$) ' out("Test: "+@dec_hex_val$(w%,3)) out_do lend(1) ' b%=MIN(a2%,buf_size%) ! Puffergrö₧e a$=STRING$(b%,w%) BMOVE V:a$,buf%,b% ab%=a2%/b% ' FOR i%=0 TO ab%-1 abb%=@was_ist EXIT IF abb%>0 x%=a1%+i%*b% BMOVE buf%,x%,b% ' IF C:utis%(&H500,L:buf%,L:x%,L:b%/4-1)<>0 FOR j%=0 TO b%-1 IF BYTE{buf%+j%}<>BYTE{x%+j%} out("Addresse:"+@dec_hex_val$(x%+j%,9)+" Wert: "+@dec_hex_val$(BYTE{x%+j%},3)+" Soll:"+@dec_hex_val$(w%,3)) ENDIF NEXT j% ENDIF NEXT i% ' a%=a2%-ab%*b% ! Rest der noch zu prüfen ist IF a%>4 x%=a1%+ab%*b% ! ab Adresse ... BMOVE buf%,x%,a% ! Muster schreiben ' IF C:utis%(&H500,L:buf%,L:x%,L:a%/4-1)<>0 FOR j%=0 TO b%-1 IF BYTE{buf%+j%}<>BYTE{x%+j%} out("Addresse:"+@dec_hex_val$(x%+j%,9)+" Wert: "+@dec_hex_val$(BYTE{x%+j%},3)+" Soll:"+@dec_hex_val$(w%,3)) ENDIF NEXT j% ENDIF ENDIF ' UNTIL abb% IF abb%>0 out("Abgebrochen.") ENDIF out_do lend(1) ' RETURN ' ---------------------- Lesen-Schreiben ----------------------- FUNCTION rwabs(mode%,buf%,cnt%,lgs%,drive%) IF lgs%<&HFFFF RETURN BIOS(4,mode%,L:buf%,cnt%,lgs%,drive%) ELSE RETURN BIOS(4,mode%,L:buf%,cnt%,-1,drive%,L:lgs%) ENDIF ENDFUNC PROCEDURE lesen .| Glob. Var.: ch%,mode%,d.isk%,drive%,disk_defekt%,status%,buf%,sektor% .| track%,seite%,lgs%,f.ile%,h.ard%,block%,r.am%,f.dc% .| Felder : whdl&() .| Ruft auf : mdisk,info,err_inf,file_read,hard_read_sec,ram_read,do_seek .| gap,set_slide,set_crcbuf .| Aufruf in : clr_part-1,last_11-1,hard_save-1,hard_bad-1,do_mark_bad-1 .| last_7-1,fdc_side-1,fdc_drive-1,fdc_trkread-1,fdc_trkwrite-1 .| fdc_head-1,ram_adress_read-1,ram_test-1,sektor_read-1 .| sektor_cluster-1,sektor_physik_do-1,sektor_compare-1,wind_dklick-1 .| wind_hslide-1,hpage_l-1,hpage_r-1,file_on-1,set_w-1,disc_info-4 .| disc_clear-1,disc_save-1,disc_check-1,last_5-4,last_10-1,datei_cut-4 .| do_file_open-1,do_datei_info-1,dir_secsearch-3,dir_fldren-1 .| dir_root-1,dir_sort-3,last_12-4,alt_q-1,top-1,lend-1,down-1,1_down-1 .| up-1,up_1-1,nxt_blk-1,test_max-1,address-1,fat_get_leiche-1 .| fat_xor-2,last_4-1,fat_read1-1,fat_read2-1,set_cursor_in_fat-1 .| cl_up-1,cl_down-1,test_suche-1, CLR ch% mdisk SELECT mode% CASE d.isk% IF drive%<2 AND disk_defekt%=1 info status%=XBIOS(8,L:buf%,L:0,drive%,sektor%,track%,seite%,1) ELSE status%=@rwabs(0,buf%,1,lgs%,drive%) ENDIF err_inf(status%) CASE f.ile% file_read CASE h.ard% hard_read_sec(block%) CASE r.am% ram_read CASE f.dc% do_seek(track%) gap ENDSELECT set_slide(whdl&(0)) set_crcbuf RETURN PROCEDURE set_crcbuf .| Glob. Var.: buf_crc%,utis%,buf%,l_end%,undo_buf%,buf_size% .| Aufruf in : scsicall-1,lesen-1,boot_sec-1,search_found-1,find_files-1, buf_crc%=C:utis%(&H400,L:buf%,L:l_end%,L:&HCDB4) BMOVE buf%,undo_buf%,buf_size% RETURN PROCEDURE change .| Glob. Var.: wind%,utis%,buf%,l_end%,buf_crc%,ch% .| Ruft auf : alrt,schreiben .| Aufruf in : hard_read-1,sel_target_geraet-1,fdc_side-1,fdc_drive-1 .| fdc_trkread-1,ram_adress_read-1,sektor_read-1,sektor_cluster-1 .| ph_track-1,ph_sec-1,ph_side-1,haupt_dialog-2,wind_dklick-1 .| wind_hslide-1,hpage_l-1,hpage_r-1,disc_drive-1,file_close-1 .| datei_cut-1,dir_root-1,ctrl_f-1,ctrl_g-1,top-1,lend-1,down-1,up-1 .| address-1,exit-1,search_found-1,fat_bearbeiten-1,fat_read1-1 .| fat_read2-1, LOCAL a% IF wind%=0 a%=C:utis%(&H400,L:buf%,L:l_end%,L:&HCDB4) IF a%<>buf_crc% AND ch% IF @alrt(2,"Sie haben Daten geändert!",0,"Schreiben|Abbruch")=1 schreiben ELSE buf_crc%=a% ENDIF ELSE CLR ch% ENDIF ENDIF RETURN PROCEDURE schreiben .| Glob. Var.: ch%,mode%,d.isk%,drive%,status%,buf%,lgs%,f.ile%,h.ard% .| block%,r.am%,f.dc%,fdrive% .| Ruft auf : media,err_inf,file_write,scsicall,hard_err,ram_write .| do_trk_write,info_line,do_cursor_anz .| Aufruf in : ram_adress_write-1,change-1,sektor_write-1,sec_write_sure-1 .| dat_sichern-1,disc_info-1,disc_load-1,last_12-2, CLR ch% ' SELECT mode% CASE d.isk% IF @media(drive%)=0 status%=@rwabs(1,buf%,1,lgs%,drive%) err_inf(status%) ELSE err_inf(-1) ENDIF CASE f.ile% file_write CASE h.ard% scsicall(10,block%,1,0,buf%,6,2) hard_err CASE r.am% ram_write CASE f.dc% IF @media(fdrive%)=0 do_trk_write ELSE err_inf(-1) ENDIF ENDSELECT info_line do_cursor_anz(0) RETURN PROCEDURE do_undo .| Glob. Var.: wind%,ch%,old_p%,undo_buf%,buf%,buf_size%,mode%,f.dc% .| undo_line$,l_eline%,txt_zeile%,top%,out%,l_end%,wz% .| Felder : out$(),whdl&() .| Ruft auf : anal_buf,do_list,set_slide .| Aufruf in : menu_mess-1,taste-1,cursor-1, LOCAL x% ' IF wind%=0 CLR ch% DEC old_p% BMOVE undo_buf%,buf%,buf_size% IF mode%=f.dc% anal_buf ENDIF do_list ELSE IF LEN(undo_line$)>0 x%=l_eline% !MAX(1,top%+txt_zeile%) IF ASC(undo_line$)=3 INSERT out$(x%)=RIGHT$(undo_line$,LEN(undo_line$)-1) ELSE out$(x%)=undo_line$ txt_zeile%=l_eline%-top% ENDIF CLR undo_line$,l_eline% IF x%<out% INC out% INC l_end% ELSE out%=x% l_end%=x% ENDIF IF top%+wz%+1>out%-1 top%=out%-wz% ENDIF set_slide(whdl&(1)) do_list ENDIF ENDIF RETURN ' ---------------------- Sektor Routinen ----------------------- PROCEDURE sektor_read .| Glob. Var.: a%,lgs%,el%,spd% .| Ruft auf : change,eingabe,alrt,lesen,do_list .| Aufruf in : menu_mess-1,stat_line-1, change DO a%=@eingabe("Logische Sektornummer lesen:",lgs%) EXIT IF el%=0 OR a%>=0 AND a%<spd% ~@alrt(3,"Grö₧te Sektornummer:|"+STR$(spd%-1),1,"Nochmal") LOOP IF el%<>0 lgs%=a% lesen do_list ENDIF RETURN PROCEDURE sektor_write .| Glob. Var.: a%,lgs%,el%,spd% .| Ruft auf : eingabe,alrt,schreiben .| Aufruf in : menu_mess-1, DO a%=@eingabe("Logische Sektornummer schreiben:",lgs%) EXIT IF el%=0 OR a%>=0 AND a%<spd% ~@alrt(3,"Grö₧te Sektornummer:|"+STR$(spd%-1),1,"Nochmal") LOOP IF el%<>0 lgs%=a% schreiben ENDIF RETURN PROCEDURE sektor_cluster .| Glob. Var.: a%,cluster%,el%,lgs%,spc%,anf_dat%,spd%,cpd% .| Ruft auf : change,eingabe,alrt,lesen,do_list .| Aufruf in : stat_line-1, change DO a%=@eingabe("Cluster lesen:",cluster%) EXIT IF el%=0 OR a%=0 OR a%>=2 AND a%<cpd%+2 ~@alrt(3,"Grö₧te Clusternummer:|"+STR$(cpd%+1),1,"Nochmal") LOOP IF el%<>0 IF a%=0 ! Pseudo-Clusternummer 0 wird erster Sektor des Wurzelverzeichnis lgs%=anf_dir% ELSE lgs%=(a%-2)*spc%+anf_dat% ENDIF lesen do_list ENDIF RETURN PROCEDURE ph_track .| Glob. Var.: drive%,a%,track%,el%,tpd%,trk%,sektor%,seite% .| Ruft auf : change,eingabe,alrt,sektor_physik_do .| Aufruf in : stat_line-1, IF drive%<2 change a%=@eingabe("Track:",track%) IF el%>0 IF a%>tpd% OR a%<0 ~@alrt(3,"Es gibt nur "+STR$(tpd%)+"|Spuren auf der Disk!",1,"Abbruch") ELSE trk%=a% sektor_physik_do(trk%,sektor%,seite%) ENDIF ENDIF ENDIF RETURN PROCEDURE ph_sec .| Glob. Var.: drive%,a%,sektor%,el%,spt%,sec%,track%,seite% .| Ruft auf : change,eingabe,alrt,sektor_physik_do .| Aufruf in : stat_line-1, IF drive%<2 change a%=@eingabe("Sektor:",sektor%) IF el%>0 IF a%>spt% OR a%<1 ~@alrt(3,"Es gibt nur "+STR$(spt%)+"|Sektoren pro Spur!",1,"Abbruch") ELSE sec%=a% sektor_physik_do(track%,sec%,seite%) ENDIF ENDIF ENDIF RETURN PROCEDURE ph_side .| Glob. Var.: drive%,sid%,sd%,seite%,track%,sektor% .| Ruft auf : change,sektor_physik_do,do_list,alrt .| Aufruf in : stat_line-1, IF drive%<2 IF sid%>1 change sd%=1-seite% sektor_physik_do(track%,sektor%,sd%) do_list ELSE ~@alrt(3,"Diskette ist nur einseitig!",1,"Abbruch") ENDIF ENDIF RETURN PROCEDURE sektor_physik_do(trk%,sec%,sd%) .| Glob. Var.: sid%,lgs%,spt%,spd% .| Ruft auf : alrt,lesen,do_list .| Aufruf in : ph_track-1,ph_sec-1,ph_side-1, IF sid%=2 lgs%=(trk%*spt%*sid%)+sec%+sd%*spt%-1 ELSE lgs%=trk%*spt%+sec%-1 ENDIF IF lgs%>=spd% ~@alrt(3,"Grö₧te Sektornummer:|"+STR$(spd%-1),1,"Abbruch") CLR lgs% ENDIF lesen do_list RETURN PROCEDURE sec_write_sure(a%) .| Glob. Var.: wa$,lgs% .| Ruft auf : alrt,schreiben (tot) IF @alrt(2,"Sektor "+STR$(a%)+" schreiben?",0,wa$)=1 lgs%=a% schreiben ENDIF RETURN PROCEDURE sektor_compare .| Glob. Var.: c.ompare%,ex_obj&,compok&,drive%,drv_map%,comps1&,start1% .| comps2&,comps5&,start2%,comps6&,comps3&,status%,sec%,bps%,spd% .| comps4& .| Ruft auf : box_draw,form_do,box_undraw,clr_state,dsetdrv,get_char$ .| get_val,boot_sec,alrt,do_sektor_compare,lesen,do_list .| Aufruf in : menu_mess-1, LOCAL a%,b%,c%,count%,dr1%,dr2%,old_drive%,a$ ' box_draw(c.ompare%) ex_obj&=@form_do(c.ompare%) AND &HFF box_undraw(c.ompare%) clr_state(c.ompare%,ex_obj&,1) ' WHILE ex_obj&=compok& old_drive%=drive% drv_map%=@dsetdrv(drive%) ! BIOS(10) ' dr1%=ASC(@get_char$(c.ompare%,comps1&))-65 start1%=@get_val(c.ompare%,comps2&) EXIT IF (drv_map% AND 2^dr1%)=0 ' dr2%=ASC(@get_char$(c.ompare%,comps5&))-65 start2%=@get_val(c.ompare%,comps6&) EXIT IF (drv_map% AND 2^dr2%)=0 ' count%=@get_val(c.ompare%,comps3&) drive%=dr1% boot_sec EXIT IF status%<>0 sec%=bps% c%=spd% ' drive%=dr2% boot_sec EXIT IF status%<>0 b%=bps% ' IF OB_STATE(c.ompare%,comps4&)>0 CLR start1% CLR start2% count%=MAX(spd%,c%) ELSE count%=MIN(count%,c%-start1%) count%=MIN(count%,spd%-start2%) ENDIF IF b%<>sec% ~@alrt(3,"Sektoren sind unterschiedlich gro₧.",1,"Abbruch") ENDIF EXIT IF b%<>sec% ' ~@do_sektor_compare(dr1%,dr2%,start1%,start2%,count%,sec%) ' drive%=old_drive% boot_sec lesen do_list EXIT IF 1 WEND RETURN FUNCTION do_sektor_compare(dr1%,dr2%,start1%,start2%,count%,sec%) .| Glob. Var.: fehler%,cmp_ram%,cmp1%,a$,b.ox%,boxtxt&,boxaktiv&,n$,status% .| erg2%,wa$,utis%,bps%,fer%,max_err% .| Felder : err_fld$() .| Ruft auf : put_char,box_draw,objc_update,was_ist,alrt,box_undraw .| Aufruf in : sektor_compare-1, LOCAL b%,cmp%,anz%,off%,total% ' fehler%=MALLOC(-1) cmp%=(fehler%-10000)/(sec%*2) cmp%=MIN(count%,cmp%) cmp_ram%=MALLOC(cmp%*sec%) ' anz%=cmp% total%=count% cmp1%=cmp_ram%+cmp%*sec% ' a$="Vergleich "+CHR$(dr1%+65)+": - "+CHR$(dr2%+65)+":" put_char(b.ox%,boxtxt&,a$) put_char(b.ox%,boxaktiv&," ") box_draw(b.ox%) ' DO a$="noch zu vergleichen: "+RIGHT$(n$+STR$(total%),7) put_char(b.ox%,boxaktiv&,a$) objc_update(b.ox%,boxaktiv&) ' EXIT IF @was_ist>0 status%=@rwabs(2,cmp_ram%,cmp%,start1%,dr1%) ' EXIT IF @was_ist>0 ' erg2%=1 IF dr1%=dr2% AND dr1%<2 AND dr2%<2 ~@alrt(2,"Diskette gewechselt?",1,wa$) ENDIF EXIT IF erg2%=2 ' status%=@rwabs(2,cmp1%,cmp%,start2%,dr2%) ' anz%=cmp%*sec% ! Anzahl der Bytes zu vergleichen CLR off% IF C:utis%(&H500,L:cmp_ram%,L:cmp1%,L:anz%/4-1)<>0 DO b%=off%*sec% IF C:utis%(&H500,L:cmp_ram%+b%,L:cmp1%+b%,L:bps%/4-1)<>0 IF fer%<max_err% INC fer% err_fld$(fer%)="Sektor:"+STR$(start1%+off%)+" verschieden" ENDIF ENDIF INC off% EXIT IF off%=cmp% OR fer%>=max_err% LOOP ENDIF EXIT IF fer%=max_err% ADD start1%,cmp% ADD start2%,cmp% SUB total%,cmp% EXIT IF total%<=0 cmp%=MIN(cmp%,total%) LOOP box_undraw(b.ox%) IF fer%=max_err% ~@alrt(3,"Fehlerüberlauf!",1,"Abbruch") ENDIF ~MFREE(cmp_ram%) RETURN 0 ENDFUNC ' --------------------------------------------------------- PROCEDURE set_button(a&) ! einen kleinen Button setzen .| Glob. Var.: k1&,k14&,desk.top% .| Ruft auf : clr_button,set_state,redraw_desk .| Aufruf in : haupt_dialog-1, LOCAL i& FOR i&=k1& TO k14& clr_button(i&) NEXT i& set_state(desk.top%,a&,1) redraw_desk(a&) RETURN PROCEDURE clr_button(a&) ! einen Desktop-Button testen und deselected .| Glob. Var.: desk.top% .| Ruft auf : clr_state,redraw_desk .| Aufruf in : set_button-1,set_mod_button-1,haupt_dialog-1, IF (OB_STATE(desk.top%,a&) AND 1)<>0 clr_state(desk.top%,a&,1) redraw_desk(a&) ENDIF RETURN PROCEDURE set_mod_button(a&) ! einen DESKTOP Modus setzen .| Glob. Var.: mod1&,mod6&,desk.top% .| Ruft auf : clr_button,set_state,redraw_desk .| Aufruf in : menu_1-1,menu_2-1,menu_3-1,menu_4-1,menu_5-1, LOCAL i& FOR i&=mod1& TO mod6& clr_button(i&) NEXT i& set_state(desk.top%,a&,1) redraw_desk(a&) RETURN PROCEDURE do_cursor_anz(nr%) .| Glob. Var.: old_cpos% .| Ruft auf : cursor_anz .| Aufruf in : base_look-1,schreiben-1,wind_mess-2,desktop_back-1 .| set_last-1,file_write-1,cursor-1,dec_hex-1,edit_ascii-2,exit-1, DEC old_cpos% cursor_anz(nr%) RETURN PROCEDURE cursor_anz(nr%) .| Glob. Var.: dum%,z%,tz%,buf%,old_cpos%,old_p%,fp%,n$,ch%,top%,txt_zeile% .| txt_spalte%,txt_links%,last%,ch2% .| Felder : whdl&(),wi%() .| Ruft auf : dec_hex_val$,do_cursor .| Aufruf in : do_cursor_anz-1,message_auswerten-2,wind_slide-1 .| redraw_list-1, LOCAL a%,b%,wa%,a$,mx%,my%,mb%,mk% ~WIND_GET(0,10,a%,dum%,dum%,dum%) IF a%=whdl&(0) OR a%=whdl&(1) IF nr%=0 a%=z%+tz% b%=BYTE{a%+buf%} IF (a%<>old_cpos% OR b%<>old_p%) ~GRAF_MKSTATE(mx%,my%,mb%,mk%) IF mb%=0 OR (mx%<=wi%(0,1)+wi%(0,3) AND my%<=wi%(0,2)+wi%(0,4)) old_cpos%=a% old_p%=b% a$=@dec_hex_val$(a%+fp%,6)+" $"+HEX$(b%,2)+" "+RIGHT$(n$+STR$(b%),3)+" %"+BIN$(b%,8) do_cursor(nr%,a$,ch%) ENDIF ENDIF ELSE a$="Zeile:"+RIGHT$("0000"+STR$(top%+txt_zeile%),4)+" Spalte:"+RIGHT$("000"+STR$(txt_spalte%+txt_links%),3) IF last%>0 a$=a$+" !" ENDIF do_cursor(nr%,a$,ch2%) ENDIF ENDIF RETURN PROCEDURE do_cursor(nr%,a$,a%) .| Felder : w_titel%(),whdl&() .| Aufruf in : cursor_anz-2, IF a%>0 a$="* "+a$ ELSE a$=" "+a$ ENDIF a$=LEFT$(a$,38)+CHR$(0)+CHR$(0) BMOVE V:a$,w_titel%(nr%),LEN(a$) ~WIND_SET(whdl&(nr%),2,CARD(SWAP(w_titel%(nr%))),CARD(w_titel%(nr%)),0,0) RETURN PROCEDURE lern_ende(m_titel&,m_eintrag&) .| Glob. Var.: lern%,kli%,ml%,menu_pointer%,last% .| Felder : frei%() .| Ruft auf : info_kleine_buttons,mnorm .| Aufruf in : message_auswerten-1, CLR lern% frei%(kli%,0)=ml% frei%(kli%,1)=m_eintrag& frei%(kli%,2)=m_titel& ~MENU_TNORMAL(menu_pointer%,m_titel&,1) IF last%=8 info_kleine_buttons ENDIF mnorm RETURN PROCEDURE set_kleine_buttons .| Glob. Var.: menu_pointer%,k.leinst%,kleintxt&,inf_ma$,kli%,klein1& .| klein2&,ex_obj&,desk.top%,k1&,lernen&,lern% .| Felder : frei%() .| Ruft auf : put_char,menu_1,menu_2,menu_3,menu_4,menu_5,get_char$ .| box_draw,form_do,clr_state,redraw_desk,mhand,box_undraw .| Aufruf in : haupt_dialog-1,last_8-1, LOCAL a%,b%,a$,b$ ' ~MENU_TNORMAL(menu_pointer%,7,1) put_char(k.leinst%,kleintxt&,MID$(inf_ma$,kli%*5-4,5)) ON frei%(kli%,0) GOSUB menu_1,menu_2,menu_3,menu_4,menu_5 a%=frei%(kli%,2) b%=OB_SPEC(menu_pointer%,a%) IF b%>0 a$=@get_char$(menu_pointer%,a%) ELSE a$=" " ENDIF CHAR{{OB_SPEC(k.leinst%,klein1&)}}=a$ a%=frei%(kli%,1) b%=OB_SPEC(menu_pointer%,a%) IF b%>0 a$=@get_char$(menu_pointer%,a%) ELSE a$=" " ENDIF IF a$="" OR LEN(a$)<2 a$=" " ENDIF put_char(k.leinst%,klein2&,RIGHT$(a$,LEN(a$)-1)) ' box_draw(k.leinst%) ex_obj&=@form_do(k.leinst%) AND &HFF clr_state(k.leinst%,ex_obj&,1) ' a$=@get_char$(k.leinst%,kleintxt&) b$=LEFT$(a$+STRING$(5,0),5) MID$(inf_ma$,kli%*5-4,5)=b$ put_char(desk.top%,k1&+kli%-1,a$) redraw_desk(0) ' IF ex_obj&=lernen& lern%=1 mhand ENDIF box_undraw(k.leinst%) RETURN PROCEDURE set_block ! Block markieren DATENfenster .| Glob. Var.: buf_beg%,tz%,z%,old%,xt%,ox%,obuf%,last_line%,yt%,nx% .| buf_end%,utis%,ak%,l_end%,wz%,wzb%,desk.top%,z.hoehe% .| Felder : wi%(),l_end%(),whdl&() .| Ruft auf : maus_pos,ctrl_h,zeile,scrollup,scrolldown,menu_blkhide .| set_stat,do_list,set_slide .| Aufruf in : message_auswerten-1, LOCAL i%,mx%,my%,mb%,mk%,otz%,xtz%,tzeit%,zg% ' ~GRAF_MKSTATE(mx%,my%,mb%,mk%) maus_pos(mx%,my%) zg%=buf_beg% ! zum demarkieren otz%=tz%+z% old%=xt% ! zum Block demarkieren ox%=otz% ! jeweils die letzte Position buf_beg%=otz% ! Start obuf%=buf_beg% ! zum Block demarkieren last_line%=yt% ! aktuelle Zeile ' tzeit%=TIMER WHILE mb% maus_pos(mx%,my%) nx%=tz%+z% ' IF tz%+z%=obuf% AND xt%=old% ctrl_h ELSE ' IF ox%<>nx% IF nx%>otz% ! Block vorwärts oder rückwärts markieren? buf_beg%=otz% ! vor... buf_end%=tz%+z% ELSE buf_end%=otz% buf_beg%=tz%+z% ENDIF ~C:utis%(&H300,L:ak%,L:l_end%-1) ~C:utis%(&H301,L:ak%+buf_beg%,L:MAX(0,buf_end%-buf_beg%)) ~GRAF_MOUSE(256,0) IF yt%>last_line% FOR i%=MAX(0,last_line%-1) TO MIN(wz%-1,yt%+1) zeile(i%) NEXT i% ELSE FOR i%=MIN(wz%-1,last_line%+1) DOWNTO MAX(0,yt%-1) zeile(i%) NEXT i% ENDIF ~GRAF_MOUSE(257,0) last_line%=yt% ox%=nx% ENDIF ' ENDIF IF my%>wi%(0,4)+wi%(0,2) AND z%<l_end%(0)-wzb% scrollup(0) ~EVNT_TIMER(70) ENDIF IF my%<wi%(0,2)+OB_H(desk.top%,0)+z.hoehe% AND z%>0 scrolldown(0) ~EVNT_TIMER(70) ENDIF ' ~GRAF_MKSTATE(mx%,my%,mb%,mk%) WEND IF TIMER-tzeit%<1 buf_beg%=zg% ENDIF IF buf_end%>=buf_beg% menu_blkhide(1) ELSE menu_blkhide(0) ENDIF set_stat do_list set_slide(whdl&(0)) RETURN PROCEDURE txt_block ! Block markieren TEXT... .| Glob. Var.: last%,mx%,my%,mb%,mk%,tbuf_beg%,txt_zeile%,top%,txt_spalte% .| tbuf_end%,last_line%,out%,z.hoehe%,txt_blkon% .| Felder : wz%(),wi%(),whdl&() .| Ruft auf : maus_pos,set_var_txt,text_line,scrollup,scrolldown,do_list .| set_stat,set_slide .| Aufruf in : message_auswerten-1, LOCAL i%,otz%,opos%,npos%,tzeit% ' IF last%=0 ~GRAF_MKSTATE(mx%,my%,mb%,mk%) maus_pos(mx%,my%) tbuf_beg%=(txt_zeile%+top%)*255+txt_spalte% otz%=tbuf_beg% tbuf_end%=tbuf_beg% last_line%=txt_zeile% set_var_txt tzeit%=TIMER ' WHILE mb% maus_pos(mx%,my%) npos%=(txt_zeile%+top%)*255+txt_spalte% ' IF opos%<>npos% ! hat sich was getan? IF npos%>otz% ! ja, Block vorwärts oder rückwärts markieren? tbuf_beg%=otz% tbuf_end%=npos% ELSE tbuf_end%=otz% tbuf_beg%=npos% ENDIF set_var_txt ~GRAF_MOUSE(256,0) IF txt_zeile%>last_line% FOR i%=MAX(1,last_line%-1) TO MIN(wz%(1),txt_zeile%+1) text_line(top%+i%) NEXT i% ELSE FOR i%=MIN(wz%(1),last_line%+1) DOWNTO MAX(1,txt_zeile%-1) text_line(top%+i%) NEXT i% ENDIF ~GRAF_MOUSE(257,0) last_line%=txt_zeile% opos%=npos% ENDIF IF my%>wi%(1,4)+wi%(1,2) AND txt_zeile%+top%<out% scrollup(1) ENDIF IF my%<wi%(1,2)+z.hoehe% AND txt_zeile%+top%>0 scrolldown(1) do_list ENDIF ~GRAF_MKSTATE(mx%,my%,mb%,mk%) WEND txt_blkon%=1 IF TIMER-tzeit%<1 CLR tbuf_beg%,tbuf_end% txt_blkon%=0 ENDIF set_stat do_list set_slide(whdl&(1)) ENDIF RETURN PROCEDURE set_var_txt ! Blockgrenzen setzen im Textfenster .| Glob. Var.: tblkaz%,tbuf_beg%,tblkas%,tblkez%,tbuf_end%,tblkes% .| Aufruf in : txt_block-2,ctrl_h-1,set_stat-1,set_found_block-1, tblkaz%=tbuf_beg%/255 tblkas%=tbuf_beg%-INT(tbuf_beg%/255)*255 tblkez%=tbuf_end%/255 tblkes%=tbuf_end%-INT(tbuf_end%/255)*255-1 RETURN PROCEDURE coff ! Cursor aus .| Glob. Var.: cvisible% .| Ruft auf : blit_cursor .| Aufruf in : message_auswerten-2,haupt_dialog-1,wind_dklick-1,menu_mess-1 .| wind_mess-1,wind_top-1,to_blk_anf-1,to_blk_end-1,taste-1,cursor-1 .| edit_ex-1,scrollup-2,scrolldown-2,search-1, IF cvisible%>0 blit_cursor ENDIF RETURN PROCEDURE blit_cursor ! Cursor zeichnen .| Glob. Var.: dum%,wind%,z.hoehe%,cvisible%,hex!,xt%,beg_ascii%,z.breite% .| yt%,txt_spalte%,txt_zeile% .| Felder : whdl&(),wi%(),ty%(),par%(),scr%() .| Ruft auf : out_lined_cursor .| Aufruf in : coff-1,message_auswerten-3,cursor-1,edit_ascii-1, LOCAL a%,cx%,cy%,x%,y%,b% ' ~WIND_UPDATE(1) ~WIND_GET(0,10,a%,dum%,dum%,dum%) IF a%=whdl&(0) OR a%=whdl&(1) ! eins meiner Fenster oben? ~GRAF_MOUSE(256,0) cx%=((wi%(wind%,1)+1+7) DIV 8)*8 ! x-Ausgabe cy%=ty%(wind%)-z.hoehe% ! y- " cvisible%=1-cvisible% ! An dieser Variable ist zu sehen, ob ' ! vor dem Bewegen des Cursors der Cursor ' ! noch geloescht werden muss. IF wind%=0 IF hex!=FALSE x%=cx%+(xt%-beg_ascii%+3)*3*z.breite% y%=cy%+yt%*z.hoehe% b%=2*z.breite% ELSE x%=cx%+(INT(xt%/3)+9+beg_ascii%)*z.breite% y%=cy%+yt%*z.hoehe% b%=z.breite% ENDIF out_lined_cursor(x%-1,y%+1,b%+1,z.hoehe%) ! Cursor im ASCII-Feld par%(0)=cx%+(xt%+9)*z.breite% ! x-Pos par%(1)=cy%+yt%*z.hoehe%+1 ! y-Pos par%(2)=par%(0)+z.breite%-1 ! Breite par%(3)=par%(1)+z.hoehe%-1 ! Hoehe par%(4)=par%(0) par%(5)=par%(1) par%(6)=par%(2) par%(7)=par%(3) par%(8)=10 CLIP wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4) BITBLT scr%(),scr%(),par%() CLIP OFF ELSE x%=cx%+(txt_spalte%-1)*z.breite% y%=cy%+txt_zeile%*z.hoehe%+1 out_lined_cursor(x%,y%-1,1,z.hoehe%+2) ! Cursor im Textfenster ENDIF ~GRAF_MOUSE(257,0) ENDIF ~WIND_UPDATE(0) RETURN PROCEDURE out_lined_cursor(x%,y%,b%,h%) .| Glob. Var.: scr_handle%,wind% .| Felder : wi%() .| Ruft auf : vs_clip,vswr_mode,v_line .| Aufruf in : blit_cursor-2, LOCAL x1%,x2% x1%=x%+b% x2%=y%+h%-1 vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4)) vswr_mode(scr_handle%,3) v_line(scr_handle%,x%,y%,x1%,y%) v_line(scr_handle%,x%,y%,x%,x2%) v_line(scr_handle%,x%,x2%,x1%,x2%) v_line(scr_handle%,x1%,y%,x1%,x2%) vswr_mode(scr_handle%,1) vs_clip(scr_handle%,0,0,0,0,0) RETURN ' ---------------------------------------------------------- PROCEDURE endless_loop .| Ruft auf : little_event_multi .| Aufruf in : HAUPTPROGRAMM-1, DO little_event_multi LOOP RETURN PROCEDURE little_event_multi .| Glob. Var.: cursor_rate%,user_code%,user_control%,mes&,mes_adr%,ev_mx& .| ev_my&,ev_mb&,ev_ks&,ev_key&,ev_clicks& .| Ruft auf : do_exit,message_auswerten .| Aufruf in : endless_loop-1, LOCAL acr% REPEAT acr%=cursor_rate% IF acr%=0 acr%=500 ENDIF ' IF user_code%>=0 INC user_control% IF user_control%>100 do_exit ENDIF ENDIF ' mes&=EVNT_MULTI(&X111111,2,1,1,0,0,0,0,0,0,0,0,0,0,mes_adr%,acr%,ev_mx&,ev_my&,ev_mb&,ev_ks&,ev_key&,ev_clicks&) ' UNTIL (mes& AND &X110011) message_auswerten(mes&) RETURN PROCEDURE message_auswerten(mes&) .| Glob. Var.: repflag%,ev_key&,ev_ks&,wind_top%,dum%,y1%,desk.top%,ground& .| y2%,z.hoehe%,ev_mx&,ev_my&,ev_clicks&,z.breite%,mes_adr%,lern% .| cursor_rate%,cvisible% .| Felder : whdl&() .| Ruft auf : taste,wind_aktpar,haupt_dialog,stat_line,address,coff .| maus_pos,set_block,cursor_anz,blit_cursor,wind_dklick,txt_block .| lern_ende,menu_mess,mnorm,wind_mess .| Aufruf in : little_event_multi-1, LOCAL wmx%,wmy%,wmb%,wmh%,mess1%,mess2%,mess3%,mess4%,mess5% ' IF BTST(mes&,0)=TRUE repflag%=PEEK(&H484) SPOKE &H484,repflag% AND 253 taste(ev_key&,ev_ks&) ! Tastatur SPOKE &H484,repflag% ENDIF ' IF BTST(mes&,1)=TRUE ~WIND_GET(0,10,wind_top%,dum%,dum%,dum%) IF wind_top%=whdl&(0) OR wind_top%=whdl&(1) ! geht mich was an? ~WIND_GET(wind_top%,4,wmx%,wmy%,wmb%,wmh%) ! ja, Koordinaten holen wind_aktpar(whdl&(wind_top%)) IF wind_top%=whdl&(0) ' y1%=wmy%+OB_H(desk.top%,ground&) y2%=y1%+z.hoehe% IF ev_mx&>wmx% AND ev_mx&<wmx%+wmb% ! x-Bereich checken IF ev_my&>wmy% AND ev_my&<y1% ! Buttons? haupt_dialog ELSE IF ev_my&>y1% AND ev_my&<y2% stat_line(whdl&(0)) ! Statuszeile? ELSE IF ev_my&>y2% AND ev_my&<wmy%+wmh% ! sonst im Fenster ' IF ev_clicks&=1 ! Doppelklick? IF ev_mx&<wmx%+8*z.breite% address ! im Addressteil? ELSE coff maus_pos(ev_mx&,ev_my&) set_block ! Lasso? cursor_anz(0) blit_cursor ENDIF ELSE wind_dklick ! Doppelklick ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF wind_top%=whdl&(1) IF ev_mx&>wmx% AND ev_mx&<wmx%+wmb% IF ev_my&>wmy% AND ev_my&<wmy%+z.hoehe% stat_line(whdl&(1)) ! in Statuszeile? ELSE IF ev_my&>wmy% AND ev_my&<wmy%+wmh% ! sonst innerhalb coff maus_pos(ev_mx&,ev_my&) txt_block cursor_anz(1) blit_cursor ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ' IF BTST(mes&,4)=TRUE mess1%=CARD{mes_adr%+6} mess2%=CARD{mes_adr%+8} mess3%=CARD{mes_adr%+10} mess4%=CARD{mes_adr%+12} mess5%=CARD{mes_adr%+14} wind_aktpar(whdl&(mess1%)) IF CARD{mes_adr%}=10 ! Mitteilung - MENU IF lern%>0 lern_ende(mess1%,mess2%) ELSE menu_mess(mess1%,mess2%) mnorm ! Maus wieder auf Pfeil zurückstellen ENDIF ELSE ! - Window ~WIND_GET(0,10,wind_top%,dum%,dum%,dum%) wind_mess(CARD{mes_adr%},mess1%,mess2%,mess3%,mess4%,mess5%) ENDIF ENDIF ' IF BTST(mes&,5)=TRUE ! Timer IF cursor_rate%>0 OR cvisible%=0 blit_cursor ENDIF ENDIF RETURN PROCEDURE haupt_dialog .| Glob. Var.: desk.top%,ev_mx&,ev_my&,k1&,k14&,kli%,ev_clicks&,ml%,m1xo& .| mod1&,mod5&,last%,mod6& .| Felder : whdl&(),frei%() .| Ruft auf : coff,set_kleine_buttons,set_button,chk_fdc,change,menu_1 .| menu_2,menu_3,menu_4,menu_5,wind_top,menu_mess,clr_button,opt_help .| Aufruf in : message_auswerten-1,wind_mess-1, LOCAL a&,objc&,dum& ' objc&=OBJC_FIND(desk.top%,0,3,ev_mx&,ev_my&) IF objc&>0 coff SELECT objc& ' CASE k1& TO k14& ! Kleine Buttons kli%=objc&-k1&+1 ' ~WIND_GET(whdl&(0),10,a&,dum&,dum&,dum&) IF a&=whdl&(0) AND ev_clicks&=2 ! Doppelklick + Buttons oben? set_kleine_buttons ELSE set_button(objc&) IF frei%(kli%,0)<>ml% AND frei%(kli%,1)>=m1xo& chk_fdc change ON frei%(kli%,0) GOSUB menu_1,menu_2,menu_3,menu_4,menu_5 wind_top(whdl&(0)) ENDIF menu_mess(0,frei%(kli%,1)) ENDIF clr_button(objc&) ' CASE mod1& TO mod5& ! Modus wechseln change CLR last% chk_fdc ON objc&-mod1&+1 GOSUB menu_1,menu_2,menu_3,menu_4,menu_5 wind_top(whdl&(0)) ' CASE mod6& opt_help ENDSELECT ' ENDIF RETURN ' PROCEDURE wind_dklick .| Glob. Var.: mode%,d.isk%,ev_mx&,ev_my&,lgs%,len_fat%,bflag%,z%,tz%,bps% .| spd%,spc%,anf_dat%,buf%,len_dir%,anf_fat2% .| Ruft auf : coff,change,maus_pos,lesen,do_list .| Aufruf in : message_auswerten-1, LOCAL a%,aa%,cl%,cz% ' coff change IF mode%=d.isk% maus_pos(ev_mx&,ev_my&) IF lgs%>=anf_fat1% AND lgs%<anf_dir% ! = FAT ' IF (bflag% AND 1)<>0 cz%=INT((z%+tz%)/2) ADD cz%,(((lgs%-anf_fat1%) MOD len_fat%)*bps%) DIV 2 ELSE cz%=INT((z%+tz%)/1.5) ADD cz%,(((lgs%-anf_fat1%) MOD len_fat%)*bps%)/1.5 ENDIF lgs%=MIN(spd%-1,(cz%-2)*spc%+anf_dat%) ELSE IF lgs%>=anf_dir% ! woanders = DIR ? a%=INT((z%+tz%)/32)*32 cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26} IF cl%>0 lgs%=anf_dat%+(cl%-2)*spc% ELSE lgs%=anf_dir% ENDIF ENDIF lgs%=MIN(spd%-1,lgs%) ENDIF lesen do_list ENDIF RETURN ' PROCEDURE menu_mess(m_titel&,m_eintrag&) .| Glob. Var.: menu_do%,ml0&,ml1o&,ml1u&,ml2o&,ml2u&,ml3o&,ml3u&,ml4o&,ml4u& .| ml%,m1xo&,m2xo&,m3xo&,m4xo&,m5xo&,menu_pointer% .| Ruft auf : coff,about_me,dat_lesen,dum,dat_sichern,dat_sichern_als .| dat_drucken,pexec,start_shell,wind_cycle,exit,do_undo,ctrl_b,ctrl_k .| ctrl_a,ctrl_h,alt_f,ctrl_t,alt_t,ctrl_c,info_crc,to_blk_anf .| to_blk_end,ctrl_f,ctrl_g,alt_q,set_list_offset,address,infos .| einstellungen,opt_text,opt_fehler,file_open,file_write,file_close .| datei_info,file_dump,file_compare,datei_copy,datei_del,datei_suchen .| disc_quick,datei_cut,datei_concat,sektor_read,sektor_write,cl_up .| cl_down,sektor_compare,disc_clear,disc_check,disc_info,fat_bearbeiten .| fat_cluster,fat_read1,fat_read2,fat_xor,fat_optimum,fat_test .| fat_graph,dir_fldren,dir_sort,file_repair,dir_files,disc_load .| disc_save,dir_root,dir_secsearch,ram_adress_read,ram_adress_write .| ram_test,ram_cookie,ram_load,ram_save,disass,disass_konv,prg_load .| clr_prg_load,hard_read,hard_write,hard_root,hard_search .| hard_mode_sense,hard_mode_select,hard_statistik,hard_prot .| hard_command,hard_copy,hard_ship,hard_format,hdx_bad,hdx_set_bad .| hard_part,hard_zero,hard_install,hard_noboot,hard_save,hard_restore .| fdc_trkread,fdc_trkwrite,fdc_readadress,fdc_anal,fdc_diskanal .| anal_buf,fdc_trkinfo,fdc_secread,fdc_secwrite,fdc_speed,fdc_protect .| fdc_head,fdc_steprate,fdc_null,fdc_trackconfig,convert .| Aufruf in : message_auswerten-1,haupt_dialog-1, LOCAL a& coff IF menu_do%=0 menu_do%=1 SELECT m_eintrag& CASE ml0& ! SED about_me CASE ml1o& TO ml1u& ! Datei ON m_eintrag&-ml1o&+1 GOSUB dat_lesen,dum,dat_sichern,dat_sichern_als,dum,dat_drucken,dum,pexec,start_shell,dum,wind_cycle,dum,exit CASE ml2o& TO ml2u& ! Block ON m_eintrag&-ml2o&+1 GOSUB do_undo,dum,ctrl_b,ctrl_k,ctrl_a,ctrl_h,dum,alt_f,ctrl_t,alt_t,ctrl_c,info_crc,dum,to_blk_anf,to_blk_end CASE ml3o& TO ml3u& ! Suchen ON m_eintrag&-ml3o&+1 GOSUB ctrl_f,ctrl_g,alt_q,dum,set_list_offset,address CASE ml4o& TO ml4u& ! Hilfe/Optionen ON m_eintrag&-ml4o&+1 GOSUB infos,einstellungen,dum,opt_text,opt_fehler ' DEFAULT SELECT ml% CASE 1 ! DATEI ON m_eintrag&-m1xo&+1 GOSUB file_open,file_write,dum,file_close,dum,datei_info,dum,file_dump,file_compare,dum,datei_copy,datei_del,dum,datei_suchen,disc_quick,dum,datei_cut,datei_concat,dum CASE 2 ! DISK a&=m_eintrag&-m2xo&+1 SELECT a& CASE 1 TO 12 ON a& GOSUB sektor_read,sektor_write,dum,cl_up,cl_down,dum,sektor_compare,disc_clear,disc_check,dum,disc_info CASE 13 TO 24 ON a&-12 GOSUB fat_bearbeiten,dum,fat_cluster,dum,fat_read1,fat_read2,fat_xor,dum,fat_optimum,dum,fat_test,fat_graph CASE 26 TO ON a&-25 GOSUB dir_fldren,dir_sort,dum,file_repair,dum,dir_files,dum,disc_load,disc_save,dum,dir_root,dir_secsearch ENDSELECT CASE 3 ! RAM ON m_eintrag&-m3xo&+1 GOSUB ram_adress_read,ram_adress_write,dum,ram_test,ram_cookie,dum,ram_load,ram_save,dum,disass,disass_konv,dum,prg_load,clr_prg_load CASE 4 ! PLATTE a&=m_eintrag&-m4xo&+1 IF a&<17 ON a& GOSUB hard_read,hard_write,dum,hard_root,hard_search,dum,hard_mode_sense,hard_mode_select,dum,hard_statistik,hard_prot,hard_command,dum,hard_copy,dum,hard_ship ELSE ON a&-17 GOSUB hard_format,hdx_bad,hdx_set_bad,dum,hard_part,hard_zero,dum,hard_install,hard_noboot,dum,hard_save,hard_restore ENDIF CASE 5 ! FLOPPY a&=m_eintrag&-m5xo&+1 IF a&<14 ON a& GOSUB fdc_trkread,fdc_trkwrite,dum,fdc_readadress,dum,fdc_anal,fdc_diskanal,anal_buf,dum,fdc_trkinfo,dum,fdc_secread,fdc_secwrite ELSE ON a&-14 GOSUB fdc_speed,fdc_protect,fdc_head,dum,fdc_steprate,dum,fdc_null,fdc_trackconfig,dum,convert ENDIF ENDSELECT ENDSELECT CLR menu_do% ENDIF ~MENU_TNORMAL(menu_pointer%,m_titel&,1) RETURN PROCEDURE menu_1 ! DATEI .| Glob. Var.: menu_adr%,m.enu1%,ml%,mod1& .| Ruft auf : switch_menu,set_mod_button,file_on .| Aufruf in : base_look-1,set_kleine_buttons-1,haupt_dialog-2, switch_menu(menu_adr%,m.enu1%) ml%=1 set_mod_button(mod1&) file_on RETURN PROCEDURE menu_2 ! DISK .| Glob. Var.: menu_adr%,m.enu2%,ml%,mod2& .| Ruft auf : switch_menu,set_mod_button,disc_on .| Aufruf in : rsc_init-1,set_kleine_buttons-1,haupt_dialog-2, switch_menu(menu_adr%,m.enu2%) ml%=2 set_mod_button(mod2&) disc_on RETURN PROCEDURE menu_3 ! RAM .| Glob. Var.: menu_adr%,m.enu3%,ml%,mod3& .| Ruft auf : switch_menu,set_mod_button,ram_on .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2, switch_menu(menu_adr%,m.enu3%) ml%=3 set_mod_button(mod3&) ram_on RETURN PROCEDURE menu_4 ! PLATTE .| Glob. Var.: menu_adr%,m.enu4%,ml%,mod4& .| Ruft auf : media_all,switch_menu,set_mod_button,hard_on .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2, IF @media_all=0 switch_menu(menu_adr%,m.enu4%) ml%=4 set_mod_button(mod4&) hard_on ENDIF RETURN PROCEDURE menu_5 ! FLOPPY .| Glob. Var.: menu_adr%,m.enu5%,ml%,mod5& .| Ruft auf : switch_menu,set_mod_button,fdc_on .| Aufruf in : set_kleine_buttons-1,haupt_dialog-2, switch_menu(menu_adr%,m.enu5%) ml%=5 set_mod_button(mod5&) fdc_on RETURN PROCEDURE switch_menu(old_menu%,menu_adr%) .| Glob. Var.: menu_pointer% .| Ruft auf : set_menu .| Aufruf in : menu_1-1,menu_2-1,menu_3-1,menu_4-1,menu_5-1 .| info_kleine_buttons-6, menu_pointer%=menu_adr% IF old_menu%>0 ~MENU_BAR(old_menu%,0) ENDIF ~WIND_UPDATE(1) ~MENU_BAR(menu_adr%,1) ~WIND_UPDATE(0) old_menu%=menu_adr% set_menu RETURN ' ---------------------- PROCEDURE menu_init .| Glob. Var.: mendx4& .| Felder : men_ienable%() .| Ruft auf : menu_blkhide .| Aufruf in : rsc_init-1, men_ienable%(mendx4&)=0 ! Weiter suchen menu_blkhide(0) RETURN PROCEDURE menu_blkhide(a%) .| Glob. Var.: i%,mendx&,ml2u& .| Felder : men_ienable%() .| Ruft auf : set_menu .| Aufruf in : set_block-2,menu_init-1,ctrl_h-1,set_stat-4,set_found_block-1, FOR i%=mendx& TO ml2u& ! BLOCKmarkierung löschen-Drucken... men_ienable%(i%)=a% NEXT i% set_menu RETURN PROCEDURE set_menu .| Glob. Var.: shell_p%,mendx0&,mendx&,ml2u&,menu_pointer%,mendx4& .| Felder : men_ienable%() .| Ruft auf : get_char$ .| Aufruf in : switch_menu-1,menu_blkhide-1,search-1,info_kleine_buttons-1, LOCAL i& ' shell_p%=LPEEK(&H4F6) IF shell_p%>0 men_ienable%(mendx0&)=1 ELSE men_ienable%(mendx0&)=0 ENDIF FOR i&=mendx& TO ml2u& IF ASC(@get_char$(menu_pointer%,i&))<>45 ~MENU_IENABLE(menu_pointer%,i&,men_ienable%(i&)) ENDIF NEXT i& ~MENU_IENABLE(menu_pointer%,mendx0&,men_ienable%(mendx0&)) ~MENU_IENABLE(menu_pointer%,mendx4&,men_ienable%(mendx4&)) RETURN ' ---------------------- PROCEDURE wind_mess(w.mess%,whdl&,wx%,wy%,wb%,wh%) .| Glob. Var.: ev_mx&,ev_my&,desk.top% .| Felder : wnr%(),whdl&(),wi%(),fe%() .| Ruft auf : coff,redraw_list,haupt_dialog,wind_top,wind_size,set_slide .| wind_slide,wind_hslide,wind_vslide,do_cursor_anz,set_desk .| Aufruf in : message_auswerten-1, LOCAL a%,b%,nr% ' coff nr%=wnr%(whdl&) ! Windownummer durch Handle holen ' SELECT w.mess% CASE 20 ! WM_REDRAW redraw_list(whdl&,wx%,wy%,wb%,wh%,1) CASE 21 ! WM_TOPPED a%=WIND_FIND(ev_mx&,ev_my&) b%=OBJC_FIND(desk.top%,0,3,ev_mx&,ev_my&) IF a%=whdl&(0) AND b%>0 haupt_dialog ELSE wind_top(whdl&) ENDIF ' CASE 22 ! WM_CLOSE ' exit CASE 23 ! WM_FULLED wi%(nr%,0)=1-wi%(nr%,0) IF wi%(nr%,0) ~WIND_GET(whdl&,7,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) ELSE ~WIND_GET(whdl&,6,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) ENDIF wind_size(nr%,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) set_slide(whdl&) CASE 24 ! WM_ARROWED wind_slide(nr%,wx%) set_slide(whdl&) CASE 25 ! WM_HSLID wind_hslide(whdl&,wx%) set_slide(whdl&) CASE 26 ! WM_VSLID wind_vslide(whdl&,wx%) set_slide(whdl&) CASE 27 ! WM_SIZED wind_size(nr%,wx%,wy%,wb%,wh%) set_slide(whdl&) do_cursor_anz(nr%) CASE 28 ! WM_MOVED wind_size(nr%,wx%,wy%,wb%,wh%) set_desk do_cursor_anz(nr%) CASE 29 ! WM_NEWTOP wind_top(whdl&) ENDSELECT RETURN PROCEDURE wind_slide(nr%,wx%) .| Glob. Var.: z%,wzb%,l_end%,top%,wz%,out%,txt_links%,wc%,txt_breite% .| Felder : whdl&() .| Ruft auf : redraw,scrolldown,scrollup,hpage_l,hpage_r,prev,next .| cursor_anz,scroll_right,scroll_left .| Aufruf in : wind_mess-1, LOCAL whdl& ' whdl&=whdl&(nr%) ' wind_aktpar(nr%) IF nr%=0 SELECT wx% CASE 0 z%=MAX(0,z%-wzb%) redraw(nr%) CASE 1 z%=MIN(l_end%-wzb%,z%+wzb%) redraw(nr%) CASE 2 scrolldown(nr%) CASE 3 scrollup(nr%) CASE 4 hpage_l CASE 5 hpage_r CASE 6 prev(nr%) CASE 7 next(nr%) ENDSELECT cursor_anz(nr%) ELSE SELECT wx% CASE 0 IF top%<>1 top%=MAX(1,top%-wz%) redraw(nr%) ENDIF CASE 1 IF top%<out%-wz% top%=MIN(out%-wz%,top%+wz%) redraw(nr%) ENDIF CASE 2 scrolldown(nr%) CASE 3 scrollup(nr%) CASE 4 txt_links%=MAX(0,txt_links%-wc%) redraw(nr%) CASE 5 txt_links%=MIN(txt_links%+wc%,txt_breite%-wc%) redraw(nr%) CASE 6 scroll_right CASE 7 scroll_left ENDSELECT ENDIF RETURN PROCEDURE wind_hslide(whdl&,wx%) .| Glob. Var.: mode%,d.isk%,lgs%,spd%,f.ile%,fp%,fl%,bps%,h.ard%,block% .| hi_size%,r.am%,ram_addr%,ram_max%,f.dc%,track%,tpd%,txt_links% .| txt_breite%,wc% .| Felder : wnr%() .| Ruft auf : change,lesen,redraw .| Aufruf in : wind_mess-1, LOCAL nr% ' nr%=wnr%(whdl&) IF nr%=0 change SELECT mode% CASE d.isk% lgs%=(spd%-1)/1000*wx% CASE f.ile% fp%=MIN(fl%-bps%,fl%/1000*wx%) CASE h.ard% block%=MAX(0,(hi_size%-1)/1000*wx%) CASE r.am% ram_addr%=ram_max%/1000*wx% CASE f.dc% track%=(tpd%-1)/1000*wx% ENDSELECT lesen ELSE txt_links%=MAX(0,txt_breite%-wc%)/1000*wx% ENDIF redraw(nr%) RETURN PROCEDURE wind_vslide(whdl&,wx%) .| Glob. Var.: z%,l_end%,wzb%,top%,out%,wz% .| Felder : wnr%() .| Ruft auf : redraw .| Aufruf in : wind_mess-1, LOCAL nr% ' nr%=wnr%(whdl&) IF nr%=0 z%=INT((wx%+1)/1000*(l_end%-wzb%)/16)*16 ELSE top%=MAX(1,MIN(out%-wz%,(wx%+1)/1000*(out%-wz%))) ENDIF redraw(nr%) RETURN PROCEDURE set_slide(whdl&) .| Glob. Var.: s.lider%,box_draw%,z%,wz%,mode%,d.isk%,spd%,lgs%,f.ile%,fl% .| fp%,h.ard%,hi_size%,block%,r.am%,ram_max%,ram_addr%,f.dc%,tpd%,track% .| top%,out%,txt_breite%,wc%,txt_links% .| Felder : wnr%() .| Ruft auf : wind_aktpar .| Aufruf in : hard_do_copy-1,rst-1,fdc_trackconfig-1,lesen-1,do_undo-1 .| set_block-1,txt_block-1,wind_mess-5,wind_open-1,wind_set-1 .| wind_top-1,scroll_right-1,scroll_left-1,set_w-1,do_clr_out-1 .| out_do-1,boot_sec-1,disc_check-1,file_read-1,taste-2,cursor-1 .| alt_q-1,ctrl_f-1,edit_ascii-2,scrollup-1,scrolldown-1,top-1,lend-1 .| down-1,up-1,search_lesen-1,search_found-1,fat_xor-1, LOCAL oldxpos%,oldypos%,newxpos%,newypos%,dum% LOCAL oldxbig%,oldybig%,newxbig%,newybig% LOCAL mx%,my%,mb%,mk%,l_end%,nr% ' nr%=wnr%(whdl&) wind_aktpar(nr%) IF s.lider%>0 CLR mb% ELSE ~GRAF_MKSTATE(mx%,my%,mb%,mk%) ENDIF IF whdl&>0 AND mb%=0 AND box_draw%=0 ~WIND_GET(whdl&,8,oldxpos%,dum%,dum%,dum%) ~WIND_GET(whdl&,9,oldypos%,dum%,dum%,dum%) ~WIND_GET(whdl&,15,oldxbig%,dum%,dum%,dum%) ~WIND_GET(whdl&,16,oldybig%,dum%,dum%,dum%) ' IF nr%=0 l_end%=MAX(1,l_end%) newypos%=z%/16/MAX(1,(l_end%/16)-wz%)*1000 newybig%=wz%/(l_end%/16)*1000 SELECT mode% CASE d.isk% CLR newxbig% newxpos%=1000/spd%*lgs% newybig%=wz%/(l_end%/16)*1000 CASE f.ile% newxpos%=1000/MAX(1,fl%-l_end%)*fp% newxbig%=1000/((MAX(1,fl%)/l_end%)) CASE h.ard% newxpos%=1000/MAX(1,hi_size%)*block% CLR newxbig% CASE r.am% newxpos%=1000/ram_max%*ram_addr% CLR newxbig% CASE f.dc% newxpos%=1000/MAX(1,tpd%)*track% newxbig%=1000/MAX(1,tpd%) ENDSELECT ELSE newypos%=1000/MAX(1,l_end%-wz%-1)*(top%-1) newybig%=MAX(1,wz%)/MAX(1,out%-1)*1000 ' wz%: Anzahl der Zeilen newxpos%=1000/MAX(1,txt_breite%-wc%)*txt_links% newxbig%=1000/((MAX(1,txt_breite%)/MAX(1,wc%))) IF newxbig%>999 CLR txt_links% ENDIF ENDIF newxpos%=MIN(1000,newxpos%) newypos%=MIN(1000,newypos%) newxbig%=MIN(1000,newxbig%) newybig%=MIN(1000,newybig%) ' IF newxbig%<>oldxbig% ~WIND_SET(whdl&,15,newxbig%,0,0,0) ENDIF IF newybig%<>oldybig% ~WIND_SET(whdl&,16,newybig%,0,0,0) ENDIF IF newxpos%<>oldxpos% ~WIND_SET(whdl&,8,newxpos%,0,0,0) ENDIF IF newypos%<>oldypos% ~WIND_SET(whdl&,9,newypos%,0,0,0) ENDIF ENDIF RETURN PROCEDURE hpage_l .| Glob. Var.: mode%,d.isk%,lgs%,f.ile%,fp%,buf_size%,h.ard%,block%,r.am% .| ram_addr%,f.dc%,track% .| Ruft auf : change,lesen,redraw .| Aufruf in : wind_slide-1, change SELECT mode% CASE d.isk% lgs%=MAX(0,lgs%-10) CASE f.ile% fp%=MAX(0,fp%-buf_size%) CASE h.ard% block%=MAX(0,block%-10) CASE r.am% ram_addr%=MAX(0,ram_addr%-1024) CASE f.dc% track%=MAX(0,track%-5) ENDSELECT lesen redraw(0) RETURN PROCEDURE hpage_r .| Glob. Var.: mode%,d.isk%,lgs%,spd%,f.ile%,fp%,fl%,buf_size%,h.ard%,block% .| hi_size%,r.am%,ram_addr%,f.dc%,track% .| Ruft auf : change,lesen,redraw .| Aufruf in : wind_slide-1, change SELECT mode% CASE d.isk% lgs%=MIN(spd%-1,lgs%+10) CASE f.ile% fp%=MIN(fl%-buf_size%,fp%+buf_size%) CASE h.ard% block%=MAX(0,MIN(hi_size%-1,block%+10)) CASE r.am% ADD ram_addr%,1024 CASE f.dc% ADD track%,5 ENDSELECT lesen redraw(0) RETURN ' PROCEDURE wind_open(nr%) .| Glob. Var.: dx%,dy%,dw%,dh%,wx&,wy&,wb&,wh&,scr_handle% .| Felder : whdl&(),wnr%(),w_titel%(),fe%() .| Ruft auf : vs_clip,vr_recfl,set_slide,alrt,do_exit .| Aufruf in : wind_init-2, LOCAL handle& handle&=WIND_CREATE(4077,dx%,dy%,dw%,dh%) IF handle&>0 whdl&(nr%)=handle& wnr%(handle&)=nr% CARD{w_titel%(nr%)}=0 ! erst mal kein Titel ~WIND_SET(handle&,2,CARD(SWAP(w_titel%(nr%))),CARD(w_titel%(nr%)),0,0) ~WIND_OPEN(handle&,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) ~WIND_GET(handle&,4,wx&,wy&,wb&,wh&) vs_clip(scr_handle%,1,wx&,wy&,wb&,wh&) ~WIND_UPDATE(1) ~GRAF_MOUSE(256,0) vr_recfl(scr_handle%,wx&,wy&,wb&,wh&) ~GRAF_MOUSE(257,0) ~WIND_UPDATE(0) set_slide(handle&) ELSE ~@alrt(3,"Kann Fenster nicht öffnen.",3,"Abbruch") do_exit ENDIF RETURN PROCEDURE wind_pos(nr%) .| Glob. Var.: wz%,z.hoehe%,wc%,z.breite%,tx%,ty%,desk.top%,ground& .| Felder : whdl&(),wi%() .| Ruft auf : set_aktpar .| Aufruf in : wind_init-1,wind_size-1,wind_set-1, ~WIND_GET(whdl&(nr%),4,wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4)) wz%=(wi%(nr%,4) DIV z.hoehe%)-1 wc%=wi%(nr%,3)/z.breite%-1 ! Breite in Zeichen tx%=((wi%(nr%,1)+1+7) DIV 8)*8 ! x-Ausgabe ty%=wi%(nr%,2)+2*z.hoehe%+0 ! y- " IF nr%=0 ADD ty%,OB_H(desk.top%,ground&) SUB wz%,OB_H(desk.top%,ground&)/z.hoehe% ENDIF set_aktpar(nr%) RETURN PROCEDURE wind_calc(nr%) .| Glob. Var.: wz%,z.hoehe%,l_end%,wzb% .| Felder : fe%(),wi%(),wz%() .| Aufruf in : wind_init-1,wind_set-1, ' Ma₧e und Position des Arbeits-Fensters vorbestimmen ~WIND_CALC(1,4079,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4),wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4)) ' Jetzt stehen in wi%() die Innenma₧e ' fe%(nr%,3)=MIN(fe%(nr%,3),76*z.breite%+fe%(nr%,3)-wi%(nr%,3)) IF nr%=1 wz%=wi%(nr%,4) DIV z.hoehe% ELSE wz%=MIN(l_end%/16,wi%(nr%,4) DIV z.hoehe%) ENDIF wz%(nr%)=wz% wzb%=wz%*16 fe%(nr%,4)=MAX(wz%*z.hoehe%+fe%(nr%,4)-wi%(nr%,4),fe%(nr%,4))+2 ~WIND_CALC(1,4079,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4),wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4)) RETURN PROCEDURE wind_size(nr%,wx%,wy%,wb%,wh%) .| Glob. Var.: desk.top%,z.hoehe%,scr_width%,scr_height%,z.breite%,wz%,bps% .| buttons&,wzb%,z%,xt%,yt%,tz%,hex!,top%,out% .| Felder : whdl&(),wi%(),wz%(),fe%() .| Ruft auf : wind_pos,redraw .| Aufruf in : wind_init-1,wind_mess-3,wind_set-1, LOCAL wxx%,whdl&,ddh% ' hier kommen Au₧enma₧e ddh%=OB_H(desk.top%,0) whdl&=whdl&(nr%) wh%=MAX(10*z.hoehe%,wh%) wb%=MIN(scr_width%-8,wb%) wh%=MIN(scr_height%-8,wh%) ' ' wx,wy,... umrechnen in wi%(...) ~WIND_CALC(1,4079,wx%,wy%,wb%,wh%,wi%(nr%,1),wi%(nr%,2),wi%(nr%,3),wi%(nr%,4)) wxx%=wh%-wi%(nr%,4) ! Differenz Fenster aussen-innen ' wb%=(wi%(nr%,3) DIV z.breite%)*z.breite%+4+wb%-wi%(nr%,3)-1 ! fiel vom Himmel ' IF nr%=0 wz%=(wi%(nr%,4)-ddh%) DIV z.hoehe%+1 IF wz%>bps%/16 AND nr%=0 wz%=bps%/16+2 ENDIF wh%=wz%*z.hoehe%+ddh%+wxx%-z.hoehe%+2 wb%=MAX(OB_W(desk.top%,buttons&)+10,wb%) ELSE wz%=(wi%(nr%,4) DIV z.hoehe%) wh%=wz%*z.hoehe%+wxx%+2 wb%=MAX(wb%,30*z.breite%) ENDIF ' IF wh%>scr_height% SUB wh%,z.hoehe%*2 ENDIF ' wz%(nr%)=wz% ! Anzahl der Zeilen merken wzb%=wz%*16 ' wx%=MAX(4,(wx% DIV 8)*8+4) ' ~WIND_SET(whdl&(nr%),5,wx%,wy%,wb%,wh%) ~WIND_GET(whdl&(nr%),5,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) wind_pos(nr%) ' IF nr%=0 CLR z%,xt%,yt%,tz% hex!=TRUE ELSE IF top%+wz%>out% top%=MAX(1,out%-wz%) ENDIF ENDIF redraw(nr%) RETURN PROCEDURE wind_clr(whdl&) .| Glob. Var.: wx&,wy&,wb&,wh&,scr_handle% .| Ruft auf : vs_clip,vr_recfl .| Aufruf in : wind_set-1, ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) vs_clip(scr_handle%,1,wx&,wy&,wb&,wh&) ~WIND_UPDATE(1) ~GRAF_MOUSE(256,0) vr_recfl(scr_handle%,wx&,wy&,wb&,wh&) ~GRAF_MOUSE(257,0) ~WIND_UPDATE(0) vs_clip(scr_handle%,0,0,0,0,0) RETURN PROCEDURE wind_set(whdl&) .| Glob. Var.: wx&,wy&,wb&,wh& .| Felder : wnr%(),fe%() .| Ruft auf : set_vdipar,wind_pos,wind_calc,wind_size,wind_clr,set_slide .| redraw_list .| Aufruf in : hard_on-1,disc_drive-1, LOCAL nr% nr%=wnr%(whdl&) set_vdipar wind_pos(whdl&) wind_calc(whdl&) wind_size(nr%,fe%(nr%,1),fe%(nr%,2),fe%(nr%,3),fe%(nr%,4)) wind_clr(whdl&) set_slide(whdl&) ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) redraw_list(whdl&,wx&,wy&,wb&,wh&,0) RETURN PROCEDURE wind_top(whdl&) .| Glob. Var.: wind% .| Felder : wnr%() .| Ruft auf : coff,wind_aktpar,set_slide,set_stat .| Aufruf in : last_11-1,last_7-1,haupt_dialog-2,wind_mess-2,wind_cycle-1 .| no_on-1,out_do-1,disc_check-1,last_5-2,last_10-1,dir_secsearch-1 .| last_3-1,ctrl_h-1,floskel-1,opt_text-1,last_4-1, ~FRE(0) coff ~WIND_SET(whdl&,10,0,0,0,0) wind%=wnr%(whdl&) wind_aktpar(wind%) set_slide(whdl&) set_stat ' do_cursor_anz(wind%) !?? RETURN PROCEDURE wind_new .| Aufruf in : do_pexec-1, CARD{GCONTRL}=109 {GCONTRL+2}=0 {GCONTRL+6}=0 GEMSYS RETURN PROCEDURE wind_cycle .| Glob. Var.: wind% .| Felder : whdl&() .| Ruft auf : wind_top .| Aufruf in : menu_mess-1, wind%=1-wind% wind_top(whdl&(wind%)) ~EVNT_TIMER(100) RETURN PROCEDURE wind_aktpar(nr%) ! aktuelle Fensterdaten holen .| Glob. Var.: wz%,wzb%,wc%,tx%,ty%,l_end% .| Felder : wz%(),wc%(),tx%(),ty%(),l_end%() .| Aufruf in : message_auswerten-2,set_slide-1,wind_top-1,redraw_list-1 .| scrollup-1,scrolldown-1, wz%=wz%(nr%) wzb%=wz%*16 wc%=wc%(nr%) tx%=tx%(nr%) ty%=ty%(nr%) l_end%=l_end%(nr%) RETURN PROCEDURE set_aktpar(nr%) .| Glob. Var.: l_end%,wc%,wz%,tx%,ty% .| Felder : l_end%(),wc%(),wz%(),tx%(),ty%() .| Aufruf in : var_init-1,fdc_anal-1,wind_pos-1,file_on-1,fdc_on-1, l_end%(nr%)=l_end% wc%(nr%)=wc% wz%(nr%)=wz% tx%(nr%)=tx% ty%(nr%)=ty% RETURN PROCEDURE desktop_weg .| Glob. Var.: menu_pointer% .| Felder : whdl&() .| Aufruf in : setfont-1,do_pexec-1,start_shell-1, ~WIND_CLOSE(whdl&(0)) ~WIND_CLOSE(whdl&(1)) ~WIND_DELETE(whdl&(0)) ~WIND_DELETE(whdl&(1)) ~MENU_BAR(menu_pointer%,0) RETURN PROCEDURE desktop_back .| Glob. Var.: menu_pointer% .| Ruft auf : wind_init,do_cursor_anz .| Aufruf in : setfont-1,do_pexec-1,start_shell-1, wind_init ! Fenster öffnen ~MENU_BAR(menu_pointer%,1) ! Menu ein do_cursor_anz(0) RETURN ' ---------------------- PROCEDURE redraw_list(whdl&,wx%,wy%,wb%,wh%,msc%) .| Glob. Var.: desk.top%,ground&,scr_handle%,z.hoehe%,info_line$,ty%,z% .| vdi_par%,buf%,ak%,offset%,mode%,f.ile%,fp%,r.am%,ram_addr%,zeile%,tx% .| wc%,wz%,top%,z_buf%,txt_blkon%,txt_links% .| Felder : wnr%(),wi%(),tx%(),ty%(),out$() .| Ruft auf : wind_aktpar,redraw_desk,vs_clip,get_info,vr_recfl,v_gtext .| v_line,out_txt_line,cursor_anz,mnorm .| Aufruf in : wind_mess-1,wind_set-1,wind_update-1,info_line-1 .| scroll_right-1,scroll_left-1,opt_text-1, LOCAL ddh%,az%,br%,i%,r%,wgx&,wgy&,wgb&,wgh&,a$ LOCAL rx%,ry%,rb%,rh% ' r%=wnr%(whdl&) ! Window nummer wind_aktpar(r%) ' ddh%=OB_H(desk.top%,ground&) IF r%=0 AND wy%<wi%(0,2)+ddh% redraw_desk(ground&) ENDIF ' rx%=wi%(r%,1) ry%=wi%(r%,2) rb%=wi%(r%,3) rh%=wi%(r%,4) ' ~WIND_UPDATE(1) ~WIND_GET(whdl&,11,wgx&,wgy&,wgb&,wgh&) ! 1.Rechteck holen WHILE wgh&>0 AND wgb&>0 IF RC_INTERSECT(wx%,wy%,wb%,wh%,wgx&,wgy&,wgb&,wgh&)=TRUE ' ~GRAF_MOUSE(256,0) vs_clip(scr_handle%,1,wgx&,wgy&,wgb&,wgh&) get_info(r%) ' IF r%=0 ! Datenfenster? ' IF msc%=1 ! Fenster ganz löschen? vr_recfl(scr_handle%,rx%,ry%+ddh%+1,rb%,rh%) ENDIF ' Statuszeile schreiben v_gtext(tx%(r%),ry%+z.hoehe%+ddh%,info_line$) ' Linie unter Statuszeile v_line(scr_handle%,rx%,ty%-z.hoehe%,rx%+rb%-1,ty%-z.hoehe%) IF msc%<2 z%=MAX(0,z%) {vdi_par%}=z%+buf% ! Daten {vdi_par%+4}=z%+ak% ! Status {vdi_par%+8}=z%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr% ~C:zeile%(0,L:vdi_par%,tx%,ty%,wc%+1,wz%,-1) ' Opcode,Struct,x-Pos, y- , Spalte,Zeile,Byte(-1=alles) ENDIF ELSE IF msc%=1 vr_recfl(scr_handle%,rx%,ry%,rb%,rh%) ENDIF ' Statuszeile schreiben v_gtext(tx%(r%),ty%(r%)-z.hoehe%-1,LEFT$(out$(0)+STRING$(wc%,32),wc%)) ' Linie unter Statuszeile v_line(scr_handle%,rx%,ty%-z.hoehe%,rx%+rb%,ty%-z.hoehe%) az%=ty% top%=MAX(1,top%) {vdi_par%}=z_buf% br%=wc%+1 ' IF txt_blkon%=0 FOR i%=top% TO top%+wz%-1 a$=LEFT$(MID$(out$(i%),txt_links%+1,wc%)+STRING$(wc%,32),br%)+CHR$(0) BMOVE V:a$,z_buf%,LEN(a$) ~C:zeile%(1,L:vdi_par%,tx%,az%,br%,0,0) ADD az%,z.hoehe% NEXT i% ELSE FOR i%=top% TO top%+wz%-1 a$=LEFT$(MID$(out$(i%),txt_links%+1,wc%)+STRING$(wc%,32),br%)+CHR$(0) BMOVE V:a$,z_buf%,LEN(a$) out_txt_line(i%,br%,tx%,az%) ADD az%,z.hoehe% NEXT i% ENDIF ' ENDIF ~GRAF_MOUSE(257,0) ENDIF ~WIND_GET(whdl&,12,wgx&,wgy&,wgb&,wgh&) WEND ~WIND_UPDATE(0) ' vs_clip(scr_handle%,0,0,0,0,0) cursor_anz(r%) mnorm RETURN PROCEDURE zeile(zl%) ! Zeile ausgeben .| Glob. Var.: scr_handle%,wind%,z%,vdi_par%,buf%,ak%,offset%,mode%,f.ile% .| fp%,r.am%,ram_addr%,zeile%,z.hoehe%,wc% .| Felder : wi%(),tx%(),ty%() .| Ruft auf : vs_clip .| Aufruf in : set_block-2,scrollup-1,scrolldown-1, LOCAL zg% vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4)) zg%=z%+zl%*16 {vdi_par%}=zg%+buf% {vdi_par%+4}=zg%+ak% {vdi_par%+8}=zg%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr% ~WIND_UPDATE(1) ~C:zeile%(0,L:vdi_par%,tx%(wind%),ty%(wind%)+zl%*z.hoehe%,wc%+1,1,-1) ' Opcode,Struct,x-Pos,y-,Spalten,Zeilen,alles) ~WIND_UPDATE(0) vs_clip(scr_handle%,0,0,0,0,0) RETURN PROCEDURE byte(zl%,by%) ! Byte ausgeben .| Glob. Var.: z%,vdi_par%,buf%,ak%,offset%,mode%,f.ile%,fp%,r.am%,ram_addr% .| zeile%,tx%,ty%,z.hoehe%,wc% .| Aufruf in : edit_ex-2, LOCAL zg% zg%=z%+zl%*16 {vdi_par%}=zg%+buf% {vdi_par%+4}=zg%+ak% {vdi_par%+8}=zg%+offset%-(mode%=f.ile%)*fp%-(mode%=r.am%)*ram_addr% ~GRAF_MOUSE(256,0) ~WIND_UPDATE(1) ~C:zeile%(0,L:vdi_par%,tx%,ty%+zl%*z.hoehe%,wc%+1,1,by%) ' Opcode,Struct,x-Pos,y- ,Spalten,Zeilen,Nummer des Bytes(-1 = alles) ~WIND_UPDATE(0) ~GRAF_MOUSE(257,0) RETURN PROCEDURE text_line(zl%) ! Eine Textzeile ausgeben .| Glob. Var.: scr_handle%,wind%,txt_links%,z_buf%,vdi_par%,top%,z.hoehe% .| Felder : wi%(),out$(),wc%(),tx%(),ty%() .| Ruft auf : vs_clip,out_txt_line .| Aufruf in : txt_block-2,edit_ascii-1,scrollup-1,scrolldown-1, LOCAL a$,a%,i% a%=zl%-1 vs_clip(scr_handle%,1,wi%(wind%,1),wi%(wind%,2),wi%(wind%,3),wi%(wind%,4)) a$=LEFT$(MID$(out$(a%),txt_links%+1,wc%(1))+STRING$(wc%(1),32),wc%(1)+1) BMOVE V:a$,z_buf%,wc%(1)+1 {vdi_par%}=z_buf% ~WIND_UPDATE(1) out_txt_line(a%,wc%(1)+1,tx%(1),ty%(1)+MAX(0,(a%-top%))*z.hoehe%) ~WIND_UPDATE(0) vs_clip(scr_handle%,0,0,0,0,0) RETURN PROCEDURE out_txt_line(i%,br%,x%,y%) .| Glob. Var.: tblkaz%,tblkez%,tbuf_beg%,tbuf_end%,zeile%,vdi_par%,tblkes% .| tblkas%,txt_links% .| Aufruf in : redraw_list-1,text_line-1, IF i%<tblkaz% OR i%>tblkez% OR (tbuf_beg%=tbuf_end%) ~C:zeile%(1,L:vdi_par%,x%,y%,br%,0,0) ELSE IF i%=tblkaz% AND i%=tblkez% AND tblkes%<>0 ~C:zeile%(1,L:vdi_par%,x%,y%,br%,tblkas%-txt_links%,tblkes%-txt_links%) ELSE IF i%=tblkaz% ~C:zeile%(1,L:vdi_par%,x%,y%,br%,tblkas%-txt_links%,br%) ELSE IF i%=tblkez% AND tblkes%<>0 ~C:zeile%(1,L:vdi_par%,x%,y%,br%,1,tblkes%-txt_links%) ELSE IF i%>tblkaz% OR i%<tblkez% ~C:zeile%(1,L:vdi_par%,x%,y%,br%,1,br%) ENDIF ENDIF ENDIF ENDIF ENDIF ' Op, Strukt, x-,y-,Spalten, first Revers, last Revers RETURN PROCEDURE wind_update(whdl&) .| Glob. Var.: nr%,wx&,wy&,wb&,wh&,desk.top%,ground& .| Felder : wnr%() .| Ruft auf : redraw_list .| Aufruf in : redraw-1,do_list-2, nr%=wnr%(whdl&) ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) IF nr%=0 ADD wy&,OB_H(desk.top%,ground&) SUB wh&,OB_H(desk.top%,ground&) ENDIF redraw_list(whdl&,wx&,wy&,wb&,wh&,0) RETURN PROCEDURE redraw(nr%) ! Redraw von richtigen Fenster .| Felder : whdl&() .| Ruft auf : wind_update .| Aufruf in : wind_slide-6,wind_hslide-1,wind_vslide-1,hpage_l-1,hpage_r-1 .| wind_size-1,ctrl_h-2,scrollup-2,scrolldown-2,down-1,up-1, wind_update(whdl&(nr%)) RETURN PROCEDURE do_list .| Felder : whdl&() .| Ruft auf : wind_update .| Aufruf in : hard_read-1,hard_command-1,hard_zero-1,clr_part-1 .| hard_save-1,hard_restore-1,hard_bad-1,get_root_info-1,unit_ready-1 .| hard_root-1,last_7-1,fdc_side-1,fdc_trkread-1,fdc_trackconfig-1 .| convert-1,anal_buf-1,gap-1,fdc_anal-1,fdc_diskanal-1 .| ram_adress_read-1,prg_load-1,do_undo-2,sektor_read-1 .| sektor_cluster-1,ph_side-1,sektor_physik_do-1,sektor_compare-1 .| set_block-1,txt_block-2,wind_dklick-1,set_w-1,out_do-2,disc_info-1 .| disc_save-1,disc_load-1,last_5-4,file_open-2,file_close-1 .| datei_cut-1,do_datei_info-2,dir_secsearch-1,dir_fldren-1,dir_root-1 .| last_12-1,maus_sort-2,to_blk_anf-1,to_blk_end-1,do_in-1,in_file-1 .| taste-2,control-1,alt_f-1,ctrl_a-1,ctrl_b-1,ctrl_c-1,ctrl_f-1 .| ctrl_g-1,ctrl_k-1,magic-1,set_list_offset-1,edit_ascii-3,top-1 .| lend-1,address-1,look_ex-1,set_found_block-1,floskel-1,opt_konfig-1 .| fat_xor-2,last_4-1,fat_read1-1,fat_read2-1,set_cursor_in_fat-1 .| cl_up-1,cl_down-1,test_suche-2, wind_update(whdl&(0)) wind_update(whdl&(1)) RETURN ' PROCEDURE info_line ! nur Statuszeile ausgeben?? .| Glob. Var.: box_draw%,wx&,wy&,wb&,wh&,desk.top%,ground& .| Felder : whdl&() .| Ruft auf : get_info,redraw_list .| Aufruf in : hard_ship-1,fdc_secread-1,fdc_null-2,analyse-1,schreiben-1 .| disc_check-4,file_open-1,last_10-1,do_file_open-1,alt_q-1,dec_hex-1 .| last_4-1, LOCAL whdl& IF box_draw%=0 whdl&=whdl&(0) get_info(0) ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) ADD wy&,OB_H(desk.top%,ground&) SUB wh&,OB_H(desk.top%,ground&) redraw_list(whdl&,wx&,wy&,wb&,wh&,2) ENDIF RETURN PROCEDURE set_desk .| Glob. Var.: wx&,wy&,wb&,wh&,desk.top%,ground& .| Felder : whdl&() .| Aufruf in : wind_mess-1,redraw_desk-1, ~WIND_GET(whdl&(0),4,wx&,wy&,wb&,wh&) OB_X(desk.top%,ground&)=wx& OB_Y(desk.top%,ground&)=wy& OB_W(desk.top%,ground&)=wb& RETURN PROCEDURE redraw_desk(objc&) .| Glob. Var.: desk.top%,scr_handle% .| Felder : whdl&() .| Ruft auf : set_desk,vs_clip .| Aufruf in : rsc_init-1,set_button-1,clr_button-1,set_mod_button-1 .| set_kleine_buttons-1,redraw_list-1, LOCAL wgx&,wgy&,wgb&,wgh&,wb%,wh%,wx%,wy%,whdl& set_desk whdl&=whdl&(0) ~OBJC_OFFSET(desk.top%,objc&,wx%,wy%) wb%=OB_W(desk.top%,objc&) ! Koordinaten des Objektes ermitteln, wh%=OB_H(desk.top%,objc&)+1 ! ab dem neu gezeichnet werden soll ~WIND_UPDATE(1) ~WIND_GET(whdl&,11,wgx&,wgy&,wgb&,wgh&) WHILE wgh&>0 AND wgb&>0 IF RC_INTERSECT(wx%,wy%,wb%,wh%,wgx&,wgy&,wgb&,wgh&)=TRUE vs_clip(scr_handle%,1,wgx&,wgy&,wgb&,wgh&) ~OBJC_DRAW(desk.top%,objc&,8,wgx&,wgy&,wgb&,wgh&) ENDIF ~WIND_GET(whdl&,12,wgx&,wgy&,wgb&,wgh&) WEND ~WIND_UPDATE(0) vs_clip(scr_handle%,0,0,0,0,0) RETURN PROCEDURE scroll_right ! Textfenster scrollen .| Glob. Var.: txt_links%,wx&,wy&,wb&,wh&,z.hoehe% .| Felder : whdl&() .| Ruft auf : redraw_list,set_slide .| Aufruf in : wind_slide-1,c_left-1, IF txt_links%>0 txt_links%=MAX(0,txt_links%-1) ~WIND_GET(whdl&(1),4,wx&,wy&,wb&,wh&) redraw_list(whdl&(1),wx&,wy&+z.hoehe%,wb&,wh&-z.hoehe%,0) set_slide(whdl&(1)) ENDIF RETURN PROCEDURE scroll_left ! ... .| Glob. Var.: txt_links%,txt_breite%,wc%,wx&,wy&,wb&,wh&,z.hoehe% .| Felder : whdl&() .| Ruft auf : redraw_list,set_slide .| Aufruf in : wind_slide-1,c_right-1,edit_ascii-1, IF txt_links%<txt_breite%-wc% txt_links%=MIN(txt_links%+1,txt_breite%-wc%) ~WIND_GET(whdl&(1),4,wx&,wy&,wb&,wh&) redraw_list(whdl&(1),wx&,wy&+z.hoehe%,wb&,wh&-z.hoehe%,0) set_slide(whdl&(1)) ENDIF RETURN ' ---------------------- ' disc_on: Auf Diskmodus umschalten PROCEDURE disc_on .| Glob. Var.: mode%,d.isk% .| Ruft auf : no_on,boot_sec,set_w .| Aufruf in : menu_2-1,last_5-1,dir_fldren-1, no_on mode%=d.isk% boot_sec ! Laufwerksinfo von Laufwerk drive% lesen set_w RETURN PROCEDURE file_on .| Glob. Var.: mode%,f.ile%,bps%,buf_size%,l_end%,file_open%,fl%,fi_o$ .| Ruft auf : no_on,set_aktpar,do_file_open,lesen,set_w .| Aufruf in : menu_1-1, no_on mode%=f.ile% bps%=buf_size%/2 l_end%=bps% set_aktpar(0) IF file_open%<0 CLR fl% ELSE IF file_open%=0 do_file_open(fi_o$) ENDIF ENDIF lesen set_w RETURN PROCEDURE hard_on .| Glob. Var.: mode%,h.ard% .| Felder : whdl&() .| Ruft auf : no_on,do_mode_sense,wind_set,set_w .| Aufruf in : menu_4-1, no_on mode%=h.ard% do_mode_sense wind_set(whdl&(0)) set_w RETURN PROCEDURE ram_on .| Glob. Var.: bps%,mode%,r.am% .| Ruft auf : no_on,cbps,set_w .| Aufruf in : menu_3-1, no_on bps%=512 cbps mode%=r.am% set_w RETURN PROCEDURE fdc_on .| Glob. Var.: mode%,f.dc%,l_end%,buf_size%,tpd% .| Ruft auf : no_on,set_aktpar,set_w .| Aufruf in : menu_5-1, no_on mode%=f.dc% l_end%=buf_size% set_aktpar(0) tpd%=99 set_w RETURN PROCEDURE set_w .| Glob. Var.: z%,wzb%,l_end%,set_w% .| Felder : whdl&() .| Ruft auf : set_slide,lesen,set_stat,do_list .| Aufruf in : disc_on-1,file_on-1,hard_on-1,ram_on-1,fdc_on-1,disc_drive-2 .| last_3-1, IF z%+wzb%>l_end% CLR z% ENDIF set_slide(whdl&(0)) lesen INC set_w% IF set_w%>1 set_stat do_list ENDIF RETURN PROCEDURE no_on .| Felder : whdl&() .| Ruft auf : file_is_open,clear_buf,wind_top .| Aufruf in : disc_on-1,file_on-1,hard_on-1,ram_on-1,fdc_on-1, file_is_open clear_buf(1) wind_top(whdl&(0)) RETURN ' PROCEDURE clear_buf(a%) .| Glob. Var.: buf_size%,buf%,ak% .| Aufruf in : fdc_trackconfig-1,fdc_secread-1,gap-1,fdc_anal-1,no_on-1 .| disc_clear-1,file_open-1,file_close-1,datei_cut-1,datei_concat-1 .| do_file_open-1,init_ram-1, LOCAL a$ a$=STRING$(buf_size%,0) BMOVE V:a$,buf%,buf_size% IF a%>0 BMOVE V:a$,ak%,buf_size% ENDIF CLR a$ RETURN PROCEDURE dum ! Für noch nicht implementierte Routinen .| Ruft auf : maus_off .| Aufruf in : fdc_head-1,menu_mess-47,lies_all-1,maus_pos-3,einstellungen-1, maus_off RETURN PROCEDURE cbps .| Glob. Var.: bps%,l_end% .| Felder : l_end%() .| Aufruf in : do_mode_sense-1,do_mode_select-1,ram_on-1,disc_info-2, IF bps%<512 OR bps%>8192 bps%=512 ENDIF l_end%(0)=bps% l_end%=bps% RETURN ' ---------------------- PROCEDURE stat_line(whdl&) ! Statuszeile angeklickt .| Glob. Var.: ev_mx&,wind%,mode%,d.isk%,f.ile%,h.ard%,r.am%,f.dc% .| Felder : wnr%() .| Ruft auf : get_info,akt_find,sektor_read,sektor_cluster,ph_track,ph_sec .| ph_side,disc_drive,show_status,dec_hex,file_name,hard_read,hard_unit .| sh_hd_err,ram_adress_read,fdc_trkread,fdc_secread,fdc_side,fdc_drive .| fdc_bytes,opt_ascii .| Aufruf in : message_auswerten-2, LOCAL akt% get_info(wnr%(whdl&)) akt%=@akt_find(ev_mx&) IF wind%=0 SELECT mode% CASE d.isk% ON akt% GOSUB sektor_read,sektor_cluster,ph_track,ph_sec,ph_side,disc_drive,show_status CASE f.ile% ON akt% GOSUB dec_hex,file_name,file_name CASE h.ard% ON akt% GOSUB hard_read,hard_unit,hard_unit,sh_hd_err,sh_hd_err,sh_hd_err,sh_hd_err CASE r.am% ON akt% GOSUB ram_adress_read CASE f.dc% ON akt% GOSUB fdc_trkread,fdc_secread,fdc_side,fdc_drive,fdc_bytes ENDSELECT ELSE opt_ascii ENDIF RETURN PROCEDURE clr_out(txt$) .| Glob. Var.: s.ammeln% .| Ruft auf : do_clr_out,out .| Aufruf in : hard_statistik-1,hard_search-1,hard_bad-1,fdc_readadress-1 .| fdc_diskanal-1,fdc_trkinfo-1,ram_cookie-1,ram_test-1,disc_quick-1 .| disc_check-1,file_compare-1,datei_suchen-1,dir_sort-1,alt_q-1 .| info_system-1,info_fkey-1,info_kleine_buttons-1,info_platten-1 .| show_status-1,sh_hd_err-1,help-1,show_err_inf-1,do_ascii-1 .| fat_cluster-1,fat_optimum-1,disass-1, IF s.ammeln%=0 do_clr_out(txt$) ELSE out(txt$) ENDIF RETURN PROCEDURE do_clr_out(txt$) .| Glob. Var.: sperr_txt%,out%,txt_breite%,top%,max.text% .| Felder : l_end%(),out$(),whdl&() .| Ruft auf : mtasse,set_slide,mnorm,out .| Aufruf in : hard_root-1,clr_out-1,file_repair-1,dir_files-1,opt_text-1 .| fat_graf_do-1, LOCAL i% IF sperr_txt%=0 CLR out%,txt_breite% l_end%(1)=0 top%=1 mtasse FOR i%=0 TO max.text% ! ERASE OUT$() funktioniert nicht --> 2 Bomben !! out$(i%)="" NEXT i% set_slide(whdl&(1)) mnorm out(txt$) ENDIF RETURN PROCEDURE out_do .| Glob. Var.: last%,top%,out%,wz%,txt_breite%,txt_links%,erg%,s.ammeln% .| wind%,hdl% .| Felder : out$(),l_end%(),whdl&() .| Ruft auf : set_slide,wind_top,do_list,out_sed,fwritec,look_ex .| Aufruf in : hard_statistik-1,hard_search-1,hard_bad-1,show_root-1 .| fdc_readadress-1,fdc_diskanal-1,fdc_trkinfo-1,ram_cookie-1 .| ram_test-1,ram_check-2,disc_quick-1,disc_check-1,file_repair-1 .| file_compare-1,datei_suchen-1,file_verify-1,pfad_compare-3 .| dir_files-1,dir_sort-1,alt_q-1,alt_t-1,info_system-1,info_fkey-1 .| info_kleine_buttons-1,info_platten-1,show_status-1,sh_hd_err-1 .| help-1,opt_text-1,do_save_text-1,show_err_inf-1,do_ascii-1 .| fat_cluster-1,fat_optimum-1,fat_graph-1,last_4-1,disass-1, LOCAL i% ' CLR last% top%=MAX(1,top%) FOR i%=out% TO out%+wz% out$(i%)="" NEXT i% l_end%(1)=out% IF txt_breite%<txt_links% txt_links%=1 ENDIF ' IF erg%=3 IF s.ammeln%<>0 top%=MAX(1,out%-wz%) ENDIF set_slide(whdl&(1)) IF wind%=0 wind_top(whdl&(1)) do_list ELSE do_list ! muss sein, wegen MAGIX - Smart-Redraw ENDIF ELSE IF erg%=1 OR erg%=2 out_sed(hdl%) ENDIF FOR i%=0 TO out% fwritec(hdl%,out$(i%)) NEXT i% look_ex ENDIF RETURN PROCEDURE out(txt$) .| Glob. Var.: sperr_txt%,out%,txt_breite%,max.text%,wz% .| Felder : out$() .| Aufruf in : search_cookie-1,hard_statistik-6,hard_search-1,hard_bad-3 .| inc_bad_err-1,hard_set_bad-1,unit_ready-10,hard_root-15,show_root-3 .| fdc_readadress-1,fdc_diskanal-1,fdc_do_info-5,ram_test-2,ram_check-5 .| clr_out-1,do_clr_out-1,disc_quick-1,disc_check-2,file_repair-1 .| lies_1-1,lies_3-1,file_verify-8,verify_out-1,pfad_compare-2 .| dir_files-4,dir_sort-1,control-2,alt_q-5,alt_t-1,edit_ascii-1 .| info_system-15,info_fkey-3,info_kleine_buttons-1,info_platten-5 .| show_status-1,sh_hd_err-2,help-2,show_err_inf-1,do_ascii-1 .| fat_cluster-2,fat_optimum-4,fat_graf_do-2,fat_get_defekt-2 .| temple_disass-1,sed_disass-2, IF sperr_txt%=0 out$(out%)=txt$ txt_breite%=MAX(txt_breite%,LEN(txt$)) INC out% IF out%>max.text%-wz% out%=max.text%-wz%-1 ENDIF ENDIF RETURN PROCEDURE set_last(a%) .| Glob. Var.: sperr_txt%,last% .| Ruft auf : do_cursor_anz .| Aufruf in : hard_search-1,show_root-1,file_repair-1,file_compare-1 .| dir_files-1,dir_sort-1,info_fkey-1,info_kleine_buttons-1,fat_graph-1 .| last_4-1, IF sperr_txt%=0 last%=a% do_cursor_anz(1) ENDIF RETURN PROCEDURE out_sed(hdl%) .| Glob. Var.: t.xtsavm%,ver$ .| Ruft auf : fwritec .| Aufruf in : out_do-1,sav_buf-1,sav_block-1,print_buf-1,print_blk-1, IF t.xtsavm%<>0 fwritec(hdl%,ver$+": "+DATE$+" "+TIME$) ENDIF RETURN ' PROCEDURE dat_lesen .| Glob. Var.: wind% .| Ruft auf : in_file,opt_ascii .| Aufruf in : menu_mess-1, ON wind%+1 GOSUB in_file,opt_ascii RETURN PROCEDURE dat_sichern .| Glob. Var.: wind%,erg% .| Ruft auf : schreiben,save_text .| Aufruf in : menu_mess-1, IF wind%=0 schreiben ELSE erg%=1 @save_text ENDIF RETURN PROCEDURE dat_sichern_als .| Glob. Var.: erg%,wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg% .| Ruft auf : alrt,sav_buf,sav_block,save_text,save_block .| Aufruf in : menu_mess-1, LOCAL wwa% erg%=1 IF wind%=0 wwa%=1 IF buf_end%>buf_beg% wwa%=@alrt(2,"Daten sichern ...",1,"Puffer|Block|Abbruch") ENDIF ON wwa% GOSUB sav_buf,sav_block ELSE wwa%=1 IF tbuf_end%>tbuf_beg% wwa%=@alrt(2,"Textfenster sichern ...",1,"Puffer|Block|Abbruch") ENDIF ON wwa% GOSUB save_text,save_block ENDIF RETURN PROCEDURE dat_drucken .| Glob. Var.: erg%,wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg% .| Ruft auf : alrt,print_buf,print_blk,print_text,print_block .| Aufruf in : menu_mess-1, LOCAL wwa% erg%=2 IF wind%=0 wwa%=1 IF buf_end%>buf_beg% wwa%=@alrt(2,"Was drucken?",1,"Puffer|Block|Abbruch") ENDIF ON wwa% GOSUB print_buf,print_blk ELSE wwa%=1 IF tbuf_end%>tbuf_beg% wwa%=@alrt(2,"Was aus dem Textfenster drucken?",1,"Puffer|Block|Abbruch") ENDIF ON wwa% GOSUB print_text,print_block ENDIF RETURN ' ---------------------- Proceduren für DISC ------------------- PROCEDURE disc_info .| Glob. Var.: lgs%,bstatus%,status%,bps%,buf%,bflag%,spd%,spc%,boot.dat% .| bd1&,bd2&,bd3&,bd4&,bd5&,bd6&,chk_sum%,bd7&,bd8&,bd9&,serie%,i&,bp1& .| bp2&,bp3&,len_dir%,bp4&,len_fat%,bp5&,bp6&,anf_dat%,bp7&,tpd%,drive% .| n$,bde1&,bde2&,anf_fat2%,disc_name$,zg%,f$,att%,bdvolume&,bootget& .| disk_defekt%,bootwr&,fil$,fhandle%,spf%,spt%,sid%,t%,b% .| Ruft auf : boot_sec,readmot,alrt,cbps,put_wert,put_char,lesen,box_draw .| form_do,clr_state,box_undraw,get_char$,schreiben,dsetdrv,dsetpath .| nam_conv$,fcreate,fclose,get_val,put_in_bootsec,term$,media,err_inf .| do_list .| Aufruf in : menu_mess-1,disc_drive-1, LOCAL a%,b#,bbps%,c%,ex_obj&,oldlgs%,t%,a$,b$,bb$ ' oldlgs%=lgs% boot_sec bstatus%=status% bb$=STRING$(bps%,0) ! zum Bootsektor sichern BMOVE buf%,V:bb$,bps% ' IF bstatus%=0 c%=@readmot(22) ! FAT-Grö₧e IF (bflag% AND 1)<>0 b#=2 ELSE b#=1.5 ENDIF bbps%=@readmot(11) t%=@readmot(19) ! Anzahl der Sektoren als Wort IF t%=0 t%=SHL(@readmot(34),16)+@readmot(32) ! Anzahl der Sektoren als Langwort ENDIF a%=(t%-@readmot(14)-BYTE{buf%+16}*c%-@readmot(17)*32/bbps%)/BYTE{buf%+13}+2 ! benötigte FAT-Einträge a%=(a%*b#+bbps%-1)/bbps% ! benötigte FAT-Sektoren IF c%<a% ! reichen die FAT-Sektoren? ~@alrt(3,"FAT-Grö₧e im Bootsektor zu klein!!! |Mu₧ "+STR$(a%)+" Sektoren|gro₧ sein!",1," Aha ") ENDIF ENDIF cbps ' ' Daten aus dem Bootsektor IF bstatus%=0 put_wert(boot.dat%,bd1&,@readmot(11),4) put_wert(boot.dat%,bd2&,BYTE{buf%+13},4) put_wert(boot.dat%,bd3&,@readmot(17),4) put_wert(boot.dat%,bd4&,@readmot(22),4) put_wert(boot.dat%,bd5&,t%,7) put_char(boot.dat%,bd6&,HEX$(chk_sum%,4)) put_wert(boot.dat%,bd7&,@readmot(24),4) put_wert(boot.dat%,bd8&,@readmot(26),4) put_wert(boot.dat%,bd9&,serie%,8) ELSE FOR i&=bd1& TO bd9& put_char(boot.dat%,i&,"") NEXT i& ENDIF ' ' Daten vom BIOSPARAMETERBLOCK put_char(boot.dat%,bp1&,STR$(bps%)) put_char(boot.dat%,bp2&,STR$(spc%)) put_char(boot.dat%,bp3&,STR$(len_dir%*(bps%/32))) put_char(boot.dat%,bp4&,STR$(len_fat%)) put_char(boot.dat%,bp5&,STR$(spd%)) put_wert(boot.dat%,bp6&,anf_dat%,4) put_wert(boot.dat%,bp7&,tpd%,4) ' ' sonstige INFOS a%=DFREE(drive%+1) a$=RIGHT$(n$+STR$(spd%*bps%-a%),9) put_char(boot.dat%,bde1&,a$) ! belegt? a$=RIGHT$(n$+STR$(a%),9) put_char(boot.dat%,bde2&,a$) ! frei ' lgs%=anf_dir% ! Anfang Directory lesen ! Sektor holen CLR disc_name$,zg% ! ab Anfang suchen DO CLR f$ EXIT IF BYTE{buf%+zg%}=0 OR lgs%>=anf_dat% f$=STRING$(11,0) BMOVE buf%+zg%,V:f$,11 ! sonst Filennamen holen att%=BYTE{buf%+zg%+11} ! und Attribut holen EXIT IF (att% AND 8)=8 ADD zg%,32 ! Wenn nicht Diskname IF zg%>=bps% INC lgs% ! Wenn Wurzelverzeichnis > 1 Sektor lesen ! nächsten Sektor holen CLR zg% ! und wieder ab Anfang ENDIF LOOP disc_name$=f$ ! Name merken put_char(boot.dat%,bdvolume&,disc_name$) ' --------------------------------------- DO box_draw(boot.dat%) ex_obj&=@form_do(boot.dat%) AND &HFF clr_state(boot.dat%,ex_obj&,1) box_undraw(boot.dat%) EXIT IF ex_obj&<>bde1& ! <<<< neu ~@alrt(1,"Auch eine leeres Laufwerk belegt |FAT+Directory!",1," Aha ") LOOP ' IF ex_obj&=bootget& AND drive%<2 disk_defekt%=1 ELSE disk_defekt%=0 ENDIF ' IF ex_obj&=bootwr& OR ex_obj&=bootget& ' IF ex_obj&=bootwr& b$=@get_char$(boot.dat%,bdvolume&) ! Volumelabel IF b$<>disc_name$ IF LEN(disc_name$)>0 ! Wenn was gefunden war IF LEN(b$)>0 b$=LEFT$(b$+STRING$(11,32),11) BMOVE V:b$,buf%+zg%,11 ! dann neuen Namen schreiben ELSE b$=CHR$(&HE5)+STRING$(31,0) ! Eintrag löschen BMOVE V:b$,buf%+zg%,32 ! dann neuen Namen schreiben ENDIF schreiben ELSE IF LEN(b$)>0 REPEAT ! Pseudoschleife EXIT IF @dsetdrv(drive%)<0 EXIT IF @dsetpath("\")<0 fil$=@nam_conv$(b$,0) fhandle%=@fcreate(fil$,8) EXIT IF fhandle%<0 ~@fclose(fhandle%) UNTIL 1 ENDIF ENDIF ENDIF ENDIF ' ---------------------------------- IF bstatus%=0 OR ex_obj&=bootget& BMOVE V:bb$,buf%,LEN(bb$) ! Bootsektor zurück in Puffer IF drive%<2 a%=@get_val(boot.dat%,bd9&) ! Serie CARD{buf%+8}=(a% AND &HFFFF00) DIV 256 BYTE{buf%+10}=a% AND &HFF ENDIF bps%=@get_val(boot.dat%,bd1&) ! BPS put_in_bootsec(11,bps%) cbps spc%=@get_val(boot.dat%,bd2&) ! SPC BYTE{buf%+13}=spc% AND &HFF a%=@get_val(boot.dat%,bd3&) ! ROOT put_in_bootsec(17,a%) spd%=@get_val(boot.dat%,bd5&) ! SPD IF spd%<&H10000 !RS: Langwortversion von readmot/put_in_bootsec? put_in_bootsec(19,spd%) ! Anzahl der Sektoren als Wort ELSE put_in_bootsec(19,0) put_in_bootsec(32,spd% AND &HFFFF) ! Anzahl der Sektoren als Langwort put_in_bootsec(34,SHR(spd%,16)) ENDIF spf%=@get_val(boot.dat%,bd4&) ! SPF put_in_bootsec(22,spf%) spt%=@get_val(boot.dat%,bd7&) ! SPT put_in_bootsec(24,spt%) sid%=@get_val(boot.dat%,bd8&) ! Seiten put_in_bootsec(26,sid%) anf_dat%=@get_val(boot.dat%,bp6&) ! 1. Datensektor tpd%=@get_val(boot.dat%,bp7&) ! TPD ' CLR c% ! Checksum generieren FOR t%=0 TO 254 ADD c%,CARD{buf%+t%*2} NEXT t% c%=c% AND &HFFFF a$=@get_char$(boot.dat%,bd6&) a%=VAL("$"+a$) b%=(a%-c%) AND &HFFFF BYTE{buf%+510}=b% DIV 256 BYTE{buf%+511}=b% AND &HFF ' CLR lgs% IF ex_obj&=bootwr& IF @media(drive%)=0 status%=BIOS(4,1,L:buf%,1,lgs%,drive%) IF status%=-14 status%=BIOS(4,1,L:buf%,1,lgs%,drive%) ENDIF err_inf(status%) ELSE err_inf(-1) ENDIF ENDIF ENDIF ENDIF lgs%=oldlgs% lesen do_list RETURN FUNCTION readintel(wo%) .| Glob. Var.: buf% .| Aufruf in : do_mark_bad-4, RETURN 256*BYTE{buf%+wo%}+BYTE{buf%+wo%-1} ENDFUNC FUNCTION readmot(wo%) .| Glob. Var.: buf% .| Aufruf in : clr_part-3,disc_info-8, RETURN BYTE{buf%+wo%}+256*BYTE{buf%+wo%+1} ENDFUNC PROCEDURE put_in_bootsec(wo%,was%) .| Glob. Var.: buf% .| Aufruf in : disc_info-6, BYTE{buf%+wo%}=was% AND &HFF BYTE{buf%+wo%+1}=(was% AND &HFF00)/&H100 RETURN PROCEDURE boot_sec .| Glob. Var.: tpd%,drive%,bpb%,lgs%,status%,buf%,fat_anz%,chk_sum%,bflag% .| ed%,spt%,spd%,cpd%,spc%,anf_dat%,bps%,buf_size%,chk_ofls%,a& .| Felder : whdl&() .| Ruft auf : bios_block,mdisk,err_inf,chk_sum,set_crcbuf,default_bootsec .| alrt,boot_wrong,set_slide,ofls,boot_sec .| Aufruf in : HAUPTPROGRAMM-1,chk_drv-1,sektor_compare-3,disc_on-1 .| disc_info-1,boot_sec-1,disc_drive-1,floppy_param-1, CLR tpd% ' bios_block(drive%) IF bpb%>=0 CLR lgs% mdisk status%=BIOS(4,0,L:buf%,1,0,drive%) ! BOOT-Sektor lesen IF status%=-14 status%=BIOS(4,0,L:buf%,1,0,drive%) ENDIF fat_anz%=BYTE{buf%+16} err_inf(status%) chk_sum%=@chk_sum set_crcbuf IF bpb%=0 default_bootsec status%=-7 ~@alrt(3,"Kein BIOS-Parameterblock!|Setze Standardwerte ein, |sonst SYSTEM-CRASH!",0," Ok ") err_inf(status%) ELSE IF (bflag% AND 1)=0 ed%=&HFFF ELSE ed%=&HFFFF ENDIF IF drive%<2 IF spt%=0 spt%=9 boot_wrong("Tracks = 0") ENDIF ELSE spd%=cpd%*spc%+anf_dat% ENDIF ENDIF IF spc%=0 spc%=2 boot_wrong("Sektoren/Cluster = 0") ENDIF IF spd%=0 spd%=1440 boot_wrong("Sektoren/Disk = 0") ENDIF IF bps%>buf_size% OR bps%<=0 bps%=512 boot_wrong("max. "+STR$(buf_size%)+" Bytes/Sektor") ENDIF set_slide(whdl&(0)) ELSE IF chk_ofls%>0 ! Zeiger auf Struktur "OFLS", ver, data ... a&=@ofls(drive%) ! OFLS lesen IF a&>0 AND a&<>&HFFFF drive%=0 boot_sec ENDIF ENDIF ENDIF RETURN PROCEDURE boot_wrong(a$) .| Ruft auf : alrt .| Aufruf in : boot_sec-4, ~@alrt(3,"Bootsektordaten ungültig:|"+a$,1,"So was") RETURN PROCEDURE default_bootsec .| Glob. Var.: tpd%,sid%,spt%,spc%,spf%,spd%,hid% .| Aufruf in : HAUPTPROGRAMM-1,boot_sec-1, tpd%=80 sid%=1 spt%=9 spc%=2 spf%=5 spd%=spt%*sid%*tpd% CLR hid% RETURN ' PROCEDURE disc_clear .| Glob. Var.: drive%,cpd%,spc%,wa$,spd%,len_fat%,len_dir%,b.ox%,boxaktiv& .| boxtxt&,status%,lgs%,n$,buf% .| Ruft auf : alrt,clear_buf,put_char,box_draw,media,objc_update,was_ist .| err_inf,fat_clr,write_fat,box_undraw,lesen,mnorm .| Aufruf in : menu_mess-1, LOCAL a$,start%,wwa% ' a$="ACHTUNG:|Laufwerk "+CHR$(drive%+65)+" mit|"+STR$(spd%)+" Sektoren wird gelöscht!" IF @alrt(2,a$,0,wa$)=1 clear_buf(1) wwa%=@alrt(2,a$,0,"Alles|DIR+FAT|Abbruch") IF wwa%<3 IF wwa%=1 start%=spd% a$="Lösche Laufwerk "+CHR$(drive%+65) ELSE start%=anf_dat% a$="Lösche FAT+DIR auf Laufwerk "+CHR$(drive%+65) ENDIF put_char(b.ox%,boxaktiv&," ") put_char(b.ox%,boxtxt&,a$) box_draw(b.ox%) ' IF @media(drive%)<0 status%=-1 ELSE FOR lgs%=start%-2 TO anf_dir% STEP -2 a$="Sektor: "+RIGHT$(n$+STR$(lgs%),5) put_char(b.ox%,boxaktiv&,a$) objc_update(b.ox%,boxaktiv&) EXIT IF @was_ist>0 status%=@rwabs(1,buf%,2,lgs%,drive%) EXIT IF status%<0 NEXT lgs% lgs%=anf_dir% IF status%=0 status%=@rwabs(1,buf%,1,lgs%,drive%) ENDIF a$="FAT löschen" put_char(b.ox%,boxaktiv&,a$) objc_update(b.ox%,boxaktiv&) err_inf(status%) fat_clr write_fat ENDIF box_undraw(b.ox%) ENDIF lesen ENDIF mnorm RETURN ' PROCEDURE disc_save .| Glob. Var.: erg%,drive%,pfad$,device%,fd$,lgs%,len_fat%,len_dir%,hdl% .| buf%,bps%,fehler%,spd% .| Ruft auf : dev,lesen,do_list,fwrite2,alrt,look_ex .| Aufruf in : menu_mess-1, LOCAL a% erg%=1 IF drive%<>0 pfad$="A:\" ELSE pfad$="B:\" ENDIF dev("FAT/DIR sichern",33) IF device%<>99 IF (ASC(fd$)-65)<>drive% FOR lgs%=0 TO anf_dat%-1 lesen ' do_list ! dauert zu lange fwrite2(hdl%,buf%,bps%) IF fehler%<0 lgs%=spd%-2 ENDIF NEXT lgs% ELSE ~@alrt(3,"Bitte nicht auf|dasselbe Laufwerk! | DISK-SAVE!",3," Ok ") ENDIF look_ex ENDIF RETURN PROCEDURE disc_load .| Glob. Var.: fi$,drive%,fhandle%,bps%,buf%,fehler%,lgs%,hdl% .| Ruft auf : fsel$,media,fopen,fseek,fread2,do_list,schreiben,fclose .| Aufruf in : menu_mess-1, LOCAL ab%,i%,fl% fi$=@fsel$("*.DAT","SAVE_"+CHR$(drive%+65)+".DAT","Disk-Load",5) IF EXIST(fi$)=TRUE IF @media(drive%)=0 fhandle%=@fopen(fi$,0) ! Datei öffnen IF fhandle%>=0 fl%=@fseek(0,fhandle%,2) ~@fseek(0,fhandle%,0) ! Offset 0 ab%=INT(fl%/bps%)-1 FOR i%=0 TO ab% fread2(fhandle%,buf%,bps%) IF fehler%<0 i%=ab%+1 ENDIF do_list lgs%=i% schreiben NEXT i% ~@fclose(hdl%) ENDIF ENDIF ENDIF RETURN ' PROCEDURE disc_quick ! Dateiliste per GEMDOS .| Glob. Var.: erg%,drive%,fi$,dta$,dta%,alle%,lies_mode% .| Ruft auf : change_pfad,fsel$,clr_out,fgetdta,mtasse,lies_all,out,out_do .| Aufruf in : menu_mess-1, erg%=3 change_pfad(6,drive%) fi$=@fsel$("*.*","","Pfad für Dateiliste...",6) IF fi$<>"" clr_out(fi$+"*.*") dta$=STRING$(44,0) dta%=@fgetdta mtasse CLR alle% lies_mode%=1 lies_all(fi$) out(STR$(alle%)+" Dateien") out_do ENDIF RETURN PROCEDURE disc_check ! alle Sektoren lesen eines Laufwerks .| Glob. Var.: drive%,wa$,erg%,spt%,bps%,buf%,lgs%,spd%,status%,sektor% .| track%,seite%,s.lider% .| Felder : whdl&() .| Ruft auf : alrt,clr_out,mtasse,fat_get_defekt,out,wind_top,was_ist .| info_line,mdisk,disc_check_err,set_slide,write_fat,floppy_param,lesen .| out_do,mnorm .| Aufruf in : menu_mess-1, LOCAL a1%,a2%,anz%,b%,cl%,a$ ' a$="Laufwerk "+CHR$(drive%+65)+": prüfen" IF @alrt(2,a$+"?",1,wa$)=1 erg%=3 clr_out(a$) mtasse anz%=@fat_get_defekt out("Anzahl der Defekte davor: "+STR$(anz%)) IF drive%<2 a1%=spt% ELSE a1%=68 ENDIF a2%=MALLOC(a1%*bps%) IF a2%=0 a1%=1 a2%=buf% ENDIF wind_top(whdl&(0)) DO EXIT IF @was_ist>0 OR lgs%>=spd% a1%=MIN(a1%,spd%-lgs%) IF drive%<2 info_line ! muss rein wegen Umrechnung LGS- sektor .... mdisk status%=XBIOS(8,L:a2%,L:0,drive%,sektor%,track%,seite%,a1%) IF status%<0 FOR lgs%=lgs% TO lgs%+a1%-1 EXIT IF @was_ist>0 info_line status%=XBIOS(8,L:buf%,L:0,drive%,sektor%,track%,seite%,1) IF status%<0 disc_check_err(lgs%) ENDIF NEXT lgs% ENDIF ELSE info_line mdisk status%=@rwabs(2,a2%,a1%,lgs%,drive%) IF status%<0 FOR lgs%=lgs% TO lgs%+a1%-1 EXIT IF @was_ist>0 info_line status%=@rwabs(2,buf%,1,lgs%,drive%) IF status%<0 disc_check_err(lgs%) ENDIF NEXT lgs% ENDIF ENDIF IF s.lider%>0 set_slide(whdl&(0)) ENDIF ADD lgs%,a1% LOOP IF b%>0 IF @alrt(2,STR$(b%)+" defekte Sektoren gefunden! | FAT schreiben?",0,wa$)=1 write_fat ELSE floppy_param ENDIF ENDIF IF a1%>1 ! Wurde Puffer per Malloc() reserviert? ~MFREE(a2%) ENDIF IF lgs%>=spd% CLR lgs% ENDIF lesen out("Anzahl der neuen Defekte: "+STR$(b%)) out_do ENDIF mnorm RETURN PROCEDURE disc_check_err(a%) .| Glob. Var.: status%,anf_dat%,spc%,b% .| Ruft auf : err_inf,write_in_fat .| Aufruf in : disc_check-2, LOCAL cl% err_inf(status%) cl%=INT((a%-anf_dat%)/spc%)+2 IF cl%>=2 write_in_fat(&HFFF7,cl%) INC b% ENDIF RETURN PROCEDURE disc_drive ! Laufwerk wechseln .| Glob. Var.: drv_map%,drive%,disk_defekt%,l1&,d.rives%,driabb&,last%,bpb% .| pfad$,status% .| Felder : whdl&() .| Ruft auf : change,dsetdrv,set_flags,clr_state,clr_flags,set_state .| box_draw,form_do,box_undraw,boot_sec,alrt,disc_info,set_w,wind_set .| Aufruf in : stat_line-1, LOCAL a&,di%,i%,j%,old%,oldlgs%,ex_obj& ' change drv_map%=@dsetdrv(drive%) ' CLR disk_defekt% FOR i%=0 TO 25 j%=l1&+i% IF (drv_map% AND 2^i%)<>0 set_flags(d.rives%,j%,1) ! SELECTABLE clr_state(d.rives%,j%,8) ! DISABLED ELSE clr_flags(d.rives%,j%,1) set_state(d.rives%,j%,8) ENDIF NEXT i% set_state(d.rives%,l1&+drive%,1) box_draw(d.rives%) ex_obj&=@form_do(d.rives%) AND &HFF box_undraw(d.rives%) clr_state(d.rives%,ex_obj&,1) IF ex_obj&<>driabb& di%=ex_obj&-l1& IF di%>=0 AND (drv_map% AND 2^di%) old%=drive% drive%=di% CLR last% boot_sec IF bpb%>0 pfad$=CHR$(drive%+65)+":\" ELSE IF bpb%=0 IF @alrt(2,"Kein BIOS-Parameterblock |von Laufwerk "+CHR$(drive%+65)+": ",1,"Wechseln|Abbruch")=2 drive%=old% CLR status% ELSE disc_info set_w ENDIF ELSE drive%=old% ENDIF ENDIF ENDIF ENDIF wind_set(whdl&(0)) set_w RETURN ' PROCEDURE file_repair .| Glob. Var.: srep%,abb%,erg%,total%,a$,wc% .| Felder : file$(),cluster%(),att%(),laenge%() .| Ruft auf : find_files,do_clr_out,out,out_do,set_last,alrt .| Aufruf in : menu_mess-1, LOCAL j%,i% srep%=1 find_files CLR srep%,j% IF abb%=0 erg%=3 do_clr_out("Name"+SPACE$(38)+"Cluster Attribut Länge") FOR i%=1 TO total% a$=RIGHT$(file$(i%),LEN(file$(i%))-RINSTR(file$(i%),"\")) IF ASC(a$)=&HE5 INC j% a$=@pfad_format$(file$(i%),42) a$=LEFT$(a$+SPACE$(wc%),wc%) MID$(a$,44)=STR$(cluster%(i%)) MID$(a$,51)=BIN$(att%(i%),8) MID$(a$,61)=STR$(laenge%(i%)) out(a$) ENDIF NEXT i% ENDIF IF j%>0 out_do set_last(5) ELSE IF abb%=0 ~@alrt(3,"Keine gelöschten Dateien.",1,"Abbruch") ENDIF ENDIF RETURN PROCEDURE last_5 .| Glob. Var.: total%,txt_zeile%,top%,kaputt$,bps%,spc%,lgs%,anf_dat%,spd% .| sch%,foc%,dmt%,cpd%,rrg%,ddd%,dv%,ed%,sektor%,status%,drive% .| Felder : file$(),whdl&(),laenge%(),cluster%(),att%(),sec%(),out$() .| Ruft auf : disc_on,wind_top,lesen,do_list,read_in_fat,alrt,write_in_fat .| write_fat,nam_conv$,einname,media,err_inf,bios_block .| Aufruf in : maus_pos-1, LOCAL aa%,bac%,cl%,cpf#,cpf%,ay%,i%,j%,sf%,witch%,repair% LOCAL a$,bb$,f$,s$ ' CLR ay% FOR i%=1 TO total% a$=RIGHT$(file$(i%),LEN(file$(i%))-RINSTR(file$(i%),"\")) IF ASC(a$)=&HE5 INC ay% IF ay%=txt_zeile%+top% j%=i% witch%=txt_zeile%+top% i%=total% ENDIF ENDIF NEXT i% sf%=j% CLR repair% disc_on ' IF sf%<=total% AND sf%>0 DO wind_top(whdl&(0)) ' kaputt$=RIGHT$(file$(sf%),LEN(file$(sf%))-RINSTR(file$(sf%),"\")) cpf#=laenge%(sf%)/(bps%*spc%) ! Cluster pro File IF cpf#<>INT(cpf#) INC cpf# ENDIF cpf%=cpf# bac%=cluster%(sf%) lgs%=(bac%-2)*spc%+anf_dat% IF lgs%<spd% lesen ENDIF do_list ' aa%=@read_in_fat(bac%) IF aa%>0 sch%=@alrt(2,"Cluster ist nicht frei. ",1,"Abbruch") ENDIF EXIT IF aa%>0 ' foc%=bac% dmt%=@alrt(2,"Repair ohne Rückfragen?",1," Ohne |Mit") ' DO bac%=foc% DO EXIT IF bac%>=cpd%+2 lgs%=(bac%-2)*spc%+anf_dat% rrg%=1 IF dmt%=2 lesen do_list ddd%=@alrt(2,"Nächsten Sektor sehen? ",1,"Ja|Nein|Abbruch") IF ddd%=1 INC lgs% lesen do_list ' DEC lgs% lesen ENDIF IF ddd%=3 rrg%=4 ENDIF EXIT IF rrg%=4 ' rrg%=@alrt(2,"Ist dies die |gesuchte Datei? ",1,"Ja|Nein|Weiter|Abbruch") ' SELECT rrg% CASE 3 CLR dmt% CASE 2 INC bac% aa%=@read_in_fat(bac%) WHILE aa% INC bac% aa%=@read_in_fat(bac%) WEND ENDSELECT ENDIF EXIT IF rrg%=1 OR rrg%=4 LOOP ' EXIT IF bac%>=cpd%+2 OR rrg%=4 ' cl%=bac% aa%=@read_in_fat(cl%+1) WHILE aa%<>0 INC cl% aa%=@read_in_fat(cl%+1) WEND ' INC cl% CLR dv% ' IF (att%(sf%) AND 16)<>0 ! Ordner? dv%=@alrt(2,"Das ist ein Verzeichnis. |Weitersuchen?",1,"Ja|Nein|Abbruch") SELECT dv% CASE 3 rrg%=4 CASE 2 cpf%=repair%+2 write_in_fat(cl%,bac%) CASE 1 repair%=9999 ENDSELECT ELSE write_in_fat(cl%,bac%) ENDIF ' INC repair% EXIT IF repair%>=cpf% OR rrg%=4 OR dv%=2 foc%=cl% LOOP ' IF rrg%<>4 write_in_fat(ed%,bac%) IF @alrt(2,"Datei restauriert!! ",0,"Schreiben|Abbruch")=1 write_fat sektor%=sec%(sf%) bb$=STRING$(bps%,0) status%=@rwabs(0,VARPTR(bb$),1,sektor%,drive%) IF status%=0 s$=@nam_conv$(kaputt$,1) FOR i%=1 TO bps% STEP 32 f$=MID$(bb$,i%,11) IF f$=s$ einname("Name des Programms:",s$) MID$(bb$,i%,11)=a$ i%=bps%+1 out$(witch%)="" ENDIF NEXT i% IF @media(drive%)=0 status%=@rwabs(1,VARPTR(bb$),1,sektor%,drive%) ELSE status%=-1 ENDIF err_inf(status%) ENDIF ENDIF ENDIF EXIT IF 1 LOOP bios_block(drive%) wind_top(whdl&(1)) do_list ENDIF RETURN PROCEDURE lies_1 .| Glob. Var.: p$,f$,alle% .| Ruft auf : out .| Aufruf in : lies_all-1, out(p$+f$) INC alle% RETURN ' --------------------- Proceduren für FILE ------------------- PROCEDURE file_open .| Glob. Var.: file_open%,fi$,fi_old$ .| Ruft auf : file_close,info_line,clear_buf,do_list,fsel$,do_file_open .| Aufruf in : menu_mess-1,file_name-1, IF file_open%>0 file_close info_line ENDIF clear_buf(0) do_list fi$=@fsel$("*.*",fi_old$,"Datei öffnen",7) do_file_open(fi$) do_list RETURN PROCEDURE file_close .| Glob. Var.: file_open%,f_hdl%,fl%,fp%,fi_o$,z% .| Ruft auf : change,fclose,clear_buf,do_list,alrt .| Aufruf in : menu_mess-1,file_open-1,last_10-1, IF file_open%>0 change ~@fclose(f_hdl%) file_open%=-1 CLR fl%,fp%,fi_o$,z% clear_buf(0) do_list ELSE ~@alrt(3,"Welches File schlie₧en?",1,"Keins") ENDIF RETURN PROCEDURE file_write .| Glob. Var.: file_open%,file_protect%,fl%,fp%,bps%,f_hdl%,buf%,ch% .| Ruft auf : fseek,fwrite2,do_cursor_anz,file_read,alrt .| Aufruf in : schreiben-1,menu_mess-1, LOCAL fr% IF file_open%=1 IF file_protect%=0 fr%=MIN(fl%-fp%,bps%) ~@fseek(fp%,f_hdl%,0) fwrite2(f_hdl%,buf%,fr%) CLR ch% do_cursor_anz(0) file_read ELSE ~@alrt(3,"Datei ist schreibgeschützt!",1,"Abbruch") ENDIF ELSE ~@alrt(3,"In welche Datei|soll ich schreiben?",1,"Abbruch") ENDIF RETURN PROCEDURE file_read .| Glob. Var.: file_open%,fp%,fl%,f_hdl%,bps%,buf%,bf$ .| Felder : whdl&() .| Ruft auf : fseek,set_slide,fread2 .| Aufruf in : lesen-1,file_write-1,file_dump-1, LOCAL dl%,fr% IF file_open%=1 IF fp%<fl% ~@fseek(fp%,f_hdl%,0) fr%=fl%-fp% IF fr%>0 set_slide(whdl&(0)) dl%=MIN(bps%,fr%) fread2(f_hdl%,buf%,dl%) IF dl%<>bps% bf$=STRING$(bps%+1-dl%,0) BMOVE V:bf$,buf%+dl%,LEN(bf$) CLR bf$ ENDIF ENDIF ENDIF ENDIF RETURN PROCEDURE file_compare ! 2 Dateien (Pfade) vergleichen .| Glob. Var.: ver_base%,f1$,f2$,erg% .| Ruft auf : fsel$,clr_out,pfad_compare,file_verify,out_do,set_last .| Aufruf in : base_look-1,menu_mess-1, IF ver_base%=0 f1$=@fsel$("*.*","","Verify - Datei/Pfad 1",8) f2$=@fsel$("*.*","","Verify - Datei/Pfad 2",9) ENDIF erg%=3 CLR ver_base% clr_out("Dateien vergleichen") IF RIGHT$(f1$,1)="\" AND RIGHT$(f2$,1)="\" pfad_compare(f1$,f2$) ELSE file_verify(f1$,f2$) ENDIF out_do set_last(10) RETURN PROCEDURE last_10 ! Unterschiede anzeigen und nach Klick Datei öffnen .| Glob. Var.: txt_zeile%,top%,x$,file_open%,fp% .| Felder : out$(),whdl&() .| Ruft auf : file_close,info_line,do_file_open,lesen,wind_top .| Aufruf in : maus_pos-1, LOCAL x%,a%,a$,fx$ ' x%=txt_zeile%+top% x$=out$(x%) IF (LEFT$(x$,2)="1:" OR LEFT$(x$,2)="2:") AND MID$(x$,4,1)<>":" a%=x% REPEAT DEC a% ! Dateinamen suchen UNTIL MID$(out$(a%),4,1)=":" OR a%=0 IF a%>0 IF ASC(x$)=49 ! "1" DEC a% ! da erst der 2. Name gefunden wird, eine Zeile drüber ENDIF a$=out$(a%) ! = Dateiname fx$=RIGHT$(a$,LEN(a$)-2) IF EXIST(fx$)=TRUE ! Datei gefunden und noch existent? IF file_open%=1 ! ja, andere Datei offen? file_close ! Ja, info_line ENDIF do_file_open(fx$) ! jetzt Datei öffnen fp%=VAL(MID$(x$,3,8)) ! Pointer auf Adresse lesen ! dort lesen wind_top(whdl&(0)) ! Datenfenster oben ENDIF ENDIF ENDIF RETURN ' PROCEDURE file_dump ! Datei als DUMP ausgeben .| Glob. Var.: file_open%,erg%,device%,hdl%,ver$,fi_o$,fl%,no_nxt% .| Felder : l_end%() .| Ruft auf : dev,fwritec,do_dump,nxt_blk,file_read,was_ist,look_ex,alrt .| mnorm .| Aufruf in : menu_mess-1, IF file_open%=1 erg%=1 dev("Datei ausgeben",34) IF device%<>99 fwritec(hdl%,ver$+": "+DATE$+" "+TIME$) fwritec(hdl%,"Datei : "+fi_o$+" Länge: "+STR$(fl%)+" Bytes") fwritec(hdl%,STRING$(75,"-")) DO do_dump(0,l_end%(0)) nxt_blk EXIT IF no_nxt%<>0 file_read EXIT IF @was_ist>0 LOOP look_ex ENDIF ELSE ~@alrt(3,"Bitte Datei erst öffnen.",1,"Mach ich") ENDIF mnorm RETURN PROCEDURE file_name ! Dateinamen ändern (Klick auf Statuszeile) .| Glob. Var.: file_open%,fi_o$ .| Ruft auf : do_datei_info,file_open .| Aufruf in : stat_line-2, IF file_open%=1 do_datei_info(fi_o$) ELSE file_open ENDIF RETURN ' PROCEDURE datei_cut ! Datei aufteilen .| Glob. Var.: file_open%,wa$,fp%,tz%,z%,erg%,device%,bps%,hdl%,buf%,bc%,fl% .| Ruft auf : change,alrt,dev,lesen,fwrite2,fclose,clear_buf,do_list .| Aufruf in : menu_mess-1, LOCAL b%,la%,fa%,fz%,fc%,fi% ' IF file_open%=1 change IF @alrt(2,"Datei an aktueller|Cursorposition abschneiden?",1,wa$)=1 fc%=fp%+tz%+z% erg%=1 dev("Datei aufteilen - 1. Datei",35) IF device%<>99 fz%=z% CLR z%,fp% lesen fi%=1 WHILE fi%<=INT(fc%/bps%) fwrite2(hdl%,buf%,bps%) ADD fp%,bps% lesen INC fi% WEND bc%=fc%-INT(fc%/bps%)*bps% IF bc%>0 fwrite2(hdl%,buf%,bc%) ENDIF ~@fclose(hdl%) ' erg%=1 dev("Datei aufteilen - 2. Datei",36) IF device%<>99 z%=fz% fp%=fc% lesen fa%=fl%-fc% WHILE fa%>=bps% fwrite2(hdl%,buf%,bps%) ADD fp%,bps% SUB fa%,bps% lesen WEND ' IF fa%>0 fwrite2(hdl%,buf%,fa%) ENDIF ~@fclose(hdl%) ' ENDIF ENDIF ENDIF ELSE ~@alrt(3,"Bitte Datei erst öffnen.",1,"Mach ich") ENDIF clear_buf(0) do_list RETURN PROCEDURE datei_concat ! 2 Dateien verbinden .| Glob. Var.: f1$,f2$,erg%,device%,a1%,a2%,bps%,buf%,hdl%,fehler% .| Ruft auf : fsel$,dev,fopen,fseek,fread2,fwrite2,fclose,clear_buf .| Aufruf in : menu_mess-1, LOCAL hdl1%,hdl2% ' f1$=@fsel$("*.*","","1. Datei verbinden",11) IF EXIST(f1$)=TRUE f2$=@fsel$("*.*","","2. Datei verbinden",12) IF EXIST(f2$)=TRUE erg%=1 dev("Dateien verbinden - Zieldatei",37) IF device%<>99 hdl1%=@fopen(f1$,0) hdl2%=@fopen(f2$,0) ' a1%=@fseek(0,hdl1%,2) ~@fseek(0,hdl1%,0) ' a2%=@fseek(0,hdl2%,2) ~@fseek(0,hdl2%,0) ' REPEAT WHILE a1%>=bps% fread2(hdl1%,buf%,bps%) fwrite2(hdl%,buf%,bps%) SUB a1%,bps% EXIT IF fehler%<0 WEND EXIT IF fehler%<0 IF a1%>0 fread2(hdl1%,buf%,a1%) fwrite2(hdl%,buf%,a1%) ENDIF ' WHILE a2%>=bps% fread2(hdl2%,buf%,bps%) fwrite2(hdl%,buf%,bps%) SUB a2%,bps% EXIT IF fehler%<0 WEND EXIT IF fehler%<0 IF a2%>0 fread2(hdl2%,buf%,a2%) fwrite2(hdl%,buf%,a2%) ENDIF UNTIL 1 ~@fclose(hdl1%) ~@fclose(hdl2%) ~@fclose(hdl%) ENDIF clear_buf(0) ENDIF ENDIF RETURN PROCEDURE datei_copy ! Datei kopieren .| Glob. Var.: f1$,f2$ .| Ruft auf : fsel$,do_file_copy .| Aufruf in : hard_install-1,menu_mess-1, LOCAL a$ f1$=@fsel$("*.*","","Datei kopieren Quell:",13) IF EXIST(f1$)=TRUE a$=RIGHT$(f1$,LEN(f1$)-RINSTR(f1$,"\")) f2$=@fsel$("*.*",a$,"Datei kopieren Ziel:",14) IF f2$<>"" IF RIGHT$(f2$)="\" f2$=f2$+a$ ENDIF do_file_copy(f1$,f2$) ENDIF ENDIF RETURN PROCEDURE datei_del ! Datei löschen .| Glob. Var.: fi$,wa$ .| Ruft auf : fsel$,alrt,fdelete .| Aufruf in : menu_mess-1, DO fi$=@fsel$("*.*","","Datei löschen",15) EXIT IF EXIST(fi$)=FALSE IF @alrt(2,RIGHT$(fi$,38)+"|löschen???",0,wa$)=1 ~@fdelete(fi$) ENDIF LOOP RETURN ' PROCEDURE datei_suchen .| Glob. Var.: erg%,fi$,dta$,dta%,ab$,a$,el%,s$,lies_mode%,out% .| Felder : out$() .| Ruft auf : clr_out,fsel$,fgetdta,einname,nam_conv$,wandeln,alltoone .| lies_all,out_do .| Aufruf in : menu_mess-1, erg%=3 clr_out("Datei suchen") fi$=@fsel$("*.*","","DATEI-SUCHEN Pfad",17) IF fi$<>"" fi$=LEFT$(fi$,RINSTR(fi$,"\")) dta$=STRING$(44,0) dta%=@fgetdta einname("Was suchen","") ab$=@nam_conv$(a$,0) IF el%>0 s$=@nam_conv$(a$,0) wandeln(s$) alltoone(a$) s$=a$ lies_mode%=3 lies_all(fi$) out$(0)=ab$+" = "+STR$(out%-1)+" Dateien gefunden" out_do ENDIF ENDIF RETURN PROCEDURE lies_3 ! Dateien suchen .| Glob. Var.: f$,s$,gleich!,p$ .| Ruft auf : wandeln,n_compare,out .| Aufruf in : lies_all-1, LOCAL a$,b$,i% wandeln(f$) n_compare(a$,s$) IF gleich!=TRUE out(p$+f$) ENDIF RETURN ' PROCEDURE file_verify(f1$,f2$) ! 2 Dateien vergleichen .| Glob. Var.: erg%,anz_diff%,mk%,b%,st1%,st2%,vi%,fehler%,abb%,a%,st3%,st4% .| Ruft auf : out,fopen,fseek,mtasse,was_ist,fread$,vergleich,fclose,out_do .| lend,mnorm .| Aufruf in : file_compare-1,pfad_compare-1, LOCAL fp1%,fp2%,hdl1%,hdl2%,a1%,a2%,a1$,a2$ ' REPEAT EXIT IF EXIST(f2$)=FALSE OR EXIST(f1$)=FALSE erg%=3 out("") out("1:"+f1$) out("2:"+f2$) CLR anz_diff%,mk% REPEAT hdl1%=@fopen(f1$,0) EXIT IF hdl1%<6 hdl2%=@fopen(f2$,0) EXIT IF hdl2%<6 CLR fp1%,fp2% a1%=@fseek(0,hdl1%,2) ~@fseek(0,hdl1%,0) ' a2%=@fseek(0,hdl2%,2) ~@fseek(0,hdl2%,0) IF a1%=0 OR a2%=0 out("Eine Datei hat Länge '0'") ENDIF EXIT IF a1%=0 OR a2%=0 IF a1%<>a2% out("Dateien ungleich lang!") ENDIF b%=MIN(1024,MIN(a1%,a2%)) ! Wenn File kürzer als 1024 Bytes st1%=INT(a1%/b%) st2%=INT(a2%/b%) vi%=1 fehler%=99 mtasse DO abb%=@was_ist EXIT IF abb%>0 a1$=@fread$(hdl1%,b%) ADD fp1%,fehler% a2$=@fread$(hdl2%,b%) ADD fp2%,fehler% IF a1$<>a2$ vergleich ENDIF EXIT IF fehler%<=0 OR mk%=2 INC vi% a%=vi%*b% DIV 1024 EXIT IF vi%>st1% OR vi%>st2% LOOP IF abb%<>2 st3%=MIN(1024,MIN(a1%-fp1%,a2%-fp2%)) st4%=MIN(1024,MIN(a1%-fp1%,a2%-fp2%)) a1$=@fread$(hdl1%,st3%) ADD fp1%,fehler% a2$=@fread$(hdl2%,st4%) ADD fp2%,fehler% IF a1$<>a2$ vergleich ENDIF IF a1%<>a2% AND anz_diff%=0 out("Dateien sind ungleich lang, aber sonst identisch!") ELSE IF anz_diff%>0 out("Dateien sind an "+STR$(anz_diff%)+" Stellen unterschiedlich!") ELSE out("Dateien sind identisch!") ENDIF ENDIF ENDIF ~@fclose(hdl1%) ~@fclose(hdl2%) IF anz_diff%>0 out_do lend(1) ENDIF UNTIL 1 UNTIL 1 mnorm RETURN PROCEDURE vergleich .| Glob. Var.: fehler%,a1$,a2$,anz_diff% .| Ruft auf : verify_out .| Aufruf in : file_verify-2, LOCAL j%,x% ' fehler%=99 FOR j%=1 TO LEN(a1$) STEP 16 IF MID$(a1$,j%,16)<>MID$(a2$,j%,16) ' FOR x%=0 TO 15 ! detaillierte Suche nach Anzahl der Unterschiede IF MID$(a1$,j%+x%,1)<>MID$(a2$,j%+x%,1) INC anz_diff% ENDIF NEXT x% ' verify_out(j%,a1$,"1:") verify_out(j%,a2$,"2:") ENDIF EXIT IF fehler%<=0 NEXT j% RETURN PROCEDURE verify_out(wo%,buf$,a$) .| Glob. Var.: j%,av$,vi% .| Ruft auf : dec_hex_val$,out .| Aufruf in : vergleich-2, LOCAL a%,i%,o$ ' o$=SPACE$(66) FOR i%=0 TO 15 a%=BYTE{V:buf$+j%+i%-1} MID$(o$,i%*3+1)=HEX$(a%,2) MID$(o$,i%+50,1)=CHR$(a%) NEXT i% av$=@dec_hex_val$((vi%-1)*1024+wo%-1,8) out(a$+av$+" "+o$) RETURN ' PROCEDURE pfad_compare(pfad1$,pfad2$) .| Glob. Var.: dta$,dta%,total%,abb%,erg%,lies_mode% .| Felder : file$() .| Ruft auf : fgetdta,floppy_param,lies_all,out,out_do,lend,file_verify .| was_ist .| Aufruf in : file_compare-1, LOCAL i%,j%,a$,x$ ' dta$=STRING$(44,0) dta%=@fgetdta CLR total%,i%,abb% ' erg%=3 floppy_param lies_mode%=4 lies_all(pfad1$) DEC total% ' out(STR$(total%)+" Dateien sind zu vergleichen ...") out_do lend(1) ' WHILE i%<=total% EXIT IF abb%>0 x$=file$(i%) j%=1 ' WHILE MID$(x$,j%,1)=MID$(pfad1$,j%,1) INC j% WEND DEC j% ! 1. Zeichen das nicht gleich ist ' a$=RIGHT$(x$,LEN(x$)-j%) a$=pfad2$+a$ ' IF EXIST(a$)=TRUE file_verify(x$,a$) out_do lend(1) ELSE out("Datei: "+a$+" nicht gefunden.") out_do lend(1) abb%=@was_ist ENDIF INC i% WEND RETURN PROCEDURE lies_4 .| Glob. Var.: total%,p$,f$ .| Felder : file$() .| Aufruf in : lies_all-1, file$(total%)=p$+f$ INC total% RETURN ' PROCEDURE file_is_open .| Glob. Var.: file_open%,f_hdl% .| Ruft auf : fclose .| Aufruf in : media_all-1,media-1,no_on-1,pexec-1,start_shell-1,exit-1, IF file_open%=1 ~@fclose(f_hdl%) CLR file_open% ENDIF RETURN PROCEDURE do_file_copy(f1$,f2$) .| Glob. Var.: fhandle%,erg%,bps%,buf% .| Ruft auf : mdisk,fopen,fseek,alrt,fread2,fclose,fcreate,fwrite2,mnorm .| Aufruf in : hard_install-1,datei_copy-1, LOCAL a1%,a2%,ab%,b%,i%,hdl1% ' IF EXIST(f1$)=TRUE ! Nur wenn Quelldatei da ist mdisk fhandle%=@fopen(f1$,0) ! Datei öffnen a1%=@fseek(0,fhandle%,2) ! Länge feststellen ~@fseek(0,fhandle%,0) ! Ab Byte 0 lesen ' erg%=@alrt(1,"Sektoren einzeln kopieren?",1,"Ja| Nein ") IF erg%=2 a2%=MALLOC(a1%) ! Speicher organisieren ENDIF ' IF a2%>0 ! Speicher da? fread2(fhandle%,a2%,a1%) ! Datei komplett einlesen ~@fclose(fhandle%) ! Quell schliessen fhandle%=@fcreate(f2$,0) ! Neue Datei erzeugen IF fhandle%>0 ! Ohne Fehler? fwrite2(fhandle%,a2%,a1%) ! Ja, komplett schreiben ~@fclose(fhandle%) ! Fertig ENDIF ~MFREE(a2%) ! Speicher zurückgeben ELSE ab%=a1%/bps% ! Kein Speicher, Anzahl der Sektoren hdl1%=fhandle% ! Quellhandle merken fhandle%=@fcreate(f2$,0) ! Neue Datei erzeugen IF fhandle%>0 ! Ohne Fehler? FOR i%=1 TO ab% fread2(hdl1%,buf%,bps%) ! einen Sektor lesen fwrite2(fhandle%,buf%,bps%) ! und auch schreiben NEXT i% IF a1%>ab%*bps% ! wenn Länge <> Sektorgrenze b%=a1%-ab%*bps% fread2(hdl1%,buf%,b%) ! Rest lesen fwrite2(fhandle%,buf%,b%) ! ' schreiben ENDIF ~@fclose(fhandle%) ! Zieldatei fertig ENDIF ~@fclose(hdl1%) ! Quell schliessen mnorm ENDIF ENDIF RETURN PROCEDURE do_file_open(fi$) .| Glob. Var.: fi_old$,fhandle%,file_protect%,fi_o$,file_open%,f_hdl%,fl% .| fp%,z% .| Ruft auf : alrt,fopen,fseek,lesen,info_line,clear_buf .| Aufruf in : base_look-1,file_on-1,file_open-1,last_10-1, LOCAL df$ ' IF EXIST(fi$)=TRUE fi_old$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\")) df$=fi$+CHR$(0) fhandle%=GEMDOS(61,L:VARPTR(df$),2) ! FOPEN ' IF fhandle%=-36 ~GEMDOS(62,W:fhandle%) ! FCLOSE ~@alrt(1,"Datei kann nicht verändert werden!",1," Aha ") file_protect%=1 fhandle%=@fopen(fi$,0) ELSE file_protect%=0 ENDIF IF fhandle%>5 fi_o$=fi$ file_open%=1 f_hdl%=fhandle% fl%=@fseek(0,f_hdl%,2) CLR fp%,z% lesen info_line ELSE clear_buf(0) ENDIF ENDIF RETURN PROCEDURE datei_info .| Glob. Var.: fi$ .| Ruft auf : fsel$,do_datei_info .| Aufruf in : menu_mess-1, fi$=@fsel$("*.*","","Datei-INFO",18) IF EXIST(fi$)=TRUE do_datei_info(fi$) ENDIF RETURN PROCEDURE do_datei_info(fi$) .| Glob. Var.: d.name$,d.atei%,datname&,d.attr%,dat1&,fhandle%,fll%,datsize& .| buf$,d.header%,dath1&,dath4&,datramk&,datsegm&,dats1&,dats2&,dats3& .| dats4&,dat$,n$,datdat&,dattime&,datok&,b%,fi_o$ .| Ruft auf : nam_conv$,put_char,fattrib,cross_rsc,fopen,fread$,fseek .| put_wert,set_flags,clr_flags,fdatime,fclose,box_draw,form_do .| box_undraw,clr_state,get_char$,get_val,alrt,fwrite,frename,do_list .| lesen .| Aufruf in : file_name-1,datei_info-1,last_3-1, LOCAL a%,i%,j&,ex_obj&,dt%,tm%,a$,b$,path$,fil$,new$,bra$,dt$,tm$ ' REPEAT d.name$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\")) a$=d.name$ path$=LEFT$(fi$,LEN(fi$)-LEN(a$)) fil$=@nam_conv$(a$,1) put_char(d.atei%,datname&,fil$) ' --------------------------- d.attr%=@fattrib(fi$,0,0) ! Attribut j&=dat1& FOR i%=0 TO 5 cross_rsc(d.atei%,j&,d.attr% AND 2^i%) INC j& NEXT i% OB_TYPE(d.atei%,dat4&)=OB_TYPE(d.atei%,dat4&) AND &HFF !RS: In der Resource ändern! OB_TYPE(d.atei%,dat5&)=OB_TYPE(d.atei%,dat5&) AND &HFF !RS: " IF (d.attr% AND &H18)=8 ! Datenträgername OB_TYPE(d.atei%,dat1&)=OB_TYPE(d.atei%,dat1&) AND &HFF OB_TYPE(d.atei%,dat2&)=OB_TYPE(d.atei%,dat2&) AND &HFF OB_TYPE(d.atei%,dat3&)=OB_TYPE(d.atei%,dat3&) AND &HFF ' Ist von MS-DOS oder Mac das Archiv-Bit gesetzt, lä₧t es sich löschen. IF (d.attr% AND &H20)=0 OB_TYPE(d.atei%,dat6&)=OB_TYPE(d.atei%,dat6&) AND &HFF ENDIF ELSE OB_TYPE(d.atei%,dat1&)=OB_TYPE(d.atei%,dat1&) OR &H1200 OB_TYPE(d.atei%,dat2&)=OB_TYPE(d.atei%,dat2&) OR &H1200 OB_TYPE(d.atei%,dat3&)=OB_TYPE(d.atei%,dat3&) OR &H1200 OB_TYPE(d.atei%,dat6&)=OB_TYPE(d.atei%,dat6&) OR &H1200 ENDIF ' --------------------------- fhandle%=@fopen(fi$,0) ! Datei öffnen EXIT IF fhandle%<6 ! ok? ' fll%=@fseek(0,fhandle%,2) ! Länge feststellen put_wert(d.atei%,datsize&,fll%,9) ' ' ------------------ ~@fseek(0,fhandle%,0) ! Offset 00 IF fll%>28 buf$=@fread$(fhandle%,28) ! 28 Bytes lesen ELSE buf$=STRING$(28,0) ! Datei zu klein ENDIF bra$=LEFT$(buf$,2) ! Byte 0+1 lesen ' d.header%=CVL(MID$(buf$,23,4)) ! Dateiheader (Byte 25) -> Dialog j&=dath1& FOR i%=0 TO 7 IF i%<>3 cross_rsc(d.atei%,j&,d.header% AND 2^i%) ENDIF INC j& NEXT i% a%=(d.header% AND &H0) a%=SHR(a%,28) put_char(d.atei%,dath4&,LEFT$(STR$(a%),2)) ! zusätzlichen Speicher? ' IF CVI(bra$)<>&H601A ! Programmdatei? set_flags(d.atei%,datramk&,&H80) ! HIDE clr_flags(d.atei%,dath4&,8) ! NO EDIT set_flags(d.atei%,datsegm&,&H80) ! HIDE ENDIF put_char(d.atei%,dats1&,HEX$(CVL(MID$(buf$,3,4)),9)) put_char(d.atei%,dats2&,HEX$(CVL(MID$(buf$,7,4)),9)) put_char(d.atei%,dats3&,HEX$(CVL(MID$(buf$,11,4)),9)) put_char(d.atei%,dats4&,HEX$(CVL(MID$(buf$,15,4)),9)) ' ------------------- dat$=STRING$(4,0) ! Puffer für Zeit/Datum ~@fdatime(VARPTR(dat$),fhandle%,0) ~@fclose(fhandle%) ! Datei schlie₧en ' tm%=CARD{VARPTR(dat$)} tm$=RIGHT$(n$+STR$((tm% DIV 2048) AND 31),2) tm$=tm$+RIGHT$(n$+STR$((tm% DIV 32) AND 63),2) ' tm$=tm$+RIGHT$(n$+STR$((tm% AND 31)*2),2) RS: BUG: erst Resource ändern! dt%=CARD{VARPTR(dat$)+2} dt$=RIGHT$(n$+STR$(dt% AND 31),2) dt$=dt$+RIGHT$(n$+STR$((dt% DIV 32) AND 15),2) dt$=dt$+STR$(1980+((dt% DIV 512) AND 63)) put_char(d.atei%,datdat&,dt$) put_char(d.atei%,dattime&,tm$) ' ------------------------ box_draw(d.atei%) ex_obj&=@form_do(d.atei%) AND &HFF box_undraw(d.atei%) clr_state(d.atei%,ex_obj&,1) clr_flags(d.atei%,datsegm&,&H80) clr_flags(d.atei%,datramk&,&H80) set_flags(d.atei%,dath4&,8) ' IF ex_obj&=datok& ! schreiben? a$=@get_char$(d.atei%,datdat&) ! Date generieren b$=@get_char$(d.atei%,dattime&) ! Time ... tm%=VAL(LEFT$(b$,2))*2048+VAL(MID$(b$,3,2))*32+VAL(MID$(b$,5,2))/2 CARD{VARPTR(dat$)}=tm% dt%=VAL(MID$(a$,1,2))+VAL(MID$(a$,3,2))*32+(VAL(MID$(a$,5,4))-1980)*512 CARD{VARPTR(dat$)+2}=dt% ' fhandle%=@fopen(fi$,0) ! Datei nochmal öffnen IF fhandle%>0 ~@fdatime(VARPTR(dat$),fhandle%,1) ! Zeit+Datum setzen ' IF CVI(bra$)=&H601A ! Programmdatei? CLR a% ! Header bearbeiten j&=dath1& FOR i%=0 TO 7 IF (OB_STATE(d.atei%,j&) AND 2)>0 AND i%<>3 a%=a% OR 2^i% ENDIF INC j& NEXT i% ' b%=@get_val(d.atei%,dath4&) b%=SHL(b%,28) a%=(a% AND &HFFFFFFF) OR b% ' ---------------- ~@fseek(22,fhandle%,0) ! Pointer auf Datei-Headerbits IF a%<>d.header% ! wenn sich was geändert hat IF (d.attr% AND 1)<>0 ! STATUS: NUR LESEN? ~@alrt(3,"Datei hat Status 'NUR LESEN'! ",1,"Abbruch") ELSE fwrite(fhandle%,MKL$(a%)) ! sonst schreiben ENDIF ENDIF ENDIF ~@fclose(fhandle%) ! Datei schlie₧en ENDIF ' -------------------------- CLR a% ! Jetzt Attribut bearbeiten j&=dat1& FOR i%=0 TO 5 IF (OB_STATE(d.atei%,j&) AND 2)<>0 a%=a% OR 2^i% ENDIF INC j& NEXT i% IF a%<>d.attr% ! was geändert? d.attr%=a% ~@fattrib(fi$,d.attr%,1) ! Attribut setzen ENDIF ' ---------------- a$=@get_char$(d.atei%,datname&) ! Falls Datei gerade offen, fil$=@nam_conv$(a$,0) new$=path$+fil$ IF new$<>fi$ IF (d.attr% AND &H18)=8 ! Datenträgername a%=@fcreate(new$,8) IF a%>0 ~@fclose(a%) ENDIF ELSE a%=@frename(fi$,new$) ENDIF IF a%=0 AND fi$=fi_o$ fi_o$=new$ do_list ENDIF ENDIF ' -------------------------- ENDIF UNTIL 1 lesen do_list RETURN ' ' ---------------------- Proceduren für DIR -------------------- PROCEDURE dir_secsearch .| Glob. Var.: drive%,fi$,fld$,fac$,pfad$,mode%,d.isk%,total%,cl%,lgs%,spc% .| anf_dat%,bb$,bps%,fil$,buf%,aa%,ed%,z%,wzb%,yt%,xt%,hex!,anf_fat2% .| len_fat% .| Felder : file$(),cluster%(),whdl&() .| Ruft auf : change_pfad,fsel$,chk_drv,get_fld_name$,find_files,nam_conv$ .| lesen,read_in_fat,dec,set_tz,alrt,wind_top,do_list .| Aufruf in : menu_mess-1, LOCAL b%,i%,j%,f1$ ' change_pfad(19,drive%) fi$=@fsel$("*.*","","Beliebiges Verzeichnis",19) ! sucht Verzeichnissektor IF LEN(fi$)>0 ! der eine bestimmte Datei oder Ordner ~@chk_drv(fi$) ! enthält. fld$=@get_fld_name$(fi$) IF LEN(fld$)>0 fac$=fld$ i%=LEN(pfad$)-1 WHILE MID$(pfad$,i%,1)<>"\" AND i%>0 DEC i% WEND fac$=LEFT$(pfad$,i%)+fac$ find_files mode%=d.isk% ' CLR j% REPEAT EXIT IF fac$=file$(j%) INC j% UNTIL j%>total% IF j%<total% CLR b% cl%=cluster%(j%) lgs%=(cl%-2)*spc%+anf_dat% IF RIGHT$(fi$,1)<>"\" bb$=STRING$(bps%*2,0) fi$=LEFT$(fi$,LEN(fi$)) f1$=RIGHT$(fi$,LEN(fi$)-RINSTR(fi$,"\")) fil$=@nam_conv$(f1$,1) DO lgs%=(cl%-2)*spc%+anf_dat% lesen BMOVE buf%,V:bb$,bps% INC lgs% lesen BMOVE buf%,V:bb$+bps%,bps% ' b%=INSTR(bb$,fil$) EXIT IF b%>0 aa%=@read_in_fat(cl%) EXIT IF aa%>=ed%-7 cl%=aa% LOOP ENDIF ' IF b%>0 DEC b% IF b%>bps%-1 SUB b%,bps% ELSE dec BMOVE V:bb$,buf%,bps% ENDIF z%=INT(b%/wzb%)*wzb% ! Cursor ausrichten b%=b%-z% yt%=b%/16 xt%=b%-yt%*16+51 IF hex!=TRUE xt%=(b%-yt%*16)*3 ENDIF set_tz ENDIF ELSE CLR lgs% ~@alrt(3,"Fehler aufgetreten!|Ordner nicht gefunden!",1,"Abbruch") ENDIF ELSE lgs%=anf_fat2%+len_fat% ENDIF wind_top(whdl&(0)) lesen do_list ENDIF RETURN ' PROCEDURE dir_files .| Glob. Var.: erg%,total%,n$ .| Felder : file$(),cluster%(),att%(),laenge%() .| Ruft auf : find_files,do_clr_out,mtasse,out,dec_hex_val$,out_do,set_last .| mnorm .| Aufruf in : menu_mess-1, LOCAL i%,j%,b%,fld%,nm%,a$,b$,c$,folder$ ' find_files erg%=3 do_clr_out(" Name Cluster Attribut Länge") mtasse CLR j%,nm%,fld%,folder$ IF total%>0 FOR i%=1 TO total% INC j% CLR c$ b%=RINSTR(file$(i%),"\") ' IF LEFT$(file$(i%),b%)<>folder$ out(LEFT$(file$(i%),b%)) folder$=LEFT$(file$(i%),b%) INC fld% ENDIF ' b$=STRING$(46,32) MID$(b$,5)=RIGHT$(file$(i%),LEN(file$(i%))-b%) MID$(b$,19)=@dec_hex_val$(cluster%(i%),6) MID$(b$,28)=RIGHT$(n$+BIN$(att%(i%)),8) MID$(b$,38)=@dec_hex_val$(laenge%(i%),8) IF (att%(i%) AND 16)<>0 c$=" Folder" ELSE IF (att%(i%) AND 8)<>0 nm%=1 c$=" Label" ELSE IF (att%(i%) AND 7)<>0 c$=" ???" ENDIF out(b$+c$) NEXT i% out("") DEC fld% a$="Files "+RIGHT$(n$+STR$(j%-fld%-nm%),4) out(a$+" Ordner "+RIGHT$(n$+STR$(fld%),4)) out_do set_last(3) ENDIF mnorm RETURN PROCEDURE last_3 .| Glob. Var.: txt_zeile%,top%,total%,txt_spalte%,txt_links%,lgs%,spc% .| anf_dat% .| Felder : cluster%(),whdl&(),att%(),file$() .| Ruft auf : liste_durchgehen,set_w,wind_top,do_datei_info,alrt .| Aufruf in : maus_pos-1, LOCAL a% a%=@liste_durchgehen(txt_zeile%+top%) ! Dateinamen ermitteln IF a%<=total% IF txt_spalte%+txt_links%>18 lgs%=(cluster%(a%)-2)*spc%+anf_dat% set_w wind_top(whdl&(0)) ELSE ' RS: Test: Namen lassen sich ändern. Mit BigDOS auch Zeit und Hidden-/System-Attribut. ' IF (att%(a%) AND (16+8))=0 do_datei_info(file$(a%)) ' ELSE ' ~@alrt(1,"Das geht nur mit Dateien!",1," Aha ") ' ENDIF ENDIF ENDIF RETURN ' ' dir_fldren: Ordner umbenennen ' Holt per Fileselektor einen Ordnernamen und erlaubt, den ' Ordner umzubenennen. Schaltet in den Diskmodus und stellt ' eventuell auf anderes Laufwerk um. PROCEDURE dir_fldren .| Glob. Var.: drive%,bps%,spc%,total%,cl%,lgs%,ab%,status%,el%,find% .| Felder : att%(),cluster%(),file$(),sec%() .| Ruft auf : change_pfad,fsel$,media,chk_drv,find_files,disc_on .| get_fld_name$,suche_in_liste,nam_conv$,err_inf,mnorm,einname,lesen .| do_list .| Aufruf in : menu_mess-1, LOCAL i%,a$,bb$,fi$,fld$,folder$ ' change_pfad(20,drive%) ! In Pfad Nummer 20 Laufwerk umstellen fi$=@fsel$("*.*","","Ordner umbenennen",20) ! Fileselektor aufrufen, Zielpfad holen IF fi$<>"" IF @media(drive%)=0 ! Auf Laufwerk drive% Wechsel auslösen ~@chk_drv(fi$) ! Eventuell auf neues Laufwerk umstellen bb$=STRING$(bps%*spc%,0) ! Clusterpuffer anlegen find_files ! Dateibaum durchsuchen disc_on ! In Diskmodus umschalten fld$=@get_fld_name$(fi$) ! Ordnernamen holen aus Pfadnamen a$=LEFT$(fi$,LEN(fi$)-1) ! Backslash am Ende entfernen i%=@suche_in_liste(LEFT$(a$,RINSTR(a$,"\"))+fld$) ' IF i%<=total% AND (att%(i%) AND 16)<>0 cl%=cluster%(i%) ! Cluster des Ordners holen a$=file$(i%) ! Dateiname holen a$=RIGHT$(a$,LEN(a$)-RINSTR(a$,"\")) ! Pfadanteil wegfiltern folder$=@nam_conv$(a$,1) ! Pfadname lgs%=sec%(i%) ! Sektor, in dem Ordner steht ' CLR ab% status%=@rwabs(0,V:bb$,spc%,lgs%,drive%) ! Cluster lesen err_inf(status%) mnorm i%=1 WHILE i%<bps%*spc%-32 AND ab%=0 ! Cluster nach Einträgen absuchen EXIT IF ASC(MID$(bb$,i%,1))=0 ! letzter Eintrag (beginnt mit 0) ' IF MID$(bb$,i%,11)=folder$ ! Ist das unser Ordner? einname("Neuer Ordnername",folder$) ! Neuen Namen eingeben lassen IF el%>0 MID$(bb$,i%,11)=@nam_conv$(a$,1) CLR find% status%=@rwabs(1,V:bb$,spc%,lgs%,drive%) ! Cluster schreiben err_inf(status%) ENDIF ab%=1 ! gefunden ENDIF ' ADD i%,32 ! nächster Eintrag WEND ENDIF lesen do_list ENDIF ENDIF RETURN PROCEDURE dir_root .| Glob. Var.: mode%,d.isk%,lgs%,anf_fat2%,len_fat%,z%,xt%,yt%,tz%,hex! .| Ruft auf : change,lesen,do_list .| Aufruf in : menu_mess-1, IF mode%=d.isk% change lgs%=anf_fat2%+len_fat% lesen CLR z%,xt%,yt%,tz% hex!=TRUE do_list ENDIF RETURN ' PROCEDURE dir_sort .| Glob. Var.: drive%,fi$,fld$,total%,lgs%,cl%,spc%,anf_dat%,msflag% .| anf_fat2%,len_fat%,len_dir%,mlgs%,anz%,aa%,zg%,jc%,mssec%,bps%,ed% .| mode%,d.isk%,anz_sec%,out%,buf%,sel_buf$,sel$,erg% .| Felder : cluster%() .| Ruft auf : change_pfad,fsel$,chk_drv,get_fld_name$,bios_block,find_files .| suche_in_liste,alrt,lesen,dir_sort_lgs,clr_out,nam_conv$,out,out_do .| set_last .| Aufruf in : menu_mess-1, LOCAL i%,a$ ' change_pfad(21,drive%) fi$=@fsel$("*.*","","DIR - SORT",21) IF RIGHT$(fi$)="\" ~@chk_drv(fi$) fld$=@get_fld_name$(fi$) bios_block(drive%) IF LEN(fld$)>0 CLR i% ! keine Datei find_files a$=LEFT$(fi$,LEN(fi$)-1) i%=@suche_in_liste(LEFT$(a$,RINSTR(a$,"\"))+fld$) IF i%>total% ~@alrt(3,"Ordner nicht gefunden!",1," Dumm ") CLR lgs% ELSE cl%=cluster%(i%) lgs%=(cl%-2)*spc%+anf_dat% ENDIF msflag%=-1 ELSE lgs%=anf_fat2%+len_fat% ! Anfang Wurzelverzeichnis msflag%=len_dir% ENDIF WHILE lgs% mlgs%=lgs% lesen anz%=1 CLR aa%,zg%,jc% mssec%=msflag% DO INC anz% ADD zg%,32 EXIT IF zg%>=bps% AND aa%>=ed% IF zg%>=bps% INC jc% IF jc%>=spc% AND msflag%=-1 lgs%=@dir_sort_lgs(lgs%) CLR jc% ! Sektoren-Cluster Zähler ELSE INC lgs% DEC mssec% IF mssec%=0 aa%=ed% ENDIF ENDIF CLR zg% ENDIF EXIT IF aa%>=ed% LOOP ' IF DIM?(fs$()) ERASE fs$() ENDIF DIM fs$(anz%+1) mode%=d.isk% ' clr_out("") CLR zg%,jc%,aa% lgs%=mlgs% anz_sec%=1 lesen ' mssec%=msflag% DO fs$(out%)=STRING$(32,0) ! DIR - Eintrag BMOVE buf%+zg%,V:fs$(out%),32 ! kopieren IF BYTE{buf%+zg%}>0 AND BYTE{buf%+zg%}<>&HE5 ! ist Datei ungelöscht? a$=LEFT$(fs$(out%),11) ! ja, IF ASC(a$)<>46 ! "." oder ".."? a$=@nam_conv$(a$,0) ! ok, konvertiere ENDIF IF (BYTE{buf%+zg%+11} AND 16) ! Ordner? a$=" "+a$ ! ja, kennzeichnen ELSE a$=" "+a$ ENDIF out(a$) ! und auf Bildschirm ENDIF ADD zg%,32 ! nächster Eintrag ' EXIT IF zg%>=bps% AND aa%>=ed% ! Sektor fertig? IF zg%>=bps% INC jc% ! ja, IF jc%>=spc% AND msflag%=-1 lgs%=@dir_sort_lgs(lgs%) ! nächsten CLR jc% ELSE INC lgs% DEC mssec% IF mssec%=0 aa%=ed% ENDIF ENDIF IF aa%<ed% INC anz_sec% lesen ! lesen ENDIF CLR zg% ENDIF EXIT IF aa%>=ed% LOOP CLR sel_buf$,sel$ erg%=3 out_do set_last(12) EXIT IF 1 WEND ENDIF RETURN PROCEDURE last_12 .| Glob. Var.: ev_clicks&,wa$,lgs%,mlgs%,b%,zg%,jc%,aa%,anz%,mssec%,msflag% .| buf%,bps%,ed%,spc%,out%,a$,anz_sec% .| Felder : fs$() .| Ruft auf : maus_sort,alrt,lesen,schreiben,dir_sort_lgs,do_list .| Aufruf in : maus_pos-1, IF ev_clicks&=1 maus_sort ELSE IF @alrt(2,"Neue Reihenfolge schreiben? ",0,wa$)=1 lgs%=mlgs% lesen CLR b%,zg%,jc%,aa% anz%=1 IF LEFT$(fs$(anz%),11)=SPACE$(11) INC anz% ENDIF ' mssec%=msflag% REPEAT BMOVE V:fs$(anz%),buf%+zg%,32 ! Eintrag in Puffer schreiben INC anz% ADD zg%,32 EXIT IF zg%>=bps% AND aa%>=ed% IF zg%>=bps% ! Wenn Puffer voll ist INC b% schreiben ! dann schreiben INC jc% IF jc%>=spc% AND msflag%=-1 lgs%=@dir_sort_lgs(lgs%) CLR jc% ELSE INC lgs% DEC mssec% IF mssec%=0 aa%=ed% ENDIF ENDIF IF aa%<ed% lesen ! nächsten Lesen ENDIF CLR zg% ENDIF UNTIL anz%>out% ! bis alle Einträge geschrieben ' a$=STRING$(32,0) ! den Rest des Puffers mit 00 REPEAT ! füllen. WHILE zg%<bps% BMOVE V:a$,buf%+zg%,32 ADD zg%,32 WEND INC b% schreiben ! Puffer schreiben INC jc% IF jc%>=spc% AND msflag%=-1 lgs%=@dir_sort_lgs(lgs%) CLR jc% ELSE INC lgs% DEC mssec% IF mssec%=0 aa%=ed% ENDIF ENDIF lesen CLR zg% UNTIL b%>=anz_sec% ! auch die restlichen Sektoren ENDIF lgs%=mlgs% ! ersten DIR-Sektor lesen lesen ! und anzeigen do_list ENDIF RETURN FUNCTION dir_sort_lgs(lgs%) .| Glob. Var.: cl%,anf_dat%,spc%,aa% .| Ruft auf : read_in_fat .| Aufruf in : dir_sort-2,last_12-2, cl%=INT((lgs%-anf_dat%)/spc%)+2 aa%=@read_in_fat(cl%) RETURN (aa%-2)*spc%+anf_dat% ENDFUNC PROCEDURE maus_sort .| Glob. Var.: wahl%,txt_zeile%,top%,sel_buf$,out%,sel$,i% .| Felder : out$(),fs$() .| Ruft auf : do_list .| Aufruf in : last_12-1, wahl%=txt_zeile%+top% IF sel_buf$="" IF wahl%<out% sel_buf$=out$(wahl%) out$(0)=out$(wahl%) sel$=fs$(wahl%) FOR i%=wahl% TO out% fs$(i%)=fs$(i%+1) out$(i%)=out$(i%+1) NEXT i% fs$(out%)="" out$(out%)="" DEC out% do_list ENDIF ELSE IF wahl%<out%+1 AND wahl%>0 INC out% FOR i%=out% DOWNTO wahl% fs$(i%)=fs$(i%-1) out$(i%)=out$(i%-1) NEXT i% fs$(wahl%)=sel$ out$(wahl%)=sel_buf$ CLR sel_buf$,sel$ out$(0)="" do_list ENDIF ENDIF RETURN ' ---------------------- GEMDOS-Routinen ----------------------- FUNCTION fgetdta .| Aufruf in : disc_quick-1,datei_suchen-1,pfad_compare-1, RETURN GEMDOS(47) ENDFUNC FUNCTION dsetdrv(drive%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : media_all-1,sektor_compare-1,disc_info-1,disc_drive-1 .| set_pfad-1, LOCAL fehler% fehler%=GEMDOS(14,W:drive%) IF fehler%<0 err_inf1(fehler%,"Dsetdrv: "+CHR$(drive%+65),gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION dsetpath(df$) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : disc_info-1,set_pfad-1, LOCAL fehler% df$=df$+CHR$(0) fehler%=GEMDOS(59,L:V:df$) IF fehler%<0 err_inf1(fehler%,"Dsetpath: "+df$,gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION frename(df$,df2$) .| Glob. Var.: gm$ .| Ruft auf : err_inf1,err_inf3 .| Aufruf in : save_einstellungen-1,do_datei_info-1, LOCAL fehler% fehler%=GEMDOS(86,0,L:V:df$,L:V:df2$) IF fehler%<>0 err_inf1(fehler%,"Frename: "+df$,gm$) err_inf3(fehler%," "+df2$,gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fdatime(df%,handle%,fmode%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : do_datei_info-2, LOCAL fehler% fehler%=GEMDOS(87,L:df%,W:handle%,W:fmode%) IF fehler%<>0 err_inf1(fehler%,"Fdatime:",gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fattrib(df$,attr%,fmode%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : do_datei_info-2,fdelete-2, LOCAL fehler% df$=df$+CHR$(0) fehler%=GEMDOS(67,L:VARPTR(df$),fmode%,attr%) IF fehler%<0 err_inf1(fehler%,"Fattrib: "+df$+" "+STR$(attr%),gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fcreate(name$,attr%) .| Glob. Var.: df$,gm$ .| Ruft auf : err_inf1 .| Aufruf in : save_einstellungen-1,disc_info-1,do_file_copy-2,chk_create-1 .| chk_opn-1, LOCAL fehler% df$=name$+CHR$(0) fehler%=GEMDOS(60,L:V:df$,W:attr%) IF fehler%<0 err_inf1(fehler%,"Fcreate: "+df$,gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fopen(df$,fmode%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : init_do-1,init_help-1,hard_restore-1,ram_load-1,disc_load-1 .| datei_concat-2,file_verify-2,do_file_copy-1,do_file_open-1 .| do_datei_info-2,do_in-1,printer-1,chk_opn-1,do_ascii-1, LOCAL fehler% ' df$=df$+CHR$(0) fehler%=GEMDOS(61,L:V:df$,W:fmode%) IF fehler%<0 err_inf1(fehler%,"Fopen: "+df$,gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fseek(offset%,handle%,modus%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : init_do-2,init_help-2,ram_load-2,disc_load-2,file_write-1 .| file_read-1,datei_concat-4,file_verify-4,do_file_copy-2 .| do_file_open-1,do_datei_info-3,do_in-2,search_lesen-1,chk_opn-1 .| do_ascii-2, LOCAL fehler% ' fehler%=GEMDOS(66,L:offset%,W:handle%,W:modus%) IF fehler%<0 err_inf1(fehler%,"Fseek:",gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fclose(handle%) .| Glob. Var.: gm$ .| Ruft auf : err_inf1 .| Aufruf in : init_do-1,save_einstellungen-1,init_help-1,hard_save-1 .| hard_restore-1,ram_save-1,ram_load-1,disc_info-1,disc_load-1 .| file_close-1,datei_cut-2,datei_concat-3,file_verify-2,file_is_open-1 .| do_file_copy-4,do_datei_info-2,sav_buf-1,sav_block-1,do_in-1 .| look_ex-1,out_logbuch-1,log_out-1,chk_opn-1,do_ascii-1,fat_test-1, LOCAL fehler% ' fehler%=GEMDOS(62,W:handle%) IF fehler%<0 err_inf1(fehler%,"Fclose:",gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fdelete(df$) .| Glob. Var.: gm$ .| Ruft auf : fattrib,err_inf1 .| Aufruf in : datei_del-1,chk_opn-1, LOCAL a%,fehler% df$=df$+CHR$(0) a%=@fattrib(df$,0,0) IF (a% AND 1)<>0 ! Schreibgeschützt? ~@fattrib(df$,(a% AND &HFE),1) ENDIF fehler%=GEMDOS(65,L:VARPTR(df$)) IF fehler%<0 err_inf1(fehler%,"Fdelete: "+df$,gm$) ENDIF RETURN fehler% ENDFUNC FUNCTION fread$(handle%,bytes%) .| Glob. Var.: buf$,fehler% .| Ruft auf : freadf .| Aufruf in : init_do-1,ram_load-1,file_verify-4,do_datei_info-2, buf$=SPACE$(bytes%) fehler%=GEMDOS(63,W:handle%,L:bytes%,L:V:buf$) freadf RETURN buf$ ENDFUNC ' PROCEDURE freadf .| Glob. Var.: fehler%,gm$,bytes% .| Ruft auf : err_inf1 .| Aufruf in : fread-1,fread2-1, IF fehler%<0 err_inf1(fehler%,"Fread:",gm$) ENDIF IF fehler%<>bytes% err_inf1(fehler%,"Fread: Lesen",gm$) ENDIF RETURN PROCEDURE fread2(handle%,fread%,bytes%) .| Glob. Var.: fehler% .| Ruft auf : freadf .| Aufruf in : init_help-1,hard_restore-2,ram_load-1,disc_load-1 .| file_read-1,datei_concat-4,do_file_copy-3,do_in-1,search_lesen-2 .| do_ascii-1, fehler%=GEMDOS(63,W:handle%,L:bytes%,L:fread%) freadf RETURN PROCEDURE fwrite(handle%,buf$) .| Glob. Var.: fehler% .| Ruft auf : fwritef .| Aufruf in : ram_save-2,do_datei_info-1,look_ex-1, fehler%=GEMDOS(64,handle%,L:LEN(buf$),L:V:buf$) fwritef RETURN PROCEDURE fwritef .| Glob. Var.: fehler%,buf$,gm$ .| Ruft auf : err_inf1 .| Aufruf in : fwrite-1,fwritec-1, IF fehler%=0 OR fehler%<>LEN(buf$) err_inf1(fehler%,"Fwrite:",gm$) fehler%=-1 ENDIF RETURN PROCEDURE fwritec(handle%,buf$) .| Glob. Var.: cr$,fehler% .| Ruft auf : fwritef .| Aufruf in : save_einstellungen-28,out_do-1,out_sed-1,file_dump-3 .| sav_buf-2,sav_block-2,print_buf-1,print_blk-1,do_dump-1,text_dev-5, buf$=buf$+cr$ ! Text schreiben + CR+LF fehler%=GEMDOS(64,handle%,L:LEN(buf$),L:V:buf$) fwritef RETURN PROCEDURE fwrite2(handle%,fw%,fz%) .| Glob. Var.: fehler%,gm$ .| Ruft auf : err_inf1 .| Aufruf in : hard_save-2,disc_save-1,file_write-1,datei_cut-4 .| datei_concat-4,do_file_copy-3,sav_buf-1,sav_block-1,log_out-1 .| fat_get_leiche-1, fehler%=GEMDOS(64,handle%,L:fz%,L:fw%) IF fehler%=0 OR fehler%<>fz% err_inf1(fehler%,"Fwrite:",gm$) ENDIF RETURN ' ---------------------- PROCEDURE lies_all(p$) ! sucht alle Dateien (au₧er LABEL) .| Glob. Var.: dta%,dta$,lies_mode%,abb% .| Ruft auf : lies_all,lies_1,dum,lies_3,lies_4 .| Aufruf in : disc_quick-1,datei_suchen-1,pfad_compare-1,lies_all-1, LOCAL f$,all$,nr%,i% CLR nr% all$=p$+"*.*"+CHR$(0) IF GEMDOS(78,L:VARPTR(all$),&X110111)=0 ! Fsfirst REPEAT BMOVE dta%,V:dta$,44 INC nr% f$=MID$(dta$,31,INSTR(31,dta$,CHR$(0))-31) IF (ASC(MID$(dta$,22,1)) AND 16)<>0 ! Ordner? IF ASC(f$)<>46 ! kein "." oder ".." lies_all(p$+f$+"\") i%=1 ~GEMDOS(78,L:VARPTR(all$),&X110111) WHILE i%<nr% ~GEMDOS(79) ! Fsnext INC i% WEND ENDIF ELSE ON lies_mode% GOSUB lies_1,dum,lies_3,lies_4 ENDIF EXIT IF abb%>0 UNTIL GEMDOS(79) ENDIF RETURN ' ---------------------- OUT Puffer(Block) ------------- PROCEDURE sav_buf ! Puffer auf Disc .| Glob. Var.: device%,erg%,hdl%,buf%,l_end%,info_line$ .| Felder : l_end%() .| Ruft auf : dump_data,dev,mtasse,fwrite2,fclose,out_sed,info,fwritec .| do_dump,look_ex,mnorm .| Aufruf in : dat_sichern_als-1, LOCAL was%,a$ ' was%=@dump_data CLR device% erg%=1 a$="Puffer ausgeben - " IF was%>0 dev(a$+"DATA",38) ELSE dev(a$+"DUMP",39) ENDIF IF device%<>99 mtasse IF was%>0 ! Datas fwrite2(hdl%,buf%,l_end%) ~@fclose(hdl%) ELSE ! DUMP out_sed(hdl%) info fwritec(hdl%,info_line$) fwritec(hdl%,STRING$(75,"-")) do_dump(0,l_end%(0)) look_ex ENDIF ENDIF mnorm RETURN PROCEDURE sav_block ! Block auf Disc .| Glob. Var.: erg%,device%,hdl%,buf%,buf_beg%,buf_end%,info_line$ .| Ruft auf : dump_data,dev,mtasse,fwrite2,fclose,out_sed,info,fwritec .| do_dump,look_ex,mnorm .| Aufruf in : dat_sichern_als-1, LOCAL i%,a%,was%,a$ ' was%=@dump_data erg%=1 a$="Block sichern - " IF was%>0 dev(a$+"DATA",40) ELSE dev(a$+"DUMP",41) ENDIF IF device%<>99 mtasse IF was%>0 fwrite2(hdl%,buf%+buf_beg%,buf_end%-buf_beg%) ~@fclose(hdl%) ELSE out_sed(hdl%) info fwritec(hdl%,info_line$) fwritec(hdl%,STRING$(75,"-")) do_dump(buf_beg%,buf_end%-buf_beg%+1) look_ex ENDIF ENDIF mnorm RETURN PROCEDURE print_buf ! Puffer auf Drucker .| Glob. Var.: erg%,device%,hdl%,info_line$ .| Felder : l_end%() .| Ruft auf : dev,out_sed,info,fwritec,do_dump,look_ex .| Aufruf in : dat_drucken-1, erg%=2 dev("Puffer drucken",42) IF device%<>99 out_sed(hdl%) info fwritec(hdl%,info_line$) do_dump(0,l_end%(0)) look_ex ENDIF RETURN PROCEDURE print_blk ! Block auf Drucker .| Glob. Var.: erg%,device%,hdl%,info_line$,buf_beg%,buf_end% .| Ruft auf : dev,mtasse,out_sed,info,fwritec,do_dump,look_ex .| Aufruf in : dat_drucken-1, erg%=2 dev("Block drucken",43) IF device%<>99 mtasse out_sed(hdl%) info fwritec(hdl%,info_line$) do_dump(buf_beg%,buf_end%-buf_beg%) look_ex ENDIF RETURN PROCEDURE do_dump(sav_beg%,sav_anz%) .| Glob. Var.: offset%,fp%,ram_addr%,buf%,j%,hdl%,abb% .| Ruft auf : dec_hex_val$,fwritec,was_ist .| Aufruf in : file_dump-1,sav_buf-1,sav_block-1,print_buf-1,print_blk-1, LOCAL a%,b%,c%,i%,zl%,o$,a$ CLR zl% ' c%=offset%+sav_beg%+fp%+ram_addr% REPEAT b%=buf%+sav_beg%+zl%*16 j%=1 o$=SPACE$(65) FOR i%=1 TO MIN(16,sav_anz%) a%=BYTE{b%} MID$(o$,j%)=HEX$(a%,2) MID$(o$,i%+49,1)=CHR$(MAX(32,a%)) INC b% ADD j%,3 NEXT i% SUB sav_anz%,16 a$=@dec_hex_val$(c%+zl%*16,8)+" "+o$ fwritec(hdl%,a$) INC zl% abb%=@was_ist UNTIL sav_anz%<=0 OR abb%>0 RETURN PROCEDURE to_blk_anf .| Glob. Var.: wind%,buf_beg%,tblkaz%,top%,txt_zeile%,txt_spalte%,tblkas% .| Felder : wz%() .| Ruft auf : coff,pos_cursor,do_list .| Aufruf in : menu_mess-1, coff IF wind%=0 pos_cursor(buf_beg%) ELSE IF tblkaz%<top% OR tblkaz%>top%+wz%(wind%) top%=tblkaz% CLR txt_zeile% ELSE txt_zeile%=tblkaz%-top% ENDIF txt_spalte%=tblkas% ENDIF do_list RETURN PROCEDURE to_blk_end .| Glob. Var.: wind%,buf_end%,tblkez%,top%,txt_zeile%,txt_spalte%,tblkes% .| Felder : wz%() .| Ruft auf : coff,pos_cursor,do_list .| Aufruf in : menu_mess-1, coff IF wind%=0 pos_cursor(buf_end%) ELSE IF tblkez%>top%+wz%(wind%) OR tblkez%<top% top%=tblkez%-wz%(wind%)+1 txt_zeile%=wz%(wind%)-1 ELSE txt_zeile%=tblkez%-top% ENDIF txt_spalte%=tblkes%+1 ENDIF do_list RETURN ' PROCEDURE do_in(fi$,max_len%,wohin%) .| Glob. Var.: fhandle%,buf_beg%,buf_end%,old_p%,ch% .| Ruft auf : fopen,fseek,fread2,fclose,set_stat,do_list .| Aufruf in : in_file-1, LOCAL a% IF EXIST(fi$)=TRUE fhandle%=@fopen(fi$,0) a%=@fseek(0,fhandle%,2) a%=MIN(max_len%,a%) CLR buf_beg% buf_end%=a% ~@fseek(0,fhandle%,0) fread2(fhandle%,wohin%,a%) ~@fclose(fhandle%) DEC old_p% INC ch% set_stat do_list ENDIF RETURN PROCEDURE in_file ! Datei(stück) in Puffer einlesen (auch Cursorposition) .| Glob. Var.: fi$,wo%,buf%,tz%,z%,bps% .| Ruft auf : fsel$,alrt,do_in,do_list .| Aufruf in : dat_lesen-1, fi$=@fsel$("*.*","","Puffer einlesen",24) IF fi$<>"" AND RIGHT$(fi$)<>"\" wo%=buf% IF tz%+z%<>0 SELECT @alrt(2,"An Cursorposition ablegen?",1,"Ja|Nein|Abbruch") CASE 3 wo%=-1 CASE 1 wo%=buf%+tz%+z% CASE 2 wo%=buf% ENDSELECT ENDIF IF wo%>=0 do_in(fi$,bps%-tz%-z%,wo%) ENDIF do_list ENDIF RETURN ' ---------------------- Tastatur ---------------------- PROCEDURE taste(key%,ev_ks&) .| Glob. Var.: low%,hi%,appl_id%,menu_pointer%,wind%,hex!,xt%,beg_ascii% .| txt_spalte%,txt_links%,txt_zeile%,top%,wc% .| Felder : whdl&(),out$() .| Ruft auf : coff,menu_search,alt,control,tab,lend,up,set_slide,do_list .| last_char,down,do_undo,edit_buf,cursor .| Aufruf in : message_auswerten-1, LOCAL a%,a$ ' low%=key% AND &HFF hi%=key% DIV &H100 coff IF @menu_search(appl_id%,menu_pointer%,ev_ks&,key%)=0 ' ! wenn in MENU nichts gefunden IF (ev_ks& AND 8)<>0 ! = ALT alt(hi%,low%) ELSE IF (ev_ks& AND 4)<>0 ! = CTRL control(hi%,low%) ELSE IF (ev_ks& AND 3)<>0 ! = SHIFT links oder rechts oder beide SELECT hi% CASE 15 tab CASE 71 ! HOME lend(wind%) CASE 72 ! SHIFT Cursor up up(wind%) CASE 75 IF wind%=0 IF hex!=FALSE ! SHIFT+Cursor left hex!=TRUE xt%=(xt%-beg_ascii%)*3 ENDIF ELSE txt_spalte%=1 CLR txt_links% set_slide(whdl&(1)) do_list ENDIF CASE 77 IF wind%=0 IF hex!=TRUE ! SHIFT+Cursor right hex!=FALSE xt%=xt%/3+beg_ascii% ENDIF ELSE a$=out$(txt_zeile%+top%) a%=@last_char(a$) IF a%<wc% txt_spalte%=a% ELSE txt_links%=a%-wc% txt_spalte%=wc% ENDIF set_slide(whdl&(1)) do_list ENDIF CASE 80 ! SHIFT Cursor down @down(wind%) CASE 97 ! UNDO do_undo DEFAULT edit_buf(hi%,low%) ! sonst Edit Buffer ENDSELECT ELSE SELECT low% CASE 0 ! Cursor- oder Sondertasten cursor(hi%,low%) ' CASE 27 ! ESC ' exit CASE 9 ! TAB IF wind%=0 key%=5897 ! CTRL I emulieren ev_ks&=4 ~@menu_search(appl_id%,menu_pointer%,ev_ks&,key%) ELSE tab ENDIF DEFAULT edit_buf(hi%,low%) ! sonst Edit Buffer ENDSELECT ENDIF ENDIF ENDIF ENDIF RETURN PROCEDURE control(hi%,low%) .| Glob. Var.: out%,lgs%,wind% .| Ruft auf : ctrl_tab,disass,out,do_list,log_out,next,opt_help,prev .| edit_buf .| Aufruf in : taste-1, SELECT hi% CASE 15 ! CTRL TAB ctrl_tab CASE 57 ! CTRL SPACE disass CASE 96 ! CTRL > IF out%=0 out("Logbuch") ENDIF out("LGS:"+STR$(lgs%)) do_list log_out next(0) CASE 98 ! CTRL HELP opt_help CASE 115 ! CTRL Cursor left prev(wind%) CASE 116 ! CTRL Cursor right next(wind%) DEFAULT edit_buf(hi%,low%) ! sonst Edit Buffer ENDSELECT RETURN PROCEDURE cursor(hi%,low%) .| Glob. Var.: wind%,xt%,hex!,beg_ascii% .| Felder : whdl&() .| Ruft auf : coff,floskel,c_down,c_up,c_left,c_right,top,opt_help,do_undo .| cursor,set_slide,set_tz,do_cursor_anz,blit_cursor .| Aufruf in : taste-1,cursor-1,ctrl_tab-1,tab-1,maus_pos-1,edit_ex-1, coff IF hi%>58 AND hi%<69 floskel(hi%) ELSE SELECT hi% ' CASE 80 ! DOWN c_down CASE 72 ! UP c_up CASE 75 ! LEFT c_left CASE 77 ! RIGHT c_right ' CASE 71 ! HOME top(wind%) CASE 98 ! HELP opt_help CASE 97 ! UNDO do_undo ENDSELECT ' ENDIF ' IF wind%=0 IF xt%>=0 AND xt%<47 ! HEX-BEREICH IF FRAC((xt%+1)/3)=0 IF hi%=75 ! wenn LEFT und hi_nibble, dann 2 LEFT DEC xt% ELSE INC xt% ENDIF ENDIF hex!=TRUE ELSE IF xt%>49 AND xt%<beg_ascii%+15 ! ASCII - BEREICH hex!=FALSE ENDIF ENDIF IF FRAC((xt%+1)/3)=0 AND hex!=TRUE cursor(77,0) ENDIF ENDIF set_slide(whdl&(wind%)) set_tz do_cursor_anz(wind%) blit_cursor RETURN PROCEDURE alt(hi%,low%) .| Ruft auf : test_suche,magic,edit_buf .| Aufruf in : taste-1, SELECT hi% CASE 120 ! ALT-1 test_suche ' CASE 50 magic ! ALT-M DEFAULT edit_buf(hi%,low%) ! Edit ENDSELECT RETURN ' PROCEDURE alt_f ! Block füllen mit Byte unter Cursor .| Glob. Var.: wind%,bc%,buf_end%,buf_beg%,buf%,tz%,z%,ch% .| Ruft auf : do_list,nur_daten_fenster .| Aufruf in : menu_mess-1, LOCAL ab%,bb$ IF wind%=0 bc%=buf_end%-buf_beg% IF bc%>0 INC bc% ab%=BYTE{buf%+tz%+z%} bb$=STRING$(bc%,ab%) BMOVE V:bb$,buf_beg%+buf%,bc% INC ch% CLR bb$ do_list ENDIF ELSE nur_daten_fenster ENDIF RETURN PROCEDURE alt_q ! Komplett suchen .| Glob. Var.: erg%,no_nxt%,found!,abb%,search$,in1$,search_cont%,mode% .| d.isk%,lgs%,tz%,z%,f.ile%,fi_o$,fp%,h.ard%,block%,r.am%,ram_addr% .| Felder : whdl&() .| Ruft auf : clr_out,search,info_line,set_slide,out,dec_hex_val$,lesen .| out_do .| Aufruf in : menu_mess-1, LOCAL first! first!=TRUE erg%=3 clr_out("") DO search EXIT IF (no_nxt%=1 AND found!=FALSE) OR abb% OR search$="" info_line set_slide(whdl&(0)) IF first!=TRUE out("Komplett suchen: "+in1$) first!=FALSE ENDIF search_cont%=1 ' SELECT mode% CASE d.isk% out("in Sektor "+@dec_hex_val$(lgs%,8)+" Adresse "+@dec_hex_val$(tz%+z%,4)) CASE f.ile% out("in Datei "+fi_o$+" Adresse "+@dec_hex_val$(fp%+tz%+z%,8)) CASE h.ard% out("in Block "+@dec_hex_val$(block%,8)+" Adresse "+@dec_hex_val$(tz%+z%,4)) CASE r.am% out("an Adresse "+@dec_hex_val$(ram_addr%+tz%,8)) ENDSELECT LOOP CLR search_cont% lesen out_do RETURN PROCEDURE alt_t ! Block ins ASCII-Fenster .| Glob. Var.: wind%,erg%,out%,bc%,buf_end%,buf_beg%,buf%,a$ .| Felder : out$() .| Ruft auf : out,check_tab$,out_do,lend,nur_daten_fenster .| Aufruf in : menu_mess-1, LOCAL ab%,a%,b%,c%,b$ ' IF wind%=0 erg%=3 IF out%=0 out$(0)="Block -> Text" INC out% ENDIF bc%=buf_end%-buf_beg% IF bc%>0 b%=buf_beg%+buf% c%=b%+bc%+1 b$=STRING$(MIN(255,bc%),0) ' WHILE b%<=c% ! schon am Ende? BMOVE b%,V:b$,LEN(b$) a%=INSTR(1,b$,CHR$(10)) IF a%<2 a%=LEN(b$)+2 ENDIF a$=STRING$(a%-2,0) BMOVE b%,V:a$,LEN(a$) out(@check_tab$(a$)) IF a%=LEN(b$)+2 SUB a%,2 ENDIF ADD b%,a% WEND out_do lend(1) ENDIF ELSE nur_daten_fenster ENDIF RETURN ' PROCEDURE ctrl_a ! Alles auswählen .| Glob. Var.: wind%,buf_beg%,buf_end%,l_end%,tbuf_beg%,tbuf_end%,out% .| Ruft auf : set_stat,do_list .| Aufruf in : menu_mess-1, IF wind%=0 buf_beg%=0 buf_end%=l_end% ELSE tbuf_beg%=0 tbuf_end%=out%*255 ENDIF set_stat do_list RETURN PROCEDURE ctrl_b ! Blockanfang .| Glob. Var.: wind%,buf_beg%,tz%,z%,tbuf_beg%,top%,txt_zeile%,txt_spalte% .| Ruft auf : set_stat,do_list .| Aufruf in : menu_mess-1, IF wind%=0 buf_beg%=tz%+z% ELSE tbuf_beg%=(top%+txt_zeile%)*255+txt_spalte% ENDIF set_stat do_list RETURN PROCEDURE ctrl_c ! Block Copy .| Glob. Var.: wind%,buf_end%,buf_beg%,buf%,tz%,z%,ch% .| Ruft auf : do_list,nur_daten_fenster .| Aufruf in : menu_mess-1, LOCAL bb$,bc% ' IF wind%=0 bc%=buf_end%-buf_beg%+1 IF bc%>1 bb$=STRING$(bc%,0) BMOVE buf_beg%+buf%,V:bb$,bc% BMOVE V:bb$,buf%+tz%+z%,bc% INC ch% CLR bb$ do_list ENDIF ELSE nur_daten_fenster ENDIF RETURN PROCEDURE ctrl_f ! Suchen .| Felder : whdl&() .| Ruft auf : change,search,set_slide,do_list .| Aufruf in : menu_mess-1, change search set_slide(whdl&(0)) do_list RETURN PROCEDURE ctrl_g ! Weitersuchen .| Glob. Var.: search_cont% .| Ruft auf : change,search,do_list .| Aufruf in : menu_mess-1, change search_cont%=1 search do_list CLR search_cont% RETURN PROCEDURE ctrl_h ! Blockmarkierung löschen .| Glob. Var.: wind%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg%,txt_blkon% .| Felder : whdl&() .| Ruft auf : set_stat,wind_top,menu_blkhide,redraw,set_var_txt .| Aufruf in : set_block-1,menu_mess-1,edit_ascii-1,search-2,opt_ascii-1, IF wind%=0 buf_end%=buf_beg%-1 set_stat wind_top(whdl&(0)) menu_blkhide(0) redraw(0) ELSE IF tbuf_end%>tbuf_beg% CLR tbuf_beg%,tbuf_end%,txt_blkon% set_var_txt set_stat redraw(1) ENDIF ENDIF RETURN PROCEDURE ctrl_k ! Blockende .| Glob. Var.: wind%,buf_end%,tz%,z%,tbuf_end%,top%,txt_zeile%,txt_spalte% .| Ruft auf : set_stat,do_list .| Aufruf in : menu_mess-1, IF wind%=0 buf_end%=tz%+z% ELSE tbuf_end%=(top%+txt_zeile%)*255+txt_spalte% ENDIF set_stat do_list RETURN PROCEDURE ctrl_t ! Block->Funktionstaste .| Glob. Var.: wind%,buf_end%,buf_beg%,i%,j%,f1o&,f.key%,b.ox%,boxtxt&,a$ .| boxaktiv& .| Felder : flos$() .| Ruft auf : set_state,clr_state,box_draw,form_do,objc_update,box_undraw .| put_char,put_to_fkey,nur_daten_fenster .| Aufruf in : menu_mess-1, LOCAL a%,b%,c%,fu%,ex_obj&,ex_objc% IF wind%=0 IF buf_end%>buf_beg% FOR i%=1 TO 10 j%=f1o&+i%-1 IF VAL(flos$(0,i%))<>0 set_state(f.key%,j%,4) ! HAKEN ELSE clr_state(f.key%,j%,4) ENDIF NEXT i% ' DO box_draw(f.key%) ! FKEY-Dialog ex_obj&=@form_do(f.key%) ex_objc%=ex_obj& AND &HFF clr_state(f.key%,ex_objc%,1) objc_update(f.key%,ex_objc%) box_undraw(f.key%) ' c%=ex_objc%-f1o&+1 EXIT IF (ex_obj& AND &HFF00)=0 ! Raus wenn kein Doppelklick ' put_char(b.ox%,boxtxt&,"FKEY "+STR$(c%)+"-Belegung") a$=STR$(LEN(flos$(1,c%))/2)+" "+LEFT$(flos$(1,c%),20) put_char(b.ox%,boxaktiv&,a$) box_draw(b.ox%) ex_obj&=@form_do(b.ox%) AND &HFF clr_state(f.key%,ex_obj&,1) box_undraw(b.ox%) LOOP IF c%>=1 AND c%<=10 put_to_fkey(c%) ! Funktiostaste belegen ENDIF ENDIF ELSE nur_daten_fenster ENDIF RETURN ' PROCEDURE put_to_fkey(fkey%) .| Glob. Var.: buf_end%,buf_beg%,buf% .| Felder : flos$() .| Ruft auf : mtasse,mnorm .| Aufruf in : ctrl_t-1,last_9-1, LOCAL j%,i%,bc%,fu% ' mtasse bc%=buf_end%-buf_beg%+1 flos$(0,fkey%)=STR$(bc%*2) flos$(1,fkey%)=STRING$(bc%*2,0) j%=1 FOR i%=1 TO bc% fu%=BYTE{buf%+buf_beg%+i%-1} MID$(flos$(1,fkey%),j%)=HEX$(fu%,2) ADD j%,2 NEXT i% mnorm RETURN FUNCTION last_char(a$) .| Aufruf in : taste-1,edit_ascii-1, LOCAL a% ' a%=LEN(a$) WHILE MID$(a$,a%,1)=" " AND a%>1 DEC a% WEND RETURN a%+1 ENDFUNC ' PROCEDURE ctrl_tab ! Tabulator zurück .| Glob. Var.: i%,tabs% .| Ruft auf : cursor .| Aufruf in : control-1, FOR i%=1 TO tabs% cursor(75,0) NEXT i% RETURN PROCEDURE set_stat ! Revers ... .| Glob. Var.: wind%,utis%,ak%,l_end%,buf_end%,buf_beg%,tbuf_end%,tbuf_beg% .| txt_blkon% .| Ruft auf : menu_blkhide,set_var_txt .| Aufruf in : set_block-1,txt_block-1,wind_top-1,set_w-1,do_in-1,ctrl_a-1 .| ctrl_b-1,ctrl_h-2,ctrl_k-1,set_found_block-1, IF wind%=0 ~C:utis%(&H300,L:ak%,L:l_end%-1) ! erst löschen ... IF buf_end%>=buf_beg% ~C:utis%(&H301,L:ak%+buf_beg%,L:buf_end%-buf_beg%) menu_blkhide(1) ELSE menu_blkhide(0) ENDIF ELSE set_var_txt IF tbuf_end%>tbuf_beg% txt_blkon%=1 menu_blkhide(1) ELSE txt_blkon%=0 menu_blkhide(0) ENDIF ENDIF RETURN PROCEDURE tab ! Tabulator vor .| Glob. Var.: tabs% .| Ruft auf : cursor .| Aufruf in : taste-2, LOCAL i% FOR i%=1 TO tabs% cursor(77,0) NEXT i% RETURN PROCEDURE magic ! $1234 .| Glob. Var.: buf%,z%,wzb%,ch% .| Ruft auf : do_list .| Aufruf in : alt-1, ~XBIOS(18,L:buf%,L:-1,-1,1) z%=512-wzb% INC ch% do_list RETURN PROCEDURE next(nr%) ! Next .| Glob. Var.: z%,l_end%,wzb% .| Ruft auf : down .| Aufruf in : wind_slide-1,control-2,scrollup-2, z%=l_end%-wzb% @down(nr%) RETURN PROCEDURE prev(nr%) ! Previous .| Glob. Var.: z% .| Ruft auf : up .| Aufruf in : wind_slide-1,control-1,scrolldown-1, CLR z% up(nr%) RETURN PROCEDURE set_list_offset .| Glob. Var.: wind%,a%,offset%,el% .| Ruft auf : eingabe,do_list,nur_daten_fenster .| Aufruf in : menu_mess-1, IF wind%=0 a%=@eingabe("Anzeige-Offset eingeben:",offset%) IF el%>0 offset%=a% do_list ENDIF ELSE nur_daten_fenster ENDIF RETURN ' ---------------------- PROCEDURE c_down ! Cursor down .| Glob. Var.: wind%,yt%,wz%,txt_zeile% .| Ruft auf : scrollup .| Aufruf in : cursor-1, IF wind%=0 IF yt%<wz%-1 INC yt% ELSE scrollup(wind%) ENDIF ELSE IF txt_zeile%+1<wz% INC txt_zeile% ELSE scrollup(wind%) ENDIF ENDIF RETURN PROCEDURE c_up ! Cursor up .| Glob. Var.: wind%,yt%,txt_zeile% .| Ruft auf : scrolldown .| Aufruf in : cursor-1, IF wind%=0 IF yt%>0 DEC yt% ELSE scrolldown(wind%) ENDIF ELSE IF txt_zeile%>0 DEC txt_zeile% ELSE scrolldown(wind%) ENDIF ENDIF RETURN PROCEDURE c_left ! Cursor left .| Glob. Var.: wind%,xt%,hex!,yt%,beg_ascii%,wz%,txt_spalte% .| Ruft auf : up,scroll_right .| Aufruf in : cursor-1, IF wind%=0 DEC xt% IF hex!=TRUE IF xt%<0 xt%=46 DEC yt% ENDIF ELSE IF xt%<beg_ascii% xt%=beg_ascii%+15 DEC yt% ENDIF ENDIF IF yt%<0 up(wind%) yt%=wz%-1 IF hex!=TRUE IF xt%<0 xt%=46 DEC yt% ENDIF ELSE IF xt%<beg_ascii% xt%=beg_ascii%+15 DEC yt% ENDIF ENDIF ENDIF ELSE IF txt_spalte%>1 txt_spalte%=MAX(1,txt_spalte%-1) ELSE scroll_right ENDIF ENDIF RETURN PROCEDURE c_right ! Curosr right .| Glob. Var.: wind%,xt%,hex!,yt%,beg_ascii%,wz%,txt_spalte%,wc% .| Ruft auf : scrollup,scroll_left .| Aufruf in : cursor-1, IF wind%=0 INC xt% IF hex!=TRUE IF xt%>46 CLR xt% INC yt% ENDIF ELSE IF xt%>beg_ascii%+15 xt%=beg_ascii% INC yt% ENDIF ENDIF IF yt%>wz%-1 scrollup(wind%) ENDIF ELSE IF txt_spalte%<wc% txt_spalte%=MIN(wc%,txt_spalte%+1) ELSE scroll_left ENDIF ENDIF RETURN ' ---------------------- PROCEDURE pos_cursor(x%) ! Cursor auf bestimmte Position setzen .| Glob. Var.: z%,wzb%,yt%,wz%,xt%,beg_ascii%,hex! .| Ruft auf : set_tz .| Aufruf in : to_blk_anf-1,to_blk_end-1,address-2,search_found-1, z%=INT(x%/wzb%)*wzb% SUB x%,z% yt%=x%/16 WHILE yt%>=wz% ADD z%,16 DEC yt% WEND xt%=x%-yt%*16+beg_ascii% IF hex!=TRUE xt%=(x%-yt%*16)*3 ENDIF set_tz RETURN PROCEDURE set_tz .| Glob. Var.: hex!,tz%,xt%,yt%,beg_ascii% .| Aufruf in : dir_secsearch-1,cursor-1,pos_cursor-1,maus_pos-1,lend-1,up-1 .| up_1-1,address-1,set_cursor_in_fat-1, IF hex!=TRUE tz%=xt%/3+yt%*16 ELSE tz%=xt%-beg_ascii%+yt%*16 ENDIF RETURN PROCEDURE dec_hex ! Dezimal-Hex Umschalten .| Glob. Var.: dec%,wind% .| Ruft auf : do_cursor_anz,info_line,maus_off .| Aufruf in : stat_line-1, dec%=1-dec% do_cursor_anz(wind%) info_line maus_off RETURN PROCEDURE maus_pos(mx%,my%) .| Glob. Var.: wind%,xt%,tx%,z.breite%,beg_ascii%,yt%,z.hoehe%,wz%,hex! .| txt_spalte%,txt_zeile%,last% .| Felder : ty%(),wi%(),tx%() .| Ruft auf : cursor,set_tz,dum,last_3,last_4,last_5,last_7,last_8,last_9 .| last_10,last_11,last_12 .| Aufruf in : set_block-2,txt_block-2,message_auswerten-2,wind_dklick-1, IF wind%=0 xt%=(mx%-tx%-9*z.breite%)/z.breite% IF xt%>beg_ascii%+15 xt%=beg_ascii%+15 ENDIF yt%=(my%-ty%(wind%)+z.hoehe%-1)/z.hoehe% ' IF xt%>46 AND xt%<beg_ascii% xt%=46 ENDIF yt%=MIN(wz%-1,MAX(0,yt%)) xt%=MIN(beg_ascii%+16,MAX(0,xt%)) IF xt%>=0 AND xt%<47 hex!=TRUE IF FRAC((xt%+1)/3)=0 xt%=MAX(0,xt%-1) ENDIF ELSE hex!=FALSE ENDIF IF FRAC((xt%+1)/3)=0 AND hex!=TRUE cursor(77,0) ENDIF set_tz ELSE IF mx%>wi%(1,1) AND mx%<wi%(1,1)+wi%(1,3) AND my%>wi%(1,2) AND my%<wi%(1,2)+wi%(1,4) txt_spalte%=MAX(1,(mx%-tx%(1))/z.breite%+1) txt_zeile%=MIN(wz%-1,((my%+z.hoehe%-ty%(1)) DIV z.hoehe%)) IF last%>0 ON last% GOSUB dum,dum,last_3,last_4,last_5,dum,last_7,last_8,last_9,last_10,last_11,last_12 ENDIF ENDIF ENDIF RETURN PROCEDURE maus_off .| Ruft auf : mousek .| Aufruf in : dum-1,dec_hex-1,exit-1, WHILE @mousek WEND RETURN ' ---------------------- PROCEDURE edit_buf(hi%,low%) .| Glob. Var.: wind%,ch%,hex!,dt%,buf%,tz%,z%,dtl%,dth%,xt% .| Ruft auf : edit_ex,edit_ascii .| Aufruf in : taste-2,control-1,alt-1, LOCAL a%,b% ' a%=low% IF wind%=0 INC ch% IF hex!=FALSE ! Edit in ASCII-Teil dt%=a% edit_ex ELSE IF (a%>96 AND a%<103) OR (a%>64 AND a%<71) OR (a%>47 AND a%<58) IF a%>&H60 SUB a%,32 ENDIF a%=a%-48+7*(a%>&H40) b%=buf%+tz%+z% ! Alter Wert dtl%=BYTE{b%} AND 15 ! in Lownibble und dth%=BYTE{b%} AND 240 ! Hinibble zerlegen IF FRAC((xt%+3)/3)=0 dt%=dtl%+a%*16 ! Cursor ist auf Hi-Nibble ELSE dt%=dth%+a% ! ist auf Low - " ENDIF edit_ex ENDIF ENDIF ELSE edit_ascii(a%) ENDIF RETURN PROCEDURE edit_ascii(taste%) .| Glob. Var.: sperr_txt%,last%,ch2%,top%,txt_zeile%,l_eline%,undo_line$ .| out%,txt_spalte%,txt_links%,wc%,l_end%,wz% .| Felder : out$(),whdl&() .| Ruft auf : ctrl_h,out,last_char,do_list,new_line,set_slide,scroll_left .| text_line,do_cursor_anz,blit_cursor .| Aufruf in : edit_buf-1, LOCAL a%,ls%,i%,x%,y%,a$,b$ ' IF sperr_txt%=0 AND last%=0 INC ch2% ! Textfenster was geändert ctrl_h CLR last% ' x%=top%+txt_zeile% ! Zeile IF l_eline%<>x% undo_line$=out$(x%) l_eline%=x% ENDIF IF x%>out% FOR i%=out% TO x%+1 out("") NEXT i% ENDIF ' y%=txt_spalte%+txt_links% ! Spalte a$=out$(x%) ! akt. String ' IF LEN(a$)<y% a$=LEFT$(a$+STRING$(wc%,32),wc%) ENDIF ' SELECT taste% ' CASE 8 ! BACKSPACE ' IF x%>0 IF y%>1 IF out$(x%)=" " txt_spalte%=1 ELSE a$=LEFT$(a$,y%-2)+RIGHT$(a$,LEN(a$)-y%+1) txt_spalte%=MAX(y%-1,1) out$(x%)=a$ ENDIF ELSE IF x%>1 DELETE out$(x%) DEC x% b$=out$(x%) ls%=@last_char(b$) out$(x%)=LEFT$(b$,ls%)+a$ do_list txt_spalte%=ls% txt_zeile%=MAX(0,txt_zeile%-1) ENDIF ENDIF ENDIF ' CASE 13 ! RETURN INSERT out$(x%+1)=RIGHT$(a$,LEN(a$)-y%+1) out$(x%)=LEFT$(a$,y%-1) IF x%<out% INC out% INC l_end% ELSE out%=x% l_end%=x% ENDIF IF top%+wz%+1>out%-1 top%=out%-wz% ENDIF new_line set_slide(whdl&(1)) do_list txt_spalte%=1 ' CASE 31 ! CTRL-DEL undo_line$=CHR$(3)+out$(x%) DELETE out$(x%) DEC out% DEC l_end% IF top%+wz%>out% top%=out%-wz% ENDIF set_slide(whdl&(1)) do_list ' CASE 127 ! DEL a$=LEFT$(a$,y%-1)+RIGHT$(a$,LEN(a$)-y%) out$(x%)=a$ ' DEFAULT ! EDIT normal einfügen a$=LEFT$(a$,y%-1)+CHR$(taste%)+RIGHT$(a$,MAX(1,LEN(a$)-y%+1)) out$(x%)=a$ IF txt_spalte%>=wc% scroll_left ELSE INC txt_spalte% ENDIF ENDSELECT ' IF wz%>1 text_line(x%+1) ENDIF IF txt_spalte%>wc% new_line ENDIF do_cursor_anz(1) blit_cursor ELSE IF last% CLR last% do_cursor_anz(1) ENDIF ENDIF RETURN PROCEDURE edit_ex .| Glob. Var.: buf%,tz%,z%,dt%,hex!,yt%,xt%,beg_ascii% .| Ruft auf : coff,byte,cursor .| Aufruf in : edit_buf-2, BYTE{buf%+tz%+z%}=dt% ! in Puffer schreiben coff IF hex!=TRUE byte(yt%,xt%/3) ELSE byte(yt%,xt%-beg_ascii%) ENDIF cursor(77,0) RETURN PROCEDURE new_line .| Glob. Var.: txt_zeile%,wz%,txt_spalte% .| Ruft auf : scrollup .| Aufruf in : edit_ascii-2, IF txt_zeile%<wz%-1 txt_spalte%=1 INC txt_zeile% ELSE scrollup(1) ENDIF RETURN ' ----------------- Proceduren für Bildschirm ------------------ PROCEDURE scrollup(nr%) ! eine Zeile nach oben .| Glob. Var.: top%,out%,wz%,wind_top%,wind%,z%,l_end%,wzb%,mode%,f.ile%,fp% .| fl%,yt% .| Felder : whdl&() .| Ruft auf : wind_aktpar,coff,get_up,text_line,redraw,zeile,next,set_slide .| Aufruf in : set_block-1,txt_block-1,wind_slide-2,c_down-2,c_right-1 .| new_line-1, wind_aktpar(nr%) IF nr%=1 IF top%<out%-wz% INC top% coff IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind% get_up text_line(top%+wz%) ELSE redraw(nr%) ENDIF ENDIF ELSE IF z%<l_end%-wzb% ADD z%,16 coff IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind% get_up zeile(wz%-1) ELSE redraw(nr%) ENDIF ELSE IF mode%=f.ile% IF fp%+wzb%+z%<=fl% next(nr%) CLR yt% ENDIF ELSE next(nr%) CLR yt% ENDIF ENDIF ENDIF set_slide(nr%) RETURN PROCEDURE scrolldown(nr%) .| Glob. Var.: top%,wind_top%,wind%,z% .| Felder : whdl&() .| Ruft auf : wind_aktpar,coff,get_down,text_line,redraw,zeile,prev .| set_slide .| Aufruf in : set_block-1,txt_block-1,wind_slide-2,c_up-2, wind_aktpar(nr%) IF nr%=1 IF top%>1 coff DEC top% IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind% get_down text_line(top%+1) ELSE redraw(nr%) ENDIF ENDIF ELSE IF z%>=16 SUB z%,16 coff IF (wind_top%=whdl&(0) OR wind_top%=whdl&(1)) AND nr%=wind% get_down zeile(0) ELSE redraw(nr%) ENDIF ELSE prev(nr%) ENDIF ENDIF set_slide(nr%) RETURN PROCEDURE get_up ! Windowinhalt eine Zeile nach oben .| Glob. Var.: nr%,wz%,z.hoehe% .| Felder : par%(),tx%(),ty%(),wi%(),scr%() .| Aufruf in : scrollup-2, par%(0)=tx%(nr%) par%(1)=ty%(nr%)+1 par%(2)=wi%(nr%,3)+wi%(nr%,1) par%(3)=ty%(nr%)+(wz%-1)*z.hoehe% ' par%(4)=par%(0) par%(5)=par%(1)-z.hoehe% par%(6)=par%(2) par%(7)=par%(3)-z.hoehe% par%(8)=3 ' CLIP OFF ~WIND_UPDATE(1) ~GRAF_MOUSE(256,0) BITBLT scr%(),scr%(),par%() ~GRAF_MOUSE(257,0) ~WIND_UPDATE(0) RETURN PROCEDURE get_down ! Windowinhalt eine Zeile nach unten .| Glob. Var.: nr%,z.hoehe%,wz% .| Felder : par%(),tx%(),ty%(),wi%(),scr%() .| Aufruf in : scrolldown-2, par%(0)=tx%(nr%) par%(1)=ty%(nr%)-z.hoehe%+1 par%(2)=wi%(nr%,1)+wi%(nr%,3) par%(3)=ty%(nr%)+(wz%-2)*z.hoehe% ' par%(4)=par%(0) par%(5)=par%(1)+z.hoehe% par%(6)=par%(2) par%(7)=par%(3)+z.hoehe% ' par%(8)=3 CLIP OFF ~WIND_UPDATE(1) ~GRAF_MOUSE(256,0) BITBLT scr%(),scr%(),par%() ~GRAF_MOUSE(257,0) ~WIND_UPDATE(0) RETURN ' ---------------------- PROCEDURE top(nr%) .| Glob. Var.: z%,xt%,yt%,tz%,hex!,file_open%,fp%,top%,wind% .| Felder : whdl&() .| Ruft auf : change,lesen,set_slide,do_list .| Aufruf in : cursor-1, IF nr%=0 CLR z%,xt%,yt%,tz% IF hex!=FALSE xt%=51 ENDIF IF file_open%=1 change CLR fp% lesen ENDIF ELSE top%=1 ENDIF set_slide(whdl&(wind%)) do_list RETURN PROCEDURE lend(nr%) .| Glob. Var.: file_open%,fp%,fl%,l_end%,z%,wzb%,xt%,hex!,beg_ascii%,yt%,wz% .| top%,out%,wind% .| Felder : whdl&() .| Ruft auf : change,lesen,set_tz,set_slide,do_list .| Aufruf in : fdc_diskanal-1,ram_check-2,file_verify-1,pfad_compare-3 .| taste-1,alt_t-1, IF nr%=0 IF file_open%=1 change fp%=MAX(0,fl%-l_end%) lesen ENDIF z%=l_end%-wzb% xt%=45 IF hex!=FALSE xt%=beg_ascii%+15 ENDIF yt%=wz%-1 set_tz ELSE top%=MAX(0,out%-wz%) ENDIF set_slide(whdl&(wind%)) do_list RETURN PROCEDURE down(nr%) .| Glob. Var.: top%,out%,wz%,z%,l_end%,wzb%,mode%,d.isk%,lgs%,spd%,f.ile% .| file_open%,fp%,fl%,h.ard%,block%,hi_size%,r.am%,ram_addr%,f.dc% .| track% .| Felder : wz%(),whdl&() .| Ruft auf : change,1_down,lesen,redraw,set_slide .| Aufruf in : taste-1,next-1, LOCAL a% ' IF nr%=1 top%=MIN(MAX(0,out%-wz%),top%+wz%) ELSE ' CLR a% IF z%=l_end%-wzb% ! schon genau auf Grenze? a%=1 ELSE IF z%+wzb%>l_end%-wzb% ! ist noch Platz zum runter? z%=l_end%-wzb%*2 ! genau auf Grenze ausrichten! ENDIF ENDIF ' IF a%=0 ADD z%,wzb% ELSE change ' SELECT mode% CASE d.isk% lgs%=MIN(spd%-1,lgs%+1) 1_down CASE f.ile% IF file_open%=1 IF fp%+l_end%<fl% ADD fp%,l_end% 1_down ELSE z%=l_end%-wz%(0)*16 ENDIF ENDIF CASE h.ard% block%=MAX(0,MIN(hi_size%-1,block%+1)) 1_down CASE r.am% ADD ram_addr%,l_end% 1_down CASE f.dc% CLR z% INC track% lesen ENDSELECT ENDIF ENDIF redraw(nr%) set_slide(whdl&(nr%)) RETURN PROCEDURE 1_down .| Glob. Var.: z% .| Ruft auf : lesen .| Aufruf in : down-4, CLR z% lesen RETURN PROCEDURE up(nr%) .| Glob. Var.: top%,wz%,z%,wzb%,mode%,d.isk%,f.ile%,fp%,h.ard%,r.am%,f.dc% .| bytes%,yt% .| Felder : whdl&() .| Ruft auf : change,up_1,dec,set_tz,lesen,redraw,set_slide .| Aufruf in : taste-1,prev-1,c_left-1, LOCAL a% ' CLR a% IF nr%=1 top%=MAX(1,top%-wz%) ELSE ' IF z%=0 a%=1 ELSE IF z%>=wzb% SUB z%,wzb% ELSE z%=0 ENDIF ENDIF ' IF a%>0 change SELECT mode% CASE d.isk% up_1 CASE f.ile% IF fp%<>0 up_1 ENDIF CASE h.ard% up_1 CASE r.am% up_1 CASE f.dc% z%=bytes%-wzb% dec yt%=wz%-1 set_tz lesen ENDSELECT ENDIF ENDIF redraw(nr%) set_slide(whdl&(nr%)) RETURN PROCEDURE up_1 .| Glob. Var.: z%,l_end%,wzb%,yt%,wz% .| Ruft auf : dec,set_tz,lesen .| Aufruf in : up-4, z%=l_end%-wzb% dec yt%=wz%-1 set_tz lesen RETURN PROCEDURE dec .| Glob. Var.: mode%,d.isk%,lgs%,f.ile%,fp%,l_end%,h.ard%,block%,r.am% .| ram_addr%,f.dc%,track% .| Aufruf in : dir_secsearch-1,up-1,up_1-1, SELECT mode% CASE d.isk% lgs%=MAX(lgs%-1,0) CASE f.ile% fp%=MAX(0,fp%-l_end%) CASE h.ard% block%=MAX(0,block%-1) CASE r.am% ram_addr%=MAX(ram_addr%-l_end%,0) CASE f.dc% track%=MAX(0,track%-1) ENDSELECT RETURN PROCEDURE nxt_blk .| Glob. Var.: mode%,d.isk%,lgs%,no_nxt%,spd%,f.ile%,file_open%,fp%,l_end% .| fl%,h.ard%,block%,hi_size%,r.am%,ram_addr%,ram_max% .| Ruft auf : test_max,lesen .| Aufruf in : file_dump-1,search-2,search_found-1, SELECT mode% CASE d.isk% INC lgs% no_nxt%=@test_max(lgs%,spd%-1) CASE f.ile% IF file_open%=1 ADD fp%,l_end% IF fp%>=fl% SUB fp%,l_end% no_nxt%=1 ELSE CLR no_nxt% lesen ENDIF ENDIF CASE h.ard% INC block% no_nxt%=@test_max(block%,hi_size%+1) CASE r.am% ADD ram_addr%,l_end% no_nxt%=@test_max(ram_addr%,ram_max%) ENDSELECT RETURN FUNCTION test_max(a%,b%) .| Ruft auf : lesen .| Aufruf in : nxt_blk-3, IF a%>b% RETURN 1 ELSE lesen RETURN 0 ENDIF ENDFUNC PROCEDURE address .| Glob. Var.: wind%,la%,el%,file_open%,fp%,mode%,r.am%,ram_addr%,wzb%,z% .| Ruft auf : eingabe,change,pos_cursor,set_tz,lesen,do_list .| nur_daten_fenster .| Aufruf in : message_auswerten-1,menu_mess-1, IF wind%=0 la%=@eingabe("List-Adresse :",la%) IF el%>0 change IF file_open%=1 fp%=la% ELSE IF mode%=r.am% ram_addr%=la% ELSE IF la%<=wzb% z%=la% ELSE pos_cursor(la%) ENDIF ENDIF ENDIF pos_cursor(0) set_tz lesen do_list ENDIF ELSE nur_daten_fenster ENDIF RETURN ' ---------------------- PROCEDURE get_info(nr%) .| Glob. Var.: info_line$ .| Felder : out$() .| Ruft auf : info .| Aufruf in : redraw_list-1,info_line-1,stat_line-1, IF nr%=1 info_line$=out$(0) ELSE info ENDIF RETURN PROCEDURE info ! INFO-Zeile erstellen je nach MODUS .| Glob. Var.: info_line$,wc%,mode%,d.isk%,lgs%,drive%,track%,spt%,sektor% .| sid%,seite%,cluster%,anf_dat%,spc%,n$,status%,disk_defekt%,f.ile%,fl% .| fi_o$,h.ard%,block%,target%,geraet%,h_fehler%,r.am%,ram_addr%,f.dc% .| sector%,fdrive%,trk_len% .| Felder : scsi_err$() .| Ruft auf : dec_hex_val$,getistr$ .| Aufruf in : akt_find-1,fdc_diskanal-1,lesen-1,sav_buf-1,sav_block-1 .| print_buf-1,print_blk-1,get_info-1, LOCAL a%,a$,b$,trk# ' info_line$=SPACE$(MAX(1,wc%+1)) SELECT mode% CASE d.isk% a%=lgs% ! logischen Sektor für Anzeige umrechnen IF drive%<2 track%=a%/spt% ! in Track und Sektor sektor%=(a% MOD spt%)+1 IF sid%=2 trk#=track%/2 IF trk#=INT(trk#) CLR seite% ELSE seite%=1 ENDIF track%=trk# ELSE CLR seite% ENDIF ENDIF cluster%=INT((lgs%-anf_dat%)/spc%)+2 MID$(info_line$,1)="LGS:"+@dec_hex_val$(lgs%,6)+" " IF cluster%<2 ! Systembereich CLR cluster% IF lgs%>=anf_dir% MID$(info_line$,12)="Clu:_ROOT" ELSE IF lgs%>=anf_fat2% AND (bflag% AND 2)<>0 MID$(info_line$,12)="Clu:_FAT " ELSE IF lgs%>=anf_fat2% MID$(info_line$,12)="Clu:_FAT2" ELSE IF lgs%>=anf_fat1% MID$(info_line$,12)="Clu:_FAT1" ELSE MID$(info_line$,12)="Clu:_BOOT" ENDIF ELSE ! Datenbereich MID$(info_line$,12)="Clu:"+@dec_hex_val$(cluster%,5) ENDIF IF drive%<2 MID$(info_line$,22)="Track:"+@dec_hex_val$(track%,3) MID$(info_line$,32)="Sektor:"+@dec_hex_val$(sektor%,2) MID$(info_line$,42)="Side:"+RIGHT$(n$+STR$(seite%),2) ELSE MID$(info_line$,22)="Track: Sektor: Side:" ENDIF MID$(info_line$,50)="Drive:"+CHR$(drive%+65) MID$(info_line$,58)="Status:" IF status%>=0 MID$(info_line$,65)=@dec_hex_val$(status%,3) ELSE MID$(info_line$,65)=LEFT$(STR$(status%)+" ",3) ENDIF IF disk_defekt%=0 MID$(info_line$,68)=" " ELSE MID$(info_line$,68)=" XBIOS " ENDIF CASE f.ile% MID$(info_line$,1)=@dec_hex_val$(fl%,8) a%=MAX(0,wc%-11) IF fi_o$="" MID$(info_line$,10)=STRING$(MAX(0,a%),".") ELSE MID$(info_line$,10)=RIGHT$(fi_o$,a%) ENDIF CASE h.ard% MID$(info_line$,1)="Block:"+@dec_hex_val$(block%,8) MID$(info_line$,17)="Target:"+@dec_hex_val$(target%,2) MID$(info_line$,28)="Gerät:"+STR$(geraet%) IF h_fehler%>=0 a$=@dec_hex_val$(h_fehler%,3) ELSE a$=LEFT$(STR$(h_fehler%)+" ",3) ENDIF IF h_fehler%>=0 b$=LEFT$(@getistr$(h_fehler%,0),30) ELSE b$=LEFT$(scsi_err$(ABS(h_fehler%)),30) ENDIF MID$(info_line$,37)="Error:"+a$ MID$(info_line$,48)=b$ CASE r.am% MID$(info_line$,1)="Adresse:"+@dec_hex_val$(ram_addr%,7) CASE f.dc% MID$(info_line$,1)="Track:"+@dec_hex_val$(track%,3) MID$(info_line$,12)="Sektor:"+@dec_hex_val$(sector%,2) MID$(info_line$,23)="Side:"+STR$(seite%) MID$(info_line$,31)="Drive:"+CHR$(fdrive%+65) MID$(info_line$,40)="Bytes:"+@dec_hex_val$(trk_len%,5) ENDSELECT RETURN ' ---------------------- PROCEDURE pexec ! Programm starten .| Glob. Var.: f_pexec%,rom_version% .| Ruft auf : file_is_open,alrt,fsel$,do_pexec .| Aufruf in : hard_install-1,menu_mess-1, LOCAL wwa%,a$,fi$ ' a$=STR$(MALLOC(-1) DIV 1024)+" KB frei" f_pexec%=-1 wwa%=1 file_is_open IF rom_version%<&H104 wwa%=@alrt(2,"Programm ausführen?|"+a$,1,"Ok|Abbruch") ENDIF IF wwa%=1 fi$=@fsel$("*.*","","PRG ausführen ("+a$+")",25) do_pexec(fi$) ENDIF RETURN PROCEDURE do_pexec(fi$) .| Glob. Var.: f_pexec%,a%,scr_handle%,scr_width%,scr_height%,z.b%,z.h%,dx% .| dy%,dw%,rom_version%,dh% .| Ruft auf : eintext,set_pfad,get_pfad,desktop_weg,v_enter_cur,v_exit_cur .| vs_clip,v_gtext,v_line,mtasse,alrt,wind_new,desktop_back .| Aufruf in : hard_install-1,pexec-1, LOCAL a$,b$,i%,env%,wwa%,erg2%,tpin$,ttp$,env$ ' IF EXIST(fi$)=TRUE f_pexec%=-1 a$=CHR$(0) a%=RINSTR(fi$,"\") b$=RIGHT$(fi$,LEN(fi$)-a%) erg2%=1 IF RIGHT$(fi$,3)="TTP" eintext("Parameter: "+b$+":",tpin$) erg2%=LEN(a$) tpin$=a$ ttp$=CHR$(LEN(a$)+1)+a$+CHR$(0) ELSE ttp$=CHR$(0)+CHR$(0) ENDIF IF erg2%>0 env%=LPEEK(BASEPAGE+&H2C) WHILE BYTE{env%} OR BYTE{env%+1} OR BYTE{env%+2} env$=env$+CHR$(BYTE{env%}) INC env% WEND env$=env$+CHR$(0)+CHR$(0)+CHR$(0) set_pfad(fi$) get_pfad desktop_weg ' b$=RIGHT$(fi$,3) IF b$="TTP" OR b$="TOS" v_enter_cur(scr_handle%) ELSE ' v_exit_cur(scr_handle%) ~FORM_DIAL(3,0,0,scr_width%,scr_height%,0,0,scr_width%,scr_height%) ~EVNT_TIMER(100) vs_clip(scr_handle%,0,0,0,0,0) CLIP OFF v_gtext((scr_width%-LEN(fi$)*z.b%)/2,z.h%,fi$) v_line(scr_handle%,dx%,dy%-1,dw%-1,dy%-1) mtasse ~SHEL_WRITE(1,1,1,ttp$,fi$) ENDIF ' a%=GEMDOS(75,0,L:V:fi$,L:V:ttp$,L:V:env$)<>0 IF a%<>0 ~@alrt(3,"PEXEC-Fehler "+STR$(a%)+"|oder|Programm meldet "+STR$(a% AND &HFFFF),1," &%$▌ ") ELSE CLR f_pexec% IF b$="TTP" PRINT " Taste drücken ... " ~INP(2) ENDIF ENDIF ' IF b$="TTP" OR b$="TOS" v_exit_cur(scr_handle%) ELSE ~SHEL_WRITE(1,1,1,"","EXIT.PRG") IF CARD{LONG{GB+4}}>=&H140 wind_new ENDIF ENDIF ~FORM_DIAL(3,0,0,0,0,dx%,dy%,dw%,dh%) desktop_back ENDIF ENDIF RETURN PROCEDURE start_shell ! Shell aufrufen .| Glob. Var.: scr_handle%,pfad$,shell_p%,dx%,dy%,dw%,dh% .| Ruft auf : file_is_open,desktop_weg,v_enter_cur,get_pfad,v_exit_cur .| desktop_back .| Aufruf in : menu_mess-1, LOCAL a%,a$,ret&,com$,drive% file_is_open desktop_weg v_enter_cur(scr_handle%) DO drive%=GEMDOS(25) AND 255 ! Aktuelles Laufwerk get_pfad PRINT pfad$;" # "; a$="" DO a%=BIOS(2,2) AND 255 EXIT IF a%=13 OR a%=10 OR a%=4 OR a%=26 ! CR, LF, ^D, ^Z IF a%<32 IF a%=8 IF a$<>"" a$=LEFT$(a$,LEN(a$)-1) PRINT CHR$(8);" ";CHR$(8); ENDIF ELSE PRINT CHR$(7); ENDIF ELSE IF LEN(a$)<80 a$=a$+CHR$(a%) PRINT CHR$(a%); ELSE PRINT CHR$(7); ENDIF ENDIF LOOP PRINT EXIT IF a$="" OR UPPER$(a$)="EXIT" com$=a$+CHR$(0) ret&=(C:shell_p%(L:VARPTR(com$))) AND &HFF VOID XBIOS(21,2) VOID XBIOS(21,1) IF ret&>0 IF ret&>&H7F ret&=ret&-256 ENDIF OPEN "O",#1,"vid:" PRINT #1,a$; CLOSE #1 PRINT ": Fehler "+STR$(ret&) ENDIF LOOP v_exit_cur(scr_handle%) ~FORM_DIAL(3,0,0,0,0,dx%,dy%,dw%,dh%) desktop_back RETURN PROCEDURE about_me .| Glob. Var.: ver$ .| Ruft auf : alrt,opt_help .| Aufruf in : menu_mess-1, LOCAL wwa% wwa%=@alrt(4,ver$+"|Modifiziert 1995-04-04 von Rainer Seitel @ KA|Der etwas andere Diskmonitor |aus dem SCHEIBENKLEISTER",4,"Kleister|SED|Hilfe|Danke") SELECT wwa% CASE 1 ~@alrt(1,"Das Buch zum Thema 'Massenspeicher am ST'| - unbedingt lesen - ",1," Aha ") CASE 2 ~@alrt(1,ver$+" ist nicht PD-Software!! ",1," Aha ") CASE 3 opt_help ENDSELECT RETURN PROCEDURE exit ! Programm verlassen? .| Glob. Var.: wind% .| Ruft auf : change,alrt,file_is_open,do_exit,do_cursor_anz,maus_off .| Aufruf in : menu_mess-1, change IF @alrt(2,"Ist für heute wirklich Schlu₧?",1," Schlu₧ |Nie")=1 file_is_open do_exit ENDIF do_cursor_anz(wind%) maus_off RETURN PROCEDURE do_exit .| Glob. Var.: buf%,fatbuf%,help_mem%,prg_adr%,neuefonts%,menu_pointer% .| repflag%,sed_pfad$,scr_handle% .| Felder : mem%(),whdl&() .| Ruft auf : chk_fdc,set_pfad,v_clsvwk .| Aufruf in : rsc_init-1,little_event_multi-1,wind_open-1,exit-1 .| bios_block-2,fehler_behandlung-1, chk_fdc ~MFREE(buf%) ~MFREE(fatbuf%) IF mem%(0)>0 ~MFREE(mem%(0)) ENDIF IF help_mem%>0 ~MFREE(help_mem%) ENDIF IF prg_adr%>0 ~MFREE(prg_adr%) ENDIF IF neuefonts%>0 ~VST_UNLOAD_FONTS(0) ENDIF ' ~WIND_CLOSE(whdl&(0)) ~WIND_CLOSE(whdl&(1)) ~WIND_DELETE(whdl&(0)) ~WIND_DELETE(whdl&(1)) ~MENU_BAR(menu_pointer%,0) ~RSRC_FREE() SPOKE &H484,repflag% set_pfad(sed_pfad$) ! Alten Pfad wieder einstellen IF scr_handle%>0 v_clsvwk(scr_handle%) ENDIF IF BYTE{BASEPAGE+256}=96 RESERVE EDIT ELSE END ENDIF RETURN PROCEDURE look_ex .| Glob. Var.: device%,erg%,f.eed%,hdl%,f.eedcode% .| Ruft auf : fwrite,fclose,do_list .| Aufruf in : hard_mode_sense-1,out_do-1,disc_save-1,file_dump-1,sav_buf-1 .| sav_block-1,print_buf-1,print_blk-1,text_dev-1, IF device%<>99 IF erg%=2 AND f.eed%<>0 fwrite(hdl%,CHR$(f.eedcode%)) ENDIF ~@fclose(hdl%) do_list ENDIF RETURN ' ---------------------- PROCEDURE search ! Suchen & Ersetzen .| Glob. Var.: wind%,z%,tz%,such%,top%,txt_zeile%,txt_spalte%,searchok& .| found!,no_nxt%,search$,search_block%,buf_end%,buf_beg%,search_cont% .| in1$,in2$,i%,buf%,tbuf_end%,tbuf_beg%,tblkaz%,tblkas%,s.earch% .| search1&,search2&,w$,replace$,mendx4&,l_end%,mode%,f.ile%,abb% .| file_open%,f.dc%,b%,out%,d.isk%,lgs%,fp%,h.ard%,block%,r.am% .| ram_addr% .| Felder : out$(),men_ienable%() .| Ruft auf : coff,put_char,box_draw,form_do,clr_state,box_undraw,get_char$ .| wandlung,set_menu,nxt_blk,search_lesen,was_ist,alrt,search_found .| ctrl_h .| Aufruf in : alt_q-1,ctrl_f-1,ctrl_g-1, LOCAL a%,ex_obj&,sz%,a$,b$,c$,bb$,ffb%,sbg% ' coff IF wind%=0 sz%=z%+tz%+2 ELSE such%=top%+txt_zeile%-1 sz%=txt_spalte%+1 ENDIF ex_obj&=searchok& CLR found!,no_nxt%,search$ ' IF wind%=0 search_block%=buf_end%-buf_beg% IF search_block%>=0 AND search_cont%=0 CLR in1$,in2$ FOR i%=0 TO MIN(5,search_block%) in1$=in1$+"$"+HEX$(BYTE{buf%+buf_beg%+i%},2)+"," NEXT i% in1$=LEFT$(in1$,LEN(in1$)-1) ENDIF ELSE search_block%=tbuf_end%-tbuf_beg% IF search_block%>=0 AND search_cont%=0 CLR in2$ in1$=CHR$(34)+MID$(out$(tblkaz%),tblkas%,MIN(10,search_block%))+CHR$(34) ENDIF ENDIF ' IF search_cont%=0 put_char(s.earch%,search1&,in1$) put_char(s.earch%,search2&,in2$) box_draw(s.earch%) ex_obj&=@form_do(s.earch%) AND &HFF clr_state(s.earch%,ex_obj&,1) box_undraw(s.earch%) ENDIF IF ex_obj&=searchok& in1$=@get_char$(s.earch%,search1&) in2$=@get_char$(s.earch%,search2&) wandlung(in1$) search$=w$ wandlung(in2$) replace$=w$ men_ienable%(mendx4&)=1 set_menu ' IF LEN(search$)>0 ' IF wind%=0 sbg%=32767/l_end% ! Anzahl der Blocks IF mode%=f.ile% sbg%=2 ENDIF a%=(ASC(search$)+1) AND &HFF ! Füllmuster nach Suchstring ändern! bb$=STRING$(sbg%*l_end%,a%) ! Puffer zum Suchen mit INSTR BMOVE buf%,V:bb$,l_end% ' IF mode%=f.ile% ffb%=INSTR(sz%,bb$,search$) ! erst im Puffer suchen IF ffb%=0 nxt_blk search_lesen(sbg%-1) ENDIF ELSE ffb%=INSTR(sz%,bb$,search$) IF ffb%=0 nxt_blk search_lesen(sbg%-1) ENDIF ENDIF ENDIF ' DO abb%=@was_ist IF (mode%=f.ile% AND file_open%<>1) ~@alrt(3,"In welcher Datei suchen?",1,"Ach so") abb%=1 ENDIF IF mode%=f.dc% ~@alrt(3,"Das funktioniert noch nicht!",1,"Abbruch") abb%=1 ENDIF EXIT IF abb%>0 ' IF wind%=0 BMOVE buf%,V:bb$,LEN(bb$) ! gelesene Daten in String b%=INSTR(sz%,bb$,search$) ! und dort suchen ELSE INC such% IF such%>=out% no_nxt%=1 ENDIF b%=INSTR(sz%,out$(such%),search$) ! dasselbe wenn Textfenster ENDIF ' IF b%>0 ! was gefunden? found!=TRUE search_found(b%) ELSE sz%=1 ! nichts gefunden ENDIF EXIT IF found!=TRUE OR no_nxt%=1 ' IF wind%=0 SELECT mode% ! nix gefunden - weitersuchen CASE d.isk% ADD lgs%,sbg%-1 CASE f.ile% ADD fp%,(sbg%-1)*l_end% CASE h.ard% ADD block%,sbg%-1 CASE r.am% ADD ram_addr%,(sbg%-1)*l_end% ENDSELECT ENDIF BMOVE buf%+(sbg%-1)*l_end%,buf%,l_end% ! letzten Block nach vorne holen search_lesen(sbg%-1) ! ab 2. Block im String lesen ' LOOP ' IF abb%>0 ctrl_h ENDIF IF no_nxt%=1 AND found!=FALSE AND ex_obj&=searchok& AND search$<>"" ~@alrt(3,"Keine (weitere) |Fundstelle!",1," Ok ") ctrl_h ENDIF ' ENDIF ENDIF CLR bb$ RETURN PROCEDURE search_lesen(a2%) .| Glob. Var.: buf%,l_end%,no_nxt%,mode%,d.isk%,lll%,lgs%,spd%,status% .| drive%,f.ile%,file_open%,fp%,f_hdl%,fl%,bb$,h.ard%,block%,hi_size% .| r.am%,ram_addr%,ram_max%,utis% .| Felder : whdl&() .| Ruft auf : err_inf,fseek,fread2,scsicall,hard_err,set_slide .| Aufruf in : search-3, LOCAL a$,a1% ' a1%=buf%+l_end% ' CLR no_nxt% SELECT mode% CASE d.isk% lll%=lgs% IF lgs%+a2%>spd% a2%=spd%-lgs% no_nxt%=1 ENDIF status%=@rwabs(2,a1%,a2%,lgs%,drive%) err_inf(status%) CASE f.ile% IF file_open%=1 ~@fseek(fp%,f_hdl%,0) IF fp%+a2%*l_end%>=fl% ! über Datei hinaus? a2%=fl%-fp% fread2(f_hdl%,a1%,a2%) a$=STRING$(LEN(bb$)-LEN(a$),0) BMOVE V:a$,a1%+a2%,LEN(a$) CLR a$ no_nxt%=1 ELSE ! normal fread2(f_hdl%,a1%,a2%*l_end%) ENDIF ENDIF CASE h.ard% lll%=block% IF block%+a2%>hi_size%-1 a2%=hi_size%-1-block% no_nxt%=1 ENDIF scsicall(8,block%,a2%,0,a1%,6,4) hard_err CASE r.am% IF ram_addr%+a2%*l_end%>ram_max% a2%=ram_max%-ram_addr%/l_end% no_nxt%=1 ENDIF ~C:utis%(&H600,L:ram_addr%,L:a1%,L:a2%*l_end%-1) ENDSELECT set_slide(whdl&(0)) RETURN PROCEDURE search_found(wo%) ! wenn was gefunden .| Glob. Var.: b%,wind%,ffb%,lll%,l_end%,mode%,d.isk%,lgs%,h.ard%,block% .| r.am%,ram_addr%,buf%,search$,replace$,ch%,tz%,z%,a%,a$,no_nxt%,top% .| such%,txt_zeile%,b$,c$ .| Felder : out$(),whdl&() .| Ruft auf : pos_cursor,set_found_block,set_crcbuf,change,nxt_blk .| set_slide .| Aufruf in : search-1, LOCAL lx% ' CLR lx% b%=wo%-1 IF wind%=0 ! Datenfenster IF ffb%=0 ! wurde gelesen? DEC lll% ! ja, mehrere Blocks gelesen ... WHILE b%>l_end%-1 ! feststellen in welchem Block INC lll% INC lx% SUB b%,l_end% WEND SELECT mode% CASE d.isk% lgs%=lll% ! Sektornummer anpassen CASE h.ard% block%=lll% CASE r.am% ADD ram_addr%,lx%*l_end%-l_end% ENDSELECT ' BMOVE buf%+(lx%*l_end%),buf%,l_end% ! richtigen Block in Puffer ENDIF pos_cursor(b%) set_found_block(b%,LEN(search$)) set_crcbuf ' IF LEN(replace$)>0 INC ch% IF tz%+z%+LEN(replace$)>l_end% a%=l_end%-(tz%+z%) ! Rest des Sektors a$=RIGHT$(replace$,LEN(replace$)-a%) BMOVE V:replace$,buf%+z%+tz%,a% CLR tz%,z% change IF no_nxt%=0 nxt_blk BMOVE V:a$,buf%+z%+tz%,LEN(a$) ENDIF CLR a$ ELSE BMOVE V:replace$,buf%+z%+tz%,LEN(replace$) ENDIF ENDIF ' ELSE ' Textfenster top%=such% CLR txt_zeile% IF LEN(replace$)>0 a$=out$(top%) b$=LEFT$(a$,b%-1)+replace$ c$=RIGHT$(a$,LEN(a$)-(b%+LEN(search$))+1) out$(top%)=b$+c$ INC ch% ENDIF set_found_block(b%,LEN(search$)) ENDIF set_slide(whdl&(wind%)) RETURN PROCEDURE wandlung(in$) .| Glob. Var.: w$,s% .| Ruft auf : alrt .| Aufruf in : fdc_null-1,search-2, LOCAL i%,il%,j%,h$,h% CLR h$,w$ i%=1 il%=LEN(in$) DO EXIT IF i%>il% IF MID$(in$,i%,1)="," OR MID$(in$,i%,1)=" " INC i% ENDIF IF MID$(in$,i%,1)="$" CLR h$ DO INC i% EXIT IF i%>il% OR MID$(in$,i%,1)="," h$=h$+MID$(in$,i%,1) LOOP IF FRAC(LEN(h$)/2)<>0 OR LEN(h$)=0 ~@alrt(3,"Hex-Data falsch! ",1," Ok ") CLR h$ i%=il%+1 ENDIF FOR j%=1 TO LEN(h$) STEP 2 w$=w$+CHR$(VAL("&H"+MID$(h$,j%,2))) NEXT j% ELSE IF MID$(in$,i%,1)>="0" AND MID$(in$,i%,1)<="9" CLR h$ DO EXIT IF i%>il% OR MID$(in$,i%,1)="," h$=h$+MID$(in$,i%,1) INC i% LOOP h%=VAL(h$) IF h%>255 ~@alrt(3,"Dezimale Werte |zwischen 0 und 255!",1," Ok ") h%=h% AND 255 ENDIF w$=w$+CHR$(h%) ELSE IF MID$(in$,i%,1)="%" CLR h$ DO INC i% EXIT IF i%>il% OR MID$(in$,i%,1)="," h$=h$+MID$(in$,i%,1) LOOP INC i% s%=VAL("&X"+h$) IF s%>255 ~@alrt(3,"Binäre Werte max. 8 Bit! ",1," Ok ") s%=s% AND 255 ENDIF w$=w$+CHR$(s%) ELSE IF MID$(in$,i%,1)=CHR$(34) DO INC i% EXIT IF i%>il% OR MID$(in$,i%,1)=CHR$(34) w$=w$+MID$(in$,i%,1) LOOP INC i% ENDIF ENDIF ENDIF INC i% ENDIF LOOP RETURN PROCEDURE set_found_block(wo%,l%) .| Glob. Var.: wind%,utis%,ak%,l_end%,txt_spalte%,tbuf_beg%,top%,tbuf_end% .| Ruft auf : menu_blkhide,set_var_txt,set_stat,do_list .| Aufruf in : search_found-2, IF wind%=0 ~C:utis%(&H300,L:ak%,L:l_end%-1) ! alten Block löschen ~C:utis%(&H301,L:ak%+wo%,L:l%-1) ! neuen Block setzen menu_blkhide(1) ! Menü erlauben ELSE txt_spalte%=wo%+1 tbuf_beg%=top%*255+txt_spalte% tbuf_end%=top%*255+txt_spalte%+l% set_var_txt set_stat do_list ENDIF RETURN ' PROCEDURE einname(txt$,ta$) .| Glob. Var.: e.inname%,txtname&,einerg&,einok&,a$ .| Ruft auf : put_char,box_draw,form_do,box_undraw,clr_state,get_char$ .| einexit .| Aufruf in : last_5-1,datei_suchen-1,dir_fldren-1, LOCAL ex_obj& ' put_char(e.inname%,txtname&,txt$) put_char(e.inname%,einerg&,ta$) box_draw(e.inname%) ex_obj&=@form_do(e.inname%) AND &HFF box_undraw(e.inname%) clr_state(e.inname%,ex_obj&,1) ' IF ex_obj&=einok& a$=@get_char$(e.inname%,einerg&) ELSE CLR a$ ENDIF einexit RETURN PROCEDURE eintext(txt$,ta$) .| Glob. Var.: e.ingabe%,etext&,ergebnis&,eok&,a$ .| Ruft auf : put_char,box_draw,form_do,box_undraw,clr_state,get_char$ .| einexit .| Aufruf in : do_pexec-1,test_suche-1, LOCAL ex_obj& ' put_char(e.ingabe%,etext&,txt$) put_char(e.ingabe%,ergebnis&,ta$) box_draw(e.ingabe%) ex_obj&=@form_do(e.ingabe%) AND 255 box_undraw(e.ingabe%) clr_state(e.ingabe%,ex_obj&,1) ' IF ex_obj&=eok& a$=@get_char$(e.ingabe%,ergebnis&) ELSE CLR a$ ENDIF einexit RETURN PROCEDURE einexit .| Glob. Var.: el%,a$,e.l% .| Aufruf in : einname-1,eintext-1, el%=LEN(a$) CLR e.l% IF el%=0 e.l%=1 ENDIF RETURN ' ---------------------- INFO ------------------------- PROCEDURE infos .| Glob. Var.: i.nfos% .| Ruft auf : box_draw,form_do,box_undraw,clr_state,info_system .| info_kleine_buttons,info_fkey,info_platten .| Aufruf in : menu_mess-1, LOCAL ex_obj& box_draw(i.nfos%) ex_obj&=@form_do(i.nfos%) AND &HFF box_undraw(i.nfos%) clr_state(i.nfos%,ex_obj&,1) ON ex_obj& GOSUB info_system,info_kleine_buttons,info_fkey,info_platten RETURN PROCEDURE info_system .| Glob. Var.: erg%,l$,scr_mem%,bps%,rom_version%,romstart%,scr_width% .| scr_height%,fonts%,neuefonts%,chk_ofls% .| Ruft auf : clr_out,out,out_do .| Aufruf in : infos-1, LOCAL a$ ' erg%=3 clr_out("SYSTEM-INFO") out("") a$=" frei" IF GEMDOS(68,L:-1,0)<>-32 out("Standard-RAM :"+RIGHT$(l$+STR$(GEMDOS(68,L:-1,0)),10)+" Bytes"+a$) out("Alternate-RAM :"+RIGHT$(l$+STR$(GEMDOS(68,L:-1,1)),10)+" Bytes"+a$) ELSE out("System-RAM :"+RIGHT$(l$+STR$(MALLOC(-1)),10)+" Bytes") ENDIF out("internes RAM :"+RIGHT$(l$+STR$(FRE(0)),10)+" Bytes"+a$) out("Dialogpuffer :"+RIGHT$(l$+STR$(scr_mem%),10)+" Bytes") out("Akt. Puffergrö₧e:"+RIGHT$(l$+STR$(bps%),10)+" Bytes") out("") out("ROM-Version : "+HEX$(rom_version%)) out("ROM-Start : $"+HEX$(romstart%)) out("") out("Auflösung : "+STR$(scr_width%)+"*"+STR$(scr_height%)) IF GDOS? out("GDOS-Fonts : "+STR$(fonts%+neuefonts%)) ENDIF out("") IF chk_ofls%>0 out("CHK_OFLS installiert") ENDIF out_do RETURN PROCEDURE info_crc .| Glob. Var.: wind%,buf_end%,buf_beg%,utis%,buf% .| Ruft auf : alrt,nur_daten_fenster .| Aufruf in : menu_mess-1, LOCAL a$,crc%,wwa% ' IF wind%=0 IF buf_end%-buf_beg%>0 wwa%=@alrt(2,"CRC-Startwert ",1,"CDB4|FFFF") crc%=&HCDB4 IF wwa%=2 crc%=&HFFFF ENDIF crc%=C:utis%(&H400,L:buf%+buf_beg%,L:buf_end%-buf_beg%+1,L:crc%) a$=HEX$(crc% AND &HFFFF,4) ~@alrt(1,"CRC-Prüfsumme des|markierten Blocks:|$"+a$,1," OK ") ELSE ~@alrt(3,"Kein Block markiert!",1,"Hmmmm") ENDIF ELSE nur_daten_fenster ENDIF RETURN ' PROCEDURE info_fkey ! Funktionstastenbelegung anzeigen/ändern .| Glob. Var.: erg%,n$ .| Felder : flos$() .| Ruft auf : clr_out,out,out_do,set_last .| Aufruf in : infos-1,last_9-1, LOCAL a%,i%,a$ erg%=3 clr_out("Funktionstastenbelegung:") out("Nr. Länge Inhalt") out("") FOR i%=1 TO 10 a%=VAL(flos$(0,i%))/2 a$="F"+RIGHT$(n$+STR$(i%),2)+" "+RIGHT$(n$+STR$(a%),4) IF a%>0 a$=a$+" "+LEFT$(flos$(1,i%),60) ENDIF out(a$) NEXT i% out_do set_last(9) RETURN PROCEDURE last_9 .| Glob. Var.: top%,txt_zeile%,buf_end%,buf_beg%,wwa% .| Felder : flos$() .| Ruft auf : alrt,put_to_fkey,info_fkey,floskel .| Aufruf in : maus_pos-1, LOCAL a% a%=top%+txt_zeile%-2 IF a%>0 AND a%<11 IF buf_end%>buf_beg% wwa%=1 IF VAL(flos$(0,a%))<>0 wwa%=@alrt(2,"Funktionstaste ist belegt!",1,"Belegen|in Puffer|Abbruch") ENDIF IF wwa%=1 put_to_fkey(a%) info_fkey ELSE floskel(a%+58) ENDIF ENDIF ENDIF RETURN ' PROCEDURE info_kleine_buttons ! Belegung der kleinen Buttons anzeigen/ändern .| Glob. Var.: menu_pointer%,erg%,ml%,menu_adr%,m.enu1%,m.enu2%,m.enu3% .| m.enu4%,m.enu5%,inf_ma$ .| Felder : frei%() .| Ruft auf : clr_out,switch_menu,out,out_do,set_last,set_menu .| Aufruf in : lern_ende-1,infos-1, LOCAL a%,b%,kli%,a$,b$,c$,men% ' men%=menu_pointer% erg%=3 clr_out("Button-Text Menü - Eintrag") ~MENU_TNORMAL(menu_pointer%,7,1) FOR kli%=1 TO 14 ml%=frei%(kli%,0) ' SELECT ml% CASE 1 switch_menu(menu_adr%,m.enu1%) CASE 2 switch_menu(menu_adr%,m.enu2%) CASE 3 switch_menu(menu_adr%,m.enu3%) CASE 4 switch_menu(menu_adr%,m.enu4%) CASE 5 switch_menu(menu_adr%,m.enu5%) ENDSELECT ' a%=frei%(kli%,2) b%=OB_SPEC(menu_pointer%,a%) IF b%>0 a$=CHAR{OB_SPEC(menu_pointer%,a%)} ELSE a$=" " ENDIF a$=RIGHT$(STRING$(15,32)+a$,15) ' a%=frei%(kli%,1) b%=OB_SPEC(menu_pointer%,a%) IF b%>0 b$=CHAR{OB_SPEC(menu_pointer%,a%)} ELSE b$=" " ENDIF b$=LEFT$(b$+STRING$(30,32),30) c$=MID$(inf_ma$,kli%*5-4,5) out(" "+c$+a$+" "+b$) NEXT kli% out_do set_last(8) switch_menu(menu_adr%,men%) set_menu RETURN PROCEDURE last_8 .| Glob. Var.: top%,txt_zeile%,kli% .| Ruft auf : set_kleine_buttons .| Aufruf in : maus_pos-1, LOCAL a% a%=top%+txt_zeile% IF a%>0 AND a%<15 kli%=a% set_kleine_buttons ENDIF RETURN ' PROCEDURE info_platten ! PUNPTR Struktur ausgeben .| Glob. Var.: erg%,punptr% .| Ruft auf : clr_out,out,dec_hex_val$,out_do .| Aufruf in : infos-1, LOCAL a%,i%,x%,y% erg%=3 clr_out("Plattenzuordnung:") punptr%=LPEEK(&H516) IF punptr%>0 a%=CARD{punptr%} out("Vom Treiber erkannte Festplatten: "+STR$(a%)) out("") out("Laufwerk | Target | Startblock ") out("") FOR i%=0 TO 15 x%=BYTE{punptr%+i%+2} y%={punptr%+2+16+(i%*4)} IF x%<>&HFF out(" "+CHR$(i%+65)+SPACE$(11)+STR$(x%)+SPACE$(6)+@dec_hex_val$(y%,8)) ENDIF NEXT i% ENDIF out_do RETURN ' PROCEDURE show_status .| Glob. Var.: erg%,status%,top% .| Ruft auf : clr_out,out,getistr$,out_do .| Aufruf in : stat_line-1, LOCAL i% erg%=3 clr_out("STATUS CODE - Meldungen") FOR i%=0 TO 17 out(RIGHT$(" "+STR$(-i%),3)+" "+@getistr$(i%,1)) NEXT i% IF ABS(status%)<18 AND erg%=3 top%=ABS(status%)+1 ENDIF out_do RETURN PROCEDURE sh_hd_err .| Glob. Var.: erg%,h_fehler%,hh_max%,top%,scsi_errmax% .| Felder : scsi_err$() .| Ruft auf : clr_out,out,dec_hex_val$,getistr$,out_do .| Aufruf in : stat_line-4, LOCAL i& erg%=3 clr_out("Plattenfehler") IF h_fehler%>=0 FOR i&=0 TO hh_max%-1 out(@dec_hex_val$(i&,3)+" "+@getistr$(i&,0)) NEXT i& IF h_fehler%<hh_max% AND h_fehler%>=0 top%=h_fehler%+1 ENDIF ELSE FOR i&=1 TO scsi_errmax%-1 out("-"+STR$(i&)+" "+scsi_err$(i&)) NEXT i& ENDIF out_do RETURN ' ----------------------- OUT/IN ----------------------- PROCEDURE out_logbuch .| Glob. Var.: erg%,logbuch$,fd$,log_dev%,device%,fhandle% .| Ruft auf : dev,fclose .| Aufruf in : log_out-1,einstellungen-1, erg%=1 dev("Logbuch anlegen",44) logbuch$=fd$ log_dev%=device% IF device%<>99 ~@fclose(fhandle%) ENDIF RETURN PROCEDURE in_help .| Glob. Var.: p_help$ .| Ruft auf : fsel$,init_help,set_help .| Aufruf in : opt_help-2, p_help$=@fsel$("*.HLP","","HELP-Datei laden",26) init_help set_help ! HELP-Dialog initialisieren RETURN PROCEDURE log_out .| Glob. Var.: log_dev%,logbuch$,fd$,device%,fhandle%,buf%,bps% .| Ruft auf : alrt,out_logbuch,log_out,mtasse,chk_opn,fwrite2,fclose,mnorm .| Aufruf in : control-1,log_out-1, LOCAL wwa% ' IF log_dev%<>99 IF NOT (EXIST(logbuch$)) wwa%=@alrt(2,"Logbuch ist noch nicht|aktiviert worden.",1,"Nochmal|Abbruch") IF wwa%=1 out_logbuch log_out ENDIF ELSE mtasse chk_opn(fd$) IF device%<>99 fwrite2(fhandle%,buf%,bps%) ~@fclose(fhandle%) ENDIF ENDIF mnorm ENDIF RETURN PROCEDURE floskel(a%) .| Glob. Var.: z%,tz%,buf%,ch% .| Felder : flos$(),whdl&() .| Ruft auf : mtasse,wind_top,do_list .| Aufruf in : cursor-1,last_9-1, LOCAL bc%,fu%,i%,fu$ ' fu$=flos$(1,a%-58) ! Funktionsstring auswählen fu%=VAL(flos$(0,a%-58)) ! Länge bc%=z%+tz% IF fu%>0 mtasse FOR i%=1 TO fu% STEP 2 BYTE{buf%+bc%}=VAL("&h"+MID$(fu$,i%,2)) INC bc% NEXT i% INC ch% ENDIF wind_top(whdl&(0)) do_list RETURN PROCEDURE printer .| Glob. Var.: hdl%,device% .| Ruft auf : alrt,fopen .| Aufruf in : dev-1, LOCAL prt% ' prt%=1 WHILE OUT?(0)=FALSE prt%=@alrt(2,"Drucker nicht bereit!",1,"Nochmal|Abbruch") EXIT IF prt%=2 WEND IF prt%=1 hdl%=@fopen("PRN:",1) ELSE device%=99 ENDIF RETURN ' ---------------------- Device Handling --------------- PROCEDURE dev(kommentar$,par%) .| Glob. Var.: device%,erg%,fd$,hdl%,fhandle% .| Ruft auf : fsel$,alrt,chk_create,chk_opn,printer .| Aufruf in : hard_save-1,ram_save-1,disc_save-1,file_dump-1,datei_cut-2 .| datei_concat-1,sav_buf-2,sav_block-2,print_buf-1,print_blk-1 .| out_logbuch-1,save_block-1,do_save_text-1,fat_test-1, LOCAL a%,fex%,a$,erg2% CLR device% ' SELECT erg% CASE 1 fd$=@fsel$("*.*","",kommentar$,par%) IF LEN(fd$)>0 IF EXIST(fd$)=TRUE ! Datei existiert bereits a%=LEN(fd$) IF a%<22 a$=SPACE$((22-a%)/2)+fd$+SPACE$((22-a%)/2) ELSE a$=RIGHT$(fd$,22) ENDIF erg2%=@alrt(2,a$+"|existiert bereits!",2,"Ersetzen|Anhängen|Abbruch") IF erg2%=1 chk_create(fd$) ! Überschreiben ELSE IF erg2%=2 chk_opn(fd$) ! Anhängen IF device%<>99 hdl%=fhandle% ENDIF ELSE device%=99 ! Abbruch nach EXIST ENDIF ENDIF ' ELSE IF RIGHT$(fd$)<>"\" ! Datei existiert noch nicht chk_create(fd$) ! Normal anlegen ELSE device%=99 ENDIF ENDIF ELSE device%=99 ! kein Name ENDIF CASE 2 @printer CASE 3,4 device%=99 ENDSELECT RETURN PROCEDURE chk_create(chk$) .| Glob. Var.: hdl%,device% .| Ruft auf : fcreate .| Aufruf in : dev-2, hdl%=@fcreate(chk$,0) ! Datei immer mit Fcreate öffnen IF hdl%<0 device%=99 ! Write-Protekt - Abbruch ENDIF RETURN PROCEDURE chk_opn(chk$) .| Glob. Var.: fhandle%,pfad$,dum$,device% .| Ruft auf : fcreate,fclose,fdelete,fopen,fseek .| Aufruf in : log_out-1,dev-1, fhandle%=@fcreate(pfad$+dum$,0) ! Dummy-Datei erzeugen - Schreibschutz? IF fhandle%>0 ~@fclose(fhandle%) ! kein Schreibschutz, Dummy schlie₧en ~@fdelete(pfad$+dum$) ! und Dummy wieder löschen fhandle%=@fopen(chk$,2) ! jetzt Datei öffnen IF fhandle%>=0 ~@fseek(0,fhandle%,2) ! Pointer ans Ende der Datei ELSE device%=99 ENDIF ELSE device%=99 ! Write Protekt ENDIF RETURN ' ---------------------- Option / HELP ----------------- PROCEDURE opt_konfig ! Voreinstellungen .| Glob. Var.: v.oreinst%,feedcode&,f.eedcode%,konfigab&,old_cpos% .| Ruft auf : set_rsc,put_char,box_draw,form_do,box_undraw,clr_state .| check_vor,do_list .| Aufruf in : einstellungen-1, LOCAL ex_obj& set_rsc put_char(v.oreinst%,feedcode&,HEX$(f.eedcode%,2)) box_draw(v.oreinst%) ex_obj&=@form_do(v.oreinst%) AND &HFF box_undraw(v.oreinst%) clr_state(v.oreinst%,ex_obj&,1) IF ex_obj&<>konfigab& check_vor DEC old_cpos% do_list ENDIF RETURN PROCEDURE einstellungen .| Glob. Var.: ein.stell% .| Ruft auf : box_draw,form_do,box_undraw,clr_state,out_logbuch .| set_dma_mask,opt_konfig,setfont,dum,save_einstellungen .| Aufruf in : menu_mess-1, LOCAL ex_obj& box_draw(ein.stell%) ex_obj&=@form_do(ein.stell%) AND &HFF box_undraw(ein.stell%) clr_state(ein.stell%,ex_obj&,1) ON ex_obj& GOSUB out_logbuch,set_dma_mask,opt_konfig,setfont,dum,save_einstellungen RETURN PROCEDURE opt_help ! HELP aufgerufen .| Glob. Var.: help_mem%,h.elp%,hlp_load&,help1&,help15&,helpabb& .| Ruft auf : alrt,in_help,opt_help,box_draw,form_do,box_undraw,clr_state .| clr_flags,set_flags,help .| Aufruf in : haupt_dialog-1,control-1,cursor-1,about_me-1,opt_help-2, LOCAL ex_obj&,i&,wwa% ' IF help_mem%=0 wwa%=@alrt(2,"Keine HELP-Datei geladen",1,"Laden|Abbruch") IF wwa%=1 in_help opt_help ENDIF ELSE box_draw(h.elp%) ex_obj&=@form_do(h.elp%) AND &HFF box_undraw(h.elp%) clr_state(h.elp%,ex_obj&,1) ! selected? ' IF ex_obj&=hlp_load& in_help opt_help ELSE FOR i&=help1& TO help15& clr_flags(h.elp%,i&,2) ! CLR default NEXT i& clr_flags(h.elp%,helpabb&,2) ! Default alt löschen ' set_flags(h.elp%,ex_obj&,2) ! und neu setzen IF ex_obj&<=help15& help(ex_obj&) ENDIF ENDIF ENDIF RETURN PROCEDURE help(was%) ! HELP-Dialog Button ausführen .| Glob. Var.: erg%,hlp_str$,help1&,help_size%,help_mem%,ab% .| Ruft auf : clr_out,out,get_line$,out_do .| Aufruf in : opt_help-1, LOCAL i%,j%,a$,b$,buf$ erg%=3 CLR i% clr_out(hlp_str$) out("") j%=was%-help1&+1 ' buf$=STRING$(help_size%,0) BMOVE help_mem%,V:buf$,LEN(buf$) ab%=1 WHILE ab%<=LEN(buf$) a$=@get_line$(ab%) IF ASC(a$)=45 ! "-xxxx" suchen INC i% ENDIF IF i%=j% ! gesuchten Zeilen gefunden? out(a$) ! ja, ENDIF EXIT IF i%>j% WEND CLR buf$ out_do RETURN PROCEDURE check_vor .| Glob. Var.: f.eed%,v.oreinst%,feed&,s.lider%,slider&,f.eedcode%,feedcode& .| dial.pos%,dial2pos&,s.ammeln%,sammeln&,t.xtsavm%,txtsavm&,sperr_txt% .| sperrtxt&,dechex&,dec%,cursor_rate%,vorcurrt&,tabs%,tabanz&,max.text% .| maxtext& .| Ruft auf : get_char$,get_val,set_vdipar .| Aufruf in : rsc_init-1,opt_konfig-1, f.eed%=(OB_STATE(v.oreinst%,feed&) AND 2) s.lider%=(OB_STATE(v.oreinst%,slider&) AND 2) f.eedcode%=VAL("&H"+@get_char$(v.oreinst%,feedcode&)) dial.pos%=(OB_STATE(v.oreinst%,dial2pos&) AND 2) s.ammeln%=(OB_STATE(v.oreinst%,sammeln&) AND 2) t.xtsavm%=(OB_STATE(v.oreinst%,txtsavm&) AND 2) sperr_txt%=(OB_STATE(v.oreinst%,sperrtxt&) AND 2) ' IF (OB_STATE(v.oreinst%,dechex&) AND 2)>0 dec%=1 ELSE dec%=0 ENDIF cursor_rate%=@get_val(v.oreinst%,vorcurrt&) tabs%=@get_val(v.oreinst%,tabanz&) max.text%=@get_val(v.oreinst%,maxtext&) set_vdipar RETURN PROCEDURE opt_text ! Textfenster ausgeben/löschen .| Glob. Var.: wa$,erg%,wind%,whdl&,wx&,wy&,wb&,wh& .| Felder : whdl&() .| Ruft auf : alrt,do_clr_out,out_do,wind_top,redraw_list .| Aufruf in : menu_mess-1, IF @alrt(2,"Textfenster löschen? ",1,wa$)=1 erg%=3 do_clr_out("") IF wind%=1 out_do ELSE wind_top(whdl&(1)) whdl&=whdl&(1) ~WIND_GET(whdl&,4,wx&,wy&,wb&,wh&) redraw_list(whdl&,wx&,wy&,wb&,wh&,1) ENDIF ENDIF RETURN PROCEDURE opt_ascii ! ASCII-Datei in Window 2 laden .| Glob. Var.: fi$ .| Felder : pfad$() .| Ruft auf : fsel$,do_ascii,ctrl_h .| Aufruf in : stat_line-1,dat_lesen-1, fi$=@fsel$("*.*","","ASCII-Datei laden",29) do_ascii(fi$) ctrl_h pfad$(46)=pfad$(29) ! fürs Speichern des Textes (Hi Claus ...) RETURN PROCEDURE opt_fehler ! Fehlerseite ausgeben oder löschen .| Glob. Var.: fer%,flist% .| Ruft auf : alrt,show_err_inf,err_clr .| Aufruf in : menu_mess-1, IF fer%>0 flist%=@alrt(2,"Fehlerseite ... ",flist%,"Ausgeben|Löschen|Abbruch") ON flist% GOSUB show_err_inf,err_clr ELSE ~@alrt(3,"Kein Fehler, keine Nachrichten.",1,"Gut so") ENDIF RETURN ' PROCEDURE save_text ! Textfenster sichern .| Ruft auf : do_save_text .| Aufruf in : dat_sichern-1,dat_sichern_als-1, do_save_text RETURN PROCEDURE save_block ! Teil des Textfensters sichern .| Glob. Var.: device% .| Ruft auf : dev,text_dev .| Aufruf in : dat_sichern_als-1,print_block-1, dev("Block sichern",45) IF device%<>99 text_dev ENDIF RETURN PROCEDURE print_text ! Textfenster drucken .| Ruft auf : do_save_text .| Aufruf in : dat_drucken-1, do_save_text RETURN PROCEDURE print_block ! Block aus Textfenster drucken .| Ruft auf : save_block .| Aufruf in : dat_drucken-1, @save_block RETURN PROCEDURE do_save_text ! ganzes Textfenster auf Datei/Drucker ausgeben .| Glob. Var.: device%,ch2% .| Ruft auf : dev,out_do .| Aufruf in : save_text-1,print_text-1, dev("Textfenster sichern",46) IF device%<>99 out_do CLR ch2% ENDIF RETURN PROCEDURE text_dev ! Textblock auf Drucker/Datei ausgeben .| Glob. Var.: hdl%,ver$,tblkaz%,tblkez%,tblkas%,tblkes% .| Felder : out$() .| Ruft auf : fwritec,look_ex .| Aufruf in : save_block-1, LOCAL i% ' fwritec(hdl%,ver$+": "+DATE$+" "+TIME$) i%=tblkaz% IF tblkaz%=tblkez% fwritec(hdl%,MID$(out$(i%),tblkas%,tblkes%-tblkas%+1)) ELSE IF LEN(out$(i%)) fwritec(hdl%,RIGHT$(out$(i%),LEN(out$(i%))-tblkas%+1)) ENDIF ENDIF INC i% WHILE i%<tblkez% fwritec(hdl%,out$(i%)) INC i% WEND IF tblkaz%<>tblkez% fwritec(hdl%,LEFT$(out$(i%),tblkes%)) ENDIF look_ex RETURN ' PROCEDURE show_err_inf .| Glob. Var.: erg%,i%,fer%,top%,wz% .| Felder : err_fld$() .| Ruft auf : clr_out,out,out_do .| Aufruf in : hard_statistik-1,opt_fehler-1, erg%=3 clr_out("Fehler und Nachrichten:") FOR i%=1 TO fer% out(err_fld$(i%)) NEXT i% IF erg%=3 top%=MAX(0,fer%-wz%+1) ENDIF out_do RETURN PROCEDURE err_clr .| Glob. Var.: max_err%,fer% .| Aufruf in : opt_fehler-1,err_max-1, ERASE err_fld$() DIM err_fld$(max_err%) CLR fer% RETURN PROCEDURE set_dma_mask .| Glob. Var.: targ.mask%,tmaskok&,acsiall&,acsino&,scsiall&,scsino& .| tghdtyp&,tmask1&,tmask8&,hard%,target% .| Felder : hd_typ%(),hd_typ$(),dma%() .| Ruft auf : box_draw,form_do,set_targ,put_char,objc_update,clr_state .| box_undraw,set_hard .| Aufruf in : einstellungen-1, LOCAL a%,i&,j&,ex_obj& ' box_draw(targ.mask%) DO ex_obj&=@form_do(targ.mask%) AND &HFF EXIT IF ex_obj&=tmaskok& ' SELECT ex_obj& CASE acsiall& set_targ(0,1) CASE acsino& set_targ(0,0) CASE scsiall& set_targ(16,1) CASE scsino& set_targ(16,0) ENDSELECT ' IF ex_obj&>=tghdtyp& AND ex_obj&<=tghdtyp&+7 a%=ex_obj&-tghdtyp& IF hd_typ%(a%)=4 hd_typ%(a%)=1 ELSE INC hd_typ%(a%) ENDIF put_char(targ.mask%,ex_obj&,hd_typ$(hd_typ%(a%))) objc_update(targ.mask%,ex_obj&) ENDIF LOOP clr_state(targ.mask%,ex_obj&,1) box_undraw(targ.mask%) IF ex_obj&=tmaskok& FOR i&=0 TO 15 IF (OB_STATE(targ.mask%,tmask1&+i&) AND 2)>0 dma%(i&)=1 ELSE dma%(i&)=0 ENDIF NEXT i& FOR i&=16 TO 31 IF (OB_STATE(targ.mask%,tmask8&+i&-16) AND 2)>0 dma%(i&)=1 ELSE dma%(i&)=0 ENDIF NEXT i& ENDIF hard%=@set_hard(target%) RETURN PROCEDURE set_targ(witch%,a%) .| Glob. Var.: tmask1&,tmask8&,targ.mask% .| Felder : dma%() .| Ruft auf : cross_rsc,objc_update .| Aufruf in : set_dma_mask-4, LOCAL i&,j& ' FOR i&=witch% TO witch%+15 IF i&<16 j&=tmask1&+i& ELSE j&=tmask8&+i&-16 ENDIF dma%(i&)=a% cross_rsc(targ.mask%,j&,dma%(i&)) objc_update(targ.mask%,j&) NEXT i& RETURN PROCEDURE do_ascii(fi$) .| Glob. Var.: ch2%,fhandle%,erg%,out%,max.text% .| Felder : out$() .| Ruft auf : fopen,fseek,fread2,fclose,clr_out,out,check_tab$,out_do .| Aufruf in : opt_ascii-1, LOCAL a%,b%,c%,i%,in_ascii%,a$,b$,c$ ' IF EXIST(fi$)=TRUE CLR ch2% REPEAT fhandle%=@fopen(fi$,0) ! Datei öffnen EXIT IF fhandle%<6 ! Problem? a%=@fseek(0,fhandle%,2) ! nein, Länge feststellen in_ascii%=MALLOC(a%) ! Speicher holen EXIT IF in_ascii%=0 ! Kein Speicher? ~@fseek(0,fhandle%,0) ! doch, wieder von vorn lesen fread2(fhandle%,in_ascii%,a%) ! komplett einlesen EXIT IF fhandle%<6 ! ~@fclose(fhandle%) ! und Datei schliessen ' b%=in_ascii% ! Pufferanfang c%=b%+a% ! Pufferende clr_out("") erg%=3 ! Ausgabe auf Bildschirm b$=STRING$(512,0) ! Puffer ' WHILE b%<c% ! schon am Ende? BMOVE b%,V:b$,LEN(b$) a%=INSTR(1,b$,CHR$(10)) IF a%<2 a%=MIN(LEN(b$)+2,c%-b%+2) ENDIF a$=STRING$(a%-2,0) BMOVE b%,V:a$,LEN(a$) out(@check_tab$(a$)) EXIT IF out%>=max.text% IF a%=LEN(b$)+2 SUB a%,2 ENDIF ADD b%,a% WEND ~MFREE(in_ascii%) out$(0)=fi$ out_do UNTIL 1 ENDIF RETURN FUNCTION check_tab$(a$) .| Glob. Var.: tabs% .| Aufruf in : alt_t-1,do_ascii-1, LOCAL i% i%=INSTR(a$,CHR$(9)) WHILE i% a$=LEFT$(a$,i%-1)+SPACE$(tabs%)+RIGHT$(a$,LEN(a$)-i%) i%=INSTR(a$,CHR$(9)) WEND RETURN a$ ENDFUNC ' ---------------------- Fehler speichern -------------- PROCEDURE err_inf(fehler%) .| Glob. Var.: fer%,max_err%,lgs%,drive% .| Felder : err_fld$() .| Ruft auf : getistr$,err_max .| Aufruf in : lesen-1,schreiben-3,disc_info-2,boot_sec-2,disc_clear-1 .| disc_check_err-1,last_5-1,dir_fldren-2,search_lesen-1,write_fat-1 .| bios_block-1,o_neu-2, LOCAL a$ IF fehler%<>0 IF fer%<max_err% INC fer% a$=STR$(lgs%) IF ABS(fehler%)>20 fehler%=1 ENDIF err_fld$(fer%)=CHR$(drive%+65)+": LGS "+a$+" "+@getistr$(ABS(fehler%),1) ELSE err_fld$(max_err%)="Fehler-Überlauf" fer%=max_err% err_max ENDIF ENDIF RETURN PROCEDURE err_inf1(fehler%,txt$,txt2$) .| Glob. Var.: wa$,status% .| Ruft auf : err_inf3,alrt .| Aufruf in : dsetdrv-1,dsetpath-1,frename-1,fdatime-1,fattrib-1,fcreate-1 .| fopen-1,fseek-1,fclose-1,fdelete-1,freadf-2,fwritef-1,fwrite2-1, LOCAL erg2% err_inf3(fehler%,txt$,txt2$) erg2%=@alrt(3,txt$+"|"+txt2$+" "+STR$(fehler%),1,wa$) IF fehler%>0 AND erg2%=2 status%=-1 ENDIF RETURN PROCEDURE err_inf3(fehler%,txt$,txt2$) .| Glob. Var.: fer%,max_err%,abb% .| Felder : err_fld$() .| Ruft auf : err_max .| Aufruf in : frename-1,err_inf1-1,fat_test-2,fat_check-3,fat_check_do-1 .| fat_xor-1, IF fer%<max_err% INC fer% err_fld$(fer%)=txt$+" "+txt2$+" "+STR$(fehler%) ELSE err_fld$(max_err%)="Fehler-Überlauf" fer%=max_err% err_max abb%=1 ENDIF RETURN PROCEDURE err_max .| Glob. Var.: fer%,max_err% .| Ruft auf : alrt,err_clr .| Aufruf in : hard_err-1,err_inf-1,err_inf3-1, LOCAL erg2% IF fer%>=max_err%-5 erg2%=@alrt(3,"Fehlerseite ist voll.",1,"Danke|Löschen") IF erg2%=2 err_clr ENDIF ENDIF RETURN ' ---------------------- FAT-Routinen ------------------ PROCEDURE fat_bearbeiten ! FAT-Einträge bearbeiten .| Glob. Var.: cluster%,cpd%,f.at%,fat_nr&,fwrt&,fatabb&,fatplus&,fatmin& .| fatwrite&,wa$,drive%,fatm1&,fatm2&,ed%,fatm3& .| Ruft auf : change,put_char,dec_hex_val$,read_in_fat,box_draw,form_do .| clr_state,objc_update,term$,write_in_fat,alrt,write_fat,bios_block .| box_undraw,set_cursor_in_fat .| Aufruf in : menu_mess-1, LOCAL aa%,ab%,ex_obj&,a$ ' change cluster%=MIN(cluster%,cpd%+1) put_char(f.at%,fat_nr&,@dec_hex_val$(cluster%,6)) aa%=@read_in_fat(cluster%) put_char(f.at%,fwrt&,@dec_hex_val$(aa%,6)) box_draw(f.at%) DO ex_obj&=@form_do(f.at%) ab%=ex_obj& DIV 256 ex_obj&=ex_obj& AND &HFF clr_state(f.at%,ex_obj&,1) objc_update(f.at%,ex_obj&) objc_update(f.at%,fwrt&) EXIT IF ex_obj&=fatabb& SELECT ex_obj& CASE fat_nr& IF ab%>0 a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} cluster%=MIN(cpd%+1,VAL(a$)) aa%=@read_in_fat(cluster%) put_char(f.at%,fat_nr&,@dec_hex_val$(aa%,6)) cluster%=aa% aa%=@read_in_fat(cluster%) ELSE a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} cluster%=MIN(cpd%+1,VAL(a$)) aa%=@read_in_fat(cluster%) ENDIF CASE fatplus& IF ab%>0 cluster%=cpd%+1 ELSE cluster%=MIN(VAL(CHAR{{OB_SPEC(f.at%,fat_nr&)}})+1,cpd%+1) ENDIF aa%=@read_in_fat(cluster%) CASE fatmin& IF ab%>0 cluster%=2 ELSE cluster%=MAX(2,VAL(CHAR{{OB_SPEC(f.at%,fat_nr&)}})-1) ENDIF aa%=@read_in_fat(cluster%) CASE fatwrite& a$=CHAR{{OB_SPEC(f.at%,fwrt&)}} write_in_fat(VAL(a$),cluster%) IF @alrt(2,"FAT zurückschreiben?",0,wa$)=1 write_fat ELSE bios_block(drive%) ENDIF aa%=@read_in_fat(cluster%) CASE fatm1& a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} cluster%=MIN(cpd%+1,VAL(a$)) aa%=0 write_in_fat(aa%,cluster%) CASE fatm2& a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} cluster%=MIN(cpd%+1,VAL(a$)) aa%=ed%-8 write_in_fat(aa%,cluster%) CASE fatm3& a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} cluster%=MIN(cpd%+1,VAL(a$)) aa%=ed% write_in_fat(aa%,cluster%) ENDSELECT put_char(f.at%,fwrt&,@dec_hex_val$(aa%,6)) objc_update(f.at%,fwrt&) put_char(f.at%,fat_nr&,@dec_hex_val$(cluster%,6)) objc_update(f.at%,fat_nr&) LOOP box_undraw(f.at%) bios_block(drive%) a$=CHAR{{OB_SPEC(f.at%,fat_nr&)}} set_cursor_in_fat(MAX(0,VAL(a$))) ' RETURN PROCEDURE fat_cluster ! Cluster von Datei/Ordner anzeigen .| Glob. Var.: drive%,fi$,pfad$,lgs%,anf_fat2%,len_fat%,len_dir%,total%,erg% .| ed%,cpd% .| Felder : file$(),cluster%() .| Ruft auf : change_pfad,fsel$,chk_drv,alrt,find_files,clr_out,read_in_fat .| dec_hex_val$,out,out_do .| Aufruf in : menu_mess-1, LOCAL a$,fac$,cl%,j%,anz% ' change_pfad(30,drive%) fi$=@fsel$("*.*","","Datei auswählen",30) IF LEN(fi$)>0 ~@chk_drv(fi$) ' IF RIGHT$(fi$)="\" fac$=LEFT$(fi$,LEN(fi$)-1) ELSE a$=RIGHT$(pfad$,LEN(pfad$)-INSTR(pfad$,"\")) fac$=fi$ ! Datei ENDIF IF MID$(fac$,3,1)="\" AND LEN(fi$)=3 lgs%=anf_fat2%+len_fat% ~@alrt(1,"Wurzelverzeichnis ab Sektor "+STR$(lgs%)+" |für "+STR$(len_dir%)+" Sektoren.",1," Aha ") j%=total%+1 ENDIF ' IF LEN(fac$)>3 find_files CLR j% REPEAT EXIT IF fac$=file$(j%) INC j% UNTIL j%>total% ' erg%=3 clr_out("Cluster von: "+fi$) cl%=cluster%(j%) ' IF j%<=total% CLR anz% ' DO REPEAT CLR a$ WHILE LEN(a$)<70 INC anz% a$=a$+@dec_hex_val$(cl%,7)+" " cl%=@read_in_fat(cl%) EXIT IF cl%<2 OR cl%>=cpd%+2 WEND out(a$) IF cl%<2 OR (cl%>=cpd%+2 AND cl%<ed%-7) out("Ungültiger Cluster-Eintrag "+@dec_hex_val$(cl%,7)) ENDIF UNTIL cl%<2 OR cl%>=cpd%+2 out(STR$(anz%)+" Cluster") ENDIF out_do ENDIF ENDIF RETURN PROCEDURE fat_test ! FAT testen auf Leichencluster .| Glob. Var.: device%,erg%,fd$,drive%,status%,ed%,cpd%,aa%,lgs%,spc% .| anf_dat%,hdl%,buf%,bps% .| Felder : fat%() .| Ruft auf : alrt,dev,fat_check,read_in_fat,err_inf3,write_in_fat .| fat_get_leiche,fclose,write_fat,bios_block,lesen,fwrite2 .| Aufruf in : menu_mess-1, LOCAL cc%,fterg%,fat_tst%,fu% ' fterg%=@alrt(2,"Was tun, falls herrenlose|Cluster herumliegen|sollten?",1,"Sammeln|Nichts|Abbruch") CLR device%,fu% IF fterg%<3 IF fterg%=1 erg%=1 dev("Leichencluster sammeln",47) ENDIF IF device%<>99 IF ASC(fd$)-65=drive% ~@alrt(3,"Sammeln unbedingt auf einem|anderen Laufwerk!",1," Ok ") ELSE CLR status% fat_check IF status%=0 cc%=ed%-8 FOR fat_tst%=2 TO cpd%+1 aa%=@read_in_fat(fat_tst%) IF aa% AND fat%(fat_tst%)=0 IF aa%=cc% err_inf3(fat_tst%,"Cluster defekt","Clusternummer=") ELSE err_inf3(fat_tst%,"Clusterleiche","Clusternummer=") INC fu% write_in_fat(0,fat_tst%) IF fterg%=1 lgs%=(fat_tst%-2)*spc%+anf_dat% FOR lgs%=lgs% TO lgs%+spc%-1 lesen fwrite2(hdl%,buf%,bps%) NEXT lgs% ENDIF ENDIF ENDIF NEXT fat_tst% IF fu%>0 IF @alrt(2,STR$(fu%)+" Leichencluster gefunden.|Sollen diese Cluster|freigegeben werden?",0,"Ja| Nein ")=1 write_fat ELSE bios_block(drive%) ENDIF ENDIF ENDIF ERASE fat%() ENDIF IF fterg%=1 ~@fclose(hdl%) ENDIF ENDIF ENDIF RETURN PROCEDURE fat_check ! FAT testen und in Feld FAT%() eintragen .| Glob. Var.: abb%,status%,cpd%,ed%,fat_tst%,total%,fer%,max_err%,f$,bps% .| spc% .| Felder : att%(),cluster%(),laenge%(),file$() .| Ruft auf : find_files,mtasse,fat_check_do,read_in_fat,err_inf3,was_ist .| mnorm .| Aufruf in : fat_test-1,fat_graph-1, LOCAL i%,cl%,aa%,cc%,ex%,akt_cl% ' find_files IF abb%=0 mtasse CLR status% IF DIM?(fat%()) ERASE fat%() ENDIF DIM fat%(cpd%+2) cc%=ed%-8 ' FOR fat_tst%=1 TO total% ' IF (att%(fat_tst%) AND 8)=0 cl%=cluster%(fat_tst%) IF cl%>=2 AND cl%<cpd%+2 akt_cl%=1 IF fat%(cl%) ~@fat_check_do ELSE fat%(cl%)=fat_tst% ENDIF IF laenge%(fat_tst%) OR (att%(fat_tst%) AND &H10) ! Ordner CLR ex% DO aa%=@read_in_fat(cl%) EXIT IF aa%<2 OR aa%>=cpd%+2 cl%=aa% INC akt_cl% IF fat%(cl%)<>0 ex%=@fat_check_do ELSE fat%(cl%)=fat_tst% ENDIF abb%=@was_ist EXIT IF abb%>0 OR ex%<>0 LOOP ENDIF ' IF aa%=0 AND laenge%(fat_tst%)<>0 f$=file$(fat_tst%) err_inf3(cl%,"Freier Cluster in Datei "+f$,"Clusternummer=") ENDIF IF aa%=1 f$=file$(fat_tst%) err_inf3(cl%,"Clustereintrag = 1 in Datei "+f$,"Clusternummer=") ENDIF IF aa%>=cpd%+2 AND aa%<cc% f$=file$(fat_tst%) err_inf3(cl%,"Clustereintrag zu gro₧ in Datei "+f$,"Clusternummer=") ENDIF IF aa%=cc% f$=file$(fat_tst%) err_inf3(cl%,"Defekter Cluster in Datei "+f$,"Clusternummer=") ENDIF ' IF akt_cl%*bps%*spc%<laenge%(fat_tst%) f$=file$(fat_tst%) err_inf3(laenge%(fat_tst%),"FAT-Belegung < Dateilänge in Datei: "+f$,"DIR-Länge=") ENDIF IF ((att%(fat_tst%) AND &H18)=0) AND (akt_cl%-1)*bps%*spc%>=laenge%(fat_tst%) f$=file$(fat_tst%) err_inf3(laenge%(fat_tst%),"FAT-Belegung > Dateilänge in Datei: "+f$,"DIR-Länge=") ENDIF ELSE IF cl%=0 AND laenge%(fat_tst%)<>0 f$=file$(fat_tst%) err_inf3(cl%,"Kein Anfangs-Cluster obwohl Länge > 0 in Datei "+f$,"") ENDIF IF cl%=1 f$=file$(fat_tst%) err_inf3(cl%,"Anfangs-Clusternummer = 1 in Datei "+f$,"") ENDIF IF cl%>=cpd%+2 f$=file$(fat_tst%) err_inf3(cl%,"Anfangs-Clusternummer zu gro₧ in Datei "+f$,"") ENDIF ENDIF ENDIF abb%=@was_ist EXIT IF abb%>0 OR fer%>=max_err% OR status%<0 NEXT fat_tst% ' fat%(0)=-3 fat%(1)=-3 ENDIF mnorm RETURN FUNCTION fat_check_do .| Glob. Var.: fat_tst%,cl% .| Felder : laenge%(),fat%(),file$() .| Ruft auf : err_inf3 .| Aufruf in : fat_check-2, LOCAL a%,f1$,f2$,fil$ ' IF laenge%(fat_tst%)>0 a%=MAX(0,fat%(cl%)) f1$=file$(a%) f2$=file$(fat_tst%) fat%(cl%)=-4 err_inf3(cl%,f1$+" - "+f2$,"verklebt bei Cluster:") RETURN 1 ENDIF RETURN 0 ENDFUNC ' PROCEDURE fat_xor ! FATs vergleichen .| Glob. Var.: fat_anz%,anf_fat1%,len_fat%,lgs%,utis%,fatbuf%,bps%,buf% .| status% .| Felder : whdl&() .| Ruft auf : lesen,do_list,set_slide,err_inf3,alrt,nur_eine_fat .| Aufruf in : menu_mess-1, LOCAL a%,i%,j%,x%,wwa% ' CLR a% i%=fat_anz%-1 ! Anzahl der FATs x%=anf_fat1%+len_fat% ! Start der 2. FAT WHILE i% CLR j% FOR lgs%=x% TO x%+len_fat%-1 lesen do_list set_slide(whdl&(0)) IF C:utis%(&H500,L:fatbuf%+j%*bps%,L:buf%,L:bps%/4-1)<>0 INC a% err_inf3(lgs%,"FAT-Sektor verschieden","Sektornummer="+STR$(j%+1)+":") ENDIF EXIT IF status%<0 INC j% NEXT lgs% DEC i% ADD x%,len_fat% WEND IF a%>0 wwa%=@alrt(3,"FATs sind verschieden!",3,"Abbruch") ENDIF IF i%=1 nur_eine_fat ENDIF lesen do_list RETURN PROCEDURE fat_optimum ! FAT-Verschnitt berechnen .| Glob. Var.: abb%,erg%,drive%,total%,spc%,cluster%,a$,bpc% .| Felder : laenge%() .| Ruft auf : find_files,clr_out,out,dec_hex_val$,out_do .| Aufruf in : menu_mess-1, LOCAL ab%,j%,i%,cl% ' CLR abb% erg%=3 find_files IF abb%=0 clr_out("FAT optimal Laufwerk: "+CHR$(drive%+65)) out("Anzahl Dateien : "+STR$(total%)) out("") out("Bytes/Cluster bel.Cluster bel.Bytes aktuell") ' FOR j%=9 TO 15 ab%=2^j% ! Bytes/Cluster CLR cluster% ! Anzahl der belegten Cluster berechnen FOR i%=1 TO total% cl%=laenge%(i%)/ab% IF (laenge%(i%)/ab%)<>cl% INC cl% ENDIF ADD cluster%,cl% NEXT i% a$=SPACE$(50) MID$(a$,5)=@dec_hex_val$(ab%,6) MID$(a$,17)=@dec_hex_val$(cluster%,6) MID$(a$,31)=@dec_hex_val$(cluster%*ab%,8) IF ab%=bpc% MID$(a$,45)="***" ENDIF out(a$) NEXT j% out_do ENDIF RETURN ' PROCEDURE fat_leiche_12 ! Leichencluster prüfen in 12-Bit-FAT .| Glob. Var.: ed%,cpd%,fatbuf% .| Felder : fat%() .| Aufruf in : fat_graph-1, LOCAL aa%,cz%,cc%,cd%,fat_tst% cc%=ed%-15 ! defekt= FF0-FF7 !RS:BUG: nach ISO und MS-DOS nur $FF7!!! cd%=ed%-8 ' FOR fat_tst%=2 TO cpd%+1 cz%=fatbuf%+fat_tst%*1.5 IF EVEN(fat_tst%)=-1 aa%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%} ELSE aa%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16 ENDIF IF aa%>0 IF aa%>=cc% AND aa%<=cd% fat%(fat_tst%)=-2 ELSE IF fat%(fat_tst%)=0 fat%(fat_tst%)=-1 ENDIF ENDIF ENDIF NEXT fat_tst% RETURN PROCEDURE fat_leiche_16 ! ... .| Glob. Var.: ed%,cpd%,fatbuf% .| Felder : fat%() .| Aufruf in : fat_graph-1, LOCAL cz%,cc%,cd%,fat_tst%,aa% ' cc%=ed%-15 ! defekt= FFF0-FFF7 !RS:BUG: nach ISO und MS-DOS nur $FFF7!!! cd%=ed%-8 FOR fat_tst%=2 TO cpd%+1 cz%=fat_tst%*2+fatbuf% aa%=BYTE{cz%}+BYTE{cz%+1}*256 IF aa%>0 IF aa%>=cc% AND aa%<=cd% fat%(fat_tst%)=-2 ELSE IF fat%(fat_tst%)=0 fat%(fat_tst%)=-1 ENDIF ENDIF ENDIF NEXT fat_tst% RETURN ' PROCEDURE fat_graph ! FAT grafisch anzeigen .| Glob. Var.: abb%,status%,erg%,bflag% .| Ruft auf : mtasse,fat_check,fat_leiche_12,fat_leiche_16,fat_graf_do .| out_do,set_last .| Aufruf in : menu_mess-1, CLR abb%,status% mtasse fat_check IF status%=0 AND abb%=0 erg%=3 ON (bflag% AND 1)+1 GOSUB fat_leiche_12,fat_leiche_16 fat_graf_do out_do set_last(4) ENDIF RETURN PROCEDURE fat_graf_do ! ... .| Glob. Var.: cpd%,a$,fg$,drive% .| Felder : fat%() .| Ruft auf : do_clr_out,mtasse,out,dec_hex_val$ .| Aufruf in : fat_graph-1,last_4-1, LOCAL fgs%,i%,j% ' do_clr_out("? = verklebt, V = Verwaltung, X = Leiche, D = defekt, . = frei") mtasse FOR j%=0 TO cpd%+1 STEP 64 fgs%=1 a$=SPACE$(64) FOR i%=j% TO j%+MIN(64,cpd%+1-j%) IF fat%(i%)>0 MID$(a$,fgs%)="b" ELSE MID$(a$,fgs%)=MID$(fg$,fat%(i%)+5,1) ENDIF INC fgs% NEXT i% out(@dec_hex_val$(j%,6)+" "+a$) NEXT j% ' out("Drive: "+CHR$(drive%+65)+" "+STR$(cpd%)+" Cluster") RETURN PROCEDURE last_4 .| Glob. Var.: txt_zeile%,top%,txt_spalte%,ev_clicks&,lgs%,spc% .| anf_dat%,cpd%,wc%,ed% .| Felder : whdl&(),out$(),fat%(),file$(),att%(),cluster%() .| Ruft auf : fat_graf_do,out_do,set_last,lesen,wind_top,info_line .| dec_hex_val$,read_in_fat,do_list .| Aufruf in : maus_pos-1, LOCAL a%,b%,cl%,klickcl%,anzcl%,i%,a$,f$,x1$,x2$,x3$ ' IF txt_zeile%+top%>0 AND txt_spalte%>7 AND txt_spalte%<72 cl%=(txt_zeile%+top%)*64+txt_spalte%-72 ELSE fat_graf_do out_do set_last(4) ENDIF ' IF ev_clicks&>1 lgs%=(cl%-2)*spc%+anf_dat% lesen wind_top(whdl&(0)) ENDIF IF cl%>=cpd%+2 out$(0)=SPACE$(wc%) info_line ELSE SELECT fat%(cl%) CASE 1 TO f$=file$(fat%(cl%)) IF (att%(fat%(cl%)) AND 16)<>0 f$=f$+"\" ENDIF klickcl%=cl% anzcl%=1 cl%=cluster%(fat%(cl%)) ! Start-Cluster a%=cl%/64 b%=cl%-a%*64+8 a$=MID$(out$(a%+1),b%,1) ' IF ASC(a$)<10 x1$="b" x2$="b" x3$="b" ELSE x1$="" x2$="" x3$="" ENDIF MID$(out$(a%+1),b%,1)=x1$ cl%=@read_in_fat(cl%) WHILE cl%<cpd%+2 a%=cl%/64 b%=cl%-a%*64+8 MID$(out$(a%+1),b%,1)=x3$ INC anzcl% cl%=@read_in_fat(cl%) WEND MID$(out$(a%+1),b%,1)=x2$ out$(0)=@dec_hex_val$(klickcl%,6)+" "+f$+" ("+STR$(anzcl%)+" Cluster)"+SPACE$(MAX(0,wc%-LEN(f$)-11-LEN(STR$(anzcl%)))) CASE -1 out$(0)=@dec_hex_val$(cl%,6)+" Leichencluster" CASE -2 out$(0)=@dec_hex_val$(cl%,6)+" Defekter Cluster" CASE -3 out$(0)=@dec_hex_val$(cl%,6)+" Verwaltungsbereich" CASE -4 out$(0)=@dec_hex_val$(cl%,6)+" Verklebter Cluster" ENDSELECT do_list ENDIF RETURN ' FUNCTION fat_get_defekt ! Defekte aus FAT lesen .| Glob. Var.: cc%,ed%,cd%,bflag%,cpd%,cz%,fatbuf%,l$ .| Ruft auf : out .| Aufruf in : disc_check-1, LOCAL aa%,a%,i% ' cc%=ed%-15 ! defekt= FFF0-FFF7 !RS:BUG: nach ISO und MS-DOS nur $FFF7!!! cd%=ed%-8 CLR a% ' IF (bflag% AND 1)<>0 FOR i%=2 TO cpd%+1 cz%=i%*2+fatbuf% aa%=BYTE{cz%}+BYTE{cz%+1}*256 IF aa%>=cc% AND aa%<=cd% INC a% out(l$+"Cluster: "+STR$(i%)) ENDIF NEXT i% ELSE FOR i%=2 TO cpd%+1 cz%=fatbuf%+i%*1.5 IF EVEN(i%)=-1 aa%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%} ELSE aa%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16 ENDIF IF aa%>=cc% AND aa%<=cd% INC a% out(l$+"Cluster: "+STR$(i%)) ENDIF NEXT i% ENDIF RETURN a% ENDFUNC FUNCTION read_in_fat(clus%) ! Eintrag in FAT lesen .| Glob. Var.: bflag%,fatbuf% .| Aufruf in : last_5-5,dir_secsearch-1,dir_sort_lgs-1,fat_bearbeiten-7 .| fat_cluster-1,fat_test-1,fat_check-1,last_4-2,fat_clr-1,cl_up-1 .| cl_down-1,o_neu-1, LOCAL cz% IF (bflag% AND 1)<>0 cz%=fatbuf%+clus%*2 RETURN BYTE{cz%}+BYTE{cz%+1}*256 ELSE cz%=fatbuf%+clus%*1.5 IF EVEN(clus%)=TRUE RETURN (BYTE{cz%+1} AND 15)*256+BYTE{cz%} ELSE RETURN BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16 ENDIF ENDIF ENDFUNC ' ---------- PROCEDURE fat_clr ! FAT löschen .| Glob. Var.: ed%,cpd% .| Ruft auf : read_in_fat,write_in_fat .| Aufruf in : disc_clear-1, LOCAL cc%,fat_tst%,mediabyte| ' IF drive%<2 ! Media-Byte bestimmen !RS: Bestimmung in bios_block verschieben? IF tpd%=40 ! 130-mm-Disketten (5,25 in) mit 40 Spuren IF sid%=1 AND spt%=9 AND len_fat%=2 AND len_dir%=4 AND spc%=1 AND cpd%=351 mediabyte|=&HFC ! Diskette ISO Typ 201 ELSE IF sid%=2 AND spt%=9 AND len_fat%=2 AND len_dir%=7 AND spc%=2 AND cpd%=354 mediabyte|=&HFD ! Diskette ISO Typ 202 ELSE IF sid%=1 AND spt%=8 AND len_fat%=1 AND len_dir%=4 AND spc%=1 AND cpd%=313 mediabyte|=&HFE ELSE IF sid%=2 AND spt%=8 AND len_fat%=1 AND len_dir%=7 AND spc%=2 AND cpd%=315 mediabyte|=&HFF ELSE mediabyte|=&HF9 ENDIF ELSE ! 90-mm-Disketten (3,5 in) oder 130-mm-Disketten (5,25 in) mit 80 Spuren IF spt%>=18 mediabyte|=&HF0 ELSE mediabyte|=&HF9 ENDIF ENDIF ELSE mediabyte|=&HF8 ! Fest- oder Wechselplatte ENDIF write_in_fat(&HFF00 AND mediabyte|,0) ! Media-Byte in die FAT eintragen write_in_fat(&HFFFF,1) cc%=ed%-8 FOR fat_tst%=2 TO cpd%+1 IF cc%<>@read_in_fat(fat_tst%) write_in_fat(0,fat_tst%) ENDIF NEXT fat_tst% RETURN PROCEDURE write_in_fat(was%,wohin%) .| Glob. Var.: bflag%,fatbuf% .| Aufruf in : disc_check_err-1,last_5-3,fat_bearbeiten-4,fat_test-1 .| fat_clr-1, LOCAL cz% ' IF (bflag% AND 1)<>0 cz%=fatbuf%+wohin%*2 BYTE{cz%}=(was% AND &HFF) BYTE{cz%+1}=(was% AND &HFF00)/256 ELSE cz%=fatbuf%+wohin%*1.5 IF EVEN(wohin%)=-1 BYTE{cz%+1}=(BYTE{cz%+1} AND 240)+(was% AND &HF00)/256 BYTE{cz%}=(was% AND 255) ELSE BYTE{cz%+1}=(was% AND &HFF0)/16 BYTE{cz%}=(BYTE{cz%} AND 15)+(was% AND 15)*16 ENDIF ENDIF RETURN PROCEDURE write_fat ! FAT schreiben .| Glob. Var.: fat_anz%,anf_fat1%,status%,fatbuf%,len_fat%,drive% .| Ruft auf : err_inf .| Aufruf in : disc_clear-1,disc_check-1,last_5-1,fat_bearbeiten-1 .| fat_test-1, LOCAL a%,i%,x% ' i%=fat_anz% ! Anzahl der FATs x%=anf_fat1% ! Start der 1. FAT WHILE i% status%=@rwabs(1,fatbuf%,len_fat%,x%,drive%) IF status%=-14 status%=@rwabs(1,fatbuf%,len_fat%,x%,drive%) ENDIF err_inf(status%) DEC i% ADD x%,len_fat% WEND RETURN PROCEDURE nur_eine_fat ! ist nur eine FAT da .| Ruft auf : alrt .| Aufruf in : fat_xor-1,fat_read2-1, ~@alrt(3,"Laufwerk hat nur eine FAT!",1,"Abbruch") RETURN PROCEDURE fat_read1 ! 1. Sektor der FAT 1 einlesen .| Glob. Var.: lgs%,anf_fat1% .| Ruft auf : change,lesen,do_list .| Aufruf in : menu_mess-1, change lgs%=anf_fat1% lesen do_list RETURN PROCEDURE fat_read2 ! 1. Sektor einer evtl. FAT 2 einlesen .| Glob. Var.: fat_anz%,lgs%,anf_fat1%,len_fat% .| Ruft auf : change,lesen,do_list,nur_eine_fat .| Aufruf in : menu_mess-1, change IF fat_anz%>1 lgs%=anf_fat1%+len_fat% lesen do_list ELSE nur_eine_fat ENDIF RETURN PROCEDURE set_cursor_in_fat(cluster%) .| Glob. Var.: bflag%,lgs%,anf_fat1%,bps%,z%,wzb%,yt%,xt%,hex! .| Ruft auf : lesen,set_tz,do_list .| Aufruf in : fat_bearbeiten-1, LOCAL b% ' IF (bflag% AND 1)<>0 lgs%=anf_fat1%+((cluster%*2)/bps%) b%=cluster%*2 ELSE lgs%=anf_fat1%+((cluster%*1.5)/bps%) b%=cluster%*1.5 ENDIF lesen ' b%=b% MOD bps% z%=INT(b%/wzb%)*wzb% b%=b%-z% yt%=b%/16 xt%=b%-yt%*16+51 IF hex!=TRUE xt%=(b%-yt%*16)*3 ENDIF set_tz do_list RETURN ' ---------- PROCEDURE cl_up .| Glob. Var.: cluster%,ed%,lgs%,spc%,anf_dat% .| Ruft auf : read_in_fat,lesen,alrt,do_list .| Aufruf in : menu_mess-1, LOCAL aa% IF cluster%>1 aa%=@read_in_fat(cluster%) IF aa%>=2 AND aa%<cpd%+2 lgs%=(aa%-2)*spc%+anf_dat% lesen ELSE ~@alrt(3,"Keine weitere Verkettung.",1," Aha ") ENDIF do_list ELSE ~@alrt(3,"* Clusterverkettung folgen *|Das geht nur mit Clustern|im Datenbereich!",1," Aha ") ENDIF RETURN PROCEDURE cl_down .| Glob. Var.: cluster%,lgs%,spc%,anf_dat% .| Ruft auf : mtasse,read_in_fat,mnorm,alrt,lesen,do_list .| Aufruf in : menu_mess-1, LOCAL j% ' IF cluster%>1 j%=cluster% mtasse REPEAT DEC j% IF j%=1 j%=cpd%+1 ENDIF UNTIL @read_in_fat(j%)=cluster% OR j%=cluster% mnorm IF j%=cluster% ~@alrt(3,"Keine weitere Verkettung.",1," Aha ") ELSE lgs%=(j%-2)*spc%+anf_dat% lesen do_list ENDIF ELSE ~@alrt(3,"* Clusterverkettung folgen *|Das geht nur mit Clustern|im Datenbereich!",1," Aha ") ENDIF RETURN ' ---------------------- PROCEDURE bios_block(drive%) .| Glob. Var.: bpb%,bps%,spc%,bpc%,len_dir%,len_fat%,anf_fat2%,anf_dat%,cpd% .| bflag%,spd%,tpd%,sid%,spt%,hid%,serie%,anf_dir%,anf_fat1%,fat_size% .| wwa%,wa$,fatbuf%,ver$,buf%,status%,l_end% .| Felder : l_end%() .| Ruft auf : media,alrt,do_exit,err_inf .| Aufruf in : boot_sec-1,last_5-1,dir_sort-1,fat_bearbeiten-2,fat_test-1, LOCAL fat_size2% ' CLR bpb% IF @media(drive%)=0 bpb%=BIOS(7,drive%) IF bpb%>0 bps%=CARD{bpb%} spc%=CARD{bpb%+2} bpc%=CARD{bpb%+4} len_dir%=CARD{bpb%+6} len_fat%=CARD{bpb%+8} anf_fat2%=CARD{bpb%+10} ! Beginn der 2. FAT, bei einer FAT deren Beginn anf_dat%=CARD{bpb%+12} cpd%=CARD{bpb%+14} bflag%=CARD{bpb%+16} spd%=anf_dat%+cpd%*spc% IF drive%<2 tpd%=CARD{bpb%+18} sid%=CARD{bpb%+20} spt%=CARD{bpb%+22} DIV sid% spd%=spt%*sid%*tpd% hid%=CARD{bpb%+26} serie%=CARD{bpb%+28}*256+BYTE{bpb%+30} ELSE CLR tpd%,sid%,spt%,hid%,serie% ENDIF ' anf_dir%=anf_dat%-len_dir% IF (bflag% AND 2)<>0 ! Nur eine FAT vorhanden! anf_fat1%=anf_fat2% ELSE anf_fat1%=anf_fat2%-len_fat% ENDIF ' fat_size2%=len_fat%*bps% ' IF fat_size2%>fat_size% wwa%=@alrt(1,"Grö₧e des FAT-Puffer "+STR$(fat_size%)+" Byte.|Notwendige Grö₧e "+STR$(fat_size2%)+" Byte.|FAT-Puffer auf diese Grö₧e anlegen?",1,"Ja| Nein ") IF wwa%=1 ~MFREE(fatbuf%) fatbuf%=MALLOC(fat_size2%) IF fatbuf%=0 ~@alrt(3,ver$+"|Kein Speicher für FAT!",1,"Abbruch") ~MFREE(buf%) do_exit ENDIF fat_size%=fat_size2% ELSE len_fat%=fat_size% DIV bps% ENDIF ENDIF ' status%=@rwabs(0,fatbuf%,len_fat%,anf_fat2%,drive%) IF status%=-14 status%=@rwabs(0,fatbuf%,len_fat%,anf_fat2%,drive%) ENDIF err_inf(status%) ENDIF ELSE bpb%=-1 ENDIF l_end%(0)=bps% l_end%=bps% RETURN PROCEDURE floppy_param .| Ruft auf : boot_sec,flex_dim .| Aufruf in : disc_check-1,pfad_compare-1,find_files-1, boot_sec flex_dim RETURN PROCEDURE flex_dim .| Glob. Var.: anf%,ed%,bflag%,cpd%,fatbuf%,utis%,srep%,rdim%,max_files% .| Aufruf in : floppy_param-1, LOCAL ci%,cz%,ca%,cc%,s% ' CLR anf% cc%=ed%-8 IF (bflag% AND 1)=0 FOR ci%=2 TO cpd%+1 cz%=ci%*1.5+fatbuf% IF EVEN(ci%)=TRUE ca%=(BYTE{cz%+1} AND 15)*256+BYTE{cz%} ELSE ca%=BYTE{cz%+1}*16+(BYTE{cz%} AND 240)/16 ENDIF IF ca%>=cc% INC anf% ENDIF NEXT ci% ELSE anf%=C:utis%(&H700,L:fatbuf%,L:fatbuf%+cpd%*2,L:ed%-9) ENDIF ' s%=MAX(anf%*1.1,112) IF srep%>0 s%=MAX(112,s%*10) ENDIF IF rdim%>0 ERASE file$(),laenge%(),att%(),cluster%(),sec%() ENDIF rdim%=1 DIM file$(s%),laenge%(s%),att%(s%),cluster%(s%),sec%(s%) max_files%=s% RETURN ' ---------------------- PROCEDURE find_files .| Glob. Var.: drive%,find_drive%,find%,last_srep%,srep%,total%,abb%,last% .| cc%,ed%,cd%,f$,pfad$ .| Ruft auf : alrt,mtasse,floppy_param,o_neu,set_crcbuf,mnorm .| Aufruf in : file_repair-1,dir_secsearch-1,dir_files-1,dir_fldren-1 .| dir_sort-1,fat_cluster-1,fat_check-1,fat_optimum-1, LOCAL wwa% ' wwa%=1 IF drive%=find_drive% AND find%=1 AND last_srep%=srep% wwa%=@alrt(2,"Verzeichnisse einlesen?",2,"Ok| Nee ") ENDIF last_srep%=srep% IF find%=0 OR wwa%=1 mtasse CLR total%,abb%,last% find_drive%=drive% find%=1 floppy_param cc%=ed%-15 cd%=ed%-8 f$=STRING$(11,0) pfad$=CHR$(drive%+65)+":\" o_neu(0) ENDIF IF abb%>0 ~@alrt(3,"Vorgang abgebrochen.",1," Aha ") CLR total%,find% ENDIF set_crcbuf mnorm RETURN ' ' o_neu PROCEDURE o_neu(cluster%) .| Glob. Var.: lgs%,anf_dir%,spc%,anf_dat%,cpd%,status%,buf%,drive%,abb% .| srep%,f$,total%,pfad$,bps%,max_files%,cd%,spd%,cc% .| Felder : file$(),att%(),sec%(),cluster%(),laenge%() .| Ruft auf : err_inf,was_ist,nam_conv$,o_neu,read_in_fat .| Aufruf in : find_files-1,o_neu-1, LOCAL a%,nr%,cl%,durch%,x%,y%,ogs%,clx%,lgx%,att%,n% LOCAL wurzel% ' IF cluster%=0 lgs%=anf_dir% wurzel%=TRUE n%=1 ! im Wurzelverzeichnis Sektoren einzeln lesen ELSE lgs%=(cluster%-2)*spc%+anf_dat% n%=spc% ! in Ordnern den ganzen Cluster lesen ENDIF lgx%=lgs% clx%=cluster% ' FOR durch%=1 TO 2 ! 1. Durchgang=alle Namen merken ' ! 2. Durchgang Ordner auflösen lgs%=lgx% cluster%=clx% EXIT IF cluster%>=cpd%+2 ' DO status%=@rwabs(0,buf%,n%,lgs%,drive%) ! Sektor oder Cluster lesen IF status%<>0 err_inf(status%) ENDIF EXIT IF status%<>0 CLR nr% ' x%=buf% ! ab Pufferanfang REPEAT abb%=@was_ist EXIT IF abb%>0 ' y%=BYTE{x%} ! 1. Zeichen ' IF durch%=2 INC nr% ENDIF ' IF y%<>46 ! kein "." oder ".." ' IF (y%>0 AND y%<>&HE5) OR (srep%=1 AND y%=&HE5) ! Ersten Buchstaben des Namens kontrollieren ' att%=BYTE{x%+11} cl%=BYTE{x%+26}+BYTE{x%+27}*&H100 BMOVE x%,V:f$,11 ' IF durch%=1 IF (srep%>0 AND y%=&HE5) OR (srep%=0 AND y%<>&HE5) OR ((att% AND 16)<>0 AND y%<>&HE5) INC total% file$(total%)=pfad$+@nam_conv$(f$,0) att%(total%)=att% sec%(total%)=lgs%+(x%-buf%)/bps% cluster%(total%)=cl% laenge%(total%)=MIN(2.14748E+09,BYTE{x%+28}+BYTE{x%+29}*&H100+BYTE{x%+30}*&H10000+BYTE{x%+31}*&H1000000) ENDIF ELSE IF (att% AND 16)<>0 AND y%<>&HE5 ! Ordner? pfad$=pfad$+@nam_conv$(f$,0)+"\" ogs%=lgs% ' o_neu(cl%) ! eine Ebene tiefer ' lgs%=ogs% ! kommt zurück, im alten Sektor weiter machen status%=@rwabs(0,buf%,n%,lgs%,drive%) IF status%<>0 err_inf(status%) ENDIF x%=buf%+(nr%-1)*32 ENDIF ENDIF ' ENDIF ENDIF ' ADD x%,32 UNTIL x%>=buf%+n%*bps% OR total%>=max_files% OR abb%>0 ' IF wurzel%=FALSE cluster%=@read_in_fat(cluster%) ENDIF ' EXIT IF abb%<>0 OR total%>=max_files% EXIT IF wurzel%=FALSE AND (cluster%<2 OR cluster%>=cpd%+2) EXIT IF wurzel%=TRUE AND lgs%+1>=anf_dat% IF wurzel%=TRUE INC lgs% ELSE lgs%=(cluster%-2)*spc%+anf_dat% ENDIF LOOP EXIT IF abb%>0 OR total%>=max_files% NEXT durch% ' pfad$=LEFT$(pfad$,RINSTR(LEN(pfad$)-1,pfad$,"\")) RETURN ' ---------------------- PROCEDURE set_pfad(ff$) .| Glob. Var.: fehler% .| Ruft auf : dsetdrv,dsetpath .| Aufruf in : v_opnvwk-1,do_pexec-1,do_exit-1, LOCAL i% ' CLR fehler% IF MID$(ff$,2,1)=":" ! Falls nötig Drive wechseln ~@dsetdrv(ASC(UPPER$(ff$))-65) ff$=RIGHT$(ff$,LEN(ff$)-2) ENDIF IF fehler%>=0 i%=RINSTR(ff$,"\") IF i%>0 ff$=LEFT$(ff$,i%) ENDIF ~@dsetpath(ff$) ENDIF RETURN PROCEDURE get_pfad .| Glob. Var.: pfad$,fehler%,drive% .| Aufruf in : var_init-1,do_pexec-1,start_shell-1, pfad$=STRING$(256,0) fehler%=GEMDOS(71,L:V:pfad$,0) IF fehler%=0 pfad$=CHR$(drive%+65)+":"+LEFT$(pfad$,INSTR(pfad$,CHR$(0))-1) IF RIGHT$(pfad$,1)<>"\" pfad$=pfad$+"\" ENDIF ENDIF RETURN PROCEDURE wandeln(b$) .| Glob. Var.: a$ .| Aufruf in : datei_suchen-1,lies_3-1, ' Wandelt Dateinamen (Beispiel: willi.img, w*.xx) in einen 12 Zeichen langen ' String (Beispiel: willi .img, w* .xx ) LOCAL a% a$=b$ a%=INSTR(a$,".") IF a%>0 b$=LEFT$(a$,a%-1) b$=b$+SPACE$(8-LEN(b$)) a$=b$+RIGHT$(a$,LEN(a$)-a%+1) a$=a$+SPACE$(12-LEN(a$)) ELSE a$=a$+SPACE$(12-LEN(a$)) MID$(a$,9,1)="." ENDIF RETURN PROCEDURE alltoone(b$) .| Glob. Var.: a$ .| Aufruf in : datei_suchen-1, ' Wandelt Allquantor ("*") in Einfachquantor ("?") um ' (w* .* -->w???????.???) LOCAL t% a$=b$ FOR t%=1 TO 8 IF MID$(a$,t%,1)="*" MID$(a$,t%)=STRING$(9-t%,"?") t%=8 ENDIF NEXT t% FOR t%=10 TO 12 IF MID$(a$,t%,1)="*" MID$(a$,t%)=STRING$(13-t%,"?") t%=12 ENDIF NEXT t% RETURN PROCEDURE n_compare(a$,b$) .| Glob. Var.: gleich! .| Ruft auf : n_compare .| Aufruf in : lies_3-1,n_compare-1, ' Zwei Strings vergleichen ' Die Strings müssen per Wandeln und Alltoone vorbehandelt werden ' OUT: Gleich!=True, wenn Vergleich pa₧t IF LEN(a$)=0 AND LEN(b$)=0 gleich!=TRUE ELSE IF LEN(a$)<>LEN(b$) gleich!=FALSE ELSE IF LEFT$(a$,1)=LEFT$(b$,1) OR LEFT$(a$,1)="?" OR LEFT$(b$,1)="?" n_compare(MID$(a$,2),MID$(b$,2)) ELSE gleich!=FALSE ENDIF ENDIF ENDIF RETURN PROCEDURE do_pfad(xpf$) .| Glob. Var.: pfad$ .| Aufruf in : fsel-1, pfad$=LEFT$(xpf$,RINSTR(xpf$,"\")) IF pfad$="" pfad$="\" ENDIF RETURN PROCEDURE fehler_behandlung .| Glob. Var.: utis% .| Ruft auf : alrt,media_all,do_exit (tot) ~@alrt(5,"SED-Fehler "+STR$(ERR)+"! ",1,"Abbruch") IF utis%>0 ~@media_all ENDIF do_exit RETURN ' ---------------------- PROCEDURE disass .| Glob. Var.: pc%,buf%,z%,tz%,drel%,ram_addr%,erg%,ram.konv%,distempl& .| Ruft auf : alrt,eingabe,clr_out,temple_disass,sed_disass,out_do .| Aufruf in : menu_mess-1,control-1, LOCAL was%,tanz%,sanz% was%=@alrt(2,"Was disassemblieren?",1,"Buffer|RAM|Abbruch") IF was%<3 IF was%=1 pc%=buf%+z%+tz% drel%=buf% ! Wenn Buffer dann Adresse auf 0000 umrechnen ELSE CLR drel% pc%=ram_addr%+tz% ENDIF IF EVEN(pc%)=FALSE INC pc% ENDIF erg%=3 sanz%=@eingabe("Wieviele Zeilen disassemblieren?",100) CLR tanz% clr_out("Disassembler") IF (OB_STATE(ram.konv%,distempl&) AND 1)<>0 temple_disass ELSE sed_disass ENDIF out_do ENDIF RETURN PROCEDURE temple_disass .| Glob. Var.: tmon%,sanz%,utis%,pc%,fdc3% .| Ruft auf : search_cookie,alrt,mtasse,out .| Aufruf in : disass-1, LOCAL a$,cpu_typ% ' tmon%=@search_cookie("TMon",0) IF tmon%=0 ~@alrt(3,"Kann 'Templemon' nicht finden.",1,"Abbruch") ELSE ' ' (CODE $800) Templemon-Disassembler aufrufen ' IN: A4.l = Zeiger auf Adresse, A5.l =Zeiger auf Templemon ' D4.l = CPU Typ , D5.l =Rückgabe Parameter ' OUT:Parameterblock (D5) ' L: Adresse des Strings umspeichern ' L: Befehlsnummer? ' L: Adresse des nächsten Befehls ' L: Codetabelle? ' Parameterblock: fdc3% (1100 Bytes von FDC mi₧braucht) ' mtasse cpu_typ%=&H13 WHILE sanz% ~C:utis%(&H800,L:pc%,L:tmon%,L:cpu_typ%,L:fdc3%) a$=CHAR{{fdc3%}} out(a$) pc%={fdc3%+8} DEC sanz% WEND ENDIF RETURN PROCEDURE sed_disass .| Glob. Var.: pc%,location$,hexdump$,mnemonic$,operand$,d_ascii$,tanz% .| branch!,adjusted_pc%,sanz% .| Ruft auf : mtasse,68000_disassembler,out .| Aufruf in : disass-1, mtasse DO 68000_disassembler(pc%,TRUE,TRUE,TRUE) location$=location$+" " hexdump$=hexdump$+SPACE$(21-LEN(hexdump$)) mnemonic$=mnemonic$+SPACE$(8-LEN(mnemonic$)) operand$=operand$+SPACE$(MAX(0,28-LEN(operand$))) out(location$+hexdump$+mnemonic$+operand$+d_ascii$) INC tanz% IF branch!=TRUE out(location$+STRING$(66,"-")) ENDIF SWAP pc%,adjusted_pc% EXIT IF sanz%<=tanz% LOOP RETURN PROCEDURE 68000_disassembler(pc%,location!,hexdump!,ascii!) .| Glob. Var.: dis_init%,location$,hexdump$,mnemonic$,operand$,d_ascii$ .| d_offset%,destination!,extendflag%,branch!,legal!,instruction% .| instruction_group%,drel%,adjusted_pc%,hexdump%,char%,ascii% .| Felder : miscellaneous$() .| Ruft auf : initiate_68000_disassembler,0,1,4,5,6,7,8,9,10,11,12,14,15 .| Aufruf in : sed_disass-1, ' ****************************************************** ' * AUTOR : ERIK HANSEN (Copyright (C) by ST-Computer) ' * GESCHRIEBEN : FEBRUAR 1987. IN KRUSAA. DÄNEMARK ' ****************************************************** IF dis_init%=0 initiate_68000_disassembler ENDIF CLR location$,hexdump$,mnemonic$,operand$,d_ascii$ CLR d_offset%,destination!,extendflag%,branch! legal!=TRUE ' * DIE MNEMONICS DER M68000 SIND IN 16 GRUPPEN AUFGETEILT. DIESE GRUPPEN ' * SIND IN DEN HÖCHSTEN 4 BITS DER OPCODES CODIERT. HIER WERDEN DIE GRUPPEN ' * ERMITTELT UND DIE DAZU GEHÖRENDE PROCEDURE ANGESPRUNGEN. instruction%=DPEEK(pc%) instruction_group%=(instruction% AND 61440) DIV 4096 ON instruction_group%+1 GOSUB 0,1,1,1,4,5,6,7,8,9,10,11,12,9,14,15 ' * HIER WERDEN EINIGE VON DEN VARIABLEN DEFINIERT, ' * DIE NOCH NICHT DEFINIERT WURDEN ' * ---------------------------------- ' * ALLE VARIABLEN, DIE ZURÜCKGELIEFERT WERDEN KÖNNEN, SIND ' * ---------------------------------- ' * Location$ : DIE ADRESSE DES OPCODES IN HEX$ ' * Hexdump$ : DER OPCODE UND ZUGEHÖRENDE BYTES IN HEX$ ' * Mnemonic$ : DER ÜBERSETZTE OPCODE ' * Operand$ : DIE DEM OPCODE FOLGENDEN OPERANDEN ' * D_Ascii$ : Hexdump$ IN ASCII ÜBERSETZT ' * ---------------------------------- ' * Branch : KÖNNEN ZWEI WERTE ANNEHMEN. (True/False) ' * True - LETZER OPCODE WAR EINER VON: JMP/BRA/RTS/RTE/RTR ' * False - LETZER OPCODE WAR ALLES ANDERE ' * ---------------------------------- ' * Adjusted_pc% : ZEIGER AUF DEN NÄCHSTEN OPCODE IF location!=TRUE location$=HEX$(pc%-drel%,6) ENDIF d_offset%=d_offset% AND legal! adjusted_pc%=pc%+2+d_offset%*2 IF hexdump!=TRUE FOR hexdump%=pc% TO adjusted_pc%-1 hexdump$=hexdump$+HEX$(PEEK(hexdump%),2) NEXT hexdump% ENDIF IF ascii!=TRUE FOR char%=pc% TO adjusted_pc%-1 ascii%=PEEK(char%) IF ascii%<32 ascii%=46 ENDIF d_ascii$=d_ascii$+CHR$(ascii%) NEXT char% ENDIF IF NOT legal! mnemonic$=miscellaneous$(4) operand$="$"+hexdump$ ENDIF RETURN PROCEDURE 0 .| Glob. Var.: status_register%,instruction%,pc_memory%,pc%,bit_eight% .| dmode%,size%,register%,legal!,mnemonic$,operand$,function%,sign$ .| displacement%,displacement$,d_offset%,check%,extendflag% .| Felder : bittest$(),register$(),extend$() .| Ruft auf : isolate_single_bits,assemble_operands .| immediate_addressing_two,immediate_addressing_three .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 0 ' * ---------------------------------- ' * BCLR : BCHG : BTST : BSET : MOVEP(W/L) : ' * ORI : ANDI : SUBI : ADDI : EORI : CMPI ' * ORI TO CCR : ORI TO SR : ANDI TO CCR : ANDI TO SR : EORI TO SR : isolate_single_bits status_register%=instruction% AND 60 pc_memory%=pc% IF bit_eight%=1 IF dmode%<>1 IF dmode%=7 IF (size%=0 AND register%>3) OR (size%>0 AND register%>1) CLR legal! ENDIF ENDIF assemble_operands mnemonic$=bittest$(size%) operand$=register$(0,function%)+","+operand$ ELSE sign$="$" displacement%=DPEEK(pc%+2) IF displacement%>&H7FFF displacement%=&H10000-displacement% sign$="-$" ENDIF displacement$=sign$+HEX$(displacement%) IF size%=0 OR size%=2 mnemonic$="MOVEP.W" ELSE mnemonic$="MOVEP.L" ENDIF IF size%<2 operand$=displacement$+register$(2,register%)+","+register$(0,function%) ELSE operand$=register$(0,function%)+","+displacement$+register$(2,register%) ENDIF INC d_offset% ENDIF ELSE check%=DPEEK(pc%) IF function%<4 IF check%<>&H3C AND check%<>&H7C AND check%<>&H23C AND check%<>&H27C IF (dmode%=7 AND register%>1) OR (dmode%=1) CLR legal! ENDIF ENDIF ENDIF IF function%=0 mnemonic$="ORI" immediate_addressing_two IF check%=&H7C operand$=operand$+" ; Privilege" ENDIF ENDIF IF function%=1 mnemonic$="ANDI" immediate_addressing_two IF check%=&H27C operand$=operand$+" ; Privilege" ENDIF ENDIF IF function%=2 mnemonic$="SUBI" immediate_addressing_three ENDIF IF function%=3 mnemonic$="ADDI" immediate_addressing_three ENDIF IF function%=4 INC extendflag% IF dmode%=7 IF (size%=0 AND register%>3) OR (size%>0 AND register%>1) CLR legal! ENDIF ENDIF IF dmode%=1 CLR legal! ENDIF IF dmode%=0 IF PEEK(pc_memory%+3)>31 CLR legal! ENDIF ELSE IF PEEK(pc_memory%+3)>7 CLR legal! ENDIF ENDIF mnemonic$=bittest$(size%) CLR size% immediate_addressing_three ENDIF IF function%=5 OR function%=6 IF check%<>&HA3C AND check%<>&HA7C IF (dmode%=7 AND register%>1) OR (dmode%=1) CLR legal! ENDIF ENDIF IF function%=5 mnemonic$="EORI" immediate_addressing_two IF check%=&HA7C operand$=operand$+" ; Privilege" ENDIF ELSE mnemonic$="CMPI" immediate_addressing_three ENDIF ENDIF IF function%=7 CLR legal! ENDIF IF extendflag%=0 mnemonic$=mnemonic$+extend$(size%) ENDIF ENDIF SWAP pc%,pc_memory% RETURN PROCEDURE 1 .| Glob. Var.: pc_memory%,pc%,size%,instruction%,dmode%,register% .| operand_memory$,operand$,destination!,mnemonic$,d_offset%,legal! .| trap%,fn%,a$ .| Felder : register$(),extend$(),gd$(),bi$(),xb$() .| Ruft auf : assemble_operands .| Aufruf in : 68000_disassembler-3, ' * BEFEHLE DER GRUPPEN 1, 2 UND 3 ' * ------------------------------ ' * MOVE.B : MOVE.W : MOVE.L ' * MOVEA.W : MOVEA.L : pc_memory%=pc% size%=(instruction% AND 12288) DIV 4096 IF size%=1 DEC size% ENDIF IF size%=3 SUB size%,2 ENDIF dmode%=(instruction% AND 56) DIV 8 register%=instruction% AND 7 assemble_operands operand_memory$=operand$ destination!=TRUE register%=(instruction% AND 3584) DIV 512 dmode%=(instruction% AND 448) DIV 64 IF dmode%=1 operand$=register$(1,register%) mnemonic$="MOVEA" ELSE mnemonic$="MOVE" ADD pc%,d_offset%*2 assemble_operands IF dmode%=7 AND register%>1 CLR legal! ENDIF ENDIF operand$=operand_memory$+","+operand$ mnemonic$=mnemonic$+extend$(size%) SWAP pc%,pc_memory% IF DPEEK(pc%)=&H3F3C ' MOVE.W #xx,-(sp) trap%=DPEEK(pc%+4) IF trap%>=&H4E40 AND trap%<=&H4E4F trap%=trap% AND 15 fn%=DPEEK(pc%+2) CLR a$ IF trap%=1 AND fn%<88 a$=gd$(fn%) ELSE IF trap%=13 AND fn%<12 a$=bi$(fn%) ELSE IF trap%=14 AND fn%<65 a$=xb$(fn%) ENDIF ENDIF ENDIF operand$=operand$+" ; "+a$ ENDIF ENDIF RETURN PROCEDURE 4 .| Glob. Var.: bit_eight%,size%,dmode%,legal!,mnemonic$,operand$,function% .| register%,registerlist$,instruction%,branch!,pc%,d_offset%,trap% .| trap_number%,sign$,com$,displacement%,displacement$ .| Felder : register$(),extend$(),miscellaneous$(),trap$() .| Ruft auf : isolate_single_bits,assemble_operands,assemble_registerlist .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 4 ' * -------------------- ' * CHK : LEA : : : : : ' * NEGX : MOVE FROM SR : CLR : : : : ' * NEG : MOVE TO CCR : : : : : ' * NOT : MOVE TO SR : : : : : ' * NBCD : SWAP : PEA : EXT : MOVEM : : ' * ILLEGAL : TAS : TST : : : : ' * JSR : JMP : : : : : ' * RESET : NOP : stop : RTE : RTS : TRAPV : RTR ' * TRAP : LINK : UNLK : MOVE USP : : : isolate_single_bits IF bit_eight%=1 IF size%=2 DEC size% assemble_operands IF dmode%=1 CLR legal! ENDIF mnemonic$="CHK" operand$=operand$+","+register$(0,function%) ELSE assemble_operands IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3) CLR legal! ENDIF mnemonic$="LEA" operand$=operand$+","+register$(1,function%) ENDIF ELSE IF function%<2 IF (dmode%=7 AND register%>1) OR dmode%=1 CLR legal! ENDIF ENDIF IF function%=0 assemble_operands IF size%<3 mnemonic$="NEGX"+extend$(size%) ELSE mnemonic$="MOVE" operand$="SR,"+operand$ ENDIF ENDIF IF function%=1 assemble_operands mnemonic$="CLR"+extend$(size%) ENDIF IF function%=2 assemble_operands IF size%<3 IF (dmode%=7 AND register%>1) OR dmode%=1 CLR legal! ENDIF mnemonic$="NEG"+extend$(size%) ELSE IF dmode%=1 CLR legal! ENDIF mnemonic$="MOVE" operand$=operand$+",CCR" ENDIF ENDIF IF function%=3 assemble_operands IF size%<3 IF (dmode%=7 AND register%>1) OR dmode%=1 CLR legal! ENDIF mnemonic$="NOT"+extend$(size%) ELSE IF dmode%=1 CLR legal! ENDIF IF legal! mnemonic$="MOVE" operand$=operand$+",SR ; Privilege" ENDIF ENDIF ENDIF IF function%=4 IF size%=0 IF (dmode%=7 AND register%>1) OR dmode%=1 CLR legal! ENDIF mnemonic$="NBCD" assemble_operands ENDIF IF size%=1 IF dmode%=0 mnemonic$="SWAP" operand$=register$(0,register%) ELSE IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3) CLR legal! ENDIF mnemonic$="PEA" assemble_operands ENDIF ENDIF IF size%=2 OR size%=3 SUB size%,1 IF dmode%=0 mnemonic$="EXT"+extend$(size%) operand$=register$(0,register%) ELSE IF (dmode%=7 AND register%>1) OR (dmode%<4 AND dmode%<>2) CLR legal! ENDIF mnemonic$="MOVEM"+extend$(size%) assemble_registerlist operand$=registerlist$+","+operand$ ENDIF ENDIF ENDIF IF function%=5 IF instruction%=&H4AFC mnemonic$="ILLEGAL" ELSE IF (dmode%=7 AND register%>1) OR dmode%=1 CLR legal! ENDIF IF size%=3 mnemonic$="TAS" ELSE mnemonic$="TST"+extend$(size%) ENDIF assemble_operands ENDIF ENDIF IF function%=6 IF dmode%<5 AND dmode%<>2 AND dmode%<>3 CLR legal! ENDIF IF size%=2 mnemonic$="MOVEM.W" ELSE mnemonic$="MOVEM.L" ENDIF assemble_registerlist operand$=operand$+","+registerlist$ ENDIF IF function%=7 IF size%=2 OR size%=3 IF (dmode%<5 AND dmode%<>2) OR (dmode%=7 AND register%>3) CLR legal! ENDIF assemble_operands IF size%=2 mnemonic$="JSR" ELSE mnemonic$="JMP" ENDIF IF legal! AND mnemonic$="JMP" branch!=TRUE ENDIF ELSE IF dmode%=6 IF register%=4 CLR legal! ENDIF mnemonic$=miscellaneous$(register%) IF register%=0 OR register%=3 operand$="; Privilege" ENDIF IF register%=2 operand$="#$"+HEX$(DPEEK(pc%+2))+" ; Privilege" INC d_offset% ENDIF IF register%=2 OR register%=3 OR register%=5 OR register%=7 branch!=TRUE ENDIF ELSE trap%=(instruction% AND 48) DIV 16 IF trap%=0 mnemonic$="TRAP" trap_number%=instruction% AND 15 operand$="#$"+HEX$(trap_number%) IF trap_number%=2 IF DPEEK(pc%-2)=&HC8 operand$=operand$+" ; AES" ELSE IF (DPEEK(pc%-2) AND &H73)=&H73 operand$=operand$+" ; VDI" ELSE operand$=operand$+trap$(trap_number%) ENDIF ENDIF ELSE operand$=operand$+trap$(trap_number%) ENDIF ' ' Hier evtl TRAP-Aufrufe dekodieren ' ELSE SUB dmode%,2 IF dmode%=0 sign$="$" CLR com$ displacement%=DPEEK(pc%+2) IF displacement%>&H7FFF displacement%=&H10000-displacement% sign$="-$" ELSE com$=" ; Nonstandard" ENDIF mnemonic$="LINK" displacement$=sign$+HEX$(displacement%) operand$=register$(1,register%)+",#"+displacement$+com$ INC d_offset% ENDIF IF dmode%=1 mnemonic$="UNLK" operand$=register$(1,register%) ENDIF IF dmode%=2 OR dmode%=3 mnemonic$="MOVE" IF dmode%=2 operand$=register$(1,register%)+",USP ; Privilege" ELSE operand$="USP,"+register$(1,register%)+" ; Privilege" ENDIF ENDIF IF dmode%>3 CLR legal! ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF RETURN PROCEDURE 5 .| Glob. Var.: pc_memory%,pc%,dmode%,register%,legal!,size%,function% .| operand$,bit_eight%,mnemonic$,conditioncode%,instruction% .| destination%,drel%,destination$,d_offset% .| Felder : extend$(),conditioncode$(),register$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 5 ' * ------------------------------------------ ' * ADDQ : SUBQ ' * Scc : cc=Bedingung=(cc.cs.eq.f.ge.gt.hi.le.ls.lt.mi.ne.pl.t.vc.vs) ' * DBRA : (Oder DBF) ' * DBcc : cc=Bedingung=(cc.cs.eq.f.ge.gt.hi.le.ls.lt.mi.ne.pl.t.vc.vs) pc_memory%=pc% isolate_single_bits IF dmode%=7 AND register%>1 CLR legal! ENDIF IF size%<>3 assemble_operands IF function%=0 ADD function%,8 ENDIF operand$="#$"+STR$(function%)+","+operand$ IF bit_eight%=0 mnemonic$="ADDQ"+extend$(size%) ELSE mnemonic$="SUBQ"+extend$(size%) ENDIF ELSE conditioncode%=(instruction% AND 3840) DIV 256 IF dmode%<>1 mnemonic$="S"+conditioncode$(conditioncode%) assemble_operands ELSE IF conditioncode%=1 mnemonic$="DBRA" ELSE mnemonic$="DB"+conditioncode$(conditioncode%) ENDIF destination%=DPEEK(pc%+2) IF destination%>&H7FFF SUB destination%,&H10000 ENDIF destination%=(pc%+2)+destination%-drel% destination$=HEX$(destination%) operand$=register$(0,register%)+",$"+destination$ INC d_offset% ENDIF ENDIF RETURN PROCEDURE 6 .| Glob. Var.: conditioncode%,instruction%,distance%,com$,mnemonic$,branch! .| destination%,pc%,d_offset%,operand$,drel% .| Felder : conditioncode$() .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 6 ' * ------------------------------------------ ' * BRA : BSR ' * Bcc : cc=Bedingung=(cc.cs.eq.ge.gt.hi.le.ls.lt.mi.ne.pl.vc.vs) conditioncode%=(instruction% AND 3840) DIV 256 distance%=instruction% AND 255 CLR com$ IF conditioncode%<2 IF conditioncode%=0 mnemonic$="BRA" branch!=TRUE ELSE mnemonic$="BSR" ENDIF ELSE mnemonic$="B"+conditioncode$(conditioncode%) ENDIF IF distance%=0 mnemonic$=mnemonic$+".W" destination%=DPEEK(pc%+2) IF (destination%>&HFF80) OR (destination%<&H80) com$=" ; (.W Could Be .S)" ENDIF IF destination%>&H7FFF SUB destination%,&H10000 ENDIF INC d_offset% ELSE mnemonic$=mnemonic$+".S" IF distance%>&H7F SUB distance%,&H100 ENDIF destination%=distance% ENDIF operand$="$"+HEX$((pc%+2)+destination%-drel%)+com$ RETURN PROCEDURE 7 .| Glob. Var.: mnemonic$,constant$,instruction%,register%,operand$ .| Felder : register$() .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 7 ' * ------------------------------------------ ' * MOVEQ mnemonic$="MOVEQ" constant$=HEX$(instruction% AND 255) register%=(instruction% AND 3584) DIV 512 operand$="#$"+constant$+","+register$(0,register%) RETURN PROCEDURE 8 .| Glob. Var.: size%,dmode%,legal!,operand$,function%,bit_eight%,mnemonic$ .| register% .| Felder : register$(),extend$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 8 ' * ------------------------------------------ ' * DIVU : DIVS ' * SBCD : ' * OR : isolate_single_bits IF size%=3 IF dmode%=1 CLR legal! ENDIF assemble_operands operand$=operand$+","+register$(0,function%) IF bit_eight%=0 mnemonic$="DIVU" ELSE mnemonic$="DIVS" ENDIF ELSE IF bit_eight%=1 AND dmode%<2 mnemonic$="SBCD" IF dmode%=0 operand$=register$(0,register%)+","+register$(0,function%) ELSE operand$=register$(4,register%)+","+register$(4,function%) ENDIF ELSE IF dmode%=1 CLR legal! ENDIF assemble_operands mnemonic$="OR"+extend$(size%) IF bit_eight%=0 operand$=operand$+","+register$(0,function%) ELSE operand$=register$(0,function%)+","+operand$ IF dmode%=7 AND register%>1 CLR legal! ENDIF ENDIF ENDIF ENDIF RETURN PROCEDURE 9 .| Glob. Var.: instruction_group%,mnemonic$,size%,bit_eight%,operand$ .| function%,dmode%,register%,legal! .| Felder : register$(),extend$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-2, ' * BEFEHLE DER GRUPPEN 9 UND 13 ' * ------------------------------------------ ' * SUBA : ADDA ' * SUBX : ADDX ' * SUB : ADD IF instruction_group%=9 mnemonic$="SUB" ELSE mnemonic$="ADD" ENDIF isolate_single_bits IF size%=3 IF bit_eight%<>0 DEC size% ENDIF assemble_operands operand$=operand$+","+register$(1,function%) IF bit_eight%=0 mnemonic$=mnemonic$+"A.W" ELSE mnemonic$=mnemonic$+"A.L" ENDIF ELSE IF dmode%<2 AND bit_eight%=1 mnemonic$=mnemonic$+"X"+extend$(size%) IF dmode%=0 operand$=register$(0,register%)+","+register$(0,function%) ELSE operand$=register$(4,register%)+","+register$(4,function%) ENDIF ELSE assemble_operands IF bit_eight%=0 operand$=operand$+","+register$(0,function%) ELSE operand$=register$(0,function%)+","+operand$ IF dmode%=7 AND register%>1 CLR legal! ENDIF ENDIF mnemonic$=mnemonic$+extend$(size%) ENDIF ENDIF RETURN PROCEDURE 10 .| Glob. Var.: instruction%,mnemonic$,hexdump%,pc%,operand$,legal! .| Felder : miscellaneous$(),linea$() .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 10 ' * ------------------------------------------ ' * KEINE. WERDEN MIT DC.W $Axxx (+ evt. LINEA VARIABLE) ÜBERSETZT ' * ' * FALLS ES SICH UM EINEN DER LINEA OPCODES HANDELT, WIRD DER NAME DES ' * OPCODES IN FORM EINES KOMMENTARS AN DEN OPERANDEN ANGEHÄNGT. ' * ' * Zb. DC.W $A000 ; LINEA INIT. ' * ' * DIE WERTE VON $A000 BIS $A00F SIND BEIM ATARI ST DIE LINEA OPCODES IF instruction%<&HA010 mnemonic$=miscellaneous$(4) hexdump%=DPEEK(pc%) operand$="$"+HEX$(hexdump%)+" ; "+linea$(PEEK(pc%+1)) ELSE CLR legal! ENDIF RETURN PROCEDURE 11 .| Glob. Var.: size%,bit_eight%,mnemonic$,operand$,function%,dmode% .| register%,legal! .| Felder : register$(),extend$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 11 ' * ------------------------------------------ ' * CMPA : CMPM ' * EOR : CMP isolate_single_bits IF size%=3 AND bit_eight%=1 mnemonic$="CMPA.L" DEC size% assemble_operands operand$=operand$+","+register$(1,function%) ELSE IF bit_eight%=1 IF dmode%=1 mnemonic$="CMPM"+extend$(size%) operand$=register$(2,register%)+","+register$(2,function%) ELSE IF dmode%=7 AND register%>1 CLR legal! ENDIF mnemonic$="EOR"+extend$(size%) assemble_operands operand$=register$(0,function%)+","+operand$ ENDIF ELSE assemble_operands IF size%<3 mnemonic$="CMP"+extend$(size%) operand$=operand$+","+register$(0,function%) ELSE mnemonic$="CMPA.W" operand$=operand$+","+register$(1,function%) ENDIF ENDIF ENDIF RETURN PROCEDURE 12 .| Glob. Var.: size%,dmode%,legal!,bit_eight%,mnemonic$,operand$,function% .| register%,d_register$ .| Felder : register$(),extend$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 12 ' * ------------------------------------------ ' * MULU : MULS ' * ABCD : EXG ' * AND : isolate_single_bits IF size%=3 IF dmode%=1 CLR legal! ENDIF IF bit_eight%=0 mnemonic$="MULU" ELSE mnemonic$="MULS" ENDIF assemble_operands operand$=operand$+","+register$(0,function%) ELSE IF dmode%<2 AND bit_eight%=1 IF size%=0 mnemonic$="ABCD" IF dmode%=0 operand$=register$(0,register%)+","+register$(0,function%) ELSE operand$=register$(4,register%)+","+register$(4,function%) ENDIF ELSE mnemonic$="EXG" IF size%=1 AND dmode%=0 operand$=register$(0,function%)+","+register$(0,register%) ENDIF IF size%=2 operand$=register$(0,function%)+","+register$(1,register%) ENDIF IF size%<>2 AND dmode%<>0 operand$=register$(1,function%)+","+register$(1,register%) ENDIF ENDIF ELSE IF dmode%=1 CLR legal! ENDIF mnemonic$="AND"+extend$(size%) assemble_operands d_register$="D"+STR$(function%) ! ##### wird nirgens verwendet IF bit_eight%=0 operand$=operand$+","+register$(0,function%) ELSE IF (dmode%=7 AND register%>1) CLR legal! ENDIF operand$=register$(0,function%)+","+operand$ ENDIF ENDIF ENDIF RETURN PROCEDURE 14 .| Glob. Var.: instruction%,shift_direction$,size%,shift%,mnemonic$,counter% .| function%,operand$,register%,dmode%,legal! .| Felder : arithmetic_shift$(),extend$(),register$() .| Ruft auf : isolate_single_bits,assemble_operands .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 14 ' * ------------------------------------------ ' * ASL : ASR : : ' * ROL : ROR : ROXL : ROXR isolate_single_bits IF (instruction% AND 256) DIV 256=1 shift_direction$="L" ELSE shift_direction$="R" ENDIF IF size%=3 shift%=(instruction% AND 1536) DIV 512 ELSE shift%=(instruction% AND 24) DIV 8 ENDIF mnemonic$=arithmetic_shift$(shift%)+shift_direction$+extend$(size%) IF size%<3 counter%=function% IF (instruction% AND 32) DIV 32=0 IF counter%=0 ADD counter%,8 ENDIF operand$="#$"+STR$(counter%) ELSE operand$=register$(0,function%) ENDIF operand$=operand$+","+register$(0,register%) ELSE assemble_operands IF (dmode%=7 AND register%>1) OR dmode%<2 CLR legal! ENDIF ENDIF RETURN PROCEDURE 15 .| Glob. Var.: legal! .| Aufruf in : 68000_disassembler-1, ' * BEFEHLE DER GRUPPE 15 ' * ------------------------------------------ ' * KEINE. WERDEN MIT DC.W $Fxxx ÜBERSETZT. CLR legal! RETURN PROCEDURE assemble_operands .| Glob. Var.: dmode%,operand$,register%,displacement%,pc%,sign$ .| displacement$,d_offset%,reg%,ext%,reg$,ext$,index$,instruction_group% .| pc_memory%,destination!,drel%,legal! .| Felder : register$() .| Ruft auf : immediate_addressing_one .| Aufruf in : 0-1,1-2,4-10,5-2,8-2,9-2,11-3,12-2,14-1 .| assemble_registerlist-1,immediate_addressing_two-1 .| immediate_addressing_three-1, IF dmode%<7 IF dmode%<5 ' * Dn : DATENREGISTER DIREKT ' * An : ADRESSREGISTER DIREKT ' * (An) : ADRESSREGISTER INDIREKT ' * (An)+ : ADRESSREGISTER INDIREKT MIT POSTINKREMENT ' * -(An) : ADRESSREGISTER INDIREKT MIT PREDEKREMENT operand$=register$(dmode%,register%) ELSE IF dmode%=5 ' * d16(An) : ADRESSREGISTER INDIREKT MIT ADRESSDISTANZ displacement%=DPEEK(pc%+2) IF displacement%<>0 sign$="$" IF displacement%>&H7FFF displacement%=&H10000-displacement% sign$="-$" ENDIF displacement$=sign$+HEX$(displacement%) ELSE CLR displacement$ ENDIF operand$=displacement$+register$(2,register%) INC d_offset% ELSE ' * d8(An,Rx.X) : ADRESSREGISTER INDIREKT MIT INDEX + ADRESSDISTANZ reg%=PEEK(pc%+2) ext%=reg% IF (reg% AND 128) DIV 128=1 reg$="A" ELSE reg$="D" ENDIF IF (ext% AND 8) DIV 8=1 ext$=".L" ELSE ext$=".W" ENDIF index$=reg$+STR$((reg% AND 112) DIV 16)+ext$ displacement%=PEEK(pc%+3) IF displacement%<>0 sign$="$" IF displacement%>&H7F displacement%=&H100-displacement% sign$="-$" ENDIF displacement$=sign$+HEX$(displacement%) ELSE CLR displacement$ ENDIF reg%=(PEEK(pc%+1) AND 7) IF instruction_group%=0 reg%=(PEEK(pc_memory%+1) AND 7) ENDIF IF destination! IF instruction_group%>0 AND instruction_group%<4 reg%=((PEEK(pc_memory%) AND 14) DIV 2) ENDIF ENDIF operand$=displacement$+"("+register$(1,reg%)+","+index$+")" INC d_offset% ENDIF ENDIF ELSE IF register%=0 ' * $xxxx : ABSOLUT KURZ operand$="$"+HEX$(DPEEK(pc%+2)) INC d_offset% ENDIF IF register%=1 ' * $xxxxxxxx: ABSOLUT LANG operand$="$"+HEX$(LPEEK(pc%+2)) ADD d_offset%,2 ENDIF IF register%=2 ' * d16(PC) : PROGRAMMZÄHLERRELATIV MIT ADRESSDISTANZ displacement%=DPEEK(pc%+2) IF displacement%>&H7FFF SUB displacement%,&H10000 ENDIF displacement$=HEX$((pc%+2)+displacement%-drel%) operand$="$"+displacement$+"(PC)" INC d_offset% ENDIF IF register%=3 ' * d8(PC,Rx.X) : PROGRAMMZÄHLERRELATIV MIT INDEX + ADRESSDISTANZ reg%=PEEK(pc%+2) ext%=reg% IF (reg% AND 128) DIV 128=1 reg$="A" ELSE reg$="D" ENDIF IF (ext% AND 8) DIV 8=1 ext$=".L" ELSE ext$=".W" ENDIF index$=reg$+STR$((reg% AND 112) DIV 16)+ext$ displacement%=PEEK(pc%+3) IF displacement%>&H7F SUB displacement%,&H100 ENDIF displacement$=HEX$((pc%+2)+displacement%-drel%) operand$="$"+displacement$+"(PC,"+index$+")" INC d_offset% ENDIF IF register%=4 immediate_addressing_one ENDIF IF register%>4 CLR legal! ENDIF ENDIF RETURN PROCEDURE assemble_registerlist .| Glob. Var.: high$,low$,registerlist$,d_registerbyte%,a_registerbyte% .| dmode%,highbyte$,n$,pc%,lowbyte$,i%,first_position%,last_position% .| d_offset%,pc_memory% .| Felder : register$() .| Ruft auf : assemble_operands .| Aufruf in : 4-2, ' * zb. MOVEM.L D0-D7/A0-A6,-(SP) CLR high$,low$,registerlist$ d_registerbyte%=3 a_registerbyte%=2 IF dmode%=4 SWAP d_registerbyte%,a_registerbyte% ENDIF highbyte$=RIGHT$(n$+BIN$(PEEK(pc%+d_registerbyte%)),8) lowbyte$=RIGHT$(n$+BIN$(PEEK(pc%+a_registerbyte%)),8) IF dmode%<>4 FOR i%=8 DOWNTO 1 high$=high$+MID$(highbyte$,i%,1) low$=low$+MID$(lowbyte$,i%,1) NEXT i% SWAP highbyte$,high$ SWAP lowbyte$,low$ ENDIF highbyte$=highbyte$+"0" lowbyte$=lowbyte$+"0" FOR first_position%=0 TO 7 last_position%=first_position% IF MID$(highbyte$,first_position%+1,1)="1" DO INC last_position% EXIT IF MID$(highbyte$,last_position%+1,1)="0" LOOP IF last_position%-first_position%=1 registerlist$=registerlist$+register$(0,first_position%)+"/" ELSE registerlist$=registerlist$+register$(0,first_position%) registerlist$=registerlist$+"-"+register$(0,last_position%-1)+"/" ENDIF first_position%=last_position%-1 ENDIF NEXT first_position% FOR first_position%=0 TO 7 last_position%=first_position% IF MID$(lowbyte$,first_position%+1,1)="1" DO INC last_position% EXIT IF MID$(lowbyte$,last_position%+1,1)="0" LOOP IF last_position%-first_position%=1 registerlist$=registerlist$+register$(1,first_position%)+"/" ELSE registerlist$=registerlist$+register$(1,first_position%) registerlist$=registerlist$+"-"+register$(1,last_position%-1)+"/" ENDIF first_position%=last_position%-1 ENDIF NEXT first_position% registerlist$=LEFT$(registerlist$,LEN(registerlist$)-1) INC d_offset% pc_memory%=pc% ADD pc%,d_offset%*2 assemble_operands SWAP pc%,pc_memory% RETURN PROCEDURE immediate_addressing_one .| Glob. Var.: size%,operand$,pc%,d_offset% .| Aufruf in : assemble_operands-1,immediate_addressing_two-1 .| immediate_addressing_three-1, IF size%=0 ' * #$xx : BYTE-KONSTANTENADRESSIERUNG operand$="#$"+HEX$(PEEK(pc%+3)) ENDIF IF size%=1 OR size%=3 ' * #$xxxx : WORT-KONSTANTENADRESSIERUNG operand$="#$"+HEX$(DPEEK(pc%+2)) ENDIF IF size%=2 ' * #$xxxxxxxx : LANGWORT-KONSTANTENADRESSIERUNG operand$="#$"+HEX$(LPEEK(pc%+2)) INC d_offset% ENDIF INC d_offset% RETURN PROCEDURE immediate_addressing_two .| Glob. Var.: operand_memory$,operand$,pc%,d_offset%,status_register% .| extendflag%,size%,status_register$,legal! .| Ruft auf : immediate_addressing_one,assemble_operands .| Aufruf in : 0-3, ' * #$xx/#$xxxx/#$xxxxxxxx,<EA> : KONSTANTENADRESSIERUNG,<EA> immediate_addressing_one operand_memory$=operand$+"," ADD pc%,d_offset%*2 IF status_register%<>60 assemble_operands operand$=operand_memory$+operand$ ELSE ' * SR/CCR : STATUSREGISTER DIREKT INC extendflag% IF size%=0 status_register$="CCR" ELSE IF legal! status_register$="SR" ENDIF ENDIF operand$=operand_memory$+status_register$ ENDIF RETURN PROCEDURE immediate_addressing_three .| Glob. Var.: operand_memory$,operand$,pc%,d_offset% .| Ruft auf : immediate_addressing_one,assemble_operands .| Aufruf in : 0-4, ' * #$xx/#$xxxx/#$xxxxxxxx,<EA> : KONSTANTENADRESSIERUNG,<EA> immediate_addressing_one operand_memory$=operand$+"," ADD pc%,d_offset%*2 assemble_operands operand$=operand_memory$+operand$ RETURN PROCEDURE isolate_single_bits .| Glob. Var.: function%,instruction%,bit_eight%,size%,dmode%,register% .| Aufruf in : 0-1,4-1,5-1,8-1,9-1,11-1,12-1,14-1, ' * Function% = BIT 11-9 : Bit_eight% = BIT 8 : Size% = BIT 7-6 ' * Dmode% = BIT 5-3 : Register% = BIT 2-0 function%=(instruction% AND 3584) DIV 512 bit_eight%=(instruction% AND 256) DIV 256 size%=(instruction% AND 192) DIV 64 dmode%=(instruction% AND 56) DIV 8 register%=instruction% AND 7 RETURN PROCEDURE initiate_68000_disassembler .| Glob. Var.: dis_init%,index%,dmode%,register% .| Felder : arithmetic_shift$(),extend$(),bittest$(),conditioncode$() .| trap$(),linea$(),miscellaneous$(),gd$(),xb$(),bi$(),register$() .| Aufruf in : 68000_disassembler-1, ' * DIESE ROUTINE WIRD NUR EINMAL BEIM START DURCHGEFÜHRT dis_init%=1 DIM arithmetic_shift$(3),extend$(3),bittest$(3) DIM conditioncode$(15),trap$(15),linea$(15),miscellaneous$(7) DIM gd$(92),xb$(87),bi$(11) DIM register$(4,7) RESTORE 68000_disassembler_data FOR index%=0 TO 3 READ arithmetic_shift$(index%) READ extend$(index%) READ bittest$(index%) NEXT index% FOR index%=0 TO 15 READ conditioncode$(index%) READ trap$(index%) READ linea$(index%) NEXT index% FOR index%=0 TO 11 READ bi$(index%) ! BIOS NEXT index% FOR index%=0 TO 87 READ xb$(index%) ! XBIOS NEXT index% FOR index%=0 TO 92 READ gd$(index%) ! GEMDOS NEXT index% FOR index%=0 TO 7 READ miscellaneous$(index%) NEXT index% FOR dmode%=0 TO 4 FOR register%=0 TO 7 READ register$(dmode%,register%) NEXT register% NEXT dmode% ' 68000_disassembler_data: ' * Arithmetic_shift$() + Extend$() + Bittest$() DATA AS,.B,BTST,LS,.W,BCHG,ROX,.L,BCLR,RO,.W,BSET ' * Conditioncode$() + Trap$() + Linea$() DATA T,,LINE-A Init,F, ; Gemdos,Put Pixel,HI, ; VDI/AES,Get Pixel,LS, DATA Line,CC,,Horizontal Line,CS,,Filled Rectangle,NE,,Filled Polygon DATA EQ,,Bitblt,VC,,Textblt,VS,,Show Mouse,PL,,Hide Cursor,MI, DATA Transform Mouse,GE,,Undraw Sprite,LT, ; Bios,Draw Sprite DATA GT, ; Xbios,Copy Raster Form,LE,,Seedfill ' Bios-Funktionen DATA Getmpb,Bconstat,Bconin,Bconout,Rwabs,Setexc,Tickcal,Getbpb,Bcostat DATA Mediach,Drvmap,Kbshift ' Xbios-Funktionen DATA Initmous,Ssbrk,Physbase,Logbase,Getrez,Setscreen,Setpalette DATA Setcolor,Floprd,Flopwr,Flopfmt,Getdsb,Midiws,Mfpint,Iorec DATA Rsconf,Keytbl,Random,Protobt,Flopver,Scrdmp,Cursconf DATA Settime,Gettime,Bioskeys,Ikbdws,Jdisint,Jenabint DATA Giaccess,Offgibit,Ongibit,Xbtimer,Dosound,Setprt,Kbdvbase DATA Kbrate,Prtblk,Vsync,Supexec,Puntaes,40,Floprate,DMAread,DMAwrite,Bconmap DATA 45,NVMaccess,47,Metainit,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63 DATA Blitmode,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,EsetShift DATA EgetShift,EsetBank,EsetColor,EsetPalette,EgetPalette,EsetGray,EsetSmear ' Gemdos-Funktionen DATA Pterm0,Cconin,Cconout,Cauxin,Cauxout,Cprnout,Crawio,Crawcin DATA Cnecin,Cconws,Cconrs,Cconis,12,13,Dsetdrv,15,Cconos,Cprnos DATA Cauxis,Cauxos,20,21,22,23,24,Dgetdrv,Fsetdta,27,28,29,30,31 DATA Super,33,34,35,36,37,38,39,40,41 DATA Tgetdate,Tsetdate,Tgettime,Tsettime,46,Fgetdta,Sversion DATA Ptermres,50,51,52,53,Dfree,55,56,Dcreate,Ddelete,Dsetpath DATA Fcreate,Fopen,Fclose,Fread,Fwrite,Fdelete,Fseek,Fattrib DATA 68,Fdup,Fforce,Dgetpath,Malloc,Mfree,Mshrink,Pexec DATA Pterm,77,Fsfirst,Fsnext,80,81,82,83,84,85,Frename,Fdatime DATA 88,89,90,91,Flock ' * Miscellaneous$() DATA RESET,NOP,STOP,RTE,DC.W,RTS,TRAPV,RTR ' * Register$(,) DATA D0,D1,D2,D3,D4,D5,D6,D7 DATA A0,A1,A2,A3,A4,A5,A6,SP DATA (A0),(A1),(A2),(A3),(A4),(A5),(A6),(SP) DATA (A0)+,(A1)+,(A2)+,(A3)+,(A4)+,(A5)+,(A6)+,(SP)+ DATA -(A0),-(A1),-(A2),-(A3),-(A4),-(A5),-(A6),-(SP) RETURN ' PROCEDURE init_ram .| Glob. Var.: utis%,zeile%,root.raw%,boot.raw%,locksley%,scsi%,mdisk% .| mtasse%,ihd_err%,ihd_tab%,hh_max%,flp_err%,flp_tab%,default%,mes_adr% .| scsi_komm%,com_blk%,flo_com%,vdi_par%,z_buf%,fdc1%,fdc2%,fdc3% .| trk_len_max%,buf_size%,init_mem%,buf%,ver$,undo_buf%,ak%,buf2% .| fat_size%,fatbuf% .| Felder : inl_tab%(),inl_dat%(),w_titel%() .| Ruft auf : alrt,clear_buf .| Aufruf in : HAUPTPROGRAMM-1, ' ## INLINE: ' $0000: 3c 2f 00 04 28 6f 00 06 2a 6f 00 0a 28 2f 00 0e ' $0010: 2a 2f 00 12 30 06 c0 bc 00 00 ff 00 ee 80 47 fa ' $0020: 00 0e 30 33 00 fe 47 fa ff d8 4e f3 00 00 00 4a ' $0030: 01 32 01 5a 01 78 01 a0 01 ae 01 32 01 f2 2f 08 ' $0040: 3f 3c 00 26 4e 4e 5c 8f 4e 75 cc 7c 00 ff 30 06 ' $0050: 41 fa 00 de 30 86 d0 3c 00 41 41 fa 00 d0 10 80 ' $0060: 41 fa 00 18 61 d8 42 67 48 7a 00 c2 3f 3c 00 4e ' $0070: 4e 41 50 8f 41 fa 00 36 60 c4 41 fa 00 56 20 b8 ' $0080: 04 72 41 fa 00 70 20 b8 04 7e 41 fa 00 88 20 b8 ' $0090: 04 76 41 fa 00 42 21 c8 04 72 41 fa 00 5c 21 c8 ' $00a0: 04 7e 41 fa 00 74 21 c8 04 76 4e 75 41 fa 00 28 ' $00b0: b1 f8 04 72 66 12 21 fa 00 1a 04 72 21 fa 00 36 ' $00c0: 04 7e 21 fa 00 50 04 76 4e 75 58 42 52 41 43 42 ' $00d0: 53 44 00 01 e3 42 30 3a 00 58 b0 6f 00 04 66 06 ' $00e0: 61 ca 70 00 4e 75 20 7a ff ea 4e d0 58 42 52 41 ' $00f0: 43 42 53 44 00 01 e4 02 30 3a 00 36 b0 6f 00 04 ' $0100: 66 04 70 02 4e 75 20 7a ff ec 4e d0 58 42 52 41 ' $0110: 43 42 53 44 00 06 72 80 30 3a 00 16 b0 6f 00 0e ' $0120: 66 04 70 f2 4e 75 20 7a ff ec 4e d0 48 3a 5c 00 ' $0130: 00 07 70 00 72 00 74 00 bc 7c 02 00 67 02 74 01 ' $0140: 32 1c e0 59 4a 42 66 06 4a 41 66 08 60 04 b2 84 ' $0150: 6b 02 52 80 bb cc 6a e8 4e 75 20 0d 74 07 cc 7c ' $0160: 00 ff 67 0a 05 f4 00 00 51 c8 ff fa 4e 75 05 b4 ' $0170: 00 00 51 c8 ff fa 4e 75 20 4c 20 0d 34 04 16 18 ' $0180: e1 4b b7 42 72 07 36 02 d4 42 c6 7c 80 00 67 04 ' $0190: 0a 42 10 21 51 c9 ff f0 53 80 66 e2 30 02 4e 75 ' $01a0: bb 8c 56 cc ff fc 4a 44 5a c0 48 80 4e 75 41 fa ' $01b0: 00 0e 26 4d 61 00 fe 88 20 3a 00 34 4e 75 41 fa ' $01c0: 00 2e 50 d0 41 fa 00 24 43 f8 00 08 20 91 41 fa ' $01d0: 00 12 22 88 24 4f 16 dc 51 cc ff fc 41 fa 00 10 ' $01e0: 42 90 2e 4a 22 ba 00 04 4e 75 00 0a e9 1a 00 00 ' $01f0: 00 00 41 fa 00 08 26 4d 60 00 fe 44 70 0c 20 4c ' $0200: 12 04 4e 93 28 45 28 c9 28 c0 28 c8 28 ca 4e 75 ' $0210: 00 00 ' 530 Bytes. INLINE utis%,530 ' ## INLINE: ' $0000: 4e 56 00 00 48 e7 ff fc 41 fa 06 36 b1 fa 06 1e ' $0010: 67 18 4b fa 06 18 43 fa 06 40 45 fa 08 3c 47 fa ' $0020: 0a 38 49 fa 0c 34 48 d5 1f 00 2a 6e 00 0a 24 6d ' $0030: 00 00 3a 2e 00 10 34 2e 00 14 41 fa 05 de 30 ae ' $0040: 00 0e 41 fa 05 da 30 2e 00 12 67 46 30 80 30 2e ' $0050: 00 08 b0 7c 00 01 67 00 03 44 26 6d 00 04 28 2d ' $0060: 00 08 41 fa 05 b8 30 2e 00 16 30 80 6a 00 04 16 ' $0070: 53 42 66 04 61 24 60 1a 2f 02 61 1e 24 1f da 6d ' $0080: 00 0e 50 44 50 44 45 ea 00 10 47 eb 00 10 51 ca ' $0090: ff e8 4c df 3f ff 4e 5e 4e 75 41 fa 05 7c 30 ba ' $00a0: 05 7a 49 fa 05 b4 61 00 03 4a 38 fc 00 20 61 00 ' $00b0: 03 aa 38 fc 00 20 61 6c 61 00 04 9c 61 00 00 8a ' $00c0: 61 00 00 ea 30 3a 05 46 6b 58 61 00 02 36 49 fa ' $00d0: 05 40 3c 1c 30 06 43 fa 05 46 b0 51 6a 2c 61 34 ' $00e0: 32 1c b2 51 6b 02 32 11 92 46 61 00 02 3e 3c 1c ' $00f0: 30 06 43 fa 05 2a b0 51 6a 10 61 18 32 1c b2 51 ' $0100: 6b 02 32 11 92 46 61 00 02 22 61 00 01 fa 70 00 ' $0110: 60 00 02 50 c0 ed 00 10 d0 7a 05 00 41 fa 04 fa ' $0120: 30 80 4e 75 20 4a 74 0f 70 00 10 18 61 08 38 c0 ' $0130: 51 ca ff f8 4e 75 b0 6d 00 12 6b 08 b0 6d 00 14 ' $0140: 67 04 6b 02 70 20 4e 75 70 07 72 ff 43 fa 04 be ' $0150: 32 81 72 00 20 4b 01 18 66 0a 52 41 b2 7c 00 10 ' $0160: 66 f4 60 14 32 81 43 fa 04 a6 52 41 b2 7c 00 10 ' $0170: 67 04 01 18 66 f4 32 81 43 fa 04 96 32 3a 04 8e ' $0180: 30 01 d2 41 d2 40 d2 7c 00 09 32 c1 32 3a 04 80 ' $0190: 30 01 d2 41 d2 40 50 41 32 c1 70 3a 32 00 d0 7a ' $01a0: 04 6c 32 c0 d2 7a 04 68 32 c1 4e 75 10 3a 04 2e ' $01b0: 6a 0a 72 4a 61 00 01 04 60 00 01 1c 48 e7 e0 38 ' $01c0: 49 fa 04 6a 47 fa 04 5e 26 ac 00 04 47 fa 04 2e ' $01d0: 45 fa 04 0a 72 3a 61 00 00 e2 34 01 67 64 72 00 ' $01e0: 12 1a 6b 36 48 e7 e0 38 61 00 00 ec 4c df 1c 07 ' $01f0: d3 ac 00 04 d3 ac 00 04 94 41 6f 00 00 aa c2 ed ' $0200: 00 10 41 fa 04 14 d3 50 70 00 10 1b 48 e7 e0 38 ' $0210: 61 00 01 50 4c df 1c 07 60 c4 4a 42 6f 24 32 02 ' $0220: 48 e7 e0 38 61 00 00 b0 4c df 1c 07 d3 ac 00 04 ' $0230: d3 ac 00 04 94 41 6b 6e c2 ed 00 10 41 fa 03 da ' $0240: d3 50 70 00 61 00 01 1c 45 fa 03 d4 04 52 00 3a ' $0250: 72 10 61 66 06 52 00 3a 34 01 67 50 47 fa 03 9e ' $0260: 45 fa 03 8a 72 00 12 1a 6b 34 67 20 48 e7 e0 38 ' $0270: 61 64 4c df 1c 07 d3 ac 00 04 d3 ac 00 04 94 41 ' $0280: 6f 24 c2 ed 00 10 41 fa 03 90 d3 50 70 00 10 1b ' $0290: 48 e7 e0 38 61 00 00 cc 4c df 1c 07 60 c6 4a 42 ' $02a0: 6f 04 32 02 61 30 70 00 61 00 00 b8 47 fa 03 76 ' $02b0: 29 53 00 04 4c df 1c 07 4e 75 48 e7 a0 00 34 01 ' $02c0: 72 00 30 3a 03 5a 6f 08 32 02 b2 40 65 02 32 00 ' $02d0: 4c df 00 05 4e 75 41 fa 03 68 20 fc 00 08 00 01 ' $02e0: 70 00 30 c0 30 c1 20 c0 30 ad 00 0c 41 fa 05 6a ' $02f0: 30 fa 03 26 30 85 43 fa 03 34 22 09 70 73 4e 42 ' $0300: 4e 75 70 03 60 02 70 01 41 fa 03 36 30 fc 00 20 ' $0310: 42 50 31 7c 00 01 00 04 31 6d 00 0c 00 0a 41 fa ' $0320: 03 0c 20 68 00 04 30 80 60 cc c2 ed 00 10 d2 7a ' $0330: 02 e8 53 41 30 05 90 6d 00 0e 52 40 41 fa 03 02 ' $0340: 20 fc 00 72 00 02 74 00 20 c2 30 c2 31 6d 00 0c ' $0350: 00 02 41 fa 05 04 30 fa 02 c0 30 c0 30 c1 30 c5 ' $0360: 60 94 41 fa 02 dc 30 fc 00 6a 74 00 20 c2 20 fc ' $0370: 00 01 00 01 31 6d 00 0c 00 02 41 fa 02 ac 20 ba ' $0380: 02 b0 41 fa 0a d4 30 80 43 fa 02 a6 22 88 61 00 ' $0390: ff 66 43 fa 02 9c 22 ba 02 90 4e 75 43 fa 02 ba ' $03a0: 41 fa 02 76 30 ba 02 74 32 3a 02 74 34 01 53 42 ' $03b0: 70 00 10 1a 32 c0 51 ca ff fa 61 00 ff 1a 30 2e ' $03c0: 00 14 67 2a b0 7a 02 58 6a 24 61 00 ff 36 30 2e ' $03d0: 00 14 53 40 61 00 fd 3e 32 2e 00 16 61 00 fe dc ' $03e0: 92 6e 00 14 52 41 61 00 ff 42 61 00 ff 1a 60 00 ' $03f0: fc a2 4a 6d 00 16 66 2a 72 07 48 e7 08 80 41 fa ' $0400: 01 cc d2 41 24 04 e8 8c c4 7c 00 0f 14 30 20 00 ' $0410: 39 82 10 00 55 41 6a ec 4c df 01 10 49 ec 00 10 ' $0420: 4e 75 24 04 88 fc 27 10 20 3c 00 00 03 e8 61 0e ' $0430: 48 44 20 3c 00 00 03 e8 61 04 28 02 4e 75 32 04 ' $0440: 48 c1 82 c0 06 01 00 30 19 41 00 01 49 ec 00 02 ' $0450: 48 41 80 fc 00 0a 66 e8 4e 75 74 0f 20 4a 10 18 ' $0460: 72 00 12 00 e8 49 43 fa 01 64 12 31 10 00 38 c1 ' $0470: c0 7c 00 0f 10 31 00 00 38 c0 70 20 38 c0 51 ca ' $0480: ff de 4e 75 30 3a 01 96 32 00 c0 fc 00 03 d0 7c ' $0490: 00 09 b0 7a 01 8a 6a 00 00 a6 c0 ed 00 10 d0 7a ' $04a0: 01 7a 41 fa 01 74 30 80 20 4a d0 c1 3f 01 49 fa ' $04b0: 01 a8 61 aa 32 17 10 33 10 00 c0 7c 00 7f 61 00 ' $04c0: fe a2 32 17 61 00 00 82 61 00 fe 0c 32 1f 4a 33 ' $04d0: 10 00 6a 12 3f 01 61 00 fe 2a 32 1f 61 6a 61 00 ' $04e0: fe 4a 61 00 fe 22 49 fa 01 70 30 3a 01 30 32 00 ' $04f0: d0 7c 00 3a b0 7a 01 28 6a 44 c0 ed 00 10 d0 7a ' $0500: 01 1a 41 fa 01 14 30 80 70 00 10 32 10 00 61 00 ' $0510: fc 26 38 80 3f 01 10 33 10 00 c0 7c 00 7f 61 00 ' $0520: fe 42 72 01 61 00 fd b0 32 1f 4a 33 10 00 6a 0e ' $0530: 61 00 fd d0 72 01 61 00 fd f2 61 00 fd ca 70 00 ' $0540: 61 00 fe 20 60 00 fb 4c 92 7a 00 d4 b2 7c 00 02 ' $0550: 6a 02 72 02 4e 75 48 e7 f0 e0 70 ff 72 ff 74 ff ' $0560: 76 ff 41 fa 00 78 48 d0 00 0f 43 fa 00 90 48 d1 ' $0570: 00 0f 45 fa 00 78 48 d2 00 0f 72 00 52 40 b0 7c ' $0580: 00 10 67 1a 14 33 00 00 c4 3c 00 7f b2 02 67 ec ' $0590: 14 c0 10 80 d1 10 d1 18 12 c2 12 02 60 de 72 00 ' $05a0: 41 fa 00 3a 61 1a 72 00 41 fa 00 42 61 12 41 fa ' $05b0: 00 2c 4a 10 6b 04 06 10 00 09 4c df 07 0f 4e 75 ' $05c0: 10 10 6b fa 90 01 12 10 10 c0 60 f4 30 31 32 33 ' $05d0: 34 35 36 37 38 39 41 42 43 44 45 46 ff ff ff ff ' $05e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ' $05f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ' $0600: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 09 ' $0610: 00 06 00 23 00 39 00 43 02 78 02 78 ff ff 00 4f ' $0620: ff ff ff ff 00 00 00 00 00 14 f1 b0 00 10 b9 20 ' $0630: 00 10 b9 38 00 10 bb 38 00 10 bd 38 00 10 bf 38 ' $0640: 00 08 00 01 00 00 00 4f 00 00 00 00 00 06 00 00 ' $0650: 00 00 00 00 00 00 00 00 00 20 00 20 00 20 00 20 ' $0660: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $0670: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $0680: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $0690: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06a0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06b0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06c0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06d0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06e0: 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 ' $06f0: 00 20 00 20 00 00 00 00 00 00 00 00 00 00 00 00 ' $0700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0730: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $07f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0810: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0830: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0850: 00 00 00 00 00 00 00 00 02 78 03 a7 04 a7 00 47 ' $0860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0890: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $08f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0950: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0960: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $09f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a50: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 ' $0a60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0aa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ab0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ac0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ad0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ba0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0bb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0bc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0bd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0be0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ca0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0cb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0cc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0cf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0d90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0da0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0db0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0dc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0dd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0df0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0e90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ea0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0eb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ec0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $1060: 00 00 00 00 00 00 00 00 ' 4200 Bytes. INLINE zeile%,4200 ' ## INLINE: ' $0000: 42 78 04 46 48 79 00 0b ff ff 4e 4d 58 4f 08 00 ' $0010: 00 03 66 22 41 fa 01 b0 74 01 70 03 72 81 c3 10 ' $0020: b2 10 67 26 41 e8 00 0c 51 c8 ff f4 41 fa 01 28 ' $0030: 70 07 51 ca ff e8 20 78 04 f2 20 28 00 18 b0 7c ' $0040: 19 87 64 04 3e 3c 00 e0 4e 75 7a 01 2c 28 00 04 ' $0050: 49 fa 01 ae 47 fa 00 1c 4e 93 66 da 20 4c 32 3c ' $0060: 00 ff 70 00 d0 58 51 c9 ff fc b0 7c 12 34 66 c6 ' $0070: 4e d4 b6 bc 44 4d 41 72 66 1c 48 e7 00 60 3f 04 ' $0080: 2f 0c 3f 05 2f 06 3f 3c 00 2a 4e 4e 4f ef 00 0e ' $0090: 4c df 06 00 60 78 50 f8 04 3e 20 38 04 ba 54 80 ' $00a0: b0 b8 04 ba 64 fa 3c 7c 86 06 20 0c 1d 40 00 07 ' $00b0: e0 98 1d 40 00 05 e0 98 1d 40 00 03 3a 7c 86 04 ' $00c0: 3c bc 01 98 3c bc 00 98 3a 85 3c bc 00 88 70 00 ' $00d0: 10 07 80 3c 00 08 61 3a 48 46 10 06 61 34 e1 9e ' $00e0: 10 06 61 2e e1 9e 10 06 61 28 10 05 61 24 70 0a ' $00f0: 2a 80 32 3c 01 90 61 24 3c bc 00 8a 30 15 c0 7c ' $0100: 00 ff 67 02 70 ff 3c bc 00 80 51 f8 04 3e 4a 00 ' $0110: 4e 75 48 40 30 3c 00 8a 2a 80 72 0a d2 b8 04 ba ' $0120: 08 38 00 05 fa 01 67 e8 b2 b8 04 ba 66 f2 58 4f ' $0130: 60 d2 72 0a d2 b8 04 ba 08 38 00 05 fa 01 67 ee ' $0140: b2 b8 04 ba 66 f2 58 4f 60 d8 00 00 00 8a 00 00 ' $0150: 00 8a 00 00 00 8a 00 01 00 8a 00 00 00 00 00 00 ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01b0: 00 00 00 00 00 00 02 64 04 ff 02 65 02 65 04 02 ' $01c0: 01 11 00 00 a2 90 81 47 45 4d 00 00 00 01 00 00 ' $01d0: 18 00 01 47 45 4d 00 00 18 01 00 00 40 00 01 47 ' $01e0: 45 4d 00 00 58 01 00 00 18 00 01 47 45 4d 00 00 ' $01f0: 70 01 00 00 12 90 00 00 00 00 00 00 00 00 d4 d3 ' 512 Bytes. INLINE root.raw%,512 ' ## INLINE: ' $0000: e9 00 53 45 44 00 60 18 00 00 00 00 02 02 01 00 ' $0010: 02 00 01 00 28 f8 15 00 11 00 04 00 00 00 00 00 ' $0020: 70 ff 2f 00 3f 3c 00 48 4e 41 41 fa 01 8e 20 80 ' $0030: 2f 00 3f 3c 00 48 4e 41 4f ef 00 0c 4a 80 67 00 ' $0040: 00 ae 24 40 28 4a d9 fa 01 72 98 fc 08 00 41 fa ' $0050: 01 69 10 3a ff b8 e2 08 10 80 10 3a ff b6 e0 58 ' $0060: 10 3a ff af 41 fa 01 60 30 80 70 00 30 3a ff a0 ' $0070: e0 58 c0 fa 01 44 d0 86 41 fa 01 48 20 80 2c 00 ' $0080: 70 00 30 3a ff 92 e0 58 c0 fa 01 2e dc 80 dc 80 ' $0090: 70 00 30 3a 01 32 e8 80 d0 86 41 fa 01 2e 20 80 ' $00a0: 7a 01 4e 93 52 86 20 4c 72 0f 70 0a 1a 30 00 00 ' $00b0: ba 3b 00 3e 66 1e 51 c8 ff f4 20 28 00 1c e0 58 ' $00c0: 48 40 e0 58 24 0c 94 8a b4 80 6b 1a 34 28 00 1a ' $00d0: e0 5a 60 28 d0 fc 00 20 43 fa 00 ec 53 51 67 0e ' $00e0: 51 c9 ff c8 60 ba 3f 3c 00 49 4e 41 5c 8f 4e 75 ' $00f0: 43 42 48 44 20 20 20 20 53 59 53 00 41 fa 00 ca ' $0100: 30 82 20 0a 2f 00 41 fa 00 b6 70 ff 20 80 7c 00 ' $0110: 3c 3a 00 b6 55 86 7a 00 1a 3a fe f3 ca fa 00 9a ' $0120: cc c5 dc ba 00 a6 c5 4c 4e 93 66 ba c5 4c 30 3c ' $0130: 02 00 c0 c5 d4 c0 7c 00 3c 3a 00 8e e0 4e dc ba ' $0140: 00 82 bc ba 00 7a 67 0c 7a 01 41 fa 00 72 20 86 ' $0150: 4e 93 66 92 34 3a 00 72 c4 7c 00 ff d4 42 48 c2 ' $0160: 34 34 20 00 e0 5a 67 08 41 fa 00 5e 30 82 6a 9e ' $0170: 24 57 20 4a 0c 58 60 1a 66 00 ff 6c 58 8f 43 ea ' $0180: 00 1c d3 d8 d3 d8 d3 e8 00 04 4a 91 67 20 41 ea ' $0190: 00 1c 22 08 70 00 d1 d9 d3 90 10 19 67 10 b0 3c ' $01a0: 00 01 66 06 d0 fc 00 fe 60 f0 d0 c0 60 ea 31 fa ' $01b0: fe 6e 04 82 4e ea 00 20 00 00 00 00 00 00 00 00 ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 512 Bytes. INLINE boot.raw%,512 ' ## INLINE: ' $0000: 4e 56 ff fa 20 2e 00 08 66 70 41 fa 00 42 20 ee ' $0010: 00 0c 20 ee 00 10 20 ae 00 14 48 7a 00 0e 3f 3c ' $0020: 00 26 4e 4e 5c 8f 4e 5e 4e 75 43 fa 00 20 51 d1 ' $0030: 20 38 00 10 22 0f 41 fa 00 0c 21 c8 00 10 4e 7a ' $0040: 00 02 50 d1 2e 41 21 c0 00 10 4e 75 ff 00 00 02 ' $0050: 00 00 00 00 e2 5c 00 00 00 00 2f 00 30 3a ff ee ' $0060: 67 14 40 e7 00 7c 07 00 4e 7a 00 02 80 7c 08 08 ' $0070: 4e 7b 00 02 46 df 20 1f 4e 75 48 e7 7f fc 2a 40 ' $0080: 42 a7 3f 3c 00 20 4e 41 5c 8f 2f 00 50 f8 04 3e ' $0090: 3e 2d 00 20 51 47 6b 08 67 52 53 47 67 5e 60 3e ' $00a0: 4a 6d 00 20 66 04 61 68 60 20 61 00 00 84 3c 2d ' $00b0: 00 00 70 00 3b 40 00 1e 3b 40 00 1c 2d 40 ff fc ' $00c0: 3d 40 ff fa 61 00 00 a4 61 90 42 78 04 3e 3f 3c ' $00d0: 00 20 4e 41 5c 8f 4c df 3f fe 60 00 ff 4a 31 fc ' $00e0: 00 90 86 06 3b 78 86 06 00 24 60 de 31 ed 00 22 ' $00f0: 86 06 61 00 01 5a 3b 47 00 24 60 ee 3e 2d 00 24 ' $0100: ce 7c 00 ff 31 ed 00 22 86 06 61 00 01 3a 60 da ' $0110: 31 fc 00 80 86 06 2e 3c 00 00 07 d0 de b8 04 ba ' $0120: be b8 04 ba 6b 0a 30 38 86 04 08 00 00 07 66 f0 ' $0130: 3e 2d 00 20 0a 07 00 07 ce 3c 00 07 40 e7 00 7c ' $0140: 07 00 11 fc 00 0e 88 00 10 38 88 00 c0 3c 00 f8 ' $0150: 8e 00 11 c7 88 02 46 df 4e 75 31 fc 00 86 86 06 ' $0160: 3e 2d 00 02 61 00 00 e0 60 68 3e 06 3a 06 08 06 ' $0170: 00 07 66 0c cc 3c 00 f0 bc 3c 00 10 67 dc 66 e8 ' $0180: 08 06 00 06 66 08 08 06 00 05 67 28 66 5a e8 4e ' $0190: 9c 3c 00 0c 67 00 01 74 55 06 67 48 9c 3c 00 01 ' $01a0: 67 64 61 00 00 a2 32 3c 00 fa 4a 38 fa 01 51 c9 ' $01b0: ff fa 4e 75 61 5a 08 05 00 04 66 0a 42 6d 00 1e ' $01c0: 7e 01 61 00 00 82 31 fc 00 84 86 06 3e 2d 00 04 ' $01d0: 61 74 31 fc 00 80 86 06 3e 05 61 6a 61 00 00 ec ' $01e0: 60 00 00 b8 61 2a 60 ea 61 42 08 05 00 04 66 08 ' $01f0: 42 6d 00 1e 7e 01 61 4e 31 fc 01 84 86 06 3e 2d ' $0200: 00 04 61 42 60 02 61 24 31 fc 01 80 86 06 60 c8 ' $0210: 50 ee ff fa 61 00 02 74 61 06 61 00 00 9a 60 24 ' $0220: 2e 2d 00 08 61 4e 50 ed 00 1e 4e 75 61 00 02 90 ' $0230: 61 ee 36 3c 01 90 31 c3 86 06 31 fc 00 90 86 06 ' $0240: 31 c3 86 06 7e 1f 61 0c 31 c7 86 04 60 06 61 04 ' $0250: 3e 38 86 04 2f 01 72 19 61 00 ff 50 22 1f 4e 75 ' $0260: 70 00 10 38 86 09 e1 88 10 38 86 0b e1 88 10 38 ' $0270: 86 0d 4e 75 2b 47 00 14 11 c7 86 0d 11 ed 00 16 ' $0280: 86 0b 11 ed 00 15 86 09 2e 2d 00 14 70 00 30 2d ' $0290: 00 06 de 80 2b 47 00 18 4e 75 31 c3 86 06 3b 78 ' $02a0: 86 06 00 12 61 ba 2b 40 00 18 90 ad 00 14 3b 40 ' $02b0: 00 06 60 00 01 ea 36 3c 00 90 31 c3 86 06 31 fc ' $02c0: 01 90 86 06 31 c3 86 06 4e 75 2e 3c 00 00 01 90 ' $02d0: de b8 04 ba 08 38 00 05 fa 01 67 16 be b8 04 ba ' $02e0: 67 10 4a 6d 00 1e 67 ec 61 00 ff 76 90 ad 00 18 ' $02f0: 6b e2 42 6d 00 1e 3b 78 86 04 00 10 1e 3c 00 d0 ' $0300: 60 00 fe a0 50 ed 00 1c 60 e8 42 6d 00 1e 50 ee ' $0310: ff fa 61 00 01 76 2e 2d 00 08 61 00 ff 58 61 96 ' $0320: 7e 01 61 00 ff 22 48 e7 7f fe 61 00 fd 2e 3f 3c ' $0330: 00 22 4e 4e 54 8f d0 bc 00 00 00 24 41 fa 01 04 ' $0340: 20 80 20 40 4a 10 66 fc 40 e7 00 7c 07 00 4a 10 ' $0350: 67 04 46 df 60 ee 61 00 01 06 41 fa 00 e4 43 fa ' $0360: 00 d2 23 48 00 02 61 00 00 de 41 fa 00 c6 20 3c ' $0370: 00 03 00 04 61 00 00 d6 3f 3c 00 0d 3f 3c 00 1b ' $0380: 4e 4e 58 8f 46 df 4c df 7f fe 26 6d 00 0c 31 fc ' $0390: 00 80 86 06 34 2d 00 06 72 04 61 00 00 de 08 38 ' $03a0: 00 05 fa 01 66 f8 51 c9 ff f2 61 00 00 ce 41 fa ' $03b0: 00 90 42 50 08 38 00 05 fa 01 66 f8 32 10 36 c1 ' $03c0: 42 50 31 c5 86 04 b2 50 6b 12 08 38 00 05 fa 01 ' $03d0: 66 f4 36 f8 86 04 36 d0 51 ca ff e8 48 e7 7f fe ' $03e0: 20 7a 00 60 4a 10 66 fc 40 e7 00 7c 07 00 4a 10 ' $03f0: 67 04 46 df 60 ee 61 4e 3f 3c 00 0d 3f 3c 00 1a ' $0400: 4e 4e 58 8f 61 5e 46 df 4c df 7f fe 61 00 fe ee ' $0410: 72 02 42 5b 3e 3c 00 c0 61 00 fe 2c 08 38 00 05 ' $0420: fa 01 66 f8 42 9b 51 c9 ff ec 61 00 fe d0 60 00 ' $0430: fe 6a 52 79 ff ff ff ff 08 b8 00 05 fa 0f 4e 73 ' $0440: 00 00 00 00 00 00 70 00 30 7c ff ff 48 50 2f 00 ' $0450: 42 67 3f 3c 00 1f 4e 4e 4f ef 00 0c 4e 75 41 fa ' $0460: 00 16 60 04 41 fa 00 12 48 50 42 67 3f 3c 00 19 ' $0470: 4e 4e 50 8f 4e 75 12 00 08 00 3e 3c 00 d4 61 00 ' $0480: fd c6 30 38 86 04 60 00 fd cc 4a 2d 00 08 67 0c ' $0490: 2d 6d 00 08 ff fc 2b 7a fb ba 00 08 4e 75 20 2e ' $04a0: ff fc 67 18 22 40 20 6d 00 08 2b 40 00 08 30 2e ' $04b0: ff fa 67 08 30 2d 00 06 48 c0 61 20 4e 75 4a 2d ' $04c0: 00 08 67 16 43 ee ff fc 20 6d 00 08 22 88 22 7a ' $04d0: fb 82 30 2d 00 06 48 c0 61 02 4e 75 d0 7c 00 10 ' $04e0: e4 48 12 d8 12 d8 12 d8 12 d8 53 80 66 f4 4e 75 ' $04f0: 00 00 00 00 00 00 ' 1270 Bytes. INLINE locksley%,1270 ' ## INLINE: ' $0000: 20 6f 00 04 20 08 66 4a 41 fa 00 ae 20 ef 00 08 ' $0010: 20 ef 00 0c 20 ef 00 10 20 2f 00 14 c0 fc 00 c8 ' $0020: 20 80 48 7a 00 0c 3f 3c 00 26 4e 4e 5c 8f 4e 75 ' $0030: 43 fa 00 84 51 d1 20 38 00 10 22 0f 41 fa 00 0c ' $0040: 21 c8 00 10 4e 7a 00 02 50 d1 2e 41 21 c0 00 10 ' $0050: 4e 75 48 e7 7f 7e 2a 48 42 a7 3f 3c 00 20 4e 41 ' $0060: 5c 8f 2f 00 4e 71 43 fa 05 28 08 2d 00 03 00 05 ' $0070: 67 12 43 fa 00 54 30 3a 00 40 b0 7c 00 02 67 04 ' $0080: 70 f7 60 02 4e 91 28 00 61 10 3f 3c 00 20 4e 41 ' $0090: 5c 8f 20 04 4c df 7e fe 4e 75 10 3a 00 1a 67 14 ' $00a0: 40 e7 00 7c 07 00 4e 7a 00 02 80 7c 08 08 4e 7b ' $00b0: 00 02 46 df 4e 75 ff 00 00 02 00 00 00 00 e2 5c ' $00c0: 00 00 00 00 00 03 a9 80 4e 56 ff e8 08 2d 00 04 ' $00d0: 00 01 67 0a 61 00 04 4e 70 00 60 00 00 b2 32 2d ' $00e0: 00 02 70 00 51 41 03 c0 11 c0 87 81 22 38 04 ba ' $00f0: 06 81 00 00 00 32 11 fc 00 00 87 85 11 fc 00 01 ' $0100: 87 85 b2 b8 04 ba 6b 00 00 84 08 38 00 06 87 83 ' $0110: 67 f0 61 00 03 68 08 38 00 05 87 83 66 d8 14 38 ' $0120: 87 81 b4 00 6e d0 08 38 00 05 87 83 66 c8 11 fc ' $0130: 00 04 87 83 08 38 00 05 87 83 66 ba 61 00 03 3e ' $0140: 32 2d 00 04 51 41 03 c0 11 c0 87 81 11 fc 00 00 ' $0150: 87 87 11 fc 00 0d 87 83 11 fc 00 00 87 85 11 fc ' $0160: 00 00 87 89 11 fc 00 07 87 83 22 38 04 ba d2 bc ' $0170: 00 00 00 32 08 38 00 06 87 89 66 16 b2 b8 04 ba ' $0180: 62 f2 11 fc 00 00 87 83 70 ff 60 02 70 f8 4e 5e ' $0190: 4e 75 11 fc 00 02 87 83 22 6d 00 10 1d 51 ff e8 ' $01a0: 2d 49 ff ee 74 00 14 29 00 01 ea 0a 84 3c 00 80 ' $01b0: 1d 42 ff fe 3d 7c ff fe ff fc 3d 6d 00 06 ff fa ' $01c0: 2d 6d 00 0a ff f2 61 24 61 00 02 c4 6b c0 30 02 ' $01d0: d0 40 43 fa 00 08 d2 fb 00 04 4e d1 01 38 00 58 ' $01e0: 01 d4 01 ee 00 52 00 52 02 92 01 fe 2d 78 04 ba ' $01f0: ff ea 06 ae 00 00 00 c8 ff ea 0c 6d 00 02 00 0e ' $0200: 6a 2a 06 ae 00 00 07 08 ff ea 0c 2e 00 04 ff e8 ' $0210: 66 1a 04 ae 00 00 07 08 ff ea 2f 00 20 3a fe a6 ' $0220: 04 80 00 00 08 98 d1 ae ff ea 20 1f 4e 75 70 fd ' $0230: 60 00 ff 5c 11 fc 00 00 87 15 43 f8 87 01 30 2d ' $0240: 00 06 67 00 03 00 c0 ed 00 08 01 c9 00 08 2d 40 ' $0250: ff f6 20 2d 00 0a 01 c9 00 00 10 38 87 8f 11 c2 ' $0260: 87 87 11 fc 00 00 87 83 11 fc 00 02 87 85 11 fc ' $0270: 00 00 87 8f 11 fc 00 02 87 15 22 38 04 ba d2 bc ' $0280: 00 00 07 d0 b2 b8 04 ba 6b 1a 08 38 00 05 fa 81 ' $0290: 67 08 08 38 00 07 fa 81 67 ea 61 62 67 0e 70 fb ' $02a0: 60 00 fe ec 61 58 70 f8 60 00 fe e4 43 f8 87 01 ' $02b0: 01 49 00 00 b0 ad 00 0a 66 06 70 fa 60 00 fe d0 ' $02c0: 22 2d 00 0a 2b 40 00 0a 90 81 80 ed 00 08 91 6d ' $02d0: 00 06 10 38 87 07 02 40 00 03 67 1e 01 49 00 00 ' $02e0: 22 00 02 40 00 03 02 41 ff fc 22 41 22 38 87 10 ' $02f0: 53 40 e1 99 12 c1 51 c8 ff fa 60 00 fe ca 10 38 ' $0300: 87 15 11 fc 00 00 87 15 11 fc 00 00 87 85 c0 3c ' $0310: 00 80 4e 75 43 f8 87 01 30 2d 00 06 67 00 02 26 ' $0320: c0 ed 00 08 01 c9 00 08 2d 40 ff f6 20 2d 00 0a ' $0330: 01 c9 00 00 11 c2 87 87 10 38 87 8f 11 fc 00 01 ' $0340: 87 83 11 fc 00 02 87 85 11 fc 00 00 87 8b 11 fc ' $0350: 00 01 87 15 11 fc 00 03 87 15 22 38 04 ba d2 bc ' $0360: 00 00 07 d0 b2 b8 04 ba 6b 00 ff 3a 08 38 00 05 ' $0370: fa 81 67 08 08 38 00 07 fa 81 67 e8 61 80 67 06 ' $0380: 70 fb 60 00 fe 0a 43 f8 87 01 01 49 00 00 b0 ad ' $0390: 00 0a 66 06 70 fa 60 00 fd f6 22 2d 00 0a 2b 40 ' $03a0: 00 0a 90 81 80 ed 00 08 91 6d 00 06 60 00 fe 18 ' $03b0: 11 c2 87 87 22 6e ff ee 14 11 52 ae ff ee 53 6d ' $03c0: 00 0e 61 00 00 f6 60 00 fd fe 61 00 01 16 3d 42 ' $03d0: ff fc 61 00 00 f8 60 00 fd ee 61 00 01 06 22 6d ' $03e0: 00 14 12 c2 2b 49 00 14 b4 3c 00 00 67 7a b4 3c ' $03f0: 00 01 67 48 b4 3c 00 08 67 2c b4 3c 00 07 67 26 ' $0400: b4 3c 00 02 67 14 b4 3c 00 03 66 22 2b 6e ff f2 ' $0410: 00 0a 3b 6e ff fa 00 06 60 0c 2d 6d 00 0a ff f2 ' $0420: 3d 6d 00 06 ff fa 61 00 00 a4 60 00 fd 9a 1d 7c ' $0430: 00 07 ff fe 61 00 00 9e 60 00 fd 8c 1d 7c 00 07 ' $0440: ff fe 61 00 00 90 61 00 fd a4 61 42 6b 00 fd 40 ' $0450: b4 3c 00 07 66 00 fd 78 61 00 00 88 22 6d 00 14 ' $0460: 12 c2 2b 49 00 14 60 da 61 62 60 00 00 90 11 c2 ' $0470: 87 87 14 2e ff fe 61 42 60 00 fd 4c 4a 38 fa 01 ' $0480: 4a 38 fa 01 4a 38 fa 01 4a 38 fa 01 4e 75 20 2e ' $0490: ff ea b0 b8 04 ba 6b 1e 10 38 87 89 08 00 00 06 ' $04a0: 67 10 08 00 00 05 67 e6 34 00 e4 4a 02 42 00 07 ' $04b0: 4e 75 70 fc 4e 75 70 f8 4e 75 11 c2 87 81 11 fc ' $04c0: 00 01 87 83 08 f8 00 04 87 83 61 24 11 fc 00 00 ' $04d0: 87 83 4e 75 11 fc 00 12 87 83 11 fc 00 02 87 83 ' $04e0: 4e 75 70 00 10 38 87 81 34 00 08 f8 00 04 87 83 ' $04f0: 10 38 87 89 08 00 00 05 66 f6 4e 75 20 38 04 ba ' $0500: d0 bc 00 00 00 32 b0 b8 04 ba 6b 12 08 38 00 06 ' $0510: 87 89 66 f2 30 2e ff fc 48 c0 60 00 fc 72 70 f9 ' $0520: 60 00 fc 6c 11 fc 00 80 87 83 22 3c 00 00 00 c8 ' $0530: 61 00 02 82 11 fc 00 00 87 83 22 3c 00 00 00 c8 ' $0540: 60 00 02 72 22 6d 00 0a 36 02 11 c2 87 87 08 03 ' $0550: 00 00 66 1e 14 19 61 00 ff 62 61 00 fc 90 61 00 ' $0560: ff 2e 6b 0a 2b 49 00 0a b6 02 67 e8 70 00 60 00 ' $0570: fc 56 61 00 ff 6e 61 00 ff 54 12 c2 2b 49 00 0a ' $0580: 61 00 fc 6a 61 00 ff 08 6b e4 b6 02 67 e4 60 dc ' $0590: 4e 56 ff fc 49 f8 86 04 47 f8 86 06 50 f8 04 3e ' $05a0: 20 6d 00 10 2d 7c ff ff ff fe ff fc 08 2d 00 04 ' $05b0: 00 01 67 12 36 bc 00 8a 30 14 42 ae ff fc 36 bc ' $05c0: 00 80 4a 54 60 68 70 00 30 2d 00 06 66 0c 32 2d ' $05d0: 00 00 c2 7c 00 06 67 02 70 01 61 00 02 72 24 6d ' $05e0: 00 0a 2f 0a 4a 2d 00 0a 67 16 22 7a fa d0 2b 49 ' $05f0: 00 0a 08 2d 00 01 00 01 67 06 30 05 61 00 02 66 ' $0600: 2f 2d 00 0a 61 34 20 6d 00 0a 24 5f 91 ca 22 5f ' $0610: d1 c9 2b 48 00 0a 4a 2d 00 0a 67 12 08 2d 00 02 ' $0620: 00 01 67 0a 4a 40 66 06 30 05 61 00 02 38 42 78 ' $0630: 04 3e 20 2e ff fc 4e 5e 4e 75 7c 00 08 2d 00 00 ' $0640: 00 01 67 1a 7c 03 36 bc 00 98 4e 71 36 bc 01 98 ' $0650: 08 2d 00 01 00 01 66 04 36 bc 00 98 38 85 22 2d ' $0660: 00 0a 61 00 01 d8 20 6d 00 10 1e 10 ce 7c 00 e0 ' $0670: 36 bc 00 88 20 6d 00 10 4a 47 66 0a 30 2d 00 04 ' $0680: eb 40 81 10 60 38 41 fa 01 26 30 2d 00 04 eb 40 ' $0690: 10 80 22 6d 00 10 11 69 00 01 00 01 32 3c 00 8a ' $06a0: 76 06 61 00 01 28 6b 00 00 d0 36 bc 00 8a 70 00 ' $06b0: 30 14 c0 7c 00 ff 08 00 00 01 66 00 00 c0 20 6d ' $06c0: 00 10 70 00 10 10 48 40 61 00 00 d4 82 7c 00 8a ' $06d0: 30 01 28 80 61 00 01 42 6b 00 00 9e 61 00 00 c0 ' $06e0: 82 7c 00 8a 36 2d 00 0e 61 00 00 fc 6b 00 00 8a ' $06f0: 08 2d 00 00 00 01 66 1e 36 bc 01 98 4e 71 36 bc ' $0700: 00 98 4e 71 36 bc 01 98 08 2d 00 01 00 01 66 04 ' $0710: 36 bc 00 98 38 85 61 00 00 86 30 3c 00 8a 80 41 ' $0720: 36 80 70 0a 80 41 32 2d 00 00 c2 7c 00 06 66 04 ' $0730: 08 c0 00 07 28 80 08 2d 00 03 00 01 67 08 61 00 ' $0740: 00 be 6b 34 60 06 61 00 00 c4 6b 2c 61 50 82 7c ' $0750: 00 8a 36 81 70 00 30 14 c0 7c 00 ff 66 1e 08 2d ' $0760: 00 00 00 01 67 16 72 02 61 4a 51 ce ff 04 61 2e ' $0770: 82 7c 00 8a 36 81 60 04 4a 54 70 f8 2d 40 ff fc ' $0780: 36 bc 00 80 4a 54 42 41 12 38 86 09 e1 81 12 38 ' $0790: 86 0b e1 81 12 38 86 0d 2b 41 00 0a 4e 75 72 00 ' $07a0: 08 2d 00 01 00 01 67 04 08 c1 00 08 4e 75 40 00 ' $07b0: 00 00 00 01 d2 b8 04 ba b2 b8 04 ba 66 fa 4e 75 ' $07c0: 42 40 10 10 61 18 6b 02 61 1c 4e 75 61 f2 6b 0c ' $07d0: 10 30 30 ff 48 40 30 01 28 80 61 30 4e 75 48 40 ' $07e0: 30 01 28 80 60 32 48 e7 90 80 53 43 52 48 53 43 ' $07f0: 67 06 10 18 61 e8 6a f6 4c df 01 09 4e 75 48 e7 ' $0800: c0 20 70 00 22 3c 00 03 a9 80 60 14 48 e7 c0 20 ' $0810: 70 00 72 64 e7 41 60 08 48 e7 c0 20 70 00 72 14 ' $0820: d2 b8 04 ba 08 38 00 05 fa 01 67 08 b2 b8 04 ba ' $0830: 66 f2 70 f8 4a 80 4c df 04 03 4e 75 11 c1 86 0d ' $0840: e0 81 11 c1 86 0b e0 81 11 c1 86 09 4e 75 3a 2d ' $0850: 00 08 ca c0 8a fc 02 00 2c 05 48 46 4a 46 67 02 ' $0860: 52 45 4e 75 4a 40 67 fa 48 e7 7f 9e 3f 00 4c da ' $0870: 79 ff 48 d1 79 ff 4c da 79 ff 48 e9 79 ff 00 34 ' $0880: 4c da 79 ff 48 e9 79 ff 00 68 4c da 79 ff 48 e9 ' $0890: 79 ff 00 9c 4c da 79 ff 48 e9 79 ff 00 d0 4c da ' $08a0: 79 ff 48 e9 79 ff 01 04 4c da 79 ff 48 e9 79 ff ' $08b0: 01 38 4c da 79 ff 48 e9 79 ff 01 6c 4c da 79 ff ' $08c0: 48 e9 79 ff 01 a0 4c da 19 ff 48 e9 19 ff 01 d4 ' $08d0: 43 e9 02 00 53 57 66 96 54 4f 4c df 79 fe 4e 75 ' $08e0: 00 00 00 00 00 00 00 00 ' 2280 Bytes. INLINE scsi%,2280 ' ## INLINE: ' $0000: 00 01 00 01 00 01 00 00 00 01 7f f8 ff fc ff fe ' $0010: ff fe ff fe ff fe ff fe ff fe ff fe ff fe ff fe ' $0020: ff fe ff fe ff fe ff fe ff fc 00 00 7f f8 53 e4 ' $0030: 53 a4 53 a4 53 a4 4f c4 40 04 4f e4 50 14 50 14 ' $0040: 50 14 70 14 50 14 7f fc 00 00 ' 74 Bytes. INLINE mdisk%,74 ' ## INLINE: ' $0000: 00 05 00 00 00 01 00 00 00 01 0f 00 0f 80 1f c0 ' $0010: 1f c0 0f 80 0f 80 3f e0 3f f0 3f f8 3f fc 3f fc ' $0020: 3f f8 7f fc ff fc 7f f8 3f f0 04 00 05 00 09 80 ' $0030: 0c 80 05 00 01 00 00 00 1f e0 10 70 10 68 10 68 ' $0040: 10 f0 0f c0 7f f8 3f f0 00 00 ' 74 Bytes. INLINE mtasse%,74 ' ' ## INLINE: ' $0000: 4f 4b 00 4b 65 69 6e 20 49 6e 64 65 78 69 6d 70 ' $0010: 75 6c 73 00 53 75 63 68 65 20 6e 6f 63 68 00 53 ' $0020: 63 68 72 65 69 62 66 65 68 6c 65 72 00 4c 61 75 ' $0030: 66 77 65 72 6b 20 6e 69 63 68 74 20 62 65 72 65 ' $0040: 69 74 00 4c 61 75 66 77 65 72 6b 20 6e 69 63 68 ' $0050: 74 20 73 65 6c 65 6b 74 69 65 72 74 00 53 70 75 ' $0060: 72 20 30 20 6e 69 63 68 74 20 67 65 66 75 6e 64 ' $0070: 65 6e 00 4d 65 68 72 65 72 65 20 4c 61 75 66 77 ' $0080: 65 72 6b 65 20 73 65 6c 65 6b 74 69 65 72 74 00 ' $0090: 00 00 00 00 00 00 00 00 43 52 43 2d 46 65 68 6c ' $00a0: 65 72 20 69 6d 20 41 64 72 65 9e 66 65 6c 64 00 ' $00b0: 55 6e 6b 6f 72 72 69 67 69 65 72 62 61 72 65 72 ' $00c0: 20 44 61 74 65 6e 66 65 68 6c 65 72 00 49 44 2d ' $00d0: 41 64 72 65 9e 6d 61 72 6b 65 20 76 65 72 73 63 ' $00e0: 68 6f 6c 6c 65 6e 00 44 61 74 65 6e 2d 41 64 72 ' $00f0: 65 9e 6d 61 72 6b 65 20 76 65 72 73 63 68 6f 6c ' $0100: 6c 65 6e 00 53 65 6b 74 6f 72 20 6e 69 63 68 74 ' $0110: 20 67 65 66 75 6e 64 65 6e 00 53 70 75 72 20 6e ' $0120: 69 63 68 74 20 67 65 66 75 6e 64 65 6e 00 42 65 ' $0130: 68 6f 62 65 6e 65 72 20 46 65 68 6c 65 72 20 69 ' $0140: 6e 20 44 61 74 61 20 41 4d 00 42 65 68 6f 62 65 ' $0150: 6e 65 72 20 44 61 74 65 6e 66 65 6c 64 2d 46 65 ' $0160: 68 6c 65 72 00 45 43 43 2d 6b 6f 72 72 69 67 69 ' $0170: 65 72 74 65 72 20 44 61 74 65 6e 66 65 6c 64 2d ' $0180: 46 65 68 6c 65 72 00 46 65 68 6c 65 72 20 69 6e ' $0190: 20 44 65 66 65 6b 74 6c 69 73 74 65 2f 45 43 43 ' $01a0: 2d 46 65 68 6c 65 72 20 28 56 65 72 69 66 79 29 ' $01b0: 00 50 61 72 61 6d 65 74 65 72 81 62 65 72 6c 61 ' $01c0: 75 66 20 28 49 6e 74 65 72 6c 65 61 76 65 3f 29 ' $01d0: 00 00 50 6c 61 74 74 65 6e 66 6f 72 6d 61 74 20 ' $01e0: 64 65 66 65 6b 74 2f 6b 65 69 6e 65 20 44 65 66 ' $01f0: 65 6b 74 6c 69 73 74 65 00 00 00 00 55 6e 67 81 ' $0200: 6c 74 69 67 65 72 20 42 65 66 65 68 6c 00 55 6e ' $0210: 67 81 6c 74 69 67 65 20 42 6c 6f 63 6b 61 64 72 ' $0220: 65 73 73 65 00 55 6e 67 81 6c 74 69 67 65 20 46 ' $0230: 75 6e 6b 74 69 6f 6e 00 55 6e 67 81 6c 74 69 67 ' $0240: 65 20 45 6e 64 61 64 72 65 73 73 65 00 50 61 72 ' $0250: 61 6d 65 74 65 72 66 65 68 6c 65 72 00 55 6e 67 ' $0260: 81 6c 74 69 67 65 20 47 65 72 84 74 65 6e 75 6d ' $0270: 6d 65 72 00 55 6e 67 81 6c 74 69 67 65 73 20 50 ' $0280: 61 72 61 6d 65 74 65 72 66 65 6c 64 00 4d 65 64 ' $0290: 69 75 6d 20 73 63 68 72 65 69 62 67 65 73 63 68 ' $02a0: 81 74 7a 74 00 4d 65 64 69 75 6d 20 67 65 77 65 ' $02b0: 63 68 73 65 6c 74 00 52 65 73 65 74 20 73 65 69 ' $02c0: 74 20 6c 65 74 7a 74 65 6d 20 4b 6f 6d 6d 61 6e ' $02d0: 64 6f 00 00 00 46 65 68 6c 65 72 7a 84 68 6c 65 ' $02e0: 72 20 81 62 65 72 67 65 6c 61 75 66 65 6e 00 00 ' $02f0: 00 00 4d 65 64 69 75 6d 20 69 6e 6b 6f 6d 70 61 ' $0300: 74 69 62 65 6c 00 46 6f 72 6d 61 74 69 65 72 66 ' $0310: 65 68 6c 65 72 00 00 4d 65 73 73 61 67 65 2d 46 ' $0320: 65 68 6c 65 72 00 53 43 53 49 2d 48 61 72 64 77 ' $0330: 61 72 65 66 65 68 6c 65 72 00 28 52 65 29 53 65 ' $0340: 6c 65 63 74 2d 46 65 68 6c 65 72 00 46 65 68 6c ' $0350: 65 72 20 62 65 69 20 53 6f 66 74 77 61 72 65 2d ' $0360: 52 65 73 65 74 00 50 61 72 69 74 84 74 73 66 65 ' $0370: 68 6c 65 72 00 49 6e 69 74 69 61 74 6f 72 20 6e ' $0380: 69 63 68 74 20 65 72 6b 61 6e 6e 74 00 4d 65 73 ' $0390: 73 61 67 65 20 75 6e 67 81 6c 74 69 67 00 00 00 ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03d0: 00 00 00 00 53 65 6c 62 73 74 74 65 73 74 2d 46 ' $03e0: 65 68 6c 65 72 00 53 65 6c 62 73 74 74 65 73 74 ' $03f0: 2d 46 65 68 6c 65 72 20 31 00 53 65 6c 62 73 74 ' $0400: 74 65 73 74 2d 46 65 68 6c 65 72 20 32 00 53 65 ' $0410: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 ' $0420: 33 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 68 ' $0430: 6c 65 72 20 34 00 53 65 6c 62 73 74 74 65 73 74 ' $0440: 2d 46 65 68 6c 65 72 20 35 00 53 65 6c 62 73 74 ' $0450: 74 65 73 74 2d 46 65 68 6c 65 72 20 36 00 53 65 ' $0460: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 ' $0470: 37 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 68 ' $0480: 6c 65 72 20 38 00 53 65 6c 62 73 74 74 65 73 74 ' $0490: 2d 46 65 68 6c 65 72 20 39 00 53 65 6c 62 73 74 ' $04a0: 74 65 73 74 2d 46 65 68 6c 65 72 20 31 30 00 53 ' $04b0: 65 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 ' $04c0: 20 31 31 00 53 65 6c 62 73 74 74 65 73 74 2d 46 ' $04d0: 65 68 6c 65 72 20 31 32 00 53 65 6c 62 73 74 74 ' $04e0: 65 73 74 2d 46 65 68 6c 65 72 20 31 33 00 53 65 ' $04f0: 6c 62 73 74 74 65 73 74 2d 46 65 68 6c 65 72 20 ' $0500: 31 34 00 53 65 6c 62 73 74 74 65 73 74 2d 46 65 ' $0510: 68 6c 65 72 20 31 35 00 30 20 42 69 74 73 20 45 ' $0520: 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 31 20 ' $0530: 42 69 74 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 ' $0540: 72 74 00 32 20 42 69 74 73 20 45 43 43 2d 6b 6f ' $0550: 72 72 69 67 69 65 72 74 00 33 20 42 69 74 73 20 ' $0560: 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 34 ' $0570: 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 67 ' $0580: 69 65 72 74 00 35 20 42 69 74 73 20 45 43 43 2d ' $0590: 6b 6f 72 72 69 67 69 65 72 74 00 36 20 42 69 74 ' $05a0: 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 ' $05b0: 00 37 2d 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 ' $05c0: 69 67 69 65 72 74 00 38 20 42 69 74 73 20 45 43 ' $05d0: 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 39 20 42 ' $05e0: 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 ' $05f0: 72 74 00 31 30 20 42 69 74 73 20 45 43 43 2d 6b ' $0600: 6f 72 72 69 67 69 65 72 74 00 31 31 20 42 69 74 ' $0610: 73 20 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 ' $0620: 00 31 32 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 ' $0630: 72 69 67 69 65 72 74 00 31 33 20 42 69 74 73 20 ' $0640: 45 43 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 31 ' $0650: 34 20 42 69 74 73 20 45 43 43 2d 6b 6f 72 72 69 ' $0660: 67 69 65 72 74 00 31 35 20 42 69 74 73 20 45 43 ' $0670: 43 2d 6b 6f 72 72 69 67 69 65 72 74 00 44 61 74 ' $0680: 61 20 43 68 65 63 6b 20 49 6e 20 4e 6f 20 52 65 ' $0690: 74 72 79 20 4d 6f 64 65 00 45 43 43 2d 46 65 68 ' $06a0: 6c 65 72 00 49 6e 74 65 72 6c 65 61 76 65 2d 46 ' $06b0: 65 68 6c 65 72 00 55 6e 67 81 6c 74 69 67 65 73 ' $06c0: 20 46 6f 72 6d 61 74 00 55 6e 67 81 6c 74 69 67 ' $06d0: 65 20 45 6e 64 61 64 72 65 73 73 65 00 50 61 72 ' $06e0: 69 74 84 74 73 66 65 68 6c 65 72 00 4d 4f 44 45 ' $06f0: 2d 53 45 4e 53 45 2d 46 65 68 6c 65 72 00 46 61 ' $0700: 6c 73 63 68 65 72 20 4b 6f 70 66 00 46 61 6c 73 ' $0710: 63 68 65 72 20 5a 79 6c 69 6e 64 65 72 00 44 4d ' $0720: 41 2d 54 69 6d 65 6f 75 74 00 54 69 6d 65 6f 75 ' $0730: 74 20 62 65 69 6d 20 53 63 68 72 65 69 62 65 6e ' $0740: 00 46 65 69 6e 6a 75 73 74 69 65 72 75 6e 67 73 ' $0750: 2d 46 65 68 6c 65 72 00 46 65 68 6c 65 72 7a 84 ' $0760: 68 6c 65 72 20 81 62 65 72 67 65 6c 61 75 66 65 ' $0770: 6e 00 4d 65 64 69 65 6e 77 65 63 68 73 65 6c 20 ' $0780: 61 6e 67 65 66 6f 72 64 65 72 74 00 56 65 72 69 ' $0790: 66 79 2d 46 65 68 6c 65 72 00 2a 00 00 00 ' 1950 Bytes. INLINE ihd_err%,1950 ' ## INLINE: ' $0000: 00 9f 00 00 00 03 00 14 00 1f 00 2d 00 43 00 5d ' $0010: 00 73 00 90 00 91 00 92 00 93 00 94 00 95 00 96 ' $0020: 00 97 00 98 00 b0 00 cd 00 e7 01 04 01 1a 01 2e ' $0030: 01 4a 01 65 01 87 01 b1 01 d1 01 d2 01 f9 01 fa ' $0040: 01 fb 01 fc 02 0e 02 25 02 38 02 4d 02 5d 02 74 ' $0050: 02 8d 02 a5 02 b7 02 d3 02 d4 02 d5 02 ef 02 f0 ' $0060: 02 f1 02 f2 03 06 03 16 03 17 03 26 03 3a 03 4c ' $0070: 03 66 03 75 03 8d 03 9e 03 9f 03 a0 03 a1 03 a2 ' $0080: 03 a3 03 a4 03 a5 03 a6 03 a7 03 a8 03 a9 03 aa ' $0090: 03 ab 03 ac 03 ad 03 ae 03 af 03 b0 03 b1 03 b2 ' $00a0: 03 b3 03 b4 03 b5 03 b6 03 b7 03 b8 03 b9 03 ba ' $00b0: 03 bb 03 bc 03 bd 03 be 03 bf 03 c0 03 c1 03 c2 ' $00c0: 03 c3 03 c4 03 c5 03 c6 03 c7 03 c8 03 c9 03 ca ' $00d0: 03 cb 03 cc 03 cd 03 ce 03 cf 03 d0 03 d1 03 d2 ' $00e0: 03 d3 03 d4 03 e6 03 fa 04 0e 04 22 04 36 04 4a ' $00f0: 04 5e 04 72 04 86 04 9a 04 af 04 c4 04 d9 04 ee ' $0100: 05 03 05 18 05 2e 05 43 05 59 05 6f 05 85 05 9b ' $0110: 05 b1 05 c7 05 dd 05 f3 06 0a 06 21 06 38 06 4f ' $0120: 06 66 06 7d 06 99 06 a4 06 b6 06 c8 06 dd 06 ec ' $0130: 06 fe 07 0c 07 1e 07 2a 07 41 07 58 07 72 07 8c ' $0140: 07 9a 07 9c 00 00 00 00 00 00 ' 330 Bytes. INLINE ihd_tab%,330 hh_max%=CARD{ihd_tab%} ' inl_tab%(0)=ihd_tab% ! Index 0 = Platten-Fehler inl_dat%(0)=ihd_err% ' ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0150: 00 00 00 00 ' 340 Bytes. INLINE flp_err%,340 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 ' 40 Bytes. INLINE flp_tab%,40 ' inl_tab%(1)=flp_tab% ! Index 1 = Floppy-Fehler inl_dat%(1)=flp_err% ' ' ## INLINE: ' $0000: 31 30 30 0d 0a 36 38 30 0d 0a 31 35 35 37 35 0d ' $0010: 0a 32 30 39 34 34 0d 0a 32 30 30 30 0d 0a 31 0d ' $0020: 0a 30 0d 0a 36 30 30 0d 0a 30 0d 0a 34 0d 0a 30 ' $0030: 0d 0a 31 38 0d 0a 32 0d 0a 32 0d 0a 30 0d 0a 37 ' $0040: 0d 0a 33 0d 0a 33 0d 0a 33 0d 0a 33 0d 0a 33 0d ' $0050: 0a 33 0d 0a 33 0d 0a 33 0d 0a 31 0d 0a 31 0d 0a ' $0060: 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 ' $0070: 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d ' $0080: 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a ' $0090: 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 ' $00a0: 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d 0a 31 0d ' $00b0: 0a 31 0d 0a 31 0d 0a 31 0d 0a 36 78 36 20 73 79 ' $00c0: 73 74 65 6d 20 66 6f 6e 74 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 0d 0a 31 30 0d 0a ' $00e0: 31 35 37 30 30 0d 0a 36 38 30 0d 0a 31 36 33 37 ' $00f0: 35 0d 0a 33 31 38 32 34 0d 0a 31 0d 0a 36 35 0d ' $0100: 0a 38 0d 0a 32 0d 0a 36 30 0d 0a 37 0d 0a 32 0d ' $0110: 0a 37 35 0d 0a 38 0d 0a 32 0d 0a 36 33 0d 0a 37 ' $0120: 0d 0a 32 0d 0a 36 39 0d 0a 38 0d 0a 32 0d 0a 36 ' $0130: 38 0d 0a 38 0d 0a 32 0d 0a 37 37 0d 0a 39 0d 0a ' $0140: 31 0d 0a 36 38 0d 0a 38 0d 0a 31 0d 0a 37 33 0d ' $0150: 0a 38 0d 0a 32 0d 0a 37 33 0d 0a 38 0d 0a 32 0d ' $0160: 0a 31 30 30 0d 0a 31 30 0d 0a 34 0d 0a 36 38 0d ' $0170: 0a 38 0d 0a 32 0d 0a 39 35 0d 0a 31 30 0d 0a 32 ' $0180: 0d 0a 38 38 0d 0a 39 0d 0a 4f 70 65 6e 00 49 6e ' $0190: 73 74 00 49 6e 66 6f 00 45 72 72 00 00 04 00 00 ' $01a0: 00 00 03 00 00 00 00 46 41 54 00 00 43 6c 6f 73 ' $01b0: 65 43 6f 6d 70 00 44 72 69 76 65 44 49 52 00 00 ' $01c0: 52 6f 6f 74 00 4c 69 73 74 00 47 72 61 66 00 0d ' $01d0: 0a 00 4c 69 73 74 00 47 72 61 66 00 0d 0a 0d 0a ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 512 Bytes. INLINE default%,512 ' ! ab hier nur noch Puffer, keine Assemblerroutinen ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 16 Bytes. INLINE mes_adr%,16 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 30 Bytes. INLINE scsi_komm%,30 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 ' 20 Bytes. INLINE com_blk%,20 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 ' 40 Bytes. INLINE flo_com%,40 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 ' 120 Bytes. INLINE vdi_par%,120 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 256 Bytes. INLINE z_buf%,255 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 512 Bytes. INLINE fdc1%,512 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' 512 Bytes. INLINE fdc2%,512 ' ## INLINE: ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $02f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $03f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ' $0410: 00 00 00 00 00 00 00 00 00 00 ' 1050 Bytes. INLINE fdc3%,1050 ' ist wichtig wegen mehr Bytes bei Sektor lesen - max 1024? ' w_titel%(0)=vdi_par%+40 w_titel%(1)=vdi_par%+80 ! Windowtitel trk_len_max%=buf_size% ! für Floppy ' init_mem%=3*buf_size%+512 buf%=MALLOC(init_mem%) ! Speicher resevieren IF buf%=0 ~@alrt(3,ver$+"|Zu wenig Speicher frei! ",1,"Abbruch") EDIT ENDIF ' buf%= ! 16384 Bytes für Sektordaten undo_buf%=buf%+buf_size% ! 16384 UNDO Puffer ak%=undo_buf%+buf_size% ! 16384 Bytes für Statuspuffer buf2%=ak%+buf_size% ! 512 Bytes für Reservepuffer in HARD ' clear_buf(1) fat_size%=64*1024 fatbuf%=MALLOC(fat_size%) ! FAT max.? IF fatbuf%=0 ~@alrt(3,ver$+"|Kein Speicher für FAT!",1,"Abbruch") ~MFREE(buf%) EDIT ENDIF ' RETURN PROCEDURE rsc_variable .| Glob. Var.: eingabe&,ergebnis&,eok&,etext&,drives&,driabb&,l1&,einname& .| einerg&,txtname&,einok&,box&,boxtxt&,boxaktiv&,search&,search1& .| search2&,searchok&,part&,p1n&,p1k&,p1s&,p12n&,p12k&,p12s&,partsli1& .| partsli2&,partok&,partab&,partitel&,prest&,pcbhd&,pvariabl&,psel& .| pselabb&,psmin&,psnummer&,psmax&,pselok&,voreinst&,konfigok& .| vorcurrt&,tabanz&,maxtext&,feed&,feedcode&,dechex&,slider&,dial2pos& .| sammeln&,txtsavm&,sperrtxt&,konfigab&,hardpara&,paraok&,par1&,par2& .| par3&,par4&,par5&,par6&,par7&,par8&,par9&,par10&,hardname&,targerat& .| tgok&,tgabb&,t0&,t15&,geraete&,g0&,g7&,tgwahl&,fat&,fatmin&,fat_nr& .| fatplus&,fwrt&,fatm1&,fatm2&,fatm3&,fatwrite&,fatabb&,einstell&,help& .| help1&,help15&,helpabb&,hlp_load&,datei&,dat1&,dat2&,dat3&,dat4& .| dat5&,dat6&,datramk&,dath1&,dath2&,dath3&,dath4&,dath5&,dath6&,dath7& .| dath8&,datname&,datdat&,dattime&,datsize&,datsegm&,dats1&,dats2& .| dats3&,dats4&,datok&,kleinst&,kleintxt&,klein1&,klein2&,lernen& .| menu1&,ml0&,ml1o&,mendx0&,ml1u&,ml2o&,mendx&,ml2u&,ml3o&,mendx4& .| ml3u&,ml4o&,ml4u&,m1xo&,menu2&,m2xo&,menu3&,m3xo&,menu4&,m4xo& .| desktop&,ground&,buttons&,mod1&,mod2&,mod3&,mod4&,mod5&,mod6& .| modibox&,k1&,k14&,hdcomm&,hdkmblk&,hdkomv1&,hdcm1&,hdcm2&,hdcm3& .| hdcm4&,hdcm5&,hdcm6&,hdcm7&,hdcm8&,hdcm9&,hdcm10&,hdflag0&,hdflag1& .| hdflag2&,hdflag3&,hdcmab&,hdcmok&,hdflag4&,bootdat&,bootwr&,bd1&,bd2& .| bd3&,bd4&,bd5&,bd6&,bd7&,bd8&,bd9&,bp1&,bp2&,bp3&,bp4&,bp5&,bp6&,bp7& .| bdvolume&,bde1&,bde2&,bootget&,fkey&,f1o&,targmask&,tmaskok&,tghdtyp& .| tmask1&,acsiall&,acsino&,tmask8&,scsiall&,scsino&,compare&,comps1& .| comps2&,comps5&,comps6&,compok&,comps3&,comps4&,fontdial&,fontsp& .| fontsm&,fontname&,fontsize&,fonttest&,fontok&,fontmin&,fontabb& .| fontall&,fontwael&,menu5&,m5xo&,steprate&,stepa2&,stepb2&,stepresi& .| stephd&,alrt&,alrti1&,alrti4&,alrti5&,alrtz1&,alrtz5&,alrtb1&,alrtb4& .| alrtohr&,infos&,ramkonv&,dissed&,distempl&,ctrack&,trkd7&,trkd8& .| trkd9&,trkd10&,trkd11&,trkd1&,trkd2&,trkd3&,trkd4&,trkd5&,trkd6& .| trkok&,m.enu1%,m.enu2%,m.enu3%,m.enu4%,m.enu5%,desk.top%,e.ingabe% .| d.rives%,e.inname%,b.ox%,s.earch%,p.art%,p.sel%,v.oreinst%,hard.para% .| t.arget%,f.at%,ein.stell%,h.elp%,d.atei%,k.leinst%,hd.comm%,boot.dat% .| f.key%,targ.mask%,c.ompare%,f.ontdial%,step.rate%,a.lert%,i.nfos% .| ram.konv%,c.track% .| Ruft auf : rsc_gaddr .| Aufruf in : rsc_init-1, ' /* Resource Datei Indizes für SED_564 */ ' eingabe&=0 ergebnis&=1 eok&=2 etext&=5 ' drives&=1 driabb&=1 l1&=3 ' einname&=2 einerg&=1 txtname&=2 einok&=3 ' box&=3 boxtxt&=1 boxaktiv&=3 ' search&=4 search1&=2 search2&=3 searchok&=4 ' part&=5 p1n&=3 p1k&=4 p1s&=5 p12n&=58 p12k&=59 p12s&=60 partsli1&=62 partsli2&=63 partok&=64 partab&=65 partitel&=67 prest&=68 pcbhd&=70 pvariabl&=72 ' psel&=6 pselabb&=1 psmin&=4 psnummer&=5 psmax&=6 pselok&=7 ' voreinst&=7 konfigok&=2 vorcurrt&=4 tabanz&=5 maxtext&=6 feed&=8 feedcode&=10 dechex&=11 slider&=13 dial2pos&=15 sammeln&=17 txtsavm&=19 sperrtxt&=21 konfigab&=24 ' hardpara&=8 paraok&=1 par1&=4 par2&=5 par3&=6 par4&=7 par5&=8 par6&=9 par7&=10 par8&=11 par9&=12 par10&=13 hardname&=15 ' targerat&=9 tgok&=1 tgabb&=2 t0&=5 t15&=20 geraete&=23 g0&=33 g7&=40 tgwahl&=41 ' fat&=10 fatmin&=3 fat_nr&=4 fatplus&=5 fwrt&=6 fatm1&=7 fatm2&=8 fatm3&=9 fatwrite&=10 fatabb&=11 ' einstell&=11 ' help&=12 help1&=3 help15&=17 helpabb&=18 hlp_load&=19 ' datei&=13 dat1&=4 dat2&=5 dat3&=6 dat4&=7 dat5&=8 dat6&=9 datramk&=16 dath1&=18 dath2&=19 dath3&=20 dath4&=21 dath5&=22 dath6&=23 dath7&=24 dath8&=25 datname&=36 datdat&=37 dattime&=38 datsize&=40 datsegm&=41 dats1&=43 dats2&=44 dats3&=45 dats4&=46 datok&=47 ' kleinst&=14 kleintxt&=2 klein1&=4 klein2&=6 lernen&=7 ' menu1&=15 ml0&=13 ml1o&=22 mendx0&=30 ml1u&=34 ml2o&=36 mendx&=41 ml2u&=50 ml3o&=52 mendx4&=53 ml3u&=57 ml4o&=59 ml4u&=63 m1xo&=65 ' menu2&=16 m2xo&=65 ' menu3&=17 m3xo&=65 ' menu4&=18 m4xo&=65 ' desktop&=19 ground&=0 buttons&=1 mod1&=2 mod2&=3 mod3&=4 mod4&=5 mod5&=6 mod6&=7 modibox&=8 k1&=9 k14&=22 ' hdcomm&=20 hdkmblk&=1 hdkomv1&=3 hdcm1&=14 hdcm2&=15 hdcm3&=16 hdcm4&=17 hdcm5&=18 hdcm6&=19 hdcm7&=20 hdcm8&=21 hdcm9&=22 hdcm10&=23 hdflag0&=24 hdflag1&=25 hdflag2&=26 hdflag3&=27 hdcmab&=32 hdcmok&=33 hdflag4&=34 ' bootdat&=21 bootwr&=1 bd1&=5 bd2&=6 bd3&=7 bd4&=8 bd5&=9 bd6&=10 bd7&=11 bd8&=12 bd9&=13 bp1&=18 bp2&=19 bp3&=20 bp4&=21 bp5&=22 bp6&=23 bp7&=24 bdvolume&=26 bde1&=27 bde2&=28 bootget&=29 ' fkey&=22 f1o&=2 ' targmask&=23 tmaskok&=1 tghdtyp&=5 tmask1&=21 acsiall&=41 acsino&=42 tmask8&=47 scsiall&=72 scsino&=73 ' compare&=24 comps1&=4 comps2&=5 comps5&=8 comps6&=9 compok&=10 comps3&=13 comps4&=14 ' fontdial&=25 fontsp&=1 fontsm&=2 fontname&=6 fontsize&=7 fonttest&=8 fontok&=9 fontmin&=11 fontabb&=12 fontall&=14 fontwael&=15 ' menu5&=26 m5xo&=65 ' steprate&=27 stepa2&=3 stepb2&=10 stepresi&=17 stephd&=18 ' alrt&=28 alrti1&=1 alrti4&=4 alrti5&=5 alrtz1&=6 alrtz5&=10 alrtb1&=11 alrtb4&=14 alrtohr&=15 ' infos&=29 ' ramkonv&=30 dissed&=3 distempl&=4 ' ctrack&=31 trkd7&=4 trkd8&=5 trkd9&=6 trkd10&=7 trkd11&=8 trkd1&=9 trkd2&=13 trkd3&=19 trkd4&=22 trkd5&=26 trkd6&=29 trkok&=30 ' ~RSRC_GADDR(0,menu1&,m.enu1%) ~RSRC_GADDR(0,menu2&,m.enu2%) ~RSRC_GADDR(0,menu3&,m.enu3%) ~RSRC_GADDR(0,menu4&,m.enu4%) ~RSRC_GADDR(0,menu5&,m.enu5%) ' desk.top%=@rsc_gaddr(desktop&) ' ------------------ e.ingabe%=@rsc_gaddr(eingabe&) d.rives%=@rsc_gaddr(drives&) e.inname%=@rsc_gaddr(einname&) b.ox%=@rsc_gaddr(box&) s.earch%=@rsc_gaddr(search&) p.art%=@rsc_gaddr(part&) p.sel%=@rsc_gaddr(psel&) v.oreinst%=@rsc_gaddr(voreinst&) hard.para%=@rsc_gaddr(hardpara&) t.arget%=@rsc_gaddr(targerat&) f.at%=@rsc_gaddr(fat&) ein.stell%=@rsc_gaddr(einstell&) h.elp%=@rsc_gaddr(help&) d.atei%=@rsc_gaddr(datei&) k.leinst%=@rsc_gaddr(kleinst&) hd.comm%=@rsc_gaddr(hdcomm&) boot.dat%=@rsc_gaddr(bootdat&) f.key%=@rsc_gaddr(fkey&) targ.mask%=@rsc_gaddr(targmask&) c.ompare%=@rsc_gaddr(compare&) f.ontdial%=@rsc_gaddr(fontdial&) step.rate%=@rsc_gaddr(steprate&) a.lert%=@rsc_gaddr(alrt&) i.nfos%=@rsc_gaddr(infos&) ram.konv%=@rsc_gaddr(ramkonv&) c.track%=@rsc_gaddr(ctrack&) RETURN ' ' 'pfad_format$()' formatiert einen gegebenen Pfad (+Dateiname) auf ' eine vorgegebene Länge (format&)! Beispiel: Aus ' @pfad_format$("G:\DFUE\CAT\LISTEN\LOCAL\OS-33.LST",30) wird: ' "G:\...T\LISTEN\LOCAL\OS-33.LST"! Dabei geht die Funktion davon aus, da₧ ' es sich um einen absoluten Pfad inkl. Laufwerks-Angabe handelt! Die ' ersten drei Zeichen werden immer ausgegeben! DEFFN pfad_format$(pfad$,format&)=STRING$(-(LEN(pfad$)>format&),LEFT$(pfad$,3)+"...")+RIGHT$(pfad$,format&+6*(LEN(pfad$)>format&)) FUNCTION mousek .| Aufruf in : was_ist-1,fdc_speed-3,fdc_protect-1,maus_off-1, LOCAL dum&,pmstate& ~GRAF_MKSTATE(dum&,dum&,pmstate&,dum&) RETURN pmstate& ENDFUNC ' ------------------------------ End of Text ------------------------------- PROCEDURE test_suche .| Glob. Var.: po%,erg%,s$,a$,buf$,bps%,buf%,lgs% .| Ruft auf : eintext,eingabe,alrt,was_ist,lesen,do_list .| Aufruf in : alt-1, eintext("Suchstring:","") po%=@eingabe("Position",0) erg%=@alrt(1,"Mit Display?",1,"Ja|Nein") s$=a$ buf$=STRING$(bps%,0) ' DO BMOVE buf%,VARPTR(buf$),LEN(buf$) EXIT IF MID$(buf$,po%,LEN(s$))=s$ EXIT IF @was_ist=1 INC lgs% lesen IF erg%=1 do_list ENDIF LOOP ' do_list ' ' RETURN ' ' Noch nicht eingebaute Vorschlaege von Frank Rüger: ' -------------------------------- Schnipp --------------------------------- ' 10455d10459 ' < IF la%<=wzb% ' 10457,10459d10460 ' < ELSE ' < pos_cursor(la%) ' < ENDIF ' 10462d10462 ' < pos_cursor(0) ' -------------------------------- Schnapp --------------------------------- ' Diese Änderungen in der PROC 'adresse' sollte sich Claus am besten mal ' anschauen, da ich nicht genau wei₧, was da alles passiert! Auf jeden Fall ' funktioniert so die Positionierung per Eingabe einer Adresse besser ' (Anklicken links im HEX-Fenster oder per Menü)! Vorher gab es ' widersprüchliche Befehle und überflüssige Variablenzuweisungen! Totales ' Chaos in dieser PROC;-) Ich wei₧ auch nicht, ob obige Änderungen korrekt ' sind! ' ' Kommentar CB: Die Prozedur ist mir auch noch etwas suspekt, daher ' habe ich diese Änderung zurückgestellt, zumal sie ' mir auch keinen konkreten Fehler zu beheben scheint. ' -------------------------------- Schnipp --------------------------------- ' 12220a12225 ' > LOCAL klickcl%,anzcl%,f_out$ ' 12246c12251 ' < out$(0)=@dec_hex_val$(cl%,6)+" "+f$+SPACE$(MAX(0,wc%-LEN(f$))) ' --- ' > klickcl%=cl% ' 12261a12267 ' > anzcl%=1 ' 12269a12276 ' > INC anzcl% ' 12274a12282,12283 ' > f_out$=@pfad_format$(f$,52) ' > out$(0)=@dec_hex_val$(klickcl%,6)+" "+f_out$+" ("+STR$(anzcl%)+" ' Cluster)"+SPACE$(MAX(0,wc%-LEN(f_out$)-11-LEN(STR$(anzcl%)))) ' -------------------------------- Schnapp --------------------------------- ' Beim Klicken in die graphische FAT-Übersicht, wird jetzt hinter dem ' Datei-(oder Ordner-)namen auch die Anzahl der belegten Cluster in der ' Infozeile angegzeigt! ' ' diff -aC sed_565.lst sed_565d.lst >sed_diff.txt ' ' -------------------------------- Schnipp --------------------------------- ' *** 6236,6241 **** ' --- 6236,6243 ---- ' RETURN ' PROCEDURE wind_dklick ' LOCAL a%,aa%,cl%,cz% ' + LOCAL alrt_text$,filename$,file_att|,file_startcl% ' + LOCAL file_len,tm%,tm$,dt%,dt$,pipe&,i& ' ' ' change ' IF mode%=d.isk% ' *************** ' *** 6253,6265 **** ' ELSE ' IF lgs%>len_fat%*2 ! woanders = DIR ? ' a%=INT((z%+tz%)/32)*32 ' cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26} ' ! IF cl%>0 ' lgs%=(cl%-2)*spc%+len_fat%*2+len_dir%+1 ' ELSE ' lgs%=anf_fat2%+len_fat% ' ENDIF ' ENDIF ' lgs%=MIN(spd%-1,lgs%) ' ENDIF ' lesen ' --- 6255,6313 ---- ' ELSE ' IF lgs%>len_fat%*2 ! woanders = DIR ? ' a%=INT((z%+tz%)/32)*32 ' + IF hex! ' + file_startcl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26} ' + IF file_startcl%<cpd% ' + filename$=STRING$(11,32) ' + BMOVE buf%+a%,V:filename$,11 ' + filename$=@nam_conv$(filename$,0) ' + pipe&=INSTR(filename$,"|") ' + WHILE pipe& ' + MID$(filename$,pipe&,1)="!" ' + pipe&=INSTR(filename$,"|") ' + WEND ' + alrt_text$="Dateiname: "+filename$ ' + ' ' + file_att|=BYTE{buf%+a%+11} ' + alrt_text$=alrt_text$+"|Dateiattribute: %"+BIN$(file_att|,6)+" = ' " ' + FOR i&=5 DOWNTO 0 ' + IF BTST(file_att|,i&) ' + alrt_text$=alrt_text$+MID$("RHSLDA",SUCC(i&),1) ' + ELSE ' + alrt_text$=alrt_text$+"_" ' + ENDIF ' + NEXT i& ' + ' ' + tm%=BYTE{buf%+a%+23}*256+BYTE{buf%+a%+22} ' + dt%=BYTE{buf%+a%+25}*256+BYTE{buf%+a%+24} ' + tm$=RIGHT$("0"+STR$((tm% DIV 2048) AND 31),2) ' + tm$=tm$+":"+RIGHT$("0"+STR$((tm% DIV 32) AND 63),2) ' + tm$=tm$+":"+RIGHT$("0"+STR$(2*(tm% AND 31)),2) ' + dt$=RIGHT$("0"+STR$(dt% AND 31),2) ' + dt$=dt$+"."+RIGHT$("0"+STR$((dt% DIV 32) AND 15),2) ' + dt$=dt$+"."+STR$(1980+((dt% DIV 512) AND 63)) ' + alrt_text$=alrt_text$+"|Uhrzeit/Datum: "+tm$+"/"+dt$ ' + ' ' + alrt_text$=alrt_text$+"|Startcluster: "+STR$(file_startcl%) ' + ' ' + ' file_len=BYTE{buf%+a%+28}+BYTE{buf%+a%+29}*&H100+BYTE{buf%+a%+30}*&H10000+BYTE{ ' buf%+a%+31}*&H1000000 ' + alrt_text$=alrt_text$+"|Dateilänge: "+STR$(file_len) ' + ' ' + ~@alrt(1,alrt_text$,1," OK ") ' + ENDIF ' + ELSE ' cl%=BYTE{buf%+a%+27}*256+BYTE{buf%+a%+26} ' ! IF cl%<cpd% ' lgs%=(cl%-2)*spc%+len_fat%*2+len_dir%+1 ' + CLR z% ' ELSE ' + IF @alrt(1,"Cluster Nr. "+STR$(cl%)+"|existiert ' nicht!",1,"Root-Dir|Abbruch")=1 ' lgs%=anf_fat2%+len_fat% ' + CLR z% ' + ENDIF ' ENDIF ' ENDIF ' + ENDIF ' lgs%=MIN(spd%-1,lgs%) ' ENDIF ' lesen ' -------------------------------- Schnapp --------------------------------- ' Das ist jetzt kein Bugfix, sondern ein neues Feature! Habe ich bei mir ' eingebaut, vielleicht kann ja jemand was damit anfangen! Wenn man im ' Datenfenster im Hex-Bereich (links) doppelklickt (vorzugsweise in ' Directories), werden die Daten Filename, Attribute, Datum, Uhrzeit, ' Startcluster und Länge im Klartext in einer Alertbox angezeigt! Dabei ' werden Pipes "|" in "!" gewandelt, da Pipes schon als Zeilentrenner in ' der Alertbox dienen! Aber normalerweise kommen auch keine Pipes in ' Dateinamen vor, ist auch nur für den Fall, wenn jemand im Datenbereich in ' einen Cluster doppelklickt, der kein Directory enthält! ' ' Au₧erdem wird bei Doppelklick in den ASCII-Bereich des Datenfensters ' (rechts) überprüft, ob der Startcluster des Files (wenn es denn ein ' Directory sein sollte) überhaupt existiert und man kann in einer Alertbox ' wählen, ob das Root-Directory anzeigt werden soll oder gar nichts ' passiert! ' ' Kommentar CB: Keine schlechte Idee, aber dazu sollte es einen eigenen ' Dialog und kein Alert-Gepfriemel geben. Dazu bin ich aber ' noch nicht gekommen. ' ' ' -------------------------------- Schnipp --------------------------------- ' *** 9565,9576 **** ' RETURN ' PROCEDURE alt_q ! Komplett suchen ' LOCAL first! ' first!=TRUE ' erg%=3 ' clr_out("") ' DO ' search ' ! EXIT IF (no_nxt%=1 AND found!=FALSE) OR abb% OR search$="" ' info_line ' set_slide(whdl&(0)) ' IF first!=TRUE ' --- 9614,9628 ---- ' RETURN ' PROCEDURE alt_q ! Komplett suchen ' LOCAL first! ' + IF wind%=1 ' + nur_daten_fenster ' + ELSE ' first!=TRUE ' erg%=3 ' clr_out("") ' DO ' search ' ! EXIT IF no_nxt%=1 OR abb% OR search$="" ' info_line ' set_slide(whdl&(0)) ' IF first!=TRUE ' *** 9593,9598 **** ' --- 9645,9651 ---- ' CLR search_cont% ' lesen ' out_do ' + ENDIF ' RETURN ' PROCEDURE alt_t ! Block ins ASCII-Fenster ' LOCAL ab%,a%,b%,c%,b$ ' -------------------------------- Schnapp --------------------------------- ' "Komplett suchen Alt-Q" jetzt nur noch im Datenfenster, da es, zumindest ' bei mir, im Textfenster nicht funktionierte (Absturz)! Das Ergebnis der ' Suche wird ja ebenfalls im Textfenster ausgegeben! Vielleicht gab es da ' Überschneidungen im Text-Array? Au₧erdem habe ich die Abbruchbedingung ' etwas verändert, da sonst in einer Endlosschleife immer wieder von vorne ' gesucht wurde! ' ' Kommentar CB: Bevor man das Suchen im Textfenster abklemmt, sollte ' man versuchen, den eigentlichen Grund für den Fehler ' zu finden.