Testaware

Amiga - 0815Copy

Aug 15th, 2018
190
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *                     ›33;40m0815Copy Version c›0m
  2.  
  3. * Bei diesem  Programm handelt es sich wohl um das kürzeste
  4. * Diskettenkopierprogramm  das zur Zeit auf dem  PD-Mark zu
  5. * erhalten ist !  <aufjedenfall han isch noch kin kürtzeres
  6. * entdecken könne, un  wenn doch... ja dann lauf isch Amok>
  7.  
  8. * 0815Copy benötigt ein  externes Laufwerk <DF1:> ! Kopiert
  9. * wird immer von  DF0: <intern> nach DF1: <extern> <Logen!>
  10. * Durch  drücken  der linken  Maustaste kann zu jeder  Zeit
  11. * der laufende Kopiervorgang abgebrochen werden!  <Hurz...>
  12.  
  13. * Programmiert hat das Ganze: Peace / Testaware am 18/01/94
  14. * mit dem  AZ Editor V1.50!  Assembliert wurde letztendlich
  15. * mit GenAm Macro Assembler V2.11D © 85/88 by HiSoft <Yeah>
  16.  
  17.  
  18.  
  19. * Variablen definieren
  20. * --------------------
  21.  
  22. _SYSBase            equ 4                   ; Basis von EXEC
  23. _LVOAllocMem        equ -198                ; EXEC Offsets
  24. _LVOFreeMem         equ -210
  25. _LVOFindTask        equ -294
  26. _LVOSetSignal       equ -306
  27. _LVOAddPort         equ -354
  28. _LVORemPort         equ -360
  29. _LVOOldOpenLibrary  equ -408
  30. _LVOCloseLibrary    equ -414
  31. _LVOOpenDevice      equ -444
  32. _LVOCloseDevice     equ -450
  33. _LVODoIO            equ -456
  34.  
  35. _LVORead            equ -42                 ; DOS Offsets
  36. _LVOWrite           equ -48
  37. _LVOOutput          equ -60
  38.  
  39.  
  40.  
  41. * Vorbereitungen für 0815Copy Vc
  42. * ------------------------------
  43.  
  44. _OPENLIB    move.l  _SYSBase,a6             ; System-Basis nach a6
  45.             lea     DosName(pc),a1          ; dos.library nach a1
  46.             jsr     _LVOOldOpenLibrary(a6)  ; Library öffnen
  47.             move.l  d0,_DOSBase             ; & Basis sichern
  48.  
  49.             move.l  _DOSBase(pc),a6         ; DosBasis nach a6
  50.             jsr     _LVOOutput(a6)          ; Ausgabekanal ermitteln
  51.             move.l  d0,Handle               ; & sichern
  52.  
  53.  
  54.  
  55. * Speicher bereitstellen
  56. * ----------------------
  57.  
  58. _ALLOCMEM   move.l  #5632,d0                ; Speichergröße in Bytes
  59.             bsr.s   _MEM
  60.             move.l  d0,DiskBuff             ; Speicheradresse sichern
  61.  
  62.             moveq   #80,d0
  63.             bsr.s   _MEM
  64.             move.l  d0,DiskIO0
  65.  
  66.             moveq   #80,d0
  67.             bsr.s   _MEM
  68.             move.l  d0,DiskIO1
  69.  
  70.             bra.s   _OPENDEV1
  71.  
  72. _MEM        move.l  _SYSBase,a6
  73.             move.l  #$10003,d1
  74.             jsr     _LVOAllocMem(a6)
  75.             rts
  76.  
  77.  
  78.  
  79. * Device für DF1: öffnen
  80. * ----------------------
  81.  
  82. _OPENDEV1   sub.l   a1,a1                   ; 0 für eigene Taskadresse
  83.             jsr     _LVOFindTask(a6)        ; Eigenen Task ermitteln
  84.             move.l  d0,DiskRep+$10          ; Antwort-Task festlegen
  85.  
  86.             lea     DiskRep(pc),a1          ; ReplyPort
  87.             jsr     _LVOAddPort(a6)         ; anmelden
  88.  
  89.             move.l  DiskIO1(pc),a1          ; IORequest für DF1: angeben
  90.             clr.l   d1                      ; Flags brauchn wa nisch
  91.             moveq   #1,d0                   ; DF1: <Destination>
  92.             lea     Device(pc),a0           ; Devicename nach a0
  93.             jsr     _LVOOpenDevice(a6)      ; trackdisk.device öffnen
  94.             bne     _DEVFEHLER              ; Ext. Laufwerk nicht vorhanden
  95.             move.l  #DiskRep,14(a1)         ; ReplyPort installieren
  96.  
  97.  
  98.  
  99. * Device für DF0: öffnen
  100. * ----------------------
  101.  
  102. _OPENDEV0   move.l  DiskIO0(pc),a1          ; IORequest für DF0: angeben
  103.             clr.l   d1                      ; Wie gehabt
  104.             moveq   #0,d0                   ; DF0: <Source>
  105.             lea     Device(pc),a0           ; Devicename nach a0
  106.             jsr     _LVOOpenDevice(a6)      ; trackdisk.device öffnen
  107.             move.l  #DiskRep,14(a1)         ; ReplyPort installieren
  108.  
  109.  
  110.  
  111. * Message & Warten
  112. * ----------------
  113.  
  114. _WELCOME    lea     Message(pc),a0
  115.             bsr     _PRINT
  116.  
  117.             move.l  Handle(pc),d1
  118.             move.l  #Message,d2             ; Wird nicht mehr benötigt
  119.             moveq   #1,d3                   ; 1 x Bitte
  120.             jsr     _LVORead(a6)            ; Auf Return warten
  121.  
  122.  
  123.  
  124. * Diskettentests
  125. * --------------
  126.  
  127. _CHECKDISKS move.l  _SYSBase,a6
  128.  
  129.             move.l  DiskIO0(pc),a1          ; IORequest 0 nach a1
  130.             move   #14,28(a1)              ; TD_CHANGESTATE
  131.             jsr     _LVODoIO(a6)
  132.             tst.l   32(a1)                  ; Ist Disk in DF0: ?
  133.             bne     _NODISK0                ; Nein
  134.  
  135.             move    #2,28(a1)               ; CMD_READ
  136.             move.l  #5632,36(a1)            ; 11*512 Blöcke
  137.             move.l  DiskBuff(pc),40(a1)     ; Speicheradresse angeben
  138.  
  139.             move.l  DiskIO1(pc),a1          ; IORequest 1 nach a1
  140.             move    #14,28(a1)              ; TD_CHANGESTATE
  141.             jsr     _LVODoIO(a6)
  142.             tst.l   32(a1)                  ; Ist Disk in DF1: ?
  143.             bne     _NODISK1                ; Nein
  144.  
  145.             move    #15,28(a1)              ; TD_PROSTATUS
  146.             jsr     _LVODoIO(a6)
  147.             tst.l   32(a1)                  ; Ist Disk schreibgeschützt ?
  148.             bne     _YESPRO1                ; Ja <und warum ?>
  149.  
  150.             move    #11,28(a1)              ; TD_FORMAT
  151.             move.l  #5632,36(a1)            ; 1 Track
  152.             move.l  DiskBuff(pc),40(a1)     ; Speicheradresse angeben
  153.  
  154.  
  155.  
  156. * 0815Copy starten
  157. * ----------------
  158.  
  159. _DISKCOPY   clr.l   d7                      ; d7 löschen
  160.             moveq   #49,d4                  ; head = `0` - 1
  161.  
  162. _LOOPstart  bsr.s   _HEAD                   ; Cylinder & head zeigen
  163.             move.l  _SYSBase,a6             ; Hatten wir schon
  164.  
  165. _READ       move.l  DiskIO0(pc),a1          ; Track einlesen 0
  166.             jsr     _LVODoIO(a6)            ; !
  167.             bne.s   _READERR                ; Rülps... Fehler auf Source
  168.  
  169. _WRITE      move.l  DiskIO1(pc),a1          ; Track schreiben 1
  170.             jsr     _LVODoIO(a6)            ; !
  171.  
  172.             moveq   #0,d0                   ; Mittels
  173.             moveq   #0,d1                   ; CTRL+C
  174.             jsr     _LVOSetSignal(a6)       ; Kopiervorgang
  175.             btst    #12,d0                  ; vorzeitig beenden ?
  176.             bne.s   _LOOPende               ; Ja
  177.  
  178.             addq    #1,d7                   ; Cylinderanzahl erhöhen
  179.             cmp.l   #160,d7                 ; max. Cylinder-1 erreicht ?
  180.             beq.s   _LOOPende               ; Ja
  181.  
  182.             move.l  DiskIO0(pc),a1          ; IORequest DF0:
  183.             add.l   #5632,44(a1)            ; Cylinder um 1 erhöhen
  184.  
  185.             move.l  DiskIO1(pc),a1          ; IORequest DF1:
  186.             add.l   #5632,44(a1)            ; Cylinder um 1 erhöhen
  187.  
  188.             bra.s   _LOOPstart              ; Und weiter geht`s
  189.  
  190. _LOOPende   bra.s   _ALLFIN0                ; Kopieren beendet
  191.  
  192.  
  193.  
  194. * Aktuellen Cylinder & head ermitteln
  195. * -----------------------------------
  196.  
  197. _HEAD       lea     Work(pc),a0             ; Adr. von Worktext nach a0
  198.             addq.b  #1,d4                   ; head erhöhen
  199.             cmp.b   #50,d4                  ; ist head > 1
  200.             beq.s   _P01                    ; Jawohl
  201.             move.b  #49,d4                  ; head = 1
  202.             bra.s   _SHOW                   ; Dann zeig`s mal
  203. _P01        move.b  #48,d4                  ; head = 0
  204.             addq.b  #1,19(a0)               ; Einer erhöhen
  205.             cmp.b   #58,19(a0)              ; Ist Einer > 9
  206.             blt.s   _SHOW                   ; Ne, is nisch
  207. _P10        addq.b  #1,18(a0)               ; Zehner erhöhen
  208.             move.b  #48,19(a0)              ; Einer equ `0`
  209. _SHOW       move.b  d4,27(a0)               ; `head` angeben
  210.             bsr.s   _PRINT                  ; Cylinderpos. ausgeben
  211.             rts                             ; Und das 160 mal...
  212.  
  213.  
  214.  
  215. * Lesefehler aufgetreten
  216. * ----------------------
  217.  
  218. _READERR    lea     ReadErr(pc),a0
  219.             lea     Work(pc),a1
  220.             move.b  18(a1),35(a0)           ; Cylinderposition
  221.             move.b  19(a1),36(a0)           ; übergeben
  222.             divu    #10,d0                  ; Zehner ermitteln
  223.             add.b   #48,d0                  ; und in ASCII wandeln
  224.             move.b  d0,9(a0)                ; Wert übergeben <Würg...>
  225.             swap    d0                      ; Einer ermitteln
  226.             add.b   #48,d0                  ; ebenfalls in ASCII wandeln
  227.             move.b  d0,10(a0)               ; & eintragen
  228.             move.b  d4,44(a0)               ; `head` übergeben
  229.             bsr.s   _PRINT
  230.  
  231.             move.l  _SYSBase,a6             ; Ui, Hui, sehr wichtig !
  232.             bra     _WRITE
  233.  
  234.  
  235.  
  236. * Wo ist die Sourcedisk ?
  237. * -----------------------
  238.  
  239. _NODISK0    lea     NoDisk0(pc),a0
  240.             bsr.s   _PRINT
  241. _ALLFIN0    bra.s   _ALLEND
  242.  
  243.  
  244.  
  245. * Und wo ist die Targetdisk ?
  246. * ---------------------------
  247.  
  248. _NODISK1    lea     NoDisk1(pc),a0
  249.             bsr.s   _PRINT
  250.             bra.s   _ALLEND
  251.  
  252.  
  253.  
  254. * Wie soll man kopieren mit aktiven Schreibschutz ?
  255. * -------------------------------------------------
  256.  
  257. _YESPRO1    lea     YesPro1(pc),a0
  258.             bsr.s   _PRINT
  259.             bra.s   _ALLEND
  260.  
  261.  
  262.  
  263. * Device konnte nicht geöffnet werden
  264. * -----------------------------------
  265.  
  266. _DEVFEHLER  lea     DevErr(pc),a0           ; DevErrtext
  267.             bsr.s   _PRINT
  268.             bra     _ABORT                  ; Da is wat schief jelaufen
  269.  
  270.  
  271.  
  272. * Allgemeine Textausgebe
  273. * ----------------------
  274.  
  275. _PRINT      move.l  _DOSBase(pc),a6
  276.             clr.l   d3
  277.             move.l  a0,a1
  278. _PLOOP      tst.b   (a0)+
  279.             beq.s   _PEND
  280.             addq    #1,d3
  281.             bra.s   _PLOOP
  282. _PEND       move.l  a1,d2
  283.             move.l  Handle(pc),d1
  284.             jsr     _LVOWrite(a6)
  285.             rts
  286.  
  287.  
  288.  
  289. * Alles beenden
  290. * -------------
  291.  
  292. _ALLEND     bsr.s   _CLOSEDEV0
  293.             bsr.s   _CLOSEDEV1
  294. _ALLFIN1    bra.s   _CLOSELIB
  295.  
  296.  
  297.  
  298. * Motor aus 0 & Device 0 schließen
  299. * --------------------------------
  300.  
  301. _CLOSEDEV0  move.l  _SYSBase,a6             ; System-Basis nach a6
  302.             move.l  DiskIO0(pc),a1          ; IORequest 0 angeben
  303.             move    #10,(a1)                ; TD_SEEK
  304.             move.l  #0,44(a1)               ; Offset: Sektor 0
  305.             jsr     _LVODoIO(a6)            ; Kopf positionieren
  306.  
  307.             move    #9,28(a1)               ; TD_MOTOR
  308.             move.l  #0,36(a1)               ; von DF0:
  309.             jsr     _LVODoIO(a6)            ; aus !
  310.  
  311.             jsr     _LVOCloseDevice(a6)     ; Device <DF0:> schließen
  312.             rts
  313.  
  314.  
  315.  
  316. * Motor aus 1 & Device 1 schließen
  317. * --------------------------------
  318.  
  319. _CLOSEDEV1  move.l  DiskIO1(pc),a1          ; IORequest 1 angeben
  320.             move    #10,(a1)                ; TD_SEEK
  321.             move.l  #0,44(a1)               ; Offset: Sektor 0
  322.             jsr     _LVODoIO(a6)            ; Kopf positionieren
  323.  
  324.             move    #9,28(a1)               ; TD_MOTOR
  325.             move.l  #0,36(a1)               ; von DF1:
  326.             jsr     _LVODoIO(a6)            ; aus !
  327.  
  328.             jsr     _LVOCloseDevice(a6)     ; Device <DF1:> schließen
  329.             rts
  330.  
  331.  
  332.  
  333. * Speicher freigeben, dos.library schließen & Zurück
  334. * --------------------------------------------------
  335.  
  336. _CLOSELIB   lea     Bye(pc),a0              ; Tschüsstext
  337.             bsr     _PRINT
  338.  
  339. _ABORT      move.l  _SYSBase,a6
  340.             move.l  #5632,d0
  341.             move.l  DiskBuff(pc),a1
  342.             jsr     _LVOFreeMem(a6)         ; Speicher freigeben
  343.  
  344.             move.l  #80,d0
  345.             move.l  DiskIO0(pc),a1
  346.             jsr     _LVOFreeMem(a6)         ; Speicher freigeben
  347.  
  348.             move.l  #80,d0
  349.             move.l  DiskIO1(pc),a1
  350.             jsr     _LVOFreeMem(a6)         ; Speicher freigeben
  351.  
  352.             lea     DiskRep(pc),a1          ; Und Port auch
  353.             jsr     _LVORemPort(a6)         ; wieder schön abmelden
  354.  
  355.             move.l  _DOSBase(pc),a1         ; DosBasis angeben
  356.             jsr     _LVOCloseLibrary(a6)    ; & dos.library schließen
  357.  
  358.             RTS                             ; Und... Tschüss !
  359.  
  360.  
  361.  
  362. * Speicherreservierung
  363. * --------------------
  364.  
  365. _DOSBase    dc.l 0
  366. Handle      dc.l 0
  367. DiskBuff    dc.l 0
  368. DiskIO0     dc.l 0
  369. DiskIO1     dc.l 0
  370. DiskRep     ds.l 8
  371. DosName     dc.b 'dos.library',0
  372. Device      dc.b 'trackdisk.device',0
  373. Message     dc.b 10,$9b,'33;40m0815Copy Vc (r)1994 by Peace / Testaware',10
  374.             dc.b $9b,'0mSourcedisk in DF0: & Targetdisk in DF1:',10
  375.             dc.b 'Press RETURN when ready:',0
  376. Work        dc.b 'Copying cylinder: 0/, head 0',10,$9b,$b,0
  377. Bye         dc.b 10,10,'Operation finished !',10,10,0
  378. NoDisk0     dc.b 10,$9b,'3mNo disk in sourcedrive !',$9b,'0m',0
  379. NoDisk1     dc.b 10,$9b,'3mNo disk in targetdrive !',$9b,'0m',0
  380. YesPro1     dc.b 10,$9b,'3mDisk is write protected !',$9b,'0m',0
  381. ReadErr     dc.b 'TDError #00 while reading cylinder 00, head 0 !',10,0
  382. DevErr      dc.b 'External drive not available !',10,0
RAW Paste Data