;TestProgramm für "tracker.library"

; Testet TRK_Open, TRK_OpenFromLock und TRK_Close

        NOLIST
        INCLUDE "exec/LVO.i"
        INCLUDE "exec/memory.i"
        INCLUDE "dos/LVO.i"
        INCLUDE "dos/dosextens.i"
        INCLUDE "tracker.i"
        LIST

HEADLEN: EQU 32         ;soviel wird ausgegeben

Print:  MACRO
        move.l  Output,d1
        move.l  #\1,d2
        CALLDOS VFPrintf
        ENDM

_TrackerBase:   EQUR a5
_DosBase:       EQUR a4
Output:         EQUR d7
Buffer:         EQUR a3

; WB-Message ?
        sub.l   a1,a1           ;a1=0->eigener Task
        CALLEXEC FindTask       ;Wo darf man denn nachschauen ?
        move.l  d0,a0
        tst.l   pr_CLI(a0)      ;von CLI oder WB aus gestartet ?
        bne     fromCLI
;von WB aus:
        lea     pr_MsgPort(a0),a0
        move.l  a0,-(sp)
        CALLEXEC WaitPort       ;auf Start-Message warten
        move.l  (sp)+,a0
        CALLEXEC GetMsg ;muß nachher beantwortet werden
        move.l  d0,WBenchMsg

fromCLI:
; Tracker-Library öffnen
        OPENLIB TrName
        tst.l   d0
        beq     ende_all
        move.l  d0,_TrackerBase
        TRK_OPENSTDLIB DOS,36
        tst.l   d0
        beq     ende_trk
        move.l  d0,_DosBase

        tst.l   WBenchMsg
        bne     fromWB
;von CLI aus -> Ausgaben ins CLI-Fenster
        CALLDOS Output
        move.l  d0,Output
        bra     main
;von WB aus gestartet -> eigenes Window nötig
fromWB: move.l  #WdName,d1
        move.l  #MODE_OLDFILE,d2
        CALLTRK TRK_Open
        move.l  d0,Output
;---------------------------------------------------------------------------
;Haupt-Testteil

OPEN:   MACRO   ;Name
        move.l  #\1,d1
        bsr     Open_File
        ENDM
LOPEN:  MACRO   ;Name
        move.l  #\1,d1
        bsr     Lock_Open
        ENDM
CLOSE:  MACRO   ;FileHandle
        move.l  \1,d1
        bsr     Close_File
        ENDM

main:   move.l  #2*HEADLEN,d0
        move.l  #MEMF_ANY,d1
        CALLTRK TRK_AllocMem
        tst.l   d0
        beq     ende_main
        move.l  d0,Buffer

        OPEN    FileName_1
        LOPEN   FileName_1
        bsr     Compare
        LOPEN   FileName_2
        move.l  d0,FH_2b
        OPEN    FileName_2
        move.l  d0,FH_2a
        bsr     Compare
        OPEN    FileName_3
        move.l  d0,FH_3a
        LOPEN   FileName_3
        move.l  d0,FH_3b
        bsr     Compare
        CLOSE   FH_2a
        CLOSE   FH_2b
        LOPEN   FileName_4
        OPEN    FileName_4
        bsr     Compare
        CLOSE   FH_3a
        CLOSE   FH_3b
        move.l  #CMD_List,d1
        moveq   #0,d2
        move.l  Output,d3
        CALLDOS Execute
        move.l  #FileName_5,d1
        move.l  #MODE_NEWFILE,d2
        CALLTRK TRK_Open
        move.l  #CMD_List,d1
        moveq   #0,d2
        move.l  Output,d3
        CALLDOS Execute
;---------------------------------------------------------------------------

ende_main:
;ggf. End-Botschaft und Verzögerung
        tst.l   WBenchMsg
        beq     ende_trk
        move.l  Output,d1
        move.l  #GoodBye,d2
        moveq   #GoodByeLen,d3
        CALLDOS Write
        move.l  #150,d1
        CALL    Delay
;Library schließen
ende_trk:
        CLOSELIB _TrackerBase
ende_all:
        tst.l   WBenchMsg       ;war da was ?
        beq     toCLI           ;na dann halt nicht
;Message zur WB zurück
        move.l  WBenchMsg,a1
        CALLEXEC ReplyMsg
toCLI:  moveq   #0,d0
        rts

;---------------------------------------------------------------------------
; Unterprogramm: File(Handle) d1 schließen
; Parameter: d1 = FileHandle-BPTR
; Ergebnis: -

Close_File:
        tst.l   d1
        bne     1$
        rts
1$:     move.l  d1,-(sp)
        CALLTRK TRK_Close
        move.l  sp,d3
        Print   CloseTxt
        add.w   #4,sp
        rts
