home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 451-475 / apd457 / amoscopy / amoscopyv1_0a.asc < prev    next >
Text File  |  1992-03-01  |  24KB  |  1,103 lines

  1. '
  2. '
  3. '                                 AMOSCopy V1.0a 
  4. '                                ----------------
  5. '
  6. '                                     Author 
  7. '                                Volker Stepprath
  8. '                                 Spandauerstr.4 
  9. '                             4019 / Monheim ( Rhld )
  10. '                                    GERMANY 
  11. '
  12. '
  13. '                 ©1991 AMOS Basic V1.31 by Europress Software 
  14. '                ©28/10/1992 AMOSCopy V1.0a by Depeche Software
  15. '
  16. '
  17. '
  18. '                          AMOSCopy V1.0a is Shareware 
  19. '                       If you use this product regular, 
  20. '                       please send me what you want !?$ 
  21. '                       »» BUT NOT YOUR MOTHER-IN-LAW «« 
  22. '
  23. '
  24. '
  25. Unpack 16 To 0
  26. Colour Back $779
  27. Change Mouse 2
  28. 'Erase 16
  29. 'Break Off 
  30. Request Off 
  31. '
  32. '**** Variablen definieren ****
  33. Dim UPP(79),LOW(79)
  34. Global UPP(),LOW()
  35. Global SOURCE,TARGET,VERIFY
  36. Global ABORT,UPP,LOW,_DOIT
  37. Global XUPP,YUPP,XLOW,YLOW,UPPSIDE,LOWSIDE
  38. SOURCE=0 : TARGET=1 : VERIFY=1 : OPTION=1 : UPPSIDE=1 : LOWSIDE=1
  39. For I=0 To 79
  40.   UPP(I)=1
  41.   LOW(I)=1
  42. Next I
  43. '
  44. Set Dir 30,""
  45. Amos To Front 
  46. '
  47. '**** Speicher fÜr Blockdaten reservieren **** 
  48. Reserve As Chip Data 7,1024
  49. '
  50. '**** Hauptschleife ( MenÜabfrage ) **** 
  51. Do 
  52.   UPP=0 : LOW=0 : _DOIT=0 : XUPP=-1 : YUPP=0 : XLOW=-1 : YLOW=0
  53.   Wait 15 : Clear Key 
  54.   Repeat : Until Mouse Key=0
  55.   Repeat : Until Mouse Key>0
  56.   XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  57.   '
  58.   '**** SOURCE & TARGET festlegen **** 
  59.   If XM>30 and XM<67
  60.     Ink 4,5
  61.     If YM>35 and YM<71 or YM>81 and YM<117
  62.       Add SOURCE,1,0 To 1
  63.       Text 44,53,Str$(SOURCE)-" "
  64.       Add TARGET,1,0 To 1
  65.       Text 44,99,Str$(TARGET)-" "
  66.     End If 
  67.   End If 
  68.   '
  69.   '**** Disketteseiten modifizieren *****
  70.   If XM>82 and XM<184 and YM>57 and YM<156
  71.     _UPPERSIDE[XM,YM]
  72.   End If 
  73.   If XM>200 and XM<302 and YM>57 and YM<156
  74.     _LOWERSIDE[XM,YM]
  75.   End If 
  76.   '
  77.   '**** Verify ON / OFF **** 
  78.   If XM>37 and XM<71 and YM>147 and YM<157
  79.     If VERIFY
  80.       VERIFY=0
  81.       G[38,148,51,158,0]
  82.       G[53,148,70,158,1]
  83.     Else 
  84.       VERIFY=1
  85.       G[38,148,51,158,1]
  86.       G[53,148,70,158,0]
  87.     End If 
  88.   End If 
  89.   '
  90.   '**** Option festlegen ****
  91.   If XM>9 and XM<309 and YM>161 and YM<186
  92.     For I=0 To 6
  93.       G[10+I*43,162,50+I*43,172,0]
  94.       G[10+I*43,175,50+I*43,185,0]
  95.     Next I
  96.     Add XM,-9
  97.     XM=XM/43
  98.     If YM>161 and YM<173
  99.       OPTION=XM+1
  100.       G[10+XM*43,162,50+XM*43,172,1]
  101.     End If 
  102.     If YM>174 and YM<186
  103.       OPTION=XM+8
  104.       G[10+XM*43,175,50+XM*43,185,1]
  105.     End If 
  106.   End If 
  107.   '
  108.   '**** Option starten ****
  109.   If XM>9 and XM<40 and YM>134 and YM<146
  110.     G[10,135,39,145,1]
  111.     _CLEARSIDE[-1]
  112.     _MESSAGE[""]
  113.     Gosub "O"+Str$(OPTION)-" "
  114.     G[10,135,39,145,0]
  115.   End If 
  116. Loop 
  117. '
  118. '**** DISKCopy ****  
  119. O1:
  120.   _DISKCOPY
  121. Return 
  122. '**** Format ****  
  123. O2:
  124.   _TRACK[1]
  125.   _TRACKBLOCK[0,-1]
  126. Return 
  127. '**** QFormat **** 
  128. O3:
  129.   N$="DF"+Str$(TARGET)-" "+":"
  130.   If Exist(N$)
  131.     Ink 1
  132.     _TRACKBLOCK[0,-1]
  133.     YUPP=0 : XUPP=0
  134.     _RASTER[0,0]
  135.     _TRACK[2]
  136.     YUPP=4 : XUPP=0
  137.     _RASTER[40,0]
  138.   Else 
  139.    _MESSAGE["No DOS disk in targetdrive !"]
  140.   End If 
  141. Return 
  142. '**** Erase **** 
  143. O4:
  144.   _TRACK[3]
  145. Return 
  146. '**** Check **** 
  147. O5:
  148.   _TRACK[4]
  149. Return 
  150. '**** Install **** 
  151. O6:
  152.   _TRACKBLOCK[0,-1]
  153. Return 
  154. '**** Block Edit ****  
  155. O7:
  156.   _MESSAGE["Blocknumber (0-1758):"]
  157.   _TEXTINPUT[23]
  158.   BLOCK=Val(N$)
  159.   BLOCK=Min(1758,BLOCK)
  160.   _EDITBLOCK[BLOCK]
  161. Return 
  162. '**** Show RAW ****  
  163. O8:
  164.   _MESSAGE["Tracknumber (0-79):"]
  165.   _TEXTINPUT[21]
  166.   TRACK=Val(N$)
  167.   TRACK=Min(79,TRACK)
  168.   _RAWSHOW[TRACK]
  169. Return 
  170. '**** Info ****
  171. O9:
  172.   N$="DF"+Str$(TARGET)-" "+":"
  173.   If Exist(N$)
  174.     Dir$=N$
  175.     N$=Dir$
  176.     N$=N$-":"
  177.     N$=Left$(N$,23)
  178.     _MESSAGE[N$+"  Free:"+Str$(Dfree)-" "]
  179.   Else 
  180.     _MESSAGE["No DOS disk in targetdrive !"]
  181.   End If 
  182. Return 
  183. '**** Dir **** 
  184. O10:
  185.   _DIR
  186. Return 
  187. '**** SYS Check **** 
  188. O11:
  189.   _SYSCHECK
  190. Return 
  191. '**** SYS Reset **** 
  192. O12:
  193.   _SYSRESET
  194. Return 
  195. '**** About **** 
  196. O13:
  197.   _ABOUT
  198. Return 
  199. '**** Exit ****
  200. O14:
  201.   Erase 7
  202.   Request On 
  203.   Wait 20
  204.   End 
  205.   'System  
  206. Return 
  207. '
  208. '**** Diskettenseiten + Seitenoptionen ****
  209. Procedure _UPPERSIDE[XM,YM]
  210.   '
  211.   '**** UPPER Side BAM ****
  212.   If XM>82 and XM<183 and YM>57 and YM<146
  213.     Add XM,-83 : XM=XM/10
  214.     Add YM,-58 : YM=YM/11
  215.     TRACK=YM*10+XM
  216.     If UPP(TRACK)
  217.       UPP(TRACK)=0
  218.       G[83+XM*10,58+YM*11,92+XM*10,68+YM*11,0]
  219.     Else 
  220.       UPP(TRACK)=1
  221.       G[83+XM*10,58+YM*11,92+XM*10,68+YM*11,1]
  222.     End If 
  223.   End If 
  224.   '
  225.   If YM>146 and YM<156
  226.     '
  227.     '**** UPP On ****
  228.     If XM>83 and XM<95
  229.       G[83,147,96,155,1]
  230.       G[98,147,115,155,0]
  231.       UPPSIDE=1
  232.     End If 
  233.     '
  234.     '**** UPP Off **** 
  235.     If XM>97 and XM<116
  236.       G[83,147,96,155,0]
  237.       G[98,147,115,155,1]
  238.       UPPSIDE=0
  239.     End If 
  240.     '
  241.     '**** UPP Reverse **** 
  242.     If XM>117 and XM<150
  243.       G[117,147,149,155,1]
  244.       For I=0 To 79
  245.         If UPP(I)
  246.           UPP(I)=0
  247.         Else 
  248.           UPP(I)=1
  249.         End If 
  250.       Next I
  251.       For I=0 To 7
  252.         For I2=0 To 9
  253.           G[83+I2*10,58+I*11,92+I2*10,68+I*11,UPP(I3)]
  254.           Add I3,1
  255.         Next I2
  256.       Next I
  257.       I3=0
  258.       G[117,147,149,155,0]
  259.     End If 
  260.     '
  261.     '**** UPP Default **** 
  262.     If XM>150 and XM<183
  263.       G[151,147,182,155,1]
  264.       _CLEARSIDE[0]
  265.       For I=0 To 7
  266.         For I2=0 To 9
  267.           UPP(I3)=1
  268.           G[83+I2*10,58+I*11,92+I2*10,68+I*11,UPP(I3)]
  269.           Add I3,1
  270.         Next I2
  271.       Next I
  272.       I3=0
  273.       UPPSIDE=1
  274.       G[83,147,96,155,1]
  275.       G[98,147,115,155,0]
  276.       G[151,147,182,155,0]
  277.     End If 
  278.   End If 
  279. End Proc
  280. Procedure _LOWERSIDE[XM,YM]
  281.   '
  282.   '**** LOWER Side BAM ****
  283.   If XM>200 and XM<301 and YM>57 and YM<146
  284.     Add XM,-201 : XM=XM/10
  285.     Add YM,-58 : YM=YM/11
  286.     TRACK=YM*10+XM
  287.     If LOW(TRACK)
  288.       LOW(TRACK)=0
  289.       G[201+XM*10,58+YM*11,210+XM*10,68+YM*11,0]
  290.     Else 
  291.       LOW(TRACK)=1
  292.       G[201+XM*10,58+YM*11,210+XM*10,68+YM*11,1]
  293.     End If 
  294.   End If 
  295.   If YM>146 and YM<156
  296.     '
  297.     '**** LOW On ****
  298.     If XM>201 and XM<215
  299.       G[201,147,214,155,1]
  300.       G[216,147,233,155,0]
  301.       LOWSIDE=1
  302.     End If 
  303.     '
  304.     '**** LOW Off **** 
  305.     If XM>215 and XM<234
  306.       G[201,147,214,155,0]
  307.       G[216,147,233,155,1]
  308.       LOWSIDE=0
  309.     End If 
  310.     '
  311.     '**** LOW Reverse **** 
  312.     If XM>235 and XM<268
  313.       G[235,147,267,155,1]
  314.       For I=0 To 79
  315.         If LOW(I)
  316.           LOW(I)=0
  317.         Else 
  318.           LOW(I)=1
  319.         End If 
  320.       Next I
  321.       For I=0 To 7
  322.         For I2=0 To 9
  323.           G[201+I2*10,58+I*11,210+I2*10,68+I*11,LOW(I3)]
  324.           Add I3,1
  325.         Next I2
  326.       Next I
  327.       I3=0
  328.       G[235,147,267,155,0]
  329.     End If 
  330.     '
  331.     '**** LOW Default **** 
  332.     If XM>268 and XM<301
  333.       G[269,147,300,155,1]
  334.       _CLEARSIDE[1]
  335.       For I=0 To 7
  336.         For I2=0 To 9
  337.           LOW(I3)=1
  338.           G[201+I2*10,58+I*11,210+I2*10,68+I*11,LOW(I3)]
  339.           Add I3,1
  340.         Next I2
  341.       Next I
  342.       I3=0
  343.       LOWSIDE=1
  344.       G[201,147,214,155,1]
  345.       G[216,147,233,155,0]
  346.       G[269,147,300,155,0]
  347.     End If 
  348.   End If 
  349. End Proc
  350. Procedure _CLEARSIDE[N]
  351.   Ink 0
  352.   For I=0 To 7
  353.     For I2=0 To 9
  354.       If N=0 or N<0
  355.         Bar 84+I2*10,59+I*11 To 91+I2*10,67+I*11
  356.       End If 
  357.       If N or N<0
  358.         Bar 202+I2*10,59+I*11 To 209+I2*10,67+I*11
  359.       End If 
  360.     Next I2
  361.   Next I
  362. End Proc
  363. '**** Track kopieren ****
  364. Procedure _DISKCOPY
  365.   '
  366.   Reserve As Chip Data 2,5632
  367.   '
  368.   '**** Variablen & Adressen definieren **** 
  369.   DISKREP$=Space$(40)+Chr$(0)
  370.   DEVNAME$="trackdisk.device"+Chr$(0)
  371.   DISKREP=Varptr(DISKREP$)
  372.   '
  373.   IOREQ$=Space$(80)+Chr$(0)
  374.   IOREQADR=Varptr(IOREQ$)
  375.   '
  376.   IOREQ2$=Space$(80)+Chr$(0)
  377.   IOREQADR2=Varptr(IOREQ2$)
  378.   '
  379.   '**** Eigene Taskadresse suchen **** 
  380.   Areg(0)=0
  381.   Areg(1)=0
  382.   Dreg(0)=0
  383.   Dreg(1)=0
  384.   XFINDTASK=Execall(-294)
  385.   Loke DISKREP+$10,XFINDTASK
  386.   '
  387.   '**** Device öffnen I & II ****
  388.   Areg(0)=Varptr(DEVNAME$)
  389.   '
  390.   Areg(1)=IOREQADR
  391.   Dreg(0)=SOURCE
  392.   XOPENDEVICE=Execall(-444)
  393.   '
  394.   Areg(1)=IOREQADR2
  395.   Dreg(0)=TARGET
  396.   XOPENDEVICE=Execall(-444)
  397.   '
  398.   '**** Befehl aufrufen **** 
  399.   Loke IOREQADR+14,DISKREP
  400.   Loke IOREQADR+40,Start(2)
  401.   Loke IOREQADR+36,5632
  402.   Doke IOREQADR+28,2
  403.   '
  404.   Loke IOREQADR2+14,DISKREP
  405.   Loke IOREQADR2+40,Start(2)
  406.   Loke IOREQADR2+36,5632
  407.   Doke IOREQADR2+28,11
  408.   '
  409.   Gosub _DISKCOPY
  410.   '
  411.   '**** Motor ausschalten I & II ****
  412.   Areg(1)=IOREQADR
  413.   Doke IOREQADR+28,9
  414.   Loke IOREQADR+36,0
  415.   XDOIO=Execall(-456)
  416.   Areg(1)=IOREQADR2
  417.   Doke IOREQADR2+28,9
  418.   Loke IOREQADR2+36,0
  419.   XDOIO=Execall(-456)
  420.   '
  421.   '**** Device schließen I & II **** 
  422.   Areg(1)=IOREQADR
  423.   XCLOSEDEVICE=Execall(-450)
  424.   Areg(1)=IOREQADR2
  425.   XCLOSEDEVICE=Execall(-450)
  426.   '
  427.   Erase 2
  428.   '
  429.   Pop Proc
  430.   '
  431. _DISKCOPY:
  432.   UL=-1
  433.   '  
  434.   For TRACK=0 To 159
  435.     Add UL,1,0 To 1
  436.     _BAMCHECK[UL]
  437.     If _DOIT
  438.       '
  439.       '**** Track einlesen ****
  440.       Ink 1,0
  441.       Areg(1)=IOREQADR
  442.       Loke IOREQADR+44,TRACK*5632
  443.       XDOIO=Execall(-456)
  444.       _LESETEST[TRACK,XDOIO]
  445.       '
  446.       '**** Track schreiben **** 
  447.       Areg(1)=IOREQADR2
  448.       Loke IOREQADR2+40,Start(2)
  449.       Loke IOREQADR2+44,TRACK*5632
  450.       XDOIO=Execall(-456)
  451.       _RASTER[TRACK,XDOIO]
  452.       '
  453.       '**** Verify ****  
  454.       If VERIFY and ABORT=0
  455.         Doke IOREQADR2+28,2
  456.         XDOIO=Execall(-456)
  457.         _VERIFY[TRACK,XDOIO]
  458.         Doke IOREQADR2+28,11
  459.       End If 
  460.     End If 
  461.     '
  462.     '**** Abbruch ? **** 
  463.     If Mouse Key<>0
  464.       _ABORT
  465.     End If 
  466.     If ABORT : TRACK=159 : ABORT=0 : End If 
  467.     '
  468.   Next TRACK
  469. Return 
  470. End Proc
  471. '**** Block Einlesen / Schreiben ****
  472. Procedure _TRACKBLOCK[BLOCK,COMMAND]
  473.   '
  474.   '**** Variablen & Adressen definieren **** 
  475.   DISKREP$=Space$(40)+Chr$(0)
  476.   DEVNAME$="trackdisk.device"+Chr$(0)
  477.   IOREQ$=Space$(80)+Chr$(0)
  478.   DISKREP=Varptr(DISKREP$)
  479.   IOREQADR=Varptr(IOREQ$)
  480.   '
  481.   '**** BootBlock erstellen **** 
  482.   If COMMAND=-1
  483.     COMMAND=3
  484.     For I=0 To 1023
  485.       Poke Start(7)+I,0
  486.     Next I
  487.     For I=0 To 12
  488.       Read N
  489.       Loke Start(7)+I*4,N
  490.     Next I
  491.   End If 
  492.   '
  493.   '**** Eigene Taskadresse suchen **** 
  494.   Areg(0)=0
  495.   Areg(1)=0
  496.   Dreg(0)=0
  497.   Dreg(1)=0
  498.   XFINDTASK=Execall(-294)
  499.   Loke DISKREP+$10,XFINDTASK
  500.   '
  501.   '**** Device öffnen **** 
  502.   Areg(0)=Varptr(DEVNAME$)
  503.   Areg(1)=IOREQADR
  504.   Dreg(0)=TARGET
  505.   Dreg(1)=0
  506.   XOPENDEVICE=Execall(-444)
  507.   '
  508.   '**** Devicekommando ausfÜhren ****
  509.   Loke IOREQADR+14,DISKREP
  510.   Doke IOREQADR+28,COMMAND
  511.   Loke IOREQADR+40,Start(7)
  512.   Loke IOREQADR+36,1024
  513.   Loke IOREQADR+44,BLOCK*512
  514.   XDOIO=Execall(-456)
  515.   '
  516.   '**** UPDATE[4] falls COMMAND=WRITE[3] ****
  517.   If COMMAND=3
  518.     Doke IOREQADR+28,4
  519.     XDOIO=Execall(-456)
  520.   End If 
  521.   '
  522.   '**** Motor ausschalten **** 
  523.   Doke IOREQADR+28,9
  524.   Loke IOREQADR+36,0
  525.   XDOIO=Execall(-456)
  526.   '
  527.   '**** Device schließen ****
  528.   XCLOSEDEVICE=Execall(-450)
  529.   '
  530.   '**** BootBlockDaten ****  
  531.   Data $444F5300,$C0200F19,$370,$43FA0018,$4EAEFFA0,$4A80670A
  532.   Data $20402068,$167000,$4E7570FF,$60FA646F,$732E6C69,$62726172,$79000000
  533. End Proc
  534. '**** Format / QFormat / Erase / Test **** 
  535. Procedure _TRACK[N]
  536.   '
  537.   Reserve As Chip Data 2,5632
  538.   '
  539.   '**** Variablen & Adressen definieren **** 
  540.   DISKREP$=Space$(40)+Chr$(0)
  541.   DEVNAME$="trackdisk.device"+Chr$(0)
  542.   IOREQ$=Space$(80)+Chr$(0)
  543.   DISKREP=Varptr(DISKREP$)
  544.   IOREQADR=Varptr(IOREQ$)
  545.   '
  546.   '**** Eigene Taskadresse suchen **** 
  547.   Areg(0)=0
  548.   Areg(1)=0
  549.   Dreg(0)=0
  550.   Dreg(1)=0
  551.   XFINDTASK=Execall(-294)
  552.   Loke DISKREP+$10,XFINDTASK
  553.   '
  554.   '**** Device öffnen **** 
  555.   Areg(0)=Varptr(DEVNAME$)
  556.   Areg(1)=IOREQADR
  557.   Dreg(0)=TARGET
  558.   Dreg(1)=0
  559.   XOPENDEVICE=Execall(-444)
  560.   '
  561.   '**** Befehl aufrufen **** 
  562.   Loke IOREQADR+14,DISKREP
  563.   Loke IOREQADR+40,Start(2)
  564.   Loke IOREQADR+36,5632
  565.   Ink 1,0
  566.   On N Gosub _FORMAT,_QFORMAT,_ERASE,_TEST
  567.   '
  568.   '**** Motor ausschalten **** 
  569.   Doke IOREQADR+28,9
  570.   Loke IOREQADR+36,0
  571.   XDOIO=Execall(-456)
  572.   '
  573.   '**** Device schließen ****
  574.   XCLOSEDEVICE=Execall(-450)
  575.   '
  576.   Erase 2
  577.   '
  578.   Pop Proc
  579.   '
  580.   '**** Track formattieren ****
  581. _FORMAT:
  582.   Doke IOREQADR+28,11
  583.   UL=-1
  584.   For TRACK=0 To 159
  585.     Add UL,1,0 To 1
  586.     _BAMCHECK[UL]
  587.     If _DOIT
  588.       Loke IOREQADR+44,TRACK*5632
  589.       XDOIO=Execall(-456)
  590.       _RASTER[TRACK,XDOIO]
  591.       '
  592.       '**** Verify ****
  593.       If VERIFY and ABORT=0
  594.         Doke IOREQADR+28,2
  595.         XDOIO=Execall(-456)
  596.         _VERIFY[TRACK,XDOIO]
  597.         Doke IOREQADR+28,11
  598.         Ink 1
  599.       End If 
  600.     End If 
  601.     '
  602.     '**** Abbruch ? **** 
  603.     If Mouse Key<>0
  604.       _ABORT
  605.     End If 
  606.     If ABORT : TRACK=159 : ABORT=0 : End If 
  607.     '
  608.   Next TRACK
  609.   Gosub _QFORMAT
  610. Return 
  611. '
  612. _QFORMAT:
  613.   Doke IOREQADR+28,11
  614.   N=Start(2)
  615.   For I=$204 To $2DF
  616.     Poke N+I,$FF
  617.   Next I
  618.   Doke N+2,$2
  619.   Poke N+15,$48
  620.   Loke N+20,$A661AEF3
  621.   Doke N+$13A,$1
  622.   Doke N+$13E,$371
  623.   Poke N+$1B0,$5
  624.   Poke N+$1B1,$45
  625.   Poke N+$1B2,$4D
  626.   Poke N+$1B3,$50
  627.   Poke N+$1B4,$54
  628.   Poke N+$1B5,$59
  629.   Poke N+$1FF,$1
  630.   Loke N+$200,$C000C037
  631.   Poke N+$272,$3F
  632.   Poke N+$2DC,$3F
  633.   Loke IOREQADR+44,$6E000
  634.   XDOIO=Execall(-456)
  635. Return 
  636. '
  637. _ERASE:
  638.   Doke IOREQADR+28,17
  639.   UL=-1
  640.   For TRACK=0 To 159
  641.     Add UL,1,0 To 1
  642.     _BAMCHECK[UL]
  643.     If _DOIT
  644.       Loke IOREQADR+44,TRACK
  645.       XDOIO=Execall(-456)
  646.       _RASTER[TRACK,XDOIO]
  647.     End If 
  648.     '
  649.     '**** Abbruch ? **** 
  650.     If Mouse Key<>0
  651.       _ABORT
  652.     End If 
  653.     If ABORT : TRACK=159 : ABORT=0 : End If 
  654.     '
  655.   Next TRACK
  656. Return 
  657.   '
  658.   '**** Track testen ****
  659. _TEST:
  660.   Doke IOREQADR+28,2
  661.   UL=-1
  662.   For TRACK=0 To 159
  663.     Add UL,1,0 To 1
  664.     _BAMCHECK[UL]
  665.     If _DOIT
  666.       Loke IOREQADR+44,TRACK*5632
  667.       XDOIO=Execall(-456)
  668.       Ink 1
  669.       _RASTER[TRACK,XDOIO]
  670.     End If 
  671.     '
  672.     '**** Abbruch ? **** 
  673.     If Mouse Key<>0
  674.       _ABORT
  675.     End If 
  676.     If ABORT : TRACK=159 : ABORT=0 : End If 
  677.     '
  678.   Next TRACK
  679. Return 
  680. '
  681. End Proc
  682. '**** Block edieren **** 
  683. Procedure _EDITBLOCK[BLOCK]
  684.   Erase 7
  685.   Reserve As Chip Data 7,1024
  686.   Screen Open 1,624,168,4,Hires
  687.   Screen To Back 
  688.   Flash Off 
  689.   Cls 0
  690.   Get Palette 0
  691.   Colour 3,$FFF
  692.   Screen Display 1,112,81,,
  693.   _TRACKBLOCK[BLOCK,2]
  694.   Pen 2 : Paper 0
  695.   Ink 2,0
  696.   Text 102,164,"ASC:" : Text 194,164,"HEX:"
  697.   Text 289,164,"POS: "+Hex$(0,8)
  698.   G[89,155,177,167,0] : G[181,155,269,167,0]
  699.   G[273,155,415,167,0]
  700.   G[419,155,507,167,0] : G[511,155,599,167,0]
  701.   Text 448,164,"Save" : Text 536,164,"Abort"
  702.   Locate 38,1 : Print "Block #";Str$(BLOCK)-" "
  703.   Curs Off 
  704.   For I=1 To 16
  705.     N$=""
  706.     For I2=1 To 64
  707.       N=Peek(Start(7)+I3)
  708.       If N<32 or(N>127 and N<161) Then N=46
  709.       N$=N$+Chr$(N)
  710.       Add I3,1
  711.     Next I2
  712.     Locate 11,2+I : Print N$
  713.   Next I
  714.   Curs Off 
  715.   Clear Key 
  716.   XC=11 : YC=3
  717.   Gosub _ASCHEXPOS
  718.   N=%11111111 : Set Curs N,0,0,0,0,0,0,N
  719.   Locate XC,YC : Curs On : Pen 1
  720.   Screen To Front 
  721.   Do 
  722.     Repeat 
  723.       Clear Key 
  724.       N=0
  725.       N2=0
  726.       While N=0 and N2=0 : N2=Mouse Key : N=Asc(Inkey$) : Wend 
  727.       If N and N2=0
  728.         If N=28 and XC<74 : Inc XC : End If 
  729.         If N=29 and XC>11 : Dec XC : End If 
  730.         If N=30 and YC>3 : Dec YC : End If 
  731.         If N=31 and YC<18 : Inc YC : End If 
  732.         If N>31
  733.           N2=(YC-3)*64+(XC-11)
  734.           Print Chr$(N)
  735.           Curs Off 
  736.           Poke Start(7)+N2,N
  737.         End If 
  738.         Gosub _ASCHEXPOS
  739.         Locate XC,YC
  740.         Curs On 
  741.       End If 
  742.     Until Mouse Key>0
  743.     XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  744.     If YM>154 and YM<168
  745.       If XM>87 and XM<178
  746.         G[89,155,177,167,1]
  747.         Gosub _TXTEINGABE
  748.         Gosub _ASCHEXPOS
  749.         G[89,155,177,167,0]
  750.       End If 
  751.       If XM>418 and XM<508
  752.         G[419,155,507,167,1]
  753.         _TRACKBLOCK[BLOCK,3]
  754.         G[419,155,507,167,0]
  755.       End If 
  756.       If XM>510 and XM<600
  757.         G[511,155,599,167,1]
  758.         Wait 20
  759.         Exit 1
  760.       End If 
  761.     End If 
  762.   Loop 
  763.   Screen Close 1
  764.   Pop Proc
  765. _ASCHEXPOS:
  766.   N$=""
  767.   Ink 2
  768.   N2=(YC-3)*64+(XC-11)
  769.   N=Peek(Start(7)+N2)
  770.   If N<10 : N$="00" : End If 
  771.   If N<100 and N>9 : N$="0" : End If 
  772.   N$=N$+Str$(N)-" "
  773.   Text 142,164,N$
  774.   Text 234,164,Hex$(N,2)
  775.   Text 329,164,Hex$(BLOCK*512+N2,8)
  776.   N=0
  777. Return 
  778. _TXTEINGABE:
  779.   N$=""
  780.   Ink 0 : Bar 142,156 To 170,164
  781.   Ink 1
  782.   Repeat 
  783.     N=0
  784.     Clear Key : Wait 10
  785.     While N=0 : N=Asc(Inkey$) : Wend 
  786.     If N>47 and N<58 and Len(N$)<3
  787.       N$=N$+Chr$(N)
  788.       Text 142,164,N$
  789.     End If 
  790.   Until N=13 or Len(N$)=3
  791.   N=Min(255,Val(N$))
  792.   N2=(YC-3)*64+(XC-11)
  793.   Poke Start(7)+N2,N
  794.   If N<31 or(N>127 and N<160)
  795.     N=46
  796.   End If 
  797.   Print Chr$(N);
  798.   Locate XC,YC
  799. Return 
  800. End Proc
  801. '**** Zeige Trackdaten in Rawformat **** 
  802. Procedure _RAWSHOW[TRACK]
  803.   '
  804.   Reserve As Chip Data 2,$3A70
  805.   '
  806.   '**** Variablen & Adressen definieren **** 
  807.   DISKREP$=Space$(40)+Chr$(0)
  808.   DEVNAME$="trackdisk.device"+Chr$(0)
  809.   DISKREP=Varptr(DISKREP$)
  810.   '
  811.   IOREQ$=Space$(80)+Chr$(0)
  812.   IOREQADR=Varptr(IOREQ$)
  813.   '
  814.   '**** Eigene Taskadresse suchen **** 
  815.   Areg(0)=0
  816.   Areg(1)=0
  817.   Dreg(0)=0
  818.   Dreg(1)=0
  819.   XFINDTASK=Execall(-294)
  820.   Loke DISKREP+$10,XFINDTASK
  821.   '
  822.   '**** Device öffnen **** 
  823.   Areg(0)=Varptr(DEVNAME$)
  824.   Areg(1)=IOREQADR
  825.   Dreg(0)=TARGET
  826.   XOPENDEVICE=Execall(-444)
  827.   '
  828.   '**** Befehl aufrufen **** 
  829.   Loke IOREQADR+14,DISKREP
  830.   Loke IOREQADR+40,Start(2)
  831.   Loke IOREQADR+36,$397C
  832.   Doke IOREQADR+28,16
  833.   Poke IOREQADR+30,1
  834.   Areg(1)=IOREQADR
  835.   Loke IOREQADR+44,TRACK
  836.   XDOIO=Execall(-456)
  837.   '
  838.   '**** Motor ausschalten I & II ****
  839.   Areg(1)=IOREQADR
  840.   Doke IOREQADR+28,9
  841.   Loke IOREQADR+36,0
  842.   XDOIO=Execall(-456)
  843.   '
  844.   '**** Device schließen I & II **** 
  845.   Areg(1)=IOREQADR
  846.   XCLOSEDEVICE=Execall(-450)
  847.   '
  848.   Gosub _RAWSHOW
  849.   '
  850.   Screen Close 1
  851.   Erase 2
  852.   '
  853.   Pop Proc
  854.   '
  855. _RAWSHOW:
  856.   '
  857.   '**** Track in RAW Format zeigen ****
  858.   N=Start(2)
  859.   Screen Open 1,640,168,4,Hires
  860.   Flash Off : Cls 0 : Get Palette 0
  861.   Screen Display 1,128,81,,
  862.   Pen 2 : Paper 0 : I=0
  863.   Gosub _RAW
  864.   Do 
  865.     UL=0 : Clear Key 
  866.     Repeat : UL=Asc(Inkey$) : Until UL
  867.     If UL=28 or UL=31 Then Add I,1,0 To 10 : Gosub _RAW
  868.     If UL=29 or UL=30 Then Add I,-1,0 To 10 : Gosub _RAW
  869.     If UL=27 or UL=32 Then Exit 
  870.   Loop 
  871. Return 
  872. _RAW:
  873.   Locate 0,1 : Cls 0 : Centre "Track:"+Str$(TRACK)+"  Sector:"+Str$(I)
  874.   Locate 0,3 : Curs Off 
  875.   For I2=0 To 1359
  876.     N2=Peek(N+I*1360+I2)
  877.     If N2<32 or N2>127 and N2<161 Then N2=46
  878.     Print Chr$(N2);
  879.   Next I2
  880. Return 
  881. End Proc
  882. '**** Directory ausgabe **** 
  883. Procedure _DIR
  884.   N$="DF"+Str$(TARGET)-" "+":"
  885.   If Exist(N$)
  886.     Screen Open 1,320,176,4,Lowres
  887.     Screen To Back 
  888.     Screen Display 1,144,82,,
  889.     Flash Off 
  890.     Get Palette 0
  891.     Cls 0
  892.     Dir$=N$
  893.     Pen 1 : Paper 0 : Print "Directory of ";Dir$
  894.     N$=Dir First$("")
  895.     Pen 2 : Print N$
  896.     Screen To Front 
  897.     I=1
  898.     While N$<>""
  899.       Inc I
  900.       If I<20
  901.         N$=Dir Next$
  902.         Print N$
  903.       Else 
  904.         Pen 1 : Print "press any key" : Curs Off : Wait Key 
  905.         Pen 2
  906.         I=0
  907.       End If 
  908.     Wend 
  909.     Pen 1 : Print "press any key" : Curs Off : Wait Key 
  910.     Screen Close 1
  911.   Else 
  912.     _MESSAGE["No DOS disk in targetdrive !"]
  913.   End If 
  914. End Proc
  915. '**** Vektoren nach Viren testen ****
  916. Procedure _SYSCHECK
  917.   EXECBASE=4
  918.   EXECBASE=Leek(EXECBASE)
  919.   For I=0 To 4
  920.     Read N$,OFFSET
  921.     N=EXECBASE+OFFSET
  922.     N=Leek(N)
  923.     If N
  924.       Colour Back $F00 : Screen Show 
  925.       Fade 1,$F00 : Wait 70
  926.       _MESSAGE[N$+" is abnormal: "+Hex$(N,8)]
  927.       Colour Back $779 : Screen Show 
  928.       Fade 1,$779 : Wait 15
  929.       Pop Proc
  930.     End If 
  931.   Next 
  932.   _MESSAGE["No abnormal vector !"]
  933.   Data "ColdCapture",$2A
  934.   Data "CoolCapture",$2E
  935.   Data "WarmCapture",$32
  936.   Data "KickMemPtr",$222
  937.   Data "KickTagPtr",$226
  938. End Proc
  939. '**** Virus löschen **** 
  940. Procedure _SYSRESET
  941.   For I=0 To 109 : Read N : N$=N$+Chr$(N) : Next I
  942.   Call Varptr(N$)
  943.   Data 51,252,64,0,0,223,240,154,44,120
  944.   Data 0,4,32,86,145,252,0,0,2,118
  945.   Data 48,60,33,0,66,152,81,200,255,252
  946.   Data 32,124,0,0,0,0,48,60,0,254
  947.   Data 66,152,81,200,255,252,61,124,170,170
  948.   Data 0,36,45,124,204,204,204,204,0,38
  949.   Data 45,124,0,48,0,0,0,62,45,124
  950.   Data 0,222,0,0,0,78,45,124,187,187
  951.   Data 187,187,0,82,45,124,221,221,221,221
  952.   Data 2,42,32,124,1,0,0,0,34,124
  953.   Data 0,255,255,236,36,81,145,202,78,208
  954. End Proc
  955. '**** Programminformationen **** 
  956. Procedure _ABOUT
  957.   N=Chip Free : N1=Fast Free
  958.   Screen Open 1,640,168,4,Hires
  959.   Screen To Back 
  960.   Flash Off 
  961.   Curs Off 
  962.   Cls 0
  963.   Get Palette 0
  964.   Colour 3,$FFF
  965.   Screen Display 1,128,81,,
  966.   Pen 2 : Paper 0
  967.   For I=1 To 18
  968.     Read N$
  969.     Locate ,I : Centre N$
  970.   Next I
  971.   Centre "Chip:"+Str$(N)+"  "+"Fast:"+Str$(N1)+"  "+"Total:"+Str$(N+N1)
  972.   G[511,155,599,167,0]
  973.   Text 519,164,"I read it"
  974.   Screen To Front 1
  975.   Do 
  976.     While Mouse Key=0 : Wend 
  977.     X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
  978.     If X>510 and X<600 and Y>154 and Y<168
  979.       G[511,155,599,167,1]
  980.       Wait 20 : Exit 
  981.     End If 
  982.   Loop 
  983.   Screen Close 1
  984. Data "AMOSCopy V1.0a is shareware !",""
  985. Data "If you use AMOSCopy V1.0a regular or take some routines from AMOS code,"
  986. Data "please send me a little token !"
  987. Data "This would be a very honorable gesture !",""
  988. Data "Contact follow ( for critics or tips, too ):"
  989. Data "Volker Stepprath , Spandauerstr.4 , 4019/Monheim ( Rhld. ) , Germany",""
  990. Data "Thanks to Halime and Jens for their realy friendship !",""
  991. Data "AMOSCopy V1.0a","© copyright 1992 by Depeche Software",""
  992. Data "AMOS V1.31 / ACmp V1.0","© copyright 1991 by Europress Software","",""
  993. End Proc
  994. '**** Texteingabe **** 
  995. Procedure _TEXTINPUT[N]
  996.   Shared N$
  997.   N$=""
  998.   Do 
  999.     Clear Key 
  1000.     N2=0
  1001.     While N2=0 : N2=Asc(Inkey$) : Wend 
  1002.     Exit If N2=13
  1003.     If N2<>8 and Len(N$)+N<37
  1004.        N$=N$+Chr$(N2)
  1005.     End If 
  1006.     If N2=8
  1007.       If Len(N$)>0
  1008.         N$=Left$(N$,Len(N$)-1)
  1009.       End If 
  1010.     End If 
  1011.     Text N*8,196,N$+" "
  1012.   Loop 
  1013. End Proc
  1014. '**** Trackanzeige ****
  1015. Procedure _RASTER[TRACK,XDOIO]
  1016.   N=TRACK mod 2
  1017.   If XDOIO
  1018.     Ink 2
  1019.     Add XDOIO,-19
  1020.     If XDOIO>8
  1021.       If XDOIO=9 : N$="Disk is write protected !" : End If 
  1022.       If XDOIO=10 : N$="No disk in drive !" : End If 
  1023.       _MESSAGE[N$]
  1024.       ABORT=True
  1025.       Pop Proc
  1026.     End If 
  1027.   End If 
  1028.   If N=0
  1029.     Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
  1030.   Else 
  1031.     Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
  1032.   End If 
  1033. End Proc
  1034. Procedure _VERIFY[TRACK,XDOIO]
  1035.   If XDOIO=0 Then Pop Proc
  1036.   N=TRACK mod 2
  1037.   Add XDOIO,-19
  1038.   _MESSAGE["Verify error ! » ESC=Abort process «"]
  1039.   If N=0
  1040.     Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
  1041.   Else 
  1042.     Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
  1043.   End If 
  1044.   Repeat : N2=Asc(Inkey$) : Until N2
  1045.   _MESSAGE[""]
  1046.   If N2=27 Then ABORT=True
  1047. End Proc
  1048. Procedure _LESETEST[TRACK,XDOIO]
  1049.   If XDOIO=0 Then Pop Proc
  1050.   If XDOIO=29 : _RASTER[TRACK,29] : Pop Proc : End If 
  1051.   N=TRACK mod 2
  1052.   Add XDOIO,-19
  1053.   Ink 2
  1054.   If N=0
  1055.     Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
  1056.   Else 
  1057.     Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
  1058.   End If 
  1059.   _MESSAGE["Read error !  » ESC=Abort process «"]
  1060.   Repeat : N2=Asc(Inkey$) : Until N2
  1061.   _MESSAGE[""]
  1062.   If N2=27 Then ABORT=True
  1063. End Proc
  1064. '**** Testen ob Track selektiert ****
  1065. Procedure _BAMCHECK[UL]
  1066.   If UL=0
  1067.     Add XUPP,1
  1068.     If XUPP=10
  1069.       Add YUPP,1 : XUPP=0
  1070.     End If 
  1071.     If UPP(UPP) and UPPSIDE : _DOIT=True Else _DOIT=False : End If 
  1072.     Inc UPP
  1073.   Else 
  1074.     If LOW(LOW) and LOWSIDE : _DOIT=True Else _DOIT=False : End If 
  1075.     Inc LOW
  1076.     Add XLOW,1
  1077.     If XLOW=10
  1078.       Add YLOW,1 : XLOW=0
  1079.     End If 
  1080.   End If 
  1081. End Proc
  1082. '**** Prozess vorzeitig beenden **** 
  1083. Procedure _ABORT
  1084.   XM=X Screen(X Mouse)
  1085.   YM=Y Screen(Y Mouse)
  1086.   If XM>40 and XM<72 and YM>134 and YM<146
  1087.     G[41,135,71,145,1]
  1088.     ABORT=True
  1089.     Wait 5
  1090.     G[41,135,71,145,0]
  1091.   End If 
  1092. End Proc
  1093. '**** Mitteilung ****
  1094. Procedure _MESSAGE[N$]
  1095.   Ink 0,0 : Bar 14,189 To 301,198
  1096.   Ink 2 : Text 14,196,N$
  1097. End Proc
  1098. '**** Schalter An / Aus **** 
  1099. Procedure G[X,Y,X2,Y2,S]
  1100.   If S Then C1=2 : C2=1 Else C1=1 : C2=2
  1101.   Ink C1 : Draw X,Y To X2-1,Y : Draw X,Y To X,Y2 : Ink C2 : Draw X+1,Y2 To X2,Y2 : Draw X2,Y To X2,Y2 : Ink 1,0
  1102. End Proc
  1103.