home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / newc_dev / rename12.lha / Rename.asm < prev    next >
Assembly Source File  |  1990-11-19  |  3KB  |  191 lines

  1.  
  2.     OPTION    NL
  3.  
  4. *\
  5. **                            Noerrebro, 19.XI.90
  6. ** Rename V1.2:
  7. ** ¯¯¯¯¯¯¯¯¯¯¯¯
  8. ** Written mostly for the pleasure, this program does the same as the Amiga-
  9. ** DOS command by the same name and is fully re-entrant using the 'Resident'
  10. ** command.
  11. **
  12. ** SYNTAX: Rename <oldName [AS] newName>
  13. **
  14. ** 'Rename' is written for the Asm68K Macro Assembler and placed in Public
  15. ** Domain as FREEWARE. Please leave this header intact and let the source go
  16. ** along with ANY distribution - thanks!
  17. **
  18. **         Keep shinin'! _
  19. **           - Klaus. _ //
  20. **                    \X/ (FidoNet 2:230/114.15)
  21. **
  22. **
  23. ** # -= Rename V1.2 =-
  24. ** # Written in November '90 by
  25. ** # Klaus Alexander Seistrup        01.X.90 - 31.III.91:
  26. ** # H/F 1. Maj, Have #14        ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  27. ** # Islevdalvej 162            Sct Hansgades Passage 9, 4.th.
  28. ** # DK-2610 Roedovre            DK-2200 Koebenhavn N
  29. ** # D E N M A R K            D E N M A R K
  30. **
  31. */
  32.  
  33. AbsExecBase    EQU     $0004
  34.  
  35. OldOpenLibrary    EQU    -$0198    ; A1
  36. CloseLibrary    EQU    -$019E    ; A1
  37. RawDoFmt    EQU    -$020A    ; A0/A1/A2/A3
  38.  
  39. Output        EQU    -$003C    ; VOID
  40. Write        EQU    -$0030    ; D1/D2/D3
  41. Rename        EQU    -$004E    ; D1/D2
  42.  
  43. MAXARGS        EQU         3
  44.  
  45. TAB        EQU       $09
  46. LINEFEED    EQU       $0A
  47. SPACE        EQU       $20
  48. QUOTE        EQU       $22
  49.  
  50. LINKSIZE    EQU      -256
  51. oldName        EQU   LINKSIZE
  52. newName        EQU    oldName + $04
  53. Dummy        EQU    newName + $04
  54. outBuf        EQU     Dummy + $04
  55.  
  56. DOSBase        EQUR        A4
  57. ExecBase    EQUR        A6
  58.  
  59. SAVEREGS    REG     D2-D3/D6-D7/A2-A4/A6
  60.  
  61. *-----    Macros
  62.  
  63. CALLSYS    MACRO
  64.     JSR    \1(ExecBase)
  65.     ENDM
  66.  
  67. CALLDOS    MACRO
  68.     JSR    \1(DOSBase)
  69.     ENDM
  70.  
  71. STRING    MACRO
  72.     DC.B    \1
  73.     DC.B    0
  74.     CNOP    0, 2
  75.     ENDM
  76.  
  77. *-----    Code
  78.  
  79.     OPTION    L
  80.  
  81. Main    LINK    A5, #LINKSIZE
  82.     MOVEM.L    SAVEREGS, -(SP)
  83.  
  84.     CLR.B    -1(A0, D0.W)
  85.     LEA    LINKSIZE(A5), A3
  86.     MOVEA.L    A3, A1
  87.  
  88. Parse    MOVEQ    #TAB, D0
  89.     MOVEQ    #LINEFEED, D1
  90.     MOVEQ    #SPACE, D2
  91.     MOVEQ    #QUOTE, D3
  92.     MOVEQ    #0, D6
  93.     MOVEQ    #MAXARGS, D7        ; argc = NULL
  94.     BRA.S    2$
  95. 1$    ADDQ.W    #1, A0            ; cmd++
  96. 2$    CMP.B    (A0), D0        ; TAB?
  97.     BEQ.S    1$
  98.     CMP.B    (A0), D1        ; SPACE?
  99.     BEQ.S    1$
  100.     CMP.B    (A0), D2        ; LINEFEED?
  101.     BEQ.S    1$
  102.     TST.B    (A0)            ; EOS?
  103.     BEQ.S    GetDOS(PC)
  104.     ADDQ.W    #1, D6            ; argc++
  105.     CMP.B    (A0), D3        ; QUOTE?
  106.     BNE.S    5$
  107.     ADDQ.W    #1, A0            ; Point inside quoted string:
  108.     MOVE.L    A0, (A1)+        ; *argv++ = ++cmd
  109.     BRA.S    4$
  110. 3$    ADDQ.W    #1, A0
  111. 4$    TST.B    (A0)            ; EOS?
  112.     BEQ.S    Done(PC)        ; Unbalanced quotes
  113.     CMP.B    (A0), D3        ; QUOTE?
  114.     BNE.S    3$
  115.     BRA.S    8$
  116. 5$    MOVE.L    A0, (A1)+        ; *argv++ = cmd
  117.     BRA.S    7$
  118. 6$    ADDQ.W    #1, A0
  119. 7$    TST.B    (A0)            ; EOS?
  120.     BEQ.S    GetDOS(PC)
  121.     CMP.B    (A0), D0        ; TAB?
  122.     BEQ.S    8$
  123.     CMP.B    (A0), D1        ; LINEFEED?
  124.     BEQ.S    8$
  125.     CMP.B    (A0), D2        ; SPACE?
  126.     BNE.S    6$
  127. 8$    CLR.B    (A0)+            ; Terminated arg
  128.     CMP.B    D7, D6
  129.     BLT.S    2$
  130.  
  131. GetDOS    LEA    DOSName(PC), A1
  132.     MOVEA.L    AbsExecBase, A6
  133.     CALLSYS    OldOpenLibrary
  134.     BEQ.S    Done(PC)
  135.     MOVEA.L    D0, DOSBase
  136.  
  137. Test    CMPI.B    #2, D6
  138.     BEQ.S    DoIt(PC)
  139.     BGT.S    ReArr(PC)
  140.  
  141. Info    LEA    Usage(PC), A3
  142.     BRA.S    Puts(PC)
  143.  
  144. ReArr    MOVE.L    8(A3), 4(A3)
  145.  
  146. DoIt    MOVE.L    (A3)+, D1
  147.     MOVE.L    (A3)+, D2
  148.     CALLDOS    Rename
  149.     BNE.S    ExDOS(PC)
  150.  
  151. Error    LEA    ErrFmt(PC), A0
  152.     MOVEA.L    A3, A1
  153.     SUBQ.W    #8, A1
  154.     LEA    PrBuf(PC), A2
  155.     CALLSYS    RawDoFmt
  156.  
  157. Puts    MOVE.L    A3, D2
  158.     MOVEQ    #-1, D3
  159. 1$    TST.B    (A3)+            ; while (*str++)
  160.     DBEQ    D3, 1$            ;        len--
  161.     NOT.L    D3            ; ~(-len) == len-1
  162.     CALLDOS    Output
  163.     CALLDOS    Write            ; Flush it
  164.  
  165. ExDOS    MOVEA.L    DOSBase, A1
  166.     CALLSYS    CloseLibrary
  167.  
  168. Done    MOVEQ    #0, D0
  169.     MOVEM.L    (SP)+, SAVEREGS
  170.     UNLK    A5
  171.     RTS
  172.  
  173. PrBuf    MOVE.B    D0, (A3)+
  174.     RTS
  175.  
  176. *-----    Data
  177.  
  178. DOSName    STRING    'dos.library'
  179.  
  180. Usage    DC.B    $9B
  181.     DC.B    '33mUSAGE:'
  182.     DC.B    $9B
  183.     STRING    '0m Rename <oldName [AS] newName>\10'
  184.  
  185. ErrFmt    STRING    'Couldn\39t rename %s as %s\10'
  186.  
  187. PgmID    DC.L    $536C55C8        ; V1.2, 19.XI.90
  188.  
  189.     END
  190.  
  191.