home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 601-625 / apd602 / amos_copy.amos / amos_copy.amosSourceCode next >
AMOS Source Code  |  1993-02-25  |  24KB  |  1,105 lines

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