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

  1.  
  2. ;****************************************************************************
  3. ; CLI.asm                                 Copyright 1990 bei Dietmar Heidrich
  4. ;
  5. ; Startup-Modul für alle Assembler-Programme.  Dieses Modul ist reentrant und
  6. ; ARBEITET NUR UNTER DEM CLI.  Compress-Tab 8.
  7. ;
  8. ; Der Code ist dem im Addison-Wesley "ROM Kernel Reference Manual" ähnlich, nur
  9. ; wurden alle Fehler entfernt, und das Parsen der CLI-Parameter berücksichtigt
  10. ; nun die Konventionen des DOS, d.h. der String "a**b" ergibt den Namen "a*b".
  11. ;
  12. ; Das Assembler-Programm muß beim Label "_main" beginnen, welches durch XDEF
  13. ; global deklariert wird, und kann durch den Aufruf von "_exit" mit dem Fehler-
  14. ; code in D0 terminieren.
  15. ; Beim Aufruf vom CLI aus wird _main die Anzahl von CLI-Argumenten in D0 und
  16. ; der Zeiger auf das Feld mit den Zeigern auf die Argument-Strings in A0 über-
  17. ; geben.
  18. ; D0 und A0 werden auch auf den Stack geschoben ( 4(SP) für D0, 8(SP) für A0 ).
  19. ; Darüberhinaus können die Zeiger _DOSBase, _stdin, _stdout und _stderr benutzt
  20. ; werden.
  21. ;****************************************************************************
  22.  
  23.  
  24.  
  25.     CODE
  26.  
  27.  
  28.  
  29.     INCLUDE    "exec/types.i"
  30.     INCLUDE    "exec/alerts.i"
  31.     INCLUDE    "exec/tasks.i"
  32.     INCLUDE    "libraries/dos.i"
  33.     INCLUDE    "libraries/dosextens.i"
  34.     INCLUDE    "lvo/exec.i"
  35.     INCLUDE    "lvo/dos.i"
  36.  
  37.  
  38.  
  39.     XDEF    _exit
  40.     XDEF    _SysBase
  41.     XDEF    _DOSBase
  42.     XDEF    _stdin
  43.     XDEF    _stdout
  44.     XDEF    _stderr
  45.  
  46.  
  47.  
  48.     XREF    _main
  49.  
  50.  
  51.  
  52. BP            EQUR    A5
  53.  
  54. _SysBase        EQU    4
  55.  
  56. MAXIMUM_ARGUMENTE    EQU    40
  57. MAXIMUM_ARGBUFFER    EQU    256
  58. LF            EQU    10
  59. SPACE            EQU    ' '
  60.  
  61.  
  62.  
  63. CALL    MACRO
  64.     IFEQ NARG-2
  65.     move.l    \2,a6
  66.     ENDC
  67.     IFLE NARG-2
  68.     jsr    _LVO\1(a6)
  69.     MEXIT
  70.     ENDC
  71.     FAIL    CALL MACRO ERROR
  72.     ENDM
  73.  
  74.  
  75.  
  76. PSTRING    MACRO
  77.     IFEQ NARG-1
  78.     dc.b    end\@-1-*,'\1',LF
  79. end\@
  80.     MEXIT
  81.     ENDC
  82.     FAIL    PSTRING MACRO ERROR
  83.     ENDM
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94. ;******************************************************************************
  95. ; Dieser Startup-Code läuft nur unter dem CLI.
  96.  
  97. Startup
  98.     ; Wir müssen reentrant sein.
  99.     lea    BA(PC),BP        ; Basiszeiger
  100.     move.l    SP,HauptSP-BA(BP)    ; rette SP
  101.     movem.l    d0/a0,Register-BA(BP)
  102.     clr.l    _DOSBase-BA(BP)
  103.     moveq    #-1,d0
  104.     lea    _stdin-BA(BP),a0
  105.     move.l    d0,(a0)+
  106.     move.l    d0,(a0)+
  107.     move.l    d0,(a0)+
  108.  
  109.     ; Hole die Adresse unserer Task.
  110.     sub.l    a1,a1
  111.     CALL    FindTask,_SysBase
  112.     move.l    d0,a4            ; Zeiger auf Task-Struktur merken
  113.  
  114.     ; Öffne DOS.
  115.     lea    DOSName-BA(BP),a1
  116.     moveq    #LIBRARY_VERSION,d0
  117.     CALL    OpenLibrary
  118.     move.l    d0,_DOSBase-BA(BP)
  119.     bne.s    0$
  120.     ; Fehler: DOS ist nicht offen.
  121.     move.l    #(AG_OpenLib!AO_DOSLib),d7
  122.     lea    AlertValue-BA(BP),a5
  123.     CALL    Alert
  124.     moveq    #100,d0
  125.     bra    _exit
  126.  
  127.  
  128.  
  129.     ; Hole den Standard-Input/Output-Handle.
  130. 0$    move.l    d0,a6            ; _DOSBase
  131.     CALL    Input
  132.     move.l    d0,_stdin-BA(BP)
  133.     CALL    Output
  134.     move.l    d0,_stdout-BA(BP)
  135.     move.l    d0,_stderr-BA(BP)
  136.  
  137.     ; Finde den Kommandonamen.
  138.     move.l    pr_CLI(a4),a0
  139.     add.l    a0,a0            ; BCPL-Zeiger-Konvertierung
  140.     add.l    a0,a0
  141.     move.l    cli_CommandName(a0),a0
  142.     add.l    a0,a0            ; BCPL-Zeiger-Konvertierung
  143.     add.l    a0,a0
  144.  
  145.     ; Initialisiere Zähler und Zeiger.
  146.     move.l    #MAXIMUM_ARGBUFFER-1,d7
  147.     moveq    #MAXIMUM_ARGUMENTE-2,d6    ; Argumentzähler
  148.     lea    Zeigerfeld,a4
  149.     move.l    a4,a1
  150.     lea    Stringspeicher-Zeigerfeld(a4),a3
  151.  
  152.     ; Hole den Kommandonamen.
  153.     moveq    #0,d0
  154.     move.b    (a0)+,d0        ; Stringlänge
  155.     sub    d0,d7            ; Unterlauf ?
  156.     bcs.s    errorBufferOverflow    ; ja, Fehler
  157.     move.l    a3,(a1)+        ; Zeiger auf Kommandonamen
  158.     bra.s    1$
  159.  
  160. 2$    move.b    (a0)+,(a3)+        ; Kopiere Zeichen
  161. 1$    dbra    d0,2$            ; bis Name zu Ende
  162.  
  163.     clr.b    (a3)+            ; beende Kommandenamen
  164.     movem.l    Register-BA(BP),d0/a0
  165.     cmp.l    d7,d0            ; Kommandozeile zu lang ?
  166.     bhs.s    errorBufferOverflow    ; ja
  167.  
  168.     ; Parse die Argumente.
  169.     moveq    #SPACE,d5        ; verkürzt Code
  170.     moveq    #'"',d3            ; verkürzt Code
  171.     bra    NaechstesArgument
  172.  
  173.  
  174.  
  175. ArgSchleife
  176.     move.b    (a0)+,d4        ; hole Zeichen
  177.     cmp.b    d5,d4            ; legales Zeichen (cmp #' ') ?
  178.     bls.s    NaechstesArgument    ; nein, nächstes Zeichen
  179.  
  180.     move.l    a3,a2            ; Zeiger auf Argumentpuffer-Stelle merken
  181.     cmp.b    d3,d4            ; ist es doppeltes Hochkomma (cmp #'"') ?
  182.     bne.s    1$            ; nein
  183.     bra.s    3$            ; ja
  184.  
  185.  
  186.  
  187.     ; Argument darf mit einem SPACE enden.
  188. 2$    move.b    (a0)+,d4        ; hole Zeichen
  189.     cmp.b    d5,d4            ; Argument beendet (cmp #' ') ?
  190.     bls.s    ArgEnd            ; ja
  191. 1$    cmp.b    #'=',d4            ; ein '=' ist nicht erlaubt
  192.     beq.s    errorEquateUse        ; wenn Fehler
  193.     move.b    d4,(a3)+        ; speichere Zeichen
  194.     dbra    d0,2$            ; Zeichen übrig ?
  195.     bra.s    ArgEnd            ; nein
  196.  
  197.  
  198.  
  199.     ; Argument ist in doppelte Hochkommata eingefaßt.
  200. 4$    move.b    (a0)+,d4        ; hole Zeichen
  201.     cmp.b    d5,d4            ; Argument beendet (cmp #' ') ?
  202.     blo.s    errorIllegalArgEnd    ; ja, Fehler
  203.  
  204.     ; Endet Argument mit doppeltem Hochkomma ?
  205.     cmp.b    d3,d4            ; (cmp #'"')
  206.     bne.s    5$            ; nein
  207.     subq    #1,d0            ; Zeichen übrig ?
  208.     blt.s    ArgEnd            ; nein, alles OK
  209.     move.b    (a0)+,d4        ; ja, nächstes Zeichen
  210.     cmp.b    d5,d4            ; legales Zeichen (cmp #' ') ?
  211.     bls.s    ArgEnd            ; ja, alles OK
  212.     bra.s    errorIllegalArgEnd    ; nein, Fehler
  213.  
  214.     ; Ist es ein Stern ?
  215. 5$    cmp.b    #'*',d4
  216.     bne.s    6$            ; nein, speichere Zeichen
  217.     subq    #1,d0            ; Zeichen übrig ?
  218.     blt.s    errorIllegalArgEnd    ; nein, Fehler
  219.     move.b    (a0)+,d4        ; hole Zeichen
  220.     cmp.b    d5,d4            ; Argument beendet (cmp #' ') ?
  221.     blo.s    errorIllegalArgEnd    ; ja, Fehler
  222.  
  223. 6$    move.b    d4,(a3)+        ; speichere Zeichen
  224.  
  225.     ; Es MUß noch Zeichen geben, oder Fehler.
  226. 3$    dbra    d0,4$            ; Zeichen übrig ?
  227.  
  228.  
  229.  
  230. errorIllegalArgEnd
  231.     lea    TextIllegalArgEnd-BA(BP),a0
  232.     bra.s    errorOut
  233.  
  234. errorBufferOverflow
  235.     lea    TextBufferOverflow-BA(BP),a0
  236.     bra.s    errorOut
  237.  
  238. errorEquateUse
  239.     lea    TextEquateUse-BA(BP),a0
  240.     bra.s    errorOut
  241.  
  242. errorTooManyArguments
  243.     lea    TextTooManyArguments-BA(BP),a0
  244.  
  245. errorOut
  246.     moveq    #0,d3
  247.     move.b    (a0)+,d3        ; Stringlänge
  248.     move.l    a0,d2            ; Stringzeiger
  249.     move.l    _stderr-BA(BP),d1    ; Filezeiger
  250.     CALL    Write            ; Fehler ausgeben, A6 enthält _DOSBase
  251.     moveq    #10,d0            ; Fehlercode
  252.     bra.s    _exit            ; und Ende
  253.  
  254.  
  255.  
  256. ArgEnd 
  257.     clr.b    (a3)+            ; Argumentende
  258.     subq.l    #1,d6            ; noch freie Zeiger übrig ?
  259.     ble.s    errorTooManyArguments    ; nein
  260.     move.l    a2,(a1)+        ; merke Zeiger auf Argumentstring
  261.  
  262. NaechstesArgument
  263.     dbra    d0,ArgSchleife        ; Zeichen übrig ?
  264.  
  265.     ; Setze die Startwerte.
  266.     move.l    a4,a0            ; Zeiger auf Zeigerfeld
  267.     neg    d6
  268.     add    #MAXIMUM_ARGUMENTE-1,d6    ; Zeigeranzahl
  269.     move.l    d6,d0            ; nach D0
  270.  
  271.     ; Starte das Assembler-Programm.
  272.     move.l    a0,-(SP)        ; Startwerte auf den Stack
  273.     move.l    d0,-(SP)
  274.     jsr    _main
  275.  
  276.     ; danach quittiere durch _exit...
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287. ;******************************************************************************
  288. ; Die Exit-Funktion.
  289. ; Eingabe:  D0 enthält den Rückgabe-Code.
  290. ; Ausgabe:  Keine Rückkehr.
  291.  
  292. _exit 
  293.     ; Schließe DOS.
  294.     move.l    d0,d7            ; rette Fehlercode
  295.     move.l    HauptSP(PC),SP        ; SP laden
  296.     move.l    _DOSBase(PC),d0
  297.     beq.s    1$            ; wenn DOS nicht offen
  298.     move.l    d0,a1
  299.     CALL    CloseLibrary,_SysBase
  300.  
  301.     ; Zurück ins DOS.
  302. 1$    move.l    d7,d0
  303.     rts
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314. ;******************************************************************************
  315. ; Variablen.
  316.  
  317.     CNOP    0,4            ; für MC68020
  318.  
  319. BA        ; Basisadresse
  320.  
  321. _DOSBase    ds.l    1
  322.  
  323. _stdin        ds.l    1
  324. _stdout        ds.l    1
  325. _stderr        ds.l    1
  326.  
  327. HauptSP        ds.l    1
  328.  
  329. Register    ds.l    2
  330.  
  331. AlertValue    dc.l    -1
  332.  
  333. DOSName        DOSNAME
  334.  
  335. TextIllegalArgEnd    PSTRING <Illegal argument>
  336. TextBufferOverflow    PSTRING <Argument buffer overflow>
  337. TextEquateUse        PSTRING <Illegally used ''=''>
  338. TextTooManyArguments    PSTRING <Too many arguments>
  339.  
  340.  
  341.  
  342.  
  343.  
  344.     BSS
  345.  
  346.     CNOP    0,4
  347.  
  348. Zeigerfeld    ds.l    MAXIMUM_ARGUMENTE
  349. Stringspeicher    ds.b    MAXIMUM_ARGBUFFER
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360. ; Ende des Startup-Moduls
  361.  
  362.     END
  363.  
  364.