source: vendor/emx/current/src/os2/emxio.asm

Last change on this file was 18, checked in by bird, 22 years ago

Initial revision

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 15.8 KB
Line 
1;
2; EMXIO.ASM
3;
4; Copyright (c) 1992-1998 by Eberhard Mattes
5;
6; This file is part of emx.
7;
8; emx is free software; you can redistribute it and/or modify it
9; under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2, or (at your option)
11; any later version.
12;
13; emx is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17;
18; You should have received a copy of the GNU General Public License
19; along with emx; see the file COPYING. If not, write to
20; the Free Software Foundation, 59 Temple Place - Suite 330,
21; Boston, MA 02111-1307, USA.
22;
23; As special exception, emxio.dll can be distributed without source code
24; unless it has been changed. If you modify emxio.dll, this exception
25; no longer applies and you must remove this paragraph from all source
26; files for emxio.dll.
27;
28
29
30 .386
31
32IMPORT_OS2 = 0
33 INCLUDE EMXDLL.INC
34
35 PUBLIC emx_revision
36
37
38REV_INDEX_TXT EQU <"60"> ; Revision index (as text)
39REV_INDEX_BIN = 60 ; Revision index (as number)
40
41
42TEXT32 SEGMENT
43
44 ASSUME DS:FLAT, ES:FLAT
45
46$REV_INDEX BYTE REV_INDEX_TXT, 0
47
48;
49; This REXX-callable entrypoint returns a string indicating the
50; version and revision of emxio.dll as integer. The number will be
51; incremented for each revision and is used only for comparing.
52;
53
54 TALIGN 4
55emx_revision PROC C PUBLIC USES EBX ESI EDI,
56 PROCNAME:PTR BYTE, NUMARGS:DWORD, ARGS:PTR RXSTRING,
57 QUEUENAME:PTR BYTE, RETSTR:PTR RXSTRING
58 .IF NUMARGS != 0 ; Arguments given?
59 MOV EAX, 1 ; Yes: error
60 .ELSE
61 MOV EBX, RETSTR ; Return value
62 ASSUME EBX:PTR RXSTRING
63 LEA ESI, $REV_INDEX
64 MOV EDI, [EBX].RXSTRPTR
65REV1: LODSB
66 STOSB
67 OR AL, AL
68 JNZ REV1
69 MOV EAX, EDI
70 DEC EAX
71 SUB EAX, [EBX].RXSTRPTR ; Compute length of string
72 MOV [EBX].RXSTRLEN, EAX ; Set string length
73 ASSUME EBX:NOTHING
74 XOR EAX, EAX ; Successful
75 .ENDIF
76 RET
77
78 MOV EAX, PROCNAME ; Avoid warning
79 MOV EAX, ARGS ; Avoid warning
80 MOV EAX, QUEUENAME ; Avoid warning
81emx_revision ENDP
82
83;
84; unsigned _inp8 (unsigned port)
85;
86 TALIGN 4
87emx_inp8 PROC C PUBLIC, PORT:DWORD
88 MOV EDX, PORT
89 MOV EAX, 0
90 CALL MODE16
91 RET
92emx_inp8 ENDP
93
94;
95; void _outp8 (unsigned port, unsigned value)
96;
97 TALIGN 4
98emx_outp8 PROC C PUBLIC, PORT:DWORD, VALUE:DWORD
99 MOV EDX, PORT
100 MOV ECX, VALUE
101 MOV EAX, 1
102 CALL MODE16
103 RET
104emx_outp8 ENDP
105
106;
107; unsigned _inp16 (unsigned port)
108;
109 TALIGN 4
110emx_inp16 PROC C PUBLIC, PORT:DWORD
111 MOV EDX, PORT
112 MOV EAX, 2
113 CALL MODE16
114 RET
115emx_inp16 ENDP
116
117;
118; void _outp16 (unsigned port, unsigned value)
119;
120 TALIGN 4
121emx_outp16 PROC C PUBLIC, PORT:DWORD, VALUE:DWORD
122 MOV EDX, PORT
123 MOV ECX, VALUE
124 MOV EAX, 3
125 CALL MODE16
126 RET
127emx_outp16 ENDP
128
129;
130; unsigned _inp32 (unsigned port)
131;
132 TALIGN 4
133emx_inp32 PROC C PUBLIC, PORT:DWORD
134 MOV EDX, PORT
135 MOV EAX, 4
136 CALL MODE16
137 RET
138emx_inp32 ENDP
139
140;
141; void _outp32 (unsigned port, unsigned value)
142;
143 TALIGN 4
144emx_outp32 PROC C PUBLIC, PORT:DWORD, VALUE:DWORD
145 MOV EDX, PORT
146 MOV ECX, VALUE
147 MOV EAX, 5
148 CALL MODE16
149 RET
150emx_outp32 ENDP
151
152
153;
154; void _inps8 (unsigned port, unsigned char *dst, unsigned count)
155;
156 TALIGN 4
157emx_inps8 PROC C PUBLIC USES EDI, PORT:DWORD, DST:PTR BYTE, COUNT:DWORD
158 MOV EDI, DST
159 MOV EDX, PORT
160 MOV ECX, COUNT
161 MOV EAX, 6
162 CALL MODE16
163 RET
164emx_inps8 ENDP
165
166;
167; void _outps8 (unsigned port, const unsigned char *src, unsigned count)
168;
169 TALIGN 4
170emx_outps8 PROC C PUBLIC USES ESI, PORT:DWORD, SRC:PTR BYTE, COUNT:DWORD
171 MOV ESI, SRC
172 MOV EDX, PORT
173 MOV ECX, COUNT
174 MOV EAX, 7
175 CALL MODE16
176 RET
177emx_outps8 ENDP
178
179;
180; void _outpt (const void *table);
181;
182 TALIGN 4
183emx_outpt PROC C PUBLIC USES ESI, TABLE:PTR DWORD
184 MOV ESI, TABLE
185 MOV EAX, 8
186 CALL MODE16
187 RET
188emx_outpt ENDP
189
190;
191; void _inps16 (unsigned port, unsigned short *dst, unsigned count);
192;
193 TALIGN 4
194emx_inps16 PROC C PUBLIC USES EDI, PORT:DWORD, DST:PTR BYTE, COUNT:DWORD
195 MOV EDI, DST
196 MOV EDX, PORT
197 MOV ECX, COUNT
198 MOV EAX, 9
199 CALL MODE16
200 RET
201emx_inps16 ENDP
202
203;
204; void _outps16 (unsigned port, const unsigned short *src, unsigned count)
205;
206 TALIGN 4
207emx_outps16 PROC C PUBLIC USES ESI, PORT:DWORD, SRC:PTR BYTE, COUNT:DWORD
208 MOV ESI, SRC
209 MOV EDX, PORT
210 MOV ECX, COUNT
211 MOV EAX, 10
212 CALL MODE16
213 RET
214emx_outps16 ENDP
215
216;
217; void _inps32 (unsigned port, unsigned long *dst, unsigned count);
218;
219 TALIGN 4
220emx_inps32 PROC C PUBLIC USES EDI, PORT:DWORD, DST:PTR BYTE, COUNT:DWORD
221 MOV EDI, DST
222 MOV EDX, PORT
223 MOV ECX, COUNT
224 MOV EAX, 11
225 CALL MODE16
226 RET
227emx_inps32 ENDP
228
229;
230; void _outps32 (unsigned port, const unsigned long *src, unsigned count)
231;
232 TALIGN 4
233emx_outps32 PROC C PUBLIC USES ESI, PORT:DWORD, SRC:PTR BYTE, COUNT:DWORD
234 MOV ESI, SRC
235 MOV EDX, PORT
236 MOV ECX, COUNT
237 MOV EAX, 12
238 CALL MODE16
239 RET
240emx_outps32 ENDP
241
242;
243; void _wait01 (unsigned port, unsigned mask)
244;
245 TALIGN 4
246emx_wait01 PROC C PUBLIC, PORT:DWORD, BITS:DWORD
247 MOV EDX, PORT
248 MOV ECX, BITS
249 MOV EAX, 13
250 CALL MODE16
251 RET
252emx_wait01 ENDP
253
254;
255; void _wait10 (unsigned port, unsigned mask)
256;
257 TALIGN 4
258emx_wait10 PROC C PUBLIC, PORT:DWORD, BITS:DWORD
259 MOV EDX, PORT
260 MOV ECX, BITS
261 MOV EAX, 14
262 CALL MODE16
263 RET
264emx_wait10 ENDP
265
266
267;
268; void _wait0 (unsigned port, unsigned mask)
269;
270 TALIGN 4
271emx_wait0 PROC C PUBLIC, PORT:DWORD, BITS:DWORD
272 MOV EDX, PORT
273 MOV ECX, BITS
274 MOV EAX, 15
275 CALL MODE16
276 RET
277emx_wait0 ENDP
278
279;
280; void _wait1 (unsigned port, unsigned mask)
281;
282 TALIGN 4
283emx_wait1 PROC C PUBLIC, PORT:DWORD, BITS:DWORD
284 MOV EDX, PORT
285 MOV ECX, BITS
286 MOV EAX, 16
287 CALL MODE16
288 RET
289emx_wait1 ENDP
290
291
292;
293; void _outps8dac (unsigned port, const unsigned char *src, unsigned count)
294;
295 TALIGN 4
296emx_outps8dac PROC C PUBLIC USES ESI, PORT:DWORD, SRC:PTR BYTE, COUNT:DWORD
297 MOV ESI, SRC
298 MOV EDX, PORT
299 MOV ECX, COUNT
300 MOV EAX, 17
301 CALL MODE16
302 RET
303emx_outps8dac ENDP
304
305;
306; Call 16-bit code
307;
308; In: AL Function number
309;
310 TALIGN 4
311MODE16 PROC
312 PUSH EBP
313 MOV EBP, ESP
314 SUB ESP, 2 * 4
315 MOV [EBP-2*4], ECX
316 MOV [EBP-1*4], EDX
317 MOV ECX, ESP
318 MOV DX, SS
319 AND DL, 3
320 OR DL, 4
321 CMP CX, 1000H
322 JAE SHORT MODE16_1
323 XOR CX, CX
324 MOV BYTE PTR [ECX], 0 ; Stack probe
325 XCHG ESP, ECX
326 TALIGN 4
327MODE16_1: PUSH SS
328 PUSH ECX ; Save stack pointer
329;
330; Convert ESP to SS:SP
331;
332 MOV ECX, ESP
333 ROL ECX, 16
334 SHL CX, 3
335 OR CL, DL
336 PUSH ECX ; Push new SS
337 SHR ECX, 16
338 PUSH ECX ; Push new ESP
339 MOV ECX, [EBP-2*4]
340 MOV EDX, [EBP-1*4]
341 LSS ESP, [ESP] ; Switch to new stack
342;
343; Call 16-bit code
344;
345 JMP FAR PTR TEXT16:CALL16
346 TALIGN 4
347MODE16_RET:: MOVZX ESP, SP ; Don't trust...
348 LSS ESP, [ESP] ; Get 32-bit stack pointer
349 ADD ESP, 2*4 ; Remove local variables
350 POP EBP ; Restore EBP
351 RET ; Return to 32-bit code
352
353MODE16 ENDP
354
355TEXT32 ENDS
356
357
358TEXT16 SEGMENT
359
360 ASSUME DS:NOTHING, ES:NOTHING
361
362 TALIGN 4
363CALL16_TAB DWORD FAR16 PTR iopl_inp8 ; 0
364 DWORD FAR16 PTR iopl_outp8 ; 1
365 DWORD FAR16 PTR iopl_inp16 ; 2
366 DWORD FAR16 PTR iopl_outp16 ; 3
367 DWORD FAR16 PTR iopl_inp32 ; 4
368 DWORD FAR16 PTR iopl_outp32 ; 5
369 DWORD FAR16 PTR iopl_inps8 ; 6
370 DWORD FAR16 PTR iopl_outps8 ; 7
371 DWORD FAR16 PTR iopl_outpt ; 8
372 DWORD FAR16 PTR iopl_inps16 ; 9
373 DWORD FAR16 PTR iopl_outps16 ; 10
374 DWORD FAR16 PTR iopl_inps32 ; 11
375 DWORD FAR16 PTR iopl_outps32 ; 12
376 DWORD FAR16 PTR iopl_wait01 ; 13
377 DWORD FAR16 PTR iopl_wait10 ; 14
378 DWORD FAR16 PTR iopl_wait0 ; 15
379 DWORD FAR16 PTR iopl_wait1 ; 15
380 DWORD FAR16 PTR iopl_outps8dac; 16
381
382;
383; Entry point from 32-bit code
384;
385 TALIGN 4
386CALL16 PROC FAR
387 CALL CALL16_TAB[EAX*4]
388 JMP FAR32 PTR FLAT:MODE16_RET
389 RET ; Avoid warning
390
391CALL16 ENDP
392
393TEXT16 ENDS
394
395IOPL16 SEGMENT DWORD USE16 PUBLIC 'CODE'
396
397;
398; The upper 24 bits of EAX are zero on entry (function number!)
399;
400 TALIGN 4
401iopl_inp8 PROC FAR16 PUBLIC
402 IN AL, DX
403 RET
404iopl_inp8 ENDP
405
406 TALIGN 4
407iopl_outp8 PROC FAR16 PUBLIC
408 MOV AL, CL
409 OUT DX, AL
410 RET
411iopl_outp8 ENDP
412
413 TALIGN 4
414iopl_inp16 PROC FAR16 PUBLIC
415 IN AX, DX
416 RET
417iopl_inp16 ENDP
418
419 TALIGN 4
420iopl_outp16 PROC FAR16 PUBLIC
421 MOV AX, CX
422 OUT DX, AX
423 RET
424iopl_outp16 ENDP
425
426 TALIGN 4
427iopl_inp32 PROC FAR16 PUBLIC
428 IN EAX, DX
429 RET
430iopl_inp32 ENDP
431
432 TALIGN 4
433iopl_outp32 PROC FAR16 PUBLIC
434 MOV EAX, ECX
435 OUT DX, EAX
436 RET
437iopl_outp32 ENDP
438
439 TALIGN 4
440iopl_inps8 PROC FAR16 PUBLIC
441 REP INS BYTE PTR [EDI], DX
442; Note: EDI and ECX can be incorrect now due to a bug in the 386
443 RET
444iopl_inps8 ENDP
445
446;
447;
448;
449 TALIGN 4
450iopl_outps8 PROC FAR16 PUBLIC
451 REP OUTS DX, BYTE PTR [ESI]
452 RET
453iopl_outps8 ENDP
454
455
456;
457;
458;
459 TALIGN 4
460iopl_outpt PROC FAR16 PUBLIC
461 TALIGN 4
462OUTPT1: MOV ECX, [ESI+0]
463 JECXZ OUTPT9
464 MOV EDX, [ESI+4]
465 MOV EAX, [ESI+8]
466 ADD ESI, 12
467 TEST EAX, EAX
468 JZ SHORT OUTPT_B
469 DEC EAX
470 JZ SHORT OUTPT_W
471 DEC EAX
472 JNZ SHORT OUTPT9
473 REP OUTS DX, DWORD PTR [ESI]
474 JMP SHORT OUTPT1
475
476 TALIGN 4
477OUTPT_B: REP OUTS DX, BYTE PTR [ESI]
478 JMP SHORT OUTPT1
479
480 TALIGN 4
481OUTPT_W: REP OUTS DX, WORD PTR [ESI]
482 JMP SHORT OUTPT1
483
484 TALIGN 4
485OUTPT9: RET
486iopl_outpt ENDP
487
488;
489;
490;
491 TALIGN 4
492iopl_inps16 PROC FAR16 PUBLIC
493 REP INS WORD PTR [EDI], DX
494; Note: EDI and ECX can be incorrect now due to a bug in the 386
495 RET
496iopl_inps16 ENDP
497
498;
499;
500;
501 TALIGN 4
502iopl_outps16 PROC FAR16 PUBLIC
503 REP OUTS DX, WORD PTR [ESI]
504 RET
505iopl_outps16 ENDP
506
507
508;
509;
510;
511 TALIGN 4
512iopl_inps32 PROC FAR16 PUBLIC
513 REP INS DWORD PTR [EDI], DX
514; Note: EDI and ECX can be incorrect now due to a bug in the 386
515 RET
516iopl_inps32 ENDP
517
518;
519;
520;
521 TALIGN 4
522iopl_outps32 PROC FAR16 PUBLIC
523 REP OUTS DX, DWORD PTR [ESI]
524 RET
525iopl_outps32 ENDP
526
527
528;
529;
530;
531 TALIGN 4
532iopl_wait01 PROC FAR16 PUBLIC
533WAIT01_1: IN AL, DX
534 TEST AL, CL
535 JNZ WAIT01_1
536 TALIGN 4
537WAIT01_2: IN AL, DX
538 TEST AL, CL
539 JZ WAIT01_2
540 RET
541iopl_wait01 ENDP
542
543;
544;
545;
546 TALIGN 4
547iopl_wait10 PROC FAR16 PUBLIC
548WAIT10_1: IN AL, DX
549 TEST AL, CL
550 JZ WAIT10_1
551 TALIGN 4
552WAIT10_2: IN AL, DX
553 TEST AL, CL
554 JNZ WAIT10_2
555 RET
556iopl_wait10 ENDP
557
558;
559;
560;
561 TALIGN 4
562iopl_wait0 PROC FAR16 PUBLIC
563WAIT0_1: IN AL, DX
564 TEST AL, CL
565 JNZ WAIT0_1
566 RET
567iopl_wait0 ENDP
568
569;
570;
571;
572 TALIGN 4
573iopl_wait1 PROC FAR16 PUBLIC
574WAIT1_1: IN AL, DX
575 TEST AL, CL
576 JZ WAIT1_1
577 RET
578iopl_wait1 ENDP
579
580;
581;
582;
583 TALIGN 4
584iopl_outps8dac PROC FAR16 PUBLIC
585 JCXZ OUTPS8DAC_9
586 TALIGN 4 ; Avoid timing surprises
587OUTPS8DAC_1: MOV AL, [ESI]
588 INC ESI
589 NOP
590 OUT DX, AL
591 LOOP OUTPS8DAC_1
592OUTPS8DAC_9: RET
593iopl_outps8dac ENDP
594
595
596IOPL16 ENDS
597
598 END
Note: See TracBrowser for help on using the repository browser.