summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/MODE
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/CMD/MODE')
-rw-r--r--v4.0/src/CMD/MODE/COMMON.STC36
-rw-r--r--v4.0/src/CMD/MODE/DISPLAY.ASM181
-rw-r--r--v4.0/src/CMD/MODE/INVOKE.ASM1549
-rw-r--r--v4.0/src/CMD/MODE/MAIN.ASM168
-rw-r--r--v4.0/src/CMD/MODE/MAKEFILE130
-rw-r--r--v4.0/src/CMD/MODE/MODE.LNK17
-rw-r--r--v4.0/src/CMD/MODE/MODE.SKL193
-rw-r--r--v4.0/src/CMD/MODE/MODECOM.ASM592
-rw-r--r--v4.0/src/CMD/MODE/MODECP.ASM1279
-rw-r--r--v4.0/src/CMD/MODE/MODECPEQ.INC365
-rw-r--r--v4.0/src/CMD/MODE/MODECPMS.INC157
-rw-r--r--v4.0/src/CMD/MODE/MODECPRO.INC88
-rw-r--r--v4.0/src/CMD/MODE/MODEDEFS.INC749
-rw-r--r--v4.0/src/CMD/MODE/MODEECHO.ASM482
-rw-r--r--v4.0/src/CMD/MODE/MODELENG.ASM290
-rw-r--r--v4.0/src/CMD/MODE/MODEMES.ASM145
-rw-r--r--v4.0/src/CMD/MODE/MODEPARS.ASM4625
-rw-r--r--v4.0/src/CMD/MODE/MODEPRIN.ASM1096
-rw-r--r--v4.0/src/CMD/MODE/MODEQUAT.INC48
-rw-r--r--v4.0/src/CMD/MODE/MODESCRN.ASM564
-rw-r--r--v4.0/src/CMD/MODE/MODESUBS.INC598
-rw-r--r--v4.0/src/CMD/MODE/MODEVID.ASM614
-rw-r--r--v4.0/src/CMD/MODE/PARSHELL.ASM30
-rw-r--r--v4.0/src/CMD/MODE/RESCODE.ASM719
-rw-r--r--v4.0/src/CMD/MODE/SCRNTAB.ASM121
-rw-r--r--v4.0/src/CMD/MODE/TYPAMAT.ASM263
26 files changed, 15099 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/COMMON.STC b/v4.0/src/CMD/MODE/COMMON.STC
new file mode 100644
index 0000000..1212c55
--- /dev/null
+++ b/v4.0/src/CMD/MODE/COMMON.STC
@@ -0,0 +1,36 @@
1;common structures
2
3bogus EQU 88H ;totally invalid value
4
5codepage_parms STRUC
6 cp_device DW ?
7 des_pack_ptr DW ?
8 font_filespec DW ?
9 request_typ DW ?
10codepage_parms ENDS
11
12
13parm_list_entry STRUC ;used by parse_parameters and invoke
14
15parm_type DB bogus
16item_tag DB 0FFH
17value1 DW bogus ;used only for filespecs and code page numbers
18value2 DW bogus ;used only for filespecs and code page numbers
19keyword_switch_ptr DW 0
20
21parm_list_entry ENDS
22
23
24sublist_def STRUC ;used by initialize_sublists
25
26 db ? ;Sublist Length, fixed
27 db ? ;Reserved, not used yet ;AN000;
28sublist_off dw ? ;offset
29sublist_seg dw ? ;segment part of pointer to piece of message
30 db ? ;ID, special end of message format ;AN000;
31 db ? ;flags
32 db ?
33 db ?
34 db ?
35
36sublist_def ENDS
diff --git a/v4.0/src/CMD/MODE/DISPLAY.ASM b/v4.0/src/CMD/MODE/DISPLAY.ASM
new file mode 100644
index 0000000..870110f
--- /dev/null
+++ b/v4.0/src/CMD/MODE/DISPLAY.ASM
@@ -0,0 +1,181 @@
1;m
2PRINTF_CODE SEGMENT PUBLIC
3
4ASSUME CS:PRINTF_CODE, DS:PRINTF_CODE, ES:PRINTF_CODE, SS:PRINTF_CODE
5
6
7;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
8;º º
9
10PUBLIC initialize_sublists
11
12;º º
13;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
14
15;*****************************************************************************
16; External Declarations
17;*****************************************************************************
18;
19
20EXTRN first_sublist:BYTE
21EXTRN number_of_sublists:ABS
22EXTRN SysDispMsg:Near
23
24
25
26
27
28
29;
30;***************************************************************************
31; Message Structures
32;***************************************************************************
33;
34
35
36Message_Table struc ; ;AN000;
37 ;
38Entry1 dw 0 ; ;AN000;
39Entry2 dw 0 ; ;AN000;
40Entry3 dw 0 ; ;AN000;
41Entry4 dw 0 ; ;AN000;
42Entry5 db 0 ; ;AN000;
43Entry6 db 0 ; ;AN000;
44Entry7 dw 0 ; ;AN000;
45 ;
46Message_Table ends ; ;AN000;
47
48include common.stc ;contains the following structure
49
50;sublist_def STRUC
51
52; db ? ;Sublist Length, fixed
53; db ? ;Reserved, not used yet ;AN000;
54; dw ? ;offset
55;sublist_seg dw ? ;segment part of pointer to piece of message
56; db ? ;ID, special end of message format ;AN000;
57; db ? ;flags
58; db ?
59; db ?
60; db ?
61
62;sublist_def ENDS
63
64;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
65
66;³ INITIALIZE_SUBLISTS
67;³ -------------------
68;³ A .COM file cannot have references to segments in it at EXE2BIN time so
69;³ the segment part of pointers to pieces of messages in sublist blocks must
70;³ be done at execution time. This routine does that for all sublists.
71
72
73;³ INPUT:
74
75
76
77
78
79
80
81;³ RETURN:
82
83
84;³ MESSAGES: none
85
86
87
88;³ REGISTER
89;³ USAGE AND
90;³ COMVENTIONS:
91
92
93
94;³ ASSUMPTIONS:
95
96
97;³ SIDE EFFECT:
98
99
100;³ ùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù
101
102;³ BEGIN
103;³ ³
104;³ END ³
105
106;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
107
108initialize_sublists PROC NEAR ;AN000;
109
110MOV CX,number_of_sublists ;AN000;
111MOV SI,OFFSET first_sublist ;address first sublist ;AN000;
112REPEAT: ;AN000;
113 MOV [SI].sublist_seg,DS ;set up the segment part of the pointer field in the sublist block ;AN000;
114 ADD SI,TYPE sublist_def ;point to next sublist block ;AN000;
115LOOPNZ repeat ;AN000;
116 ;AN000;
117RET
118 ;AN000;
119initialize_sublists ENDP
120
121;*****************************************************************************
122;PRINTF
123;*****************************************************************************
124;
125;Description: Save all registers, set up registers required for SysDispMsg
126; routine. This information is contained in a message description
127; table pointed to by the DX register. Call SysDispMsg, then
128; restore registers. This routine assumes that the only time an
129; error will be returned is if an extended error message was
130; requested, so it will ignore error returns
131;
132;Called Procedures: sysdispmsg
133;
134;Change History: Created 4/22/87 MT
135;
136;Input: ES:DX = pointer to message description
137;
138;Output: None
139;
140;Psuedocode
141;----------
142;
143; Save all registers
144; Setup registers for SysDispMsg from Message Description Tables
145; CALL SysDispMsg
146; Restore registers
147; ret
148;*****************************************************************************
149
150Public PRINTF
151PRINTF PROC NEAR ; ;AN000;
152
153; push ax
154 ;Save registers ;AN000;
155 push bx ; " " " " ;AN000;
156 push cx ; " " " " ;AN000;
157 push dx ; " " " " ;AN000;
158 push si ; " " " " ;AN000;
159 push di ; " " " " ;AN000;
160 mov di,dx ;Change pointer to table ;AN000;
161 mov ax,[di].Entry1 ;Message number ;AN000;
162 mov bx,[di].Entry2 ;Handle ;AN000;
163 mov si,[di].Entry3 ;Sublist ;AN000;
164 mov cx,[di].Entry4 ;Count ;AN000;
165 mov dh,[di].Entry5 ;Class ;AN000;
166 mov dl,[di].Entry6 ;Function ;AN000;
167 mov di,[di].Entry7 ;Input ;AN000;
168 call SysDispMsg ;Display the message ;AN000;
169 pop di ;Restore registers ;AN000;
170 pop si ; " " " " ;AN000;
171 pop dx ; " " " " ;AN000;
172 pop cx ; " " " " ;AN000;
173 pop bx ; " " " " ;AN000;
174; pop ax ; " " " " ;AN000;
175 ret ;All done ;AN000;
176
177PRINTF ENDP ; ;AN000;
178
179PRINTF_CODE ENDS
180
181 end
diff --git a/v4.0/src/CMD/MODE/INVOKE.ASM b/v4.0/src/CMD/MODE/INVOKE.ASM
new file mode 100644
index 0000000..2d836c3
--- /dev/null
+++ b/v4.0/src/CMD/MODE/INVOKE.ASM
@@ -0,0 +1,1549 @@
1 ;AN000;
2;m ;AN000;
3 PAGE ,132 ; ;AN000;
4 TITLE ANALYZE_AND_INVOKE - call appropriate routine based on request ;AN000;
5.XLIST ;AN000;
6 INCLUDE STRUC.INC ;AN000;
7.LIST ;AN000;
8;.SALL ;AN000;
9
10
11;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
12;º º ;AN000;
13 ;AN000;
14; AC000 - P2944: Was displaying the lines and column settings for CON even
15; though couldn't get them when ANSI.SYS isn't loaded. Now
16; check if ANSI loaded before trying to display the settings.
17
18; AC002 - P3331: ES was getting zeroed, which caused problems later in MODECP.
19
20; AC003 - P3541: The retry status routine was assuming different format than
21; the retry type byte was in. I fixed the status checking
22; routine.
23
24; AX004 - P3982: The screen was being cleared after the "Unable to shift
25; screen ..." message.
26
27; AC005 - P4934: The multiplex number for ANSI.SYS was changed due to a
28; 5/20/88 conflict with a Microsoft product that has already been
29; shipped.
30
31;º º ;AN000;
32;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
33 ;AN000;
34 ;AN000;
35;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
36;º º ;AN000;
37 ;AN000;
38GET_EXTENDED_ERROR MACRO ;AN000;
39 ;AN000;
40MOV BX,0 ;level for 3.00 to 4.00 ;AN000;
41MOV AH,59H ;function number for get extended error ;AN000;
42INT 21H ;AN000;
43 ;AN000;
44ENDM ;AN000;
45 ;AN000;
46 ;AN000;
47BREAK MACRO X ;AN000;
48 JMP endcase_&X ;AN000;
49ENDM ;AN000;
50 ;AN000;
51 ;AN000;
52 ;AN000;
53 ;AN000;
54DISPLAY MACRO MESSAGE ;AN000;
55 MOV DX,OFFSET MESSAGE ;AN000;
56 CALL PRINTF ;AN000;
57ENDM ;AN000;
58 ;AN000;
59 ;AN000;
60;º º ;AN000;
61;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
62 ;AN000;
63 ;AN000;
64 ;AN000;
65;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
66;º º ;AN000;
67 ;AN000;
68INCLUDE modequat.inc ;AN000;
69 ;AN000;
70ANSIINT2F EQU 1AH ;INT 2F multiplex number for ANSI.SYS ;AC005;
71ASCII_0 EQU "0" ;change one based binary printer number into ASCII printer number ;AN000;
72ASCII_1 EQU "1" ;AN000;
73B EQU 2 ;retry setting ;AN000;
74blink EQU 0000H ;value for flags field of IOCTL data block ;AN000;
75busy_retry_active EQU 2 ;indicates bust retry is active ;AN000;
76check_installed EQU 0 ;request installed state for INT2F (ANSI) ;AN000;
77;COLUMNS EQU 00000010B ; ;AN000;
78com1_retry_type_status EQU 0 ;request for retry status on com1 ;AN000;
79com2_retry_type_status EQU 2 ;request for retry status on com2 ;AN000;
80com3_retry_type_status EQU 4 ;request for retry status on com3 ;AN000;
81com4_retry_type_status EQU 6 ;request for retry status on com4 ;AN000;
82display_device EQU 3 ;type of device, used for calls to IOCTL 0C function ;AN000;
83E EQU 1 ;retry setting ;AN000;
84error_retry_active EQU 1 ;indicates error retry is active ;AN000;
85false EQU 00H ;AN000;
86font_not_loaded EQU 31 ;return from IOCTL 0C (via ext err) indicating DISPLAY.SYS don't have necessary font loaded
87get_current_settings EQU 07FH ;request for IOCTL 0C call ;AN000;
88installed EQU 0FFH ;return from get_installed_state function ;AN000;
89intense EQU 0001H ;value for flags field of IOCTL data block ;AN000;
90IOCTL0C EQU [SI] ;AN000;
91;LINES EQU 00000001B ;flag for IOCTL0C_functions_requested ;AN000;
92lowercase EQU 020H ;when ORed with char value it changes it to lowercase ;AN000;
93LPT1 EQU 1 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
94LPT2 EQU 2 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
95LPT3 EQU 4 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
96lpt1_retry_type_status EQU 0 ;request for retry status on lpt1 ;AN000;
97lpt2_retry_type_status EQU 1 ;request for retry status on lpt2 ;AN000;
98lpt3_retry_type_status EQU 2 ;request for retry status on lpt3 ;AN000;
99MODE_INT2F_MULTIPLEX_NUMBER EQU 0 ;AN000;
100no_retry EQU 3 ;retry setting ;AN000;
101no_retry_active EQU 0 ;indicates no retry active on device ;AN000;
102not_supported_on_machine EQU 29 ;return from IOCTL 0C (via ext err) indicating hardware don't support the function ;AN000;
103parm_list_BX EQU [BX] ;AN000;
104prn_ports_attached EQU CL ;used in printer_reroute_case and check_prn_ports_attached
105R EQU 3 ;retry setting for com ports ;AN000;
106ready_retry_active EQU 3 ;indicates ready retry is active ;AN000;
107redirected EQU 2 ;network puts a 2 in printer address word for printers redirected
108rerouted_printer_mask EQU BL ;holds the mask to check ptsflag1 with, see modeecho.asm
109returned_retry_type EQU AL ;holds the returned status value ;AN000;
110set_display_characteristics EQU 05FH ;request for IOCTL 0C call ;AN000;
111status EQU 0 ;request for modecp ;AN000;
112StdOut equ 1 ;AN000;
113text EQU 01 ;mode field of IOCTL 0C call indicating screen mode type (vs APA mode) ;AN000;
114true EQU 0FFH ;AN000;
115unspecified EQU 0FFH ;state of item_tags in parm_list if the positonal parm was not specified ;AN664;
116 ;AN000;
117;º º ;AN000;
118;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
119 ;AN000;
120 ;AN000;
121;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
122;º º ;AN000;
123 ;AN000;
124 ;AN000;
125des_strt_packet STRUC ;AN000;
126 des_strt_pkfl DW 0000 ;assume a filename specified ;AN000;
127 des_strt_pklen DW 02 ;start with size of 'des_strt_pknum' ;AN000;
128 des_strt_pknum DW 0 ;number of cp numbers in the packet ;AN000;
129 des_strt_pkcp1 DW -1 ;code page number for 1st slot ;AN000;
130 des_strt_pkcp2 DW -1 ;AN000;
131 des_strt_pkcp3 DW -1 ;AN000;
132 des_strt_pkcp4 DW -1 ;AN000;
133 des_strt_pkcp5 DW -1 ;AN000;
134 des_strt_pkcp6 DW -1 ;AN000;
135 des_strt_pkcp7 DW -1 ;AN000;
136 des_strt_pkcp8 DW -1 ;AN000;
137 des_strt_pkcp9 DW -1 ;AN000;
138 des_strt_pkcpA DW -1 ;AN000;
139 des_strt_pkcpB DW -1 ;AN000;
140 des_strt_pkcpC DW -1 ;code page number for 12th slot ;AN000;
141des_strt_packet ENDS ;AN000;
142 ;AN000;
143;The info_level is 0 on input, and contains a return code on exit. If carry set ;AN000;
144;and 2 then the requested function is not supported on this machine. If carry ;AN000;
145;set and 3 then DISPLAY.SYS does not have the appropriate RAM font loaded to ;AN000;
146;support the requested function. ;AN000;
147 ;AN000;
148IOCTL0C_def STRUC ;AN000;
149 ;AN000;
150info_level DB 0 ;return code: 0 on input, 1 ?, 2 or 3 as returns ;AN000;
151 DB 0 ;reserved ;AN000;
152data_length DW 14 ;length of the data block not including this field ;AN000;
153flags DW 0 ;filled with intense or blink ;AN000;
154mode DB text ;filled with text, may be returned as 2 which means APA ;AN000;
155 DB 0 ;reserved ;AN000;
156colors DW 16 ;0 means monochrome ;AN000;
157 DW bogus ;width in pixels for APA modes ;AN000;
158 DW bogus ;length in pixels for APA modes ;AN000;
159cols DW bogus ;nubmer of text columns ;AN000;
160rows DW bogus ;number of text rows ;AN000;
161 ;AN000;
162IOCTL0C_def ENDS ;AN000;
163 ;AN000;
164INCLUDE COMMON.STC ;includes the following strucs ;AN000;
165 ;AN000;
166;codepage_parms STRUC ;AN000;
167; cp_device DW ? ;AN000;
168; des_pack_ptr DW ? ;AN000;
169; font_filespec DW ? ;AN000;
170; request_typ DW ? ;AN000;
171;codepage_parms ENDS ;AN000;
172 ;AN000;
173 ;AN000;
174;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000;
175 ;AN000;
176;parm_type DB bogus ;AN000;
177;item_tag DB 0FFH ;AN000;
178;value1 DW bogus ;used only for filespecs and code page numbers ;AN000;
179;value2 DW bogus ;used only for filespecs and code page numbers ;AN000;
180;keyword_switch_ptr DW 0 ;AN000;
181 ;AN000;
182;parm_list_entry ENDS ;AN000;
183 ;AN000;
184 ;AN000;
185;º º ;AN000;
186;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
187 ;AN000;
188ROM SEGMENT AT 0 ;AN000;
189 ORG 530H ;AN000;
190resseg LABEL DWORD ;location of resident mode code vector ;AN000;
191ROM ENDS ;AN000;
192 ;AN000;
193 ;AN000;
194 PAGE ;AN000;
195PRINTF_CODE SEGMENT PUBLIC ;AN000;
196 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000;
197 ;AN000;
198 ;AN000;
199;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
200;º º ;AN000;
201 ;AN000;
202PUBLIC analyze_and_invoke ;make available to "MAIN" ;AN000;
203PUBLIC busy_retry_active ;used by modecom ;AN000;
204PUBLIC cp_cb ;modepars needs to set the font file name ;AN000;
205PUBLIC error_retry_active ;used by modecom ;AN000;
206PUBLIC initialize_printer_port_case ;AN000;
207PUBLIC no_retry_active ;used by modecom ;AN000;
208PUBLIC parm_list_holder ;used by modeprin ;AN664;
209PUBLIC ready_retry_active ;used by modecom ;AN000;
210 ;AN000;
211;º º ;AN000;
212;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
213 ;AN000;
214 ;AN000;
215;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
216;º º ;AN000;
217 ;AN000;
218EXTRN ANSI_not_loaded:BYTE ;see modedefs.inc ;AN000;
219EXTRN BAUD_equal:BYTE ;the string "BAUD=", see modepars ;AN000;
220EXTRN BAUD_index:WORD ;see modecom.asm ;AN000;
221EXTRN B_str:BYTE ;see MODEPARS.ASM ;AN000;
222EXTRN BW40:NEAR ;see modedefs.inc ;AN000;
223EXTRN BW40_item_tag:ABS ;see MODEPARS.ASM ;AN000;
224EXTRN BW80:NEAR ;see modedefs.inc ;AN000;
225EXTRN BW80_item_tag:ABS ;see MODEPARS.ASM ;AN000;
226EXTRN busy_status:ABS
227EXTRN close:ABS ;EQU 3EH ;CLOSE A FILE HANDLE,see modecpeq.inc ;AN000;
228EXTRN columns_ptr:WORD ;see modesubs.inc ;AN000;
229EXTRN CO40:NEAR ;see modedefs.inc ;AN000;
230EXTRN CO40_item_tag:ABS ;see MODEPARS.ASM ;AN000;
231EXTRN CO80:NEAR ;see modedefs.inc ;AN000;
232EXTRN CO80_item_tag:ABS ;see MODEPARS.ASM ;AN000;
233EXTRN codepage_index_holder:WORD ;see MODEPARS.ASM ;AN000;
234EXTRN codepage_item_tag:ABS ;see MODEPARS.ASM ;AN000;
235EXTRN columns_equal:BYTE ;see MODEPARS.ASM ;AN000;
236EXTRN columns_equal_msg:BYTE ;see MODEdefS.inc ;AN000;
237EXTRN columns_holder:BYTE ;holder for printer chars per line (binary) value, see modeprin ;AN000;
238EXTRN COLS_equal:BYTE ;see MODEPARS.ASM ;AN000;
239EXTRN columns_item_tag:ABS ;see MODEPARS.ASM ;AN000;
240EXTRN COM1_str:BYTE ;see MODEPARS.ASM ;AN000;
241EXTRN COM2_str:BYTE ;see MODEPARS.ASM ;AN000;
242EXTRN COM3_str:BYTE ;see MODEPARS.ASM ;AN000;
243EXTRN COM4_str:BYTE ;see MODEPARS.ASM ;AN000;
244EXTRN COMX:ABS ;one of two possible values for "device_type"
245EXTRN CON_str:BYTE ;"CON"see MODEPARS.ASM ;AN000;
246EXTRN CRLF:BYTE ;see MODEDEFS.ASM, used before "Invalid parameter - " for consistent spacing ;AN000;
247EXTRN data_bits_index:WORD ;see modecom.asm ;AN000;
248EXTRN DATA_equal:BYTE ;see MODEPARS.ASM ;AN000;
249EXTRN DELAY_equal:BYTE ;see MODEPars.asm ;AN000;
250EXTRN DEL_equal:BYTE ;see MODEPARS.ASM ;AN000;
251EXTRN des_start_packet:WORD ;AX000; des_strt_packet <>, see modepars ;AN000;
252EXTRN device:BYTE ;holder of com number for invoke and modeecho ;AN000;
253EXTRN device_name:WORD ;AN000;
254EXTRN device_type:BYTE ;see MODEPARS.ASM ;AN000;
255EXTRN dev_name_size:WORD ;see MODEPARS.ASM ;AN000;
256EXTRN dev_open_mode:ABS ;read write access ;AN000;
257EXTRN display_printer_reroute_status:NEAR ;see modeecho.asm
258EXTRN eighty_item_tag:ABS ;see MODEPARS.ASM ;AN000;
259EXTRN eighty_str:BYTE ;see MODEPARS.ASM ;AN000;
260EXTRN error_status:ABS ;see MODEPRIN
261EXTRN five_char_underline:BYTE ;see modedefs.inc ;AN000;
262EXTRN four_char_underline:BYTE ;see modedefs.inc ;AN000;
263EXTRN function_not_supported:BYTE ;see modedefs.inc ;AN000;
264EXTRN err1:BYTE ;see modedefs.inc
265EXTRN E_str:BYTE ;see MODEPARS.ASM ;AN000;
266EXTRN fourty_item_tag:ABS ;see MODEPARS.ASM ;AN000;
267EXTRN fourty_str:BYTE ;see MODEPARS.ASM ;AN000;
268EXTRN handle_40_or_80:NEAR ;see modescrn ;AN000;
269EXTRN illegal_device_ptr:WORD ;see modesubs.inc
270EXTRN keyword:ABS ;see MODEPARS ;AN000;
271EXTRN invalid_number_of_parameters:WORD ;AN000;
272;EXTRN invalid_parameter:WORD ;<CR><LF>"Invalid parameter '????'",beep ;AN000;
273EXTRN len_COMX_str:ABS ;see MODEPARS.ASM ;AN000;
274EXTRN len_CON_str:ABS ;see MODEPARS.ASM ;AN000;
275EXTRN len_LPTX_str:ABS ;see MODEPARS.ASM ;AN000;
276EXTRN L_item_tag:ABS ;see MODEPARS.ASM ;AN000;
277EXTRN LINES_equal:BYTE ;see MODEPARS.ASM ;AN000;
278EXTRN LINES_equal_msg:BYTE ;see MODEDEFS.INC ;AN000;
279EXTRN lines_item_tag:ABS ;see MODEPARS.ASM ;AN000;
280EXTRN long_underline:BYTE ;see modedefs.inc ;AN000;
281EXTRN lptno:BYTE ;holder of printer number for invoke and modeecho ;AN000;
282EXTRN lpt1_retry_type:BYTE ;see RESCODE
283EXTRN LPT1_str:BYTE ;see MODEPARS.ASM ;AN000;
284EXTRN LPT2_str:BYTE ;see MODEPARS.ASM ;AN000;
285EXTRN LPT3_str:BYTE ;see MODEPARS.ASM ;AN000;
286EXTRN notredpt:BYTE ;printer number in "LPTn not rerouted"
287EXTRN max_request_type:ABS ;see MODEPARS.ASM ;AN000;
288EXTRN modecom:NEAR ;AN000;
289EXTRN modecp:NEAR ;AN000;
290EXTRN modeecho:NEAR ;AN000;
291EXTRN modeecno:NEAR ;AN000;
292EXTRN modeprin:NEAR ;AN000;
293EXTRN modify_resident_code:NEAR ;see modeprin ;AN000;
294EXTRN MONO:NEAR ;see modedefs.inc ;AN000;
295EXTRN MONO_item_tag:ABS ;see MODEPARS.ASM ;AN000;
296EXTRN no_retry_flag:ABS ;see MODEPRIN
297EXTRN noerror:BYTE ;AN000;
298EXTRN none_item_tag:ABS ;see modepars.asm ;AN000;
299EXTRN none_str:BYTE ;see MODEPARS.ASM ;AN000;
300EXTRN offending_parameter:BYTE ;see MODEMES ;AN000;
301EXTRN OFF_item_tag:ABS ;see pares.asm ;AN000;
302EXTRN off_str:BYTE ;see MODEPARS.ASM ;AN000;
303EXTRN onethirtytwo_item_tag:ABS ;see modepars.asm ;AN000;
304EXTRN ON_item_tag:ABS ;see pares.asm ;AN000;
305EXTRN on_str:BYTE ;see MODEPARS.ASM ;AN000;
306EXTRN open:ABS ;open a device handle, see modecpeq.inc ;AN000;
307EXTRN parity_equal:BYTE ;see modepars.asm ;AN000;
308EXTRN parity_index:WORD ;see modecom ;AN000;
309EXTRN parm2:BYTE ;see MODEPRIN.ASM ;AN000;
310EXTRN parm3:BYTE ;see MODEPARS.ASM ;AN000;
311;EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>), see MODEPARS.ASM ;AN000;
312EXTRN parms_form:byte ;indicator of whether the parameters were entered as positionals or as keywords ;AN000;
313EXTRN pbaud_ptr:WORD ;AN000;;pointer to the baud rate string in the initialization message for COM, see modesubs.inc
314EXTRN pdata:BYTE ;see modesubs.inc ;AN000;
315EXTRN pparity_ptr:WORD ;see modesubs.inc ;AN000;
316EXTRN pparm:BYTE ;used by modecom and for message, see modesubs.inc ;AN000;
317EXTRN prepare:ABS ;AN000;
318EXTRN prepare_item_tag:ABS ;see MODEPARS.ASM ;AN000;
319EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS
320EXTRN pstop_ptr:WORD ;see modesubs.inc ;AN000;
321EXTRN PRINTF:NEAR ;AN000;
322EXTRN rate_equal:BYTE ;see MODEPARS.ASM ;AN000;
323EXTRN ready_status:ABS ;see modeprin
324EXTRN redpt:BYTE ;printer number (n) in message "LPTn rerouted to COMm"
325EXTRN refresh:ABS ;AN000;
326EXTRN retry_item_tag:ABS ;see MODEPARS.ASM ;AN000;
327EXTRN request_type:BYTE ;see "MODEPARS.ASM" ;AN000;
328EXTRN retry_equal:BYTE ;see MODEDEFS.INC ;AN000;
329EXTRN retry_equal_str:BYTE ;AN000;
330EXTRN retry_index:WORD ;see MODECOM.ASM ;AN000;
331EXTRN retry_type_ptr:WORD ;see MODESUBS.INC ;AN000;
332EXTRN row_ptr:WORD ;see modesubs.inc ;AN000;
333EXTRN row_type:WORD ;see modesubs.inc ;AN000;
334EXTRN R_item_tag:ABS ;see MODEPARS.ASM ;AN000;
335EXTRN R_str:BYTE ;see MODEPARS.ASM ;AN000;
336EXTRN Required_font_not_loaded:BYTE ;see modedefs.asm ;AN000;
337EXTRN res_com_retry_type:ABS ;see RESCODE.SAL ;AN000;
338;EXTRN res_lpt_retry_type:ABS ;see RESCODE.SAL ;AN000;
339EXTRN select:ABS ;request type for 'modecp' ;AN000;
340EXTRN select_item_tag:ABS ;see MODEPARS.ASM ;AN000;
341EXTRN serial_base:WORD ;see modecom ;AN000;
342EXTRN set_con_features:ABS ;AN000;
343EXTRN set_retry_type:NEAR ;see modeprin ;AN000;
344EXTRN shift_screen:NEAR ;see modescrn ;AN000;
345EXTRN stat_dev_ptr:WORD ;see modedefs.inc ;AN000;
346EXTRN status_for_device:BYTE ;"Status for device %1:" see modedefs.inc ;AN000;
347EXTRN status_for_everything:ABS ;AN000;
348EXTRN stop_bits_index:WORD ;see modecom.asm ;AN000;
349EXTRN stop_equal:BYTE ;"STOP=", see modepars ;AN000;
350EXTRN typamat:NEAR ;see "typamat.asm" ;AN000;
351 ;AN000;
352;possible values of "request_type" ;AN000;
353 ;AN000;
354EXTRN all_con_status:ABS ;AN000;
355EXTRN codepage_prepare:ABS ;AN000;
356EXTRN codepage_refresh:ABS ;AN000;
357EXTRN codepage_select:ABS ;AN000;
358EXTRN codepage_status:ABS ;AN000;
359EXTRN codepage_prepared_status:ABS ;AN000;
360EXTRN codepage_selected_status:ABS ;AN000;
361EXTRN com_status:ABS ;AN000;
362;EXTRN con_status:ABS ;AN000;
363EXTRN initialize_com_port:ABS ;AN000;
364EXTRN initialize_printer_port:ABS ;AN000;
365EXTRN old_initialize_printer_port:ABS ;AN000;
366EXTRN old_video_mode_set:ABS ;AN000;
367EXTRN printer_reroute:ABS ;AN000;
368EXTRN printer_status:ABS ;AN000;
369EXTRN turn_off_reroute:ABS ;AN000;
370 ;AN000;
371 ;AN000;
372;º º ;AN000;
373;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
374 ;AN000;
375 ;AN000;
376;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
377;º º ;AN000;
378 ;AN000;
379ANSI_installed DB false ;boolean indicator of whether ANSI.SYS is installed ;AN000;
380columns_specified DB false ;indicates if columns= was on the command line, see set_con_features_case;AN000;
381code_page_numbers_encountered DB 0 ;AN000;
382cp_cb codepage_parms <> ;codepage subroutine parameter block ;AN000;
383com_ports_attached DB 0 ;number of com ports in the machine
384current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet' ;AN000;
385delay_holder DB 1 ;holder for binary form of delay requested ;AN000;
386device_request DB ? ;holds device request value ;AN000;
387max_pknum EQU ($ - OFFSET des_start_packet.des_strt_pkcp1)/2 ;most cp numbers can send at once ;AN000;
388;IOCTL0C_functions_requested DB 0 ;for displaying messages, flag byte indicating IOCTL functions requested ;AN000;
389need_typamat_call DB false ;boolean for saving up delay and rate settings ;AN000;
390need_IOCTL0C DB false ;boolean for saving up parts of an IOCTL 0CH call ;AN000;
391parm_list_holder DW bogus ;holder for address of parsed parameter list for when BX is needed elsewhere ;AN000;
392parm_list_index_holder DW bogus ;holder for index of parsed parameter list for when DI is needed elsewhere ;AN000;
393i DB 0 ;index for status loop ;AN000;
394rate_holder DB 32 ;holder for binary form of rate value ;AN000;
395row_value DB ? ;holder for binary form of row value during status display ;AN000;
396 ;AN000;
397IOCTL0C_data_block IOCTL0C_def<> ;AN000;
398
399PUBLIC IOCTL0C_data_block
400 ;AN000;
401;º º ;AN000;
402;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
403 ;AN000;
404check_ANSI_installed PROC NEAR ;See if ANSI.SYS is installed ;AC001;
405
406 MOV AH,ANSIINT2F ;AC001;
407 MOV AL,check_installed ;AC001;
408 INT 2FH ;AC001;
409 .IF <AL EQ installed> THEN ;AC001;
410 MOV ANSI_installed,true ;initialized to false, so no ELSE needed ;AC001;
411 .ENDIF
412
413check_ANSI_installed ENDP ;AC001;
414
415;------------------------------------------------------------------------------
416
417
418
419setup_device_name PROC NEAR ;AN000;
420 ;AN000;
421MOV DX,device_name ;DX=pointer to ASCIIZ device name ;AN000;
422MOV cp_cb.cp_device,DX ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
423 ;AN000;
424RET ;AN000;
425 ;AN000;
426setup_device_name ENDP ;AN000;
427 ;AN000;
428;------------------------------------------------------------------------------- ;AN000;
429 ;AN000;
430 ;AN000;
431do_IOCTL0C PROC NEAR ;AN000;
432PUBLIC DO_IOCTL0C ;AN000;
433 MOV AH,open ;open device ;AN000;
434 MOV AL,dev_open_mode ;AL=open mode for devices, see modecpeq.inc ;AN000;
435 MOV DX,OFFSET CON_str ;know that CON is being opened, avoid using user input and having to remove colon ;AN000;
436 INT 21H ;AN000;
437 ;AN000;
438 MOV BX,AX ;BX=handle of CON ;AN000;
439 MOV AX,440CH ;AN000;
440 MOV CH,display_device ;type of device ;AN000;
441 MOV DX,OFFSET IOCTL0C_data_block ;AN000;
442 INT 21H ;the IOCTL data block is filled with the current settings ;AN000;
443 PUSHF ;save result of the IOCTL ;AN000;
444 ;AN000;
445 MOV AH,3EH ;assume that BX still has the handle ;AN000;
446 INT 21H ;close CON, open and close each time because if error may not be back to close ;AN000;
447 ;AN000;
448 POPF ;restore result of the IOCTL ;AN000;
449 ;AN000;
450 RET ;AN000;
451 ;AN000;
452do_IOCTL0C ENDP ;AN000;
453 ;AN000;
454;------------------------------------------------------------------------------- ;AN000;
455 ;AN000;
456display_columns_status PROC NEAR ;AN000;
457 ;AN000;
458MOV CL,get_current_settings ;AN000;
459CALL do_IOCTL0C ;get current settings of CON ;AN000;
460.IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000;
461 .IF <IOCTL0C_data_block.cols EQ 80> THEN ;AN000;
462 MOV columns_ptr,OFFSET eighty_str ;set up message block with pointer to "80" ;AN000;
463 .ELSE ;AN000;
464 MOV columns_ptr,OFFSET fourty_str ;AN000;
465 .ENDIF ;AN000;
466.ELSE ;AN000;
467 MOV columns_ptr,OFFSET NONE_str ;AN000;
468.ENDIF ;AN000;
469display COLUMNS_equal_msg ;AN000;
470 ;AN000;
471RET ;AN000;
472 ;AN000;
473display_columns_status ENDP ;AN000;
474 ;AN000;
475;------------------------------------------------------------------------------- ;AN000;
476 ;AN000;
477display_lines_status PROC NEAR ;AN000;
478 ;AN000;
479MOV CL,get_current_settings ;AN000;
480CALL do_IOCTL0C ;get current settings of CON ;AN000;
481.IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000;
482 MOV AX,IOCTL0C_data_block.rows ;AN000;
483 MOV row_value,AL ;row_value=binary row value ;AN000;
484 MOV row_type,right_align+unsgn_bin_byte ;set up sublist so msg ret knows it is a binary byte ;AN000;
485 MOV row_ptr,OFFSET row_value ;set up LINES_equal sublist ;AN000;
486.ELSE ;AN000;
487 MOV row_ptr,OFFSET NONE_str ;AN000;
488.ENDIF ;AN000;
489display LINES_equal_msg ;AN000;
490 ;AN000;
491RET ;AN000;
492 ;AN000;
493display_lines_status ENDP ;AN000;
494
495;-------------------------------------------------------------------------------
496
497old_video_mode_set_IOCTL PROC NEAR ;AN004;
498
499MOV CL,set_display_characteristics ;AN000;
500CALL do_IOCTL0C ;AN000;
501.IF C THEN ;AN000;
502 get_extended_error ;AN000;
503 .IF <AX EQ not_supported_on_machine> THEN ;AN000;
504 DISPLAY Function_not_supported ;AN000;
505 .ELSEIF <AX EQ font_not_loaded> THEN ;AN000;
506 DISPLAY Required_font_not_loaded ;AN000;
507 .ENDIF ;AN000;
508 MOV noerror,false ;AN000;
509.ENDIF ;AN000;carry ;AN000;
510
511RET
512 ;AN004;
513old_video_mode_set_IOCTL ENDP ;AN004;
514
515 ;AN000;
516;------------------------------------------------------------------------------- ;AN000;
517;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
518
519;³ CHECK_COM_PORTS_ATTACHED
520;³ ------------------------
521
522;³ Return the number of com ports in the machine.
523
524;³ INPUT: none
525
526
527;³ RETURN: com_ports_attached - number of com ports
528
529
530;³ MESSAGES: none
531
532;³ REGISTER
533;³ USAGE: SI - index of the FOR loop and displacement from serial_base
534;³ ES - holds segment of ROM data area
535
536
537;³ ASSUMPTIONS: The user has initialized com_ports_attached to zero.
538
539
540;³ SIDE EFFECT: ES is lost
541;³ SI is lost
542;³ ;AN000;
543;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
544
545check_com_ports_attached PROC NEAR
546
547MOV SI,0
548MOV ES,SI ;now ES:SERIAL_BASE addresses 40:0=0:400
549
550.FOR SI = 0 TO 6 STEP 2
551
552 .IF <<WORD PTR ES:SERIAL_BASE[SI]> NE 0> THEN ;SEE IF THE COM PORT EXISTS
553 INC com_ports_attached
554 .ENDIF
555
556.NEXT SI
557
558RET
559
560check_com_ports_attached ENDP
561
562
563;------------------------------------------------------------------------------- ;AN000;
564;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
565
566;³ CHECK_PRN_PORTS_ATTACHED
567;³ ------------------------
568
569;³ Return the number of printer ports in the machine. The network will put a 2
570;³ in th address word if the printer is redirected, so for the printer to
571;³ actually exist the address must be greater than 2 ("redirected"). Since
572;³ can't have infinite retry on redirected printers only want to count ports
573;³ with >2 for addresses.
574
575;³ INPUT: none
576
577
578;³ RETURN: prn_ports_attached - number of printer ports
579
580
581;³ MESSAGES: none
582
583;³ REGISTER
584;³ USAGE: SI - index of the FOR loop and displacement from printr
585;³ ES - holds segment of ROM data area (0 in this case)
586
587
588;³ ASSUMPTIONS: All valid printer port addresses are >2.
589
590
591;³ SIDE EFFECT: ES is lost
592;³ SI is lost
593;³ ;AN000;
594;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
595
596check_prn_ports_attached PROC NEAR
597
598
599MOV SI,0
600MOV ES,SI ;now ES:printr addresses 40:8=0:408
601
602.FOR SI = 0 TO 4 STEP 2 ;for each of 3 printer port address holder words
603
604 .IF <<WORD PTR ES:printr[SI]> GT redirected> THEN ;SEE IF THE PORT EXISTS
605 INC prn_ports_attached
606 .ENDIF
607
608.NEXT SI
609
610RET
611
612check_prn_ports_attached ENDP
613
614
615;------------------------------------------------------------------------------- ;AN000;
616;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
617;³ ;AN000;
618;³ GET_DEVICE_RETRY_TYPE ;AN000;
619;³ --------------------- ;AN000;
620;³ ;AN000;
621;³ Return the type of retry active for comX or lptX. ;AN000;
622;³ ;AN000;
623;³ INPUT: device_request - scalar indicating what status the user requested. ;AN000;
624;³ use the following equates: ;AN000;
625;³ ;AN000;
626;³ com1_retry_type_status EQU 0 ;AN000;
627;³ com2_retry_type_status EQU 2 ;AN000;
628;³ com3_retry_type_status EQU 4 ;AN000;
629;³ com4_retry_type_status EQU 6 ;AN000;
630;³ lpt1_retry_type_status ;AN000;
631;³ lpt2_retry_type_status ;AN000;
632;³ lpt3_retry_type_status ;AN000;
633;³ ;AN000;
634;³ ;AN000;
635;³ RETURN: returned_retry_type - scalar indicating type of retry active for ;AN000;
636;³ the requested device. compare with the following equates: ;AN000;
637;³ ;AN000;
638;³ no_retry_flag ;AN000;
639;³ error_status ;AN000;
640;³ busy_status ;AN000;
641;³ ready_status ;AN000;
642;³ ;AN000;
643;³ retry_type_ptr - set to proper string ;AN000;
644;³ ;AN000;
645;³ ;AN000;
646;³ MESSAGES: none ;AN000;
647;³ ;AN000;
648;³ REGISTER ;AN000;
649;³ USAGE: CL - For com ports it serves as bit shift count for the retry type byte.
650;³ ;AN000;
651;³ AL - On exit holds retry type scalar on exit (returned_retry_type) ;AN000;
652;³ ;AN000;
653;³ ES - holds segment of resident mode code ;AN000;
654;³ ;AN000;
655;³ ;AN000;
656;³ CONVENTIONS: The value in device_request is used as an index into the LPTX ;AN000;
657;³ array of retry type flags, or as a bit shift count for the ;AN000;
658;³ COM retry type byte. ;AN000;
659;³ ;AN000;
660;³ ;AN000;
661;³ ASSUMPTIONS: The user has initialized device_request on entry with ;AN000;
662;³ the equates provided. ;AN000;
663;³ ;AN000;
664;³ ;AN000;
665;³ SIDE EFFECT: none. ;AN000;
666;³ ;AN000;
667;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
668 ;AN000;
669get_device_retry_type PROC NEAR ;AN665;
670
671PUBLIC get_device_retry_type
672
673PUSH BX ;AN665;
674PUSH ES ;AN665;
675
676XOR BX,BX ;AN665;
677MOV ES,BX ;set segment to zero ;AN665;
678
679.IF <<ES:WORD PTR resseg> NE 0000H> THEN ;IF code resident THEN ;AN665;
680 MOV ES,ES:WORD PTR resseg[2] ;ES=seg of resident code ;AN665;
681 .IF <device_type EQ COMx> THEN
682 MOV CL,device_request ;CL has 0, 2, 4 or 6 for COM 1, 2, 3 or 4 respectively ;AC003;
683 MOV returned_retry_type,BYTE PTR ES:res_com_retry_type ;AL=the status byte for all 4 com ports ;AN665;
684 SHR returned_retry_type,CL ;AL=XXXXXX??, where ?? is the retry bits for port in question ;AC003;
685 AND returned_retry_type,00000011B ;AL=000000??, where ?? is the retry bits for port in question ;AC003;
686 .ELSE ;AN665;
687 MOV BL,device_request ;BX=index into retry bytes in resident code ;AN665;
688 MOV returned_retry_type,BYTE PTR ES:lpt1_retry_type[BX] ;AN665;
689 .ENDIF ;AN665;
690.ELSE ;AN665;
691 MOV returned_retry_type,no_retry_flag ;AN665;
692.ENDIF ;AN665;
693
694.IF <returned_retry_type EQ B> OR ;COM form of busy flag ;AN665;
695.IF <returned_retry_type EQ busy_status> THEN ;AN665;
696 MOV retry_type_ptr,OFFSET B_str ;AN665;
697.ELSEIF <returned_retry_type EQ E> OR ;COM form of error flag ;AN665;
698.IF <returned_retry_type EQ error_status> THEN ;AN665;
699 MOV retry_type_ptr,OFFSET E_str ;AN665;
700.ELSEIF <returned_retry_type EQ R> OR ;COM form of ready flag ;AN665;
701.IF <returned_retry_type EQ ready_status> THEN ;AN665;
702 MOV retry_type_ptr,OFFSET R_str ;AN665;
703.ELSE ;AN665;
704 MOV retry_type_ptr,OFFSET NONE_str ;not E, B or R. ;AN665;
705.ENDIF ;AN665;
706
707POP ES ;AN665;
708POP BX ;AN665;
709RET ;AN665;
710
711get_device_retry_type ENDP ;AN665;
712 ;AN000;
713;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
714;³ ;AN000;
715;³ ANALYZE_AND_INVOKE ;AN000;
716;³ ------------------ ;AN000;
717;³ ;AN000;
718;³ The command line is boken down into pieces by "parse_parameters". Each piece ;AN000;
719;³ is analyzed here, and the appropriate routine called to setup and/or execute ;AN000;
720;³ the requested function. ;AN000;
721;³ ;AN000;
722;³ ;AN000;
723;³ ;AN000;
724;³ ;AN000;
725;³ ;AN000;
726;³ ;AN000;
727;³ INPUT: request_type - scalar indicating what operation the user requested. ;AN000;
728;³ ;AN000;
729;³ ;AN000;
730;³ ;AN000;
731;³ ;AN000;
732;³ RETURN: none ;AN000;
733;³ ;AN000;
734;³ ;AN000;
735;³ MESSAGES: none ;AN000;
736;³ ;AN000;
737;³ ;AN000;
738;³ ;AN000;
739;³ ;AN000;
740;³ REGISTER ;AN000;
741;³ USAGE: DI - index into the list of parsed parms, the array parm_list. ;AN000;
742;³ ;AN000;
743;³ CX - temporary holder for memory to memory MOVs ;AN000;
744;³ ;AN000;
745;³ ;AN000;
746;³ CONVENTIONS: ;AN000;
747;³ ;AN000;
748;³ ;AN000;
749;³ ;AN000;
750;³ ASSUMPTIONS: All the input are valid. The parm_list entry past the last one ;AN000;
751;³ has a parm_type of bogus. ;AN000;
752;³ ;AN000;
753;³ The lines and columns values are in binary for request_type= ;AN000;
754;³ set_con_features ;AN000;
755;³ ;AN000;
756;³ The codepage numbers were put into des_start_packet. ;AN000;
757;³ ;AN000;
758;³ ;AN000;
759;³ ;AN000;
760;³ ;AN000;
761;³ SIDE EFFECT: ;AN000;
762;³ ;AN000;
763;³ ;AN000;
764;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
765 ;AN000;
766analyze_and_invoke PROC NEAR ;AX000; ;AN000;
767 ;AN000;
768 ;AN000;
769;CASE request_type= ;AN000;
770 ;AN000;
771 MOV cp_cb.des_pack_ptr,OFFSET des_start_packet ;AX000;In case a codepage request ;AN000;
772 ;AN000;
773 MOV DI,0 ;initialize index into the list of parsed parameters ;AN000;
774 ;AN000;
775 ;calculate the displacement for the jump to the jump ;AN000;
776 MOV parm_list_holder,BX ;save parm_list_BX ;AN000;
777 XOR BX,BX ;AX000; ;AN000;
778 MOV BL,max_request_type ;AX000; ;AN000;
779 SUB BL,request_type ;AX000;see the list of equates for request_type ;AN000;
780 SHL BX,1 ;AX000;BX=word displacement into jump table ;AN000;
781 JMP jump_table1[BX] ;AX000;jump to appropriate jump ;AN000;
782 ;AN000;
783 jump_table1 LABEL WORD ;the order of the following entries is critical ;AN000;
784 ;AN000;
785 DW OFFSET all_con_status_case ;AN000;
786 DW OFFSET codepage_prepare_case ;AN000;
787 DW OFFSET codepage_refresh_case ;AN000;
788 DW OFFSET codepage_select_case ;AN000;
789 DW OFFSET codepage_status_case ;AN000;
790 DW OFFSET codepage_prepared_status_case ;AN000;
791 DW OFFSET codepage_selected_status_case ;AN000;
792 DW OFFSET com_status_case ;AN000;
793 DW OFFSET initialize_com_port_case ;AN000;
794 DW OFFSET initialize_printer_port_case ;AN000;
795 DW OFFSET old_initialize_printer_port_case ;AN000;
796 DW OFFSET old_video_mode_set_case ;AN000;
797 DW OFFSET printer_reroute_case ;AN000;
798 DW OFFSET printer_status_case ;AN000;
799 DW OFFSET set_con_features_case ;AN000;
800 DW OFFSET status_for_everything_case ;AN000;
801 DW OFFSET turn_off_reroute_case ;AN000;
802 ;AN000;
803 ;AN000;
804 all_con_status_case: ;know that all con status is requested ;AN000;
805 ;AN000;
806 ;AN000;
807 MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000;
808 MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000;
809 display status_for_device ;AN000;
810 display long_underline ;Status for device CON: ;AN000;
811 display four_char_underline ;---------------------- ;AN000;
812 ;AN000;
813 CAll check_ANSI_installed ;see if ANSI.SYS is installed ;AC001;
814 .IF <ANSI_installed EQ true> THEN ;IF can get info on settings THEN display them ELSE don't display them
815 CALL display_columns_status ;AN000;
816 CALL display_lines_status ;AN000;
817 .ENDIF ;AC001;
818 MOV cp_cb.request_typ,status ;set up variables for modecp ;AN000;
819 MOV cp_cb.cp_device,OFFSET CON_str ;AN000;
820 ;AN000;
821 CALL modecp ;display codepage status ;AN000;
822 ;AN000;
823 BREAK 0 ;AN000;
824 ;AN000;
825 ;AN000;
826 codepage_prepare_case: ;AN000;
827 ;AN000;
828 MOV cp_cb.request_typ,prepare ;AN000;
829 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
830 ;AN000;
831 call modecp ;AN000;
832 ;AN000;
833 BREAK 0 ;AN000;
834 ;AN000;
835 ;AN000;
836 codepage_refresh_case: ;AN000;
837 ;AN000;
838 MOV cp_cb.request_typ,refresh ;AN000;
839 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
840 ;AN000;
841 call modecp ;AN000;
842 ;AN000;
843 BREAK 0 ;AN000;
844 ;AN000;
845 ;AN000;
846 ;AN000;
847 codepage_select_case: ;AN000;
848 ;AN000;
849 MOV cp_cb.request_typ,select ;AN000;
850 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
851 MOV des_start_packet.des_strt_pknum,1 ;one cp number ;AN000;
852 MOV des_start_packet.des_strt_pklen,4 ;bytes for count (word) and one number (word) ;AN000;
853 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
854 MOV DI,codepage_index_holder ;DI=index in parm list of the entry for the codepage to be selected;AN000;
855 MOV AX,parm_list_BX[DI].value1 ;AX=codepage number in binary form ;AN000;
856 MOV des_start_packet.des_strt_pkcp1,AX ;setup parm block with the (single) cp number ;AN000;
857 ;AN000;
858 CALL modecp ;AN000;
859 ;AN000;
860 BREAK 0 ;AN000;
861 ;AN000;
862 ;AN000;
863 codepage_status_case: ;AN000;
864 codepage_prepared_status_case: ;AN000;
865 codepage_selected_status_case: ;AN000;
866 ;AN000;
867 MOV cp_cb.request_typ,status ;AN000;
868 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
869 ;AN000;
870 CALL modecp ;AN000;
871 ;AN000;
872 BREAK 0 ;AN000;
873 ;AN000;
874 ;AN000;
875 com_status_case: ;AN000;
876 ;AN000;
877 ; INPUT: device_type = COMx
878 ; device = ASCII COM number
879
880
881 CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000;
882 ;AN000;
883 .IF <device_name EQ <OFFSET COM1_str>> AND ;AN000;
884 .IF <com_ports_attached GE 1> THEN ;COM1 exists
885 MOV BL,COM1 ;AN000;
886 MOV stat_dev_ptr,OFFSET COM1_str ;set up msg ser input ;AN000;
887 MOV device_request,com1_retry_type_status ;AN000;
888 .ELSEIF <device_name EQ <OFFSET COM2_str>> AND ;AN000;
889 .IF <com_ports_attached GE 2> THEN ;COM2 exists
890 MOV BL,COM2 ;AN000;
891 MOV stat_dev_ptr,OFFSET COM2_str ;set up msg ser input ;AN000;
892 MOV device_request,com2_retry_type_status ;AN000;
893 .ELSEIF <device_name EQ <OFFSET COM3_str>> AND ;AN000;
894 .IF <com_ports_attached GE 3> THEN ;COM3 exists
895 MOV BL,COM3 ;AN000;
896 MOV stat_dev_ptr,OFFSET COM3_str ;set up msg ser input ;AN000;
897 MOV device_request,com3_retry_type_status ;AN000;
898 .ELSEIF <device_name EQ <OFFSET COM4_str>> AND ;AN000;
899 .IF <com_ports_attached EQ 4> THEN ;COM4 exists
900 MOV BL,COM4 ;AN000;
901 MOV stat_dev_ptr,OFFSET COM4_str ;set up msg ser input ;AN000;
902 MOV device_request,com4_retry_type_status ;AN000;
903 .ELSE ;device does not exist ;AN000;
904 MOV CX,device_name ;AN000; ;AN000;
905 MOV illegal_device_ptr,CX ;put pointer to com port string in message ;AN000;
906 DISPLAY err1 ;AN000;"Illegal device name - COMX" ;AN000;
907 MOV noerror,false ;set flag for displaying status to be skipped
908 .ENDIF ;AN000;
909 .IF <noerror EQ true> THEN
910 MOV dev_name_size,len_COMX_str ;set up for msg service, see MODEPARS.ASM ;AN000;
911 display status_for_device ;"Status for device COM?:" ;AN000;
912 display long_underline ;"------------------" ;AN000;
913 display five_char_underline ;has CRLF on it "-----" ;AN000;
914 call get_device_retry_type ;AN000;
915 display retry_equal ;AN000;
916 .ENDIF
917 ;AN000;
918 BREAK 0 ;AN000;
919 ;AN000;
920 ;AN000;
921; con_status_case: ;don't know which con status is requested ;AN000;
922 ;AN000;
923; MOV request_type,all_con_status ;AC000;DCR76 ;AN000;
924; CALL analyze_and_invoke ;AC000;DCR76 ;AN000;
925 ;AN000;
926; MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000;
927; MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000;
928; display status_for_device ;AN000;
929; display long_underline ;Status for device CON: ;AN000;
930; display four_char_underline ;---------------------- ;AN000;
931; ;AN000;
932; MOV DI,0 ;AN000;
933; ;AN000;
934; .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000;
935; ;AN000;
936; ;CASE parm_list_BX[DI].item_tag= ;AN000;
937; ;AN000;
938; ;CODEPAGE, ;AN000;
939; ;PREPARE, ;AN000;
940; ;SELECT: ;AN000;
941; ;AN000;
942; .IF <parm_list_BX[DI].item_tag EQ CODEPAGE_item_tag> OR ;AN000;
943; .IF <parm_list_BX[DI].item_tag EQ SELECT_item_tag> OR ;AN000;
944; .IF <parm_list_BX[DI].item_tag EQ PREPARE_item_tag> THEN ;AN000;
945; ;AN000;
946; MOV cp_cb.request_typ,status ;AN000;
947; MOV cp_cb.cp_device,OFFSET CON_str ;AN000;
948; CALL modecp ;display codepage status ;AN000;
949; ;AN000;
950; BREAK 2 ;AN000;
951; ;AN000;
952; .ENDIF ;AN000;
953; ;AN000;
954; ;BLINK: ;AN000;
955; ;AN000;
956; .IF <parm_list_BX[DI].item_tag EQ BLINK_item_tag> THEN ;AN000;
957; ;AN000;
958; CALL display_blink_status ;AN000;
959; ;AN000;
960; BREAK 2 ;AN000;
961; ;AN000;
962; .ENDIF ;AN000;
963; ;AN000;
964; ;AN000;
965; ;COLUMNS: ;AN000;
966; ;AN000;
967; .IF <parm_list_BX[DI].item_tag EQ COLUMNS_item_tag> THEN ;AN000;
968; ;AN000;
969; CALL display_COLUMNS_status ;AN000;
970; ;AN000;
971; BREAK 2 ;AN000;
972; ;AN000;
973; .ENDIF ;AN000;
974; ;AN000;
975; ;AN000;
976; ;LINES: ;AN000;
977; ;AN000;
978; .IF <parm_list_BX[DI].item_tag EQ LINES_item_tag> THEN ;AN000;
979; ;AN000;
980; CALL display_lines_status ;AN000;
981; ;AN000;
982; BREAK 2 ;AN000;
983; ;AN000;
984; .ENDIF ;AN000;
985; ;AN000;
986; ENDCASE_2: ;AN000;
987; ;AN000;
988; ADD DI,TYPE parm_list_entry ;AN000;
989; ;AN000;
990; .ENDWHILE ;AN000;
991 ;AN000;
992; BREAK 0 ;AN000;
993 ;AN000;
994 ;AN000;
995 ;AN000;
996 initialize_com_port_case: ;AN000;
997 ;AN000;
998
999 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1000
1001 .IF <parms_form EQ keyword> THEN ;IF the parms were input as keywords THEN ;AN000;
1002 ;AN000;
1003 MOV DI,TYPE parm_list_entry ;skip COMN parm ;AN000;
1004 ;AN000;
1005 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000;
1006 ;AN000;
1007 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1008 ;AN000;
1009 ;BAUD_equal: ;AN000;
1010 ;AN000;
1011 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET BAUD_equal>> THEN ;AN000;
1012 ;AN000;
1013 MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the baud rate string ;AN000;
1014 MOV pbaud_ptr,AX ;set pointer to the baud rate string in the messge ;AN000;
1015 MOV baud_index,DI ;set index into parm list for setcom ;AN000;
1016 BREAK 3 ;AN000;
1017 ;AN000;
1018 .ENDIF ;AN000;
1019 ;AN000;
1020 ;AN000;
1021 ;PARITY_equal: ;AN000;
1022 ;AN000;
1023 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET PARITY_equal>> THEN ;AN000;
1024 ;AN000;
1025 MOV SI,parm_list_BX[DI].value1 ;AX= pointer to the parity string ;AN000;
1026 MOV pparity_ptr,SI ;set pointer to the parity string in the messge ;AN000;
1027 OR BYTE PTR [SI],lowercase ;convert to lowercase for compatibility with previous versions
1028 MOV parity_index,DI ;set index into parm list for setcom ;AN000;
1029 BREAK 3 ;AN000;
1030 ;AN000;
1031 .ENDIF ;AN000;
1032 ;AN000;
1033 ;AN000;
1034 ;DATA_equal: ;AN000;
1035 ;AN000;
1036 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DATA_equal>> THEN ;AN000;
1037 ;AN000;
1038 MOV BP,parm_list_BX[DI].value1 ;BP= pointer to the data bits string ;AN000;
1039 MOV AL,[BP] ;AL= data bits character ;AN000;
1040 MOV pdata,AL ;set the data bits string in the messge ;AN000;
1041 MOV data_bits_index,DI ;set index into parm list for setcom ;AN000;
1042 BREAK 3 ;AN000;
1043 ;AN000;
1044 .ENDIF ;AN000;
1045 ;AN000;
1046 ;AN000;
1047 ;STOP_equal: ;AN000;
1048 ;AN000;
1049 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET STOP_equal>> THEN ;AN000;
1050 ;AN000;
1051 MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the stop bit string ;AN000;
1052 MOV pstop_ptr,AX ;set pointer to the parity string in the messge ;AN000;
1053 MOV stop_bits_index,DI ;set index into parm list for setcom ;AN000;
1054 BREAK 3 ;AN000;
1055 ;AN000;
1056 .ENDIF ;AN000;
1057 ;AN000;
1058 ;AN000;
1059 ;RETRY_equal: ;AN000;
1060 ;AN000;
1061 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000;
1062 ;AN000;
1063 MOV retry_index,DI ;indicate to modecom which parm is retry ;AN000;
1064; BREAK 3 ;AN000;
1065 ;AN000;
1066 .ENDIF ;AN000;
1067 ;AN000;
1068 ;AN000;
1069 ENDCASE_3: ;AN000;
1070 ;AN000;
1071 ADD DI,TYPE parm_list_entry ;AN000;
1072 ;AN000;
1073 ;AN000;
1074 .ENDWHILE ;AN000;
1075 ;AN000;
1076 .ELSE ;the parms were entered as positionals (the old form) ;AN000;
1077 ;AN000;
1078 MOV baud_index,TYPE parm_list_entry ;AN000;
1079 MOV DI,2 * (TYPE parm_list_entry) ;AN000;
1080 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1081 MOV parity_index,DI ;AN000;
1082 .ENDIF
1083 MOV DI,3 * (TYPE parm_list_entry) ;AN000;
1084 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1085 MOV data_bits_index,DI ;AN000;
1086 .ENDIF
1087 MOV DI,4 * (TYPE parm_list_entry) ;DI=stopbits index ;AN000;
1088 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1089 MOV stop_bits_index,DI ;AN000;
1090 .ENDIF
1091 MOV DI,5 * (TYPE parm_list_entry) ;AN000;DI=index of retry parm
1092 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF retry requested THEN
1093 MOV retry_index,DI ;AN000;set up index for modecom
1094 .ENDIF ;AN000;
1095 ;AN000;
1096 .ENDIF ;AN000;
1097 ;AN000;
1098 CALL modecom ;AN000;
1099 ;AN000;
1100 BREAK 0 ;AN000;
1101
1102 ;AN000;
1103 ;AN000;
1104 old_initialize_printer_port_case: ;Assume that parms not specified have an entry in parm_list that is in initial state;AN000;
1105
1106 ;printer_no has ASCII form of printer number ;AN000;
1107 ;need to put binary form of columns in columns_holder (80 or 132) ;AN000;
1108 ;need to put "6" or "8" in parm2 ;AN000;
1109 ;need to set retry_index ;AN000;
1110
1111
1112PUBLIC old_initialize_printer_port_case
1113
1114 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1115 MOV DI,TYPE parm_list_entry ;skip LPTN parm, point at chars per line ;AN000;
1116
1117 .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000;
1118 MOV columns_holder,132 ;AN000;
1119 .ELSEIF <parm_list_BX[DI].item_tag EQ eighty_item_tag> THEN ;AN000;
1120 MOV columns_holder,80 ;AN000;
1121 .ENDIF ;if not 80 or 132 modeprin assumes not specified, and makes no change;AN000;
1122 ADD DI,TYPE parm_list_entry ;look at lines per inch ;AN000;
1123
1124 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;IF chars per line specified THEN ;AN000;
1125 MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000;
1126 MOV AL,BYTE PTR DS:[SI] ;AN000;
1127 MOV parm2,AL ;parm2="6" or "8" ;AN000;
1128 .ENDIF ;otherwise leave parm2=0FFH (unspecified) ;AN000;
1129
1130 ADD DI,TYPE parm_list_entry ;look at retry request ;AN000;
1131 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;
1132 MOV retry_index,DI ;AN000;let modeprin know retry was requested and the index of it.
1133 .ENDIF ;AN000;
1134
1135 CALL modeecno ;AN000;
1136 CALL modeprin ;AN000;
1137 ;AN000;
1138 BREAK 0 ;AN000;
1139
1140
1141
1142 initialize_printer_port_case: ;printer_no has ASCII form of printer number ;AN000;
1143 ;need to put binary form of columns in columns_holder (80 or 132) ;AN000;
1144 ;need to put "6" or "8" in parm2 ;AN000;
1145 ;need to set retry_index ;AN000;
1146 ;AN000;
1147 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1148 MOV DI,TYPE parm_list_entry ;skip LPTN parm ;AN000;
1149
1150 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000;
1151 ;AN000;
1152 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1153 ;AN000;
1154 ;AN000;
1155 ;LINES_equal: ;AN000;
1156 ;AN000;
1157 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000;
1158 ;AN000;
1159 MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000;
1160 MOV AL,BYTE PTR DS:[SI] ;AN000;
1161 MOV parm2,AL ;parm2="6" or "8" ;AN000;
1162 BREAK 4 ;AN000;
1163 ;AN000;
1164 .ENDIF ;AN000;
1165 ;AN000;
1166 ;AN000;
1167 ;COLUMNS_equal: ;AN000;
1168 ;AN000;
1169 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
1170 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000;
1171 ;AN000;
1172 .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000;
1173 MOV columns_holder,132 ;AN000;
1174 .ELSE ;AN000;
1175 MOV columns_holder,80 ;AN000;
1176 .ENDIF ;AN000;
1177 BREAK 4 ;AN000;
1178 ;AN000;
1179 .ENDIF ;AN000;
1180 ;AN000;
1181 ;AN000;
1182 ;RETRY_equal: ;AN000;
1183 ;AN000;
1184 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000;
1185
1186 MOV retry_index,DI ;AN664;
1187 BREAK 4 ;AN000;
1188 ;AN000;
1189 .ENDIF ;AN000;
1190 ;AN000;
1191 ;AN000;
1192 ENDCASE_4: ;AN000;
1193 ;AN000;
1194 ADD DI,TYPE parm_list_entry ;AN000;
1195 ;AN000;
1196 ;AN000;
1197 .ENDWHILE ;AN000;
1198
1199 CALL modeecno ;turn of rerouting ;AN000;
1200 CALL modeprin ;AN000;
1201 ;AN000;
1202 BREAK 0 ;AN000;
1203 ;AN000;
1204 ;AN000;
1205 ;AN000;
1206 ;AN000;
1207 old_video_mode_set_case: ;AN000;
1208 ;AN000;
1209 PUBLIC old_video_mode_set_case ;AN000;
1210 ;AN000;
1211 ;AN000;
1212 ;first see if ANSI.SYS is loaded ;AN000;
1213 CALL check_ANSI_installed ;AC001;
1214 .IF <ANSI_installed EQ true> THEN ;AC001;
1215 MOV CL,get_current_settings ;AN000;
1216 PUSH BX ;save parm_list ;AN000;
1217 CALL do_IOCTL0C ;get current settings of CON ;AN000;
1218 POP BX ;restore parm_list ;AN000;
1219 MOV IOCTL0C_data_block.mode,text ;AN000;
1220 .ENDIF ;AN000;ANSI installed ;AN000;
1221 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1222 PUSH DI ;save parm list index ;AN000;
1223 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN
1224 .IF <parm_list_BX[DI].item_tag EQ BW40_item_tag> THEN ;IF BW40 REQUESTED ;AN000;
1225 CALL BW40 ;AN000;
1226 .ELSEIF <parm_list_BX[DI].item_tag EQ BW80_item_tag> THEN ;IF BW80 REQUESTED ;AN000;
1227 CALL BW80 ;AN000;
1228 .ELSEIF <parm_list_BX[DI].item_tag EQ CO40_item_tag> THEN ;IF CO40 REQUESTED ;AN000;
1229 CALL CO40 ;AN000;
1230 .ELSEIF <parm_list_BX[DI].item_tag EQ CO80_item_tag> THEN ;IF CO80 REQUESTED ;AN000;
1231 CALL CO80 ;AN000;
1232 .ELSEIF <parm_list_BX[DI].item_tag EQ MONO_item_tag> THEN ;IF MONO REQUESTED ;AN000;
1233 CALL MONO ;AN000;
1234 .ELSE ;AN000;
1235 .IF <ANSI_installed EQ true> THEN ;AN000;
1236;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1237 .IF <parm_list_BX[DI].value1 EQ <OFFSET fourty_str>> THEN ;AN000;
1238 MOV IOCTL0C_data_block.cols,40 ;setup IOCTL input block with the columns requested ;AN000;
1239 .ELSE
1240 MOV IOCTL0C_data_block.cols,80 ;setup IOCTL input block with the columns requested ;AN000;
1241 .ENDIF ;AN000;
1242 CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000;
1243 .ELSE
1244 .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000;
1245 MOV BL,40 ;set up for handle_40_or_80 ;AN000;
1246 .ELSE ;AN000;
1247 MOV BL,80 ;set up for handle_40_or_80 ;AN000;
1248 .ENDIF ;AN000;
1249 CALL HANDLE_40_OR_80 ;AN000;
1250 .ENDIF
1251 .ENDIF ;AN000;
1252 .ENDIF
1253
1254dummy9:
1255PUBLIC dummy9
1256 ;AN000;
1257 POP DI ;restore parm list index ;AN000;
1258
1259 .IF <NOERROR EQ TRUE> AND ;process ,r ³ l,[T] ;AN000;
1260 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1261 ADD DI,TYPE parm_list_entry ;process second parm, shift direction ;AN000;
1262 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;
1263 .IF <parm_list_BX[DI].item_tag EQ R_item_tag> OR ;AN000;
1264 .IF <parm_list_BX[DI].item_tag EQ L_item_tag> THEN ;AN000;
1265 MOV CL,parm_list_BX[DI].item_tag ;AN000;
1266 MOV PARM2,CL ;set up for SHIFT_SCREEN ;AN000;
1267 ADD DI,TYPE parm_list_entry ;look at third parm ;AN000;
1268 MOV CL,parm_list_BX[DI].item_tag ;CL=T_item_tag or bogus ;AN000;
1269 MOV PARM3,CL ;may be bogus, but shift_screen will handle it correctly ;AN000;
1270 CALL SHIFT_SCREEN ;AN000;
1271 .ELSE ;AN000;must be a rows value
1272 .IF <ANSI_installed EQ true> THEN ;AN000;
1273;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1274 MOV DX,parm_list_BX[DI].value1 ;AN000;
1275 MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000;
1276 CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000;
1277 .ELSE ;AN000;ANSI not installed ;AN000;
1278 DISPLAY ANSI_not_loaded ;AN000;
1279 MOV noerror,false ;AN000;
1280 .ENDIF ;AN000;ANSI installed ;AN000;
1281 .ENDIF ;AN000;
1282 .ENDIF ;AN000;
1283 ;AN000;
1284 BREAK 0 ;AN000;
1285
1286
1287 ;AN000;
1288PUBLIC printer_reroute_case
1289 ;AN000;
1290 printer_reroute_case:
1291 ;INPUT:lptno=zero based printer number OUTPUT:;AH=printer number mask: lpt1=1, lpt2=2, lpt3=4 ;AN000;
1292 ;device=COM number in ASCII form ;SI=printer number value (one based) ;AN000;
1293 ;AL=com number character ;AN000;
1294 XOR CX,CX
1295 MOV CL,lptno ;lptno always <= 255
1296 MOV SI,CX ;SI=zero based printer number (0, 1, or 2) ;AN000;
1297 INC SI ;SI=one based printer number (1, 2, or 3) ;AN000;
1298 MOV AH,1 ;AN000;
1299 SAL AH,CL ;AH=2**SI,AH=printer number mask for MODEECHO ;AN000;
1300 MOV DH,CL
1301 ADD DH,ASCII_1 ;DH=ASCII printer number ;AN000;
1302 MOV AL,device ;AL=ASCII form of com device number ;AN000;
1303 MOV REDPT,DH ;PUT n OF LPTn IN REDIRECT MESSAGE
1304 MOV NOTREDPT,DH ;AND INTO NOT REDIRECTED MSG
1305 CALL modeecho ;AN000;
1306 ;AN000;
1307 BREAK 0 ;AN000;
1308 ;AN000;
1309 ;AN000;
1310 ;AN000;
1311 printer_status_case: ;AN000;
1312
1313PUBLIC printer_status_case
1314
1315 ; INPUT: device_type = LPTx
1316 ; device = ASCII printer number
1317 ; lptno = ASCII printer number
1318 ; device_name = offset of printer string
1319 ;AN000;
1320
1321 MOV cp_cb.request_typ,status ;AN000;
1322 MOV AX,device_name ;AN000;
1323 MOV stat_dev_ptr,AX ;AC665;set up msg ser input ;AN000;
1324 MOV dev_name_size,len_LPTX_str ;AN000;set up for msg service, see MODEPARS.ASM ;AN000;
1325 MOV cp_cb.cp_device,AX ;AN665;set up for call to modecp ;AN000;
1326 ;AN000;
1327 .IF <device_name EQ <OFFSET LPT1_str>> THEN ;AN000;
1328 MOV device_request,lpt1_retry_type_status ;AN000;
1329 MOV rerouted_printer_mask,LPT1
1330 MOV redpt,"1" ;set up for reroute message
1331 MOV notredpt,"1" ;set up for not rerouted message
1332 .ELSEIF <device_name EQ <OFFSET LPT2_str>> THEN ;AN000;
1333 MOV device_request,lpt2_retry_type_status ;AN000;
1334 MOV rerouted_printer_mask,LPT2
1335 MOV redpt,"2" ;set up for reroute message
1336 MOV notredpt,"2" ;set up for not rerouted message
1337 .ELSEIF <device_name EQ <OFFSET LPT3_str>> THEN ;AN000;
1338 MOV device_request,lpt3_retry_type_status ;AN000;
1339 MOV rerouted_printer_mask,LPT3
1340 MOV redpt,"3" ;set up for reroute message
1341 MOV notredpt,"3" ;set up for not rerouted message
1342 .ENDIF ;AN000;
1343 ;AN000;
1344 PUSH ES ;save ES, used in MODECP ;AC002;
1345;AC002;PUSH AX ;AN000;save
1346 ;AN000;
1347 display status_for_device ;AN000;
1348 display long_underline "Status for device LPTX?" ;AN000;
1349 display five_char_underline ;has CRLF on it ----------------------- ;AN000;
1350 call display_printer_reroute_status ;see modeecho.asm ;AN000;
1351;AC002;POP AX ;restore "device_request" ;AN000;
1352 XOR CX,CX ;initialize prn_ports_attached ;AN000;
1353 CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached ;AN000;
1354 POP ES ;restore ES ;AC002;
1355 ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number ;AN000;
1356 .IF <prn_ports_attached GE redpt> THEN ;IF the printer exists THEN ;AN000;
1357 call get_device_retry_type ;AN000;
1358 display retry_equal ;AN000;
1359 CALL modecp ;display codepage status ;AN000;
1360 .ENDIF ;AN000;
1361 ;AN000;
1362 BREAK 0 ;AN000;
1363 ;AN000;
1364;m ;AN000;
1365 set_con_features_case: ;the command line was nothing but con keywords ;AN000;
1366 ;AN000;
1367 ;first see if ANSI.SYS is loaded ;AN000;
1368 CALL check_ANSI_installed ;AC001;
1369 .IF <ANSI_installed EQ true> THEN ;AC001;
1370 MOV CL,get_current_settings ;AN000;
1371 CALL do_IOCTL0C ;get current settings of CON ;AN000;
1372 ;MOV SI,OFFSET IOCTL0C_data_block ;set up IOCTL0C, addressablitiy to the IOCTL data block ;AN000;
1373 ;AN000;
1374 MOV IOCTL0C_data_block.mode,text ;AN000;
1375 ;AN000;
1376 .ENDIF ;ANSI.SYS installed ;AN000;
1377 ;AN000;
1378 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1379 ADD DI,TYPE parm_list_entry ;skip CON parm ;AN000;
1380 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000;
1381 ;AN000;
1382 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1383 ;AN000;
1384 ;AN000;
1385 ;LINES_equal: ;AN000;
1386 ;AN000;
1387 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000;
1388 ;AN000;
1389 MOV DX,parm_list_BX[DI].value1 ;AN000;
1390 MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000;
1391 MOV need_IOCTL0C,true ;AN000;
1392 BREAK 1 ;AN000;
1393 ;AN000;
1394 .ENDIF ;AN000;
1395 ;AN000;
1396 ;AN000;
1397 ;COLUMNS_equal: ;the value is binary ;AN000;
1398 ;AN000;
1399 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
1400 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000;
1401 ;AN000;
1402 .IF <ANSI_installed EQ true> THEN ;AN000;
1403 MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1404 MOV DX,parm_list_BX[DI].value1 ;AN000;
1405 MOV IOCTL0C_data_block.cols,DX ;the IOCTL input block has the columns requested ;AN000;
1406 .ELSE
1407 .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000;
1408 MOV columns_specified,40 ;set up for handle_40_or_80 ;AN000;
1409 .ELSE ;AN000;
1410 MOV columns_specified,80 ;set up for handle_40_or_80 ;AN000;
1411 .ENDIF ;AN000;
1412 .ENDIF
1413 BREAK 1 ;AN000;
1414 ;AN000;
1415 .ENDIF ;AN000;
1416 ;AN000;
1417 ;AN000;
1418 ;RATE_equal: ;AN000;
1419 ;AN000;
1420 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RATE_equal>> THEN ;AN000;
1421 ;AN000;
1422 MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save the rate requested in binary form, always <255 ;AN000;
1423 MOV rate_holder,AL ;AN000;
1424 MOV need_typamat_call,true ;AN000;
1425 BREAK 1 ;AN000;
1426 ;AN000;
1427 .ENDIF ;AN000;
1428 ;AN000;
1429 ;AN000;
1430 ;DELAY_equal: ;AN000;
1431 ;AN000;
1432 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DELAY_equal>> OR ;AN000;
1433 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DEL_equal>> THEN ;AN000;
1434 ;AN000;
1435 MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save delay requested (binary), always <255 ;AN000;
1436 MOV delay_holder,AL ;AN000;
1437 MOV need_typamat_call,true ;AN000;
1438 BREAK 1 ;AN000;
1439 ;AN000;
1440 .ENDIF ;AN000;
1441 ;AN000;
1442 ENDCASE_1: ;AN000;
1443 ;AN000;
1444 ADD DI,TYPE parm_list_entry ;address next parm ;AN000;
1445 ;AN000;
1446 .ENDWHILE ;AN000;
1447 ;AN000;
1448DUMMY3: ;AN000;
1449PUBLIC DUMMY3 ;AN000;
1450 ;AN000;
1451 .IF <need_IOCTL0C EQ true> THEN ;AN000;
1452 .IF <ANSI_installed EQ true> THEN ;AN000;
1453 MOV CL,set_display_characteristics ;AN000;
1454 CALL do_IOCTL0C ;AN000;
1455 .IF C THEN ;AN000;
1456 get_extended_error ;AN000;
1457 .IF <AX EQ not_supported_on_machine> THEN ;AN000;
1458 DISPLAY Function_not_supported ;AN000;
1459 .ELSEIF <AX EQ font_not_loaded> THEN ;AN000;
1460 DISPLAY Required_font_not_loaded ;AN000;
1461 .ENDIF ;AN000;
1462 MOV noerror,false ;AN000;
1463 .ENDIF ;AN000;
1464 .ELSE ;AN000;
1465 DISPLAY ANSI_not_loaded ;AN000;
1466 MOV noerror,false ;AN000;
1467 .ENDIF ;AN000;
1468 .ELSEIF <columns_specified NE false> THEN ;AN000;
1469 MOV BL,columns_specified ;set up for call to handle_40_or_80 ;AN000;
1470 CALL HANDLE_40_OR_80 ;AN000;
1471 .ENDIF ;AN000;
1472
1473 .IF <need_typamat_call EQ true> THEN ;AN000;
1474 MOV BL,rate_holder ;AN000;
1475 MOV BH,delay_holder ;AN000;
1476 CALL typamat ;AN000;
1477 .ENDIF ;AN000;
1478 ;AN000;
1479 BREAK 0 ;AN000;
1480 ;AN000;
1481 ;AN000;
1482 status_for_everything_case: ;AN000;
1483 ;AN000;
1484 MOV request_type,printer_status ;status routine for printers ;AN000;
1485 MOV device_name,OFFSET LPT1_str ;will display the reroute ;AN000;
1486 CALL analyze_and_invoke ;status for the printer whether ;AN000;
1487 MOV device_name,OFFSET LPT2_str ;it exists or not, so call for ;AN000;
1488 CALL analyze_and_invoke ;all of them ;AN000;
1489 MOV device_name,OFFSET LPT3_str ;AN000;
1490 CALL analyze_and_invoke ;AN000;
1491 ;AN000;
1492 MOV request_type,all_con_status ;AN000;
1493 CALL analyze_and_invoke ;AN000;
1494
1495 CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000;
1496
1497 MOV request_type,com_status ;AN000;
1498 MOV CL,com_ports_attached ;AN000;
1499 .FOR i = 1 TO CL ;AN000;
1500
1501 .SELECT ;AN000;
1502
1503 .WHEN <i EQ 1> ;AN000;
1504 MOV device_name,OFFSET COM1_str ;AN000; ;AN000;
1505
1506 .WHEN <i EQ 2> ;AN000;
1507 MOV device_name,OFFSET COM2_str ;AN000;
1508
1509 .WHEN <i EQ 3> ;AN000;
1510 MOV device_name,OFFSET COM3_str ;AN000;
1511
1512 .WHEN <i EQ 4> ;AN000;
1513 MOV device_name,OFFSET COM4_str ;AN0;AN000;
1514
1515 .ENDSELECT ;AN000;
1516
1517 CALL analyze_and_invoke ;AN000; ;AN000;
1518 .NEXT i ;AN000;
1519
1520 BREAK 0 ;AN000;
1521
1522
1523
1524 turn_off_reroute_case: ;user specified only LPTx[:] ;AN000;
1525 ;INPUT:lptno=ASCII printer number
1526
1527
1528
1529 CALL modeecno ;turn off rerouting ;AN000;
1530 XOR CX,CX ;initialize prn_ports_attached
1531 CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached
1532 ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number
1533 .IF <prn_ports_attached GE LPTNO> THEN ;IF the printer exists THEN
1534 CALL set_retry_type ;turn off infinit retry ;AN000;
1535 CALL modify_resident_code ;modify resident code to reflect retry turned off ;AN000;
1536 .ENDIF
1537
1538 BREAK 0 ;AN000;
1539
1540 ;AN000;
1541ENDCASE_0: ;AN000;
1542 ;AN000;
1543RET ;AN000;
1544 ;AN000;
1545analyze_and_invoke ENDP ;AN000;
1546 ;AN000;
1547 ;AN000;
1548PRINTF_CODE ENDS ;AN000;
1549 END ;AN000;
diff --git a/v4.0/src/CMD/MODE/MAIN.ASM b/v4.0/src/CMD/MODE/MAIN.ASM
new file mode 100644
index 0000000..73acd7f
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MAIN.ASM
@@ -0,0 +1,168 @@
1;m
2 PAGE ,132 ;
3 TITLE MODE COMMAND - MAIN PROCEDURE AND COMMAND PARSING
4.XLIST
5 INCLUDE STRUC.INC
6.LIST
7;.SALL
8
9
10;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
11;º º
12
13; AC001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
14; implement the SYSGETMSG method of getting addressability to
15; the pieces. This means that the code does a SYSGETMSG call
16; which returns a pointer (DS:SI) to the message piece. The
17; address is then put in the sublist block for the message
18; being issued.
19
20; AN002 - P4011: Need to close all open handles before terminating and staying
21; resident so don't eat into the total available handles for the
22; system.
23;º º
24;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
25
26INCLUDE SYSMSG.INC
27
28MSG_UTILNAME <MODE>
29
30
31;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32;º º
33
34false EQU 00H
35STDIN EQU 0 ;AN002;handle for standard input device
36STDPRN EQU 4 ;AN002;handle for standard printer device
37TERMINATE EQU 4CH ;INT 21 "TERMINATE RETURNING CODE" FUNCTION
38terminate_and_stay_resident EQU 31H ;INT 21 "terminate and remain resident"
39truu EQU 0FFH
40
41;º º
42;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
43
44
45;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
46;º º
47
48
49;º º
50;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
51
52
53 PAGE
54PRINTF_CODE SEGMENT PUBLIC
55 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE
56
57
58;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
59;º º
60
61PUBLIC main
62PUBLIC SYSDISPMSG
63PUBLIC SYSGETMSG
64
65
66;º º
67;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
68
69
70;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
71;º º
72
73EXTRN analyze_and_invoke:NEAR
74EXTRN get_machine_type:NEAR ;get model and sub-model bytes
75EXTRN initialize_sublists:NEAR ;see display.asm
76EXTRN move_destination:ABS ;location of res code after it has been moved
77EXTRN noerror:BYTE
78EXTRN parse_parameters:NEAR
79EXTRN PRINTF:NEAR
80EXTRN rescode_length:ABS ;length in paragraphs of the resident code
81EXTRN stay_resident:BYTE ;boolean indicating just loaded resident code see 'rescode'
82
83;º º
84;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
85
86
87;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
88;º º
89
90
91 DB "The MODE command "
92 DB "--------------------------------------------------------------"
93
94;º º
95;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
96
97;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
98;º º
99
100close_handles PROC NEAR ;AN002;close all standard device handles
101 ;AN002;
102MOV AH,3EH ;AN002;
103 ;AN002;
104.FOR BX = STDIN TO STDPRN ;AN002;
105 INT 21H ;AN002;
106.NEXT BX ;AN002;
107 ;AN002;
108RET ;AN002;
109 ;AN002;
110close_handles ENDP ;AN002;
111
112;º º
113;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
114
115
116;
117;-------------------------------------------------------------------------------
118
119MSG_SERVICES <MSGDATA> ;define message service data area
120
121MSG_SERVICES <LOADmsg,GETmsg,DISPLAYmsg,CHARmsg,NUMmsg,INPUTmsg> ;AC001;
122MSG_SERVICES <mode.cla,mode.clb,mode.cl1,mode.cl2> ;class B is for messages > 30
123;;RPS MSG_SERVICES <mode.cl1,mode.cl2>
124
125
126main PROC NEAR
127
128CALL SYSLOADMSG ;load the message text
129.IF NC THEN ;IF messages loaded successfully THEN
130 CALL get_machine_type
131 CALL initialize_sublists
132 CALL parse_parameters
133 .IF <noerror EQ truu> THEN ;no problems parsing so continue
134 CALL analyze_and_invoke ;semantically analyze the parms and invoke appropriate routine
135 .ENDIF
136
137 MOV AH,TERMINATE ;assume won't stay resident
138 .IF <noerror EQ false> THEN
139 MOV AL,1 ;had a problem somewhere
140 .ELSE
141 .IF <stay_resident EQ truu> THEN
142 CALL close_handles ;close all standard devices;AN002;
143 MOV DX,move_destination
144 MOV CL,4 ;4 right shifts = divide by 16
145 SAR DX,CL ;DX=offset of start of resident code in paragraphs
146 ;SET END OF RESIDENT CODE FOR "terminate and remain resident"
147 ;TO first usable
148 ADD DX,rescode_length ;BYTE OF PROGRAM segment PREFIX
149 MOV AH,terminate_and_stay_resident
150 .ENDIF
151 MOV AL,0 ;all went well
152 .ENDIF
153.ELSE ;ABORT
154
155 CALL SYSDISPMSG ;display some "I'm crashing" message
156
157.ENDIF
158
159
160INT 21H ;TERMINATE RETURNING ERRORLEVEL INDICATING success
161RET
162
163include msgdcl.inc
164
165main ENDP
166
167PRINTF_CODE ENDS
168 END
diff --git a/v4.0/src/CMD/MODE/MAKEFILE b/v4.0/src/CMD/MODE/MAKEFILE
new file mode 100644
index 0000000..0e059d8
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MAKEFILE
@@ -0,0 +1,130 @@
1#************************** makefile for cmd\... ***************************
2
3msg =..\..\messages
4dos =..\..\dos
5inc =..\..\inc
6hinc =..\..\h
7
8#
9####################### dependencies begin here. #########################
10#
11
12all: mode.com
13
14mode.ctl: mode.skl \
15 makefile \
16 $(msg)\$(COUNTRY).msg
17
18
19main.obj: main.asm \
20 makefile \
21 $(inc)\copyrigh.inc \
22 $(inc)\versiona.inc \
23 $(inc)\struc.inc \
24 $(inc)\sysmsg.inc \
25 $(inc)\msgserv.asm \
26 mode.ctl \
27 mode.cl1 \
28 mode.cl2 \
29 mode.cla \
30 mode.clb
31
32scrntab.obj: scrntab.asm \
33 makefile
34
35modescrn.obj: modescrn.asm \
36 makefile \
37 $(inc)\struc.inc
38
39rescode.obj: rescode.asm \
40 makefile \
41 $(inc)\struc.inc
42
43modecom.obj: modecom.asm \
44 makefile \
45 $(inc)\struc.inc \
46 modequat.inc \
47 common.stc
48
49modeprin.obj: modeprin.asm \
50 makefile \
51 $(inc)\struc.inc
52
53modevid.obj: modevid.asm \
54 makefile \
55 $(inc)\struc.inc
56
57modeecho.obj: modeecho.asm \
58 makefile \
59 common.stc \
60 $(inc)\struc.inc
61
62modeleng.obj: modeleng.asm \
63 modequat.inc \
64 makefile \
65 $(inc)\struc.inc
66
67modemes.obj: modemes.asm \
68 makefile \
69 $(inc)\msgserv.asm \
70 modesubs.inc \
71 modedefs.inc \
72 modequat.inc \
73 common.stc
74
75display.obj: display.asm \
76 makefile \
77 common.stc
78
79typamat.obj: typamat.asm \
80 makefile \
81 $(inc)\struc.inc \
82 modequat.inc
83
84invoke.obj: invoke.asm \
85 makefile \
86 $(inc)\struc.inc \
87 modequat.inc \
88 common.stc
89
90modepars.obj: modepars.asm \
91 makefile \
92 $(inc)\struc.inc \
93 $(inc)\psdata.inc \
94 modequat.inc \
95 common.stc
96
97
98parshell.obj: parshell.asm \
99 makefile \
100 $(inc)\parse.asm
101
102
103modecp.obj: modecp.asm \
104 makefile \
105 modecpro.inc \
106 modecpeq.inc \
107 modecpms.inc \
108 $(inc)\struc.inc
109
110mode.com: main.obj \
111 makefile \
112 scrntab.obj \
113 modescrn.obj \
114 rescode.obj \
115 modecom.obj \
116 modeprin.obj \
117 modevid.obj \
118 modeleng.obj \
119 modeecho.obj \
120 modecp.obj \
121 display.obj \
122 typamat.obj \
123 invoke.obj \
124 parshell.obj \
125 modepars.obj \
126 modemes.obj \
127 mode.lnk
128 link @mode.lnk
129 exe2bin mode.exe mode.com
130 del mode.exe
diff --git a/v4.0/src/CMD/MODE/MODE.LNK b/v4.0/src/CMD/MODE/MODE.LNK
new file mode 100644
index 0000000..5f49459
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODE.LNK
@@ -0,0 +1,17 @@
1/MAP RESCODE+
2MODEECHO+
3MODELENG+
4MODEMES+
5MODESCRN+
6MAIN+
7MODEVID+
8MODEPRIN+
9MODECOM+
10SCRNTAB+
11MODECP+
12DISPLAY+
13TYPAMAT+
14INVOKE+
15PARSHELL+
16MODEPARS,MODE;
17 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/MODE.SKL b/v4.0/src/CMD/MODE/MODE.SKL
new file mode 100644
index 0000000..b93dfc5
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODE.SKL
@@ -0,0 +1,193 @@
1;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
2;º º
3
4; AN001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
5; implement the SYSGETMSG method of getting addressability to
6; the pieces. This means that the code does a SYSGETMSG call
7; which returns a pointer (DS:SI) to the message piece. The
8; address is then put in the sublist block for the message
9; being issued.
10
11;º º
12;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
13
14
15:util MODE ;AN000;
16 ;AN000;
17:class 1 ;AN000;
18 ;AN000;
19;:use extend3 ;AN000;
20;:use extend15 ;AN000;
21 ;AN000;
22:class 2 ;AN000;
23 ;AN000;
24;:use parse1 ;AN000;
25;:use parse3 ;Invalid switch
26;:use parse7 ;AN000;
27;:use parse8 ;AN000;
28 ;AN000;
29 ;AN000;
30:class A ;Transient messages, all MODE's messages are transient ;AN000;
31 ;AN000;
32:use 1 COMMON1 ;"Incorrect DOS Version" ;AN000;
33:use 2 extend1 ;AN000;
34:def 3 CR,LF,"Must specify COM1, COM2, COM3 or COM4",CR,LF ;AN000;
35:def 4 CR,LF,"Resident portion of MODE loaded",CR,LF ;AN000;
36:def 5 CR,LF,"Illegal device name",CR,LF ;AN000;
37:def 6 CR,LF,"Printer error",CR,LF ;AN000;
38:def 7 CR,LF,"LPT%1: set for 80",CR,LF ;AN000;
39:def 8 CR,LF,"LPT%1: set for 132",CR,LF ;AN000;
40:def 9 CR,LF,"Printer lines per inch set",CR,LF ;AN000;
41:def 10 CR,LF,"Invalid baud rate specified",CR,LF ;AN000;
42:def 11 CR,LF,"COM%1: %2,%3,%4,%5,%6",CR,LF ;AN000;
43; DEVICE - 1, 2, 3 or 4 ;AN000;
44; BAUD - 110, 150, 300, 600, 1200, 2400, 4800, 9600 etc. ;AN000;
45; PARITY - n, o, e etc ;AN000;
46; DATA - 5, 6, 7, or 8 ;AN000;
47; STOP - 1, 1.5 or 2 ;AN000;
48; P - old retry indication ;AN000;
49:def 12 "0123456789" ;AN000;
50:def 13 CR,LF,"Do you see the %1? (YES/NO)",CR,LF ;AN000;
51 ;"rightmost 9?" ;goes at the end of "Do you see the" ;AN000;
52 ;"leftmost 0?" ;goes at the end of "Do you see the" ;AN000;
53; Fourteen used to be "Invalid parameters", now use message 54 for those cases.
54:def 15 "LPT%1: rerouted to COM%2:",CR,LF ;AN000;
55:def 16 "LPT%1: not rerouted",CR,LF ;AN000;
56:def 17 CR,LF,"%1 retry on parallel printer time-out",CR,LF ;AN000;
57; ONE OF THE FOLLOWING TWO WORDS IS INSERTED: ;AN000;
58 ;"No" ;goes before "retry on parallel printer time-out" ;AN000;
59 ;"Infinite" ;goes before "retry on parallel printer time-out" ;AN000;
60:def 18 CR,LF," Unable to shift screen %1",CR,LF ;AN000;
61 ;"left" ;goes at the end of "Unable to shift screen" ;AN000;
62 ;"right" ;goes at the end of "Unable to shift screen" ;AN000;
63; ;The offending_parameter is determined by parsing logic ;AN000;
64:use 19 PARSE10 ;"Invalid parameter - %1",CR,LF ;AN000;
65:def 20 CR,LF,"Invalid number of parameters",CR,LF ;AN000;
66:def 21 CR,LF,"NET 042: Unable to do requested command",CR,LF ;AN000;
67:def 22 CR,LF,"Infinite retry not supported on Network printer",cr,lf ;AN000;
68:def 23 CR,LF,"Failure to access code page Font File",CR,LF ;AN000;
69 ;%1 FILLED IN WITH PTR TO DEVICE NAME ;AN000;
70:def 24 CR,LF,"Failure to access device: %1",CR,LF ;AN000;
71:def 25 CR,LF,"Device or code page missing from font file",CR,LF ;AN000;
72:def 26 CR,LF,"Font file contents invalid",CR,LF ;AN000;
73:def 27 CR,LF,"Previously prepared code page replaced",CR,LF ;AN000;
74:def 28 CR,LF,"Active code page for device %1 is %2",CR,LF ;AN000;
75 ;%1 FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000;
76 ;%2 FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000;
77:def 29 CR,LF,"Device %1 not prepared",CR,LF ;AN000;
78 ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000;
79 ;"hardware" ;used before "codepages:" ;AN000;
80 ;"prepared" ;AN000;
81 ;AN000;
82:class B ;nothing special, just too many messages for one class ;AN000;
83 ;AN000;
84:def 30 "%1 code pages:",CR,LF ;AN000;
85:def 31 " code page %1",CR,LF ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000;
86:def 32 CR,LF,"MODE %1 code page function completed",CR,LF ;AN000;
87 ;FILLED IN with one of: ;AN000;
88 ; "Status" ;AN000;
89 ; "Prepare" ;AN000;
90 ; "Select" ;AN000;
91 ; "Refresh" ;AN000;
92 ;AN000;
93:def 33 CR,LF,"Current code page settings:",CR,LF ;table header ;AN000;
94 ;AN000;
95:def 34 " %1 - %2 code page",CR,LF ;AN000;
96 ;%1 FILLED IN WITH CODEPAGE ID ;AN000;
97 ;%2 FILLED IN TO POINT TO "Selected" or "System". ;AN000;
98 ;AN000;
99:def 35 " Code page not prepared",CR,LF ;AN000;
100:def 36 "Code page operation not supported on this device",CR,LF ;AN000;
101 ;AN000;
102:def 37 "No code page has been SELECTED",CR,LF ;AN000;
103 ;AN000;
104:def 38 "Device error during %1",CR,LF ;AN000;
105 ;FILLED IN TO POINT TO: ;AN000;
106; "Status" ;AN000;
107; "Prepare" ;AN000;
108; "Select" ;AN000;
109; "Refresh" ;AN000;
110; "write of font file to device" ;AN000;
111 ;AN000;
112:def 39 "code page not prepared",CR,LF ;AN000;
113 ;AN000;
114:def 40 CR,LF,"Current keyboard does not support this code page",CR,LF ;AN000;
115 ;AN000;
116:def 41 CR,LF,"Error during read of font file",CR,LF ;AN000;
117 ;AN000;
118:def 42 CR,LF,"Unable to perform REFRESH operation",CR,LF ;AN000;
119 ;AN000;
120:use 43 COMMON38 ;used for formatting common messages for consistent spacing ;AN000;
121 ;AN000;
122:def 44 CR,LF,"Status for device %1:",CR,LF ;header for status reports ;AN000;
123 ;AN000;
124:def 45 "------------------" ;first part of underline under "Status for device %1:" ;AN000;
125 ;AN000;
126:def 46 "----",CR,LF ;four_char_underline ;AN000;
127 ;AN000;
128:def 47 "-----",CR,LF ;five_char_underline ;AN000;
129 ;AN000;
130:def 48 "LINES=%1",CR,LF ;AN000;
131 ;AN000;
132:def 49 "COLUMNS=%1",CR,LF ;AN000;
133 ;AN000;
134:def 50 CR,LF,"RATE and DELAY must be specified together",CR,LF ;AN000;
135 ;AN000;
136:def 51 "RATE=%1",CR,LF ;AN000;
137 ;AN000;
138:def 52 "DELAY=%1",CR,LF ;AN000;
139 ;AN000;
140:def 53 CR,LF,"Function not supported on this computer - %1",CR,LF ;AN000;
141 ;AN000;
142:def 54 CR,LF,"Required font not loaded",CR,LF ;AN000;
143 ;AN000;
144:def 55 CR,LF,"ANSI.SYS must be installed to perform requested function",CR,LF ;AN000;
145 ;AN000;
146:def 56 CR,LF,"Baud rate required",CR,LF ;AN000;
147 ;AN000;
148:def 57 "RETRY=%1",CR,LF ;AN000;
149 ;AN000;
150:use 58 PARSE9 ;"Syntax error - ???????",CR,LF ;AN000;
151
152
153;Following are the definitions of pieces of messages.
154
155 ;AN000;
156;SHIFT_MSG - CR,LF,"Do you see the %s? (",YES,"/",NO,")",CR,LF,EOM
157
158:def 59 "rightmost 9",0 ;AN001;RIGHTMOST DB
159:def 60 "leftmost 0",0 ;AN001;LEFTMOST DB
160
161;RETPARTO - CR,LF,"%s retry on parallel printer time-out",CR,LF,EOM
162
163:def 61 "No",0 ;AN001;NORETRY DB
164:def 62 "Infinite",0 ;AN001;INFINITE DB
165
166;CANT_SHIFT - CR,LF," Unable to shift screen %s",CR,LF,BEEP,EOM
167
168:def 63 "left",0 ;AN001;LEFT DB
169:def 64 "right",0 ;AN001;RIGHT DB
170
171;CPMSG8 DB "%S code pages:",CR,LF,EOM
172
173:def 65 "Hardware",0 ;AN001;CPMSG8_HW DB
174:def 66 "Prepared",0 ;AN001;CPMSG8_PR DB
175
176;CPMSG10 DB "MODE %S code page function completed",CR,LF,EOM
177;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM
178
179:def 67 "status",0 ;AN001;CPMSG17_QUERY CPMSG10_QUERY
180:def 68 "prepare",0 ;AN001;CPMSG17_PREP CPMSG10_DES
181:def 69 "select",0 ;AN001;CPMSG17_ACT CPMSG10_SELECT
182:def 70 "refresh",0 ;AN001;CPMSG17_REFRESH CPMSG10_REFRESH
183
184;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM
185
186:def 71 "write of font file to device",0 ;AN001;CPMSG17_WRIT
187
188;CPMSG13 DB " %D - %S code page",CR,LF,EOM
189
190:def 72 "selected",0 ;AN001;CPMSG13_ACT
191:def 73 "system",0 ;AN001;CPMSG13_SYS
192
193:end ;AN000;
diff --git a/v4.0/src/CMD/MODE/MODECOM.ASM b/v4.0/src/CMD/MODE/MODECOM.ASM
new file mode 100644
index 0000000..7ab77f0
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECOM.ASM
@@ -0,0 +1,592 @@
1PAGE ,132 ; ;AN000;
2TITLE MODECOM.ASM - RS232 SUPPORT FOR THE MODE COMMAND ;AN000;
3 ;AN000;
4.XLIST ;AN000;
5INCLUDE STRUC.INC ;AN000;
6.LIST ;AN000;
7
8;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
9;º º ;AN000;
10 ;AN000;
11; AC000 - P2852: Loading resident code trashed CX which was used as a shift
12; count.
13
14; AC001 - P3540: PS/2 only parms other than baud not being treated properly.
15
16;º º ;AN000;
17;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
18 ;AN000;
19 ;AN000;
20DISPLAY MACRO MESSAGE ;AN000;
21 MOV DX,OFFSET MESSAGE ;AN000;
22 CALL PRINTF ;AN000;
23ENDM ;AN000;
24 ;AN000;
25;------------------------------------------------------------------------ ;AN000;
26 ;AN000;
27ABORT MACRO ;AN000;
28 JMP ENDIF01 ;AN000;
29ENDM ;AN000;
30 ;AN000;
31 ;AN000;
32;------------------------------------------------------------------------ ;AN000;
33 ;AN000;
34INCLUDE common.stc ;contains the following structure ;AN000;
35 ;AN000;
36 ;AN000;
37;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000;
38; ;AN000;
39;parm_type DB bogus ;AN000;
40;item_tag DB 0FFH ;AN000;
41;value1 DW bogus ;used only for filespecs and code page numbers ;AN000;
42;value2 DW bogus ;used only for filespecs and code page numbers ;AN000;
43;keyword_switch_ptr DW 0 ;AN000;
44; ;AN000;
45;parm_list_entry ENDS ;AN000;
46 ;AN000;
47 ;AN000;
48 ;AN000;
49;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
50;º º ;AN000;
51 ;AN000;
52
53INCLUDE modequat.inc ;AN000;include definition of false, machine types
54
55 ;AN000;
56AT_family EQU 0FCH ;model byte for 286 boxes ;AN000;
57DEV1 EQU "1" ;CHAR IN "COM1:" ;AN000;
58DEV2 EQU "2" ;CHAR IN "COM2:" ;AN000;
59DEV3 EQU "3" ;CHAR IN "COM3:" ;AN000;
60DEV4 EQU "4" ;CHAR IN "COM4:" ;AN000;
61OFFTO EQU modeto ;OFFSET OF MODETO IN RESIDENT CODE FROM SEGMENT ;AN000;
62 ; STORED AT 530H BY MODELOAD ;AN000;
63not_specified EQU 0 ;AN000;
64parm_list EQU [BP] ;AN000;
65;Roughrider EQU 05 ;sub model byte ;AN000;
66SPACE EQU " " ;BLANK CHARACTER ;AN000;
67;Trailboss EQU 04 ;sub model byte for 'Trailboss' ;AN000;
68true EQU 0FFH ;AN000;
69;Wrangler EQU 0F8H ;primary model byte ;AN000;
70 ;AN000;
71 ;AN000;
72;º º ;AN000;
73;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
74
75 ; BEGINNING OF PROC MODETO) ;AN000;
76ROM SEGMENT AT 0 ;AN000;
77 ORG 50H ;AN000;
78VECT14H LABEL DWORD ;RS232 CALL, POINTS TO PROC MODETO WHEN ;AN000;
79 ; WHEN CODE IS RESIDENT ;AN000;
80 ORG 400H ;AN000;
81SERIAL_BASE LABEL WORD ;SERIAL PORT ADDRESSES ;AN000;
82 ORG 530H ;AN000;
83RESSEG LABEL DWORD ;VECTOR OF MODETO, WHEN RESIDENT ;AN000;
84ROM ENDS ;AN000;
85PAGE ;AN000;
86PRINTF_CODE SEGMENT PUBLIC ;AN000;
87 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE ;AN000;
88 ;AN000;
89;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
90;º º ;AN000;
91 ;AN000;
92EXTRN B_item_tag:ABS ;see modepars ;AN000;
93EXTRN baud_19200:BYTE ;AN000;
94EXTRN busy_retry_active:ABS ;see invoke.asm ;AN000;
95EXTRN E_item_tag:ABS ;see modepars ;AN000;
96EXTRN eight_item_tag:ABS ;see modepars ;AN000;
97EXTRN ERR1:WORD ;AN000;
98EXTRN even_item_tag:ABS ;see modepars ;AN000;
99EXTRN error_retry_active:ABS ;see invoke.asm ;AN000;
100EXTRN five_item_tag:ABS ;see modepars ;AN000;
101EXTRN fourtyeighthundred_item_tag:ABS ;see modepars.asm ;AN000;
102EXTRN fourtyeighthundred_str:BYTE ;AN000;
103EXTRN illegal_device_ptr:WORD ;see modesubs.inc ;AN000;
104EXTRN INITMSG:BYTE,DEVICE:BYTE,PPARITY:BYTE,PDATA:BYTE,PSTOP:BYTE,PPARM:BYTE ;AN000;
105EXTRN keyword:ABS ;AN000;
106EXTRN machine_type:BYTE ;see 'rescode' ;AN000;
107EXTRN mark_item_tag:ABS ;see modepars ;AN000;
108EXTRN MODELOAD:NEAR ;AN000;
109EXTRN MODETO:WORD ;AN000;
110EXTRN new_com_initialize:BYTE ;flag indicating that a PS/2 only parm was specified ;AC001;
111EXTRN nineteentwohundred_item_tag:ABS ;see modepars.asm ;AN000;
112EXTRN nineteentwohundred_str:BYTE ;see modepars.asm ;AN000;
113EXTRN ninetysixhundred_item_tag:ABS ;AC001;
114EXTRN ninetysixhundred_str:BYTE ;AN000;
115EXTRN no_retry_active:ABS ;see invoke.asm ;AN000;
116EXTRN noerror:byte ;boolean indicating success of previous actions ;AN000;
117EXTRN none_item_tag:ABS ;see modepars ;AN000;
118EXTRN onefifty_str:BYTE ;AN000;
119EXTRN oneten_item_tag:ABS ;see modepars.asm ;AN000;
120EXTRN oneten_str:BYTE ;AN000;
121EXTRN onefifty_item_tag:ABS ;see modepars.asm ;AN000;
122EXTRN one_point_five_item_tag:ABS ;see modepars.asm ;AN000;
123EXTRN one_point_five_str:BYTE ;see modesubs.inc ;AN000;
124EXTRN p_item_tag:ABS ;see modepars.asm ;AN000;
125EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>) ;AN000;
126EXTRN parms_form:BYTE ;AN000;
127EXTRN pstop_ptr:WORD ;see modedefs.inc ;AN000;
128EXTRN odd_item_tag:ABS ;see modepars ;AN000;
129EXTRN one_item_tag:ABS ;see modepars ;AN000;
130EXTRN PBAUD_ptr:WORD ;see 'modemes' ;AN000;
131EXTRN PRINTF:NEAR ;AN000;
132EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE ;AN000;
133;PARM1 DB 10 DUP(0) ;AN000;
134;PARM2 DB 0 ;AN000;
135;PARM3 DB 0 ;AN000;
136;MODE DB 0 ;AN000;
137;FLAG DB 0 ;AN000;
138EXTRN R_item_tag:ABS ;AN000;
139EXTRN RATEMSG:WORD ;CR,LF,"Invalid baud rate specified",BEEP,CR,LF,"$" ;AN000;
140EXTRN ready_retry_active:ABS ;see invoke.asm ;AN000;
141;EXTRN RES_MODEFLAG:ABS ;RETRY FLAG IN RESIDENT CODE, (OFFSET FROM ;AN000;
142EXTRN res_com_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is resident, see rescode
143EXTRN seven_item_tag:ABS ;see modepars ;AN000;
144EXTRN sixhundred_item_tag:ABS ;see modepars.asm ;AN000;
145EXTRN sixhundred_str:BYTE ;AN000;
146EXTRN six_item_tag:ABS ;see modepars ;AN000;
147EXTRN space_item_tag:ABS ;see modepars ;AN000;
148EXTRN submodel_byte:BYTE ;see 'rescode' ;AN000;
149EXTRN threehundred_item_tag:ABS ;see modepars.asm ;AN000;
150EXTRN threehundred_str:BYTE ;AN000;
151EXTRN twelvehundred_item_tag:ABS ;see modepars.asm ;AN000;
152EXTRN twelvehundred_str:BYTE ;AN000;
153EXTRN twentyfourhundred_str:BYTE ;AN000;
154EXTRN twentyfourhundred_item_tag:ABS ;see modepars.asm ;AN000;
155EXTRN two_item_tag:ABS ;see modepars ;AN000;
156 ;AN000;
157 ;AN000;
158;º º ;AN000;
159;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
160 ;AN000;
161 ;AN000;
162;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
163;º º ;AN000;
164 ;AN000;
165PUBLIC baud_index ;holder of the index in the parm list of the baud rate requested ;AN000;
166PUBLIC data_bits_index ;set by invoke ;AN000;
167PUBLIC MODECOM ;AN000;
168PUBLIC parity_index ;set by invoke ;AN000;
169PUBLIC SERIAL_BASE ;Make available to RESCODE and MAIN ;AN000;
170PUBLIC retry_index ;make available to analyze_and_invoke ;AN000;
171PUBLIC setcom ;get it listed in the link map ;AN000;
172PUBLIC setto ;get it listed in link map for debugging ;AN000;
173PUBLIC stop_bits_index ;set by invoke ;AN000;
174 ;AN000;
175;º º ;AN000;
176;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
177 ;AN000;
178 ;AN000;
179 ;AN000;
180;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
181;º º ;AN000;
182 ;AN000;
183 ;AN000;
184;THESE FOLLOWING BAUD RATES REPRESENT THE 1ST 2 CHAR ;AN000;
185baud_index DW TYPE parm_list_entry ;holder of the index into the parm list of the baud rate ;AN000;
186data_bits_index DW 0 ;holder of the index into the parm list of the data bits ;AN000;
187parity_index DW 0 ;holder of the index into the parm list of the parity ;AN000;
188stop_bits_index DW 0 ;holder of the index into the parm list of the stop bits ;AN000;
189retry_index DW 0 ;AN000;
190 ;AN000;
191;INITMSG DB CR,LF ;AN000;
192; DB "COM" ;AN000;
193;DEVICE DB " " ;AN000;
194; DB ": " ;SEPARATOR BLANK ;AN000;
195;PBAUD DB 4 DUP(" ") ;AN000;
196; DB "," ;SEPARATOR ;AN000;
197;PPARITY DB "e" ;DEFAULT IS EVEN PARITY ;AN000;
198; DB "," ;SEPARATOR ;AN000;
199;PDATA DB "7" ;DEFAULT IS 7 DATA BITS PER BYTE ;AN000;
200; DB "," ;SEPARATOR ;AN000;
201;PSTOP DB "1" ;DEFAULT FOR BAUD > 110, CHANGED TO 2 FOR 110 ;AN000;
202; DB "," ;SEPARATOR ;AN000;
203;PPARM DB " " ;AN000;
204; DB CR,LF,"$" ;END OF 'INITMSG' ;AN000;
205 ;AN000;
206 ;AN000;
207;º º ;AN000;
208;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
209 ;AN000;
210 ;AN000;
211SUBTTL SET UP FOR SERIAL RETRY ;AN000;
212PAGE ;AN000;
213;
214;
215;-------------------------------------------------------------------------------
216;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
217;³ ³
218;³ SETTO ³
219;³ ----- ³
220;³ ³
221;³ Set the resident retry flag to type of retry active for comx. ³
222;³ ³
223;³ INPUT: device - holds '1', '2', '3' or '4' (ascii) for x of lptx. ³
224;³ retry_index - holds index value for the parsed retry parameter. ³
225;³ resseg - holds offset of resident code in memory ³
226;³ res_com_retry_type - holds offset of com retry flag in resident ³
227;³ code. ³
228;³ ³
229;³ ³
230;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³
231;³ flag in resident code set ³
232;³ ³
233;³ ³
234;³ MESSAGES: none. ³
235;³ ³
236;³ ³
237;³ REGISTER ³
238;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³
239;³ format) ³
240;³ CL - shift bit count ³
241;³ ES - holds segment of resident code ³
242;³ BP - offset of parameter list ³
243;³ DI - offset of retry index within parameter list ³
244;³ DL - current resident flag setting ³
245;³ ³
246;³ ³
247;³ PSUEDO CODE: ³
248;³ ³
249;³ SAVE REGISTERS ³
250;³ SET UP SEGMENT REGISTER AND BIT MASKS ³
251;³ IF <RETRY REQUESTED> ³
252;³ SET UP PARAMETER LIST STRUCTURE ³
253;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³
254;³ IF <RESIDENT CODE IS NOT LOADED> ³
255;³ LOAD RESIDENT CODE ³
256;³ ENDIF ³
257;³ GET CURRENT com_lpt_retry_type ³
258;³ SET AND STORE NEW com_lpt_retry_type ³
259;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
260;³ GET CURRENT com_lpt_retry_type ³
261;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
262;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
263;³ ELSE ³
264;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
265;³ ENDIF ³
266;³ ELSE ³
267;³ SET pparm TO '-' ³
268;³ ENDIF ³
269;³ RESTORE REGISTERS ³
270;³ RETURN ³
271;³ ³
272;³ ³
273;³ ³
274;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³
275;³ ³
276;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
277;
278SETTO PROC NEAR ;AN663;
279 ;AN663;
280 PUSH ES ;save registers ;AN663;
281 PUSH DI ;AN663;
282 PUSH AX ;AN663;
283 PUSH DX ;AN663;
284 ;AN663;
285 XOR AX,AX ;clear a reg ;AN663;
286 MOV ES,AX ;set to segment at 0 ;AN663;
287 MOV CL,device ;AN663;
288 AND CL,07H ;AN663;
289 DEC CL ;AN663;
290 SHL CL,1 ;AN663;
291 MOV DH,11111100B ;set bit mask to clear old flag setting ;AN663;
292 ROL DH,CL ;AN663;
293 ;AN663;
294 .IF <retry_index NE 0> THEN ;retry specified, set ;AN663;
295 ; byte in resident code ;AN663;
296 MOV DI,retry_index ; to proper setting. ;AN663;
297 ; if code is not loaded, ;AN663;
298 .SELECT ; loaded it. ;AN663;
299 .WHEN <parm_list[DI].item_tag EQ P_item_tag> ;AN663;
300 MOV AL,busy_retry_active ;AN663;
301 MOV pparm,'p' ;AN663;
302 .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663;
303 MOV AL,error_retry_active ;AN663;
304 MOV pparm,'e' ;AN663;
305 .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
306 MOV AL,busy_retry_active ;AN663;
307 MOV pparm,'b' ;AN663;
308 .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
309 MOV AL,ready_retry_active ;AN663;
310 MOV pparm,'r' ;AN663;
311 .ENDSELECT ;AN663;
312 ;AN663;
313 .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663;
314 PUSH CX ;save shift count
315 CALL modeload ;load the resident code ;AN663;
316 POP CX ;restore shift count
317 .ENDIF ;AN663;
318 ;AN663;
319 MOV ES,ES:WORD PTR resseg[2] ;AN663;
320 MOV DL,BYTE PTR ES:res_com_retry_type ;AN663;
321 ;get the old setting ;AN663;
322 ROL AL,CL ;AN663;
323 AND DL,DH ;AN663;
324 OR DL,AL ;AN663;
325 MOV BYTE PTR ES:res_com_retry_type,DL ;store the new setting ;AN663;
326 ;AN663;
327 .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663;
328 ; retry is specified then ;AN663;
329 MOV ES,ES:WORD PTR resseg[2] ;AN663;
330 MOV DL,BYTE PTR ES:res_com_retry_type ;AN663;
331 ;AN663;
332 .IF <parms_form NE keyword> ;if 'NONE' was specified ;AN663;
333 ; with positional parameter ;AN663;
334 AND DL,DH ; set bits to zero ;AN663;
335 MOV BYTE PTR ES:res_com_retry_type,DL ;AN663;
336 ;AN663;
337 .ELSE ;else update pparm with ;AN663;
338 ; current retry type ;AN663;
339 NOT DH ;AN663;
340 AND DL,DH ;AN663;
341 SHR DL,CL ;AN663;
342 ;AN663;
343 .SELECT ;set pparm to proper letter ;AN663;
344 .WHEN <DL EQ no_retry_active> ;AN663;
345 MOV pparm,'-' ;AN663;
346 .WHEN <DL EQ error_retry_active> ;AN663;
347 MOV pparm,'e' ;AN663;
348 .WHEN <DL EQ busy_retry_active> ;AN663;
349 MOV pparm,'b' ;AN663;
350 .WHEN <DL EQ ready_retry_active> ;AN663;
351 MOV pparm,'r' ;AN663;
352 .ENDSELECT ;AN663;
353 ;AN663;
354 .ENDIF ;AN663;
355 ;AN663;
356 .ELSE ;no retry, no code resident ;AN663;
357 ;AN663;
358 MOV pparm,'-' ;AN663;
359 ;AN663;
360 .ENDIF ;AN663;
361 ;AN663;
362 POP DX ;AN663;
363 POP AX ;restore registers ;AN663;
364 POP DI ;AN663;
365 POP ES ;AN663;
366 RET ;AN663;
367 ;AN663;
368SETTO ENDP ;AN663;
369
370
371
372SUBTTL SET SERIAL PROTOCOL
373PAGE
374
375;------------------------------------------------------------------------------
376
377;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
378;³ ³
379;³ SETCOM ³
380;³ ------ ³
381;³ ³
382;³ ³
383;³ ³
384;³ INPUT: ³
385;³ ³
386;³ ³
387;³ ³
388;³ ³
389;³ ³
390;³ ³
391;³ RETURN: ³
392;³ ³
393;³ ³
394;³ ³
395;³ MESSAGES: none. ³
396;³ ³
397;³ ³
398;³ REGISTER ³
399;³ USAGE: ³
400;³ ³
401;³ ³
402;³ ASSUMPTIONS: All parms have been checked for validity as being possible and³
403;³ supported on the machine. ³
404;³ ³
405;³ ³
406;³ ³
407;³ SIDE EFFECT: ³
408;³ ³
409;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
410
411SETCOM PROC NEAR ;AN000;
412 ;AN000;
413 ;AN000;
414MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000;
415MOV DI,baud_index ;DI=index into parm list of the baud rate entry ;AN000;
416
417.SELECT ;prepare AL for old init and CL for new init ;AC001;
418
419 .WHEN <parm_list[DI].item_tag EQ oneten_item_tag> ;AC001;
420 MOV AL,0 ;AN000;
421 MOV CL,0
422 MOV pbaud_ptr,OFFSET oneten_str ;AN000;
423 .WHEN <parm_list[DI].item_tag EQ onefifty_item_tag> THEN ;AN000;
424 MOV AL,00100000B ;AN000;
425 MOV CL,1
426 MOV pbaud_ptr,OFFSET onefifty_str ;AN000;
427 .WHEN <parm_list[DI].item_tag EQ threehundred_item_tag> THEN ;AN000;
428 MOV AL,01000000B ;AN000;
429 MOV CL,2
430 MOV pbaud_ptr,OFFSET threehundred_str ;AN000;
431 .WHEN <parm_list[DI].item_tag EQ sixhundred_item_tag> THEN ;AN000;
432 MOV AL,01100000B ;AN000;
433 MOV CL,3
434 MOV pbaud_ptr,OFFSET sixhundred_str ;AN000;
435 .WHEN <parm_list[DI].item_tag EQ twelvehundred_item_tag> THEN ;AN000;
436 MOV AL,10000000B ;AN000;
437 MOV CL,4
438 MOV pbaud_ptr,OFFSET twelvehundred_str ;AN000;
439 .WHEN <parm_list[DI].item_tag EQ twentyfourhundred_item_tag> THEN ;AN000;
440 MOV AL,10100000B ;AN000;
441 MOV CL,5
442 MOV pbaud_ptr,OFFSET twentyfourhundred_str ;AN000;
443 .WHEN <parm_list[DI].item_tag EQ fourtyeighthundred_item_tag> THEN ;AN000;
444 MOV AL,11000000B ;AN000;
445 MOV CL,6
446 MOV pbaud_ptr,OFFSET fourtyeighthundred_str ;AN000;
447 .WHEN <parm_list[DI].item_tag EQ ninetysixhundred_item_tag> THEN ;AN000;
448 MOV AL,11100000B ;AN000;
449 MOV CL,7
450 MOV pbaud_ptr,OFFSET ninetysixhundred_str ;AN000;
451 .WHEN <parm_list[DI].item_tag EQ nineteentwohundred_item_tag> NEAR THEN ;handle 19200 case if 19, 19200, 19.2 or 19.2K specified
452 MOV CL,8 ;value for 19200 baud, no old equivalent ;AC001;
453 MOV pbaud_ptr,OFFSET nineteentwohundred_str ;AC001;
454
455.ENDSELECT ;AC001;
456; AL IS: XXX00000 for the baud rate, CL has appropriate value for baud
457
458MOV DI,parity_index ;AN000;
459.IF <parm_list[DI].item_tag EQ none_item_tag> THEN ;AN000;
460 MOV PPARITY,"n" ;set up message for no PARITY ;AN000;
461 MOV BH,0 ;AL already set properly for old init ;AN000;
462.ELSEIF <parm_list[DI].item_tag EQ odd_item_tag> THEN ;AN000;
463 MOV PPARITY,"o" ;set up message for odd PARITY ;AN000;
464 OR AL,08H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=01 FOR PARITY=ODD ;AN000
465 MOV BH,1 ;new initialize ;AN000;
466.ELSEIF <parm_list[DI].item_tag EQ space_item_tag> THEN ;AN000;
467 MOV PPARITY,"s" ;set up message for space PARITY ;AN000;
468 MOV BH,4 ;SPACE not supported in old init ;AN000;
469.ELSEIF <parm_list[DI].item_tag EQ mark_item_tag> THEN ;AN000;
470 MOV PPARITY,"m" ;set up message for mark PARITY ;AN000;
471 MOV BH,3 ;MARK parity not supported in old init ;AN000;
472.ELSE ;not specified or asked for even ;AN000;
473 MOV PPARITY,"e" ;set up message for even PARITY, the default if not specified ;AN000;
474 OR AL,18H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=11 FOR PARITY=EVEN ;AN000
475 MOV BH,2 ;even parity for new initialize ;AN000;
476.ENDIF ;AN000;
477
478MOV DI,data_bits_index ;AN000;
479.IF <parm_list[DI].item_tag EQ five_item_tag> THEN ;AN000;
480 MOV pdata,"5" ;set up message for 5 bits ;AN000;
481 MOV CH,0 ;not old init for 5 data bits ;AN000;
482.ELSEIF <parm_list[DI].item_tag EQ six_item_tag> THEN ;AN000;
483 MOV pdata,"6" ;set up message for 6 bits ;AN000;
484 MOV CH,1 ;no old init for 6 data bits ;AN000;
485.ELSEIF <parm_list[DI].item_tag EQ eight_item_tag> THEN ;AN000;
486 MOV pdata,"8" ;set up message for 8 bits ;AN000;
487 OR AL,03H ;IN THE 000000XX POSITION, SET XX=11 TO MEAN 8 DATA BITS ;AN000;
488 MOV CH,3 ;AN000;
489.ELSE ;asked for 7 or skipped the parm and will get 7 as default ;AN000;
490 OR AL,02H ;IN THE 000000XX POSITION, SET XX=10 TO MEAN 7 DATA BITS ;AN000;
491 MOV CH,2 ;message already set up for 7 bits ;AN000;
492.ENDIF ;AN000;
493
494;PUT THE NO. STOP BITS TO AL PARM IN THE 00000X00 POSITION and BL for new init ;AN000
495MOV DI,stop_bits_index ;AN000;
496MOV BL,0 ;assume stop bits was 1, message already set up ;AN000;
497.SELECT
498 ;AN000;
499 .WHEN <parm_list[DI].item_tag EQ two_item_tag> ;AN000;
500 MOV pstop,"2" ;set up message for 2 stop bits ;AN000;
501 MOV BL,1 ;value for two or 1.5 ;AN000;
502
503 .WHEN <parm_list[DI].item_tag EQ one_point_five_item_tag> ;AN000; ;AN000;
504 MOV pstop_ptr,OFFSET one_point_five_str ;set up message for 1.5 stop bits ;AN000;
505 MOV BL,1 ;new init for 1.5 ;AN000;
506
507 .WHEN <stop_bits_index EQ not_specified> ;if stop bits not specified ;AN000;
508 MOV DI,baud_index ;AC000;
509 .IF <parm_list[DI].item_tag EQ oneten_item_tag> ;BAUD=110 SPECIFIED THEN SET DEFAULT STOP BITS TO TWO ;AC000;
510 OR AL,04H ;TURN ON BIT IN 00000X00 POSITION TO REQUEST 2 STOP BITS ;AN000;
511 MOV pstop,"2" ;set up message for 2 stop bits ;AN000;
512 .ENDIF ;FOR STOPBITS=1, LEAVE THAT BIT OFF, message already set by modecom ;AN000;
513
514; .OTHERWISE specified 1, everything set up
515
516.ENDSELECT ;IF not 1.5 or two, already set up for 1 ;AN000;
517 ;AN000;
518.IF <new_com_initialize EQ true> THEN ;AC001;
519 XOR AL,AL ;ask for no break ;AN000;
520 MOV AH,4 ;new set baud BIOS call ;AN001;
521.ELSE ;old style com initialization ;AN000; ;AC001;
522 XOR AH,AH ;AH=0 requests initialization ;AC001;
523.ENDIF ;AC001;
524
525 ;AN000;
526;SET DX PARM TO REQUEST WHICH COM DEVICE ;AN000;
527 XOR DX,DX ;AN000;
528 MOV DL,DEVICE ;device set by modepars in first_parm_case: ;AN000;
529 AND DL,07 ;convert to binary 1 thru 4 ;AN000;
530 DEC DL ;put in BIOS digestable 0 thru 3 ;AN000;
531; AH ALREADY IS 0 or 4, WHICH REQUESTS ;AN000;
532; INITIALIZATION OF THE RS232 ;AN000;
533; ACCORDING TO PARMS IN AL and/or BX and CX. ;AN000;
534 .IF <noerror EQ true> THEN ;AN000;
535 INT 14H ;INIT THE RS232 ;AN000;
536; ;AN000;
537; NOW THAT THE RS232 IS INITIALIZED, ;AN000;
538 CALL SETTO ;LOOK AT P PARM, MAYBE TIMEOUT TO BE RETRIED ;AN000;
539; ;AN000;
540 DISPLAY INITMSG ;TELL USER RS232 IS INITIALIZED ;AN000;
541 .ENDIF ;AN000;
542
543 RET ;AN000;
544SETCOM ENDP ;AN000;
545 ;AN000;
546 ;AN000;
547SUBTTL ;AN000;
548PAGE ;AN000;
549 ;AN000;
550 ;AN000;
551
552MODECOM PROC NEAR
553
554
555 MOV AL,DEVICE ;AL= DEVICE ID OF "1", "2", "3" or "4"
556 AND AL,07 ;TRANSLATE TO BINARY
557 DEC AL ;PUT IN ZERO BASE
558 SAL AL,1 ;POSITION OF PORT ADDRESS WORD (2*AL)
559 XOR AH,AH ;CLEAR AH
560 MOV SI,AX
561 XOR AL,AL ;CLEAR AX
562 PUSH DS
563 MOV DS,AX
564 CMP WORD PTR DS:SERIAL_BASE[SI],0 ;SEE IF THE COM PORT EXISTS
565 POP DS
566 JNE THEN01A
567 MOV DI,0 ;the device name is always the first parm ;AN000;
568 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000;
569 MOV CX,parm_list[DI].value1 ;AN000;
570 MOV illegal_device_ptr,CX
571 DISPLAY err1 ;AN000;"Illegal device name - COMX"
572 MOV noerror,false ;AN000;
573 ABORT
574;
575THEN01A:
576
577; DEFINE DEFAULTS:
578 MOV PSTOP,"1" ;ONE STOP BIT, OK FOR BAUD>110
579 MOV PDATA,"7" ;7 DATA BITS
580 MOV PPARM,"-" ;NO SERIAL TIMEOUT RETRY
581;
582
583;WE HAVE THE INFORMATION NEEDED TO INITIALIZE THE RS232 DEVICE
584;
585 CALL SETCOM ;SET THE RS232 DEVICE
586;
587; : ELSE ,SINCE COUNT WAS NOT BIG ENUF
588ENDIF01: ;jump to here if the port does not exist
589 RET ;RETURN TO MODE MAIN ROUTINE
590MODECOM ENDP
591PRINTF_CODE ENDS
592 END
diff --git a/v4.0/src/CMD/MODE/MODECP.ASM b/v4.0/src/CMD/MODE/MODECP.ASM
new file mode 100644
index 0000000..c3f1e38
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECP.ASM
@@ -0,0 +1,1279 @@
1.XLIST
2INCLUDE STRUC.INC
3.LIST
4
5
6;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
7;º º
8
9set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
10
11MOV AX,submessage ;AX=message number ;AN001;
12MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
13CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
14MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
15MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
16ENDM ;AN001;
17
18;º º
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
20
21 PAGE ,132 ;
22 TITLE MODECP.SAL - CODEPAGE SUPPORT
23 INCLUDE MODECPRO.INC ;MODULE PROLOGUE
24;THE FOLLOWING "INCLUDE MODECPEQ.INC" CONTAINS THE FOLLOWING DEFINITIONS:
25; MACROS: HEADER, DOSCALL
26; DOS FUNCTION CALLS EQUATES
27; MAJOR AND MINOR CODES FOR "GENERIC IOCTL" DOS FUNCTION CALL
28; ERROR RETURN CODES FROM SEVERAL SUBFUNCTIONS OF THE GENERIC IOCTL
29; OPEN MODE EQUATES
30; DEFINITIONS OF STRUC:
31; "FON" - THE HEADER OF THE CODEPAGE FONT FILE
32; "CODEPAGE_PARMS" - INPUT PARM LIST FROM CALLER
33; "PACKET" AND "DES_STRT_PACKET" - BUFFERS USED
34; BY THE SEVERAL CODEPAGE DOS IOCTL CALLS
35 INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES
36; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
37 HEADER <DESCRIPTIONS OF ALL MESSAGES USED BY MODECP.SAL>
38 INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES
39; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
40 HEADER <EXTRNS, LOCAL DATA AND OTHER WORKAREAS>
41; $SALUT CP(4,16,22,38) ;(set preprocessor columns for indenting)
42PRINTF_CODE SEGMENT WORD PUBLIC
43 ASSUME CS:PRINTF_CODE ;"MODE" IS A ".COM" FILE;
44 ASSUME DS:PRINTF_CODE ; AS SUCH, ALL FOUR SEG REGS
45 ASSUME ES:PRINTF_CODE ; POINT TO THE ONE COMMON
46 ASSUME SS:PRINTF_CODE ; SEGMENT, "PRINTF_CODE"
47
48MODECP00 EQU $ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP
49 PUBLIC MODECP00
50
51
52;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
53;º º
54
55PUBLIC CLOSE ;EQU 3EH ;CLOSE A FILE HANDLE,make available to analyze_and_invoke, see modecpeq.inc
56PUBLIC DES_STRT_FL_CART ;EQU 0001H, means CARTRIDGE prepare
57PUBLIC DEV_OPEN_MODE ;make available to analyze_and_invoke, see modecpeq.inc
58PUBLIC OPEN ;make available to analyze_and_invoke, see modecpeq.inc
59
60;º º
61;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
62
63;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
64;º º
65
66EXTRN cp_cb:WORD ;AN000;codepage_parms <>, see invoke
67
68 EXTRN NOERROR:BYTE ;ERRORLEVEL RETURN CODE FLAG BYTE
69 ; NORMAL VALUE IS "TRUE" (-1)
70 ; IF ERROR OCCURS, SET IT TO "FALSE" (0)
71 EXTRN PRINTF:NEAR ;SENDS MESSAGES TO STDOUT OR STDERR
72
73EXTRN SYSGETMSG:NEAR ;AN001;message services routine to get the address of a message. Used to get address of a submessage.
74EXTRN Utility_Msg_Class:ABS ;AN001;
75EXTRN sublist_cpmsg8:BYTE ;AN001;
76EXTRN sublist_cpmsg10:BYTE ;AN001;
77EXTRN sublist_cpmsg17:BYTE ;AN001;
78
79;º º
80;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
81
82
83INCLUDE common.stc ;AN001;includes the following structures
84
85
86;bogus EQU 88H ;totally invalid value
87;
88;codepage_parms STRUC
89; cp_device DW ?
90; des_pack_ptr DW ?
91; font_filespec DW ?
92; request_typ DW ?
93;codepage_parms ENDS
94;
95;
96;parm_list_entry STRUC ;used by parse_parameters and invoke
97;
98;parm_type DB bogus
99;item_tag DB 0FFH
100;value1 DW bogus ;used only for filespecs and code page numbers
101;value2 DW bogus ;used only for filespecs and code page numbers
102;keyword_switch_ptr DW 0
103;
104;parm_list_entry ENDS
105;
106;
107;sublist_def STRUC ;used by initialize_sublists
108;
109; db ? ;Sublist Length, fixed
110; db ? ;Reserved, not used yet ;AN000;
111;sublist_off dw ? ;offset
112;sublist_seg dw ? ;segment part of pointer to piece of message
113; db ? ;ID, special end of message format ;AN000;
114; db ? ;flags
115; db ?
116; db ?
117; db ?
118;
119;sublist_def ENDS
120
121;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
122;º º
123
124
125 ;ALL MESSAGES ARE IN THE MODEMES.ASM MODULE
126current_request DB bogus ;see 'do_refresh' and 'des_end'
127dgroup group zseg,printf_code
128zseg segment para public
129; LOCAL WORKAREA
130BUF DB 512 DUP(0) ;DEFAULT BUFFER AREA
131 public buf ;not referenced, just shows up on mapf buf
132END_OF_BUF EQU $
133zseg ends
134
135RESPONSE_LIST LABEL WORD ;WHERE TO PUT THE RESULTS OF QUERY prepareS
136RES_NUM_ENTRIES EQU 12 ;NUMBER ENTRIES IN EACH HARDWARE AND prepare LISTS
137RES_LEN DW RES_END - RESPONSE_LIST - 2 ;BYTE SIZE OF RESPONSE AREA
138RES_HWCP DW RES_NUM_ENTRIES ;NUMBER OF HARDWARE CODE PAGES IN FOLLOWING LIST
139 DW RES_NUM_ENTRIES DUP(-1)
140RES_DSCP DW RES_NUM_ENTRIES ;NUMBER OF prepare CODE PAGES IN FOLLOWING LIST
141 DW RES_NUM_ENTRIES DUP(-1)
142RES_END EQU $ ;END OF QUERY prepare RESPONSE LIST
143
144
145OLDINT24 DD ? ;ORIGINAL CONTENTS OF INT 24H VECTOR
146CRITERROR DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER
147
148DEVICE_STATUS DW ? ;FLAGS SET BY IOCTL (GET DEVICE INFO)
149DEV_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY
150 ; OPEN TO DEVICE FOR IOCTL I/O
151FILE_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY
152 ; OPEN TO FILESPEC.
153DEV_TYPE DW prepare_STRT ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT"
154 ;THE HIGH BYTE IS JUST ZERO HERE, BUT
155 ; THAT WILL BE OR'ED IN LATER
156PK PACKET <> ;SELECT, QUERY SELECTED, prepare END
157
158PUBLIC PK
159
160DBCS_headr DBCS_head <>
161
162PUBLIC DBCS_headr
163
164; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER
165; THEY ARE REFERENCED AS A DWORD
166DBUF LABEL DWORD
167BUF_OFF DW 0 ;OFFSET OF ALLOCATED BUFFER
168BUF_SEG DW ? ;SEGID OF ALLOCATED BUFFER
169
170BUF_SIZ DW 0FFFH ;REMEMBER HOW MUCH BUF IS AVAILABLE
171 ; (IN PARAGRAPHS, NOT BYTES)
172BUF_BYTES DW ? ;NUMBER OF BYTES ACTUALLY IN THE BUFFER
173PREPED DW 0 ;COUNT OF CODEPAGES KNOWN TO DEVICE
174MINOR_VERSION DB 0,0 ;MINOR VERSION OF DOS
175STATUS_BREAK DB 0 ;SAVES THE CURRENT STATUS OF "BREAK"
176DEV_TABLE LABEL BYTE ;TABLE OF SUPPORTED DEVICE NAMES
177CN DB "CON",0
178LP DB "PRN",0
179L1 DB "LPT1",0
180L2 DB "LPT2",0
181L3 DB "LPT3",0
182C1 DB "COM1",0
183C2 DB "COM2",0
184C3 DB "COM3",0
185C4 DB "COM4",0
186G1 DB "*",0
187END_DEV_TABLE LABEL BYTE
188DEV_TAB_PTRS DW CN,LP,L1,L2,L3,C1,C2,C3,C4,G1,END_DEV_TABLE
189NUM_TABL_ENTRIES EQU (($-DEV_TAB_PTRS)-2)/2 ;NUMBER OF DEVICE POINTERS
190;THE ENTRIES IN THE NEXT TABLE MUST BE KEPT IN THE SAME ORDER AS THE
191; DEVICE NAMES IN THE ABOVE LIST. THERE MUST BE A ONE-TO-ONE CORRESPONDENCE
192; BETWEEN THE DEVICE NAMES AND THIS TABLE OF DEVICE TYPES.
193DEV_TYPES DB CON_DEV_TYPE ;CN
194 DB LPT_DEV_TYPE ;LP
195 DB LPT_DEV_TYPE ;L1
196 DB LPT_DEV_TYPE ;L2
197 DB LPT_DEV_TYPE ;L3
198 DB COM_DEV_TYPE ;C1
199 DB COM_DEV_TYPE ;C2
200 DB COM_DEV_TYPE ;C3
201 DB COM_DEV_TYPE ;C4
202 DB GLOBAL_CP ;G1
203
204
205;º º
206;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
207
208
209
210MODECP PROC NEAR ;SUBROUTINE ENTRY POINT
211
212
213 PUBLIC MODECP
214 ;REMEMBER WHAT THE CURRENT SETTING IS
215 ; OF "BREAK"
216 DOSCALL BREAK_CHECK,REQUEST_BREAK_STATE ;CURRENT STATE RETURNED IN DL
217
218 MOV STATUS_BREAK,DL ;REMEMBER WHAT THE CURRENT BREAK STATUS IS
219
220 MOV DL,BREAK_OFF ;AVOID UNWANTED CTRL-BREAK DURING OPERATION
221 DOSCALL BREAK_CHECK,SET_BREAK_STATE
222
223;DOSCALL DOS_VERSION ;DETERMINE VERSION OF DOS
224 ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER
225;MOV MINOR_VERSION,AH ; BX AND CX SET TO ZERO
226
227; REMEMBER ORIGINAL OWNER OF INT 24H
228; THE CRITICAL ERROR HANDLER
229 CALL SAVE_VECTOR24 ;SET DWORD AT "OLDINT24" WITH ORIGINAL POINTERS
230
231; SET UP THE DEVICE TYPE
232; FOR THE prepare START FUNCTION
233 MOV BX,CP_CB.cp_device ;SET A BASE REG TO POINT TO DEV NAME
234 CALL SET_DEV_TYPE ;INTERROGATE THE DEVICE NAME,
235 ; SET "DEV_TYPE" ACCORDINGLY
236;CMP BYTE PTR DEV_TYPE+BYTE,GLOBAL_CP ;WAS THE DEVICE SPECIFIED AS "*"?
237;$IF E
238; CALL SET_GLOBAL_CODEPAGE
239;$ELSE ;SINCE DEVICE WAS NOT "*"
240
241
242; OPEN DEVICE
243 MOV DX,BX ;DS:DX=POINTER TO ASCIIZ DEVICE NAME
244 DOSCALL OPEN,DEV_OPEN_MODE ;OPEN DEVICE WITH READ/WRITE ACCESS
245
246; $IF NC ;IF OPEN OK,
247 JC $$IF1
248 MOV DEV_HANDLE,AX ;REMEMBER HANDLE TO DEVICE
249
250 MOV BX,AX ;PASS DEVICE HANDLE TO IOCTL
251 DOSCALL IOCTL,IOCTL_FUN_GET_INFO
252
253 MOV DEVICE_STATUS,DX ;SAVE THE DEVICE STATUS
254; $IF NC,AND ;IF OK
255 JC $$IF2
256 TEST DX,ISDEVICE ;IS THIS A DEVICE OR FILE?
257; $IF NZ ;IF IS A DEVICE
258 JZ $$IF2
259 CALL FUNCTION_SELECT ;CHECK THE "request_typ", AND
260 ; CALL THE APPROPRIATE FUNCTION HANDLER
261; $ELSE ;SINCE NOT A DEVICE, MUST BE A FILE
262 JMP SHORT $$EN2
263$$IF2:
264 MOV DX,OFFSET CPMSG15 ;PASS POINTER TO MSG PARM LIST
265 CALL SEND_MSG ;"DEVICE NOT SUPPORTED FOR CODEPAGE"
266
267; $ENDIF ;OK FROM IOCTL, AND DEVICE OR FILE?
268$$EN2:
269 MOV BX,DEV_HANDLE
270 DOSCALL CLOSE ;FINISHED WITH DEVICE
271
272; $ELSE ;SINCE DEVICE OPEN NOT OK
273 JMP SHORT $$EN1
274$$IF1:
275 MOV AX,CP_CB.cp_device ;GET OFFSET TO ASCIIZ DEVICE NAME
276 MOV CPMSGLST2DEV,AX ; TO MSG PARM LIST
277 MOV DX,OFFSET CPMSG2 ;PASS POINTER TO MSG PARM LIST
278 CALL SEND_MSG ;"FAILURE TO OPEN DEVICE"
279
280; $ENDIF ;DEVICE OPEN OK?
281$$EN1:
282;$ENDIF ;DEVICE "*"?
283 MOV DL,STATUS_BREAK ;GET WHAT THE BREAK STATUS USED TO BE
284 DOSCALL BREAK_CHECK,SET_BREAK_STATE ;RETURN TO USER DEFINED BREAK CONDITION
285
286 RET ;RETURN TO CALLER
287MODECP ENDP
288; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
289
290
291SET_DEV_TYPE PROC NEAR
292
293
294
295;INPUT: BX = OFFSET TO ASCIIZ OF DEVICE NAME
296
297 MOV CX,NUM_TABL_ENTRIES ;SET LOOP COUNTER TO NUMBER OF DEVICE NAMES IN LIST
298 MOV SI,OFFSET DEV_TAB_PTRS ;SET INDEX TO FIRST ENTRY IN TABLE OF POINTERS
299 MOV DI,OFFSET DEV_TYPES ;SET INDEX TO FIRST ENTRY OF DEVICE TYPES
300;$SEARCH ;LOOK THRU TABLE FOR MATCHING ENTRY
301$$DO7:
302 PUSH DS ;AN002;
303 POP ES ;need ES and DS the same for the CMPSB ;AN002;
304 PUSH CX ;SAVE COUNTER OF DEVICE NAMES
305 PUSH SI ;SAVE POINTER TO TABLE OF POINTERS TO DEVICE NAMES
306 PUSH DI ;SAVE POINTER TO TABLE OF DEVICE TYPES
307
308 MOV CX,[SI]+WORD ;GET OFFSET TO NEXT DEVICE NAME
309 SUB CX,[SI] ;SET COUNT TO SIZE OF THIS DEVICE NAME
310 MOV DI,[SI] ;POINT TO DEVICE NAME FROM ENTRY IN TABLE
311 MOV SI,BX ;POINT TO DEVICE NAME FROM COMMAND LINE
312 REP CMPSB ;IS THIS THE ONE?
313
314 POP DI ;RESTORE POINTER TO DEVICE TYPE LIST
315 POP SI ;RESTORE POINTER TO TABLE OF DEVICE NAME POINTERS
316 POP CX ;RESTORE COUNTER OF DEVICES
317;$EXITIF E
318 JNE $$IF7
319 MOV AL,BYTE PTR[DI] ;GET TYPE OF THIS DEVICE
320;$ORELSE
321 JMP SHORT $$SR7
322$$IF7:
323 ADD SI,WORD ;BUMP INDEX TO NEXT ENTRY IN TABLE
324 ADD DI,BYTE ;BUMP INDEX TO NEXT ENTRY IN TABLE
325;$ENDLOOP LOOP
326 LOOP $$DO7
327 MOV AL,UNK_DEV_TYPE ;DEVICE NAME IS NOT IN THE ABOVE LIST
328;$ENDSRCH
329$$SR7:
330 MOV BYTE PTR DEV_TYPE+BYTE,AL ;ADD DESCRIPTOR OF DEVICE TO DEV_TYPE WORD
331
332RET
333SET_DEV_TYPE ENDP
334; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
335
336;SET_GLOBAL_CODEPAGE PROC NEAR
337;
338;;DEVICE WAS SPECIFIED AS "*", INDICATING THE GLOBAL CODEPAGE IS THE DEVICE
339;
340; MOV AX,CP_CB.request_typ
341; CMP AX,SELECT
342; $IF E
343; MOV BX,CP_CB.DES_PACK_PTR ;SET BASE REG TO POINT TO PACKET AREA
344; MOV BX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE ID FROM PACKET
345; MOV AX,SET_GLOBAL_CP ;SET GLOBAL CODEPAGE
346; DOSCALL
347;
348; $IF C ;IF ERROR TRYING TO SET GLOBAL CODEPAGE
349; MOV CPMSGLST11FUN,OFFSET CPMSG11_SET ;PUT "SETTING" INTO MESSAGE
350; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST
351; CALL SEND_MSG
352;
353; $ELSE
354; MOV CPMSGLST10FUN,OFFSET CPMSG10_GLOBAL ;SET MSG TO SAY "GLOBAL"
355; MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
356; CALL QUEUE ;"MODE GLOBAL CODEPAGE FUNCTION COMPLETED"
357;
358; $ENDIF ;ERROR IN SETTING GLOBAL CODEPAGE?
359; $ELSE ;SINCE NOT "SELECT" ASSUME IT IS "STATUS"
360; MOV AX,GET_GLOBAL_CP
361; DOSCALL
362;
363; $IF C ;IF ERROR
364; MOV CPMSGLST11FUN,OFFSET CPMSG11_GET ;PUT "GETTING" INTO MESSAGE
365; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST
366; CALL SEND_MSG
367;
368; $ELSE ;SINCE NO ERROR
369; PUSH DX ; DX=SYSTEM CODE PAGE
370; PUSH BX ; BX=ACTIVE CODE PAGE
371; MOV DX,OFFSET CPMSG12 ;PASS OFFSET TO MSG PARM LIST
372; CALL QUEUE ;"CURRENT CODEPAGE SETTINGS:"
373;
374; MOV CPMSGLST13TYP,OFFSET CPMSG13_ACT ;PUT "ACTIVE" INTO MESSAGE
375; POP CPMSGLST13CP ;PASS ACTIVE CODEPAGE ID TO MSG PARM LIST (PUSHED FROM BX)
376; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST
377; CALL QUEUE ;" XXX - ACTIVE CODEPAGE"
378;
379; POP CPMSGLST13CP ;PASS SYSTEM CODE PAGE (PUSHED FROM DX)
380; MOV CPMSGLST13TYP,OFFSET CPMSG13_SYS ;PUT "SYSTEM" INTO MESSAGE
381; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST
382; CALL QUEUE ;" XXX - SYSTEM CODEPAGE"
383;
384; $ENDIF ;ERROR IN GETTING GLOBAL CODEPAGE STATUS?
385; $ENDIF ;"SELECT" OR "STATUS"?
386;
387; RET
388;SET_GLOBAL_CODEPAGE ENDP
389; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
390 HEADER <SELECT FUNCTION HANDLING ROUTINE ACCORDING TO 'request_typ'>
391
392FUNCTION_SELECT PROC NEAR
393
394 MOV AX,CP_CB.request_typ
395 CMP AX,PREPARE ;("prepare" IS INTERNAL USAGE ONLY; "PREPARE" IS WHAT CUSTOMER SEES)
396;$IF E ;IF "prepare" IS REQUESTED FUNCTION
397 JNE $$IF12
398 CALL DO_prepare ;DEFINE FONTS TO DEVICE
399
400;$ELSE ;SINCE NOT A "prepare"
401 JMP SHORT $$EN12
402$$IF12:
403 CMP AX,SELECT
404; $IF E ;IF "SELECT" IS REQUESTED FUNCTION
405 JNE $$IF14
406 CALL DO_SELECT
407
408; $ELSE ;SINCE NOT "SELECT" EITHER
409 JMP SHORT $$EN14
410$$IF14:
411 CMP AX,REFRESH
412; $IF E ;IF "REFRESH IS REQUSTED FUNCTION
413 JNE $$IF16
414 CALL DO_REFRESH
415
416; $ELSE ;SINCE NONE OF THE ABOVE
417 JMP SHORT $$EN16
418$$IF16:
419 CALL DO_STATUS
420
421; $ENDIF ;REFRESH?
422$$EN16:
423; $ENDIF ;SELECT?
424$$EN14:
425;$ENDIF ;prepare?
426$$EN12:
427
428 RET
429FUNCTION_SELECT ENDP
430; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
431 HEADER <'prepare' - CODEPAGE FUNCTION>
432
433DO_prepare PROC NEAR
434
435PUBLIC DO_prepare
436
437 MOV BX,CP_CB.DES_PACK_PTR
438 TEST [BX].DES_STRT_PKFL,DES_STRT_FL_CART ;CARTRIDGE prepare?
439;$IF Z ;NO, LOOK FOR FONT FILE
440 JNZ $$IF21
441 MOV AX,CS ;USE PREDEFINED AREA
442 MOV BUF_SEG,AX ;REMEMBER WHERE BUFFER IS
443 lea dx,dgroup:BUF ;buf is at end of allocated memory
444 mov BUF_OFF,dx
445 mov ax,ds:[6] ;get number bytes in this segment
446 sub ax,dx ;get size of buf to segment end
447 mov cl,4 ;shift count
448 shr ax,cl ;convert buf size to para size
449 MOV BUF_SIZ,ax ;SIZE IN PARAGRAPHS
450; OPEN FILE FOR INPUT
451
452 MOV DX,CP_CB.FONT_FILESPEC ;DS:DX = POINTER TO ASCIIZ PATH NAME
453 DOSCALL OPEN,FILE_OPEN_MODE ;OPEN CODEPAGE FILE IN READ ONLY MODE
454
455; $IF NC ;IF OPEN OK,
456 JC $$IF22
457 MOV FILE_HANDLE,AX ;REMEMBER THE HANDLE TO THE FILE
458 CALL DES_START ;PERFORM THE prepare START
459
460; $IF NC ;IF prepare START WAS OK
461 JC $$IF23
462 CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE"
463
464 CALL MOVE_FILE ;READ IN THE CODEPAGE FILE, SEND TO DEVICE
465
466 CALL DES_END ;PERFORM prepare END FUNCTION
467
468; $ELSE ;SINCE prepare START HAD A PROBLEM
469 JMP SHORT $$EN23
470$$IF23:
471 CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED
472
473; $ENDIF ;prepare START OK?
474$$EN23:
475
476; CLOSE A FILE HANDLE
477 MOV BX,FILE_HANDLE ;BX = HANDLE RETURNED BY OPEN OR CREATE
478 DOSCALL CLOSE
479
480; $ELSE ;SINCE FILE OPEN NOT OK
481 JMP SHORT $$EN22
482$$IF22:
483 MOV DX,OFFSET CPMSG1 ;PASS OFFSET TO MSG PARM LIST
484 CALL SEND_MSG ; "FAILURE TO OPEN CODEPAGE FONT FILE"
485
486; $ENDIF ;FILE OPEN OK?
487$$EN22:
488;$ELSE ;SINCE NO FONT FILE SPEC INDICATED FOR CARTRIDGE,
489 JMP SHORT $$EN21
490$$IF21:
491
492 CALL DES_START ;PERFORM THE prepare START
493
494; $IF C
495 JNC $$IF29
496 CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED
497
498; $ELSE ;SINCE DES_START WAS OK,
499 JMP SHORT $$EN29
500$$IF29:
501 CALL DES_END ;PERFORM prepare END FUNCTION
502
503; $ENDIF ;DES_START ON CARTRIDGE OK?
504$$EN29:
505;$ENDIF ;CARTRIDGE?
506$$EN21:
507 RET
508DO_prepare ENDP
509; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
510DES_START PROC NEAR
511
512PUBLIC DES_START
513
514 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT"
515 MOV DX,CP_CB.DES_PACK_PTR ;DS:DX=DATA BUFFER "DES_STRT_PACKET"
516 CALL DO_GENERIC_IOCTL
517
518 RET
519DES_START ENDP
520; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
521DES_START_ERROR PROC NEAR
522;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR
523; prepare START ERROR CODES:
524 ;DS_ERR0 EQU 0 PREVIOUS prepare DELETED
525 ;DS_ERR8 EQU 8 CODE PAGE CONFLICT (USED FOR KEYB XX MISMATCH)
526 ;DS_ERRA EQU 0AH DEVICE ERROR
527 ;DS_ERR16 EQU 016H UNKNOWN COMMAND
528
529 CALL EX_ERR ;GET EXTENDED ERROR
530 ;AX=EXTENDED ERROR
531 ;BH=ERROR CLASS
532 ;BL=SUGGESTED ACTION
533 ;CH=LOCUS
534 CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR?
535;$IF E
536 JNE $$IF33
537;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE
538 set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE ;AN002;
539 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
540 ;"DEVICE ERROR DURING PREPARE"
541
542;$ELSE ;SINCE NOT ERROR CODE 0AH,
543 JMP SHORT $$EN33
544$$IF33:
545 CMP AX,DS_ERR0+MAPERR ;PREVIOUS prepare DELETED?
546; $IF E
547 JNE $$IF35
548 MOV DX,OFFSET CPMSG5 ;PASS OFFSET TO MSG PARM LIST
549 ;"PREVIOUSLY PREPARED CODEPAGE DELETED"
550; $ELSE
551 JMP SHORT $$EN35
552$$IF35:
553 CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
554; $IF E,OR
555 JE $$LL37
556 CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number
557; $IF E
558 JNE $$IF37
559$$LL37:
560 MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST
561 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
562
563; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
564 JMP SHORT $$EN37
565$$IF37:
566 MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST
567 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
568; $ENDIF
569$$EN37:
570
571; $ENDIF ;PREV prepare DELETED?
572$$EN35:
573;$ENDIF ;WHICH ERROR CODE?
574$$EN33:
575 CALL SEND_MSG ;DISPLAY INDICATED MESSAGE
576
577
578 RET
579DES_START_ERROR ENDP
580; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
581
582MOVE_FILE PROC NEAR
583
584;CODEPAGE FILE IS OPEN, THE prepare START IS COMPLETED OK...
585
586dummy8:
587public dummy8
588
589
590;$SEARCH ;REPEAT READS UNTIL FILE COMPLETELY READ
591$$DO42:
592; READ FROM A FILE OR DEVICE
593 MOV AX,BUF_SIZ ;NUMBER OF PARAS TO READ
594 MOV CL,4
595 SHL AX,CL ;CONVERT PARA COUNT TO BYTE COUNT
596 MOV CX,AX ;PASS BYTE COUNT TO CX
597 MOV BX,FILE_HANDLE ;BX = FILE HANDLE
598 PUSH DS
599 LDS DX,DBUF ;DS:DX = BUFFER ADDRESS
600 DOSCALL READ
601
602 POP DS ;RESTORE DATA ADDRESSABILITY
603;$LEAVE C ;ERROR DURING READ?
604 JC $$EN42
605 MOV BUF_BYTES,AX ;REMEMBER HOW MANY BYTES READ
606 CMP AX,0 ;WAS ANYTHING READ?
607;$LEAVE E ;NOTHING READ, QUIT
608 JE $$EN42
609 ;SOMETHING WAS READ, PROCESS THE BUFFER
610 CALL HOOK_IN_MY_INT24 ;DO MY OWN ERROR HANDLING
611
612; WRITE TO A FILE OR DEVICE
613 MOV BX,DEV_HANDLE ;BX = FILE HANDLE
614 MOV CX,BUF_BYTES ;CX = NUMBER OF BYTES TO WRITE
615 PUSH DS
616 LDS DX,DBUF ;DS:DX = ADDRESS OF DATA TO WRITE
617 DOSCALL IOCTL,IOCTL_WRITE ;WRITE THE DATA TO THE DEVICE
618
619 POP DS
620 PUSHF ;SAVE FLAGS
621 CALL RESTORE_OLD_INT24 ;LET SYSTEM RESUME ERROR HANDLING
622
623 POPF ;RESTORE FLAGS
624
625;$EXITIF C ;QUIT IF A PROBLEM
626 JNC $$IF42
627 ;prepare WRITE ERROR CODES:
628 ;DW_ERR8 EQU 8 DEVICE NOT FOUND IN FILE ,OR
629 ; CODE PAGE NOT FOUND IN FILE
630 ;DW_ERRA EQU 0AH DEVICE ERROR
631 ;DW_ERRC EQU 0CH FILE CONTENTS NOT A FONT FILE,
632 ; OR FILE CONTENTS STRUCTURE DAMAGED
633 CALL EX_ERR ;GET EXTENDED ERROR
634 ;AX=EXTENDED ERROR
635 ;BH=ERROR CLASS
636 ;BL=SUGGESTED ACTION
637 ;CH=LOCUS
638 CMP AX,FAIL24 ;DID ERROR COME FROM THE INT 24 HANDLER?
639; $IF E
640 JNE $$IF46
641 MOV AX,CRITERROR ;REAL ERROR CAME FROM INT24
642 ADD AX,MAPERR
643; $ENDIF
644$$IF46:
645 CMP AX,DW_ERR8+MAPERR ;DEVICE NOT FOUND IN FILE ,OR
646 ; CODE PAGE NOT FOUND IN FILE
647; $IF E
648 JNE $$IF48
649 MOV DX,OFFSET CPMSG3 ;"Missing from font file is either device or codepage"
650; $ELSE ;SINCE NOT ERR 8
651 JMP SHORT $$EN48
652$$IF48:
653 CMP AX,DW_ERRA+MAPERR ;DEVICE ERROR
654
655; $IF E
656 JNE $$IF50
657;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_WRIT ;"write of font file to device",EOM
658 set_submessage_ptr CPMSG17_WRIT,cpmsg17 ;"write of font file to device",EOM;AN001;
659 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING %S"
660; $ELSE ;SINCE NOT ERR A NEITHER, MUST BE
661 JMP SHORT $$EN50
662$$IF50:
663 ; FILE CONTENTS NOT A FONT FILE,
664 ; OR FILE CONTENTS STRUCTURE DAMAGED
665 MOV DX,OFFSET CPMSG4 ;"Font file contents invalid"
666; $ENDIF ;ERR "A"?
667$$EN50:
668; $ENDIF ;ERR 8?
669$$EN48:
670 CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX
671
672;$ORELSE ;SINCE WRITE TO DEVICE WAS OK,
673 JMP SHORT $$SR42
674$$IF42:
675;$ENDLOOP ;GO BACK AND READ SOME MORE
676 JMP SHORT $$DO42
677$$EN42:
678; $IF C ;IF READ ERROR
679 JNC $$IF56
680 MOV DX,OFFSET CPMSG20 ;"ERROR DURING READ OF FONT FILE"
681 CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX
682
683; $ENDIF ;READ ERROR?
684$$IF56:
685;$ENDSRCH
686$$SR42:
687
688 RET
689MOVE_FILE ENDP
690; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
691
692DES_END PROC NEAR
693
694 MOV CX,DEV_TYPE ;PICK UP DEVICE TYPE AS MAJOR CODE
695 MOV CL,prepare_END ;CX=xxx_DEV_TYPE * 256 + "prepare_END"
696 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER, PROBABLY NOT USED
697 ; THIS IS JUST A DUMMY BUFFER, NO DATA FOR IT
698 CALL DO_GENERIC_IOCTL
699
700;$IF C ;IF THERE WAS AN ERROR
701 JNC $$IF59
702;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE
703 set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE
704 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
705 CALL SEND_MSG ;"DEVICE ERROR DURING PREPARE"
706
707;$ELSE ;SINCE NO ERROR DURING PREPARE END,
708 JMP SHORT $$EN59
709$$IF59:
710 CMP NOERROR,TRUE
711; $IF E ;IF no previous errors THEN
712 JNE $$IF61
713 CMP current_request,refresh_request
714; $IF E
715 JNE $$IF62
716;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_REFRESH ;SET MSG TO SAY "REFRESH"
717 set_submessage_ptr CPMSGxx_REFRESH,cpmsg10 ;SET MSG TO SAY "REFRESH";AN001;
718; $ELSE
719 JMP SHORT $$EN62
720$$IF62:
721;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_DES ;SET MSG TO SAY "PREPARE"
722 set_submessage_ptr CPMSGxx_prep,cpmsg10 ;SET MSG TO SAY "PREPARE";AN001;
723; $ENDIF
724$$EN62:
725 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
726 CALL printf ;"MODE PREPARE CODEPAGE FUNCTION COMPLETED"
727; $ENDIF
728$$IF61:
729
730;$ENDIF ;ERROR DURING PREPARE END?
731$$EN59:
732 RET
733DES_END ENDP
734; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
735
736; 'SELECT' - FUNCTION HANDLER
737
738
739
740DO_SELECT PROC NEAR
741
742 CALL setup_packet_for_DBCS ;see if DBCS vectors needed, if so move them into the packet
743 MOV BX,CP_CB.DES_PACK_PTR ;GET PACKET FROM INPUT PARMLIST
744 MOV AX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE FROM HIS PACKET
745 MOV PK.PACKCPID,AX ; INTO PACKET EXPECTED BY SELECT FUNCTION
746 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
747 MOV CL,SELECT_CP ;SET MINOR CODE TO "SELECT"
748 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET"
749 CALL DO_GENERIC_IOCTL
750
751dummy10:
752public dummy10
753
754;$IF C ;IF SELECT WAS NOT OK
755 JNC $$IF67
756
757 CALL EX_ERR ;GET EXTENDED ERROR
758 ;AX=EXTENDED ERROR
759 ;BH=ERROR CLASS
760 ;BL=SUGGESTED ACTION
761 ;CH=LOCUS
762 CMP AX,IN_ERR7+MAPERR ;CODE PAGE NOT PREPARED?
763; $IF E
764 JNE $$IF68
765 MOV DX,OFFSET CPMSG18 ;PASS OFFSET TO MSG PARM LIST
766 ;"SPECIFIED CODEPAGE NOT PREPARED"
767; $ELSE ;NOT ERR7, MUST BE SOMETHING ELSE
768 JMP SHORT $$EN68
769$$IF68:
770 CMP AX,IN_ERR8+MAPERR ;KEYBOARD SUPPORT THIS CODEPAGE?
771; $IF E
772 JNE $$IF70
773 MOV DX,OFFSET CPMSG19 ;"CURRENT KEYBOARD DOES NOT SUPPORT THIS CP"
774; $ELSE ;SINCE NOT ERR8 EITHER, MUST BE DEVICE ERROR
775 JMP SHORT $$EN70
776$$IF70:
777
778;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_ACT
779 set_submessage_ptr CPMSGxx_select,cpmsg17 ;AN001;
780 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING SELECT"
781; $ENDIF ;KEYB SUPPORT THIS CODEPAGE?
782$$EN70:
783; $ENDIF ;CP NOT PREPARED?
784$$EN68:
785 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
786
787;$ELSE ;SINCE SELECT WAS OK,
788 JMP SHORT $$EN67
789$$IF67:
790 CMP NOERROR,TRUE
791; $IF E ;IF no previous errors THEN
792 JNE $$IF75
793;AC001;MOV CPMSGLST10FUN,OFFSET CPMSG10_SELECT ;SET MSG TO SAY "SELECT"
794 set_submessage_ptr CPMSGxx_SELECT,cpmsg10 ;SET MSG TO SAY "SELECT"
795 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
796 CALL printf ;"MODE SELECT CODEPAGE FUNCTION COMPLETED"
797; $ENDIF
798$$IF75:
799
800;$ENDIF ;SELECT OK?
801$$EN67:
802
803 RET
804DO_SELECT ENDP
805; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
806;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
807
808;³ DO_REFRESH
809;³ ----------
810
811;³ THIS EVENT WOULD BE REQUIRED IN CASE THE EXTERNAL DEVICE LOST ITS LOADABLE
812;³ FONT DESCRIPTIONS, AS PERHAPS IF THE PRINTER GOT TURNED OFF, FOR EXAMPLE.
813
814;³ The possible return codes for a REFRESH request will be returned only on a
815;³ designate start and are defined as follows:
816
817;³ 8008 - For DISPLAY.SYS this means that there is a keyboard/code page conflict.
818
819;³ 800A - Device error.
820
821;³ 800C - The device driver does not have a copy of the code page in memory.
822;³ This could be due to the DEVICE= command in CONFIG.SYS not setting up
823;³ the buffer, so all previous prepares were handled by downloading the
824;³ code page directly to the printer.
825
826;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
827
828
829 HEADER <'REFRESH' - RELOAD EXISTING FONTS>
830
831
832DO_REFRESH PROC NEAR
833
834
835 MOV current_request,refresh_request
836
837 CALL DES_START ;PERFORM THE prepare START
838
839;$IF NC ;IF prepare START WAS OK
840 JC $$IF78
841 CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE"
842
843;UNLIKE THE prepare FUNCTION, THERE IS NO FONT FILE TO BE SENT TO THE
844;DEVICE DRIVER, WHO SHOULD STILL HAVE THE FONT DESCRIPTOR DATA TO BE
845;RETRANSMITTED TO THE EXTERNAL DEVICE ITSELF.
846
847
848
849 CALL DES_END ;PERFORM prepare END FUNCTION
850
851;$ELSE ;SINCE prepare START HAD A PROBLEM
852 JMP SHORT $$EN78
853$$IF78:
854
855;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR
856; prepare START ERROR CODES for REFRESH request:
857;RS_ERR8 EQU 8 ;KEYBOARD/CODE PAGE CONFLICT
858;RS_ERRA EQU 0AH ;DEVICE ERROR
859;RS_ERRC EQU 0CH ;DEVICE DRIVER DOES NOT HAVE COPY OF CODE PAGE
860
861 CALL EX_ERR ;GET EXTENDED ERROR
862 ;AX=EXTENDED ERROR
863 ;BH=ERROR CLASS
864 ;BL=SUGGESTED ACTION
865 ;CH=LOCUS
866 CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR?
867; $IF E
868 JNE $$IF80
869;AC001;MOV CPMSGLST17FUN,OFFSET CPMSG17_REFRESH ;MOVE "Refresh" INTO MESSAGE
870 set_submessage_ptr CPMSGxx_REFRESH,cpmsg17 ;MOVE "Refresh" INTO MESSAGE ;AN001;
871 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
872 ;"Device error during REFRESH"
873
874; $ELSE ;SINCE NOT ERROR CODE 0AH,
875 JMP SHORT $$EN80
876$$IF80:
877 CMP AX,RS_ERRC+MAPERR
878; $IF E ;IF driver unable to download because he has no buffer THEN
879 JNE $$IF82
880 MOV DX,OFFSET CPMSG21 ;PASS OFFSET TO MSG PARM LIST
881 ;"Unable to perform REFRESH"
882; $ELSE
883 JMP SHORT $$EN82
884$$IF82:
885 CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
886; $IF E,OR
887 JE $$LL84
888 CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number
889; $IF E
890 JNE $$IF84
891$$LL84:
892 MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST
893 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
894
895; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
896 JMP SHORT $$EN84
897$$IF84:
898 MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST
899 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
900; $ENDIF
901$$EN84:
902
903; $ENDIF ;PREV prepare DELETED?
904$$EN82:
905; $ENDIF ;WHICH ERROR CODE?
906$$EN80:
907 CALL SEND_MSG ;DISPLAY INDICATED MESSAGE
908
909;$ENDIF ;prepare START OK?
910$$EN78:
911
912 RET
913DO_REFRESH ENDP
914; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
915DEVICE_TO_BINARY PROC NEAR
916
917 MOV DX,DEVICE_STATUS ;GET BITS DEFINING DEVICE
918 OR DX,BINARY_DEV ;TURN ON THE "BINARY" FLAG BIT
919 XOR DH,DH ;BE SURE DH IS CLEAR
920 MOV BX,DEV_HANDLE ;PASS THE DEVICE HANDLE TO IOCTL
921 DOSCALL IOCTL,IOCTL_FUN_SET_INFO ;SET DEVICE TO "BINARY"
922
923 RET
924DEVICE_TO_BINARY ENDP
925; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
926 HEADER <'STATUS' - QUERY FUNCTION HANDLER>
927
928PUBLIC do_status
929
930DO_STATUS PROC NEAR
931
932 CALL setup_packet_for_DBCS
933 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
934 MOV CL,QUERY_SELECTED ;SET MINOR CODE TO "QUERY SELECT"
935 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET"
936 CALL DO_GENERIC_IOCTL
937
938;$IF C
939 JNC $$IF90
940 CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM
941
942;$ELSE ;SINCE NOT ERROR ON QUERY
943 JMP SHORT $$EN90
944$$IF90:
945 MOV AX,PK.PACKCPID ;GET CODEPAGE ID FROM PACKET
946 MOV CPMSGLST6CP,AX ;PASS CODEPAGE ID TO PRINTF
947 MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME
948 MOV CPMSGLST6DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST
949 MOV DX,OFFSET CPMSG6 ;PASS OFFSET TO MSG PARM LIST
950 CALL printf ;DISPLAY THE MESSAGE:
951 ; "CURRENTLY SELECTD CODEPAGE IS %D FOR DEVICE: %S",CR,LF,0
952
953 CALL QUERY_LISTER ;DISPLAY LIST OF PREPPED CODEPAGES
954
955;$ENDIF ;ERR FROM QUERY ACTIVE?
956$$EN90:
957
958 RET
959DO_STATUS ENDP
960; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
961QUERY_LISTER PROC NEAR
962
963 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
964 MOV CL,QUERY_DES_LST ;SET MINOR CODE TO "QUERY prepare LIST"
965 MOV DX,OFFSET RESPONSE_LIST ;DS:DX=DATA BUFFER
966 CALL DO_GENERIC_IOCTL
967
968;$IF C ;IF PROBLEM WITH QUERY LIST
969 JNC $$IF93
970 CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM
971
972;$ELSE ;SINCE NO PROBLEM WITH QUERY LIST
973 JMP SHORT $$EN93
974$$IF93:
975 MOV SI,OFFSET RES_HWCP ;START WITH THE LIST OF HARDWARE CODEPAGES
976 MOV CX,[SI] ;GET NUMBER OF HARDWARE CODEPAGES IN LIST IN PACKET
977 ADD SI,WORD ;START WITH THE FIRST CODEPAGE
978; $IF NCXZ ;IF ANY HARDWARE CODEPAGES ARE PRESENT
979 JCXZ $$IF95
980;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_HW ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST
981 PUSH CX ;protect from SYSGETMSG ;AC001;
982 PUSH SI ;protect from SYSGETMSG ;AC001;
983 set_submessage_ptr CPMSG8_HW,cpmsg8 ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST;AC001;
984 POP SI
985 POP CX
986 CALL DISPLAY_CPID
987
988; $ENDIF ;HARDWARE CODEPAGES PRESENT?
989$$IF95:
990 MOV CX,[SI] ;GET NUMBER OF prepare CODEPAGES IN LIST IN PACKET
991 ADD SI,WORD ;LOOK AT NEXT CODEPAGE ENTRY IN LIST
992; $IF NCXZ ;IF ANY prepare CODEPAGES ARE PRESENT
993 JCXZ $$IF97
994;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_PR ;GET OFFSET OF "PREPARED" TO MSG PARM LIST
995 PUSH CX ;protect from SYSGETMSG ;AC001;
996 PUSH SI ;protect from SYSGETMSG ;AC001;
997 set_submessage_ptr CPMSG8_PR,cpmsg8 ;GET OFFSET OF "PREPARED" TO MSG PARM LIST ;AC001;
998 POP SI
999 POP CX
1000 CALL DISPLAY_CPID
1001
1002; $ENDIF ;PREPARED CODEPAGES PRESENT?
1003$$IF97:
1004 CMP PREPED,0 ;CHECK COUNT OF PREPED CODEPAGES
1005; $IF Z ;IF NONE,
1006 JNZ $$IF99
1007 MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME
1008 MOV CPMSGLST7DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST
1009 MOV DX,OFFSET CPMSG7 ;PASS OFFSET TO MSG PARM LIST
1010 CALL printf ;DISPLAY THE MESSAGE:
1011 ; "NO CODEPAGES PREPARED FOR DEVICE: %S",CR,LF,0
1012; $ENDIF ;PREPED PAGES?
1013$$IF99:
1014;$ENDIF ;ERR FROM QUERY LIST?
1015$$EN93:
1016 CMP NOERROR,TRUE
1017;$IF E ;IF no previous errors THEN
1018 JNE $$IF102
1019;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_QUERY ;SET MSG TO SAY "QUERY"
1020 set_submessage_ptr cpmSGxx_QUERY,cpmsg10 ;SET MSG TO SAY "QUERY" ;AN001;
1021 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
1022 CALL printf ;"MODE QUERRY CODEPAGE FUNCTION COMPLETED"
1023;$ENDIF
1024$$IF102:
1025
1026 RET
1027QUERY_LISTER ENDP
1028; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1029
1030
1031QUERY_ERROR PROC NEAR
1032
1033
1034;CARRY WAS SET AFTER "QUERY SELECT" OR "QUERY LIST".
1035
1036 CALL EX_ERR ;GET EXTENDED ERROR
1037 ;AX=EXTENDED ERROR
1038 ;BH=ERROR CLASS
1039 ;BL=SUGGESTED ACTION
1040 ;CH=LOCUS
1041 CMP AX,QS_ERR7+MAPERR ;CODE PAGE NOT SELECTD?
1042
1043 .IF <AX EQ <QS_ERR7+MAPERR>> THEN ;CODE PAGE NOT SELECTD? ;AC665;
1044 MOV DX,OFFSET CPMSG16 ;PASS OFFSET TO MSG PARM LIST
1045 ;"NO CODEPAGE HAS BEEN SELECTED"
1046 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
1047
1048 MOV NOERROR,TRUE ;FORGET THE ABOVE WAS FLAGGED AS "ERROR"
1049 CALL QUERY_LISTER ;LIST PREPPED CODEPAGES ANYWAY
1050
1051 .ELSEIF <AX EQ DS_ERR16> OR ;016H UNKNOWN COMMAND, i.e. device driver not loaded ;AN665;
1052 .IF <AX EQ DS_ERR1> THEN ;;AN665;16=unknown command, 1=Invalid function number
1053 MOV DX,OFFSET CPMSG15 ;AN665;PASS OFFSET TO MSG PARM LIST, "Codepage operation not supported on this device"
1054 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
1055
1056 .ELSE ;NOT ERR7 or 16, MUST BE DEVICE ERROR ;AC665;
1057;AC002; MOV CPMSGLST17FUN,OFFSET CPMSG17_QUERY
1058 set_submessage_ptr CPMSGxx_QUERY,cpmsg17
1059 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING QUERY"
1060
1061 .ENDIF ;CP NOT PREPARED?
1062
1063 RET
1064QUERY_ERROR ENDP
1065; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1066DISPLAY_CPID PROC NEAR
1067;INPUT: SI=OFFSET TO CODEPAGE ID WORD IN LIST
1068
1069 MOV DX,OFFSET CPMSG8 ;PASS OFFSET TO MSG PARM LIST
1070 CALL printf ;DISPLAY THE MESSAGE:
1071 ; "%s CODEPAGES:"
1072 CLD ;REQUEST INCREMENT IF INDEX
1073;$DO
1074$$DO104:
1075 LODSW ;GET CODEPAGE ID FROM PACKET
1076 ;SI NOW POINTS TO NEXT WORD IN CODEPAGE LIST
1077 CMP AL,EMPTY
1078; $IF E
1079 JNE $$IF105
1080 MOV DX,OFFSET CPMSG14 ;PASS OFFSET TO MSG PARM LIST
1081 ; " Codepage unprepared",CR,LF,0
1082; $ELSE ;SINCE NOT EMPTY,
1083 JMP SHORT $$EN105
1084$$IF105:
1085 INC PREPED ;COUNT PREPED CODEPAGES
1086 MOV CPMSGLST9CP,AX ;PASS CODEPAGE ID TO PRINTF
1087 MOV DX,OFFSET CPMSG9 ;PASS OFFSET TO MSG PARM LIST
1088 ; " Codepage %d",CR,LF,0
1089; $ENDIF ;EMPTY?
1090$$EN105:
1091 CALL printf ;DISPLAY THE MESSAGE
1092
1093;$ENDDO LOOP
1094 LOOP $$DO104
1095
1096 RET
1097DISPLAY_CPID ENDP
1098; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1099 HEADER <SUBROUTINES TO HANDLE MESSAGES TO STDOUT OR STDERR>
1100SEND_MSG PROC NEAR ;USED TO SEND "ERROR" MESSAGES ONLY
1101 ;FOR NON-ERROR MESSAGES, CALL printf DIRECTLY.
1102;INPUT: DX=OFFSET TO PRINTF MESSAGE PARM LIST
1103
1104 MOV NOERROR,FALSE ;SET ERROR TO ERRORLEVEL
1105 CALL printf
1106
1107 RET
1108SEND_MSG ENDP
1109; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1110EX_ERR PROC NEAR
1111;THE DOSCALL RESPONDED WITH CARRY, SO GET EXTENDED ERROR
1112 MOV BX,WORD PTR MINOR_VERSION ;BX = 30 VERSION NUMBER (FOR 3.30)
1113 DOSCALL EXTERROR ;EXTENDED ERROR
1114 ;OUTPUT:
1115 ;AX=EXTENDED ERROR
1116 ;BH=ERROR CLASS
1117 ;BL=SUGGESTED ACTION
1118 ;CH=LOCUS
1119 RET
1120EX_ERR ENDP
1121; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1122DO_GENERIC_IOCTL PROC NEAR
1123
1124PUBLIC DO_GENERIC_IOCTL
1125
1126;INPUT CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
1127; DS:DX=DATA BUFFER
1128
1129 MOV BX,DEV_HANDLE ;BX=HANDLE
1130 MOV AX,GENERIC_IOCTL ;AX="GENERIC_IOCTL"
1131 DOSCALL ;SELECT DEVICE WITH GENERIC_IOCTL
1132
1133 RET
1134DO_GENERIC_IOCTL ENDP
1135; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1136 HEADER <INT 24H - CRITICAL ERROR HANDLER, AND SUBROUTINES>
1137HANDLER24 PROC NEAR ;CRITICAL ERROR HANDLER FOR INT 24H
1138;WHEN THE CRITICAL ERROR OCCURS, CONTROL IS TRANSFERRED TO INTERRUPT 24H.
1139;BP:SI POINTS TO THE DEVICE HEADER CONTROL BLOCK.
1140
1141;ERROR CODE IS IN THE LOWER HALF OF THE DI REG WITH UPPER HALF UNDEFINED.
1142;ERROR CODES ARE DEFINED IN THE "MODECPEQ.INC" MODULE.
1143
1144 MOV CRITERROR,DI ;SAVE THE ABOVE ERROR CODE
1145
1146;AT EXIT, WHEN THE IRET IS EXECUTED, DOS RESPONDS ACCORDING TO (AL)
1147
1148 MOV AL,CRERR_FAIL ;REQUEST THE "FAIL" OPTION
1149
1150 IRET ;RETURN FROM INTERRUPT
1151HANDLER24 ENDP
1152; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1153SAVE_VECTOR24 PROC NEAR
1154;GET THE ORIGINAL CONTENTS OF THE CRITICAL ERROR HANDLER VECTOR, 24H
1155; AND SAVE THEM IN THE DWORD AT "OLDINT24"
1156
1157 PUSH ES ;SAVE BASE SEGREG
1158 DOSCALL GET_VECTOR,INT24 ;GET ORIGINAL OWNER OF INT 24H VECTOR
1159
1160 MOV WORD PTR OLDINT24,BX ;OUTPUT: ES:BX = CONTENTS OF VECTOR
1161 MOV WORD PTR OLDINT24+WORD,ES
1162 POP ES ;RESTORE BASE SEGREG
1163
1164 RET
1165SAVE_VECTOR24 ENDP
1166; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1167RESTORE_OLD_INT24 PROC NEAR
1168;TAKE THE CONTENTS OF THE ORIGINAL INT24 VECTOR, SAVED IN "OLDINT24"
1169; AND RESTORE THE INT24 ENTRY IN VECTOR BACK TO ITS ORIGINAL CONTENTS.
1170
1171 PUSH DS ;SAVE MY DATA SEGREG
1172 LDS DX,OLDINT24 ;DS:DX = VECTOR TO INT HANDLER
1173 DOSCALL SET_VECTOR,INT24 ;RESTORE OLD POINTER INTO INT24 VECTOR
1174
1175 POP DS ;RESTORE MY DATA SEGREG
1176
1177 RET
1178RESTORE_OLD_INT24 ENDP
1179; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1180HOOK_IN_MY_INT24 PROC NEAR
1181;SET THE CRITICAL ERROR INTERRUPT HANDLER IN
1182; VECTOR TABLE TO POINT TO "HANDLER24"
1183
1184 MOV DX,OFFSET HANDLER24 ;DS:DX = VECTOR TO INT HANDLER
1185 DOSCALL SET_VECTOR,INT24 ;SET INT24 VECTOR TO POINT TO NEW HANDLER
1186
1187 RET
1188HOOK_IN_MY_INT24 ENDP
1189; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1190;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1191
1192
1193;³ SETUP_PACKET_FOR_DBCS
1194;³ ---------------------
1195
1196;³ Determine if need to include codepage information in the Invoke or Query
1197;³ packet.
1198
1199
1200
1201;³ INPUT: Global access to "pk", the Invoke or Query packet.
1202
1203
1204;³ RETURN: If needed, the DBCS vetcors are added to the packet and the packet
1205;³ size is incremented.
1206
1207;³ MESSAGES: none
1208
1209;³ REGISTER
1210;³ USAGE:
1211
1212
1213;³ SIDE EFFECT:
1214
1215
1216;³ PSEUDO CODE:
1217
1218;³ set up for and call INT 21 function 6507
1219;³ IF the length field of the DBCS table is non-zero THEN
1220;³ add the length of the table to the length field of the packet
1221;³ ENDIF
1222
1223
1224;³ DATA STRUCTURES: PK - the vectors are moved into this structure beginning
1225;³ at PACKVECTOR1. The count of the vectors is added to
1226;³ PACKLEN.
1227
1228;³ DBCS_header - The return from function 6507.
1229
1230;³ DBCS_table - the table of vectors pointed to by
1231;³ DBCS_header.table_ptr.
1232
1233
1234;³ ASSUMPTIONS: No more than 12 (0CH) are in the DBCS table.
1235
1236;³ The double word pointer returned by function 6507
1237;³ (DBCS_header.table_ptr) always points to the DBCS table.
1238
1239;³ The first byte of the table (DBCS_table.table_len) is zero if
1240;³ DBCS support is not necessary.
1241;³ ;AN000;
1242;³ ES=DS. ;AN000;
1243;³ ;AN000;
1244;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1245
1246setup_packet_for_DBCS PROC NEAR
1247
1248PUBLIC setup_packet_for_DBCS
1249
1250PUSH DS ;DS is used to address the DBCS vector table which is somewhere in IBMDOS
1251
1252;set up for and call INT 21 function 6507
1253MOV AX,6507H ;get ext country info, DBCS info
1254MOV BX,-1 ;use codepage currently active for CON
1255MOV DX,-1 ;use default contry ID
1256MOV CX,TYPE DBCS_head ;length of data to be returned
1257MOV DI,OFFSET DBCS_headr ;DI=>buffer to fill with info ID and pointer to table
1258INT 21H
1259
1260LDS SI,DBCS_header.table_ptr ;DS:SI=>DBCS table,"DBCS_table" EQU DS:[SI]
1261.IF <DBCS_table.table_len NE 0> THEN ;IF there are some vectors THEN
1262 MOV CX,DBCS_table.table_len ;set length of the list of vectors
1263 ADD CS:pk.packlen,CX
1264 ADD SI,vector1 ;DS:SI=>first DBCS vector
1265 MOV DI,OFFSET pk ;ES:DI=>the query or invoke packet
1266 ADD DI,packvector1 ;ES:DI=>holder for first DBCS vector in the query/invoke packet
1267 REP MOVSB ;mov all the vectors and the two bytes of zeros into the packet
1268.ENDIF
1269
1270POP DS ;restore to address stuff in MODE's segment
1271
1272RET
1273
1274setup_packet_for_DBCS ENDP
1275
1276
1277PRINTF_CODE ENDS ;END OF MODECP.SAL MODULE
1278END
1279 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/MODECPEQ.INC b/v4.0/src/CMD/MODE/MODECPEQ.INC
new file mode 100644
index 0000000..b91be28
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECPEQ.INC
@@ -0,0 +1,365 @@
1; MODECPEQ.INC - INCLUDED IN MODECP.SAL 
2 IF1
3 %OUT INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES
4 ENDIF
5
6; $SALUT CP(4,9,17,32)
7HEADER MACRO TEXT,EJECT
8;;example: header <new subtitle goes here>
9;;the angle brackets are required
10.XLIST
11 SUBTTL TEXT
12IFB <EJECT>
13.LIST
14ENDIF
15 PAGE
16 ENDM
17
18; - - - - - - - - - - - - - - - - - - - -
19; $SALUT CP(2,28,40,47)
20
21DOSCALL MACRO FUNC,SUBFUNC
22;;IF SUBFUNC IS USED, THEN FUNC MUST BE USED
23 IFNB <FUNC> ;IS THERE ANY PARMS AT ALL?
24 IFNB <SUBFUNC>
25 MOV AX,(FUNC SHL 8) + SUBFUNC
26 ELSE ;;SINCE THERE IS NO SUBFUNC
27 MOV AH,FUNC
28 ENDIF
29 ENDIF
30 INT 21H
31 ENDM
32
33; - - - - - - - - - - - - - - - - - - - -
34; $SALUT CP(4,21,26,32)
35
36; DOS FUNCTION CALLS
37PRINTSTR EQU 09H ;PRINT STRING ENDING WITH "$"
38 ;DS:DX = POINTER TO STRING
39
40SET_VECTOR EQU 25H ;SET INTERRUPT VECTOR
41 ;DS:DX = VECTOR TO INT HANDLER
42 ;AL = INTERRUPT NUMBER
43
44DOS_VERSION EQU 30H ;DETERMINE VERSION OF DOS
45 ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER
46 ; BX AND CX SET TO ZERO
47
48BREAK_CHECK EQU 33H ;CNTRL-BREAK CHECK
49 ;AL=0 - REQUEST CURRENT STATE
50 ;AL=1 - SET CURRENT STATE
51 ;DL=0 - BREAK OFF
52 ;DL=1 - BREAK ON
53
54GET_VECTOR EQU 35H ;GET INTERRUPT VECTOR
55 ;AL = INTRRUPT NUMBER
56 ;OUTPUT: ES:BX = CONTENTS OF VECTOR
57
58OPEN EQU 3DH ;OPEN FILE FOR INPUT
59 ;DS:DX = POINTER TO ASCIIZ PATH NAME
60 ;AL = OPEN MODE
61
62CLOSE EQU 3EH ;CLOSE A FILE HANDLE
63 ;BX = HANDLE RETURNED BY OPEN OR CREATE
64
65READ EQU 3FH ;READ FROM A FILE OR DEVICE
66 ;BX = FILE HANDLE
67 ;DS:DX = BUFFER ADDRESS
68 ;CX NUMBER OF BYTES TO READ
69
70WRITE EQU 40H ;WRITE TO A FILE OR DEVICE
71 ;BX = FILE HANDLE
72 ;DS:DX = ADDRESS OF DATA TO WRITE
73 ;CX = NUMBER OF BYTES TO WRITE
74
75
76LSEEK EQU 42H ;MOVE FILE READ/WRITE POINTER
77 ;CX:DX - DISTANCE TO MOVE IN BYTES
78 ;BX = FILE HANDLE
79 ;AL = METHOD OF MOVING:
80 ; 00 - MOVE CX:DX BYTES FROM BEGINNING
81 ; 01 - MOVE TO CURRENT LOCATION + OFFSET
82 ; 02 - MOVE TO END OF FILE
83 ;OUTPUT:DX:AX NEW POINTER LOCATION
84
85IOCTL EQU 44H ;I/O CONTROL FOR DEVICES
86 ;DS:DX = DATA OR BUFFER
87 ;CX = NUMBER OF BYTES TO READ OR WRITE
88 ;BX = FILE HANDLE, OR,
89 ;BL = DRIVE NUMBER (0=DEFAULT,1=A,...)
90 ;AL = FUNCTION VALUE
91 ;OUTPUT: AX=NO. BYTES TRANSFERRED
92 ; OR ERROR CODE IS CY SET
93
94ALLOC_MEM EQU 48H ;ALLOCATE MEMORY
95 ;BX = NUMBER OF PARAGRAPHS REQUESTED
96 ;OUTPUT: IF NO CARRY, AX:0 POINTS TO
97 ; ALLOCATED MEMORY BLOCK
98 ; IF CARRY, BX IS SIZE OF LARGEST BLOCK
99 ; AVAILABLE, IN PARAGRAPHS, AX=ERR CODE
100
101FREE_AL_MEM EQU 49H ;FREE ALLOCATED MEM
102 ;ES=SEG OF BLOCK BEING RETURNED
103 ;OUTPUT: AX=ERROR CODE IF CY SET
104
105EXTERROR EQU 59H ;EXTENDED ERROR
106 ;BX = 30 VERSION NUMBER (FOR 3.30)
107 ;OUTPUT:
108 ;AX=EXTENDED ERROR
109 ;BH=ERROR CLASS
110 ;BL=SUGGESTED ACTION
111 ;CH=LOCUS
112
113; (THESE VALUES GO TO AX FOR INT 21H)
114SET_GLOBAL_CP EQU 6602H ;INPUTS:
115 ; BX=CODE PAGE,
116
117GET_GLOBAL_CP EQU 6601H ;RESULTS:
118 ; BX=ACTIVE CODE PAGE,
119 ; DX=SYSTEM CODE PAGE
120
121GENERIC_IOCTL EQU 440CH ;INPUTS:
122 ; CH AND CL SET AS DEFINED IN NEXT 2 SECTIONS
123 ; IN GENERAL, CH=CATEGORY CODE (MAJOR CODE)
124 ; CL=FUNCTION WITHIN CATEGORY (MINOR CODE)
125
126; MAJOR CODES:
127; (THESE VALUES GO TO CH REG DURING GENERIC IOCTL:
128UNK_DEV_TYPE EQU 00H ;USED IF TYPE NOT KNOWN
129COM_DEV_TYPE EQU 01H ;COMx DEVICE TYPE
130CON_DEV_TYPE EQU 03H ;CONSOLE DEVICE TYPE
131LPT_DEV_TYPE EQU 05H ;LPTx DEVICE TYPE
132GLOBAL_CP EQU -1 ;GLOBAL CODEPAGE, INDICATED BY DEVICE="*",
133 ; NOT USED WITH GENERIC IOCTL
134
135; MINOR CODES:
136; SUBFUNCTIONS OF GENERIC_IOCTL:
137; (THESE VALUES GO TO CL REG)
138PREPARE_STRT EQU 4CH ;INPUTS:
139 ;BX=HANDLE, AX="GENERIC_IOCTL"
140 ;CX=xxx_DEV_TYPE * 256 + "PREPARE_STRT"
141 ;DS:DX=DATA BUFFER "DES_STRT_PACKET"
142
143PREPARE_END EQU 4DH ;INPUTS:
144 ;BX=HANDLE, AX="GENERIC_IOCTL"
145 ; DS:DX=DATA BUFFER "PACKET"
146
147SELECT_CP EQU 4AH ;INPUTS:
148 ;BX=HANDLE, AX="GENERIC_IOCTL"
149 ; DS:DX=DATA BUFFER "PACKET"
150
151QUERY_SELECTED EQU 6AH ;INPUTS:
152 ;BX=HANDLE, AX="GENERIC_IOCTL"
153 ; DS:DX=DATA BUFFER "PACKET"
154
155QUERY_DES_LST EQU 6BH ;INPUTS:
156 ;BX=HANDLE, AX="GENERIC_IOCTL"
157 ; DS:DX=DATA BUFFER
158
159; OTHER EQUATES
160IOCTL_WRITE EQU 3 ;VAL FOR AL, WHEN WRITING TO DEVICE VIA IOCTL
161FILE_OPEN_MODE EQU 0 ;BIT FIELDS ARE ISSSRAAA WHERE:
162 ; I=0 FILE IS INHERITED BY CHILD PROCESS
163 ; (OF WHICH THERE ISN'T ANY)
164 ; SSS=SHARING MODE IS "COMPATABILITY MODE"
165 ; R=0 (RESERVED)
166 ; AAA=0 (READ ACCESS)
167DEV_OPEN_MODE EQU 2 ;SAME BITS AS ABOVE, EXCEPT AAA=010, READ/WRITE ACCESS
168
169FALSE EQU 0 ;INDICATES AN ERROR TO ERRORLEVEL
170TRUE EQU 0FFH
171
172refresh_request EQU 0 ;scaler to indicate that the current request is refresh for 'des_end'
173
174STDERR EQU 2 ;PRE-OPENED HANDLE FOR STANDARD ERROR
175STDOUT EQU 1 ;PRE-OPENED HANDLE FOR STANDARD OUTPUT
176
177INT24 EQU 24H ;CRITICAL ERROR HANDLER VECTOR
178EMPTY EQU -1 ;EMPTY SLOT IN LIST OF CODEPAGES
179
180IOCTL_FUN_GET_INFO EQU 0 ;GET DEVICE INFORMATION (RETURNED IN DX) FROM IOCTL
181IOCTL_FUN_SET_INFO EQU 1 ;SET DEVICE INFORMATION (PASSED IN DX) TO IOCTL
182ISDEVICE EQU 0080H ;FLAG IN DEVICE INFO WORD, RETURNED IN DX
183BINARY_DEV EQU 0020H ;BINARY FLAG IN DEVICE INFO WORD
184
185MAPERR EQU 19 ;ERRORS FROM DEVICES MAPPED TO COMMON ERRORS,
186 ; AS DEVICE ERR=0 IS REPORTED AS COM ERROR=19
187FAIL24 EQU 83 ;RET CODE, INT 24 HANDLER REQUESTED "FAIL"
188
189;PREPARE START ERROR CODES:
190DS_ERR0 EQU 0 ;PREVIOUS PREPARE DELETED
191DS_ERR1 EQU 1 ;INVALID FUNCTION NUMBER
192DS_ERR8 EQU 8 ;CODE PAGE CONFLICT (USED FOR KEYB XX MISMATCH)
193DS_ERRA EQU 0AH ;DEVICE ERROR
194DS_ERR16 EQU 016H ;UNKNOWN COMMAND (22 DECIMAL)
195
196;PREPARE WRITE ERROR CODES:
197DW_ERR8 EQU 8 ;DEVICE NOT FOUND IN FILE ,OR
198 ;CODE PAGE NOT FOUND IN FILE
199DW_ERRA EQU 0AH ;DEVICE ERROR
200DW_ERRC EQU 0CH ; FILE CONTENTS NOT A FONT FILE,
201 ; OR FILE CONTENTS STRUCTURE DAMAGED
202
203;PREPARE END ERROR CODES:
204DE_ERRC EQU 0CH ;NO PREPARE START
205
206;SELECT ERROR CODES:
207IN_ERR7 EQU 07H ;CODE PAGE NOT PREPARED
208IN_ERR8 EQU 08H ;CURRENT KEYB DOES NOT SUPPORT THIS CP
209IN_ERRA EQU 0AH ;DEVICE ERROR
210
211;QUERY SELECTED ERROR CODES:
212QS_ERR7 EQU 07H ;NO CODE PAGE HAS BEEN SELECTED
213QS_ERRA EQU 0AH ;DEVICE ERROR
214
215;QUERY PREPARED LIST ERROR CODES:
216QL_ERR7 EQU 07H ; NO CODE PAGES HAVE BEEN SELECTED
217QL_ERRA EQU 0AH ;DEVICE ERROR
218
219;REFRESH ERROR CODES RETURNED FROM PREPARE START FOR A REFRESH REQUEST:
220
221RS_ERR8 EQU 8 ;KEYBOARD/CODE PAGE CONFLICT
222RS_ERRA EQU 0AH ;DEVICE ERROR
223RS_ERRC EQU 0CH ;DEVICE DRIVER DOES NOT HAVE COPY OF CODE PAGE
224 ; TO DOWNLOAD TO DEVICE
225
226;ERROR CODES PRESENTED IN THE LOWER HALF OF DI TO THE INT 24H HANDLER:
227;CRERR0 EQU 0 ;ATTEMPT TO WRITE ON WRITE_PROTECTED DISKETTE
228;CRERR1 EQU 1 ;UNKNOWN UNIT
229;CRERR2 EQU 2 ;DRIVE NOT READY
230;CRERR3 EQU 3 ;UNKNOWN COMMAND
231;CRERR4 EQU 4 ;DATA ERROR (crc)
232;CRERR5 EQU 5 ;BAD REQUEST STRUCTURE LENGTH
233;CRERR6 EQU 6 ;SEEK ERROR
234;CRERR7 EQU 7 ;UNKNOWN MEDIA TYPE
235;CRERR8 EQU 8 ;SECTOR NOT FOUND
236;CRERR9 EQU 9 ;PRINTER OUT OF PAPER
237;CRERRA EQU 0AH ;WRITE FAULT
238;CRERRB EQU 0BH ;READ FAULT
239;CRERRC EQU 0CH ;GENERAL FAILURE
240
241;EXIT CODES, IN AL, WHEN IRET FROM INT 24H ERROR HANDLER.
242CRERR_IGNORE EQU 0 ;IGNORE THE ERROR
243CRERR_RETRY EQU 1 ;RETRY THE OPERATION
244CRERR_TERM EQU 2 ;TERMINATE PROGRAM VIA INT 23H
245CRERR_FAIL EQU 3 ;FAIL THE SYSTEM CALL IN PROGRESS
246
247; EQUATES FOR THE BREAK CHECK FUNCTION:
248
249;IN AL:
250REQUEST_BREAK_STATE EQU 0
251SET_BREAK_STATE EQU 1
252
253;IN DL:
254BREAK_OFF EQU 0
255BREAK_ON EQU 1
256
257DBCS_header EQU ES:[DI] ;used to address DBCS_head
258DBCS_table EQU DS:[SI] ;used to address the DBCS vector table
259
260; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
261; DEFINITIONS OF CONTROL BLOCKS
262
263FON STRUC ;CODEPAGE FONT FILE CONTENTS
264FONTAG DB 0FFH,"FONT " ;FILE TAG
265 DB 8 DUP(?) ;RESERVED
266FONPTCT DW ? ;COUNT OF POINTERS IN HEADER
267FONPT DB ? ;START OF ARRAY OF POINTERS
268FON ENDS
269
270; THIS STRUC MAPS AN AREA POINTED TO BY "CP_CB", AN EXTRN
271;AC001;CODEPAGE_PARMS STRUC
272;AC001;DEVICE DW ? ;POINTER TO ASCIIZ STRING OF DEVICE NAME
273;AC001;DES_PACK_PTR DW ? ;OFFSET TO "DES_STRT_PACKET"
274;AC001;FONT_FILESPEC DW ? ;PATH AND FILESPEC OF FONT FILE
275;AC001;REQUEST_TYPE DW ? ;TYPE OF FUNCTION TO BE PERFORMED
276;AC001;CODEPAGE_PARMS ENDS
277; DEFINITIONS OF VALUES FOUND IN "REQUEST_TYPE" ABOVE:
278 EXTRN SELECT:ABS
279 EXTRN PREPARE:ABS
280 EXTRN REFRESH:ABS
281
282; "PACKET" POINTED TO BY DS:DX
283PACKET STRUC ;USED BY MINOR CODES: 6AH,4AH,4DH (SELECT, QUERY SELECTED, PREPARE END)
284PACKLEN DW 2 ;LENGTH OF PACKET IN BYTES, FOR DBCS COUNTRIES, LENGTH OF DBCS TABLE (IF NON-ZERO) WILL be added
285PACKCPID DW 0 ;CODE PAGE ID
286PACKVECTOR1 DB 0 ;start of vector list if included ;AN000;
287 DB 0 ;AN000;
288 DB 0 ;AN000;
289 DB 0 ;AN000;
290 DB 0 ;AN000;
291 DB 0 ;AN000;
292 DB 0 ;AN000;
293 DB 0 ;AN000;
294 DB 0 ;AN000;
295 DB 0 ;AN000;
296 DB 0 ;AN000;
297 DB 0 ;AN000;
298 DB 0 ;AN000;
299 DB 0 ;AN000;
300 DB 0 ;AN000;
301 DB 0 ;AN000;
302 DB 0 ;AN000;
303 DB 0 ; holders for maximum possible number of ;AN000;
304 DB 0 ; DBCS vector pairs ;AN000;
305 DB 0 ; ;AN000;
306 DB 0 ; ;AN000;
307 DB 0 ; ;AN000;
308PACKVECTOR12 DB 0 ; ;AN000;
309 DB 0 ; ;AN000;
310PACKET ENDS ;AN000;
311 ;AN000;
312DBCS_head STRUC ;return from function 6507, pointed to by ES:DI, addressed via "DBCS_header" ;AN000;
313info_id DB 7 ;AN000;
314table_ptr DD 0 ;used to address DBCS_tabl ;AN000;
315DBCS_head ENDS
316 ;AN000;
317DBCS_tabl STRUC ;map of DBCS table, addressed via DBCS_table ;AN000;
318table_len DW 6 ;length in bytes of the list of vectors ;AN000;
319vector1 DB 0 ;start of vector list ;AN000;
320 DB 0 ;AN000;
321 DB 0 ;AN000;
322 DB 0 ;AN000;
323 DB 0 ;AN000;
324 DB 0 ;AN000;
325 DB 0 ;AN000;
326 DB 0 ;AN000;
327 DB 0 ;AN000;
328 DB 0 ;AN000;
329 DB 0 ;each vector is two bytes, a start value and an ;AN000;
330 DB 0 ;end value ;AN000;
331 DB 0 ;AN000;
332 DB 0 ;AN000;
333 DB 0 ;AN000;
334 DB 0 ;AN000;
335 DB 0 ;AN000;
336 DB 0 ;AN000;
337 DB 0 ;AN000;
338 DB 0 ;AN000;
339 DB 0 ;AN000;
340 DB 0 ;AN000;
341 DB 0 ;AN000;
342 DB 0 ;AN000;
343DBCS_tabl ENDS
344
345
346; "DES_STRT_PACKET" POINTED TO BY DS:DX
347DES_STRT_PACKET STRUC
348DES_STRT_PKFL DW ? ;FLAGS (DEFINED BELOW STRUC DEFINITION)
349DES_STRT_PKLEN DW ? ;BYTE LENGTH OF REST OF THE PACKET,
350 ; NOT INCLUDING THIS LENGTH FIELD
351DES_STRT_PKNUM DW ? ;NUMBER OF CODEPAGES IN FOLLOWING LIST
352DES_STRT_PKCP1 DW ? ;CODE PAGE ONE
353DES_STRT_PKCP2 DW ? ;CODE PAGE TWO
354; : : : :
355DES_STRT_PKCPN DW ? ;CODE PAGE n
356;NOTE: THESE n CODEPAGES MAY HAVE A -1 VALUE, WHICH IS TREATED AS A PLACEHOLDER
357; TO ALLOW POSITION CONTROL FOR EACH CODEPAGE VALUE IN THE LIST.
358DES_STRT_PACKET ENDS
359
360; DEFINITIONS OF CONTENTS OF "DES_STRT_PKFL"
361DES_STRT_FL_SINGLE EQU 8000H ; 8000H=SINGLE CP FIFO PREPARE
362; (NOT SUPPORTED, ONLY LIST FORM IN DOS 3.30 RELEASE)
363DES_STRT_FL_CART EQU 0001H ; 0001H=CARTRIDGE PREPARE
364
365; ED OF MODECPEQ.INC FILE
diff --git a/v4.0/src/CMD/MODE/MODECPMS.INC b/v4.0/src/CMD/MODE/MODECPMS.INC
new file mode 100644
index 0000000..4a015c5
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECPMS.INC
@@ -0,0 +1,157 @@
1;MODECPMS.INC - INCLUDED IN MODECP.SAL 
2 IF1
3 %OUT INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES
4 ENDIF
5
6;$SALUT CP(0,2,9,32) ;(set preprocessor columns for indenting)
7
8 EXTRN CPMSG1:WORD ;"Failure to access Codepage Font File",BEEP,CR,LF,EOM
9
10 EXTRN CPMSG2:WORD ;"Failure to OPEN device: %S",CR,LF,EOM
11 EXTRN CPMSGLST2DEV:WORD ;FILLED IN WITH PTR TO DEVICE NAME
12
13 EXTRN CPMSG3:WORD ;"Missing from font file is either device or codepage",BEEP,CR,LF,EOM
14
15 EXTRN CPMSG4:WORD ;"Font file contents invalid",CR,LF,EOM
16
17 EXTRN CPMSG5:WORD ;"Previously prepared codepage deleted",BEEP,CR,LF,EOM
18
19 EXTRN CPMSG6:WORD ;"Active codepage for %S is %D",CR,LF,EOM
20 EXTRN CPMSGLST6DEV:WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME
21 EXTRN CPMSGLST6CP:WORD ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
22
23 EXTRN CPMSG7:WORD ;"Device %S not prepared",CR,LF,EOM
24 EXTRN CPMSGLST7DEV:WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME
25
26 EXTRN CPMSG8:WORD ;"%s codepages:",CR,LF,EOM
27;AC001; EXTRN CPMSGLST8HD:WORD ;OFFSET TO "HARDWARE" OR "PREPARED"
28 EXTRN CPMSG8_HW:WORD ;message number for "hardware ",EOM
29 EXTRN CPMSG8_PR:WORD ;message number for "prepared ",EOM
30
31 EXTRN CPMSG9:WORD ;" Codepage %d",CR,LF,EOM
32 EXTRN CPMSGLST9CP:WORD ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
33
34 EXTRN CPMSG10:WORD ;"MODE %S Codepage function completed",CR,LF,EOM
35;AC001; EXTRN CPMSGLST10FUN:WORD ;FILLED IN TO POINT TO:
36 EXTRN CPMSGxx_QUERY:WORD ;message number for "Query",EOM
37 EXTRN CPMSGxx_PREP:WORD ;message number for "Prepare",EOM
38 EXTRN CPMSGxx_REFRESH:WORD ;message number for "Refresh",EOM
39 EXTRN CPMSGxx_SELECT:WORD ;message number for "Select",EOM
40
41 EXTRN CPMSG12:WORD ;"Current Codepage settings:",CR,LF,EOM
42
43 EXTRN CPMSG13:WORD ;" %D - %S Codepage",CR,LF,EOM
44 EXTRN CPMSGLST13CP:WORD ;FILLED IN WITH CODEPAGE ID
45;AC001; EXTRN CPMSGLST13TYP:WORD ;FILLED IN TO POINT TO:
46 EXTRN CPMSG13_ACT:WORD ;message number for "Active"
47 EXTRN CPMSG13_SYS:WORD ;message number for "System"
48
49 EXTRN CPMSG14:WORD ;" Codepage unprepared",CR,LF,EOM
50
51 EXTRN CPMSG15:WORD ;"Device not supported for Codepage",BEEP,CR,LF,EOM
52
53 EXTRN CPMSG16:WORD ;"No codepage has been selected",BEEP,CR,LF,EOM
54
55 EXTRN CPMSG17:WORD ;"Device error during %S",BEEP,CR,LF,EOM
56 EXTRN CPMSG17_WRIT:WORD ;message number for "write of font file to device",EOM
57
58 EXTRN CPMSG18:WORD ;"Specified Codepage not prepared",BEEP,CR,LF,EOM
59
60 EXTRN CPMSG19:WORD ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
61
62 EXTRN CPMSG20:WORD ;"Error during read of font file",BEEP,CR,LF,EOM
63
64 EXTRN CPMSG21:WORD ;CR,LF,"Unable to perform REFRESH",BEEP,EOM
65
66;THE FOLLOWING DATA AREAS DEFINING MESSAGES CAN BE FOUND IN "MODEMES.ASM"
67
68;CPMSG1 DB "Failure to access Codepage Font File",BEEP,CR,LF,EOM
69;CPMSG1 DW CPMSG1
70
71;CPMSG2 DB "Failure to access device: %S",BEEP,CR,LF,EOM
72;CPMSG2 DW CPMSG2
73;CPMSGLST2DEV DW ? ;FILLED IN WITH PTR TO DEVICE NAME
74
75;CPMSG3 DB ;"Missing from font file is either device or codepage",BEEP,CR,LF,EOM
76;CPMSG3 DW CPMSG3
77
78;CPMSG4 DB "Font file contents invalid",BEEP,CR,LF,EOM
79;CPMSG4 DW CPMSG4
80
81;CPMSG5 DB "Previous prepared codepage deleted",BEEP,CR,LF,EOM
82;CPMSG5 DW CPMSG5
83
84;CPMSG6 DB "Active codepage for device %S is %D",CR,LF,EOM
85;CPMSG6 DW CPMSG6
86;CPMSGLST6DEV DW ? ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME
87;CPMSGLST6CP DW ? ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
88
89;CPMSG7 DB "Device %S not prepared",CR,LF,EOM
90;CPMSG7 DW CPMSG7
91;CPMSGLST7DEV DW ? ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME
92
93;CPMSG8 DB "%S codepages:",CR,LF,EOM
94;CPMSG8 DW CPMSG8
95;CPMSGLST8HD DW ? ;OFFSET TO "HARDWARE" OR "PREPARED"
96;CPMSG8_HW DB "hardware",EOM
97;CPMSG8_PR DB "prepared",EOM
98
99;CPMSG9 DB " Codepage %d",CR,LF,EOM
100;CPMSG9 DW CPMSG9
101;CPMSGLST9CP DW ? ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
102
103;CPMSG10 DB "MODE %S Codepage function completed",CR,LF,EOM
104;CPMSG10 DW CPMSG10
105;CPMSGLST10FUN DW ? ;FILLED IN TO POINT TO:
106;CPMSG10_QUERY DB "Querry",EOM
107;CPMSG10_DES DB "Prepare",EOM
108;CPMSG10_SELECT DB "Activate",EOM
109;CPMSG10_REFRESH DB "Refresh",EOM
110;CPMSG10_GLOBAL DB "Global",EOM
111
112;CPMSG11 DB "Error %S Global Codepage",CR,LF,EOM
113;CPMSG11 DW CPMSG11
114;CPMSGLST11FUN DW ? ;FILLED IN TO POINT TO:
115;CPMSG11_SET DB "setting",EOM
116;CPMSG11_GET DB "getting",EOM
117
118;CPMSG12 DB "Current Codepage settings:",CR,LF,EOM
119;CPMSG12 DW CPMSG12
120
121;CPMSG13 DB " %D - %S Codepage",CR,LF,EOM
122;CPMSG13 DW CPMSG13
123;CPMSGLST13CP DW ? ;FILLED IN WITH CODEPAGE ID
124;CPMSGLST13TYP DW ? ;FILLED IN TO POINT TO:
125;CPMSG13_ACT DB "Active",EOM
126;CPMSG13_SYS DB "System",EOM
127
128;CPMSG14 DB " Codepage unprepared",CR,LF,EOM
129;CPMSG14 DW CPMSG14
130
131;CPMSG15 DB "Device not supported for Codepage",BEEP,CR,LF,EOM
132;CPMSG15 DW CPMSG15
133
134;CPMSG16 DB "No codepage has been selected",BEEP,CR,LF,EOM
135;CPMSG16 DW CPMSG16
136
137;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM
138;CPMSG17 DW CPMSG17
139;CPMSGLST17FUN DW ? ;FILLED IN TO POINT TO:
140;CPMSG17_QUERY DB "Query",EOM
141;CPMSG17_PREP DB "Prepare",EOM
142;CPMSG17_REFRESH DB "Refresh",EOM
143;CPMSG17_ACT DB "Activate",EOM
144
145;CPMSG17_WRIT DB "write of font file to device",EOM
146
147;CPMSG18 DB "Specified Codepage not prepared",BEEP,CR,LF,EOM
148;CPMSG18 DW CPMSG18
149
150;CPMSG19 DB "Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
151;CPMSG19 DW CPMSG19
152
153;CPMSG20 DB "Error during read of font file",BEEP,CR,LF,EOM
154;CPMSG20 DW CPMSG20
155
156;CPMSG21 DB "Unable to perform REFRESH operation",BEEP,CR,LF,EOM
157;CPMSG21 DW CPMSG21
diff --git a/v4.0/src/CMD/MODE/MODECPRO.INC b/v4.0/src/CMD/MODE/MODECPRO.INC
new file mode 100644
index 0000000..3b87113
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECPRO.INC
@@ -0,0 +1,88 @@
1; MODECPRO.INC - INCLUDED BY MODECP.SAL 
2;****************** START OF SPECIFICATIONS *****************************
3; MODULE NAME: MODECP
4
5; DESCRIPTIVE NAME: MODE, CODEPAGE HANDLER
6
7;FUNCTION: Manages the codepage file, sending it to the
8; device when a DESIGNATE is requested, telling
9; the device which FONT to select when ACTIVATE
10; is requested, and displaying the font status
11; of the device when QUERY is requested.
12
13; NOTES:
14; This module should be processed with the SALUT pre-processor
15; with re-allignment not requested, as:
16
17; SALUT MODECP,NUL,;
18
19
20; ENTRY POINT: MODECP
21; LINKAGE: CALL MODECP
22
23; INPUT: As defined by the "CODEPAGE_PARMS" STRUC.
24; All four segregs are expected to point to the one common
25; segment, called PRINTF_CODE.
26
27; EXIT-NORMAL: ERRORLEVEL 0 - Successful completion
28
29; EXIT-ERROR: ERRORLEVEL 1 - An error message is also displayed
30
31; EFFECTS:
32
33; INTERNAL REFERENCES:
34; ROUTINES:
35; MODECP - HANDLES ALL PROCESSING FOR THE CODEPAGE SUPPORT IN MODE
36; SET_DEV_TYPE - SCANS LIST OF DEVICES FOR SPECIFIED DEVICE
37; SET_GLOBAL_CODEPAGE - DEVICE IS "*", INVOKE OR QUERY GLOBAL CODEPAGE
38; FUNCTION_SELECT - DETERMINES FUNCTION TO BE PERFORMED, DESIGNATE,QUERY,INVOKE
39; DO_DESIGNATE - PERFORMS START DESIGNATE, DOWNLOAD FONT FILE, DESIGNATE END
40; DES_START - HANDLES DETAILS OF START DESIGNATE FUNCTION
41; DES_START_ERROR - DIAGNOSES ERRORS FROM DESIGNATE START
42; MOVE_FILE - HANDLES DETAILS OF DOWNLOADING THE FONT FILE TO DEVICE
43; DES_END - HANDLES DETAILS OF DESIGNATE END FUNCTION
44; DO_INVOKE - HANDLES DETAILS OF INVOKE FUNCTION
45; DO_STATUS - INTERROGATES DEVICE FOR CODEPAGE STATUS
46; QUERY_ERROR - DISGNOSES ERRORS FROM QUERY REQUEST
47; DISPLAY_CPID - DISPLAYS THE CODEPAGE ID AS PART OF STATUS REPORT
48; SEND_MSG - SET UP ALL ERROR MESSAGES TO BE DISPLAYED
49; QUEUE - HANDLES INTERFACE TO "PRINTF" FOR ALL MESSAGES
50; EX_ERR - DOSCALL RESULTED IN CARRY, SO GO FIND OUT THE EXTENDED ERROR
51; DO_GENERIC_IOCTL - PROCESS ALL GENERIC IOCTL CALLS TO THE DEVICE
52;
53
54; DATA AREAS:
55; WORKAREA - Temporary storage
56
57; EXTERNAL REFERENCES:
58; ROUTINES:
59; PRINTF - Uses the MSG parm lists to construct the messages
60; on STDOUT, on on STDERR.
61
62; DATA AREAS: A large buffer is allocated from free memory, if available.
63
64; COPYRIGHT: The copyright notice is found in the OBJ code generated from
65; the "MAIN.ASM" module of the MODE component of the DOS utility.
66
67;****************** END OF SPECIFICATIONS *****************************
68 IF1
69 %OUT INCLUDE MODECPRO.INC ;MODULE PROLOGUE
70 ENDIF
71
72;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
73;º º
74
75; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
76; implement the SYSGETMSG method of getting addressability to
77; the pieces. This means that the code does a SYSGETMSG call
78; which returns a pointer (DS:SI) to the message piece. The
79; address is then put in the sublist block for the message
80; being issued.
81
82; AX002 - P4576 Segments were being trashed before calling message services
83; because device type was wrong on IOCTL call because ES was
84; zero when using CMPSB in SET_DEV_TYPE and no match was made.
85
86;º º
87;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
88
diff --git a/v4.0/src/CMD/MODE/MODEDEFS.INC b/v4.0/src/CMD/MODE/MODEDEFS.INC
new file mode 100644
index 0000000..846a884
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEDEFS.INC
@@ -0,0 +1,749 @@
1
2;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
3;º º ;AN000;
4 ;AN000;
5; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the
6; USA.MSG file because it looked like a common message. Now
7; I use a different (better) message.
8
9; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
10; implement the SYSGETMSG method of getting addressability to
11; the pieces. This means that the code does a SYSGETMSG call
12; which returns a pointer (DS:SI) to the message piece. The
13; address is then put in the sublist block for the message
14; being issued.
15
16
17;º º ;AN000;
18;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
19 ;AN000;
20Stdin equ 0
21StdOut equ 1
22StdErr equ 2
23No_Handle equ -1
24
25
26Msg_Ser_Class equ 0
27Ext_Err_Class equ 1
28Parse_Error_Class equ 2
29Utility_Msg_Class equ 0FFh
30
31N_A equ 0
32
33No_Input equ 0
34DOS_keyb_input EQU 01
35clear_buffer EQU 0C0H
36;
37;*****************************************************************************
38; Macro's
39;*****************************************************************************
40;
41
42Define_Msg macro Message_Name ; ;AN000;
43 ;
44Create_Msg Message_Name,Message_Number,Handle,Sublist,Count,Class,Function,Input;AN000;
45 ;
46 endm ; ;AN000;
47
48;-----------------------------------------------------------------------------
49
50Create_Msg macro Parm1,Parm2,Parm3,Parm4,Parm5,Parm6,Parm7,Parm8 ;AN000;
51
52Parm1 label word ; ;AN000;
53 dw Parm2 ; ;AN000;
54 dw Parm3 ; ;AN000;
55 dw OFFSET Parm4 ; ;AN000;
56 dw Parm5 ; ;AN000;
57 db Parm6 ; ;AN000;
58 db Parm7 ; ;AN000;
59 dw Parm8 ; ;AN000;
60 endm ; ;AN000;
61
62
63;
64;*****************************************************************************
65; Message Description Tables
66;*****************************************************************************
67;
68
69;---------------------- ;
70Message_Number = 3 ;CR,LF,"Invalid switch - %1",BEEP,CR,LF,EOM
71Handle = STDOUT ; ;AN000;
72Sublist = sublist_invalid_switch
73Count = 1 ; ;AN000;
74Class = Parse_Error_Class ;resident in COMMAND ;AN000;
75Function = No_Function ; ;AN000;
76Input = N_A ; ;AN000;
77 Define_Msg invalid_switch ; ;AN000;
78;---------------------- ;
79Message_Number = 1 ;COMMON1 "Incorrect DOS Version"
80Handle = STDERR ; ;AN000;
81Sublist = No_Replace ; ;AN000;
82Count = N_A ; ;AN000;
83Class = msg_ser_Class ; ;AN000;
84Function = No_Input ; ;AN000;
85Input = N_A ; ;AN000;
86 Define_Msg wrong_version ; ;AN000;
87;---------------------- ;
88Message_Number = 2 ; ;AN000;
89Handle = STDERR ;extend1 ;AN000;
90Sublist = No_Replace ; ;AN000;
91Count = N_A ; ;AN000;
92Class = ext_err_Class ; ;AN000;
93Function = No_Input ; ;AN000;
94Input = N_A ; ;AN000;
95 Define_Msg msgOutOfMemory ; ;AN000;
96;---------------------- ;
97Message_Number = 3 ;CR,LF,"Must specify COM1, COM2, COM3 or COM4",CR,LF,EOM
98Handle = STDOUT ; ;AN000;
99Sublist = No_Replace ; ;AN000;
100Count = N_A ; ;AN000;
101Class = Utility_Msg_Class ; ;AN000;
102Function = No_Input ; ;AN000;
103Input = N_A ; ;AN000;
104 Define_Msg com1_or_com2 ; ;AN000;
105;---------------------- ;
106Message_Number = 4 ;CR,LF,"Resident portion of MODE loaded",CR,LF,EOM
107Handle = STDOUT ; ;AN000;
108Sublist = No_Replace ; ;AN000;
109Count = N_A ; ;AN000;
110Class = Utility_Msg_Class ; ;AN000;
111Function = No_Input ; ;AN000;
112Input = N_A ; ;AN000;
113 Define_Msg moved_msg ; ;AN000;
114;---------------------- ;
115Message_Number = 5 ;CR,LF,"Illegal device name",BEEP,CR,LF,EOM
116Handle = STDOUT ; ;AN000;
117Sublist = sublist_err1 ; ;AN000;
118Count = 1 ; ;AN000;
119Class = Utility_Msg_Class ; ;AN000;
120Function = No_Input ; ;AN000;
121Input = N_A ; ;AN000;
122 Define_Msg ERR1 ; ;AN000;
123;---------------------- ;
124Message_Number = 6 ;CR,LF,"Printer error",BEEP,CR,LF,EOM
125Handle = STDOUT ; ;AN000;
126Sublist = No_Replace ; ;AN000;
127Count = N_A ; ;AN000;
128Class = Utility_Msg_Class ; ;AN000;
129Function = No_Input ; ;AN000;
130Input = N_A ; ;AN000;
131 Define_Msg ERR2 ; ;AN000;
132;---------------------- ;
133Message_Number = 7 ;CR,LF,"LPT%1: set for 80",CR,LF,EOM
134Handle = STDOUT ; ;AN000;
135Sublist = sublist_PT80 ; ;AN000;
136Count = 1 ; ;AN000;
137Class = Utility_Msg_Class ; ;AN000;
138Function = No_Input ; ;AN000;
139Input = N_A ; ;AN000;
140 Define_Msg PT80 ; ;AN000;
141;---------------------- ;
142Message_Number = 8 ;CR,LF,"LPT%1: set for 132",CR,LF,EOM
143Handle = STDOUT ; ;AN000;
144Sublist = sublist_PT132 ; ;AN000;
145Count = 1 ; ;AN000;
146Class = Utility_Msg_Class ; ;AN000;
147Function = No_Function ; ;AN000;
148Input = N_A ; ;AN000;
149 Define_Msg PT132 ; ;AN000;
150;---------------------- ;
151Message_Number = 9 ;CR,LF,"Printer lines per inch set",CR,LF,EOM
152Handle = STDOUT ; ;AN000;
153Sublist = No_replace ; ;AN000;
154Count = N_A ; ;AN000;
155Class = Utility_Msg_Class ; ;AN000;
156Function = No_Function ; ;AN000;
157Input = N_A ; ;AN000;
158 Define_Msg PTLINES ; ;AN000;
159;---------------------- ;
160Message_Number = 10 ;CR,LF,"Invalid baud rate specified",BEEP,CR,LF,EOM
161Handle = STDOUT ; ;AN000;
162Sublist = No_Replace ; ;AN000;
163Count = N_A ; ;AN000;
164Class = Utility_Msg_Class ; ;AN000;
165Function = No_Function ; ;AN000;
166Input = N_A ; ;AN000;
167 Define_Msg RATEMSG ; ;AN000;
168;---------------------- ;
169Message_Number = 11 ;CR,LF,"COM%1: %2,%3,%4,%5,%6",CR,LF,EOM
170Handle = STDOUT ; ;AN000;
171Sublist = sublist_INITMSG ; ;AN000;
172Count = 6 ; ;AN000;
173Class = Utility_Msg_Class ; ;AN000;
174Function = No_Function ; ;AN000;
175Input = N_A ; ;AN000;
176 Define_Msg INITMSG ; ;AN000;
177;---------------------- ;
178Message_Number = 12 ;"0123456789",EOM
179Handle = STDOUT ; ;AN000;
180Sublist = No_replace ; ;AN000;
181Count = N_A ; ;AN000;
182Class = Utility_Msg_Class ; ;AN000;
183Function = No_Function ; ;AN000;
184Input = N_A ; ;AN000;
185 Define_Msg NUMBERS ; ;AN000;
186;---------------------- ;
187Message_Number = 13 ;CR,LF,"Do you see the %1? (",YES,"/",NO,")",CR,LF,EOM
188Handle = STDOUT ; ;AN000;
189Sublist = sublist_SHIFT_MSG ; ;AN000;
190Count = 1 ; ;AN000;
191Class = Utility_Msg_Class ; ;AN000;
192Function = clear_buffer+DOS_keyb_input ; ;AN000;
193Input = N_A ; ;AN000;
194 Define_Msg SHIFT_MSG ; ;AN000;
195;---------------------- ;
196;Message_Number = 14 ;CR,LF,"Invalid parameters",BEEP,CR,LF,EOM
197;Handle = STDOUT ; ;AC000;
198;Sublist = No_replace ; ;AC000;
199;Count = N_A ;**** Now use message 54 ***** ;AC000;
200;Class = Utility_Msg_Class ; ;AC000;
201;Function = No_Function ; ;AC000;
202;Input = N_A ; ;AC000;
203; Define_Msg MSGI ; ;AC000;
204;---------------------- ;
205Message_Number = 15 ;CR,LF,"LPT%1: rerouted to COM%2:",CR,LF,EOM
206Handle = STDOUT ; ;AN000;
207Sublist = sublist_REDIRMSG ; ;AN000;
208Count = 2 ; ;AN000;
209Class = Utility_Msg_Class ; ;AN000;
210Function = No_Function ; ;AN000;
211Input = N_A ; ;AN000;
212 Define_Msg REDIRMSG ; ;AN000;
213;---------------------- ;
214Message_Number = 16 ;CR,LF,"LPT%1: not rerouted",CR,LF,EOM
215Handle = STDOUT ; ;AN000;
216Sublist = sublist_NOTREMSG ; ;AN000;
217Count = 1 ; ;AN000;
218Class = Utility_Msg_Class ; ;AN000;
219Function = No_Function ; ;AN000;
220Input = N_A ; ;AN000;
221 Define_Msg NOTREMSG ; ;AN000;
222;---------------------- ;
223Message_Number = 17 ;CR,LF,"%1 retry on parallel printer time-out",CR,LF,EOM
224Handle = STDOUT ; ;AN000;
225Sublist = sublist_RETPARTO ; ;AN000;
226Count = 1 ; ;AN000;
227Class = Utility_Msg_Class ; ;AN000;
228Function = No_Function ; ;AN000;
229Input = N_A ; ;AN000;
230 Define_Msg RETPARTO ; ;AN000;
231;---------------------- ;
232Message_Number = 18 ;CR,LF," Unable to shift screen %1",CR,LF,BEEP,EOM
233Handle = STDOUT ; ;AN000;
234Sublist = sublist_CANT_SHIFT ; ;AN000;
235Count = 1 ; ;AN000;
236Class = Utility_Msg_Class ; ;AN000;
237Function = No_Function ; ;AN000;
238Input = N_A ; ;AN000;
239 Define_Msg CANT_SHIFT ; ;AN000;
240;---------------------- ;
241Message_Number = 19 ;CR,LF,"Invalid parameter - %1",BEEP,CR,LF,EOM
242Handle = STDOUT ; ;AN000;
243Sublist = sublist_invalid_parameter
244Count = 1 ; ;AN000;
245Class = Utility_Msg_Class ; ;AN000;
246Function = No_Function ; ;AN000;
247Input = N_A ; ;AN000;
248 Define_Msg invalid_parameter ; ;AN000;
249;---------------------- ;
250Message_Number = 20 ;CR,LF,'Invalid number of parameters',BEEP,CR,LF,EOM
251Handle = STDOUT ; ;AN000;
252Sublist = No_Replace ; ;AN000;
253Count = N_A ; ;AN000;
254Class = Utility_Msg_Class ; ;AN000;
255Function = No_Function ; ;AN000;
256Input = N_A ; ;AN000;
257 Define_Msg invalid_number_of_parameters ; ;AN000;
258;---------------------- ;
259Message_Number = 21 ;CR,LF,'NET 042: Unable to do requested command',BEEP,CR,LF,EOM
260Handle = STDOUT ; ;AN000;
261Sublist = No_Replace ; ;AN000;
262Count = N_A ; ;AN000;
263Class = Utility_Msg_Class ; ;AN000;
264Function = No_Function ; ;AN000;
265Input = N_A ; ;AN000;
266 Define_Msg net_error ; ;AN000;
267;---------------------- ;
268Message_Number = 22 ;CR,LF,'Infinite retry not supported on Network printer',beep,cr,lf,eom
269Handle = STDOUT ; ;AN000;
270Sublist = No_Replace ; ;AN000;
271Count = N_A ; ;AN000;
272Class = Utility_Msg_Class ; ;AN000;
273Function = No_Function ; ;AN000;
274Input = N_A ; ;AN000;
275 Define_Msg not_supported ; ;AN000;
276;---------------------- ;
277Message_Number = 23 ;CR,LF,"Failure to access Codepage Font File",BEEP,CR,LF,EOM
278Handle = STDOUT ; ;AN000;
279Sublist = No_Replace ; ;AN000;
280Count = N_A ; ;AN000;
281Class = Utility_Msg_Class ; ;AN000;
282Function = No_Function ; ;AN000;
283Input = N_A ; ;AN000;
284 Define_Msg cpmsg1 ; ;AN000;
285;---------------------- ;
286Message_Number = 24 ;CR,LF,"Failure to access device: %1",BEEP,CR,LF,EOM
287Handle = STDOUT ; ;AN000;
288Sublist = sublist_cpmsg2 ; ;AN000;
289Count = 1 ; ;AN000;
290Class = Utility_Msg_Class ; ;AN000;
291Function = No_Function ; ;AN000;
292Input = N_A ; ;AN000;
293 Define_Msg cpmsg2 ; ;AN000;
294;---------------------- ;
295Message_Number = 25 ;CR,LF,"Device or codepage missing from font file",BEEP,CR,LF,EOM
296Handle = STDOUT ; ;AN000;
297Sublist = No_Replace ; ;AN000;
298Count = N_A ; ;AN000;
299Class = Utility_Msg_Class ; ;AN000;
300Function = No_Function ; ;AN000;
301Input = N_A ; ;AN000;
302 Define_Msg cpmsg3 ; ;AN000;
303;---------------------- ;
304Message_Number = 26 ;CR,LF,"Font file contents invalid",BEEP,CR,LF,EOM
305Handle = STDOUT ; ;AN000;
306Sublist = No_Replace ; ;AN000;
307Count = N_A ; ;AN000;
308Class = Utility_Msg_Class ; ;AN000;
309Function = No_Function ; ;AN000;
310Input = N_A ; ;AN000;
311 Define_Msg cpmsg4 ; ;AN000;
312;---------------------- ;
313Message_Number = 27 ;CR,LF,"Previously prepared codepage replaced",BEEP,CR,LF,EOM
314Handle = STDOUT ; ;AN000;
315Sublist = No_Replace ; ;AN000;
316Count = N_A ; ;AN000;
317Class = Utility_Msg_Class ; ;AN000;
318Function = No_Function ; ;AN000;
319Input = N_A ; ;AN000;
320 Define_Msg cpmsg5
321;---------------------- ;
322Message_Number = 28 ;CR,LF,"Active codepage for device %1 is %2",CR,LF,EOM
323Handle = STDOUT ; ;AN000;
324Sublist = sublist_cpmsg6 ; ;AN000;
325Count = 2 ; ;AN000;
326Class = Utility_Msg_Class ; ;AN000;
327Function = No_Function ; ;AN000;
328Input = N_A ; ;AN000;
329 Define_Msg cpmsg6
330;---------------------- ;
331Message_Number = 29 ;CR,LF,"Device %1 not prepared",CR,LF,EOM
332Handle = STDOUT ; ;AN000;
333Sublist = sublist_cpmsg7 ; ;AN000;
334Count = 1
335Class = Utility_Msg_Class ; ;AN000;
336Function = No_Function ; ;AN000;
337Input = N_A ; ;AN000;
338 Define_Msg cpmsg7
339;---------------------- ;
340Message_Number = 30 ;"%1 codepages:",CR,LF,EOM
341Handle = STDOUT ; ;AN000;
342Sublist = sublist_cpmsg8
343Count = 1
344Class = Utility_Msg_Class ; ;AN000;
345Function = No_Function ; ;AN000;
346Input = N_A ; ;AN000;
347 Define_Msg cpmsg8
348;---------------------- ;
349Message_Number = 31 ;" Codepage %1",CR,LF,EOM ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
350Handle = STDOUT ; ;AN000;
351Sublist = sublist_cpmsg9
352Count = 1
353Class = Utility_Msg_Class ; ;AN000;
354Function = No_Function ; ;AN000;
355Input = N_A ; ;AN000;
356 Define_Msg cpmsg9
357;---------------------- ;
358Message_Number = 32 ;CR,LF,"MODE %1 Codepage function completed",CR,LF,EOM
359Handle = STDOUT ; ;AN000;
360Sublist = sublist_cpmsg10 ; ;AN000;
361Count = 1
362Class = Utility_Msg_Class ; ;AN000;
363Function = No_Function ; ;AN000;
364Input = N_A ; ;AN000;
365 Define_Msg cpmsg10
366;---------------------- ;
367Message_Number = 33 ;CR,LF,"Current Codepage settings:",CR,LF,EOM ;table header
368Handle = STDOUT ; ;AN000;
369Sublist = No_Replace ; ;AN000;
370Count = N_A ; ;AN000;
371Class = Utility_Msg_Class ; ;AN000;
372Function = No_Function ; ;AN000;
373Input = N_A ; ;AN000;
374 Define_Msg cpmsg12
375;---------------------- ;
376Message_Number = 34 ;" %1 - %2 Codepage",CR,LF,EOM
377Handle = STDOUT ; ;AN000;
378Sublist = sublist_cpmsg13
379Count = 2
380Class = Utility_Msg_Class ; ;AN000;
381Function = No_Function ; ;AN000;
382Input = N_A ; ;AN000;
383 Define_Msg cpmsg13
384;---------------------- ;
385Message_Number = 35 ;" Codepage not prepared",CR,LF,EOM
386Handle = STDOUT ; ;AN000;
387Sublist = no_replace
388Count = N_A ; ;AN000;
389Class = Utility_Msg_Class ; ;AN000;
390Function = No_Function ; ;AN000;
391Input = N_A ; ;AN000;
392 Define_Msg cpmsg14
393;---------------------- ;
394Message_Number = 36 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
395Handle = STDOUT ; ;AN000;
396Sublist = No_Replace ; ;AN000;
397Count = N_A ; ;AN000;
398Class = Utility_Msg_Class ; ;AN000;
399Function = No_Function ; ;AN000;
400Input = N_A ; ;AN000;
401 Define_Msg cpmsg15
402;---------------------- ;
403Message_Number = 37 ;"No codepage has been SELECTED",BEEP,CR,LF,EOM
404Handle = STDOUT ; ;AN000;
405Sublist = No_Replace ; ;AN000;
406Count = N_A ; ;AN000;
407Class = Utility_Msg_Class ; ;AN000;
408Function = No_Function ; ;AN000;
409Input = N_A ; ;AN000;
410 Define_Msg cpmsg16
411;---------------------- ;
412Message_Number = 38 ;"Device error during %1",BEEP,CR,LF,EOM
413Handle = STDOUT ; ;AN000;
414Sublist = sublist_cpmsg17
415Count = 1
416Class = Utility_Msg_Class ; ;AN000;
417Function = No_Function ; ;AN000;
418Input = N_A ; ;AN000;
419 Define_Msg cpmsg17
420;---------------------- ;
421Message_Number = 39 ;"Codepage not prepared",BEEP,CR,LF,EOM
422Handle = STDOUT ; ;AN000;
423Sublist = No_Replace ; ;AN000;
424Count = N_A ; ;AN000;
425Class = Utility_Msg_Class ; ;AN000;
426Function = No_Function ; ;AN000;
427Input = N_A ; ;AN000;
428 Define_Msg cpmsg18
429;---------------------- ;
430Message_Number = 40 ;CR,LF,"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
431Handle = STDOUT ; ;AN000;
432Sublist = No_Replace ; ;AN000;
433Count = N_A ; ;AN000;
434Class = Utility_Msg_Class ; ;AN000;
435Function = No_Function ; ;AN000;
436Input = N_A ; ;AN000;
437 Define_Msg cpmsg19
438;---------------------- ;
439Message_Number = 41 ;CR,LF,"Error during read of font file",BEEP,CR,LF,EOM
440Handle = STDOUT ; ;AN000;
441Sublist = No_Replace
442Count = N_A ; ;AN000;
443Class = Utility_Msg_Class ; ;AN000;
444Function = No_Function ; ;AN000;
445Input = N_A ; ;AN000;
446 Define_Msg cpmsg20
447;---------------------- ;
448Message_Number = 42 ;CR,LF,"Unable to perform REFRESH operation",BEEP,CR,LF,EOM
449Handle = STDOUT ; ;AN000;
450Sublist = No_Replace ; ;AN000;
451Count = N_A ; ;AN000;
452Class = Utility_Msg_Class ; ;AN000;
453Function = No_Function ; ;AN000;
454Input = N_A ; ;AN000;
455 Define_Msg cpmsg21
456;---------------------- ;
457Message_Number = 43 ;CR,LF
458Handle = STDOUT ; ;AN000;
459Sublist = No_Replace ; ;AN000;
460Count = N_A ; ;AN000;
461Class = Utility_Msg_Class ; ;AN000;
462Function = No_Function ; ;AN000;
463Input = N_A ; ;AN000;
464 Define_Msg CRLF
465;---------------------- ;
466Message_Number = 44 ;"Status for device %1:",CR,LF,EOM
467Handle = STDOUT ; ;AN000;
468Sublist = sublist_status_for_device
469Count = 1
470Class = Utility_Msg_Class ; ;AN000;
471Function = No_Function ; ;AN000;
472Input = N_A ; ;AN000;
473 Define_Msg status_for_device
474;---------------------- ;
475Message_Number = 45 ;"------------------" underline for status report header
476Handle = STDOUT ; ;AN000;
477Sublist = No_Replace ; ;AN000;
478Count = N_A
479Class = Utility_Msg_Class ; ;AN000;
480Function = No_Function ; ;AN000;
481Input = N_A ; ;AN000;
482 Define_Msg long_underline
483;---------------------- ;
484Message_Number = 46 ;"----" underline for "CON:"
485Handle = STDOUT ; ;AN000;
486Sublist = No_Replace ; ;AN000;
487Count = N_A
488Class = Utility_Msg_Class ; ;AN000;
489Function = No_Function ; ;AN000;
490Input = N_A ; ;AN000;
491 Define_Msg four_char_underline
492;---------------------- ;
493Message_Number = 47 ;"-----" underline for "COMX:" and "LPTX:"
494Handle = STDOUT ; ;AN000;
495Sublist = No_Replace ; ;AN000;
496Count = N_A
497Class = Utility_Msg_Class ; ;AN000;
498Function = No_Function ; ;AN000;
499Input = N_A ; ;AN000;
500 Define_Msg five_char_underline
501;---------------------- ;
502Message_Number = 48 ;"LINES=%1"
503Handle = STDOUT ; ;AN000;
504Sublist = sublist_LINES_equal ; ;AN000;
505Count = 1
506Class = Utility_Msg_Class ; ;AN000;
507Function = No_Function ; ;AN000;
508Input = N_A ; ;AN000;
509 Define_Msg LINES_equal_msg
510;---------------------- ;
511Message_Number = 49 ;"COLUMNS=%1"
512Handle = STDOUT ; ;AN000;
513Sublist = sublist_COLUMNS_equal ; ;AN000;
514Count = 1
515Class = Utility_Msg_Class ; ;AN000;
516Function = No_Function ; ;AN000;
517Input = N_A ; ;AN000;
518 Define_Msg COLUMNS_equal_msg
519;---------------------- ;
520Message_Number = 50 ;CR,LF,"RATE and DELAY must be specified together",BELL,CR,LF
521Handle = STDOUT ; ;AN000;
522Sublist = No_Replace ; ;AN000;
523Count = N_A
524Class = Utility_Msg_Class ; ;AN000;
525Function = No_Function ; ;AN000;
526Input = N_A ; ;AN000;
527 Define_Msg RATE_and_DELAY_together
528;---------------------- ;
529Message_Number = 51 ;"RATE=%1"
530Handle = STDOUT ; ;AN000;
531Sublist = sublist_RATE_equal ; ;AN000;
532Count = 1
533Class = Utility_Msg_Class ; ;AN000;
534Function = No_Function ; ;AN000;
535Input = N_A ; ;AN000;
536 Define_Msg RATE_equal
537;---------------------- ;
538Message_Number = 52 ;"DELAY=%1"
539Handle = STDOUT ; ;AN000;
540Sublist = sublist_DELAY_equal ; ;AN000;
541Count = 1
542Class = Utility_Msg_Class ; ;AN000;
543Function = No_Function ; ;AN000;
544Input = N_A ; ;AN000;
545 Define_Msg DELAY_equal
546;---------------------- ;
547Message_Number = 53 ;"Function not supported on this machine"
548Handle = STDOUT ; ;AN000;
549Sublist = Sublist_Not_supported ; ;AN000;
550Count = 1
551Class = Utility_Msg_Class ; ;AN000;
552Function = No_Function ; ;AN000;
553Input = N_A ; ;AN000;
554 Define_Msg Function_not_supported
555;---------------------- ;
556Message_Number = 54 ;"Required font not loaded"
557Handle = STDOUT ; ;AN000;
558Sublist = No_Replace ; ;AN000;
559Count = N_A
560Class = Utility_Msg_Class ; ;AN000;
561Function = No_Function ; ;AN000;
562Input = N_A ; ;AN000;
563 Define_Msg Required_font_not_loaded
564;---------------------- ;
565Message_Number = 55 ;"ANSI.SYS must be installed to perform requested function",BELL,CR,LF
566Handle = STDOUT ; ;AN000;
567Sublist = No_Replace ; ;AN000;
568Count = N_A
569Class = Utility_Msg_Class ; ;AN000;
570Function = No_Function ; ;AN000;
571Input = N_A ; ;AN000;
572 Define_Msg ANSI_not_loaded
573;---------------------- ;
574Message_Number = 56 ;CR,LF,"Baud rate required",BELL,CR,LF
575Handle = STDOUT ; ;AN000;
576Sublist = No_Replace ; ;AN000;
577Count = N_A
578Class = Utility_Msg_Class ; ;AN000;
579Function = No_Function ; ;AN000;
580Input = N_A ; ;AN000;
581 Define_Msg Baud_rate_required
582;---------------------- ;
583Message_Number = 57 ;"RETRY=%1",CR,LF
584Handle = STDOUT ; ;AN000;
585Sublist = Sublist_retry_equal ; ;AN000;
586Count = 1
587Class = Utility_Msg_Class ; ;AN000;
588Function = No_Function ; ;AN000;
589Input = N_A ; ;AN000;
590 Define_Msg retry_equal
591;---------------------- ;
592Message_Number = 58 ;"Syntax error - ",CR,LF
593Handle = STDOUT ; ;AN000;
594Sublist = Sublist_syntax_error ; ;AN000;
595Count = 1
596Class = Utility_msg_Class ; ;AN000;
597Function = No_Function ; ;AN000;
598Input = N_A ; ;AN000;
599 Define_Msg syntax_error
600;---------------------- ;
601
602Message_Number = 59 ;"rightmost 9" ;AN001;
603Handle = STDOUT ; ;AN000;
604Sublist = No_Replace ; ;AN000;
605Count = N_A
606Class = Utility_Msg_Class ; ;AN000;
607Function = No_Function ; ;AN000;
608Input = N_A ; ;AN000;
609 Define_Msg rightmost ;AN001;
610;---------------------- ;
611Message_Number = 60 ;"leftmost 0" ;AN001;LEFTMOST DB
612Handle = STDOUT ; ;AN000;
613Sublist = No_Replace ; ;AN000;
614Count = N_A
615Class = Utility_Msg_Class ; ;AN000;
616Function = No_Function ; ;AN000;
617Input = N_A ; ;AN000;
618 Define_Msg leftmost
619;---------------------- ;
620;RETPARTO - CR,LF,;"%s retry on parallel printer time-out",CR,LF,EOM
621
622Message_Number = 61 ;"No" ;AN001;NORETRY DB
623Handle = STDOUT ; ;AN000;
624Sublist = No_Replace ; ;AN000;
625Count = N_A
626Class = Utility_Msg_Class ; ;AN000;
627Function = No_Function ; ;AN000;
628Input = N_A ; ;AN000;
629 Define_Msg noretry
630;---------------------- ;
631Message_Number = 62 ;"Infinite" ;AN001;INFINITE DB
632Handle = STDOUT ; ;AN000;
633Sublist = No_Replace ; ;AN000;
634Count = N_A
635Class = Utility_Msg_Class ; ;AN000;
636Function = No_Function ; ;AN000;
637Input = N_A ; ;AN000;
638 Define_Msg infinite
639;---------------------- ;
640;CANT_SHIFT - CR,LF,;" Unable to shift screen %s",CR,LF,BEEP,EOM
641
642Message_Number = 63 ;"left" ;AN001;LEFT DB
643Handle = STDOUT ; ;AN000;
644Sublist = No_Replace ; ;AN000;
645Count = N_A
646Class = Utility_Msg_Class ; ;AN000;
647Function = No_Function ; ;AN000;
648Input = N_A ; ;AN000;
649 Define_Msg left
650;---------------------- ;
651Message_Number = 64 ;"right" ;AN001;RIGHT DB
652Handle = STDOUT ; ;AN000;
653Sublist = No_Replace ; ;AN000;
654Count = N_A
655Class = Utility_Msg_Class ; ;AN000;
656Function = No_Function ; ;AN000;
657Input = N_A ; ;AN000;
658 Define_Msg right
659;---------------------- ;
660;CPMSG8 DB ;"%S codepages:",CR,LF,EOM
661
662Message_Number = 65 ;"Hardware" ;AN001;CPMSG8_HW DB
663Handle = STDOUT ; ;AN000;
664Sublist = No_Replace ; ;AN000;
665Count = N_A
666Class = Utility_Msg_Class ; ;AN000;
667Function = No_Function ; ;AN000;
668Input = N_A ; ;AN000;
669 Define_Msg cpmsg8_hw
670;---------------------- ;
671Message_Number = 66 ;"Prepared" ;AN001;CPMSG8_PR DB
672Handle = STDOUT ; ;AN000;
673Sublist = No_Replace ; ;AN000;
674Count = N_A
675Class = Utility_Msg_Class ; ;AN000;
676Function = No_Function ; ;AN000;
677Input = N_A ; ;AN000;
678 Define_Msg cpmsg8_pr
679;---------------------- ;
680;CPMSG10 DB ;"MODE %S Codepage function completed",CR,LF,EOM
681;CPMSG17 DB ;"Device error during %S",BEEP,CR,LF,EOM
682
683Message_Number = 67 ;"status" ;AN001;CPMSG17_QUERY CPMSG10_QUERY
684Handle = STDOUT ; ;AN000;
685Sublist = No_Replace ; ;AN000;
686Count = N_A
687Class = Utility_Msg_Class ; ;AN000;
688Function = No_Function ; ;AN000;
689Input = N_A ; ;AN000;
690 Define_Msg cpmsgxx_query
691;---------------------- ;
692Message_Number = 68 ;"prepare" ;AN001;CPMSG17_PREP CPMSG10_DES
693Handle = STDOUT ; ;AN000;
694Sublist = No_Replace ; ;AN000;
695Count = N_A
696Class = Utility_Msg_Class ; ;AN000;
697Function = No_Function ; ;AN000;
698Input = N_A ; ;AN000;
699 Define_Msg cpmsgxx_prep
700;---------------------- ;
701Message_Number = 69 ;"select" ;AN001;CPMSG17_ACT CPMSG10_SELECT
702Handle = STDOUT ; ;AN000;
703Sublist = No_Replace ; ;AN000;
704Count = N_A
705Class = Utility_Msg_Class ; ;AN000;
706Function = No_Function ; ;AN000;
707Input = N_A ; ;AN000;
708 Define_Msg cpmsgxx_select
709;---------------------- ;
710Message_Number = 70 ;"refresh" ;AN001;CPMSG17_REFRESH CPMSG10_REFRESH
711Handle = STDOUT ; ;AN000;
712Sublist = No_Replace ; ;AN000;
713Count = N_A
714Class = Utility_Msg_Class ; ;AN000;
715Function = No_Function ; ;AN000;
716Input = N_A ; ;AN000;
717 Define_Msg cpmsgxx_refresh
718;---------------------- ;
719
720;CPMSG17 DB ;"Device error during %S",BEEP,CR,LF,EOM
721
722Message_Number = 71 ;"write of font file to device",EOM ;AN001;CPMSG17_WRIT
723Handle = STDOUT ; ;AN000;
724Sublist = No_Replace ; ;AN000;
725Count = N_A
726Class = Utility_Msg_Class ; ;AN000;
727Function = No_Function ; ;AN000;
728Input = N_A ; ;AN000;
729 Define_Msg cpmsg17_writ
730;---------------------- ;
731;CPMSG13 DB ;" %D - %S Codepage",CR,LF,EOM
732
733Message_Number = 72 ;"selected" ;AN001;CPMSG13_ACT
734Handle = STDOUT ; ;AN000;
735Sublist = No_Replace ; ;AN000;
736Count = N_A
737Class = Utility_Msg_Class ; ;AN000;
738Function = No_Function ; ;AN000;
739Input = N_A ; ;AN000;
740 Define_Msg cpmsg13_act
741;---------------------- ;
742Message_Number = 73 ;"system" ;AN001;CPMSG13_SYS
743Handle = STDOUT ; ;AN000;
744Sublist = No_Replace ; ;AN000;
745Count = N_A
746Class = Utility_Msg_Class ; ;AN000;
747Function = No_Function ; ;AN000;
748Input = N_A ; ;AN000;
749 Define_Msg cpmsg13_sys
diff --git a/v4.0/src/CMD/MODE/MODEECHO.ASM b/v4.0/src/CMD/MODE/MODEECHO.ASM
new file mode 100644
index 0000000..a17c2d5
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEECHO.ASM
@@ -0,0 +1,482 @@
1PAGE ,132 ;
2TITLE MODEECHO - REDIRECT PRINTER OUTPUT FROM PARALLEL TO SERIAL
3
4.XLIST
5INCLUDE STRUC.INC
6.LIST
7
8INCLUDE common.stc ;definition of parm_list_entry struc
9
10DISPLAY MACRO MSG
11 MOV DX,OFFSET MSG
12 CALL PRINTF
13ENDM
14
15SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
16 PUSH AX
17 MOV AX,VALUE
18 MOV REG,AX
19 POP AX
20ENDM
21
22
23;*****************************************************************
24VECT SEGMENT AT 0
25 ORG 50H
26VECT14H LABEL DWORD ;RS232 CALL, WILL POINT TO MODETO AFTER
27 ; RESIDENT CODE IS LOADED.
28 ORG 400H
29RS232_BASE DW ? ;ADDR OF RS232 ADAPTER FOR COM1
30 DW ? ;ADDR OF RS232 ADAPTER FOR COM2
31 DW ? ;ADDR OF RS232 ADAPTER FOR COM3
32 DW ? ;ADDR OF RS232 ADAPTER FOR COM4
33;
34 ORG 408H
35PRINTR DW ? ;LPT1
36 DW ? ;LPT2
37 DW ? ;LPT3
38;
39 ORG 530H
40RESSEG DD ? ;VECTOR OF MODETO, IF RESIDENT,OR 0
41VECT ENDS
42;*****************************************************************
43ascii_to_int EQU 0FH ;ANDed with an ascii 0-9 value yeilds binary 0-9
44CR EQU 13 ;CARRIAGE RETURN
45LF EQU 10 ;LINE FEED
46parm_list EQU [BP] ;AN000; ;AN000;
47TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN
48
49PUBLIC LPTNO ;used by modeprin and modepars
50PUBLIC PRINTR
51PUBLIC display_printer_reroute_status
52
53PAGE
54;***************************************************************
55PRINTF_CODE SEGMENT PUBLIC
56 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,ES:NOTHING
57
58;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
59;º º
60
61two DB 2 ;used to change byte displacement to word disp. See 'modeecho'
62LPTNO DB 0 ;holder of ASCII form of the LPT number (1 thru 3)
63
64;º º
65;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
66
67EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
68;PARM1 DB 10 DUP(0)
69;PARM2 DB 0
70;PARM3 DB 0
71;MODE DB 0
72;FLAG DB 0
73ENDPARM EQU MODE
74EXTRN CRLF:BYTE ;AN000;carriage return linefeed
75EXTRN parm_lst:BYTE ;AN000;
76EXTRN illegal_device_ptr:WORD ;AN000;pointer to bad com device name string
77EXTRN MODELOAD:NEAR
78EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE
79EXTRN REDIRMSG:WORD ;CR,LF,"LPT"
80EXTRN REDPT:BYTE ;" "
81; ": rerouted to COM"
82EXTRN REDCOM:BYTE ;" "
83; ":",CR,LF,"$"
84;
85EXTRN NOTREMSG:WORD ;CR,LF,"LPT"
86EXTRN NOTREDPT:BYTE ;" "
87; ": not redirected.",CR,LF,"$"
88;EXTRN printer_reroute_mask:BYTE ;mask for testing ptsflag1 to see if a printer is rerouted
89EXTRN ptsflag1:BYTE ;see rescode.sal
90EXTRN ERR1:WORD ;"ILLEGAL DEVICE NAME"
91EXTRN resflag2:ABS ;see rescode
92EXTRN FIXUP:ABS ;IN MODEPTS, OFFSET USED BY COND. JMP
93EXTRN OFFPTS:ABS ;WHERE MODEPTS IS RELATIVE TO BEGINNING
94 ; OF MODETO
95EXTRN NEW_PTSFLAG:ABS ;WHERE PTSFLAG1 IS IN THE RESIDENT CODE
96 ; RELATIVE TO BEGINING OF MODETO
97;
98;***************************************************************
99VERIFY PROC NEAR
100 PUBLIC VERIFY
101;
102 SUB AX,AX ;CLEAR A REG
103 MOV ES,AX ;SET ES TO LOW MEMORY
104;DETERMINE WHAT PRINTER IS INVOLVED (LOOK AT n OF LPTn:)
105 MOV AL,BYTE PTR DS:LPTNO
106 MOV REDPT,AL ;PUT n OF LPTn IN REDIRECT MESSAGE
107 MOV NOTREDPT,AL ;AND INTO NOT REDIRECTED MSG
108; IF PRINTER DEVICE IS LPT1
109 CMP AL,"1"
110 JNE ELSEIF01A
111;
112 MOV AH,01H ;SET FLAG FOR LPT1
113 MOV SI,1 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
114; ELSEIF PRINTER DEVICE IS LPT2
115 JMP SHORT ENDIF01
116ELSEIF01A:
117 CMP AL,"2"
118 JNE ELSEIF01B
119;
120 MOV AH,02H ;SET FLAG FOR LPT2
121 MOV SI,2 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
122; ELSEIF PRINTER DEVICE IS LPT3
123 JMP SHORT ENDIF01
124ELSEIF01B:
125; CMP AL,"3"
126; JNE ELSE01
127;
128 MOV AH,04H ;SET FLAG FOR LPT3
129 MOV SI,03 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
130; ELSE ,SINCE NONE OF THE ABOVE, MUST BE INVALID
131; JMP SHORT ENDIF01
132;ELSE01:
133; DISPLAY ERR1 ;FUSS ABOUT INVALID n OF LPTn
134; MOV AH,0 ;SET FLAG TO INVALID
135; ENDIF ,END OF CHECK FOR DEVICE NO. IN LPTn
136ENDIF01:
137;AT EXIT: AH=MASK FOR NEW_PTSFLAG REPRESENTING WHICH LPTn, (OR 0 IF n INVALID)
138; AH HAS 0000 0XXX , WHERE BIT ON REPRESENTS:
139; || --LPT1
140; | ---LPT2
141; ----LPT3
142; SI=SET TO HEX 1,2, OR 3 TO BE USED AS OFFSET BEYOND NEW_PTSFLAG
143; TO ADDRESS THE BYTES PTSFLAG2, PTSFLAG3, AND PTSFLAG4
144; (SEE MODECODE FOR BYTE DEFINITIONS)
145 RET
146VERIFY ENDP
147;***************************************************************
148
149
150MODEECHO PROC NEAR
151 PUBLIC MODEECHO
152
153
154;INPUT:
155
156; SI=printer number value (one based)
157; AH=printer number mask: lpt1=1, lpt2=2, lpt3=4
158; AL=com number character
159; all values are known to be valid, but the existence of the com port has
160; not been checked.
161
162
163;REGISTER
164; USAGE : DL - hold the binary COM number
165; BX - general use
166
167
168
169
170MOV REDCOM,AL ;PUT m OF COMm TO REDIRECT MESSAGE
171PUSH ES ;SAVE SEG REG
172SET ES,0
173
174MOV BH,AH ;save the lpt number
175AND AL,ascii_to_int ;convert to 1 based integer
176MOV DL,AL ;FLAG FOR COM1, see 'ptsflag2' in 'rescode'
177;see if the COM# ACTUALLY EXISTS
178DEC AL ;AL= 0 based com number
179MUL TWO ;AL=disp from 40:0 of com port address word
180MOV AH,BH ;restore the lpt number
181XOR BX,BX ;prepare for byte move
182MOV BL,AL ;BX=disp from 40:0 of com port address word
183.IF <ES:RS232_BASE[BX] NE 0> THEN ;IF the com adapter does exist THEN
184
185 ;AT THIS POINT WE KNOW THAT LPTn AND COMm ARE BOTH LEGAL
186
187 ;THE FOLLOWING IS WHERE THE APPROPRIATE ADDRESS WORD FOR THE PRINTER
188 ;INVOLVED IS SET TO 0001H TO INDICATE TO BASIC THAT IT CAN OPEN THE
189 ;DEVICE BECAUSE IT HAS BEEN REDIRECTED. SEE TECH REF PAGE A-2
190 ;RS232 AND PRINTER BASE.
191
192 SAL SI,1 ;2*SI TO GET TO THE APPROPRIATE WORD
193 ; : : IF THE PRINTER ACTUALLY EXISTS
194 CMP ES:PRINTR-2+[SI],0000H ;IF THE WORD IS NONZERO THE
195 JNE ENDIF10 ;DEVICE EXISTS SO DON'T PUT A 1 THERE.
196 MOV ES:PRINTR-2+[SI],0001H ;PUT 0001H IN PRINTER WORD n
197 ; : : ENDIF PRINTER EXISTS
198 ENDIF10:
199 SAR SI,1 ;RESTORE SI TO n OF LPTn
200 ;
201 CALL MODELOAD ;WITHIN 'MODECODE' MODULE
202 ;
203 ;AH HAS A MASK SET BY THE 'VERIFY' PROC TO CORRESPOND TO THE LPTn
204 PUSH ES ;I'M ABOUT TO USE ES, SO I'LL SAVE IT
205 PUSH DI
206 LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE
207 MOV BX,NEW_PTSFLAG ; FROM MODETO INTO BX
208 ADD BX,DI ;ES:BX IS ADDRESS OF PTSFLAG1 IN RESIDENT
209 ; CODE (PROC MODEPTS)
210 OR AH,BYTE PTR ES:[BX] ;TURN ON THIS PRINTER'S BIT
211 MOV BYTE PTR ES:[BX],AH ;RECORD WHICH LPT IS TO BE
212 ; REDIRECTED
213 ; SI=LPTn, DL=COMm
214 DEC DL ;NOW DL=0 FOR COM1, DL=1 FOR COM2
215 ; SINCE SI=1, 2, OR 3, THIS PUTS A 0 OR 1 INTO
216 ; PTSFLAG2, PTSFLAG3, OR PTSFLAG4
217 MOV BYTE PTR ES:[BX][SI],DL ;RECORD FOR THIS LPTn
218 ; WHICH COMm THE LPTn IS REDIRECTED TO
219 POP DI
220 POP ES ;RESTORE SEG REG USED FOR CHECKING/SETTING ADDRESS
221 ; WORDS AND NEW_PTSFLAG
222 CALL ECHO ;CHANGE JMP IN MODEPTS COPY IN LOW MEMORY
223 ; SO PROPER LPTn GETS REDIRECTED
224 DISPLAY CRLF ;AN000;
225 DISPLAY REDIRMSG
226
227.ELSE ;valid com name, adapter not there
228 MOV DI,0 ;COM device name is always the first parm, the value of "LPTX[:]=value" ;AN000;
229 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP]
230 MOV CX,parm_list[DI].value1 ;AN000; ;AN000;
231 MOV illegal_device_ptr,CX ;AN000;set up message with bad com device name string
232 DISPLAY ERR1 ;"Illegal device name - COMX"
233.ENDIF
234
235
236 POP ES ;RESTORE SEG REG
237 RET
238MODEECHO ENDP
239;***************************************************************
240MODEECNO PROC NEAR
241 PUBLIC MODEECNO
242;INPUT: PARM1 AREA HAS:
243; LPTN:
244; OF WHICH VERIFICATION HAS BEEN MADE OF ONLY:
245; L???:
246 PUSH ES ;SAVE SEG REG
247 CALL VERIFY ;VERIFY THE n OF LPTn
248; SET AH ACCORDINGLY
249; ON EXIT FROM VERIFY, ES=0
250;
251; IF n OF LPTn IS OK
252 CMP AH,0
253 JE ENDIF06
254; : IF IT IS POSSIBLE THAT REDIRECTION IS IN EFFECT
255 CMP WORD PTR ES:530H,0000H ;HAS THE POINTER BEEN SET?
256 JE ENDIF05 ;SINCE THE POINTER HASN'T BEEN SET, THE
257 ; CODE HASN'T BEEN LOADED, THEREFORE
258 ; THE LPT CAN'T BE REDIRECTED, SO THERE
259 ; IS NO NEED TO UNREDIRECT IT
260; SINCE n OF LPTn IS OK,
261; AND SI HAS 1,2,OR 3 TO CORRESPOND TO n
262; AND AH HAS:
263; 0000 0001 - LPT1
264; 0000 0010 - LPT2
265; 0000 0100 - LPT3
266 XOR AH,0FFH ;NOW AL HAS
267; 1111 1110 - LPT1
268; 1111 1101 - LPT2
269; 1111 1011 - LPT3
270 PUSH ES ;SAVE ES=0, SET BY VERIFY
271 PUSH DI ;WILL BE USED AS OFFSET IN SEGMENT 0
272 ;ES:=O
273 LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE
274 PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT OFFSET
275 MOV BX,NEW_PTSFLAG ;FROM MODETO INTO BX
276 AND AH,BYTE PTR ES:[DI]+[BX] ;CLEAR THIS PRINTER'S BIT
277 MOV BYTE PTR ES:[DI]+[BX],AH ;RESTORE Revised FLAG BYTE
278 POP BX
279 POP DI
280 POP ES ;RESTORE ES=0
281;
282;LPTn IS BEING UNREDIRECTED. IF THE PRINTER EXISTS, THE ADDRESS WORD FOR
283;THAT DEVICE WILL NOT CONTAIN 0001H. IF IT DOES CONTAIN 0001H, IT MUST BE SET
284;TO 0000H SO BASIC WILL NOT ALLOW IT TO BE OPENED. SEE PROCEDURE MODEECHO
285;IN THIS MODULE, AND TECH REF PAGE A-2 (RS232 AND PRINTER BASE).
286;
287 SAL SI,1 ;SI=WORD n FOR LPTn
288; : : IF THE DUMMY PRINTER EXISTS
289 CMP ES:PRINTR-2+[SI],0001H ;DOES THE PRINTER EXIST?
290 JNE ENDIF07 ; IF SO, DON'T MESS WITH THE ADDRESS WORD
291 MOV ES:PRINTR-2+[SI],0000H ;IF NOT, ZERO THE ADDRESS WORD
292; : : ENDIF PRINTER EXISTS
293ENDIF07:
294 SAR SI,1 ;RESTORE SI TO n OF LPTn
295; SO PROPER LPTn GETS REDIRECTED
296;
297;IF THE PRINTER EXISTS THE ADDRESS WORD IS NOW WHAT IT STARTED OUT AS
298;AT POWER UP INITIALIZATION TIME. IF THE PRINTER DOESN'T EXIST, THE ADDRESS
299;WORD IS NOW EQUAL TO 0000H.
300;
301 CALL ECHO ;GO INFORM THE RESIDENT CODE
302;
303ENDIF05:
304 DISPLAY CRLF ;AN000;carriage return linefeed
305 DISPLAY NOTREMSG
306; : ENDIF IS REDIRECTION IN EFFECT
307; ENDIF IS n OF LPTn OK?
308ENDIF06:
309 POP ES ;RESTORE SEG REG
310;
311;A RETURN CODE IS PASSED BACK TO THE CALLER, MODEPRIN.
312;AH=0 MEANS INVALID LPTn
313;AH not= 0 MEANS LPTn IS OK
314;
315 RET ;RETURN TO CALLER
316MODEECNO ENDP
317;***************************************************************
318ECHO PROC NEAR
319;'MODEPTS' STARTS WITH THREE INSTRUCTIONS:
320; F6 C2 01 TEST DL,1
321; 75 05 JNZ CK
322; EA ---- ---- JMP PRINTER_IO
323; CK: (REDIRECT TO COMm)
324;'PTSFLAG' HAS A FLAG BYTE SHOWING WHICH LPTn GETS REDIRECTED.
325;THIS CODE HERE IS TO MODIFY THE FIRST TWO INSTRUCTIONS AT 'MODEPTS'
326;SO REDIRECTED LPTn GOES TO 'CK:' AND OTHER LPTn GOES TO PRINTER_IO.
327;
328 PUSH DI
329 ;ES:=0
330 LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE
331 PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT THE OFFSET
332 PUSH CX ;NEED A HOLDER FOR FIXUP
333 MOV BX,NEW_PTSFLAG ; FROM MODETO INTO BX
334 MOV AL,BYTE PTR ES:[DI]+[BX] ;FIND WHICH LPTn GET REDIRECTED
335 MOV BX,DI ;PUT OFFSET OF MODETO INTO BX
336 POP DI
337 ADD BX,OFFPTS ;ADD OFFSET OF MODEPTS FROM MODETO, NOW
338 ; ES:BX POINTS TO MODEPTS
339 MOV CX,FIXUP ;HOLD FIXUP IN WORD FORM SO LINKER CAN FILL IN
340 CLI ;IF AN INTERRUPT OCCURS HERE THE JUMP WOULD
341 ; BE INCORRECT
342 MOV BYTE PTR ES:[BX]+4,CL ;SET JUMP TARGET (CK) TO +3BH
343 POP CX ;RETURN FIXUP'S WORD FORM HOLDER
344 MOV AH,0 ;CLEAR HIGH BYTE
345 SHL AL,1 ;COUNT WAS 0,1,2,3,...7
346; COUNT IS NOW 0,2,4,6...14
347 MOV SI,AX ;GET INDEX OF BR TABLE ENTRY
348 JMP CASE[SI]
349;
350CASE EQU THIS WORD
351 DW P0
352 DW P1
353 DW P2
354 DW P3
355 DW P4
356 DW P5
357 DW P6
358 DW P7
359;
360P0:
361; SINCE NO PRINTER IS TO BE REDIRECTED
362 MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NO-OP
363; TO CAUSE 'FALL THRU' TO JMP PRINTER_IO INSTR
364 JMP SHORT ENDC
365P1:
366; REDIRECT LPT1 ONLY
367 MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ CK
368 JMP SHORT ENDC
369;
370P2:
371; REDIRECT LPT2 ONLY
372 MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ CK
373 JMP SHORT ENDC
374;
375P3:
376; REDIRECT LPT1 AND LPT2 ONLY
377 MOV WORD PTR ES:[BX]+2,7402H ; TEST 2 : JZ CK
378 JMP SHORT ENDC
379;
380P4:
381; REDIRECT LPT3 ONLY
382 MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 :JNZ CK
383 JMP SHORT ENDC
384;
385P5:
386; REDIRECT LPT1 AND LPT3 ONLY
387 MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ CK
388 JMP SHORT ENDC
389;
390P6:
391; REDIRECT LPT2 AND LPT3 ONLY
392 MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ CK
393 JMP SHORT ENDC
394;
395P7:
396; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
397 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP CK
398ENDC:
399 STI ;REENABLE INTERRUPTS
400 POP BX
401 RET
402ECHO ENDP
403
404
405;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
406
407;³ DISPLAY_PRINTER_REROUTE_STATUS
408;³ ------------------------------
409
410;³ Setup message for the reroute status of the specified printer.
411
412;³ INPUT: BL - mask for ptsflag1 (1, 2 or 4)
413;³ REDPT - contains ASCII form of n OF LPTn in redirmsg "LPTn rerouted to COMm"
414;³ NOTREDPT - contains ASCII form of n of LPTn in message "LPTn not rerouted"
415
416
417
418;³ RETURN: REDCOM - filled with ASCII form of m OF COMm in MESSAGE "LPTn rerouted to COMn"none
419
420
421
422;³ MESSAGES: REDIRMSG if the printer is rerouted
423;³ NOTREMSG if the printer is not rerouted
424
425
426;³ REGISTER
427;³ USAGE:
428
429
430
431;³ ASSUMPTIONS: input is valid
432
433
434;³ SIDE EFFECT: ES - lost
435;³ SI - lost
436;³ ;AN000;
437;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
438
439display_printer_reroute_status PROC NEAR
440
441XOR CX,CX ;AN665;
442MOV ES,CX ;set segment to zero ;AN665;
443
444.IF <<ES:WORD PTR resseg> NE 0000H> AND ;IF the resident code is loaded AND
445MOV ES,ES:WORD PTR resseg[2] ;AN665;
446;;XOR BX,BX
447;;MOV BL,printer_reroute_mask
448TEST BL,ES:PTSFLAG1 ;see if the printer is rerouted
449.IF NZ THEN ;the printer is rerouted
450 SHR BL,1 ;was 1, 2, or 4, now is 0, 1, or 2
451;;;INC BL ;now is 1, 2, or 3
452;;;ADD BL,resflag2 ;ES:BX=>the com byte for the desired printer
453 ADD BX,resflag2 ;ES:BX=>the com byte for the desired printer
454 .SELECT
455
456 .WHEN <<BYTE PTR ES:[BX]> EQ 0>
457 MOV redcom,"1" ;printer rerouted to COM1
458
459 .WHEN <<BYTE PTR ES:[BX]> EQ 1>
460 MOV redcom,"2" ;printer rerouted to COM2
461
462 .WHEN <<BYTE PTR ES:[BX]> EQ 2>
463 MOV redcom,"3" ;printer rerouted to COM3
464
465 .WHEN <<BYTE PTR ES:[BX]> EQ 3>
466 MOV redcom,"4" ;printer rerouted to COM4
467
468 .ENDSELECT
469 display redirmsg ;"LPTn rerouted to COMm"
470.ELSE
471 display notremsg ;"LPTn not rerouted"
472.ENDIF
473
474
475
476
477RET
478
479display_printer_reroute_status ENDP
480
481PRINTF_CODE ENDS
482 END
diff --git a/v4.0/src/CMD/MODE/MODELENG.ASM b/v4.0/src/CMD/MODE/MODELENG.ASM
new file mode 100644
index 0000000..dfae017
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODELENG.ASM
@@ -0,0 +1,290 @@
1PAGE ,132 ;
2TITLE MODELENG.ASM - VARIOUS SERVICE ROUTINES
3
4;This module contains procedures:
5;MODELENG - convert 3 digit or less ASCII string to binary number
6;GET_MACHINE_TYPE - determine the machine type based on model byte and sub model byte
7
8.XLIST
9 INCLUDE STRUC.INC
10.LIST
11;.SALL
12
13;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
14;º º
15
16; AX001 - P4031: Was allowing rate and delay settings on ATs that did not have
17; the functionality in the BIOS. Have to check specifically for
18; a date of 11/15/85 or later.
19
20; AX002 - P4543: Add VAIL and SNOWMASS to legal choices for 19200 baud
21
22;º º
23;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
24
25
26
27;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
28;º º
29
30PUBLIC get_machine_type
31PUBLIC MODELENG
32
33;º º
34;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
35
36;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
37;º º
38
39BREAK MACRO destination ;AN001;
40
41JMP ENDCASE_&destination ;AN001;
42
43ENDM ;AN001;
44
45;º º
46;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
47
48
49;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
50;º º
51
52AT_or_XT286_or_PS2_50_or_PS2_60 EQU 0FCH ;AN000;primary model byte for all 286 based machines
53BIOS_date EQU ES:[DI] ;used for accessing parts of the BIOS date ;AN001;
54INTCONV EQU 48 ;CONVERT ASCII TO NUMERIC
55model_byte_AH EQU AH
56return_system_configuration EQU 0C0H ;INT 15H subfunction
57system_descriptor_table EQU ES:[BX]
58system_services EQU 15H ;ROM BIOS call
59XT2 EQU 0FBH ;AN000;model byte for 2nd release of XT
60
61INCLUDE modequat.inc
62
63;º º
64;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
65
66
67;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
68;º º
69
70BIOS_date_struc STRUC ;in form mm/dd/yy ;AN001;
71 month DW ? ;AN001;
72 slash1 DB ? ;AN001;
73 day DW ? ;AN001;
74 slash2 DB ? ;AN001;
75 year DW ? ;AN001;
76BIOS_date_struc ENDS ;AN001;
77
78
79system_descriptor STRUC
80 length_of_descriptor DW bogus ;number of bytes in the descriptor table
81 primary_model_byte DB bogus
82 secondary_model_byte DB bogus
83system_descriptor ENDS
84
85;º º
86;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
87
88
89ROM SEGMENT AT 0F000H
90
91ORG 0FFF5H ;location of date ROM BIOS for the release was written ;AN001;
92date_location LABEL WORD ;AN001;
93
94ORG 0FFFEH
95model_byte LABEL BYTE
96
97ROM ENDS
98
99
100
101PRINTF_CODE SEGMENT PUBLIC
102 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
103
104
105
106;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
107;º º
108
109HUNDRED DB 100
110TEN DB 10
111
112
113;º º
114;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
115
116
117;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
118;º º
119
120EXTRN machine_type:BYTE ;see 'rescode.sal'
121EXTRN submodel_byte:BYTE ;see 'rescode.sal'
122
123;º º
124;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
125
126
127MODELENG PROC NEAR
128;
129;INPUT:BP HAS ADDR OF PARM FIELD IN DATA SPACE (DS:)
130;
131 MOV BL,0 ;INIT BL TO 0
132; IF THIS PARAMETER IS A THREE DIGIT NUMBER,
133 CMP BYTE PTR DS:[BP]+2,0 ;LOOK AT THIRD DIGIT
134 JE ENDIF01
135 CMP BYTE PTR DS:[BP]+2,20H ;see if third char is a blank
136 JE ENDIF01 ;IF there is a third digit THEN
137;
138 MOV AL,DS:[BP] ;GET FIRST DIGIT
139 SUB AL,INTCONV ;CONVERT TO INT
140 MUL HUNDRED ;HUNDREDTHS PLACE
141 ADD BL,AL ;ADD TO BL
142 INC BP ;BUMP TO NEXT DIGIT
143 ENDIF01: ;ENDIF THIS PARAMETER IS A THREE DIGIT NUMBER
144 MOV AL,DS:[BP] ;GET NEXT DIGIT
145 SUB AL,INTCONV ;CONVERT TO INT
146 JNC ENDIF02
147 MOV BL,0FFH ;encountered an error so put a bogus number in the sum
148 ENDIF02:
149 MUL TEN ;TENS PLACE
150 ADD BL,AL ;ADD TO BL
151 INC BP ;GO TO NEXT DIGIT
152 MOV AL,DS:[BP] ;GET NEXT DIGIT
153 SUB AL,INTCONV ;CONVERT TO INT
154 ADD BL,AL ;ADD TO BL
155 RET
156MODELENG ENDP
157
158
159ascii_to_int PROC NEAR ;input: AX=2 digit ascii number ;AN001;
160 ;output: BL has binary value ;AN001;
161 ;assume: no overflow or underflow ;AN001;
162
163 PUSH AX ;the MUL destroys AH ;AN001;
164 SUB AL,INTCONV ;CONVERT high order digit to binary ;AN001;
165 MUL TEN ;TENS PLACE ;AN001;
166 MOV BL,AL ;ADD TO BL ;AN001;
167 POP AX ;AN001;
168 MOV AL,AH ;AL=low order digit ;AN001;
169 SUB AL,INTCONV ;CONVERT TO binary ;AN001;
170 ADD BL,AL ;ADD TO BL ;AN001;
171 RET ;AN001;
172
173ascii_to_int ENDP ;AN001;
174
175
176;------------------------------------------------------------------------------
177
178;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
179
180;³ GET_MACHINE_TYPE
181;³ ----------------
182
183;³ Get the machine type and store for future reference.
184
185
186;³ INPUT: none
187
188
189;³ RETURN: A scalar value indicating the type of machine is stored in
190;³ 'machine_type'.
191
192
193;³ MESSAGES: none
194
195
196
197;³ REGISTER
198;³ USAGE AND
199;³ COMVENTIONS: AX - general usage
200;³ BX - used to address the system descriptor table
201
202
203
204
205
206;³ ASSUMPTIONS: DS has segment of MODE's data area
207
208
209;³ SIDE EFFECT: ES is changed.
210
211
212;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
213
214
215get_machine_type PROC NEAR
216
217
218
219PUSH ES
220PUSH BX ;will be used to point to 'system descriptor table'
221MOV AH,return_system_configuration
222INT 15H
223.IF NC ;IF the call was handled successfully
224 MOV AH,system_descriptor_table.secondary_model_byte
225 MOV submodel_byte,AH ;save submodel byte
226 MOV AH,system_descriptor_table.primary_model_byte
227.ELSE
228 MOV AX,ROM ;get addressability to the model byte
229 MOV ES,AX
230 MOV AH,ES:model_byte
231.ENDIF
232
233.IF <model_byte_AH EQ AT_or_XT286_or_PS2_50_or_PS2_60> THEN ;AN000;may have a submodel byte, check it
234
235 .IF <submodel_byte EQ PS2Model60> THEN ;AN000;
236 MOV AH,PS2Model60 ;AN000;
237 .ELSEIF <submodel_byte EQ VAIL> OR ;AN000;
238 .IF <submodel_byte EQ PS2Model50> THEN ;AN000;
239 MOV AH,PS2Model50 ;AN000;
240 .ELSEIF <submodel_byte EQ XT286> THEN ;AN000;
241 MOV AH,XT286 ;AN000;
242 .ELSEIF <submodel_byte EQ AT3> THEN ;AN000;
243 MOV DI,OFFSET date_location ;ES:DI=>BIOS date (BIOS_date EQU ES:[DI]) ;AN001;
244
245; CASE BIOS_date= ;AN001;
246
247; later than 1985: ;AN001;
248
249 MOV AX,BIOS_date.year ;AX=ASCII form of BIOS date year ;AN001;
250 CALL ascii_to_int ;BL=binary form of BIOS date year ;AN001;
251 .IF <BL GT 85> THEN ;IF AT built in 86 or later ;AN001;
252
253 MOV AH,AT4 ;AN001;
254 BREAK 0 ;AN001;
255
256 .ENDIF ;AN001;
257
258; 1985, on 11/15: ;BL already has year from above check ;AN001;
259
260 .IF <BL EQ 85> AND ;AN001;
261 .IF <BIOS_date.month EQ "11"> AND ;AN001;
262 .IF <BIOS_date.day EQ "51"> THEN ;"51" is the word form of "15" ;AN001;
263
264 MOV AH,AT4 ;AN001;
265 BREAK 0 ;AN001;
266
267 .ENDIF ;AN001;
268
269; otherwise: ;internal release of third version of AT ;AN001;
270
271 MOV AH,AT3 ;AN001;
272
273
274 ENDCASE_0: ;AN001;
275
276 .ELSEIF <submodel_byte EQ AT2> THEN ;AN000;
277 MOV AH,AT2 ;AN000;
278 .ENDIF ;AN000;IF none of the above AH has correct value for AT1 (FC)
279.ELSEIF <model_byte_AH EQ XT2> THEN ;AN000;
280 MOV AH,PCXT ;AN000;no difference from XT1
281.ENDIF ;AN000;
282
283MOV DS:machine_type,AH ;AH was set as result of getting the system configuration or during the IF.
284POP BX
285POP ES
286
287RET ;RETURN TO MODE MAIN ROUTINE
288get_machine_type ENDP
289PRINTF_CODE ENDS
290 END
diff --git a/v4.0/src/CMD/MODE/MODEMES.ASM b/v4.0/src/CMD/MODE/MODEMES.ASM
new file mode 100644
index 0000000..43e55a4
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEMES.ASM
@@ -0,0 +1,145 @@
1 PAGE ,132 ;
2 TITLE MODEMES - MESSAGES DISPLAYED ON CONSOLE BY MODE
3
4;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
5;º º
6
7; AC001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
8; implement the SYSGETMSG method of getting addressability to
9; the pieces. This means that the code does a SYSGETMSG call
10; which returns a pointer (DS:SI) to the message piece. The
11; address is then put in the sublist block for the message
12; being issued.
13
14;º º
15;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
16
17PRINTF_CODE SEGMENT PUBLIC
18 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
19;
20CR EQU 13 ;CARRIAGE RETURN
21LF EQU 10 ;LINE FEED
22BEEP EQU 7 ;AUDIBLE TONE
23EOM EQU 0 ;NULL TERMINATOR, REQUIRED BY PRINTF
24
25IF1
26 %OUT including MODESUBS.INC
27 %OUT including MODEDEFS.INC
28ENDIF
29INCLUDE MODESUBS.INC
30INCLUDE MODEDEFS.INC
31
32;
33PUBLIC first_sublist
34PUBLIC number_of_sublists
35
36 PUBLIC MOVED_MSG, ERR1, ERR2, PT80, PT80N, PT132, PT132N
37 PUBLIC PTLINES, RATEMSG, INITMSG, REDIRMSG, SHIFT_MSG, sublist_shift_msg
38 PUBLIC NOTREMSG, RETPARTO, sublist_retparto, CANT_SHIFT, sublist_cant_shift
39 PUBLIC NUMBERS, ;AC001;INF_OR_NO_ptr
40 PUBLIC Invalid_number_of_parameters, COM1_or_COM2, net_error
41 PUBLIC Invalid_parameter, not_supported, offending_parameter
42 PUBLIC offending_parameter_ptr
43 PUBLIC INITMSG, device,pbaud,pparity,pdata,pstop,pparm,pbaud,baud_19200
44 PUBLIC pstop_ptr
45 PUBLIC pparity_ptr
46 PUBLIC CPMSG1
47 PUBLIC CPMSG2,CPMSGLST2DEV
48 PUBLIC CPMSG3
49 PUBLIC CPMSG4
50 PUBLIC CPMSG5
51 PUBLIC CPMSG6,CPMSGLST6CP,CPMSGLST6DEV
52 PUBLIC CPMSG7,CPMSGLST7DEV
53;AC001; PUBLIC CPMSGLST8HD
54 PUBLIC sublist_cpmsg8
55 PUBLIC CPMSG8
56 PUBLIC CPMSG8_HW
57;AC001; PUBLIC CPMSG8_PR
58 PUBLIC CPMSG9,CPMSGLST9CP
59 PUBLIC CPMSG10
60 PUBLIC sublist_cpmsg10
61;AC001; PUBLIC CPMSGLST10FUN
62;AC001; PUBLIC CPMSG10_QUERY
63;AC001; PUBLIC CPMSG10_DES
64;AC001; PUBLIC CPMSG10_REFRESH
65;AC001; PUBLIC CPMSG10_SELECT
66;AC001; PUBLIC CPMSG10_GLOBAL
67 PUBLIC CPMSG12
68 PUBLIC CPMSG13
69 PUBLIC CPMSGLST13CP
70 PUBLIC CPMSGLST13TYP
71;AC001; PUBLIC CPMSG13_ACT
72;AC001; PUBLIC CPMSG13_SYS
73 PUBLIC CPMSG14
74 PUBLIC CPMSG15
75 PUBLIC CPMSG16
76 PUBLIC CPMSG17
77 PUBLIC sublist_CPMSG17
78;AC001; PUBLIC CPMSGLST17FUN
79;AC001; PUBLIC CPMSG17_QUERY
80;AC001; PUBLIC CPMSG17_PREP
81;AC001; PUBLIC CPMSG17_REFRESH
82;AC001; PUBLIC CPMSG17_ACT
83;AC001; PUBLIC CPMSG17_WRIT
84 PUBLIC CPMSG18
85 PUBLIC CPMSG19
86 PUBLIC CPMSG20
87 PUBLIC CPMSG21
88 PUBLIC dev_name_size ;used by invoke for msg srv
89 PUBLIC stat_dev_ptr ;used by invoke for msg srv
90 PUBLIC long_underline ;used by invoke for msg srv
91 PUBLIC five_char_underline ;used by invoke for msg srv
92 PUBLIC four_char_underline ;used by invoke for msg srv
93 PUBLIC row_ptr
94 PUBLIC status_for_device
95 PUBLIC notredpt
96;AC001; PUBLIC noretry
97;AC001; PUBLIC LEFT
98;AC001; PUBLIC RIGHT
99 PUBLIC row_type
100 PUBLIC lines_equal_msg ;used by analyze_and_invoke, "LINES=%1" definition
101 PUBLIC redcom
102;AC001; PUBLIC rightmost
103;AC001; PUBLIC leftmost
104;AC001; PUBLIC infinite
105 PUBLIC REDPT
106 PUBLIC PBAUD_PTR
107; PUBLIC BLINK_type
108 PUBLIC COLUMNS_ptr
109 PUBLIC COLUMNS_equal_msg
110 PUBLIC columns_type
111 PUBLIC delay_type
112 PUBLIC delay_ptr
113 PUBLIC rate_ptr
114 PUBLIC rate_type
115 PUBLIC function_not_supported
116 PUBLIC Required_font_not_loaded
117 PUBLIC ANSI_not_loaded
118 PUBLIC Baud_rate_required
119 PUBLIC RETRY_type_ptr
120 PUBLIC RETRY_equal
121 PUBLIC Baud_rate_required
122 PUBLIC not_supported_ptr
123 PUBLIC Illegal_device_ptr
124 PUBLIC syntax_error
125 PUBLIC syntax_error_ptr
126 PUBLIC rate_and_delay_together
127 PUBLIC CRLF
128 PUBLIC Invalid_switch
129 PUBLIC rightmost
130 PUBLIC leftmost
131 PUBLIC noretry
132 PUBLIC infinite
133 PUBLIC left
134 PUBLIC right
135 PUBLIC cpmsg8_pr
136 PUBLIC cpmsgxx_query
137 PUBLIC cpmsgxx_prep
138 PUBLIC cpmsgxx_select
139 PUBLIC cpmsgxx_refresh
140 PUBLIC cpmsg17_writ
141 PUBLIC cpmsg13_act
142 PUBLIC cpmsg13_sys
143
144PRINTF_CODE ENDS
145 END
diff --git a/v4.0/src/CMD/MODE/MODEPARS.ASM b/v4.0/src/CMD/MODE/MODEPARS.ASM
new file mode 100644
index 0000000..afe1446
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEPARS.ASM
@@ -0,0 +1,4625 @@
1
2 PAGE ,132 ;
3 TITLE MODE COMMAND - COMMAND PARSING
4.XLIST ;AN000;
5 INCLUDE STRUC.INC ;AN000;
6.LIST ;AN000;
7;.SALL ;AN000;
8
9
10;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
11;º º
12
13; AC001 - P3259: When "/STATUS" was only parameter was returning "Invalid
14; number of parameters". When "/STATUS" was first parameter
15; the device name was not being recognized.
16
17; AC002 - P3258, PS/2 only COM parameters were being allowed on non-PS/2
18; P3540: machines. Added checks for baud=19200, parity=mark or space,
19; data=5 or 6, stop=1.5 for both keyword and positional forms.
20
21; AC003 - P3451: Wasn't treating semicolons as a valid blank-like delimeter.
22
23
24; AC004 - P3456: /STAT wasn't included in all checks for valid forms of /STATUS.
25; "BW" and "CO" were being accepted as valid parms.
26
27; AC005 - P3796: PRN /STA returned "Invalid parameter -" when worked OK for
28; LPT1.
29
30; AC006 - P3932: Was issuing "Invalid parameter - ???" for switches that are
31; not valid, now issue "Invalid switch - ???".
32
33; AC007 - P3931: "CON SEL=850" acts like a status request, should return
34; "Invalid number of parameters" because user forgot "CP".
35
36; AX008 - P5183: Was denying 19200 baud on PS/2 model 30s and 25s and VAILs.
37
38;º º
39;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
40
41
42
43;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
44;º º
45
46
47BREAK MACRO X ;AN000;
48 JMP endcase_&X ;AN000;
49ENDM ;AN000;
50
51;-------------------------------------------------------------------------------
52
53DISPLAY MACRO MESSAGE ;AN000;
54 MOV DX,MESSAGE ;AN000;
55 CALL PRINTF ;AN000;
56ENDM
57
58;-------------------------------------------------------------------------------
59
60check_for_lpt_keyword MACRO ;AN000;
61
62MOV DL,number_of_lpt_keywords ;;AN000;Initialize
63MOV number_of_keywords,DL ;;AN000; for call to check_for_keyword
64MOV BP,OFFSET start_lpt_keyword_ptrs ;;AN000;start_of_keyword_ptrs=[BP]
65CALL check_for_keyword ;AN000;
66
67ENDM ;AN000;
68
69;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
70
71;³ DELETE_PARSER_VALUE_LIST_ENTRY
72;³ -------------------------------
73
74;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
75;³ become apparent and the parser control blocks need to be changed to correctly
76;³ parse the next parm. This MACRO is the interface to the approptiate routine which
77;³ modifies the list of strings or keywords in the VALUES block.
78
79
80
81
82
83;³ INPUT: item_type - scalar indicating that a string or keyword is to be deleted
84
85;³ item - A scalar immediate that indicates the string or keyword to
86;³ be "deleted"
87
88
89;³ RETURN: none
90
91
92;³ MESSAGES: none
93
94
95
96
97;³ REGISTER
98;³ USAGE: "item" is put into BX.
99
100
101
102;³ CONVENTIONS:
103
104
105
106;³ ASSUMPTIONS: All the input are valid.
107
108
109
110
111
112
113
114
115
116
117;³ SIDE EFFECT:
118
119
120;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
121
122delete_parser_value_list_entry MACRO item_type,item ;AN000;
123
124;MOV BX,item ;AN000;
125CALL item_type ;AN000;
126
127ENDM ;AN000;
128
129
130;-------------------------------------------------------------------------------
131
132;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
133
134;³ MODIFY_PARSER_CONTROL_BLOCK
135;³ ---------------------------
136
137;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
138;³ become apparent and the parser control blocks need to be changed to correctly
139;³ parse the next parm. This MACRO is the interface to the routines that modify
140;³ those control blocks.
141
142
143
144
145
146;³ INPUT: control_structure - A scalar immediate indicating the control block
147;³ to be modified, and the routine to call.
148
149;³ action - A scalar immediate that indicates the nature
150;³ of the modification to be made.
151
152;³ item - A scalar immediate that indicates the string, number,
153;³ keywords, switch, or match flags mask involved.
154
155;³ RETURN: none
156
157
158;³ MESSAGES: none
159
160
161
162
163;³ REGISTER
164;³ USAGE: The scalar value for the modifier will be put in a register
165;³ for passing to the routine that actually does the work.
166
167
168;³ CONVENTIONS:
169
170
171
172;³ ASSUMPTIONS: All the input are valid.
173
174
175;³ SIDE EFFECT:
176
177
178;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
179
180modify_parser_control_block MACRO control_structure,action,item ;AN000;
181
182PUSH BX ;AN000;
183
184MOV BX,action ;AN000;
185MOV AL,item ;AN000;
186CALL control_structure ;AN000;
187
188POP BX ;AN000;
189
190ENDM ;AN000;
191
192;-------------------------------------------------------------------------------
193
194
195;º º
196;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
197
198
199
200;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
201;º º
202
203
204INCLUDE modequat.inc
205
206
207addd EQU 0 ;;AN000;used for "seperator_list"
208binary_to_ASCII EQU 30H ;AN000;used to convert bytes from binary to ASCII
209blank EQU " ";;AN000;used for "seperator_list"
210both EQU 2 ;AN000;value of rate_and_delay_found when both have been found
211comma EQU "," ;AN000;used to tell the difference between a blank delimeter and missing parm, see LPTX,:
212current_parm EQU 0 ;;AN000;scalar for parser control block modifing routine "keywords"
213current_parm_DI EQU DI ;;AN000;index for parm_list array
214delete EQU 1 ;AN000;;used for "seperator_list"
215deleted EQU 0 ;AN000;;used to make keywords unmatchable and strings of length zero
216end_of_line_char_0D EQU 0DH ;AN000;put at end of the command line by the loader
217end_of_line_char_00 EQU 00H ;AN000;put at end of the complex parm by the parser
218i_CL EQU CL ;;AN000;loop index
219include_string_list EQU 3 ;;AN000;number of value definitions so strings are included
220include_number_list EQU 2 ;;AN000;See "nrng" in description of "values" block input for generalized parser
221keyword EQU 58H ;;AN000;indicator parms are in keyword form vs positional, value for parms_form
222first_com_keyword EQU SI ;;AN000;holder for "first_com_keyword_ptr"
223last_com_keyword EQU SI ;;AN000;holder for "last_com_keyword_ptr"
224first_LPT_keyword EQU SI ;;AN000;holder for "first_LPT_keyword_ptr"
225last_LPT_keyword EQU SI ;;AN000;holder for "last_LPT_keyword_ptr"
226first_CON_keyword EQU SI ;;AN000;holder for "first_con_keyword_ptr"
227last_CON_keyword EQU SI ;;AN000;holder for "last_con_keyword_ptr"
228max_parms EQU 16 ;;AN000;con cp prep=((1,2,3,4,5,6,7,8,9,10,11,12) filespec.cpi)
229min_codepage_value EQU 0 ;AN000;
230max_codepage_value EQU 999 ;;AN000;three digits
231max_number_of_codepages EQU 12 ;AN000;assure that user does not specify too many code page numbers
232min_number_of_codepages EQU 1 ;AN000;
233min_old_com_pos_parms EQU 0 ;AN000;could have nothing else meaning status request
234max_old_com_pos_parms EQU 5 ;AN000; ;baud, parity, data bits, stop bits, P
235max_switches EQU 1 ;AN000;;only switch is /status
236no_message EQU 0 ;AN000;indicate to message handler interface that no message to issue
237none_found EQU 0 ;AN000;;if keyword_switch_ptr is returned as zero then parser did not encounter a keyword or switch
238not_in_switch_list EQU 3 ;AC006;
239number_of_printer_status_qualifiers EQU 4 ;;AN000;codepage, prepare, select, RETRY
240parm_list EQU [BX] ;AN000;
241parms_BX EQU [BX] ;AN000;
242parser_return_code_AX EQU AX ;AN000;
243PS2 EQU 44H ;AC002;flag for "type_of_machine"
244result_BP EQU [BP] ;AN000;
245range_item_tag EQU 55H ;AN000;;marker for checks in memory, otherwise just a holder
246ranges_only EQU 1 ;;AN000;See "nrng" in description of "values" block input for generalized parser
247start_of_keyword_ptrs EQU [BP] ;AN000;;used for indexing the list of offsets in check_for_keyword
248tab EQU 09 ;AC006;
249unspecified EQU 0FFH ;AN000;item tag of parm not specified: skipped optional positional parm
250
251
252;possible values for "parm_type", the type of parm returned by parser
253
254complx EQU 4 ;AN000;
255number EQU 1 ;AN000;
256string EQU 3 ;AN000;
257
258;possible values for "return_code_AX"
259
260no_error EQU 0 ;AN000;;not the same as "noerror"
261operand_missing EQU 2 ;AN000;
262syntax_error_rc EQU 9 ;AN000;
263end_of_command_line EQU -1 ;AN000;
264end_of_complex EQU -1 ;AN000;found 0 that parser wrote over closing ")" of complex
265
266
267
268;possible values of "device_type"
269
270COMX EQU 09CH ;AN000;
271;CON EQU 0 ;AN000;
272LPTX EQU 09BH ;AN000;
273;LPT1 EQU 0 ;AN000;
274
275
276;possible values of "request_type"
277
278max_request_type EQU 09AH ;AN000;;must be same as following value
279all_con_status EQU 09AH ;AN000;
280codepage_prepare EQU 099H ;AN000;
281codepage_refresh EQU 098H ;AN000;
282codepage_select EQU 097H ;AN000;
283codepage_status EQU 096H ;AN000;
284codepage_prepared_status EQU 095H ;AN000;
285codepage_selected_status EQU 094H ;AN000;
286com_status EQU 093H ;AN000;
287initialize_com_port EQU 092H ;AN000;
288initialize_printer_port EQU 091H ;AN000;
289old_initialize_printer_port EQU 090H ;AN000;;found traditional syntax
290old_video_mode_set EQU 08FH ;AN000;;found traditional syntax
291printer_reroute EQU 08EH ;AN000;
292printer_status EQU 08DH ;AN000;
293set_con_features EQU 08CH ;AN000;
294status_for_everything EQU 08BH ;AN000;
295turn_off_reroute EQU 08AH ;AN000;
296last_request_type EQU 08AH ;AN000;;must be same as previous value
297
298
299;possible codepage requests, used by modecp
300
301select EQU 086H ;AN000;
302prepare EQU 085H ;AN000;
303refresh EQU 084H ;AN000;
304;status ;AN000;;see request_type possibilities
305
306
307
308;possible values of "looking_for"
309
310
311codepage EQU 6FH ;AN000;
312codepage_prms EQU 6EH ;AN000;
313com_keyword EQU 6DH ;AN000;
314com_keyword_or_baud EQU 6CH ;AN000;
315CON_keyword EQU 6BH ;AN000;
316con_kwrd_status_or_cp EQU 6AH ;AN000;
317databits_or_null EQU 69H ;AN000;
318device_name_or_eol EQU 68H ;AN000;
319eol EQU 67H ;;AN000;end of line
320first_parm EQU 66H ;AN000;
321li_or_null EQU 65H ;AN000;
322P EQU 64H ;AN000;
323parity_or_null EQU 63H ;AN000;
324prn_kw_status_cp_cl_null EQU 62H ;AN000;
325sd_or_dl EQU 61H ;AN000;
326sd_or_dl_or_eol EQU 60H ;AN000;
327status_or_eol EQU 5FH ;AN000;
328stopbits_or_null EQU 5EH ;AN000;
329T_or_EOL EQU 5DH ;AN000;
330
331max_looking_for EQU 6FH ;AN000;;used for calculating the displacement into jump table for "CASE looking_for="
332
333
334
335
336;item tags for COM port names strings
337
338COM1_item_tag EQU 1 ;;AN000;these values must be 1 through 4 because
339COM2_item_tag EQU 2 ;;AN000;parsing for COM special cases depends
340COM3_item_tag EQU 3 ;;AN000;on it.
341COM4_item_tag EQU 4
342
343;item tags for paritys
344
345first_parity_item_tag EQU 86H ;AN000;
346mark_item_tag EQU 86H ;AN000;
347space_item_tag EQU 85H ;AN000;
348none_item_tag EQU 84H ;AN000;
349odd_item_tag EQU 83H ;AN000;
350even_item_tag EQU 82H ;AN000;
351last_parity_item_tag EQU 82H ;AN000;
352
353
354;item tags for printer port names
355
356PRN_item_tag EQU 5 ;AN000;
357LPT1_item_tag EQU 6 ;AN000;
358LPT2_item_tag EQU 7 ;AN000;
359LPT3_item_tag EQU 8 ;AN000;
360
361;item tags for screen modes
362
363first_screen_mode_item_tag EQU 9 ;AN000;
364BW40_item_tag EQU 0BH ;AN000;
365BW80_item_tag EQU 0CH ;AN000;
366CO40_item_tag EQU 0DH ;AN000;
367CO80_item_tag EQU 0EH ;AN000;
368eighty_item_tag EQU 0FH ;AN000;
369fourty_item_tag EQU 10H ;AN000;
370MONO_item_tag EQU 11H ;AN000;
371last_screen_mode_item_tag EQU 11H ;AN000;
372
373con_item_tag EQU 12H ;AN000;
374
375
376;item tags for LPT special cases
377
378first_lpt_special_case_item_tag EQU 13H ;;AN000;following value must be the same as this one
379LPT1132_item_tag EQU 13H ;AN000;
380LPT2132_item_tag EQU 14H ;AN000;
381LPT3132_item_tag EQU 15H ;AN000;
382LPT180_item_tag EQU 16H ;AN000;
383LPT280_item_tag EQU 17H ;AN000;
384LPT380_item_tag EQU 18H ;AN000;
385last_lpt_special_case_item_tag EQU 18H ;;AN000;this value must be the same as the previous
386
387P_item_tag EQU 19H ;AN000;
388RETRY_item_tag EQU 1AH ;AN000;
389B_item_tag EQU 1BH ;AN000;
390E_item_tag EQU 1CH ;AN000;
391R_item_tag EQU 1DH ;AN000;
392
393codepage_item_tag EQU 1EH ;;AN000;for the range defining codepage possibilities
394PREPARE_item_tag EQU 1FH ;AN000;
395SELECT_item_tag EQU 20H ;AN000;
396REFRESH_item_tag EQU 21H ;AN000;
397
398COLUMNS_item_tag EQU 23H ;AN000;
399DELAY_item_tag EQU 24H ;AN000;
400LINES_item_tag EQU 25H ;AN000;
401RATE_item_tag EQU 26H ;AN000;
402
403COM_item_tag EQU 27H ;AN000;
404
405ON_item_tag EQU 28H ;AN000;
406OFF_item_tag EQU 29H ;AN000;
407
408L_item_tag EQU 2AH ;AN000;
409T_item_tag EQU 2BH ;AN000;
410
411;item tags for numbers not in other lists
412
413zero_item_tag EQU 2CH ;AN000;
414first_stopbit_item_tag EQU 2DH ;AN000;
415one_item_tag EQU 2EH ;AN000;
416one_point_five_item_tag EQU 2FH ;AN000;
417two_item_tag EQU 30H ;AN000;
418last_stopbit_item_tag EQU 31H ;AN000;
419three_item_tag EQU 32H ;AN000;
420four_item_tag EQU 33H ;AN000;
421first_databit_item_tag EQU 34H ;AN000;
422five_item_tag EQU 35H ;AN000; ;data bit, typamatic rate
423six_item_tag EQU 36H ;AN000;
424seven_item_tag EQU 37H ;AN000;
425eight_item_tag EQU 38H ;AN000;
426last_databit_item_tag EQU 39H ;AN000;
427nine_item_tag EQU 3AH ;AN000;
428ten_item_tag EQU 3BH ;AN000;
429eleven_item_tag EQU 3CH ;AN000;;first two chars of 110
430twelve_item_tag EQU 3DH ;AN000;
431thirteen_item_tag EQU 3EH ;AN000;
432fourteen_item_tag EQU 3FH ;AN000;
433fifteen_item_tag EQU 40H ;AN000;;abbreviated form of 150, 15 is also a RATE= candidate
434sixteen_item_tag EQU 41H ;AN000;
435seventeen_item_tag EQU 42H ;AN000;
436eighteen_item_tag EQU 43H ;AN000;
437nineteen_item_tag EQU 44H ;AN000;;used for baud rates and RATE=
438twenty_item_tag EQU 45H ;AN000;
439twentyone_item_tag EQU 46H ;AN000;
440twentytwo_item_tag EQU 47H ;AN000;
441twentythree_item_tag EQU 48H ;AN000;
442twentyfour_item_tag EQU 49H ;AN000; ;24 is also a typamatic rate
443twentyfive_item_tag EQU 4AH ;AN000;
444twentysix_item_tag EQU 4BH ;AN000;
445twentyseven_item_tag EQU 4CH ;AN000;
446twentyeight_item_tag EQU 4DH ;AN000;
447twentynine_item_tag EQU 4EH ;AN000;
448thirty_item_tag EQU 4FH ;AN000;
449thirtyone_item_tag EQU 50H ;AN000;
450thirtytwo_item_tag EQU 51H ;AN000;
451fourtythree_item_tag EQU 52H ;AN000;
452fifty_item_tag EQU 53H ;AN000;
453sixty_item_tag EQU 54H ;AN000;
454oneten_item_tag EQU 55H ;AN000;
455onethirtytwo_item_tag EQU 56H ;AN000;
456onefifty_item_tag EQU 57H ;AN000;
457threehundred_item_tag EQU 58H ;AN000;
458sixhundred_item_tag EQU 59H ;AN000;
459twelvehundred_item_tag EQU 5AH ;AN000;
460twentyfourhundred_item_tag EQU 5BH ;AN000;
461fourtyeighthundred_item_tag EQU 5CH ;AN000;
462ninetysixhundred_item_tag EQU 5DH ;AN000;
463nineteentwohundred_item_tag EQU 5EH ;AN000;
464
465
466;mask values for function_flags
467
468capitalize EQU 0001H ;AN000;capitalize by file table
469
470
471;mask values for match flags
472
473numeric EQU 8000H ;AN000;
474simple_string EQU 2000H ;AN000;
475complex EQU 0400H ;AN000;
476filespec EQU 0200H ;AN000;
477ignore_colon EQU 0010H ;AN000;
478optional EQU 0001H ;AN000;
479clear_all EQU 0000H ;AN000;
480
481;delete_simple_string EQU 0CFFFH ;AN000;;NOT (simple_string), to turn off simple_string bit in the match_flags
482
483
484
485
486;º º
487;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
488
489
490
491;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
492;º º
493
494
495des_strt_packet STRUC
496 des_strt_pkfl DW 0000 ;assume a filename specified
497 des_strt_pklen DW 02 ;start with size of 'des_strt_pknum'
498 des_strt_pknum DW 0 ;number of cp numbers in the packet
499 des_strt_pkcp1 DW -1 ;code page number for 1st slot
500 des_strt_pkcp2 DW -1
501 des_strt_pkcp3 DW -1
502 des_strt_pkcp4 DW -1
503 des_strt_pkcp5 DW -1
504 des_strt_pkcp6 DW -1
505 des_strt_pkcp7 DW -1
506 des_strt_pkcp8 DW -1
507 des_strt_pkcp9 DW -1
508 des_strt_pkcpA DW -1
509 des_strt_pkcpB DW -1
510 des_strt_pkcpC DW -1 ;code page number for 12th slot
511des_strt_packet ENDS
512
513
514INCLUDE COMMON.STC ;contains the following strucs, needed in invoke also
515
516
517;parm_list_entry STRUC
518;
519;parm_type DB bogus
520;item_tag DB 0FFH
521;value1 DW bogus
522;value2 DW bogus
523;keyword_switch_ptr DW 0
524;
525;parm_list_entry ENDS
526
527
528;codepage_parms STRUC
529; cp_device DW ?
530; des_pack_ptr DW ?
531; font_filespec DW ?
532; request_typ DW ?
533;codepage_parms ENDS
534
535
536parms_def STRUC ;AN000;
537
538parmsx_ptr DW bogus ;AN000;changed as the possibilities for parms following are determined
539 DB 1 ;AN000;have extra delimiter list
540seperators_len DB 1 ;AN000;length of extra delimiter list
541seperators DB ";" ;AC003;EXTRA DELIMITER LIST
542 DB 8 DUP (" ") ;AC003; extra blanks for adding more delimeters (. " \ [ ] : + =)
543
544parms_def ENDS ;AN000;
545
546
547
548result_def STRUC ;AN000;
549
550ret_type DB 0 ;AN000;
551ret_tag DB 0FFH ;AN000;
552synonym DW 0 ;AN000;
553ret_value1 DW bogus ;AN000;
554ret_value2 DW bogus ;AN000;
555
556result_def ENDS ;AN000;
557
558
559
560
561
562
563
564;º º
565;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
566
567
568
569 PAGE ;AN000;
570PRINTF_CODE SEGMENT PUBLIC ;AN000;
571 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000;
572
573
574;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
575;º º
576
577PUBLIC all_con_status ;AN000;
578PUBLIC baud_equal ;AN000;
579PUBLIC B_item_tag ;needed by modecom ;AN000;
580PUBLIC B_str ;AN000;
581PUBLIC BW40_item_tag ;AN000;
582PUBLIC BW80_item_tag ;AN000;
583PUBLIC codepage_index_holder ;make available to invoke ;AN000;
584PUBLIC codepage_item_tag ;AN000;
585PUBLIC codepage_prepare ;AN000;
586PUBLIC codepage_prepared_status ;AN000;
587PUBLIC codepage_refresh ;AN000;
588PUBLIC codepage_selected_status ;AN000;
589PUBLIC COM_status ;AN000;
590PUBLIC COMX ;make available to rescode ;AN000;
591PUBLIC CON_str ;AN000;make available to invoke for messages
592PUBLIC CO40_item_tag ;AN000;
593PUBLIC CO80_item_tag ;AN000;
594PUBLIC codepage_item_tag ;AN000;
595PUBLIC codepage_select ;AN000;
596PUBLIC codepage_status ;AN000;
597PUBLIC columns_equal ;AN000;
598PUBLIC COLS_equal ;AN000;
599PUBLIC columns_item_tag ;AN000;
600PUBLIC COM1_str ;AN000;
601PUBLIC COM2_str ;AN000;
602PUBLIC COM3_str ;AN000;
603PUBLIC COM4_str ;AN000;
604PUBLIC data_equal ;AN000;used by invoke
605PUBLIC delay_equal ;AN000;
606PUBLIC del_equal ;AN000;
607PUBLIC des_start_packet ;AN000;
608PUBLIC device_name ;AN000;
609PUBLIC device_type ;AN000;make available to rescode
610PUBLIC E_item_tag ;needed by modecom ;AN000;
611PUBLIC E_str ;AN000;
612PUBLIC eight_item_tag ;AN000;used by setcom
613PUBLIC eighty_item_tag ;AN000;
614PUBLIC eighty_str ;AN000;
615PUBLIC even_item_tag ;AN000;used by setcom
616PUBLIC five_item_tag ;AN000;used in setcom
617PUBLIC fourtyeighthundred_item_tag ;used by setcom;AN000;
618PUBLIC fourtyeighthundred_str ;used by setcom;AN000;
619PUBLIC fourty_item_tag ;AN000;
620PUBLIC fourty_str ;AN000;
621PUBLIC initialize_com_port ;AN000;
622PUBLIC initialize_printer_port ;AN000;
623PUBLIC keyword ;AN000;make available to invoke.asm
624PUBLIC len_COMX_str ;AN000;make available to invoke.asm
625PUBLIC len_CON_str ;AN000;make available to invoke.asm for message service
626PUBLIC len_LPTX_str ;AN000;make available to invoke.asm
627PUBLIC lines_equal ;AN000;
628PUBLIC lines_item_tag ;AN000;
629PUBLIC L_item_tag ;AN000;
630PUBLIC LPTX ;AN000;make available to rescode
631PUBLIC LPT1_str ;AN000;
632PUBLIC LPT2_str ;AN000;
633PUBLIC LPT3_str ;AN000;
634PUBLIC mark_item_tag ;AN000;used in setcom
635PUBLIC max_request_type ;AN000;
636PUBLIC mono_item_tag ;AN000;
637PUBLIC new_com_initialize ;AC002;make available for modecom
638PUBLIC nineteentwohundred_item_tag ;AN000;used by modecom
639PUBLIC nineteentwohundred_str ;AN000;used by modecom
640PUBLIC ninetysixhundred_item_tag ;AN000;
641PUBLIC ninetysixhundred_str ;AN000;
642PUBLIC none_item_tag ;AN000;used in invoke
643PUBLIC NONE_str ;AN000;
644PUBLIC OFF_item_tag ;AN000;
645PUBLIC OFF_str ;AN000;
646PUBLIC odd_item_tag ;AN000; ;used by setcom
647PUBLIC old_initialize_printer_port ;AN000;
648PUBLIC old_video_mode_set ;AN000;
649PUBLIC one_item_tag ;used in setcom ;AN000;
650PUBLIC one_point_five_item_tag ;used in setcom ;AN000;
651PUBLIC one_point_five_str ;used in setcom ;AN000;
652PUBLIC onefifty_item_tag ;used in setcom ;AN000;
653PUBLIC onefifty_str ;used in setcom ;AN000;
654PUBLIC oneten_item_tag ;used in modecom ;AN000;
655PUBLIC oneten_str ;used in modecom ;AN000;
656PUBLIC onethirtytwo_item_tag ;AN000;
657PUBLIC ON_item_tag ;AN000;
658PUBLIC ON_str ;AN000;
659PUBLIC P_item_tag ;make available to modecom ;AN000;
660PUBLIC parity_equal ;used in analyze_and_invoke ;AN000;
661PUBLIC parm_lst ;used in modecom.asm ;AN000;
662PUBLIC parms_form ;make available to invoke ;AN000;
663PUBLIC parse_parameters ;AN000;
664PUBLIC prepare ;AN000;
665PUBLIC prepare_item_tag ;AN000;
666PUBLIC printer_reroute ;AN000;
667PUBLIC printer_status ;AN000;
668PUBLIC R_item_tag ;AN000;
669PUBLIC R_str ;AN000;
670PUBLIC rate_equal ;AN000;
671PUBLIC refresh ;AN000;
672PUBLIC request_type ;AN000;
673PUBLIC reroute_requested ;make available to rescode;AN000;
674PUBLIC retry_equal_str ;make available to invoke;AN000;
675PUBLIC retry_item_tag ;AN000;
676PUBLIC retry_requested ;make available to rescode ;AN000;
677PUBLIC select ;AN000;
678PUBLIC select_item_tag ;AN000;
679PUBLIC set_con_features ;AN000;
680PUBLIC seven_item_tag ;used by setcom ;AN000;
681PUBLIC sixhundred_item_tag ;used by setcom ;AN000;
682PUBLIC sixhundred_str ;used by setcom ;AN000;
683PUBLIC six_item_tag ;used by setcom ;AN000;
684PUBLIC space_item_tag ;used by setcom ;AN000;
685PUBLIC status_for_everything ;AN000;
686PUBLIC stop_equal ;AN000;
687PUBLIC T_item_tag ;AN000;
688PUBLIC threehundred_item_tag ;used by setcom ;AN000;
689PUBLIC threehundred_str ;used by setcom ;AN000;
690PUBLIC turn_off_reroute ;AN000;
691PUBLIC twelvehundred_item_tag ;used by setcom ;AN000;
692PUBLIC twelvehundred_str ;used by setcom ;AN000;
693PUBLIC twentyfourhundred_item_tag ;used by setcom ;AN000;
694PUBLIC twentyfourhundred_str ;used by setcom ;AN000;
695PUBLIC two_item_tag ;used by setcom ;AN000;
696
697;º º
698;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
699
700
701;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
702;º º
703
704;EXTRN command_line:BYTE ;AN000;PARM AREA
705;EXTRN command_line_length:BYTE ;AN000;NUMBER OF BYTES OF PARM AREA
706EXTRN com1_or_com2:BYTE ;AN000;see modedefs.inc
707EXTRN cp_cb:WORD ;AN000;codepage_parms <> ;codepage subroutine parameter block
708EXTRN CRLF:WORD ;displayed before "Invalid parameter - " for consistent spacing ;AN000;
709EXTRN DES_STRT_FL_CART:ABS ;AN000;;CARTRIDGE prepare
710EXTRN device:BYTE ;AN000;holder for com number, used in setcom
711EXTRN first_char_in_command_line:BYTE ;AN000;location of the command line parameters
712EXTRN function_not_supported:BYTE ;AN000;see modedefs.inc
713EXTRN get_machine_type:NEAR ;AN000;get model and sub-model bytes
714EXTRN invalid_parameter:BYTE ;AN000;CR,LF,"Invalid parameter - '????'"CR,LF,BEEP
715EXTRN LPTNO:BYTE ;AN000;holder of ASCII version of printer number, see first_parm_case and modeprin
716EXTRN machine_type:BYTE ;AN000;see get_machine_type
717EXTRN modecp:NEAR ;AN000;
718EXTRN move_destination:ABS ;AN000;location of res code after it has been moved
719EXTRN noerror:BYTE ;AN000;
720EXTRN not_supported_ptr:WORD ;AN000;holder of address of string that describes what is not supported, see modedefs.inc
721EXTRN offending_parameter:BYTE ;AC006;the holder of the text string that was wrong.
722EXTRN offending_parameter_ptr:WORD ;AN000;;see MODEMES
723EXTRN printer_no:BYTE ;AN000;;see modeprin
724EXTRN PRINTF:NEAR ;AN000;
725EXTRN rate_and_delay_together:BYTE ;AN000;RATE and DELAY must be specified together
726EXTRN syntax_error_ptr:WORD ;AN000;pointer to parameter with bad format
727
728;possible values of "message"
729
730EXTRN baud_rate_required:BYTE ;AN000;
731EXTRN invalid_number_of_parameters:WORD ;AN000;
732EXTRN Invalid_switch:BYTE
733EXTRN syntax_error:BYTE
734
735
736;º º
737;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
738
739
740;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
741;º º
742
743code_page_numbers_encountered DB 0
744current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet'
745EOL_found DB false
746looking_for DB bogus ;semantic analysis state, can be one of:
747match_not_found DB true ;indication that a token was found in the list of keywords
748
749
750
751des_start_packet des_strt_packet <>
752
753;---------------------------- NEW DATA ---------------------------------
754
755
756
757baud_specified DB false ;AN000;
758codepage_index_holder DW bogus ;AN000;;holder for index in parm_list of the selected code page
759colon DB ":" ;AN000;
760command_line DW 0081H ;AN000; ;holder for pointer to unparsed part of the command line, see "parse_parm"
761device_name DW 0 ;AN000;;OFFSET device name string, see "analyze_and_invoke" in invoke.asm
762device_type DB bogus ;AN000;
763end_of_seperator_list DW bogus ;AN000;;loop terminator,word because compared with DI
764match_found DB false ;AN000; ;boolean loop terminator
765message DW no_message ;AN000;
766new_com_initialize DB false ;AC002;flag for modecom to indicate PS/2 only parm specified
767number_of_keywords DB 0 ;AN000;;input for check_for_keyword
768parms_form DB 0 ;AN000;;holder for indicator of whether the parms were in keyword or positonal form
769ordinal DW 0 ;AN000;
770rate_and_delay_found DB false ;AN000;need to have both, this byte keeps track of what has been found
771request_type DB bogus ;AN000;
772reroute_requested DB false ;AN000;
773retry_requested DB false ;AN000;
774search_stop DB 0 ;AN000;;loop stopper for search_item_tags
775status_found DB false ;AN000;;boolean indicator that /status has been found
776status_request DB bogus ;AN000;;furthur clarification. possible values are: bogus, true, and false
777terminating_delimeter DB bogus ;AN000;;save return from sysparse
778type_of_machine DB bogus ;AC000;"get_machine_type" determines "machine_type", this byte is general flag for PS/2s
779
780
781; PARSER interface data
782;---------------------------------------
783
784start_com_keyword_ptrs LABEL WORD ;AN000;
785first_com_keyword_ptr DW OFFSET baud_equal ;AN000;
786 DW OFFSET parity_equal ;AN000;
787 DW OFFSET data_equal ;AN000;
788 DW OFFSET stop_equal ;AN000;
789last_com_keyword_ptr DW OFFSET retry_equal_str ;AN000;
790number_of_com_keywords EQU ($ - start_com_keyword_ptrs)/2 ;AN000;
791
792
793start_LPT_keyword_ptrs LABEL WORD ;AN000;
794first_LPT_keyword_ptr DW OFFSET retry_equal_str ;AN000;
795 DW OFFSET COLUMNS_equal ;AN000;
796 DW OFFSET COLS_equal ;AN000;
797last_LPT_keyword_ptr DW OFFSET LINES_equal ;AN000;
798number_of_LPT_keywords EQU ($ - start_LPT_keyword_ptrs)/2 ;AN000;
799
800
801start_CON_keyword_ptrs LABEL WORD ;AN000;
802first_CON_keyword_ptr DW OFFSET COLUMNS_equal ;AN000;
803 DW OFFSET COLS_equal ;AN000;
804 DW OFFSET LINES_equal ;AN000;
805 DW OFFSET RATE_equal ;AN000;
806 DW OFFSET DELAY_equal ;AN000;
807last_CON_keyword_ptr DW OFFSET DEL_equal ;AN000;
808number_of_CON_keywords EQU ($ - start_CON_keyword_ptrs)/2 ;AN000;
809
810
811
812parms parms_def<> ;AN000;set up for first_parm_case, except parmsx_ptr needs to be set
813
814
815parmsx LABEL BYTE ;AN000;
816
817 DB 0 ;AN000;how many non-switch/non-keyword parms are required
818 DB 3 ;AN000;max pos parms for this parmsx, use others for further parms
819 DW first_pos_control ;AN000;control block for every possible (non-mutatant) first positional parm
820 DW second_pos_control ;AN000;
821 DW third_pos_control ;AN000;
822
823 DB max_switches ;AN000;
824 DW max_switches DUP (Sw_control) ;AN000;
825
826 DB max_keywords ;AN000;number of unique keywords for all options
827
828start_keyword_list LABEL BYTE ;AN000;
829
830 DW LPT1_colon_equal_control ;AN000;
831 DW LPT1_equal_control ;AN000;
832 DW LPT2_colon_equal_control ;AN000;
833 DW LPT2_equal_control ;AN000;
834 DW LPT3_colon_equal_control ;AN000;
835 DW LPT3_equal_control ;AN000;
836
837 DW RETRY_equal_control ;AN000;for parallel and serial printers
838
839 DW COLUMNS_equal_control ;AN000;
840 DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER
841 DW PREPARE_equal_control ;AN000;
842 DW SELECT_equal_control ;AN000;
843
844max_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry
845
846
847
848con_parmsx LABEL BYTE ;AN000;for keyword form of con support
849
850 DB 0 ;AN000;no positional parms required after CON
851 DB 2 ;AN000;CP and REFRESH allowed
852 DW first_CON_pos_control ;AN000;control block for CP
853 DW second_CON_pos_control ;AN000;control block for REFRESH
854
855 DB max_switches ;AN000;
856 DW max_switches DUP (Sw_control) ;AN000;
857
858 DB number_of_CON_keywords ;AN000;number of unique keywords for CON
859
860start_con_keyword_list LABEL BYTE ;AN000;
861
862 DW COLUMNS_equal_control ;AN000;
863 DW LINES_equal_control ;AN000;
864 DW PREPARE_equal_control ;AN000;
865 DW SELECT_equal_control ;AN000;
866
867 DW DELAY_equal_control ;AN000;
868 DW RATE_equal_control ;AN000;
869
870number_of_con_keywords EQU ($ - start_con_keyword_list) / 2 ;AN000;two bytes per entry
871
872
873old_con_parmsx LABEL BYTE ;AN000;
874
875 DB 0 ;AN000;no positional parms required after 80, co40 etc.
876 DB 2 ;AN000;shift direction and "T" allowed
877 DW first_old_CON_pos_control ;AN000;shift direction and display lines
878 DW second_old_CON_pos_control ;AN000;control block for T
879
880 DB 0 ;AN000;no switches
881
882 DB 0 ;AN000;no keywords for old CON
883
884
885lpt_parmsx LABEL BYTE ;AN664;for the second thru 4th parms, [[chars/line][[,lines/inch][[,P]]]]
886
887 DB 0 ;AN000;how many non-switch/non-keyword parms are required
888 DB 3 ;AN000;max pos parms for this parmsx, use others for further parms
889 DW first_lpt_pos_control ;AN000;control block for every possible chars per line value
890 DW second_lpt_pos_control ;AN000;
891 DW third_lpt_pos_control ;AN000;
892
893 DB max_switches ;AN000;
894 DW max_switches DUP (Sw_control) ;AN000;
895
896 DB max_lpt_keywords ;AN000;number of unique keywords for all options
897
898start_lpt_keyword_list LABEL BYTE ;AN000;
899
900 DW RETRY_equal_control ;AN000;for parallel printers
901
902 DW COLUMNS_equal_control ;AN000;
903 DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER
904 DW PREPARE_equal_control ;AN000;
905 DW SELECT_equal_control ;AN000;
906
907max_lpt_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry
908
909
910prepare_equal_parmsx LABEL BYTE ;AN000;
911
912 prepare_min_parms LABEL BYTE ;AN000;changed by hardware cp code to allow no filename
913 DB min_number_of_codepages ;AN000;
914 DB max_number_of_codepages ;AN000;
915 DW max_number_of_codepages DUP (prepare_equal_control) ;AN000;
916 DB max_switches ;AN000;
917 DW max_switches DUP (Sw_control) ;AN000;
918 DB 0 ;AN000;no more keywords allowed
919
920com_parmsx LABEL BYTE ;AN000;
921
922 DB min_old_com_pos_parms ;AN000;nothing or /STATUS
923 DB max_old_com_pos_parms ;AN000;baud, parity, data, stop, p
924 DW baud_control ;AN000;
925 DW old_com_parity_control ;AN000;
926 DW old_com_databits_control ;AN000;control block for old com data bits
927 DW old_com_stopbits_control ;AN000;
928retry_control_ptr DW old_com_retry_control ;AN000;
929
930 DB max_switches ;AN000;
931 DW max_switches DUP (Sw_control) ;AN000;
932
933 DB number_of_com_keywords ;AN000;
934
935start_com_keyword_list LABEL BYTE ;AN000;
936
937 DW BAUD_control ;AN000;
938 DW PARITY_equal_control ;AN000;
939 DW DATA_equal_control ;AN000;
940 DW STOP_equal_control ;AN000;
941 DW RETRY_equal_control ;AN000;same as for printers
942
943number_of_com_keywords EQU ($ - start_com_keyword_list) / 2 ;AN000;two bytes per entry
944
945
946com_keywords_parmsx LABEL BYTE ;AC663;
947
948 DB 0 ;AC663;no positional parms valid
949 DB 0 ;AC663;
950
951 DB 0 ;AC663;
952
953 DB number_of_com_keywords ;AC663;
954
955 DW BAUD_control ;AC663;
956 DW PARITY_equal_control ;AC663;
957 DW DATA_equal_control ;AC663;
958 DW STOP_equal_control ;AC663;
959 DW RETRY_equal_control ;AC663;same as for printers
960
961
962
963mutant_com_parmsx LABEL BYTE ;AN000;for trash like COM19600
964
965 DB 2 ;AN000;;must find "COM" and a baud rate
966 DB 2 ;AN000;;"COM", baud
967 DW COM_control ;AN000;
968 DW baud_control ;AN000;use same as other com parmsx
969
970 DB 0 ;AN000;no switches
971
972 DB 0 ;AN000;no keywords
973
974com_control LABEL BYTE ;AN000;for mutant_com_parmsx
975
976 DW simple_string ;AN000;"COM", not optional
977 DW 0 ;AN000;don't capitalize, leave colon
978 DW result ;AN000;
979 DW com_value ;AN000;
980 DB 0 ;AN000;no synonyms
981
982
983
984old_com_parity_control LABEL BYTE ;AC000;
985
986 DW simple_string+optional ;AC000;n, o, e are strings
987 DW 0 ;AC000;don't capitalize, leave colon
988 DW result ;AC000;
989 DW PARITY_values ;AC000;
990 DB 0 ;AC000;;no synonyms
991
992
993old_com_DATAbits_control LABEL BYTE ;AC000;
994
995 DW simple_string+optional ;AC000;
996 DW 0 ;AC000;;don't capitalize, leave colon
997 DW result ;AC000;
998 DW DATA_values ;AC000;
999 DB 0 ;AC000;
1000
1001
1002
1003old_com_STOPbits_control LABEL BYTE ;AC000;
1004
1005 DW simple_string+optional ;AC000;
1006 DW 0 ;AC000;;don't capitalize, leave colon
1007 DW result ;AC000;
1008 DW STOP_values ;AC000;
1009 DB 0 ;AC000;
1010
1011
1012
1013old_com_RETRY_control LABEL BYTE ;AC000;
1014
1015 DW simple_string+optional ;AC000;;all that is legal for RETRY is P for old com format
1016 DW 0 ;AC000;;don't capitalize, never need to display to user
1017 DW result ;AC000;
1018 DW RETRY_values ;AC000;
1019 DB 0 ;AC000;
1020
1021
1022com_value LABEL BYTE ;AC000;"COM" for mutant_com_parmsx
1023
1024 DB include_string_list ;AC000;have list of strings
1025
1026 DB 0 ;AC000;
1027
1028 DB 0 ;AC000;no number choices
1029
1030 DB 1 ;AC000;just "COM"
1031
1032 DB COM_item_tag ;AC000;
1033 DW OFFSET COM_str ;AC000;
1034
1035
1036first_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1037
1038match_flags DW simple_string+optional ;*** +ignore_colon *** ;AN000;2011, all that is legal for non-/status first parm
1039function_flags DW 0010H ;AN000;don't capitalize, remove colon at end
1040 DW result ;AN000;
1041values_ptr DW first_pos_values ;AN000;
1042 DB 0 ;AN000;no keywords as positionals
1043
1044
1045second_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1046
1047match_flags2 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm
1048function_flags2 DW 0010H ;AN000;don't capitalize, remove colon at end
1049 DW result ;AN000;
1050values_ptr2 DW second_pos_values ;AN000;
1051 DB 0 ;AN000;;no keywords as positionals
1052
1053third_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1054
1055match_flags3 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm
1056function_flags3 DW 0010H ;AN000;don't capitalize, remove colon at end
1057 DW result ;AN000;
1058values_ptr3 DW third_pos_values ;AN000;
1059 DB 0 ;AN000;;no keywords as positionals
1060
1061first_lpt_pos_control LABEL BYTE ;AN000;chars per line
1062
1063 DW simple_string+optional ;AN000;2001, all that is legal for chars per line
1064 DW 0000H ;AN000;don't capitalize
1065 DW result ;AN000;
1066 DW first_lpt_pos_values ;AN000;
1067 DB 0 ;AN000;no keywords as positionals
1068
1069
1070second_lpt_pos_control LABEL BYTE ;AN000;lines per inch
1071
1072 DW simple_string+optional ;AN000;2001, all that is legal for chars per line
1073 DW 0000H ;AN000;don't capitalize
1074 DW result ;AN000;
1075 DW second_lpt_pos_values ;AN000;
1076 DB 0 ;AN000;;no keywords as positionals
1077
1078third_lpt_pos_control LABEL BYTE ;AN000;P
1079
1080 DW simple_string+optional ;AN000;2001, all that is legal for retry settings
1081 DW 0000H ;AN000;don't capitalize
1082 DW result ;AN000;
1083 DW third_lpt_pos_values ;AN000;
1084 DB 0 ;AN000;;no keywords as positionals
1085
1086
1087
1088BAUD_control LABEL BYTE ;AN000;used for positional and keyword form
1089
1090 DW simple_string ;AN000;required
1091 DW 0 ;AN000;don't capitalize
1092 DW result ;AN000;
1093 DW BAUD_values ;AN000;
1094 DB 1 ;AN000;;only one form of the keyword
1095
1096BAUD_equal DB "BAUD=",0 ;AN000;
1097
1098
1099parity_equal_control LABEL BYTE ;AN000;initialized for first_parm_case
1100
1101 DW simple_string ;AN000;n, o, even, m, space etc are strings
1102 DW 0 ;AN000;don't capitalize, leave colon
1103 DW result ;AN000;
1104 DW PARITY_values ;AN000;
1105 DB 2 ;two ways to specify it
1106
1107parity_equal DB "PARITY=",0 ;AN000;
1108par_equal DB "PAR=",0 ;AN000;
1109
1110
1111
1112DATA_equal_control LABEL BYTE ;AN000;
1113
1114 DW simple_string
1115 DW 0 ;AN000;;don't capitalize, leave colon
1116 DW result ;AN000;
1117 DW DATA_values ;AN000;
1118 DB 1 ;AN000;
1119
1120data_equal DB "DATA=",0 ;AN000;
1121
1122
1123
1124STOP_equal_control LABEL BYTE ;AN000;
1125
1126 DW simple_string ;AN000;
1127 DW 0 ;AN000;;don't capitalize, leave colon
1128 DW result ;AN000;
1129 DW STOP_values ;AN000;
1130 DB 1 ;AN000;
1131
1132stop_equal DB "STOP=",0 ;AN000;
1133
1134
1135
1136RETRY_equal_control LABEL BYTE ;AN000;
1137
1138 DW simple_string ;AN000;;all that is legal for RETRY is on and off
1139 DW 0 ;AN000;;don't capitalize, never need to display to user
1140 DW result ;AN000;
1141 DW RETRY_values ;AN000;
1142 DB 1 ;AN000;
1143
1144retry_equal_str DB "RETRY=",0 ;AN000;
1145
1146
1147
1148PREPARE_equal_control LABEL BYTE ;AN000;
1149
1150prepare_equal_match_flags LABEL WORD ;AN000;
1151 DW numeric+complex+filespec ;AN000;has to be complex at first, then numbers and filespec inside the parens
1152 DW capitalize ;AN000;capitalize the filespec
1153 DW result ;AN000;
1154 DW prepare_values ;AN000;
1155 DB 2 ;AN000;
1156
1157prepare_equal DB "PREPARE=",0 ;AN000;
1158prep_equal DB "PREP=",0 ;AN000;
1159
1160
1161SELECT_equal_control LABEL BYTE ;AN000;
1162
1163 DW numeric ;AN000;range of codepage numbers
1164 DW 0 ;AN000;don't capitalize, leave colon
1165 DW result ;AN000;
1166 DW SELECT_values ;AN000;
1167 DB 2 ;AN000;no keywords as positionals
1168
1169select_equal DB "SELECT=",0 ;AN000;
1170sel_equal DB "SEL=",0 ;AN000;
1171
1172
1173DELAY_equal_control LABEL BYTE ;AN000;
1174
1175 DW numeric ;AN000; ;takes less space than number definitions
1176 DW 0 ;AN000; ;don't capitalize, leave colon
1177 DW result ;AN000;
1178 DW DELAY_values ;AN000;
1179 DB 2 ;AN000;
1180
1181del_equal DB "DEL=",0 ;AN000;
1182delay_equal DB "DELAY=",0 ;AN000;
1183
1184
1185RATE_equal_control LABEL BYTE ;AN000;
1186
1187 DW numeric ;AN000;
1188 DW 0 ;AN000; ;don't capitalize, leave colon
1189 DW result ;AN000;
1190 DW RATE_values ;AN000;
1191 DB 1 ;AN000;
1192
1193rate_equal DB "RATE=",0 ;AN000;
1194
1195
1196
1197LINES_equal_control LABEL BYTE ;AN000;
1198
1199LINES_match_flag DW numeric ;AN000; ;setup for CON, changed if find LPTX
1200 DW 0 ;AN000; ;don't capitalize, leave colon
1201 DW result ;AN000;
1202LINES_value_ptr DW CON_LINES_values ;AN000;
1203 DB 1 ;AN000;
1204
1205lines_equal DB "LINES=",0 ;AN000;
1206
1207
1208
1209COLUMNS_equal_control LABEL BYTE ;AN000;
1210
1211COLUMNS_match_flag DW numeric ;AN000; ;setup for CON changed when find LPTX
1212 DW 0 ;AN000; ;don't capitalize, leave colon
1213 DW result ;AN000;
1214COLUMNS_value_ptr DW CON_COLUMNS_values ;AN000;setup for CON, changed if find LPTX
1215 DB 2 ;AN000;
1216
1217COLUMNS_equal DB "COLUMNS=",0 ;AN000;printer keyword
1218COLS_equal DB "COLS=",0 ;AN000;
1219
1220
1221LPT1_colon_equal_control LABEL BYTE ;AN000;
1222
1223 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1224 DW 0 ;AN000;;don't capitalize, leave colon
1225 DW result ;AN000;
1226 DW reroute_values ;AN000;
1227 DB 1 ;AN000;
1228
1229LPT1_colon_equal DB "LPT1:=",0 ;AN000;
1230
1231
1232
1233LPT1_equal_control LABEL BYTE ;AN000;
1234
1235 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1236 DW 0 ;AN000;don't capitalize, leave colon
1237 DW result ;AN000;
1238 DW reroute_values ;AN000;
1239 DB 1 ;AN000;
1240
1241LPT1_equal DB "LPT1=",0 ;AN000;
1242
1243
1244
1245LPT2_colon_equal_control LABEL BYTE ;AN000;
1246
1247 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1248 DW 0 ;AN000;don't capitalize, leave colon
1249 DW result ;AN000;
1250 DW reroute_values ;AN000;
1251 DB 1 ;AN000;
1252
1253LPT2_colon_equal DB "LPT2:=",0 ;AN000;
1254
1255
1256
1257LPT2_equal_control LABEL BYTE ;AN000;
1258
1259 DW simple_string+ignore_colon ;AN000;;COM?[:] is all that is valid
1260 DW 0 ;AN000;don't capitalize, leave colon
1261 DW result ;AN000;
1262 DW reroute_values ;AN000;
1263 DB 1 ;AN000;
1264
1265LPT2_equal DB "LPT2=",0 ;AN000;
1266
1267
1268
1269LPT3_colon_equal_control LABEL BYTE ;AN000;
1270
1271 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1272 DW 0 ;AN000;don't capitalize, leave colon
1273 DW result ;AN000;
1274 DW reroute_values ;AN000;
1275 DB 1 ;AN000;
1276
1277LPT3_colon_equal DB "LPT3:=",0 ;AN000;
1278
1279
1280
1281LPT3_equal_control LABEL BYTE ;AN000;
1282
1283 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1284 DW 0 ;AN000;don't capitalize, leave colon
1285 DW result ;AN000;
1286 DW reroute_values ;AN000;
1287 DB 1 ;AN000;
1288
1289LPT3_equal DB "LPT3=",0 ;AN000;
1290
1291first_con_pos_control LABEL BYTE ;AN000;
1292
1293 DW simple_string ;AN000;CP, code, codepage
1294 DW 0 ;AN000;don't capitalize, leave colon
1295 DW result ;AN000;
1296 DW OFFSET first_CON_pos_values ;AN000;
1297 DB 0 ;AN000;no synonyms
1298
1299
1300second_con_pos_control LABEL BYTE ;AN000;
1301
1302 DW simple_string ;AN000;REFRESH
1303 DW 0 ;AN000;don't capitalize, leave colon
1304 DW result ;AN000;
1305 DW OFFSET second_CON_pos_values ;AN000;
1306 DB 0 ;AN000;no synonyms
1307
1308first_old_con_pos_control LABEL BYTE ;AN000;
1309
1310 DW simple_string+numeric ;AN000;r, l or screen lines request
1311 DW 0 ;AN000;don't capitalize
1312 DW result ;AN000;
1313 DW OFFSET first_old_CON_pos_values ;AN000;
1314 DB 0 ;AN000;no synonyms
1315
1316
1317second_old_con_pos_control LABEL BYTE ;AN000;
1318
1319 DW simple_string+optional ;AN000;T
1320 DW 0 ;AN000;don't capitalize
1321 DW result ;AN000;
1322 DW OFFSET second_old_CON_pos_values ;AN000;
1323 DB 0 ;AN000;no synonyms
1324
1325first_old_CON_pos_values LABEL BYTE ;all valid forms of shift direction, and screen line values ;AN000;
1326
1327 DB include_string_list ;AN000;have list of strings
1328
1329 DB 0 ;no number ranges ;AN000;
1330
1331 DB number_of_CON_lines_numbers ;number of rows choices;AN000;
1332
1333 DB twentyfive_item_tag ;AN000;
1334 DD 25 ;AN000;
1335 DB fourtythree_item_tag ;AN000;
1336 DD 43 ;AN000;
1337 DB fifty_item_tag ;AN000;
1338 DD 50 ;AN000;
1339
1340 DB number_of_shift_forms ;number of shift strings AN000;
1341
1342 start_shift_forms LABEL BYTE ;AN000;
1343
1344
1345 DB R_item_tag ;AN000;
1346 DW OFFSET R_str ;AN000;
1347 DB L_item_tag ;AN000;
1348 DW OFFSET L_str ;AN000;
1349
1350
1351 number_of_shift_forms EQU ($ - start_shift_forms)/3 ;3 bytes per entry;AN000;
1352
1353
1354second_old_CON_pos_values LABEL BYTE ;all valid forms of T ;AN000;
1355
1356 DB include_string_list ;AN000;have list of strings
1357
1358 DB 0 ;no number ranges ;AN000;
1359
1360 DB 0 ;no number list ;AN000;
1361
1362 DB number_of_T_forms ;number of T strings AN000;
1363
1364 start_T_forms LABEL BYTE ;AN000;
1365
1366
1367 DB T_item_tag ;AN000;
1368 DW OFFSET T_str ;AN000;
1369
1370
1371 number_of_T_forms EQU ($ - start_T_forms)/3 ;3 bytes per entry;AN000;
1372
1373
1374first_CON_pos_values LABEL BYTE ;all valid forms of codepage;AN000;
1375
1376 DB include_string_list ;AN000;have list of strings
1377
1378 DB 0 ;no number ranges ;AN000;
1379
1380 DB 0 ;no number list ;AN000;
1381
1382 DB number_of_CP_forms ;number of cp strings AN000;
1383
1384 start_CP_forms LABEL BYTE ;AN000;
1385
1386
1387 ;codepage strings
1388
1389 DB CODEPAGE_item_tag ;AN000;
1390 DW OFFSET CODE_str ;AN000;
1391 DB CODEPAGE_item_tag ;AN000;
1392 DW OFFSET CODEPAGE_str ;AN000;
1393 DB CODEPAGE_item_tag ;AN000;
1394 DW OFFSET CP_str ;AN000;
1395
1396 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1397
1398 DB REFRESH_item_tag ;AC007;
1399 DW OFFSET REF_str ;AC007;
1400 DB REFRESH_item_tag ;AC007;
1401 DW OFFSET REFRESH_str ;AC007;
1402
1403 number_of_CP_forms EQU ($ - start_CP_forms)/3 ;3 bytes per entry;AN000;
1404
1405
1406second_CON_pos_values LABEL BYTE ;all valid forms of REFRESH;AN000;
1407
1408 DB include_string_list ;AN000;have list of strings
1409
1410 DB 0 ;no number ranges ;AN000;
1411
1412 DB 0 ;no number list ;AN000;
1413
1414 DB number_of_REFRESH_forms ;number of REFRESH strings AN000;
1415
1416 start_REFRESH_forms LABEL BYTE ;AN000;
1417
1418 DB REFRESH_item_tag ;AN000;
1419 DW OFFSET REF_str ;AN000;
1420 DB REFRESH_item_tag ;AN000;
1421 DW OFFSET REFRESH_str ;AN000;
1422
1423 number_of_REFRESH_forms EQU ($ - start_REFRESH_forms)/3 ;3 bytes per entry;AN000;
1424
1425
1426BAUD_values LABEL BYTE ;AN000;;all valid baud rates
1427
1428 DB include_string_list ;AN000;have list of numbers and two strings
1429
1430 DB 0 ;AN000;
1431
1432 DB 0 ;AN000;no numeric representations
1433
1434 DB number_of_baud_strings ;AN000;number of baud rates that are being used for other parameters also
1435
1436 start_baud_strings LABEL BYTE ;AN000;
1437
1438 DB oneten_item_tag ;AN000;
1439 DW OFFSET oneten_str ;AN000;
1440 DB oneten_item_tag ;AN000;
1441 DW OFFSET eleven_str ;AN000;;"11" first two chars of 110
1442 DB onefifty_item_tag ;AN000;
1443 DW OFFSET fifteen_str ;AN000;
1444 DB onefifty_item_tag ;AN000;
1445 DW OFFSET onefifty_str ;AN000;
1446 DB threehundred_item_tag ;AN000;
1447 DW OFFSET thirty_str ;AN000;
1448 DB threehundred_item_tag ;AN000;
1449 DW OFFSET threehundred_str ;AN000;
1450 DB sixhundred_item_tag ;AN000;
1451 DW OFFSET sixty_str ;AN000;
1452 DB sixhundred_item_tag ;AN000;
1453 DW OFFSET sixhundred_str ;AN000;
1454 DB twelvehundred_item_tag ;AN000;
1455 DW OFFSET twelve_str ;AN000;
1456 DB twelvehundred_item_tag ;AN000;
1457 DW OFFSET twelvehundred_str ;AN000;
1458 DB twentyfourhundred_item_tag ;AN000;
1459 DW OFFSET twentyfour_str ;AN000;24 is also a typamatic rate
1460 DB twentyfourhundred_item_tag ;AN000;
1461 DW OFFSET twentyfourhundred_str ;AN000;
1462 DB fourtyeighthundred_item_tag ;AN000;
1463 DW OFFSET fourtyeight_str ;AN000;
1464 DB fourtyeighthundred_item_tag ;AN000;
1465 DW OFFSET fourtyeighthundred_str ;AN000;
1466 DB ninetysixhundred_item_tag ;AN000;
1467 DW OFFSET ninetysix_str ;AN000;
1468 DB ninetysixhundred_item_tag ;AN000;
1469 DW OFFSET ninetysixhundred_str ;AN000;
1470 DB nineteentwohundred_item_tag ;AN000;;item tag
1471 DW OFFSET nineteentwohundred_str ;AN000;;pointer to string
1472 DB nineteentwohundred_item_tag ;AN000;;item tag
1473 DW OFFSET nineteen_point_two_str ;AN000;
1474 DB nineteentwohundred_item_tag ;AN000; ;item tag
1475 DW OFFSET nineteen_str ;AN000; ;used for RATE= also
1476 DB nineteentwohundred_item_tag ;AN000; ;item tag
1477 DW OFFSET nineteen_point_two_K_str ;AN000;pointer to string "19.2K"
1478
1479 number_of_baud_strings EQU ($ - start_baud_strings)/3 ;AN000;3 bytes per entry
1480
1481
1482
1483PARITY_values LABEL BYTE ;AN000;all valid paritys
1484
1485 DB include_string_list ;AN000;have list of strings
1486
1487 DB 0 ;AN000;
1488
1489 DB 0 ;AN000;;no number choices
1490
1491 DB number_of_paritys ;AN000;;number of valid paritys
1492
1493 start_paritys LABEL BYTE ;AN000;
1494
1495 DB none_item_tag ;AN000;
1496 DW OFFSET N_str ;AN000;
1497 DB none_item_tag ;AN000;
1498 DW OFFSET NONE_str ;AN000;
1499 DB even_item_tag ;AN000;
1500 DW OFFSET EVEN_str ;AN000;
1501 DB even_item_tag ;AN000;
1502 DW OFFSET E_str ;AN000;
1503 DB odd_item_tag ;AN663;
1504 DW OFFSET O_str ;AN663;
1505 DB odd_item_tag ;AN000;
1506 DW OFFSET ODD_str ;AN000;
1507 DB MARK_item_tag ;AN663;
1508 DW OFFSET m_str ;AN663;
1509 DB MARK_item_tag ;AN000;
1510 DW OFFSET mark_str ;AN000;
1511 DB SPACE_item_tag ;AN663;
1512 DW OFFSET s_str ;AN663;
1513 DB SPACE_item_tag ;AN000;
1514 DW OFFSET space_str ;AN000;
1515
1516 number_of_paritys EQU ($ - start_paritys)/3 ;AN000;3 bytes per entry
1517
1518
1519DATA_values LABEL BYTE ;AN000;all valid DATA values
1520
1521 DB include_string_list ;AC663;have list of numbers
1522
1523 DB 0 ;AN000;no number ranges
1524
1525 DB 0 ;AN000;no number choices
1526
1527 DB number_of_databits ;AN000;string choices
1528
1529 start_databits LABEL BYTE ;AN000;
1530
1531 DB five_item_tag ;AN000;
1532 DW OFFSET five_str ;AN000;
1533 DB six_item_tag ;AN000;
1534 DW OFFSET six_str ;AN000;
1535 DB seven_item_tag ;AN000;
1536 DW OFFSET seven_str ;AN000;
1537 DB eight_item_tag ;AN000;
1538 DW OFFSET eight_str ;AN000;
1539
1540 number_of_databits EQU ($ - start_databits)/3 ;AN000;3 bytes per entry
1541
1542
1543STOP_values LABEL BYTE ;AN000;;all valid stop bits
1544
1545 DB include_string_list ;AN000;have list of numbers and list of strings
1546
1547 DB 0 ;AN000;
1548
1549 DB 0 ;AN000; ;no number choices
1550
1551 DB number_of_stopbit_strings ;AN000;;choices in string form
1552
1553 start_stopbit_strings LABEL BYTE ;AN000;
1554
1555 DB one_item_tag ;AN000;
1556 DW OFFSET one_str ;AN000;
1557 DB one_point_five_item_tag ;AN000;
1558 DW OFFSET one_point_five_str ;AN000;
1559 DB two_item_tag ;AN000;
1560 DW OFFSET two_str ;AN000;
1561
1562 number_of_stopbit_strings EQU ($ - start_stopbit_strings)/3 ;AN000;3 bytes per entry
1563
1564
1565
1566RETRY_values LABEL BYTE ;AN000;;all valid RETRY settings
1567
1568 DB include_string_list ;AN000;have list of strings
1569
1570 DB 0 ;AN000;
1571
1572 DB 0 ;AN000;;no number choices
1573
1574 DB number_of_retry_settings ;AN000;
1575
1576 start_retry_settings LABEL BYTE ;AN000;
1577
1578 DB B_item_tag ;AN000;
1579 DW OFFSET B_str ;AN000;
1580 DB E_item_tag ;AN000;
1581 DW OFFSET E_str ;AN000;
1582 DB R_item_tag ;AN000;
1583 DW OFFSET R_str ;AN000;
1584 DB NONE_item_tag ;AN663;
1585 DW OFFSET N_str ;AN663;
1586 DB NONE_item_tag ;AN000;
1587 DW OFFSET NONE_str ;AN000;
1588 DB P_item_tag ;AN000;
1589 DW OFFSET P_str ;AN000;
1590
1591 number_of_retry_settings EQU ($ - start_retry_settings)/3 ;AN000;3 bytes per entry
1592
1593
1594
1595PREPARE_values LABEL BYTE ;AN000;almost any numeric value is valid
1596
1597 DB ranges_only ;AN000;;have range of numbers
1598
1599 DB 1 ;AN000;;one range
1600
1601 DB codepage_item_tag ;AN000;
1602 DD min_codepage_value ;AN000;
1603 DD max_codepage_value ;AN000;
1604
1605
1606
1607
1608SELECT_values LABEL BYTE ;AN000;all valid baud rates
1609
1610 DB ranges_only ;AN000;;have range of numbers
1611
1612 DB 1 ;AN000;
1613
1614 DB codepage_item_tag ;AN000;;item tag for the range
1615 DD min_codepage_value ;AN000;
1616 DD max_codepage_value ;AN000;
1617
1618
1619DELAY_values LABEL BYTE ;AN000;;all valid delay rates
1620
1621 DB ranges_only ;AN000;;have range of numbers
1622
1623 DB 1 ;AN000;;1 range
1624 DB range_item_tag ;AN000;;don't ever need this item tag
1625 DD 1 ;AN000;;smallest valid delay value
1626 DD 4 ;AN000;;largest valid delay value
1627
1628
1629
1630RATE_values LABEL BYTE ;AN000;;all valid typamatic rates
1631
1632 DB ranges_only ;AN000;;have range of numbers
1633
1634 DB 1 ;AN000;;1 range
1635 DB range_item_tag ;AN000;;never used
1636 DD 1 ;AN000;;smallest valid rate
1637 DD 32 ;AN000;;largest valid rate
1638
1639
1640
1641
1642CON_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for the screen
1643
1644 DB include_number_list ;AN000; ;have list of numbers
1645
1646 DB 0 ;AN000;only numeric representations
1647
1648 DB number_of_CON_columns_numbers ;AN000;choices represented as numbers
1649
1650 start_CON_columns_numbers LABEL BYTE ;AN000;
1651
1652 DB fourty_item_tag ;AN000;
1653 DD 40 ;AN000;
1654 DB eighty_item_tag ; ;AN000;
1655 DD 80 ;AN000;numbers because used in call to IOCTL
1656
1657 number_of_CON_columns_numbers EQU ($ - start_CON_columns_numbers)/5 ;5 bytes per entry;AN000;
1658
1659
1660
1661CON_LINES_values LABEL BYTE ;all valid LINES= values for the screen;AN000;
1662
1663 DB include_number_list ;have list of numbers;AN000;
1664
1665 DB 0 ;AN000;
1666
1667 DB number_of_CON_lines_numbers ; number ch;AN000;
1668
1669 start_CON_lines_numbers LABEL BYTE ;AN000;
1670
1671 DB twentyfive_item_tag ;AN000;
1672 DD 25 ;AN000;
1673 DB fourtythree_item_tag ;AN000;
1674 DD 43 ;AN000;
1675 DB fifty_item_tag ;AN000;
1676 DD 50 ;AN000;
1677
1678 number_of_CON_lines_numbers EQU ($ - start_CON_lines_numbers)/5 ;5 bytes per entry;AN000;
1679
1680
1681
1682
1683LPT_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for parallel printers
1684
1685 DB include_string_list ;AN000;;have list of strings
1686
1687 DB 0 ;AN000;
1688
1689 DB 0 ;AN000;no numeric representations
1690
1691 DB number_of_lpt_columns_strings ;AN000;;choices represented as strings
1692
1693 start_LPT_columns_strings LABEL BYTE ;AN000;
1694
1695 DB eighty_item_tag ; ;AN000;
1696 DW OFFSET eighty_str ;AN000;;strings because values also used as positional parms
1697 DB onethirtytwo_item_tag ;AN000;
1698 DW OFFSET onethirtytwo_str ;AN000;
1699
1700 number_of_LPT_columns_strings EQU ($ - start_LPT_columns_strings)/3 ;3 bytes per entry;AN000;
1701
1702
1703
1704LPT_LINES_values LABEL BYTE ;AN000;all valid LINES= values for the screen
1705
1706 DB include_string_list ;AN000;have list of strings
1707
1708 DB 0 ;AN000;
1709
1710 DB 0 ;AN000; ;no number choices
1711
1712 DB number_of_LPT_lines_strings ;AN000;
1713
1714 start_LPT_lines_strings LABEL BYTE ;AN000;
1715
1716 DB six_item_tag ;AN000;;for printer
1717 DW OFFSET six_str ;AN000;
1718 DB eight_item_tag ;AN000;;for printer
1719 DW OFFSET eight_str ;AN000;
1720
1721 number_of_LPT_lines_strings EQU ($ - start_LPT_lines_strings)/3 ;AN000;3 bytes per entry
1722
1723
1724reroute_values LABEL BYTE ;AN000;;all valid destination devices for parallel printer reroute
1725
1726 DB include_string_list ;AN000; ;have list of numbers and one string
1727
1728 DB 0 ;AN000;
1729
1730 DB 0 ;AN000;;no number choices
1731
1732 DB number_of_reroute_strings ;AN000;
1733
1734 start_reroute_strings LABEL BYTE ;AN000;
1735
1736 DB COM1_item_tag ;AN000;
1737 DW OFFSET COM1_str ;AN000;
1738 DB COM2_item_tag ;AN000;
1739 DW OFFSET COM2_str ;AN000;
1740 DB COM3_item_tag ;AN000;
1741 DW OFFSET COM3_str ;AN000;
1742 DB COM4_item_tag ;AN000;
1743 DW OFFSET COM4_str ;AN000;
1744
1745 number_of_reroute_strings EQU ($ - start_reroute_strings)/3 ;AN000;3 bytes per entry
1746
1747
1748
1749
1750Sw_control LABEL BYTE ;AN000;
1751
1752 DW 0 ;AN000;no values allowed on /STATUS
1753function_flag DW 0 ;AN000;no values allowed on /STATUS
1754 DW result ;AN000;same buffer as for other parms
1755 DW Sw_values ;AN000;
1756num_synonyms DB 3 ;AN000;3 ways to specify /STATUS
1757slash_sta DB "/STA",0 ;AN000;
1758slash_stat DB "/STAT",0 ;AN000;
1759slash_status DB "/STATUS",0 ;AN000;
1760
1761
1762
1763
1764
1765
1766Sw_values LABEL BYTE ;AN000;
1767
1768 DB 0 ;AN000;no values allowed on /STATUS
1769
1770
1771first_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear first
1772
1773 DB include_string_list ;AN000; ;have string values
1774
1775 DB 0 ;AN000;numerics treated as strings
1776
1777 DB 0 ;AN000;no number choices
1778
1779 DB number_of_first_positional_strings ;AN000;
1780
1781 start_first_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1782
1783 ;screen modes
1784
1785 DB BW40_item_tag ;AC000;
1786 DW OFFSET BW40_str ;AC000;
1787 DB BW80_item_tag ;AC000;
1788 DW OFFSET BW80_str ;AC000;
1789 DB CO40_item_tag ;AC000;
1790 DW OFFSET CO40_str ;AC000;
1791 DB CO80_item_tag ;AC000;
1792 DW OFFSET CO80_str ;AC000;
1793 DB MONO_item_tag ;AC000;
1794 DW OFFSET MONO_str ;AC000;
1795 DB fourty_item_tag ;AC000;
1796 DW OFFSET fourty_str ;AC000;
1797 DB eighty_item_tag ;AC000;
1798 DW OFFSET eighty_str ;AC000;
1799
1800
1801 DB con_item_tag ;AN000;
1802 DW OFFSET con_str ;AN000;
1803
1804 ;com port names
1805
1806 DB COM1_item_tag ;AN000;
1807 DW OFFSET COM1_str ;AN000;
1808 DB COM2_item_tag ;AN000;
1809 DW OFFSET COM2_str ;AN000;
1810 DB COM3_item_tag ;AN000;
1811 DW OFFSET COM3_str ;AN000;
1812 DB COM4_item_tag ;AN000;
1813 DW OFFSET COM4_str ;AN000;
1814
1815 ;printer port names
1816
1817 DB PRN_item_tag ;AN000;
1818 DW OFFSET PRN_str ;AN000;
1819 DB LPT1_item_tag ;AN000;
1820 DW OFFSET LPT1_str ;AN000;
1821 DB LPT2_item_tag ;AN000;
1822 DW OFFSET LPT2_str ;AN000;
1823 DB LPT3_item_tag ;AN000;
1824 DW OFFSET LPT3_str ;AN000;
1825
1826 ;LPT special cases
1827
1828 DB LPT1132_item_tag ;AN000;
1829 DW OFFSET LPT1132_str;AN000;
1830 DB LPT2132_item_tag ;AN000;
1831 DW OFFSET LPT2132_str;AN000;
1832 DB LPT3132_item_tag ;AN000;
1833 DW OFFSET LPT3132_str;AN000;
1834 DB LPT180_item_tag ;AN000;
1835 DW OFFSET LPT180_str ;AN000;
1836 DB LPT280_item_tag ;AN000;
1837 DW OFFSET LPT280_str ;AN000;
1838 DB LPT380_item_tag ;AN000;
1839 DW OFFSET LPT380_str ;AN000;
1840
1841
1842number_of_first_positional_strings EQU ($ - start_first_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1843
1844
1845
1846second_pos_values LABEL BYTE ;AN000;;value list for all positional parameters that appear second
1847
1848 DB include_string_list ;AN000; ;have string values
1849
1850 DB 0 ;AN000;numerics treated as strings
1851
1852 DB 0 ;AN000;no number choices
1853
1854 DB number_of_second_positional_strings ;AN000;
1855
1856 start_second_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1857
1858
1859 ;codepage strings
1860
1861 DB CODEPAGE_item_tag ;AN000;
1862 DW OFFSET CODE_str ;AN000;
1863 DB CODEPAGE_item_tag ;AN000;
1864 DW OFFSET CODEPAGE_str ;AN000;
1865 DB CODEPAGE_item_tag ;AN000;
1866 DW OFFSET CP_str ;AN000;
1867
1868 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1869
1870 DB REFRESH_item_tag ;AC007;
1871 DW OFFSET REF_str ;AC007;
1872 DB REFRESH_item_tag ;AC007;
1873 DW OFFSET REFRESH_str ;AC007;
1874
1875 ;shift directions
1876
1877 DB L_item_tag ;AN000;
1878 DW OFFSET L_str ;AN000;
1879 DB R_item_tag ;AN000;
1880 DW OFFSET R_str ;AN000;
1881
1882
1883 ;columns values
1884
1885; DB eighty_item_tag ;AN000;
1886; DW OFFSET eighty_str ;AN000; ;strings because values also used as positional parms
1887 DB onethirtytwo_item_tag;AN000;
1888 DW OFFSET onethirtytwo_str ;AN000;
1889
1890number_of_second_positional_strings EQU ($ - start_second_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1891
1892
1893third_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear third
1894
1895 DB include_string_list ;AN000; ;have string values
1896
1897 DB 0 ;AN000;numerics treated as strings
1898
1899 DB 0 ;AN000;no number choices
1900
1901 DB number_of_third_positional_strings ;AN000;
1902
1903 start_third_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1904
1905number_of_third_positional_strings EQU ($ - start_third_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1906
1907
1908first_lpt_pos_values LABEL BYTE ;AN000;value list for all possible chars per line
1909
1910 DB include_string_list ;AN000; ;have string values
1911
1912 DB 0 ;AN000;numerics treated as strings
1913
1914 DB 0 ;AN000;no number choices
1915
1916 DB number_of_first_lpt_positional_strings ;AN000;
1917
1918 start_first_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1919
1920 DB eighty_item_tag
1921 DW OFFSET eighty_str
1922 DB onethirtytwo_item_tag
1923 DW OFFSET onethirtytwo_str ;AN000;
1924 DB CODEPAGE_item_tag
1925 DW OFFSET CODE_str ;AN000;
1926 DB CODEPAGE_item_tag ;AN000;
1927 DW OFFSET CODEPAGE_str ;AN000;
1928 DB CODEPAGE_item_tag ;AN000;
1929 DW OFFSET CP_str ;AN000;
1930
1931 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1932
1933 DB REFRESH_item_tag ;AC007;
1934 DW OFFSET REF_str ;AC007;
1935 DB REFRESH_item_tag ;AC007;
1936 DW OFFSET REFRESH_str ;AC007;
1937
1938number_of_first_lpt_positional_strings EQU ($ - start_first_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1939
1940
1941second_lpt_pos_values LABEL BYTE ;AN000;value list for all possible lines per inch
1942
1943 DB include_string_list ;AN000; ;have string values
1944
1945 DB 0 ;AN000;numerics treated as strings
1946
1947 DB 0 ;AN000;no number choices
1948
1949 DB number_of_second_lpt_positional_strings ;AN000;
1950
1951 start_second_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1952
1953 DB eight_item_tag ;AN000;
1954 DW OFFSET eight_str ;AN000;
1955 DB six_item_tag ;AN000;
1956 DW OFFSET six_str ;AN000;
1957 DB REFRESH_item_tag ;AN000;
1958 DW OFFSET REF_str ;AN000;
1959 DB REFRESH_item_tag ;AN000;
1960 DW OFFSET REFRESH_str ;AN000;
1961
1962number_of_second_lpt_positional_strings EQU ($ - start_second_lpt_positional_strings)/3 ;3 bytes per entry (byte,word);AN000;
1963
1964
1965third_lpt_pos_values LABEL BYTE ;AN000;value list for all possible retry settings
1966
1967 DB include_string_list ;AN000; ;have string values
1968
1969 DB 0 ;AN000;no numeric ranges
1970
1971 DB 0 ;AN000;no number choices
1972
1973 DB number_of_third_lpt_positional_strings ;AN000;
1974
1975 start_third_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1976
1977 DB B_item_tag ;AN000;
1978 DW OFFSET B_str ;AN000;
1979 DB E_item_tag ;AN000;
1980 DW OFFSET E_str ;AN000;
1981 DB R_item_tag ;AN000;
1982 DW OFFSET R_str ;AN000;
1983 DB NONE_item_tag ;AN663;
1984 DW OFFSET N_str ;AN663;
1985 DB NONE_item_tag ;AN000;
1986 DW OFFSET NONE_str ;AN000;
1987 DB OFF_item_tag ;AN000;
1988 DW OFFSET OFF_str ;AN000;
1989 DB P_item_tag
1990 DW OFFSET P_str
1991
1992number_of_third_lpt_positional_strings EQU ($ - start_third_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1993
1994
1995
1996;strings
1997
1998 ;AN000;
1999zero_str DB "0",0 ;AN000;
2000one_str DB "1",0 ;AN000;
2001one_point_five_str DB "1.5",0 ;AN000;
2002two_str DB "2",0 ;AN000;
2003three_str DB "3",0 ;AN000;
2004four_str DB "4",0 ;AN000;
2005five_str DB "5",0 ;AN000; ;data bit, typamatic rate
2006six_str DB "6",0 ;AN000;
2007seven_str DB "7",0 ;AN000;
2008eight_str DB "8",0 ;AN000;
2009nine_str DB "9",0 ;AN000;
2010eleven_str DB "11",0 ;AN000; ;first two chars of 110
2011twelve_str DB "12",0 ;AN000;
2012fifteen_str DB "15",0 ;AN000; ;abbreviated form of 150, 15 is also a RATE= candidate
2013nineteen_str DB "19",0 ;AN000; ;used for baud rates and RATE=
2014nineteen_point_two_str DB "19.2",0 ;AN000;
2015nineteen_point_two_K_str DB "19.2K",0 ;AN000; ;mutant baud rate
2016twentyfour_str DB "24",0 ;AN000; ;24 is also a typamatic rate
2017thirty_str DB "30",0 ;AN000;
2018fourty_str DB "40",0 ;AN000;
2019fourtyeight_str DB "48",0 ;AN000;
2020sixty_str DB "60",0 ;AN000;
2021eighty_str DB "80",0 ;AN000;
2022ninetysix_str DB "96",0 ;AN000;
2023oneten_str DB "110",0 ;AN000;
2024onethirtytwo_str DB "132",0 ;AN000;
2025onefifty_str DB "150",0 ;AN000;
2026threehundred_str DB "300",0 ;AN000;
2027sixhundred_str DB "600",0 ;AN000;
2028twelvehundred_str DB "1200",0 ;AN000;
2029twentyfourhundred_str DB "2400",0 ;AN000;
2030fourtyeighthundred_str DB "4800",0 ;AN000;
2031ninetysixhundred_str DB "9600",0 ;AN000;
2032nineteentwohundred_str DB "19200",0 ;AN000;
2033B_str DB "B",0 ;AN000;
2034BW40_str DB "BW40",0 ;AN000;
2035BW80_str DB "BW80",0 ;AN000;
2036CO40_str DB "CO40",0 ;AN000;
2037CO80_str DB "CO80",0 ;AN000;
2038CODE_str DB "CODE",0 ;AN000;
2039CODEPAGE_str DB "CODEPAGE",0;AN000;
2040COM_str DB "COM",0 ;AN000;
2041start_COM1_str LABEL BYTE ;AN000; ;used to calculate len_COMX_str, see invoke
2042COM1_str DB "COM1",0 ;AN000;
2043len_COMX_str EQU $ - start_COM1_str;AN000; ;all COMX strings are the same length
2044COM2_str DB "COM2",0 ;AN000;
2045COM3_str DB "COM3",0 ;AN000;
2046COM4_str DB "COM4",0 ;AN000;
2047CON_str DB "CON",0
2048len_CON_str EQU ($ - (OFFSET CON_str)) ;AN000;
2049CP_str DB "CP",0 ;AN000;
2050E_str DB "E",0 ;RETRY=setting ;AN000;
2051EVEN_str DB "EVEN",0 ;AN000;
2052L_str DB "L",0 ;AN000;
2053start_LPT1_str LABEL BYTE ;used to calculate len_LPTX_str, see invoke ;AN000;
2054LPT1_str DB "LPT1",0 ;AN000;
2055len_LPTX_str EQU $ - start_LPT1_str ;all LPTX strings are the same length ;AN000;
2056LPT2_str DB "LPT2",0 ;AN000;
2057LPT3_str DB "LPT3",0 ;AN000;
2058LPT1132_str DB "LPT1132",0 ;AN000;
2059LPT2132_str DB "LPT2132",0 ;AN000;
2060LPT3132_str DB "LPT3132",0 ;AN000;
2061LPT180_str DB "LPT180",0 ;AN000;
2062LPT280_str DB "LPT280",0 ;AN000;
2063LPT380_str DB "LPT380",0 ;AN000;
2064M_str DB "M",0
2065MARK_str DB "MARK",0 ;AN000;
2066MONO_str DB "MONO",0 ;AN000;
2067N_str DB "N",0 ;AN000;
2068NONE_str DB "NONE",0 ;AN000;
2069O_str DB "O",0 ;AN000;
2070ODD_str DB "ODD",0 ;AN000;
2071OFF_str DB "OFF",0 ;AN000;
2072ON_str DB "ON",0 ;AN000;
2073P_str DB "P",0 ;AN000;
2074PRN_str DB "PRN",0 ;AN000;
2075R_str DB "R",0 ;AN000;
2076REF_str DB "REF",0 ;AN000;
2077REFRESH_str DB "REFRESH",0 ;AN000;
2078S_str DB "S",0
2079SPACE_str DB "SPACE",0 ;AN000;
2080T_str DB "T",0 ;AN000;
2081
2082
2083result result_def<> ;AN000;
2084
2085parm_lst parm_list_entry max_parms DUP (<>) ;AN000;
2086
2087
2088
2089;º º
2090;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
2091
2092
2093;
2094;******************************************************************************************
2095
2096;-------------------------------------------------------------------------------
2097;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2098
2099;³ SEARCH_ITEM_TAGS
2100;³ ----------------
2101;³ Search the item tags in input value list for the input item tag.
2102
2103
2104
2105
2106
2107
2108;³ INPUT: i_CL - first item tag in the group
2109;³ search_stop - last item_tag in the group, the sentinal for the REPEAT
2110;³ loop.
2111
2112
2113;³ RETURN: match_found indicates that the item tag returned by the parser was
2114;³ found in the group passed in.
2115
2116
2117;³ MESSAGES: none
2118
2119
2120
2121
2122;³ REGISTER
2123;³ USAGE: To be determined at I2 time.
2124
2125
2126;³ CONVENTIONS:
2127
2128
2129
2130
2131;³ ASSUMPTIONS:
2132
2133
2134;³ SIDE EFFECT:
2135
2136
2137;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2138
2139search_item_tags PROC NEAR ;AN000;
2140
2141
2142MOV match_found,false ;AN000;
2143.REPEAT
2144 .IF <parm_list[current_parm_DI].item_tag EQ i_CL> THEN ;AN000;
2145 MOV match_found,true ;AN000;
2146 MOV i_CL,last_databit_item_tag ;AN000;set end of loop trigger
2147 .ENDIF ;AN000;
2148 INC i_CL ;AN000;
2149.UNTIL <i_CL GT search_stop> ;AN000;
2150
2151RET
2152
2153search_item_tags ENDP ;AN000;
2154
2155;-------------------------------------------------------------------------------
2156;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2157
2158;³ CHECK_FOR_KEYWORD
2159;³ ---------------------
2160
2161;³ Scan the list of keywords (OFFSETS) looking for a match with
2162;³ parm_list[current_parm_DI].keyword_switch_ptr.
2163
2164
2165
2166;³ INPUT: uses global variables.
2167
2168
2169;³ RETURN: match_found is set to true if a match is found.
2170
2171
2172;³ MESSAGES: none
2173
2174
2175
2176;³ REGISTER
2177;³ USAGE: DX - loop index
2178;³ SI - displacement into the list of pointers
2179;³ CX - holder of pointer to keywords for compare
2180
2181
2182
2183;³ CONVENTIONS:
2184
2185
2186
2187
2188
2189
2190;³ ASSUMPTIONS: The list of con_keyword pointers is consecutive words.
2191;³ number_of_keywords has the number of OFFSETS in the list
2192;³ start_of_keyword_ptrs has the first OFFSET in the list and can
2193;³ be addressed off of.
2194
2195
2196
2197;³ SIDE EFFECT: DL - lost
2198;³ SI - lost
2199;³ CX - lost
2200;³ match_found - lost
2201
2202
2203;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2204
2205check_for_keyword PROC NEAR ;AN000;
2206
2207MOV match_found,false ;AN000;
2208MOV SI,0 ;AN000;
2209MOV DL,0 ;AN000;;index for the loop
2210.WHILE <DL LT number_of_keywords> AND ;AN000;;check each pointer in the list
2211.WHILE <match_found EQ false> DO ;AN000;
2212 MOV CX,start_of_keyword_ptrs[SI] ;AN000;
2213 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ CX> THEN ;AN000;IF synonym ptr=CON keyword ptr THEN
2214 MOV match_found,true ;AN000;
2215 .ENDIF ;AN000;
2216 INC SI ;AN000; ;AN000;
2217 INC SI ;AN000; ;AN000;
2218 INC DL ;AN000;;increment loop counter
2219.ENDWHILE ;AN000;
2220
2221RET ;AN000;
2222
2223check_for_keyword ENDP ;AN000;
2224
2225;-------------------------------------------------------------------------------
2226
2227setup_invalid_parameter PROC NEAR ;AN000;
2228
2229PUBLIC setup_invalid_parameter
2230
2231MOV message,OFFSET CRLF ;AN000;the common message doesn't have a CR,LF in it and all my other messages do
2232PUSH parser_return_code_AX ;AC006;AX destroyed by sysdispmsg
2233display message ;AN000;
2234POP parser_return_code_AX
2235
2236
2237MOV BP,command_line ;AN000;BP points to end of current (invalid) parm
2238.IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string
2239.IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN
2240 DEC BP ;AN000;don't include the delimeter in the display of the invalid parm
2241.ENDIF
2242MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ
2243
2244;offending_parameter is where the text of the bad parm is,
2245;offending_parameter_ptr is the address of offending_parameter By incrementing
2246;offending_parameter_ptr the first characters of the text string are skipped.
2247;This is done to skip leading whitespace.
2248
2249
2250MOV BP,offending_parameter_ptr ;AC006;BP=>first char in the text string
2251.WHILE <<BYTE PTR [BP]> EQ tab> OR ;AC006;WHILE the char in the text string
2252.WHILE <<BYTE PTR [BP]> EQ " "> DO ;AC006; is white space DO
2253 INC offending_parameter_ptr ;AC006;point past the whitespace char
2254 INC BP ;AC006;index next char in the string
2255.ENDWHILE ;AC006;
2256
2257.IF <parser_return_code_AX EQ syntax_error_rc> THEN ;AN000;syntax error, like "RETRY= E"
2258 MOV message,OFFSET syntax_error ;AN000;
2259 PUSH offending_parameter_ptr ;AN000;
2260 POP syntax_error_ptr ;AN000;point to the offending parameter
2261.ELSEIF <parser_return_code_AX EQ not_in_switch_list> THEN ;AN000;
2262 MOV message,OFFSET Invalid_switch
2263.ELSE
2264 MOV message,OFFSET Invalid_parameter ;AN000;user mispelled, misordered etc.
2265.ENDIF ;AN000;
2266MOV noerror,false ;AN000;
2267
2268RET
2269
2270setup_invalid_parameter ENDP ;AN000;
2271
2272;-------------------------------------------------------------------------------
2273
2274setup_for_not_supported PROC NEAR ;AC002;prepare replacable parm for "Function not supported on this machine - ????".
2275
2276MOV CX,offending_parameter_ptr;AN000;
2277MOV not_supported_ptr,CX ;AN000;point to string describing what is not supported for message
2278MOV BP,command_line ;AN000;BP points to end of current (invalid) parm
2279.IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string
2280.IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN
2281 DEC BP ;AN000;don't include the delimeter in the display of the invalid parm
2282.ENDIF
2283MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ
2284MOV message,OFFSET function_not_supported ;AN000;"Function not supported on the computer - mark"
2285MOV noerror,false ;AN000;
2286MOV looking_for,eol
2287
2288RET
2289
2290setup_for_not_supported ENDP ;AC002;
2291
2292
2293;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2294
2295;³ PARSE_PARAMETERS
2296;³ ----------------
2297
2298;³ All parameters entered on the command line are reduced to a list of values
2299;³ which completely describes the parms. The syntactic and semantic correctness
2300;³ will be checked. The routines that use the lists created by this routine
2301;³ can have complete trust in the validity of the parms.
2302
2303;³ Most of the states of looking_for allow null, even if it is not mentioned in
2304;³ the name of the value looking_for is assigned.
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315;³ INPUT: none, uses global variables.
2316
2317
2318;³ RETURN: noerror is set to false if an error is encountered.
2319
2320
2321;³ MESSAGES: "Invalid parameter 'bdprm'", where "bdprm" is the first 5 or less
2322;³ characters of the parameter that is incorrect or unexpected.
2323
2324;³ "Must specify COM1, COM2, COM3 or COM4"
2325
2326;³ "Illegal device name"
2327
2328;³ "Invalid baud rate specified"
2329
2330
2331
2332
2333;³ REGISTER
2334;³ USAGE: To be determined at I2 time.
2335
2336
2337;³ CONVENTIONS: "looking_for" indicates the valid possibilities for the next parm.
2338
2339;³ "current_parm" refers to the parm just returned. It can be an
2340;³ item tag, a type.
2341
2342;³ When "/STATUS" is a valid possibility it is checked for even
2343;³ though the value of "looking_for" may not indicate it as a
2344;³ choice.
2345
2346;³ When possible the parser control blocks will be modified at
2347;³ the case where looking_for is being checked for rather than
2348;³ where looking_for was set. This will save code when more than
2349;³ one place sets looking_for to the same state.
2350
2351
2352
2353
2354;³ ASSUMPTIONS: The parser control blocks are setup to be the following:
2355;³ seperators are defaults and colon (:)
2356;³ match_flags=2011 (simple string, ignore colon, optional)
2357;³ function_flags=0
2358;³ keyword/switch list has only /STATUS
2359;³ nval (number of value definitions) is 3
2360;³ Initially no number choices. Most numeric values will treated as strings.
2361;³ This is because for most of them the numeric value doesn't
2362;³ mean anything. Since we do not want to restrict the choices
2363;³ code pages they cannot be enumerated, so a range will be used.
2364;³ The list of strings in the values block contains all the
2365;³ device names, all the screen modes, all the status qualifiers,
2366;³ and all numeric values that have no meaning in binary form,
2367;³ can be enumerated, or are non-integer.
2368
2369
2370;³ SIDE EFFECT:
2371
2372
2373;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2374
2375parse_parameters PROC ;AN000;
2376
2377;determine if on a PS/2 for checking COMx parameters
2378
2379.IF <machine_type EQ PS2Model30> OR ;AC002;
2380.IF <machine_type EQ PS2Model50> OR ;AC002;
2381.IF <machine_type EQ PS2Model60> OR ;AC002;
2382.IF <machine_type EQ PS2Model80> THEN ;AC002;IF the machine is a PS/2 THEN
2383 MOV type_of_machine,PS2 ;AC002;set flag
2384.ENDIF
2385
2386
2387MOV looking_for,first_parm ;AN000;looking_for:=first_parm
2388
2389.WHILE <eol_found NE true> AND NEAR ;AN000;
2390.WHILE <noerror EQ true> NEAR DO ;AN000;WHILE (NOT EOL) AND noerror=true DO
2391
2392; CASE looking_for=
2393
2394 ;calculate the displacement for the jump to appropriate case
2395 XOR AX,AX ;AN000;
2396 MOV AL,max_looking_for ;AN000;see the list of equates for looking_for
2397 SUB AL,looking_for ;AN000;AX=byte displacement into table of OFFSETS
2398 SHL AX,1 ;AN000;each displacement is 2 bytes
2399 MOV SI,AX ;AN000;SI=appropriate displacement into table of offsets
2400 JMP jump_table1[SI] ;AN000;jump to case
2401
2402 jump_table1 LABEL WORD ;AN000; ;these entries must be in same order as the values in list of equates for looking_for
2403
2404 DW OFFSET codepage_case ;AN000;
2405 DW OFFSET codepage_prms_case ;AN000;
2406 DW OFFSET COM_keyword_case ;AN000;
2407 DW OFFSET com_keyword_or_baud_case ;AN000;
2408 DW OFFSET CON_keyword_case ;AN000;
2409 DW OFFSET con_kwrd_status_or_cp_case ;AN000;
2410 DW OFFSET databits_or_null_case ;AN000;
2411 DW OFFSET device_name_or_eol_case ;AN000;
2412 DW OFFSET eol_case ;AN000;
2413 DW OFFSET first_parm_case ;AN000;
2414 DW OFFSET li_or_null_case ;AN000;
2415 DW OFFSET P_case ;AN000;
2416 DW OFFSET parity_or_null_case ;AN000;
2417 DW OFFSET prn_kw_status_cp_cl_null_case ;AN000;
2418 DW OFFSET sd_or_dl_case ;AN000;
2419 DW OFFSET sd_or_dl_or_eol_case ;AN000;
2420 DW OFFSET status_or_eol_case ;AN000;
2421 DW OFFSET stopbits_or_null_case ;AN000;
2422 DW OFFSET T_or_eol_case ;AN000;
2423
2424
2425 com_keyword_or_baud_case: ;AN000;
2426
2427PUBLIC com_keyword_or_baud_case
2428
2429 ;The com keywords are in "com_parmsx", as well as the values for the
2430 ;positional and keyword forms of the com parameters. If
2431 ;keyword_switch_ptr comes back from parse_parm nonzero then a valid
2432 ;com keyword or /STATUS was found.
2433
2434 CALL parse_parm ;AN000;/status allowed
2435
2436 ;CASE current_parm=
2437
2438
2439; /status:
2440
2441 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2442 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2443 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2444 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;
2445
2446; MOV slash_status,deleted ;AN000;make it so /status again is an error,also deletes /STA
2447; MOV slash_stat,deleted ;AN000;
2448; MOV slash_sta,deleted ;AN000;
2449 MOV looking_for,eol ;AN000;eol only valid
2450 MOV request_type,com_status ;AN000;
2451
2452 BREAK 1 ;AN000;
2453
2454 .ENDIF ;AN000;
2455
2456
2457; eol:
2458
2459 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
2460
2461 MOV request_type,com_status ;AN000;
2462 MOV eol_found,true ;AN000;
2463 BREAK 1 ;AN000;
2464
2465 .ENDIF ;AN000;
2466
2467
2468; com_keyword:
2469
2470 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2471 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;AN000;wasn't /STATUS so must be a keyword
2472
2473 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN
2474 MOV baud_specified,true ;AN000;
2475 .ENDIF ;AN000;
2476 delete_parser_value_list_entry keywords,current_parm ;AN000;
2477 MOV looking_for,com_keyword ;AN000;
2478 MOV parms_form,keyword ;AN000;tell analyze_and_invoke how to look at the parms
2479 BREAK 1 ;AN000;
2480
2481 .ENDIF ;AN000;
2482
2483
2484; baud: ;found a number that is a valid baud, know that have old com style com request
2485
2486
2487
2488 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a baud rate THEN (none of above, must be baud rate)
2489
2490 .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND
2491 MOV new_com_initialize,true
2492 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2493 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2494 .ENDIF ;AN000;
2495 .ENDIF ;AN008;
2496;AD008; .ELSE
2497 MOV looking_for,parity_or_null ;AN000;
2498 MOV request_type,initialize_com_port ;AN000;
2499;AD008; .ENDIF
2500 BREAK 1 ;AN000;
2501
2502 .ELSE ;AN000;
2503
2504
2505; otherwise:
2506
2507 CALL setup_invalid_parameter ;AN000;
2508; BREAK 1
2509
2510 .ENDIF
2511
2512 ENDCASE_1:
2513
2514 BREAK 0 ;AN000;
2515
2516
2517
2518 com_keyword_case:
2519
2520 ;At this point the com keywords are in the keyword list, the only valid
2521 ;parms that can follow are com keywords. Assume that one and only one
2522 ;com keyword has been found and removed from the list of keywords.
2523
2524PUBLIC com_keyword_case
2525
2526 MOV parms.parmsx_ptr,OFFSET com_keywords_parmsx ;AN000;only com keywords are in the control blocks
2527 MOV i_CL,1 ;AN000;
2528 .WHILE <i_CL LE number_of_com_keywords> AND NEAR ;AN000;one iteration more than number of parms left so will find eol
2529 .WHILE <eol_found EQ false> AND NEAR ;AN000;
2530 .WHILE <noerror EQ true> DO NEAR ;AN000;
2531
2532 .SELECT ;AC002;check for PS/2 specific parms
2533 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AC002;IF synonym ptr=> BAUD= THEN
2534 .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND
2535 MOV new_com_initialize,true
2536 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2537 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2538 .ENDIF
2539 .ENDIF
2540 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET parity_equal>> THEN ;AC002;IF parity= THEN
2541 .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AC002;IF PS2 only parity
2542 .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AC002;IF PS2 only parity AND
2543 MOV new_com_initialize,true
2544 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2545 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2546 .ENDIF
2547 .ENDIF
2548 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET data_equal>> THEN ;AC002;IF data= THEN
2549 .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002;IF PS2 only data bits
2550 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002;IF PS2 only data bits AND
2551 MOV new_com_initialize,true
2552 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2553 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2554 .ENDIF
2555 .ENDIF
2556 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET stop_equal>> THEN ;AC002;IF stop= THEN
2557 .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002;IF PS2 only stop bits AND
2558 MOV new_com_initialize,true
2559 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2560 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2561 .ENDIF
2562 .ENDIF
2563 .ENDSELECT
2564
2565 PUSH CX ;save the loop index
2566 CALL parse_parm ;AN000;
2567 POP CX
2568
2569 .IF <noerror EQ true> AND
2570 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
2571
2572 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN
2573 MOV baud_specified,true ;AN000;
2574 .ENDIF ;AN000;
2575 delete_parser_value_list_entry keywords,current_parm ;AN000;
2576 INC i_CL ;AN000;
2577
2578 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
2579
2580 .IF <baud_specified EQ true> THEN ;AN000;
2581 MOV request_type,initialize_com_port ;AN000;
2582 .ELSE ;AN000;
2583 MOV message,OFFSET baud_rate_required ;AN000;
2584 MOV noerror,false
2585 .ENDIF ;AN000;
2586 MOV eol_found,true ;AN000;
2587
2588 .ELSE NEAR ;AN000;
2589
2590 CALL setup_invalid_parameter ;AN000;
2591
2592 .ENDIF ;AN000;
2593
2594 .ENDWHILE ;AN000;
2595
2596 MOV looking_for,eol ;AN000;if haven't already encountered an error then check for extraneous parms
2597
2598 BREAK 0 ;AN000;com_keyword
2599
2600
2601 status_or_eol_case:
2602
2603; status_or_eol: ;Have found the only or the last status qualifier, must find /STATUS or eol_found NExt
2604 ;Assume that /STATUS is the only switch in the appropriate parser control block
2605 ;Assume that request_type has already been set
2606
2607 CALL parse_parm ;AN000;
2608
2609 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2610 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2611 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /status
2612
2613 MOV looking_for,eol ;AN000;
2614
2615 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;encountered EOL
2616
2617 MOV eol_found,true ;AN000;
2618
2619 .ELSE ;AN000;
2620
2621 CALL setup_invalid_parameter ;AN000;
2622
2623 .ENDIF
2624
2625 BREAK 0 ;status_or_eol ;AN000;
2626
2627
2628
2629 parity_or_null_case:
2630
2631PUBLIC parity_or_null_case
2632
2633 ;the parser control blocks have paritys as strings
2634 ;modify parser control blocks list of valid paritys based on the
2635 ;machine type.
2636
2637
2638 CALL parse_parm ;AN000;
2639 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2640 MOV looking_for,databits_or_null ;AN000;can't have baud,,eol
2641 .ELSE ;AN000;
2642; CASE current_parm=
2643
2644
2645; eol:
2646
2647 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2648
2649 MOV request_type,initialize_com_port
2650 MOV eol_found,true ;AN000;
2651 BREAK 5 ;AN000;
2652
2653 .ENDIF
2654
2655; parity:
2656
2657 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2658
2659 MOV looking_for,databits_or_null ;AN000;
2660 .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AN000;
2661 .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AN000;
2662 MOV new_com_initialize,true
2663 .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2664 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2665 .ENDIF ;AN000; ;AN000;
2666 .ENDIF ;AN000;
2667
2668 .ELSE
2669
2670; otherwise:
2671
2672 CALL setup_invalid_parameter ;AN000;
2673; BREAK
2674
2675 .ENDIF ;AN000;
2676
2677 ENDCASE_5: ;current_parm
2678
2679 .ENDIF ;AN000;
2680 BREAK 0 ;AN000;parity_or_null
2681
2682
2683
2684
2685 databits_or_null_case:
2686
2687
2688PUBLIC databits_or_null_case
2689
2690 ;parser control blocks have all databits (as strings).
2691 ;modify parser control blocks to handle list of valid databits
2692 ;based on the machine type.
2693
2694;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2695;AC002; MOV five_str,deleted ;delete parser value list entry ;AN000;
2696;AC002; MOV six_str,deleted ;delete_parser_value_list_entry ;AN000;
2697;AC002; .ENDIF ;AN000;
2698
2699 ;the parser control blocks have data bits valid for this machine
2700 CALL parse_parm ;AN000;
2701 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2702 MOV looking_for,stopbits_or_null ;can't have databits,,eol
2703 .ELSE ;AN000;
2704; CASE current_parm=
2705
2706
2707; eol:
2708
2709 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2710
2711 MOV request_type,initialize_com_port ;AN000;
2712 MOV eol_found,true ;AN000;
2713 BREAK 6 ;AN000;
2714
2715 .ENDIF ;AN000;
2716
2717
2718; databits:
2719
2720 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2721
2722 MOV looking_for,stopbits_or_null ;AN000;
2723 .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002;
2724 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002;
2725 MOV new_com_initialize,true
2726 .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later
2727 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2728 .ENDIF ;AC002; ;AN000;
2729 .ENDIF ;AC002;
2730; BREAK 6 ;AN000;
2731
2732 .ELSE ;AN000;
2733
2734
2735; otherwise:
2736
2737 CALL setup_invalid_parameter ;AN000;
2738; BREAK
2739
2740 .ENDIF
2741
2742 ENDCASE_6: ;current_parm
2743
2744 .ENDIF ;AN000;
2745 BREAK 0 ;AN000;databits_or_null
2746
2747
2748
2749 stopbits_or_null_case:
2750
2751
2752PUBLIC stopbits_or_null_case
2753
2754 ;parser control blocks have all stopbits (as strings).
2755 ;modify parser control blocks to handle list of valid stopbits
2756 ;based on the machine type.
2757
2758;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2759;AC002; MOV one_point_five_str,deleted ;delete_parser_value_list_entry ;AN000;
2760;AC002; .ENDIF ;AN000;
2761
2762
2763 CALL parse_parm ;AN000;
2764 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2765 MOV looking_for,P ;AN000;no null just before eol
2766 .ELSE ;AN000;
2767; CASE current_parm=
2768
2769
2770; eol:
2771
2772 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2773
2774 MOV BYTE PTR request_type,initialize_com_port ;AN000;
2775 MOV eol_found,true ;AN000;
2776 BREAK 7 ;AN000;
2777
2778 .ENDIF
2779
2780
2781; stopbits:
2782
2783
2784 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2785
2786 MOV looking_for,P ;AN000;P or eol valid next
2787 .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002;
2788 MOV new_com_initialize,true
2789 .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later
2790 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2791 .ENDIF ;AC002; ;AN000;
2792 .ENDIF ;AC002;
2793
2794 .ELSE
2795
2796
2797; otherwise:
2798
2799 CALL setup_invalid_parameter ;AN000;
2800; BREAK
2801
2802 .ENDIF
2803
2804 ENDCASE_7: ;current_parm
2805
2806 .ENDIF ;AN000;
2807 BREAK 0 ;AN000;stopbits_or_null
2808
2809
2810
2811
2812 P_case: ;P or eol valid
2813
2814
2815PUBLIC P_case
2816
2817 ;P is in the parser control blocks' list of strings.
2818
2819 CALL parse_parm ;AN000;
2820; CASE current_parm=
2821
2822
2823
2824
2825
2826; eol:
2827
2828 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2829
2830 MOV eol_found,true ;AN000;
2831 BREAK 8 ;AN000;
2832
2833 .ENDIF
2834
2835
2836
2837; P:
2838
2839 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;found one of: p,e,b,r,n,none,off
2840
2841 MOV looking_for,eol ;AN000;found last positional
2842 MOV retry_requested,true
2843
2844 .ELSE
2845
2846
2847; otherwise:
2848
2849 CALL setup_invalid_parameter ;AN000;
2850
2851 .ENDIF
2852
2853
2854 ENDCASE_8: ;current_parm
2855
2856 BREAK 0 ;AN000;P
2857
2858
2859
2860;m
2861 prn_kw_status_cp_cl_null_case:
2862
2863 PUBLIC prn_kw_status_cp_cl_null_case
2864
2865 ;Have encountered only LPTX so far, so any printer stuff including codepage
2866 ;requests can follow. All necessary keywords and switches are in the control blocks.
2867
2868
2869 CALL parse_parm ;AN000;
2870
2871; CASE current_parm=
2872
2873; LPT_mode_keyword: ;nothing but printer keywords allowed
2874
2875
2876 .IF <parser_return_code_AX EQ no_error> AND NEAR ;AN000;
2877; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
2878; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> OR ;AN000;
2879; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET lines_equal>> OR ;AN000;
2880; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> THEN ;AN000;found a printer keyword
2881
2882
2883 check_for_lpt_keyword ;check for COLS= or LINES= or RETRY=, return results in match_found
2884 .IF <match_found EQ true> THEN NEAR
2885
2886 delete_parser_value_list_entry keywords,current_parm ;AN000;
2887 MOV parms_form,keyword ;AN000;indicate to modeprin how to deal with retry
2888 CALL parse_parm ;AN000;
2889 MOV DL,1 ;AN000;one keyword found so far
2890
2891 .REPEAT
2892
2893; CASE return_code=
2894
2895; LPT_keyword:
2896
2897
2898 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2899 PUSH DX ;save loop index
2900 check_for_lpt_keyword ;return results in match_found
2901 POP DX
2902 .IF <match_found EQ true> THEN
2903
2904 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> AND
2905 .IF <parm_list[current_parm_DI].item_tag NE NONE_item_tag> THEN
2906 MOV retry_requested,true ;set up for rescode
2907 .ENDIF
2908 delete_parser_value_list_entry keywords,current_parm ;AN000;
2909 INC DL ;AN000;found another keyword
2910 BREAK 9 ;AN000;
2911
2912 .ENDIF
2913
2914
2915; eol:
2916
2917 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2918
2919 ;had at least one keyword
2920 MOV request_type,initialize_printer_port ;AN000;
2921 MOV eol_found,true ;AN000;
2922 BREAK 9 ;AN000;
2923
2924 .ENDIF
2925
2926
2927; otherwise: ;wrong type of keywords, /STATUS etc.
2928
2929 CALL setup_invalid_parameter ;AN000;
2930; BREAK
2931
2932 ENDCASE_9:
2933
2934 PUSH DX
2935 CALL parse_parm ;AN000;
2936 POP DX
2937
2938 .UNTIL <DL EQ number_of_LPT_keywords> OR ;AN000;
2939 .UNTIL <eol_found EQ true> OR ;AN000;
2940 .UNTIL <noerror EQ false> ;AN000;
2941
2942; .IF <eol_found NE true> AND
2943 .IF <noerror EQ true> AND ;AN000;
2944 .IF <DL EQ number_of_LPT_keywords> THEN ;AN000;
2945 MOV looking_for,eol ;AN000;check for extraneous parms
2946 .ENDIF ;AN000;
2947
2948 BREAK 10
2949
2950 .ENDIF ;AN000;LPT_keyword
2951
2952
2953; /STATUS:
2954
2955 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
2956 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2957 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2958 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /STATUS
2959
2960 MOV looking_for,eol ;AN000;look for RETRY or codepage
2961 MOV slash_status,deleted ;AN000;
2962 MOV slash_stat,deleted ;AN000;
2963 MOV slash_sta,deleted ;AN000;
2964 MOV request_type,printer_status ;AN000;
2965 BREAK 10 ;AN000;keyword
2966
2967 .ENDIF ;/STATUS found ;AN000;
2968
2969
2970; codepage:
2971
2972
2973 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
2974 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
2975
2976 MOV looking_for,codepage_prms ;AN000;
2977 MOV codepage_str,deleted ;AN000;
2978 MOV code_str,deleted ;AN000;
2979 MOV cp_str,deleted ;AC007;
2980 BREAK 10 ;AN000;
2981
2982 .ENDIF ;AN000;
2983
2984
2985
2986; cl:
2987
2988 .IF <parm_list[current_parm_DI].item_tag EQ onethirtytwo_item_tag> OR ;AN000;
2989 .IF <parm_list[current_parm_DI].item_tag EQ eighty_item_tag> THEN ;AN000;
2990
2991 MOV REFRESH_str,deleted ;AC007;no codepage stuff legal
2992 MOV REF_str,deleted ;AC007;
2993 MOV SEL_equal,deleted ;AN007;
2994 MOV SELECT_equal,deleted ;AN007;
2995 MOV PREP_equal,deleted ;AN007;
2996 MOV PREPARE_equal,deleted ;AN007;
2997 MOV slash_status,deleted ;AN007;
2998 MOV slash_stat,deleted ;AN007;
2999 MOV slash_sta,deleted ;AN007;
3000 MOV looking_for,li_or_null ;AN000;
3001 MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword
3002 BREAK 10 ;AN000;
3003
3004 .ENDIF ;AN000;
3005
3006
3007
3008; eol:
3009
3010
3011 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
3012
3013 MOV request_type,turn_off_reroute ;compatible with previous MODE ;AN000;
3014 MOV eol_found,true ;AN000;
3015 BREAK 10 ;AN000;
3016
3017 .ENDIF ;AN000;
3018
3019
3020
3021; codepage_keyword_out_of_order:
3022
3023
3024 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3025 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3026 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3027 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3028
3029 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3030 MOV noerror,false ;AC007;
3031 BREAK 10 ;AN000;CON_keyword
3032
3033 .ENDIF
3034
3035
3036
3037; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3038
3039
3040 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3041
3042 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3043 MOV noerror,false ;AC007;
3044 BREAK 10
3045
3046 .ENDIF ;AC007;
3047
3048
3049
3050; null:
3051
3052 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3053 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null
3054
3055 MOV REFRESH_str,deleted ;AC007;no codepage stuff legal
3056 MOV REF_str,deleted ;AC007;
3057 MOV SEL_equal,deleted ;AN007;
3058 MOV SELECT_equal,deleted ;AN007;
3059 MOV PREP_equal,deleted ;AN007;
3060 MOV PREPARE_equal,deleted ;AN007;
3061 MOV slash_status,deleted ;AN007;
3062 MOV slash_stat,deleted ;AN007;
3063 MOV slash_sta,deleted ;AN007;
3064 MOV looking_for,li_or_null ;AN000;
3065 MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword
3066
3067
3068
3069; otherwise:
3070
3071 .ELSE ;AN000;
3072
3073 CALL setup_invalid_parameter ;AN000;
3074; BREAK ;AN000;
3075
3076 .ENDIF ;AN000;
3077
3078
3079 ENDCASE_10: ;current_parm= ;AN000;
3080 BREAK 0 ;AN000;prn_kw_status_cp_cl_null_case:
3081
3082
3083
3084
3085 li_or_null_case: ;look for lines per inch or null, eol valid
3086
3087PUBLIC li_or_null_case
3088
3089
3090 CALL parse_parm ;AN000;
3091; CASE current_parm=
3092
3093; li:
3094
3095 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> OR ;AN000;
3096 .IF <parm_list[current_parm_DI].item_tag EQ eight_item_tag> THEN ;AN000;IF found 6 or 8 THEN
3097
3098 MOV looking_for,P ;AN000;
3099 BREAK 11
3100
3101 .ENDIF
3102
3103
3104; eol:
3105
3106 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
3107
3108 MOV request_type,old_initialize_printer_port ;AN000;
3109 MOV eol_found,true ;AN000;
3110 BREAK 11 ;AN000;
3111
3112 .ENDIF
3113
3114
3115; null:
3116
3117 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3118 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null
3119
3120 MOV looking_for,P ;AN000;
3121 BREAK 11 ;AN000;
3122
3123 .ENDIF
3124
3125
3126; otherwise:
3127
3128 CALL setup_invalid_parameter ;AN000;
3129; BREAK
3130
3131
3132 ENDCASE_11: ;current_parm ;AN000;
3133 BREAK 0 ;AN000;li_or_null
3134
3135
3136;m
3137 codepage_prms_case:
3138
3139
3140 ;The desired codepage parameters are in the parser control blocks, such
3141 ;as: the keywords, PREPARE, REFRESH, and /STATUS.
3142 CALL parse_parm ;AN000;
3143; CASE current_parm=
3144
3145
3146; REFRESH:
3147
3148 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AN000;
3149
3150 MOV request_type,codepage_refresh ;AN000;
3151 MOV looking_for,eol
3152 BREAK 12
3153
3154 .ENDIF
3155
3156
3157; PREPARE=:
3158
3159
3160 ;Have to parse ((cplist) [filename])
3161
3162 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AN000;
3163 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> THEN NEAR ;AN000;IF PREPARE= THEN
3164
3165 .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN NEAR ;AN000;should have found ((cplist) filename)
3166 PUSH SI ;AN000;save pointer to first char past the closing right paren
3167 MOV AX,parm_list[current_parm_DI].value1 ;AN000;
3168 MOV command_line,AX ;AN000;point at first char past the left paren
3169 SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list
3170 MOV parms.parmsx_ptr,OFFSET prepare_equal_parmsx
3171 MOV prepare_equal_match_flags,complex ;AN000;only thing valid next
3172 CALL parse_parm ;AN000;
3173 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3174 .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN ;AN000;assume have ((cplist) filename)
3175 PUSH SI ;AN000;save pointer to first char past the closing right paren
3176 MOV AX,parm_list[current_parm_DI].value1 ;AN000;
3177 MOV command_line,AX ;AN000;point at first char past the left paren
3178 SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list
3179 MOV prepare_equal_match_flags,numeric+optional ;AN000;number or delimeter only things valid next
3180 MOV ordinal,0 ;AN000;zap parms count,make parser count codepage numbers
3181 .REPEAT ;AN000;
3182 CALL parse_parm ;AN000;
3183 .IF <parser_return_code_AX EQ no_error> THEN ;AN000; ;AN000;
3184 ADD des_start_packet.des_strt_pklen,2 ;increment size of parm block for another cp number
3185 INC des_start_packet.des_strt_pknum ;increment number of cp numbers
3186 ADD current_packet_cp_number,2 ;address next code page number slot
3187 MOV SI,current_packet_cp_number
3188 MOV BP,OFFSET des_start_packet
3189 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF not skipped slot THEN
3190 MOV DX,parm_list[current_parm_DI].value1 ;AN000;store the number if one specified for this slot
3191 MOV [SI][BP].des_strt_pkcp1,DX ;put the number in the slot for the cp number
3192 .ENDIF ;AN000;not valid skipped codepage number, i.e. not (,850,,865) for example
3193 .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000;
3194 SUB DI,TYPE parm_list_entry ;don't want an entry in the parm list for the zeroed out ")"
3195 .ELSE
3196 CALL setup_invalid_parameter ;AN000;
3197 .ENDIF ;AN000;
3198 .UNTIL <parser_return_code_AX EQ end_of_complex> OR ;AN000;came to end of the cplist
3199 .UNTIL <noerror EQ false>
3200 POP command_line ;AN000;resume just after the closing paren of (cplist), should be at ) or filename
3201 .ELSE ;AN000;must be an error
3202 MOV message,OFFSET invalid_number_of_parameters ;AN000;
3203 MOV noerror,false ;AN000;
3204 .ENDIF
3205 .IF <noerror EQ true> THEN ;AN000;IF successfully broke down cplist and file name THEN
3206 MOV prepare_equal_match_flags,filespec+optional ;AN000;only thing valid is filespec
3207 MOV ordinal,0 ;AN000;don't need parser to count the parms anymore
3208 MOV prepare_min_parms,0 ;AN000;filename is optional
3209; A filespec may be next so colon cannot be a delimeter.
3210 modify_parser_control_block seperator_list,delete,colon ;AN000;want to find a keyword so don't stop on colons
3211 CALL parse_parm ;AN000;
3212 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
3213 MOV AX,parm_list[current_parm_DI].value1 ;AN000;AX=OFFSET of filespec just encountered
3214 MOV cp_cb.font_filespec,AX ;AN000;set up pointer to filespec for modecp
3215 .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000;cartridge prepare, no filename
3216 MOV des_start_packet.des_strt_pkfl,DES_STRT_FL_CART ; 0001H=CARTRIDGE PREPARE,
3217 .ELSE ;AN000;
3218 CALL setup_invalid_parameter ;AN000;
3219 .ENDIF ;AN000;
3220 MOV request_type,codepage_prepare ;AN000;if encountered an error won't continue anyways
3221 .ENDIF ;AN000;
3222 POP command_line ;AN000;continue parsing after the origional complex, should be eol
3223 .ELSE ;AN000;
3224 MOV message,OFFSET invalid_number_of_parameters ;AN000;should have found a complex
3225 MOV noerror,false ;AN000;
3226 .ENDIF
3227
3228 MOV looking_for,eol ;AN000;
3229
3230 BREAK 12 ;AN000;
3231
3232 .ENDIF
3233
3234
3235; SELECT=:
3236
3237
3238dummy1:
3239PUBLIC DUMMY1
3240 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AN000;
3241 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AN000;
3242
3243 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
3244 MOV codepage_index_holder,current_parm_DI ;AN000;save index of the codepage parm list entry for invoke
3245 MOV request_type,codepage_select ;AN000;
3246 MOV looking_for,eol ;AN000;
3247 .ELSE ;AN000;
3248 CALL setup_invalid_parameter ;AN000;
3249 .ENDIF
3250
3251 BREAK 12 ;AN000;
3252
3253 .ENDIF
3254
3255
3256
3257; /STATUS:
3258
3259
3260 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3261 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3262 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC002;
3263 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3264
3265 MOV request_type,codepage_status ;AN000;
3266;AX322; .IF <device_name EQ <OFFSET CON_str>> THEN
3267 MOV looking_for,eol ;AC322;
3268;AX322; .ELSE
3269;AX322; MOV looking_for,eol ;AN000;
3270;AX322; .ENDIF
3271 BREAK 12 ;AN000;
3272
3273 .ENDIF
3274
3275
3276; eol:
3277
3278 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3279
3280 MOV request_type,codepage_status ;AN000;
3281 MOV eol_found,true ;AN000;
3282 BREAK 12 ;AN000;
3283
3284 .ENDIF
3285
3286
3287; otherwise:
3288
3289 CALL setup_invalid_parameter ;AN000;
3290; BREAK
3291
3292
3293 ENDCASE_12: ;current_parm=
3294
3295
3296 BREAK 0 ;AN000;
3297
3298
3299
3300
3301 codepage_case: ;found PRN, only valid parms are CODEPAGE, and /STATUS
3302 ;/STATUS is in the the parser control blocks
3303
3304 CALL parse_parm ;AN000;
3305; CASE current_parm=
3306
3307; CODEPAGE:
3308
3309 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
3310 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
3311
3312 ;set up for codepage_prms_case
3313; modify_parser_control_block keywords,addd,codepage_keywords ;AN000;codepage parms handler assumes keywords setup
3314 MOV looking_for,codepage_prms ;AN000;
3315 BREAK 13 ;AN000;
3316
3317 .ENDIF
3318
3319
3320; /STATUS: ;only CODEPAGE or end of line valid next
3321
3322 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3323 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3324 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3325 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3326
3327 CALL parse_parm ;AN000;
3328 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;
3329 MOV looking_for,eol ;AN000;
3330 MOV status_request,true
3331 MOV request_type,codepage_status ;AN000;
3332 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3333 MOV eol_found,true ;AC005;
3334 MOV status_request,true ;AC005;
3335 MOV request_type,codepage_status ;AC005;
3336 .ELSE ;AN000;
3337 CALL setup_invalid_parameter ;AN000;
3338 .ENDIF
3339 BREAK 13 ;AN000;
3340
3341 .ENDIF
3342
3343
3344; eol:
3345
3346 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3347
3348 MOV request_type,codepage_status ;AN000;
3349 MOV eol_found,true ;AN000;
3350 BREAK 13 ;AN000;
3351
3352 .ENDIF
3353
3354
3355
3356; codepage_keyword_out_of_order:
3357
3358
3359 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3360 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3361 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3362 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3363
3364 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3365 MOV noerror,false ;AC007;
3366 BREAK 13 ;AN000;CON_keyword
3367
3368 .ENDIF
3369
3370
3371
3372; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3373
3374
3375 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3376
3377 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3378 MOV noerror,false ;AC007;
3379; BREAK 13
3380
3381 .ELSE ;AC007;
3382
3383
3384
3385; otherwise:
3386
3387 CALL setup_invalid_parameter ;AN000;
3388; BREAK
3389
3390 .ENDIF ;AC007;
3391
3392 ENDCASE_13:
3393
3394 BREAK 0 ;AN000;
3395
3396
3397
3398 con_kwrd_status_or_cp_case:
3399
3400 PUBLIC con_kwrd_status_or_cp_case
3401
3402 MOV parms.parmsx_ptr,OFFSET con_parmsx
3403 CALL parse_parm ;AN000;
3404
3405; CASE current_parm=
3406
3407
3408
3409; codepage:
3410
3411 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
3412 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
3413
3414 MOV looking_for,codepage_prms ;AN000;
3415 BREAK 14 ;AN000;
3416
3417 .ENDIF
3418
3419
3420; eol:
3421
3422 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3423
3424 MOV request_type,all_con_status ;AN000;found only CON on the command line
3425 MOV eol_found,true ;AN000;
3426 BREAK 14 ;AN000;
3427
3428 .ENDIF
3429
3430
3431
3432; /STATUS:
3433
3434 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3435 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3436 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3437
3438 MOV slash_status,deleted ;AN000;
3439 MOV slash_stat,deleted ;AN000;
3440 MOV slash_sta,deleted ;AN000;
3441 MOV request_type,all_con_status ;AN000;found only CON on the command line
3442 MOV looking_for,eol ;AC665;have MODE CON /STATUS, must find eol now
3443 BREAK 14 ;AN000;
3444
3445 .ENDIF
3446
3447
3448
3449; con_keyword:
3450
3451
3452 .IF <parser_return_code_AX EQ no_error> AND ;make sure invalid value not specified ;AN000;
3453 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not pointing to /sta, not 0, must be a keyword
3454
3455 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000;
3456 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000;
3457 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000;
3458 INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000;
3459 .ELSEIF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3460 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3461 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3462 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3463 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3464 MOV noerror,false ;AC007;
3465 .ELSE
3466 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLUMNS_equal>> AND ;AC007;
3467 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLS_equal>> AND ;AC007;
3468 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET lines_equal>> THEN ;AC007;
3469 CALL setup_invalid_parameter ;AC007;keyword other than LINES=, COLS=, RATE= or DELAY= would require CP
3470 .ENDIF ;AC007;and be handled above
3471 .ENDIF ;AN000;
3472 delete_parser_value_list_entry keywords,current_parm ;AN000;doesn't affect anything if invalid parm
3473 MOV looking_for,CON_keyword ;AN000;doesn't affect anything if invalid parm
3474 BREAK 14 ;AN000;CON_keyword
3475
3476 .ENDIF
3477
3478
3479
3480; REFRESH: ;AC007;forgot to include "CP"
3481
3482
3483 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3484
3485 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3486 MOV noerror,false ;AC007;
3487; BREAK
3488
3489 .ELSE ;AC007;
3490
3491
3492
3493; otherwise:
3494
3495 CALL setup_invalid_parameter ;AN000;
3496; BREAK
3497
3498 .ENDIF ;AC007;
3499
3500
3501
3502 ENDCASE_14:
3503 BREAK 0 ;AN000;con_kwrd_status_or_cp_case:
3504
3505
3506
3507
3508 con_keyword_case: ;found one, it has been deleted from the parser control blocks
3509 PUBLIC con_keyword_case
3510
3511 MOV slash_status,deleted ;AN000;remove /STA /STAT and STATUS
3512 MOV slash_stat,deleted ;AN000;
3513 MOV slash_sta,deleted ;AN000;
3514
3515 MOV i_CL,1 ;AN000;
3516 .WHILE <i_CL LT number_of_con_keywords> AND ;AN000;
3517 .WHILE <eol_found EQ false> AND ;AN000;
3518 .WHILE <noerror EQ true> DO ;AN000;
3519 PUSH CX
3520
3521 CALL parse_parm ;AN000;
3522
3523; CASE return_code=
3524
3525; con_keyword:
3526
3527 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3528 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not 0, must be a keyword ;AN000;
3529
3530 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000;
3531 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000;
3532 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000;
3533 INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000;
3534 .ENDIF
3535 delete_parser_value_list_entry keywords,current_parm ;AN000;
3536 INC i_CL ;AN000;
3537 BREAK 15 ;AN000;
3538
3539 .ENDIF ;AN000;
3540
3541
3542; eol:
3543
3544 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3545
3546 .IF <rate_and_delay_found EQ both> OR ;IF both OR neither found THEN
3547 .IF <rate_and_delay_found EQ false> THEN
3548 MOV request_type,set_con_features ;AN000;
3549 MOV eol_found,true ;AN000;
3550 .ELSE
3551 MOV message,OFFSET rate_and_delay_together ;RATE and DELAY must be specified together
3552 MOV noerror,false
3553 .ENDIF
3554 BREAK 15 ;AN000;
3555
3556 .ENDIF
3557
3558
3559; otherwise:
3560
3561 CALL setup_invalid_parameter ;AN000;
3562; BREAK
3563
3564 ENDCASE_15:
3565
3566 POP CX
3567
3568 .ENDWHILE ;AN000;
3569
3570 MOV looking_for,eol ;AN000;check for extraneous parms
3571
3572 BREAK 0 ;AN000;CON_keyword
3573
3574
3575
3576
3577 sd_or_dl_or_eol_case:
3578
3579PUBLIC sd_or_dl_or_eol_case
3580
3581 ;have found a screen mode, now may find sd, dl, or eol
3582
3583 CALL parse_parm ;AN000;
3584; CASE current_parm=
3585
3586; sd: ;found R or L
3587
3588 .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000;
3589 .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000;
3590
3591 MOV looking_for,T_or_EOL ;AN000;request_type already set
3592 BREAK 17 ;AN000;
3593
3594 .ENDIF
3595
3596; dl:
3597
3598 .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000;
3599 .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000;
3600 .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000;
3601
3602 MOV looking_for,eol ;AN000;request_type already set
3603 BREAK 17 ;AN000;
3604
3605 .ENDIF
3606
3607
3608
3609; eol:
3610
3611 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3612
3613 MOV eol_found,true ;AN000;request_type already set
3614 BREAK 17 ;AN000;
3615
3616 .ENDIF
3617
3618
3619; otherwise: regardless of what follows must have a parm here, didn't so yell
3620
3621 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between
3622 MOV message,OFFSET Invalid_number_of_parameters ;AN000;
3623 MOV noerror,false ;AN000;
3624 .ELSE ;AN000;
3625 CALL setup_invalid_parameter ;AN000;some bogus value or string
3626 .ENDIF ;AN000;
3627
3628; BREAK
3629
3630
3631 ENDCASE_17:
3632 BREAK 0 ;AN000;sd_or_dl_or_null
3633
3634
3635
3636 sd_or_dl_case:
3637
3638PUBLIC sd_or_dl_case
3639
3640 ;have no first parm, now must find shift direction or screen lines
3641
3642
3643 CALL parse_parm ;AN000;
3644; CASE current_parm=
3645
3646; sd:
3647
3648 .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000;
3649 .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000;
3650
3651 MOV looking_for,T_or_EOL ;AN000;
3652 MOV request_type,old_video_mode_set ;AN000;
3653 BREAK 18 ;AN000;
3654
3655 .ENDIF
3656
3657
3658; dl:
3659
3660 .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000;
3661 .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000;
3662 .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000;
3663
3664 MOV request_type,old_video_mode_set ;AN000;
3665 MOV looking_for,eol ;AN000;
3666 BREAK 18 ;AN000;
3667
3668 .ENDIF
3669
3670
3671
3672; eol:
3673
3674 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3675
3676 MOV message,OFFSET invalid_number_of_parameters ;AN000;
3677 MOV noerror,false ;AN000;
3678 MOV eol_found,true ;AN000;
3679 BREAK 18 ;AN000;
3680
3681 .ENDIF
3682
3683
3684; otherwise:
3685
3686 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between
3687 MOV message,OFFSET Invalid_number_of_parameters ;AN000;
3688 MOV noerror,false ;AN000;
3689 .ELSE ;AN000;
3690 CALL setup_invalid_parameter ;AN000;some bogus value or string
3691 .ENDIF ;AN000;
3692; BREAK
3693
3694 ENDCASE_18:
3695 BREAK 0 ;AN000;sd_or_dl
3696
3697
3698
3699 T_or_EOL_case:
3700
3701
3702 CALL parse_parm ;AN000;
3703
3704; CASE current_parm=
3705
3706; T:
3707
3708 .IF <parm_list[current_parm_DI].item_tag EQ T_item_tag> THEN ;AN000;
3709
3710 MOV looking_for,eol ;AN000;request_type already set
3711 BREAK 19 ;AN000;
3712
3713 .ENDIF
3714
3715; eol:
3716
3717 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3718
3719 MOV eol_found,true ;AN000;request_type already set
3720 BREAK 19 ;AN000;
3721
3722 .ENDIF
3723
3724
3725; otherwise:
3726
3727 CALL setup_invalid_parameter ;AN000;
3728; BREAK
3729
3730 ENDCASE_19:
3731 BREAK 0 ;AN000;
3732
3733
3734
3735 device_name_or_eol_case: ;have only /status so far
3736
3737 ;The device names are in the parser control blocks
3738
3739 CALL parse_parm
3740; CASE current_parm=
3741
3742; COM?:
3743
3744 MOV device_name,OFFSET COM1_str ;AC001;
3745 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
3746 MOV device_name,OFFSET COM2_str ;AC001;
3747 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
3748 MOV device_name,OFFSET COM3_str ;AC001;
3749 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
3750 MOV device_name,OFFSET COM4_str ;AC001;
3751 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
3752
3753 MOV looking_for,eol ;AN000;
3754 MOV request_type,com_status ;AN000;
3755
3756 BREAK 20 ;AN000;
3757
3758 .ENDIF
3759
3760
3761; LPT?,
3762 PRN:
3763
3764 MOV device_name,OFFSET LPT1_str ;AC001;
3765 .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> OR ;AN000;
3766 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
3767 MOV device_name,OFFSET LPT2_str ;AC001;
3768 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
3769 MOV device_name,OFFSET LPT3_str ;AC001;
3770 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
3771
3772 MOV looking_for,eol ;AN000;
3773 MOV request_type,printer_status ;AN000;
3774 BREAK 20 ;AN000;
3775
3776 .ENDIF
3777
3778
3779
3780; CON:
3781
3782 .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000;
3783
3784 MOV looking_for,eol ;AN000;
3785 MOV request_type,all_con_status ;AN000;
3786 BREAK 20 ;AN000;
3787
3788 .ENDIF
3789
3790
3791; eol:
3792
3793 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3794
3795 MOV request_type,status_for_everything ;AN000;
3796 MOV eol_found,true ;AN000;
3797 BREAK 20 ;AN000;
3798
3799 .ENDIF
3800
3801
3802; otherwise:
3803
3804 CALL setup_invalid_parameter ;AN000;
3805; BREAK
3806
3807 ENDCASE_20:
3808 BREAK 0 ;AN000;device_name_or_eol
3809
3810
3811 first_parm_case: ;AN000;
3812
3813
3814PUBLIC first_parm_case
3815
3816 ;set up for calls to system parser
3817
3818 MOV command_line,OFFSET first_char_in_command_line ;AN000;start parser at beginning of the command line
3819 MOV BX,OFFSET parm_lst ;set up parm_list ;AN000;
3820 XOR DI,DI ;AN000;
3821 SUB DI,TYPE parm_list_entry ;AN000;DI is negative, set up for first call to parse_parm
3822
3823 MOV parms.parmsx_ptr,OFFSET parmsx ;AN000;set up parms block for parser input
3824
3825 CALL parse_parm ;AN000;parse first parm, fill in "parm_list[current_parm_DI]" with the results
3826
3827; CASE current_parm=
3828
3829dummy5:
3830PUBLIC dummy5
3831
3832; /status:
3833
3834 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3835 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3836 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3837
3838 MOV slash_status,deleted ;AN000;make it so /status again is an error
3839 MOV slash_stat,deleted ;AN000;
3840 MOV slash_sta,deleted
3841 MOV looking_for,device_name_or_eol ;AN000;
3842 BREAK 21 ;AN000;
3843
3844 .ENDIF
3845
3846
3847; null: ;no first parm
3848
3849 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3850 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN000;valid null
3851
3852 MOV looking_for,sd_or_dl ;AN000;
3853 MOV parms.parmsx_ptr,OFFSET old_con_parmsx
3854 MOV ordinal,0 ;AN000;start over with new parmsx block
3855 MOV device_name,OFFSET CON_str
3856 MOV request_type,old_video_mode_set ;AN000;
3857 BREAK 21 ;AN000;
3858
3859 .ENDIF
3860
3861
3862 screen_modes: ;first parm is 80, BW80, MONO etc.
3863
3864 PUBLIC screen_modes
3865
3866 .IF <parm_list[current_parm_DI].item_tag GE first_screen_mode_item_tag> AND ;AN000;
3867 .IF <parm_list[current_parm_DI].item_tag LE last_screen_mode_item_tag> THEN ;AN000;
3868
3869 MOV parms.parmsx_ptr,OFFSET old_con_parmsx
3870 MOV ordinal,0 ;AN000;start over with new parmsx block
3871 MOV device_name,OFFSET CON_str
3872 MOV looking_for,sd_or_dl_or_eol ;AN000;
3873 MOV request_type,old_video_mode_set ;AN000;
3874 BREAK 21 ;AN000;
3875
3876 .ENDIF
3877
3878
3879
3880; LPT?132,
3881; LPT?80:
3882
3883 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3884 MOV device,"1" ;AC664;set up message
3885 MOV LPTNO,"1" ;see modeprin
3886 MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,onethirtytwo_item_tag ;AN000;save chars/line
3887 .IF <parm_list[current_parm_DI].item_tag EQ LPT1132_item_tag> OR ;AN000;
3888 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3889 MOV LPTNO,"2" ;see modeprin
3890 MOV device,"2" ;AC664;set up message
3891 .IF <parm_list[current_parm_DI].item_tag EQ LPT2132_item_tag> OR ;AN000;
3892 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3893 MOV LPTNO,"3" ;see modeprin
3894 MOV device,"3" ;AC664;set up message
3895 .IF <parm_list[current_parm_DI].item_tag EQ LPT3132_item_tag> OR ;AN000;
3896 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3897 MOV device,"1" ;AC664;set up message
3898 MOV LPTNO,"1" ;see modeprin
3899 MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,eighty_item_tag ;AN000;save chars/line
3900 .IF <parm_list[current_parm_DI].item_tag EQ LPT180_item_tag > OR ;AN000;
3901 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3902 MOV LPTNO,"2" ;see modeprin
3903 MOV device,"2" ;AC664;set up message
3904 .IF <parm_list[current_parm_DI].item_tag EQ LPT280_item_tag > OR ;AN000;
3905 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3906 MOV LPTNO,"3" ;see modeprin
3907 MOV device,"3" ;AC664;set up message
3908 .IF <parm_list[current_parm_DI].item_tag EQ LPT380_item_tag > THEN ;AN000;
3909
3910
3911 ADD DI,TYPE parm_list_entry ;AN000;already have chars per line so skip to next element in list
3912 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
3913 MOV REFRESH_str,deleted ;AN007;no codepage stuff legal
3914 MOV REF_str,deleted ;AN007;
3915 MOV SEL_equal,deleted ;AN007;
3916 MOV SELECT_equal,deleted ;AN007;
3917 MOV PREP_equal,deleted ;AN007;
3918 MOV PREPARE_equal,deleted ;AN007;
3919 MOV ordinal,1 ;AN000;already found chars per line (cl)
3920 MOV looking_for,li_or_null ;AN000;
3921 MOV device_type,LPTX ;AN000;
3922 MOV request_type,old_initialize_printer_port ;AN000;
3923 BREAK 21 ;AN000;
3924
3925 .ELSE ;AN000;clean up after dorking the next parameter
3926 ADD DI,TYPE parm_list_entry ;AN000;point to next entry, the one that needs to be reinitialized
3927 CALL reset_parm_pointer ;AN000;reinitialize the second parm entry, DEC DI
3928 .ENDIF
3929
3930
3931
3932; LPT1:=,
3933; LPT1=,
3934; LPT2:=,
3935; LPT2=,
3936; LPT3:=,
3937; LPT3=:
3938
3939
3940 ;have control blocks set up to find COM strings as value of keyword
3941
3942 MOV lptno,0 ;lptno=BIOS digestable printer number for LPT1 set up for modeecho
3943 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_colon_equal>> OR ;AN000;
3944 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_equal>> OR ;AN000;
3945 MOV lptno,1 ;set up for modeecho
3946 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_colon_equal>> OR ;AN000;
3947 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_equal>> OR ;AN000;
3948 MOV lptno,2 ;set up for modeecho
3949 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_colon_equal>> OR ;AN000;
3950 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_equal>> THEN ;AN000;
3951 MOV device,"1" ;set up for call to modeecho
3952 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
3953 MOV device,"2" ;set up for call to modeecho
3954 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
3955 MOV device,"3" ;set up for call to modeecho
3956 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
3957 MOV device,"4" ;set up for call to modeecho
3958 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
3959
3960 MOV looking_for,eol ;AN000;
3961 MOV request_type,printer_reroute ;AN000;
3962 MOV reroute_requested,true ;AN000;
3963 MOV device_type,LPTX
3964 BREAK 21 ;AN000;
3965
3966 .ELSE ;AN000;
3967 MOV message,OFFSET com1_or_com2 ;AN000;"Must specify COM1, COM2, COM3 or COM4"
3968 .ENDIF
3969 .ENDIF
3970
3971
3972
3973; LPTX,: found "LPTX," so chars per line has been skipped
3974
3975 .IF <terminating_delimeter EQ comma> AND NEAR ;AC007;handle other cases later, looking only for "LPTX," now
3976 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3977 MOV device,"1" ;AC664;set up message
3978 MOV LPTNO,"1" ;see modeprin
3979 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
3980 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3981 MOV LPTNO,"2" ;see modeprin
3982 MOV device,"2" ;AC664;set up message
3983 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
3984 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3985 MOV LPTNO,"3" ;see modeprin
3986 MOV device,"3" ;AC664;set up message
3987 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
3988
3989 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
3990 MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000;
3991 MOV lines_match_flag,simple_string ;AN000;printer lines values are strings
3992 MOV REFRESH_str,deleted ;AN007;no codepage stuff legal
3993 MOV REF_str,deleted ;AN007;
3994 MOV SEL_equal,deleted ;AN007;
3995 MOV SELECT_equal,deleted ;AN007;
3996 MOV PREP_equal,deleted ;AN007;
3997 MOV PREPARE_equal,deleted ;AN007;
3998 MOV ordinal,1 ;AN000;new parmsx, skip chars per line positional
3999 ADD DI,TYPE parm_list_entry ;create entry for skipped chars per line ;AN000;
4000 MOV looking_for,li_or_null ;AN000;
4001 MOV device_type,LPTX ;for rescode
4002 MOV request_type,old_initialize_printer_port ;AN000;
4003 BREAK 21 ;AN000;
4004
4005 .ENDIF
4006
4007
4008
4009
4010; need to use colon as a delimeter in following cases
4011
4012 modify_parser_control_block seperator_list,addd,colon ;AN000;want to stop on colons
4013
4014 CALL reset_parm_pointer ;reset to first entry in the parm list
4015 MOV ordinal,0 ;start with the first parm again
4016 MOV command_line,OFFSET first_char_in_command_line ;look at first part of command line again
4017 CALL parse_parm ;AN000;parse the first parm again
4018
4019
4020; COM?:
4021
4022
4023 MOV device_name,OFFSET COM1_str ;AN000;assume COM1
4024 MOV device,"1" ;AN000;set up message
4025 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
4026 MOV device_name,OFFSET COM2_str ;AN000;assume COM2
4027 MOV device,"2" ;AN000;set up message
4028 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
4029 MOV device_name,OFFSET COM3_str ;AN000;assume COM3
4030 MOV device,"3" ;AN000;;set up message
4031 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
4032 MOV device_name,OFFSET COM4_str ;AN000;assume COM4
4033 MOV device,"4" ;AN000;;set up message
4034 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
4035
4036 MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000;
4037 MOV ordinal,0 ;AN000;new parmsx, start with new number of positionals, start at first one
4038 MOV looking_for,com_keyword_or_baud ;AN000;
4039 MOV device_type,COMX ;AN000;;set up for rescode
4040 BREAK 21 ;AN000;
4041
4042 .ENDIF
4043
4044
4045
4046; LPT?:
4047
4048 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
4049 MOV device,"1" ;AC664;set up message
4050 MOV LPTNO,"1" ;see modeprin
4051 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
4052 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
4053 MOV LPTNO,"2" ;see modeprin
4054 MOV device,"2" ;AC664;set up message
4055 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
4056 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
4057 MOV LPTNO,"3" ;see modeprin
4058 MOV device,"3" ;AC664;set up message
4059 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
4060
4061 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
4062 MOV columns_value_ptr,OFFSET LPT_columns_values ;AN000;
4063 MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000;
4064 MOV columns_match_flag,simple_string ;AN000;printer columns values are strings
4065 MOV lines_match_flag,simple_string ;AN000;printer lines values are strings
4066 MOV ordinal,0 ;AN000;new parmsx so start over counting positionals
4067 MOV looking_for,prn_kw_status_cp_cl_null ;AN000;
4068 MOV device_type,LPTX ;for rescode
4069 BREAK 21 ;AN000;
4070
4071 .ENDIF
4072
4073
4074; PRN:
4075
4076 .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> THEN ;AN000;
4077
4078 MOV looking_for,codepage ;AN000;
4079 MOV device_name,OFFSET LPT1_str ;AN000;
4080 BREAK 21 ;AN000;
4081
4082 .ENDIF
4083
4084
4085; CON:
4086
4087 .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000;
4088
4089 MOV parms.parmsx_ptr,OFFSET con_parmsx ;AN000;set up for con parms
4090 MOV ordinal,0 ;AN000;start over with new parmsx block
4091 MOV looking_for,BYTE PTR con_kwrd_status_or_cp ;AN000;
4092 MOV device_name,OFFSET CON_str
4093 BREAK 21
4094
4095 .ENDIF
4096
4097
4098
4099; eol: ;no parms specified
4100
4101 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
4102
4103 MOV request_type,status_for_everything ;AN000;
4104 MOV eol_found,true ;AN000;
4105 BREAK 21 ;AN000;
4106
4107 .ENDIF
4108
4109
4110
4111; COM?baud:
4112
4113
4114 MOV parms.parmsx_ptr, OFFSET mutant_COM_parmsx
4115 ;for i in 1 through 4 see if the parm is COMi
4116 MOV match_found,false ;AN000;
4117 MOV i_CL,0 ;AN000;CL:="1"
4118 .WHILE <i_CL LT 4> AND ;AN000;
4119 .WHILE <match_found EQ false> DO ;AN000;
4120 CALL reset_parm_pointer ;AN000;prepare to reparse the parm
4121 INC i_CL ;AN000;use next number as a delimeter
4122 MOV parm_list[current_parm_DI].item_tag,i_CL ;AN000;depends on COM1 thru 4 item tags being 1 thru 4
4123 PUSH CX ;AN000;save the loop counter (the binary form)
4124 ADD i_CL,binary_to_ASCII ;CL=ASCII representation of the index
4125 modify_parser_control_block seperator_list,addd,i_CL ;AN000;make the number (1 to 4)a seperator
4126 MOV ordinal,0 ;AN000;look at first parm each time
4127 MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line each time
4128 PUSH CX ;AN000;save the delimeter (ASCII form)
4129 CALL parse_parm ;AN000;
4130; .IF <parm_list[current_parm_DI].item_tag EQ COM_item_tag> THEN ;AN000;isloated "COM" so found "COM?"
4131 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;isloated "COM" so found "COMx"
4132 MOV match_found,true ;AN000;
4133 .ENDIF
4134 POP CX ;AN000;restore the ASCII delimeter
4135 modify_parser_control_block seperator_list,delete,i_CL ;AN000;fix parser control blocks
4136 POP CX ;restore the loop counter
4137 .ENDWHILE ;AN000;
4138 .IF <match_found EQ true> THEN ;AN000;IF have COMX THEN look for valid baud
4139 .IF <i_CL EQ 1> THEN ;AN000;
4140 MOV device_name,OFFSET COM1_str ;AN000;
4141 MOV parm_list[current_parm_DI].value1,OFFSET COM1_str ;AN000;setup for modecom existence check
4142 MOV device,"1" ;AN000;set up message
4143 .ELSEIF <i_CL EQ 2> THEN ;AN000;
4144 MOV device_name,OFFSET COM2_str ;AN000;
4145 MOV parm_list[current_parm_DI].value1,OFFSET COM2_str ;AN000;setup for modecom existence check
4146 MOV device,"2" ;AN000;set up message
4147 .ELSEIF <i_CL EQ 3> THEN ;AN000;
4148 MOV device_name,OFFSET COM3_str ;AN000;
4149 MOV parm_list[current_parm_DI].value1,OFFSET COM3_str ;AN000;setup for modecom existence check
4150 MOV device,"3" ;AN000;set up message
4151 .ELSE;IF <i_CL EQ 4> THEN ;AN000;
4152 MOV device_name,OFFSET COM4_str ;AN000;
4153 MOV parm_list[current_parm_DI].value1,OFFSET COM4_str ;AN000;setup for modecom existence check
4154 MOV device,"4" ;AN000;set up message
4155 .ENDIF ;AN000;
4156
4157 MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000;
4158 MOV ordinal,0 ;AN000;start with baud in new parmsx
4159 MOV looking_for,com_keyword_or_baud ;AN000;
4160 MOV device_type,COMX ;set up for rescode
4161 BREAK 21 ;AN000;
4162
4163
4164; otherwise: ;first parm was nothing recognizable
4165
4166 .ELSE
4167
4168dummy4:
4169PUBLIC dummy4
4170
4171 MOV ordinal,0 ;AN000;parse first parm again
4172 MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line one more time
4173 modify_parser_control_block seperator_list,addd,"." ;AN000;want to stop on periods
4174 modify_parser_control_block seperator_list,addd,'"' ;AN000;want to stop on quotes
4175 modify_parser_control_block seperator_list,addd,'\' ;AN000;want to stop on back slashes
4176 modify_parser_control_block seperator_list,addd,'[' ;AN000;want to stop on left brackets
4177 modify_parser_control_block seperator_list,addd,']' ;AN000;want to stop on right brackets
4178 modify_parser_control_block seperator_list,addd,'+' ;AN000;want to stop on plus signs
4179;AC003; modify_parser_control_block seperator_list,addd,';' ;AN000;want to stop on semicolons
4180
4181 CALL parse_parm
4182 CALL setup_invalid_parameter ;AN000;
4183; BREAK
4184
4185 .ENDIF
4186
4187 ENDCASE_21:
4188
4189 BREAK 0 ;AN000;first_parm
4190
4191
4192
4193 eol_case:
4194
4195 CALL parse_parm ;AN000;
4196 .IF <parser_return_code_AX NE end_of_command_line> THEN ;AN000;
4197 MOV message,OFFSET invalid_number_of_parameters ;AN000;
4198 MOV noerror,false ;AN000;
4199 .ELSE NEAR ;AN000;
4200 MOV eol_found,true ;AN000;
4201 .ENDIF
4202; BREAK
4203
4204
4205
4206 ENDCASE_0: ;AN000;looking_for=
4207
4208.ENDWHILE ;AN000;
4209
4210.IF <message NE no_message> THEN
4211 display message
4212.ENDIF
4213
4214RET
4215
4216parse_parameters ENDP
4217
4218
4219
4220
4221
4222
4223
4224;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4225
4226;³ SEPERATOR_LIST
4227;³ --------------
4228
4229;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
4230;³ become apparent and the parser control blocks need to be changed to correctly
4231;³ parse the next parm. This procedure is responsible for manipulating the
4232;³ list of seperators as requested.
4233
4234
4235
4236
4237;³ INPUT: action (in BX) - A scalar immediate indicating whether the seperator
4238;³ is to be added or deleted.
4239
4240;³ seperator_charactor (in AL) - The seperator character to be added or
4241;³ deleted from the seperator list
4242
4243
4244;³ RETURN: none
4245
4246
4247;³ MESSAGES: none
4248
4249
4250
4251;³ REGISTER
4252;³ USAGE:
4253
4254
4255
4256;³ CONVENTIONS:
4257
4258
4259;³ ASSUMPTIONS: The character exists in the list before it is deleted.
4260;³ A character being added is not already in the list.
4261;³ There is no "extra end of line list".
4262;³ Direction flag is cleared so REPs will increment index reg
4263;³ ES and DS are the same and address data
4264
4265
4266
4267
4268
4269
4270;³ SIDE EFFECT:
4271
4272
4273
4274
4275
4276;³ LOGIC:
4277
4278
4279;³ CASE action=
4280
4281;³ add:
4282
4283;³ skip to end of seperators list ;use parms.seperators_len to find end
4284;³ overwrite zero with AL
4285;³ overwrite blank space holder in the delimeter list with AL
4286;³ INC parms.seperators_len
4287;³ BREAK
4288
4289
4290;³ delete:
4291
4292;³ DEC parms.seperators_len
4293;³ scan to seperator char to be deleted
4294;³ shift remaining chars to left
4295;³ put zero at end for length of the extra EOL list
4296;³ BREAK
4297
4298;³ ENDCASE
4299
4300
4301;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4302
4303
4304seperator_list PROC NEAR
4305
4306;CASE modifier=
4307
4308SHL BX,1 ;AN000;BX=word displacement into jump table
4309JMP jump_table2[BX] ;AN000;jump to appropriate jump
4310
4311jump_table2 LABEL WORD
4312
4313DW OFFSET add_case ;AN000;
4314DW OFFSET delete_case ;AN000;
4315
4316
4317 add_case:
4318
4319
4320 XOR BX,BX
4321 MOV BL,parms.seperators_len ;AN000;BX=length of seperators list
4322 ADD BX,OFFSET parms
4323 MOV [BX].seperators,AL ;AN000;overwrite blank with AL
4324 INC parms.seperators_len ;AN000;adjust for added seperator
4325 BREAK 22 ;AN000;
4326
4327
4328 delete_case:
4329
4330 ;scan to seperator char to be deleted
4331
4332 PUSH DI
4333
4334 MOV DI,OFFSET parms
4335 ADD DI,OFFSET seperators ;ES:DI=>seperator list
4336 REPNE SCASB
4337 DEC DI ;AN000;DI=>char to be deleted
4338 MOV ES:[DI],BYTE PTR blank ;duplicate but harmless blank
4339
4340 POP DI
4341
4342 BREAK 22 ;AN000;
4343
4344ENDCASE_22:
4345
4346RET
4347
4348seperator_list ENDP
4349
4350
4351;-------------------------------------------------------------------------------
4352;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4353
4354;³ KEYWORDS
4355;³ --------
4356
4357;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
4358;³ become apparent and the parser control blocks need to be changed to correctly
4359;³ parse the next parm. This procedure is responsible for manipulating the
4360;³ list of keywords as requested.
4361
4362
4363
4364
4365;³# INPUT: action (in BX) - A scalar immediate indicating whether the keyword
4366;³# is to be added or deleted.
4367;³#
4368;³#
4369;³# string (in RL) - A scalar immediate or OFFSET, indicating/pointing
4370;³# to the keyword or set of keywords to be added
4371;³# or deleted.
4372
4373
4374
4375;³ RETURN: none
4376
4377
4378;³ MESSAGES: none
4379
4380
4381
4382
4383;³ REGISTER
4384;³ USAGE:
4385
4386
4387
4388;³ CONVENTIONS:
4389
4390
4391
4392
4393;³ ASSUMPTIONS:
4394
4395
4396
4397
4398;³ SIDE EFFECT:
4399
4400
4401;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4402
4403
4404keywords PROC NEAR
4405
4406; use result.synonym to find the the keyword to delete
4407
4408 MOV SI,parm_list[current_parm_DI].keyword_switch_ptr ;SI=>the keyword string to be deleted
4409 MOV BYTE PTR ES:[SI],deleted ;AN000;zilch out first byte of the keyword string
4410
4411
4412 RET
4413
4414keywords ENDP
4415
4416;-------------------------------------------------------------------------------
4417
4418
4419;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4420
4421;³ PARSE_PARM
4422;³ ----------
4423
4424;³ Add the parm found to the parm_list. Save the pointer to the current parm
4425;³ for use by CALL reset_parm_pointer. When a reset call from reset_parm
4426;³ happens the pointer to the last entry in the parm list is decremented, which
4427;³ will put the results of the next parse over that entry.
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439;³ INPUT:
4440
4441
4442;³ RETURN: The next parm list entry is filled with the results of the call to
4443;³ the parser. If the parser returns an error other than "end of
4444;³ command line" the entry is not filled in. If the parser returns
4445;³ "end of command line" the .type field is set to end_of_command_line.
4446
4447
4448;³ MESSAGES: none
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460;³ REGISTER
4461;³ USAGE:
4462
4463
4464
4465;³ CONVENTIONS:
4466
4467
4468
4469
4470
4471
4472
4473;³ ASSUMPTIONS:
4474
4475
4476
4477
4478
4479
4480
4481
4482;³ SIDE EFFECT:
4483
4484
4485;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4486
4487parse_parm PROC
4488
4489PUBLIC PARSE_PARM
4490
4491 ADD current_parm_DI, TYPE parm_list_entry
4492
4493 PUSH current_parm_DI ;save index into parsed parms list
4494 PUSH BX ;save the address of the parsed parms list
4495
4496 MOV DI,OFFSET PARMS ; ES:DI=>PARSE CONTROL DEFINITON
4497 MOV SI,COMMAND_line ; DS:SI=>unparsed portion of the command line
4498 MOV DX,0 ; RESERVED
4499 MOV CX,ordinal ; OPERAND ORDINAL
4500 EXTRN SYSPARSE:NEAR
4501 CALL SYSPARSE ;AX=return code, DX=>result buffer
4502 MOV ordinal,CX ;save for next call
4503 MOV terminating_delimeter,BL ;save the character that delimited the parm
4504
4505 POP BX ;restore parm_list
4506 POP current_parm_DI ;nothing returned in DI anyway
4507
4508 MOV CX,command_line ;AN000;CX=>first char of the bad parm
4509 MOV offending_parameter_ptr,CX ;AN000;set pointer in message
4510
4511; .IF <parser_return_code_AX EQ no_error> THEN
4512 MOV command_line,SI ;save pointer to remainder of the command line
4513 .IF <parser_return_code_AX NE end_of_command_line> THEN
4514 MOV DL,result.ret_type
4515 MOV parm_list[current_parm_DI].parm_type,DL
4516 MOV DL,result.item_tag
4517 MOV parm_list[current_parm_DI].item_tag,DL
4518 MOV DX,result.ret_value1
4519 MOV parm_list[current_parm_DI].value1,DX
4520 MOV DX,result.ret_value2
4521 MOV parm_list[current_parm_DI].value2,DX
4522 MOV DX,result.synonym
4523 MOV parm_list[current_parm_DI].keyword_switch_ptr,DX
4524 .ENDIF
4525; .ELSE ;AN000;encountered an error
4526; MOV CX,command_line ;AN000;CX=>first char of the bad parm
4527; MOV offending_parameter_ptr,CX ;AN000;set pointer in message
4528; MOV BYTE PTR [SI],0 ;AN000;make the offending parm an ASCIIZ string
4529; .ENDIF ;AN000;leave the call to msg services to the calling routine
4530
4531 RET
4532
4533parse_parm ENDP
4534
4535
4536
4537;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4538
4539;³ RESET_PARM_POINTER
4540;³ ------------------
4541
4542
4543
4544;³ The last entry in the parm list is decremented, which
4545;³ will put the results of the next parse over that entry.
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557;³ INPUT:
4558
4559
4560;³ RETURN: The current parm list entry is filled with recognizable trash
4561
4562
4563
4564
4565;³ MESSAGES: none
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577;³ REGISTER
4578;³ USAGE:
4579
4580
4581
4582;³ CONVENTIONS:
4583
4584
4585
4586
4587
4588
4589
4590;³ ASSUMPTIONS:
4591
4592
4593
4594
4595
4596
4597
4598
4599;³ SIDE EFFECT:
4600
4601
4602;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4603 ;AN000;
4604reset_parm_pointer PROC
4605
4606
4607
4608 MOV parm_list[current_parm_DI].parm_type,bogus ;AN000;
4609 MOV parm_list[current_parm_DI].item_tag,0FFH ;AN000;
4610 MOV parm_list[current_parm_DI].synonym,bogus ;AN000;
4611 MOV parm_list[current_parm_DI].value1,bogus ;AN000;
4612 MOV parm_list[current_parm_DI].value2,bogus ;AN000;
4613 MOV parm_list[current_parm_DI].keyword_switch_ptr,0 ;AN000;
4614 SUB current_parm_DI,TYPE parm_list_entry ;AN000;
4615 DEC ordinal ;AN000;
4616
4617
4618 RET
4619
4620reset_parm_pointer ENDP ;AN000;
4621
4622
4623PRINTF_CODE ENDS ;AN000;
4624 END ;AN000;
4625 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/MODEPRIN.ASM b/v4.0/src/CMD/MODE/MODEPRIN.ASM
new file mode 100644
index 0000000..60ffebd
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEPRIN.ASM
@@ -0,0 +1,1096 @@
1PAGE ,132 ;
2TITLE MODEPRIN.SAL - PRINTER SUPPORT FOR THE MODE COMMAND
3.XLIST
4INCLUDE STRUC.INC
5.LIST
6.SALL
7
8
9;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
10;º º ;AN000;
11 ;AN000;
12; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
13; implement the SYSGETMSG method of getting addressability to
14; the pieces. This means that the code does a SYSGETMSG call
15; which returns a pointer (DS:SI) to the message piece. The
16; address is then put in the sublist block for the message
17; being issued.
18;º º ;AN000;
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
20
21
22
23DISPLAY MACRO MSG
24 MOV DX,OFFSET MSG
25 CALL PRINTF
26ENDM
27
28PRINT MACRO
29 MOV DX,WORD PTR PT17 ;PASS PRINTER NUMBER
30 INT 17H ;OUTPUT TO PRINTER
31 ENDM
32
33COMPARE MACRO STRING, CHAR1, CHAR2, CHAR3
34 LOCAL END_COMPARE
35
36;------------------------------------------------------------------------------------------------
37;
38; Compare first 3 characters of STRING with CHAR1, CHAR2, and CHAR3
39;
40;------------------------------------------------------------------------------------------------
41
42 PUSH SI
43 MOV SI,0 ;INITIALIZE INDEX
44 CMP STRING[SI],CHAR1 ;IF first char is a match THEN
45 JNE END_COMPARE
46 INC SI ; GET TO NEXT CHAR OF STRING
47 CMP STRING[SI],CHAR2 ; IF 2nd char is a match THEN
48 JNE END_COMPARE
49 INC SI
50 CMP STRING[SI],CHAR3 ; IF all three match then ZR is not set
51END_COMPARE:
52 POP SI
53ENDM
54;
55IF_NO_PRINTER_ERROR_THEN MACRO
56 CMP PRINTER_ERROR,TRUE
57 JE CHK_FOR_P
58ENDM
59;
60JUMP_EQUAL_TO_CHK_FOR_P MACRO
61LOCAL SKIP_JUMP
62;
63 JNE SKIP_JUMP
64 JMP CHK_FOR_P
65 SKIP_JUMP:
66ENDM
67
68
69SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
70
71 PUSH AX
72 MOV AX,VALUE
73 MOV REG,AX
74 POP AX
75
76ENDM
77
78
79set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
80
81MOV AX,submessage ;AX=message number ;AN001;
82MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
83CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
84MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
85MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
86ENDM ;AN001;
87
88
89;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
90;º º
91
92INCLUDE common.stc ;contains the following structure
93
94
95;parm_list_entry STRUC ;used by parse_parameters and invoke
96;
97;parm_type DB bogus
98;item_tag DB 0FFH
99;value1 DW bogus ;used only for filespecs and code page numbers
100;value2 DW bogus ;used only for filespecs and code page numbers
101;keyword_switch_ptr DW 0
102;
103;parm_list_entry ENDS
104
105
106;printer_settings STRUC ;map of the setting holders in resident code
107
108; chars_per_line DB ?
109; lines_per_inch DB ?
110
111;printer_settings ENDS
112
113;º º
114;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
115
116
117;
118ROM SEGMENT AT 0
119 ORG 530H
120RESSEG LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT
121ROM ENDS
122
123;**********************************************************************
124PRINTF_CODE SEGMENT PUBLIC
125 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
126;
127
128;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
129;º º
130
131EXTRN B_item_tag:ABS ;see modepars
132EXTRN COM1_or_COM2:WORD ;=>"Must specify COM1 or COM2" message
133EXTRN CTRL_ST:BYTE ;CONTROL STRING SET UP FROM CONFIGURATION PARAMETERS INPUT
134EXTRN E_item_tag:ABS ;see modepars
135EXTRN invalid_number_of_parameters:WORD ;=>"Invalid number of parameters"
136EXTRN noerror:BYTE ;AN000;
137EXTRN OFFRETRY:ABS ;OFFSET TO TEST INSTR IN RETRY CODE
138EXTRN not_supported:WORD ;message telling user he specified "P" on a net printer
139EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS
140EXTRN ERR1:BYTE ;POINTER TO "Invalid parameters"
141EXTRN Illegal_device_ptr:WORD ;pointer to device name that does not exist
142;AC001; EXTRN INF_OR_NO_PTR:WORD ;PART OF "... retry on parallel printer time-out" message
143EXTRN INDEX:WORD ;INDEX OF REDIRECTED PRINTER IN NETWORK REDIRECTION LIST
144EXTRN IS_LOCAL:BYTE ;BOOLEAN. INDICATES IF A PRINTER IS LOCAL. INITIALLY TRUE
145EXTRN keyword:ABS
146EXTRN LOCAL_NAME:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
147EXTRN lpt1_retry_type:BYTE ;byte in resident code for retry mask, see rescode
148EXTRN LPTNO:BYTE ;see modeecho
149EXTRN machine_type:BYTE ;see "rescode"
150EXTRN MODEECHO:NEAR ;SET UP REDIRECTION OF PARALLEL TO SERIAL
151EXTRN MODELENG:NEAR
152EXTRN MODELOAD:NEAR ;MOVES THE CODE AT MODETO TO 60 AND MAKES IT RESIDENT ;AN000;
153EXTRN NET_ERROR:WORD ;"NET 042: Unable to do requested comand" ;AN000;
154EXTRN NONE_item_tag:ABS ;AN000;see modepars ;AN000;
155;EXTRN no_retry_active:ABS ;see invoke.asm ;AN000;
156EXTRN parm_lst:BYTE ;see modepars.asm ;AN000;
157EXTRN P_item_tag:ABS ;see modepars.asm ;AN000;
158;EXTRN parallel_printer_settings:WORD ;see "rescode" ;AN000;
159EXTRN P14_model_byte:ABS ;see "rescode" ;AN000;
160EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE ;AN000;
161EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
162EXTRN parm_list_holder:WORD ;address of parsed parameter list ;AN663;
163EXTRN parms_form:BYTE ;AN000;
164EXTRN DEVICE:BYTE,PPARM:BYTE ;AN000;
165EXTRN R_item_tag:ABS ;AN000;
166;EXTRN res_lpt_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is res, see rescode
167EXTRN retry_index:WORD ;see modecom.asm ;AN000;
168
169EXTRN ERR2:WORD ;CR,LF,"Printer error",BEEP,CR,LF,"$"
170EXTRN PT80:WORD ;CR,LF,"LPT"
171EXTRN PT80N:BYTE ;DB " "
172; ": set for 80",CR,LF,"$"
173EXTRN PT132:WORD ;CR,LF,"LPT"
174EXTRN PT132N:BYTE ;" "
175; ": set for 132",CR,LF,"$"
176EXTRN PTLINES:WORD ;CR,LF,"Printer lines per inch set",CR,LF,"$"
177EXTRN NORETRY:WORD ;message number for CR,LF,'No','$' ;AC001;
178EXTRN INFINITE:WORD ;message number for CR,LF,'Infinite' ;AC001;
179EXTRN REMOTE_DEV:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
180EXTRN RETPARTO:WORD ;message number for '%1 retry on parallel printer timeout',CR,LF,'$'
181;EXTRN ROOM_FOR_COLON:WORD ;INITIALLY 0, CHANGED TO 1 IF COLON IS INCLUDED
182EXTRN sublist_retparto:BYTE ; control block for "%1 retry on parallel printer timeout" ;AC001;
183EXTRN SYSGETMSG:NEAR ;AC001;
184EXTRN utility_msg_class:ABS ;used for input to sysgetmsg
185EXTRN VERIFY:NEAR ;FINDS IF n OF LPTn IS LEGAL
186
187;º º
188;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
189
190
191;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
192;º º
193
194;CR EQU 13 ;CARRIAGE RETURN
195;LF EQU 10 ;LINE FEED
196;BEEP EQU 7 ;SOUND THE AUDIBLE ALARM
197;EQUALSIGN EQU "=" ;CHAR IN LPTn:=COMm
198busy_status EQU 080H ;flag telling resident code to not change anything
199COLON EQU ":" ;CHAR IN "LPT1:"
200error_status EQU 029H ;status byte indicating the printer is on fire(busy, no paper, I/O error, timeout)
201FALSE EQU 00H
202SPACE EQU " " ;THE BLANK CHARACTER
203TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN
204INTCONV EQU 48 ;CONVERTS ASCII TO NUMERIC
205EIGHTY EQU 80 ;80 COL PRINTER WIDTH
206no_retry_flag EQU 0 ;no retry active, stored in lptx_retry_type, see rescode.sal
207ONE_THIRTY_TWO EQU 132 ;132 COL PRINTER WIDTH
208PRTDC2 EQU 18 ;PRINTER CONTROL CHAR FOR 80 COL
209PRTSI EQU 15 ;PRINTER CONTROL CHAR FOR 132 CHAR
210PRTCANCEL EQU 24 ;PRINTER CONTROL CHAR FOR CANCEL
211CHAR6 EQU "6" ;REQUEST FOR 6 LINES PER INCH
212CHAR8 EQU "8" ;REQUEST FOR 8 LINES PER INCH
213L EQU "L"
214P EQU "P"
215T EQU "T"
216R EQU "R"
217N EQU "N"
218NULL EQU 0 ;NULL CHAR
219ASC0 EQU "0" ;ASCII 0, REQUEST 8 LINES PER INCH
220ASC2 EQU "2" ;ASCII 2, REQUEST 6 LINES PER INCH
221escape EQU 27 ;ESCAPE PRINTER CONTROL CHAR
222PRINTERSETUP EQU 5E02H ;FUNCTION CODE FOR PRINTER SET UP DOS CALL
223GET_LIST_ENTRY EQU 5F02H ;FUNCTION CODE FOR GET ASSIGN LIST ENTRY FROM NETWORK REDIR. LIST
224CHAR_DEVICE EQU 3 ;CHARACTER DEVICE "MACRO" TYPE (IN NETWORK LINGO).
225PRN_NO EQU 3 ;CHARACTER POSITION OF THE PRINTER NUMBER IN LPTn, (ZERO BASED)
226ready_status EQU 90H ;flag telling resident code to set status indicating printer is ready for another character
227UNCHANGED EQU -1 ;-1 INDICATES TO SERVER THAT PARAMTER IS UNCHANGED (NOT SPECIFIED)
228unspecified EQU 0FFH ;AN000;value of parm2 if no lines per inch was specified
229TRUE EQU 0FFH
230ENDPARM EQU MODE
231;PARMNO EQU PARM1+3 ;LOCATION OF DEVICE NUMBER
232;PARMCOL EQU PARM1+4 ;LOCATION OF COLON IN LPTn:
233;PARMEQ EQU PARM1+4 ;LOCATION OF = IN LPTn= ,(NO COLON SPECIFIED)
234parm_list EQU [BP]
235
236;º º
237;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
238
239
240;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
241;º º
242
243;PARM1 DB 10 DUP(0)
244;PARM2 DB -1 ;HOLDS LINES PER INCH IN CHARACTER FORM
245;PARM3 DB 0
246;MODE DB 0
247;FLAG DB 0
248;CTRL_ST DB 5 DUP(PRTCANCEL)
249;INDEX DW 0
250columns_holder DB bogus
251i DB 0 ;loop index for retry index calculation
252PT17 DW 0 ;SAVES PRINTER NUMBER FOR DX AND INT 17H
253LPTN DB 0 ;SAVES ID OF WHICH LPTn IS REFERENCED
254PRINTER_NO DB 0 ;SAVES LPT NUMBER IN ZERO BASED NUMERICAL FORM
255CTRL_ST_LEN DW 0000 ;HOLDER FOR LENGTH OF THE CONTROL STRING
256REDIRECTED DB 00 ;FLAG TO INDICATE A PRINTER IS ON THE NETWORK
257CHARS_LINE DB -1 ;HOLDS CHARACTERS PER LINE IN NUMERIC FORM
258NO_COLON DW 00 ;CHAR POSITIONS TO MOVE IF NO COLON INCLUDED IN DEVICE NAME
259;nothing_past_LPTn_colon_equal DB ":","=",0,0,0,0 ;just "LPTn:=" as parameters
260;len_nothing_past_LPTn_colon_equal EQU $-nothing_past_LPTn_colon_equal
261;nothing_past_LPTn_equal DB "=",0,0,0,0,0 ;just "LPTn=" as parameters
262;len_nothing_past_LPTn_equal EQU $-nothing_past_LPTn_equal
263;nothing_past_LPTn_colon DB ":",0,0,0,0,0 ;just "LPTn:" as parameters
264;len_nothing_past_LPTn_colon EQU $-nothing_past_LPTn_colon
265;nothing_past_LPTn DB 0,0,0,0,0,0 ;just "LPTn" as parameters
266;len_nothing_past_LPTn EQU $-nothing_past_LPTn
267PTLINES_REQ DB 00 ;BOOLEAN INDICATOR OF LINES PER INCH REQUESTED
268PRINTER_ERROR DB 00 ;BOOLEAN INDICATOR OF PRINTER NOT THERE OR OFF OR OFFLINE
269EIGHTY_CHARS_LINE_REQ DB 00 ;BOOLEAN, INDICATES IF 80 CHARS/LINE REQUESTED
270REQ_132_CHARS_LINE DB 00 ;BOOLEAN, INDICATES IF 132 CHARS/LINE REQUESTED
271
272;º º
273;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
274
275
276;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
277;º º
278
279PUBLIC busy_status ;used by rescode in parallel retry code
280PUBLIC columns_holder ;AN000;
281PUBLIC error_status ;used by analyze_and_invoke and rescode
282PUBLIC modify_resident_code ;used by invoke ;AN000;
283PUBLIC MODEPRIN
284PUBLIC no_retry_flag ;used by analyze_and_invoke
285PUBLIC printer_no ;needed by modepars
286PUBLIC ready_status ;used by analyze_and_invoke
287;PUBLIC set_retry_flag ;used by invoke in turn_off_retry_case
288PUBLIC set_retry_type ;used by invoke in turn_off_retry_case
289
290;º º
291;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
292
293
294;*******************************************************************
295MODEPRIN PROC NEAR
296
297
298;On entry: "columns_holder" contains 132,80 or 88H.
299; "parm2" contains "[6³8]" (FFH if not specified).
300; "parm_list[retry_index]" contains "X_item_tag" where X is e, b, r, or p
301
302 MOV AL,LPTNO ;AN000;LPTNO set up by modepars in first_parm_case
303 MOV PT80N,AL ;PUT ASCII PRINTER NUMBER INTO BOTH
304 MOV PT132N,AL ; MESSAGES
305 SUB AL,INTCONV+1 ;CONVERT TO INTEGER, MINUS ONE
306 MOV PRINTER_NO,AL ;SAVE ZERO BASED PRINTER NUMBER
307 MOV AH,0 ;CLEAR AH
308 MOV WORD PTR PT17,AX ;SET UP PRINTER NUMBER FOR INTERRUPT 17H
309
310
311 MOV DI,0 ;INITIALIZE LENGTH OF CONTROL STRING
312 MOV BL,columns_holder ;BL=binary form of requested chars per line
313; : : : IF REQUEST IS FOR 80 COL
314 CMP BL,EIGHTY
315 JNE ELSEIF03
316;
317 MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE
318 MOV EIGHTY_CHARS_LINE_REQ,TRUE
319 MOV BL,PRTDC2 ;SEND A DC2 CHAR TO SELECT 80 COL
320; : : : ELSEIF SINCE NOT 80, IS REQUEST FOR 132?
321 JMP SHORT ENDIF03
322ELSEIF03:
323 CMP BL,ONE_THIRTY_TWO ;132?
324 JNE ENDIF03 ;AC000;
325;
326 MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE
327 MOV REQ_132_CHARS_LINE,TRUE
328 MOV BL,PRTSI ;SEND 'SI', CONDENSED PRINT
329; : : : ENDIF ,END IS REQUEST FOR 80 COL
330ENDIF03:
331
332; : : : IF ANYTHING TO PRINT,
333 CMP BL,bogus ;AC000;
334 JE ENDIF04
335
336 MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR COLS/LINE IN CONTROL STRING
337 INC DI ;GET TO NEXT CHAR POSITION IN CONTROL STRING
338
339
340; : : : ENDIF END IF ANYTHING TO PRINT? TEST
341ENDIF04:
342
343PUBLIC ENDIF04
344
345;*****************************************************************
346; LOOK AT THE SECOND PARM, CHECKING FOR 6 OR 8 LINES PER INCH
347;*****************************************************************
348 MOV BL,NULL ;NULL CHAR, TO BE REPLACED MAYBE
349; : : : IF THERE IS A SECOND PARM,
350 CMP DS:PARM2,unspecified ;AC000;
351 JE ENDIF05
352;
353; : : : : IF THE REQUEST FOR 6 LINES PER INCH?
354 CMP DS:PARM2,CHAR6
355 JNE ELSEIF06
356;
357 MOV BL,ASC2 ;REQUEST 6 LPI
358; : : : : ELSEIF REQUEST IS FOR 8 LINES PER INCH
359 JMP SHORT ENDIF06
360ELSEIF06:
361 CMP DS:PARM2,CHAR8
362 JNE ENDIF06
363 MOV BL,ASC0 ;REQUEST 8 LINES PER INCH
364; : : : : ENDIF ,END IS REQUEST FOR 6 LPI? TEST
365ENDIF06:
366; : : : ENDIF END IS THERE A SECOND PARM? TEST
367ENDIF05:
368; : : : IF 6 OR 8 LINES PER INCH REQUESTED
369 CMP BL,0
370 JE ENDIF07
371 MOV CTRL_ST[DI],escape ;PUT AN ESCAPE CHAR IN THE CONTROL STRING
372 INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING
373;
374 MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR LINES/INCH IN CONTROL STRING
375 INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING
376;
377 MOV PTLINES_REQ,TRUE ;INDICATE LINES PER INCH SET IF NO PRINTER ERROR
378; : : : ENDIF END IS 6 OR 8 LPI REQUESTED? TEST
379ENDIF07:
380 CALL VERIFY ;SEE IF n OF LPTn WAS LEGAL
381 MOV BYTE PTR LPTN,AH ;SAVE THE n OF LPTn
382;
383 MOV BX,0
384 PUSH BX
385 POP ES ;GET ADDRESSABILITY TO PRINTER BASE
386 MOV BL,PRINTER_NO ;PUT ZERO BASED PRINTER NUMBER INTO BL
387 SAL BL,1 ;CHANGE TO WORD OFFSET FROM PRINTER BASE (40:8)
388 CMP ES:PRINTR[BX],0 ;SEE IF THERE IS NO PORT ADDRESS FOR THE SPECIFIED PRINTER THEN
389 JNE PRINTER_EXISTS
390 MOV IS_LOCAL,FALSE ;NOT A LOCAL PRINTER
391 PRINTER_EXISTS:
392;
393;**************************************************************************************************
394; SEARCH THE NETWORK REDIRECTION LIST
395;
396; IF THE PRINTER IS FOUND IN THE LIST THEN THE CONTROL STRING HAS TO BE SENT TO THE REDIRECTOR,
397; OTHERWISE THE CONTROL STRING WILL BE SENT DIRECTLY TO THE LOCAL PRINTER.
398; AN INDEX WILL BE INITIALIZED TO ZERO. A GET ASSIGN LIST ENTRY CALL WILL BE MADE, THE DEVICE
399; TYPE IS CHECKED FOR CHARACTER DEVICE TYPE. IF THE ENTRY IS A CHARACTER DEVICE THEN THE NAME IS
400; COMPARED WITH THE NAME OF THE PRINTER TO BE CONFIGURED. IF THE NAMES MATCH THEN WE KNOW THAT
401; THE PRINTER HAS BEEN PUT ON THE NETWORK, ELSE WE CONTINUE DOWN THE LIST BY INCREMENTING THE
402; INDEX AND MAKING ANOTHER GET ASSIGN LIST ENTRY CALL. THIS CONTINUES UNTIL THE END OF THE NRL
403; IS REACHED OR THE PRINTER IS FOUND.
404; GET ASSIGN LIST ENTRY CALL WORKS AS FOLLOWS: 5F02H IS PUT IN AX, THE INDEX IS PUT IN BX. ON
405; RETURN DS:SI POINTS TO THE LOCAL NAME, ES:DI POINTS TO REMOTE NAME, CX HAS THE DEVICE TYPE. IF
406; CARRY IS SET AX HAS ERROR CODE: INVALID FUNCTION (NETWORK SUPPORT IS NOT PRESENT) OR, NO MORE
407; FILES (THE INDEX IS GREATER THAN THE NUMBER OF NETWORK ASSIGNMENTS).
408;
409;**************************************************************************************************
410;
411SEE_IF_REDIRECTED:
412
413PUBLIC SEE_IF_REDIRECTED
414
415 MOV CTRL_ST_LEN,DI ;SAVE LENGTH OF CONTROL STRING
416 DEC INDEX ;SET INDEX TO -1 SO IT WILL BEGIN AT ZERO
417SRCH_NRL:
418 MOV AX,GET_LIST_ENTRY ;SET UP FOR GET ASSIGN LIST ENTRY FUNCTION CALL
419 INC INDEX
420 MOV BX,INDEX ;BX GETS THE INDEX OF THE ENTRY TO BE FECTHED
421 MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO HOLDING AREA FOR LOCAL DEVICE NAME
422 PUSH DS
423 POP ES ;ES GETS THE SEGMENT OF REMOTE DEVICE NAME HOLDING AREA
424 MOV DI,OFFSET REMOTE_DEV ;ES:DI POINTS TO (USELESS) REMOTE DEVICE NAME HOLDING AREA
425 INT 21H
426 JNC CHK_DEV_TYPE
427 JMP NOT_RED ;IF CARRY IS SET THEN THE PRINTER IS NOT REDIRECTED
428CHK_DEV_TYPE:
429 CMP BL,CHAR_DEVICE ;ELSE CHECK THE DEVICE TYPE
430 JE CHECK_NAME ;IF THE DEVICE TYPE IS CHAR DEVICE THEN COMPARE NAMES
431 JMP SRCH_NRL ;ELSE CONTINUE SEARCH
432CHECK_NAME: ;SEE IF THE LOCAL NAME IS THE PRINTER TO BE CONFIGURED
433; Count the number of characters in the local name
434 MOV SI,00 ;INITIALIZE THE CHARACTER COUNTER
435COUNT:
436 CMP LOCAL_NAME[SI],NULL ;WHILE (char<>null) AND (char<>space) DO
437 JE CHECK_1st_3 ;END OF NAME
438 CMP LOCAL_NAME[SI],SPACE
439 JE CHECK_1st_3 ; END OF NAME
440 INC SI ; INCREMENT NUMBER OF CHARS IN THE NAME
441 JMP COUNT ;END WHILE non-termination char
442CHECK_1st_3: ;SEE IF 1st 3 CHARS ARE LPT OR PRN
443 CMP SI,4 ;IF the name is 4 or less chars THEN
444 JG CONTINUE_SEARCH ;NAME IS TOO LONG
445 COMPARE LOCAL_NAME, L, P, T
446 JNE CHECK_FOR_PRN
447 MOV AL,PT80N ;PUT PRINTER NUMBER IN AL
448 CMP LOCAL_NAME[PRN_NO],AL ;CHECK PRINTER NUMBER
449 JE END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST
450 CHECK_FOR_PRN:
451 COMPARE LOCAL_NAME, P, R, N
452 JNE CONTINUE_SEARCH ;NOT REDIRECTED AS PRN EITHER
453 CMP PT80N,1 ;IF printer to be configured is lpt1 THEN
454 JNE CONTINUE_SEARCH
455 JMP SHORT END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST
456 CONTINUE_SEARCH:
457 JMP SRCH_NRL
458END_CHECK_NAME:
459
460PUBLIC END_CHECK_NAME
461
462MOV REDIRECTED,TRUE ;REDIRECTED:=TRUE. THE PRINTER WAS FOUND IN NRL
463;
464;**************************************************************************************************
465; INDICATE TO SERVER THAT THE CONFIGURATION OF A NETWORK PRINTER HAS CHANGED.
466;
467; SET DS:SI TO POINT TO THE PRINTER NAME, CHARS_LINE HAS THE CHARACTERS PER LINE, PARM2 HAS THE
468; LINES PER INCH IN CHARACTER FORM.
469;**************************************************************************************************
470;
471 CMP CTRL_ST_LEN,0 ;IF printer configuration has changed THEN
472 JUMP_EQUAL_TO_CHK_FOR_P
473 MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO PRINTER NAME
474 MOV AH,02
475 XOR AL,AL ;AL=0
476 MOV CL,8 ;CL HOLDS SHIFT COUNT. 8 IS NUMBER OF BITS NEEDED FOR 132.
477 MOV DL,CHARS_LINE ;MOV 80 or 132 or FF INTO ACCUMULATOR REGISTER
478 ROR DL,1 ;IF (DL=50H) OR (DL=84H) THEN DL[7]=0 ELSE DL=FFH
479 SAR DL,CL ;IF (CHARS_LINE = 80) OR (CHARS_LINE = 132) THEN
480 MOV BH,DL ;BH=0 ELSE BH=BL=FFH
481 MOV BL,CHARS_LINE ;BX= -1 or 80 or 132
482 MOV CL,PARM2
483 CMP PARM2,bogus ;IF THE LINES PER INCH WASN'T SPECIFIED THEN DON'T CONVERT
484 JNE CONVERT
485 MOV CH,UNCHANGED ;CX=-1 (FFFF)
486 JMP CALL_SERVER
487 CONVERT: ;ELSE
488 XOR CH,CH ;CLEAR CH
489 SUB CX,INTCONV ;CHANGE LINES PER INCH TO NUMERIC FORM
490 CALL_SERVER: ;ENDIF
491 INT 2AH ;CALL SERVER
492;
493;**************************************************************************************************
494; SET UP REDIRECTOR WITH CONTROL STRING BUFFER VIA A PRINTER SET UP CALL.
495;
496; DI HAS LENGTH OF THE CONTROL STRING. NEED TO SET DS:SI TO THE POINT TO THE CONTROL STRING
497; BUFFER, PUT THE LENGTH IN CX, AND THE NETWORK REDIRECTION LIST INDEX FOR THE PRINTER IN BX.
498;**************************************************************************************************
499;
500 CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN
501 JUMP_EQUAL_TO_CHK_FOR_P
502 MOV AX,PRINTERSETUP ;SET UP FOR PRINTER SET UP FUNCTION CALL.
503 MOV SI,OFFSET CTRL_ST ;DS HAS SEG OF CONTROL ST. BUFFER, DS:SI POINTS TO BUFFER
504 MOV CX,CTRL_ST_LEN ;CX GETS LENGTH OF CONTROL STRING BUFFER.
505 MOV BX,INDEX ;BX GETS NRL INDEX OF REDIRECTED PRINTER.
506 INT 21H ;PERFORM PRINTER SET UP.
507; $IF C ;IF CARRY THERE IS A DESCREPENCY BETWEEN
508 JNC $$IF1
509 DISPLAY NET_ERROR ;GET ASS LIST ENTRY AND PRINTER SET UP
510; $ELSE ;REDIRECTOR IS RESIDENT AND PRINTER SETUP
511 JMP SHORT $$EN1
512$$IF1:
513 ;CALL WAS SUCCESSFUL SO TELL USER WHAT
514 CMP EIGHTY_CHARS_LINE_REQ,TRUE ;HAPPENED
515; $IF E ;IF 80 chars/line requested THEN
516 JNE $$IF3
517 DISPLAY PT80 ; WRITELN("LPT? set for 80")
518; $ELSE ;ELSE
519 JMP SHORT $$EN3
520$$IF3:
521 CMP REQ_132_CHARS_LINE,TRUE
522; $IF E ; IF 132 chars/line requested THEN
523 JNE $$IF5
524 DISPLAY PT132 ; WRITELN("LPT? set for 132")
525; $ENDIF ; ENDIF
526$$IF5:
527; $ENDIF ;ENDIF
528$$EN3:
529 CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN
530; $IF E
531 JNE $$IF8
532 DISPLAY PTLINES ; WRITELN("Printer lines per inch set")
533; $ENDIF ;ENDIF
534$$IF8:
535; $ENDIF ;ENDIF
536$$EN1:
537 JMP CHK_FOR_P
538;******************************************************************************************
539; SEND THE CONTROL STRING TO THE LOCAL PRINTER
540
541; EACH CHARACTER OF THE CONTROL STRING IS TAKEN OUT OF THE BUFFER "CTRL_ST" AND SENT TO THE
542; PRINTER STARTING WITH THE FIRST CHARACTER. ON ENTRY DI HAS THE NUMBER OF CHARACTERS IN
543; THE CONTROL STRING. SI IS USED TO INDEX INTO THE CONTROL STRING.
544;******************************************************************************************
545;
546NOT_RED:
547 CMP IS_LOCAL,TRUE ;IF the device is local THEN
548 JE ELSE02
549 JMP SHORT ELSE01 ;or on the network
550ELSE02:
551 CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN
552 JE CHK_FOR_P
553 MOV SI,0 ;INITIALIZE CHARACTER POSITION INDEX FOR CONTROL STRING
554FOR: ;FOR each_char_in_control_string DO. FOR DI=no_chars DOWN TO 0 DO
555 DEC CTRL_ST_LEN ;DECREMENT LOOP COUNTER
556 MOV AH,NULL ;CLEAR ERROR CODE FROM AH
557 MOV AL,BYTE PTR CTRL_ST[SI] ;MOVE NEXT CONTROL CHAR TO AL
558 CALL OUTCHR ;SEND THE CHARACTER TO THE PRINTER, HANDLING ERRORS
559 INC SI ;GET TO NEXT CHAR POSITION IN CONTROL STRING
560 CMP CTRL_ST_LEN,0 ;CHECK IF ALL CHARACTERS HAVE BEEN SENT
561 JNE FOR ;LOOP UNTIL ALL CONTROL CHARACTERS HAVE BEEN SENT
562;
563 IF_NO_PRINTER_ERROR_THEN
564 CMP EIGHTY_CHARS_LINE_REQ,TRUE ;IF 80 chars/line requested THEN
565 JNE WAS_132_CHARS_LINE_REQ
566 DISPLAY PT80 ; WRITELN("LPT? set for 80")
567 JMP SHORT WAS_LINES_INCH_SPEC
568 WAS_132_CHARS_LINE_REQ: ;ELSE
569 CMP REQ_132_CHARS_LINE,TRUE ; IF 132 chars/line requested THEN
570 JNE WAS_LINES_INCH_SPEC
571 DISPLAY PT132 ; WRITELN("LPT? set for 132") ENDIF
572 WAS_LINES_INCH_SPEC: ;ENDIF
573 CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN
574 JNE LINES_NOT_REQ
575 DISPLAY PTLINES ; WRITELN("Printer lines per inch set")
576 LINES_NOT_REQ: ;ENDIF
577;
578;****************************************************************
579; CALL PROCEDURE TO SET THE RETRY FLAG
580;****************************************************************
581;
582CHK_FOR_P:
583
584public CHK_FOR_P
585
586 CALL set_retry_type
587 CALL modify_resident_code
588
589
590 JMP SHORT ENDIF01
591ELSE01:
592
593PUBLIC ELSE01
594
595 MOV DI,0 ;the device name is always the first parm ;AN000;
596 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000;
597 MOV BX,parm_list[DI].value1 ;AN000;
598 MOV illegal_device_ptr,BX
599 MOV BYTE PTR [BX][4],0 ;AN000;chop off the string at 4, so "LPT1132" will be displayed as "LPT1"
600 DISPLAY err1 ;AN000;"Illegal device name - LPTX"
601 MOV noerror,false ;AN000;
602; ENDIF COLON IS MISSING
603ENDIF01:
604; $ENDIF ;there was a chance that the parameters were valid
605; $ENDIF ;there were enough paramters specified
606
607 RET ;RETURN TO MODE MAIN ROUTINE
608
609MODEPRIN ENDP
610
611;******************************************************************************
612
613modify_resident_code PROC NEAR ;AN000;
614
615
616 CALL LOADED_YET ;on return ES:DI points to res copy of "modeto" if loaded
617; : :IF RESIDENT CODE IS ALREADY LOADED
618 .IF Z THEN NEAR
619; MODIFY LOADED CODE TO REFLECT WHO GETS RETRIED NOW
620 MOV BX,OFFSET lpt1_retry_type ;BX=> first of 3 retry mask bytes ;AC000;
621 XOR SI,SI ;clear code modification index ;AN000;
622 .FOR DI = 0 TO 2 ;FOR LPT1 TO LPT3 check the retry mask byte ;AN000;
623 .IF <<BYTE PTR ES:[BX][DI]> NE no_retry_flag> THEN ;IF at least one type of retry on THEN ;AN000;
624 OR SI,8 ;OR in 00001000 which shifts into proper position ;AN000;
625 .ENDIF ;AN000;
626 SHR SI,1 ;AN000;
627 .NEXT DI ;DI=1 or 2, SI=0,1 ,2 ,3 ,4 ,5 ,6 or 7 ;AN000;
628 SHL SI,1 ;SI=0, 2, 4, ... , 14, INDEX TO SHOW WHICH LPTns to be retried ;AC000;
629 MOV BX,OFFRETRY ;OFFSET TO TEST INSTR IN RETRY CODE
630 CLI ;DISABLE INTERRUPTS
631 MOV BYTE PTR ES:[BX]+4,5 ;SET JMP TARGET TO +5
632 JMP CASE[SI] ;CALL BRANCH TABLE
633;
634CASE DW P0
635 DW P1
636 DW P2
637 DW P3
638 DW P4
639 DW P5
640 DW P6
641 DW P7
642;
643P0:
644; SINCE NO PRINTER IS TO BE RETRIED
645 MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NOP
646; TO CAUSE FALL THRU TO JMP PRINTER_IO INSTR
647 JMP SHORT ENDC
648;
649P1:
650; RETRY LPT1 ONLY
651 MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ RT
652 JMP SHORT ENDC
653;
654P2:
655; RETRY LPT2 ONLY
656 MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ RT
657 JMP SHORT ENDC
658;
659P3:
660; RETRY LPT1 AND LPT2 ONLY
661 MOV WORD PTR ES:[BX]+2,7402H ;TEST 2 : JZ RT
662 JMP SHORT ENDC
663;
664P4:
665; REDIRECT LPT3 ONLY
666 MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 : JNZ RT
667 JMP SHORT ENDC
668;
669P5:
670; REDIRECT LPT1 AND LPT3 ONLY
671 MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ RT
672 JMP SHORT ENDC
673;
674P6:
675; REDIRECT LPT2 AND LPT3 ONLY
676 MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ RT
677 JMP SHORT ENDC
678;
679P7:
680; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
681 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT
682;
683ENDC:
684 STI ;REENABLE INTERRUPTS
685; : : : ENDIF RESIDENT CODE IS ALREADY LOADED
686 .ENDIF
687
688RET ;AN000;
689
690modify_resident_code ENDP ;AN000;
691
692
693;**********************************************************
694;FIRST_INSTR EQU 0C2F6H ;THE FIRST INSTRUCTION OF THE LOADED CODE
695; SEE THE RESIDENT CODE MODULE FOR ENTRY SYMBOL MODETO
696; THE FIRST INSTRUCTION THERE IS:
697; TEST DL,1
698; WHICH ASSEMBLES AS:
699; F6 C2 01
700
701
702LOADED_YET PROC NEAR
703
704
705; ON EXIT, THE ZERO FLAG REFLECTS THE LOADED STATE
706; ES:DI=ADDR OF MODETO, OR ZERO
707; Z=ON, LOADED
708; Z=OFF,NOT LOADED YET
709;
710 PUSH AX ;SAVE REG
711;
712 SUB AX,AX ;ZERO A REG
713 MOV ES,AX ;SET SEGREG TO VECTORS AT 0
714 LES DI,ES:RESSEG ;GET ADDR OF RESIDENT CODE, IF THERE, ES:DI points to 'modeto' or is 0
715 CMP DI,0 ;see if something at 50:30
716; $IF NE ;IF code loaded THEN
717 JE $$IF11
718 CMP AX,AX ;SET THE ZERO FLAG TO RELFECT IT IS LOADED
719; $ELSE
720 JMP SHORT $$EN11
721$$IF11:
722 CMP AX,0FFH ;RESET THE ZERO FLAG TO REFLECT IT IS NOT LOADED
723; $ENDIF
724$$EN11:
725;
726 POP AX ;RESTORE CALLER'S REGS
727 RET
728LOADED_YET ENDP
729
730
731;*******************************************************************
732OUTCHR PROC NEAR
733 PRINT ;OUTPUT CHARACTER TO PRINTER
734 AND AH,0A9H ;MASK OFF ERROR BITS
735; IF WE GOT AN ERROR RETURN CODE
736 CMP AH,NULL
737 JE ENDIF02
738;
739 CMP PRINTER_ERROR,TRUE
740 JE ALREADY_YELLED
741 DISPLAY ERR2 ;DISPLAY ERROR MESSAGE
742 MOV PRINTER_ERROR,TRUE
743 ALREADY_YELLED:
744; ENDIF ,END GOT AN ERROR RETURN CODE? TEST
745ENDIF02:
746 RET ;RETURN TO MAIN PROC
747OUTCHR ENDP
748;
749;
750;
751;-------------------------------------------------------------------------------
752;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
753;³ ³
754;³ SET_RETRY_FLAG ³
755;³ -------------- ³
756;³ ³
757;³ Set the resident retry flag to type of retry active for lptX. ³
758;³ ³
759;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³
760;³ retry_index - holds index value for the parsed retry parameter. ³
761;³ redirected - holds true/false value for redirected status of lptx. ³
762;³ parm_list_holder - holds offset of parameter list. ³
763;³ resseg - holds offset of resident code in memory ³
764;³ res_lpt_retry_type - holds offset of lpt retry flag in resident ³
765;³ code. ³
766;³ ³
767;³ ³
768;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³
769;³ flag in resident code set ³
770;³ ³
771;³ ³
772;³ MESSAGES: Infinite retry not supported on network printer. ³
773;³ ³
774;³ ³
775;³ REGISTER ³
776;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³
777;³ format) ³
778;³ CL - shift bit count ³
779;³ ES - holds segment of resident code ³
780;³ BP - offset of parameter list ³
781;³ DI - offset of retry index within parameter list ³
782;³ DL - current resident flag setting ³
783;³ ³
784;³ ³
785;³ PSUEDO CODE: ³
786;³ ³
787;³ SAVE REGISTERS ³
788;³ SET UP SEGMENT REGISTER AND BIT MASKS ³
789;³ IF <RETRY REQUESTED> ³
790;³ IF <PRINTER IS REDIRECTED> ³
791;³ PRINT ERROR MESSAGE - not supported on network printer. ³
792;³ ELSE ³
793;³ SET UP PARAMETER LIST STRUCTURE ³
794;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³
795;³ IF <RESIDENT CODE IS NOT LOADED> ³
796;³ LOAD RESIDENT CODE ³
797;³ ENDIF ³
798;³ GET CURRENT res_lpt_retry_type ³
799;³ SET AND STORE NEW res_lpt_retry_type ³
800;³ ENDIF ³
801;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
802;³ GET CURRENT res_lpt_retry_type ³
803;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
804;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
805;³ ELSE ³
806;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
807;³ ENDIF ³
808;³ ELSE ³
809;³ SET pparm TO '-' ³
810;³ ENDIF ³
811;³ RESTORE REGISTERS ³
812;³ RETURN ³
813;³ ³
814;³ ³
815;³ ³
816;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³
817;³ ³
818;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
819;
820;set_retry_flag PROC NEAR ;AN663;
821; ;AN663;
822; PUSH ES ;save registers ;AN663;
823; PUSH DI ;AN663;
824; PUSH AX ;AN663;
825; PUSH DX ;AN663;
826; ;AN663;
827; XOR AX,AX ;clear a reg ;AN663;
828; MOV ES,AX ;set to segment at 0 ;AN663;
829; MOV CL,device ;AN663;
830; AND CL,07H ;AN663;
831; DEC CL ;AN663;
832; SHL CL,1 ;AN663;
833; MOV DH,11111100B ;set bit mask to get rid of old setting ;AN663;
834; ROL DH,CL ;rotate bits into position ;AN663;
835; ;AN663;
836; .IF <retry_index NE 0> THEN ;AN663;
837; ;AN663;
838; .IF <redirected EQ true> THEN ;AN663;
839; ;AN663;
840; display not_supported ;infinite retry not supported on network printer ;AN663;
841; ;AN663;
842; .ELSE NEAR ;not a network printer ;AN663;
843; ;AN663;
844; MOV DI,retry_index ;AN663;
845; MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663;
846;
847; .SELECT ;AN663;
848;
849; .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663;
850; .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663;
851; MOV AL,error_retry_active ;AN663;
852;
853; .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
854; MOV AL,busy_retry_active ;AN663;
855;
856; .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
857; MOV AL,ready_retry_active ;AN663;
858;
859; .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;
860; MOV AL,no_retry_active ;AN663;
861;
862; .ENDSELECT
863;
864; .IF <AL EQ no_retry_active> THEN
865; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry
866; .ELSE ;AN663;
867; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
868; .ENDIF ;AN663;
869; ;AN663;
870; .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663;
871; CALL modeload ;load resident code ;AN663;
872; .ENDIF ;AN663;
873; ;AN663;
874; MOV ES,ES:WORD PTR resseg[2] ;AN663;
875; MOV DL,BYTE PTR ES:res_lpt_retry_type ;get old setting ;AN663;
876; ;AN663;
877; ROL AL,CL ;AN663;
878; AND DL,DH ;AN663;
879; OR DL,AL ;AN663;
880; MOV BYTE PTR ES:res_lpt_retry_type,DL ;store new setting ;AN663;
881; ;AN663;
882; .ENDIF ;AN663;
883; ;AN663;
884; .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663;
885; ; retry is specified then ;AN663;
886; MOV ES,ES:WORD PTR resseg[2] ;AN663;
887; MOV DL,BYTE PTR ES:res_lpt_retry_type ;AN663;
888; ;AN663;
889; .IF <parms_form NE keyword> ;no retry specified with ;AN663;
890; ;positional parameters ;AN663;
891; AND DL,DH ; set bits to zero ;AN663;
892; MOV BYTE PTR ES:res_lpt_retry_type,DL ;AN663;
893; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
894; ;AN663;
895; .ELSE ;else, no retry specified with keywords
896; ; update pparm with current retry type ;AN663;
897; NOT DH ;AN663;
898; AND DL,DH ;AN663;
899; SHR DL,CL ;AN663;
900; ;AN663;
901; .IF <DL EQ no_retry_active> THEN ;AN663;
902; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
903; .ELSE ;AN663;
904; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
905; .ENDIF ;AN663;
906; ;AN663;
907; .ENDIF ;AN663;
908; ;AN663;
909; .ELSE ;no retry, no code resident ;AN663;
910; ;AN663;
911; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
912; ;AN663;
913; .ENDIF ;AN663;
914; ;'Infinite retry on parallel printer timeout' OR ;AN663;
915; DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
916; ;AN663;
917; POP DX ;restore registers ;AN663;
918; POP AX ;AN663;
919; POP DI ;AN663;
920; POP ES ;AN663;
921; RET ;AN663;
922; ;AN663;
923;set_retry_flag ENDP ;AN663;
924;-------------------------------------------------------------------------------
925;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
926;³ ³
927;³ SET_retry_type ³
928;³ -------------- ³
929;³ ³
930;³ Set the resident retry mask to for all LPTs
931;³ ³
932;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³
933;³ retry_index - holds index value for the parsed retry parameter. ³
934;³ redirected - holds true/false value for redirected status of lptx. ³
935;³ parm_list_holder - holds offset of parameter list. ³
936;³ resseg - holds offset of resident code in memory ³
937;³ ³
938;³ ³
939;³ RETURN:
940
941;³ ³
942;³ ³
943;³ MESSAGES: none
944;³ ³
945;³ ³
946;³ REGISTER ³
947;³ USAGE: AL -
948
949;³ CL -
950;³ ES -
951;³ BP -
952;³ DI -
953;³ DL -
954;³ ³
955;³ ³
956;³ PSUEDO CODE: ³
957
958;³ ³
959;³ SAVE REGISTERS ³
960;³ SET UP SEGMENT REGISTER
961;³ IF <RETRY REQUESTED> ³
962;³ IF <PRINTER IS REDIRECTED> ³
963;³ PRINT ERROR MESSAGE - not supported on network printer. ³
964;³ ELSE ³
965;³ SET UP PARAMETER LIST STRUCTURE ³
966;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³
967;³ LOAD RESIDENT CODE IF NEEDED ³
968;³ SET AND STORE NEW lpt retry mask
969;³ ENDIF ³
970;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
971;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
972;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
973;³ ELSE ³
974;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
975;³ ENDIF ³
976;³ ELSE ³
977;³ SET pparm TO '-' ³
978;³ ENDIF ³
979;³ RESTORE REGISTERS ³
980;³ RETURN ³
981;³ ³
982;³ ³
983;³ SIDE EFFECT:
984;³ ³
985;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
986;
987set_retry_type PROC NEAR ;AN663;
988 ;AN663;
989
990PUSH ES ;save registers ;AN663;
991PUSH DI ;AN663;
992PUSH AX ;AN663;
993PUSH BX
994PUSH DX ;AN663;
995 ;AN663;
996XOR BX,BX ;clear a reg ;AN663;
997MOV ES,BX ;set to segment at 0 ;AN663;
998MOV BL,device ;AN663;
999AND BL,07H ;AN663;
1000DEC BL ;BX=zero based binary printer number ;AN663;
1001 ;AN663;
1002.IF <retry_index NE 0> THEN NEAR ;IF retry requested on this invokation THEN ;AN663;
1003 ;AN663;
1004 .IF <redirected EQ true> THEN ;AN663;
1005 ;AN663;
1006 display not_supported ;infinite retry not supported on network printer ;AN663;
1007 ;AN663;
1008 .ELSE NEAR ;not a network printer ;AN663;
1009 ;AN663;
1010 MOV DI,retry_index ;AN663;
1011 MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663;
1012
1013 .SELECT ;AN663;
1014
1015 .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663;
1016 MOV AL,error_status ;set mask byte to horrible status ;AN663;
1017
1018 .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663;
1019 .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
1020 MOV AL,busy_status ;set mask byte to actual status ;AN663;
1021
1022 .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
1023 MOV AL,ready_status ;set mask byte to rosy status ;AN663;
1024
1025 .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;;AN000;
1026 MOV AL,no_retry_flag ;when there is no retry the mask will not be used, so this is just a flag
1027
1028 .ENDSELECT
1029
1030 PUSH AX ;save the retry setting ;AN001;
1031 .IF <AL EQ no_retry_flag> THEN
1032;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry
1033 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1034 .ELSE ;AN663;
1035;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
1036 set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001;
1037 .ENDIF ;AN663;
1038 POP AX ;restore the retry setting ;AN001;
1039
1040 .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;IF code not resident THEN ;AN663;
1041 .IF <AL NE no_retry_flag> THEN ;need to turn on retry
1042 CALL modeload ;load resident code ;AN663;
1043 MOV ES,ES:WORD PTR resseg[2] ;AN663;
1044 MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663;
1045 .ENDIF
1046 .ELSE ;ELSE code is already resident
1047 MOV ES,ES:WORD PTR resseg[2] ;AN663;
1048 MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663;
1049 .ENDIF ;AN663;
1050 ;AN663;
1051 .ENDIF ;AN663;
1052 ;AN663;
1053.ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663;
1054 ; retry is specified then ;AN663;
1055 MOV ES,ES:WORD PTR resseg[2] ;ES=segment of the resident code ;AN663;
1056 ;AN663;
1057 .IF <parms_form NE keyword> ;no retry specified with ;AN663;
1058 ;positional parameters, so turn off retry ;AN663;
1059 MOV BYTE PTR ES:lpt1_retry_type[BX],no_retry_flag ;set flag for get retry routine;AN663;
1060;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1061 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1062 ;AN663;
1063 .ELSE ;else, no retry specified with keywords
1064 ; update pparm with current retry type ;AN663;
1065 .IF <<BYTE PTR ES:lpt1_retry_type[BX]> EQ no_retry_flag> THEN ;AN663;
1066;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1067 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1068 .ELSE ;AN663;
1069;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
1070 set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001;
1071 .ENDIF ;AN663;
1072 ;AN663;
1073 .ENDIF ;AN663;
1074 ;AN663;
1075.ELSE ;no retry, no code resident ;AN663;
1076 ;AN663;
1077;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1078 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1079 ;AN663;
1080.ENDIF ;AN663;
1081 ;'Infinite retry on parallel printer timeout' OR ;AN663;
1082DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
1083 ;AN663;
1084POP DX ;restore registers ;AN663;
1085POP BX
1086POP AX ;AN663;
1087POP DI ;AN663;
1088POP ES ;AN663;
1089 ;AN663;
1090RET ;AN663;
1091 ;AN663;
1092set_retry_type ENDP ;AN663;
1093
1094PRINTF_CODE ENDS
1095 END
1096 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/MODEQUAT.INC b/v4.0/src/CMD/MODE/MODEQUAT.INC
new file mode 100644
index 0000000..bf79f45
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEQUAT.INC
@@ -0,0 +1,48 @@
1;---------------------- POSSIBLE VALUES FOR "machine_type" -------------------
2
3;See "get_machine_type" for details on how "machine_type" is used
4
5
6PC1 EQU 0FFH ;scalar value and model byte for PC1
7PCXT EQU 0FEH ;scalar value for XT, only one because each release is same to MODE
8PCJr EQU 0FDH ;scalar value for PCJr
9AT1 EQU 0FCH ;scalar value for first release of AT and VAIL
10AT2 EQU 000H ;scalar value and submodel byte for second release of AT
11AT3 EQU 001H ;scalar value and submodel byte for internal release of third version of AT
12AT4 EQU 006H ;scalar value and submodel byte for AT on or later than 11/15/85
13XT286 EQU 002H ;scalar value and submodel byte for XT 286
14Convertible EQU 0F9H ;scalar value and model byte for PC Convertible
15PS2Model30 EQU 0FAH ;scalar value and model byte for Personal System/2 Model 30
16PS2Model50 EQU 004H ;scalar value and submodel byte for Personal System/2 Model 50
17PS2Model60 EQU 005H ;scalar value and model byte for Personal System/2 Model 60
18PS2Model80 EQU 0F8H ;scalar value and model byte for Personal System/2 Model 80 and SNOWMASS
19Vail EQU 009H ;AN001;scalar value and submodel byte for VAIL
20
21
22bogus EQU 88H ;completely invalid value
23COM1 EQU 0C1H ;used by invoke
24COM2 EQU 0C2H ;used by invoke
25COM3 EQU 0C3H ;used by invoke
26COM4 EQU 0C4H ;used by invoke
27false EQU 00H
28true EQU 0FFH
29
30
31;FLAGS field bit(s) values
32
33Left_Align equ 0 ;00xxxxxx
34Right_Align equ 80h ;10xxxxxx
35
36Unsgn_Bin_Byte equ 11h ;a0010001
37
38
39PUBLIC bogus
40
41;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
42;º º
43
44; AX001 - P4543: Add VAIL and SNOWMASS to legal choices for 19200 baud
45
46;º º
47;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
48
diff --git a/v4.0/src/CMD/MODE/MODESCRN.ASM b/v4.0/src/CMD/MODE/MODESCRN.ASM
new file mode 100644
index 0000000..3c529b3
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODESCRN.ASM
@@ -0,0 +1,564 @@
1PAGE ,132 ;
2TITLE MODESCRN.ASM - SCREEN SUPPORT FOR THE MODE COMMAND
3
4.XLIST
5INCLUDE STRUC.INC
6.LIST
7
8INCLUDE COMMON.STC ;definitions of message sublist blocks ;AC001;
9
10;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
11;º º ;AN000;
12 ;AN000;
13; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the
14; USA.MSG file because it looked like a common message. Now
15; I use a different (better) message. It was "Invalid paramters",
16; is now "Function not supported - ????".
17
18; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
19; implement the SYSGETMSG method of getting addressability to
20; the pieces. This means that the code does a SYSGETMSG call
21; which returns a pointer (DS:SI) to the message piece. The
22; address is then put in the sublist block for the message
23; being issued.
24
25; AX002 - P5159: Need to use get extended country call (6523) to get the yes
26; 7-14-88 no answer
27
28;º º ;AN000;
29;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
30
31;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32;º º
33
34BREAK MACRO X
35 JMP endcase_&X
36ENDM
37
38
39SCRN MACRO COMMAND,MOD
40 MOV AH,COMMAND ;REQUEST FUNCTION OF SCREEN BIOS
41 IFNB <MOD>
42 MOV AL,MOD ;SET MODE TO SCREEN
43 ENDIF
44 INT 10H ;CALL BIOS SCREEN HANDLER
45;
46 ENDM
47;
48DISPLAY MACRO MSG
49IFNB <MSG>
50 MOV DX,OFFSET MSG
51ENDIF
52 CALL PRINTF
53ENDM
54
55
56SET_LEFT_SHIFT_LIMIT MACRO
57 LOCAL LIMIT_SET
58 ASSUME DS:ROM_BIOS
59;
60 PUSH DS
61 PUSH AX
62 MOV AX,ROM_BIOS_SEG
63 MOV DS,AX
64 CMP DS:MACHINE_TYPE,JUNIOR ;IF this machine is a Junior THEN
65 JNE LIMIT_SET
66 MOV BYTE PTR CS:LEFT_LIMIT,JR_LEFT_LIMIT ;USE THE JUNIOR'S LEFT LIMIT
67 LIMIT_SET:
68 POP AX
69 POP DS
70;
71 ASSUME DS:PRINTF_CODE
72;
73ENDM
74
75set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
76
77MOV AX,submessage ;AX=message number ;AN001;
78MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
79CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
80MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
81MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
82ENDM ;AN001;
83
84
85;---------------------------------------------------------------------------
86; SET_UP_FOR_PRINTF
87;PRINTF depends on DS containing the segment that the messages are in, so if
88;DS is being used to address data areas elsewhere it needs to be temporarily
89;set to the message file segment.
90;---------------------------------------------------------------------------
91;
92SET_UP_FOR_PRINTF MACRO
93
94 PUSH DS ;SAVE DS
95 PUSH CS
96 POP DS ;DS NOW HAS MESSAGE SEGMENT
97;
98ENDM
99
100;----------------------------------------------------------------------------
101; REPLACE_DS
102;Replace the contents DS had before the PRINTF call. Assume that DS was pushed.
103;-----------------------------------------------------------------------------
104
105REPLACE_DS MACRO
106
107 POP DS
108;
109ENDM
110
111;º º
112;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
113
114CURRENT_VIDEO_STATE EQU 15 ;REQUEST TO BIOS SCREEN TO RETURN SCREEN STATE
115SET_SCREEN_MODE EQU 0 ;REQUEST TO BIOS SCREEN TO SET SCREEN MODE
116COL40 EQU 1 ;FLAG BIT TO REQUEST 40 COL
117COL80 EQU 2 ;FLAG BIT TO REQUEST 80 COL
118CNT4 EQU 4 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 40COL
119CNT8 EQU 8 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 80COL
120FORTY EQU 40 ;SCREEN WIDTH
121MONO_MODE EQU 7 ;MONOCHROME SCREEN MODE
122no EQU 0 ;AC002;value to compare with when user responds with no character
123NOEXIT EQU 0 ;EXIT SWITCH VALUE TO REPEAT LOOP
124EXIT EQU 1 ;EXIT SWITCH VALUE TO LEAVE LOOP
125YES EQU 1 ;AC002;value AX will be if user types yes character ("y", "s", "j" etc)
126;
127
128
129
130
131
132; OFFSETS INTO VIDEO TABLE, AT 40:90
133SHIFCT40 EQU 02H ;SHIFT COUNT FOR 40 COL
134SHIFCT80 EQU 012H ;SHIFT COUNT FOR 80 COL
135SHIFCTGR EQU 022H ;SHIFT COUNT FOR GRAPHICS
136CR EQU 13 ;CARRIAGE RETURN
137LF EQU 10 ;LINE FEED
138BEEP EQU 7 ;SOUND THE AUDIBLE ALARM
139LOWERCASE EQU 20H ;ADD THIS TO UPPER, GET LOWER CASE
140TRUE EQU 0FFH
141
142RIGHT_LIMIT EQU 01 ;SAME FOR ALL TYPES OF MACHINES
143JUNIOR EQU 0FDH ;MACHINE TYPE SIGNITURE FOR PC JUNIOR
144JR_LEFT_LIMIT EQU 031H ;LEFT LIMIT FOR SCREEN SHIFT ON PC JUNIOR
145;
146EGA_SIG EQU 0AA55H ;SIGNITURE FOR THE EGA CARD
147;
148ROM_BIOS SEGMENT AT 0F000H
149 ORG 0FFFEH
150;
151 MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM
152;
153ROM_BIOS ENDS
154
155ROM_BIOS_SEG EQU 0F000H
156;
157SIGNITURE SEGMENT AT 0C000H ;SEGMENT OF EGA AREA
158 ORG 0
159SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
160SIGNITURE ENDS
161;
162PRINTF_CODE SEGMENT PUBLIC
163 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
164;
165
166
167;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
168;º º
169
170PUBLIC HANDLE_40_OR_80 ;make available to "ANALYZE_AND_INVOKE"
171PUBLIC SHIFT_SCREEN ;make available to "ANALYZE_AND_INVOKE"
172
173
174;º º
175;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
176
177
178;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
179;º º
180
181EXTRN CANT_SHIFT:WORD ;CR,LF,"Unable to shift screen",BEEP,EOM
182EXTRN PRINTF:NEAR ;interface to message service ROUTINE
183EXTRN SCRNTAB:NEAR ;LOADS VIDEO INIT TABLE RETURNING POINTER TO IT
184;
185EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
186;PARM1 DB 10 DUP(0)
187;PARM2 DB 0
188;PARM3 DB 0
189;MODE DB 0
190;FLAG DB 0
191EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD
192EXTRN NOERROR:BYTE ;INDICATE IF AN ERROR OCCURED YET
193ENDPARM EQU MODE
194EXTRN ALT_SELECT:ABS ;INT 10 FUNCTION GET MONITOR TYPE
195EXTRN EGA_INFO:ABS ;INT 10 FUNCTION GET INFO
196EXTRN COLOR_ON_IT:ABS ;INT 10 RETURN FOR COLOR MONITOR HOOKED TO EGA
197;
198LEFT_LIMIT DB 02EH ;SCREEN SHIFT LEFT LIMIT, MAY BE Revised
199;
200SWITCH DB 0 ;LOOP CONTROLLER
201;AC000;OK DB 1 ;INDICATOR OF VALID REQUEST:
202; 1=BAD, 0=GOOD
203;
204EXTRN L_item_tag:ABS ;see MODEpars.asm ;AN000;
205EXTRN R_item_tag:ABS ;see MODEpars.asm ;AN000;
206EXTRN T_item_tag:ABS ;see MODEpars.asm ;AN000;
207
208EXTRN RIGHTMOST:WORD ;message number for "rightmost 9",EOM ;AC001;
209EXTRN LEFTMOST:WORD ;message number for "leftmost 0",EOM ;AC001;
210;AC001;EXTRN LFTM_OR_RGHTM_PTR:WORD
211EXTRN SHIFT_MSG:WORD ;CR,LF,"Do you see the ...",CR,LF,EOM ;AX000;
212;AC000;EXTRN MSGI:WORD ;CR,LF,"Invalid parameters",BEEP,CR,LF,"$" ;AX000;
213EXTRN NUMBERS:WORD ;"0123456789" ;AX000;
214EXTRN LEFT:WORD ;message number for "left",EOM ;AC001;
215EXTRN RIGHT:WORD ;message number for "right",EOM ;AC001;
216;AC001;EXTRN LEFT_OR_RIGHT_PTR:WORD ;PART OF MESSAGE "Unable to shift screen ..."
217EXTRN sublist_cant_shift:BYTE ;definition of submessage ;AC001;
218EXTRN sublist_shift_msg:BYTE ;definition of submessage ;AC001;
219EXTRN SYSGETMSG:NEAR ;used to get the address of a message part ;AC001;
220EXTRN utility_msg_class:ABS ;input for sysgetmsg ;AC001;
221
222
223;º º
224;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
225
226
227
228;----------------------------------------------------------------------------
229
230
231HANDLE_40_OR_80 PROC NEAR ;AN000;
232
233; SCREEN WIDTH IN BL
234;
235 SCRN CURRENT_VIDEO_STATE,0 ;GET CURRENT SCREEN MODE
236 MOV DS:MODE,AL ;STORE CURRENT MODE
237; IF THE REQUEST WAS FOR 40 COL,
238 CMP BL,FORTY ;COMPARE WITH BL, OUTPUT FROM 'MODELENG'
239 JNE ELSE01
240;
241;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE
242; CASE current mode =
243
244; 0,
245; 2,
246; 5,
247; 6,
248; 7,
249; 11:
250
251 .IF <DS:mode EQ 0> OR
252 .IF <DS:mode EQ 2> OR
253 .IF <DS:mode EQ 5> OR
254 .IF <DS:mode EQ 6> OR
255 .IF <DS:mode EQ 7> OR
256 .IF <DS:mode EQ 011H> THEN
257 MOV DS:MODE,0 ;SWITCH TO 40 COL, BW
258 BREAK 0
259 .ENDIF
260
261; 1,
262; 3,
263; 4,
264; 12,
265; 13:
266
267 .IF <DS:mode EQ 1> OR
268 .IF <DS:mode EQ 3> OR
269 .IF <DS:mode EQ 4> OR
270 .IF <DS:mode EQ 012H> OR
271 .IF <DS:mode EQ 013H> THEN
272 MOV DS:MODE,1 ;SWITCH TO 40 COL, COLOR
273 BREAK 0
274 .ENDIF
275
276
277 ENDCASE_0:
278
279
280 SCRN SET_SCREEN_MODE,DS:MODE ;SWITCH TO 40 COL
281; ELSE ,SINCE REQUEST NOT FOR 40 COL,
282 JMP SHORT ENDIF01
283ELSE01:
284; : : IF REQUEST FOR 80 COL
285 CMP BL,80
286 JNE ENDIF02
287;
288;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE
289 ; CASE current mode =
290
291 ; 0,
292 ; 2,
293 ; 5,
294 ; 6,
295 ; 7,
296 ; 11:
297
298 .IF <DS:mode EQ 0> OR
299 .IF <DS:mode EQ 2> OR
300 .IF <DS:mode EQ 5> OR
301 .IF <DS:mode EQ 6> OR
302 .IF <DS:mode EQ 7> OR
303 .IF <DS:mode EQ 011H> THEN
304 MOV DS:MODE,2 ;SWITCH TO 80 COL, BW
305 BREAK 1
306 .ENDIF
307
308 ; 1,
309 ; 3,
310 ; 4,
311 ; 12,
312 ; 13:
313
314 .IF <DS:mode EQ 1> OR
315 .IF <DS:mode EQ 3> OR
316 .IF <DS:mode EQ 4> OR
317 .IF <DS:mode EQ 012H> OR
318 .IF <DS:mode EQ 013H> THEN
319 MOV DS:MODE,3 ;SWITCH TO 80 COL, COLOR
320 BREAK 1
321 .ENDIF
322
323
324 ENDCASE_1:
325
326 SCRN SET_SCREEN_MODE,DS:MODE
327; : : ENDIF ,END REQUEST FOR 80 COL
328ENDIF02:
329; : ENDIF ,END REQUEST FOR 40 COL
330ENDIF01:
331
332
333RET ;AN000;
334
335HANDLE_40_OR_80 ENDP ;AN000;
336
337
338;------------------------------------------------------------------------------
339
340
341SHIFT_SCREEN PROC NEAR ;AN000;shift the screen
342
343; DO SHIFT UNTIL HE CAN SEE END CHAR
344 MOV SWITCH,NOEXIT ;SET TO REPEAT NEXT LOOP
345DO01:
346; : IF second PARM (sd) IS AN "R"?
347 CMP DS:PARM2,R_item_tag ;AC000;
348 JE SKIP03 ;IT'S AN R SO TRY TO SHIFT RIGHT
349 JMP ELSE03 ;NOT AN R SO CHECK FOR L
350;
351 SKIP03:
352;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE
353 SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE
354 CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA mono so ...
355; $IF GE
356 JNGE $$IF1
357;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO
358 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
359 DISPLAY CANT_SHIFT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO
360; $ELSE LONG ;JUMP PAST SHIFT LOOP
361 JMP $$EN1
362$$IF1:
363;
364CHECK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA
365 MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD
366 MOV ES,AX ;ADDRESS THROUGH ES
367 CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN
368 JNE TRY_TO_SHIFT
369 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
370 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
371 MOV BH, COLOR_ON_IT ;protect against RT PC problem
372 not bh ; masm 5.0 won't allow "not color_on_it"
373 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
374 CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN
375 JNE TRY_TO_SHIFT
376;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ; YELL BECAUSE CAN'T SHIFT AN EGA
377 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
378 DISPLAY CANT_SHIFT
379 JMP ELSE05 ; JUMP PAST SHIFT LOOP
380;
381TRY_TO_SHIFT:
382 CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA
383; DS NOW POINTS TO THE SEGMENT WHERE THE VIDEO TABLE WAS MOVED TO.
384; BX HAS THE NEW OFFSET OF THE VIDEO TABLE
385
386 CMP BYTE PTR DS:[BX][SHIFCT40],RIGHT_LIMIT ;IF haven't shifted max right THEN
387 JG SHIFT_RIGHT
388 SET_UP_FOR_PRINTF
389;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT
390 set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right"
391 DISPLAY CANT_SHIFT ;"Unable to shift screen right"
392 REPLACE_DS
393 JMP ELSE05
394 SHIFT_RIGHT:
395 MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT FOR 40COL
396 SUB AL,1 ;SHIFT IT LEFT 1
397 MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK
398 MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT FOR 80COL
399 SUB AL,2 ;SHIFT LEFT 2
400 MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK
401 MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS SHIFT COUNT
402 SUB AL,1 ;SHIFT LEFT 1
403 MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK
404; : ELSE ,SINCE PARM2 IS NOT AN "R"
405 JMP ENDIF03
406ELSE03:
407; : : IF THIS CHAR IS AN "L"?
408 CMP DS:PARM2,L_item_tag ;AC000;
409 JE SKIP05 ;L WAS SPECIFIED SO TRY TO SHIFT LEFT
410 JMP ELSE05 ;WASN'T "L" OR "R" SO DONT'T TRY TO SHIFT
411; SINCE IT IS "L",
412;
413 SKIP05:
414;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE
415 SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE
416 CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA or mono so ...
417 JB CHK_FOR_EGA
418;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ;YELL BECAUSE CAN'T SHIFT AN EGA
419 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
420 DISPLAY CANT_SHIFT
421 JMP ELSE05 ;JUMP PAST SHIFT LOOP
422;
423 CHK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA
424 MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD
425 MOV ES,AX ;ADDRESS THROUGH ES
426 CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN
427 JNE TRY_TO_SHIFT_LEFT
428 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
429 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
430 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
431 CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN
432 JNE TRY_TO_SHIFT_LEFT
433;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ; YELL BECAUSE CAN'T SHIFT AN EGA
434 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
435 DISPLAY CANT_SHIFT
436 JMP ELSE05 ; JUMP PAST SHIFT LOOP
437;
438TRY_TO_SHIFT_LEFT:
439 CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA
440; DS NOW POINTS TO THE SEGMENT OF THE RESIDENT CODE,
441; WHERE THE VIDEO TABLE WAS MOVED TO.
442;
443 SET_LEFT_SHIFT_LIMIT ;SET LIMIT TO SUIT MACHINE TYPE
444;
445 MOV AL,BYTE PTR DS:[BX][SHIFCT40] ;AL=current horizontal sync position
446 CMP AL,CS:LEFT_LIMIT ;IF haven't shifted max left THEN
447 JL SHIFT_LEFT
448 SET_UP_FOR_PRINTF
449;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT
450 set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001;
451 DISPLAY CANT_SHIFT
452 REPLACE_DS
453 JMP ELSE05
454 SHIFT_LEFT:
455 MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT 40COL
456 ADD AL,1 ;SHIFT RIGHT ONE
457 MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK
458 MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT 80COL
459 ADD AL,2 ;SHIFT RIGHT 2
460 MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK
461 MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS COUNT
462 ADD AL,1 ;SHIFT RIGHT 8 PIXELS
463 MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK
464; : : ELSE ,SINCE CHAR IS NEITHER "R" NOR "L", QUIT
465 JMP SHORT ENDIF05
466; $ENDIF ;EGA or MONO
467$$EN1:
468ELSE05:
469 MOV CS:SWITCH,EXIT ;REQUEST LOOP BE TERMINATED
470; : : ENDIF ,END IS THIS CHAR AN "L"? TEST
471ENDIF05:
472; : ENDIF END, IS PARM2 AN "R"? TEST
473ENDIF03:
474
475PUBLIC ENDIF03
476
477 MOV AX,CS ;RESTORE THIS SEG
478 MOV DS,AX ; TO DS
479; LEAVE IF THE EXIT SWITCH IS SET
480;AC001; CMP SWITCH,EXIT
481;AC001; JE ENDDO01
482 .IF <switch NE exit> THEN NEAR
483;
484 SCRN CURRENT_VIDEO_STATE,0
485 MOV DS:MODE,AL ;SAVE CURRENT MODE
486; LEAVING CURRENT MODE IN AL,
487 SCRN SET_SCREEN_MODE ;RESET IN CURRENT MODE
488; : IF THIS IS "T"
489 CMP DS:PARM3,T_item_tag ;AC000;
490 JNE ELSE06
491;
492; DECIDE WHICH QUESTION TO DISPLAY...
493; : : IF REQUESTED FUNCTION IS "R"
494 CMP DS:PARM2,R_item_tag ;AC000;
495 JNE ELSE08
496
497;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET LEFTMOST
498 set_submessage_ptr leftmost,shift_msg ;set up message sublist with pointer to "leftmost" ;AC001;
499; : : ELSE ,SINCE WAS NOT "R"
500 JMP SHORT ENDIF08
501ELSE08:
502;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET RIGHTMOST
503 set_submessage_ptr rightmost,shift_msg ;set up message sublist with pointer to "rightmost" ;AC001;
504; : : ENDIF END FUNCTION IS "R"? TEST
505ENDIF08:
506
507; decide how many times to display "0123456789"
508 OR DS:MODE,01H ;SET UP TO TEST FOR COLOR OR B/W
509 MOV CX,CNT8 ;(GUESS IT IS 80COL) SET LOOP CTR TO 8
510; : : IF 40 COL?
511 CMP DS:MODE,COL40
512 JNE ENDIF07
513;
514 MOV CX,CNT4 ;(FIX ABOVE GUESS) SET LOOP CTR TO 4
515; : : ENDIF ,END IS IT 40 COL? TEST
516ENDIF07:
517;
518 .REPEAT
519 SCRN SET_SCREEN_MODE,DS:MODE ;clear the screen
520 PUSH CX ;save loop counter
521 DO02: ;DO UNTIL LINE IS DISPLAYED across entire screen
522 DISPLAY NUMBERS ;DISPLAY 0123456789
523; ENDDO WHEN CNT IN CX = 0
524 LOOP DO02
525 DISPLAY SHIFT_MSG ;AN000;DISPLAY QUESTION, msg services will do the keyboard input, see modedefs.inc
526 MOV DL,AL ;AC002;DL=character user entered
527 MOV AX,6523H ;AN002;yes no check get extended error
528 INT 21H ;AN002;AX returned with indication of yes or no
529 POP CX ;restore loop counter
530 .UNTIL <AX EQ yes> OR
531 .UNTIL <AX EQ no>
532; : : IF RESPONSE IS "Y"
533 CMP AL,YES
534 JNE ENDIF09
535 MOV SWITCH,EXIT ;TERMINATE THE LOOP
536; : : ENDIF ,END IS RESPONSE "N"? TEST
537ENDIF09:
538; : ELSE ,SINCE "T" NOT SPECIFIED
539 JMP SHORT ENDIF06
540ELSE06:
541 MOV SWITCH,EXIT ;TERMINATE THE LOOP
542; : ENDIF ,END IS THIS "T"? TEST
543ENDIF06:
544; LEAVE IF EXIT SWITCH IS SET
545 CMP SWITCH,EXIT
546 JE ENDDO01
547;
548; ENDDO GO BACK AND SHIFT MORE
549 JMP DO01
550 .ENDIF
551ENDDO01:
552;
553; IF NO LEGAL FUNCTIONS DONE,
554;AC000;; CMP OK,0
555;AC000; JZ ENDIF10
556
557;AC000; DISPLAY MSGI ;FUSS ABOUT ILLEGAL PARAMETERS
558; ENDIF ,END ARE NO LEGAL FUNCTIONS DONE? TEST
559;AC000;ENDIF10:
560 RET ;RETURN TO MODE MAIN ROUTINE
561SHIFT_SCREEN ENDP ;AN000;
562PRINTF_CODE ENDS
563 END
564 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/MODESUBS.INC b/v4.0/src/CMD/MODE/MODESUBS.INC
new file mode 100644
index 0000000..eb0c0a8
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODESUBS.INC
@@ -0,0 +1,598 @@
1
2;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
3;º º
4
5; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
6; implement the SYSGETMSG method of getting addressability to
7; the pieces. This means that the code does a SYSGETMSG call
8; which returns a pointer (DS:SI) to the message piece. The
9; address is then put in the sublist block for the message
10; being issued.
11
12; AC002 - P3258: PS/2 only COM parameters were being allowed on non-PS/2
13; machines. Added checks for baud=19200, parity=mark or space,
14; data=5 or 6, stop=1.5 for both keyword and positional forms
15; in MODEPARSE.ASM. Had to enlarge the possible parm size for
16; "Function not supported on this computer - ?????????????"
17
18;º º
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
20
21
22;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
23;º º
24
25;PUBLICs for the sublists are handled in modemes.asm
26PUBLIC Utility_Msg_Class ;AN001;
27
28;º º
29;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
30
31
32;
33;*****************************************************************************
34; External data declarations
35;*****************************************************************************
36
37
38
39;
40;*****************************************************************************
41; Message Retriever equates
42;*****************************************************************************
43;
44
45INCLUDE common.stc ;contains the following structure
46
47;sublist_def STRUC
48
49; db ? ;Sublist Length, fixed
50; db ? ;Reserved, not used yet ;AN000;
51; dw ? ;offset
52;sublist_seg dw ? ;segment part of pointer to piece of message
53; db ? ;number of this piece of the message,0 indicates special end of message format ;AN000;
54; db ? ;flags
55; db ? ;maximum field width
56; db ? ;minimum field width
57; db ? ;character to use for padding
58
59;sublist_def ENDS
60
61
62
63INCLUDE modequat.inc ;contains the following two equates for this file
64
65;FLAGS field bit(s) values
66
67;Left_Align equ 0 ;00xxxxxx
68;Right_Align equ 80h ;10xxxxxx
69
70Char_Field_Char equ 0 ;a0000000
71Char_Field_ASCIIZ equ 00010000B ;a0010000
72
73;Unsgn_Bin_Byte equ 11h ;a0010001
74Unsgn_Bin_Word equ 21h ;a0100001
75Unsgn_Bin_DWord equ 31h ;a0110001
76
77Sgn_Bin_Byte equ 12h ;a0010010
78Sgn_Bin_Word equ 22h ;a0100010
79Sgn_Bin_DWord equ 32h ;a0110010
80
81Bin_Hex_Byte equ 13h ;a0010011
82Bin_Hex_Word equ 23h ;a0100011
83Bin_Hex_DWord equ 33h ;a0110011
84
85
86
87Blank equ " "
88No_Function equ 0
89No_Replace equ 0
90
91Msg_Ser_Class equ 0
92Ext_Err_Class equ 1
93Parse_Error_Class equ 2
94Utility_Msg_Class equ 0FFh
95
96Reserved equ 0
97
98Sublist_Length equ TYPE sublist_def
99
100to_be_filled_in EQU 77H ;conspicious number
101
102
103
104;
105;*****************************************************************************
106; Message Sublist Tables
107;*****************************************************************************
108;
109;The following control blocks are used for messages with
110;replaceable paramters. These control blocks are used by the
111;SysDispMsg routine.
112;
113
114;--------------------------- ;
115first_sublist LABEL BYTE
116
117sublist_invalid_switch label byte ;AN000;description of %0
118sublist_invalid_parameter label byte ;AN000;description of %0
119 ;
120 db Sublist_Length ;fixed ;AN000;
121 db Reserved ;not used yet ;AN000;
122offending_parameter_ptr LABEL WORD
123 dw offset offending_parameter ;pointer to string or binary value ;AN000;
124 dw to_be_filled_in ;
125 db 0 ;ID, special end of message format ;AN000;
126sub_typ db Left_Align+char_field_ASCIIZ ;maybe changed ;AN000;
127 db 0 ;Max width 123, 128-"MODE " ;AN000;
128 db 1 ;May be one char long ;AN000;
129 db Blank ; ;AN000;
130;--------------------------- ;
131
132sublist_err1 label byte ;AN000;description of %0
133 ;
134 db Sublist_Length ;fixed ;AN000;
135 db Reserved ;not used yet ;AN000;
136illegal_device_ptr LABEL WORD
137 dw ? ;pointer to device name string filled in by modecom;AN000;
138 dw to_be_filled_in ;
139 db 0 ;ID, special end of message format ;AN000;
140 db Left_Align+char_field_ASCIIZ ; ;AN000;
141 db 5 ;Max width, "LPT1:" ;AN000;
142 db 4 ;"COM3" ;AN000;
143 db Blank ; ;AN000;
144;--------------------------- ;
145Sublist_PT80 label byte ; ;AN000;
146 ;
147 db Sublist_Length ; ;AN000;
148 db Reserved ; ;AN000;
149 dw offset PT80N ;where the printer number is stashed ;AN000;
150 dw to_be_filled_in ; ;AN000;
151 db 1 ;ID, only one sublist ;AN000;
152 db Left_Align+Char_Field_Char ; ;AN000;
153 db 1 ; ;AN000;
154 db 1 ; ;AN000;
155 db Blank ;no filler needed but still have this field to fill
156;--------------------------- ;
157Sublist_PT132 label byte ; ;AN000;
158 ;
159 db Sublist_Length ; ;AN000;
160 db Reserved ; ;AN000;
161 dw offset PT132N ; ;AN000;
162 dw to_be_filled_in ; ;AN000;
163 db 1 ; ;AN000;
164 db Left_Align+Char_Field_Char ; ;AN000;
165 db 1 ; ;AN000;
166 db 1 ; ;AN000;
167 db Blank ; ;AN000;
168;--------------------------- ;
169Sublist_initmsg label byte ;CR,LF,"COM%c: %3s,%c,%c,%c,%c",CR,LF,EOM
170 ;
171 db Sublist_Length ; ;AN000;
172 db Reserved ; ;AN000;
173 dw offset device ; ;AN000;
174 dw to_be_filled_in ; ;AN000;
175 db 1 ;first of 6 ;AN000;
176 db Left_Align+char_field_char ;AN000;
177 db 1 ; ;AN000;
178 db 1 ;one char number between 1 and 4;AN000;
179 db Blank ; ;AN000;
180
181 db Sublist_Length ; ;AN000;
182 db Reserved ; ;AN000;
183pbaud_ptr label byte
184 dw offset pbaud ; ;AN000;
185 dw to_be_filled_in ; ;AN000;
186 db 2 ;second of 6 ;AN000;
187 db Left_Align+char_field_ASCIIZ ;AN000;
188 db 0;RPS ;19200 ;AN000;
189 db 3 ;110, 300 etc the shortest
190 db Blank ; ;AN000;
191
192 db Sublist_Length ; ;AN000;
193 db Reserved ; ;AN000;
194pparity_ptr LABEL BYTE ;allow access from invoke
195 dw offset pparity ; ;AN000;
196 dw to_be_filled_in ; ;AN000;
197 db 3 ;third of 6 ;AN000;
198 db Left_Align+char_field_char ;AN000;
199 db 1 ; ;AN000;
200 db 1 ;one char, n, o, e.
201 db Blank ; ;AN000;
202
203 db Sublist_Length ; ;AN000;
204 db Reserved ; ;AN000;
205 dw offset pdata ; ;AN000;
206 dw to_be_filled_in ; ;AN000;
207 db 4 ;fourth of 6 ;AN000;
208 db Left_Align+char_field_char ;AN000;
209 db 1 ; ;AN000;
210 db 1 ;one char number between 6 and 8;AN000;
211 db blank ;never used, will display at least the default data bits
212
213 db Sublist_Length ; ;AN000;
214 db Reserved ; ;AN000;
215pstop_ptr LABEL BYTE
216 dw offset pstop ; ;AN000;
217 dw to_be_filled_in ; ;AN000;
218 db 5 ;fifth of 6 ;AN000;
219 db Left_Align+char_field_ASCIIZ ;AN000;
220 db 0 ;big enough for "1.5" ;AN000;
221 db 1 ;one char number between 1 and 2;AN000;
222 db Blank ; ;AN000;
223
224 db Sublist_Length ; ;AN000;
225 db Reserved ; ;AN000;
226 dw offset pparm ; ;AN000;
227 dw to_be_filled_in ; ;AN000;
228 db 6 ;last of 6 ;AN000;
229 db Left_Align+char_field_char ;AN000;
230 db 1 ; ;AN000;
231 db 1 ;one char "P" or "-"
232 db Blank ; ;AN000;
233;--------------------------- ;
234Sublist_shift_msg label byte ; ;AN000;
235 ;
236 db Sublist_Length ; ;AN000;
237 db Reserved ; ;AN000;
238lftm_or_rghtm_ptr label word
239;AC001; dw offset leftmost ;filled in with pointer to "leftmost 0?" or "rightmost 9?"
240 dw ? ;AC001;filled in with pointer to "leftmost 0?" or "rightmost 9?"
241 dw to_be_filled_in ; ;AN000;
242 db 1 ;only 1 sub list ;AN000;
243 db Left_Align+char_field_ASCIIZ ;AN000;
244 db 0;RPS ;rightmost 9? ;AN000;
245 db 10 ;leftmost 0? ;AN000;
246 db Blank ; ;AN000;
247;--------------------------- ;
248Sublist_redirmsg label byte ;AN000; CR,LF,"LPT%1: rerouted to COM%2:",CR,LF,EOM
249 ;
250 db Sublist_Length ; ;AN000;
251 db Reserved ; ;AN000;
252 dw Offset REDPT ;filled with printer number
253 dw to_be_filled_in
254 db 1 ;first of 2 ;AN000;
255 db Left_Align+char_field_char ; ;AN000;
256 db 1 ; ;AN000;
257 db 1
258 db Blank ; ;AN000;
259
260 db Sublist_Length ; ;AN000;
261 db Reserved ; ;AN000;
262 dw Offset REDCOM ;filled with COM port number
263 dw to_be_filled_in
264 db 2 ;second of 2 ;AN000;
265 db Left_Align+char_field_char ; ;AN000;
266 db 1 ; ;AN000;
267 db 1
268 db Blank ; ;AN000;
269
270;--------------------------- ;
271Sublist_notremsg label byte ;AN000; CR,LF,"LPT%1: not rerouted",CR,LF,EOM
272 ;
273 db Sublist_Length ; ;AN000;
274 db Reserved ; ;AN000;
275 dw Offset NOTREDPT ;filled with printer number
276 dw to_be_filled_in
277 db 1 ;only one
278 db Left_Align+char_field_char ; ;AN000;
279 db 1 ; ;AN000;
280 db 1
281 db Blank ; ;AN000;
282
283;--------------------------- ;
284Sublist_retparto label byte ; ;AN000;
285 ;
286 db Sublist_Length ; ;AN000;
287 db Reserved ; ;AN000;
288;AC001;inf_or_no_ptr LABEL WORD ;filled in with pointer to "No" or "infinit"
289;AC001; dw offset infinite ; ;AN000;
290 dw ? ;AC001;filled in with pointer to "No" or "infinit"
291 dw to_be_filled_in ; ;AN000;
292 db 1 ; ;AN000;
293 db Left_Align+Char_Field_ASCIIZ ;AN000;
294 db 0;RPS ; ;AN000;
295 db 2 ; ;AN000;
296 db Blank ; ;AN000;
297;--------------------------- ;
298Sublist_cant_shift label byte ;"Unable to shift screen ...." ;AN000;
299 ;
300 db Sublist_Length ; ;AN000;
301 db Reserved ; ;AN000;
302LEFT_OR_RIGHT_PTR LABEL WORD ;AN000;
303;AC001; dw offset left ;FILLED WITH OFFSET OF 'left' or 'right'
304 dw ? ;AC001;FILLED WITH OFFSET OF 'left' or 'right'
305 dw to_be_filled_in ; ;AN000;
306 db 1 ; ;AN000;
307 db Left_Align+Char_Field_ASCIIZ ;AN000;
308 db 0;RPS ; ;AN000;
309 db 4 ; ;AN000;
310 db Blank ; ;AN000;
311;--------------------------- ;
312Sublist_CPMSG2 label byte ; ;AN000;
313 ;
314 db Sublist_Length ; ;AN000;
315 db Reserved ; ;AN000;
316CPMSGLST2DEV LABEL WORD ;filled with pointer to device name
317 dw ?
318 dw to_be_filled_in ; ;AN000;
319 db 1 ; ;AN000;
320 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
321 db 0 ; ;AN000;
322 db 3 ; ;AN000;
323 db Blank ; ;AN000;
324
325;--------------------------- ;
326Sublist_CPMSG6 label byte ;"Active codepage for device %S is %D",CR,LF,EOM
327 ;
328 db Sublist_Length ; ;AN000;
329 db Reserved ; ;AN000;
330CPMSGLST6DEV LABEL WORD ;filled with pointer to device name
331 dw ?
332 dw to_be_filled_in ; ;AN000;
333 db 1 ; ;AN000;
334 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
335 db 0 ; ;AN000;
336 db 3 ; ;AN000;
337 db Blank ; ;AN000;
338
339 db Sublist_Length ; ;AN000;
340 db Reserved ; ;AN000;
341 dw OFFSET CPMSGLST6CP ;pointer to area FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
342 dw to_be_filled_in ; ;AN000;
343 db 2 ;2nd of 2 ;AN000;
344 db Left_Align+Unsgn_Bin_Word ;AN000;00100001B
345 db 5 ;codepage numbers could be 5 digits long
346 db 1 ;theoretically could be 1 digit ;AN000;
347 db Blank ; ;AN000;
348
349;--------------------------- ;
350Sublist_CPMSG7 label byte ;"Device %1 not prepared",CR,LF,EOM
351 ;
352 db Sublist_Length ; ;AN000;
353 db Reserved ; ;AN000;
354CPMSGLST7DEV LABEL WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME
355 dw ?
356 dw to_be_filled_in ; ;AN000;
357 db 1 ; ;AN000;
358 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
359 db 0 ;don't know how long the device name
360 db 3 ; ;AN000;
361 db Blank ; ;AN000;
362
363;--------------------------- ;
364Sublist_CPMSG8 label byte ;"%1 codepages:",CR,LF,EOM
365 ;
366 db Sublist_Length ; ;AN000;
367 db Reserved ; ;AN000;
368 dw ? ;filled in with OFFSET TO "HARDWARE" OR "PREPARED"
369 dw to_be_filled_in ; ;AN000;
370 db 1 ; ;AN000;
371 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
372 db 0;RPS ; both "Hardware" and ;AC001;
373 db 8 ; "Prepared" are 8 chars long ;AC001;
374 db Blank ; ;AN000;
375
376
377;--------------------------- ;
378Sublist_CPMSG9 label byte ;" Codepage %d",CR,LF,EOM
379
380 db Sublist_Length ; ;AN000;
381 db Reserved ; ;AN000;
382 dw OFFSET CPMSGLST9CP ;pointer to area filled in by "DISPLAY_CPID" in modecp.sal
383 dw to_be_filled_in ; ;AN000;
384 db 1 ; ;AN000;
385 db Left_Align+Unsgn_Bin_Word ;00100001B
386 db 3
387 db 3 ; ;AN000;
388 db Blank ; ;AN000;
389
390;--------------------------- ;
391Sublist_CPMSG10 label byte ;"MODE %1 Codepage function completed",CR,LF,EOM
392 db Sublist_Length ; ;AN000;
393 db Reserved ; ;AN000;
394 dw ? ;;FILLED IN TO POINT TO:
395 ; "Status",EOM
396 ; "Prepare",EOM
397 ; "Select",EOM
398 ; "Refresh",EOM
399 ; "Global",EOM
400 dw to_be_filled_in ; ;AN000;
401 db 1 ; ;AN000;
402 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
403 db 0;RPS
404 db 5 ; ;AN000;
405 db Blank ; ;AN000;
406
407;--------------------------- ;
408Sublist_CPMSG13 label byte ;" %D - %S Codepage",CR,LF,EOM
409 ;
410 db Sublist_Length ; ;AN000;
411 db Reserved ; ;AN000;
412CPMSGLST13CP LABEL WORD ;FILLED IN WITH CODEPAGE ID
413 dw ?
414 dw to_be_filled_in ; ;AN000;
415 db 1 ; ;AN000;
416 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
417 db 0;RPS ; ;AN000;
418 db 3 ; ;AN000;
419 db Blank ; ;AN000;
420
421 db Sublist_Length ; ;AN000;
422 db Reserved ; ;AN000;
423CPMSGLST13TYP LABEL WORD ;FILLED IN TO POINT TO:
424 ; "Selected",EOM
425 ; "System",EOM
426 dw ?
427 dw to_be_filled_in ; ;AN000;
428 db 2 ;2nd of 2 ;AN000;
429 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
430 db 0;RPS ;all codepage numbers are 3 chars long
431 db 6 ; ;AN000;
432 db Blank ; ;AN000;
433
434
435;--------------------------- ;
436Sublist_CPMSG17 label byte ;"Device error during %1",BEEP,CR,LF,EOM
437 db Sublist_Length ; ;AN000;
438 db Reserved ; ;AN000;
439 dw ? ;;FILLED IN TO POINT TO:
440 ; "Status",EOM
441 ; "Prepare",EOM
442 ; "Select",EOM
443 ; "Refresh",EOM
444 ; "write of font file to device",EOM
445 dw to_be_filled_in
446 db 1 ; ;AN000;
447 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
448 db 0;RPS ;"write of font file to device",EOM
449 db 6 ;"Status",EOM
450 db Blank ; ;AN000;
451
452
453;--------------------------- ;
454Sublist_LINES_equal label byte ;"LINES=%1",CR,LF,EOM
455 db Sublist_Length ; ;AN000;
456 db Reserved ; ;AN000;
457ROW_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a row value
458 dw ? ;
459 dw to_be_filled_in ;filled in at initialization time with PRINTF_CODE
460 db 1 ; ;AN000;
461row_type db Right_Align+Char_Field_ASCIIZ ; ;AN000;
462 db 0;RPS ;"NONE"
463 db 2 ;25, 43, 50 ;AN000;
464 DB blank
465
466;--------------------------- ;
467Sublist_COLUMNS_equal label byte ;"COLUMNS=%1",CR,LF,EOM
468 db Sublist_Length ; ;AN000;
469 db Reserved ; ;AN000;
470COLUMNS_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a columns value
471 dw ? ;
472 dw to_be_filled_in ; ;AN000;
473 db 1 ; ;AN000;
474COLUMNS_type db Right_Align+Char_Field_ASCIIZ ; ;AN000;
475 db 0;RPS
476 db 2 ; ;AN000;
477 DB blank
478;--------------------------- ;
479Sublist_RATE_equal label byte ;"RATE=%1",CR,LF,EOM
480 db Sublist_Length ; ;AN000;
481 db Reserved ; ;AN000;
482RATE_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a rate value
483 dw ? ;
484 dw to_be_filled_in ; ;AN000;
485 db 1 ; ;AN000;
486RATE_type db Right_Align+Char_Field_ASCIIZ ; ;AN000;
487 db 0;RPS
488 db 2 ; ;AN000;
489 DB blank
490;--------------------------- ;
491Sublist_DELAY_equal label byte ;"DELAY=%1",CR,LF,EOM
492 db Sublist_Length ; ;AN000;
493 db Reserved ; ;AN000;
494DELAY_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a delay value
495 dw ? ;
496 dw to_be_filled_in ; ;AN000;
497 db 1 ; ;AN000;
498DELAY_type db Right_Align+Char_Field_ASCIIZ ; ;AN000;
499 db 0;RPS
500 db 1 ; ;AN000;
501 DB blank
502;--------------------------- ;
503Sublist_not_supported label byte ;"Function not supported on this computer -%1"
504 db Sublist_Length ; ;AN000;
505 db Reserved ; ;AN000;
506not_supported_PTR LABEL WORD ;FILLED IN TO POINT TO: the parameter that is not supported
507 dw OFFSET nada ;
508 dw to_be_filled_in ;filled with segment of the .COM file ;AN000;
509 db 1 ; ;AN000;
510 db Left_Align+Char_Field_ASCIIZ ; ;AN000;
511 db 0;RPS ;AC002;maximum length of the string
512 db 1 ; ;AN000;
513 DB blank
514;--------------------------- ;
515Sublist_status_for_device label byte ;"Status for device %1:"
516 db Sublist_Length ; ;AN000;
517 db Reserved ; ;AN000;
518stat_dev_ptr LABEL WORD ;FILLED IN TO POINT TO ONE of the device names in parse.asm
519 dw ? ;
520 dw to_be_filled_in ; ;AN000;
521 db 1 ; ;AN000;
522 db Right_Align+Char_Field_ASCIIZ ; ;AN000;
523dev_name_size db 4 ;changed by invoke: 3 for CON, 4 for others
524 db 3 ; ;AN000;
525 db Blank ; ;AN000;
526
527;--------------------------- ;
528
529Sublist_retry_equal label byte ;"RETRY=%1"
530 db Sublist_Length ; ;AN000;
531 db Reserved ; ;AN000;
532retry_type_ptr LABEL BYTE
533 dw ? ;
534 dw to_be_filled_in ; ;AN000;
535 db 1 ; ;AN000;
536 db Right_Align+Char_Field_ASCIIZ ; ;AN000;
537 db 0;RPS ;max size, "NONE"
538 db 1 ;min size, "E" ;AN000;
539 db Blank ; ;AN000;
540
541;--------------------------- ;
542sublist_syntax_error label byte ;AN000;description of %0
543 ;
544 db Sublist_Length ;fixed ;AN000;
545 db Reserved ;not used yet ;AN000;
546syntax_error_ptr LABEL WORD
547 dw offset offending_parameter ;pointer to string or binary value ;AN000;
548 dw to_be_filled_in ;
549 db 0 ;ID, special end of message format ;AN000;
550 db Left_Align+char_field_ASCIIZ ;AN000;
551 db 0 ;Max width 123, 128-"MODE " ;AN000;
552 db 1 ;May be one char long ;AN000;
553 db Blank ; ;AN000;
554
555
556
557
558
559
560
561Number_of_sublists EQU (($ - first_sublist) / (TYPE sublist_def))
562
563
564
565; MESSAGE PIECES
566;-------------------------------------------------------
567
568PT80N DB " " ;PT80 - CR,LF,"LPT%c: set for 80",CR,LF,EOM
569
570PT132N DB " " ;PT132 - CR,LF,"LPT%c: set for 132",CR,LF,EOM
571
572;INITMSG - CR,LF,"COM%c: %3s,%c,%c,%c,%c",CR,LF,EOM
573DEVICE DB " "
574pBAUD DB 5 DUP(" "),EOM
575pPARITY DB "e" ;DEFAULT IS EVEN PARITY
576pDATA DB "7" ;DEFAULT IS 7 DATA BITS PER BYTE
577pSTOP DB "1",EOM ;DEFAULT FOR BAUD > 110, CHANGED TO 2 FOR 110
578Pparm DB " "
579baud_19200 DB "19200",EOM
580
581;REDIRMSG - CR,LF,"LPT%c: rerouted to COM%c:",CR,LF,EOM
582REDPT DB " "
583REDCOM DB " "
584
585;NOTREMSG - CR,LF,"LPT%c: not rerouted",CR,LF,EOM
586NOTREDPT DB " "
587
588OFFENDING_PARAMETER DB 123 DUP (EOM)
589
590nada DB 8,8,8," ",0 ;backspace over the " - "
591
592CPMSGLST6CP DW 44H ;AC665;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
593
594
595CPMSGLST9CP DW 99H ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID
596
597
598row_value DB ? ;filled in by invoke.asm with screen lines requested or current setting
diff --git a/v4.0/src/CMD/MODE/MODEVID.ASM b/v4.0/src/CMD/MODE/MODEVID.ASM
new file mode 100644
index 0000000..360a110
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEVID.ASM
@@ -0,0 +1,614 @@
1 PAGE ,132 ;
2 TITLE MODEVID.SAL
3
4.XLIST
5INCLUDE STRUC.INC ;macro library for 'struc'
6.LIST
7
8;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
9;º º ;AN000;
10 ;AN000;
11; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the
12; USA.MSG file because it looked like a common message. Now
13; I use a different (better) message. It was "Invalid paramters",
14; is now "Function not supported - ????".
15
16;º º ;AN000;
17;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
18 ;AN000;
19SIGNITURE SEGMENT AT 0C000H
20 ORG 0
21SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT
22SIGNITURE ENDS
23
24
25LOW_MEM SEGMENT AT 0
26 ORG 410H
27EQUIP_FLAG EQU THIS WORD
28LOW_MEM ENDS
29
30
31;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
32;º º
33
34
35DISPLAY MACRO MSG
36 MOV DX,OFFSET MSG
37 CALL PRINTF
38ENDM
39
40
41;-------------------------------------------------------------------------------
42
43
44find_number MACRO num, list
45
46;Purpose: See if num is in the list of numbers.
47
48;Input: num - number to be checked
49; list - label of list to scan
50; list_len - length of the list to scan. This name is built from the
51; label 'list' that is input.
52
53;Output: zero flag set if the number is found in 'list'
54
55;Assumption: A label of the name list_len exists and is in segment addressed by
56; DS, where 'list' is the label passed in. ES and DS are the same.
57
58;Side effects: The direction flag is cleared.
59
60PUSH DI
61PUSH CX
62
63MOV AL,num
64MOV DI,OFFSET list
65CLD ;want to increment DI
66MOV CX,list&_len ;CX=number of nums in the list
67REPNE SCASB
68
69POP CX
70POP DI
71
72ENDM
73
74;-------------------------------------------------------------------------------
75
76
77SET_CURSOR_POS MACRO
78 MOV AH,2 ;SET CURSOR
79 MOV DX,0 ;ROW=0,COL=0
80 MOV BH,0 ;SELECT SCREEN 0
81 INT 10H
82
83 ENDM
84
85MODE_VIDEO MACRO OPTION
86 MOV AH,0 ;SET MODE
87 MOV AL,OPTION
88 INT 10H
89
90 ENDM
91
92SET_CURSOR_TYPE MACRO
93 MOV AH,1 ;SET CURSOR TYPE
94 MOV CX,CURSOR_TYPE ;ROW=0,COL=0
95 INT 10H
96
97 ENDM
98
99;º º
100;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
101
102
103;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
104;º º
105
106B EQU 0 ;POSITION OF "B" IN PARM1 FOR BW?0
107W EQU 1 ;POSITION OF "W" IN PARM1 FOR BW?0
108C EQU 0 ;POSITION OF "C" IN PARM1 FOR CO?0
109O EQU 1 ;POSITION OF "O" IN PARM1 FOR CO?0
110M EQU 0 ;POSITION OF "M" IN PARM1 FOR MONO
111N EQU 2 ;POSITION OF "N" IN PARM1 FOR MONO
112OH EQU 3 ;POSITION OF SECOND "O" IN PARM1 FOR MONO
113
114all EQU 0FEH ;descreet value representing adapter/monitor that can be in mono and color
115ALT_SELECT EQU 12H ;ALTERNATE SELECT FUNCTION OF INT10
116AMOAMA EQU 01 ;map to check 'all modes on all monitors active' bit of misc state info byte
117bw7 EQU 7 ;another mono (emulation) mode (VGA with analog monochrome)
118bw0B EQU 0BH ;analog black and white on a PALACE
119cga EQU 02 ;plain color card
120COLOR_CURSOR_TYPE EQU 0607H ;CURSOR TYPE FOR ALL COLOR AND BW MODES
121color6 EQU 6 ;another color supporting combination (PGA with color display)
122color8 EQU 8 ;another color supporting combination
123colorA EQU 0AH ;yet another color combo (color display or ehnanced color display on PALACE)
124colorC EQU 0CH ;even another color combo (PALACE with analog color)
125ega_color EQU 4 ;value for color support of EGA
126EGA_INFO EQU 10H ;RETURN EGA INFORMATION OPTION OF ALT. SELECT FUNCTION OF INT10
127EGA_MONO EQU 05H
128EGA_SIG EQU 0AA55H ;SIGNITURE FOR EGA CARD
129EMPTY EQU 0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 0
130FALSE EQU 0
131get_sys_stat EQU 43H ;get system status function of INT 15H
132LCD_attached EQU 00000000B ;bit 0=0 if the LCD is attached
133LCD_bit EQU 00000001B ;mask to check the LCD attached bit of status byte
134LOWERCASE EQU 20H ;OR THIS TO UPPER/LOWER CASE TO ASSURE LOWERCASE
135mono_card EQU 1 ;BIOS INT 10 AH=1B representation of plain mono card
136MONO_CURSOR_TYPE EQU 0B0CH
137MONO_ON_IT EQU 1 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF MONO IN EFFECT
138OPTION_BW4025 EQU 0 ;40 X 25 BW
139OPTION_CO4025 EQU 1 ;40 X 25 COLOR
140OPTION_BW8025 EQU 2 ;80 X 25 BW
141OPTION_CO8025 EQU 3 ;80 X 25 COLOR
142OPTION_MONO EQU 7 ;monochrome
143parm_list EQU [BP] ;addressing for array of parsed parameters in form "parm_list_entry"
144
145COLOR_ON_IT EQU 0 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF COLOR IN EFFECT
146BITBW40 EQU 10H ;40X25 BW USING COLOR CARD
147BITBW80 EQU 20H ;80X25 BW USING COLOR CARD
148BITMONO EQU 30H ;80X25 BW CARD
149video_info_DI EQU [DI]
150
151;º º
152;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
153
154
155
156
157;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
158;º º
159
160PUBLIC ALT_SELECT
161PUBLIC BW40
162PUBLIC BW80
163PUBLIC CHECK_BUFF
164PUBLIC CO40
165PUBLIC CO80
166PUBLIC COLOR_ON_IT
167PUBLIC EGA_INFO
168PUBLIC GET_VIDEO_INFO
169PUBLIC MONO
170
171;º º
172;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
173
174
175
176;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
177;º º
178
179INCLUDE common.stc ;definition of the following struc
180
181;parm_list_entry STRUC ;used by parse_parameters and invoke
182;
183;parm_type DB bogus
184;item_tag DB 0FFH
185;value1 DW bogus ;used only for filespecs and code page numbers
186;value2 DW bogus ;used only for filespecs and code page numbers
187;keyword_switch_ptr DW 0
188;
189;parm_list_entry ENDS
190
191
192info_block STRUC ;layout of info returned by INT 10 AH=1B
193 who_cares1 DB 025H DUP ("V")
194 active_display DB "V"
195 alternate_display DB "V"
196 who_cares2 DB 6 DUP ("V")
197 misc_state_info DB "V"
198 who_cares3 DB 12H DUP ("V")
199info_block ENDS
200
201
202;º º
203;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
204
205
206
207
208;THE FOLLOWING 'RECORD' STATEMENT DEFINES THE BITS BITS OF THE EQUIPMENT FLAG:
209;BIT 15,14 = NUMBER OF PRINTERS ATTACHED
210;BIT 13 = NOT USED
211;BIT 12 = GAME I/O ATTACHED
212;BIT 11-9 = NUMBER OF RS232 CARDS ATTACHED
213;BIT 8 = UNUSED
214;BIT 7,6 = NUMBER OF DISKETTE DRIVES
215;BIT 5,4 = INITIAL VIDEO MODE:
216; 00-UNUSED
217; 01-40X25 BW USING COLOR CARD
218; 10-80X25 BW USING COLOR CARD
219; 11-80X25 BW USING BW CARD
220;BIT 3,2 = PLANAR RAM SIZE (00=16K, 01=32K, 10=48K, 11=64K)
221;BIT 1 = NOT USED
222;BIT 0 = IPL FROM DISKETTE
223FLAG RECORD PR:2,NA1:1,GAME:1,COMN:3,NA2:1,DISKD:2,VIDEO:2,RAM:2,NA3:1,IPL:1
224;DEFINITION OF ABOVE VIDEO BITS:
225
226
227
228 PAGE
229PRINTF_CODE SEGMENT PUBLIC
230 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE
231
232
233;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
234;º º
235
236color_combos label byte ;list of adapter/display combinations supporting color modes
237 DB bw0B
238 DB color6
239 DB color8
240 DB colorA
241 DB colorC
242 DB cga
243 DB ega_color
244color_combos_len EQU $ - color_combos
245
246CURSOR_TYPE DW 0607H ;HOLDER OF APPROPRIATE CURSOR TYPE
247information_block info_block <> ;area to hold info returned from INT 10 AH=1B
248
249mono_combos label byte
250 DB mono_card
251 DB ega_mono
252 DB bw7
253mono_combos_len EQU $ - mono_combos
254
255;º º
256;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
257
258
259;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
260;º º
261
262EXTRN Function_not_supported:WORD ;'INVALID PARAMETERS'
263EXTRN NOERROR:BYTE ;INDICATE THAT NO ERROR MESSAGES HAVE BEEN ISSUED YET
264EXTRN not_supported_ptr:WORD ;pointer to the screen mode that the configuration can't do.
265EXTRN machine_type:BYTE ;holder of model byte
266EXTRN parm_lst:BYTE ;the array of the structure parm_list_entry max_pos_parms DUP (<>)
267EXTRN PRINTF:NEAR ;"C" LIKE FORMATTED SCREEN OUTPUT ROUTINE
268EXTRN PARM1:BYTE ;PARAMETER HOLDING AREA, SEE "RESCODE"
269EXTRN P14_model_byte:ABS
270
271;º º
272;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
273
274
275
276;***********************************************************
277;SET VIDEO TO 40 X 25, BLACK AND WHITE
278BW40 PROC NEAR
279
280 CALL get_video_info
281 .IF <video_info_DI.active_display EQ all> OR
282 find_number <video_info_DI.active_display>,color_combos
283 .IF Z OR
284 find_number <video_info_DI.alternate_display>,color_combos
285 .IF Z THEN
286
287 MOV DL,BITBW40 ;SET FOR BW 40 X 80
288 MOV DH,OPTION_BW4025
289 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
290 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
291 ;DH HAS BYTE OF VIDEO OPTION
292 CALL setup
293
294 .ELSE
295
296 MOV DI,0 ;the screen mode is always the first parm ;AC000;
297 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
298 MOV CX,parm_list[DI].value1 ;AC000;
299 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
300 DISPLAY Function_not_supported ;'Function not supported - BW40"
301 MOV NOERROR,FALSE
302
303 .ENDIF
304
305 RET ;RETURN TO MAIN ROUTINE
306BW40 ENDP
307;******************************************************
308;SET VIDEO TO 80 X 25, BLACK AND WHITE
309BW80 PROC NEAR
310
311 CALL get_video_info
312 .IF <video_info_DI.active_display EQ all> OR
313 find_number <video_info_DI.active_display>,color_combos
314 .IF Z OR
315 find_number <video_info_DI.alternate_display>,color_combos
316 .IF Z THEN
317
318 MOV DL,BITBW80 ;80 X 25 BW USING GRAPHICS CARD
319 MOV DH,OPTION_BW8025
320 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
321 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
322 ;DH HAS BYTE OF VIDEO OPTION
323 CALL setup
324
325 .ELSE
326
327 MOV DI,0 ;the screen mode is always the first parm ;AC000;
328 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
329 MOV CX,parm_list[DI].value1 ;AC000;
330 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
331 DISPLAY Function_not_supported ;'Function not supported - BW80"
332 MOV NOERROR,FALSE
333
334 .ENDIF
335
336 RET
337BW80 ENDP
338;******************************************************
339;SET VIDEO TO 80 X 25, MONOCHROME
340MONO PROC NEAR
341
342 CALL get_video_info
343 .IF <video_info_DI.active_display EQ all> OR
344 find_number <video_info_DI.active_display>,mono_combos
345 .IF Z OR
346 find_number <video_info_DI.alternate_display>,mono_combos
347 .IF Z THEN
348
349 MOV DL,BITMONO ;EQUIP FLAG INDICATING 80 X 25 BW USING MONO CARD
350 MOV DH,OPTION_MONO ;MONOCHROME MODE
351 MOV CURSOR_TYPE,MONO_CURSOR_TYPE
352
353 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
354 ;DH HAS BYTE OF VIDEO OPTION
355 CALL SETUP
356
357 .ELSE
358
359 MOV DI,0 ;the screen mode is always the first parm ;AC000;
360 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
361 MOV CX,parm_list[DI].value1 ;AC000;
362 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
363 DISPLAY Function_not_supported ;'Function not supported - MONO"
364 MOV NOERROR,FALSE
365
366 .ENDIF
367
368 RET ;RETURN TO MAIN ROUTINE
369MONO ENDP
370;*******************************************************
371CO40 PROC NEAR
372
373 CALL get_video_info
374 .IF <video_info_DI.active_display EQ all> OR
375 find_number <video_info_DI.active_display>,color_combos
376 .IF Z OR
377 find_number <video_info_DI.alternate_display>,color_combos
378 .IF Z THEN
379
380 MOV DL,BITBW40 ;40 X 25 USING COLOR CARD
381 MOV DH,OPTION_CO4025 ; REQUEST COLOR
382 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
383 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
384 ;DH HAS BYTE OF VIDEO OPTION
385 CALL setup
386
387 .ELSE
388
389 MOV DI,0 ;the screen mode is always the first parm ;AC000;
390 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
391 MOV CX,parm_list[DI].value1 ;AC000;
392 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
393 DISPLAY Function_not_supported ;'Function not supported - CO40"
394 MOV NOERROR,FALSE
395
396 .ENDIF
397
398 RET ;RETURN TO MAIN ROUTINE
399CO40 ENDP
400;******************************************************
401CO80 PROC NEAR
402
403 CALL get_video_info
404 .IF <video_info_DI.active_display EQ all> OR
405 find_number <video_info_DI.active_display>,color_combos
406 .IF Z OR
407 find_number <video_info_DI.alternate_display>,color_combos
408 .IF Z THEN
409
410 MOV DL,BITBW80 ;80 X 25 USING COLOR CARD
411 MOV DH,OPTION_CO8025 ; REQUEST COLOR
412 MOV CURSOR_TYPE,COLOR_CURSOR_TYPE
413
414 ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
415 ;DH HAS BYTE OF VIDEO OPTION
416 CALL setup
417
418 .ELSE
419
420 MOV DI,0 ;the screen mode is always the first parm ;AC000;
421 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000;
422 MOV CX,parm_list[DI].value1 ;AC000;
423 MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000;
424 DISPLAY Function_not_supported ;'Function not supported - CO80"
425 MOV NOERROR,FALSE
426
427 .ENDIF
428
429 RET ;RETURN TO MAIN ROUTINE
430CO80 ENDP
431;******************************************************
432SETUP PROC NEAR
433;INPUT: DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG
434; DH HAS BYTE OF VIDEO OPTION
435
436 XOR AX,AX ;ZERO A REG
437 MOV ES,AX ;POINT TO SEGMENT AT ZERO
438 MOV AX,ES:EQUIP_FLAG ;GET CURRENT STATUS FLAG BYTE
439 AND AL,0FFH-MASK VIDEO ;CLEAR VIDEO DEFINITION BITS
440 OR AL,DL ;TURN ON REQUESTED VIDEO BITS
441 MOV ES:EQUIP_FLAG,AX ;RESTORE UPDATED FLAG BYTE
442
443 MODE_VIDEO DH ;SET MODE TO DESIRED OPTION
444
445 SET_CURSOR_POS ;TO ROW=0, COL=0
446
447 SET_CURSOR_TYPE ;TO 6,7 FOR COLOR MODES, B,C FOR MONO
448
449 RET ;RETURN TO CALLER
450SETUP ENDP
451;******************************************************
452GET_VIDEO_INFO PROC NEAR
453
454;Determine what display adapters are in the machine.
455
456
457;Assumption:
458;
459;
460
461;Notes: I assume that if an EGA is present then it is the active display. This
462; is not always the case, but the routines that call for that kind of
463; information do not care which is active, or already know.
464
465;Conventions: 'video_info_DI'([DI]) is used to address the info table returned
466; by INT 10 AH=1B as defined by the structure 'info_block' and
467; stored in 'information_block'. If the INT 10 AH=1A was
468; successfull then the result is stored here.
469
470
471
472
473
474
475
476
477PUSH ES
478
479XOR AX,AX ;ZAP previous contents
480MOV AH,01BH ;functionality/state information
481PUSH CS
482POP ES
483MOV DI,OFFSET information_block ;initialize 'video_info_DI'
484MOV BX,0 ;parm to allow for future expansion
485INT 010H
486.IF <AL EQ 01BH> THEN NEAR ;IF the call is supported THEN
487 ;ES:DI=>info returned from BIOS
488 .IF <video_info_DI.alternate_display EQ 0> THEN NEAR ;only 1 display, so see if it can handle all modes
489
490 TEST video_info_DI.misc_state_info,AMOAMA ;check the 'all modes on all monitors active' bit
491 .IF NZ ;IF all modes are supported THEN
492 MOV video_info_DI.active_display,all ;return the active display type as everything
493 .ENDIF
494
495 .ENDIF
496
497.ELSE ;display code call not supported, look for EGA
498 ;SINCE the display type call was not supported SEE IF IN AN EGA ADVANCED MODE
499
500 MOV AX,SIGNITURE
501 MOV ES,AX ;PUT SEGMENT OF SIGNITURE OF EGA IN ES
502 .IF <ES:SIGWORD EQ EGA_SIG> AND ;IF maybe an EGA IN THE MACHINE THEN
503 MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER
504 MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE
505 INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH
506 .IF <BL NE 010H> THEN ;EGA support available
507 .IF <BH EQ COLOR_ON_IT> THEN ;IF COLOR HOOKED TO EGA THEN
508 MOV video_info_DI.active_display,ega_color
509
510 MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER
511 CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT
512 .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN
513 MOV video_info_DI.alternate_display,mono_card
514 .ENDIF
515
516 .ELSE
517 MOV video_info_DI.active_display,ega_mono
518
519 MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER
520 CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH
521 .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT
522 MOV video_info_DI.alternate_display,cga
523 .ENDIF
524 .ENDIF
525 .ELSE ;no display type call, no EGA
526 ;check for convertible
527 .IF <machine_type EQ P14_model_byte> AND
528 MOV AH,get_sys_stat
529 INT 15H ;AL=system status
530 AND AL,LCD_bit ;check bit 0
531 .IF <AL EQ LCD_attached> THEN
532 MOV video_info_DI.active_display,all ;LCD supports mono and color
533 .ELSE ;no analog displays, no EGA, no LCD
534
535 MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER
536 CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT
537 .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN
538 MOV video_info_DI.active_display,mono_card
539 .ENDIF
540
541 MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER
542 CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH
543 .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT
544 MOV video_info_DI.alternate_display,cga
545 .ENDIF
546
547 .ENDIF
548
549 .ENDIF
550
551.ENDIF
552
553POP ES
554
555RET ;RETURN TO CALLER
556
557
558GET_VIDEO_INFO ENDP
559;******************************************************
560;VMONO PROC NEAR
561;;VERIFY THAT A MONOCHROME CARD EXISTS OR LCD IS ATTACHED
562;;Input: - AX=base of monochrome screen buffer
563;;Output: - AH=AL if have monochrome card or LCD attached
564;; AH<>AL if don't have mono card and LCD is not attached
565;
566;;One way to have a valid MONO setting on a P1X is to have the LCD attached. Another is
567;;to have the LCD detached and have a MONO card attached.
568;;The logic is as follows:
569;;
570;;BEGIN
571;; ok_to_put_in_MONO_mode:=false
572;; IF on a P1X AND LCD is attached THEN
573;; ok_to_put_in_MONO_mode:=true
574;; ELSE
575;; verify_the_buffer_exists
576;; ENDIF
577;;END
578;
579; PUSH AX
580; CMP machine_type,P14_model_byte
581; $IF E,AND
582; MOV AH,get_sys_stat
583; INT 15H ;AL=system status
584; AND AL,LCD_bit ;check bit 0
585; CMP AL,LCD_attached
586; $IF E ;IF on a P1X AND LCD is attached THEN
587; POP AX ; clean the stack
588; MOV AX,0000H ; AH=ALðOK to put in MONO mode
589; $ELSE ;ELSE
590; POP AX ; AX=mono buffer base
591; CALL check_buff ; see if the MONO card exists
592; $ENDIF ;ENDIF
593;RET ;RETURN TO MAIN ROUTINE
594;VMONO ENDP
595;******************************************************
596CHECK_BUFF PROC NEAR
597;SEE IF MEMORY EXISTS AT THE SEGMENT PASSED IN AX
598
599 PUSH DS ;SAVE DATA SEGMENT REGISTER
600; MOVE SEG ID OF VIDEO BUFFER
601 MOV DS,AX ; TO THE DATA SEGMENT REG
602 MOV CH,DS:0 ;GET A BYTE FROM THAT BUFFER
603 MOV AL,55H ;GET A SAMPLE DATA BYTE
604 MOV DS:0,AL ; TO THE SCREEN BUFFER, IF THERE
605 PUSH BX ;TERMINATE THE BUS SO WE DON'T GET THE SAME THING
606 POP BX ;BACK BECAUSE IT WAS STILL ON THE BUS
607 MOV AH,DS:0 ;FETCH IT BACK
608 MOV DS:0,CH ;REPAIR THE DAMAGE IN THE BUFFER
609 POP DS ;RESTORE DATA SEGMENT REGISTER
610 RET
611CHECK_BUFF ENDP
612;********************************************************
613PRINTF_CODE ENDS
614 END
diff --git a/v4.0/src/CMD/MODE/PARSHELL.ASM b/v4.0/src/CMD/MODE/PARSHELL.ASM
new file mode 100644
index 0000000..ed63d1a
--- /dev/null
+++ b/v4.0/src/CMD/MODE/PARSHELL.ASM
@@ -0,0 +1,30 @@
1
2PRINTF_CODE SEGMENT PUBLIC
3
4ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,ES:PRINTF_CODE,SS:PRINTF_CODE
5
6FARSW EQU 0 ;CALL parser by near call
7DATESW EQU 0 ;NO date checking code
8TIMESW EQU 0 ;NO time checking code
9FILESW EQU 1 ;have to check for font file name
10CAPSW EQU 0 ;don't have to display file names
11CMPXSW EQU 1 ;have complex list in codepage syntax
12DRVSW EQU 0 ;just a drive is never legal
13QUSSW EQU 0 ;quoted string is not legal
14NUMSW EQU 1 ;need to check a numeric value occaisionally
15KEYSW EQU 1 ;oodles of keywords to check
16SWSW EQU 1 ;/status
17VAL1SW EQU 1 ;handle numeric ranges
18VAL2SW EQU 1 ;handle list of numbers
19VAL3SW EQU 1 ;handle list of strings
20BASESW EQU 1 ;use DS addressability for PSDATA.INC variables
21;INCSW EQU 1
22
23INCLUDE PARSE.ASM
24
25PUBLIC SYSPARSE
26
27PRINTF_CODE ENDS
28
29END
30 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/RESCODE.ASM b/v4.0/src/CMD/MODE/RESCODE.ASM
new file mode 100644
index 0000000..ff55772
--- /dev/null
+++ b/v4.0/src/CMD/MODE/RESCODE.ASM
@@ -0,0 +1,719 @@
1 PAGE ,132 ;
2
3 TITLE CODE TO BE MADE RESIDENT BY MODE
4
5.XLIST
6 INCLUDE STRUC.INC
7.LIST
8;.SALL
9
10;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
11;º º ;AN000;
12 ;AN000;
13; AC000 - P2852: Infinite retry check at beginning of INT 14 handler was using
14; wrong bit pattern.
15
16; AC001 - P5148: retry_flag was addressing the wrong segment
17
18;º º ;AN000;
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
20 ;AN000;
21
22;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
23;º º
24
25DISPLAY MACRO MSG
26 MOV DX,OFFSET MSG
27 CALL PRINTF
28 ENDM
29
30GET_INT_VECT MACRO INT_NO ;Input: "INT_NO" - the interrupt to be gotten
31 PUSH AX
32 MOV AL,INT_NO ;
33 MOV AH,35H ;FUNCTION CALL "GET VECTOR"
34 INT 21H ;Output: ES:BX = the address in the vector
35 POP AX
36 ENDM
37
38SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
39
40 PUSH AX
41 MOV AX,VALUE
42 MOV REG,AX
43 POP AX
44
45ENDM
46
47SET_INT_VECT MACRO INT_NO ;Input: "INT_NO" - the interrupt to be set
48 PUSH AX ; DS:DX = CS:IP value to set the interrupt to
49 MOV AL,INT_NO ;Output: the vector "INT_NO" contains DS:DX
50 MOV AH,25H ;function call "SET VECTOR"
51 INT 21H
52 POP AX
53 ENDM
54
55store_vector MACRO dword_holder ;Input: "dword_holder" - where to store it
56 ; ES:BX - the address (vector) to be stored
57 MOV WORD PTR dword_holder,BX ;Output: "dword_holder"=the value passed in ES:BX
58 MOV WORD PTR dword_holder[2],ES
59
60ENDM
61
62;º º
63;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
64
65
66;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
67;º º
68
69ADJUSTMENT EQU (entpt - move_destination) ;# of bytes the resident code is moved
70adjustment_in_paragraphs EQU (adjustment / 10H) ;# paragraphs the code moved
71COM_status EQU 03 ;BIOS input for com status request ;AN001;
72E EQU 1 ;value of "res_com_retry_type" for E retry requested ;AN001;
73false EQU 0
74framing_error EQU 0000100000000000B ;bit returned in AX from com status ;AN001;
75holding_empty EQU 0010000000000000B ;bit returned in AX from com status ;AN001;
76INT14 EQU 014H
77INT17 EQU 017H
78LPT_status EQU 02 ;value of AH for printer status checks ;AN000;
79not_busy EQU 80H ;just the not busy bit on
80overrun_error EQU 0000001000000000B ;bit returned in AX from com status ;AN001;
81parity_error EQU 0000010000000000B ;bit returned in AX from com status ;AN001;
82P14_model_byte EQU 0F9H ;P14's have a F9 at F000:FFFE
83R EQU 3 ;value of "res_com_retry_type" for R retry requested ;AN001;
84shift_empty EQU 0100000000000000B ;bit returned in AX from com status ;AN001;
85time_out EQU 1000000000000000B ;time out bit returned in AX from com status ;AN001;
86TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN
87TRUE EQU 0FFH
88USER_ABORT EQU 00H
89
90;º º
91;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
92
93
94;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
95;º º
96
97
98;º º
99;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
100
101
102ROM SEGMENT AT 0F000H
103 ORG 0E739H
104RS232 LABEL FAR
105 ORG 0EFD2H
106PRINTER_IO LABEL FAR
107;NOTE: THE VALUES REPRESENTED BY THIS SEGMENT ARE NOT NECESSARILY
108; THE ONES USED BY THE SUBSEQUENT PROCEDURES. THESE HERE MERELY
109; SERVE AS SAMPLES. THE ACTUAL VALUES IN THE INSTRUCTIONS:
110; JMP RS232
111; JMP PRINTER_IO
112; WILL BE MOVED INTO THESE INSTRUCTIONS FROM THE VECTOR TABLE USING
113; THE THEN CURRENT VALUES OF INT 14H FOR RS232 AND OF INT 17H FOR
114; THE PRINTER_IO JUMP TARGETS. THIS IS TO ALLOW FOR SOME USER
115; TO HAVE INTERCEPTED THESE VECTORS AND DIRECTED THEIR REQUESTS TO
116; HIMSELF INSTEAD OF TO THE ROM.
117
118 ORG 0FFFEH
119;model_byte LABEL BYTE
120ROM ENDS
121
122VECT SEGMENT AT 0
123 ORG 50H
124VECT14H LABEL DWORD ;RS232 CALL
125 ORG 5CH
126VECT17H LABEL DWORD ;PRINTER I/O CALL
127 ORG 471H
128BREAK_FLAG LABEL BYTE ;BREAK FLAG
129BREAK_BIT EQU 80H ;ON=BREAK
130 ORG 530H
131RESSEG LABEL DWORD ;VECTOR OF MODETO, INIT TO ZERO
132VECT ENDS
133
134
135;****************************************************************
136PRINTF_CODE SEGMENT PUBLIC
137 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
138
139
140;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
141;º º
142
143EXTRN device_type:BYTE ;see parse.asm
144EXTRN COMX:ABS ;see parse.asm
145EXTRN LPTX:ABS ;see parse.asm
146EXTRN MAIN:NEAR
147EXTRN MOVED_MSG:WORD ;CR,LF,"Resident portion of MODE loaded",CR,LF,"$"
148EXTRN busy_status:ABS ;value of lpt1_retry_type[BX] when user wants actual status, see modeprin
149EXTRN PRINTF:NEAR ;interface to message retriever, see display.asm
150EXTRN reroute_requested:BYTE ;see parse.asm
151EXTRN retry_requested:BYTE ;see parse.asm
152
153;º º
154;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
155
156
157
158;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
159;º º
160
161PUBLIC first_char_in_command_line ;location of the command line parameters
162PUBLIC FIXUP
163PUBLIC lpt1_retry_type ;filled in and used to get at other two lpt retry masks in modeprin
164PUBLIC rescode_length ;REFERENCED IN MAIN PROCEDURE
165PUBLIC MODETO
166PUBLIC move_destination ;location of the resident code after it has been moved
167PUBLIC NEW_PTSFLAG ;RESIDENT THE FLAG WILL BE ACCESSABLE TO
168PUBLIC NEW_SCRNTABL ;MODESCRN NEEDS TO KNOW WHERE IT WENT
169PUBLIC OFFPTS ;USED IN MODEECHO TO ADDRESS MODEPTS
170PUBLIC OFFRETRY
171PUBLIC ptsflag1 ;make available to display_printer_reroute_status
172PUBLIC P14_model_byte
173PUBLIC res_com_retry_type
174;PUBLIC res_lpt_retry_type
175PUBLIC resflag2 ;make available to display_printer_reroute_status
176PUBLIC RES_MODEFLAG ; RESIDENT THE FLAG WILL BE ACCESSABLE
177PUBLIC RESSEG ;SCRNTABL NEEDS TO FOLLOW THIS VECTOR TO ADDRESS VIDEO PARMS
178PUBLIC SCRNTABL
179PUBLIC submodel_byte ;holder for machine's secondary model byte
180PUBLIC VECTOR14
181PUBLIC VECTOR17
182
183;º º
184;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
185
186 ORG 2CH
187environ_seg DW ? ;segment address of the environment, used as the block of memory to free so ;AN000;
188 ;environment is not part of resident code.
189
190 ORG 60H ;first usable byte of PSP. If you change this check the
191 ;calculation of paragraphs in 'main'
192
193move_destination LABEL WORD ;where the resident will be moved to
194
195; THIS STRUCTURE DEFINES THE PROGRAM SEGMENT PREFIX AREA
196; POINTED TO BY THE ES REGISTER. THIS MUST BE DEFINED HERE, IT REPLACES THE
197; 'ORG 100'
198
199 ORG 80H
200command_line_length DB ? ;not used, just place holder to allign next field
201first_char_in_command_line LABEL BYTE ;location of the command line parameters
202;command_line DB 7FH DUP(?) ;PARM AREA
203
204 ORG 100H
205ENTPT: JMP MAIN ;ENTRY POINT, START AT THE MAIN PROCEDURE
206 SUBTTL SERIAL RETRY
207 PAGE
208;THIS PROC WILL BE POINTED TO BY INT VECTOR 14H
209
210
211MODETO PROC NEAR
212
213
214
215
216PUSH CX
217MOV CL,DL ;CL=DL=0,1,2 or 3
218SHL CL,1 ;CL= 0, 2, 4 or 6 for COM 1,2,3 or 4 respectively ;AC000;
219XOR CH,CH ;CH=0 ready for ANDing in the mask ;AC000;
220OR CH,00000011B ;CH=00000011, mask for any type of retry, to be shifted into proper position ;AC000;
221SHL CH,CL ;CH=00000011, 00001100, 00110000 or 11000000 for COM 1,2,3 or 4 respectively
222AND CH,BYTE PTR CS:res_modeflag ;see if any bit is on for this COM port ;AC001;
223MOV CS:retry_type,CX ;AC001; save for check after call to old INT 14 ;AN001;
224POP CX
225JNZ pushax
226
227
228
229
230
231VECTOR14 LABEL WORD ;THE NEXT JMP INSTRUCTION HAS 5 BYTES,
232; THE LAST 4 ARE THE CONTENTS OF INT 14H,
233; WHICH NORMALLY POINTS TO THE ROM RS232
234; HANDLER. THE CODE GENERATED HERE BY THE
235; ASSEMBLER IS REPLACED BY THE ACTUAL
236; CONTENTS OF INT 14H.
237
238TOROM:
239 JMP RS232 ;NO RETRY, GO DIRECTLY TO ROM ENTRY IRET from there
240PUSHAX:
241 MOV CS:request,AH ;save request type
242 PUSH AX ;SAVE ENTRY PARAMETERS FOR LATER RETRY
243 PUSH DS ;SAVE REGS
244 PUSH AX ;SAVE REGS
245 SUB AX,AX ;POINT TO
246 MOV DS,AX ; PAGE ZERO
247 AND DS:BREAK_FLAG,0FFH-BREAK_BIT ;RESET BREAK FLAG
248 POP AX ;RESTORE
249 POP DS ; REGS
250 PUSHF ;SAVE FLAGS TO SIMULATE INT INSTRUCTION
251
252VEC EQU (VECTOR14 +1) ;OFFSET TO IMMEDIATE FIELD OF PREVIOUSLY SET
253; FAR JMP INSTRUCTION, FILLED WITH THE
254; ORIGINAL CONTENTS OF THE INTERRUPT VECTOR
255 CALL DWORD PTR CS:VEC ;CALL PREVIOUS RS232 HANDLER
256 .IF <CS:request EQ COM_status> THEN ;IF a status request THEN ;AN001;
257 PUSH CX ;need CX for shift count in CL ;AN001;
258 MOV CX,CS:retry_type ;AC001; get back retry type for this port ;AN001;
259 SHR CH,CL ;put back in first two bits for retry type check below ;AN001;
260 .IF <CH EQ E> THEN ;AN001;
261 MOV AX,time_out+framing_error+parity_error+overrun_error ;indicate the port is on fire ;AN001;
262 .ELSEIF <CH EQ R> THEN ;AN001;
263 MOV AX,shift_empty+holding_empty+clear_to_send+data_set_ready ;indicate the port is ready ;AN001;
264 .ENDIF ;otherwise assume B retry and pass actual status ;AN001;
265 POP CX ;restore reg ;AN001;
266 .ELSE ;continue as if a send request ;AN001;
267 PUSH AX ;SAVE REGS
268 PUSH DS ; REGS
269 SUB AX,AX ;POINT TO
270 MOV DS,AX ; PAGE ZERO
271 TEST DS:BREAK_FLAG,BREAK_BIT ;TEST BREAK FLAG
272 POP DS ;RESTORE
273 POP AX ; REGS
274 JZ TESTER ;BRANCH IF NO BREAK
275 OR AH,80H ;SIMULATE TIMEOUT ERROR ON BREAK
276 .ENDIF ;ENDIF status request ;AN001;
277FLUSH:
278 INC SP ;FLUSH THE
279 INC SP ; STACK
280 IRET ;RETURN
281;
282TESTER:
283 TEST AH,80H ;TEST IF A REAL TIMEOUT
284 JZ FLUSH ;IF NOT, RETURN
285 POP AX ;RETRIEVE ORIGINAL ENTRY PARAMETERS
286 JMP PUSHAX ;DO RETRY
287;**********************************************************************
288RES_MODEFLAG EQU $ ;WHEN THIS CODE IS RESIDENT THE FLAG WILL BE
289 ; ACCESSABLE BY MODECOM AS AN OFFSET FROM ADDRESS
290 ; POINTED TO BY VECT14H AND RESSEG
291res_com_retry_type equ $
292
293 DB 0 ;AN665;no retry of any type active for any port
294;
295; bits comx 00=>no retry for any port
296; ---- ---- 01=>E for COM1, no retry for 2, 3 and 4
297; 0-1 com1 02=>B for COM1, no retry for 2, 3 and 4
298; 2-3 com2 03=>R for COM1, no retry for 2, 3 and 4
299; 4-5 com3 04=>E for COM2, no retry for 1, 3 and 4
300; 6-7 com4 05=>E for COM2, E for COM1, none for 3 and 4
301; 06=>E for COM2, B for COM1, none for 3 and 4
302; bit 07=>E for COM2, R for COM1, none for 3 and 4
303; pair 08=>B for COM2, none for 1, 3 and 4
304; value active 09=>B for COM2, E for COM1, none for 3 and 4
305; ----- ------ 0A=>B for COM2, B for COM1, none for 3 and 4
306; 0 unknown 0B=>B for COM2, R for COM1, none for 3 and 4
307; 1 E 0C=>R for COM2, no retry for 1, 3 and 4
308; 2 B 0D=>R for COM2, E for COM1, none for 3 and 4
309; 3 R 0E=>R for COM2, B for COM1, none for 3 and 4
310; 0F=>R for COM2, R for COM1, none for 3 and 4
311; 10=>E for COM3, none for 1, 2 and 4
312; etc.
313MODETO ENDP
314;**************************************************************
315 SUBTTL DETERMINE PARALLEL TO SERIAL, OR PARALLEL TIMEOUT
316 PAGE
317;THIS PROC MAY BE POINTED TO BY INT VECTOR 17H
318MODEPTS PROC NEAR
319OFFPTS EQU MODEPTS - MODETO
320 TEST DL,1 ;DETERMINE IF REDIRECTION APPLIES
321; NOTE: THIS IMMEDIATE FIELD IS Revised BY MODE
322;
323;THIS NEXT JUMP INSTRUCTION IS Revised BY MODEECHO TO REFLECT WHICH
324;LPTN IS TO BE REDIRECTED TO WHICH COMM.
325 JNZ CK ;THIS JNZ IS Revised BY MODE
326;
327 ORG $-2
328 JZ CK ;IT MAY BE CHANGED TO THIS
329;
330 ORG $-2
331 JMP SHORT NOREDIRECT ; OR THIS...
332;
333NOREDIRECT:
334OFFRETRY EQU $ ;disp into resident code of retry flgs
335;THIS NEXT SECTION WILL TEST FOR THE OPTIONAL RETRY ON PARALLEL TIMEOUT.
336 TEST DL,1 ;TEST TO SEE IF PARALLEL RETRY IS ACTIVE
337;THIS NEXT JUMP INSTRUCTION IS Revised BY MODEPRIN TO REFLECT WHICH
338;LPT1n DEFICE IS TO BE RETRIED. IT WILL APPEAR IN SEVERAL FORMS:
339 JNZ PAR_RETRY ;THIS INSTRUCTION MAY BE Revised
340;
341 ORG $-2
342 JZ PAR_RETRY
343;
344 ORG $-2
345 JMP SHORT ASIS
346;
347VECTOR17 LABEL WORD
348ASIS: JMP PRINTER_IO ;NO REDIRECTION, GO DIRECTLY TO PREVIOUS INT 17H
349;**************************************************************
350 SUBTTL RETRY PARALLEL ON TIMEOUT.
351 PAGE
352PAR_RETRY:
353RT:
354 MOV CS:request,AH ;save the function requested for check after return from call to INT 17 ;AN000;
355 PUSH AX ;SAVE ENTRY PARAMETERS FOR LATER USE
356 PUSH DS ;SAVE CALLER'S REGS
357 PUSH AX ;SAVE REGS
358;
359 SUB AX,AX ;POINT TO PAGE ZERO
360 MOV DS,AX ; USING THE DATA SEG REG
361;
362 AND DS:BREAK_FLAG,0FFH-BREAK_BIT ;RESET BREAK FLAG
363;
364 POP AX ;RESTORE CALLER'S REGS
365 POP DS ;RESTORE REGS
366 PUSHF ;SAVE FLAGS TO SIMULATE INT INSTRUCTION
367PVEC EQU VECTOR17+1 ;OFFSET TO IMMEDIATE FIELD OF PREVIOUSLY SET
368; FAR JUMP INSTRUCTION, FILLED WITH THE
369; ORIGINAL CONTENTS OF THE INT 17H VECTOR.
370 CALL DWORD PTR CS:PVEC ;CALL PREVIOUS PARALLEL PORT HANDLER
371 CMP CS:request,LPT_status ;AN000;
372 JNE init_or_write ;AN000;
373 TEST AH,not_busy ;see if the printer was busy (not busy bit off) ;AN000;
374 JNZ pflush ;IF busy dork the status byte ;AN000;
375 PUSH BX ;AN000;
376 MOV BX,DX ;BX=zero based printer number ;AN000;
377 CMP BYTE PTR CS:lpt1_retry_type[BX],busy_status ;IF status should be changed THEN ;AN000;
378 JZ dont_modify ;busy setting means user wants actual status ;AN000;
379 MOV AH,BYTE PTR CS:lpt1_retry_type[BX] ;change to status set by prior retry setting request for this LPT ;AN000;
380 dont_modify: ;AN000;
381 POP BX ;AN000;
382 JMP pflush ;return to caller ;AN000;
383init_or_write: ;AN000;
384 PUSH AX ;SAVE RETURN CODE IN AH
385 PUSH DS ;SAVE DATA SEGMENT REG
386;
387 SUB AX,AX ;POINT TO
388 MOV DS,AX ; SEGMENT AT ZERO
389;
390 TEST DS:BREAK_FLAG,BREAK_BIT ;TEST BREAK FLAG BIT
391 POP DS ;RESTORE SEG REG
392 POP AX ;RESTORE RETURN CODE TO AH
393 JZ PTEST ;BRANCH IF NO BREAK REQUESTED
394;
395 OR AH,USER_ABORT ;SIMULATE TIMEOUT
396PFLUSH:
397 INC SP ;FLUSH THE
398 INC SP ; STACK
399 IRET ;RETURN TO CALLER
400;
401PTEST:
402 TEST AH,01H ;TEST IF A REAL PARALLEL TIMEOUT
403 JZ PFLUSH ;IF NOT, RETURN
404 POP AX ;RETRIEVE ORIGINAL ENTRY PARAMETERS
405 JMP RT ;DO RETRY
406;**************************************************************
407 SUBTTL REDIRECT PARALLEL I/O TO SERIAL
408 PAGE
409CK:
410FIXUP EQU CK - NOREDIRECT
411 CMP AH,1 ;CHECK FOR 'INITIALIZE' CODE
412; AH=0, PRINT THE CHAR IN AL
413; AH=1, INITIALIZE
414; AH=2, READ STATUS
415 JNZ PTCHR ;IT IS PRINT CHARACTER OR READ STATUS
416; SINCE IT IS 'INITIALIZE'
417 MOV AH,80H ;PASS BACK 'NOT BUSY' RETURN CODE FROM
418; AH=1, (INITIALIZE)
419 IRET
420;
421PTCHR:
422; IT IS PRINT CHARACTER OR READ STATUS
423 PUSH BX ;SAVE THE
424 PUSH AX ; REGS
425 PUSH DX ;SAVE MORE REGS
426 MOV BX,OFFSET RESFLAG2 ;POINT AT PARALLEL TO SERIAL
427; CORRESPONDENCE TABLE IN RESIDENT CODE
428 ADD BX,DX ;INDEX USING PRINTER SELECTION (0,1,OR 2)
429 MOV DL,CS:[BX] ;GET CORRESPONDING SERIAL PORT SELECT
430 CMP AH,0 ;CHECK FOR 'PRINT CHAR' CODE
431 JZ SENDCHAR ; YES, PRINT CHAR
432; NO, MUST BE READ STATUS
433 MOV AH,3 ;SET TO INT 14 'READ STAT' ENTRY PT
434 INT 14H ;GO RS232 AND READ STATUS INTO AX
435;
436; AH HAS LINE STATUS:
437; IF TRANSFER HOLDING REG EMPTY, AND
438; IF TRANSMIT SHIFT REGISTER READY, THEN SERIAL PORT
439; NOT BUSY
440CLEAR_TO_SEND EQU 10H
441DATA_SET_READY EQU 20H ;DATA SET READY LINE HIGH
442 AND AL,CLEAR_TO_SEND+DATA_SET_READY ;SEE IF PRINTER HAS A CHANCE
443; $IF Z ;DSR and CTS low, so probably off or out of paper
444 JNZ $$IF1
445 MOV AH,29H ;PAR 'BUSY' 'OUT OF PAPER' 'I/O ERROR' 'TIME OUT'
446; $ELSE
447 JMP SHORT $$EN1
448$$IF1:
449 CMP AL,CLEAR_TO_SEND+DATA_SET_READY
450; $IF E ;IF clear to send and dsta set ready THEN
451 JNE $$IF3
452 MOV AH,90H ;'NOT BUSY' 'SELECTED'
453; $ELSE ;ELSE clear to send high OR data set ready high
454 JMP SHORT $$EN3
455$$IF3:
456 MOV AH,10H ;SET TO PARALLEL 'BUSY' 'SELECTED'
457; $ENDIF
458$$EN3:
459; $ENDIF
460$$EN1:
461 POP DX ;RESTORE REG
462 JMP SHORT POPPER ;RESTORE REGS AND EXIT
463;
464SENDCHAR:
465 MOV AH,1 ;SET TO INT 14 'SEND CHAR' ENTRY PT
466 INT 14H ;GO RS232 SEND CHAR
467;
468 POP DX ;RESTORE REG
469 TEST AH,80H ;TEST IF TIMEOUT RS232 ERROR
470 MOV AH,90H ;SET UP NORMAL RETURN AS IF FROM PRINTER
471; THAT IS: PARALLEL 'NOT BUSY' 'SELECTED'
472 JZ POPPER ;IF NO ERROR
473 MOV AH,09H ;RESET AH TO PARALLEL TIMEOUT ERROR CODE
474; RET CODE='BUSY', 'I/O ERROR', 'TIMEOUT'
475; THE USUAL RETURN FROM A WRITE DATA
476; TO A PARALLEL PRINTER THAT IS OFFLINE
477POPPER:
478 POP BX ;RETRIEVE ORIGINAL AX
479 MOV AL,BL ;RESTORE ORIGINAL AL VALUE LEAVING NEW AH
480 POP BX ;RESTORE BX
481 IRET ;RETURN
482
483;**********************************************************************
484PAGE
485
486PTSFLAG1 DB 0 ;FLAG FOR MODE COMMAND:
487
488NEW_PTSFLAG EQU PTSFLAG1 - MODETO ;WHEN THIS CODE IS
489 ; RESIDENT THE FLAG WILL BE ACCESSABLE TO
490 ; MODEECHO AS AN OFFSET FROM ADDRESS
491 ; POINTED TO BY VECT14H AND RESSEG
492; 0=NO INTERCEPT
493; 1=INTERCEPT LPT1
494; 2=INTERCEPT LPT2
495; 3=INTERCEPT LPT1 AND LPT2
496; 4=INTERCEPT LPT3
497; 5=INTERCEPT LPT1 AND LPT3
498; 6=INTERCEPT LPT2 AND LPT3
499; 7=INTERCEPT LPT1, LPT2, AND LPT3
500RESFLAG2 EQU $ ;WHERE PTSFLAG2 IS IN THE RESIDENT CODE
501PTSFLAG2 DB 0 ;FLAG FOR MODE COMMAND:
502; LPT1 CORRESPONDENCE VALUE:
503; 0=COM1
504; 1=COM2
505; 2=COM3
506; 3=COM4
507;RESFLAG2 EQU (PTSFLAG2 - MODETO)+BASE ;WHERE PTSFLAG2
508 ; IS IN THE RESIDENT CODE
509PTSFLAG3 DB 0 ;FLAG FOR MODE COMMAND:
510; LPT2 CORRESPONDENCE VALUE:
511; 0=COM1
512; 1=COM2
513; 2=COM3
514; 3=COM4
515PTSFLAG4 DB 0 ;FLAG FORMODE COMMAND:
516; LPT3 CORRESPONDENCE VALUE:
517; 0=COM1
518; 1=COM2
519; 2=COM3
520; 3=COM4
521
522
523lpt1_retry_type DB 0 ;holder of mask for status return byte ;AN000;
524lpt2_retry_type DB 0 ;can be one of no_retry_flag, error_status, ;AN000;
525lpt3_retry_type DB 0 ;busy_status or ready_status, see MODEPRIN ;AN000;
526
527PUBLIC lpt1_retry_type
528
529
530;THE FOLLOWING AREA IS USED BY MODESCRN TO STORE THE VIDEO PARMS THAT
531;ALLOW FOR THE SHIFTING RIGHT OR LEFT OF THE SCREEN IMAGE.
532SCRNTABL DB 16 DUP("PARM") ;64 BYTES OF SPACE
533NEW_SCRNTABL EQU SCRNTABL - MODETO ;OFFSET INTO RESIDENT
534; CODE OF THE 64 BYTE SCREEN TABLE
535
536request DB 0 ;holder for INT 14 or INT 17 request passed in AH
537retry_type DW 0 ;holder for INT 14 retry type and shift count
538
539MODEPTS ENDP
540
541rescode_length equ (($ - entpt) / 16) + 1 ;length of resident code in paragraphs
542
543MOVELEN EQU $ - entpt ;length of resident code in bytes
544
545
546;*******************************************************************************
547
548 SUBTTL LOAD THE RESIDENT PORTION OF MODE
549
550 PAGE
551
552
553MODELOAD PROC NEAR
554 PUBLIC MODELOAD
555; GET THE CONTENTS OF INT VECTOR 14H
556; TO SEE IF THE RESIDENT CODE IS
557; ALREADY LOADED
558; SET UP REGS TO MOVE IT INTO PLACE
559 PUSH DS ;SAVE SEG REG
560 PUSH ES ;SAVE SEG REG
561 PUSH DI
562 PUSH SI ;SAVE FOR CALLING PROCEDURE
563 PUSH DX ;SAVE FOR CALLING PROCEDURE
564 PUSH AX ;SAVE FOR CALLING PROCEDURE
565 PUSH BX
566 MOV AX,0 ;GET THE PARAGRAPH NUMBER OF DESTINATION
567 MOV ES,AX ; TO THE EXTRA SEGMENT BASE
568 LES DI,ES:RESSEG ;GET POINTER TO RETRY CODE
569; IF THE CODE IS NOT ALREADY MOVED,
570 .IF <DI EQ 0> THEN NEAR ;AC000;IF nothing at 50:30 THEN code is not loaded
571;
572; SINCE CODE HAS NOT YET BEEN MOVED,
573; PATCH PROPER ADDRESSES INTO IT
574
575; .IF <retry_requested EQ true> AND ;AN000;
576; .IF <device_type EQ COMX> THEN ;AN000;
577;
578; XOR AX,AX
579; MOV ES,AX ;BACK TO THE VECTOR AT ZERO
580; MOV AX,WORD PTR ES:VECT14H ;GET THE VECTOR OF INT 14H
581; MOV VECTOR14+1,AX ; INTO CODE TO BE MOVED
582;
583; MOV AX,WORD PTR ES:VECT14H[2] ;MOVE REST OF VECTOR
584; MOV VECTOR14+3,AX
585;
586; .ENDIF ;AN000;
587;
588; .IF <device_type EQ LPTX> AND ;AN000;
589; .IF <retry_requested EQ true> OR ;AN000;
590; .IF <reroute_requested EQ true> THEN ;AN000;
591;
592; MOV AX,WORD PTR ES:VECT17H ;GET VECTOR OF INT 17H
593; MOV VECTOR17+1,AX ; INTO CODE TO BE MOVED
594;
595; MOV AX,WORD PTR ES:VECT17H[2] ;MOVE REST OF VECTOR
596; MOV VECTOR17+3,AX
597;
598; .ENDIF ;AN000;
599
600
601 PUSH ES ;SAVE POINTER TO VECTOR ZERO
602
603;Get and save previous interrupt handlers
604
605 get_int_vect 14H ;get vector of INT 17H, ES:BX=vector
606 MOV VECTOR14+1,BX ;put offset INTO CODE TO BE MOVED
607 MOV VECTOR14+3,ES ;save segment
608
609 get_int_vect 17H ;get vector of INT 17H, ES:BX=vector
610 MOV VECTOR17+1,BX ;put offset INTO CODE TO BE MOVED
611 MOV VECTOR17+3,ES ;save segment
612
613
614 MOV SI,OFFSET entpt ;WILL BE MOVED FROM HERE
615 MOV DI,OFFSET move_destination ;WILL BE MOVED TO HERE
616 MOV CX,MOVELEN ;NUMBER OF BYTES TO BE MOVED
617 PUSH CS ;GET SEGMENT OF PROGRAM HEADER
618 POP ES ; INTO ES, THE DESTINATION SEGMENT
619 CLD ;INCREMENT SI AND DI AFTER EACH BYTE IS MOVED
620 REP MOVSB ;MOVE CX BYTES FROM DS:SI TO ES:DI
621 POP ES
622
623
624;Put a pointer to the resident code 50:30 (0:530)
625
626 CLI ;DISABLE UNTIL VECTOR SET
627
628 MOV ES:WORD PTR resseg,OFFSET modeto ;offset of "modeto" in res code pointer
629 MOV AX,CS
630 SUB AX,adjustment_in_paragraphs ;adjust res CS by amount the code moved
631 MOV ES:WORD PTR resseg[2],AX ;store segment of res code in pointer
632
633 STI ;allow some interrupts
634
635;Set interrupts 14 and 17 to point to their respective handlers. AX has correct segment.
636
637 MOV DS,AX ;DS=resident code segment
638 MOV DX,OFFSET modeto ;DS:DX=> INT14 handler "modeto"
639 set_int_vect INT14
640
641 MOV DX,OFFSET modepts ;DS:DX=> INT17 handler "modepts"
642 set_int_vect INT17
643
644 MOV ES,CS:environ_seg ;ES=segment of the block to be returned
645 MOV AH,49H ;49 is the Free Allocated Memory function call
646 INT 21H ;free the environment
647
648 MOV BYTE PTR CS:1,27H ;SET EXIT TO REMAIN RESIDENT by dorking opcode in the PSP
649;
650 PUSH CS
651 POP DS ;"PRINTF" requires that DS be the segment containing the messages
652
653 DISPLAY MOVED_MSG ;"Resident portion of MODE loaded"
654 MOV BYTE PTR CS:LOADED_YET,1 ;SET FLAG TO INDICATE ABOVE MSG
655; HAS BEEN DISPLAYED
656; MODESCRN MAY NEED TO REPEAT MESSAGE
657 MOV stay_resident,true
658 .ENDIF ;AC000;END IS CODE ALREADY LOADED? TEST
659
660 POP BX
661 POP AX ;RESTORE FOR CALLING PROCEDURE
662 POP DX ;RESTORE FOR CALLING PROCEDURE
663 POP SI ;RESTORE FOR CALLING PROCEDURE
664 POP DI
665 POP ES ;RESTORE SEG REG
666 POP DS ;RESTORE SEG REG
667 RET
668MODELOAD ENDP
669
670;************************************************************
671 SUBTTL COMMON PARMAMETER LIST AND WORKAREA
672 PAGE
673; THE FOLLOWING AREA IS USED TO STORE PARSED PARAMETER LIST, AND WORK STORAGE
674; USED BY OTHER MODULES
675
676;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ N O N R E S I D E N T D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
677;º º
678
679CTRL_ST DB 5 DUP(24) ;PRINTER CONFIGURATION CONTROL STRING
680PARM1 DB 10 DUP(0)
681PARM2 DB -1 ;-1 INDICATES TO SERVER THAT THIS PARM IS UNCHANGED
682PARM3 DB 0
683MODE DB 0
684FLAG DB 0
685INDEX DW 00 ;REDIRECTED PRINTER NETWORK REDIRECTION LIST INDEX
686IS_LOCAL DB TRUE ;INITIALIZE for MODEPRIN
687LOADED_YET DB false
688LOCAL_NAME DB 16 DUP(0) ;HOLDING AREA FOR GET ASSIGN LIST ENTRY CALL USE
689machine_type DB 0FFH ;holder for the machine type
690NOERROR DB TRUE ;INDICATE NO ERROR MESSAGES HAVE BEEN ISSUED YET
691NEW_VIDEO_PARMS_OFFSET DW 090H ;OFFSET OF INIT TABLE FOR SCREEN SHIFTING
692NEW_VIDEO_PARMS_SEGMENT DW 040H ;SEGMENT OF INIT TABLE FOR SCREEN SHIFTING
693REMOTE_DEV DB 50 DUP(0) ;HOLDING AREA FOR GET ASSIGN LIST ENTRY CALL USE
694stay_resident DB false ;boolean indicating should stay resident when terminate
695submodel_byte DB 0FFH ;secondary model byte
696
697
698;º º
699;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ N O N R E S I D E N T D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
700
701
702;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
703;º º
704
705PUBLIC PARM1,PARM2,PARM3,MODE,FLAG,CTRL_ST,INDEX,LOCAL_NAME,REMOTE_DEV ;AC000;
706PUBLIC IS_LOCAL
707PUBLIC LOADED_YET
708PUBLIC machine_type ;holder for machine type, found in "main"
709PUBLIC NOERROR
710PUBLIC NEW_VIDEO_PARMS_OFFSET
711PUBLIC NEW_VIDEO_PARMS_SEGMENT
712PUBLIC stay_resident
713
714;º º
715;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
716
717PRINTF_CODE ENDS
718 END ENTPT
719 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/SCRNTAB.ASM b/v4.0/src/CMD/MODE/SCRNTAB.ASM
new file mode 100644
index 0000000..50de85b
--- /dev/null
+++ b/v4.0/src/CMD/MODE/SCRNTAB.ASM
@@ -0,0 +1,121 @@
1.SALL
2 PAGE ,132 ;
3 TITLE SCRNTABL.ASM - SCREEN SHIFT TABLE CONTROL FOR MODE COMMAND
4
5
6;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
7;º º
8
9SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
10
11 PUSH AX
12 MOV AX,VALUE
13 MOV REG,AX
14 POP AX
15
16ENDM
17
18;º º
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
20
21
22;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
23;º º
24
25ROM_BIOS_SEG EQU 0F000H ;USED TO ADDRESS INIT TABLE IN ROM
26VIDEO_VECTOR EQU 74H ;OFFSET INTO VECTOR TABLE (SEG=0)
27 ;TO DOUBLE WORD POINTER TO VIDEO PARMS
28VIDEO_PARMS_WORD_LEN EQU 32 ;NO. WORDS IN VIDEO PARM AREA
29
30;º º
31;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
32
33
34PRINTF_CODE SEGMENT PUBLIC
35 ASSUME DS:NOTHING, CS:PRINTF_CODE
36
37
38;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
39;º º
40
41EXTRN MODELOAD:NEAR
42EXTRN RESSEG:DWORD ;ADD OF POINTER TO RESIDENT CODE
43EXTRN NEW_SCRNTABL:ABS ;OFFSET OF INIT TABLE WITHIN THE RESIDENT CODE
44EXTRN NEW_VIDEO_PARMS_OFFSET:WORD
45EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD
46
47;º º
48;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
49
50
51;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
52;º º
53;º º
54;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
55
56
57
58ROM_BIOS SEGMENT AT 0F000H
59
60 ORG 0FFFEH
61
62 MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM
63
64ROM_BIOS ENDS
65
66PAGE
67;*********************************************************************************************
68
69SCRNTAB PROC NEAR
70PUBLIC SCRNTAB
71; GO TO THE 64 BYTES POINTED TO BY THE VECTOR AT 0:74H AND MOVE A COPY
72; OF THESE BYTES TO THE MODE COMMAND RESIDENT AREA LEAVING DS POINTING TO
73; THE SEGMENT OF THE TABLE, AND BX CONTAINING THE OFFSET OF THE TABLE.
74; BIGTOP BIOS OVERWRITES AREA AT 40:90, AS DO OTHER APPS SO MUST LOAD THE
75; TABLE INTO MODE'S RESIDENT CODE.
76
77 PUSH ES ;SAVE ADDR OF PROGRAM HEADER PREFIX AREA
78 MOV AX,0 ;ADDR OF VECTOR TABLE
79 MOV DS,AX ;SET DATA SEGMENT TO 0 MEMORY
80 MOV BX,DS:VIDEO_VECTOR+2 ;SEGMENT OF VIDEO PARMS
81 CMP BX,ROM_BIOS_SEG
82;$IF E ;IF haven't moved the table THEN
83 JNE $$IF1
84 ;load the resident code
85 PUSH DS
86 SET DS,CS ;MODELOAD DEPENDS ON DS BEING SEG OF TO BE RES CODE
87 CALL MODELOAD ;LOAD RESIDENT CODE OVERLAYING PSP
88 POP DS ;RESTORE TO SEGMENT 0
89 ;Save address of resident code
90 SET CS:NEW_VIDEO_PARMS_SEGMENT,< WORD PTR DS:RESSEG+2 >
91 MOV AX,WORD PTR DS:RESSEG ;AX=offset of MODETO within resident code
92 ADD AX,NEW_SCRNTABL ;AX=OFFSET OF VIDEO PARMS FROM RES CODE SEG
93 MOV WORD PTR CS:NEW_VIDEO_PARMS_OFFSET,AX ;SEE "RESCODE"
94
95 MOV DI,AX ;DI=NEW_VIDEO_PARMS_OFFSET, SET UP ES:DI FOR MOVSW INSTRUCTION
96 MOV AX,CS:NEW_VIDEO_PARMS_SEGMENT
97 MOV ES,AX ;ES=RESIDENT CODE SEGMENT
98 MOV SI,DS:VIDEO_VECTOR ;GET SEGMENT OF VIDEO PARMS
99 MOV DS:VIDEO_VECTOR,DI ;CHANGE VIDEO OFFSET
100 MOV DS:VIDEO_VECTOR+2,ES ;CHANGE VIDEO SEGMENT
101 MOV DS,BX ;CHANGE DS TO ROM SEGMENT
102 MOV CX,VIDEO_PARMS_WORD_LEN ;COUNT TO MOVE 32 WORDS
103 CLD ;INCREMENT SI AND DI WHILE MOVING THE TABLE
104 REP MOVSW ;MOVE 64 BYTES VIDEO PARMS TO RES AREA
105
106;$ENDIF ;I HAVE MOVED IT YET
107$$IF1:
108
109 SET DS,0
110 LDS BX,DS:RESSEG ;DS:BX POINTS TO RESIDENT CODE
111 ADD BX,NEW_SCRNTABL ;DS:BX POINTS TO NEW VIDEO TABLE
112
113 POP ES ;RESTORE ADDR OF PROGRAM HEADER PREFIX
114 RET ;RETURN TO MODESCRN PROC
115
116SCRNTAB ENDP
117
118
119PRINTF_CODE ENDS
120 END
121 \ No newline at end of file
diff --git a/v4.0/src/CMD/MODE/TYPAMAT.ASM b/v4.0/src/CMD/MODE/TYPAMAT.ASM
new file mode 100644
index 0000000..a2447ae
--- /dev/null
+++ b/v4.0/src/CMD/MODE/TYPAMAT.ASM
@@ -0,0 +1,263 @@
1.XLIST
2INCLUDE STRUC.INC
3.LIST
4.SALL
5 PAGE ,132 ;
6 TITLE TYPAMAT.SAL - TYPAMATIC RATE AND DELAY CONTROL FOR MODE COMMAND
7
8
9;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
10
11;³ SET_TYPAMATIC
12;³ -------------
13;³ Translate the input parameters into BIOS digestable values and make the
14;³ required calls. Typamatic support in BIOS exists only in machines with
15;³ BIOS dated 11/15/85 or later, XT286 and all PS/2 products.
16
17
18;³; INPUT: A binary value from 1 to 32 indicating the typamatic rate
19;³ desired and a binary value from 1 to 4 indicating the delay.
20;³ Status is not supported on machines known today.
21;³ The translation of the typamatic value to BIOS
22;³ input is 32 - r where 'r' is the input value. The translation
23;³ from 'd' the input delay value to the BIOS is d - 1. 'r'
24;³ is passed in BL, 'd' is passed in BH.
25
26;³ RETURN: none
27
28
29;³ MESSAGES: none
30
31
32
33;³ REGISTER
34;³ USAGE AND
35;³ COMVENTIONS: BX is used to pass parameters to BIOS
36;³ The names used to represent the valid machines are: AT3, XT286,
37;³ PS2Model30, PS2Model50, PS2Model60 and PS2Model80.
38
39;³ ASSUMPTIONS: Input values are valid.
40
41
42;³ SIDE EFFECT:
43
44
45;³ ùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù
46
47;³ BEGIN
48
49;³ IF (machine_type>AT) OR ((machine_type=AT) AND (BIOS_date >= 11/15/85)) OR
50;³ (machine_type=XT286) THEN
51;³ IF typamatic_rate <> 0 THEN ³
52;³ MOV BL,32-BL ;translate typamatic rate ³
53;³ ELSE ³
54;³ MOV BL,previous_typamatic_rate ;not specified so no change ³
55;³ ENDIF ³
56;³ IF delay <> 0 THEN ³
57;³ SUB BH,1 ;translate delay ³
58;³ ELSE ³
59;³ MOV BH,previous_delay_rate ³
60;³ ENDIF ³
61;³ MOV AH,set_typamatic_rate_and_delay ;INT 16 set typamatic function ³
62;³ MOV AL,typamatic_function ;set typamatic subfunction ³
63;³ INT 16H ³
64;³ ELSE ³
65;³ queue Function_not_supported ³
66;³ ENDIF ³
67;³ ³
68;³ END ³
69
70;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
71
72
73
74
75;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
76;º º
77
78
79
80DISPLAY MACRO MESSAGE
81 MOV DX,OFFSET MESSAGE
82 CALL PRINTF
83ENDM
84
85SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
86
87 PUSH AX
88 MOV AX,VALUE
89 MOV REG,AX
90 POP AX
91
92ENDM
93
94;º º
95;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
96
97
98;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
99;º º
100
101get_installed_state EQU 0 ;function of MODE INT 2FH handler
102get_typamatic_delay EQU 04 ;function of MODE INT 2FH handler
103get_typamatic_rate EQU 03 ;function of MODE INT 2FH handler
104installed EQU 0FFH ;return from MODE INT 2FH handler
105no_previous_setting EQU 0FFH ;return from MODE INT 2FH handler get setting call
106one_half_second EQU 01 ;value for BIOS INT 16H
107resident_MODE EQU 0AFH ;INT 2F multiplex number for resident part of MODE
108save_typamatic_delay EQU 02 ;function of MODE INT 2FH handler
109save_typamatic_rate EQU 01 ;function of MODE INT 2FH handler
110set_typamatic_rate_and_delay EQU 3
111typamatic_function EQU 5
112ten_chars_per_second EQU 0CH ;value for BIOS INT 16H
113
114INCLUDE modequat.inc ;definitions of machine types
115include version.inc ; defines version of DOS to be built
116
117;º º
118;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
119
120
121PRINTF_CODE SEGMENT PUBLIC
122 ASSUME DS:NOTHING, CS:PRINTF_CODE
123
124
125;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
126;º º
127
128EXTRN PRINTF:NEAR
129EXTRN MACHINE_TYPE:BYTE ;MACHINE TYPE as determined by "modeleng"
130;EXTRN typamatic_rate_set_to:WORD
131;EXTRN chars_per_second:WORD
132EXTRN noerror:BYTE
133;EXTRN no_previous_typamatic_rate:WORD
134EXTRN Function_not_supported:BYTE ;see modedefs.inc
135;EXTRN delay_set_to:WORD
136;EXTRN second:WORD
137;EXTRN no_previous_delay_setting:WORD
138;EXTRN delay_set_to_one_half_second:WORD
139
140;º º
141;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
142
143
144;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
145;º º
146
147thirty_two DB 20H ;adjustment and work area for typamatic rate
148
149;º º
150;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
151
152
153;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
154;º º
155;º º
156;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
157
158
159
160
161PAGE
162;*********************************************************************************************
163
164TYPAMAT PROC NEAR
165PUBLIC TYPAMAT
166
167if IBMCOPYRIGHT
168.IF <machine_type EQ AT4> OR
169.IF <machine_type EQ XT286> OR
170;.IF <machine_type EQ AT> OR
171.IF <machine_type EQ PS2Model30> OR
172.IF <machine_type EQ PS2Model50> OR
173.IF <machine_type EQ PS2Model60> OR
174.IF <machine_type EQ PS2Model80> THEN
175endif
176; MOV AH,resident_MODE
177; MOV AL,get_installed_state
178; INT 2FH
179; CMP AL,installed
180; .IF NE ;IF the code is not resident THEN
181; CALL modeload ;make it resident
182; .ENDIF ;ENDIF
183; CMP BL,0 ;CASE typamatic_rate OF
184; .IF GT greater than zero:
185 SUB thirty_two,BL ; MOV BL,32-BL ;translate typamatic rate
186 MOV BL,thirty_two
187
188; DISPLAY typamatic_rate_set_to,BL
189; DISPLAY chars_per_second
190
191; .ELSEIF EQ ; zero:
192; MOV AH,resident_MODE
193; MOV AL,get_typamatic_rate ; MOV BL,previous_typamatic_rate ;not specified so no change
194; INT 2FH
195; CMP BL,no_previous_setting
196; .IF E
197; DISPLAY no_previous_typamatic_rate
198; DISPLAY typamatic_set_to_ten_chars_per_second
199; MOV BL,ten_chars_per_second
200; .ENDIF
201; .ELSE ; less than zero:
202; MOV AH,resident_MODE
203; MOV AL,get_typamatic_rate ; return setting in BL
204; INT 2FH
205; .IF <BL EQ no_previous_setting> THEN
206; DISPLAY no_previous_typamatic_rate
207; .ELSE
208; SUB thirty_two,BL
209; MOV BL,thirty_two ; translate to humanese
210; .ENDIF
211; .ENDIF ;ENDCASE
212; CMP BH,0 ;CASE delay OF
213; .IF GT >zero:
214 DEC BH ; SUB BH,1 ;translate delay
215
216
217; DISPLAY delay_set_to_?_second
218
219
220; .ELSEIF EQ ; zero:
221; MOV AH,resident_MODE
222; MOV AL,get_typamatic_delay ; MOV BH,previous_delay_rate
223; INT 2FH
224; CMP BH,no_previous_setting
225; .IF E
226; DISPLAY no_previous_delay_setting
227; DISPLAY delay_set_to_one_half_second
228; MOV BH,one_half_second
229; .ENDIF
230; .ELSE ; <zero:
231; MOV AH,resident_MODE
232; MOV AL,get_typamatic_rate ; return setting in BH
233; INT 2FH
234; .IF <BH EQ no_previous_setting> THEN
235; DISPLAY no_previous_delay_setting
236; .ELSE
237; INC BH
238; .ENDIF
239; .ENDIF ;ENDCASE
240; MOV AH,resident_MODE
241; MOV AL,save_typamatic_rate
242; INT 2FH
243; MOV AH,resident_MODE
244; MOV AL,save_typamatic_delay
245; INT 2FH
246 MOV AH,set_typamatic_rate_and_delay ;MOV AH,set_typamatic_rate_and_delay ;INT 16 set typamatic function
247 MOV AL,typamatic_function ;MOV AL,typamatic_function ;set typamatic subfunction
248 INT 16H ;INT 16H
249if IBMCOPYRIGHT
250.ELSE
251 DISPLAY Function_not_supported
252 MOV noerror,false
253.ENDIF
254endif
255
256RET
257
258TYPAMAT ENDP
259
260
261PRINTF_CODE ENDS
262 END
263 \ No newline at end of file