root/sys/arch/x68k/stand/libdos/dos_rename.S
|       XC compatible RENAME() function
|       int DOS_RENAME __P((const char *path, const char *newname));
|
|       written by ITOH Yasufumi
|       public domain
|
|       $NetBSD: dos_rename.S,v 1.3 2011/02/21 02:31:59 itohy Exp $

#include "dos_asm.h"

Lbufsz  =       92      | sizeof(struct dos_nameckbuf)
Lnamoff =       67      | offsetof(struct dos_nameckbuf, name)
Lextoff =       86      | offsetof(struct dos_nameckbuf, ext)

ENTRY_NOPROFILE(DOS_RENAME)
        link    %a6,#-Lbufsz*2                  | allocate two  dos_nameckbuf

        moveal  %sp,%a1                         | dos_nameckbuf for path

        pea     %sp@(Lbufsz)
        movel   %a6@(4 + 8),%sp@-               | newname
        .word   0xff37                          | DOS_NAMECK
        tstl    %d0
        bmis    Lerr

        addql   #4,%sp

        movel   %a1,%sp@
        movel   %a6@(4 + 4),%sp@-               | (old) path
        .word   0xff37                          | DOS_NAMECK
        tstl    %d0
        bmis    Lerr

        | we don't pop arguments since the same args are used by DOS_MOVE below

        | search end of dirname of (old) path
Lpath:  tstb    %a1@+
        bnes    Lpath
        subql   #1,%a1                          | remove nul char

        | add new name
        lea     %sp@(8 + Lbufsz+Lnamoff),%a0    | new name (8: args on stack)
Lname:  moveb   %a0@+,%a1@+
        bnes    Lname
        subql   #1,%a1                          | remove nul char

        | add new extension
        lea     %sp@(8 + Lbufsz+Lextoff),%a0    | new ext (8: args on stack)
Lext:   moveb   %a0@+,%a1@+
        bnes    Lext

        | we already have the arguments on stack
        bsr     _C_LABEL(DOS_MOVE)

        | version check of Human68k and error handlings are done in DOS_MOVE()

        unlk    %a6                             | restore stack
        rts

Lerr:   unlk    %a6
        bra     CERROR