;---------------------------------------------------------------------------
; Unterprogramm: File des Namens d1 öffnen und Anfang ausgeben
; Parameter: d1 = Adresse des Filenamens
;            Buffer = Zeiger auf Dateipuffer (Länge 2*HEADLEN)
; Ergebnis: der FileHandle (Flags korrekt !)

Open_File:
        move.l  d1,-(sp)
        move.l  #MODE_OLDFILE,d2
        CALLTRK TRK_Open
        tst.l   d0
        bne     1$
;Datei nicht verfügbar !
        move.l  sp,d3
        Print   not_existant
        addq.l  #4,sp
        moveq   #0,d0
        rts

;Datei geöffnet
1$:     move.l  sp,d3
        move.l  d0,-(sp)
        Print   existant
        move.l  (sp)+,d1
;Dateianfang lesen
        move.l  d1,(sp)         ;Namen gegen FileHandle tauschen !
        move.l  Buffer,d2
        move.l  #HEADLEN,d3
        CALL    Read
        move.l  d0,-(sp)
        move.l  sp,d3
        Print   ReadNN
        move.l  Output,d1
        move.l  Buffer,d2
        move.l  (sp)+,d3
        CALL    Write
        Print   CrLf
        move.l  (sp)+,d0
        rts
;---------------------------------------------------------------------------
; Unterprogramm: File des Namens d1 via Lock öffnen
; Parameter: d1 = Adresse des Filenamens
;            Buffer = Zeiger auf Dateipuffer (Länge 2*HEADLEN)
; Ergebnis: der FileHandle (Flags korrekt !)

Lock_Open:
        move.l  #ACCESS_READ,d2
        CALLTRK TRK_Lock                ;sollte auch mit CALLDOS Lock laufen !
                                        ;(es sei denn, eine der Dateien ist
                                        ; nicht auffindbar)
        tst.l   d0
        beq     2$                      ;Datei nicht verfügbar ?
;Lock eröffnet
        move.l  d0,-(sp)
        move.l  sp,d3
        move.l  (sp)+,d0
        move.l  d0,d1
        CALLTRK TRK_OpenFromLock
        move.l  d0,-(sp)
        move.l  sp,d3
        move.l  (sp)+,d0
        tst.l   d0
        beq     2$
;Kopf einlesen:
        move.l  d0,-(sp)
        move.l  d0,d1
        moveq   #HEADLEN,d3
        move.l  Buffer,d2
        add.l   d3,d2
        CALLDOS Read
        move.l  d0,-(sp)
        move.l  sp,d3
        Print   ReadNN
        move.l  Output,d1
        move.l  Buffer,d2
        move.l  (sp)+,d3
        CALL    Write
        Print   CrLf
        move.l  (sp)+,d0
        move.l  (sp)+,d0
2$:     rts
;---------------------------------------------------------------------------
; Unterprogramm: die gelesenen Anfänge der beiden Dateien miteinander
; vergleichen
; Parameter: - ; Ergebnis: -

Compare: move.l Buffer,a0
        moveq   #HEADLEN,d0
        move.l  d0,a1
        add.l   a0,a1
        subq.w  #1,d0
1$:     cmp.b   (a0)+,(a1)+
        bne     2$
        dbra    d0,1$
        Print   Equal_Text
        rts
2$:     Print   Differ_Text
        rts
;---------------------------------------------------------------------------
WBenchMsg:      dc.l 0
FH_2a:          dc.l 0
FH_2b:          dc.l 0
FH_3a:          dc.l 0
FH_3b:          dc.l 0

TrName: TRACKERNAME

WdName:         dc.b "CON:0/0/640/200/File-Test für tracker.library",0
GoodBye:        dc.b 10,"Bye - closing soon !"
GoodByeLen:     equ *-GoodBye
FileName_1:     dc.b "s:Startup-Sequence",0
FileName_2:     dc.b "devs:mountlist",0
FileName_3:     dc.b "lib-dos.asm",0
FileName_4:     dc.b "tracker.i",0
FileName_5:     dc.b "RAM:dmmy",0
not_existant:   dc.b "Datei %s kann nicht geöffnet werden !",10,0
existant:       dc.b "Datei %s geöffnet"
CrLf:           dc.b 10,0
CloseTxt:       dc.b "Datei mit FileHandle-BPTR $%06lx geschloßen",10,0
ReadNN:         dc.b "%ld Bytes gelesen: ",10,0
CMD_List:       dc.b "list RAM:d#?",0
Equal_Text:     dc.b "The two files opened via TRK_Open / TRK_Lock & TRK_OpenFromLock",10
                dc.b "seem to be the same.",10,0
Differ_Text:    dc.b "The two files opened via TRK_Open / TRK_Lock & TRK_OpenFromLock differ",10,0

        END
