1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
;******************************************************************************
;
; MODULE: more.asm
;
; Modification History:
;
; Version Author date comment
; ------- ------ ---- -------
; V4.0 RussW ;AN000; initial extended attr. support
;
; V4.0 Bill L 9/17/87 ;AN001; DCR 201 - extended attr. enhancement
; ;AN002; DCR 191
; ;AN003; PTM 3860 - add CR-LF to make DOS3.3 compat.
;******************************************************************************
FALSE EQU 0
TRUE EQU NOT FALSE
IBMVER EQU TRUE
IBMJAPVER EQU FALSE
MSVER EQU FALSE
STDOUT EQU 1 ;AN003;
;------------------------------
; EXTENDED ATTRIBUTE Equates
;------------------------------
GetExtAttr equ 05702h ;AN000; ;Int 021h function call
SetExtAttr equ 05704h ;AN000; ;Int 021h function call
GetCPSW equ 03303h ;AN001;
EAISBINARY equ 02h ;AN001; ;ea_type
EASYSTEM equ 8000h ;AN001; ;ea_flags
BREAK MACRO subtitle
SUBTTL subtitle
PAGE
ENDM
INCLUDE SYSCALL.INC
INCLUDE MORE.INC ;AN000; ;MORE strucs and equates
.XLIST ;AN000;
INCLUDE STRUC.INC ;AN000; ;Structured macros
INCLUDE SYSMSG.INC ;AN000; ;Message retriever code
.LIST ;AN000;
MSG_UTILNAME <MORE> ;AN000;
CODE SEGMENT PUBLIC
ORG 100H
ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
START: JMP START1 ;AC000;
;;; DB " The DOS 4.0 MORE Filter" ;AC003;
;----------------------------------------
;- STRUCTURE TO QUERY EXTENDED ATTRIBUTES
;----------------------------------------
querylist struc ;AN001; ;query general list
qea_num dw 1 ;AN001;
qea_type db EAISBINARY ;AN001;
qea_flags dw EASYSTEM ;AN001;
qea_namelen db ? ;AN001;
qea_name db " " ;AN001;
querylist ends ;AN001;
cp_qlist querylist <1,EAISBINARY,EASYSTEM,2,"CP"> ;AN001; ;query code page attr.
cp_list label word ;AN001; ;code page attr. get/set list
dw 1 ;AN001; ; # of list entries
db EAISBINARY ;AN001; ; ea type
dw EASYSTEM ;AN001; ; ea flags
db ? ;AN001; ; ea return code
db 2 ;AN001; ; ea name length
dw 2 ;AN001; ; ea value length
db "CP" ;AN001; ; ea name
cp dw ? ;AN001; ; ea value (code page)
cp_len equ ($ - cp_list) ;AN001;
START1:
CALL SYSLOADMSG ;AN000;
.IF C ;AN000;
CALL SYSDISPMSG ;AN000;
MOV AH,EXIT ;AN000;
INT 21H ;AN000;
.ENDIF ;AN000;
MOV AX,ANSI_GET ;AN000; ;prepare for device characteristics..
MOV BX,STDERR ;AN000; ;request.
MOV CX,GET_SUBFUNC ;AN000; ;get subfucntion..
LEA DX,ANSI_BUF ;AN000; ;point to buffer.
INT 21H ;AN000;
.IF NC ;AN000; ;if ANSI returns a no carry then..
LEA DI,ANSI_BUF ;AN000;
.IF <[DI].D_MODE EQ TEXT_MODE> ;AN000; ;if we are in a text mode then..
MOV AX,[DI].SCR_ROWS ;AN000; ;store the screen length...else..
MOV MAXROW,AL ;AN000; ;default (25) is assumed.
.ENDIF ;AN000;
.ENDIF ;AN000;
MOV AH,0FH
INT 10H
MOV MAXCOL,AH
XOR BX,BX ; DUP FILE HANDLE 0
MOV AH,XDUP
INT 21H
MOV BP,AX ; Place new handle in BP
MOV AH,CLOSE ; CLOSE STANDARD IN
INT 21H
MOV BX,2 ; DUP STD ERR TO STANDARD IN
MOV AH,XDUP
INT 21H
cp_check: ;AN001;
mov ax,GetCPSW ;AN001;
int 21h ;AN001; ;DL =0 (Not supported)
jc sloop ;AN001; ;no CPSW, skip cp setting
cmp dl,0 ;AN001; ;Is CPSW active ?
je sloop ;AN001; ;no, skip cp setting
;
mov ax,GetExtAttr ;AN000; ;Get Codepage of source
mov bx,bp ;AN000; ;Standard Input
mov si,offset cp_qlist ;AN001; ;code page query list
mov cx,cp_len ;AN001; ;length of code page list
mov di,offset cp_list ;AC001; ;Input buffer address
int 021h ;AN000; ;Pow !
jc SLOOP ;AN000; ;Do nothing if error
;Ok, we got CP of source. Set tgt to match...
mov ax,SetExtAttr ;AN000; ;Set target codepage to that of source
mov bx,1 ;AN000; ;Standard Output
mov di,offset cp_list ;AC001; ;Input buffer address
int 021h ;AN000; ;Blam !
;-------------------------------
SLOOP:
MOV CX,CRLF_LEN ;AN003; ;display a newline
MOV DX,OFFSET CRLF ;AN003;
MOV BX,STDOUT ;AN003;
MOV AH,WRITE ;AN003;
INT 21H ;AN003;
ALOOP:
CLD
MOV DX,OFFSET BUFFER
MOV CX,4096
MOV BX,BP
MOV AH,READ
INT 21H
OR AX,AX
JNZ SETCX
DONE: INT 20H
SETCX: MOV CX,AX
MOV SI,DX
TLOOP:
LODSB
CMP AL,1AH
JZ DONE
CMP AL,13
JNZ NOTCR
MOV BYTE PTR CURCOL,1
JMP SHORT ISCNTRL
NOTCR: CMP AL,10
JNZ NOTLF
INC BYTE PTR CURROW
JMP SHORT ISCNTRL
NOTLF: CMP AL,8
JNZ NOTBP
CMP BYTE PTR CURCOL,1
JZ ISCNTRL
DEC BYTE PTR CURCOL
JMP SHORT ISCNTRL
NOTBP: CMP AL,9
JNZ NOTTB
MOV AH,CURCOL
ADD AH,7
AND AH,11111000B
INC AH
MOV CURCOL,AH
JMP SHORT ISCNTRL
NOTTB:
IF MSVER ; IBM CONTROL CHARACTER PRINT
CMP AL,' '
JB ISCNTRL
ENDIF
IF IBMVER
CMP AL,7 ; ALL CHARACTERS PRINT BUT BELL
JZ ISCNTRL
ENDIF
INC BYTE PTR CURCOL
MOV AH,CURCOL
CMP AH,MAXCOL
JBE ISCNTRL
INC BYTE PTR CURROW
MOV BYTE PTR CURCOL,1
ISCNTRL:
MOV DL,AL
MOV AH,STD_CON_OUTPUT
INT 21H
MOV AH,CURROW
CMP AH,MAXROW
JB CHARLOOP
ASKMORE:
PUSH BP ;AN000; ;save file handle
PUSH SI ;AN000; ;save pointer
PUSH CX ;AN000; ;save count
MOV AX,MORE_MSG ;AN000; ;use message retriever..
MOV BX,STDERR ;AN000; ;to issue..
XOR CX,CX ;AN000; ;-- More --
MOV DL,NO_INPUT ;AN000;
MOV DH,UTILITY_MSG_CLASS ;AN000;
CALL SYSDISPMSG ;AN000;
MOV AH,STD_CON_INPUT_FLUSH ;WAIT FOR A KEY, NO ECHO
MOV AL,STD_CON_INPUT_NO_ECHO ;AC000; ;no echo
INT 21H
CMP AL,EXTENDED ;AN000; ;Check for extended key?
JNE NOT_EXTENDED ;AN000; ;continue
MOV AH,STD_CON_INPUT_NO_ECHO ;AN000; ;clear extended key
INT 21H ;AN000; ;
NOT_EXTENDED:
MOV CX,CRLF2_LEN ;AC003; ;place cursor..
MOV DX,OFFSET CRLF2 ;AC003; ;..on new line.
MOV BX,STDERR ;AN000;
MOV AH,WRITE ;AN000;
INT 21H ;AN000;
POP CX ;AN000; ;restore count
POP SI ;AN000; ;restore pointer
POP BP ;AN000; ;restore file handle
MOV BYTE PTR CURCOL,1
MOV BYTE PTR CURROW,1
CHARLOOP:
DEC CX
JZ GOBIG
JMP TLOOP
GOBIG: JMP ALOOP
MAXROW DB 25
MAXCOL DB 80
CURROW DB 1
CURCOL DB 1
ANSI_BUF ANSI_STR <> ;AN000; ;buffer for IOCTL call
.XLIST ;AN000;
MSG_SERVICES <MSGDATA> ;AN000; ;message retriever code
MSG_SERVICES <LOADmsg,DISPLAYmsg,NOCHECKSTDIN> ;AN002;
MSG_SERVICES <MORE.CL1> ;AN000;
MSG_SERVICES <MORE.CL2> ;AN000;
MSG_SERVICES <MORE.CLA> ;AN000;
.LIST ;AN000;
CRLF DB 13,10 ;AC000;
CRLF_LEN DW $ - CRLF ;AC000;
CRLF2 DB 13,10,13,10 ;AN003;
CRLF2_LEN DW $ - CRLF2 ;AN003;
BUFFER LABEL BYTE
CODE ENDS
END START
|