; Codeer Save <source> <destination>
; Codeer Load <source> <destination>

; Parameters save of load naar $60000 zetten.

o:      cmp.l   #"save",(a0)   ; Parameter = Coderen.
        beq.L   initsave       ; Dus de codeer-funktie initialiseren.
        cmp.l   #"load",(a0)   ; Parameter = Decoderen.
        beq.L   initload       ; Dus de decodeer-funktie initialiseren.
        bra.L   nofile         ; Geen van twee ? Dan error.

; Hier start het programma dat codeert of decodeert. Daarvoor moeten de twee
; filenamen gelezen worden.

start:  lea     $60000,a1      ; Pointer naar de 1e filenaam.
search: move.b  (a0)+,d1       ; Karakter uitlezen.
        cmp.b   #$20,d1        ; Spatie ?
        beq.s   searc2         ; Ja, dan komt de volgende.
        move.b  d1,(a1)+       ; Karakter in de buffer zetten.
        bra.s   search         ; En nu de volgende lezen.
searc2: move.b  #$0,(a1)+      ; Een nul zetten aan het einde van de naam.
        lea     $60000+80,a1   ; Pointer naar de 2e filenaam.
searc:  move.b  (a0)+,d1       ; Karakter uitlezen.
        cmp.b   #$0a,d1        ; Return ?
        beq.s   found          ; Ja, dan stoppen.
        move.b  d1,(a1)+       ; Karakter in de buffer zetten.
        bra.s   searc          ; En de volgende letter zoeken.
found:  move.b  #$0,(a1)+      ; Een nul zetten aan het einde van de naam.

; Nu openen we de beide files, source en destination.

        bsr.L   init           ; DOS.library openen.
        move.l  #$60000,d1     ; Pointer naar de source-naam.
        move.l  #1005,d2       ; Mode : Oud file, het moet bestaan.
        jsr     -30(a5)        ; OPENFILE
        move.l  d0,a4          ; Pointer naar het file opslaan.
        beq.s   close          ; ERROR !!!
        move.l  #$60000+80,d1  ; Pointer naar de destination-naam.
        move.l  #1006,d2       ; Mode : Nieuw file.
        jsr     -30(a5)        ; OPENFILE
        move.l  d0,a3          ; Pointer naar het file opslaan.
        beq.s   close2         ; Klaar.

; Nu gaan we 4 bytes lezen.

main:   move.l  a4,d1          ; Pointer naar het source-veld.
        move.l  #veld,d2       ; Pointer naar het data-veld.
        moveq   #4,d3          ; 4 Bytes.
        jsr     -42(a5)        ; READ
        beq.s   eocopy         ; Error ? Dan einde van het file.

; Nu kijken we wat we met deze vier bytes moeten doen.

        lea     veld,a0        ; Pointer naar het te lezen file.
        move.l  (a0)+,d2       ; Data in D2 zetten.
        cmp.w   #$ff,ptr       ; Pointer naar DECODEREN
        beq.s   decode         ; Dus naar die routine.
code:   neg.l   d2             ; De vier letters inverteren.
        swap    d2             ; Letters per paar omdraaien.
        ror.l   #6,d2          ; Zes keer een bit roteren.
        bchg    #15,d2         ; En aanpassen. Hier kan iedereen zijn eigen
        bchg    #3,d2          ; getallen opgeven en het mogen er ook meer
        bchg    #1,d2          ; zijn. Zo kan iedereen zijn eigen codeer-
        bchg    #11,d2         ; programma maken.
        bra.s   done           ; Klaar met het roteren.

decode: bchg    #11,d2         ; Bij het decoderen wordt alles gewoon in de
        bchg    #1,d2          ; andere volgorde gedaan...
        bchg    #3,d2          ; 
        bchg    #15,d2         ; 
        rol.l   #6,d2          ;
        swap    d2             ;
        neg.l   d2             ;

; Nu we klaar zijn met coderen of decoderen moeten we de 4 letters opslaan.

done:   move.l  d2,-(a0)       ; Data terug in de buffer.
        move.l  #veld,d2       ; Pointer naar het veld.
        move.l  d0,d3          ; Pointer naar de lengte.
        move.l  a3,d1          ; Pointer naar het destination-file.
        jsr     -48(a5)        ; WRITE.
        bra.s   main           ; En nu de volgende tekens.

; Het file sluiten.

eocopy: move.l  a3,d1          ; Pointer naar destination-file.
        jsr     -36(a5)        ; CLOSEFILE.
close2: move.l  a4,d1          ; Pointer naar source-file.
        jsr     -36(a5)        ; CLOSEFILE.

; Terug naar de CLI.

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

; Een foutenroutine die aangeroepen wordt als Codeer geen parameters kan
; vinden.

nofile: bsr.s   init           ; DOS.library openen.
        jsr     -60(a5)        ; OUTPUT.
        move.l  #nofilemsg,d2  ; Pointer naar ons bericht.
        moveq   #10,d3         ; 10 tekens.
        jsr     -48(A5)        ; WRITE.
        bra.s   close          ; Einde.

; Open de DOS.library.

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

; Initialiseren van de SAVE-optie,

initsave:
        move.l  (a0)+,d1       ; Parameter eruit halen.
        move.b  (a0)+,d1       ; Spatie korrigeren.
        move.w  #$f0,ptr       ; Code SAVE.
        bra.L   start          ;

; Initialiseren van de LOAD-optie.

initload:
        move.l  (a0)+,d1       ; Parameter eruit halen.
        move.b  (a0)+,d1       ; Spatie korrigeren.
        move.w  #$ff,ptr       ; Code LOAD.
        bra.L   start          ;

; Nu nog wat labels.

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