summaryrefslogblamecommitdiffstats
path: root/private/ntos/miniport/trantor/source/ep3c2.asm
blob: b57ac5a89990cb36caa7a902b801a48b55bf62ab (plain) (tree)
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
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526













































































































































































































































































































































































































































































































































                                                                                         
	page	
;***********************************************************************
;
;	(C) Copyright 1992 Trantor Systems, Ltd.
;	All Rights Reserved.
;
;	This program is an unpublished copyrighted work which is proprietary
;	to Trantor Systems, Ltd. and contains confidential information that
;	is not to be reproduced or disclosed to any other person or entity
;	without prior written consent from Trantor Systems, Ltd. in each
;	and every instance.
;
;	WARNING:  Unauthorized reproduction of this program as well as
;	unauthorized preparation of derivative works based upon the
;	program or distribution of copies by sale, rental, lease or
;	lending are violations of federal copyright laws and state trade
;	secret laws, punishable by civil and criminal penalties.
;
;***********************************************************************
	title	EP3C2.ASM
;-----------------------------------------------------------------------
;
;	EP3C2.ASM
;
;	FIFO I/O Routines for the EP3C chip.
;	Assembly coded for speed.  These are only some of the routines
;	needed for the EP3C.  The rest are in EP3C.C.
;
;	History
;	-------
;	05-17-93  JAP	First, from ep3c.c
;
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
;	stack frame equates
;-----------------------------------------------------------------------

ep3c_param2	equ	12
ep3c_param1	equ	8
ep3c_retAdrs	equ	4
ep3c_bp		equ	0

ep3c_pbytes		equ	ep3c_param2
ep3c_baseIoAddress	equ	ep3c_param1


;-----------------------------------------------------------------------
;	Macros
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
;	get_params
;
;	Puts parameters into registers:
;	edx -> baseIoAddress
;	ds:[edi] -> pbytes
;-----------------------------------------------------------------------

get_params	macro

	ifdef	MODE_32BIT

	mov	edi, dword ptr [ebp].ep3c_pbytes
	mov	edx, dword ptr [ebp].ep3c_baseIoAddress

	else

	mov	edi, word ptr ss:[bp].ep3c_pbytes
	mov	ds, word ptr ss:[bp].ep3c_pbytes+2
	mov	edx, word ptr ss:[bp].ep3c_baseIoAddress

	endif	;MODE_32BIT

	endm
	

