&&
------------------------------------------------------------------------------
                         CURSUS ASSEMBLER  -  COPY
------------------------------------------------------------------------------

Copy is een kommando dat het Copy-kommando vervangt. Het is een heel stuk
kleiner dan het normale Copy-programma.

De aanroep is eenvoudig :

Copy Source Destination



De uitleg achter elke regel is vrij uitgebreid. Daarom weinig tekst tussen de
regels in.
&&
; Parameters in geheugen lezen.

o:      cmp.b     #1,d0        ; Geen parameters?
        bls.L    Nofile        ; Zo ja, dan is er een fout opgetreden.
        lea      $60000,a1     ; Pointer naar de FileNaam.
search: move.b   (a0)+,d1      ; Karakter inlezen.
        cmp.b    #$20,d1       ; Spatie?
        beq.s    searc2        ; Ja, dan naar de volgende naam.
        move.b   d1,(a1)+      ; Karakter inlezen.
        bra.s    search        ; En verder gaan zoeken.
searc2: move.b   #$0,(a1)+     ; Een 0 aan het einde.
        lea      $60000+80,a1  ; Pointer naar de tweede FileNaam.
searc:  move.b    (a0)+,d1     ; Karakter inlezen.
        cmp.b    #$0a,d1       ; Return?
        beq.s    found         ; Ja, dan stoppen.
        move.b   d1,(a1)+      ; Karakter in de 2e FileNaam zetten.
        bra.s    searc         ; En weer verder zoeken.
found:  move.b   #$0,(a1)+     ; Een 0 aan het einde.
&&
; Nu openen we beide files op adres $60000 en $60080

        bsr.s    init          ; DOS.library openen.
        move.l   #$60000,d1    ; Pointer naar de 1e FileNaam.
        move.l   #1005,d2      ; Mode : OLD.
        jsr      -30(a5)       ; DosCall OPEN.
        move.l   d0,a4         ; FileBase opslaan voor later.
        beq.s    close         ; Fout opgetreden.
        move.l   #$60000+80,d1 ; Pointer naar de 2e FileNaam
        move.l   #1006,d2      ; Mode : NEW.
        jsr      -30(a5)       ; DosCall OPEN.
        move.l   d0,a3         ; FileBase opslaan voor later.
        beq.s    close2        ; Einde.

; Elke keer 100 bytes tegelijk inlezen op wegschrijven naar het andere file.

main:   move.l   a4,d1         ; Pointer naar SourceFile.
        move.l   #veld,d2      ; Pointer naar de buffer.
        moveq    #100,d3       ; 100 Bytes kopieeren.
        jsr      -42(a5)       ; DosCall READ.
        beq.s    eocopy        ; Error? Einde van het file!
        move.l   #veld,d2      ; Pointer naar de buffer.
        move.l   d0,d3         ; Pointer naar de lengte.
        move.l   a3,d1         ; Pointer naar DestinationFile.
        jsr      -48(a5)       ; DosCall WRITE.
        bra.s    main          ; En de volgende 100 bytes.
&&
; De files moeten gesloten worden.

eocopy: move.l   a3,d1         ; Pointer naar DestinationFile.
        jsr      -36(a5)       ; DosCall CLOSE.
close2: move.l   a4,d1         ; Pointer naar SourceFile.
        jsr      -36(a5)       ; DosCall CLOSE.

; Terug naar de CLI.

close:  move.l   4,a6          ; Execbase in a6.
        move.l   a5,a1         ; Library naar a1.
        jsr      -414(a6)      ; ExecCall CLOSELIBRARY.
        rts                    ; Terug naar de CLI.

; Deze routine wordt aangeroepen als er geen parameters opgegeven worden. De
;    routine drukt dan een foutmelding af.

nofile: bsr.s    init          ; DOS.library openen.
        jsr      -60(a5)       ; DosCall OUTPUT.
        move.l   #nofilemsg,d2 ; Pointer naar onze boodschap.
        moveq    #10,d3        ; 10 Tekens.
        jsr      -48(A5)       ; DosCall WRITE.
        bra.s    close         ; Naar de CLI.
&&
; Openen van de DOS.library.

init:   move.l   4,a6          ; Execbase in a6.
        lea      dosnaam,a1    ; DOS.library in a1.
        jsr      -408(a6)      ; ExecCall OPENLIBRARY.
        move.l   d0,a5         ; DosBase opslaan voor later.
        rts                    ; terug.

; Nog wat labels aan het einde.

dosnaam:
        dc.b     'dos.library',0
nofilemsg:
        dc.b     "Bad Args.",$A
veld:   blk.b    100,0









Het programma, en de source, staan in de directory Assembler op deze diskette.

- EINDE ----------------------------------------------------------------------
&&
