home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Assembler / DVD!OMA2.DMS / in.adf / Examples / Strip.asm < prev   
Encoding:
Assembly Source File  |  1994-10-13  |  20.0 KB  |  1,079 lines

  1.  
  2. ;******************************************************************************
  3. ;                     Strip - Programm Version 1.4
  4. ; Das Programm entfernt aus Objektmodulen oder ausführbaren Programmen alle
  5. ; Symbol- und Debug-Hunks.  Overlay-Hunks werden nicht verstanden.
  6. ;
  7. ;                  Copyright in 1990 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 Strip 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    StripCode,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    "workbench/startup.i"
  26.     INCLUDE    "lvo/exec.i"
  27.     INCLUDE    "lvo/dos.i"
  28.  
  29.     LIST
  30.  
  31.  
  32.  
  33.  
  34. BP        EQUR    A5
  35.  
  36. _SysBase    EQU    4
  37.  
  38. MAXIMUM_ARGUMENTS    EQU    6
  39. MAXIMUM_ARGBUFFER    EQU    256
  40. LF            EQU    10
  41. SPACE            EQU    ' '
  42. PUFFERGROESSE        EQU    10000
  43.  
  44.  
  45.  
  46. CALL    MACRO
  47.     IFEQ    NARG-2
  48.     move.l    \2,a6
  49.     ENDC
  50.     IFLE    NARG-2
  51.     jsr    _LVO\1(a6)
  52.     MEXIT
  53.     ENDC
  54.     FAIL    CALL MACRO ERROR
  55.     ENDM
  56.  
  57.  
  58.  
  59. STRING    MACRO
  60.     dc.b    '\1',LF,0
  61.     ENDM
  62.  
  63.  
  64.  
  65.  
  66.  
  67. ; Definitionen für die AmigaDOS-Hunkstruktur
  68.  
  69. hunk_unit    EQU    $000003E7
  70. hunk_name    EQU    $000003E8
  71. hunk_code    EQU    $000003E9
  72. hunk_code_CHIP    EQU    $400003E9    ; für CHIP-Memory
  73. hunk_code_FAST    EQU    $800003E9    ; für FAST-Memory
  74. hunk_data    EQU    $000003EA
  75. hunk_data_CHIP    EQU    $400003EA    ; für CHIP-Memory
  76. hunk_data_FAST    EQU    $800003EA    ; für FAST-Memory
  77. hunk_bss    EQU    $000003EB
  78. hunk_bss_CHIP    EQU    $400003EB    ; für CHIP-Memory
  79. hunk_bss_FAST    EQU    $800003EB    ; für FAST-Memory
  80. hunk_reloc32    EQU    $000003EC
  81. hunk_reloc16    EQU    $000003ED
  82. hunk_reloc8    EQU    $000003EE
  83. hunk_ext    EQU    $000003EF
  84. hunk_symbol    EQU    $000003F0
  85. hunk_debug    EQU    $000003F1
  86. hunk_end    EQU    $000003F2
  87. hunk_header    EQU    $000003F3
  88. hunk_overlay    EQU    $000003F5
  89. hunk_break    EQU    $000003F6
  90.  
  91. ext_symb    EQU    $00
  92. ext_def        EQU    $01
  93. ext_abs        EQU    $02
  94. ext_res        EQU    $03
  95. ext_ref32    EQU    $81
  96. ext_common    EQU    $82
  97. ext_ref16    EQU    $83
  98. ext_ref8    EQU    $84
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109. ;******************************************************************************
  110. ; Der Beginn des Strippers.
  111.  
  112. Startup
  113.     lea    Basisadresse+32768,BP
  114.  
  115.     BASEREG    BP
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126. ;******************************************************************************
  127. ; Variablen.
  128.  
  129.     SECTION    StripBSS,BSS
  130.  
  131.     CNOP      0,4
  132.  
  133. Basisadresse
  134.  
  135. _DOSBase    ds.l    1
  136. HauptSP        ds.l    1
  137. _stdout        ds.l    1
  138.  
  139. argvArray    ds.l    MAXIMUM_ARGUMENTS
  140. argvBuffer    ds.b    MAXIMUM_ARGBUFFER
  141.  
  142.  
  143.  
  144.     CNOP    0,4
  145.  
  146. AnfangBss
  147.  
  148. Quellname    ds.l    1
  149. Zielname    ds.l    1
  150.  
  151. Quellfile    ds.l    1
  152. Zielfile    ds.l    1
  153.  
  154. FehlerFlag    ds.l    1
  155. Bytezaehler    ds.l    1        ; enthält im Fehlerfall die Bytenummer
  156.  
  157.  
  158.  
  159. Lesepuffer    ds.b    PUFFERGROESSE
  160. Schreibpuffer    ds.b    PUFFERGROESSE
  161. Textpuffer    ds.b    80
  162.  
  163.  
  164.  
  165. FlagStrip    ds.b    1        ; vorerst war nichts gestrippt
  166. Abbruchzaehler    ds.b    1
  167.  
  168.     CNOP    0,4
  169.  
  170. EndeBss
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181. ;******************************************************************************
  182. ; Parse die CLI-Argumente.
  183.  
  184.     SECTION    StripCode,CODE
  185.  
  186. ParseArgumente
  187.  
  188.     ; Öffne DOS.
  189.     move.l    SP,HauptSP
  190.     movem.l    d0/a0,-(SP)
  191.     lea    DOSName(PC),a1
  192.     moveq    #LIBRARY_VERSION,d0
  193.     CALL    OpenLibrary,_SysBase
  194.     move.l    d0,_DOSBase
  195.     bne.s    1$
  196.  
  197.     BASEREG    OFF
  198.  
  199.     ; Fehler: DOS nicht offen.
  200.     move.l    #(AG_OpenLib!AO_DOSLib),d7
  201.     lea    AlertWert(PC),a5
  202.     CALL    Alert
  203.     addq    #2*4,SP            ; korrigiere Stack
  204.     moveq    #100,d0
  205.     rts                ; zurück zum DOS
  206.  
  207.     BASEREG    BP
  208.  
  209.     ; Initialisiere Zähler und Zeiger.
  210. 1$    move.l    d0,a6
  211.     CALL    Output
  212.     move.l    d0,_stdout
  213.     move.l    #MAXIMUM_ARGBUFFER-1,d7    ; wegen 32-Bit-Vergleich
  214.     moveq    #MAXIMUM_ARGUMENTS-1,d6    ; Argumentzähler
  215.     lea    argvArray,a1
  216.     lea    argvBuffer,a3
  217.     movem.l    (SP)+,d0/a0
  218.     cmp.l    d7,d0            ; Kommandozeile zu lang ?
  219.     bhs.s    FehlerBufferOverflow    ; ja
  220.  
  221.     ; Parse die Argumente.
  222.     moveq    #SPACE,d5        ; verkürzt Code
  223.     moveq    #'"',d3            ; verkürzt Code
  224.     bra    NächstesArgument
  225.  
  226.  
  227.  
  228. ArgumentSchleife
  229.     move.b    (a0)+,d4        ; hole Zeichen
  230.     cmp.b    d5,d4            ; legales Zeichen ?
  231.     bls.s    NächstesArgument    ; nein, nächstes Zeichen
  232.  
  233.     move.l    a3,a2            ; Zeiger auf Argumentpuffer-Stelle merken
  234.     cmp.b    d3,d4            ; ist es doppeltes Hochkomma ?
  235.     bne.s    1$            ; nein
  236.     bra.s    3$            ; ja
  237.  
  238.  
  239.  
  240.     ; Argument darf mit einem SPACE enden.
  241. 2$    move.b    (a0)+,d4        ; hole Zeichen
  242.     cmp.b    d5,d4            ; Argument beendet ?
  243.     bls.s    ArgumentEnde        ; ja
  244. 1$    cmp.b    #'=',d4            ; ein '=' ist nicht erlaubt
  245.     beq.s    FehlerEquateUse        ; wenn Fehler
  246.     move.b    d4,(a3)+        ; speichere Zeichen
  247.     dbra    d0,2$            ; Zeichen übrig ?
  248.     bra.s    ArgumentEnde        ; nein
  249.  
  250.  
  251.  
  252.     ; Argument ist in doppelte Hochkommata eingefaßt.
  253. 4$    move.b    (a0)+,d4        ; hole Zeichen
  254.     cmp.b    d5,d4            ; Argument beendet ?
  255.     blo.s    FehlerIllegalArgEnd    ; ja, Fehler
  256.  
  257.     ; Endet Argument mit doppeltem Hochkomma ?
  258.     cmp.b    d3,d4
  259.     bne.s    5$            ; nein
  260.     subq    #1,d0            ; Zeichen übrig ?
  261.     blt.s    ArgumentEnde        ; nein, alles OK
  262.     move.b    (a0)+,d4        ; ja, nächstes Zeichen
  263.     cmp.b    d5,d4            ; legales Zeichen ?
  264.     bls.s    ArgumentEnde        ; ja, alles OK
  265.     bra.s    FehlerIllegalArgEnd    ; nein, Fehler
  266.  
  267.     ; Ist es ein Stern ?
  268. 5$    cmp.b    #'*',d4
  269.     bne.s    6$            ; nein, speichere Zeichen
  270.     subq    #1,d0            ; Zeichen übrig ?
  271.     blt.s    FehlerIllegalArgEnd    ; nein, Fehler
  272.     move.b    (a0)+,d4        ; hole Zeichen
  273.     cmp.b    d5,d4            ; Argument beendet ?
  274.     blo.s    FehlerIllegalArgEnd    ; ja, Fehler
  275.  
  276. 6$    move.b    d4,(a3)+        ; speichere Zeichen
  277.  
  278.     ; Es MUß noch Zeichen geben, oder Fehler.
  279. 3$    dbra    d0,4$            ; Zeichen übrig ?
  280.  
  281.  
  282.  
  283. FehlerIllegalArgEnd
  284.     lea    TextBadArgs(PC),a0
  285.     bra.s    ArgumentFehler
  286.  
  287. FehlerBufferOverflow
  288.     lea    TextBufferOverflow(PC),a0
  289.     bra.s    ArgumentFehler
  290.  
  291. FehlerEquateUse
  292.     lea    TextEquateUse(PC),a0
  293.     bra.s    ArgumentFehler
  294.  
  295. FehlerTooManyArguments
  296.     lea    TextTooManyArgs(PC),a0
  297.  
  298. ArgumentFehler
  299.     bra    Programmende
  300.  
  301.  
  302.  
  303. ArgumentEnde
  304.     clr.b    (a3)+            ; Argumentende
  305.     subq.l    #1,d6            ; noch freie Zeiger übrig ?
  306.     ble.s    FehlerTooManyArguments    ; nein
  307.     move.l    a2,(a1)+        ; merke Zeiger auf Argumentstring
  308.  
  309. NächstesArgument
  310.     dbra    d0,ArgumentSchleife    ; Zeichen übrig ?
  311.  
  312.     ; Setze die Startwerte.
  313.     lea    argvArray,a0
  314.     neg    d6
  315.     add    #MAXIMUM_ARGUMENTS-1,d6
  316.     move.l    d6,d0
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327. ;******************************************************************************
  328. ; Beginn des Strippers.  D0 enthält die Anzahl der CLI-Parameter und A0 den
  329. ; Zeiger auf das Feld der Zeiger auf die CLI-Argumente.
  330.  
  331. _main
  332.     ; Initialisierung.
  333.     lea    AnfangBss,a1
  334.     move    #(EndeBss-AnfangBss)/4-1,d1
  335. 1$    clr.l    (a1)+
  336.     dbra    d1,1$
  337.  
  338.     ; Gibt es zu wenig Argumente ?
  339.     moveq    #-4,d1
  340.     move.l    d1,Bytezaehler
  341.     move.l    a0,a4            ; Zeiger retten
  342.     move.l    d0,d7            ; Anzahl retten
  343.     bne.s    MehrAlsKeins
  344.  
  345. SchlechteArgumente
  346.     lea    TextBadArgs(PC),a0
  347.     bra    Programmende
  348.  
  349.  
  350. MehrAlsKeins
  351.     ; Will der User die Syntax haben ?
  352.     move.l    d7,d0            ; 1 Argument ?
  353.     subq.l    #1,d0
  354.     bne.s    1$            ; nein
  355.     move.l    0*4(a4),a1        ; Zeiger auf 1. Argument
  356.     cmp.b    #'?',(a1)+
  357.     bne.s    SchlechteArgumente    ; nein, Fehler
  358.     tst.b    (a1)            ; Syntax ausgeben ?
  359.     bne.s    SchlechteArgumente    ; nein, Fehler
  360.     lea    TextSyntax(PC),a0
  361.     bra    Programmende        ; ja
  362.  
  363.     ; Gab es 3 Argumente ?
  364. 1$    move.l    0*4(a4),Quellname    ; Name des Quellfiles
  365.     move.l    1*4(a4),a1        ; evtl. Name des Zielfiles
  366.     move.l    d7,d0
  367.     lea    TextTooManyArgs(PC),a0
  368.     subq.l    #3,d0            ; 3 Argumente ?
  369.     bhi    Programmende        ; wenn zu viele Argumente, Fehler
  370.     bne.s    2$            ; nein, 2
  371.  
  372.     ; Das 2. Argument muß 'TO' sein.
  373.     move.b    (a1)+,d0        ; hole Zeichen
  374.     bclr    #5,d0            ; nimm Großbuchstaben
  375.     cmp.b    #'T',d0
  376.     bne.s    SchlechteArgumente    ; wenn Fehler
  377.     move.b    (a1)+,d0        ; hole Zeichen
  378.     bclr    #5,d0            ; nimm Großbuchstaben
  379.     cmp.b    #'O',d0
  380.     bne.s    SchlechteArgumente    ; wenn Fehler
  381.     tst.b    (a1)
  382.     bne.s    SchlechteArgumente    ; wenn Fehler
  383.     move.l    2*4(a4),a1        ; Name des Zielfiles
  384.  
  385.     ; Setze den Zielnamen.
  386. 2$    move.l    a1,Zielname
  387.  
  388.  
  389.     ; Lösche die Signale.
  390.     moveq    #0,d0
  391.     moveq    #-1,d1
  392.     CALL    SetSignal,_SysBase    ; Signalzustand löschen
  393.  
  394.  
  395.     ; Öffne das Quellfile.
  396.     move.l    Quellname,d1
  397.     move.l    #MODE_OLDFILE,d2
  398.     CALL    Open,_DOSBase
  399.     move.l    d0,Quellfile        ; File offen ?
  400.     bne.s    3$            ; ja
  401.     CALL    IoErr            ; nein, hole Fehlercode nach D0
  402.     lea    TextKeinQuellfile(PC),a0
  403.     bra    Programmende
  404.  
  405.     ; Öffne das Zielfile.
  406. 3$    move.l    Zielname,d1
  407.     move.l    #MODE_NEWFILE,d2
  408.     CALL    Open
  409.     move.l    d0,Zielfile        ; File offen ?
  410.     bne.s    4$            ; ja
  411.     CALL    IoErr            ; nein, hole Fehlercode nach D0
  412.     lea    TextKeinZielfile(PC),a0
  413.     bra    Programmende
  414.  
  415.     ; A4 ist der Quellzeiger, A3 der Zielzeiger.
  416.     ; D7 enthält den Quellzähler, D6 den Zielzähler.
  417. 4$    lea    Lesepuffer,a4
  418.     lea    Schreibpuffer,a3
  419.     moveq    #0,d7
  420.     move    #PUFFERGROESSE,d6
  421.     bra.s    HunkEin
  422.  
  423.  
  424.  
  425.  
  426.  
  427. HunkSchleife
  428.     bsr    LiesLang        ; hole Hunkcode
  429.     lea    HunktabelleEnde(PC),a0
  430.     moveq    #(HunktabelleEnde-Hunktabelle)/4-1,d5    ; Zähler
  431. 1$    cmp.l    -(a0),d0        ; Hunk gefunden ?
  432.     dbeq    d5,1$
  433.     beq.s    2$            ; ja
  434.  
  435.     ; Zähler abgelaufen, also Hunk nicht erkannt.
  436.     lea    TextHunkNichtErkannt(PC),a0
  437.     move.l    Bytezaehler,d0        ; gib die Fehlerstelle an
  438.     bra    Programmende
  439.  
  440.     ; Hunk erkannt.  D5 enthält den Index.
  441. 2$    lea    Startup(PC),a0
  442.     lea    Sprungtabelle(PC),a1
  443.     add    d5,d5            ; Wortindex
  444.     add    0(a1,d5),a0        ; relativer Zeiger
  445.     jsr    (a0)            ; springe die Routine an
  446.  
  447. HunkEin
  448.     tst.l    d7            ; gibt es noch Daten ?
  449.     bne.s    HunkSchleife        ; ja
  450.     bsr    LiesFlush        ; nein, fülle Puffer
  451.     tst.l    d7            ; ist das File zu Ende ?
  452.     bne.s    HunkSchleife        ; nein
  453.  
  454.     ; Das Quellfile ist zu Ende.
  455.     bsr    SchreibFlush        ; schreibe den Pufferrest
  456.     move.b    FlagStrip,d0        ; wurde gestrippt ?
  457.     bne.s    1$            ; ja
  458.     lea    TextNichtGestrippt(PC),a0
  459.     bsr    Stringausgabe
  460.  
  461. 1$    suba.l    a0,a0            ; kein Fehler aufgetreten
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472. ;******************************************************************************
  473. ; Ende des Programmes.  Schließe alles Offene.  A0 zeigt auf den Fehlerstring.
  474.  
  475. Programmende
  476.     move.l    _DOSBase,a6
  477.     move.l    a0,FehlerFlag        ; existiert String ?
  478.     beq.s    1$            ; nein
  479.     bsr    Stringausgabe
  480.  
  481.     ; Schließe das Quellfile, falls vorhanden.
  482. 1$    move.l    Quellfile,d1
  483.     beq.s    2$
  484.     CALL    Close
  485.  
  486.     ; Schließe das Zielfile, falls vorhanden.  Wenn Fehler, lösche es.
  487. 2$    move.l    Zielfile,d1
  488.     beq.s    3$
  489.     CALL    Close
  490.     tst.l    FehlerFlag        ; Fehler ?
  491.     beq.s    3$            ; nein
  492.     move.l    Zielname,d1        ; ja, lösche das erzeugte File
  493.     CALL    DeleteFile
  494.  
  495.     ; Schließe DOS.
  496. 3$    move.l    _DOSBase,d0
  497.     beq.s    4$
  498.     move.l    d0,a1
  499.     CALL    CloseLibrary,_SysBase
  500.  
  501.     ; Zurück ins DOS.
  502. 4$    move.l    FehlerFlag,d0        ; trat Fehler auf ?
  503.     beq.s    5$            ; nein, D0=0 und fertig
  504.     moveq    #RETURN_FAIL,d0        ; ja, melde AmigaDOS einen Fehler
  505. 5$    move.l    HauptSP,SP
  506.     rts
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527. ;******************************************************************************
  528. ; Hier folgen die Hunkroutinen.
  529.  
  530.  
  531. Sub_unit
  532. Sub_name
  533. Sub_code
  534. Sub_data
  535.     bsr    SchreibLang        ; schreibe HunkID
  536.     bsr    LiesLang
  537.     move.l    d0,d5            ; Langwortanzahl
  538.     bsr    SchreibLang
  539.  
  540.  
  541. KopiereD5Langworte            ; kopiert D5 Langworte
  542.     bra.s    1$
  543.  
  544.     ; Kopiere die Langworte
  545. 2$    bsr    KopiereLang        ; Kopiere Langworte,
  546. 1$    subq.l    #1,d5            ; bis Zähler zu Ende
  547.     bcc.s    2$
  548.     rts
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559. Sub_bss
  560.     bsr    SchreibLang        ; schreibe HunkID
  561.  
  562. KopiereLang
  563.     bsr    LiesLang        ; hole N
  564.  
  565. Sub_end
  566.     bra    SchreibLang        ; schreibe N
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577. Sub_reloc32
  578. Sub_reloc16
  579. Sub_reloc8
  580.     bsr    SchreibLang        ; schreibe HunkID
  581.     bra.s    1$
  582.  
  583.     ; Kopiere für jedes Modul.
  584. 2$    bsr    KopiereLang        ; Modulnummer
  585.     bsr    KopiereD5Langworte    ; Relokieroffsets
  586.  
  587. 1$    bsr    LiesLang
  588.     move.l    d0,d5            ; Offsetanzahl
  589.     bsr    SchreibLang
  590.     tst.l    d5            ; ist Hunk zu Ende ?
  591.     bne.s    2$            ; nein
  592.     rts                ; ja
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603. Sub_ext
  604.     bsr    SchreibLang        ; Schreibe HunkID
  605.     bra.s    Sub_ext1
  606.  
  607. Sub_ext2
  608.     move.l    d5,d4
  609.     and.l    #$00FFFFFF,d5        ; Zähler isolieren
  610.     swap    d4
  611.     lsr    #8,d4            ; ergibt Typ.  Ist Typ ext_symb ?
  612.     beq.s    1$            ; ja, lasse diese Dateneinheit weg
  613.     bsr    SchreibLang        ; Dateneinheit-Typ schreiben
  614.     cmp.b    #ext_res,d4
  615.     bls.s    Ext_res            ; wenn ext_def, ext_abs oder ext_res
  616.     cmp.b    #ext_ref32,d4
  617.     blo.s    0$            ; wenn unbekannt
  618.     cmp.b    #ext_common,d4
  619.     beq.s    Ext_common
  620.     cmp.b    #ext_ref8,d4
  621.     bls.s    Ext_ref
  622.     ; Die Dateneinheit ist unbekannt.
  623. 0$    lea    TextExtUnbekannt(PC),a0
  624.     move.l    Bytezaehler,d0        ; gib die Fehlerstelle an
  625.     bra    Programmende
  626.  
  627.     ; Lasse ext_symb-Einheiten weg.
  628. 2$    bsr    LiesLang        ; Überlies den Symbolnamen
  629. 1$    subq.l    #1,d5            ; bis Zähler zu Ende
  630.     bcc.s    2$
  631.     bsr    LiesLang        ; Symbol-Offset
  632.     st    FlagStrip        ; jetzt wurde gestrippt !
  633.  
  634. Sub_ext1
  635.     bsr    LiesLang
  636.     move.l    d0,d5            ; Dateneinheit-Typ.  Ist Hunk zu Ende ?
  637.     bne.s    Sub_ext2        ; nein, nächste Dateneinheit
  638.     bra    SchreibLang        ; ja, Endekennzeichen schreiben
  639.  
  640.  
  641.  
  642. Ext_def
  643. Ext_abs
  644. Ext_res
  645.     bsr    KopiereD5Langworte    ; Ext-Name
  646.     bsr    KopiereLang        ; Offset
  647.     bra.s    Sub_ext1
  648.  
  649.  
  650.  
  651. Ext_ref
  652.     bsr    KopiereD5Langworte    ; Ext-Name
  653. Ext_common2
  654.     bsr    LiesLang
  655.     move.l    d0,d5            ; Offsetanzahl
  656.     bsr    SchreibLang
  657.     bsr    KopiereD5Langworte    ; Offsets
  658.     bra.s    Sub_ext1
  659.  
  660.  
  661.  
  662. Ext_common
  663.     bsr    KopiereD5Langworte    ; Ext-Name
  664.     bsr    KopiereLang        ; COMMON-Block-Größe
  665.     bra.s    Ext_common2
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676. Sub_symbol
  677.     ; Dieser Hunk wird weggelassen !!!
  678.     st    FlagStrip        ; jetzt wurde gestrippt !
  679.     bra.s    1$
  680.  
  681.     ; Lies Symbolname.
  682. 3$    bsr    LiesLang        ; nur lesen, nicht schreiben !
  683. 2$    subq.l    #1,d5
  684.     bcc.s    3$
  685.     bsr    LiesLang        ; Symboloffset lesen
  686.  
  687. 1$    bsr    LiesLang        ; hole N
  688.     move.l    d0,d5            ; ist Hunk zu Ende ?
  689.     bne.s    2$            ; nein
  690.     rts
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701. Sub_debug
  702.     ; Dieser Hunk wird weggelassen !!!
  703.     st    FlagStrip        ; jetzt wurde gestrippt !
  704.     bsr    LiesLang
  705.     move.l    d0,d5            ; Langwortanzahl
  706.     bra.s    1$
  707.  
  708.     ; Überlies die Langworte.
  709. 2$    bsr    LiesLang        ; Lies Langworte,
  710. 1$    subq.l    #1,d5            ; bis Zähler zu Ende
  711.     bcc.s    2$
  712.     rts
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723. Sub_header
  724.     bsr    SchreibLang        ; Schreibe HunkID
  725.     bra.s    1$
  726.  
  727. 2$    bsr    KopiereD5Langworte    ; Library-Name
  728.  
  729. 1$    bsr    LiesLang        ; hole N
  730.     move.l    d0,d5
  731.     bsr    SchreibLang        ; schreibe N
  732.     tst.l    d5            ; ist Hunk zu Ende ?
  733.     bne.s    2$            ; nein
  734.  
  735.     bsr    KopiereLang        ; Modultabellengröße
  736.  
  737.     bsr    LiesLang        ; hole erste Modulnummer
  738.     move.l    d0,d4
  739.     bsr    SchreibLang        ; schreibe erste Modulnummer
  740.  
  741.     bsr    LiesLang        ; hole letzte Modulnummer
  742.     move.l    d0,d5
  743.     bsr    SchreibLang        ; schreibe letzte Modulnummer
  744.  
  745.     sub.l    d4,d5
  746.     addq.l    #1,d5            ; ergibt Modulanzahl
  747.     bra    KopiereD5Langworte    ; Modul-Größenangaben
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758. Sub_overlay
  759. Sub_break
  760.     lea    TextKeinOverlay(PC),a0
  761.     bra    Programmende
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772. ;******************************************************************************
  773. ; Hole ein Langwort aus dem Lesefile und gib es in D0 zurück.  Falls das
  774. ; File zu Ende ist, melde einen Fehler.
  775.  
  776. LiesLang    
  777.     ; Soll abgebrochen werden ?
  778.     addq.b    #1,Abbruchzaehler
  779.     bcc.s    1$            ; nein
  780.     moveq    #0,d0
  781.     moveq    #0,d1
  782.     CALL    SetSignal,_SysBase    ; hole Signalzustand
  783.     lea    TextAbbruch(PC),a0
  784.     btst    #SIGBREAKB_CTRL_C,d0    ; soll abgebrochen werden ?
  785.     bne    Programmende        ; ja
  786.  
  787. 1$    subq    #4,d7            ; noch Bytes vorhanden ?
  788.     bcc.s    2$            ; ja
  789.     bsr.s    LiesFlush
  790.     tst.l    d7            ; ist das File zu Ende ?
  791.     bne.s    LiesLang        ; nein
  792.     lea    TextQuellFileZuEnde(PC),a0
  793.     bra    Programmende        ; ja
  794.  
  795. 2$    move.l    (a4)+,d0
  796.     addq.l    #4,Bytezaehler
  797.     rts
  798.  
  799.  
  800.  
  801.  
  802.  
  803. ;******************************************************************************
  804. ; Lade den Lesepuffer voll und setze Zeiger und Zähler neu.  Die Anzahl der
  805. ; gelesenen Bytes wird in D0 und D7 zurückgegeben.
  806.  
  807. LiesFlush
  808.     move.l    Quellfile,d1        ; Filezeiger
  809.     lea    Lesepuffer,a4
  810.     move.l    a4,d2            ; Pufferzeiger
  811.     move.l    #PUFFERGROESSE,d3    ; Byteanzahl
  812.     CALL    Read,_DOSBase        ; Bytes lesen
  813.     moveq    #-1,d1
  814.     cmp.l    d0,d1            ; Lesefehler ?
  815.     beq.s    1$            ; ja
  816.     move.l    d0,d7
  817.     rts
  818.  
  819.     ; Lesefehler !
  820. 1$    CALL    IoErr            ; hole den Fehlercode nach D0
  821.     lea    TextLesefehler(PC),a0
  822.     bra    Programmende
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833. ;******************************************************************************
  834. ; Schreibe das Langwort D0 in das Schreibfile.
  835.  
  836. SchreibLang
  837.     move.l    d0,(a3)+
  838.     subq    #4,d6            ; Puffer voll ?
  839.     bls.s    SchreibFlush        ; ja
  840.     rts
  841.  
  842.  
  843.  
  844.  
  845.  
  846. ;******************************************************************************
  847. ; Schreibe den Schreibpuffer und setze Zeiger und Zähler neu.
  848.  
  849. SchreibFlush
  850.     move.l    Zielfile,d1        ; Filezeiger
  851.     lea    Schreibpuffer,a3
  852.     move.l    a3,d2            ; Pufferzeiger
  853.     move.l    #PUFFERGROESSE,d3
  854.     sub.l    d6,d3            ; ergibt Byteanzahl
  855.     beq.s    1$            ; wenn keine Bytes geschrieben werden müssen
  856.     move.l    d3,-(SP)
  857.     CALL    Write,_DOSBase        ; Bytes schreiben
  858.     cmp.l    (SP)+,d0        ; alle Bytes geschrieben ?
  859.     bne.s    2$            ; nein
  860. 1$    move    #PUFFERGROESSE,d6
  861.     rts
  862.  
  863.     ; Schreibfehler !
  864. 2$    CALL    IoErr            ; hole den Fehlercode nach D0
  865.     lea    TextSchreibfehler(PC),a0
  866.     bra    Programmende
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877. ;******************************************************************************
  878. ; Gib den String A0 aus.  Ein Prozentzeichen gefolgt von 'd' wird durch einen
  879. ; Dezimalstring in D0 ersetzt, ein 'x' durch eine Hexzahl.
  880.  
  881. Stringausgabe_REG    REG    d1-d4/a1-a2/a6
  882.  
  883. Stringausgabe
  884.     movem.l    Stringausgabe_REG,-(SP)
  885.     lea    Textpuffer,a1        ; Zielzeiger
  886.     move.l    a1,d4            ; merken
  887.  
  888.  
  889.  
  890. 2$    move.b    (a0)+,d1        ; hole Zeichen
  891.     cmp.b    #'%',d1            ; ist es ein '%' ?
  892.     bne.s    1$            ; nein
  893.     move.b    (a0)+,d1        ; ja, hole Folgezeichen
  894.     bclr    #5,d1            ; in Großbuchstaben wandeln
  895.  
  896.  
  897.  
  898.     ; Ersetze Dezimalzahl.
  899.     cmp.b    #'D',d1
  900.     bne.s    3$
  901.     lea    Dezimaltabelle(PC),a2
  902.     moveq    #10-1,d1        ; Stellenzähler
  903.  
  904. 4$    cmp.l    (a2)+,d0        ; ist Stellenwertigkeit zu hoch ?
  905.     dbcc    d1,4$            ; ja, nächste Stelle
  906.  
  907.     bcc.s    5$            ; wenn KEIN Unterlauf
  908.     moveq    #0,d1            ; falls D0 = 0
  909. 5$    subq    #4,a2            ; ergibt die richtige Stellenwertigkeit
  910.  
  911. 7$    moveq    #'0'-1,d2        ; Ziffer-Startwert
  912.     move.l    (a2)+,d3        ; Stellenwertigkeit
  913.  
  914. 6$    addq.b    #1,d2            ; Ziffer höherstellen
  915.     sub.l    d3,d0            ; Unterlauf ?
  916.     bcc.s    6$            ; nein, weitermachen
  917.  
  918.     add.l    d3,d0            ; ergibt Rest
  919.     move.b    d2,(a1)+        ; Ziffer speichern
  920.     dbra    d1,7$            ; alle Stellen durch ?
  921.     bra.s    2$
  922.  
  923.  
  924.  
  925.     ; Ersetze Hexzahl.
  926. 3$    cmp.b    #'X',d1
  927.     bne.s    1$
  928.     move.b    #'$',(a1)+        ; '$' ausgeben
  929.     moveq    #8-1,d1            ; ein Langwort besteht aus acht Nibbles
  930.  
  931. 9$    rol.l    #4,d0
  932.     move.b    d0,d2
  933.     and.b    #%1111,d2        ; nur das Nibble übriglassen
  934.     cmp.b    #10,d2            ; größer als 10 ?
  935.     blt.s    8$
  936.     addq    #('A'-'0'-10),d2    ; ja, aufstocken
  937. 8$    add.b    #'0',d2            ; ergibt Hex-Nibble
  938.     move.b    d2,(a1)+        ; das ausgeben
  939.     dbra    d1,9$
  940.     bra    2$
  941.  
  942.  
  943.     ; Speichere Zeichen.
  944. 1$    move.b    d1,(a1)+
  945.     bne.s    2$            ; bis String zu Ende
  946.  
  947.  
  948.  
  949.     move.l    d4,d2
  950.     sub.l    d2,a1
  951.     subq    #1,a1            ; ergibt Stringlänge
  952.     move.l    a1,d3
  953.     move.l    _stdout,d1        ; Filezeiger
  954.     CALL    Write,_DOSBase        ; String ausgeben
  955.     movem.l    (SP)+,Stringausgabe_REG
  956.     rts
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967. ;******************************************************************************
  968. ; Die Tabellen.
  969.  
  970. Dezimaltabelle
  971.     dc.l    1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1
  972.  
  973. AlertWert    dc.l    -1
  974.  
  975.  
  976.  
  977. Hunktabelle
  978.     dc.l    hunk_unit,hunk_name
  979.     dc.l    hunk_code,hunk_code_CHIP,hunk_code_FAST
  980.     dc.l    hunk_data,hunk_data_CHIP,hunk_data_FAST
  981.     dc.l    hunk_bss,hunk_bss_CHIP,hunk_bss_FAST
  982.     dc.l    hunk_reloc32,hunk_reloc16,hunk_reloc8
  983.     dc.l    hunk_ext
  984.     dc.l    hunk_symbol
  985.     dc.l    hunk_debug
  986.     dc.l    hunk_end
  987.     dc.l    hunk_header
  988.     dc.l    hunk_overlay,hunk_break
  989. HunktabelleEnde
  990.  
  991. Sprungtabelle    ; enthält relative 16-Bit-Zeiger
  992.     dc.w    Sub_unit-Startup
  993.     dc.w    Sub_name-Startup
  994.     dc.w    Sub_code-Startup
  995.     dc.w    Sub_code-Startup
  996.     dc.w    Sub_code-Startup
  997.     dc.w    Sub_data-Startup
  998.     dc.w    Sub_data-Startup
  999.     dc.w    Sub_data-Startup
  1000.     dc.w    Sub_bss-Startup
  1001.     dc.w    Sub_bss-Startup
  1002.     dc.w    Sub_bss-Startup
  1003.     dc.w    Sub_reloc32-Startup
  1004.     dc.w    Sub_reloc16-Startup
  1005.     dc.w    Sub_reloc8-Startup
  1006.     dc.w    Sub_ext-Startup
  1007.     dc.w    Sub_symbol-Startup
  1008.     dc.w    Sub_debug-Startup
  1009.     dc.w    Sub_end-Startup
  1010.     dc.w    Sub_header-Startup
  1011.     dc.w    Sub_overlay-Startup
  1012.     dc.w    Sub_break-Startup
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023. ;******************************************************************************
  1024. ; Hier kommen die Texte.
  1025.  
  1026. DOSName    DOSNAME
  1027.  
  1028.     IFD    ENGLISCH
  1029.  
  1030. TextBadArgs        STRING <Bad args>
  1031. TextBufferOverflow    STRING <Argument buffer overflow>
  1032. TextEquateUse        STRING <Illegally used ''=''>
  1033. TextTooManyArgs        STRING <Too many arguments>
  1034. TextSyntax        STRING <Usage: STRIP SOURCEFILE [TO] TARGETFILE>
  1035. TextKeinQuellfile    STRING <DOS error %d opening source file>
  1036. TextKeinZielfile    STRING <DOS error %d opening target file>
  1037. TextLesefehler        STRING <DOS read error %d>
  1038. TextSchreibfehler    STRING <DOS write error %d>
  1039. TextQuellFileZuEnde    STRING <Premature end of source file>
  1040. TextHunkNichtErkannt    STRING <Unknown hunk identifier at byte %x>
  1041. TextExtUnbekannt    STRING <Unknown symbol data unit at byte %x>
  1042. TextKeinOverlay        STRING <No overlay supported>
  1043. TextAbbruch        STRING <Strip aborted>
  1044. TextNichtGestrippt    STRING <Source file has already been stripped>
  1045.  
  1046.     ELSE
  1047.  
  1048. TextBadArgs        STRING <Falsche Argumente>
  1049. TextBufferOverflow    STRING <Argumentpuffer-Überlauf>
  1050. TextEquateUse        STRING <Unzulässiges ''=''>
  1051. TextTooManyArgs        STRING <Zu viele Argumente>
  1052. TextSyntax        STRING <Gebrauch: STRIP QUELLFILE [TO] ZIELFILE>
  1053. TextKeinQuellfile    STRING <DOS-Fehler %d beim Öffnen des Quellfiles>
  1054. TextKeinZielfile    STRING <DOS-Fehler %d beim Öffnen des Zielfiles>
  1055. TextLesefehler        STRING <DOS-Lesefehler %d>
  1056. TextSchreibfehler    STRING <DOS-Schreibfehler %d>
  1057. TextQuellFileZuEnde    STRING <Vorzeitiges Quellfile-Ende>
  1058. TextHunkNichtErkannt    STRING <Unbekannter Hunktyp beim Byte %x>
  1059. TextExtUnbekannt    STRING <Unbekannte Symbol-Dateneinheit beim Byte %x>
  1060. TextKeinOverlay        STRING <Overlay wird nicht unterstützt>
  1061. TextAbbruch        STRING <Strip abgebrochen>
  1062. TextNichtGestrippt    STRING <Quellfile war schon gestrippt>
  1063.  
  1064.     ENDC
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075. ; Ende des Programmes
  1076.  
  1077.     END
  1078.  
  1079.