;-----------------------------------------------------------------------
;	Routines
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
;	EP3CReadFifoUniDir
;
;	VOID EP3CReadFifoUniDir (PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
;
;	Reads bytes for uni-directional parallel port from the 53c400
;	128 byte buffer.  The register must already be set the the
;	53c400 buffer register.
;
;-----------------------------------------------------------------------

EP3CReadFifoUniDir	proc	far

	push	ds
	push	edi

	get_params

	mov	ecx, 128

loop0:
	mov	al, 0x80
	out	dx, al			;select high nibble
	jmp	delay0

delay0:
	add	edx,2			;DX -> ctl reg
	mov	al,P_AFX	    	;assert bufen and afx
	out	dx,al      		;assert dreg read
	jmp	delay1

delay1:
	dec	edx			;DX -> stat reg
	in	al,dx			;read high nibble
	jmp	delay2
	
delay2:
	mov	ah,al
	shl	ah,1
	and	ah,0f0h			;AH -> adj high nibble
	dec	edx			;DX -> data reg
	sub	al,al
	out	dx,al			;select low nibble
	jmp	delay3

delay3:
	inc	edx			;DX -> stat reg
	in	al,dx			;read low nibble

	shr	al,1
	shr	al,1
	shr	al,1
	and	al,0fh			;AL = adj low nibble
	or	al,ah			;AL = recombined byte

	mov	[edi],al		;store
	inc	edi			;bump buf ptr

	inc	edx			;DX -> ctl reg
	xor	al,al			;negate afx (bufen stays asserted)
	out	dx,al			;end read
	jmp	delay4

delay4:
	sub	edx,2			;DX -> data reg
	dec	ecx
	jnz	loop0

	pop	edi
	pop	ds
	ret

EP3CReadFifoUniDir	endp

;-----------------------------------------------------------------------
;
;	EP3CReadFifoUniDirSlow
;
;	VOID EP3CReadFifoUniDirSlow (PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
;
;	Reads bytes for uni-directional parallel port from the 53c400
;	128 byte buffer.  The register must already be set the the
;	53c400 buffer register.
;
;	USES FULL HANDSHAKING
;
;-----------------------------------------------------------------------

EP3CReadFifoUniDirSlow	proc	far

	push	ds
	push	edi

	get_params

	inc	edx				// edx - status register
	mov	ecx, 128
	
loop0:
	dec	edx				// edx - data register
	mov	al, 0x80
	out	dx,al			// select high nibble
	jmp	delay0
	
delay0:
	add	edx, 2			// DX -> ctl reg
	mov	al, P_AFX	    // assert bufen and afx
	out	dx, al      		// assert dreg read

;	wait till ready, P_BUSY asserted
	
	dec	edx				// edx - status register

loop1:
	in	al,dx
	test	al, P_BUSY
	jnz	loop1

;	delay to make sure we get high nibble in

	jmp	delay01

delay01:
	in	al,dx

	mov	ah,al
	shl	ah,1
	and	ah,0f0h			// AH -> adj high nibble
	dec	edx				// DX -> data reg
	sub	al,al
	out	dx,al			// select low nibble

	jmp	delay3

delay3:
	inc	edx				// DX -> stat reg
	in	al,dx			// read low nibble

	shr	al,1
	shr	al,1
	shr	al,1
	and	al,0fh			// AL = adj low nibble
	or	al,ah			// AL = recombined byte

	mov	[edi],al		// store
	inc	edi				// bump buf ptr

	inc	edx				// DX -> ctl reg
	xor	al,al			// negate afx (bufen stays asserted)
	out	dx,al			// end read

	dec	edx				// DX -> status register 

;	wait for P_BUSY deasserted

loop2:
	in	al,dx
	test	al, P_BUSY
	jz	loop2

	dec	ecx
	jnz	loop0

	pop edi
	pop ds
	ret

EP3CReadFifoUniDirSlow	endp


//----------------------------------------------------------------------
//
//	VOID EP3CReadFifoBiDir
//
//	Reads bytes for bi-directional parallel port from the 53c400
//	128 byte buffer.  The register must already be set the the
//	53c400 buffer register.
//
//----------------------------------------------------------------------

VOID EP3CReadFifoBiDir(PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
{
	_asm {
		push ds
		push edi

#ifdef MODE_32BIT
		mov	edi,pbytes
		mov edx, baseIoAddress
#else
		mov edi, word ptr pbytes
		mov ds, word ptr pbytes+2
		mov edx, word ptr baseIoAddress
#endif  // MODE_32BIT
		mov	ecx, 128
		add edx, 2			// edx - control register
	loop0:
		mov al, P_BUFEN + P_AFX
		out dx, al

		jmp delay0
	delay0:

		sub edx,2			// edx - data register

		in al,dx
		mov [edi], al
		inc edi

		add edx,2			// edx - control register

		mov al, P_BUFEN
		out dx, al

		jmp delay1			// is this needed, there is a loop?
	delay1:
		
		dec ecx
		jnz loop0

		xor al,al			// leave control regiser 0'd
		out dx, al

		pop edi
		pop ds
	}
}


//----------------------------------------------------------------------
//
//	VOID EP3CReadFifoBiDirSlow
//
//	Reads bytes for bi-directional parallel port from the 53c400
//	128 byte buffer.  The register must already be set the the
//	53c400 buffer register.
//
//	USES FULL HANDSHAKING
//
//----------------------------------------------------------------------

VOID EP3CReadFifoBiDirSlow(PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
{
	_asm {
		push ds
		push edi

#ifdef MODE_32BIT
		mov	edi,pbytes
		mov edx, baseIoAddress
#else
		mov edi, word ptr pbytes
		mov ds, word ptr pbytes+2
		mov edx, word ptr baseIoAddress
#endif  // MODE_32BIT
		mov	ecx, 128
		add edx, 0x02		// edx - control register

		// wait for data to be ready, P_BUSY asserted
	loop0:
		mov al, P_BUFEN + P_AFX
		out dx, al

		dec	edx				// edx - status register
	loop1:
		in al,dx
		test al, P_BUSY
		jnz loop1

		dec edx				// edx - data register

		in al,dx
		mov [edi], al
		inc edi

		add edx,2		   	// edx - control register

		// end data read cycle
		mov al, P_BUFEN
		out dx, al

		dec edx				// edx - status register

		// wait for P_BUSY deasserted
	loop2:
		in al,dx
		test al, P_BUSY
		jz loop2

		inc edx			   	// edx - control register

		dec ecx
		jnz loop0

		xor al,al			// leave control regiser 0'd
		out dx, al

		pop edi
		pop ds
	}
}


//----------------------------------------------------------------------
//
//	VOID EP3CWriteFifoUniDir
//
//	Writes bytes thru uni-directional parallel port to the 53c400
//	128 byte buffer.  The register must already be set the the
//	53c400 buffer register.
//
//----------------------------------------------------------------------

VOID EP3CWriteFifoUniDir(PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
{
	_asm {
		push ds
		push edi

#ifdef MODE_32BIT
		mov	edi,pbytes
		mov edx, baseIoAddress
#else
		mov edi, word ptr pbytes
		mov ds, word ptr pbytes+2
		mov edx, word ptr baseIoAddress
#endif  // MODE_32BIT
		mov	ecx, 128
	
	loop0:
		mov al,[edi]
		out dx,al
		inc edi
	
		add	edx,2				;DX -> ctl reg
		mov	al,P_STB			;assert bufen, stb
		out dx,al
		or	al,P_AFX			;assert dreg write
		out dx,al
	
		jmp delay0
	delay0:
								;leave bufen asserted
		mov	al,0				; and negate afx, stb
		out dx,al				;end write
	
		jmp delay1
	delay1:
	
		sub	edx,2				;DX -> data reg
		dec ecx
		jnz loop0
	
//	let's leave control register 0'd for all these fifo routines...
//		add	edx,2				;DX -> ctl reg
//		or	al,P_BUFEN			;negate bufen
//		out dx,al
		
			    
		jmp delay2
	delay2:
	
		pop edi
		pop ds
	}
}


//----------------------------------------------------------------------
//
//	VOID EP3CWriteFifoUniDirSlow
//
//	Writes bytes thru uni-directional parallel port to the 53c400
//	128 byte buffer.  The register must already be set the the
//	53c400 buffer register.
//
//	USES FULL HANDSHAKING
//
//----------------------------------------------------------------------

VOID EP3CWriteFifoUniDirSlow(PBASE_REGISTER baseIoAddress, PUCHAR pbytes)
{
	_asm {
		push ds
		push edi

#ifdef MODE_32BIT
		mov	edi,pbytes
		mov edx, baseIoAddress
#else
		mov edi, word ptr pbytes
		mov ds, word ptr pbytes+2
		mov edx, word ptr baseIoAddress
#endif  // MODE_32BIT
		mov	ecx, 128
	
	loop0:
		mov al,[edi]
		out dx,al
		inc edi
	
		add	edx,2				;DX -> ctl reg
		mov	al,P_STB			;assert bufen, stb
		out dx,al
		or	al,P_AFX			;assert dreg write
		out dx,al
	
		// wait till ready, P_BUSY asserted
		dec	edx					// edx - status register
	loop1:
		in al,dx
		test al, P_BUSY
		jnz loop1

		inc	edx					// edx - control register

								;leave bufen asserted
		mov	al,0				; and negate afx, stb
		out dx,al				;end write
	
		dec edx					// edx - status register

		// wait for P_BUSY deasserted
	loop2:
		in al,dx
		test al, P_BUSY
		jz loop2

		dec edx				   	// edx - data register

		dec ecx
		jnz loop0
	
//	let's leave control register 0'd for all these fifo routines...
//		add	edx,2				;DX -> ctl reg
//		or	al,P_BUFEN			;negate bufen
//		out dx,al
	
		pop edi
		pop ds
	}
}