home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / utility / disk / dupli / dupli.gfa (.txt) < prev    next >
GFA-BASIC Atari  |  1993-07-08  |  45KB  |  1,518 lines

  1. ' ************************************
  2. ' *                                  *
  3. ' *             DUPLI                *
  4. ' *                                  *
  5. ' * Programme de copie de disquettes.*
  6. ' * pour toutes machines ayant 2 méga*
  7. ' * minimum de mémoire et un écran   *
  8. ' * monochrome.                      *
  9. ' * Ce programme fonctionne sous     *
  10. ' * Multitos                         *
  11. ' *                                  *
  12. ' *          Domaine public          *
  13. ' *             © 1993               *
  14. ' *                                  *
  15. ' *  Réalisation: Thierry RODOLFO    *
  16. ' *                                  *
  17. ' * Ce programme ne peut-être vendu! *
  18. ' * Modifiez le, et faite suivre son *
  19. ' * listing modifié.                 *
  20. ' * IMPORTANT : Le seul prix que vous*
  21. ' * avez à payer pour ce programme   *
  22. ' * cest de laisser mon Nom! Merci.  *
  23. ' * Dans la ligne 438 vous pouver y  *
  24. ' * mettre le votre!                 *
  25. ' *                                  *
  26. ' * La ressource couleur à été créée *
  27. ' * avec le fabuleux programme :     *
  28. ' *   INTERFACE II V2.20             *
  29. ' *Ce programme ne coute que 400 Frs *
  30. ' * et il est disponible chez :      *
  31. ' *                                  *
  32. ' *       SCAP INFORMATIQUE          *
  33. ' *       93200  SAINT-DENIS         *
  34. ' *                                  *
  35. ' ************************************
  36. '
  37. ' A tous les programmeurs:
  38. ' -----------------------
  39. ' Que vous soyez professionnel ou amateur laisser vos sources avec vos programmes;
  40. ' En ce qui concerne les programmes professionnels, laisser au moins un fichier source
  41. ' d'exploitation de vos données, et alors vous verrez fleurir des applications autour
  42. ' de vos programmes.(SVP)!!! Les allemands ont compris avant nous l'importance
  43. ' de ce procédé. Merci!
  44. '
  45. ' PS: Excusez-moi pour les fautes d'orthographes (Manque de temps!)
  46. '
  47. RESERVE 80000                   ! Un minimum de réservation de mémoire
  48. DEFINT "a-z"                    ! Toutes les variables non définies seront des entiers
  49. ~APPL_INIT()                    ! Coucou c'est nous!
  50. '
  51. DEFMOUSE 2
  52. init_path                       ! Initialisation des path
  53. init_cookie
  54. init_menu                       ! Initialisation des données RSC
  55. init_tableaux                   ! Initialisation des Tableaux
  56. r.loadxrsrc                     ! Lire la routine de gestion RSC Couleur
  57. r.init                          ! Initialiser la routine
  58. init_var                        ! Initialiser les variables globales
  59. init_options                    ! Initialiser les options
  60. aff_menu                        ! Afficher la barre des menus
  61. ~FRE(0)                         ! Garbage collection
  62. '
  63. IF fen_ouv|(0)
  64.   w_open                          ! Ouvrir la fênetre principale
  65. ENDIF
  66. IF fen_ouv|(1)
  67.   w_open2
  68. ENDIF
  69. '
  70. ' Fonction d'accès à chaque mot du tampon des messages de l'AES:'
  71. DEFFN p(x%)=CVI(MID$(tampon$,x%*2+1,2))
  72. '
  73. DEFMOUSE 0                            ! La flêche au bout de la souris
  74. REPEAT
  75.   tampon$=SPACE$(16)                  ! Place pour le tampon d'évènements GEM
  76.   nouv_dessin|=0                      ! Flag: Graphe n'a pas à être redessiné
  77.   '
  78.   ~WIND_GET(whandle%(0),10,dessus%,dummy%,dummy%,dummy%)   ! Qu'elle fênetre est dessus?
  79.   '
  80.   ' Si c'est mon numéro de fenêtre et si elles sont fermées
  81.   IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=0 AND fenetre_ouvrt|(1)=0
  82.     multi&=&X11011            !Gérer les évènements multiples
  83.   ELSE                        !sinon c'est un autre programme
  84.     multi&=&X10011            !Ne gérer que MESAG
  85.   ENDIF
  86.   '
  87.   evnt&=EVNT_MULTI(multi&,2,1,1,0,xwork&,ywork&,wwork&,hwork&,1,0,xwork&,ywork&,hwork&,VARPTR(tampon$),400,mcurx&,mcury&,mbutton&,kstate&,key&,clics&)
  88.   '
  89.   IF BTST(evnt&,mesag|)                ! Si c'est un évènement GEM
  90.     messages                           ! Traiter les messages
  91.   ELSE IF BTST(evnt&,touche|)          ! Si c'est un évènement clavier
  92.     traite_keys                        ! Traiter les touches
  93.   ELSE IF BTST(evnt&,button|)          ! Si c'est le souris
  94.     traite_souris                      ! Traiter la souris
  95.   ELSE IF BTST(evnt&,mouse_in_area|)
  96.     '    event_area_in
  97.   ENDIF
  98.   vide_buffer_clavier
  99. UNTIL sortir|=1                        ! Sortir si =1
  100. DEFMOUSE 2                             ! Abeille au bout de la souris
  101. efface_var                             ! Effacer les variables
  102. RESERVE
  103. EDIT
  104. '
  105. ' **********************************************
  106. ' INITIALISATION DES DONNÉES POUR LE PROGRAMME *
  107. ' **********************************************
  108. > PROCEDURE init_cookie
  109.   '
  110.   '  Procédure de détection des TSR
  111.   '
  112.   LOCAL cmp%,cookie_p%
  113.   cmp%=0
  114.   cookie_p%=LPEEK(&H5A0)
  115.   IF LPEEK(cookie_p%)<>0
  116.     DO
  117.       cmp%=LPEEK(cookie_p%)
  118.       EXIT IF cmp%=0               !Je ne trouve pas le Cookie ?
  119.       EXIT IF cmp%=&H4D694E54      !MINT ?
  120.       ADD cookie_p%,2
  121.     LOOP
  122.   ENDIF
  123.   IF cmp%=&H4D694E54                !MINT est résidant
  124.     mint!=TRUE
  125.     mint_version&=VAL(HEX$(LONG{cookie_p%+4}))      ! Quelle version
  126.   ENDIF
  127. RETURN
  128. > PROCEDURE init_path
  129.   '
  130.   ' Procédure d'initialisation des chemins
  131.   '
  132.   old_dta%=FGETDTA()
  133.   lecteur_origine|=GEMDOS(&H19)
  134.   lecteur_origine$=CHR$(lecteur_origine|+65)
  135.   s.dir(homedir$)
  136.   path_origine$=f$
  137.   path_orig$=homedir$+"\"
  138.   path_courant$=homedir$
  139.   rsc$="DUPLI.RSC"
  140. RETURN
  141. > PROCEDURE init_menu
  142.   '
  143.   ' Données des indices de ressources
  144.   '
  145.   menu&=0
  146.   a_propos&=8
  147.   charge_image&=17
  148.   sauve_image&=18
  149.   lire_master&=20
  150.   faire_copie&=21
  151.   informations&=23
  152.   LET quitter&=25
  153.   detect_virus&=27
  154.   ouvre_fenetre&=28
  155.   mint_delay&=29
  156.   sauve_par&=31
  157.   '
  158.   page1&=1
  159.   d_page1&=0
  160.   ic_disk1&=1
  161.   ic_disk2&=2
  162.   ic_fleche&=3
  163.   b_lire_master&=4
  164.   b_ecrire_master&=5
  165.   '
  166. RETURN
  167. > PROCEDURE init_tableaux
  168.   '
  169.   DIM whandle%(2),xwork&(2),ywork&(2),wwork&(2),hwork&(2)
  170.   DIM ancien_xwork&(2),ancien_ywork&(2),ancien_wwork&(2),ancien_hwork&(2)
  171.   DIM fenetre_ouvrt|(2),fen_ouv|(2),s_ptr%(2),i_ptr%(2)
  172.   '
  173. RETURN
  174. > PROCEDURE init_rsc
  175.   '
  176.   ~FN xrsrc_gaddr(0,0,menu_ptr%) ! Utilisation de la sous_routine xrsrc
  177.   ~FN xrsrc_gaddr(0,1,page1%)    ! pour récuperer l' adresse des Arbres
  178.   ~FN xrsrc_gaddr(0,2,info%)
  179.   ~FN xrsrc_gaddr(0,3,m_delay%)
  180.   ~FN xrsrc_gaddr(0,4,iconify%)
  181.   ~FN xrsrc_gaddr(0,5,alert1%)
  182.   '
  183. RETURN
  184. > PROCEDURE init_var
  185.   '
  186.   version$="Version 1.12"        ! La version du Soft
  187.   '
  188.   ~WIND_GET(0,5,x_ecran&,y_ecran&,w_ecran&,h_ecran&)  ! Donne les coordonnées de la zone de travaille
  189.   DEFTEXT 1,0,0,13
  190.   GRAPHMODE 1
  191.   xmax&=WORK_OUT(0)                     !X maxi après V_open_vwork()
  192.   ymax&=WORK_OUT(1)                     !Y maxi
  193.   wmax&=xmax&+1
  194.   hmax&=ymax&+1
  195.   maxcolor%=WORK_OUT(13)                 !Nombre de couleurs disponibles
  196.   hand%=V~H                              !Handle actuel
  197.   '
  198.   ' Numéro des évènements GEM
  199.   ' -------------------------
  200.   '
  201.   LET touche|=0
  202.   button|=1
  203.   mouse_in_area|=2
  204.   mesag|=4
  205.   '
  206.   ' -------------------------
  207.   '
  208.   page|=1
  209.   fenetre_ouvrt|(0)=0
  210.   fenetre_ouvrt|(1)=0
  211.   fenetre_ouvrt|(2)=0
  212.   '
  213.   t.pause#=0
  214.   '
  215. RETURN
  216. > PROCEDURE init_options
  217.   '
  218.   ' Procédure d'initialisation des options contenues dans le fichier DUPLI.PAR
  219.   '
  220.   f$=path_origine$+"DUPLI.PAR"+CHR$(0)
  221.   '
  222.   varf%=GEMDOS(61,L:VARPTR(f$),W:0)      ! Une autre façon de détecter la
  223.   ~GEMDOS(62,W:varf%)                    ! présence d'un fichier
  224.   IF varf%>=0
  225.     OPEN "I",#1,f$
  226.     '
  227.     ' LIRE LES DIMENTIONS DES FENETRES
  228.     '
  229.     FOR i|=0 TO 2
  230.       fen_ouv|(i|)=CVI(INPUT$(2,#1))
  231.       ancien_xwork&(i|)=CVI(INPUT$(2,#1))
  232.       ancien_ywork&(i|)=CVI(INPUT$(2,#1))
  233.       ancien_wwork&(i|)=CVI(INPUT$(2,#1))
  234.       ancien_hwork&(i|)=CVI(INPUT$(2,#1))
  235.     NEXT i|
  236.     d_virus!=CVL(INPUT$(4,#1))          ! Anti-virus(oui ou non)
  237.     t.pause#=CVD(INPUT$(8,#1))          ! lire le temps de pause
  238.     CLOSE #1
  239.   ENDIF
  240. RETURN
  241. '
  242. ' *****
  243. ' GEM *
  244. ' *****
  245. > PROCEDURE messages
  246.   IF FN p(0)=10                      ! Option?
  247.     title%=FN p(3)                    ! Stocker l'index du titre de menu
  248.     '
  249.     SELECT FN p(4)
  250.     CASE a_propos&
  251.       info
  252.     CASE charge_image&
  253.       lire_image
  254.     CASE sauve_image&
  255.       IF mem!
  256.         sauve_image
  257.       ELSE
  258.         ALERT 3,"| Aucunes données  |  en mémoire !..",1," Ok ",back|
  259.       ENDIF
  260.     CASE lire_master&
  261.       IF mem!
  262.         mem!=FALSE
  263.         ~MFREE(image%)
  264.       ENDIF
  265.       lire_disk
  266.     CASE faire_copie&
  267.       IF mem!
  268.         make_copy
  269.       ELSE
  270.         ALERT 3,"| Aucunes données  |  en mémoire !..",1," Ok ",back|
  271.       ENDIF
  272.     CASE informations&
  273.       infos
  274.     CASE quitter&
  275.       sortir|=1
  276.     CASE detect_virus&
  277.       IF d_virus!=FALSE
  278.         d_virus!=TRUE
  279.         ~MENU_ICHECK(menu_ptr%,detect_virus&,1)
  280.       ELSE
  281.         d_virus!=FALSE
  282.         ~MENU_ICHECK(menu_ptr%,detect_virus&,0)
  283.       ENDIF
  284.     CASE ouvre_fenetre&
  285.       w_open
  286.     CASE mint_delay&
  287.       mint_delay
  288.     CASE sauve_par&
  289.       sauve_options
  290.     ENDSELECT
  291.     '
  292.     ~MENU_TNORMAL(menu_ptr%,title%,1)       ! Afficher le titre "normal"
  293.   ENDIF
  294.   '
  295.   IF FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2)
  296.     '    PRINT FN p(0)
  297.     IF FN p(0)=20 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2)) ! Redraw
  298.       ' Redraw
  299.       w_redraw(FN p(3))
  300.     ENDIF
  301.     '
  302.     IF FN p(0)=21 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2)) ! Topped
  303.       ' Top
  304.       ~WIND_SET(FN p(3),10,0,0,0,0)
  305.     ENDIF
  306.     '
  307.     IF FN p(0)=23 AND FN p(3)=whandle%(0)     ! Full
  308.       ' Full
  309.       w_full
  310.     ENDIF
  311.     '
  312.     '
  313.     IF FN p(0)=22 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2))  ! Closed
  314.       ' Close
  315.       w_close(FN p(3))
  316.     ENDIF
  317.     '
  318.     IF FN p(0)=28 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2)) ! Moved
  319.       ' Move
  320.       w_move(FN p(3))
  321.     ENDIF
  322.     '
  323.     IF FN p(0)=34 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2))  ! Smaller
  324.       ' Smaller
  325.       wm_iconify(FN p(3))
  326.     ENDIF
  327.     '
  328.     IF FN p(0)=35 AND (FN p(3)=whandle%(0) OR FN p(3)=whandle%(1) OR FN p(3)=whandle%(2))  ! WM_UNICONIFY
  329.       ' WM_UNICONIFY
  330.       wm_uniconify(FN p(3))
  331.     ENDIF
  332.     '
  333.   ENDIF
  334. RETURN
  335. > PROCEDURE traite_keys
  336.   LOCAL i|
  337.   '  PRINT AT(1,1);key&         ! Très pratique
  338.   IF key&=7697          ! ^Q
  339.     sortir|=1
  340.   ELSE IF key&=9740     ! ^L
  341.     IF mem!
  342.       mem!=FALSE
  343.       ~MFREE(image%)
  344.     ENDIF
  345.     lire_disk
  346.   ELSE IF key&=6159     ! ^O
  347.     lire_image
  348.   ELSE IF key&=7955     ! ^S
  349.     IF mem!
  350.       sauve_image
  351.     ELSE
  352.       ALERT 3,"| Aucunes données  |  en mémoire !..",1," Ok ",back|
  353.     ENDIF
  354.   ELSE IF key&=8454    ! ^F
  355.     IF mem!
  356.       make_copy
  357.     ELSE
  358.       ALERT 3,"| Aucunes données  |  en mémoire !..",1," Ok ",back|
  359.     ENDIF
  360.   ELSE IF key&=5897     ! ^I
  361.     infos
  362.   ELSE IF key&=8196     ! ^D
  363.     IF d_virus!=FALSE
  364.       d_virus!=TRUE
  365.       ~MENU_ICHECK(menu_ptr%,detect_virus&,1)    ! Marqueur devant le menu
  366.     ELSE
  367.       d_virus!=FALSE
  368.       ~MENU_ICHECK(menu_ptr%,detect_virus&,0)    ! Enlever marqueur
  369.     ENDIF
  370.   ELSE IF key&=8968    ! ^H
  371.     w_open
  372.   ELSE IF key&=9997    ! ^M
  373.     mint_delay
  374.   ELSE IF key&=11287   ! ^W
  375.     sauve_options
  376.   ENDIF
  377.   vide_buffer_clavier   ! Pas de répétition
  378. RETURN
  379. > PROCEDURE traite_souris
  380.   '
  381.   LOCAL ok|,i|,j|,compteur&,val&
  382.   '
  383.   ~WIND_GET(handle%,10,dessus%,dummy&,dummy&,dummy&) ! Qu'elle est la fenêtre active
  384.   '
  385.   get_win_num(dessus%,i|)                ! Quelle numéro de fenêtre
  386.   '
  387.   IF fenetre_ouvrt|(0) AND i|=0         ! Si c'est la fenêtre principale
  388.     ok|=0
  389.     IF clics&
  390.       '
  391.       obfind&=OBJC_FIND(page1%,0,24,mcurx&,mcury&)  ! On a cliqué sur quel objet?
  392.       '
  393.       SELECT obfind&
  394.       CASE 4                                       ! Si c'est le n°4
  395.         IF mem!
  396.           mem!=FALSE
  397.           ~MFREE(image%)
  398.         ENDIF
  399.         ~OBJC_CHANGE(page1%,obfind&,0,x%,y%,w%,h%,1,1)  ! Etat sélectionné
  400.         ob_pos(page1%,obfind&)                      ! Quel est sa position
  401.         ~OBJC_DRAW(page1%,obfind&,1,ox&,oy&,ox&+ow&,oy&+oh&)  ! Dessine le
  402.         lire_disk                                         ! Execute la fontion
  403.         ~OBJC_CHANGE(page1%,obfind&,0,x%,y%,w%,h%,0,1)  ! Etat déselectionné
  404.         ob_pos(page1%,obfind&)                      ! Quel est sa position
  405.         ~OBJC_DRAW(page1%,obfind&,1,ox&,oy&,ox&+ow&,oy&+oh&) ! Dessine le
  406.       CASE 5
  407.         IF mem!
  408.           ~OBJC_CHANGE(page1%,obfind&,0,x%,y%,w%,h%,1,1)
  409.           ob_pos(page1%,obfind&)
  410.           ~OBJC_DRAW(page1%,obfind&,1,ox&,oy&,ox&+ow&,oy&+oh&)
  411.           make_copy
  412.           ~OBJC_CHANGE(page1%,obfind&,0,x%,y%,w%,h%,0,1)
  413.           ob_pos(page1%,obfind&)
  414.           ~OBJC_DRAW(page1%,obfind&,1,ox&,oy&,ox&+ow&,oy&+oh&)
  415.         ELSE
  416.           ALERT 3,"| Aucunes données  |  en mémoire !..",1," Ok ",back|
  417.         ENDIF
  418.       ENDSELECT
  419.     ENDIF
  420.   ENDIF
  421. RETURN
  422. > PROCEDURE vide_buffer_clavier
  423.   {XBIOS(14,1)+6}=0
  424. RETURN
  425. '
  426. ' *******************
  427. ' DIVERS AFFICHAGES *
  428. ' *******************
  429. > PROCEDURE info
  430.   ' Procédure d'affichage du panneau d'information
  431.   LOCAL var&
  432.   '
  433.   ' Ici vous mettez votre nom et la date de modification
  434.   ' Attention pas plus de 50 caractères.
  435.   '
  436.   CHAR{{OB_SPEC(info%,4)}}="Modifié le 10/7/1993 par RODOLFO Thierry."
  437.   show_dialog(info%)
  438.   var&=FORM_DO(info%,0)
  439.   ~OBJC_CHANGE(info%,var&,0,x%,y%,w%,h%,0,1)
  440.   hide_dialog(info%)
  441. RETURN
  442. > PROCEDURE aff_menu
  443.   ' Procédure d'affichage de la barre des menus
  444.   LOCAL i|
  445.   IF mem!=FALSE                                 ! Si rien en mémoire
  446.     ~MENU_IENABLE(menu_ptr%,sauve_image&,0)      ! Le menu est en grisé
  447.     ~MENU_IENABLE(menu_ptr%,faire_copie&,0)      ! Celui-ci aussi
  448.   ENDIF
  449.   IF d_virus!                                   ! Si option d_virus
  450.     ~MENU_ICHECK(menu_ptr%,detect_virus&,1)      ! Marqueur devant le menu
  451.   ENDIF
  452.   '
  453.   ' Changer l'affichage du temps de pause dans le menu.
  454.   '
  455.   ~MENU_TEXT(menu_ptr%,mint_delay&,"  Mint delay "+STR$(t.pause#,3)+" sec ^M"+CHR$(0))
  456.   '
  457.   ~MENU_BAR(menu_ptr%,1)                         ! Afficher la barre des menus
  458. RETURN
  459. '
  460. ' *******************
  461. ' FONCTION DIVERSES *
  462. ' *******************
  463. > PROCEDURE s.dir(VAR f$)
  464.   f$=CHR$(GEMDOS(25)+65)+":"+STRING$(128,0)
  465.   ~GEMDOS(71,L:V:f$+2,0)
  466.   f$=CHAR{V:f$}
  467. RETURN
  468. > FUNCTION exist(f$)
  469.   LOCAL varf&
  470.   varf&=GEMDOS(61,L:VARPTR(f$),W:0)
  471.   ~GEMDOS(62,W:varf&)
  472.   IF varf&>=0
  473.     RETURN -1
  474.   ELSE
  475.     RETURN 0
  476.   ENDIF
  477. ENDFUNC
  478. '
  479. ' ***********************
  480. ' GESTION DES DIALOGUES *
  481. ' ***********************
  482. > PROCEDURE show_dialog(arbre%)
  483.   LOCAL x%,y%,w%,h%
  484.   ~FORM_CENTER(arbre%,x%,y%,w%,h%)
  485.   ~FORM_DIAL(0,x%,y%,w%,h%,x%,y%,w%,h%)
  486.   ~OBJC_DRAW(arbre%,0,12,x%,y%,w%,h%)
  487. RETURN
  488. > PROCEDURE hide_dialog(arbre%)
  489.   LOCAL x%,y%,w%,h%
  490.   ~FORM_CENTER(arbre%,x%,y%,w%,h%)
  491.   ~FORM_DIAL(3,x%,y%,w%,h%,x%,y%,w%,h%)
  492. RETURN
  493. > PROCEDURE ob_pos(arbre%,objet%)
  494.   LOCAL offsetx&,offsety&
  495.   ~OBJC_OFFSET(arbre%,objet%,offsetx&,offsety&)
  496.   IF objet%>0
  497.     ox&=OB_X(arbre%,objet%)+offsetx&
  498.     oy&=OB_Y(arbre%,objet%)+offsety&
  499.   ELSE
  500.     ox&=OB_X(arbre%,objet%)
  501.     oy&=OB_Y(arbre%,objet%)
  502.   ENDIF
  503.   ow&=OB_W(arbre%,objet%)
  504.   oh&=OB_H(arbre%,objet%)
  505. RETURN
  506. > PROCEDURE new_ob_pos(arbre%,objet&,ox&,oy&)
  507.   OB_X(arbre%,objet&)=ox&
  508.   OB_Y(arbre%,objet&)=oy&
  509. RETURN
  510. > PROCEDURE m.res(b%)
  511.   '
  512.   LOCAL d!
  513.   '
  514.   ' Faire attention à la règle des 256 Bytes pour cette fonction
  515.   ' ainsi que pour la fonction RESERV lors de la compilation !
  516.   '
  517.   IF b%<0
  518.     d!=TRUE
  519.     b%=-b%
  520.   ENDIF
  521.   '
  522.   b%=(b%+255) AND &H0
  523.   '
  524.   IF d!
  525.     b%=-b%
  526.   ENDIF
  527.   '
  528.   '  RESERVE FRE(0)+b   Pas de reserve un fois compilé
  529.   '
  530. RETURN
  531. > FUNCTION xrsrc_load(t$)
  532.   '
  533.   LOCAL r%
  534.   '
  535.   IF r.resident!
  536.     t$=t$+CHR$(0)
  537.     '
  538.     WORD{f.init%+4+36}=1          ! Numéro de la fonction
  539.     '
  540.     {f.init%+4+16}=V:t$
  541.     '
  542.     $c+
  543.     r%=C:f.scalc%()
  544.     $c-
  545.   ELSE
  546.     r%=RSRC_LOAD(t$)
  547.   ENDIF
  548.   RETURN r%
  549.   '
  550. ENDFUNC
  551. > FUNCTION xrsrc_free
  552.   '
  553.   LOCAL r%
  554.   '
  555.   IF r.resident!
  556.     '
  557.     WORD{f.init%+4+36}=2          ! Numéro de la fonction
  558.     '
  559.     $c+
  560.     r%=C:f.scalc%()
  561.     $c-
  562.   ELSE
  563.     r%=RSRC_FREE()
  564.   ENDIF
  565.   RETURN r%
  566.   '
  567. ENDFUNC
  568. > FUNCTION xrsrc_gaddr(re_gtype&,re_gindex&,VAR re_gaddr%)
  569.   '
  570.   LOCAL r%
  571.   '
  572.   IF r.resident!
  573.     '
  574.     WORD{f.init%+4+36}=3          ! Numéro de la fonction
  575.     '
  576.     WORD{f.init%+4+0}=re_gtype&
  577.     WORD{f.init%+4+2}=re_gindex&
  578.     '
  579.     {f.init%+4+16}=V:re_gaddr%
  580.     '
  581.     $c+
  582.     r%=C:f.scalc%()
  583.     $c-
  584.   ELSE
  585.     r%=RSRC_GADDR(re_gtype&,re_gindex&,re_gaddr%)
  586.   ENDIF
  587.   RETURN r%
  588.   '
  589. ENDFUNC
  590. > PROCEDURE xrsrc_init
  591.   '
  592.   IF r.resident!
  593.     WORD{f.init%+4+36}=128          ! Numéro de la fonction
  594.     $c+
  595.     r%=C:f.scalc%()
  596.     $c-
  597.   ENDIF
  598.   '
  599. RETURN
  600. > PROCEDURE xrsrc_exit
  601.   '
  602.   IF r.resident!
  603.     WORD{f.init%+4+36}=129          ! Numéro de la fonction
  604.     $c+
  605.     r%=C:f.scalc%()
  606.     $c-
  607.   ENDIF
  608.   '
  609. RETURN
  610. > PROCEDURE r.exit
  611.   '
  612.   LOCAL t&,x&,y&
  613.   '
  614.   ' Désactiver les menus (entièrement) et libérer le bureau
  615.   '
  616.   ~MENU_BAR(menutree%,0)
  617.   ~WIND_SET(0,14,0,0,0,0)       !WF_NEWDESK
  618.   '
  619.   ' RSC freigeben:
  620.   '
  621.   IF FN xrsrc_free=0
  622.     END
  623.   ENDIF
  624.   '
  625.   xrsrc_exit
  626.   m.res(190000)
  627.   '
  628.   BYTE{BASEPAGE+&H80}=0 !Seulement pour Interpt.
  629.   '
  630. RETURN
  631. > PROCEDURE r.init
  632.   '
  633.   LOCAL dh&,x&,y&,w&,h&
  634.   '
  635.   m.res(-190000)         !Veuillez aussi corriger la valeur dans R.exit (on peut aussi rechercher la longueur du RSC...)
  636.   '
  637.   xrsrc_init
  638.   '
  639.   IF NOT r.resident!
  640.     ~FORM_ALERT(1,"[3][| Je ne trouve pas le | fichier DUPLI.OVL ! ][Fin]")
  641.     ~APPL_EXIT()
  642.     END
  643.   ENDIF
  644.   IF 0=FN xrsrc_load(path_origine$+rsc$)
  645.     ~FORM_ALERT(1,"[3][| Je ne trouve pas le | fichier "+rsc$+" ! ][Fin]")
  646.     ~APPL_EXIT()
  647.     END
  648.   ENDIF
  649.   '
  650.   init_rsc
  651.   '
  652.   IF color_display!
  653.     OB_SPEC(menu_ptr%,0)=(OB_SPEC(menu_ptr%,0) AND &H0) OR &X1110000
  654.   ENDIF
  655.   '
  656. RETURN
  657. > PROCEDURE r.loadxrsrc
  658.   '
  659.   LOCAL n$,l$,p$
  660.   '
  661.   n$="DUPLI.OVL"
  662.   l$=homedir$
  663.   p$=l$+"\"+n$
  664.   '
  665.   IF FN exist(p$)
  666.     '
  667.     m.res(-12000)
  668.     '
  669.     p$=p$+CHR$(0)
  670.     l$=STRING$(25,0)
  671.     f.base%=GEMDOS(75,3,L:V:p$,L:V:l$,L:V:l$)
  672.     '
  673.     IF f.base%>=0
  674.       f.init%={f.base%+8}
  675.       p$=STRING$(100,0)
  676.       {f.init%+4}=V:p$
  677.       $c+
  678.       dummy%=C:f.init%(L:f.base%)
  679.       $c-
  680.       IF dummy%=0
  681.         f.scalc%={f.init%+42}
  682.         r.resident!=TRUE
  683.       ENDIF
  684.     ENDIF
  685.   ENDIF
  686.   '
  687. RETURN
  688. '
  689. ' **********************
  690. ' PROCEDURE FENETRES   *
  691. ' **********************
  692. > PROCEDURE w_open
  693.   IF fenetre_ouvrt|(0)=0    ! Fenêtre pas encore ouverte?
  694.     var%=WIND_GET(0,4,xdesk&,ydesk&,wdesk&,hdesk&)
  695.     ob_pos(page1%,0)
  696.     IF ancien_xwork&(0)+20>wdesk& OR ancien_ywork&(0)+40>hdesk& OR ancien_ywork&(0)=0
  697.       IF wdesk&>ow&+12
  698.         wdesk&=ow&+12
  699.       ENDIF
  700.       IF ydesk&+hdesk&>oh&+34
  701.         hdesk&=oh&+34
  702.       ENDIF
  703.     ELSE
  704.       xdesk&=ancien_xwork&(0)
  705.       IF ancien_ywork&(0)>ydesk& AND ancien_ywork&(0)<hdesk&
  706.         ydesk&=ancien_ywork&(0)-ydesk&
  707.       ENDIF
  708.       wdesk&=ow&+12
  709.       hdesk&=oh&+34
  710.     ENDIF
  711.     IF mint! AND mint_version&>=107
  712.       whandle%(0)=WIND_CREATE(&X1000000001111,xdesk&,ydesk&,wdesk&,hdesk&)
  713.     ELSE
  714.       whandle%(0)=WIND_CREATE(&X1111,xdesk&,ydesk&,wdesk&,hdesk&)
  715.     ENDIF
  716.     s_ptr%(0)=MALLOC(35)
  717.     w_titre(0,"Duplication Master "+version$+" ")
  718.     ~WIND_OPEN(whandle%(0),xdesk&,ydesk&,wdesk&,hdesk&)
  719.     ~WIND_CALC(1,3,xdesk&,ydesk&,wdesk&,hdesk&,xwork&(0),ywork&(0),wwork&(0),hwork&(0))
  720.     fenetre_ouvrt|(0)=1
  721.     x_clip&=xwork&(0)
  722.     y_clip&=ywork&(0)
  723.     w_clip&=wwork&(0)
  724.     h_clip&=hwork&(0)
  725.   ELSE
  726.     ~WIND_SET(whandle%(0),10,0,0,0,0)
  727.     ~FORM_DIAL(3,x%,y%,w%,h%,xwork&(0),ywork&(0),wwork&(0),hwork&(0))
  728.   ENDIF
  729. RETURN
  730. > PROCEDURE w_open2
  731.   IF fenetre_ouvrt|(1)=0    ! Fenêtre pas encore ouverte?
  732.     var%=WIND_GET(0,4,xdesk&,ydesk&,wdesk&,hdesk&)
  733.     IF ancien_xwork&(1)+20>wdesk& OR ancien_ywork&(1)+40>hdesk& OR ancien_ywork&(1)=0
  734.       IF wdesk&>340
  735.         wdesk&=340
  736.       ENDIF
  737.       IF ydesk&+hdesk&>270
  738.         hdesk&=270
  739.       ENDIF
  740.     ELSE
  741.       xdesk&=ancien_xwork&(1)
  742.       IF ancien_ywork&(1)>ydesk& AND ancien_ywork&(1)<hdesk&
  743.         ydesk&=ancien_ywork&(1)-ydesk&
  744.       ENDIF
  745.       wdesk&=340
  746.       hdesk&=270
  747.     ENDIF
  748.     IF mint! AND mint_version&>=107
  749.       whandle%(1)=WIND_CREATE(&X1000000001111,xdesk&,ydesk&,wdesk&,hdesk&)
  750.     ELSE
  751.       whandle%(1)=WIND_CREATE(&X1111,xdesk&,ydesk&,wdesk&,hdesk&)
  752.     ENDIF
  753.     s_ptr%(1)=MALLOC(24)
  754.     w_titre(1,"Informations disque")
  755.     ~WIND_OPEN(whandle%(1),xdesk&,ydesk&,wdesk&,hdesk&)
  756.     ~WIND_CALC(1,3,xdesk&,ydesk&,wdesk&,hdesk&,xwork&(1),ywork&(1),wwork&(1),hwork&(1))
  757.     fenetre_ouvrt|(1)=1
  758.     '    pas_redraw|=1      !  Redraw suit automatiquement WIND_OPEN     '
  759.   ELSE
  760.     ~WIND_SET(whandle%(1),10,0,0,0,0)
  761.     ~FORM_DIAL(3,x%,y%,w%,h%,xwork&(1),ywork&(1),wwork&(1),hwork&(1))
  762.   ENDIF
  763. RETURN
  764. > PROCEDURE w_titre(var|,titre$)
  765.   FOR i|=1 TO LEN(" "+titre$+" "+CHR$(0))
  766.     POKE s_ptr%(var|)-1+i|,ASC(MID$(" "+titre$+" "+CHR$(0),i|,1))
  767.   NEXT i|
  768.   ~WIND_SET(whandle%(var|),2,s_ptr%(var|) DIV 65536,s_ptr%(var|) MOD 65536,0,0)
  769. RETURN
  770. > PROCEDURE w_info(var|,info$)
  771.   LOCAL i|
  772.   FOR i|=1 TO LEN(" "+info$+" "+CHR$(0))
  773.     POKE i_ptr%(var|)-1+i|,ASC(MID$(" "+info$+" "+CHR$(0),i|,1))
  774.   NEXT i|
  775.   ~WIND_SET(whandle%(var|),3,i_ptr%(var|) DIV 65536,i_ptr%(var|) MOD 65536,0,0)
  776. RETURN
  777. > PROCEDURE w_close(handle%)
  778.   LOCAL i|
  779.   ~WIND_CLOSE(handle%)
  780.   ~WIND_DELETE(handle%)
  781.   get_win_num(handle%,i|)
  782.   fenetre_ouvrt|(i|)=0
  783.   whandle%(i|)=0
  784.   ~MFREE(s_ptr%(i|))
  785.   IF i|=0
  786.     ~WIND_CALC(0,3,xwork&(0),ywork&(0),wwork&(0),hwork&(0),ancien_xwork&(0),ancien_ywork&(0),ancien_wwork&(0),ancien_hwork&(0))
  787.   ELSE IF i|=1
  788.     ~WIND_CALC(0,3,xwork&(1),ywork&(1),wwork&(1),hwork&(1),ancien_xwork&(1),ancien_ywork&(1),ancien_wwork&(1),ancien_hwork&(1))
  789.   ENDIF
  790. RETURN
  791. > PROCEDURE wm_iconify(handle%)
  792.   ~WIND_SET(handle%,26,FN p(4),FN p(5),FN p(6),FN p(7))
  793.   get_win_num(handle%,i|)
  794.   ~WIND_GET(handle%,4,xwork&(i|),ywork&(i|),wwork&(i|),hwork&(i|))
  795. RETURN
  796. > PROCEDURE wm_uniconify(handle%)
  797.   ~WIND_SET(handle%,27,FN p(4),FN p(5),FN p(6),FN p(7))
  798.   get_win_num(handle%,i|)
  799.   ~WIND_GET(handle%,4,xwork&(i|),ywork&(i|),wwork&(i|),hwork&(i|))
  800. RETURN
  801. > PROCEDURE do_redraw(handle%,x_clip&,y_clip&,w_clip&,h_clip&)
  802.   LOCAL xw&,yw&,ww&,hw&,i|
  803.   get_win_num(handle%,i|)
  804.   IF mint_version&>=107
  805.     ~WIND_GET(handle%,26,iconify&,dummy&,dummy&,dummy&)
  806.   ENDIF
  807.   DEFFILL ,0,0
  808.   BOUNDARY 0
  809.   GRAPHMODE 1
  810.   PBOX xwork&(i|),ywork&(i|),xwork&(i|)+wwork&(i|),ywork&(i|)+hwork&(i|)
  811.   GRAPHMODE 1
  812.   IF i|=0 AND fenetre_ouvrt|(i|)=1
  813.     IF iconify& AND mint!
  814.       ob_pos(iconify%,i|+1)
  815.       new_ob_pos(iconify%,i|+1,xwork&(0)+2,ywork&(0)+5)
  816.       ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  817.     ELSE
  818.       affiche_page(page|,x_clip&,y_clip&,w_clip&,h_clip&)
  819.     ENDIF
  820.   ELSE IF i|=1 AND fenetre_ouvrt|(i|)=1
  821.     IF iconify& AND mint!
  822.       ob_pos(iconify%,i|+1)
  823.       new_ob_pos(iconify%,i|+1,xwork&(1)+2,ywork&(1)+5)
  824.       ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  825.     ELSE
  826.       aff_info
  827.     ENDIF
  828.   ENDIF
  829. RETURN
  830. > PROCEDURE w_full
  831.   LOCAL xxwork&,yywork&,wwwork&,hhwork&
  832.   xwork&(0)=INT((WORK_OUT(0))/2)
  833.   xwork&(0)=xwork&(0)-(wwork&(0)/2)
  834.   ywork&(0)=INT((WORK_OUT(1))/2)
  835.   ywork&(0)=ywork&(0)-(hwork&(0)/2)
  836.   ~WIND_GET(whandle%(0),5,xxwork&,yywork&,wwwork&,hhwork&)
  837.   ~WIND_SET(whandle%(0),5,xwork&(0),ywork&(0),wwwork&,hhwork&)
  838.   ~WIND_GET(whandle%(0),4,xwork&(0),ywork&(0),wwork&(0),hwork&(0))
  839.   ~FORM_DIAL(3,x%,y%,w%,h%,xwork&(0),ywork&(0),wwork&(0)-1,hwork&(0)-1)
  840. RETURN
  841. > PROCEDURE w_move(handle%)
  842.   LOCAL xw&,yw&,ww&,hw&
  843.   get_win_coord(handle%,xw&,yw&,ww&,hw&)
  844.   ~WIND_SET(handle%,5,FN p(4),FN p(5),FN p(6),FN p(7))
  845.   ~WIND_GET(handle%,4,xw&,yw&,ww&,hw&)
  846.   set_win_coord(handle%,xw&,yw&,ww&,hw&)
  847.   x_clip&=xw&
  848.   y_clip&=yw&
  849.   w_clip&=ww&
  850.   h_clip&=hw&
  851.   IF mint_version&>=107
  852.     ~WIND_GET(handle%,26,iconify&,dummy&,dummy&,dummy&)
  853.   ENDIF
  854.   IF handle%=whandle%(0) AND iconify&=0
  855.     ob_pos(page1%,0)
  856.     new_ob_pos(page1%,0,xwork&(0)+5,ywork&(0)+5)
  857.   ELSE IF iconify&=1
  858.     ob_pos(iconify%,i|+1)
  859.     new_ob_pos(iconify%,i|+1,xwork&(0)+2,ywork&(0)+5)
  860.   ENDIF
  861. RETURN
  862. > PROCEDURE get_win_coord(handle%,VAR xw&,yw&,ww&,hw&)
  863.   LOCAL i|
  864.   get_win_num(handle%,i|)
  865.   xw&=xwork&(i|)
  866.   yw&=ywork&(i|)
  867.   ww&=wwork&(i|)
  868.   hw&=hwork&(i|)
  869. RETURN
  870. > PROCEDURE set_win_coord(handle%,xw&,yw&,ww&,hw&)
  871.   LOCAL i|
  872.   get_win_num(handle%,i|)
  873.   xwork&(i|)=xw&
  874.   ywork&(i|)=yw&
  875.   wwork&(i|)=ww&
  876.   hwork&(i|)=hw&
  877. RETURN
  878. > PROCEDURE get_win_num(handle%,VAR fenetre|)
  879.   IF handle%=whandle%(0)
  880.     fenetre|=0
  881.   ELSE IF handle%=whandle%(1)
  882.     fenetre|=1
  883.   ELSE IF handle%=whandle%(2)
  884.     fenetre|=2
  885.   ELSE
  886.     fenetre|=100
  887.   ENDIF
  888. RETURN
  889. > PROCEDURE w_redraw(handle%)
  890.   LOCAL x%,y%,w%,h%
  891.   IF pas_redraw%=1
  892.     pas_redraw%=0
  893.   ELSE
  894.     ~WIND_UPDATE(1)
  895.     ~WIND_GET(handle%,11,x%,y%,w%,h%)
  896.     WHILE NOT w%=0
  897.       IF RC_INTERSECT(FN p(4),FN p(5),FN p(6),FN p(7),x%,y%,w%,h%)
  898.         CLIP x%,y%,w%,h%
  899.         x_clip&=x%
  900.         y_clip&=y%
  901.         w_clip&=w%
  902.         h_clip&=h%
  903.         do_redraw(handle%,x_clip&,y_clip&,w_clip&,h_clip&)
  904.       ENDIF
  905.       ~WIND_GET(handle%,12,x%,y%,w%,h%)
  906.     WEND
  907.     CLIP OFF
  908.     x_clip&=xwork&(0)
  909.     y_clip&=ywork&(0)
  910.     w_clip&=wwork&(0)
  911.     h_clip&=hwork&(0)
  912.     ~WIND_UPDATE(0)
  913.     IF reviens|=1
  914.       reviens|=0
  915.       ~WIND_SET(whandle%(1),10,0,0,0,0)
  916.     ENDIF
  917.   ENDIF
  918. RETURN
  919. '
  920. ' ************************
  921. ' PROCEDURE DU PROGRAMME *
  922. ' ************************
  923. '
  924. > PROCEDURE affiche_page(page|,x_clip&,y_clip&,w_clip&,h_clip&)
  925.   LOCAL i|
  926.   ob_pos(page1%,0)
  927.   new_ob_pos(page1%,0,xwork&(0)+5,ywork&(0)+5)
  928.   ~OBJC_DRAW(page1%,0,12,x_clip&,y_clip&,w_clip&,h_clip&)
  929.   aff_disk1
  930.   aff_disk2
  931. RETURN
  932. > PROCEDURE lire_disk
  933.   LOCAL compt%,piste&,face|,cx&,cy&,aff!,aff2!,cx2&,cy2&,s.elected!
  934.   ~WIND_GET(whandle%(0),10,dessus%,dummy&,dummy&,dummy&)
  935.   IF mint_version&>=107
  936.     ~WIND_GET(whandle%(0),26,iconify&,dummy&,dummy&,dummy&)
  937.   ENDIF
  938.   IF mint!=FALSE
  939.     iconify&=0
  940.   ENDIF
  941.   IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=1 AND iconify&=0
  942.     aff!=TRUE
  943.     DEFMOUSE 2
  944.   ELSE IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=1 AND iconify&=1
  945.     aff2!=TRUE
  946.   ENDIF
  947.   copie!=FALSE
  948.   IF d_virus!
  949.     virus
  950.   ENDIF
  951.   tampon%=MALLOC(512)
  952.   IF XBIOS(8,L:tampon%,L:0,0,1,0,0,1)<0
  953.     ALERT 3,"|Impossible de lire le disque!",1," Ok ",back|
  954.     ~MFREE(tampon%)
  955.   ELSE
  956.     ~MFREE(tampon%)
  957.     bpb%=BIOS(7,0)
  958.     IF bpb%>0
  959.       '
  960.       t.secteur%=WORD{bpb%}            !Taille en octets d'un secteur
  961.       '
  962.       n.clust_sect%=WORD{bpb%+2}      !Nombre de clusteurs par secteur
  963.       '
  964.       t.clust%=WORD{bpb%+4}           !Taille en octets d'un clusteur
  965.       '
  966.       l.rep%=WORD{bpb%+6}             !Longeur du repertoire en secteur
  967.       '
  968.       t.fat%=WORD{bpb%+8}             !Taille d'une fat en secteur
  969.       '
  970.       n.2fat%=WORD{bpb%+10}           !Numero du secteur de la 2ème Fat
  971.       '
  972.       n.clust%=WORD{bpb%+12}          !Numero du secteur du premier cluster de donnees
  973.       '
  974.       n.cluster%=WORD{bpb%+14}        !Nombre de cluster de donnees existants
  975.       '
  976.       flag%=WORD{bpb%+16}             !Flags
  977.       '
  978.       n.piste%=WORD{bpb%+18}          !Nombre de pistes
  979.       '
  980.       n.face%=WORD{bpb%+20}           !Nombre de Faces
  981.       '
  982.       n.secteur%=WORD{bpb%+22}        !Nombre de secteurs
  983.       '
  984.       t.image%=(t.secteur%*n.secteur%)*(n.piste%)
  985.       '
  986.       IF aff!
  987.         ob_pos(page1%,ic_disk1&)
  988.         cx2&=ox&+(ow&/2)+326
  989.         cy2&=oy&+(oh&/2)+48
  990.         TEXT ox&+377,oy&+oh&+11," Piste: "+STR$(piste&,2)+"    Face: "+STR$(face|+1)+" "
  991.         BOX ox&+376,oy&+oh&-3,ox&+553,oy&+oh&+14
  992.       ENDIF
  993.       '
  994.       ob_pos(page1%,ic_disk1&)
  995.       cx&=ox&+(ow&/2)+9
  996.       cy&=oy&+(oh&/2)+48
  997.       IF mem!
  998.         ~MFREE(image%)
  999.       ENDIF
  1000.       image%=MALLOC((t.secteur%*n.secteur%)*(n.piste%))
  1001.       IF image%<>0
  1002.         mem!=TRUE
  1003.         compt%=compt%-(t.secteur%*n.secteur%/n.face%)
  1004.         IF aff!
  1005.           GRAPHMODE 1
  1006.           DEFFILL ,0,0
  1007.           PBOX cx&-104,cy&-82,cx&+102,cy&+83
  1008.           PBOX cx2&-101,cy2&-82,cx2&+105,cy2&+83
  1009.           BOX ox&+59,oy&+oh&-3,ox&+236,oy&+oh&+14
  1010.         ENDIF
  1011.         FOR piste&=0 TO n.piste%-1
  1012.           IF aff!
  1013.             CIRCLE cx&,cy&,n.piste%-(1+piste&)
  1014.           ELSE IF aff2!
  1015.             IF s.elected!
  1016.               s.elected!=FALSE
  1017.               ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,0,1)  ! Etat désélectionné
  1018.             ELSE
  1019.               s.elected!=TRUE
  1020.               ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,1,1)  ! Etat sélectionné
  1021.             ENDIF
  1022.             ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  1023.           ENDIF
  1024.           IF mint!
  1025.             t.time%=TIMER
  1026.             REPEAT
  1027.             UNTIL t.time%+(t.pause#*200)<=TIMER
  1028.           ENDIF
  1029.           FOR face|=0 TO n.face%-1
  1030.             ADD compt%,(t.secteur%*n.secteur%/n.face%)
  1031.             IF aff!
  1032.               DEFMOUSE 2
  1033.             ENDIF
  1034.             var%=XBIOS(8,L:image%+compt%,L:0,0,1,piste&,face|,n.secteur%/n.face%)
  1035.             IF aff!
  1036.               TEXT ox&+60,oy&+oh&+11," Piste: "+STR$(piste&,2)+"    Face: "+STR$(face|+1)+" "
  1037.               DEFMOUSE 2
  1038.             ENDIF
  1039.             IF var%<0
  1040.               son2
  1041.               ALERT 3," Une erreur s'est produite | durant la lecture des | secteurs sur la disquette ! ",1,"Abandon",back|
  1042.               ~MFREE(image%)
  1043.               mem!=FALSE
  1044.             ENDIF
  1045.             EXIT IF mem!=FALSE
  1046.           NEXT face|
  1047.           EXIT IF mem!=FALSE
  1048.         NEXT piste&
  1049.       ELSE
  1050.         ALERT 3,"| Memoire insufisante pour | cette application!",1," Ok ",back%
  1051.       ENDIF
  1052.     ENDIF
  1053.     IF mem!
  1054.       ~MENU_IENABLE(menu_ptr%,sauve_image&,1)
  1055.       ~MENU_IENABLE(menu_ptr%,faire_copie&,1)
  1056.       son
  1057.       IF aff2! AND s.elected!
  1058.         ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,0,1)  ! Etat désélectionné
  1059.         ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  1060.       ENDIF
  1061.     ELSE IF aff!
  1062.       PBOX cx&-104,cy&-82,cx&+102,cy&+83
  1063.       PBOX cx2&-101,cy2&-82,cx2&+105,cy2&+83
  1064.       BOX ox&+59,oy&+oh&-3,ox&+236,oy&+oh&+14
  1065.       TEXT ox&+60,oy&+oh&+11," Piste:       Face:   "
  1066.     ELSE IF aff2! AND s.elected!
  1067.       ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,0,1)  ! Etat désélectionné
  1068.       ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  1069.     ENDIF
  1070.   ENDIF
  1071.   DEFMOUSE 0
  1072. RETURN
  1073. > PROCEDURE sauve_image
  1074.   LOCAL a$
  1075.   IF path_sauve_image$=""
  1076.     path_sauve_image$=path_courant$
  1077.   ENDIF
  1078.   FILESELECT #"SAUVE MASTER DISQUE",path_sauve_image$+"\*.DUP","",a$
  1079.   IF a$>"" AND a$<>"\"
  1080.     IF RIGHT$(a$,4)<>".DUP" AND RIGHT$(a$,1)<>"."
  1081.       a$=a$+".DUP"
  1082.     ENDIF
  1083.     path_sauve_image$=LEFT$(a$,RINSTR(a$,"\")-1)
  1084.     IF DFREE(ASC(LEFT$(a$,1))-64)>t.image%+30
  1085.       ALERT 3," | Voulez-vous que le master |    soit compressé ?",2," OUI | NON ",back|
  1086.       DEFMOUSE 2
  1087.       OPEN "O",#1,a$
  1088.       CHAR{{OB_SPEC(alert1%,3)}}="Sauvegarde du master ..."
  1089.       show_dialog(alert1%)
  1090.       DEFMOUSE 2
  1091.       PRINT #1,"Dupli "+version$+SPACE$(25)
  1092.       PRINT #1,MKI$(t.secteur%);
  1093.       PRINT #1,MKI$(n.clust_sect%);
  1094.       PRINT #1,MKI$(t.clust%);
  1095.       PRINT #1,MKI$(l.rep%);
  1096.       PRINT #1,MKI$(t.fat%);
  1097.       PRINT #1,MKI$(n.2fat%);
  1098.       PRINT #1,MKI$(n.clust%);
  1099.       PRINT #1,MKI$(n.cluster%);
  1100.       PRINT #1,MKI$(flag%);
  1101.       PRINT #1,MKI$(n.piste%);
  1102.       PRINT #1,MKI$(n.face%);
  1103.       PRINT #1,MKI$(n.secteur%);
  1104.       PRINT #1,MKL$(t.image%);
  1105.       BPUT #1,image%,t.image%
  1106.       CLOSE #1
  1107.       IF back|=1
  1108.         CHAR{{OB_SPEC(alert1%,3)}}="Compression en cours..."
  1109.         show_dialog(alert1%)
  1110.         DEFMOUSE 2
  1111.         nomfich$=path_orig$+"DUPLI.CMP"+CHR$(0)
  1112.         f_comp$=RIGHT$(a$,LEN(a$)-RINSTR(a$,"\"))
  1113.         f_comp$=LEFT$(f_comp$,LEN(f_comp$)-4)
  1114.         parametre$=" a -q "+f_comp$+" "+a$+CHR$(0)
  1115.         nomfich%=VARPTR(nomfich$)
  1116.         parametre%=VARPTR(parametre$)
  1117.         var%=GEMDOS(&H4B,0,L:nomfich%,L:parametre%,L:0)   ! COMPRESSION
  1118.         '
  1119.         IF var%<0            ! Y A T'IL EU UNE ERREUR?
  1120.           IF var%=-33
  1121.             ALERT 3,"IMPOSSIBLE DE TRAITER |   VOTRE FICHIER ! |IL MANQUE LE FICHIER |    DUPLI.CMP !",1," Ok ",back|
  1122.           ELSE
  1123.             ERROR var%         ! SIMULER L'ERREUR
  1124.           ENDIF
  1125.         ELSE
  1126.           OPEN "O",#1,a$
  1127.           PRINT #1,"Dupli "+version$+" Archiver par LHARC v.2.20"
  1128.           CLOSE #1
  1129.         ENDIF
  1130.         '
  1131.         DEFMOUSE 0
  1132.       ELSE IF back|=2
  1133.         fich$=path_orig$+RIGHT$(a$,LEN(a$)-RINSTR(a$,"\"))
  1134.         fich$=LEFT$(fich$,LEN(fich$)-3)+"LZH"
  1135.         IF EXIST(fich$)
  1136.           KILL fich$
  1137.         ENDIF
  1138.       ENDIF
  1139.       hide_dialog(alert1%)
  1140.       DEFMOUSE 0
  1141.     ELSE
  1142.       ~FORM_ALERT(1,"[1][La place libre sur le|disque est insuffisante !][CONFIRMER]")
  1143.     ENDIF
  1144.   ENDIF
  1145. RETURN
  1146. > PROCEDURE lire_image
  1147.   LOCAL aff!
  1148.   ~WIND_GET(whandle%(0),10,dessus%,dummy&,dummy&,dummy&)
  1149.   IF mint_version&>=107
  1150.     ~WIND_GET(whandle%(0),26,iconify&,dummy&,dummy&,dummy&)
  1151.   ENDIF
  1152.   IF mint!=FALSE
  1153.     iconify&=0
  1154.   ENDIF
  1155.   IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=1 AND iconify&=0
  1156.     aff!=TRUE
  1157.   ENDIF
  1158.   IF path_lire_image$=""
  1159.     path_lire_image$=path_courant$
  1160.   ENDIF
  1161.   FILESELECT #"LIRE MASTER DISQUE",path_lire_image$+"\*.DUP","",a$
  1162.   IF a$>"" AND a$<>"\"
  1163.     IF mem!
  1164.       mem!=FALSE
  1165.       copie!=FALSE
  1166.       ~MFREE(image%)
  1167.     ENDIF
  1168.     path_lire_image$=LEFT$(a$,RINSTR(a$,"\")-1)
  1169.   ok:
  1170.     DEFMOUSE 2
  1171.     OPEN "I",#1,a$
  1172.     DEFMOUSE 2
  1173.     LINE INPUT #1,inform_version$
  1174.     DEFMOUSE 2
  1175.     IF LEFT$(inform_version$,5)="Dupli" AND RIGHT$(inform_version$,25)<>"Archiver par LHARC v.2.20"
  1176.       CHAR{{OB_SPEC(alert1%,3)}}="Lecture du master ..."
  1177.       show_dialog(alert1%)
  1178.       DEFMOUSE 2
  1179.       t.secteur%=CVI(INPUT$(2,#1))
  1180.       n.clust_sect%=CVI(INPUT$(2,#1))
  1181.       t.clust%=CVI(INPUT$(2,#1))
  1182.       l.rep%=CVI(INPUT$(2,#1))
  1183.       t.fat%=CVI(INPUT$(2,#1))
  1184.       n.2fat%=CVI(INPUT$(2,#1))
  1185.       n.clust%=CVI(INPUT$(2,#1))
  1186.       n.cluster%=CVI(INPUT$(2,#1))
  1187.       flag%=CVI(INPUT$(2,#1))
  1188.       n.piste%=CVI(INPUT$(2,#1))
  1189.       n.face%=CVI(INPUT$(2,#1))
  1190.       n.secteur%=CVI(INPUT$(2,#1))
  1191.       t.image%=CVL(INPUT$(4,#1))
  1192.       image%=MALLOC(t.image%)
  1193.       IF image%<>0
  1194.         DEFMOUSE 2
  1195.         BGET #1,image%,t.image%
  1196.         mem!=TRUE
  1197.       ELSE
  1198.         ALERT 3,"| Memoire insufisante pour | cette application!",1," Ok ",back%
  1199.       ENDIF
  1200.       CLOSE #1
  1201.       hide_dialog(alert1%)
  1202.       IF decompression!
  1203.         decompression!=FALSE
  1204.         OPEN "O",#1,a$
  1205.         PRINT #1,"Dupli "+version$+" Archiver par LHARC v.2.20"
  1206.         CLOSE #1
  1207.       ENDIF
  1208.     ELSE IF RIGHT$(inform_version$,25)="Archiver par LHARC v.2.20"
  1209.       CLOSE #1
  1210.       DEFMOUSE 2
  1211.       KILL a$
  1212.       CHAR{{OB_SPEC(alert1%,3)}}="Décompression en cours..."
  1213.       show_dialog(alert1%)
  1214.       DEFMOUSE 2
  1215.       nomfich$=path_orig$+"DUPLI.CMP"+CHR$(0)
  1216.       f_comp$=RIGHT$(a$,LEN(a$)-RINSTR(a$,"\"))
  1217.       f_comp$=LEFT$(f_comp$,LEN(f_comp$)-4)+".LZH"
  1218.       parametre$=" x -q -m "+f_comp$+" "+LEFT$(a$,RINSTR(a$,"\"))+CHR$(0)
  1219.       nomfich%=VARPTR(nomfich$)
  1220.       parametre%=VARPTR(parametre$)
  1221.       var%=GEMDOS(&H4B,0,L:nomfich%,L:parametre%,L:0)   ! COMPRESSION
  1222.       '
  1223.       IF var%<0            ! Y A T'IL EU UNE ERREUR?
  1224.         IF var%=-33
  1225.           ALERT 3,"IMPOSSIBLE DE TRAITER |   VOTRE FICHIER ! |IL MANQUE LE FICHIER |    DUPLI.CMP !",1," Ok ",back|
  1226.         ELSE
  1227.           ERROR var%         ! SIMULER L'ERREUR
  1228.         ENDIF
  1229.       ELSE
  1230.         decompression!=TRUE
  1231.         GOTO ok
  1232.       ENDIF
  1233.       '
  1234.       DEFMOUSE 0
  1235.     ELSE
  1236.       ALERT 1,"| Fichier non reconu !",1," Ok ",back|
  1237.     ENDIF
  1238.     CLOSE #1
  1239.     DEFMOUSE 0
  1240.     IF aff!
  1241.       ~FORM_DIAL(3,x%,y%,w%,h%,xwork&(0),ywork&(0),wwork&(0)-1,hwork&(0)-1)
  1242.     ENDIF
  1243.   ENDIF
  1244.   IF mem!
  1245.     ~MENU_IENABLE(menu_ptr%,sauve_image&,1)
  1246.     ~MENU_IENABLE(menu_ptr%,faire_copie&,1)
  1247.   ENDIF
  1248. RETURN
  1249. > PROCEDURE make_copy
  1250.   LOCAL compt%,piste&,face|,cx&,cy&,aff!,aff2!,n.bpb%,s.elected!
  1251.   ~WIND_GET(whandle%(0),10,dessus%,dummy&,dummy&,dummy&)
  1252.   IF mint_version&>=107
  1253.     ~WIND_GET(whandle%(0),26,iconify&,dummy&,dummy&,dummy&)
  1254.   ENDIF
  1255.   IF mint!=FALSE
  1256.     iconify&=0
  1257.   ENDIF
  1258.   IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=1 AND iconify&=0
  1259.     aff!=TRUE
  1260.     DEFMOUSE 2
  1261.   ELSE IF whandle%(0)=dessus% AND fenetre_ouvrt|(0)=1 AND iconify&=1
  1262.     aff2!=TRUE
  1263.   ENDIF
  1264.   copie!=TRUE
  1265.   format!=TRUE
  1266.   tampon%=MALLOC(t.secteur%)
  1267.   IF XBIOS(8,L:tampon%,L:0,0,1,0,0,1)>=0
  1268.     n.bpb%=BIOS(7,0)
  1269.     IF n.bpb%>0
  1270.       IF t.secteur%=WORD{n.bpb%} AND n.clust_sect%=WORD{n.bpb%+2} AND t.clust%=WORD{n.bpb%+4} AND n.piste%=WORD{n.bpb%+18} AND n.face%=WORD{n.bpb%+20} AND n.secteur%=WORD{n.bpb%+22}
  1271.         format!=FALSE
  1272.       ENDIF
  1273.     ENDIF
  1274.   ENDIF
  1275.   ~MFREE(tampon%)
  1276.   adr_fmt%=MALLOC(10050)
  1277.   IF adr_fmt%<>0
  1278.     ob_pos(page1%,ic_disk1&)
  1279.     cx&=ox&+(ow&/2)+326
  1280.     cy&=oy&+(oh&/2)+48
  1281.     compt%=compt%-(t.secteur%*n.secteur%/n.face%)
  1282.     spp%=n.secteur%/n.face%
  1283.     IF aff!
  1284.       GRAPHMODE 1
  1285.       DEFFILL ,0,0
  1286.       PBOX cx&-101,cy&-82,cx&+105,cy&+83
  1287.       BOX ox&+376,oy&+oh&-3,ox&+553,oy&+oh&+14
  1288.     ENDIF
  1289.     FOR piste&=0 TO n.piste%-1
  1290.       IF aff!
  1291.         CIRCLE cx&,cy&,n.piste%-(1+piste&)
  1292.       ELSE IF aff2!
  1293.         IF s.elected!
  1294.           s.elected!=FALSE
  1295.           ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,0,1)  ! Etat désélectionné
  1296.         ELSE
  1297.           s.elected!=TRUE
  1298.           ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,1,1)  ! Etat sélectionné
  1299.         ENDIF
  1300.         ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  1301.       ENDIF
  1302.       IF mint!
  1303.         t.time%=TIMER
  1304.         REPEAT
  1305.         UNTIL t.time%+(t.pause#*200)<=TIMER
  1306.       ENDIF
  1307.       FOR face|=0 TO n.face%-1
  1308.         IF format!
  1309.           IF aff!
  1310.             DEFMOUSE 2
  1311.           ENDIF
  1312.           var%=XBIOS(10,L:adr_fmt%,L:0,0,spp%,piste&,face|,1,L:&H87654321,&HE5E5)
  1313.         ENDIF
  1314.         IF var%>=0
  1315.           IF aff!
  1316.             DEFMOUSE 2
  1317.           ENDIF
  1318.           ADD compt%,(t.secteur%*n.secteur%/n.face%)
  1319.           var%=XBIOS(9,L:image%+compt%,L:0,0,1,piste&,face|,n.secteur%/n.face%)
  1320.           IF aff!
  1321.             TEXT ox&+377,oy&+oh&+11," Piste: "+STR$(piste&,2)+"    Face: "+STR$(face|+1)+" "
  1322.             DEFMOUSE 2
  1323.           ENDIF
  1324.         ENDIF
  1325.         IF var%<0
  1326.           ALERT 3," Une erreur s'est produite | durant l'écriture des | secteurs sur la disquette ! ",1,"Abandon",back|
  1327.           copie!=FALSE
  1328.         ENDIF
  1329.         EXIT IF copie!=FALSE
  1330.       NEXT face|
  1331.       EXIT IF copie!=FALSE
  1332.     NEXT piste&
  1333.     ~MFREE(adr_fmt%)
  1334.     IF copie!=FALSE AND aff!
  1335.       PBOX cx&-101,cy&-82,cx&+105,cy&+83
  1336.     ELSE IF copie!=FALSE AND aff2!
  1337.       ~OBJC_CHANGE(iconify%,1,0,x%,y%,w%,h%,0,1)  ! Etat désélectionné
  1338.       ~OBJC_DRAW(iconify%,i|+1,1,x_clip&,y_clip&,w_clip&,h_clip&)
  1339.     ENDIF
  1340.     IF copie!
  1341.       son
  1342.     ENDIF
  1343.   ENDIF
  1344.   DEFMOUSE 0
  1345. RETURN
  1346. > PROCEDURE aff_disk1
  1347.   LOCAL cx&,cy&
  1348.   IF mem!
  1349.     ob_pos(page1%,ic_disk1&)
  1350.     cx&=ox&+(ow&/2)+9
  1351.     cy&=oy&+(oh&/2)+48
  1352.     GRAPHMODE 1
  1353.     DEFFILL ,0,0
  1354.     PBOX cx&-104,cy&-82,cx&+102,cy&+83
  1355.     BOX ox&+59,oy&+oh&-3,ox&+236,oy&+oh&+14
  1356.     FOR piste&=0 TO n.piste%-1
  1357.       DEFMOUSE 2
  1358.       CIRCLE cx&,cy&,n.piste%-(1+piste&)
  1359.       TEXT ox&+60,oy&+oh&+11," Piste: "+STR$(piste&,2)+"    Face: "+STR$(face|+1)+" "
  1360.     NEXT piste&
  1361.     DEFMOUSE 0
  1362.   ENDIF
  1363. RETURN
  1364. > PROCEDURE aff_disk2
  1365.   IF copie!
  1366.     ob_pos(page1%,ic_disk1&)
  1367.     cx&=ox&+(ow&/2)+326
  1368.     cy&=oy&+(oh&/2)+48
  1369.     GRAPHMODE 1
  1370.     DEFFILL ,0,0
  1371.     PBOX cx&-101,cy&-82,cx&+105,cy&+83
  1372.     BOX ox&+376,oy&+oh&-3,ox&+553,oy&+oh&+14
  1373.     FOR piste&=0 TO n.piste%-1
  1374.       DEFMOUSE 2
  1375.       CIRCLE cx&,cy&,n.piste%-(1+piste&)
  1376.       TEXT ox&+377,oy&+oh&+11," Piste: "+STR$(piste&,2)+"    Face: "+STR$(face|+1)+" "
  1377.     NEXT piste&
  1378.     DEFMOUSE 0
  1379.   ENDIF
  1380. RETURN
  1381. > PROCEDURE infos
  1382.   w_open2
  1383. RETURN
  1384. > PROCEDURE aff_info
  1385.   DEFTEXT 1,0,0,13
  1386.   TEXT xwork&(1)+3,ywork&(1)+16,"Taille en octets d'un secteur   : "+STR$(t.secteur%)
  1387.   TEXT xwork&(1)+3,ywork&(1)+(16*2),"Nombre de clusters par secteur  : "+STR$(n.clust_sect%)
  1388.   TEXT xwork&(1)+3,ywork&(1)+(16*3),"Taille en octets d'un cluster   : "+STR$(t.clust%)
  1389.   TEXT xwork&(1)+3,ywork&(1)+(16*4),"Longeur du répertoire en secteur: "+STR$(l.rep%)
  1390.   TEXT xwork&(1)+3,ywork&(1)+(16*5),"Taille d'une fat en secteur     : "+STR$(t.fat%)
  1391.   TEXT xwork&(1)+3,ywork&(1)+(16*6),"Numéro du secteur de la 2ème Fat: "+STR$(n.2fat%)
  1392.   TEXT xwork&(1)+3,ywork&(1)+(16*7),"Premier cluster de données      : "+STR$(n.clust%)
  1393.   TEXT xwork&(1)+3,ywork&(1)+(16*8),"Cluster de données existants    : "+STR$(n.cluster%)
  1394.   TEXT xwork&(1)+3,ywork&(1)+(16*9),"Flags                           : "+STR$(flag%)
  1395.   TEXT xwork&(1)+3,ywork&(1)+(16*10),"Nombre de pistes                : "+STR$(n.piste%)
  1396.   TEXT xwork&(1)+3,ywork&(1)+(16*11),"Nombre de Faces                 : "+STR$(n.face%)
  1397.   TEXT xwork&(1)+3,ywork&(1)+(16*12),"Nombre de secteurs par piste    : "+STR$(n.secteur%/MAX(n.face%,1))
  1398.   TEXT xwork&(1)+3,ywork&(1)+(16*13),"Taille mémoire du disque        : "+STR$(t.image%)
  1399.   '
  1400. RETURN
  1401. > PROCEDURE son
  1402.   SOUND 1,15,7,7,2
  1403.   SOUND 1,15,9,7,2
  1404.   SOUND 1,15,7,7,2
  1405.   SOUND 1,0
  1406. RETURN
  1407. > PROCEDURE son2
  1408.   SOUND 1,15,7,2,2
  1409.   SOUND 1,15,9,2,2
  1410.   SOUND 1,15,7,2,2
  1411.   SOUND 1,0
  1412. RETURN
  1413. > PROCEDURE virus
  1414.   LOCAL somme%
  1415.   IF t.secteur%=0
  1416.     t.secteur%=512
  1417.   ENDIF
  1418.   tampon%=MALLOC(t.secteur%)
  1419.   '
  1420.   IF XBIOS(8,L:tampon%,L:0,0,1,0,0,1)<0
  1421.     ALERT 3,"|Impossible de lire le disque!",1," Ok ",back|
  1422.   ELSE
  1423.     somme%=0
  1424.     '
  1425.     FOR i%=0 TO 510 STEP 2
  1426.       ADD somme%,DPEEK(tampon%+i%)
  1427.     NEXT i%
  1428.     '
  1429.     somme%=somme% AND 65535
  1430.     '
  1431.     IF somme%=&H1234
  1432.       ALERT 3,"Le secteur boot est |exécutable, il contient |probablement un virus!| Dois-je le modifier?",1," Oui | Non ",back|
  1433.       '
  1434.       IF back|=1
  1435.         '
  1436.         ' Modifier un octet pour que la Checksum ne soit plus conforme
  1437.         '
  1438.         POKE tampon%+511,(PEEK(tampon%+511)+1) AND 255
  1439.         '
  1440.         ' Réécrire le tampon:
  1441.         '
  1442.       recommence:
  1443.         ret%=XBIOS(9,L:tampon%,L:0,0,1,0,0,1)<0
  1444.         '
  1445.         IF ret%=-13
  1446.           ALERT 3,"| La disquette est protégée | contre l'écriture! | Voulez_vous recommencer?",1," Oui | Non ",back|
  1447.           IF back|=1
  1448.             GOTO recommence
  1449.           ENDIF
  1450.         ELSE
  1451.           IF ret%<0
  1452.             ALERT 3," | Erreur Disque!   ",1," Ok ",back|
  1453.           ENDIF
  1454.         ENDIF
  1455.       ENDIF
  1456.     ENDIF
  1457.   ENDIF
  1458.   ~MFREE(tampon%=malloc%)
  1459. RETURN
  1460. > PROCEDURE mint_delay
  1461.   '  LET abre0&=0 ! BOX dans l'arbre DELAY
  1462.   '  LET tpause&=7 ! FTEXT dans l'arbre DELAY
  1463.   '  LET confirmer&=8 ! BUTTON dans l'arbre DELAY
  1464.   '  LET annuler&=9 ! BUTTON dans l'arbre DELAY
  1465.   LOCAL var&
  1466.   CHAR{{OB_SPEC(m_delay%,7)}}=LEFT$(STR$(t.pause#),1)+RIGHT$(STR$(t.pause#),1)
  1467.   show_dialog(m_delay%)
  1468.   var&=FORM_DO(m_delay%,0)
  1469.   IF var&=8
  1470.     t.pause#=VAL(LEFT$(CHAR{{OB_SPEC(m_delay%,7)}},1)+"."+RIGHT$(CHAR{{OB_SPEC(m_delay%,7)}},1))
  1471.     ~MENU_TEXT(menu_ptr%,mint_delay&,"  Mint delay "+STR$(t.pause#,3)+" sec ^M"+CHR$(0))
  1472.   ENDIF
  1473.   ~OBJC_CHANGE(m_delay%,var&,0,x%,y%,w%,h%,0,1)
  1474.   hide_dialog(m_delay%)
  1475. RETURN
  1476. '
  1477. > PROCEDURE efface_var
  1478.   LOCAL i|
  1479.   IF mem!                    ! Si une reservation de mémoire
  1480.     ~MFREE(image%)            ! Alors la rendre
  1481.   ENDIF
  1482.   FOR i|=0 TO 2
  1483.     IF fenetre_ouvrt|(i|)=1
  1484.       w_close(whandle%(i|))   ! Fermer les fenêtre ouverte
  1485.     ENDIF
  1486.   NEXT i|
  1487.   '
  1488.   ERASE whandle%(),xwork&(),ywork&(),wwork&(),hwork&()
  1489.   ERASE ancien_xwork&(),ancien_ywork&(),ancien_wwork&(),ancien_hwork&()
  1490.   ERASE fenetre_ouvrt|(),s_ptr%(),i_ptr%(),fen_ouv|()
  1491.   '
  1492.   ~MENU_BAR(menu_ptr%,0)      ! Effacer la barre de menus
  1493.   r.exit                     ! Libérer la routine RSC couleur
  1494.   ~FSETDTA(old_dta%)          ! Restaurer l'ancienne DTA
  1495.   ~RSRC_FREE()               ! Effacer les données ressource
  1496.   ~APPL_EXIT()               ! On rend la main au GEM
  1497. RETURN
  1498. > PROCEDURE sauve_options
  1499.   LOCAL i|
  1500.   DEFMOUSE 2
  1501.   OPEN "O",#1,path_orig$+"DUPLI.PAR"
  1502.   '  '
  1503.   ' SAUVE LES DIMENTIONS DES FENETRES
  1504.   '
  1505.   FOR i|=0 TO 2
  1506.     PRINT #1,MKI$(fenetre_ouvrt|(i|));
  1507.     PRINT #1,MKI$(xwork&(i|));
  1508.     PRINT #1,MKI$(ywork&(i|));
  1509.     PRINT #1,MKI$(wwork&(i|));
  1510.     PRINT #1,MKI$(hwork&(i|));
  1511.   NEXT i|
  1512.   PRINT #1,MKL$(d_virus!);
  1513.   PRINT #1,MKD$(t.pause#)
  1514.   CLOSE #1
  1515.   DEFMOUSE 0
  1516. RETURN
  1517. '
  1518.