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
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
; SCCSID = @(#)cpmio2.asm 1.1 85/04/11
TITLE CPMIO2 - device IO for MSDOS
NAME CPMIO2
.xlist
.xcref
include dosseg.asm
.cref
.list
;
; Old style CP/M 1-12 system calls to talk to reserved devices
;
; $Std_Con_Input
; $Std_Con_Output
; OUTT
; TAB
; BUFOUT
; $Std_Aux_Input
; $Std_Aux_Output
; $Std_Printer_Output
; $Std_Con_Input_Status
; $Std_Con_Input_Flush
;
; Revision History:
;
; AN000 version 4.00 - Jan. 1988
;
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME SS:DOSGROUP,CS:DOSGROUP
.xcref
.xlist
INCLUDE DOSSYM.INC
INCLUDE DEVSYM.INC
.list
.cref
; The following routines form the console I/O group (funcs 1,2,6,7,8,9,10,11).
; They assume ES and DS NOTHING, while not strictly correct, this forces data
; references to be SS or CS relative which is desired.
i_need CARPOS,BYTE
i_need CHARCO,BYTE
i_need PFLAG,BYTE
i_need CurrentPDB,WORD ;AN000;
i_need InterCon,BYTE ;AN000;
i_need SaveCurFlg,BYTE ;AN000;
Break
; Inputs:
; None
; Function:
; Input character from console, echo
; Returns:
; AL = character
procedure $STD_CON_INPUT,NEAR ;System call 1
ASSUME DS:NOTHING,ES:NOTHING
IF DBCS ;AN000;
push word ptr [InterCon] ;AN000;
mov [InterCon],01H ;AN000;
invoke INTER_CON_INPUT_NO_ECHO ;AN000;
pop word ptr [InterCon] ;AN000;
pushf ;AN000;
push AX ;AN000;
mov [SaveCurFlg],0 ;AN000;
jnz sj0 ;AN000;
mov [SaveCurFlg],1 ;AN000;
sj0: ;AN000;
invoke OUTT ;AN000;
mov [SaveCurFLg],0 ;AN000;
pop AX ;AN000;
popf ;AN000;
jz $STD_CON_INPUT ;AN000;
ELSE ;AN000;
invoke $STD_CON_INPUT_NO_ECHO
PUSH AX
invoke OUTT
POP AX
ENDIF ;AN000;
return
EndProc $STD_CON_INPUT
Break
; Inputs:
; DL = character
; Function:
; Output character to console
; Returns:
; None
procedure $STD_CON_OUTPUT,NEAR ;System call 2
public OUTCHA ;AN000;
ASSUME DS:NOTHING,ES:NOTHING
MOV AL,DL
entry OUTT
CMP AL,20H
JB CTRLOUT
CMP AL,c_DEL
JZ OUTCH
OUTCHA: ;AN000;
INC BYTE PTR [CARPOS]
OUTCH:
PUSH DS
PUSH SI
INC BYTE PTR [CHARCO] ;invoke statchk...
AND BYTE PTR [CHARCO],00111111B ;AN000; every 64th char
JNZ OUTSKIP
PUSH AX
invoke STATCHK
POP AX
OUTSKIP:
invoke RAWOUT ;output the character
POP SI
POP DS
IF DBCS ;AN000;
TEST [SaveCurFlg],01H ;AN000;print but no cursor adv? 2/13/KK
retnz ;AN000;if so then do not send to prt2/13/KK
ENDIF
TEST BYTE PTR [PFLAG],-1
retz
PUSH BX
PUSH DS
PUSH SI
MOV BX,1
invoke GET_IO_SFT
JC TRIPOPJ
MOV BX,[SI.sf_flags]
TEST BX,sf_isnet ; output to NET?
JNZ TRIPOPJ ; if so, no echo
TEST BX,devid_device ; output to file?
JZ TRIPOPJ ; if so, no echo
MOV BX,4
invoke GET_IO_SFT
JC TRIPOPJ
TEST [SI.sf_flags],sf_net_spool ; StdPrn redirected?
JZ LISSTRT2J ; No, OK to echo
MOV BYTE PTR [PFLAG],0 ; If a spool, NEVER echo
TRIPOPJ:
JMP TRIPOP
LISSTRT2J:
JMP LISSTRT2
CTRLOUT:
CMP AL,c_CR
JZ ZERPOS
CMP AL,c_BS
JZ BACKPOS
CMP AL,c_HT
JNZ OUTCH
MOV AL,[CARPOS]
OR AL,0F8H
NEG AL
entry TAB
PUSH CX
MOV CL,AL
MOV CH,0
JCXZ POPTAB
TABLP:
MOV AL," "
invoke OUTT
LOOP TABLP
POPTAB:
POP CX
return
ZERPOS:
MOV BYTE PTR [CARPOS],0
JMP OUTCH
OUTJ: JMP OUTT
BACKPOS:
DEC BYTE PTR [CARPOS]
JMP OUTCH
entry BUFOUT
CMP AL," "
JAE OUTJ ;Normal char
CMP AL,9
JZ OUTJ ;OUT knows how to expand tabs
;DOS 3.3 7/14/86
CMP AL,"U"-"@" ; turn ^U to section symbol
JZ CTRLU
CMP AL,"T"-"@" ; turn ^T to paragraph symbol
JZ CTRLU
NOT_CTRLU:
;DOS 3.3 7/14/86
PUSH AX
MOV AL,"^"
invoke OUTT ;Print '^' before control chars
POP AX
OR AL,40H ;Turn it into Upper case mate
CTRLU:
invoke OUTT
return
EndProc $STD_CON_OUTPUT
Break
; Inputs:
; None
; Function:
; Returns character from aux input
; Returns:
; Character in AL
procedure $STD_AUX_INPUT,NEAR ;System call 3
ASSUME DS:NOTHING,ES:NOTHING
invoke STATCHK
MOV BX,3
invoke GET_IO_SFT
retc
JMP SHORT TAISTRT
AUXILP:
invoke SPOOLINT
TAISTRT:
MOV AH,1
invoke IOFUNC
JZ AUXILP
XOR AH,AH
invoke IOFUNC
return
EndProc $STD_AUX_INPUT
Break
; Inputs:
; Character in DL
; Function:
; Output character to aux output
; Returns:
; Nothing
procedure $STD_AUX_OUTPUT,NEAR ;System call 4
ASSUME DS:NOTHING,ES:NOTHING
PUSH BX
MOV BX,3
JMP SHORT SENDOUT
EndProc $STD_AUX_OUTPUT
Break
; Inputs:
; DL = Character
; Function:
; Output the character to the list device
; Returns:
; None
procedure $STD_PRINTER_OUTPUT,NEAR ;System call 5
ASSUME DS:NOTHING,ES:NOTHING
PUSH BX
MOV BX,4
SENDOUT:
MOV AL,DL
PUSH AX
invoke STATCHK
POP AX
PUSH DS
PUSH SI
LISSTRT2:
invoke RAWOUT2
TRIPOP:
POP SI
POP DS
POP BX
return
EndProc $STD_PRINTER_OUTPUT
Break
; Inputs:
; None
; Function:
; Check console input status
; Returns:
; AL = -1 character available, = 0 no character
procedure $STD_CON_INPUT_STATUS,NEAR ;System call 11
ASSUME DS:NOTHING,ES:NOTHING
invoke STATCHK
MOV AL,0 ; no xor!!
retz
OR AL,-1
return
EndProc $STD_CON_INPUT_STATUS
Break
; Inputs:
; AL = DOS function to be called after flush (1,6,7,8,10)
; Function:
; Flush console input buffer and perform call in AL
; Returns:
; Whatever call in AL returns or AL=0 if AL was not 1,6,7,8 or 10
procedure $STD_CON_INPUT_FLUSH,NEAR ;System call 12
ASSUME DS:NOTHING,ES:NOTHING
PUSH AX
PUSH DX
XOR BX,BX
invoke GET_IO_SFT
JC BADJFNCON
MOV AH,4
invoke IOFUNC
BADJFNCON:
POP DX
POP AX
MOV AH,AL
CMP AL,1
JZ REDISPJ
CMP AL,6
JZ REDISPJ
CMP AL,7
JZ REDISPJ
CMP AL,8
JZ REDISPJ
CMP AL,10
JZ REDISPJ
MOV AL,0
return
REDISPJ:
IF DBCS ;AN000;
mov ds,[CurrentPDB] ;AN000;
;AN000; set DS same as one from COMMAND entry
ENDIF
CLI
transfer REDISP
EndProc $STD_CON_INPUT_FLUSH
CODE ENDS
END
|