You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
526 lines
16 KiB
526 lines
16 KiB
PAGE 60,132;
|
|
title EDLIN Messages
|
|
;/*
|
|
; * Microsoft Confidential
|
|
; * Copyright (C) Microsoft Corporation 1991
|
|
; * All Rights Reserved.
|
|
; */
|
|
;======================= START OF SPECIFICATIONS =========================
|
|
;
|
|
; MODULE NAME: EDLMES.SAL
|
|
;
|
|
; DESCRIPTIVE NAME: MESSAGE RETRIEVER INTERFACE MODULE
|
|
;
|
|
; FUNCTION: THIS MODULE PROVIDES AN INTERFACE FOR THE MODULES THAT ARE
|
|
; NEEDED TO INVOKE THE MESSAGE RETRIEVER.
|
|
;
|
|
; ENTRY POINT: PRINTF
|
|
;
|
|
; INPUT: OFFSET CARRIED IN DX TO APPLICABLE MESSAGE TABLE
|
|
;
|
|
; EXIT NORMAL: NO CARRY
|
|
;
|
|
; EXIT ERROR : CARRY
|
|
;
|
|
; INTERNAL REFERENCES:
|
|
;
|
|
; ROUTINE: PRINTF - PROVIDES THE ORIGINAL INTERFACE FOR THE ORIGINAL
|
|
; PRINTF USED PRIOR TO VERSION 4.00. PRINTS MESSAGES.
|
|
;
|
|
; DISP_MESSAGE - BUILDS THE REGISTERS NECESSARY FOR INVOCATION
|
|
; OF THE MESSAGE RETRIEVER, BASED ON THE TABLE
|
|
; POINTED TO BY DX.
|
|
;
|
|
; DISP_FATAL - INVOKED IF AN ERROR OCCURS (CARRY) IN THE
|
|
; MESSAGE RETRIEVER. IT DISPLAYS THE APPROPRIATE
|
|
; MESSAGE.
|
|
;
|
|
; EXTERNAL REFERENCES:
|
|
;
|
|
; ROUTINE: SYSLOADMSG - LOAD MESSAGES FOR THE MESSAGE RETRIEVER
|
|
; SYSDISPMSG - DISPLAYS THE REQUESTED MESSAGE
|
|
;
|
|
; NOTES: THIS MODULE IS TO BE PREPPED BY SALUT WITH THE "PR" OPTIONS
|
|
; LINK EDLIN+EDLCMD1+EDLCMD2+EDLMES+EDLPARSE
|
|
;
|
|
; REVISION HISTORY:
|
|
;
|
|
; AN000 VERSION DOS 4.00 - IMPLEMENTATION OF MESSAGE RETRIEVER
|
|
;
|
|
; COPYRIGHT: "MS DOS EDLIN UTILITY"
|
|
; "VERSION 4.00 (C) COPYRIGHT 1988 Microsoft"
|
|
; "LICENSED MATERIAL - PROPERTY OF Microsoft "
|
|
;
|
|
; MICROSOFT REVISION HISTORY
|
|
;
|
|
; MODIFIED BY: AARON R
|
|
; M.A. U
|
|
; N. P
|
|
;======================= END OF SPECIFICATIONS ===========================
|
|
|
|
.xlist
|
|
|
|
include sysmsg.inc ;an000;message retriever
|
|
|
|
msg_utilname <EDLIN> ;an000;EDLIN messages
|
|
.list
|
|
;-----------------------------------------------------------------------;
|
|
; ;
|
|
; Done for Vers 2.00 (rev 9) by Aaron R ;
|
|
; Update for rev. 11 by M.A. U ;
|
|
; Printf for 2.5 by Nancy P ;
|
|
; ;
|
|
;-----------------------------------------------------------------------;
|
|
|
|
;=========================================================================
|
|
; revised edlmes.asm
|
|
;=========================================================================
|
|
|
|
fatal_error equ 30 ;an000;fatal message handler
|
|
unlim_width equ 00h ;an000;unlimited output width
|
|
pad_blank equ 20h ;an000;blank pad
|
|
pre_load equ 00h ;an000;normal pre-load
|
|
|
|
|
|
|
|
|
|
message_table struc ;an000;struc for message table
|
|
|
|
entry1 dw 0 ;an000;message number
|
|
entry2 db 0 ;an000;message type
|
|
entry3 dw 0 ;an000;display handle
|
|
entry4 dw 0 ;an000;pointer to sublist
|
|
entry5 dw 0 ;an000;substitution count
|
|
entry6 db 0 ;an000;use keyb input?
|
|
entry7 dw 0 ;an000;keyb buffer to use
|
|
|
|
message_table ends ;an000;end struc
|
|
|
|
;=========================================================================
|
|
; macro disp_message: this macro takes a pointer to a message table
|
|
; and displays the applicable message based on
|
|
; the table's contents.
|
|
; this is to provide an interface into the module
|
|
; of the message retriever, SYSDISPMSG.
|
|
;
|
|
; Date : 6/11/87
|
|
;=========================================================================
|
|
|
|
disp_message macro tbl ;an000;display message macro
|
|
|
|
push bx ;an000;
|
|
push cx ;an000;
|
|
push dx ;an000;
|
|
push di ;an000;
|
|
push si ;an000;
|
|
|
|
push tbl ;an000;exchange tbl with si
|
|
pop si ;an000;exchanged
|
|
|
|
mov ax,[si].entry1 ;an000;move message number
|
|
mov bx,[si].entry3 ;an000;display handle
|
|
mov cx,[si].entry5 ;an000;number of subs
|
|
mov dl,[si].entry6 ;an000;function type
|
|
mov di,[si].entry7 ;an000;input buffer if appl.
|
|
mov dh,[si].entry2 ;an000;message type
|
|
mov si,[si].entry4 ;an000;sublist
|
|
|
|
call sysdispmsg ;an000;display the message
|
|
|
|
pop si ;an000;restore affected regs
|
|
pop di ;an000;
|
|
pop dx ;an000;
|
|
pop cx ;an000;
|
|
pop bx ;an000;
|
|
|
|
endm ;an000;end macro disp_message
|
|
|
|
;=========================================================================
|
|
; macro disp_message: end macro
|
|
;=========================================================================
|
|
|
|
CODE SEGMENT PUBLIC BYTE
|
|
CODE ENDS
|
|
|
|
CONST SEGMENT PUBLIC BYTE
|
|
CONST ENDS
|
|
|
|
cstack segment stack
|
|
cstack ends
|
|
|
|
DATA SEGMENT PUBLIC BYTE
|
|
|
|
extrn path_name:byte
|
|
|
|
DATA ENDS
|
|
|
|
DG GROUP CODE,CONST,cstack,DATA
|
|
|
|
code segment public byte ;an000;code segment
|
|
assume cs:dg,ds:dg,es:dg,ss:CStack ;an000;
|
|
|
|
public printf ;an000;share printf
|
|
public disp_fatal ;an000;fatal error display
|
|
public pre_load_message ;an000;message loader
|
|
|
|
.xlist
|
|
msg_services <MSGDATA> ;an000;
|
|
.list
|
|
|
|
;======================= sysmsg.inc invocation ===========================
|
|
;
|
|
; include sysmsg.inc - message retriever services
|
|
;
|
|
;
|
|
; options selected:
|
|
; NEARmsg
|
|
; DISPLAYmsg
|
|
; LOADmsg
|
|
; CHARmsg
|
|
; NUMmsg
|
|
; CLSAmsg
|
|
; CLSBmsg
|
|
; CLSCmsg
|
|
;
|
|
;=========================================================================
|
|
|
|
.xlist
|
|
|
|
msg_services <LOADmsg> ;an000;no version check
|
|
msg_services <DISPLAYmsg,CHARmsg,NUMmsg,INPUTmsg> ;an000;display messages
|
|
msg_services <EDLIN.CLA,EDLIN.CLB,EDLIN.CLC> ;an000;message types
|
|
msg_services <EDLIN.CL1,EDLIN.CL2> ;an000;message types
|
|
msg_services <EDLIN.CTL> ;an000;
|
|
|
|
.list
|
|
|
|
;=========================================================================
|
|
; printf: printf is a replacement of the printf procedure used in DOS
|
|
; releases prior to 4.00. printf invokes the macro disp_message
|
|
; to display a message through the new message handler. the
|
|
; interface into printf will continue to be a pointer to a message
|
|
; passed in DX. the pointer is pointing to more than a message
|
|
; now. it is pointing to a table for that message containing
|
|
; all relevant information for printing the message. the macro
|
|
; disp_message operates on these tables.
|
|
;
|
|
; Date : 6/11/87
|
|
;=========================================================================
|
|
|
|
printf proc near ;an000;printf procedure
|
|
|
|
disp_message dx ;an000;display a message
|
|
; $if c ;an000;if an error occurred
|
|
JNC $$IF1
|
|
call disp_fatal ;an000;display the fatal error
|
|
; $endif ;an000;
|
|
$$IF1:
|
|
|
|
ret ;an000;return to caller
|
|
|
|
printf endp ;an000;end printf proc
|
|
|
|
|
|
;=========================================================================
|
|
; disp_fatal: this routine displays a fatal error message in the event
|
|
; an error occurred in disp_message.
|
|
;
|
|
; Date : 6/11/87
|
|
;=========================================================================
|
|
|
|
disp_fatal proc near ;an000;fatal error message
|
|
|
|
mov ax,fatal_error ;an000;fatal_error number
|
|
mov bx,stdout ;an000;print to console
|
|
mov cx,0 ;an000;no parameters
|
|
mov dl,no_input ;an000;no keyboard input
|
|
mov dh,UTILITY_MSG_CLASS ;an000;utility messages
|
|
|
|
call sysdispmsg ;an000;display fatal error
|
|
|
|
ret ;an000;return to caller
|
|
|
|
disp_fatal endp ;an000;end disp_fatal proc
|
|
|
|
;=========================================================================
|
|
; PRE_LOAD_MESSAGE : This routine provides access to the messages required
|
|
; by EDLIN. This routine will report if the load was
|
|
; successful. An unsuccessful load will cause EDLIN
|
|
; to terminate with an appropriate error message.
|
|
;
|
|
; Date : 6/11/87
|
|
;=========================================================================
|
|
|
|
PRE_LOAD_MESSAGE proc near ;an000;pre-load messages
|
|
|
|
|
|
call SYSLOADMSG ;an000;invoke loader
|
|
|
|
; $if c ;an000;if an error
|
|
JNC $$IF3
|
|
pushf ;an000;save flags
|
|
call SYSDISPMSG ;an000;let him say why
|
|
popf ;an000;restore flags
|
|
; $endif ;an000;
|
|
$$IF3:
|
|
|
|
ret ;an000;return to caller
|
|
|
|
PRE_LOAD_MESSAGE endp ;an000;end proc
|
|
|
|
include msgdcl.inc
|
|
|
|
code ends ;an000;end code segment
|
|
|
|
|
|
|
|
|
|
CONST SEGMENT PUBLIC BYTE
|
|
|
|
extrn arg_buf:byte ;an000;
|
|
extrn line_num:byte ;an000;
|
|
extrn line_flag:byte ;an000;
|
|
extrn Temp_Path:byte ;an000;
|
|
|
|
public baddrv,opt_err_ptr,nobak
|
|
public simple_msg
|
|
public msg_too_many,dskful,memful_ptr,badcom
|
|
public nodir,filenm_ptr,newfil,read_err_ptr
|
|
public nosuch,toolng,eof,dest
|
|
public mrgerr,ro_err,bcreat,ndname
|
|
public dsp_options,dsp_help,num_help_msgs
|
|
public ask_ptr,qmes_ptr,msg_crlf,msg_lf
|
|
public prompt
|
|
public line_num_buf_ptr ;an000;DMS:6/15/87
|
|
public arg_buf_ptr ;an000;DMS:6/15/87
|
|
public cont_ptr ;an000;DMS:6/18/87
|
|
public cp_err ;an000;DMS:6/22/87
|
|
public Del_Bak_Ptr ;an000;dms;
|
|
|
|
;============== REPLACEABLE PARAMETER SUBLIST STRUCTURE ==================
|
|
;
|
|
; byte 1 - substitution list size, always 11
|
|
; byte 2 - reserved for use by message handler
|
|
; byte 3 - pointer to parameter to be used as a substitution
|
|
; byte 7 - which parameter is this to replace, %1, %2, etc.
|
|
; byte 8 - determines how the parameter is to be output
|
|
; byte 9 - determines the maximum width of the parameter string
|
|
; byte 10 - determines the minimum width of the parameter string
|
|
; byte 11 - define what is to be used as a pad character
|
|
;
|
|
;=========================================================================
|
|
|
|
;=========================================================================
|
|
; replaceable parameter sublists
|
|
;=========================================================================
|
|
|
|
ed_read_sub label dword ;an000;a read error occurred
|
|
|
|
db 11 ;an000;sublist size
|
|
db 00 ;an000;reserved
|
|
dd dg:path_name ;an000;pointer to parameter
|
|
db 01 ;an000;parm 1
|
|
db Char_Field_ASCIIZ ;an000;left align/asciiz/char.
|
|
db unlim_width ;an000;unlimited width
|
|
db 00 ;an000;minimum width of 0
|
|
db pad_blank ;an000;pad with blanks
|
|
|
|
arg_sub label dword ;an000;line output buffer
|
|
|
|
db 11 ;an000;sublist size
|
|
db 00 ;an000;reserved
|
|
dd dg:arg_buf ;an000;pointer to parameter
|
|
db 01 ;an000;parm 1
|
|
db Char_Field_ASCIIZ ;an000;left align/asciiz/char.
|
|
db unlim_width ;an000;unlimited width
|
|
db 00 ;an000;minimum width of 0
|
|
db pad_blank ;an000;pad with blank
|
|
|
|
num_sub label dword ;an000;line number
|
|
|
|
db 11 ;an000;sublist size
|
|
db 00 ;an000;reserved
|
|
dd dg:line_num ;an000;pointer to parameter
|
|
db 01 ;an000;parm 1
|
|
db Right_Align+Unsgn_Bin_Word ;an000;right align/decimal
|
|
db 08 ;an000;maximum width
|
|
db 08 ;an000;minimum width of 0
|
|
db pad_blank ;an000;pad with blank
|
|
|
|
db 11 ;an000;optional flag
|
|
db 00 ;an000;reserved
|
|
dd dg:line_flag ;an000;pointer to parameter
|
|
db 02 ;an000;parm 2
|
|
db Char_Field_Char ;an000;character
|
|
db 01 ;an000;minimum width of 1
|
|
db 01 ;an000;maximum width of 1
|
|
db pad_blank ;an000;pad with blank
|
|
|
|
BAK_Sub label dword ;an000;line output buffer
|
|
|
|
db 11 ;an000;sublist size
|
|
db 00 ;an000;reserved
|
|
dd dg:Temp_Path ;an000;pointer to parameter
|
|
db 00 ;an000;parm 0
|
|
db Char_Field_ASCIIZ ;an000;left align/asciiz/char.
|
|
db unlim_width ;an000;unlimited width
|
|
db 00 ;an000;minimum width of 0
|
|
db pad_blank ;an000;pad with blank
|
|
|
|
|
|
;=========================================================================
|
|
; end replaceable parameter sublists
|
|
;=========================================================================
|
|
|
|
;======================= TABLE STRUCTURE =================================
|
|
;
|
|
; bute 1-2 : message number of message to be displayed
|
|
; byte 3 : message type to be used, i.e.;class 1, utility, etc.
|
|
; byte 4-5 : display handle, i.e.; console, printer, etc.
|
|
; byte 6-7 : pointer to substitution list, if any.
|
|
; byte 8-9 : number of replaceable parameters, if any.
|
|
; byte 10 : type of input from keyboard, if any.
|
|
; byte 11-12: pointer to buffer for keyboard input, if any.
|
|
;
|
|
;=========================================================================
|
|
|
|
; a bunch of common messages (class=UTILITY_MSG_CLASS, dest=stdout,
|
|
; no inputs or sublists) are passed
|
|
; through absolute message numbers rather
|
|
; than duplicating the data structure for
|
|
; each one.
|
|
|
|
prompt = 0006 ; "*"
|
|
baddrv = 0007 ; "Invalid drive or file name"
|
|
ndname = 0008 ;"File name must be
|
|
;specified",0d,0a,0
|
|
ro_err = 0010 ;"File is READ-ONLY",0d,0a,0
|
|
bcreat = 0011 ;"File Creation Error",0d,0a,0
|
|
msg_too_many = 0012 ;"Too many files open",0d,0a,0
|
|
nobak = 0014 ;"Cannot edit .BAK file
|
|
;--rename file",0d,0a,0
|
|
nodir = 0015 ;"No room in directory
|
|
;for file",0d,0d,0
|
|
dskful = 0016 ;"Disk full. Edits lost.",0d,0a,0
|
|
badcom = 0018 ;"Entry error",0d,0a,0
|
|
newfil = 0019 ;"New file",0d,0a,0
|
|
nosuch = 0020 ;"Not found",0d,0a,0
|
|
toolng = 0022 ;"Line too long",0d,0a,0
|
|
eof = 0023 ;"End of input file",0d,0a,0
|
|
dest = 0025 ;"Must specify destination
|
|
;line number",0d,0a,0
|
|
mrgerr = 0026 ;"Not enough room to
|
|
;merge the entire file",0d,0a,0
|
|
msg_crlf = 0027 ;0d,0a,0
|
|
msg_lf = 0028 ;0a,0
|
|
cp_err = 0033 ;"Cannot merge - Code page
|
|
; mismatch",0d,0a
|
|
dsp_options = 0300 ; display options
|
|
dsp_help = 0301 ; display help
|
|
num_help_msgs = 7
|
|
|
|
simple_msg label word
|
|
dw 0000 ; message number (supplied as used)
|
|
db UTILITY_MSG_CLASS ; utility message
|
|
dw stdout ; display handle
|
|
dw 00 ; no sublist
|
|
dw 00 ; no sub
|
|
db no_input ; no keyboard input
|
|
dw 00 ; no keyboard buffer
|
|
|
|
|
|
opt_err_ptr label word ;an000;"Invalid parameter",0d,0a,0
|
|
dw 0010 ;an000;message number
|
|
db Parse_Err_Class ;an000;utility message
|
|
dw StdErr ;an000;display handle
|
|
dw 00 ;an000;no sublist
|
|
dw 00 ;an000;no sub
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
read_err_ptr label word ;an000;"Read error in:",
|
|
;an000;0d,0a,"%1",0d,0a,0
|
|
dw 0013 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw dg:ed_read_sub ;an000;point to sublist
|
|
dw 0001 ;an000;1 sub
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
memful_ptr label word ;an000;"Insufficient memory",0d,0a,0
|
|
dw 0008 ;an000;message number
|
|
db Ext_Err_Class ;an000;extended error
|
|
dw stderr ;an000;display handle
|
|
dw 00 ;an000;no sublist
|
|
dw 00 ;an000;no sub
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
filenm_ptr label word ;an000;"File not found",0d,0a
|
|
dw 0002 ;an000;message number
|
|
db Ext_Err_Class ;an000;utility message
|
|
dw stderr ;an000;display handle
|
|
dw 00 ;an000;no sublist
|
|
dw 00 ;an000;no sub
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
ask_ptr label word ;an000;"O.K.? ",0
|
|
dw 0021 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw 00 ;an000;no sub
|
|
dw 00 ; no sublist
|
|
db DOS_KEYB_INP ;an000;keyboard input - AX
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
qmes_ptr label word ;an000;"Abort edit (Y/N)? ",0
|
|
dw 0024 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw 00 ;an000;no sublist
|
|
dw 00 ;an000;no sub
|
|
db DOS_KEYB_INP ;an000;keyboard input - AX
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
cont_ptr label word ;an000;"Continue (Y/N)?"
|
|
dw 0029 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw 00 ;an000;no sublist
|
|
dw 00 ;an000;no sub
|
|
db DOS_KEYB_INP ;an000;keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
arg_buf_ptr label word ;an000;argument buffer for
|
|
; line output
|
|
dw 0031 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw dg:arg_sub ;an000;argument sublist
|
|
dw 01 ;an000;1 sub
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
line_num_buf_ptr label word ;an000;holds line numbers
|
|
dw 0032 ;an000;message number
|
|
db UTILITY_MSG_CLASS ;an000;utility message
|
|
dw stdout ;an000;display handle
|
|
dw dg:num_sub ;an000;argument sublist
|
|
dw 02 ;an000;2 subs
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
del_bak_ptr label word ;an000;"Access Denied - xxxxxxxx.BAK"
|
|
dw 0005 ;an000;message number
|
|
db Ext_Err_Class ;an000;utility message
|
|
dw stderr ;an000;display handle
|
|
dw dg:BAK_Sub ;an000;no sublist
|
|
dw 01 ;an000;no subs
|
|
db no_input ;an000;no keyboard input
|
|
dw 00 ;an000;no keyboard buffer
|
|
|
|
CONST ENDS
|
|
END
|
|
|