home *** CD-ROM | disk | FTP | other *** search
- ;************************* DIRS.ASM ************************************
- ;
- ; DIRS.ASM version 1.1b
- ;
- ; Usage:
- ; DIRS
- ; Purpose: This program will list the directories on a stack
- ; created with the PUSHD v. 1.2 command. Directories are
- ; listed in order from the top of the stack to the
- ; bottom.
- ; Preconditions:
- ; 1) PUSHD must be hooked to interrupt 13.
- ; 2) PUSHD must have the same commands from beginning
- ; to after definition of push6d, so that it knows how
- ; to access the resident code of PUSHD. (This includes
- ; the fact that there are 6 locations for directory storage
- ; which are 67 bytes in size.)
- ; 3) PUSHD must have the signature "PUSHD VERSION 1.1".
- ; 4) PUSHD must look for 7788 in ax and 7789 in bx for
- ; a call to int 13.
- ; 5) PUSHD must put the value of 7789 into ax and 7788
- ; into bx upon calling int 13 by DIRS, if PUSHD is installed.
- ; 6) PUSHD will set the data segment to be equal to the data
- ; segment that PUSHD used to install itself.
- ; 7) ds:[nextpush] (ds of PUSHD installation) must hold
- ; the location of the next empty directory stack location.
- ; Postconditions:
- ; 1) The list of directories on the stack will be printed out on
- ; the standard output OR
- ; 2) An appropiate error message will be printed out on standard
- ; error.
- ; 3) An error code will be generated.
- ; Error codes:
- ; 0) Successful termination.
- ; 254) No Directories on the stack.
- ; 255) PUSHD is not installed.
- ; Version changes:
- ; 1.1b July 21, 1990
- ; Removed commented-out commands from Toad Hall version.
- ; 1.1a July 19, 1990
- ; Toad Hall tweaking (much thanks to David Kirshbaum).
- ; Future Enhancements:
- ; 1) Make DIRS a .EXE file.
- ; 2) Add a help option, ?, from the command line.
- ;
- ; Created by:
- ; (from ideas based in UNIX and from PC Magazine's pushdir/popdir)
- ; William P. Sarra
- ; CIS:71041,347
- ; arpa: sarra@TOPAZ.RUTGERS.EDU
- ; uucp: ...{ames,cbosgd, harvard, moss}!rutgers!topaz.rutgers.edu!sarra
- ;
- ;*****************************************************************************
-
- MAIN group CSEG
- CSEG segment public para 'code'
- assume CS:MAIN,DS:MAIN,ES:MAIN,SS:MAIN
-
- org 80h
- cmd_line label byte
-
- org 100h ;.COM file
-
- Begin: jmp Start ;program starts here
-
- signature db 'PUSHD VERSION 1.1'
- ;SIG_LEN equ $-signature
-
- savedint13 dd ? ;used to be identical to pushd
-
- nextpush dw offset MAIN:push1d ;next place to save a dir
-
- push1d db 67 dup (0) ;directory storage
- push2d db 67 dup (0)
- push3d db 67 dup (0)
- push4d db 67 dup (0)
- push5d db 67 dup (0)
- push6d db 67 dup (0)
-
- ;up to here must be EXACTLY identical in PUSHD, POPD and DIRS.
-
- ;****************************************************************
- ;
- ; Data Section.
- ;
- ;****************************************************************
-
- notinstalled1 db 'PUSHD must be installed before DIRS'
- db ' will do anything.',13,10
- NOTINSTALLED_LN equ $-notinstalled1
-
- emptymsg db 'No directories on the stack.'
- cr_lf db 13,10 ;share this v1.2
- EMPTYMSG_LEN equ $-emptymsg
-
- CR_LF_LN equ $-cr_lf
-
- ;***************************************************************
- ;
- ; Code Starts.
- ;
- ;***************************************************************
-
- Start:
-
- ;is PUSHD already installed ?
-
- mov ax,7788h ;signature request
- mov bx,7789h ;signature request
- mov si,offset MAIN:signature ;point DS:si to signature
- int 13h ;is it installed ?
-
- assume DS:nothing
-
- cmp bx,7788h ;were ax and bx switched ?
- jne NotInstalled ;no
- cmp ax,7789h ;were ax and bx switched ?
- jz IsInstalled ;yes, continue v1.2
-
- NotInstalled:
-
- ;here PUSHD was not previously installed so POPD can't do anything
- ;useful so we just terminate with an error message.
-
- mov dx,offset MAIN:notinstalled1 ;error message
- mov cx,NOTINSTALLED_LN
- mov al,0FFH ;ERRORLEVEL v1.2
- jmp Msg_Term ;display, terminate v1.2
-
- IsInstalled:
-
- ASSUME DS:CSEG ;TSR's
-
- ;get address of previously saved directory
-
- mov dx,DS:[nextpush] ;get next location v1.2
- cmp dx,offset MAIN:push1d ;check for empty stack v1.2
- jnz NotEmpty ;nope, continue v1.2
-
- ;directory stack is empty -- print message and quit
-
- mov dx,offset MAIN:emptymsg ;error message
- mov cx,EMPTYMSG_LEN
- mov al,0FEH ;ERRORLEVEL v1.2
- jmp short Msg_Term ;display, terminate v1.2
-
- NotEmpty:
-
- ;v1.2 Pick up some handy "constants"
- mov si,CS ;our CSEG v1.2
- mov di,DS ;TSR's CSEG v1.2
-
- mov bp,offset MAIN:cr_lf ;handy constant v1.2
- sub dx,67 ;get last pushed dir v1.2
-
- NotEmpty_Lup:
-
- ;handle the printing out of the stored directory.
-
- ASSUME DS:CSEG ;TSR's
-
- mov cx,67 ;length of directory
- mov bx,1 ;write on stdout
- mov ah,40h ;write to file/device
- int 21h
-
- sub dx,cx ;- 67 v1.2
-
- ;now print out a cr/lf pair at the end of the directory
-
- mov DS,si ;our CSEG v1.2
- ASSUME DS:MAIN ;our CSEG
-
- xchg dx,bp ;DS:DX=cr_lf, BP=saved DX v1.2
- mov cx,CR_LF_LN
- mov bx,1 ;stdout
- mov ah,40h ;write to file/device
- int 21h
-
- mov DS,di ;TSR's CSEG v1.2
- ASSUME DS:CSEG ;TSR's
-
- xchg dx,bp ;BP=cr_lf addr, DX=current dir addr v1.2
-
- ;get next directory storage location and make sure it is
- ;within the range of stored locations
-
- cmp dx,offset MAIN:push1d ;hit directory stack top yet? v1.2
- jge NotEmpty_Lup ;not yet, keep going v1.2
-
- mov ax,4c00h ;terminate upon successful completion
- int 21h
-
- ;*************************************************************************
- ;
- ; PROCEDURE: Msg_Term
- ;
- ; Purpose: This procedure will handle the printing of error messages
- ; and termination with the correct errorlevel.
- ; Preconditions:
- ; DX = error message address.
- ; CX = error message length.
- ; AL = ERRORLEVEL.
- ; Postconditions:
- ; The program will be terminated with the appropriate
- ; error message printed on standard error and with the
- ; the errorlevel stored in al.
- ;
- ;***************************************************************************
-
- Msg_Term PROC NEAR
- ;v1.2 Common code
-
- push CS
- pop DS ;insure DS=CSEG
-
- push ax ;save AL errorlevel
- mov bx,2 ;stderr
- mov ah,40h ;dos function number
- int 21h ;show message
- pop ax
- mov ah,4CH ;terminate process
- int 21h
-
- Msg_Term ENDP
-
- CSEG ENDS
- END Begin
-