1 TITLE PART4
- COMMAND Transient routines
.
16 DATARES
SEGMENT PUBLIC
20 TRANDATA
SEGMENT PUBLIC
21 EXTRN BADDRV
:BYTE,BADSWT
:BYTE
22 EXTRN BADDAT
:BYTE,NEWDAT
:BYTE,BADTIM
:BYTE
23 EXTRN DMES
:BYTE,CURDAT_PRE
:BYTE,CURDAT_MID
:BYTE,CURDAT_POST
:BYTE
24 EXTRN RENERR
:BYTE,VERMES_PRE
:BYTE,VERMES_POST
:BYTE
25 EXTRN DIRHEAD_PRE
:BYTE,DIRHEAD_POST
:BYTE
26 EXTRN ACRLF
:BYTE,BADARGS
:BYTE,NOTFND
:BYTE
27 EXTRN NEWTIM
:BYTE,BADCD
:BYTE,BADMKD
:BYTE,CLSSTRING
:BYTE
28 EXTRN CURTIM_PRE
:BYTE,CURTIM_POST
:BYTE,PauseMes
:BYTE
32 TRANSPACE
SEGMENT PUBLIC
33 EXTRN COMBUF
:BYTE,DIRCHAR
:BYTE,USERDIR1
:BYTE
34 EXTRN BYTCNT
:WORD,CURDRV
:BYTE,COMSW
:WORD,ARGTS
:WORD
35 EXTRN LINCNT
:BYTE,LINLEN
:BYTE,FILECNT
:WORD,CHARBUF
:BYTE
36 EXTRN DIRBUF
:BYTE,BITS
:WORD,PATHPOS
:WORD
37 EXTRN DESTISDIR
:BYTE,DESTTAIL
:WORD,DESTINFO
:BYTE,FULLSCR
:WORD
38 EXTRN INTERNATVARS
:BYTE,RESSEG
:WORD,TPA
:WORD
42 TRANCODE
SEGMENT PUBLIC BYTE
43 ASSUME
CS:TRANGROUP
,DS:NOTHING
,ES:NOTHING
,SS:NOTHING
45 EXTRN NOTEST2
:NEAR,PRINTVOL
:NEAR,Print_Date
:NEAR
46 EXTRN CERROR
:NEAR,SWITCH
:NEAR,PWD
:NEAR,SETREST
:NEAR,MESTRAN
:NEAR
47 EXTRN NOTFNDERR
:NEAR,CHKCNT
:NEAR,GETKEYSTROKE
:NEAR
48 EXTRN SETPATH
:NEAR,PATHCRUNCH
:NEAR,PRINT
:NEAR,ZPRINT
:NEAR
49 EXTRN DISPSIZE
:NEAR,OUT:NEAR,OUT2
:NEAR,ERROR_PRINT
:NEAR
50 EXTRN SCANOFF
:NEAR,OUTBYTE
:NEAR,GETNUM
:NEAR,ERROR_OUTPUT
:NEAR
53 PUBLIC PRINT_TIME
,CATALOG
54 PUBLIC BADCDERR
,PRINT_VERSION
,CLS
,SAVUDIR
,SAVUDIR1
55 PUBLIC TYPEFIL
,CRENAME
,$RMDIR
56 PUBLIC CTIME
,$CHDIR
,ONESPC
,DATINIT
57 PUBLIC $MKDIR
,VERSION
,RESTUDIR1
58 PUBLIC RESTUDIR
,CRLF2
,ERASE
59 PUBLIC volume
,date
,P_date
,PAUSE
64 MOV AL,"?" ; *.* is default file spec.
71 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 0DH ; Parse with default name and extension
74 ; Begin by processing any switches that may have been specified.
75 ; BITS will contain any information about switches that was
76 ; found when the command line was parsed.
79 MOV AX,[COMSW
] ; Get switches from command
80 OR AX,[ARGTS
] ; OR in switches from all of tail
82 MOV BYTE PTR[FULLSCR
],LINPERPAG
83 TEST AL,1 ; Look for W switch
88 MOV [LINLEN
],AL ; Set number of entries per line
90 MOV [FILECNT
],0 ; Keep track of how many files found
91 MOV DX,OFFSET TRANGROUP
:DIRBUF
; Set Disk transfer address
94 CALL PATHCRUNCH
; Get where we're going
97 CMP [DESTISDIR
],0 ; No CHDIRs worked
98 JZ NOTEST
; see if they should have
103 MOV DI,OFFSET TRANGROUP
:DIRBUF
109 MOV DX,OFFSET TRANGROUP
:DIRHEAD_PRE
; Print "Directory of"
110 PUSH AX ; save return code
112 CALL PWD
; print the path
113 MOV DX,OFFSET TRANGROUP
:DIRHEAD_POST
117 JNZ OKDODIR
; Go ahead and dir if open fail
118 TEST [DIRBUF
+fcb_DEVID
],devid_device
120 JMP NOTFNDERR
; Can't DIR a device
122 MOV AH,DIR_SEARCH_FIRST
123 MOV BYTE PTR DS:[FCB
-7],0FFH
124 MOV BYTE PTR DS:[FCB
-1],010H
126 JC SHOWDIR
; Current dir
127 JZ DOFIRST
; FCB is *.*
131 REP STOSB ; Remake default FCB
134 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 0EH ; Parse with default drive, name and extension
136 MOV AH,DIR_SEARCH_FIRST
146 MOV DX,FCB
-7 ; DX -> Unopened FCB
147 INT int_command
; Search for a file to match FCB
149 INC AL ; FF = file not found
150 JNZ AGAIN
; Either an error or we are finished
155 INC [FILECNT
] ; Keep track of how many we find
156 MOV SI,OFFSET TRANGROUP
:DIRBUF
+8 ; SI -> information returned by sys call
158 TEST BYTE PTR[BITS
],WSWITCH
; W switch set?
159 JNZ NEXENTJ
; If so, no size, date, or time
160 MOV SI,OFFSET TRANGROUP
:DIRBUF
+8+dir_attr
161 TEST BYTE PTR [SI],attr_directory
163 MOV DX,OFFSET TRANGROUP
:DMES
167 CALL DISPSIZE
; Print size of file
169 MOV AX,WORD PTR [DIRBUF
+8+dir_date
] ; Get date
171 JZ NEXENT
; Skip if no date
172 MOV DI,OFFSET TRANGROUP
:CHARBUF
182 SHR AX,CL ; Align month
183 AND AL,0FH ; Get month
186 SHR CL,1 ; Align year
188 ADD CX,80 ; Relative 1980
194 MOV CX,WORD PTR[DIRBUF
+8+dir_time
] ; Get time
195 JCXZ PRBUF
; Time field present?
202 SHR CL,1 ; Hours in CH, minutes in CL
203 MOV BL,[INTERNATVARS
.Time_24
]
204 OR BL,80H
; Tell P_TIME called from DIR
205 CALL P_TIME
; Don't care about DX, never used with DIR
209 MOV DX,OFFSET TRANGROUP
:CHARBUF
218 TEST BYTE PTR[BITS
],PSWITCH
; P switch present?
219 JZ SCROLL
; If not, just continue
220 DEC BYTE PTR[FULLSCR
]
222 MOV BYTE PTR[FULLSCR
],LINPERPAG
223 MOV DX,OFFSET TRANGROUP
:PAUSEMES
228 MOV AH,DIR_SEARCH_NEXT
232 MOV AL,9 ; Output a tab
237 MOV DI,OFFSET TRANGROUP
:CHARBUF
247 MOV DX,OFFSET TRANGROUP
:CHARBUF
258 MOV DX,OFFSET TRANGROUP
:ACRLF
269 MOV DX,OFFSET TRANGROUP
:PAUSEMES
276 MOV DX,OFFSET TRANGROUP
:BADARGS
282 CMP AL,13 ; RETURN KEY?
283 JZ ERRJ2
; IF SO NO PARAMETERS SPECIFIED
288 CMP [DESTISDIR
],0 ; No CHDIRs worked
289 JZ NOTEST2J
; see if they should have
291 MOV DX,OFFSET TRANGROUP
:BADCD
301 CMP [DESTISDIR
],0 ; No CHDIRs worked
302 JZ NOTEST3
; see if they should have
309 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 01H
311 CMP BYTE PTR DS:[FCB
+10H
+1]," " ; Check if parameter exists
312 MOV DX,OFFSET TRANGROUP
:BADARGS
313 JZ ERRJ
; Error if missing parameter
320 MOV DX,OFFSET TRANGROUP
:RENERR
326 ASSUME
DS:TRANGROUP
,ES:TRANGROUP
329 call SCANOFF
; Skip to first non-delim
332 jmp NOARGERR
; No args
337 MOV DX,OFFSET TRANGROUP
:NOTFND
359 retz
; One less byte OK (^Z)
365 retnz
; If device, no error message
377 MOV DX,OFFSET TRANGROUP
:USERDIR1
379 INT int_command
; Restore users DIR
388 call SCANOFF
; Skip to first non-delim
389 CMP BYTE PTR DS:[FCB
],0 ;Default drive?
396 JNZ OKVOLARG
; If we skipped some delims at this point, OK
401 MOV DX,OFFSET TRANGROUP
:BADDRV
408 MOV DI,FCB
-7 ; Set up extended FCB
415 MOV AL,8 ; Look for volume label
417 INC DI ; Skip drive byte
421 MOV DX,OFFSET TRANGROUP
:DIRBUF
425 MOV AH,DIR_SEARCH_FIRST
435 MOV DI,OFFSET TRANGROUP
:CHARBUF
436 MOV SI,OFFSET TRANGROUP
:VERMES_PRE
463 MOV SI,OFFSET TRANGROUP
:VERMES_POST
467 MOV DX,OFFSET TRANGROUP
:CHARBUF
478 JZ ANSICLS
; If a file put out ANSI
479 TEST DL,devid_SPECIAL
480 JZ ANSICLS
; If not special CON, do ANSI
481 MOV AX,(GET_INTERRUPT_VECTOR
SHL 8) OR 29H
484 MOV AX,(GET_INTERRUPT_VECTOR
SHL 8) OR 20H
488 JA ANSICLS
; If not default driver, do ANSI
489 MOV AH,11 ; Set overscan to black
523 MOV SI,OFFSET TRANGROUP
:CLSSTRING
538 MOV DX,OFFSET TRANGROUP
:BADSWT
541 call SCANOFF
; Skip to first non-delim
544 inc si ; Skip first char
546 cmp ax,(0DH SHL 8) OR ':' ; d:<CR> ?
549 jmp PWD
; Drive only specified
567 MOV DX,OFFSET TRANGROUP
:BADMKD
572 MOV DX,OFFSET TRANGROUP
:BADARGS
577 call SCANOFF
; Skip to first non-delim
579 jz NOARGERR
; No args
582 MOV DX,OFFSET TRANGROUP
:BADSWT
595 MOV DX,OFFSET TRANGROUP
:BADRMD
599 ; DL is drive number A=1
600 MOV DI,OFFSET TRANGROUP
:USERDIR1
617 MOV AH,CURRENT_DIR
; Get the Directory Text
625 ASSUME
DS:TRANGROUP
,ES:TRANGROUP
627 ; Date and time are set during initialization and use
628 ; this routines since they need to do a long return
632 PUSH DS ; Going to use the previous stack
633 MOV AX,CS ; Set up the appropriate segment registers
636 MOV DX,OFFSET TRANGROUP
:INTERNATVARS
;Set up internat vars
637 MOV AX,INTERNATIONAL
SHL 8
639 MOV WORD PTR DS:[81H
],13 ; Want to prompt for date during initialization
640 MOV [COMBUF
],COMBUFLEN
; Init COMBUF
641 MOV WORD PTR [COMBUF
+1],0D01H
649 ; DATE - Gets and sets the time
660 MOV BH,"0"-" " ; Enable leading zero suppression
661 MOV AX,WORD PTR [INTERNATVARS
.Date_tim_format
]
666 MOV BH,0 ; Disable leading zero suppression
695 MOV AL,BYTE PTR [INTERNATVARS
.Date_sep
]
707 JZ TWODIGYR
; Two instead of 4 digit year
715 MOV SI,81H
; Accepting argument for date inline
722 MOV DX,OFFSET TRANGROUP
:CURDAT_PRE
723 CALL PRINT
; Print "Current date is "
725 MOV DX,OFFSET TRANGROUP
:CURDAT_POST
728 MOV DX,OFFSET TRANGROUP
:NEWDAT
729 CALL ERROR_PRINT
; Print "Enter new date: "
730 MOV AH,STD_CON_STRING_INPUT
731 MOV DX,OFFSET TRANGROUP
:COMBUF
732 INT int_command
; Get input line
734 MOV SI,OFFSET TRANGROUP
:COMBUF
+2
735 CMP BYTE PTR[SI],13 ; Check if new date entered
738 MOV AX,WORD PTR [INTERNATVARS
.Date_tim_format
]
786 CALL GETNUM
; Get one or two digit number
788 MOV DH,AH ; Put in position
793 MOV DL,AH ; Put in position
819 ; Gross hack for PC-J machine: CMOS clock cannot handle years after 2079
830 MOV DX,OFFSET TRANGROUP
:BADDAT
845 ; TIME gets and sets the time
848 MOV SI,81H
; Accepting argument for time inline
858 INT int_command
; Get time in CX:DX
863 MOV DI,OFFSET TRANGROUP
:CHARBUF
864 MOV BL,1 ; Always 24 hour time
868 MOV DX,OFFSET TRANGROUP
:CHARBUF
876 TEST BL,07FH ; Ignore high bit
877 JNZ T24
; 24 hr time?
878 MOV BH,"a" ; Assume A.M.
879 CMP AL,12 ; In the afternoon?
883 SUB AL,12 ; Keep it to 12 hours or less
885 OR AL,AL ; Before 1 am?
890 MOV BH,"0"-" " ; Enable leading zero suppression
898 JNZ PAP
; If from DIR, go directly to am pm
899 MOV BH,0 ; Disable leading zero suppression
911 TEST BL,07FH ; Ignore high bit
912 retnz
; 24 hour time, no am pm
914 STOSB ; Store 'a' or 'p'
918 MOV AL,[INTERNATVARS
.Time_sep
]
924 MOV DX,OFFSET TRANGROUP
:CURTIM_PRE
925 CALL PRINT
; Print "Current time is "
927 MOV DX,OFFSET TRANGROUP
:CURTIM_POST
930 XOR CX,CX ; Initialize hours and minutes to zero
931 MOV DX,OFFSET TRANGROUP
:NEWTIM
935 retz
; If no time present, don't change it
949 MOV DH,AH ; Position seconds
965 retz
; Error in time?
967 MOV DX,OFFSET TRANGROUP
:BADTIM
968 CALL PRINT
; Print error message
969 JMP GETTIM
; Try again
972 CALL ERROR_PRINT
; Print "Enter new time: "
973 MOV AH,STD_CON_STRING_INPUT
974 MOV DX,OFFSET TRANGROUP
:COMBUF
975 INT int_command
; Get input line
977 MOV SI,OFFSET TRANGROUP
:COMBUF
+2
978 CMP BYTE PTR[SI],13 ; Check if new time entered
981 CALL GETNUM
; Get one or two digit number
983 MOV DH,AH ; Put in position
989 DEC SI ; Clears zero flag
992 return
; Time may have only an hour specified
996 MOV DL,AH ; Put in position