summaryrefslogtreecommitdiff
path: root/v4.0/src/DOS/STRIN.ASM
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/DOS/STRIN.ASM
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/DOS/STRIN.ASM')
-rw-r--r--v4.0/src/DOS/STRIN.ASM403
1 files changed, 403 insertions, 0 deletions
diff --git a/v4.0/src/DOS/STRIN.ASM b/v4.0/src/DOS/STRIN.ASM
new file mode 100644
index 0000000..ac4b963
--- /dev/null
+++ b/v4.0/src/DOS/STRIN.ASM
@@ -0,0 +1,403 @@
1; SCCSID = @(#)strin.asm 1.2 85/04/18
2Break
3
4; Inputs:
5; DS:DX Point to an input buffer
6; Function:
7; Fill buffer from console input until CR
8; Returns:
9; None
10
11 procedure $STD_CON_STRING_INPUT,NEAR ;System call 10
12ASSUME DS:NOTHING,ES:NOTHING
13
14 MOV AX,SS
15 MOV ES,AX
16 MOV SI,DX
17 XOR CH,CH
18 LODSW
19;
20; AL is the buffer length
21; AH is the template length
22;
23 OR AL,AL
24 retz ;Buffer is 0 length!!?
25 MOV BL,AH ;Init template counter
26 MOV BH,CH ;Init template counter
27 ;
28 ; BL is the number of bytes in the template
29 ;
30 CMP AL,BL
31 JBE NOEDIT ;If length of buffer inconsistent with contents
32 CMP BYTE PTR [BX+SI],c_CR
33 JZ EDITON ;If CR correctly placed EDIT is OK
34;
35; The number of chars in the template is >= the number of chars in buffer or
36; there is no CR at the end of the template. This is an inconsistant state
37; of affairs. Pretend that the template was empty:
38;
39NOEDIT:
40 MOV BL,CH ;Reset buffer
41EDITON:
42 MOV DL,AL
43 DEC DX ;DL is # of bytes we can put in the buffer
44;
45; Top level. We begin to read a line in.
46;
47NEWLIN:
48 MOV AL,[CARPOS]
49 MOV [STARTPOS],AL ;Remember position in raw buffer
50 PUSH SI
51 MOV DI,OFFSET DOSGROUP:INBUF ;Build the new line here
52 MOV [INSMODE],CH ;Insert mode off
53 MOV BH,CH ;No chars from template yet
54 MOV DH,CH ;No chars to new line yet
55 invoke $STD_CON_INPUT_NO_ECHO ;Get first char
56 CMP AL,c_LF ;Linefeed
57 JNZ GOTCH ;Filter out LF so < works
58;
59; This is the main loop of reading in a character and processing it.
60;
61; BH is the index of the next byte in the template
62; BL is the length of the template
63; DH is the number of bytes in the buffer
64; DL is the length of the buffer
65;
66entry GETCH
67 invoke $STD_CON_INPUT_NO_ECHO
68GOTCH:
69;
70; Brain-damaged TP ignored ^F in case his BIOS did not flush the
71; input queue.
72;
73 CMP AL,"F"-"@"
74 JZ GETCH
75;
76; If the leading char is the function-key lead byte
77;
78 CMP AL,[ESCCHAR]
79 JZ ESCape ;change reserved keyword DBM 5-7-87
80;
81; Rubout and ^H are both destructive backspaces.
82;
83 CMP AL,c_DEL
84 JZ BACKSPJ
85 CMP AL,c_BS
86 JZ BACKSPJ
87;
88; ^W deletes backward once and then backs up until a letter is before the
89; cursor
90;
91 CMP AL,"W" - "@"
92; The removal of the comment characters before the jump statement will
93; cause ^W to backup a word.
94;*** JZ WordDel
95 NOP
96 NOP
97 CMP AL,"U" - "@"
98; The removal of the comment characters before the jump statement will
99; cause ^U to clear a line.
100;*** JZ LineDel
101 NOP
102 NOP
103
104;
105; CR terminates the line.
106;
107 CMP AL,c_CR
108 JZ ENDLIN
109;
110; LF goes to a new line and keeps on reading.
111;
112 CMP AL,c_LF
113 JZ PHYCRLF
114;
115; ^X (or ESC) deletes the line and starts over
116;
117 CMP AL,[CANCHAR]
118 JZ KILNEW
119;
120; Otherwise, we save the input character.
121;
122SAVCH:
123 CMP DH,DL
124 JAE BUFFUL ; buffer is full.
125 STOSB
126 INC DH ; increment count in buffer.
127 invoke BUFOUT ;Print control chars nicely
128 CMP BYTE PTR [INSMODE],0
129 JNZ GETCH ; insertmode => don't advance template
130 CMP BH,BL
131 JAE GETCH ; no more characters in template
132 INC SI ; Skip to next char in template
133 INC BH ; remember position in template
134 JMP SHORT GETCH
135
136BACKSPJ: JMP SHORT BACKSP
137
138BUFFUL:
139 MOV AL,7 ; Bell to signal full buffer
140 invoke OUTT
141 JMP SHORT GETCH
142
143ESCape: ;change reserved keyword DBM 5-7-87
144 transfer OEMFunctionKey ; let the OEM's handle the key dispatch
145
146ENDLIN:
147 STOSB ; Put the CR in the buffer
148 invoke OUTT ; Echo it
149 POP DI ; Get start of user buffer
150 MOV [DI-1],DH ; Tell user how many bytes
151 INC DH ; DH is length including CR
152COPYNEW:
153 SaveReg <DS,ES>
154 RestoreReg <DS,ES> ; XCHG ES,DS
155 MOV SI,OFFSET DOSGROUP:INBUF
156 MOV CL,DH ; set up count
157 REP MOVSB ; Copy final line to user buffer
158 return
159;
160; Output a CRLF to the user screen and do NOT store it into the buffer
161;
162PHYCRLF:
163 invoke CRLF
164 JMP GETCH
165
166;
167; Delete the previous line
168;
169LineDel:
170 OR DH,DH
171 JZ GetCh
172 Call BackSpace
173 JMP LineDel
174
175;
176; delete the previous word.
177;
178WordDel:
179WordLoop:
180 Call BackSpace ; backspace the one spot
181 OR DH,DH
182 JZ GetChJ
183 MOV AL,ES:[DI-1]
184 cmp al,'0'
185 jb GetChj
186 cmp al,'9'
187 jbe WordLoop
188 OR AL,20h
189 CMP AL,'a'
190 JB GetChJ
191 CMP AL,'z'
192 JBE WordLoop
193GetChJ:
194 JMP GetCh
195;
196; The user wants to throw away what he's typed in and wants to start over. We
197; print the backslash and then go to the next line and tab to the correct spot
198; to begin the buffered input.
199;
200 entry KILNEW
201 MOV AL,"\"
202 invoke OUTT ;Print the CANCEL indicator
203 POP SI ;Remember start of edit buffer
204PUTNEW:
205 invoke CRLF ;Go to next line on screen
206 MOV AL,[STARTPOS]
207 invoke TAB ;Tab over
208 JMP NEWLIN ;Start over again
209
210
211;
212; Destructively back up one character position
213;
214entry BackSp
215 Call BackSpace
216 JMP GetCh
217
218BackSpace:
219 OR DH,DH
220 JZ OLDBAK ;No chars in line, do nothing to line
221 CALL BACKUP ;Do the backup
222 MOV AL,ES:[DI] ;Get the deleted char
223 CMP AL," "
224 JAE OLDBAK ;Was a normal char
225 CMP AL,c_HT
226 JZ BAKTAB ;Was a tab, fix up users display
227;; 9/27/86 fix for ctrl-U backspace
228 CMP AL,"U"-"@" ; ctrl-U is a section symbol not ^U
229 JZ OLDBAK
230 CMP AL,"T"-"@" ; ctrl-T is a paragraphs symbol not ^T
231 JZ OLDBAK
232;; 9/27/86 fix for ctrl-U backspace
233 CALL BACKMES ;Was a control char, zap the '^'
234OLDBAK:
235 CMP BYTE PTR [INSMODE],0
236 retnz ;In insert mode, done
237 OR BH,BH
238 retz ;Not advanced in template, stay where we are
239 DEC BH ;Go back in template
240 DEC SI
241 return
242
243BAKTAB:
244 PUSH DI
245 DEC DI ;Back up one char
246 STD ;Go backward
247 MOV CL,DH ;Number of chars currently in line
248 MOV AL," "
249 PUSH BX
250 MOV BL,7 ;Max
251 JCXZ FIGTAB ;At start, do nothing
252FNDPOS:
253 SCASB ;Look back
254 JNA CHKCNT
255 CMP BYTE PTR ES:[DI+1],9
256 JZ HAVTAB ;Found a tab
257 DEC BL ;Back one char if non tab control char
258CHKCNT:
259 LOOP FNDPOS
260FIGTAB:
261 SUB BL,[STARTPOS]
262HAVTAB:
263 SUB BL,DH
264 ADD CL,BL
265 AND CL,7 ;CX has correct number to erase
266 CLD ;Back to normal
267 POP BX
268 POP DI
269 JZ OLDBAK ;Nothing to erase
270TABBAK:
271 invoke BACKMES
272 LOOP TABBAK ;Erase correct number of chars
273 JMP SHORT OLDBAK
274
275BACKUP:
276 DEC DH ;Back up in line
277 DEC DI
278BACKMES:
279 MOV AL,c_BS ;Backspace
280 invoke OUTT
281 MOV AL," " ;Erase
282 invoke OUTT
283 MOV AL,c_BS ;Backspace
284 JMP OUTT ;Done
285
286;User really wants an ESC character in his line
287 entry TwoEsc
288 MOV AL,[ESCCHAR]
289 JMP SAVCH
290
291;Copy the rest of the template
292 entry COPYLIN
293 MOV CL,BL ;Total size of template
294 SUB CL,BH ;Minus position in template, is number to move
295 JMP SHORT COPYEACH
296
297 entry CopyStr
298 invoke FINDOLD ;Find the char
299 JMP SHORT COPYEACH ;Copy up to it
300
301;Copy one char from template to line
302 entry COPYONE
303 MOV CL,1
304;Copy CX chars from template to line
305COPYEACH:
306 MOV BYTE PTR [INSMODE],0 ;All copies turn off insert mode
307 CMP DH,DL
308 JZ GETCH2 ;At end of line, can't do anything
309 CMP BH,BL
310 JZ GETCH2 ;At end of template, can't do anything
311 LODSB
312 STOSB
313 invoke BUFOUT
314 INC BH ;Ahead in template
315 INC DH ;Ahead in line
316 LOOP COPYEACH
317GETCH2:
318 JMP GETCH
319
320;Skip one char in template
321 entry SKIPONE
322 CMP BH,BL
323 JZ GETCH2 ;At end of template
324 INC BH ;Ahead in template
325 INC SI
326 JMP GETCH
327
328 entry SKIPSTR
329 invoke FINDOLD ;Find out how far to go
330 ADD SI,CX ;Go there
331 ADD BH,CL
332 JMP GETCH
333
334;Get the next user char, and look ahead in template for a match
335;CX indicates how many chars to skip to get there on output
336;NOTE: WARNING: If the operation cannot be done, the return
337; address is popped off and a jump to GETCH is taken.
338; Make sure nothing extra on stack when this routine
339; is called!!! (no PUSHes before calling it).
340FINDOLD:
341 invoke $STD_CON_INPUT_NO_ECHO
342 CMP AL,[ESCCHAR] ; did he type a function key?
343 JNZ FindSetup ; no, set up for scan
344 invoke $STD_CON_INPUT_NO_ECHO ; eat next char
345 JMP NotFnd ; go try again
346FindSetup:
347 MOV CL,BL
348 SUB CL,BH ;CX is number of chars to end of template
349 JZ NOTFND ;At end of template
350 DEC CX ;Cannot point past end, limit search
351 JZ NOTFND ;If only one char in template, forget it
352 PUSH ES
353 PUSH DS
354 POP ES
355 PUSH DI
356 MOV DI,SI ;Template to ES:DI
357 INC DI
358 REPNE SCASB ;Look
359 POP DI
360 POP ES
361 JNZ NOTFND ;Didn't find the char
362 NOT CL ;Turn how far to go into how far we went
363 ADD CL,BL ;Add size of template
364 SUB CL,BH ;Subtract current pos, result distance to skip
365 return
366
367NOTFND:
368 POP BP ;Chuck return address
369 JMP GETCH
370
371entry REEDIT
372 MOV AL,"@" ;Output re-edit character
373 invoke OUTT
374 POP DI
375 PUSH DI
376 PUSH ES
377 PUSH DS
378 invoke COPYNEW ;Copy current line into template
379 POP DS
380 POP ES
381 POP SI
382 MOV BL,DH ;Size of line is new size template
383 JMP PUTNEW ;Start over again
384
385 entry EXITINS
386 entry ENTERINS
387 NOT BYTE PTR [INSMODE]
388 JMP GETCH
389
390;Put a real live ^Z in the buffer (embedded)
391 entry CTRLZ
392 MOV AL,"Z"-"@"
393 JMP SAVCH
394
395;Output a CRLF
396 entry CRLF
397 MOV AL,c_CR
398 invoke OUTT
399 MOV AL,c_LF
400 JMP OUTT
401
402EndProc $STD_CON_STRING_INPUT
403 \ No newline at end of file