mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-12-01 18:15:47 +00:00
290 lines
7.6 KiB
NASM
290 lines
7.6 KiB
NASM
|
TITLE COMMAND Language midifiable Code Transient
|
|||
|
|
|||
|
|
|||
|
.xlist
|
|||
|
.xcref
|
|||
|
INCLUDE DOSSYM.ASM
|
|||
|
INCLUDE DEVSYM.ASM
|
|||
|
INCLUDE COMSEG.ASM
|
|||
|
INCLUDE COMSW.ASM
|
|||
|
.list
|
|||
|
.cref
|
|||
|
|
|||
|
INCLUDE COMEQU.ASM
|
|||
|
|
|||
|
DATARES SEGMENT PUBLIC
|
|||
|
EXTRN ECHOFLAG:BYTE
|
|||
|
DATARES ENDS
|
|||
|
|
|||
|
TRANDATA SEGMENT PUBLIC
|
|||
|
EXTRN SUREMES:BYTE,NOTFND:BYTE,ECHOMES:BYTE,CTRLCMES:BYTE
|
|||
|
EXTRN ONMES:BYTE,OFFMES:BYTE,VERIMES:BYTE,BAD_ON_OFF:BYTE
|
|||
|
EXTRN VOLMES:BYTE,GOTVOL:BYTE,NOVOL:BYTE,WeekTab:BYTE
|
|||
|
EXTRN CurDat_Mid:BYTE
|
|||
|
TRANDATA ENDS
|
|||
|
|
|||
|
TRANSPACE SEGMENT PUBLIC
|
|||
|
EXTRN RESSEG:WORD,CURDRV:BYTE,DIRBUF:BYTE,CHARBUF:BYTE
|
|||
|
TRANSPACE ENDS
|
|||
|
|
|||
|
TRANCODE SEGMENT PUBLIC BYTE
|
|||
|
|
|||
|
EXTRN PRINT:NEAR,SCANOFF:NEAR,CRLF2:NEAR,RESTUDIR:NEAR,CERROR:NEAR
|
|||
|
EXTRN CRPRINT:NEAR,OUT:NEAR,ZPRINT:NEAR
|
|||
|
EXTRN ERROR_PRINT:NEAR,MesTran:NEAR,P_Date:NEAR
|
|||
|
|
|||
|
IF KANJI
|
|||
|
EXTRN TESTKANJ:NEAR
|
|||
|
ENDIF
|
|||
|
PUBLIC NOTEST2,ECHO,CNTRLC,VERIFY,PRINTVOL,GetDate,PRINT_DATE
|
|||
|
|
|||
|
ASSUME CS:TRANGROUP,DS:TRANGROUP,ES:TRANGROUP,SS:NOTHING
|
|||
|
|
|||
|
;***************************************
|
|||
|
; ARE YOU SURE prompt when deleting *.*
|
|||
|
|
|||
|
NOTEST2:
|
|||
|
MOV CX,11
|
|||
|
MOV SI,FCB+1
|
|||
|
AMBSPEC:
|
|||
|
LODSB
|
|||
|
CMP AL,"?"
|
|||
|
JNZ ALLFIL
|
|||
|
LOOP AMBSPEC
|
|||
|
ALLFIL:
|
|||
|
CMP CX,0
|
|||
|
JNZ NOPRMPT
|
|||
|
ASKAGN:
|
|||
|
MOV DX,OFFSET TRANGROUP:SUREMES ; "Are you sure (Y/N)?"
|
|||
|
CALL PRINT
|
|||
|
MOV SI,80H
|
|||
|
MOV DX,SI
|
|||
|
MOV WORD PTR [SI],120 ; zero length
|
|||
|
MOV AX,(STD_CON_INPUT_FLUSH SHL 8) OR STD_CON_STRING_INPUT
|
|||
|
INT int_command
|
|||
|
LODSW
|
|||
|
OR AH,AH
|
|||
|
JZ ASKAGN
|
|||
|
CALL SCANOFF
|
|||
|
OR AL,20H ; Convert to lower case
|
|||
|
CMP AL,'n'
|
|||
|
JZ RETERA
|
|||
|
CMP AL,'y'
|
|||
|
PUSHF
|
|||
|
CALL CRLF2
|
|||
|
POPF
|
|||
|
JNZ ASKAGN
|
|||
|
NOPRMPT:
|
|||
|
MOV AH,FCB_DELETE
|
|||
|
MOV DX,FCB
|
|||
|
INT int_command
|
|||
|
PUSH AX
|
|||
|
CALL RESTUDIR
|
|||
|
POP AX
|
|||
|
MOV DX,OFFSET TRANGROUP:NOTFND
|
|||
|
INC AL
|
|||
|
JZ CERRORJ
|
|||
|
RETERA:
|
|||
|
RET
|
|||
|
|
|||
|
|
|||
|
;************************************************
|
|||
|
; ECHO, BREAK, and VERIFY commands. Check for "ON" and "OFF"
|
|||
|
|
|||
|
ECHO:
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
CALL ON_OFF
|
|||
|
JC DOEMES
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
JNZ ECH_OFF
|
|||
|
MOV [ECHOFLAG],1
|
|||
|
RET
|
|||
|
ECH_OFF:
|
|||
|
MOV [ECHOFLAG],0
|
|||
|
RET
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
DOEMES:
|
|||
|
MOV AL,BYTE PTR DS:[80H]
|
|||
|
CMP AL,2
|
|||
|
JB PECHO ; Gota have at least 2 characters
|
|||
|
MOV DX,82H ; Skip one char after "ECHO"
|
|||
|
CALL CRPRINT
|
|||
|
JMP CRLF2
|
|||
|
|
|||
|
PECHO:
|
|||
|
MOV DS,[RESSEG]
|
|||
|
ASSUME DS:RESGROUP
|
|||
|
MOV BL,[ECHOFLAG]
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
ASSUME DS:TRANGROUP
|
|||
|
MOV DX,OFFSET TRANGROUP:ECHOMES
|
|||
|
JMP SHORT PYN
|
|||
|
|
|||
|
|
|||
|
CERRORJ:
|
|||
|
JMP CERROR
|
|||
|
|
|||
|
; is rest of line blank?
|
|||
|
IsBlank:
|
|||
|
MOV SI,81h ; point at text spot
|
|||
|
CALL SCANOFF ; skip separators
|
|||
|
SUB SI,81h ; number of characters advanced
|
|||
|
MOV CX,SI ; put count in byte addressable spot
|
|||
|
CMP CL,DS:[80h] ; compare with count
|
|||
|
return ; bye!
|
|||
|
|
|||
|
;The BREAK command
|
|||
|
CNTRLC:
|
|||
|
CALL ON_OFF
|
|||
|
MOV AX,(SET_CTRL_C_TRAPPING SHL 8) OR 1
|
|||
|
JC PCNTRLC
|
|||
|
JNZ CNTRLC_OFF
|
|||
|
MOV DL,1
|
|||
|
INT int_command ; Set ^C
|
|||
|
RET
|
|||
|
CNTRLC_OFF:
|
|||
|
XOR DL,DL
|
|||
|
INT int_command ; Turn off ^C check
|
|||
|
RET
|
|||
|
|
|||
|
PCNTRLC:
|
|||
|
CALL IsBlank ; rest of line blank?
|
|||
|
JNZ CERRORJ ; no, oops!
|
|||
|
XOR AL,AL
|
|||
|
INT int_command
|
|||
|
MOV BL,DL
|
|||
|
MOV DX,OFFSET TRANGROUP:CTRLCMES
|
|||
|
PYN:
|
|||
|
CALL PRINT
|
|||
|
MOV DX,OFFSET TRANGROUP:ONMES
|
|||
|
OR BL,BL
|
|||
|
JNZ PRINTVAL
|
|||
|
MOV DX,OFFSET TRANGROUP:OFFMES
|
|||
|
PRINTVAL:
|
|||
|
JMP PRINT
|
|||
|
|
|||
|
VERIFY:
|
|||
|
CALL ON_OFF
|
|||
|
MOV AX,(SET_VERIFY_ON_WRITE SHL 8) OR 1
|
|||
|
JC PVERIFY
|
|||
|
JNZ VER_OFF
|
|||
|
INT int_command ; Set verify
|
|||
|
RET
|
|||
|
VER_OFF:
|
|||
|
DEC AL
|
|||
|
INT int_command ; Turn off verify after write
|
|||
|
RET
|
|||
|
|
|||
|
PVERIFY:
|
|||
|
CALL IsBlank ; is rest of line blank?
|
|||
|
JNZ CERRORJ ; nope...
|
|||
|
MOV AH,GET_VERIFY_ON_WRITE
|
|||
|
INT int_command
|
|||
|
MOV BL,AL
|
|||
|
MOV DX,OFFSET TRANGROUP:VERIMES
|
|||
|
JMP PYN
|
|||
|
|
|||
|
ON_OFF:
|
|||
|
MOV SI,FCB+1
|
|||
|
LODSB
|
|||
|
OR AL,20H
|
|||
|
CMP AL,'o'
|
|||
|
JNZ BADONF
|
|||
|
LODSW
|
|||
|
OR AX,2020H ; Convert to lower case
|
|||
|
CMP AL,'n'
|
|||
|
JNZ OFFCHK
|
|||
|
CMP AH,' ' ; ' ' ORed with 20H is still ' '
|
|||
|
JNZ BADONF
|
|||
|
RET ; Carry clear from CMP
|
|||
|
OFFCHK:
|
|||
|
CMP AX,6666H ; 'ff'
|
|||
|
JNZ BADONF
|
|||
|
LODSB
|
|||
|
CMP AL,' '
|
|||
|
JNZ BADONF
|
|||
|
INC AL ; Reset zero Carry clear from CMP
|
|||
|
RET
|
|||
|
BADONF:
|
|||
|
MOV DX,OFFSET TRANGROUP:BAD_ON_OFF
|
|||
|
STC
|
|||
|
RET
|
|||
|
|
|||
|
;********************************
|
|||
|
; Print volume ID info
|
|||
|
|
|||
|
ASSUME DS:TRANGROUP,ES:TRANGROUP
|
|||
|
|
|||
|
PRINTVOL:
|
|||
|
PUSH AX ; AX return from SEARCH_FIRST for VOL ID
|
|||
|
MOV DX,OFFSET TRANGROUP:VOLMES
|
|||
|
CALL PRINT
|
|||
|
MOV AL,DS:[FCB]
|
|||
|
ADD AL,'@'
|
|||
|
CMP AL,'@'
|
|||
|
JNZ DRVOK
|
|||
|
MOV AL,[CURDRV]
|
|||
|
ADD AL,'A'
|
|||
|
DRVOK:
|
|||
|
CALL OUT
|
|||
|
POP AX
|
|||
|
OR AL,AL
|
|||
|
JZ GOODVOL
|
|||
|
MOV DX,OFFSET TRANGROUP:NOVOL
|
|||
|
CALL PRINT
|
|||
|
JMP CRLF2
|
|||
|
GOODVOL:
|
|||
|
MOV DX,OFFSET TRANGROUP:GOTVOL
|
|||
|
CALL PRINT
|
|||
|
MOV SI,OFFSET TRANGROUP:DIRBUF + 8
|
|||
|
MOV CX,11
|
|||
|
MOV DI,OFFSET TRANGROUP:CHARBUF
|
|||
|
MOV DX,DI
|
|||
|
REP MOVSB
|
|||
|
MOV AX,0A0DH
|
|||
|
STOSW
|
|||
|
XOR AX,AX
|
|||
|
STOSB
|
|||
|
JMP ZPRINT
|
|||
|
|
|||
|
;*************************************************************************
|
|||
|
; print date
|
|||
|
PRINT_DATE:
|
|||
|
PUSH ES
|
|||
|
PUSH DI
|
|||
|
PUSH CS
|
|||
|
POP ES
|
|||
|
MOV DI,OFFSET TRANGROUP:CHARBUF
|
|||
|
MOV AH,GET_DATE
|
|||
|
INT int_command ; Get date in CX:DX
|
|||
|
CBW
|
|||
|
CALL GetDate ; get date and put into DI
|
|||
|
MOV AL," "
|
|||
|
STOSB
|
|||
|
MOV SI,OFFSET TRANGROUP:CURDAT_MID
|
|||
|
CALL MESTRAN
|
|||
|
CALL P_DATE
|
|||
|
XOR AX,AX
|
|||
|
STOSB
|
|||
|
MOV DX,OFFSET TRANGROUP:CHARBUF
|
|||
|
CALL ZPRINT
|
|||
|
POP ES
|
|||
|
POP DI
|
|||
|
return
|
|||
|
|
|||
|
GetDate:
|
|||
|
MOV SI,AX
|
|||
|
SHL SI,1
|
|||
|
ADD SI,AX ; SI=AX*3
|
|||
|
ADD SI,OFFSET TRANGROUP:WEEKTAB
|
|||
|
MOV BX,CX
|
|||
|
MOV CX,3
|
|||
|
REP MOVSB
|
|||
|
return
|
|||
|
|
|||
|
TRANCODE ENDS
|
|||
|
END
|
|||
|
|