home *** CD-ROM | disk | FTP | other *** search
- ; FILENAME.ASM
- ; special version for PCPLUS
- ; this directory only
-
- CODE SEGMENT PARA PUBLIC 'code'
-
- SCREENBUFFER EQU OFFSET LASTBYTE
- FILEBUFFER EQU SCREENBUFFER+4000
- WHITE EQU 7
- BRIGHT EQU 15
- REVERSE EQU 70H
- BREVERSE EQU 78H
- RECLEN EQU 12
-
- PRINT MACRO MESSAGE
- MOV DX,OFFSET MESSAGE
- MOV AH,9
- INT 21H
- ENDM
-
- ORG 100H
- ASSUME DS:CODE, cs:code
-
- BEGIN: JMP INIT
- DB 8,8,8,'FILENAME (c) Clockwork Software 1991 UK ',13,10,26
- MAINLOCATION DW 60*2
- COLORSCHEME DB 0
-
- STRINGNAME DB 'FILENAME='
- STRING DB 13 DUP(0)
-
- FILESPEC DW OFFSET STARDOT
- STARDOT DB '*.*',0,'$'
- TOPFILE DW 2A00H
- VIDEO DW 0B000H
- LOCATION DW 160+65*2
- HANDLE DW ?
- CURSORLINE DW 0 ; current file
- RECSTART DW ?
- LINESTART DW ?
- ;ATTRIB DB 7+16 ; carrier
- ATTRIB1 DB 7+16 ; text
- ATTRIB2 DB 2+16 ; FRAME
- ATTRIB3 DB 15+4*16 ; CURSOR
- ATTRIB4 DB 2*16 ; help
- ATTRIB5 DB 14+2*16 ; help highlite
- ; TEXT FRAME CURSOR HELP HILITE
- COLORSCHEME1 DB 7+16, 2+16, 15+4*16,2*16, 14+2*16
- DB 7*16, 7*16, 7, 7, 15
- DB 6*16, 6*16+7, 7, 2*16, 14+2*16
- DB 7+4*16, 4*16, 4+7*16, 5*16, 15+5*16
-
- DEEP DW 22
- WIDE EQU 14
- NOFILEMSG1 DB 'No matching files',0
- PRESSANYMSG DB ' Press any key ',0
- REDRAW DB 4
- WASCURSORSIZ DW ?
- WASCURSORPOS DW ?
- BOXCHARS DB '╔═╗║ ║╚═╝'
- FILECOUNT DW 0
- BADENVMSG DB "Could not find DOS environment - FILENAME terminated",13,10,'$'
- SMALLENVMSG DB "No room in environment - FILENAME terminated",13,10,'$'
- ENVSEG DW ?
- ENVSIZE DW ?
- DOUBLEZERO DW ?
- BOTTOMLOC DW ?
- F1MSG DB ' F1-help ',0
- PCPLUSMSG DB ' PCPlus ',0
- HELPMSG DB ' Clockwork FILENAME (c) 1991 UK ',0
- db 'A file selector for PCPlus readers -',0
- db ' execute with: FILENAME [filespec]',0
- db ' the default filespec is *.*',0
- db 'Live commands are:',0
- db ' home end pgup pgdn move cursor',0
- db ' Ret select filename',0
- db ' Esc quit (without selecting)',0
- db '
- move display',0
- db ' Colour change',0
- db ' Save colour and position as defaults.',0
- db ' ',0
- db 'The program creates an environment string from',0
- db ' the selected filename as FILENAME=xxxxxx',0
- db ' ',0
- db 'Examine environment strings with the SET command.',0
- db ' ',0
- db 'Use filename string in batch files between % %s.',0
- db ' e.g. ECHO file selected is %FILENAME%',0
- db ' or DEL %FILENAME%',0
- db ' ',0
- db "This is a cutdown version of Clockwork's CDIR.",0
- db ' Why not ask for a software catalogue ?',0
- db ' CLOCKWORK SOFTWARE, Bidbury House, HAVANT, PO9 3JG',0
- db '═══════ tel 0705-483217 ══ fax 0705-454233 ',0,0
-
-
-
-
-
- INIT: MOV AX,CS
- MOV DX,AX ; remember this segment
- CALL SETCOLOR
-
- CALL GETENV
- JNC INIT5
- PRINT BADENVMSG
- JMP BADEXIT
-
- INIT5: MOV AH,0FH
- INT 10H
- CMP AL,7
- JZ INIT10
- MOV VIDEO,0B800H
-
- INIT10: CALL SAVESCREEN
-
- mov si,80h ; start at command tail
- GETFILESPEC: INC SI
- CMP BYTE PTR [SI],' '
- Jb NOTAIL
- JZ GETFILESPEC
- MOV FILESPEC,SI
- GETFILESPEC10: LODSB
- CMP AL,' '
- JA GETFILESPEC10
- MOV WORD PTR[SI-1],256*'$'
-
- NOTAIL: CALL GATHER
-
- BADEXIT: MOV BP,4C01H
- JMP SHORT EXIT
- GOODEXIT: MOV BP,4C00H
- EXIT: CALL REPLACESCREEN
- CALL REPLACECURSOR
- MOV AX,BP
- INT 21H
-
- ; -----------------------------------------------
- CAPITALISEAL: CMP AL,'a'
- JB CAPITALISE20
- CMP AL,'z'
- JA CAPITALISE20
- AND AL,11011111B
- CAPITALISE20: RET
-
- ;------------------------------------------------------------
- ; FROM DIRECTORY
- ; filespec
- ;------------------------------------------------------------
- GATHER: MOV REDRAW,5
- MOV AX,CS
- MOV ES,AX
- MOV DS,AX
-
- MOV AH,1AH ; set the DTA area
- MOV DX,80H
- INT 21H
-
- CLD
- MOV FILECOUNT,0
-
- MOV DX,FILESPEC
- MOV AH,4EH ; search first match
- MOV CX,6;ATTRIBMASK ; attribute
- INT 21H
- JC GATHER30
- CALL GETREST
-
- GATHER30: CMP FILECOUNT,1
- Jb GATHER40
- Ja SORT ; only one
- MOV TOPFILE,0
- JMP CR
-
- GATHER40: MOV DI,MAINLOCATION
- CMP DI,58*2
- JBE GATHER45
- MOV DI,58*2
-
- GATHER45: mov AH,ATTRIB1
- MOV CX,19+256
- PUSH DI
- call BOX
- POP DI
- ADD DI,164
- MOV SI,OFFSET NOFILEMSG1
- CALL COLORPRINT80
- MOV SI,OFFSET PRESSANYMSG
- ADD DI,160-16*2
- CALL COLORPRINT80
- CALL PIP
- call GETCAPS
- JMP BADEXIT
-
- ;════════════════════════════════════════════════════════
-
- ; SORT INTO ORDER
- ; FILECOUNT PASSES
- SORT: MOV AX,FILECOUNT
- DEC AX
- MOV CURSORLINE,AX ; used as a counter
- SORT20: MOV BX,FILECOUNT
- DEC BX
-
- SORT30: MOV SI,FILEBUFFER ; compare and swap
- MOV AX,RECLEN ; set up pointers
- MUL BL
- ADD SI,AX ; this name
- MOV DI,SI
- SUB DI,RECLEN
- PUSH SI ; remember
- PUSH DI
-
- MOV CX,RECLEN
- SORT40: MOV AL,[SI]
- CMP AL,[DI]
- JB SORT70 ; SWAP
- JA SORT50 ; OK
- INC SI
- INC DI
- LOOP SORT40
-
- SORT50: POP SI ; OK
- POP DI
- SORT60: DEC BL
- JNZ SORT30
- DEC CURSORLINE
- JNZ SORT20
- JMP SELECTER
-
- SORT70: POP SI ; exchange
- POP DI
- MOV CX,RECLEN
- SORT80: MOV AL,[SI]
- XCHG AL,[DI]
- XCHG AL,[SI]
- INC SI
- INC DI
- LOOP SORT80
- JMP SORT60
-
- ;════════════════════════════════════════════════════════
- ; no more files, so display them
- ; have MAINLOCATION, FILECOUNT, DEEP
- SELECTER: MOV CURSORLINE,0 ; absolute
- MOV TOPFILE,0
- SELECTER2: MOV CX,23
- CMP CX,FILECOUNT
- JB SELECTER3
- MOV CX,FILECOUNT
- SELECTER3: MOV DEEP,CX
- MOV CH,CL
-
- SELECTER5: CMP REDRAW,4
- JB SELECTER6
- MOV AH,ATTRIB2 ; redraw box etc
- MOV DI,MAINLOCATION
- MOV CX,DEEP
- MOV CH,CL
- MOV CL,WIDE
- CALL BOX
- SUB DI,160-6
- MOV SI,OFFSET F1MSG
- CALL COLORPRINT80
- MOV DI,MAINLOCATION
- ADD DI,2*4
- MOV SI,OFFSET PCPLUSMSG
- CALL COLORPRINT80
-
- ; redraw box with new TOPFILE
-
- selecter6: MOV ES,VIDEO
- MOV BP,DEEP ; max display lines
- CMP FILECOUNT,BP
- JA SELECTER7
- MOV BP,FILECOUNT
-
- SELECTER7: CMP REDRAW,2
- JB SELECTER20
- MOV REDRAW,0
- MOV AX,TOPFILE ; redraw
- MOV CX,RECLEN
- MUL CL
- ADD AX,FILEBUFFER
- MOV RECSTART,AX
- MOV DI,MAINLOCATION
- ADD DI,160+2*2
- MOV LINESTART,DI
- SELECTER10: CALL DRAWLINE
-
- ADD LINESTART,160
- ADD RECSTART,RECLEN
- DEC BP
- JNZ SELECTER10
-
- SELECTER20: PUSH MAINLOCATION
- POP LOCATION
- CALL CURSOR
-
-
- SELECTER45: CALL GETCAPS
-
- PUSH CS
- POP ES
- MOV DI,OFFSET OPTIONS
- MOV AL,AH
- MOV CX,MAXOPTIONS
- REPNZ SCASB
- JCXZ SELECTER45 ; nothing
- MOV BX,DI
- SUB BX,OFFSET OPTIONS
- DEC BX
- ADD BX,BX
- CALL DESTINATIONS [BX]
- JMP SELECTER5
-
- ;════════════════════════════════════════════════════════
- PIP: MOV AX,0E07H
- INT 10H
- RET
- ;════════════════════════════════════════════════════════
- ; store record, and read remainder
- GETREST: MOV AX,CS
- MOV ES,AX
- MOV DS,AX
-
- MOV AX,FILECOUNT
- MOV CX,RECLEN
- MUL CX
- MOV DI,FILEBUFFER
- ADD DI,AX
-
- PUSH DI ; clean record
- MOV CX,RECLEN
- MOV AL,0
- REP STOSB
- POP DI
-
- MOV SI,80H + 30 ; store details from DTA
- MOV CX,RECLEN
- GETREST10: REP MOVSB
-
- GETREST20: INC FILECOUNT
- MOV AH,4FH ; search next
- INT 21H
- JNC GETREST
- RET
-
- ; CR ESC UP DOWN PGUP PGDN HOME END F1 C S left right
- OPTIONS DB 28, 1, 72, 80, 73, 81, 71, 79, 59, 46,31,75,77,79
- MAXOPTIONS EQU $-OFFSET OPTIONS
-
- DESTINATIONS DW OFFSET CR
- DW OFFSET BADEXIT
- DW OFFSET UP
- DW OFFSET DOWN
- DW OFFSET PGUP
- DW OFFSET PGDN
- DW OFFSET HOME
- DW OFFSET ENDER
- DW OFFSET F1
- DW OFFSET COLOR
- DW OFFSET SAVE
- DW OFFSET left
- DW OFFSET right
-
- ;════════════════════════════════════════════════════════
- UP: CMP CURSORLINE,0 ; if at top already
- JZ UP20 ; nothing
- DEC CURSORLINE ; otherwise go up
- UPZ: RET
-
- UP20: CMP TOPFILE,0
- JZ UPZ
- DEC TOPFILE
- MOV REDRAW,2
- RET
-
- ;════════════════════════════════════════════════════════
- DOWN: INC CURSORLINE
- MOV AX,CURSORLINE
- CMP AX,DEEP
- JZ DOWN10
- DOWNZ: RET
-
- DOWN10: DEC CURSORLINE
- ADD AX,TOPFILE
- CMP AX,FILECOUNT
- JZ DOWNZ
- INC TOPFILE
- MOV REDRAW,2
- RET
-
- ;════════════════════════════════════════════════════════
- PGUP: MOV CX,deep
- PGUP10: CALL UP
- LOOP PGUP10
- RET
-
- ;════════════════════════════════════════════════════════
- PGDN: MOV CX,DEEP
- PGDN10: CALL DOWN
- LOOP PGDN10
- RET
-
- ;════════════════════════════════════════════════════════
- HOME: MOV CURSORLINE,0
- MOV TOPFILE,0
- MOV REDRAW,4
- HOMEZ: RET
-
- ;════════════════════════════════════════════════════════
- ENDER: MOV CX,FILECOUNT
- JMP PGDN10
-
- ;════════════════════════════════════════════════════════
- LEFT: CMP MAINLOCATION,0
- JZ HOMEZ
- SUB MAINLOCATION,2
- JMP SHORT F1Z
-
- RIGHT: CMP MAINLOCATION,160-32
- JAE HOMEZ
- ADD MAINLOCATION,2
- JMP SHORT F1Z
-
- COLOR: INC COLORSCHEME
- AND COLORSCHEME,3
- SETCOLOR: MOV CL,COLORSCHEME
- MOV AX,5
- MUL CL
- ADD AX,OFFSET COLORSCHEME1
- MOV SI,AX
- MOV DI,OFFSET ATTRIB1
- MOV CX,5
- PUSH CS
- POP ES
- REP MOVSB
- MOV REDRAW,4
- RET
-
- ;════════════════════════════════════════════════════════
- F1: XOR DI,DI
- MOV CX,55+23*256
- mov ah,attrib4
- CALL BOX
- MOV DI,12*2
- MOV SI,OFFSET HELPMSG
- CALL colorprint80
- mov di,164
- CALL BLOCKPRINT
- CALL GETKEYPRESS
- CMP AH,46
- JNZ F1Z
- CALL COLOR
- JMP F1
-
- F1Z: CALL REPLACESCREEN
- MOV REDRAW,4
- JMP SELECTER5
-
- ;════════════════════════════════════════════════════════
- SAVE: MOV ES,CS:[2CH]
- XOR DI,DI
- MOV AL,0
- MOV CX,5000
- SAVE10: REPNZ SCASB
- CMP AL,ES:[DI]
- JNZ SAVE10
- ADD DI,3
- MOV DX,DI
- PUSH ES
- POP DS
- MOV AX,3D01H ; write access
- INT 21H
- PUSH CS
- POP DS
- JC SAVEFAIL
- MOV HANDLE,AX
- MOV BX,AX
- MOV AH,40H
- MOV DX,100H
- MOV CX,OFFSET COLORSCHEME-100H+1
- INT 21H
- MOV BX,HANDLE
- MOV AH,3EH
- INT 21H
- RET
-
- SAVEFAIL: MOV AX,0E07H
- INT 10H
- RET
-
- ;════════════════════════════════════════════════════════
- CR: MOV AX,TOPFILE
- ADD AX,CURSORLINE
- MOV CX,RECLEN
- MUL CX
- ADD AX,FILEBUFFER
- MOV SI,AX
- MOV DI,OFFSET STRING
- MOV CX,12
- PUSH CS
- POP ES
- REP MOVSB
- ; ═══════════════════════════════════════════════════════
- ; Look for name in environment
- ;
- ; ═══════════════════════════════════════════════════════
- FINDINENV: MOV ES,ENVSEG
- XOR DI,DI
- MOV AL,0
- MOV CX,ENVSIZE
- CLD
-
- FINDENVLEN10: REPNZ SCASB ; find last point in environment
- JCXZ FINDENVLEN12 ; error situation, but carry on
- CMP ES:[DI],AL ; 2nd zero
- JNZ FINDENVLEN10
- FINDENVLEN12: MOV DOUBLEZERO,DI
-
- MOV CX,DI
- MOV SI,OFFSET STRINGNAME
- MOV DI,0 ; front of environment
-
- FINDINENV20: MOV BX,0
-
- FINDINENV30: MOV AL,[SI+BX] ; can we agree the whole name?
- CMP AL,ES:[DI+BX]
- JNZ FINDINENV40 ; fail so try again
- CMP AL,'=' ; success
- JZ FINDINENV50
- INC BX
- JMP FINDINENV30
-
- FINDINENV40: MOV AL,0
- REPNZ SCASB
- JZ FINDINENV20
- JMP FINDINENVZ ; hit double zero
-
- FINDINENV50: PUSH DI ; start of string
- MOV AL,0
- REPNZ SCASB
- MOV SI,DI
- POP DI
- MOV CX,ENVSIZE
- SUB CX,SI
- PUSH ES
- POP DS
- REP MOVSB ; stripout
- PUSH CS
- POP DS
- ADD DOUBLEZERO,DI
- SUB DOUBLEZERO,SI
-
- FINDINENVZ: PUSH CS
- POP DS
-
- ASSIGNENV: MOV DI,DOUBLEZERO
- MOV CX,ENVSIZE
- SUB CX,DI ; CX has spare
- CMP CX,18
- JAE ASSIGNENV5
- MOV DX,OFFSET SMALLENVMSG
- MOV AH,9
- INT 21H
- CALL PIP
- CALL GETCAPS
- JMP BADEXIT
-
- ASSIGNENV5: MOV SI,OFFSET STRINGNAME
- MOV DI,DOUBLEZERO
-
- ASSIGNENV10: LODSB
- STOSB
- CMP AL,0
- JNZ ASSIGNENV10
- STOSB
-
- JMP GOODEXIT
-
-
- ;════════════════════════════════════════════════════════
- ; draw individual line using LINESTART and RECSTART
-
- DRAWLINE: MOV DI,LINESTART ; blank out line
- MOV CX,12
- MOV AH,ATTRIB1
- MOV AL,' '
- REP STOSW
-
- MOV CX,8 ; filename
- MOV DI,LINESTART
- MOV SI,RECSTART
- DRAWLINE10: LODSB ; copy up to dot
- CMP AL,' '
- JB DRAWLINE50
- CMP AL,'.'
- JZ DRAWLINE20
- STOSW
- LOOP DRAWLINE10
- LODSB ; skip dot
- DRAWLINE20: JCXZ DRAWLINE30
- MOV AL,' '
- REP STOSW
-
- DRAWLINE30: MOV AL,'.'
- STOSW
- MOV CX,3
- DRAWLINE40: LODSB
- CMP AL,' '
- JB DRAWLINE50
- STOSW
- LOOP DRAWLINE40
- DRAWLINE50: RET
- ;════════════════════════════════════════════════════
- CURSOR: mov ES,VIDEO
- MOV BX,0
- MOV DI,LOCATION
- ADD DI,162
-
- CURSOR10: MOV CX,WIDE
- PUSH DI
- MOV AH,ATTRIB1
- CMP BX,CURSORLINE
- JNZ CURSOR20
- MOV AH,ATTRIB3
-
- CURSOR20: MOV ES:[DI+1],AH
- ADD DI,2
- LOOP CURSOR20
- POP DI
- ADD DI,160
- INC BX
- CMP BX,DEEP
- JB CURSOR10
- RET
- ;════════════════════════════════════════════════════
- ; COLOURPRINT needs SI, ES:DI , terminates at CX=0, OR $
- ; ------------------------------------------------------------
-
- COLORPRINT80: MOV CX,80
- MOV ES,CS:VIDEO
-
- COLORPRINT20: LODSB
- CMP AL,0
- JZ COLORPRINT30
- CMP AL,5
- JA COLORPRINT28
- MOV AH,CS:ATTRIB5
- JZ COLORPRINT20
- MOV AH,CS:ATTRIB4
- CMP AL,3
- JA COLORPRINT20
- MOV AH,CS:ATTRIB3
- JZ COLORPRINT20
- MOV AH,CS:ATTRIB2
- CMP AL,1
- JA COLORPRINT20
- MOV AH,CS:ATTRIB1
- JMP COLORPRINT20
- COLORPRINT28: STOSW
- LOOP COLORPRINT20
- COLORPRINT30: RET
- ; ═══════════════════════════════════════════════════════
- BLOCKPRINT: PUSH DI
- CALL COLORPRINT80
- POP DI
- ADD DI,160
- CMP BYTE PTR[SI],0
- JNZ BLOCKPRINT
- RET
-
-
- ; =============================================
- GETCAPS: CALL GETKEYPRESS
- JMP CAPITALISEAL
-
- GETKEYPRESS: MOV AH,0
- INT 16H
- RET
- ; ═══════════════════════════════════════════════════════
- ; ═══════════════════════════════════════════════════════
-
- BOX: MOV SI,OFFSET BOXCHARS
- MOV ES,VIDEO
- MOV BL,CH
- MOV CH,0
- CALL BOXLINE
- ADD SI,3
- BOX10: CALL BOXLINE
- DEC BL
- JNZ BOX10
- ADD SI,3
- CALL BOXLINE
- RET
- ; ================================
- BOXLINE: PUSH SI
- PUSH DI
- LODSB
- STOSW
- LODSB
- PUSH CX
- REP STOSW
- POP CX
- LODSB
- STOSW
- POP DI
- ADD DI,160
- POP SI
- RET
- ; ================================
- SAVESCREEN: MOV DI,SCREENBUFFER
- XOR SI,SI
- MOV CX,2000
- PUSH CS
- POP ES
- MOV DS,CS:VIDEO
- REP MOVSW
- PUSH CS
- POP DS
-
- MOV AH,3 ; get cursor
- XOR BX,BX
- INT 10H
-
- MOV WASCURSORSIZ,CX
- MOV WASCURSORPOS,DX
-
- MOV AH,1 ; hide cursor
- MOV CH,20H
- INT 10H
- RET
-
- ; ═══════════════════════════════════════════════════════
- REPLACESCREEN: MOV SI,SCREENBUFFER
- XOR DI,DI
- MOV CX,2000
- MOV ES,VIDEO
- REP MOVSW
- RET
-
- REPLACECURSOR: MOV AH,1 ; set cursor
- MOV CX,WASCURSORSIZ
- INT 10H
-
- MOV AH,2
- MOV DX,WASCURSORPOS
- INT 10H
- RET
-
-
-
- ; ═══════════════════════════════════════════════════════
- ; find the environment (all types and versions - I hope - catered for!)
- getenv:
- mov dx,cs
- mov cx,10
- getenv10:
- mov es,dx
- cmp dx,0A000h
- ja getenv15
- cmp dx,es:16h
- mov dx,es:16h
- loopnz getenv10
- jcxz getenvf
- getenv15:
- mov di,dx
- mov bx,es:[2Ch]
- cmp bx,0
- jz getenv20
- mov ah,30h
- push bx
- int 21h
- pop bx
- cmp ax,0A03h
- jz getenv14
- call trydrdos
- jc getenv20
- getenv14:
- mov dx,bx
- dec dx
- jmp short getenv40
- getenv20:
- dec dx
- mov es,dx
- getenv30:
- add dx,es:[3]
- inc dx
- mov bx,cs
- cmp dx,bx
- ja getenvf
- getenv40:
- mov es,dx
- cmp di,es:[1]
- jnz getenv30
- cmp byte ptr es:[16],20h
- jb getenv30
- mov cx,es:[3]
- inc dx
- mov envseg,dx
- mov ax,16
- mul cx
- mov envsize,ax
- clc
- ret
- getenvf:
- stc
- ret
- drdosmsg db 'OS=DR'
- trydrdos:
- push bx
- push dx
- push di
- mov es,cs:[2ch]
- mov si,offset drdosmsg
- xor di,di
- mov cx,2000
- trydrdos10:
- xor bx,bx
- trydrdos20:
- mov al,[si+bx]
- cmp al,es:[di+bx]
- jnz trydrdos30
- inc bx
- cmp bx,5
- jb trydrdos20
- clc
- trydrdos25:
- pop di
- pop dx
- pop bx
- ret
- trydrdos30:
- xor ax,ax
- repnz scasb
- cmp al,es:[di]
- jnz trydrdos10
- stc
- jmp trydrdos25
-
-
- ; ═══════════════════════════════════════════════════════
-
- LASTBYTE:
-
- CODE ENDS
-
- END BEGIN