        .TITLE  ZFDISMOUNT - Dismount Image for ZFACP
        .IDENT  /X01-000/

;++
; ZFDISMOUNT - Dismount Image for ZFACP
;
; ABSTRACT:
;
;       This program requests that the ZF device be dismounted.   
;
;       The user must have at least MOUNT and CMKRNL privileges.
;--

        .PAGE
        .SBTTL  External and local symbol definitions

        .LIBRARY \SYS$LIBRARY:LIB\

        $CCBDEF                                 ; Channel control block
        $DEVDEF                                 ; Device characteristics
        $IODEF                                  ; I/O function codes
        $PSLDEF                                 ; Processor status longword
        $SSDEF                                  ; System status codes
        $UCBDEF                                 ; Unit control block

        .PAGE
        .SBTTL  Local storage

        .PSECT  LOCAL_DATA      NOEXE, PIC, LONG

ZF_CHN:
        .BLKW   1                               ; channel to ZF device

ZF_DVC: .ASCID  /ZFA0/                          ; ZF device name

        .PAGE
        .SBTTL  DMT_START, Main Program
        .PSECT  CODE            SHR, NOWRT, PIC, LONG

        .ENTRY  DMT_START, ^M<>

        $CMKRNL_S       B^BEGIN                 ; change mode to kernel
        RET                                     ; all done

        .ENTRY  BEGIN, ^M<>

;       assign a channel to the device; if successful, 
;       get its UCB address

        $ASSIGN_S  DEVNAM=ZF_DVC, CHAN=ZF_CHN,- ; assign channel to PCA1
                ACMODE=#PSL$C_USER              ; at USER level
        BLBS    R0, 10$                         ; check for error
        RET                                     ;  return if n.g.
10$:
        MOVZWL  ZF_CHN, R0                      ; obtain channel number
        JSB     G^IOC$VERIFYCHAN                ; get CCB addr in R1
        BLBS    R0, 20$                         ; check for error       
        RET                                     ;  else return

20$:
        MOVL    CCB$L_UCB(R1), R5               ; get UCB address

        BBS     #DEV$V_MNT,UCB$L_DEVCHAR(R5),30$; is unit mounted?
        $DASSGN_S CHAN=ZF_CHN                   ;  fall through if not
        MOVL    #SS$_DEVNOTMOUNT, R0            ; set error code
        RET                                     ;  and return

30$:
        BISL2   #DEV$M_DMT, UCB$L_DEVCHAR(R5)   ; mark unit for dismount
        $QIOW_S CHAN=ZF_CHN,FUNC=#IO$_ACPCONTROL; wake the ACP
        $DASSGN_S CHAN=ZF_CHN                   ; deassign the channel
        MOVZWL  #SS$_NORMAL, R0                 ; and
        RET                                     ;  EXIT

        .END    DMT_START

