home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / DVD!OMA2.DMS / in.adf / Examples / Cmp.asm < prev    next >
Encoding:
Assembly Source File  |  1994-10-13  |  12.6 KB  |  679 lines

  1.  
  2. ;****************************************************************************
  3. ;                  Vergleichsprogramm Version 1.0 - Cmp
  4. ; Das Programm vergleicht zwei Binärfiles miteinander und meldet, ob und wo
  5. ; sie unterschiedlich sind.
  6. ;
  7. ;                  Copyright in 1991 by Dietmar Heidrich.
  8. ; Dieses Programm ist Bestandteil von OMA V2.0 und nur als Beispiel vorhan-
  9. ; den.  Seine Vervielfältigung, Veränderung oder Verbreitung ist verboten.
  10. ;
  11. ;  Dieses Cmp kann NICHT gleichzeitig von mehreren Tasks benutzt werden,
  12. ;  wenn es unter der Workbench 1.3 resident gehalten wird.  Compress-Tab 8.
  13. ;****************************************************************************
  14.  
  15.     SECTION    CmpCODE,CODE
  16.  
  17.     NOPAGE
  18.     NOLIST
  19.  
  20.     INCLUDE    "exec/types.i"
  21.     INCLUDE    "exec/alerts.i"
  22.     INCLUDE    "exec/tasks.i"
  23.     INCLUDE    "libraries/dos.i"
  24.     INCLUDE    "libraries/dosextens.i"
  25.     INCLUDE    "lvo/exec.i"
  26.     INCLUDE    "lvo/dos.i"
  27.  
  28.     LIST
  29.  
  30.  
  31.  
  32.  
  33. BP            EQUR    A5
  34.  
  35. _SysBase        EQU    4
  36.  
  37. TAB            EQU    9
  38. LF            EQU    10
  39. CR            EQU    13
  40. SPACE            EQU    ' '
  41. PUFFERGROESSE        EQU    10000
  42. MAXIMUM_ARGUMENTS    EQU    6
  43. MAXIMUM_ARGBUFFER    EQU    256
  44.  
  45.  
  46.  
  47. CALL    MACRO
  48.     IFEQ    NARG-2
  49.     move.l    \2,a6
  50.     ENDC
  51.     IFLE    NARG-2
  52.     jsr    _LVO\1(a6)
  53.     MEXIT
  54.     ENDC
  55.     FAIL    CALL MACRO ERROR
  56.     ENDM
  57.  
  58.  
  59.  
  60. STRINGLF    MACRO
  61.     dc.b    '\1',LF,0
  62.     ENDM
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. ;****************************************************************************
  74. ; Der Beginn.
  75.  
  76. Startup
  77.     lea    Basisadresse+32768,BP
  78.  
  79.     BASEREG    BP
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90. ;****************************************************************************
  91. ; Variablen.
  92.  
  93.     SECTION    CmpBSS,BSS
  94.  
  95.     CNOP      0,4
  96.  
  97. Basisadresse
  98.  
  99. _DOSBase    ds.l    1
  100. HauptSP        ds.l    1
  101. _stdout        ds.l    1
  102.  
  103. argvArray    ds.l    MAXIMUM_ARGUMENTS
  104. argvBuffer    ds.b    MAXIMUM_ARGBUFFER
  105.  
  106.  
  107.  
  108.     CNOP    0,4
  109.  
  110. AnfangBss
  111.  
  112.  
  113. Seitennummer    ds.l    1
  114. Fehlerflag    ds.l    1
  115.  
  116. Filename1    ds.l    1
  117. Filename2    ds.l    1
  118.  
  119. File1        ds.l    1
  120. File2        ds.l    1
  121.  
  122. Filepuffer1    ds.b    PUFFERGROESSE
  123. Filepuffer2    ds.b    PUFFERGROESSE
  124.  
  125. Formatierstring    ds.b    256
  126.  
  127.  
  128.     CNOP    0,4
  129.  
  130. EndeBss
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. ;****************************************************************************
  142. ; Parse die CLI-Argumente.
  143.  
  144.     SECTION    CmpCODE,CODE
  145.  
  146. ParseArgumente
  147.  
  148.     ; Öffne DOS.
  149.     move.l    SP,HauptSP
  150.     movem.l    d0/a0,-(SP)
  151.     lea    DOSName(PC),a1
  152.     moveq    #LIBRARY_VERSION,d0
  153.     CALL    OpenLibrary,_SysBase
  154.     move.l    d0,_DOSBase
  155.     bne.s    1$
  156.  
  157.     BASEREG    OFF
  158.  
  159.     ; Fehler: DOS nicht offen.
  160.     move.l    #(AG_OpenLib!AO_DOSLib),d7
  161.     lea    AlertWert(PC),a5
  162.     CALL    Alert
  163.     addq    #2*4,SP            ; korrigiere Stack
  164.     moveq    #100,d0
  165.     rts                ; zurück zum DOS
  166.  
  167.     BASEREG    BP
  168.  
  169.     ; Initialisiere Zähler und Zeiger.
  170. 1$    move.l    d0,a6
  171.     CALL    Output
  172.     move.l    d0,_stdout
  173.     move.l    #MAXIMUM_ARGBUFFER-1,d7
  174.     moveq    #MAXIMUM_ARGUMENTS-1,d6    ; Argumentzähler
  175.     lea    argvArray,a1
  176.     lea    argvBuffer,a3
  177.     movem.l    (SP)+,d0/a0
  178.     cmp.l    d7,d0            ; Kommandozeile zu lang ?
  179.     bhs.s    FehlerBufferOverflow    ; ja
  180.  
  181.     ; Parse die Argumente.
  182.     moveq    #SPACE,d5        ; verkürzt Code
  183.     moveq    #'"',d3            ; verkürzt Code
  184.     bra    NächstesArgument
  185.  
  186.  
  187.  
  188. ArgumentSchleife
  189.     move.b    (a0)+,d4        ; hole Zeichen
  190.     cmp.b    d5,d4            ; legales Zeichen ?
  191.     bls.s    NächstesArgument    ; nein, nächstes Zeichen
  192.  
  193.     move.l    a3,a2            ; Zeiger auf Argumentpuffer-Stelle merken
  194.     cmp.b    d3,d4            ; ist es doppeltes Hochkomma ?
  195.     bne.s    1$            ; nein
  196.     bra.s    3$            ; ja
  197.  
  198.  
  199.  
  200.     ; Argument darf mit einem SPACE enden.
  201. 2$    move.b    (a0)+,d4        ; hole Zeichen
  202.     cmp.b    d5,d4            ; Argument beendet ?
  203.     bls.s    ArgumentEnde        ; ja
  204. 1$    cmp.b    #'=',d4            ; ein '=' ist nicht erlaubt
  205.     beq.s    FehlerEquateUse        ; wenn Fehler
  206.     move.b    d4,(a3)+        ; speichere Zeichen
  207.     dbra    d0,2$            ; Zeichen übrig ?
  208.     bra.s    ArgumentEnde        ; nein
  209.  
  210.  
  211.  
  212.     ; Argument ist in doppelte Hochkommata eingefaßt.
  213. 4$    move.b    (a0)+,d4        ; hole Zeichen
  214.     cmp.b    d5,d4            ; Argument beendet ?
  215.     blo.s    FehlerIllegalArgEnd    ; ja, Fehler
  216.  
  217.     ; Endet Argument mit doppeltem Hochkomma ?
  218.     cmp.b    d3,d4
  219.     bne.s    5$            ; nein
  220.     subq    #1,d0            ; Zeichen übrig ?
  221.     blt.s    ArgumentEnde        ; nein, alles OK
  222.     move.b    (a0)+,d4        ; ja, nächstes Zeichen
  223.     cmp.b    d5,d4            ; legales Zeichen ?
  224.     bls.s    ArgumentEnde        ; ja, alles OK
  225.     bra.s    FehlerIllegalArgEnd    ; nein, Fehler
  226.  
  227.     ; Ist es ein Stern ?
  228. 5$    cmp.b    #'*',d4
  229.     bne.s    6$            ; nein, speichere Zeichen
  230.     subq    #1,d0            ; Zeichen übrig ?
  231.     blt.s    FehlerIllegalArgEnd    ; nein, Fehler
  232.     move.b    (a0)+,d4        ; hole Zeichen
  233.     cmp.b    d5,d4            ; Argument beendet ?
  234.     blo.s    FehlerIllegalArgEnd    ; ja, Fehler
  235.  
  236. 6$    move.b    d4,(a3)+        ; speichere Zeichen
  237.  
  238.     ; Es MUß noch Zeichen geben, oder Fehler.
  239. 3$    dbra    d0,4$            ; Zeichen übrig ?
  240.  
  241.  
  242.  
  243. FehlerIllegalArgEnd
  244.     lea    TextBadArgs(PC),a0
  245.     bra.s    ArgumentFehler
  246.  
  247. FehlerBufferOverflow
  248.     lea    TextBufferOverflow(PC),a0
  249.     bra.s    ArgumentFehler
  250.  
  251. FehlerEquateUse
  252.     lea    TextEquateUse(PC),a0
  253.     bra.s    ArgumentFehler
  254.  
  255. FehlerTooManyArguments
  256.     lea    TextTooManyArgs(PC),a0
  257.  
  258. ArgumentFehler
  259.     bra    Programmende
  260.  
  261.  
  262.  
  263. ArgumentEnde
  264.     clr.b    (a3)+            ; Argumentende
  265.     subq.l    #1,d6            ; noch freie Zeiger übrig ?
  266.     ble.s    FehlerTooManyArguments    ; nein
  267.     move.l    a2,(a1)+        ; merke Zeiger auf Argumentstring
  268.  
  269. NächstesArgument
  270.     dbra    d0,ArgumentSchleife    ; Zeichen übrig ?
  271.  
  272.     ; Setze die Startwerte.
  273.     lea    argvArray,a0
  274.     neg    d6
  275.     add    #MAXIMUM_ARGUMENTS-1,d6
  276.     move.l    d6,d0
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287. ;****************************************************************************
  288. ; Beginn des Programmes.  D0 enthält die Anzahl der CLI-Parameter und A0 den
  289. ; Zeiger auf das Feld der Zeiger auf die CLI-Argumente.
  290.  
  291. _main
  292.     ; Initialisierung.
  293.     lea    AnfangBss,a1
  294.     move    #(EndeBss-AnfangBss)/4-1,d1
  295. 1$    clr.l    (a1)+
  296.     dbra    d1,1$
  297.     move.l    a0,a2            ; retten
  298.  
  299.     ; Es müssen 2 Argumente sein.
  300.     subq.l    #2,d0
  301.     bne    FehlerIllegalArgEnd
  302.     move.l    (a0)+,Filename1
  303.     move.l    (a0)+,Filename2
  304.  
  305.     ; Lösche die Signale.
  306.     moveq    #0,d0
  307.     move.l    #SIGBREAKF_CTRL_D!SIGBREAKF_CTRL_C,d1
  308.     CALL    SetSignal,_SysBase
  309.  
  310.     ; Öffne das erste File.
  311.     move.l    Filename1,d1
  312.     move.l    d1,a4
  313.     move.l    #MODE_OLDFILE,d2
  314.     CALL    Open,_DOSBase
  315.     move.l    d0,File1
  316.     bne.s    2$
  317.     ; Fehler: File nicht offen.
  318. 3$    CALL    IoErr
  319.     move.l    a4,-(SP)
  320.     move.l    d0,-(SP)
  321.     lea    TextErrorOpen(PC),a0
  322.     bra    Programmende
  323.  
  324.     ; Öffne das zweite File.
  325. 2$    move.l    Filename2,d1
  326.     move.l    d1,a4
  327.     move.l    #MODE_OLDFILE,d2
  328.     CALL    Open
  329.     move.l    d0,File2
  330.     beq.s    3$
  331.  
  332.  
  333.  
  334.  
  335.     ; Fülle die Puffer.  A4 & A3 sind Pufferzeiger, D7 & D6 Restbytezähler.
  336. 8$    move.l    File1,d1
  337.     move.l    Filename1,a2
  338.     lea    Filepuffer1,a4
  339.     move.l    a4,a0
  340.     bsr    FuelleFilepuffer
  341.     move.l    d0,d7
  342.     move.l    File2,d1
  343.     move.l    Filename2,a2
  344.     lea    Filepuffer2,a3
  345.     move.l    a3,a0
  346.     bsr    FuelleFilepuffer
  347.     addq.l    #1,Seitennummer
  348.     move.l    d0,d6
  349.  
  350.     ; Sind beide Längen Null ?
  351.     suba.l    a0,a0
  352.     or.l    d7,d0
  353.     beq.s    Programmende        ; ja, Files zu Ende und beide gleich
  354.  
  355.  
  356.     ; Sind die Längen verschieden ?
  357.     cmp.l    d6,d7
  358.     beq.s    4$            ; nein (BNE ist falsch)
  359.     lea    TextDifferentLength(PC),a0
  360.     bsr    Stringausgabe
  361.     move    d6,d0
  362.     cmp    d6,d7
  363.     bhs.s    0$
  364.     move    d7,d0
  365. 0$    moveq    #0,d1            ; mache BNE falsch
  366.     bra.s    6$
  367.  
  368. 7$    cmp.b    (a3)+,(a4)+
  369. 6$    dbne    d0,7$
  370.     bne    Verschieden
  371.     suba.l    a0,a0
  372.     bra    Programmende        ; Files zu Ende
  373.  
  374.  
  375.     ; Vergleiche die Bytes.
  376. 5$    cmp.b    (a3)+,(a4)+
  377. 4$    dbne    d6,5$
  378.  
  379.     beq    8$            ; wenn bis hier gleich
  380.  
  381.  
  382.  
  383. Verschieden
  384.     ; Berechne die Byteposition.
  385.     move.l    Seitennummer,d0
  386.     subq.l    #1,d0            ; da immer eine Seite zuviel
  387.     move.l    d0,d1
  388.     mulu    #PUFFERGROESSE,d0
  389.     swap    d1
  390.     mulu    #PUFFERGROESSE,d1
  391.     swap    d1
  392.     clr    d1
  393.     add.l    d1,d0            ; Beginn der Seite
  394.     lea    Filepuffer1,a0
  395.     sub.l    a0,a4
  396.     subq    #1,a4            ; da A4 einen zu weit zeigte
  397.     add.l    a4,d0
  398.     move.l    d0,-(SP)
  399.     lea    TextFilesDiffer(PC),a0
  400.     ; und durchfallen...
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411. ;******************************************************************************
  412. ; Beende das Programm.
  413. ; Eingabe:  A0 zeigt auf den Fehlerstring oder ist Null.
  414.  
  415. Programmende
  416.     move.l    _DOSBase,a6
  417.     move.l    a0,Fehlerflag        ; existiert String ?
  418.     beq.s    1$            ; nein
  419.     bsr    Stringausgabe
  420.  
  421.     ; Schließe File 1.
  422. 1$    move.l    File1,d1
  423.     beq.s    2$
  424.     CALL    Close
  425.  
  426.     ; Schließe File 2.
  427. 2$    move.l    File2,d1
  428.     beq.s    3$
  429.     CALL    Close
  430.  
  431.     ; Schließe DOS.
  432. 3$    move.l    _DOSBase,d0
  433.     beq.s    4$
  434.     move.l    d0,a1
  435.     CALL    CloseLibrary,_SysBase
  436.  
  437.     ; Zurück ins DOS.
  438. 4$    move.l    Fehlerflag,d0        ; trat Fehler auf ?
  439.     beq.s    5$            ; nein, D0=0 und fertig
  440.     moveq    #RETURN_FAIL,d0        ; ja, melde AmigaDOS einen Fehler
  441. 5$    move.l    HauptSP,SP
  442.     rts
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453. ;******************************************************************************
  454. ; Fülle einen Filepuffer.
  455. ; Eingabe:  A0 zeigt auf den Puffer.
  456. ;           A2 zeigt auf den Namen.
  457. ;           D1 enthält den Filezeiger.
  458. ; Ausgabe:  D0 enthält die Restbytes.
  459.  
  460. FuelleFilepuffer_REG    REG    d1-d3/a0-a1/a6
  461.  
  462. FuelleFilepuffer
  463.     movem.l    FuelleFilepuffer_REG,-(SP)
  464.     move.l    a0,d2            ; Pufferzeiger
  465.     move.l    #PUFFERGROESSE,d3
  466.     CALL    Read,_DOSBase
  467.     moveq    #-1,d1
  468.     cmp.l    d0,d1            ; Lesefehler ?
  469.     beq.s    1$            ; ja
  470.     movem.l    (SP)+,FuelleFilepuffer_REG
  471.     rts
  472.  
  473.     ; Lesefehler im File.
  474. 1$    CALL    IoErr
  475.     move.l    a2,-(SP)        ; Filename
  476.     move.l    d0,-(SP)
  477.     lea    TextReadError(PC),a0
  478.     bra    Programmende
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489. ;******************************************************************************
  490. ; Konvertiere ein Langwort in einen maximal 11 Stellen langen Dezimalstring.
  491. ; Die Routine vermeidet überflüssige Nullen am Zahlenanfang wie z.B. 0019.
  492. ; Eingabe:  D0 enthält das Langwort.
  493. ;           A0 zeigt auf den Ablagestring.
  494. ; Ausgabe:  A0 zeigt direkt hinter den Dezimalstring.  Der Dezimalstring landet
  495. ;           im Ablagestring.
  496.  
  497. ErzeugeDezimalZahl_REG    REG    d0-d4/a1
  498.  
  499. ErzeugeDezimalZahl
  500.     movem.l    ErzeugeDezimalZahl_REG,-(SP)
  501.     lea    DezimalTabelle(PC),a1
  502.     moveq    #9,d1            ; Stellenzähler
  503. 2$    cmp.l    (a1)+,d0        ; ist Stellenwertigkeit zu hoch ?
  504.     bhs.s    1$
  505.     dbra    d1,2$            ; ja, nächste Stelle
  506.     moveq    #0,d1            ; hier landen wir, falls D0 = 0
  507.  
  508. 1$    subq    #4,a1            ; ergibt die richtige Stellenwertigkeit
  509.  
  510. 5$    move.l    d0,d3            ; Rest der Zahl retten
  511.     moveq    #'0',d2
  512.     move.l    (a1)+,d4        ; Stellenwertigkeit holen
  513.     bra.s    3$
  514.  
  515. 4$    addq    #1,d2            ; Ziffer höher stellen
  516. 3$    move.l    d3,d0            ; Rest der Zahl
  517.     sub.l    d4,d3            ; ist Stellenwertigkeit zu hoch ?
  518.     bcc.s    4$            ; nein
  519.  
  520.     move.b    d2,(a0)+        ; ja, erhaltene Ziffer in Ausgabepuffer
  521.     dbra    d1,5$            ; alle Stellen durch ?
  522.  
  523.     movem.l    (SP)+,ErzeugeDezimalZahl_REG
  524.     rts
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535. ;******************************************************************************
  536. ; Die Stringausgabe formatiert einen String und gibt ihn auf _stdout aus.
  537. ; Eingabe:  A0 zeigt auf den auszugebenden String.
  538.  
  539. Stringausgabe_REG    REG    d0-d3/a0-a3/a6
  540.  
  541. Stringausgabe
  542.     movem.l    Stringausgabe_REG,-(SP)
  543.     move.l    a0,a1
  544.     lea    Formatierstring,a0    ; hier hinein kommt der fertige String
  545.     move.l    a0,d2            ; merken für DOS-Write und Längenberechnung
  546.  
  547.     ; Beachte, daß 9 Register auf den Stack gerettet wurden.
  548.     lea    4+4*9(SP),a3        ; Zeiger auf die Parameter
  549.     bra.s    1$
  550.  
  551.  
  552.  
  553.     ; Setze Dezimalzahl ein.
  554. 2$    move.b    (a1)+,d0        ; hole Zeichen
  555.     move.b    d0,d1
  556.     bclr    #5,d1            ; wandele in Großbuchstaben
  557.     cmp.b    #'D',d1            ; soll eine Dezimalzahl eingesetzt werden ?
  558.     bne.s    4$            ; nein
  559.     move.l    (a3)+,d0        ; hole Parameter (Dezimalzahl)
  560.     bsr    ErzeugeDezimalZahl    ; und schreibe Dezimalstring nach A0
  561.     bra.s    1$            ; hole das nächste Zeichen
  562.  
  563.  
  564.     ; Setze einen String ein.
  565. 4$    cmp.b    #'S',d1            ; soll ein String eingesetzt werden ?
  566.     bne.s    5$            ; nein
  567.     move.l    (a3)+,a2        ; hole Parameter (Stringzeiger)
  568. 6$    move.b    (a2)+,(a0)+        ; kopiere Zeichen
  569.     bne.s    6$            ; bis String zu Ende
  570.     subq    #1,a0            ; zeigt jetzt direkt hinter String
  571.     bra.s    1$
  572.  
  573.  
  574.     ; Setze Hexzahl ein.
  575. 5$    cmp.b    #'X',d1
  576.     bne.s    3$
  577.     move.l    (a3)+,d0        ; hole Parameter
  578.     moveq    #8-1,d1            ; ein Langwort hat 8 Nibbles
  579. 7$    rol.l    #4,d0
  580.     move.b    d0,d3
  581.     and.b    #%1111,d3
  582.     cmp.b    #10,d3
  583.     blt.s    8$
  584.     addq    #('A'-'0'-10),d3
  585. 8$    add.b    #'0',d3
  586.     move.b    d3,(a0)+        ; Nibble ausgeben
  587.     dbra    d1,7$            ; bis alle Nibbles durch sind
  588.  
  589.  
  590.     ; Hole ein Zeichen.
  591. 1$    move.b    (a1)+,d0        ; hole Zeichen
  592.     cmp.b    #'%',d0            ; ist es '%' ?
  593.     beq.s    2$            ; ja, ersetze einen Parameter
  594.     ; Speichere das Zeichen nur.
  595. 3$    move.b    d0,(a0)+        ; Zeichen speichern
  596.     bne.s    1$            ; bis String zu Ende ist
  597.  
  598.  
  599.     ; Wir sind fertig mit Formatieren.
  600.     subq    #1,a0            ; da A0 einen zu weit zeigt
  601.     move.l    a0,d3
  602.     sub.l    d2,d3            ; ergibt Stringlänge
  603.     move.l    _stdout,d1        ; Filezeiger
  604.     CALL    Write,_DOSBase        ; scher dich nicht darum, ob's klappt
  605.     movem.l    (SP)+,Stringausgabe_REG
  606.     rts
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617. ;******************************************************************************
  618. ; Die Tabellen.
  619.  
  620. AlertWert    dc.l    -1
  621.  
  622. DezimalTabelle
  623.     dc.l    1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634. ;******************************************************************************
  635. ; Hier kommen die Texte.
  636.  
  637. DOSName    DOSNAME
  638.  
  639.  
  640.     IFD    ENGLISCH
  641.  
  642. TextBadArgs        STRINGLF <Bad args>
  643. TextBufferOverflow    STRINGLF <Argument buffer overflow>
  644. TextEquateUse        STRINGLF <Illegally used ''=''>
  645. TextTooManyArgs        STRINGLF <Too many arguments>
  646.  
  647. TextErrorOpen        STRINGLF [DOS error %d opening file <%s>]
  648. TextReadError        STRINGLF [DOS error %d reading file <%s>]
  649. TextDifferentLength    STRINGLF [Files have different length]
  650. TextFilesDiffer        STRINGLF [Files differ at byte $%x]
  651.  
  652.     ELSE
  653.  
  654. TextBadArgs        STRINGLF <Falsche Argumente>
  655. TextBufferOverflow    STRINGLF <Argumentpuffer-Überlauf>
  656. TextEquateUse        STRINGLF <Unzulässiges ''=''>
  657. TextTooManyArgs        STRINGLF <Zu viele Argumente>
  658.  
  659. TextErrorOpen        STRINGLF [DOS-Fehler %d beim Öffnen von File <%s>]
  660. TextReadError        STRINGLF [DOS-Lesefehler %d im File <%s>]
  661. TextDifferentLength    STRINGLF [Files sind verschieden lang]
  662. TextFilesDiffer        STRINGLF [Files sind verschieden am Byte $%x]
  663.  
  664.     ENDC
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675. ; Ende des Programmes
  676.  
  677.     END
  678.  
  679.