* ›33;40m0815Copy Version c›0m * Bei diesem Programm handelt es sich wohl um das kürzeste * Diskettenkopierprogramm das zur Zeit auf dem PD-Mark zu * erhalten ist ! * 0815Copy benötigt ein externes Laufwerk ! Kopiert * wird immer von DF0: nach DF1: * Durch drücken der linken Maustaste kann zu jeder Zeit * der laufende Kopiervorgang abgebrochen werden! * Programmiert hat das Ganze: Volker Stepprath am 18/01/94 * mit dem AZ Editor V1.50! Assembliert wurde letztendlich * mit GenAm Macro Assembler V2.11D © 85/88 by HiSoft * Variablen definieren * -------------------- _SYSBase equ 4 ; Basis von EXEC _LVOAllocMem equ -198 ; EXEC Offsets _LVOFreeMem equ -210 _LVOFindTask equ -294 _LVOSetSignal equ -306 _LVOAddPort equ -354 _LVORemPort equ -360 _LVOOldOpenLibrary equ -408 _LVOCloseLibrary equ -414 _LVOOpenDevice equ -444 _LVOCloseDevice equ -450 _LVODoIO equ -456 _LVORead equ -42 ; DOS Offsets _LVOWrite equ -48 _LVOOutput equ -60 * Vorbereitungen für 0815Copy Vc * ------------------------------ _OPENLIB move.l _SYSBase,a6 ; System-Basis nach a6 lea DosName(pc),a1 ; dos.library nach a1 jsr _LVOOldOpenLibrary(a6) ; Library öffnen move.l d0,_DOSBase ; & Basis sichern move.l _DOSBase(pc),a6 ; DosBasis nach a6 jsr _LVOOutput(a6) ; Ausgabekanal ermitteln move.l d0,Handle ; & sichern * Speicher bereitstellen * ---------------------- _ALLOCMEM move.l #5632,d0 ; Speichergröße in Bytes bsr.s _MEM move.l d0,DiskBuff ; Speicheradresse sichern moveq #80,d0 bsr.s _MEM move.l d0,DiskIO0 moveq #80,d0 bsr.s _MEM move.l d0,DiskIO1 bra.s _OPENDEV1 _MEM move.l _SYSBase,a6 move.l #$10003,d1 jsr _LVOAllocMem(a6) rts * Device für DF1: öffnen * ---------------------- _OPENDEV1 sub.l a1,a1 ; 0 für eigene Taskadresse jsr _LVOFindTask(a6) ; Eigenen Task ermitteln move.l d0,DiskRep+$10 ; Antwort-Task festlegen lea DiskRep(pc),a1 ; ReplyPort jsr _LVOAddPort(a6) ; anmelden move.l DiskIO1(pc),a1 ; IORequest für DF1: angeben clr.l d1 ; Flags brauchn wa nisch moveq #1,d0 ; DF1: lea Device(pc),a0 ; Devicename nach a0 jsr _LVOOpenDevice(a6) ; trackdisk.device öffnen bne _DEVFEHLER ; Ext. Laufwerk nicht vorhanden move.l #DiskRep,14(a1) ; ReplyPort installieren * Device für DF0: öffnen * ---------------------- _OPENDEV0 move.l DiskIO0(pc),a1 ; IORequest für DF0: angeben clr.l d1 ; Wie gehabt moveq #0,d0 ; DF0: lea Device(pc),a0 ; Devicename nach a0 jsr _LVOOpenDevice(a6) ; trackdisk.device öffnen move.l #DiskRep,14(a1) ; ReplyPort installieren * Message & Warten * ---------------- _WELCOME lea Message(pc),a0 bsr _PRINT move.l Handle(pc),d1 move.l #Message,d2 ; Wird nicht mehr benötigt moveq #1,d3 ; 1 x Bitte jsr _LVORead(a6) ; Auf Return warten * Diskettentests * -------------- _CHECKDISKS move.l _SYSBase,a6 move.l DiskIO0(pc),a1 ; IORequest 0 nach a1 move #14,28(a1) ; TD_CHANGESTATE jsr _LVODoIO(a6) tst.l 32(a1) ; Ist Disk in DF0: ? bne _NODISK0 ; Nein move #2,28(a1) ; CMD_READ move.l #5632,36(a1) ; 11*512 Blöcke move.l DiskBuff(pc),40(a1) ; Speicheradresse angeben move.l DiskIO1(pc),a1 ; IORequest 1 nach a1 move #14,28(a1) ; TD_CHANGESTATE jsr _LVODoIO(a6) tst.l 32(a1) ; Ist Disk in DF1: ? bne _NODISK1 ; Nein move #15,28(a1) ; TD_PROSTATUS jsr _LVODoIO(a6) tst.l 32(a1) ; Ist Disk schreibgeschützt ? bne _YESPRO1 ; Ja move #11,28(a1) ; TD_FORMAT move.l #5632,36(a1) ; 1 Track move.l DiskBuff(pc),40(a1) ; Speicheradresse angeben * 0815Copy starten * ---------------- _DISKCOPY clr.l d7 ; d7 löschen moveq #49,d4 ; head = `0` - 1 _LOOPstart bsr.s _HEAD ; Cylinder & head zeigen move.l _SYSBase,a6 ; Hatten wir schon _READ move.l DiskIO0(pc),a1 ; Track einlesen 0 jsr _LVODoIO(a6) ; ! bne.s _READERR ; Rülps... Fehler auf Source _WRITE move.l DiskIO1(pc),a1 ; Track schreiben 1 jsr _LVODoIO(a6) ; ! moveq #0,d0 ; Mittels moveq #0,d1 ; CTRL+C jsr _LVOSetSignal(a6) ; Kopiervorgang btst #12,d0 ; vorzeitig beenden ? bne.s _LOOPende ; Ja addq #1,d7 ; Cylinderanzahl erhöhen cmp.l #160,d7 ; max. Cylinder-1 erreicht ? beq.s _LOOPende ; Ja move.l DiskIO0(pc),a1 ; IORequest DF0: add.l #5632,44(a1) ; Cylinder um 1 erhöhen move.l DiskIO1(pc),a1 ; IORequest DF1: add.l #5632,44(a1) ; Cylinder um 1 erhöhen bra.s _LOOPstart ; Und weiter geht`s _LOOPende bra.s _ALLFIN0 ; Kopieren beendet * Aktuellen Cylinder & head ermitteln * ----------------------------------- _HEAD lea Work(pc),a0 ; Adr. von Worktext nach a0 addq.b #1,d4 ; head erhöhen cmp.b #50,d4 ; ist head > 1 beq.s _P01 ; Jawohl move.b #49,d4 ; head = 1 bra.s _SHOW ; Dann zeig`s mal _P01 move.b #48,d4 ; head = 0 addq.b #1,19(a0) ; Einer erhöhen cmp.b #58,19(a0) ; Ist Einer > 9 blt.s _SHOW ; Ne, is nisch _P10 addq.b #1,18(a0) ; Zehner erhöhen move.b #48,19(a0) ; Einer equ `0` _SHOW move.b d4,27(a0) ; `head` angeben bsr.s _PRINT ; Cylinderpos. ausgeben rts ; Und das 160 mal... * Lesefehler aufgetreten * ---------------------- _READERR lea ReadErr(pc),a0 lea Work(pc),a1 move.b 18(a1),35(a0) ; Cylinderposition move.b 19(a1),36(a0) ; übergeben divu #10,d0 ; Zehner ermitteln add.b #48,d0 ; und in ASCII wandeln move.b d0,9(a0) ; Wert übergeben swap d0 ; Einer ermitteln add.b #48,d0 ; ebenfalls in ASCII wandeln move.b d0,10(a0) ; & eintragen move.b d4,44(a0) ; `head` übergeben bsr.s _PRINT move.l _SYSBase,a6 ; Ui, Hui, sehr wichtig ! bra _WRITE * Wo ist die Sourcedisk ? * ----------------------- _NODISK0 lea NoDisk0(pc),a0 bsr.s _PRINT _ALLFIN0 bra.s _ALLEND * Und wo ist die Targetdisk ? * --------------------------- _NODISK1 lea NoDisk1(pc),a0 bsr.s _PRINT bra.s _ALLEND * Wie soll man kopieren mit aktiven Schreibschutz ? * ------------------------------------------------- _YESPRO1 lea YesPro1(pc),a0 bsr.s _PRINT bra.s _ALLEND * Device konnte nicht geöffnet werden * ----------------------------------- _DEVFEHLER lea DevErr(pc),a0 ; DevErrtext bsr.s _PRINT bra _ABORT ; Da is wat schief jelaufen * Allgemeine Textausgebe * ---------------------- _PRINT move.l _DOSBase(pc),a6 clr.l d3 move.l a0,a1 _PLOOP tst.b (a0)+ beq.s _PEND addq #1,d3 bra.s _PLOOP _PEND move.l a1,d2 move.l Handle(pc),d1 jsr _LVOWrite(a6) rts * Alles beenden * ------------- _ALLEND bsr.s _CLOSEDEV0 bsr.s _CLOSEDEV1 _ALLFIN1 bra.s _CLOSELIB * Motor aus 0 & Device 0 schließen * -------------------------------- _CLOSEDEV0 move.l _SYSBase,a6 ; System-Basis nach a6 move.l DiskIO0(pc),a1 ; IORequest 0 angeben move #10,(a1) ; TD_SEEK move.l #0,44(a1) ; Offset: Sektor 0 jsr _LVODoIO(a6) ; Kopf positionieren move #9,28(a1) ; TD_MOTOR move.l #0,36(a1) ; von DF0: jsr _LVODoIO(a6) ; aus ! jsr _LVOCloseDevice(a6) ; Device schließen rts * Motor aus 1 & Device 1 schließen * -------------------------------- _CLOSEDEV1 move.l DiskIO1(pc),a1 ; IORequest 1 angeben move #10,(a1) ; TD_SEEK move.l #0,44(a1) ; Offset: Sektor 0 jsr _LVODoIO(a6) ; Kopf positionieren move #9,28(a1) ; TD_MOTOR move.l #0,36(a1) ; von DF1: jsr _LVODoIO(a6) ; aus ! jsr _LVOCloseDevice(a6) ; Device schließen rts * Speicher freigeben, dos.library schließen & Zurück * -------------------------------------------------- _CLOSELIB lea Bye(pc),a0 ; Tschüsstext bsr _PRINT _ABORT move.l _SYSBase,a6 move.l #5632,d0 move.l DiskBuff(pc),a1 jsr _LVOFreeMem(a6) ; Speicher freigeben move.l #80,d0 move.l DiskIO0(pc),a1 jsr _LVOFreeMem(a6) ; Speicher freigeben move.l #80,d0 move.l DiskIO1(pc),a1 jsr _LVOFreeMem(a6) ; Speicher freigeben lea DiskRep(pc),a1 ; Und Port auch jsr _LVORemPort(a6) ; wieder schön abmelden move.l _DOSBase(pc),a1 ; DosBasis angeben jsr _LVOCloseLibrary(a6) ; & dos.library schließen RTS ; Und... Tschüss ! * Speicherreservierung * -------------------- _DOSBase dc.l 0 Handle dc.l 0 DiskBuff dc.l 0 DiskIO0 dc.l 0 DiskIO1 dc.l 0 DiskRep ds.l 8 DosName dc.b 'dos.library',0 Device dc.b 'trackdisk.device',0 Message dc.b 10,$9b,'33;40m0815Copy Vc (r)1994 by Volker Stepprath',10 dc.b $9b,'0mSourcedisk in DF0: & Targetdisk in DF1:',10 dc.b 'Press RETURN when ready:',0 Work dc.b 'Copying cylinder: 0/, head 0',10,$9b,$b,0 Bye dc.b 10,10,'Operation finished !',10,10,0 NoDisk0 dc.b 10,$9b,'3mNo disk in sourcedrive !',$9b,'0m',0 NoDisk1 dc.b 10,$9b,'3mNo disk in targetdrive !',$9b,'0m',0 YesPro1 dc.b 10,$9b,'3mDisk is write protected !',$9b,'0m',0 ReadErr dc.b 'TDError #00 while reading cylinder 00, head 0 !',10,0 DevErr dc.b 'External drive not available !',10,0