/************************************************************************/ /* GEM Deklarationen */ /************************************************************************/ #define NORMAL 0x0 #define SELECTED 0x1 #define SHADOWED 0x20 extern long xbios(); #define Dosound(a) xbios(32,a) #define format(a,b,c,d,e,f,g,h,i) xbios(0x0a,a,b,c,d,e,f,g,h,i) #define writes(a,b,c) xbios(0x09,a,0l,0,c,b,0,1) #define makeboot(a) xbios(0x12,a,0x01111111l,2 + (s1 ? 1 : 0),0) #define state(x) *(zeiger + (x * 12) + 5) #define TRUE 1 #define FALSE 0 /************************************************************************/ /* Included Files ~ Nachzuladende Routinen */ /************************************************************************/ #include "gemdefs.h" #include "mud.inc" int phys_handle; #include "_work.inc" int hidden; #include "mouse.inc" /************************************************************************/ /* Titelindex und Eintragsindex */ /************************************************************************/ #define TREE1 0 #define spt9 13 #define spt10 14 #define sf354 17 #define sf314 18 #define tracks79 8 #define tracks80 9 #define tracks81 10 #define tracks82 11 #define QUIT 5 #define START 4 /************************************************************************/ /* Globale Deklarationen */ /************************************************************************/ int *menuaddr; /* Adresse des Menbaumes */ int hhchar,hwchar,hhbox,hwbox; int xdesk,ydesk,wdesk,hdesk; int xwork,ywork,wwork,hwork; int *zeiger; short int index,x1,y1,w1,h1; int xk,yk,radius = 85,x2k; int sides,spt; char c,*sbuff,track,tracks; int count,sector,tr,se; long buffn[2048],ser_number,s1,*buff; /************************************************************************/ /* Hauptverwaltungs- und Initialisierungsroutine */ /************************************************************************/ main() { int ergebnis; char *resource = "format.rsc"; appl_init(); phys_handle = graf_handle (&hhchar,&hwchar,&hhbox,&hwbox); open_work(); rsrc_load (resource); graf_mouse (ARROW, 0x0L); /* Pfeil als Maus */ hidden = FALSE; rsrc_gaddr(1,TREE1,&zeiger); /* holt Startadresse */ set_select(spt10); /* setzt 10 SpT invers */ set_select(sf314); /* setzt SF314 invers */ set_select(tracks82); /* setzt 82 Tracks invers */ while (TRUE) { hide_mouse(); /* Maus verstecken */ formular(); /* gibt Formular aus */ circle(); /* zeichnet den leeren Kreis */ show_mouse(); /* Maus wieder zulassen */ edit(); /* wartet das Formular */ if (index == QUIT) break; test_select(); /* testet auf SELECTED & setzt */ /* tracks, sides */ format_disk(); /* formatiert diskette */ objc_change(zeiger,index,0,x1,y1,w1,h1,NORMAL,1); } schliess(); /* schliesst Formular */ close_work(); } /************************************************************************/ /* Subroutine zum ausgeben eines nicht-editierbaren formulares */ /************************************************************************/ formular() { form_center (zeiger, &x1,&y1,&w1,&h1); form_dial (0, x1,y1,w1,h1, x1,y1,w1,h1); form_dial (1, 10,10,20,20, x1,y1,w1,h1); objc_draw (zeiger,0,2, x1,y1,w1,h1); music(); xk = x1+95; x2k = xk+(radius*2)+4; yk = y1+160; } /************************************************************************/ /* wartet das Formular */ /************************************************************************/ edit() { index=form_do (zeiger,0); } /************************************************************************/ /* Schliesst Formular */ /************************************************************************/ schliess() { form_dial (2, 10,10,20,20, x1,y1,w1,h1); form_dial (3, x1,y1,w1,h1, x1,y1,w1,h1); } /***********************************************************************/ /* Musik spielen */ /***********************************************************************/ music() { static char sound[]={0,200,1,0,7,254,11,255,12,110,13,9,8,16,255,0}; Dosound(sound); } /********************** Setzt Fllattribute ****************************/ set_attr() { vsf_color(handle,1); vsf_interior(handle,1); vsf_perimeter(handle,0); vswr_mode(handle,1); } /***********************************************************************/ /* gibt Kreis aus */ /***********************************************************************/ circle() { int pxyarray[4],x; pxyarray[0] = xk + radius; pxyarray[1] = yk; pxyarray[2] = xk; pxyarray[3] = yk; vsl_color(handle,1); vsl_type(handle,1); vswr_mode(handle,1); vsl_width(handle,1); vsl_ends(handle,0,0); v_arc(handle,xk,yk,radius,0,3600); pxyarray[0] = x2k + radius; pxyarray[2] = x2k; v_arc(handle,x2k,yk,radius,0,3600); vsf_color(handle,1); vsf_interior(handle,0); vsf_perimeter(handle,1); for (x=0; x < 3600; x=x+86) { /* 86 = Abstand */ v_pieslice(handle,xk,yk,radius,x,x+86); v_pieslice(handle,x2k,yk,radius,x,x+86); } } /******************* setzt Select von 1 Button ******************/ set_select(index) int index; { /* objc_change(zeiger,index,0,x1,y1,w1,h1,SELECTED | SHADOWED,1); */ state(index) = (SELECTED | SHADOWED); } /************************************************************************/ /* Testet auf SELECTED */ /************************************************************************/ test_select() { if ((state(spt9) & SELECTED) == SELECTED) spt = 9; else spt = 10; if ((state(sf314) & SELECTED) == SELECTED) sides = 1; else sides = 0; tracks=1; if ((state(tracks79) & SELECTED) == SELECTED) tracks = 80; /* 790 */ if ((state(tracks80) & SELECTED) == SELECTED) tracks = 81; /* 800 */ if ((state(tracks81) & SELECTED) == SELECTED) tracks = 82; /* 810 */ if ((state(tracks82) & SELECTED) == SELECTED) tracks = 83; /* 820 */ } /************************************************************************/ /* Formatiert eine ganze Diskette */ /************************************************************************/ format_disk() { int bttn,blk; blk = tracks * spt; buff = buffn; sbuff = buff; s1 = sides; bttn = form_alert(1,"[1][Insert the Diskette,|then press RETURN|Note: All Data will be|erased !][ OK | Cancel ]"); if (bttn == 1) { if (!write_disk(buff,s1)) { for(count = 0; count < 512; *(sbuff + count++) = 0); makeboot(buff); *(sbuff + 0x13) = (blk + (s1 ? blk : 0)) & 0xff; *(sbuff + 0x14) = ((blk + (s1 ? blk : 0)) >> 8) & 0xff; *(sbuff + 0x18) = spt; tr = 0; se = 1; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); *(sbuff) = 0xf7; *(sbuff + 1) = 0xff; *(sbuff + 2) = *(sbuff + 1); tr = 0; se = 7; writes(buff,tr,se); tr = 0; se = 2; writes(buff,tr,se); for(count = 0; count < 512; *(sbuff + count++) = 0); tr = 1; se = 3; writes(buff,tr,se); } else form_alert(1,"[1][Error found while|formatting Diskette!|Check it or use|another one!][ OK ]"); } } /************************************************************************/ /* Formatiert alle tracks */ /************************************************************************/ write_disk(puffer,s) /* formatiert tracks */ long *puffer,s; { int winkel,abstand = 86; set_attr(); /* setzt PIE-Attribute */ for(track = 0,winkel = 0; track < tracks; track++,winkel=(winkel+abstand)) { if(0 == format(puffer,0l,0,10,track,0,1,0x87654321,0l) && (s ? 0 == format(puffer,0l,0,10,track,1,1,0x87654321,0l) : 1)) { if ((winkel+abstand) <= 3612) { /* 3612=42tracks*abstand */ hide_mouse(); v_pieslice(handle,xk,yk,radius,winkel,winkel+abstand); show_mouse(); } else { hide_mouse(); v_pieslice(handle,x2k,yk,radius,winkel-3612,winkel+abstand-3600); show_mouse(); } } else return(2); } return(0); }